[obsidian] vault backup: 2025-09-02 13:53:14[
Some checks failed
Build / build (push) Failing after 9m10s
Some checks failed
Build / build (push) Failing after 9m10s
This commit is contained in:
@@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user