2
* MusE FLUID Synth softsynth plugin
4
* Copyright (C) 2002 Robert Ham (node@users.sourcforge.net)
6
* $Id: fluidsynti.h,v 1.1.1.1 2003/10/29 10:06:05 wschweer Exp $
10
#ifndef __MUSE_FLUIDSYNTI_H__
11
#define __MUSE_FLUIDSYNTI_H__
16
#include <fluidsynth.h>
18
#include "fluidsynthgui.h"
22
class FLUIDSynth_soundfont
25
FLUIDSynth_soundfont(): _external_id(0), _internal_id(0) {};
27
std::string _filename;
29
unsigned char _external_id; //The ID the gui knows about
30
unsigned char _internal_id; //The ID for fluidsynth
33
// FluidSynthChannel is used to map different soundfonts to different fluid-channels
34
// This is to be able to select different presets from specific soundfonts, since
35
// Fluidsynth has a quite strange way of dealing with fontloading and channels
36
// We also need this since getFirstPatch and getNextPatch only tells us which channel is
37
// used, so this works as a connection between soundfonts and fluid-channels (one channel
38
// can only have one soundfont, but one soundfont can have many channels)
39
class FluidSynthChannel
42
unsigned char _soundfont_internal_id;
43
unsigned char _soundfont_external_id;
44
unsigned int _preset_id;
48
_soundfont_internal_id(0),
49
_soundfont_external_id(0),
50
_preset_id(MUSE_FLUID_UNSPECIFIED_PRESET) { };
51
void setInternalFontId(unsigned char int_id) { _soundfont_internal_id = int_id; }
52
void setExternalFontId(unsigned char ext_id) { _soundfont_external_id = ext_id; }
53
void setPresetId(unsigned char preset_id) { _preset_id = preset_id; }
54
unsigned char getInternalFontId() const { return _soundfont_internal_id; }
55
unsigned char getExternalFontId() const { return _soundfont_external_id; }
56
unsigned char getPresetId() { return _preset_id; }
59
class FLUIDParameterSet {
61
std::map <std::string, std::pair <bool, double> > _parameters;
63
FLUIDParameterSet () {}
64
FLUIDParameterSet (const FLUIDParameterSet&);
65
void setParameter (std::string param, int val) {
66
_parameters[param] = std::pair<bool, double> (true, ((double)val)/128.0);
68
void setParameter (std::string param, double val) {
69
_parameters[param] = std::pair<bool, double> (true, val);
71
double getParameter (std::string param) { return _parameters[param].second; }
72
bool getParameterModified (std::string param) { return _parameters[param].first; }
76
class FLUIDSynth : public Mess {
79
FLUIDParameterSet _reverbParameters;
80
FLUIDParameterSet _chorusParameters;
84
void setGain (double gain);
85
virtual void write (int, float **, int);
86
void decodeSysex (const unsigned char *, int);
87
void processSysex (const unsigned char *, int);
88
void encodeSysex(const unsigned char *, int);
89
const MidiPatch * getFirstPatch (int channel) const;
90
void sfChannelChange(unsigned char font_id, unsigned char channel);
91
void rewriteChannelSettings(); //used because fluidsynth does some very nasty things when loading a font!
97
FLUIDSynth (const char *);
98
virtual ~FLUIDSynth ();
100
virtual void processEvent (MEvent *);
101
virtual const char * getPatchName (int, int, int, int, MType);
102
virtual const MidiPatch * getNextPatch (int, const MidiPatch *) const;
103
virtual int getMidiInitEvent(int id, RawMidiEvent* ev);
104
bool pushSoundfont (const std::string&, int ext_id);
105
bool popSoundfont (int ext_id);
106
void sendSysexError (const char *);
107
void sendSoundFontdata();
109
int getNextAvailableExternalId();
110
fluid_synth_t * _fluidsynth;
111
pthread_mutex_t _sfloader_mutex;
113
int _currentlyLoadedFonts; //To know whether or not to run the init-parameters
115
std::list<FLUIDSynth_soundfont> _soundfontStack;
116
FluidSynthChannel _fluidChannels[MUSE_FLUID_MAX_NR_OF_CHANNELS];
118
int getFontInternalIdByChannel(int channel) const { return (int) _fluidChannels[channel].getInternalFontId(); }
119
int getFontExternalIdByChannel(int channel) { return (int) _fluidChannels[channel].getExternalFontId(); }
120
void setFontInternalIdByChannel(int channel, int int_id) { _fluidChannels[channel].setInternalFontId(int_id); }
121
void setFontExternalIdByChannel(int channel, int ext_id) { _fluidChannels[channel].setExternalFontId(ext_id); }
122
unsigned char getChannelPreset(int channel) { return (int) _fluidChannels[channel].getPresetId(); }
123
void setChannelPreset(int preset, unsigned char channel) { _fluidChannels[channel].setPresetId(preset); }
124
int getFontInternalIdByExtId (int channel);
128
struct Helper //Only used to pass parameters when calling the loading thread
131
std::string filename;
134
#endif /* __MUSE_FLUIDSYNTI_H__ */