Merge pull request #506 from andrewcsmith/patch-2
[supercollider.git] / HelpSource / Classes / Server.schelp
blob60db39bfd6d2bad70b1d0c3398c98a5d46fd1de0
1 class:: Server
2 summary:: Object representing an sc-server application
3 categories:: Server>Abstractions
4 related:: Classes/ServerOptions, Reference/Server-Architecture, Reference/Server-Command-Reference
6 description::
8 A Server object is the client-side representation of a server app and is used to control the app from the SuperCollider language application. (See link::Guides/ClientVsServer:: for more details on the distinction.)
9 It forwards osc-messages and has a number of allocators that keep track of IDs for nodes, buses and buffers.
11 The server application is a commandline program, so all commands apart from osc-messages are unix commands.
13 The server application represented by a Server object might be running on the same machine as the client (in the same address space as the language application or separately; see below), or it may be running on a remote machine.
15 Most of a Server's options are contolled through its instance of ServerOptions. See the link::Classes/ServerOptions:: helpfile for more detail.
17 subsection:: Paths
19 Server apps running on the local machine have two unix environment variables: code::SC_SYNTHDEF_PATH:: and code::SC_PLUGIN_PATH::. These indicate directories of synthdefs and ugen plugins that will be loaded at startup. These are in addition to the default synthdef/ and plugin/ directories which are hard-coded.
21 These can be set within SC using the getenv and setenv methods of class link::Classes/String::.
22 code::
23 // all defs in this directory will be loaded when a local server boots
24 "SC_SYNTHDEF_PATH".setenv("~/scwork/".standardizePath);
25 "echo $SC_SYNTHDEF_PATH".unixCmd;
28 subsection:: The default group
30 When a Server is booted there is a top level group with an ID of 0 that defines the root of the node tree. (This is represented by a subclass of link::Classes/Group:: : link::Classes/RootNode::.)
31 If the server app was booted from within SCLang (as opposed to from the command line) the method code::initTree:: will be called automatically after booting.
32 This will also create a link::Reference/default_group:: with an ID of 1, which is the default group for all link::Classes/Node::s when using object style.
33 This provides a predictable basic node tree so that methods such as Server-scope, Server-record, etc. can function without running into order of execution problems.
35 The default group is persistent, i.e. it is recreated after a reboot, pressing cmd-., etc. See link::Classes/RootNode:: and link::Reference/default_group:: for more information.
36 Note::
37 If a Server has been booted from the command line you must call code::initTree:: manually in order to initialize the default group, if you want it. See code::initTree:: below.
40 subsection:: Local vs. Internal
42 In general, when working with a single machine one will probably be using one of two Server objects which are created at startup and stored in the class variables link::#*local:: and link::#*internal::. In SuperCollider.app (OSX), two GUI windows are created to control these. Use link::#-makeGui:: to create a GUI window manually.
44 The difference between the two is that the local server runs as a separate application with its own address space, and the internal server runs within the same space as the language/client app.
46 Both local and internal server supports link::#-scope#scoping:: and link::Classes/Bus#synchronous_control_bus_methods#synchronous bus access::.
48 The local server, and any other server apps running on your local machine, have the advantage that if the language app crashes, it (and thus possibly your piece) will continue to run. It is thus an inherently more robust arrangement. But note that even if the synths on the server continue to run, any language-side sequencing and control will terminate if the language app crashes.
50 There is generally no benefit in using the internal server.
52 subsection:: The default Server
54 There is always a default Server, which is stored in the class variable code::default::. Any link::Classes/Synth::s or link::Classes/Group::s created without a target will be created on the default server. At startup this is set to be the local server (see above), but can be set to be any Server.
56 ClassMethods::
57 private:: initClass
59 method:: new
61 argument:: name
62 a symbol;  each Server object is stored in one global classvariable under its name.
64 argument:: addr
65 an optional instance of link::Classes/NetAddr::, providing host and port.
66 The default is the localhost address using port 57110; the same as the local server.
68 argument:: options
69 an optional instance of link::Classes/ServerOptions::. If code::nil::, an instance of ServerOptions will be created, using the default values.
71 argument:: clientID
72 an integer. In multi client situations, every client can be given a separate nodeID range. The default is 0.
75 method:: local
76 get/set the local server, stored in classvar code::local:: (created already on initClass)
78 method:: internal
79 get/set the internal server, stored in classvar code::internal:: (created already on initClass)
81 method:: default
82 Get or set the default server. By default this is the local server (see above).
83 discussion::
84 Setting this will also assign it to the link::Classes/Interpreter:: variable 's'.
85 code::
86 Server.default = Server.internal; // set the internal Server to be the default Server
87 s.postln; // internal
90 method:: all
91 get/set the set of all servers.
93 method:: allRunningServers
94 returns:: the set of all running servers.
96 method:: quitAll
97 quit all registered servers
99 method:: killAll
100 query the system for any sc-server apps and hard quit them
102 method:: freeAll
103 free all nodes in all registered servers
105 method:: supernova
107 Switches server program to use supernova. Check link::Classes/ParGroup:: how to make use of multicore hardware with the supernova server.
109 method:: scsynth
111 Switches server program to use supernova.
114 InstanceMethods::
116 private:: doSend
118 method:: sendMsg
119 send an osc message to the server.
120 discussion::
121 code::
122 s.sendMsg("/s_new", "default", s.nextNodeID, 0, 1);
125 method:: sendBundle
126 send an osc bundle to the server.
127 discussion::
128 Since the network may have irregular performance, time allows for the bundle to be evaluated at a specified point in the future.
129 Thus all messages are synchronous relative to each other, but delayed by a constant offset.
130 If such a bundle arrives late, the server replies with a late message but still evaluates it.
131 code::
132 s.sendBundle(0.2, ["/s_new", "default", x = s.nextNodeID, 0, 1], ["/n_set", x, "freq", 500]);
135 method:: sendRaw
137 method:: listSendMsg
138 as sendMsg, but takes an array as argument.
140 method:: listSendBundle
141 as sendBundle, but takes an array as argument.
142 discussion::
143 This allows you to collect messages in an array and then send them.
144 code::
145 s.listSendBundle(0.2, [["/s_new", "default", x = s.nextNodeID, 0, 1],
146     ["/n_set", x, "freq", 600]]);
149 method:: sendSynthDef
150 send a synthDef to the server that was written in a local directory
152 method:: loadSynthDef
153 load a synthDef that resides in the remote directory
155 method:: loadDirectory
156 load all the SynthDefs in the directory dir.
157 argument:: dir
158 a link::Classes/String:: which is a valid path.
159 argument:: completionMsg
161 method:: nextNodeID
162 get a unique nodeID.
164 method:: nextPermNodeID
165 get a permanent node ID. This node ID is in a reserved range and will be held until you explicitly free it.
167 method:: freePermNodeID
168 free a permanent node ID for later reuse.
170 method:: wait
171 this can be used within a link::Classes/Routine:: to wait for a server reply
173 method:: waitForBoot
174 Evaluate "onComplete" as soon as the server has booted. This method will boot the server for you if it is not already running or booting. If the server is already running, "onComplete" is executed immediately.
175 argument:: onComplete
176 A function to evaluate after the server has booted successfully.
177 argument:: limit
178 The number of times to check for a successful boot. (5 times/sec)
179 argument:: onFailure
180 A function to evaluate after the server fails to boot. If onFailure is not given, an error message is posted. Providing a function suppresses the error message. If you want to supply a function and print the normal error message, make sure that your function returns "false," e.g. code::s.waitForBoot(onFailure: { ... custom action...; false })::.
182 method:: doWhenBooted
183 Evaluate "onComplete" as soon as the server has booted. This method assumes the server is being booted explicitly through a separate code::boot:: call. If the server is already running, "onComplete" is executed immediately.
184 argument:: onComplete
185 A function to evaluate after the server has booted successfully.
186 argument:: limit
187 The number of times to check for a successful boot.
188 argument:: onFailure
189 A function to evaluate after the server fails to boot. If onFailure is not given, an error message is posted. Providing a function suppresses the error message. If you want to supply a function and print the normal error message, make sure that your function returns "false," e.g. code::s.waitForBoot(onFailure: { ... custom action...; false })::.
191 method:: boot
192 boot the remote server, create new allocators.
193 argument:: startAliveThread
194 If true, start a Routine to send a /status message to the server every so often. The interval between the messages is set by code::theServer.aliveThreadPeriod = (seconds)::. The default period is 0.7. If false, /status will not be sent and the server's window will not update.
195 argument:: recover
196 If true, create a new node ID allocator for the server, but use the old buffer and bus allocators. This is useful if the server process did not actually stop. In normal use, the default value "false" should be used.
197 argument:: onFailure
198 In this method, the onFailure argument is for internal use only. If you wish to take specific actions when the server boots or fails to boot, it is recommended to use link::#-waitForBoot:: or link::#-doWhenBooted::.
199 discussion::
200 N.B. You cannot boot a server app on a remote machine.
202 method:: quit
203 quit the server application
205 method:: reboot
206 quit and restart the server application
208 method:: freeAll
209 free all nodes in this server
211 method:: status
212 query the server status
214 method:: notify
215 server sends notifications, for example if a node was created, a 'tr' message from a link::Classes/SendTrig::, or a strong::/done:: action. if code::flag:: is set to false, these messages are not sent. The default is true.
217 method:: ping
218 measure the time between server and client, which may vary. the code::func:: is
219 evaluated after code::n:: number of times and is passed the resulting maximum.
221 method:: options
222 Get or set this Server's link::Classes/ServerOptions:: object. Changes take effect when the server is rebooted.
224 method:: defaultGroup
225 returns:: this Server's default group.
227 method:: volume
228 Get an instance of Volume that runs after the defualt group, or sets the Volume of the Server's output to level. Level is in db.
230 method:: mute
231 mute the server's output. This can also be toggled from the Server window with the 'm' key.
233 method:: unmute
234 unmute the server. This can also be toggled from the Server window with the 'm' key.
236 method:: reorder
237 Move the nodes in code::nodeList:: to the location specified by code::target:: and code::addAction::, placing them there in the order indicated by nodeList.
238 discussion::
239 Any nodes which have already been freed will be skipped. Passing nil for target and addAction will result in the location being the head of the default group.
240 code::
241 g = Group.new;
242 x = Array.fill(5, {Synth(\default)});
243 s.queryAllNodes;
244 s.reorder(x, g, \addToTail);
245 s.queryAllNodes;
248 method:: inputBus
249 Return a link::Classes/Bus:: object that represents the input audio bus.
251 method:: outputBus
252 Return a link::Classes/Bus:: object that represents the output audio bus.
255 subsection:: Information and debugging
257 method:: dumpOSC
258 argument:: code
259 table::
260 ## 0 || turn dumping OFF.
261 ## 1 || print the parsed contents of the message.
262 ## 2 || print the contents in hexadecimal.
263 ## 3 || print both the parsed and hexadecimal representations of the contents.
266 note:: teletype::/status:: messages won't be posted, when dumping is enabled:: mode::
268 method:: queryAllNodes
269 Post a representation of this Server's current node tree to the post window. See link::#-plotTree:: for a graphical variant.
270 discussion::
271 Very helpful for debugging. For local servers this uses g_dumpTree and for remote g_queryTree. See link::Classes/Group:: and link::Reference/Server-Command-Reference:: for more info.
272 code::
273 s.boot;
274 s.queryAllNodes; // note the root node (ID 0) and the default group (ID 1)
275 s.quit;
278 method:: peakCPU, avgCPU
279 Get peak and average CPU usage.
281 method:: numSynths
282 Get number of running link::Classes/Synth::s.
284 method:: numGroups
285 Get number of link::Classes/Group::s.
287 method:: numUGens
288 Get number of running link::Classes/UGen::s.
290 method:: numSynthDefs
291 Get number of loaded link::Classes/SynthDef::initions.
293 method:: pid
294 Get process ID of running server (if not internal).
296 method:: hasShmInterface
297 Returns true if a link::Classes/ServerShmInterface:: is available. See also link::Classes/Bus#synchronous_control_bus_methods#Synchronous Control Bus Methods::.
298 discussion::
299 The shared memory interface is initialized after first server boot.
301 subsection:: Automatic Message Bundling
303 Server provides support for automatically bundling messages. This is quite convenient in object style, and ensures synchronous execution. See also link::Guides/Bundled-Messages::
305 method:: makeBundle
306 The Function code::func:: is evaluated, and all OSC messages generated by it are deferred and added to a bundle.
307 argument:: time
308 If set to nil or a number the bundle will be automatically sent and executed after the corresponding delay in seconds. If code::time:: is set to false the bundle will not be sent.
309 argument:: func
310 The function to evaluate.
311 argument:: bundle
312 allows you to pass in a preexisting bundle and continue adding to it.
313 returns:: The bundle so that it can be further used if needed.
314 discussion::
315 Calling code::sync:: inside func will split the bundle and wait for asynchronous actions to complete before continuing.
317 If an error is encountered while evaluating code::func:: this method will throw an link::Classes/Error:: and stop message deferral.
318 code::
319 s.boot;
321 // send a synth def to server
322 SynthDef("tpulse", { arg out=0,freq=700,sawFreq=440.0;
323         Out.ar(out, SyncSaw.ar(freq,  sawFreq,0.1) )
324 }).add;
327 // all OSC commands generated in the function contained below will be added to a bundle
328 // and executed simultaneously after 2 seconds.
330 s.makeBundle(2.0, {
331         x = Synth.new("tpulse");
332         a = Bus.control.set(440);
333         x.map(\freq, a);
336 x.free;
338 // don't send
340 b = s.makeBundle(false, {
341         x = { PinkNoise.ar(0.1) * In.kr(0, 1); }.play;
344 // now pass b as a pre-existing bundle, and start both synths synchronously
346 s.makeBundle(nil, { // nil executes ASAP
347         y = { SinOsc.kr(0.2).abs }.play(x, 0, 0, \addBefore); // sine envelope
348 }, b);
350 x.free; y.free;
352 // Throw an Error
354 try {
355         s.makeBundle(nil, {
356                 s.farkermartin;
357         });
358 } { |error|
359         ("Look Ma, normal operations resume even though:\n" + error.errorString).postln;
360         x = { FSinOsc.ar(440, 0, 0.2) }.play; // This works fine
363 x.free;
365 // use sync
367 s.makeBundle(nil, {
368         b = Buffer.read(s, Platform.resourceDir +/+ "sounds/a11wlk01.wav");
369         s.sync; // wait until load is done and then send the rest of the bundle
370         x = { PlayBuf.ar(1, b) * 0.5 }.play;
373 x.free; b.free;
376 method:: bind
377 Just as in code::makeBundle::, the Function code::func:: is evaluated, and all OSC messages generated by it are deferred and added to a bundle, which is sent to the server, using the server default latency.
378 discussion::
379 code::
381 s.bind {
382         a = { |freq=100| SinOsc.ar(freq, LFTri.ar(freq)) * 0.2 }.play;
383         a.set(\freq, 400);
388 subsection:: Shared Controls
390 The internal server has a number of shared control buses. Their values can be set or polled using the methods below.
392 method:: getSharedControl
393 get the current value of a shared control bus. num is the index of the bus to poll. This command is synchronous and only works with the internal server.
395 method:: setSharedControl
396 set the current value of a shared control bus to value. num is the index of the bus to set. This command is synchronous and only works with the internal server.
398 method:: allocSharedControls
399 set the number of shared control buses. Must be done before the internal server is booted. The default is 1024.
401 subsection:: Persistent Node Trees
403 The class link::Classes/ServerTree:: can be used to store functions which will be evaluated after the server is booted, after all nodes are freed, and after cmd-. is pressed.
404 This allows, for example, for one to create a persistent basic node structure. ServerTree is evaluated in the method initTree after the default group is created, so its existence can be relied upon.
406 method:: initTree
407 This method initializes the link::Reference/default_group:: and runs link::Classes/ServerTree::.
408 discussion::
409 This method is called automatically when you boot a Server from the language. N.B. If you started a server app from the command line you will have to call initTree manually if you need this functionality.
410 code::
411 s.quit;
412 f = {Group.new(s.defaultGroup); "Other code can be evaluated too".postln;};
413 ServerTree.add(f);
414 s.boot;
415 s.queryAllNodes; // note the group within the default group
416 ServerTree.remove(f);
418 link::Classes/ServerBoot:: and link::Classes/ServerQuit:: provide similar functionality at boot and quit times.
420 subsection:: GUI methods
422 method:: makeGui
423 Create and show the server window. The window responds to a number of keyboard shortcuts:
424 table::
425 ## strong::key:: || strong::action::
426 ## teletype::n:: || Post a representation of this Server's current node tree to the post window. (See link::#-queryAllNodes::)
427 ## teletype::N:: || As 'n' above but include controls.
428 ## teletype::l:: || Show input/output level meters. (See link::#-meter::)
429 ## teletype::p:: || Show graphical view of the node tree. (See link::#-plotTree::)
430 ## (space) || Boot server if not already booted. (See link::#-boot::)
431 ## teletype::s:: || Show scope window. (See link::#-scope::)
432 ## teletype::f:: || Show frequency analyzer window. (See link::#-freqscope::)
433 ## teletype::d:: || Toggle dumping of OSC messages.
434 ## teletype::m:: || Toggle mute.
435 ## teletype::0:: || Reset volume to 0 db.
439 method:: scope
440 Open a scope window showing the output of the Server.
441 see link::Classes/Stethoscope:: for further details.
443 argument:: numChannels
444 the number of channels to be scoped out. The default is this server's options' numOutputBusChannels.
445 argument:: index
446 the first channel to be output. The default is 0.
447 argument:: bufsize
448 the size of the buffer for the ScopeView. The default is 4096.
449 argument:: zoom
450 a zoom value for the scope's X axis. Larger values show more. The default is 1.
451 argument:: rate
452 whether to display audio or control rate buses (either \audio or \control)
454 method:: freqscope
455 Show frequency analyzer window.
457 method:: meter
458 Show input/output level meters.
460 method:: plotTree
461 Plot the node/group tree. As link::#-queryAllNodes:: but graphical.
463 subsection:: Recording Support
465 The following methods are for convenience use. For recording with sample accurate start and stop times you should make your own nodes. See the link::Classes/DiskOut:: helpfile for more info. For non-realtime recording, see the link::Guides/Non-Realtime-Synthesis:: helpfile.
467 This functionality is also available through the recording button on the server windows.
468 Pressing it once calls record, and pressing it again calls stopRecording (see below). When doing so the file created will be in your recordings folder and be named for the current date and time.
469 The default location of the recordings folder varies from platform to platform but is always stored in code::thisProcess.platform.recordingsDir::. Setting this variable allows you to change the default.
471 NOTE::
472 record creates the recording synth after the Server's default group and uses In.ar. Thus if you add nodes after the recording synth their output will not be captured.
473 To avoid this, either use Node objects (which use the default node as their target) or (when using messaging style) use a target nodeID of 1.
474 code::
475 s.sendMsg("/s_new", "default", s.nextNodeID, 1,1);
479 For more detail on this subject see link::Guides/Order-of-execution::, link::Reference/default_group::, and link::Guides/NodeMessaging::.
481 See link::Classes/SoundFile:: for information on the various sample and header formats.
482 Not all sample and header formats are compatible. Note that the sampling rate of the output file will be the same as that of the server app. This can be set using the Server's link::Classes/ServerOptions::.
484 Example:
485 code::
486 s.boot; // start the server
488 // something to record
490 SynthDef("bubbles", {
491         var f, zout;
492         f = LFSaw.kr(0.4, 0, 24, LFSaw.kr([8,7.23], 0, 3, 80)).midicps; // glissando function
493         zout = CombN.ar(SinOsc.ar(f, 0, 0.04), 0.2, 0.2, 4); // echoing sine wave
494         Out.ar(0, zout);
495 }).add;
496 SynthDef("tpulse", { arg out=0,freq=700,sawFreq=440.0;
497         Out.ar(out, SyncSaw.ar(freq,  sawFreq,0.1) )
498 }).add;
502 x = Synth.new("bubbles");
504 s.prepareForRecord; // you have to call this first
506 s.record;
508 s.pauseRecording; // pausable
510 s.record // start again
512 s.stopRecording; // this closes the file and deallocates the buffer recording node, etc.
514 x.free; // stop the synths
516 // look in your recordings folder and you'll find a file named for this date and time
519 method:: prepareForRecord
520 Allocates the necessary buffer, etc. for recording the server's output. (See code::record:: below.)
521 argument:: path
522 a link::Classes/String:: representing the path and name of the output file.
523 discussion::
524 If you do not specify a path than a file will be created in your recordings folder (see the note above on this) called SC_thisDateAndTime. Changes to the header or sample format, or to the number of channels must be made strong::before:: calling this.
526 method:: record
527 Starts or resumes recording the output.
528 argument:: path
529 this is optional, and is passed to code::prepareForRecord:: (above).
530 discussion::
531 If you have not called prepareForRecord first (see above) then it will be invoked for you (but that adds a slight delay before recording starts for real).
533 method:: pauseRecording
534 Pauses recording. Can be resumed by executing record again.
536 method:: stopRecording
537 Stops recording, closes the file, and frees the associated resources.
538 discussion::
539 You must call this when finished recording or the output file will be unusable. Cmd-. while recording has the same effect.
541 method:: recordNode
542 Returns:: the current recording synth so that it can be used as a target. This should only be necessary for nodes which are not created in the default group.
544 method:: recChannels
545 Get/set the number of channels (int) to record. The default is two. Must be called strong::before:: prepareForRecord.
547 method:: recHeaderFormat
548 Get/set the header format (string) of the output file. The default is "aiff". Must be called strong::before:: prepareForRecord.
550 method:: recSampleFormat
551 Get/set the sample format (string) of the output file. The default is "float". Must be called strong::before:: prepareForRecord.
553 subsection:: Asynchronous Commands
555 Server provides support for waiting on the completion of asynchronous OSC commands such as reading or writing soundfiles. N.B. The following methods must be called from within a running link::Classes/Routine::. Explicitly passing in a link::Classes/Condition:: allows multiple elements to depend on different conditions. The examples below should make clear how all this works.
557 method:: bootSync
558 Boot the Server and wait until it has completed before resuming the thread.
559 argument:: condition
560 an optional instance of link::Classes/Condition:: used for evaluating this.
562 method:: sendMsgSync
563 Send the following message to the wait until it has completed before resuming the thread.
564 argument:: condition
565 an optional instance of link::Classes/Condition:: used for evaluating this.
566 argument:: ... args
567 one or more valid OSC messages.
569 method:: sync
570 Send a code::/sync:: message to the server, which will replie with the message code::/synced:: when all pending asynchronous commands have been completed.
571 argument:: condition
572 an optional instance of link::Classes/Condition:: used for evaluating this.
573 argument:: bundles
574 one or more OSC messages which will be bundled before the sync message (thus ensuring that they will arrive before the /sync message). argument:: latency
575 allows for the message to be evaluated at a specific point in the future.
577 discussion::
578 This may be slightly less safe then sendMsgSync under UDP on a wide area network, as packets may arrive out of order, but on a local network should be okay. Under TCP this should always be safe.
579 code::
581 Routine.run {
582         var c;
584         // create a condition variable to control execution of the Routine
585         c = Condition.new;
587         s.bootSync(c);
588         \BOOTED.postln;
590         s.sendMsgSync(c, "/b_alloc", 0, 44100, 2);
591         s.sendMsgSync(c, "/b_alloc", 1, 44100, 2);
592         s.sendMsgSync(c, "/b_alloc", 2, 44100, 2);
593         \b_alloc_DONE.postln;
598 Routine.run {
599         var c;
601         // create a condition variable to control execution of the Routine
602         c = Condition.new;
604         s.bootSync(c);
605         \BOOTED.postln;
607         s.sendMsg("/b_alloc", 0, 44100, 2);
608         s.sendMsg("/b_alloc", 1, 44100, 2);
609         s.sendMsg("/b_alloc", 2, 44100, 2);
610         s.sync(c);
611         \b_alloc_DONE.postln;
616 section:: Keyboard Shortcuts
618 when a server window is in focus, these shortcuts can be used:
619 table::
620 ## space || start the server
621 ## d || toggle dumpOSC
622 ## n || post a representation of the node tree
623 ## N || post a representation of the node tree and the current control values of any synths
624 ## s || scope