Let's examine a Csound file that will allow me to control its pitch with my USB MIDI keyboard. Normally now with Csound you use a score file to set the pitches and parameter controls, but nowadays even entry level PCs are powerful enough to run at least one Csound instrument in real-time.
In this example I use the waveguide flute model to create a haunting synthetic flute. I'm using a combination of three real-time controllers and some randomness to give it a fresh and lively sound. Now the first part to note is the set of flags I'm using to setup my real-time control.
First I set audio output to
-+rtaudio=jack instead of
the default of ALSA. On Linux this tells Csound to use the Jack audio
server to handle real time audio. This allows me to record my output
from Csound directly into Ardour2, or I could use JackRack to process
the audio output with LADSPA plugins. Using
-o dac tells Csound to route the audio to the real time output rather than write it to a sound file. The
-+rtMIDI=alsa flag tells csound to use alsa for realtime MIDI, since jack is only used for audio. The next flag
tells Csound to use my second MIDI device (my USB keyboard controller)
as the MIDI input device. If I wanted to use my first ALSA MIDI device,
I would use -M hw:0 instead.
The first part of the instrument captures the action of my pitch
bend. If you have knobs on your keyboard, you could also capture them
here using a generic MIDI controller. But for now I'm just capturing
the key note, the velocity and pitch bend. The
ikoct variable is set to a 4
octave range, and the
kfratio connects to
midic7 to capture the pitch
bend. Then I use
cpsmidi to convert the MIDI note to a standard pitch.
To use the pitch bend I then multiply
i1 by the
kfratio. I use an
envelope to shape the attack and sustain; you can get crazy effects
by extending the sustain, set here to 3 seconds. You can also
randomize the sustain for some weird looping effects.
I simply run the instrument for 9999 seconds to run it effectively in real time.
<CsoundSynthesizer> <CsOptions> ; Select audio/midi flags here according to platform -+rtaudio=jack -i adc -o dac -+rtmidi=alsa -M hw:1 </CsOptionsv <CsInstruments> ; Initialize the global variables. sr = 44100 ksmps = 128 nchnls = 2 ; Instrument #1. instr 1 ikoct = 8 ;4 octave range kfratio midic7 1, 1, ikoct ;mod.wheel controls transposition ifn = 1 i1 cpsmidi ivel veloc kamp = ivel*500 kfreq = i1*kfratio kjet = rnd(0.5) iatt = 0.1 idetk = 0.1 kngain = rnd(0.05) kvibf = kfratio kvamp = 0.05 kenv linsegr 0,0.001,ivel/128, 3, 0 a1 wgflute kamp, kfreq, kjet, iatt, idetk, kngain, kvibf, kvamp, ifn outs a1*kenv,a1*kenv endin </CsInstruments> <CsScore> ; Table #1, a sine wave. f 1 0 16384 10 1 i 1 9999 e </CsScore> </CsoundSynthesizer>
Now let's see how we can microtune our instrument to go beyond the standard Western pitches.
ftgen to generate a table of pitch values which sets up our
micro-tuned scale. In this case instead of the normal 12 tones of
the Western scale, we have a 14 tone scale developed by the microtonal
composer Kraig Grady. Instead of
cpsmid, which converts the MIDI input
into a standard Western tuning, we use
cpstmid, which allows us to
convert the MIDI input pitches into the microtuned scale set by
I'm using the same MIDI controls as before, but this time I have my own
custom scale so that I'm not limited to the Western tuning.
You can take the notes you play from a standard keyboard and convert the
pitches into the microtonal scale you specify using
gitemp, thus you can stretch
tunings all the way across a standard MIDI keyboard and Csound will
handle the pitch conversion for you.
<CsoundSynthesizer> <CsOptions> ; Select audio/midi flags here according to platform ; Audio out Audio in No messages ; -odac -iadc -d ;;;RT audio I/O ; For Non-realtime ouput leave only the line below: ; -o wgflute.wav -W ;;; for file output any platform -+rtaudio=jack -i adc -o dac -+rtmidi=alsa -M hw:1 </CsOptions> <CsInstruments> ; Initialize the global variables. sr = 44100 ksmps = 128 nchnls = 2 ; Table #1 Kraig Grady's 14 tone mictotuned scale ; numgrades = 14 (fourteen tones) ; interval = 2 (one octave) ; basefreq = 261.659 (Middle C) ; basekeymidi = 60 (Middle C) gitemp ftgen 2, 0, 64, -2, 14, 2, 261.659, 60, 1.05, 1.125, \ 1.166666666666666667, 1.25, 1.3125, 1.333333333333333333, 1.4, \ 1.5, 1.575, 1.6875, 1.75, 1.875, 1.96875, 2 ; Instrument #1. instr 1 ikoct = 8 ;4 octave range kfratio midic7 1, 1, ikoct ;mod.wheel controls transposition i1 cpstmid ifn ivel veloc kamp = ivel*200 kfreq = i1*kfratio kjet = rnd(0.5) iatt = 0.1 idetk = 0.1 kngain = 0.15 kvibf = kfratio kvamp = 0.05 kenv linsegr 0,0.001,ivel/128, 3, 0 a1 wgflute kamp, kfreq, kjet, iatt, idetk, kngain, kvibf, kvamp, ifn outs a1*kenv,a1*kenv endin </CsInstruments> <CsScore> ; Table #1, a sine wave. f 1 0 16384 10 1 i 1 9999 e </CsScore> </CsoundSynthesizer>