2014-04-18 25 views
1

我正在嘗試使用不返回的信封(即其中的分段不返回到0)。我發現信封env不能在下面的代碼被觸發不止一次:爲什麼這個不返回的信封不會被重新觸發?

(
SynthDef(\stupidSynth, 
    { 
     |t_trig| 
     var env, envShape, audio, env2; 
     envShape = Env.new([0, 1], [0.5], \sine); 
     env = EnvGen.kr(envShape, t_trig); 
     env2 = EnvGen.kr(Env.perc, t_trig); 
     audio = SinOsc.ar(400 + (env * 100)) * env2 * 0.1; 
     Out.ar(0, audio); 
    } 
).add; 
) 

(
p = Pmono(*[ 
    \stupidSynth, 
    \t_trig, 1 
] 
).play; 
) 

什麼我希望的是,每當合成器重新觸發,在球場會越來越高。實際發生的情況是第一個音符播放音高包絡,並且每個後續音符僅處於最終(即高)頻率。 env顯然未被重新觸發。

我不知道爲什麼會這樣。信封在重新觸發之前不必返回到0,完全可以在信封完成之前重新觸發信封。我的信封有些不起作用。

我基本上在尋找Line的行爲,但也可以重新觸發,並有一個可定製的曲線。

是我想要做的可能嗎?

回答

3

和以前一樣,這是我的一個誤解,我發現包括會被重新觸發 - 它只是不在指定的起始點開始。它總是從當前值開始。這實際上是有道理的,因爲信封在完成之前可能會被重新觸發,在這種情況下,您不希望它突然跳到起點。

因此,我發佈的代碼唯一的問題是,一旦信封運行一次,它的每個後續運行時間都會從當前值(信封的終點)到信封的終點 - 即信封不會改變任何東西。

下面的代碼表明,起點是那種無關,並說明了這種行爲我後:

(
SynthDef(\test, 
    { 
     |freq = 300, on = 1, amp = 0.2, t_pitchEnv = 0, pitchEnvEnd = 1| 
     var audio, onswitch, pitchEnv; 
     onswitch = EnvGen.kr(Env.cutoff(5, curve: \exp), on, doneAction:2); 
     pitchEnv = EnvGen.kr(Env.new([0, pitchEnvEnd], [1], \sine), t_pitchEnv) * freq; 
     audio = SinOsc.ar(freq + pitchEnv, mul: amp * onswitch); 
     Out.ar(0, audio ! 2); 
    } 
).add; 
) 

x = Synth(\test); 
x.set(\t_pitchEnv, 1, \pitchEnvEnd, 1); 
x.set(\t_pitchEnv, 1, \pitchEnvEnd, 2); 
x.set(\t_pitchEnv, 1, \pitchEnvEnd, 1); 
x.set(\t_pitchEnv, 1, \pitchEnvEnd, 0); 
x.set(\on, 0); 
1

信封沒有問題。你認爲信封的行爲就好像每當它被重新觸發時一樣,它會將其新輸出「添加」到之前輸出的任何信息 - 這不是信封的行爲方式。觸發一個信封總是會跳轉到重新開始點(通常是開始)。 EnvEnvGen沒有任何關於輸出內容的長期記憶的概念。

方法可以做到你想要什麼:

1)而不是使用一個信封,實現了「memoryfull」的行爲,使用類似的積分,隨後滯後:

(
SynthDef(\stupidSynth, 
    { 
     |t_trig| 
     var env, envShape, audio, env2, note; 
     note = 67 + Integrator.kr(t_trig * 5).lag(0.2); /* up by 5 semitones at a time */ 
     env2 = EnvGen.kr(Env.perc, t_trig); 
     audio = SinOsc.ar(note.midicps) * env2 * 0.1; 
     Out.ar(0, audio); 
    } 
).add; 
) 

(
p = Pmono(*[ 
    \stupidSynth, 
    \t_trig, 1 
] 
).play; 
) 

2)你絕望地想用Env來達到效果(比如對形狀的精細控制),那麼你可以將你的合成器分成兩個:一個從Bus讀取當前頻率,是一個單一的長壽命合成器,另一個合成器您可以創建env的多個實例以及從env到總線的輸出。然後,每當你觸發你創建一個新的實例添加到後一個合成器的一堆實例。 (凌亂呵呵。)

3)我敢打賭,有一個竅門,你可以通過使用EnvGen因爲你正在做的事,也根本遞增每次你得到一個觸發時間的基頻。詭計但可能正常工作。

+0

*觸發一個信封總是使它跳躍到重新啓動點(通常開始)。 * - 我認爲這不太對。重新設置env似乎可以使它從目前的位置移動到其終點。 – David

相關問題