fluidAllOut — Collects all audio from all Fluidsynth engines in a performance
Invoke fluidAllOut in an instrument definition numbered higher than any fluidcontrol instrument definitions. All SoundFonts send their audio output to this one opcode. Send a note with an indefinite duration to this instrument to turn the SoundFonts on for as long as required.
In this implementation, SoundFont effects such as chorus or reverb are used if and only if they are defaults for the preset. There is no means of turning such effects on or off, or of changing their parameters, from Csound.
Here is an example of the fluidsynth opcodes. It uses the file fluidAllOut.orc.
sr = 44100
kr = 4410
ksmps = 10
nchnls = 2
0dbfs = 32767
; LOAD SOUNDFONTS
ienginenum1 fluidEngine
ienginenum2 fluidEngine
isfnum1 fluidLoad "Piano Steinway Grand Model C (21,738KB).sf2", ienginenum1, 1
fluidProgramSelect ienginenum1, 1, isfnum1, 0, 1 ; Bright Steinway, program 1, channel 1
fluidProgramSelect ienginenum1, 3, isfnum1, 0, 2 ; Concert Steinway with reverb, program 2, channel 3
isfnum2 fluidLoad "63.3mg The Sound Site Album Bank V1.0.SF2", ienginenum2, 1 fluidProgramSelect ienginenum2, 2, isfnum2, 0, 50 ; General MIDI, program 50, channel 2
; SEND NOTES TO STEINWAY SOUNDFONT
instr 1 ; FluidSynth Steinway Rev
; INITIALIZATION
mididefault 60, p3 ; Default duration of 60 -- overridden by score.
midinoteonkey p4, p5 ; Channels MIDI input to pfields.
; Use channel assigned in fluidload.
ichannel = 1
ikey = p4
ivelocity = p5
istatus = 144
fluidControl ienginenum1, istatus, ichannel, ikey, ivelocity
endin
instr 2 ; GM soundfont
; INITIALIZATION
mididefault 60, p3 ; Default duration of 60 -- overridden by score.
midinoteonkey p4, p5 ; Channels MIDI input to pfields.
; Use channel assigned in fluidload.
ichannel = 2
ikey = p4
ivelocity = p5
istatus = 144
fluidNote ienginenum2, ichannel, ikey, ivelocity
endin
instr 3 ; FluidSynth Steinway Rev
; INITIALIZATION
mididefault 60, p3 ; Default duration of 60 -- overridden by score.
midinoteonkey p4, p5 ; Channels MIDI input to pfields.
; Use channel assigned in fluidload.
ichannel = 3
ikey = p4
ivelocity = p5
istatus = 144
fluidNote ienginenum1, ichannel, ikey, ivelocity
endin
; COLLECT AUDIO FROM ALL SOUNDFONTS
instr 100 ; Fluidsynth output
; INITIALIZATION
; Normalize so iamplitude for p5 of 80 == ampdb(80).
iamplitude = ampdb(p5) * (10000.0 / 0.1)
; AUDIO
aleft, aright fluidAllOut
outs aleft * iamplitude, aright * iamplitude
endin
Here is another more complex example of the fluidsynth opcodes written by Istvan Varga. It uses the file fluidcomplex.csd.
<CsoundSynthesizer>
<CsOptions>
-d -m229 -o dac -T -F midifile.mid
</CsOptions>
<CsInstruments>
sr = 48000
ksmps = 32
nchnls = 2
0dbfs = 1
; Example by Istvan Varga
; disable triggering of instruments by MIDI events
ichn = 1
lp1:
massign ichn, 0
loop_le ichn, 1, 16, lp1
pgmassign 0, 0
; initialize FluidSynth
gifld fluidEngine
gisf2 fluidLoad "2gmgsmt.sf2", gifld, 1
; k-rate version of fluidProgramSelect
opcode fluidProgramSelect_k, 0, kkkkk
keng, kchn, ksf2, kbnk, kpre xin
igoto skipInit
doInit:
fluidProgramSelect i(keng), i(kchn), i(ksf2), i(kbnk), i(kpre)
reinit doInit
rireturn
skipInit:
endop
instr 1
; initialize channels
kchn init 1
if (kchn == 1) then
lp2:
fluidControl gifld, 192, kchn - 1, 0, 0
fluidControl gifld, 176, kchn - 1, 7, 100
fluidControl gifld, 176, kchn - 1, 10, 64
loop_le kchn, 1, 16, lp2
endif
; send any MIDI events received to FluidSynth
nxt:
kst, kch, kd1, kd2 midiin
if (kst != 0) then
if (kst != 192 || kch != 10) then
fluidControl gifld, kst, kch - 1, kd1, kd2
else
fluidProgramSelect_k gifld, kch - 1, gisf2, 128, kd1
endif
kgoto nxt
endif
; get audio output from FluidSynth
aL, aR fluidOut gifld
outs aL, aR
endin
</CsInstruments>
<CsScore>
i 1 0 3600
e
</CsScore>
</CsoundSynthesizer>