fluidAllOut

fluidAllOut — Collects all audio from all Fluidsynth engines in a performance

Syntax

aleft, aright fluidAllOut

Description

Collects all audio from all Fluidsynth engines in a performance

Initialization

aleft -- Left channel audio output.

aright -- Right channel audio output.

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.

Examples

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> 

    

Credits

Opcode by Michael Gogins (gogins at pipeline dot com). Thanks to Peter Hanappe for Fluidsynth, and to Steven Yi for seeing that it is necessary to break up the Fluidsynth into several different Csound opcodes.