1.6 KiB
1.6 KiB
#programminglanguage #sound
https://github.com/tomoyanonymous/otopoiesis
DAWをプログラマブルにする試み
構造
いわゆるオーディオプラグインのように、各コンポーネントがUI+オーディオ処理を記述していて、それをツリー状に組み合わせていくのではなく、プロジェクトツリー、UIのツリー、オーディオ処理用の構造体とそれぞれツリーができ、全てのノードが対応づけされている
コードの例(モジュレーションされているサイン波+ディレイ)
project{
track: [
delay{
sinosc{
freq:
sinosc:{
freq: float{20..20000,1000,"freq"}
phase: 0.0},
phase: 0.0
},
time: 1000
}
]
}
UIは基本的にプロジェクトツリーのParam
型と、UIだけで使われるState
をそれぞれ可変参照として持つ
(Reference カウントするのではなく、有限なライフタイムを持つ可変参照で作る)
struct UI<'a>{
param: &'a mut Param,
state: &'a mut State
}
impl<'a> egui::Widget for UI<'a>{
fn ui(self, ui: &mut egui::Ui) -> egui::Response {
///...
}
}
eguiはimmiditate モードだから毎フレームこのUI型を生成している(egui標準のSliderとかもこの方式)
オーディオプロセッサーもこのやり方にできるか?
開発メモ
クリップのサムネイル生成はgeneratorじゃなくてregion側でやろう
fileplayerのui実装もgeneratorからregionに移そう
そうなるとaudio側の実装もそっちに合わせるのが自然だよな・・・