filetags: :MUSIC:JavaScript:
TidalCyclesのJavaScript porting
- Web Audio のサンプラー / シンセ
- 自前でサンプルを JS で読み込める
- Web MIDI で DAW(Bitwig)に直 MIDI 送信できる
- https://www.npmjs.com/search?q=%40strudel
- repo: https://codeberg.org/uzu/strudel, githubではない.
- default: sample library: https://github.com/felixroos/dough-samples/
操作
- Ctrl+Enter: ファイル全体を実行
- Ctrl+.: 停止
- Ctrl+Shift+Enter: 選択範囲のみを実行
- TidalCycleはできるがStrudelではできない?strudel.cc では未実装?
- VSCode (strudel.play_selection)
Strudel REPL
ブラウザでの動作.
Samples
based synthesiser called SuperDough
ref. https://strudel.cc/learn/samples/
SuperDough
デフォルトシンセ
- dough
- https://github.com/felixroos/dough-samples, strudel REPLはこれ.
- https://github.com/tidalcycles/Dirt-Samples
カスタムサンプル(@strudel/sampler)
samples(http:localhost:5432)
https://www.npmjs.com/package/@strudel/sampler
Offline
https://strudel.cc/learn/pwa/#using-strudel-offline
VSCode Extentions
- 更新が終わっている. 2023年の strudel.jsをつかってる. static/strudel.js
- 拡張子はstr(stdではない).
npm init -y
npm install @strudel/core @strudel/webaudio @strudel/minihttps://framagit.org/roipoussiere/strudel-vscode
古いstrudel.jsは置き換える
C:\Users\fox10\.vscode\extensions\roipoussiere.tidal-strudel-0.2.1\static
音がならないのはsamplesをloadしてないから
- サンプルURLが古い(strudel.tidalcycles.org → 現在はstrudel.cc)
- pre-loadedはされてないので自分でロード.
// サンプルをロード
samples({
bd: 'bd/BT0A0D0.wav'
}, 'https://loophole-letters.vercel.app/samples/tidal/')
// バスドラムパターン
s("bd!4").gain(.8)keybindの有効化
strをjsと結びつけないとコメントアウトが効かない.
"files.associations": {
"*.str": "javascript"
}Strudel MCP
- GitHub - stuhlmueller/strudel-llm, browserにchatを組み込む.
strudel-mcp-server
playwrightをつかってstrudel.ccを制御する.
Calvin Williamsonさんという人が独自に切り開いてる.
- https://www.youtube.com/@calvinwilliamson4402
- https://github.com/williamzujkowski/strudel-mcp-server
- 基本的なリズムパターンとコード進行はハードコードされている.
- https://github.com/williamzujkowski/strudel-mcp-server/tree/main/src/services
Bitwig Studio
設定手順はTidalCycleのページにまとめる.
Midi
WebMIDI経由で直接送信
note("c3 e3 g3 c4").midi('StrudelToBitwig')サンプルの共有
OSC@
DrivenByMoss経由.
HowTo
カスタムスクリプト
外部のカスタム関数(Switch Angelなど)を読み込む方法.
// 外部スクリプトを読み込む
await fetch('https://raw.githubusercontent.com/switchangel/strudel-scripts/main/allscripts.js')
.then(r => r.text())
.then(eval)
// trancegate などのカスタム関数が使えるようになる
s("supersaw").trancegate(1.5,45,1)- ref.
テンポ設定(setCpm/setcps)
- setCpm(140/4) Cycles Per Minute 1分間に何サイクル回るか
- setcps(140/60/4) Cycles Per Second 1秒間に何サイクル回るか
setcpsはTidalCycles由来の古い記法で、setCpmはStrudelで追加された
サイドチェーンコンプ(duck)
duck(orbit): ダッキング対象のorbitを指定duckattack(sec): 音量が下がり始めるまでの時間duckdepth(0-1): どれだけ音量を下げるか (0.8 = 80%下げる)duckrelease(sec): 元の音量に戻るまでの時間
stack(
// kick: orbit 2 にダッキングを適用
s("bd!4").duck("2").duckattack(.2).duckdepth(.8).orbit(0),
// bass: orbit 2 なのでkickに合わせて音量が下がる
note("c2 e2").s("sawtooth").orbit(2)
)複数パターンを同時に鳴らす(stack)
stackで複数のパターンをレイヤーとして重ねて同時再生.
stack(
s("bd sd bd sd"),
note("c4 e4 g4 c5").s("sawtooth")
)異なるorbitでエフェクトを分離できる.
stack(
s("bd*4").orbit(0),
note("c2 e2").s("sawtooth").orbit(1)
)ブラウザ版(strudel.cc)では $: で複数パターンを並列実行可能.