The simplest way of playing a sound file from Csound is to use the diskin2 opcode. This opcode reads audio directly from the hard drive location where it is stored, i.e. it does not pre-load the sound file at initialization time. This method of sound file playback is therefore good for playing back very long, or parts of very long, sound files. It is perhaps less well suited to playing back sound files where dense polyphony, multiple iterations and rapid random access to the file is required. In these situations reading from a function table or buffer is preferable.
diskin2 has additional parameters for speed of playback, and interpolation; these will be discussed in the section playback speed and direction.
EXAMPLE 06A01.csd
<CsoundSynthesizer> <CsOptions> -odac </CsOptions> <CsInstruments> ;example written by Iain McCurdy sr = 44100 ksmps = 32 nchnls = 1 instr 1; play audio from disk using diskin2 opcode kSpeed init 1; playback speed iSkip init 0; inskip into file (in seconds) iLoop init 0; looping switch (0=off 1=on) ; READ AUDIO FROM DISK a1 diskin2 "loop.wav", kSpeed, iSkip, iLoop out a1; send audio to outputs endin </CsInstruments> <CsScore> i 1 0 6 e </CsScore> </CsoundSynthesizer>
The traditional method of rendering Csound's audio to disk is to specify a sound file as the audio destination in the Csound command or under <CsOptions>, in fact before real-time performance became a possibility this was the only way in which Csound was used. With this method, all audio that is piped to the output using out, outs etc. will be written to this file. The number of channels that the file will conatain will be determined by the number of channels specified in the orchestra header using 'nchnls'. The disadvantage of this method is that we cannot simultaneously listen to the audio in real-time.
EXAMPLE 06A02.csd
<CsoundSynthesizer> <CsOptions> ;audio output destinatoin is given as a sound file (wav format specified) ;audio destination cannot simultaneously be live output when using this method to record -oWriteToDisk1.wav -W </CsOptions> <CsInstruments> ;example written by Iain McCurdy sr = 44100 ksmps = 32 nchnls = 1 0dbfs = 1 giSine ftgen 0, 0, 4096, 10, 1 ; a sine wave instr 1; a simple tone generator aEnv expon 0.2, p3, 0.001; a percussive amplitude envelope aSig poscil aEnv, cpsmidinn(p4), giSine; audio oscillator out aSig; send audio to output endin </CsInstruments> <CsScore> ; two chords i 1 0 5 60 i 1 0.1 5 65 i 1 0.2 5 67 i 1 0.3 5 71 i 1 3 5 65 i 1 3.1 5 67 i 1 3.2 5 73 i 1 3.3 5 78 e </CsScore> </CsoundSynthesizer>
The newer method and of writing audio to a sound file which permits simultaneous real time output is the use of the fout opcode. Because this opcode is used within the orchestra we have a little more work to do to ensire that all the audio generated by Csound is piped through fout, but the advantage is that we have many more options with regard to how and when this is done. With fout we can choose between many different file formats, details of these can be found in fout's entry in the Csound Manual.
EXAMPLE 06A03.csd
<CsoundSynthesizer> <CsOptions> -odac </CsOptions> <CsInstruments> ;example written by Iain McCurdy sr = 44100 ksmps = 32 nchnls = 1 0dbfs = 1 giSine ftgen 0, 0, 4096, 10, 1 ; a sine wave gaSig init 0; set initial value for global audio variable (silence) instr 1; a simple tone generator aEnv expon 0.2, p3, 0.001; percussive amplitude envelope aSig poscil aEnv, cpsmidinn(p4), giSine; audio oscillator gaSig = gaSig + aSig; accumulate this note with the global audio variable endin instr 2; write to a file (always on) ; USE FOUT TO WRITE TO A FILE ON DISK ; FORMAT 4 RESULTS IN A 16BIT WAV ; NUMBER OF CHANNELS IS DETERMINED BY THE NUMBER OF AUDIO VARIABLES SUPPLIED TO fout fout "WriteToDisk2.wav", 4, gaSig out gaSig; send audio for all notes combined to the output clear gaSig; clear global audio variable to prevent run away accumulation endin </CsInstruments> <CsScore> ; activate recording instrument to encapsulate the entire performance i 2 0 8.3 ; two chords i 1 0 5 60 i 1 0.1 5 65 i 1 0.2 5 67 i 1 0.3 5 71 i 1 3 5 65 i 1 3.1 5 67 i 1 3.2 5 73 i 1 3.3 5 78 e </CsScore> </CsoundSynthesizer>