diff --git a/content/otopoiesis.md b/content/otopoiesis.md index dc21a98d..1f817512 100644 --- a/content/otopoiesis.md +++ b/content/otopoiesis.md @@ -103,45 +103,70 @@ fn region_transformer(origin:Region,fx:FX) -> 'Region{ ```rust fn apply_fadeinout(s,start,tin,dur,tout){ - let end = start+dur - if now < start | now > end | tin<=0 | tout <= 0{ - 0 - }else{ - let gain_s = min(max(now - start,0)/tin ,1) - let gain_e = min(max(end - now,0)/tout,1) - s*gain_s*gain_e // gain_sとgain_eはどちらから0~1の区間もう片方が1 - } + let end = start+dur + if now < start | now > end | tin<=0 | tout <= 0{ + 0 + }else{ + let gain_s = min(max(now - start,0)/tin ,1) + let gain_e = min(max(end - now,0)/tout,1) + s*gain_s*gain_e // gain_sとgain_eはどちらから0~1の区間もう片方が1 + } +} +fn finout_generator(s,start,dur){ + //パラメーターはステージ1では単なる変数参照になる + let time_in = Param!(0.0,"fade_in",0..=f64::MAX); + let time_out = Param!(0.0,"fade_out",0..=f64::MAX); + apply_fadeinout(s,start,time_in,dur, time_out) } fn fade_inout(origin:Region)-> 'Region{ - let new_generator = |s,start,dur| { - //パラメーターはステージ1では単なる変数参照になる - let time_in = Param!(0.0,"fade_in",0..=f64::MAX); - let time_out = Param!(0.0,"fade_out",0..=f64::MAX); - apply_fadeinout(s,start,time_in,dur, time_out) - }; - region_transformer(origin,new_generator) + region_transformer(origin,finout_generator) } +... +fade_inout!(some_region) ``` ### リージョンに対するリバース ```rust fn reverse(origin:Region)->Region{ - //クロージャとして値を閉じ込める let new_cache = origin |> render - - Region{ - start:origin.start, - dur:origin.dur, - content: | | { - let index = origin.dur - origin.start - now - new_cache[index] - } + //クロージャとして値new_cacheを閉じ込める + let new_generator = |s,start,dur| {//実際にはsは使わない + //s is not used + let index = dur - start - now + new_cache[index] } + region_transformer(origin,new_generator) +} +... +some_region |> reverse!(_) |> fade_inout!(_) +``` + +## トラックの中で別のトラックの信号を参照する + +```rust +fn phasor(freq){ + self+freq/samplerate % 1.0 +} +fn sinosc(freq,amp){ + phase*TWOPI |> sin +} +// --ここから上はstage 1 value + +//track_1はstage0として参照する +let track1 = Track(|| phasor(1.0)|> scale(_,0.0,1.0,100,4000)) + +//track1をfrequencyとして参照することにする + +let r1 = { + start: 100ms, + dur: 1000ms, + content: || sinosc(track1(), 1.0) } ``` + ### 他 - ドラッグしてるオブジェクトのスナップ対象は例えばCubaseなら固定のグリッドor既存のイベントorその両方とかだけど、例えばグリッドをジェネラティブに生成できる