forked from marierm/mmExtensions
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBusPlot.sc
84 lines (75 loc) · 1.97 KB
/
BusPlot.sc
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
BusPlot {
var bus, name, <dur, <rate,
<plot, oscDef, buffer, synth, numFrames,
pad=20; // Drop 20 values to avoid glitches in graph.
*new { |bus, name, dur=5, rate=15|
^super.newCopyArgs(bus, name, dur, rate).init;
}
init {
this.prGetNumFrames(pad);
buffer = Buffer.alloc(bus.server, numFrames, bus.numChannels);
synth = SynthDef(\busPlot, { |numFrames, bufnum, rate|
var phase;
phase = Phasor.kr(0,1,0,numFrames);
BufWr.kr(In.kr(bus.index, bus.numChannels), bufnum, phase);
SendTrig.kr(Impulse.kr(rate), 0, phase);
}).play(bus.server, [
\numFrames, numFrames,
\bufnum, buffer.bufnum,
\rate, rate
]);
plot = Plotter( name.asString, Rect(600, 30, 500, 400) );
this.prSetOscDef(synth.nodeID, pad);
plot.parent.onClose_({
synth.free;
buffer.free;
oscDef.free;
});
}
prGetNumFrames { |pad=20|
numFrames = (
bus.server.sampleRate * dur div:
bus.server.options.blockSize
) + (pad * bus.numChannels);
}
prSetOscDef { |id, pad=20|
oscDef = OSCdef(("busplot" ++ id).asSymbol, { arg msg, time;
(msg[1] == id).if {
buffer.loadToFloatArray( 0, numFrames, {|vals|
try{
vals = vals.as(Array).rotate(
(msg[3].asInt) * -1 * bus.numChannels
);
vals = vals.keep((numFrames-(pad * bus.numChannels)) * -1);
vals = vals.unlace(bus.numChannels);
{
plot.value = vals;
plot.domainSpecs_(
ControlSpec(dur * -1,0, units:"sec" )
);
plot.setProperties(
\labelX, "seconds",
\labelY,name.asString
);
plot.resolution_(1);
plot.findSpecs_(false);
}.defer;
}
});
}
},'/tr', bus.server.addr);
}
dur_ { |val|
dur = val;
this.prGetNumFrames(pad);
buffer.free;
buffer = Buffer.alloc(bus.server, numFrames, bus.numChannels);
synth.set(\numFrames, numFrames, \bufnum, buffer.bufnum);
this.prSetOscDef(pad);
plot.domainSpecs_(ControlSpec(dur * -1,0 ));
}
rate_ { |val|
rate = val;
synth.set(\rate, rate);
}
}