Csndsugui: Difference between revisions

From OLPC
Jump to navigation Jump to search
Line 84: Line 84:


== A complete example ==
== A complete example ==

Here is a complete Activity script of a simple csndsugui example:


{{ Box File | WavesActivity.py | 2=<pre>
{{ Box File | WavesActivity.py | 2=<pre>
Line 112: Line 114:
win.play()
win.play()
</pre>
</pre>
}}

The Csound code that goes with it is shown below:

{{ Box File | WavesActivity.py | 2=<pre>

<CsoundSynthesizer>
<CsOptions>
-odac -B2048 -b1024 -d
</CsOptions>
<CsInstruments>
sr=44100
ksmps=100
nchnls=2


gkb1 chnexport "B1", 1
gkb2 chnexport "B2", 1
gkb3 chnexport "B3", 1
gkb4 chnexport "B4", 1
gkb5 chnexport "B5", 1
gkb6 chnexport "B6", 1
gkb7 chnexport "B7", 1
gkb8 chnexport "B8", 1


instr 1

k1 init 1
k2 init 1
k3 init 1
k4 init 1
k5 init 1
k6 init 1
k7 init 1
k8 init 1


if gkb1 == 1 then
if k1 == 1 then
event "i", 11.1, 0, -1, 1
k1=0
endif
else
if k1 == 0 then
event "i", -11.1, 0, -1,1
k1=1
endif
endif

if gkb2 == 1 then
if k2 == 1 then
event "i", 11.2, 0, -1, 2
k2=0
endif
else
if k2 == 0 then
event "i", -11.2, 0, -1, 2
k2=1
endif
endif

if gkb3 == 1 then
if k3 == 1 then
event "i", 11.3, 0, -1, 3
k3=0
endif
else
if k3 == 0 then
event "i", -11.3, 0, -1, 3
k3=1
endif
endif

if gkb4 == 1 then
if k4 == 1 then
event "i", 11.4, 0, -1, 4
k4=0
endif
else
if k4 == 0 then
event "i", -11.4, 0, -1, 4
k4=1
endif
endif

if gkb5 == 1 then
if k5 == 1 then
event "i", 11.5, 0, -1, 5
k5=0
endif
else
if k5 == 0 then
event "i", -11.5, 0, -1, 5
k5=1
endif
endif

if gkb6 == 1 then
if k6 == 1 then
event "i", 11.6, 0, -1, 6
k6=0
endif
else
if k6 == 0 then
event "i", -11.6, 0, -1, 6
k6=1
endif
endif

if gkb7 == 1 then
if k7 == 1 then
event "i", 11.7, 0, -1, 7
k7=0
endif
else
if k7 == 0 then
event "i", -11.7, 0, -1, 7
k7=1
endif
endif

if gkb8 == 1 then
if k8 == 1 then
event "i", 11.8, 0, -1, 8
k8=0
endif
else
if k8 == 0 then
event "i", -11.8, 0, -1, 8
k8=1
endif
endif

endin


instr 11
S1 sprintf "S%d", p4
k1 chnget S1
k2 chnget "main_volume"
kv tonek k2/10, 10
ka linenr 2000*kv,0.1,0.1,0.05
a1 oscili ka, k1, 1
outs a1,a1
endin

</CsInstruments>
<CsScore>
f1 0 1024 10 1 0.5 0.3 0.25 0.2 0.18 0.15 0.13 0.11 0.1 0.09
i1 0 3600

</CsScore>
</CsoundSynthesizer>
</pre>

}}
}}



Revision as of 21:42, 18 March 2008

csndsugui is a toolkit for Csound-sugar activity development

Writing activities using csndsugui

In general, Activities are built according to the basic procedures outlined in Activity tutorial.

Basics

  • Import the relevant modules
import csndsugui
from sugar.activity import activity
  • Create an empty activity class such as
class MyCsoundActivity(activity.Activity):
  def __init__(self, handle):
    activity.Activity.__init__(self, handle) 
  • Instantiate a CsoundGUI object, passing the

activity instance as an argument:

  win = csndsugui.CsoundGUI(self)
  • Set and compile Csound code:
  win.CSD("mycode.csd")

It is CRUCIAL that Csound compiles successfully before the widgets below are created. Otherwise they will not be assigned channels in the software bus and thus will not communicate with Csound. This method returns 0 if successful.

Adding Widgets

Use boxes to format and contain widgets, child boxes can be contained within parent boxes. The top-level box does not have any parents.

   box = win.box()

See the documentation on PyGTK on how boxes are used to set the formatting. CsoundGUI will take care of all the packing for you. You can then add widgets to it, ie:

   win.button(box,"oscil")
   win.slider(1.0,0.25,4.0,90,250,box,"pitch", linear=False) 

Making the connections

In your Csound code, you can retrieve the value of each of the controls in channels of the software bus:

   kosc  chnget "oscil"   
   kpit  chnget "pitch"

Channel names will be linked to widget labels ("oscil" and "pitch" in the example above) Most widgets will work within the principles outlined above. Important exceptions are:

  • Message button:
 mbutton(self,box,mess,title="")

where mess is a RT score event or message to be sent to Csound (in most cases an i-statement, but f-statements are also possibilities).

  • Callback button:
 cbbutton(self,box,callback,title="")

where callback is a Python function that will be invoked when the button is clicked.

Special button names: "play", "pause" and "reset". These are assigned special messages that are not captured by the software bus. Instead, they can control Csound performance, starting, pausing and resetting Csound performance (they are linked to CsoundGUI.play(), CsoundGUI.pause() and CsoundGUI.reset() methods.)

A complete example

Here is a complete Activity script of a simple csndsugui example:

 File: WavesActivity.py
 import csndsugui
 from sugar.activity import activity
 class Waves(activity.Activity):

  def __init__(self, handle):
  
   activity.Activity.__init__(self, handle)
 
   # colours
   red = (0xFFFF,0,0)
   bg  = (0xF000, 0xFF00, 0xFFFF)
   win = csndsugui.CsoundGUI(self,bg)
 
   win.csd("waves.csd")
   txt = win.text("Making Waves")
   sfbox = win.box(False)
   bfbox = win.box(False)
   sbox = win.framebox("frequencies", False, sfbox, red, 40) 
   bbox = win.framebox("oscillators", False, bfbox, red, 40)

   win.buttonbank(8,bbox)
   win.spin(0,0,10,0.5,1,bbox,0, "main_volume")
   win.vsliderbank(8,400.0,400.0,500.0,80,200,sbox)

   win.play()

The Csound code that goes with it is shown below:

 File: WavesActivity.py

<CsoundSynthesizer>
<CsOptions> 
-odac -B2048 -b1024 -d
</CsOptions>
<CsInstruments>
sr=44100
ksmps=100
nchnls=2


gkb1  chnexport "B1", 1
gkb2  chnexport "B2", 1
gkb3  chnexport "B3", 1
gkb4  chnexport "B4", 1
gkb5  chnexport "B5", 1
gkb6  chnexport "B6", 1
gkb7  chnexport "B7", 1
gkb8  chnexport "B8", 1


instr 1

k1 init 1
k2 init 1
k3 init 1
k4 init 1
k5 init 1
k6 init 1
k7 init 1
k8 init 1


if gkb1 == 1 then
if k1 == 1 then
event "i", 11.1, 0, -1, 1 
k1=0
endif
else 
if k1 == 0 then
event "i", -11.1, 0, -1,1
k1=1
endif
endif

if gkb2 == 1 then
if k2 == 1 then
event "i", 11.2, 0, -1, 2
k2=0
endif
else 
if k2 == 0 then
event "i", -11.2, 0, -1, 2
k2=1
endif
endif

if gkb3 == 1 then
if k3 == 1 then
event "i", 11.3, 0, -1, 3
k3=0
endif
else 
if k3 == 0 then
event "i", -11.3, 0, -1, 3
k3=1
endif
endif

if gkb4 == 1 then
if k4 == 1 then
event "i", 11.4, 0, -1, 4
k4=0
endif
else 
if k4 == 0 then
event "i", -11.4, 0, -1, 4
k4=1
endif
endif

if gkb5 == 1 then
if k5 == 1 then
event "i", 11.5, 0, -1, 5
k5=0
endif
else 
if k5 == 0 then
event "i", -11.5, 0, -1, 5
k5=1
endif
endif

if gkb6 == 1 then
if k6 == 1 then
event "i", 11.6, 0, -1, 6
k6=0
endif
else 
if k6 == 0 then
event "i", -11.6, 0, -1, 6
k6=1
endif
endif

if gkb7 == 1 then
if k7 == 1 then
event "i", 11.7, 0, -1, 7
k7=0
endif
else 
if k7 == 0 then
event "i", -11.7, 0, -1, 7
k7=1
endif
endif

if gkb8 == 1 then
if k8 == 1 then
event "i", 11.8, 0, -1, 8
k8=0
endif
else 
if k8 == 0 then
event "i", -11.8, 0, -1, 8
k8=1
endif
endif

endin


instr 11
S1  sprintf "S%d", p4   
k1  chnget S1
k2  chnget "main_volume"
kv  tonek  k2/10, 10  
ka  linenr  2000*kv,0.1,0.1,0.05
a1      oscili  ka, k1, 1
        outs     a1,a1
        endin

</CsInstruments>
<CsScore>
f1 0 1024 10 1 0.5 0.3 0.25 0.2 0.18 0.15 0.13 0.11 0.1 0.09
i1 0 3600

</CsScore>
</CsoundSynthesizer>

Further help

On-line help can be obtained by importing the csndsugui module and involking help(csndsugui). See also examples in the csndsugui repository http://dev.laptop.org/git/activities/csndsugui