filetags: :MUSIC:JavaScript:

TidalCyclesのJavaScript porting

  • Web Audio のサンプラー / シンセ
  • 自前でサンプルを JS で読み込める
  • Web MIDI で DAW(Bitwig)に直 MIDI 送信できる

操作

  • Ctrl+Enter: ファイル全体を実行
  • Ctrl+.: 停止
  • Ctrl+Shift+Enter: 選択範囲のみを実行
    • TidalCycleはできるがStrudelではできない?strudel.cc では未実装?
    • VSCode (strudel.play_selection)

Strudel REPL

ブラウザでの動作.

https://strudel.cc/

Samples

based synthesiser called SuperDough

ref. https://strudel.cc/learn/samples/

SuperDough

デフォルトシンセ

カスタムサンプル(@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/mini

https://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

strudel-mcp-server

playwrightをつかってstrudel.ccを制御する.

Calvin Williamsonさんという人が独自に切り開いてる.

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)

テンポ設定(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)では $: で複数パターンを並列実行可能.

DAW連携

Examples

🔗References

japanese

Learn

🎵Live Coding