[obsidian] vault backup: 2026-06-08 11:28:55[
All checks were successful
Build / build (push) Successful in 10m42s
All checks were successful
Build / build (push) Successful in 10m42s
This commit is contained in:
@@ -122,20 +122,26 @@ MIDIのバイトストリームをフィルターして、ノートオンオフ
|
|||||||
|
|
||||||
最終的にはそれをHoldしてセルにして、セルをsampleして値にすれば良い
|
最終的にはそれをHoldしてセルにして、セルをsampleして値にすれば良い
|
||||||
|
|
||||||
|
ジェネリックなholdの実装をどうするかがキモ
|
||||||
|
|
||||||
|
最終的にはMIDI inにコールバックを登録する形になるから、依存性が逆転する
|
||||||
|
|
||||||
なんかJSには[[midiguchi]]というライブラリがあるらしい
|
なんかJSには[[midiguchi]]というライブラリがあるらしい
|
||||||
|
|
||||||
[[Haskell]]には[[Reactive-Banana]]使った[[ReactiveBalsa]]もある
|
[[Haskell]]には[[Reactive-Banana]]使った[[ReactiveBalsa]]もある
|
||||||
|
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
|
let hold = |i|{
|
||||||
fn voice_mono(notes:Stream<Note>){
|
let cell = i
|
||||||
let cell = notes |> hold({pitch:60,velocity:0})
|
|input| {cell =input, cell}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
let midiinput = midi_open_port("from Max 1");
|
let midiinput = midi_open_port("from Max 1");
|
||||||
let notes = midiinput |> filter_map(_,is_byte_note)
|
let notes_cell = midiinput
|
||||||
let notes_cell = notes |> voice_mono //ここまでが今のbind_midi_note_monoに相当
|
~> |x|filter_map(x,is_byte_note)
|
||||||
|
||> hold(_,{pitch:60,velocity:0}) //ここまでが今のbind_midi_note_monoに相当
|
||||||
|
|
||||||
fn dsp(){
|
fn dsp(){
|
||||||
let {pitch,velocity} = notes_cell |> sample
|
let {pitch,velocity} = notes_cell |> sample
|
||||||
@@ -144,9 +150,13 @@ fn dsp(){
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
~>はHaskellの$のような、 a(b(c))を a ~> b~> cで結合弱く描けるようにする
|
||||||
|
|
||||||
[[Computation Expression]]使ってIOの値を`let!`でバインドしていく、とかの方がわかりやすいかも?
|
[[Computation Expression]]使ってIOの値を`let!`でバインドしていく、とかの方がわかりやすいかも?
|
||||||
|
|
||||||
MIDI入力がトリガーになってクロージャのupvalueを書き換えることでCellの中身を書き換えるとなると、現実的にはオーディオスレッドとMIDI(イベント)スレッドを跨いでupvalueを操作することになる。`get_closure_mut`でクロージャをゲットして実行することはできるけど、その時には結局VMがオーディオスレッドにいるから、VMがクロージャ実行予約の命令を受け取るmpscチャネルを持っておいて、予約されたらオーディオブロックの頭で実行する、みたいな感じにする??
|
Holdは組み込みの関数で、ArcSwapで包まれた値のセルを保持する
|
||||||
|
|
||||||
Arcでupvalueを全部包んで、closed upvalueの中身をAtomicU64にする、みたいな方法もあるにはあるが、そうするとClosureのストレージはVMそのものというよりもVMインスタンス間で共有される感じになるのかな
|
グローバル関数はメインスレッドで実行されて、クロージャIDを渡す
|
||||||
|
|
||||||
|
とはいえVMインスタンスがオーディオスレッドに渡ってしまうとなるとな
|
||||||
|
|
||||||
|
|||||||
Submodule content/private updated: 1c5c182873...b7b2247f39
Reference in New Issue
Block a user