Matsuura Tomoya(Windows) 49ddcb2e43
All checks were successful
Build / build (push) Successful in 5m8s
[obsidian] vault backup: 2025-01-02 23:48:17[
2025-01-02 23:48:18 +09:00

1.9 KiB
Raw Blame History

#computermusic #programming-language

The 4CED Program on JSTOR

IRCAMで開発された音楽信号処理用のコンピューター4CPDP-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*BA B Cの時はA*B+C

ちょっと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レジスタで破壊的再代入をしている