Strudel 即時編程:線上用程式碼創作音樂

將音樂模式寫成程式碼,並在內嵌 Strudel 編輯器立即聆聽——瀏覽器中的 TidalCycles。

從下方選擇入門模式,在編輯器內按播放,接著於播放時修改程式碼。這就是即時編程:重新評估的瞬間,音樂便會更新。

Strudel 即時編程:線上用程式碼創作音樂
將音樂模式寫成程式碼,並在內嵌 Strudel 編輯器立即聆聽——瀏覽器中的 TidalCycles。
入門模式

模式: 鼓組

sound("bd hh sd hh")

只有在編輯器內按下播放才會開始發聲。想使用具備取樣瀏覽器與視覺效果的完整環境嗎? 在完整 Strudel 中開啟

Strudel 迷你記譜快速參考

解鎖大部分模式語言的十種結構。雙引號內的內容都是迷你記譜;一個帶引號的序列剛好持續一個循環。

結構範例作用
sound() / s()sound("bd hh sd hh")播放命名的取樣或合成器:bd = 大鼓、sd = 小鼓、hh = 踩鈸。四個事件平均分配一個循環。
note()note("c4 e4 g4").sound("piano")依音名(c4、eb3)或 MIDI 編號播放音高,並送至後方串接的聲音。
*(重複)sound("hh*8")將 8 個踩鈸壓入一個事件的時間中——書寫快速細分節奏的標準方式。
~(休止)sound("bd ~ sd ~")一個靜音位置。事件網格維持節拍;波浪號只是什麼也不播放。
[ ](群組)sound("bd [sd sd] bd sd")方括號會將多個事件放進一個位置並細分時間——此處兩個快速小鼓共用第 2 拍。
< >(交替)note("<c2 eb2 g2>")角括號每個循環播放一項並依序輪換——立即形成和弦進行。
stack()stack(sound("bd*4"), sound("hh*8"))將模式分層以同時播放——可建立完整鼓組,或在鼓組下加入貝斯線。
fast() / slow()sound("bd sd").fast(2)加速或延展模式:fast(2) 每循環放入兩次重複,slow(2) 將一次延展為兩個循環。
rev()note("c4 e4 g4 b4").rev()反轉每個循環內的模式——一個字就能改變旋律。
.euclid(k, n)sound("bd").euclid(3, 8)將 k 次擊打盡可能平均分布於 n 個步點。euclid(3,8) 是無數舞曲與拉丁律動中的 tresillo 節奏。

關於 Strudel 與即時編程

即時編程是在音樂播放時持續書寫與改寫程式碼來演出音樂。你不必在時間軸排放音符,而是描述模式:每個四分音符的大鼓、每循環變化的和弦、擠入三連音的踩鈸;語言會立即將描述化為聲音。修改一行、重新評估,音樂會在下一個循環變換而不停止。此實作發展成 algorave:表演者的程式碼投影給舞動觀眾閱讀的俱樂部夜晚。 Strudel 是 TidalCycles 的 JavaScript 化身。TidalCycles 是 Alex McLean 約於 2009 年以 Haskell 建立的模式語言,成為即時編程音樂的共同語言。Strudel 將 Tidal 的概念完全重作於瀏覽器分頁中:不需 Haskell 工具鏈、SuperCollider 音訊伺服器或任何安裝。本頁以框架嵌入 strudel.cc 的官方 Strudel REPL,帶來真正的編輯器、評估閃爍、錯誤訊息和內建聲音;入門按鈕會載入可運作的模式。完整 Strudel 連結會將目前模式帶往含取樣瀏覽器與視覺化的完整環境。 Tidal 系列語言的核心是循環:預設約兩秒、所有模式皆以此衡量的重複時間段。雙引號間的迷你記譜會切分此循環。寫下 bd hh sd hh,就得到每循環四個相等事件:大鼓、踩鈸、小鼓、踩鈸。小修改能產生巨大變化:星號倍增事件、波浪號插入靜音、方括號細分一個位置、角括號於連續循環交替數值,因此兩個字元的修改即可成為和弦進行。 模式語言迷人之處在於變換可組合。串接 rev() 翻轉旋律、fast(2) 加倍速度,或 euclid(3,8) 將擊打重分布為古巴 tresillo 節奏;這些都套用至整個模式而非單一音符,因此一處編輯便改變完整織體。從鼓組模式開始,換個取樣名稱,加上一個星號,你就是在即時編程。

可在編輯器嘗試的模式配方

將任一範例複製至內嵌編輯器,按播放,然後每次變動一個符號。

程式碼聽到的效果示範概念
sound("bd hh sd hh")基本反拍:大鼓、踩鈸、小鼓、踩鈸,每循環一次四個事件平均切分一個循環——迷你記譜的 Hello World。
sound("bd*4, hh*8")四拍大鼓下搭配八分音符踩鈸流引號內的逗號會疊加序列,像精簡的 stack()。
note("<c2 eb2 g1 bb1>").sound("sawtooth").lpf(500)每循環移至新根音的暗色濾波貝斯線角括號按循環交替;lpf(500) 是抑制鋸齒波的 500 Hz 低通濾波器。
sound("bd").euclid(3, 8)tresillo:8 步中的第 1、4、7 步擊打歐幾里得節奏將 3 次擊打盡可能平均散布於 8 步——從古巴 son 到 EDM 都聽得到。
note("c4 e4 g4 b4").rev().fast(2)每循環演奏兩次的下行琶音變換由左至右串接:先反轉模式,再加倍速度。

如何開始即時編程

  1. 點選入門模式——鼓組、旋律、貝斯線或複節奏——將程式碼載入內嵌 Strudel 編輯器。
  2. 在編輯器中按播放按鈕(瀏覽器需先點擊才能開始任何聲音)。
  3. 播放時編輯程式碼:改變取樣名稱、對事件加入 *2 或替換音符;接著按 Ctrl+Enter(Mac 為 Cmd+Enter)重新評估。
  4. 使用 stack() 疊加更多模式,並利用上方速查表的 fast、slow、rev 或 euclid 塑形。
  5. 當模式不再只是草稿,請選擇「在完整 Strudel 中開啟」,使用含聲音瀏覽器與視覺效果的完整環境。

Strudel 即時編程常見問題

Strudel 與 TidalCycles 有什麼差別?
TidalCycles 是原始模式語言,以 Haskell 撰寫,通常搭配 SuperCollider 合成引擎。Strudel 是官方姊妹專案,將同一套模式系統移植至 JavaScript 與 Web Audio API,因此任何現代瀏覽器皆可零安裝執行。兩者的模式與概念幾乎一一對應。
為什麼入門按鈕會重新載入編輯器?
Strudel 可透過 URL 接收完整程式:模式來源以 base64 編碼放入 # 符號後的位址。每個入門按鈕都令嵌入編輯器指向攜帶該模式的新 URL,這也使「在完整 Strudel 中開啟」能帶上目前模式。
為何在編輯器按播放前沒有聲音?
瀏覽器會阻擋音訊,直到使用者與產生聲音的頁面互動,這是自動播放保護。Strudel 框架本身是一個頁面,因此首次播放必須在編輯器內點擊。之後重新評估程式碼即可更新音樂而不停止。
什麼是循環?
循環是 Tidal 與 Strudel 的音樂時間單位:預設速度下約兩秒的重複時間段,所有模式皆以它衡量。像 bd hh sd hh 的帶引號序列將一個循環分成相等部分;fast(2) 把兩個循環的內容放進一個;角括號每循環分配一個值。
什麼是 algorave?
algorave 是表演者透過書寫程式碼現場生成音樂(通常也有視覺效果)的音樂活動,螢幕通常會投影,讓觀眾觀看原始碼變化。這個詞約於 2012 年在 TidalCycles 社群中提出,現在世界各地都有 algorave。
Strudel 是免費的嗎?為什麼嵌入框架?
是。Strudel 是 Strudel/TidalCycles 社群依 AGPL-3.0 授權釋出的免費開源軟體。嵌入官方 strudel.cc 編輯器,使程式碼庫保持在自身來源並與本站清楚分離,同時提供真正、隨時更新的 REPL,而不是複製品。