mirror of
https://github.com/ZDoom/fluidsynth.git
synced 2024-11-10 06:51:54 +00:00
Add midi.winmidi.mergebox setting.
This commit is contained in:
parent
9b94dd2e04
commit
ae186c0997
1 changed files with 32 additions and 13 deletions
|
@ -31,8 +31,9 @@
|
||||||
* 1)Multiple/single devices handling capabilities:
|
* 1)Multiple/single devices handling capabilities:
|
||||||
* This driver is able to handle multiple MIDI input devices chosen by the
|
* This driver is able to handle multiple MIDI input devices chosen by the
|
||||||
* user trough the settings midi.winmidi.device.
|
* user trough the settings midi.winmidi.device.
|
||||||
* The driver makes an aggregation of the devices on separate MIDI channels
|
*
|
||||||
* to ensure no MIDI channels conflicts.
|
* If midi.winmidi.mergebox is set to 0 the driver makes an aggregation of the
|
||||||
|
* devices on separate MIDI channels to ensure no MIDI channels conflicts.
|
||||||
* For example, let the following device names:
|
* For example, let the following device names:
|
||||||
* 0:Port MIDI SB Live! [CE00], 1:SB PCI External MIDI, default, x[;y;z;..]
|
* 0:Port MIDI SB Live! [CE00], 1:SB PCI External MIDI, default, x[;y;z;..]
|
||||||
* Then the driver is able receive MIDI messages comming from distinct devices
|
* Then the driver is able receive MIDI messages comming from distinct devices
|
||||||
|
@ -53,15 +54,25 @@
|
||||||
* MIDI channel set associated with this real device at the driver output
|
* MIDI channel set associated with this real device at the driver output
|
||||||
* according this formula: output_channel = input_channel + device_order * 16.
|
* according this formula: output_channel = input_channel + device_order * 16.
|
||||||
*
|
*
|
||||||
* Note the driver ignores the setting synth.midi-channels which default value
|
* Note that the driver ignores the synth.midi-channels setting which default
|
||||||
* for this setting is 16, in which case the second MIDI device will not be hear
|
* value for this setting is 16,in which case the second MIDI device will not
|
||||||
* on the fluid synth instance.
|
* be hear on the fluid synth instance.
|
||||||
* a) You have to rise the setting synth.midi-channels to accept the number
|
* a) You can augment the synth.midi-channels setting value to accept the number
|
||||||
* of MIDI channels provided by the MIDI driver.
|
* of MIDI channels provided by the MIDI driver, or
|
||||||
* b) You can also keep the default value of 16 for synth.midi-channels
|
* b) You can also keep the default value of 16 for synth.midi-channels
|
||||||
* and have your application connected between the MIDI driver and the fluid synth.
|
* and have your application connected between the MIDI driver and the synths.
|
||||||
* This way your application is able to map any MIDI channel from the driver to
|
* This way your application is able to map any MIDI channel from the driver to
|
||||||
* any synths that could be a fluid synth and hardware synth(s).
|
* any synths that could be a fluid synth and hardware synth(s) as well.
|
||||||
|
*
|
||||||
|
* If midi.winmidi.mergebox is set to 1 (default value). The driver map the device
|
||||||
|
* according the limit of the synth.midi-channels setting.
|
||||||
|
* For example, if the user chooses 2 devices at index 0 and 1 and a default value
|
||||||
|
* of 16 for synth.midi-channels setting:
|
||||||
|
* - MIDI messages from real device 0 are output to MIDI channels set 0 to 15.
|
||||||
|
* - MIDI messages from real device 1 are output to MIDI channels set 0 to 15.
|
||||||
|
* Device 1 MIDI channels are merged with device 0 MIDI channel. This could lead
|
||||||
|
* to possible MIDI channels conflicts if both MIDI devices transmit at the same
|
||||||
|
* on the same MIDI channels.
|
||||||
*
|
*
|
||||||
* 2)Note also that the driver handles single device by putting the device name
|
* 2)Note also that the driver handles single device by putting the device name
|
||||||
* in midi.winmidi.device setting.
|
* in midi.winmidi.device setting.
|
||||||
|
@ -80,7 +91,7 @@
|
||||||
* channels conflicts are possible if MIDI devices transmit on the same MIDI channel.
|
* channels conflicts are possible if MIDI devices transmit on the same MIDI channel.
|
||||||
|
|
||||||
* If the device name other than "default" is specified, then midi.autoconnect
|
* If the device name other than "default" is specified, then midi.autoconnect
|
||||||
* and synth.midi-channels settings are ignored (see 1).
|
* and synth.midi-channels settings are ignored (see 1, 2).
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -291,6 +302,8 @@ void fluid_winmidi_midi_driver_settings(fluid_settings_t *settings)
|
||||||
|
|
||||||
/* register midi.winmidi.device */
|
/* register midi.winmidi.device */
|
||||||
fluid_settings_register_str(settings, "midi.winmidi.device", "default", 0);
|
fluid_settings_register_str(settings, "midi.winmidi.device", "default", 0);
|
||||||
|
/* register midi.winmidi.mergebox (default value 1) */
|
||||||
|
fluid_settings_register_int(settings, "midi.winmidi.mergebox", 1, 0, 1, FLUID_HINT_TOGGLED);
|
||||||
num = midiInGetNumDevs();
|
num = midiInGetNumDevs();
|
||||||
|
|
||||||
if(num > 0)
|
if(num > 0)
|
||||||
|
@ -495,6 +508,7 @@ new_fluid_winmidi_driver(fluid_settings_t *settings,
|
||||||
int i, j;
|
int i, j;
|
||||||
int max_devices; /* maximum number of devices to handle */
|
int max_devices; /* maximum number of devices to handle */
|
||||||
int autoconnect = 0;
|
int autoconnect = 0;
|
||||||
|
int mergebox = 1;
|
||||||
int synth_midi_channels = 16;
|
int synth_midi_channels = 16;
|
||||||
char strError[MAXERRORLENGTH];
|
char strError[MAXERRORLENGTH];
|
||||||
char dev_name[MAXPNAMELEN];
|
char dev_name[MAXPNAMELEN];
|
||||||
|
@ -514,6 +528,7 @@ new_fluid_winmidi_driver(fluid_settings_t *settings,
|
||||||
}
|
}
|
||||||
|
|
||||||
fluid_settings_getint(settings, "midi.autoconnect", &autoconnect);
|
fluid_settings_getint(settings, "midi.autoconnect", &autoconnect);
|
||||||
|
fluid_settings_getint(settings, "midi.winmidi.mergebox", &mergebox);
|
||||||
fluid_settings_getint(settings, "synth.midi-channels", &synth_midi_channels);
|
fluid_settings_getint(settings, "synth.midi-channels", &synth_midi_channels);
|
||||||
if ((autoconnect) && (FLUID_STRCASECMP(dev_name, "default") == 0))
|
if ((autoconnect) && (FLUID_STRCASECMP(dev_name, "default") == 0))
|
||||||
{
|
{
|
||||||
|
@ -564,11 +579,15 @@ new_fluid_winmidi_driver(fluid_settings_t *settings,
|
||||||
dev_infos->dev = dev; /* driver structure */
|
dev_infos->dev = dev; /* driver structure */
|
||||||
dev_infos->midi_num = i; /* device order number */
|
dev_infos->midi_num = i; /* device order number */
|
||||||
dev_infos->channel_map = i * 16; /* map from input to output */
|
dev_infos->channel_map = i * 16; /* map from input to output */
|
||||||
|
if(autoconnect || mergebox)
|
||||||
|
{
|
||||||
|
/* set channel mapping for autoconnect or mergebox behaviour */
|
||||||
|
dev_infos->channel_map %= synth_midi_channels;
|
||||||
if(autoconnect)
|
if(autoconnect)
|
||||||
{
|
{
|
||||||
/* set device index and channel mapping for autoconnect */
|
/* set device index for autoconnect */
|
||||||
dev_infos->dev_idx = i;
|
dev_infos->dev_idx = i;
|
||||||
dev_infos->channel_map %= synth_midi_channels;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FLUID_LOG(FLUID_DBG, "opening device at index %d", dev_infos->dev_idx);
|
FLUID_LOG(FLUID_DBG, "opening device at index %d", dev_infos->dev_idx);
|
||||||
|
|
Loading…
Reference in a new issue