File: DelayWr.sc

package info (click to toggle)
supercollider 1%3A3.10.0%2Brepack-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 45,496 kB
  • sloc: cpp: 283,513; lisp: 74,040; ansic: 72,252; sh: 23,016; python: 7,175; makefile: 1,087; perl: 766; java: 677; yacc: 314; lex: 175; ruby: 136; objc: 65; xml: 15
file content (82 lines) | stat: -rw-r--r-- 2,182 bytes parent folder | download | duplicates (6)
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
PingPong {
	//your buffer should be the same numChannels as your inputs
	*ar { arg  bufnum=0,  inputs, delayTime, feedback=0.7, rotate=1;

		var delaySamps = max(0, delayTime * SampleRate.ir - ControlDur.ir).round,
		phase, feedbackChannels, delayedSignals,
		frames = BufFrames.kr(bufnum);

		phase = Phasor.ar(0, 1, 0, frames);

		feedbackChannels = LocalIn.ar(inputs.size) * feedback;

		delayedSignals = BufRd.ar(inputs.size, bufnum, (phase - delaySamps).wrap(0, frames), 0);
		LocalOut.ar(delayedSignals);

		BufWr.ar((inputs + feedbackChannels).rotate(rotate) <! delayedSignals.asArray.first, bufnum, phase, 1);
		^delayedSignals
	}
}

/* old sc3d5 version
PingPong {
	*ar { arg bank, index, inputs, delayTime, feedback=0.7, rotate=1, interpolationType=2;

		var indices, delayedSignals, outputs;

		delayedSignals = PlayBuf.ar(bank, index, -1, delayTime, interpolationType).postln;

		outputs = delayedSignals.rotate(rotate) * feedback + inputs;

		RecordBuf.ar(bank, index, outputs, run: -1);	// feedback to buffers

		^outputs
	}
}
*/


/**


/*
	these are still set up for sc3d5 style PlayBuf.
	won't work on scsynth yet
	-felix
*/


DelayProcess {
	*ar { arg bank, firstIndex, function, inputs, delayTime, interpolationType=2;
		var indices, delayedSignals, outputs;
		//[bank, firstIndex, function, inputs, delayTime, interpolationType].postln;
		if (delayTime.isArray, {
			// need separate buffers.

			inputs = inputs.asArray;
			indices = Array.series(inputs.size, firstIndex, 1);

			// tap the delay lines
			delayedSignals = PlayBuf.ar(bank, indices, -1, delayTime, interpolationType).postln;

			outputs = function.value(inputs, delayedSignals);

			// mix the delayed signal with the input

			RecordBuf.arN(bank, indices, outputs, run: -1);	// feedback to buffers
		},{
			// tap the delay lines
			delayedSignals = PlayBuf.ar(bank, firstIndex, -1, delayTime, interpolationType).postln;

			outputs = function.value(inputs, delayedSignals);

			// mix the delayed signal with the input

			RecordBuf.ar(bank, firstIndex, outputs, run: -1);	// feedback to buffers
		});

		^outputs	// output the mixed signal and force the DelayWr into the call graph
	}
}

**/