File: BelaScope.sc

package info (click to toggle)
supercollider 1%3A3.13.0%2Brepack-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 80,292 kB
  • sloc: cpp: 476,363; lisp: 84,680; ansic: 77,685; sh: 25,509; python: 7,909; makefile: 3,440; perl: 1,964; javascript: 974; xml: 826; java: 677; yacc: 314; lex: 175; objc: 152; ruby: 136
file content (89 lines) | stat: -rw-r--r-- 2,320 bytes parent folder | download | duplicates (3)
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
BelaScope {

	classvar <serverScopes;
	var <server, <bus, <node;

	// public interface

	*scope { |channelOffset, signals|
		var ugens = this.prInputAsAudioRateUGens(signals);
		ugens !? { BelaScopeOut.ar(channelOffset, ugens); };
		^signals;
	}

	*monitorBus { |channelOffset, busindex, numChannels, target, rate = \audio|
		var server, belaScope;
		target = target.asTarget;
		server = target.server;
		if(rate == \audio) {
			^SynthDef(\belaScope_monitor_ar_bus) {
				BelaScopeOut.ar(channelOffset, InFeedback.ar(busindex, numChannels))
			}.play(target, addAction: \addAfter)
		} {
			^SynthDef(\belaScope_monitor_kr_bus) {
				BelaScopeOut.ar(channelOffset, K2A.ar(In.kr(busindex, numChannels)))
			}.play(target, addAction: \addAfter)
		}
	}

	// scope input checks

	*prInputAsAudioRateUGens { |signals|
		var arUGens = signals.asArray.collect { |item|
			switch(item.rate)
				{ \audio } { item } // pass
				{ \control } { K2A.ar(item) } // convert kr to ar
				{ \scalar } {
					// convert numbers to ar UGens
					if(item.isNumber) { DC.ar(item) } { nil }
				}
				{ nil }
		};

		if(arUGens.every(_.isUGen)) {
			^arUGens;
		} {
			"BelaScope: can't scope this signal, because not all of its elements are UGens.\nSignal: %"
				.format(signals).warn;
			^nil;
		}
	}

}

+ UGen {
	belaScope { |scopeChannel|
		^BelaScope.scope(scopeChannel, this)
	}
}

+ Array {
	belaScope { |scopeChannel, server|
		^BelaScope.scope(scopeChannel, this)
	}
}

+ Bus {
	belaScope { |scopeChannel|
		^BelaScope.monitorBus(scopeChannel, index, numChannels, rate: rate);
	}
}

+ Function {
	belaScope { |scopeChannel, target, numChannels, outbus = 0, fadeTime = 0.02, addAction = \addToHead, args|
		var synth, outUGen, monitor;
		synth = this.play(target, outbus, fadeTime, addAction, args);
		outUGen = this.asSynthDef.children.detect { |ugen| ugen.class === Out };
		numChannels = numChannels ?? { if(outUGen.notNil) { (outUGen.inputs.size - 1) } { 1 } };

		monitor = BelaScope.monitorBus(scopeChannel, outbus, numChannels, target);
		^synth.onFree { if(monitor.notNil) { monitor.free } };
	}
}

+ Server {
	belaScope { |scopeChannel, index = 0, numChannels|
		numChannels = numChannels ?? { if (index == 0) { options.numOutputBusChannels } { 2 } };
		^Bus(\audio, index, numChannels, this).belaScope(scopeChannel);
	}
}