- integrated ADL as a proper device in the MIDI device list.

- resorted the MIDI device menu option by device types (i.e. all SW synths first, FM synths second)
- allow setting the ADL bank.
This commit is contained in:
Christoph Oelckers 2018-03-07 21:20:25 +01:00
parent fd801b8b94
commit 2d2d44baad
5 changed files with 49 additions and 37 deletions

View file

@ -325,7 +325,7 @@ public:
~ADLMIDIDevice(); ~ADLMIDIDevice();
int Open(MidiCallback, void *userdata); int Open(MidiCallback, void *userdata);
int GetDeviceType() const override { return MDEV_OPL; } int GetDeviceType() const override { return MDEV_ADL; }
protected: protected:

View file

@ -162,6 +162,7 @@ enum EMidiDevice
MDEV_FLUIDSYNTH = 4, MDEV_FLUIDSYNTH = 4,
MDEV_GUS = 5, MDEV_GUS = 5,
MDEV_WILDMIDI = 6, MDEV_WILDMIDI = 6,
MDEV_ADL = 7,
MDEV_COUNT MDEV_COUNT
}; };

View file

@ -54,6 +54,14 @@ enum
ME_PITCHWHEEL = 0xE0 ME_PITCHWHEEL = 0xE0
}; };
CUSTOM_CVAR(Int, adl_bank, 14, CVAR_ARCHIVE | CVAR_GLOBALCONFIG)
{
if (currSong != nullptr && currSong->GetDeviceType() == MDEV_ADL)
{
MIDIDeviceChanged(-1, true);
}
}
//========================================================================== //==========================================================================
// //
// ADLMIDIDevice Constructor // ADLMIDIDevice Constructor
@ -61,6 +69,7 @@ enum
//========================================================================== //==========================================================================
ADLMIDIDevice::ADLMIDIDevice(const char *args) ADLMIDIDevice::ADLMIDIDevice(const char *args)
:SoftSynthMIDIDevice(44100)
{ {
Renderer = adl_init(44100); // todo: make it configurable Renderer = adl_init(44100); // todo: make it configurable
if (Renderer != nullptr) if (Renderer != nullptr)
@ -163,18 +172,11 @@ void ADLMIDIDevice::HandleLongEvent(const uint8_t *data, int len)
void ADLMIDIDevice::ComputeOutput(float *buffer, int len) void ADLMIDIDevice::ComputeOutput(float *buffer, int len)
{ {
if (shortbuffer.Size() < len*2) shortbuffer.Resize(len*2); if ((int)shortbuffer.Size() < len*2) shortbuffer.Resize(len*2);
auto result = adl_generate(Renderer, len, &shortbuffer[0]); auto result = adl_generate(Renderer, len*2, &shortbuffer[0]);
for(int i=0; i<result*2; i++) for(int i=0; i<result; i++)
{ {
buffer[i] = shortbuffer[i] * (1.f/32768.f); buffer[i] = shortbuffer[i] * (5.f/32768.f);
} }
/*
for (int i = result; i < len; i++) // The backend cannot deal with gaps.
{
buffer[i*2] = shortbuffer[(result-1)*2] * (1.f / 32768.f);
buffer[i * 2+1] = shortbuffer[(result - 1) * 2+1] * (1.f / 32768.f);
}
*/
} }

View file

@ -50,21 +50,23 @@
static uint32_t nummididevices; static uint32_t nummididevices;
static bool nummididevicesset; static bool nummididevicesset;
#define NUM_DEF_DEVICES 5 #define NUM_DEF_DEVICES 6
static void AddDefaultMidiDevices(FOptionValues *opt) static void AddDefaultMidiDevices(FOptionValues *opt)
{ {
FOptionValues::Pair *pair = &opt->mValues[opt->mValues.Reserve(NUM_DEF_DEVICES)]; FOptionValues::Pair *pair = &opt->mValues[opt->mValues.Reserve(NUM_DEF_DEVICES)];
pair[0].Text = "FluidSynth"; pair[0].Text = "FluidSynth";
pair[0].Value = -5.0; pair[0].Value = -5.0;
pair[1].Text = "GUS"; pair[1].Text = "TiMidity++";
pair[1].Value = -4.0; pair[1].Value = -2.0;
pair[2].Text = "OPL Synth Emulation"; pair[2].Text = "WildMidi";
pair[2].Value = -3.0; pair[2].Value = -6.0;
pair[3].Text = "TiMidity++"; pair[3].Text = "GUS";
pair[3].Value = -2.0; pair[3].Value = -4.0;
pair[4].Text = "WildMidi"; pair[4].Text = "OPL Synth Emulation";
pair[4].Value = -6.0; pair[4].Value = -3.0;
pair[5].Text = "libADL";
pair[5].Value = -7.0;
} }
@ -115,7 +117,7 @@ CUSTOM_CVAR (Int, snd_mididevice, DEF_MIDIDEV, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
if (!nummididevicesset) if (!nummididevicesset)
return; return;
if ((self >= (signed)nummididevices) || (self < -6)) if ((self >= (signed)nummididevices) || (self < -7))
{ {
// Don't do repeated message spam if there is no valid device. // Don't do repeated message spam if there is no valid device.
if (self != 0) if (self != 0)
@ -199,6 +201,7 @@ CCMD (snd_listmididevices)
MIDIOUTCAPS caps; MIDIOUTCAPS caps;
MMRESULT res; MMRESULT res;
PrintMidiDevice(-7, "libADL", MIDIDEV_FMSYNTH, 0);
PrintMidiDevice (-6, "WildMidi", MIDIDEV_SWSYNTH, 0); PrintMidiDevice (-6, "WildMidi", MIDIDEV_SWSYNTH, 0);
PrintMidiDevice (-5, "FluidSynth", MIDIDEV_SWSYNTH, 0); PrintMidiDevice (-5, "FluidSynth", MIDIDEV_SWSYNTH, 0);
PrintMidiDevice (-4, "Gravis Ultrasound Emulation", MIDIDEV_SWSYNTH, 0); PrintMidiDevice (-4, "Gravis Ultrasound Emulation", MIDIDEV_SWSYNTH, 0);
@ -227,8 +230,8 @@ CCMD (snd_listmididevices)
CUSTOM_CVAR(Int, snd_mididevice, DEF_MIDIDEV, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CUSTOM_CVAR(Int, snd_mididevice, DEF_MIDIDEV, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
{ {
if (self < -6) if (self < -7)
self = -6; self = -7;
else if (self > -2) else if (self > -2)
self = -2; self = -2;
else else
@ -242,6 +245,7 @@ void I_BuildMIDIMenuList (FOptionValues *opt)
CCMD (snd_listmididevices) CCMD (snd_listmididevices)
{ {
Printf("%s-7. libADL\n", -6 == snd_mididevice ? TEXTCOLOR_BOLD : "");
Printf("%s-6. WildMidi\n", -6 == snd_mididevice ? TEXTCOLOR_BOLD : ""); Printf("%s-6. WildMidi\n", -6 == snd_mididevice ? TEXTCOLOR_BOLD : "");
Printf("%s-5. FluidSynth\n", -5 == snd_mididevice ? TEXTCOLOR_BOLD : ""); Printf("%s-5. FluidSynth\n", -5 == snd_mididevice ? TEXTCOLOR_BOLD : "");
Printf("%s-4. Gravis Ultrasound Emulation\n", -4 == snd_mididevice ? TEXTCOLOR_BOLD : ""); Printf("%s-4. Gravis Ultrasound Emulation\n", -4 == snd_mididevice ? TEXTCOLOR_BOLD : "");

View file

@ -165,6 +165,7 @@ EMidiDevice MIDIStreamer::SelectMIDIDevice(EMidiDevice device)
case -4: return MDEV_GUS; case -4: return MDEV_GUS;
case -5: return MDEV_FLUIDSYNTH; case -5: return MDEV_FLUIDSYNTH;
case -6: return MDEV_WILDMIDI; case -6: return MDEV_WILDMIDI;
case -7: return MDEV_ADL;
default: default:
#ifdef _WIN32 #ifdef _WIN32
return MDEV_MMAPI; return MDEV_MMAPI;
@ -194,39 +195,43 @@ MIDIDevice *MIDIStreamer::CreateMIDIDevice(EMidiDevice devtype, int samplerate)
selectedDevice = devtype; selectedDevice = devtype;
try try
{ {
switch (devtype) switch (devtype)
{ {
case MDEV_GUS: case MDEV_GUS:
dev = new TimidityMIDIDevice(Args, samplerate); dev = new TimidityMIDIDevice(Args, samplerate);
break; break;
case MDEV_MMAPI: case MDEV_ADL:
#ifdef _WIN32 dev = new ADLMIDIDevice(Args);
break;
case MDEV_MMAPI:
#ifdef _WIN32
dev = CreateWinMIDIDevice(mididevice); dev = CreateWinMIDIDevice(mididevice);
break; break;
#endif #endif
// Intentional fall-through for non-Windows systems. // Intentional fall-through for non-Windows systems.
case MDEV_FLUIDSYNTH: case MDEV_FLUIDSYNTH:
dev = new FluidSynthMIDIDevice(Args, samplerate); dev = new FluidSynthMIDIDevice(Args, samplerate);
break; break;
case MDEV_OPL: case MDEV_OPL:
dev = new OPLMIDIDevice(Args); dev = new OPLMIDIDevice(Args);
break; break;
*/
case MDEV_TIMIDITY: case MDEV_TIMIDITY:
dev = CreateTimidityPPMIDIDevice(Args, samplerate); dev = CreateTimidityPPMIDIDevice(Args, samplerate);
break; break;
case MDEV_WILDMIDI: case MDEV_WILDMIDI:
dev = new WildMIDIDevice(Args, samplerate); dev = new WildMIDIDevice(Args, samplerate);
break; break;
default: default:
break; break;
} }
} }
catch (CRecoverableError &err) catch (CRecoverableError &err)
{ {