A Csound server

In Tcl, setting up TCP network connections is very simple. With a few lines of code a csound server can be built. This can accept connections from the local machine or from remote clients. Not only Tcl/Tk clients can send commands to it, but TCP connections can be made from other sofware, such as, for instance, Pure Data (PD). A Tcl script that can be run under the standard tclsh interpreter is shown below. It uses the Tclcsound module, a dynamic library that adds the Csound API commands to Tcl.


# load tclcsound.so

#(OSX: tclcsound.dylib, Windows: tclcsound.dll)

load tclcsound.so Tclcsound

set forever 0



# This arranges for commands to be evaluated

proc ChanEval { chan client } {

if { [catch { set rtn [eval [gets $chan]]} err] } {

puts "Error: $err"

} else {

puts $client $rtn

flush $client

}

} 


# this arranges for connections to be made 


proc NewChan { chan host port } {

puts "Csound server: connected to $host on port $port ($chan)"

fileevent $chan readable [list ChanEval $chan $host]

} 


# this sets up a server to listen for

# connections 


set server [socket -server NewChan 40001]

set sinfo [fconfigure $server -sockname]

puts "Csound server: ready for connections on port [lindex $sinfo 2]"

vwait forever 

With the server running, it is then possible to set up clients to control the Csound server. Such clients can be run from standard Tcl/Tk interpreters, as they do not evaluate the Csound commands themselves. Here is an example of client connections to a Csound server, using Tcl:


# connect to server

set sock [socket localhost 40001]



# compile Csound code

puts $sock "csCompile -odac orchestra score"

flush $sock 


# start performance

puts $sock "csPlay"

flush $sock 


# stop performance

puts $sock "csStop"

flush $sock 

As mentioned before, it is possible to set up clients using other software systems, such as PD. Such clients need only to connect to the server (using a netsend object) and send messages to it. The first item of each message is taken to be a command. Further items can optionally be added to it as arguments to that command.