«Looping sampler with crossfading» by coreyker

on 16 May'16 10:56 in

Looping sampler with crossfading. Looping point and loop length can be adjusted.

https://soundcloud.com/inlet/sc-160515-234815

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
SynthDef(\simpler, {
	arg buf=0
	,freq=220
	,sampleStart=0
	,loopStart=0
	,loopLen=1 // between 0 (min) and 1 (max)
	,fadeTime=0.1
	,gate=1
	,attack=0.01
	,sustain=1
	,release=1
	,f0=220;

	var rate = freq / f0;
	var sr = rate*BufSampleRate.kr(buf);
	var fadeFrames = fadeTime*sr;
	var loopEnd = loopLen*(BufFrames.kr(buf) - loopStart) + loopStart;
	var loopFrames = loopEnd - loopStart + 1;
	var loopTime = (loopFrames - fadeFrames)/sr;
	var startUpTime = (loopStart - sampleStart)/sr;

	var trigLoop = TDuty.ar(Dseq([startUpTime + loopTime, Dseq([loopTime], inf)]), gapFirst:1);

	var phaseA = Phasor.ar(trigLoop, rate, sampleStart, inf, loopStart);
	var phaseB = Phasor.ar(trigLoop, rate, loopEnd - fadeFrames, inf, loopEnd - fadeFrames);

	var srcA = BufRd.ar(buf.numChannels, buf, phaseA);
	var srcB = BufRd.ar(buf.numChannels, buf, phaseB);

	var startLoop = SetResetFF.ar(trigLoop);
	var loopPan = Phasor.ar(trigLoop, 2/fadeFrames * rate, -1, inf, -1).clip(-1,1);

	var out = Select.ar(startLoop, [srcA, LinXFade2.ar(srcB, srcA, pan:loopPan)]);
	var env = EnvGen.ar(Env.asr(attack, sustain, release, 1), gate, doneAction:2);

	Out.ar(0, Splay.ar(out) * env);
}).add;

// Try it out:
~buf = Buffer.read(s, Platform.resourceDir +/+ 'sounds/a11wlk01.wav');

Pdef(\p, Pbind(*[
	instrument: \simpler
	,buf: ~buf
	,octave: Prand([3,4,5],inf)
	,degree: Pn(Plazy({Pseq([-4,0,5,7,9,12].scramble.clump(2),2)}))
	,dur: 0.5
	,strum: Prand([0, 0.125, 0.25], inf)
	,strumEndsTogether: false
	,loopStart: Pwhite(90000, 150000)
	,sampleStart: Pwhite(50000, 85000)
	,loopLen: 0.4
	,fadeTime: 0.15
	,attack: 0.25
	,release: 4
])).play;
raw 1679 chars (focus & ctrl+a+c to copy)
reception
comments
pam user 18 Jun'16 22:24

Very fun!

am curious about the args "strum" and "strumEndsTogether" which don't appear in your code, nor in the help files.

Thanks!

pam

coreyker user 25 Jun'16 07:11

"strum" arpeggiates a chord. "strumEndsTogether" arpeggiates a chord and also adjusts the per note sustain times so that they all finish at exactly the same time :)

thor user 02 Apr'21 22:32

Wow amazing coding!