home/ atoms/ sc-proxyspace-live-rewrite

ProxySpace NodeProxies let you rewrite a running synthesis graph mid-performance with an automatic crossfade

ProxySpace, from SuperCollider’s JITLib, provides a namespace where each tilde-prefixed variable (~x, ~y) becomes a NodeProxy: a placeholder for something running on the server (a synth graph or an event stream) that writes to a limited set of buses. Because proxies can be replaced and recombined while they play, reassigning a new function or Pbind to a named proxy does not stop the sound — ProxySpace crossfades from the old content to the new over a configurable fadeTime, with no gap or dropout. Proxies can reference one another by name (~z = { SinOsc.ar(~x * ~y) }), so rewriting ~x automatically propagates to every dependant, which is what makes modulation routing and modular patching possible. This continuous rewriting of named, running modules — rather than launching fixed structures — is the architectural foundation of live coding in SuperCollider.

Examples

p = ProxySpace.push;
~x = { SinOsc.kr(4) };
~y = { SinOsc.kr(13) };
~z = { SinOsc.ar(~x * ~y % 0.4 * 500 + 600) * 0.2 };
~z.play;
// rewrite live, no dropout:
~x = { SinOsc.kr(0.4) };

Assessment

Explain how a NodeProxy differs from a plain SynthDef, and describe what happens to the audio when you re-evaluate a proxy assignment during a performance. Boot ProxySpace, play a synth in a proxy, swap its oscillator mid-performance without stopping, and change fadeTime to hear the difference in the crossfade.

“NodeProxy objects can be replaced and recombined while they play”
“p = ProxySpace.push; ~x = { SinOsc.kr(4) }; ~y = { SinOsc.kr(13) }; ~z = { SinOsc.ar(~x * ~y % 0.4 * 500 + 600) * 0.2 }; ~z.play;”
corpus · the-supercollider-book-official-code-examples-scbookcode-gpl · chunk 147