Csound: Difference between revisions
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
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.