mimium
要件
どこまでMIDIインプットをmimiumの世界の外側として捉えるか
先行例
SuperColliderやChucKはコールバックを登録するようなイメージ
[Using MIDI | SuperCollider 3.12.2 Help](https://doc.sccode.org/Guides/UsingMIDI.html
まあこれはDSPアウトプットの合成が.playで暗黙的に行える(加算で合成されるという想定)だからできることかな、、、
ChuckもボイスごとにShredを生やす方向で対応してるからちょっと微妙だ
Chuck - Input & Output
現実的には、Faustのように、ボイスアロケーターは外側で実装してしまい、非同期に更新されうるAtomicな値のセルをノートやccのデータとして受け取れるようにすれば当面は十分
が、最終的にはMIDIエフェクト(MIDI信号自体のディレイやクォンタイズ、スロットリングとか)をFRPっぽく書けると嬉しい
Noteのバインドの記法
あとは頑張ってadd_midi_listener
相当の何かを作ろうって感じだな(関数型っぽくはないけども)
IOの順序保証とか考える
正格評価だとIOモナドとかはそもそも考える必要がない
Algebraic Effects入門
type 'a io = unit -> 'a
純粋な値は以下のようなIOモナドにリフトできる。
let return x = fun () -> x
計算はバインド演算子によってつなげることができる。
let (>>=) c1 c2 = fun () -> c2 (c1 ())
mimiumだとバインド演算子ってこうか(ジェネリクスが必要だけども)
FRPっぽい感じで考えてみる
課題:4ポリのMIDIボイスアロケーターを考える
アロケーターを実行すると4つのCell(Behavior)が返ってくる
いや、ストリームを返すべき?
状態のフィードバックはSodiumでは次の2つを持って実行できる
- hold: 任意のStreamが発火した時に最後の値をキープしたCellを作る
- snapshot:任意のStreamが発火したとき、Cellをサンプリングして別のStreamとして発火する
状態の保持として必要なのは、Busymap([Option<Key>;4])
みたいなやつ。