diff --git a/content/4CED.md b/content/4CED.md new file mode 100644 index 00000000..96380f6c --- /dev/null +++ b/content/4CED.md @@ -0,0 +1,53 @@ +#computermusic #programming-language + +[The 4CED Program on JSTOR](https://doi.org/10.2307/3679692) + +[[IRCAM]]で開発された音楽信号処理用のコンピューター[[4C]]([[PDP-11]]の拡張ハードウェア)のためのプログラムをより抽象的に記述するためのプログラミング言語。 + +UGen操作用のPatch Language、Score Language、Envelope Language、Command Languageと4種類の言語を持つ。実装にはC言語使っているらしい(1981年だよね、かなり初期の仕様?) + +Score Languageはさらに2バージョン存在するらしい + +## Patch Language + +プリミティブなオペコードとしてあるのはオシレーター、加算、乗算、エンベロープ、リニアランプ、条件分岐、入出力など。ディレイなどはレジスタへの保存と読み出しで明示的に行うっぽい + +バンドパスフィルタを2つ直列接続したコードを書くときに、バンドパスフィルタは次のように定義できる。 + +``` +BPASS: PATCH +PARAM CENTER, BW, GAIN, IN, OUT; +MUL BW IN DELAY1 ZHP +MUL ZHP CENTER BPSIG BPSIG +MUL BPSIG CENTER ZLP ZLP +MUL BPSIG BW ZLP DELAY2 +MUL DELAY2 MINUS1 DELAY1 +MUL GAIN BPSIG OUT +END +``` + +オペランドの最後は書き込み先。`MUL`はオペランド`A B`の時は`A*B`。`A B C`の時は`A*B+C`。 + +ちょっとJS風にするとこんな感じかな + +```js +ZHO = BW * IN + DELAY1; +BPSIG = ZHP * CENTER + BPSIG; +ZLP = BPSIG * CENTER + ZLP; +DELAY2 = BPSIG * BW + ZLP; +DELAY1 = DELAY2 * MINUS1; +OUT = GAIN * BPSIG; +``` + +で、定義したBPFを使うのはこう + +``` +EXAMLE: PATCH +OSC 4k3 FREQ SIG +AP BPASS CF1 BW1 GAIN1 SIG SIG +AP BPASS CF2 BW2 GAIN2 SIG SIG +OUT 1 SIG +END +``` + +APがユーザー定義UGenを使うコード。BPASSには入出力同じSIGレジスタで破壊的再代入をしている \ No newline at end of file