[obsidian] vault backup: 2025-09-02 13:53:14[
Some checks failed
Build / build (push) Failing after 9m10s

This commit is contained in:
2025-09-02 13:53:14 +09:00
parent 72ef32a4b9
commit 5f1a6e799d

View File

@@ -80,8 +80,20 @@ CubaseにおけるインストゥルメントトラックとかはMIDIトラッ
type Region = { type Region = {
start:float, start:float,
dur: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{ fn region_transformer(origin:Region,fx:FX) -> 'Region{
let start = origin.start let start = origin.start
let dur = origin.dur let dur = origin.dur
'Region{ `region({
start:$start, start:$start,
dur:$dur, 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として参照することにする //track1をfrequencyとして参照することにする
let r1 = { let r1 = LiveRegion({
start: 100ms, start: 100ms,
dur: 1000ms, dur: 1000ms,
content: || sinosc($track1(), 1.0) content: || sinosc($track1(), 1.0)
} })
let regions = [r1,r2,...]//regionの列はstage0のvalue 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 ```rust
fn render_lift(content:()->float,time:float)->`[float]{
fn track_regions(regions:[{start:float,dur:float,generator:()->float}]){ ...
Track()
} }
``` ```
## トラックのランタイム構造 ## トラックのランタイム構造
```rust ```rust
@@ -189,7 +206,7 @@ let content = `{ phasor(Param!("freq",20,20000)) }
fn Track(name:string, content:()->`float)->`float{ fn Track(name:string, content:()->`float)->`float{
`{ `{
//stack is cleared and new track ui is placed on top of the stack //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の評価の方が先に来てしまう Trackの中でSliderとかが呼び出されると、そのスライダーはトラック内のパラメーターに属していて欲しいが、引数は内側から評価されてしまう=sliderの評価の方が先に来てしまう
UIツリー系の評価は、常にStackに積むような処理にしておいて、TrackのところではStackを消費し新たなUIをスタックに積むようにする、そして最後にトップレベルでスタックを全て消費しUIを構築、みたいな感じかな、これならサンクで包む必要もなし UIツリー系の評価は、
- 個別のパラメーターを評価時Stackに積むような処理
- TrackやリージョンではStackを消費しグループ化して自分のところに配置、トラックのUIを配置してStackに積む
- トップレベルでスタックを全て消費しUIをプロジェクト全体のUI構築
UI系の関数は全てサンクレベル0を受けて遅延評価するようなものでないとNG UI系の関数は全てサンクレベル0を受けて遅延評価するようなものでないとNG