«glitchySampler» by tigges-p

on 12 Aug'14 20:32 in samplerglitch

Hey guys! I used this code on my first release and some people asked for a look on it. It's basically a PlayBuf UGen whose arguments are modulated to a user-defined degree by several LFNoise UGens, thus leading to playback direction changes and retriggering with different starting points.

Cheers!

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
(
SynthDef(\glitchySampler, {
	|
	buffer,                //the buffer should contain a stereo file
	out          = 0,
	gate         = 1
	rate         = 1,      //buffer playback rate
	amp          = 0.5,
	att          = 0.01,   //attack time of the adsr envelope
	dec          = 0.4,    //decay time
	sust         = 0.7,    //sustain level
	rel          = 1,      //release time (synth is freed when the envelope finishes)
	lpf          = 20000,  //low pass filtering frequency
	hpf          = 20,     //high pass filtering frequency
	trigfreq     = 1,      //the frequency at which the PlayBuf UGen is triggered to jump to the start position
	trigrand     = 0,      //the actual trigger frequency is calculated by (\trigfreq * (2 to the power of (this * an LFNoise UGen with range -1 to 1))); setting this to 0 will result in a constant trigger frequency
	startmul     = 1,      // \trigfreq also controls the frequency of an LFNoise UGen which changes PlayBuf's starting point; this is a multiplier for that frequency; setting this to 0 will result in a constant starting point
	dirmul       = 1,      //same as above, but controlling the frequency of random playback direction changes
	randmul      = 1       //same as above, but for random trigger frequency changes
	|

	var start, direction, rand, trig, sig, env;

	start = {LFNoise1.kr(trigfreq*startmul, 0.5, 0.5)}!2; //modulating the starting point; different for left and right channel

	direction = {Select.kr(LFNoise1.kr(trigfreq*dirmul) > 0, [-1, 1])}!2; //modulating the direction; different for left and right channel

	rand = {LFNoise1.kr(trigfreq*randmul)}!2; //modulating the trigger frequency; different for left and right channel

	trig = Impulse.kr(trigfreq*pow(2, trigrand*rand)); //the trigger for PlayBuf

	sig = PlayBuf.ar(2, buffer, BufRateScale.kr(buffer)*rate*direction, trig, BufFrames.kr(buffer)*start, 1); //playing the (looping) stereo buffer

	env = Env.adsr(att, dec, sust, rel, amp);
	env = EnvGen.kr(env, gate, doneAction: 2); //simple adsr envelope which frees the synth when finished

	sig = LPF.ar(HPF.ar(sig*env, hpf), lpf); //basic filtering

	Out.ar(out, sig);
	}
).add;
)







//////////////////////////////////////////////////////////////////////////////////////////////
// If you want to test the above fast, here is basically what I used for the EP - not really interesting though
//////////////////////////////////////////////////////////////////////////////////////////////

b = Buffer.read(s, /*path to your stereo soundfile; I used recordings of a tuba, a western guitar and a panflute*/);
MIDIClient.init;
MIDIIn.connect(0, MIDIClient.sources[/*index of your device*/]);


(
var activenotes = nil!128;

var sustain = 0;

var sustained = false!128;

var releasefunction = {|index|

	if(activenotes[index].notNil)
	{
		activenotes[index].release;
		activenotes[index] = nil;
	};
};


MIDIIn.noteOn = { arg src,chan, midinote, velocity;

	releasefunction.value(midinote);

	activenotes[midinote] = Synth(\glitchySampler,[\buffer, b, \rel, velocity/20, \trigfreq, 0.15, \trigrand, 1, \rate, (midinote-60).midiratio, \amp, velocity/(127.0*8), \startmul, 2, \dirmul, 0.3, \randmul, 1, \lpf, 7000]);
	//Synth(\glitchySampler,[\buffer, b, \rel, velocity/20, \trigfreq, 2, \trigrand, 10, \rate, (midinote-60).midiratio, \amp, velocity/(127.0*8), \startmul, 2, \dirmul, 4, \randmul, 2, \lpf, 17000]);
	//Synth(\glitchySampler,[\buffer, b, \rel, velocity/20, \trigfreq, 0.4, \trigrand, 5, \rate, (midinote-60).midiratio, \amp, velocity/(127.0*8), \startmul, 1, \dirmul, 1, \randmul, 1, \lpf, 4000]);

};


MIDIIn.noteOff = { arg src,chan, midinote, velocity;

	if(sustain == 0)
	{
		releasefunction.value(midinote);
	}{
		sustained[midinote] = true;
	};
};

MIDIIn.control = {|uid,channel,cN,v|

	if(cN == 64/*64 is the sustain pedal*/)
	{
		sustain = v;

		if(sustain == 0)
		{
			sustained.do{|value, index|
				if(value)
				{
					sustained[index] = false;
					releasefunction.value(index);
				}
			}
		}
	};
};
)
raw 4124 chars (focus & ctrl+a+c to copy)
reception
comments