From 5f1a6e799d7dac8894cb0764cda2e12ac5daa178 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=BE=E6=B5=A6=20=E7=9F=A5=E4=B9=9F=20Matsuura=20Tomoy?= =?UTF-8?q?a?= Date: Tue, 2 Sep 2025 13:53:14 +0900 Subject: [PATCH] [obsidian] vault backup: 2025-09-02 13:53:14[ --- content/otopoiesis.md | 47 +++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/content/otopoiesis.md b/content/otopoiesis.md index 8a6ed254..36634857 100644 --- a/content/otopoiesis.md +++ b/content/otopoiesis.md @@ -80,8 +80,20 @@ CubaseにおけるインストゥルメントトラックとかはMIDIトラッ type Region = { start:float, dur:float, - content: ()->float, + content: [float], } + +fn region(start,dur,content:(({start,dur})->float))->Region{ + let start_p = param_clip_start(start) + let dur_p = param_clip_end(dur) + let wave = render_mono(||content(start_p(),dur_p())) |> probe_clip_array + { + start = start_p, + dur = dur_p, + content = wave + } +} + ``` ### 一般的なリージョンエフェクト @@ -91,11 +103,11 @@ type alias FX = ({s:float,start:float,dur:float})->float fn region_transformer(origin:Region,fx:FX) -> 'Region{ let start = origin.start let dur = origin.dur - 'Region{ + `region({ start:$start, dur:$dur, - content: || {s:$origin.content(),start:$start,dur:$dur} |> $fx - } + content: |start,dur| {s:$origin.content(),start:$start,dur:$dur} |> $fx + }) } ``` @@ -158,11 +170,11 @@ let track1:`()->float = Track(|| phasor(1.0)|> scale(_,0.0,1.0,100,4000)) //track1をfrequencyとして参照することにする -let r1 = { +let r1 = LiveRegion({ start: 100ms, dur: 1000ms, content: || sinosc($track1(), 1.0) -} +}) let regions = [r1,r2,...]//regionの列はstage0のvalue @@ -170,16 +182,21 @@ let track3 = track_regions(regions) ``` -こういうことができるとなると、リージョンの移動に応じて生成される波形が変わるみたいなこともできるようになるが、サムネイルの生成のために全てのトラックを一度走査するみたいな必要は出てくるよな +- リージョンの移動に応じて生成される波形が変わるみたいなこともできるようになる +- ただ実行時のトラックのサンプルに依存すると、 + - サムネイルの生成のために全てのトラックを一度走査するみたいな必要は出てくる + - これに対するリバースとか定義できなくない? +- リージョンの書き込み=ステージ0評価ということにするならば、ステージ0でもselfなど状態関数使える必要あり +- リージョンを、他のトラックを参照するLiveRegionとそうでないものに分けるとか? +- あるステージ0関数を評価するとステージ1配列を返すrender_lift関数のようなものを考える ```rust - -fn track_regions(regions:[{start:float,dur:float,generator:()->float}]){ - Track() +fn render_lift(content:()->float,time:float)->`[float]{ + ... } - ``` + ## トラックのランタイム構造 ```rust @@ -189,7 +206,7 @@ let content = `{ phasor(Param!("freq",20,20000)) } fn Track(name:string, content:()->`float)->`float{ `{ //stack is cleared and new track ui is placed on top of the stack - $content |> probe_to_track!(name) + $content() |> probe_to_track!(name,_) } } @@ -202,7 +219,11 @@ let dsp = master([t1,t2,t3...]) Trackの中でSliderとかが呼び出されると、そのスライダーはトラック内のパラメーターに属していて欲しいが、引数は内側から評価されてしまう=sliderの評価の方が先に来てしまう -UIツリー系の評価は、常にStackに積むような処理にしておいて、TrackのところではStackを消費し新たなUIをスタックに積むようにする、そして最後にトップレベルでスタックを全て消費しUIを構築、みたいな感じかな、これならサンクで包む必要もなし? +UIツリー系の評価は、 + +- 個別のパラメーターを評価時Stackに積むような処理 +- TrackやリージョンではStackを消費しグループ化して自分のところに配置、トラックのUIを配置してStackに積む +- トップレベルでスタックを全て消費しUIをプロジェクト全体のUI構築 UI系の関数は全てサンク(レベル0)を受けて遅延評価するようなものでないとNG