Csound: Difference between revisions

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


Csound can play back midi files. All you need is Csound code that understands MIDI and the compilation option -F <your-midi-file>.
Csound can play back midi files. All you need is Csound code that understands MIDI and the compilation option -F <your-midi-file>.

{{ Box File | GM_example.csd | 2=<pre>
<CsoundSynthesizer>
<CsInstruments>
ichn = 1
lp1: massign ichn, 0
loop_le ichn, 1, 16, lp1
pgmassign 0, 0
gisf sfload "gmgsBank1.sf2"
sfpassign 0, gisf

/* this instrument parses MIDI input
to trigger the GM soundfont synthesis
instrument (instr 10
*/
instr 1
idkit = 317 /* drum-kit preset */
tableiw idkit, 9, 1
irel = 0.5 /* release envelope */

ipg = 1
ivol = 2
ipan = 3

nxt:
kst, kch, kd1, kd2 midiin

if (kst != 0) then
kch = kch - 1
if (kst == 144 && kd2 != 0) then ; note on
kpg table kch, ipg
/* instrument identifier is 10.[chn][note] */
kinst = 10 + kd1/100000 + kch/100
if kch == 9 then
/* exclusive identifiers */
if kpg == idkit+7 then
krel = 2 /* add extra release time for orch perc*/
else
krel = 0.5
endif
if (kd1 == 29 || kd1 == 30) then ; EXC7
kinst = 10.97
elseif (kd1 == 42 || kd1 == 44 || kd1 == 46 || kd1 == 49) then ; EXC1
kinst = 10.91
elseif (kd1 == 71 || kd1 == 72) then ; EXC2
kinst = 10.92
elseif (kd1 == 73 || kd1 == 74) then ; EXC3
kinst = 10.93
elseif (kd1 == 78 || kd1 == 79) then ; EXC4
kinst = 10.94
elseif (kd1 == 80 || kd1 == 81) then ; EXC5
kinst = 10.95
elseif (kd1 == 86 || kd1 == 87) then ; EXC6
kinst = 10.96
endif
else
krel = 0.5
endif
event "i", kinst, 0, -1, kd1, kd2, kpg, kch,krel
elseif (kst == 128 || (kst == 144 && kd2 == 0)) then ; note off
kpg table kch, ipg
kinst = 10 + kd1/100000 + kch/100
if kch == 9 then
if (kd1 == 29 || kd1 == 30) then ; EXC7
kinst = 10.97
elseif (kd1 == 42 || kd1 == 44 || kd1 == 46 || kd1 == 49) then ; EXC1
kinst = 10.91
elseif (kd1 == 71 || kd1 == 72) then ; EXC2
kinst = 10.92
elseif (kd1 == 73 || kd1 == 74) then ; EXC3
kinst = 10.93
elseif (kd1 == 78 || kd1 == 79) then ; EXC4
kinst = 10.94
elseif (kd1 == 80 || kd1 == 81) then ; EXC5
kinst = 10.95
elseif (kd1 == 86 || kd1 == 87) then ; EXC6
kinst = 10.96
endif
else
kpg = 0
endif
event "i", -kinst, 0, 1
elseif (kst == 192) then /* program change msgs */
if kch == 9 then
kpg = idkit
if kd1 == 8 then
kpg = idkit+1
elseif kd1 == 16 then
kpg = idkit+2
elseif kd1 == 24 then
kpg = idkit+3
elseif kd1 == 25 then
kpg = idkit+4
elseif kd1 == 32 then
kpg = idkit+5
elseif kd1 == 40 then
kpg = idkit+6
elseif kd1 == 48 then
kpg = idkit+7
endif
else
kpg = kd1
endif
tablew kpg, kch, ipg
elseif (kst == 176 && kd1 == 11) then /* volume msgs */
tablew kd2, kch, ivol
elseif (kst == 176 && kd1 == 7) then /* pan msgs */
tablew kd2, kch, ipan
endif
kgoto nxt
endif

endin

/* this is the GM soundfont synthesizer instrument */
instr 10
kenv linenr 1,0.001,p8,0.001
iamp table p5, 5
a1, a2 sfplay p5, p4, iamp,1, p6
kv table p7, 2
kvol tablei kv, 5
kpan table p7, 3
kpan = (kpan - 64)/128
outs a1*kvol*(0.5-kpan/2)*kenv, a2*kvol*(0.5+kpan/2)*kenv
endin

</CsInstruments>
<CsScore>
/* program preset (memory) table */
f1 0 16 -2 0 0 0 0 0 0 0 0 226 0 0 0 0 0 0 0
/* velocity (memory) table */
f2 0 16 -2 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127
/* pan (memory) table */
f3 0 16 -2 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64
f5 0 128 5 0.1 128 1 /* velocity mapping: less nuanced */
f6 0 128 5 0.01 128 1 /* velocity mapping: more nuanced */
i 1 0 360000
e
</CsScore>
</CsoundSynthesizer>
</pre>
}}


== Csound activities ==
== Csound activities ==

Revision as of 23:31, 19 March 2008

  english | españolfrançais한국어 HowTo [ID# 117905]  +/-  


Csound is the music and audio signal processing language developed by MIT's Barry Vercoe. Csound will provide audio services for the XO computer. Csound is both a programming language and a sound synthesis engine. Csound, as included in the OLPC project, can be used by Activities or directly by the children and teachers. It can be accessed in a variety of ways. In the XO platform, two basic ways are provided:

  • Through the Python programming environment: eg. programmed in Activities.
  • Through its 'classic' command-line frontend, directly invoking it from the Terminal activity.

Further information about Csound is on their website: http://csounds.com/ or see their instructions for playing Csound in Pippy [1].

Tutorials

See Csound tutorials for a wiki introduction to using Csound for music development.

MIDI playback

Csound can play back midi files. All you need is Csound code that understands MIDI and the compilation option -F <your-midi-file>.

 File: GM_example.csd
<CsoundSynthesizer>
<CsInstruments>
ichn = 1
lp1: massign   ichn, 0
loop_le   ichn, 1, 16, lp1
pgmassign 0, 0
gisf   sfload    "gmgsBank1.sf2"
sfpassign  0, gisf

/* this instrument parses MIDI input
   to trigger the GM soundfont synthesis
   instrument (instr 10
*/
instr 1
idkit = 317 /* drum-kit preset */
tableiw idkit, 9, 1
irel = 0.5 /* release envelope */

ipg = 1
ivol = 2
ipan = 3

nxt:
  kst, kch, kd1, kd2 midiin

  if (kst != 0) then
    kch = kch - 1
    if (kst == 144 && kd2 != 0) then ; note on
        kpg table kch, ipg 
        /* instrument identifier is 10.[chn][note] */
        kinst = 10 + kd1/100000 + kch/100  
        if kch == 9 then
         /* exclusive identifiers */
         if kpg == idkit+7 then
           krel = 2    /* add extra release time for orch perc*/
         else
           krel = 0.5
         endif
         if (kd1 == 29 || kd1 == 30) then ; EXC7
          kinst = 10.97
         elseif (kd1 == 42 || kd1 == 44 || kd1 == 46 || kd1 == 49) then ; EXC1
           kinst = 10.91
         elseif (kd1 == 71 || kd1 == 72) then ; EXC2         
           kinst = 10.92
         elseif (kd1 == 73 || kd1 == 74) then ; EXC3         
           kinst = 10.93
         elseif (kd1 == 78 || kd1 == 79) then ; EXC4         
           kinst = 10.94
         elseif (kd1 == 80 || kd1 == 81) then ; EXC5         
           kinst = 10.95
         elseif (kd1 == 86 || kd1 == 87) then ; EXC6         
           kinst = 10.96
         endif
        else
         krel = 0.5
        endif
        event "i", kinst, 0, -1, kd1, kd2, kpg, kch,krel  
     
    elseif (kst == 128 || (kst == 144 && kd2 == 0)) then ; note off
        kpg table kch, ipg
        kinst = 10 +  kd1/100000 + kch/100
        if kch == 9 then
         if (kd1 == 29 || kd1 == 30) then ; EXC7
          kinst = 10.97
         elseif (kd1 == 42 || kd1 == 44 || kd1 == 46 || kd1 == 49) then ; EXC1
           kinst = 10.91
         elseif (kd1 == 71 || kd1 == 72) then ; EXC2         
           kinst = 10.92
         elseif (kd1 == 73 || kd1 == 74) then ; EXC3         
           kinst = 10.93
         elseif (kd1 == 78 || kd1 == 79) then ; EXC4         
           kinst = 10.94
         elseif (kd1 == 80 || kd1 == 81) then ; EXC5         
           kinst = 10.95
         elseif (kd1 == 86 || kd1 == 87) then ; EXC6         
           kinst = 10.96
         endif
        else
         kpg = 0
        endif
        event "i", -kinst, 0, 1 
     
    elseif (kst == 192) then /* program change msgs */
       if kch == 9 then
         kpg = idkit
         if kd1 == 8 then
         kpg = idkit+1
         elseif kd1 == 16 then
         kpg = idkit+2
         elseif kd1 == 24 then
         kpg = idkit+3
         elseif kd1 == 25 then
         kpg = idkit+4
         elseif kd1 == 32 then
         kpg = idkit+5
         elseif kd1 == 40 then
         kpg = idkit+6
         elseif kd1 == 48 then
         kpg = idkit+7
         endif
       else
       kpg = kd1 
       endif
       tablew  kpg, kch, ipg
    elseif (kst == 176 && kd1 == 11) then /* volume msgs */
       tablew kd2, kch, ivol
    elseif (kst == 176 && kd1 == 7) then /* pan msgs    */
       tablew kd2, kch, ipan
    endif
     kgoto nxt
  endif

endin

/* this is the GM soundfont synthesizer instrument */
instr 10
kenv linenr 1,0.001,p8,0.001
iamp table p5, 5
a1, a2 sfplay p5, p4, iamp,1, p6
kv table p7, 2
kvol tablei kv, 5 
kpan  table p7, 3
kpan = (kpan - 64)/128
       outs a1*kvol*(0.5-kpan/2)*kenv, a2*kvol*(0.5+kpan/2)*kenv 
endin

</CsInstruments>
<CsScore>
/* program preset (memory) table */
f1 0 16 -2 0 0 0 0 0 0 0 0 226 0 0 0 0 0 0 0
/* velocity (memory) table */ 
f2 0 16 -2 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 
/* pan (memory) table */
f3 0 16 -2 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 64 
f5 0 128 5 0.1 128 1   /* velocity mapping: less nuanced */
f6 0 128 5 0.01  128 1 /* velocity mapping: more nuanced */
i 1 0 360000
e
</CsScore>
</CsoundSynthesizer> 

Csound activities

Tam Tam uses Csound, but you would never know it as its interface is designed to wrap the Csound engine with a child-friendly look and feel. This excellent grouo of Activities allows kids to make sounds, make music, jam, record and transform their voices in an intuitive way. TamTam Edit allows students to patch together Csound's opcodes (modules) and teaches them all about signals, synthesis, and synthesizers. TamTam Activities demonstrate well how the power of Csound can be harnessed in the XO platform. For more information see:

 http://wiki.laptop.org/go/Tamtam

You can see a number of activities developed by Greg for 542, mostly uploaded here:

 http://csounds.com/GregCsoundActivities.zip

Pippy uses Csound to help teach children the Python programming language and to build XO Activities.

 http://wiki.laptop.org/go/Pippy

csndsugui

You can also use csndsugui, a Python toolkit for the development of Csound-based audio and music activities. The code, plus examples and documentation, can be found in:

 http://dev.laptop.org/git/activities/csndsugui

Sample Code

  • A simple Python project using Csound to create an audible system load monitor using the standard Python Csound binding
  • TamTam uses a custom C++ wrapper around Csound and has a very large sound library available
  • Activity example shows a complete Python and Csound code for a simple Activity.