Compare commits
3 Commits
b06a328640
...
d6aa3afd47
Author | SHA1 | Date | |
---|---|---|---|
d6aa3afd47 | |||
ab45b5857d | |||
1afe1d171b |
@@ -64,8 +64,8 @@ type Generator<T> = iVec<T>
|
||||
|
||||
```
|
||||
//Freq440Hz,Gain1.0,Phase0.0
|
||||
let Track1 = Generator::SineWave(Constant(440),Constant(1.0),Constant(0.0));
|
||||
let Track2 = Generator::SineWave(Track1,Constant(1.0),Constant(0.0));
|
||||
let t1 = Track(Generator::SineWave(Constant(440),Constant(1.0),Constant(0.0)));
|
||||
let t2 = Track(Generator::SineWave(t1,Constant(1.0),Constant(0.0)));
|
||||
```
|
||||
これをあんまり動的ディスパッチじゃない感じで実装したい。そしてこの辺までは別にMaxとかと同じレベルの話
|
||||
|
||||
@@ -76,39 +76,97 @@ CubaseにおけるインストゥルメントトラックとかはMIDIトラッ
|
||||
|
||||
## 考えうるユースケース
|
||||
|
||||
```rust
|
||||
type Region = {
|
||||
start:float,
|
||||
dur:float,
|
||||
content: ()->float,
|
||||
}
|
||||
```
|
||||
|
||||
### 一般的なリージョンエフェクト
|
||||
|
||||
```rust
|
||||
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{
|
||||
start:$start,
|
||||
dur:$dur,
|
||||
content: || {s:$origin.content(),start:$start,dur:$dur} |> $fx
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### リージョンに対するFadeInOut
|
||||
|
||||
```rust
|
||||
fn fade_inout(origin:Region)->Region{
|
||||
let time_in = Param(0.0,"fade_in",0..=f64::MAX);
|
||||
let time_out = Param(0.0,"fade_out",0..=f64::MAX);
|
||||
//クロージャとして値を閉じ込める
|
||||
let new_generator = |s| apply_fadeinout(s,time_in,time_out);
|
||||
Region{
|
||||
start:origin.start,
|
||||
dur:origin.dur,
|
||||
content: compose(origin.content,new_generator)//この辺がよくわからん
|
||||
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
|
||||
}
|
||||
}
|
||||
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{
|
||||
region_transformer(origin,finout_generator)
|
||||
}
|
||||
...
|
||||
fade_inout!(some_region)
|
||||
```
|
||||
|
||||
### リージョンに対するリバース
|
||||
|
||||
```rust
|
||||
fn reverse(origin:Region)->Region{
|
||||
//クロージャとして値を閉じ込める
|
||||
let mut new_cache = vec![0;origin.get_dur_in_samples()*origin.channeks];
|
||||
origin.render(new_cache);
|
||||
let new_generator = |s| ;
|
||||
Region{
|
||||
start:origin.start,
|
||||
dur:origin.dur,
|
||||
content: compose(origin.content,new_generator)//この辺がよくわからん
|
||||
let new_cache = origin |> render
|
||||
//クロージャとして値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その両方とかだけど、例えばグリッドをジェネラティブに生成できる
|
||||
|
Submodule content/private updated: 1bc1a0fa17...e2fd2fcb42
Reference in New Issue
Block a user