Every running synth is a node in the server's Node Tree; .free removes one node, ctrl+. frees them all
The SuperCollider server maintains a tree of running synth nodes. Each {...}.play or Synth("name") call adds a node, given a temporary name (temp_101, etc.) when anonymous; s.plotTree opens a GUI showing all active nodes. A node persists even while it generates silence — it does not free itself unless told to, so it must be removed with .free or by a UGen with doneAction: 2 that auto-frees the synth when it finishes. To free selectively, store the result of .play in a variable (x = {SinOsc.ar}.play) which gives a handle: x.free removes only that synth. ctrl+. (equivalently s.freeAll) is the blunt panic button that frees every node at once. Nodes left running that produce nothing but still consume server resources are called ‘zombie synths’.
Examples
s.plotTree;
w = {SinOsc.ar(60.midicps,0,0.1)}.play;
x = {SinOsc.ar(64.midicps,0,0.1)}.play;
w.free; // remove only w
// ctrl+. frees all remaining nodes
Assessment
Run three synths without storing their references and explain why you can’t free them individually. Repeat storing each in a variable a, b, c, and stop only b without affecting a or c; then free all in reverse order.