Compare commits
42 Commits
8f4dc421c1
...
v4
| Author | SHA1 | Date | |
|---|---|---|---|
| 6443e8a507 | |||
| 875df01182 | |||
| 65bae8f538 | |||
| 0bd44c388d | |||
| 70e0e5b0c3 | |||
| a03b380b86 | |||
| 70211867c4 | |||
| bbdced067c | |||
| 89201f482b | |||
| 4457a48bb0 | |||
| 1666925042 | |||
| 97473f822d | |||
| 869e4566bd | |||
| a421988063 | |||
| 1927871ef3 | |||
| bba1f07a0d | |||
| b98be55a43 | |||
| 4863b3f5e7 | |||
| f436fdf4f1 | |||
| 8e10479dcc | |||
| eab147ebda | |||
| f3a3ea9437 | |||
| afcdefd317 | |||
| 29a6348864 | |||
| 94effceecd | |||
| 54cfb646b1 | |||
| 6d2315ae4e | |||
| e82c032c3a | |||
| b3ca7046c9 | |||
| 20183bd08e | |||
| ca92e0cf43 | |||
| 9e595cfb3d | |||
| 1390630f42 | |||
| 006e3e2ce4 | |||
| 64dbddb66b | |||
| 16ecfaef1c | |||
| af7a39e761 | |||
| cc12426e0d | |||
| b1b910fb11 | |||
| 75c1aebc93 | |||
| 289d3bbe23 | |||
| 449dcddb98 |
@@ -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: cb1f1330e5...3633b87ea5
Reference in New Issue
Block a user