
음악 프로그래밍 Strudel에 대해 설명해 보기
요약
Strudel은 JavaScript 기반의 웹 브라우저용 라이브 코딩 음악 환경(REPL)입니다. 전통적인 오선보 대신 패턴 언어를 사용하여 리듬과 멜로디를 직관적으로 설계하고 병렬적인 멀티트랙 구성을 지원합니다.
핵심 포인트
- JavaScript를 활용한 패턴 기반의 음악 기술 방식
- 기호와 수치를 이용한 직관적인 리듬 및 음계 제어
- 쉼표(,)와 $ 기호를 통한 간편한 멀티트랙 및 레이어 병렬 처리
- 악기 특성에 따른 코드 복잡도 차이(피아노 vs 기타)
Strudel은 Web 브라우저 상에서 동작하는 라이브 코딩 음악 환경 (REPL)이며, JavaScript를 사용하여 음악의 "패턴 (Pattern)"을 기술하기 위한 패턴 언어입니다.
Strudel에는 기존의 오선보나 음표의 길이(4분 음표 등)라는 개념이 없습니다.
"1마디를 몇 등분 할 것인가"라는 시간 분할 규칙 (패턴 구조 (Pattern Structure))으로 음악을 만듭니다.
- "음표"가 아닌 문자열로 리듬을 분할한다
setcpm(30)
s("~ ~ cp ~ ~ ~ cp ~")
- 기호로 공간을 만든다:
~ 는 쉼표를 나타냅니다. 1마디 안에 문자를 나열하는 것만으로 자동으로 등분됩니다. - 문자가 소리가 된다:
cp (핸드클랩 (Handclap)) 등의 문자를 나열하는 것만으로 직관적인 리듬 배치가 가능합니다.
- 스케일 (Scale, 음계)과 수치로 멜로디를 제어한다
setcpm(30)
n("<[4@2 4] [5@2 5] [6@2 6] [5@2 5]>*2")
.sound("gm_acoustic_bass")
- 수치에 의한 지정:
4나 5와 같은 수치 (도수)로 음계를 지정합니다. - 시간의 신축:
4@2 (4의 음을 2배의 길이로 늘리기)나 *2 (스피드를 2배로 하기)와 같은 기호를 사용하여, 오선보를 사용하지 않고 복잡한 리듬을 구축합니다.
Strudel은 서로 다른 리듬이나 멜로디를 병렬로 실행하여 겹쳐 쌓는 것에 매우 능숙합니다.
- 쉼표 (,)를 사용한 병렬 처리
$: sound("bd*4, [~ <sd cp>]*2, [~ hh]*4").bank("RolandTR909")
- 한 줄로 멀티트랙 (Multi-track):
쉼표 (,)로 구분하는 것만으로 베이스 드럼 (bd), 스네어/클랩 (sd cp), 하이햇 (hh)이라는 3개의 독립된 리듬을 완전히 병렬로 동시에 울릴 수 있습니다.
- "$"를 통한 트랙의 병렬화
$: n(`< [~ 0] 2 [0 2] [~ 2] ... >*4`).scale("C4:minor").sound("saw")
$: sound("bd*4, [~ <sd cp>]*2, [~ hh]*4").bank("RolandTR909")
- 독립된 루프:
$ 기호를 사용함으로써 위의 "신디사이저 멜로디 라인"과 아래의 "드럼 패턴"을 각각 별개의 레이어 (Layer)로서 동시에 루프 재생시킵니다.
드럼이나 베이스에 비해, Strudel에서 기타의 리얼한 연주 (코드의 울림이나 커팅 등)를 표현하려고 하면 코드가 압도적으로 복잡해집니다.
- 복잡한 기타 연주를 재현하기 위한 코드
setcpm(200)"<0@5 1 0 1 0@3 ~@2 0 ~ 0@4 ~@2 >/48"
.pickRestart([
stack(
...
- 화음과 피치 (Pitch)의 미세 조정:
기타 특유의 보이싱 (Voicing, 현의 조합)을 만들기 위해 [c3,g3,c4]라는 화음 지정에 더해, .add(-3)나 .transpose(...)로 복잡하게 음정을 틀어줘야 합니다. - 복잡한 제어 함수의 콤보:
커팅 리듬을 제어하기 위해 stack이나 struct를 조합하고, 나아가 긴 주기 (/48) 안에서 패턴을 전환하는 (pickRestart) 등, 베이스나 드럼의 코드와는 비교할 수 없을 정도의 고도화된 기술이 요구됩니다.
어려운 기타와 대조적으로, 피아노 음원은 Strudel에서 "가장 만능인 악기"입니다. 복잡한 함수를 사용하지 않아도 심플하게 코드 (Chord, 화음)를 쓰는 것만으로 완벽하게 기능합니다.
- 피아노라면 심플한 화음 지정만으로 아름답게 울린다
setcpm(30)
$: n(`<
[~ 0] 2 [0 2] [~ 2]
...
※ 피아노 음원 (gm_piano 등)에서도 동일한 구조
- 한 번에 울리는 화음:
[c4,e4,g4]와 같이 쉼표로 음 이름을 감싸는 것만으로 피아노다운 아름다운 3화음을 즉시 울릴 수 있습니다. - 어떤 역할로도 변신 가능:
베이스라인, 멜로디, 배킹 (Backing), 코드 진행 확인 등, 피아노 음원으로 바꾸는 것만으로 어떤 장르의 음악에도 순식간에 어우러지는 만능함을 가지고 있습니다.
Strudel의 최대 특징 중 하나가 에디터에 내장된 "Pianoroll (피아노 롤)" 뷰입니다. 코드로 작성한 음악이 실시간으로 피아노 롤로 시각화됩니다.
- 스케일이나 노트가 그대로 Pianoroll에 시각화됨
setcpm(30)
n("<[4@2 4] [5@2 5] [6@2 6] [5@2 5]>*2")
.sound("gm_acoustic_bass")
...
- 텍스트에서 그리드(Grid)로의 변환:
코드를 실행하면, 화면의 피아노 롤(Pianoroll) 위에 "어떤 음계(n)가" "어떤 스케일(scale)로" "언제 울리는지"가 그래픽 블록 형태로 표시됩니다.
- 코드와 시각화의 연동:
텍스트만으로는 파악하기 어려운 복잡한 리듬의 밀도나 음의 겹침(병렬 처리의 결과)을, 일반적인 DTM (DAW) 소프트웨어의 피아노 롤과 동일하게 눈으로 보며 직관적으로 확인할 수 있습니다.
이상입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기