Files
quartz-research-note/content/mimiumでのライブコーディングエンジン.md

84 lines
2.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
date: 2025-06-27 16:54
---
#mimium #livecoding
mimiumでも[[ライブコーディング]]がやりたいよね
一般化するとこういうモデルにならんだろうか
![[img/general-livecoding-model.png]]
Tracksの部分の抜き差しだけできるのが[[ChucK]]のShredシステム。
とりあえずはこれをRust実装してもいいけど、最終的にはこのモデル自体をmimium上で実装することもできそう
不要なトラックの削除と空きスロット再利用を実現するためには、普通の配列とは別に単方向リストかSlotmap的なものを作る必要がありそう
Reducerは基本的には全てのチャンネルの加算だけでいいので滅多にいじる必要ないけど、いじりたいケースが出てくるかも
ChucKではエフェクトのテールが更新時にぶちぎれる問題があったので、それを防ぐためのPostFX Chain
各トラックごとのエフェクトのライブ切り替えとかも実現しようと思えばできるかな
...これ、結局[[SuperCollider]]のJITLibと同じことかもな
[jitlib\_basic\_concepts\_01 \| SuperCollider 3.14.0-dev Help](https://doc.sccode.org/Tutorials/JITLib/jitlib_basic_concepts_01.html)
## 信号処理の状態持ち越し
[[Incremental Functional Reactive Programming]]の仕組みを用いることはできるだろうか
```rust
//これが
fn dsp(){
delay(100,100,input)+ delay(200,200,input)
}
//こう更新されるとする
fn dsp(){
delay(300,300,input) + delay(100,100,input)+ delay(200,200,input)
}
```
`delay(100)`にはID(delay_1)が、`delay(200)`にはID(delay_2)がそれぞれつけられる
どう増分検出してID割り振るかの仕組みは置いといて、再コンパイル時に100と200はそのまま、新しく増えたdelay(300)にID`(delay_3)`を挿入する
そうすると、StateStackのためのメモリは完全にリニアにはしないほうが良くて、ツリー状のデータ構造に戻した方が良さそう
[[Red Green Syntax Tree]]のGreen Node→状態メモリのマップだと考えるとわかりやすいのか
```
dsp
| \
delay(1) delay(2)
```
から
```
dsp
/ | \
delay(3)delay(1) delay(2)
```
に更新される
```rust
enum StateLeaf{
Nested(Box<StateTree>),
Delay(usize),
Feedback(usize),
}
struct StateTree{
children: Vec<StateLeaf>
}
```
クロージャの呼び出しの時は?
コンパイル時ではなく、Closure命令でクロージャが作られる際にアロケートとIDの振り分けが起きる
クロージャ