AGOS: Fix Accolade MIDI Driver Compilation Breakage

These were broken by the last PR merge which included a cpp file in a
way which will not build reliably. This splits the Accolade MIDI driver
structure definitions into headers allowing these to be included
instead.

Also, minor cleanup by removal of unused header includes.
This commit is contained in:
D G Turner 2019-06-03 19:35:48 +01:00
parent e65bfad30e
commit 3a0ed17e66
5 changed files with 209 additions and 152 deletions

View file

@ -21,16 +21,13 @@
*/
#include "agos/drivers/accolade/mididriver.h"
#include "common/system.h"
#include "common/textconsole.h"
#include "agos/drivers/accolade/adlib.h"
#include "audio/fmopl.h"
#include "audio/mididrv.h"
namespace AGOS {
#define AGOS_ADLIB_VOICES_COUNT 11
#define AGOS_ADLIB_VOICES_MELODIC_COUNT 6
#define AGOS_ADLIB_VOICES_PERCUSSION_START 6
#define AGOS_ADLIB_VOICES_PERCUSSION_COUNT 5
@ -67,18 +64,6 @@ const byte percussionKeyNoteChannelTable[] = {
0x08, 0x08, 0x08, 0x08, 0x0A, 0x0F, 0x0F, 0x08, 0x0F, 0x08
};
struct InstrumentEntry {
byte reg20op1; // Amplitude Modulation / Vibrato / Envelope Generator Type / Keyboard Scaling Rate / Modulator Frequency Multiple
byte reg40op1; // Level Key Scaling / Total Level
byte reg60op1; // Attack Rate / Decay Rate
byte reg80op1; // Sustain Level / Release Rate
byte reg20op2; // Amplitude Modulation / Vibrato / Envelope Generator Type / Keyboard Scaling Rate / Modulator Frequency Multiple
byte reg40op2; // Level Key Scaling / Total Level
byte reg60op2; // Attack Rate / Decay Rate
byte reg80op2; // Sustain Level / Release Rate
byte regC0; // Feedback / Algorithm, bit 0 - set -> both operators in use
};
// hardcoded, dumped from Accolade music system (INSTR.DAT variant)
const uint16 frequencyLookUpTable[12] = {
0x02B2, 0x02DB, 0x0306, 0x0334, 0x0365, 0x0399, 0x03CF,
@ -109,83 +94,6 @@ const uint16 frequencyLookUpTableMusicDrv[12] = {
//
// I have currently not implemented dynamic channel allocation.
class MidiDriver_Accolade_AdLib : public MidiDriver {
public:
MidiDriver_Accolade_AdLib();
virtual ~MidiDriver_Accolade_AdLib();
// MidiDriver
int open();
void close();
void send(uint32 b);
MidiChannel *allocateChannel() { return NULL; }
MidiChannel *getPercussionChannel() { return NULL; }
bool isOpen() const { return _isOpen; }
uint32 getBaseTempo() { return 1000000 / OPL::OPL::kDefaultCallbackFrequency; }
void setVolume(byte volume);
virtual uint32 property(int prop, uint32 param);
bool setupInstruments(byte *instrumentData, uint16 instrumentDataSize, bool useMusicDrvFile);
void setTimerCallback(void *timerParam, Common::TimerManager::TimerProc timerProc);
private:
bool _musicDrvMode;
// from INSTR.DAT/MUSIC.DRV - simple mapping between MIDI channel and MT32 channel
byte _channelMapping[AGOS_MIDI_CHANNEL_COUNT];
// from INSTR.DAT/MUSIC.DRV - simple mapping between MIDI instruments and MT32 instruments
byte _instrumentMapping[AGOS_MIDI_INSTRUMENT_COUNT];
// from INSTR.DAT/MUSIC.DRV - volume adjustment per instrument
signed char _instrumentVolumeAdjust[AGOS_MIDI_INSTRUMENT_COUNT];
// simple mapping between MIDI key notes and MT32 key notes
byte _percussionKeyNoteMapping[AGOS_MIDI_KEYNOTE_COUNT];
// from INSTR.DAT/MUSIC.DRV - adlib instrument data
InstrumentEntry *_instrumentTable;
byte _instrumentCount;
struct ChannelEntry {
const InstrumentEntry *currentInstrumentPtr;
byte currentNote;
byte currentA0hReg;
byte currentB0hReg;
int16 volumeAdjust;
byte velocity;
ChannelEntry() : currentInstrumentPtr(NULL), currentNote(0),
currentA0hReg(0), currentB0hReg(0), volumeAdjust(0), velocity(0) { }
};
byte _percussionReg;
OPL::OPL *_opl;
int _masterVolume;
Common::TimerManager::TimerProc _adlibTimerProc;
void *_adlibTimerParam;
bool _isOpen;
// stores information about all FM voice channels
ChannelEntry _channels[AGOS_ADLIB_VOICES_COUNT];
void onTimer();
void resetAdLib();
void resetAdLibOperatorRegisters(byte baseRegister, byte value);
void resetAdLibFMVoiceChannelRegisters(byte baseRegister, byte value);
void programChange(byte FMvoiceChannel, byte mappedInstrumentNr, byte MIDIinstrumentNr);
void programChangeSetInstrument(byte FMvoiceChannel, byte mappedInstrumentNr, byte MIDIinstrumentNr);
void setRegister(int reg, int value);
void noteOn(byte FMvoiceChannel, byte note, byte velocity);
void noteOnSetVolume(byte FMvoiceChannel, byte operatorReg, byte adjustedVelocity);
void noteOff(byte FMvoiceChannel, byte note, bool dontCheckNote);
};
MidiDriver_Accolade_AdLib::MidiDriver_Accolade_AdLib()
: _masterVolume(15), _opl(0),
_adlibTimerProc(0), _adlibTimerParam(0), _isOpen(false) {

View file

@ -0,0 +1,121 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "agos/drivers/accolade/mididriver.h"
#include "audio/fmopl.h"
#include "audio/mididrv.h"
namespace AGOS {
#define AGOS_ADLIB_VOICES_COUNT 11
struct InstrumentEntry {
byte reg20op1; // Amplitude Modulation / Vibrato / Envelope Generator Type / Keyboard Scaling Rate / Modulator Frequency Multiple
byte reg40op1; // Level Key Scaling / Total Level
byte reg60op1; // Attack Rate / Decay Rate
byte reg80op1; // Sustain Level / Release Rate
byte reg20op2; // Amplitude Modulation / Vibrato / Envelope Generator Type / Keyboard Scaling Rate / Modulator Frequency Multiple
byte reg40op2; // Level Key Scaling / Total Level
byte reg60op2; // Attack Rate / Decay Rate
byte reg80op2; // Sustain Level / Release Rate
byte regC0; // Feedback / Algorithm, bit 0 - set -> both operators in use
};
class MidiDriver_Accolade_AdLib : public MidiDriver {
public:
MidiDriver_Accolade_AdLib();
virtual ~MidiDriver_Accolade_AdLib();
// MidiDriver
int open();
void close();
void send(uint32 b);
MidiChannel *allocateChannel() { return NULL; }
MidiChannel *getPercussionChannel() { return NULL; }
bool isOpen() const { return _isOpen; }
uint32 getBaseTempo() { return 1000000 / OPL::OPL::kDefaultCallbackFrequency; }
void setVolume(byte volume);
virtual uint32 property(int prop, uint32 param);
bool setupInstruments(byte *instrumentData, uint16 instrumentDataSize, bool useMusicDrvFile);
void setTimerCallback(void *timerParam, Common::TimerManager::TimerProc timerProc);
private:
bool _musicDrvMode;
// from INSTR.DAT/MUSIC.DRV - simple mapping between MIDI channel and MT32 channel
byte _channelMapping[AGOS_MIDI_CHANNEL_COUNT];
// from INSTR.DAT/MUSIC.DRV - simple mapping between MIDI instruments and MT32 instruments
byte _instrumentMapping[AGOS_MIDI_INSTRUMENT_COUNT];
// from INSTR.DAT/MUSIC.DRV - volume adjustment per instrument
signed char _instrumentVolumeAdjust[AGOS_MIDI_INSTRUMENT_COUNT];
// simple mapping between MIDI key notes and MT32 key notes
byte _percussionKeyNoteMapping[AGOS_MIDI_KEYNOTE_COUNT];
// from INSTR.DAT/MUSIC.DRV - adlib instrument data
InstrumentEntry *_instrumentTable;
byte _instrumentCount;
struct ChannelEntry {
const InstrumentEntry *currentInstrumentPtr;
byte currentNote;
byte currentA0hReg;
byte currentB0hReg;
int16 volumeAdjust;
byte velocity;
ChannelEntry() : currentInstrumentPtr(NULL), currentNote(0),
currentA0hReg(0), currentB0hReg(0), volumeAdjust(0), velocity(0) { }
};
byte _percussionReg;
OPL::OPL *_opl;
int _masterVolume;
Common::TimerManager::TimerProc _adlibTimerProc;
void *_adlibTimerParam;
bool _isOpen;
// stores information about all FM voice channels
ChannelEntry _channels[AGOS_ADLIB_VOICES_COUNT];
void onTimer();
void resetAdLib();
void resetAdLibOperatorRegisters(byte baseRegister, byte value);
void resetAdLibFMVoiceChannelRegisters(byte baseRegister, byte value);
void programChange(byte FMvoiceChannel, byte mappedInstrumentNr, byte MIDIinstrumentNr);
void programChangeSetInstrument(byte FMvoiceChannel, byte mappedInstrumentNr, byte MIDIinstrumentNr);
void setRegister(int reg, int value);
void noteOn(byte FMvoiceChannel, byte note, byte velocity);
void noteOnSetVolume(byte FMvoiceChannel, byte operatorReg, byte adjustedVelocity);
void noteOff(byte FMvoiceChannel, byte note, bool dontCheckNote);
};
} // End of namespace AGOS

View file

@ -21,70 +21,14 @@
*/
#include "agos/drivers/accolade/mididriver.h"
#include "agos/drivers/accolade/mt32.h"
#include "audio/mididrv.h"
#include "common/config-manager.h"
#include "common/file.h"
#include "common/mutex.h"
#include "common/system.h"
#include "common/textconsole.h"
namespace AGOS {
class MidiDriver_Accolade_MT32 : public MidiDriver {
public:
MidiDriver_Accolade_MT32();
virtual ~MidiDriver_Accolade_MT32();
// MidiDriver
int open();
void close();
bool isOpen() const { return _isOpen; }
void send(uint32 b);
MidiChannel *allocateChannel() {
if (_driver)
return _driver->allocateChannel();
return NULL;
}
MidiChannel *getPercussionChannel() {
if (_driver)
return _driver->getPercussionChannel();
return NULL;
}
void setTimerCallback(void *timer_param, Common::TimerManager::TimerProc timer_proc) {
if (_driver)
_driver->setTimerCallback(timer_param, timer_proc);
}
uint32 getBaseTempo() {
if (_driver) {
return _driver->getBaseTempo();
}
return 1000000 / _baseFreq;
}
protected:
Common::Mutex _mutex;
MidiDriver *_driver;
bool _nativeMT32; // native MT32, may also be our MUNT, or MUNT over MIDI
bool _isOpen;
int _baseFreq;
private:
// simple mapping between MIDI channel and MT32 channel
byte _channelMapping[AGOS_MIDI_CHANNEL_COUNT];
// simple mapping between MIDI instruments and MT32 instruments
byte _instrumentMapping[AGOS_MIDI_INSTRUMENT_COUNT];
public:
bool setupInstruments(byte *instrumentData, uint16 instrumentDataSize, bool useMusicDrvFile);
};
MidiDriver_Accolade_MT32::MidiDriver_Accolade_MT32() {
_driver = NULL;
_isOpen = false;

View file

@ -0,0 +1,84 @@
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "agos/drivers/accolade/mididriver.h"
#include "audio/mididrv.h"
#include "common/mutex.h"
namespace AGOS {
class MidiDriver_Accolade_MT32 : public MidiDriver {
public:
MidiDriver_Accolade_MT32();
virtual ~MidiDriver_Accolade_MT32();
// MidiDriver
int open();
void close();
bool isOpen() const { return _isOpen; }
void send(uint32 b);
MidiChannel *allocateChannel() {
if (_driver)
return _driver->allocateChannel();
return NULL;
}
MidiChannel *getPercussionChannel() {
if (_driver)
return _driver->getPercussionChannel();
return NULL;
}
void setTimerCallback(void *timer_param, Common::TimerManager::TimerProc timer_proc) {
if (_driver)
_driver->setTimerCallback(timer_param, timer_proc);
}
uint32 getBaseTempo() {
if (_driver) {
return _driver->getBaseTempo();
}
return 1000000 / _baseFreq;
}
protected:
Common::Mutex _mutex;
MidiDriver *_driver;
bool _nativeMT32; // native MT32, may also be our MUNT, or MUNT over MIDI
bool _isOpen;
int _baseFreq;
private:
// simple mapping between MIDI channel and MT32 channel
byte _channelMapping[AGOS_MIDI_CHANNEL_COUNT];
// simple mapping between MIDI instruments and MT32 instruments
byte _instrumentMapping[AGOS_MIDI_INSTRUMENT_COUNT];
public:
bool setupInstruments(byte *instrumentData, uint16 instrumentDataSize, bool useMusicDrvFile);
};
} // End of namespace AGOS

View file

@ -28,9 +28,9 @@
#include "agos/agos.h"
#include "agos/midi.h"
#include "agos/drivers/accolade/adlib.cpp"
#include "agos/drivers/accolade/mididriver.h"
#include "agos/drivers/accolade/adlib.h"
#include "agos/drivers/accolade/mt32.h"
#include "agos/drivers/simon1/adlib.h"
// Miles Audio for Simon 2
#include "audio/miles.h"