I'm just coming to terms with how to send commands to FluidSynth to
control things like reverb (specifically, I want to control reverb).
I'm under the impression that while a few things can be controlled from
the command-line (such as gain), most things (such as reverb) cannot be.
There are a few other ways to control these things:
- Using the interactive shell, you can type in commands manually.
- You can also use Unix pipes to send the same shell commands (e.g.,
'echo "rev_setlevel 10" | fluidsynth' or 'fluidsynth < commands.txt').*
- Using -s, FluidSynth listens for TCP connections and accepts the same
shell commands via network input.
- Using the API, you can programmatically change the settings.
- Graphically using QSynth (which I imagine uses the API).
*Note this was mentioned earlier this year by David:
http://lists.gnu.org/archive/html/fluid-dev/2011-03/msg00036.html
Any that I missed?
The problem is that none of these methods seem to work in conjunction
with the -F fast renderer feature. -F is a way to tell FluidSynth
"forget about TCP servers, MIDI servers, output devices, command shells,
etc -- just convert a MIDI input into a digital audio file as fast as
you can and quit." Which is a fantastic feature -- I have makefiles set
up so that I can just go "make" and FluidSynth renders all of my music
(it's one thing I love about FluidSynth as it lets me export all of my
music with a single command).
The problem is that as far as I can tell, ALL of the above options for
changing settings require that you are running FluidSynth either in
server mode or via the API, which means they are incompatible with -F.
In fact, I can't find a way to change reverb when using the fast
renderer at all. Note that I have tried using -F and not -i, and piping
a text file in to stdin, but FluidSynth seems to ignore stdin when -F is
supplied. Is there a way?
The only way I can think of is only available to me because I've hacked
on FluidSynth in the past:
- Edit include/fluidsynth/synth.h FLUID_REVERB_DEFAULT_LEVEL and friends
and recompile the program.
Obviously not the cleanest solution :) As I am coming up on a deadline,
if there is no simple solution, I'll do that for now. But in the future,
I would like to propose a feature (which I'm willing to work on) where
you can specify on the command-line:
--settings <settings-file>
This would read in <settings-file> and execute it as if it was supplied
to stdin, but it would always work (even when FS refuses to read from
stdin, such as with -F). This should be pretty trivial to implement, I
would imagine.