fluidEngine
Prev | Orchestra Opcodes and Operators | Next

## fluidEngine

fluidEngine — Instantiates a fluidsynth engine.

## Syntax

    ienginenum fluidEngine [iReverbEnabled] [, iChorusEnabled] [,iNumChannels] [, iPolypohny]

## Description

Instantiates a fluidsynth engine, and returns ienginenum to identify the engine. ienginenum is passed to other other opcodes for loading and playing SoundFonts and gathering the generated sound.

## Initialization

ienginenum -- engine number assigned from fluidEngine.

iReverbEnabled -- optionally set to 0 to disable any reverb effect in the loaded SoundFonts.

iChorusEnabled -- optionally set to 0 to disable any chorus effect in the loaded SoundFonts.

iNumChannels -- number of channels to use; range is 16-256 and Csound default is 256 (Fluidsynth's default is 16).

iPolyphony -- number of voices to be played in parallel; range is 16-4096 and Csound default is 4096 (Fluidsynth's default is 256). Note: this is not the number of notes played at the same time as a single note may use create multiple voices depending on instrument zones and velocity/key of played note.

## 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
    gienginenum1 fluidEngine
    gienginenum2 fluidEngine
    isfnum1      fluidLoad "Piano Steinway Grand Model C (21,738KB).sf2", gienginenum1, 1
    ; Bright Steinway, program 1, channel 1
                 fluidProgramSelect gienginenum1, 1, isfnum1, 0, 1
    ; Concert Steinway with reverb, program 2, channel 3
                 fluidProgramSelect gienginenum1, 3, isfnum1, 0, 2
    isfnum2      fluidLoad "63.3mg The Sound Site Album Bank V1.0.SF2", gienginenum2, 1
    ; General MIDI, program 50, channel 2
                 fluidProgramSelect gienginenum2, 2, isfnum2, 0, 50

    ; 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 gienginenum1, 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 gienginenum2, 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 gienginenum1, 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 example of the fluidsynth opcodes using 2 engines. It uses the file fluid-2.orc.

    sr = 44100
    kr = 4410
    ksmps = 10
    nchnls = 2
    0dbfs = 32767

    ; LOAD SOUNDFONTS
    gienginenum1 fluidEngine
    gienginenum2 fluidEngine
    isfnum1      fluidLoad "Piano Steinway Grand Model C (21,738KB).sf2", gienginenum1, 1
    ; Bright Steinway, program 1, channel 1
                 fluidProgramSelect gienginenum1, 1, isfnum1, 0, 1
    ; Concert Steinway with reverb, program 2, channel 3
                 fluidProgramSelect gienginenum1, 3, isfnum1, 0, 2
    isfnum2      fluidLoad "63.3mg The Sound Site Album Bank V1.0.SF2", gienginenum2, 1
    ; General MIDI, program 50, channel 2
                 fluidProgramSelect gienginenum2, 2, isfnum2, 0, 50

    ; 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
                 fluidNote gienginenum1, 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
                 fluidNote gienginenum2, 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
                 fluidNote gienginenum1, ichannel, ikey, ivelocity
    endin

    ; COLLECT AUDIO FROM ALL SOUNDFONTS

    instr 100 ; Fluidsynth output
      ; INITIALIZATION
      ; Normalize so iamplitude for p5 of 80 == ampdb(80).
      iamplitude1 = ampdb(p5) * (10000.0 / 0.1)
      iamplitude2 = ampdb(p6) * (10000.0 / 0.1)

    ; AUDIO
    aleft1, aright1 fluidOut   gienginenum1
    aleft2, aright2 fluidOut   gienginenum2
                    outs       (aleft1 * iamplitude1) + (aleft2 * iamplitude2),  \
                               (aright1 * iamplitude1) + (aright2 * iamplitude2)
    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 = 44100
    ksmps = 128
    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 "07AcousticGuitar.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) then
            fluidControl gifld, kst, kch - 1, kd1, kd2
        else
            fluidProgramSelect_k gifld, kch - 1, gisf2, 0, 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>

## See Also

fluidNote, fluidLoad

## Credits

Michael Gogins (gogins at pipeline dot com), Steven Yi. Thanks to Peter Hanappe for Fluidsynth.

Prev | Up | Next
fluidControl | Home | fluidLoad