TidalCycles 시작하기: 패턴으로 음악을 코딩하는 법
핵심 요약
- TidalCycles는 Haskell로 작성된 패턴 언어로, 리듬과 사운드를 함수 조합으로 기술합니다.
- 소리를 내려면 TidalCycles 하나만으로는 부족합니다. SuperCollider + SuperDirt가 함께 동작해야 합니다.
- 설치 실패의 대부분은 구성 요소 간 연결(포트·부팅 순서) 문제이며 코드 문법과 무관합니다.
- 문법의 출발점은
d1 $ sound "bd sn"한 줄입니다. 여기서부터 변형해 나가는 방식이 가장 빠릅니다.
TidalCycles는 라이브코딩 음악에서 가장 널리 언급되는 도구지만, 처음 설치하는 사람에게는 진입 장벽이 뚜렷한 편이기도 합니다. 설치해야 할 구성 요소가 여러 개이고, 그중 하나만 어긋나도 소리가 나지 않기 때문입니다. 이 글은 TidalCycles가 어떤 구조로 동작하는지 먼저 설명하고, 그 구조를 이해한 상태에서 설치와 문법, 오류 대응으로 넘어갑니다.
TidalCycles란 무엇인가
TidalCycles(줄여서 Tidal)는 Haskell 위에서 동작하는 도메인 특화 언어입니다. 직접 소리를 만들지는 않고, “무엇을 언제 연주할지”에 대한 패턴을 계산해 사운드 엔진에 전달하는 역할을 합니다. 이 분업 구조가 Tidal의 성격을 결정합니다.
Tidal의 핵심 개념은 사이클(cycle)입니다. 시간을 마디가 아니라 0에서 1로 흐르는 순환 단위로 보고, 그 안에 이벤트를 배치합니다. "bd sn"이라고 쓰면 한 사이클을 둘로 나눠 앞쪽에 베이스드럼, 뒤쪽에 스네어를 놓습니다. "bd sn hh cp"라고 쓰면 같은 사이클을 넷으로 나눕니다. 요소 개수가 곧 분할 수가 되므로, 박자를 따로 계산할 필요가 없습니다.
여기에 Haskell의 함수 합성이 결합됩니다. 패턴은 값이 아니라 시간에 대한 함수로 다뤄지기 때문에, 패턴을 인자로 받아 새 패턴을 돌려주는 함수를 자유롭게 이어 붙일 수 있습니다. “이 패턴을 매 4사이클마다 뒤집어라” 같은 지시가 한 줄로 표현되는 이유가 여기에 있습니다. 이 표현력이 다른 도구 대비 Tidal의 가장 큰 강점입니다.
설치 및 환경 구성
설치 전에 전체 구조를 파악해 두면 문제 해결이 훨씬 쉬워집니다. 네 개의 조각이 사슬처럼 연결됩니다.
| 구성 요소 | 역할 | 없으면 생기는 증상 |
|---|---|---|
| Haskell(GHC/cabal) | Tidal 라이브러리 실행 런타임 | 에디터에서 코드 평가 자체가 안 됨 |
| TidalCycles 패키지 | 패턴 계산, OSC 메시지 전송 | 함수 이름을 찾을 수 없다는 오류 |
| SuperCollider | 오디오 합성 엔진 | 코드는 실행되는데 소리가 없음 |
| SuperDirt | 샘플 재생·이펙트 담당 계층 | 서버는 떴는데 샘플이 재생되지 않음 |
설치 순서는 일반적으로 다음과 같습니다. 첫째, SuperCollider를 설치합니다. 둘째, SuperCollider 안에서 패키지 관리자를 통해 SuperDirt를 설치합니다. 셋째, Haskell 툴체인을 설치하고 Tidal 패키지를 받습니다. 넷째, 에디터(Pulsar, VS Code, Vim, Emacs 등)에 Tidal 플러그인을 붙입니다. 각 단계의 정확한 명령은 운영체제마다 다르므로 공식 설치 문서의 해당 OS 항목을 그대로 따르시기 바랍니다.
실행할 때는 순서가 중요합니다. SuperCollider를 먼저 켜고 SuperDirt를 기동한 다음, 에디터에서 Tidal 세션을 시작합니다. 반대로 하면 Tidal이 보낸 메시지를 받을 대상이 없어 조용히 무시됩니다. 소리가 안 날 때 가장 먼저 확인할 항목이 바로 이 기동 순서입니다.
기본 패턴 문법 이해하기
Tidal 코드는 대부분 아래 형태를 따릅니다. d1부터 d9까지는 서로 독립적으로 도는 연결 통로라고 생각하면 됩니다.
d1 $ sound "bd sn hh sn"
여기서 sound는 샘플 뱅크 이름을 받는 함수이고, 문자열 안의 각 단어가 하나의 이벤트입니다. 자주 쓰이는 표기는 다음과 같습니다.
~— 쉼표. 해당 자리를 비웁니다. 예:"bd ~ sn ~"*— 반복."bd*4"는 그 자리를 넷으로 다시 나눕니다.[ ]— 묶음."[bd sn] hh"처럼 하위 그룹을 만듭니다.<>— 사이클마다 번갈아 선택합니다."<bd sn>"은 한 사이클씩 교대로 재생합니다.:— 샘플 뱅크 안의 인덱스 지정."bd:3"은 네 번째 변형 샘플입니다.
패턴에 함수를 덧붙일 때는 #로 파라미터를 연결하거나, 변형 함수를 앞에 놓습니다. d1 $ every 4 (fast 2) $ sound "bd sn"는 4사이클에 한 번 속도를 두 배로 만들라는 뜻입니다. rev(역순), slow(느리게), jux(좌우 채널 분리 변형) 정도를 함께 익히면 표현 범위가 급격히 넓어집니다.

실전 예제로 배우는 리듬 조합
아래는 한 줄씩 쌓아 가며 트랙을 만드는 순서입니다. 각 줄을 따로 평가해 소리 변화를 확인하시기 바랍니다.
- 기준 리듬 —
d1 $ sound "bd*4"로 일정한 킥을 깝니다. 이것이 전체의 시계가 됩니다. - 대비 요소 추가 —
d2 $ sound "~ cp ~ cp"처럼 빈 자리를 활용한 패턴을 다른 통로에 올립니다. - 세분화 —
d3 $ sound "hh*8" # gain 0.8로 잘게 쪼갠 하이햇을 넣되 음량을 낮춥니다. - 변화 주기 —
every 4 (fast 2)나sometimesBy 0.3 (# speed 2)를 붙여 반복에 변주를 만듭니다. - 정리 —
d2 silence로 특정 통로만 잠재우고,hush로 전체를 멈춥니다.
gain은 처음부터 낮게 잡는 편이 좋습니다. 통로를 여러 개 띄우면 음량이 누적되어 왜곡이 생기기 쉽습니다. 기본값 그대로 네다섯 개를 겹치면 대개 클리핑이 발생합니다.
자주 겪는 설치 오류와 해결 순서
증상별로 확인 지점이 거의 정해져 있습니다. 아래 순서로 좁혀 나가면 대부분 해결됩니다.
| 증상 | 가장 흔한 원인 | 확인 방법 |
|---|---|---|
| 코드는 실행되는데 무음 | SuperDirt 미기동 | SuperCollider 창에서 SuperDirt 시작 메시지가 출력됐는지 확인 |
| 특정 샘플만 안 남 | 샘플 이름 오타 또는 뱅크 미포함 | 기본 뱅크(bd, sn, hh 등)로 교체해 재현 여부 확인 |
| 에디터에서 평가 불가 | Haskell 툴체인·플러그인 경로 | 터미널에서 GHCi가 직접 실행되는지 확인 |
| 소리가 끊기거나 지직거림 | 오디오 버퍼·샘플레이트 불일치 | SuperCollider 서버 옵션과 OS 오디오 설정 비교 |
| 한동안 잘 되다 멈춤 | 오디오 서버 다운 | 서버 재부팅 후 SuperDirt 재기동 |
설치 단계별 막히는 지점(체감 빈도)
공식 문서와 커뮤니티 FAQ가 별도 항목으로 다루는 문제 유형을 기준으로 한 정성 비교이며, 측정된 통계가 아닙니다.
더 배우기 위한 자료
Tidal은 함수 개수가 많아 레퍼런스를 옆에 두고 작업하는 것이 일반적입니다. 공식 문서의 함수 목록에서 every, sometimes, chunk, off, jux 항목을 먼저 읽어 두면 대부분의 예제 코드가 해석됩니다.
설치 부담 없이 문법만 먼저 익히고 싶다면 브라우저에서 동작하는 Strudel이 사실상 같은 패턴 문법을 사용하므로 좋은 대안이 됩니다. Strudel에서 패턴 감각을 익힌 뒤 Tidal로 옮겨 오는 순서도 충분히 합리적입니다. 다른 도구와의 비교는 개발자를 위한 음악 라이브러리 총정리에서 확인하실 수 있습니다.
이 글은 AI(인공지능)의 도움을 받아 작성되었습니다.