느낌이 오는 속도로, 코드로 연주하는 음악

Tactus는 브라우저에서 바로 여는 라이브 코딩 악기예요. 한 줄이 한 트랙이고, 고치면 다음 마디에 바로 들려요. 코드가 낯설면 블록을 눌러 만들고, 신스 소리를 손으로 빚고, 기타나 마이크를 꽂아 이펙터로 쓰고, 카메라 앞에서 손으로 지휘해요. 설치할 것 없이 폰에서도 열려요. 데모를 틀면 위의 글자 여섯 개가 각자 한 트랙씩 맡아 박자에 맞춰 숨을 쉬어요.

Tactus 열기
누르고 있는 동안 데모에 걸려요
trance138 BPMBAR 1.1

Write · 쓰면 들려요

kick x x x x 처럼 한 줄이 한 트랙이에요. 리듬과 음은 다음 마디 경계에서, 소리는 즉시 바뀌어 박을 놓치지 않아요. 숫자 위에서 Alt+↑↓를 누르면 연주 중에 값을 굴려요.

hat  [. x]*4 | gain .45 every 8 ply 2
bass [. 0 0 0]*4 | cut k1(300,2000)
pad  0^7 | drop2 verb .6

Perform · 패드도 코드

빌드업, 비트 리피트, 게이트, 에코 아웃 같은 DJ 동작 16개가 키보드에 붙어 있어요. 여기서도 눌러 보세요: 누르고 있는 동안 위의 데모 곡에 바로 걸리고, 그 패드를 만든 한 줄이 보여요. 고치거나 새로 쓰면 그대로 패드가 돼요.


    

Compose · 시드 하나로

스타일과 시드를 고르면 코드 진행, 비트, 베이스, 멜로디까지 코드로 써 줘요. 주사위를 굴려 보세요. 아래 줄은 이 페이지가 지금 실제로 만든 결과예요.

SEED42

    

Conduct · 손으로

오른손으로 박을 저으면 템포와 셈여림이 따라오고, 왼손으로 가리키면 그 악기가 들어오거나 빠져요. 두 주먹은 페르마타. Chrome에서 Tactus를 열고 손 컨트롤을 켠 뒤 카메라를 허용하면 돼요.

왼손 높이
노브 k1, 보통 필터
오른손 집기
빌드업, 놓으면 드롭
왼손 집기
비트 리피트
주먹
브레이크다운
오른손 휙
다음 씬

Tap · 블록으로

같은 곡이 카드로도 보여요. 드럼은 칸을 누르고, 멜로디는 곡의 음계로 된 피아노 롤에 그려요. 코드 진행, 장면, 곡 순서까지 블록으로 바꾸고, 바꾼 것은 그대로 코드에 써져요. 폰에서는 트랙이 한 줄씩 접혀 작은 스텝 시퀀서처럼 보여요.

kick  x . . . x . . .
lead  [0 _ 2 _ 4 _ _ 2]
prog  <0 5 3 4>

Shape · 소리를 빚어요

아날로그, 웨이브테이블, FM 신스가 함께 들어 있어요. 유니즌, 필터 여섯 가지, 모음 필터, 엔벨로프와 곡 박자에 맞춘 LFO까지 한 줄로 써요. 엔벨로프와 필터 곡선은 끌어서 바꾸고, 한 음을 들려주면 가장 비슷한 소리를 찾아 줘요.

bass | analog voices 5
lead | wt table growl
keys | fmsynth ratio 3.5

Plug in · 이펙터로

마이크나 오디오 인터페이스에 꽂은 기타를 실시간으로 처리해요. 게이트, 컴프, 앰프와 캐비닛, 와우, 코러스, 플랜저, 페이저, 트레몰로, 딜레이, 리버브, 옥타버, 곡의 키를 따라가는 하모나이저, 튜너. 미리 보는 처리가 없어 지연을 더하지 않고, 딜레이와 트레몰로는 곡의 박자에 맞아요.

input | drive .45 amp crunch
  delay .3 3/16 pingpong
  harm 2 .5 verb .3

Sing · 목소리로

“둠 츠 칙 츠” 비트박스는 kick, snare, hat 줄이 되고, 흥얼거린 멜로디는 곡의 키에 맞춘 음표가 돼요. 루프 스테이션은 마디에 맞춰 녹음하고, 왕복 지연은 스스로 재서 맞춰요.

kick  x . . . x . x .
snare . . x . . . x .
hum   a4 _ c5 . e5 _ d5 .
30CC0 녹음 악기. 피아노는 세기별 3단 레이어
40예제 곡. 트랜스부터 굿거리, 바흐, 8비트 게임 음악까지
3신스 엔진: 아날로그, 웨이브테이블, FM
16연주 패드, 모두 코드로 수정
14이펙터 페달. 지연은 하나도 더하지 않아요
0설치할 것. 브라우저 하나면 돼요

박을 놓치지 않게, 오디오 스레드는 Rust로

악기에서 가장 중요한 건 박이에요. Tactus는 120ms 앞을 내다보며 음을 예약하고, 소리를 만드는 보이스와 라이브 이펙터는 할당이 전혀 없는 no_std Rust로 써서 WebAssembly로 AudioWorklet 안에서 돌려요. 오디오 스레드에서 가비지 컬렉션이 일어나지 않아요.

WebAssembly를 쓸 수 없는 곳에서는 같은 계산을 하는 JavaScript가 대신 돌아요. 두 쪽은 샘플 단위로 맞춰 두었고, 신스 엔진과 이펙터는 출력이 똑같아요.

WebGPU로 새로 할 수 있게 된 것

오디오 스레드(AudioWorklet)에서는 WebGPU를 쓸 수 없어요. 그래서 Tactus는 GPU에게 음표를 통째로 미리 렌더링시키고, 스케줄러가 정확한 시간에 틀어요. 실시간 입력을 블록마다 처리하는 일엔 맞지 않지만, 미리 준비할 수 있는 무거운 소리와 그림에는 잘 맞아요. GPU가 없는 브라우저에서는 모두 CPU 소리와 기존 시각화로 대신해요.

swarm 음표 하나(사인파 2,520개)를 GPU와 JavaScript로 각각 렌더링해 시간을 비교해요.

참고: CPU, GPU, FPGA for modal reverberation (Frontiers, 2025) · Audio Modeling × GPU Audio · Efficient Modal Sound Synthesis on GPUs (RWTH, 2014) · DDSP (Engel et al., 2020) · Demucs

tac·tus /ˈtæk.təs/

르네상스 음악에서 tactus는 지휘자가 손을 내렸다 올리며 짚던 박을 부르던 말이에요. 악보의 모든 음표가 그 손짓에 맞춰 흘렀어요.

이 악기도 같은 생각에서 시작했어요. 코드를 고치는 손, 패드를 누르는 손, 카메라 앞에서 움직이는 손이 모두 박을 짚어요. 기계가 박을 지키고, 사람은 느낌을 바꿔요.