[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [sc-users] How to loop with crossfade ?
maybe this helps. it uses some kind of equal power x-fade. changing
rate and numFrames at runtime is a bit tricky because in some cases a
trigger might be lost ...
(
var numChannels = 2; // or whatever
var defName = "loopUnit" ++ numChannels;
SynthDef.new( defName, { arg out, aInBuf, rate = 1.0, startFrame =
0, numFrames;
var lOffset, gate1, gate2, lLength, play1, play2, trig1, trig2,
duration,
dlyDur, env, amp1, amp2, output, gateTrig1, gateTrig2;
trig1 = LocalIn.kr( 1 ); // LFPulse.kr( freq: LocalIn.kr( 1 ).max
( 0.1 ));
gateTrig1 = PulseDivider.kr( trig: trig1, div: 2, start: 1 );
gateTrig2 = PulseDivider.kr( trig: trig1, div: 2, start: 0 );
lOffset = Latch.kr( in: startFrame, trig: trig1 );
lLength = Latch.kr( in: numFrames, trig: trig1 );
duration = lLength / (rate * SampleRate.ir) - 2;
gate1 = Trig1.kr( in: gateTrig1, dur: duration );
env = Env.asr( 2, 1, 2, \lin ); // \sin
play1 = PlayBuf.ar( numChannels: numChannels, bufnum: aInBuf,
rate: rate, loop: 0,
trigger: gateTrig1, startPos: lOffset );
play2 = PlayBuf.ar( numChannels: numChannels, bufnum: aInBuf,
rate: rate, loop: 0,
trigger: gateTrig2, startPos: lOffset );
amp1 = EnvGen.kr( env, gate1, 0.999 ); // 0.999 = bug fix !!!
amp2 = 1.0 - amp1.squared;
amp1 = 1.0 - amp1;
amp1 = 1.0 - amp1.squared;
output = (play1 * amp1) + (play2 * amp2);
Out.ar( out, output );
LocalOut.kr( Impulse.kr( 1.0 / duration.max( 0.1 )));
}).send( s );
)
Am 31.10.2007 um 08:39 schrieb Alessandro Fogar:
Hi,
I'm looking for a way to loop a buffer with crossfades.
The actual ways to do it (LoopBuffer, RedPhasor) doesn't take into
account this.
If somebody did already implement this please let me know.
All the best
--
Alessandro Fogar
http://www.fogar.it
_______________________________________________
sc-users mailing list
sc-users@xxxxxxxxxxxxxxx
http://www.create.ucsb.edu/mailman/listinfo/sc-users