diff options
| -rw-r--r-- | engines/agos/drivers/accolade/adlib.cpp | 94 | ||||
| -rw-r--r-- | engines/agos/drivers/accolade/adlib.h | 121 | ||||
| -rw-r--r-- | engines/agos/drivers/accolade/mt32.cpp | 58 | ||||
| -rw-r--r-- | engines/agos/drivers/accolade/mt32.h | 84 | ||||
| -rw-r--r-- | engines/agos/midi.cpp | 4 | 
5 files changed, 209 insertions, 152 deletions
| diff --git a/engines/agos/drivers/accolade/adlib.cpp b/engines/agos/drivers/accolade/adlib.cpp index fce7c9b5d2..2e3ce82605 100644 --- a/engines/agos/drivers/accolade/adlib.cpp +++ b/engines/agos/drivers/accolade/adlib.cpp @@ -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) { diff --git a/engines/agos/drivers/accolade/adlib.h b/engines/agos/drivers/accolade/adlib.h new file mode 100644 index 0000000000..c044d2e05a --- /dev/null +++ b/engines/agos/drivers/accolade/adlib.h @@ -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 diff --git a/engines/agos/drivers/accolade/mt32.cpp b/engines/agos/drivers/accolade/mt32.cpp index 321b95f4ca..0b4ca35fca 100644 --- a/engines/agos/drivers/accolade/mt32.cpp +++ b/engines/agos/drivers/accolade/mt32.cpp @@ -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; diff --git a/engines/agos/drivers/accolade/mt32.h b/engines/agos/drivers/accolade/mt32.h new file mode 100644 index 0000000000..8d74c42e54 --- /dev/null +++ b/engines/agos/drivers/accolade/mt32.h @@ -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 diff --git a/engines/agos/midi.cpp b/engines/agos/midi.cpp index b20f183489..5977b4009e 100644 --- a/engines/agos/midi.cpp +++ b/engines/agos/midi.cpp @@ -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" | 
