Csound-Python

From OLPC
Jump to navigation Jump to search

Csound can be controlled through its host API. On the XO, it is possible to write programs to use the API in C or C++, but the best way to go about it is to use the Python language. Csound offers a good level of control through its API and Python, allowing a host application to run and interface with Csound.

Importing the module

The Csound module for Python is imported using

import csnd

This will allow you to control an instance of Csound from your Python script. Some degree of help can be got by doing

help(csnd)

Or by using the pydoc command.

Basic operation

In general, you would want to

1) Create an instance of Csound: this is typically done using the Csound class (although there are other ways of doing the same thing):

cs = csnd.Csound()


2) Now you have a Csound instance, you will want to load up a CSD file, which can be done using the Compile method:

 res = cs.Compile("my.csd")

3) If the previous step succeeds (res is 0), then you can run Csound, using the Perform() method:

 cs.Perform()

This will run the whole score in the CSD file, returning when it is finished.

4) You can reset Csound, ready for a new compilation/performance:

 cs.Reset()


Threads

If you want to do other things while Csound is running, you will need to run the performance in a separate thread. This is perhaps the most typical way of doing things. You will need to set a Csound performance thread object to do it, passing the Csound object as a parameter:

 perf = csnd.CsoundPerformanceThread(cs)

Now all you need to do is play it:

 perf.Play()

You can also pause it whenever you like:

 perf.Pause()

At the end of the performance, the thread is extinguished. If you want to stop it before that, you can do this:

 perf.Stop()
 perf.Join()

It is important to Join() the thread after you stop, so the main thread waits until the performance one is finished before proceeding to do other operations on the Csound object.

Channels

Data can be sent to Csound using the 'named' software bus. This works on the basis of named channels that are set by the Python code or by Csound orchestra code. For instance:

 cs.SetChannel("frequency", 440.0)

Creates a channel in Csound (if it does not already exist) and sets the value of 440.0 to it. Likewise, data can be retrieved from Csound using

 value = cs.GetChannel("rms")

This sets the variable value with the data in the "rms" channel. C Channels can hold floating-point numeric values or strings.