CSound is a very powerful synthesis program that is cross platform, free to download under the GNU Lesser General Public License and available here. It has hundreds of built in synthesis algorithms ranging from simple to advanced, cutting edge synthesis and sound processing methods.
CSound works with two files:
- A .orc Orchestra file that specifies the instruments
- A .sco Score file that specifies how the instruments will be played e.g. the notes
f1 0 4096 10 1
;p1 p2 p3 p4 p5
i1 0 .50 71 61
i1 .5000 .50 67 78
i1 1.0000 .50 63 70
i1 1.5000 .50 61 71
i1 2.0000 .50 76 78
This example has only 5 p-fields but an instrument can have many more p-fields than this. The standard 5 p-fields are:
- p1 = instrument number
- p2 = onset
- p3 = duration
- p4 = amplitude
- p5 = frequency
1. OpenMusic has a CSound library, you need to enable this in preferences:
3. This object takes inputs for the various p-fields and creates a list of all of the them to create our CSound score. As our instrument will have 5 p-fields we need to create some more inputs. Select the instrument0 object and press the > key twice, this will create two more inputs:
4. Now we create processes to fill these 5 p-fields, we can use any method we like but we'll keep things simple to start with. The first p-field in our example is easy, it's our instrument number and in this example is instrument 1.
5. The second p-field is onset time: the time the note starts. We'll keep our example simple and have 40 notes starting every half a second. For this we use an arithm-ser function (arithmetic series). For this we give a start value (0) an end value (19.5) and the step size:
This outputs a list of onsets that looks like this:
(0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 9.0 9.5 10.0 10.5 11.0 11.5 12.0 12.5 13.0 13.5 14.0 14.5 15.0 15.5 16.0 16.5 17.0 17.5 18.0 18.5 19.0 19.5)
6. Our next p-field is duration. We'll keep this simple and use .5 as a duration for all our notes. We can use a repeat-n function to do this:
Our patch now looks like this:
7. Our next p-field (p4) is amplitude. Again we could use any process to generate these numbers, but for now we'll make a simple random choice. CSound can work with amplitude values in dB and raw amplitude values and can convert from one to the other. Here we'll work with decibels and get OpenMusic to choose 40 random values between 60 and 90 using om-random and repeat-n functions:
8. Our 5th and final p-field is frequency, CSound supports a number of different pitch representations and can convert between them including frequency (Hertz), MIDI pitches, octave pitchclasses etc. We'll work with MIDI pitches and use the same method to generate our pitches as we used for amplitude: the om-random and repeat-n function:
Our patch now looks like this:
9. When we evaluate our patch it outputs a list of lists with all our algorithmic musical data in it. We next need to add in an editsco function that converts this and saves it as a .sco file.
10. We also need to add a function table into this. Function tables in CSound are used to store data that we need to access, this might be:
- The points of a sine wave
- A sample
- An envelope shape etc.,
When we evaluate the editsco function, this will bring up a dialog box and save the file to disk. The final score file produced looks like this:
f 1 0 4096 10 1
;p1 p2 p3 p4 p5
i 1 0 .5000 64 81
i 1 .5000 .5000 65 64
i 1 1.0000 .5000 67 64
i 1 1.5000 .5000 74 66
i 1 2.0000 .5000 80 72
i 1 2.5000 .5000 89 66
i 1 3.0000 .5000 69 82
i 1 3.5000 .5000 86 61
i 1 4.0000 .5000 79 69
i 1 4.5000 .5000 81 61
i 1 5.0000 .5000 61 66
i 1 5.5000 .5000 81 62
i 1 6.0000 .5000 61 78
i 1 6.5000 .5000 85 79
i 1 7.0000 .5000 67 76
i 1 7.5000 .5000 72 81
i 1 8.0000 .5000 67 77
i 1 8.5000 .5000 78 81
i 1 9.0000 .5000 79 80
i 1 9.5000 .5000 64 69
i 1 10.0000 .5000 81 74
i 1 10.500 .5000 86 62
i 1 11.0000 .5000 82 72
i 1 11.5000 .5000 71 75
i 1 12.0000 .5000 61 65
i 1 12.5000 .5000 66 77
i 1 13.0000 .5000 67 73
i 1 13.500 .5000 70 82
i 1 14.0000 .5000 65 67
i 1 14.5000 .5000 90 67
i 1 15.0000 .5000 88 60
i 1 15.5000 .5000 69 62
i 1 16.0000 .5000 75 60
i 1 16.5000 .5000 89 68
i 1 17.0000 .5000 83 75
i 1 17.5000 .5000 76 71
i 1 18.0000 .5000 61 78
i 1 18.5000 .5000 85 70
i 1 19.0000 .5000 61 81
i 1 19.5000 .5000 68 63
e
;p1 p2 p3 p4 p5
i 1 0 .5000 64 81
i 1 .5000 .5000 65 64
i 1 1.0000 .5000 67 64
i 1 1.5000 .5000 74 66
i 1 2.0000 .5000 80 72
i 1 2.5000 .5000 89 66
i 1 3.0000 .5000 69 82
i 1 3.5000 .5000 86 61
i 1 4.0000 .5000 79 69
i 1 4.5000 .5000 81 61
i 1 5.0000 .5000 61 66
i 1 5.5000 .5000 81 62
i 1 6.0000 .5000 61 78
i 1 6.5000 .5000 85 79
i 1 7.0000 .5000 67 76
i 1 7.5000 .5000 72 81
i 1 8.0000 .5000 67 77
i 1 8.5000 .5000 78 81
i 1 9.0000 .5000 79 80
i 1 9.5000 .5000 64 69
i 1 10.0000 .5000 81 74
i 1 10.500 .5000 86 62
i 1 11.0000 .5000 82 72
i 1 11.5000 .5000 71 75
i 1 12.0000 .5000 61 65
i 1 12.5000 .5000 66 77
i 1 13.0000 .5000 67 73
i 1 13.500 .5000 70 82
i 1 14.0000 .5000 65 67
i 1 14.5000 .5000 90 67
i 1 15.0000 .5000 88 60
i 1 15.5000 .5000 69 62
i 1 16.0000 .5000 75 60
i 1 16.5000 .5000 89 68
i 1 17.0000 .5000 83 75
i 1 17.5000 .5000 76 71
i 1 18.0000 .5000 61 78
i 1 18.5000 .5000 85 70
i 1 19.0000 .5000 61 81
i 1 19.5000 .5000 68 63
e
Not only would this have been very time consuming to type in by hand, we now have the big advantage of using algorithmic composition techniques with OpenMusic and CSound: if we want to change anything or how we generate any of the musical parameters we're using (instrument, onsets, duration, amplitude, pitch) we can do this very easily.
For example in a previous post we looked at using different probabilities to algorithmically compose musical data. Let's say we want to use a triangle distribution instead of our current om-random function, we can keep our patch and plug a trian-seq function into our pitch instead (we've also used an om-round function to ensure each note is an integer.
To do this by hand would involve typing out and replacing lots of our score elements by hand, using algorithmic composition we can evaluate the patch again to output a new score and keep revising it until we like it.
Playing Your Algorithmic Score In CSound
You now have a .sco file. Save this example orchestra as a .orc file, you can paste this into a standard text editor and save it as basic.orc for example.
instr 1
a1 oscil ampdb(p4), cpsmidi (p5), 1
out a1
endin
Open up your .orc and .sco files in CSound to render them to an audio file and listen to them. Our instrument is a simple sine wave oscillator oscil with just 3 parameters: amplitude, pitch and the function table we're using. Instruments can get much more complicated (and interesting) than this, and often end up with lots more p-fields in the score. This makes the range of sounds much more interesting but also means the score is more complex to complete by hand. Fortunately we can use algorithmic composition techniques to generate the score for us.
In future posts we'll have another look at creating CSound scores in OpenMusic and look at more interesting and developed methods of algorithmic composition and more developed CSound instruments. If you're interested in CSound there are some very good tutorials available at www.csounds.com.
Try modifying your patch to use some of the other different OpenMusic algorithmic composition methods we've looked at so far to generate CSound scores and check back to http://www.algorithmiccomposer.com/ soon for more algorithmic composition techniques.
No comments:
Post a Comment