2007-05-30 21:56:52 +00:00
|
|
|
/* 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.
|
2002-11-21 19:06:42 +00:00
|
|
|
*
|
|
|
|
* 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
|
2005-10-18 01:30:26 +00:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2014-02-18 01:34:17 +00:00
|
|
|
*
|
2002-11-21 19:06:42 +00:00
|
|
|
*/
|
|
|
|
|
2009-01-30 05:25:17 +00:00
|
|
|
#include "common/debug.h"
|
2011-04-24 08:34:27 +00:00
|
|
|
#include "common/error.h"
|
|
|
|
#include "common/scummsys.h"
|
|
|
|
#include "common/system.h"
|
|
|
|
#include "common/textconsole.h"
|
|
|
|
#include "common/types.h"
|
2002-11-21 19:06:42 +00:00
|
|
|
#include "common/util.h"
|
2011-02-09 01:09:01 +00:00
|
|
|
#include "audio/fmopl.h"
|
|
|
|
#include "audio/musicplugin.h"
|
2010-06-21 21:36:36 +00:00
|
|
|
#include "common/translation.h"
|
2003-08-15 16:40:17 +00:00
|
|
|
|
|
|
|
#ifdef DEBUG_ADLIB
|
2012-09-30 17:59:11 +00:00
|
|
|
static int g_tick;
|
2003-08-15 16:40:17 +00:00
|
|
|
#endif
|
2003-08-05 05:21:57 +00:00
|
|
|
|
2012-11-22 01:18:51 +00:00
|
|
|
// Only include OPL3 when we actually have an AdLib emulator builtin, which
|
|
|
|
// supports OPL3.
|
|
|
|
#ifndef DISABLE_DOSBOX_OPL
|
|
|
|
#define ENABLE_OPL3
|
|
|
|
#endif
|
|
|
|
|
2002-11-21 19:06:42 +00:00
|
|
|
class MidiDriver_ADLIB;
|
2010-01-12 21:07:56 +00:00
|
|
|
struct AdLibVoice;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2009-09-14 18:41:21 +00:00
|
|
|
// We use packing for the following two structs, because the code
|
|
|
|
// does simply copy them over from byte streams, without any
|
2010-01-12 21:07:56 +00:00
|
|
|
// serialization. Check AdLibPart::sysEx_customInstrument for an
|
2009-09-14 18:41:21 +00:00
|
|
|
// example of this.
|
|
|
|
//
|
|
|
|
// It might be very well possible, that none of the compilers we support
|
2009-09-14 19:30:46 +00:00
|
|
|
// add any padding bytes at all, since the structs contain only variables
|
|
|
|
// of the type 'byte'. But better safe than sorry.
|
2009-09-14 18:41:21 +00:00
|
|
|
#include "common/pack-start.h"
|
2002-11-21 19:06:42 +00:00
|
|
|
struct InstrumentExtra {
|
|
|
|
byte a, b, c, d, e, f, g, h;
|
2009-09-14 18:41:21 +00:00
|
|
|
} PACKED_STRUCT;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
struct AdLibInstrument {
|
2012-09-30 18:55:30 +00:00
|
|
|
byte modCharacteristic;
|
|
|
|
byte modScalingOutputLevel;
|
|
|
|
byte modAttackDecay;
|
|
|
|
byte modSustainRelease;
|
|
|
|
byte modWaveformSelect;
|
|
|
|
byte carCharacteristic;
|
|
|
|
byte carScalingOutputLevel;
|
|
|
|
byte carAttackDecay;
|
|
|
|
byte carSustainRelease;
|
|
|
|
byte carWaveformSelect;
|
2002-11-21 19:06:42 +00:00
|
|
|
byte feedback;
|
2012-09-30 18:55:30 +00:00
|
|
|
byte flagsA;
|
|
|
|
InstrumentExtra extraA;
|
|
|
|
byte flagsB;
|
|
|
|
InstrumentExtra extraB;
|
2002-11-21 19:06:42 +00:00
|
|
|
byte duration;
|
2009-09-14 18:41:21 +00:00
|
|
|
} PACKED_STRUCT;
|
|
|
|
#include "common/pack-end.h"
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
class AdLibPart : public MidiChannel {
|
2002-11-26 20:14:12 +00:00
|
|
|
friend class MidiDriver_ADLIB;
|
2002-11-26 16:54:58 +00:00
|
|
|
|
2003-05-15 00:05:32 +00:00
|
|
|
protected:
|
2010-01-12 21:07:56 +00:00
|
|
|
// AdLibPart *_prev, *_next;
|
|
|
|
AdLibVoice *_voice;
|
2012-09-30 18:55:30 +00:00
|
|
|
int16 _pitchBend;
|
|
|
|
byte _pitchBendFactor;
|
2012-09-30 19:22:03 +00:00
|
|
|
//int8 _transposeEff;
|
2012-09-30 18:55:30 +00:00
|
|
|
byte _volEff;
|
|
|
|
int8 _detuneEff;
|
|
|
|
byte _modWheel;
|
2002-11-21 19:06:42 +00:00
|
|
|
bool _pedal;
|
|
|
|
byte _program;
|
2012-09-30 18:55:30 +00:00
|
|
|
byte _priEff;
|
2012-09-30 23:51:04 +00:00
|
|
|
byte _pan;
|
2012-09-30 18:55:30 +00:00
|
|
|
AdLibInstrument _partInstr;
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
AdLibInstrument _partInstrSecondary;
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2002-11-26 16:54:58 +00:00
|
|
|
|
2003-05-15 00:05:32 +00:00
|
|
|
protected:
|
2002-11-26 16:54:58 +00:00
|
|
|
MidiDriver_ADLIB *_owner;
|
|
|
|
bool _allocated;
|
|
|
|
byte _channel;
|
|
|
|
|
2003-08-05 23:57:37 +00:00
|
|
|
void init(MidiDriver_ADLIB *owner, byte channel);
|
2002-11-26 16:54:58 +00:00
|
|
|
void allocate() { _allocated = true; }
|
|
|
|
|
|
|
|
public:
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibPart() {
|
2003-05-20 14:17:18 +00:00
|
|
|
_voice = 0;
|
2012-09-30 18:55:30 +00:00
|
|
|
_pitchBend = 0;
|
|
|
|
_pitchBendFactor = 2;
|
2012-09-30 19:22:03 +00:00
|
|
|
//_transposeEff = 0;
|
2012-09-30 18:55:30 +00:00
|
|
|
_volEff = 0;
|
|
|
|
_detuneEff = 0;
|
|
|
|
_modWheel = 0;
|
2003-05-20 14:17:18 +00:00
|
|
|
_pedal = 0;
|
|
|
|
_program = 0;
|
2012-09-30 18:55:30 +00:00
|
|
|
_priEff = 0;
|
2012-09-30 23:51:04 +00:00
|
|
|
_pan = 64;
|
2003-11-08 22:57:42 +00:00
|
|
|
|
2003-05-20 14:17:18 +00:00
|
|
|
_owner = 0;
|
|
|
|
_allocated = false;
|
|
|
|
_channel = 0;
|
2011-05-10 10:27:14 +00:00
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
memset(&_partInstr, 0, sizeof(_partInstr));
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
memset(&_partInstrSecondary, 0, sizeof(_partInstrSecondary));
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2003-05-20 14:17:18 +00:00
|
|
|
}
|
|
|
|
|
2002-12-18 07:53:45 +00:00
|
|
|
MidiDriver *device();
|
2002-12-18 07:48:02 +00:00
|
|
|
byte getNumber() { return _channel; }
|
2002-11-26 16:54:58 +00:00
|
|
|
void release() { _allocated = false; }
|
|
|
|
|
2011-03-21 14:42:17 +00:00
|
|
|
void send(uint32 b);
|
2003-08-08 11:54:24 +00:00
|
|
|
|
2002-11-26 16:54:58 +00:00
|
|
|
// Regular messages
|
2003-08-05 23:57:37 +00:00
|
|
|
void noteOff(byte note);
|
|
|
|
void noteOn(byte note, byte velocity);
|
|
|
|
void programChange(byte program);
|
|
|
|
void pitchBend(int16 bend);
|
2002-11-26 16:54:58 +00:00
|
|
|
|
|
|
|
// Control Change messages
|
2003-08-05 23:57:37 +00:00
|
|
|
void controlChange(byte control, byte value);
|
|
|
|
void modulationWheel(byte value);
|
|
|
|
void volume(byte value);
|
2012-09-30 23:51:04 +00:00
|
|
|
void panPosition(byte value);
|
2003-08-05 23:57:37 +00:00
|
|
|
void pitchBendFactor(byte value);
|
|
|
|
void detune(byte value);
|
|
|
|
void priority(byte value);
|
|
|
|
void sustain(bool value);
|
|
|
|
void effectLevel(byte value) { return; } // Not supported
|
|
|
|
void chorusLevel(byte value) { return; } // Not supported
|
2002-11-26 16:54:58 +00:00
|
|
|
void allNotesOff();
|
|
|
|
|
|
|
|
// SysEx messages
|
2006-02-27 01:59:07 +00:00
|
|
|
void sysEx_customInstrument(uint32 type, const byte *instr);
|
2002-11-21 19:06:42 +00:00
|
|
|
};
|
|
|
|
|
2003-05-15 00:05:32 +00:00
|
|
|
// FYI (Jamieson630)
|
2010-01-12 21:07:56 +00:00
|
|
|
// It is assumed that any invocation to AdLibPercussionChannel
|
2003-05-15 00:05:32 +00:00
|
|
|
// will be done through the MidiChannel base class as opposed to the
|
2010-01-12 21:07:56 +00:00
|
|
|
// AdLibPart base class. If this were NOT the case, all the functions
|
|
|
|
// listed below would need to be virtual in AdLibPart as well as MidiChannel.
|
|
|
|
class AdLibPercussionChannel : public AdLibPart {
|
2003-05-15 00:05:32 +00:00
|
|
|
friend class MidiDriver_ADLIB;
|
|
|
|
|
|
|
|
protected:
|
2003-08-05 23:57:37 +00:00
|
|
|
void init(MidiDriver_ADLIB *owner, byte channel);
|
2003-05-15 00:05:32 +00:00
|
|
|
|
|
|
|
public:
|
2010-01-12 21:07:56 +00:00
|
|
|
~AdLibPercussionChannel();
|
2008-12-19 16:21:27 +00:00
|
|
|
|
2003-08-05 23:57:37 +00:00
|
|
|
void noteOff(byte note);
|
|
|
|
void noteOn(byte note, byte velocity);
|
|
|
|
void programChange(byte program) { }
|
2003-05-15 00:05:32 +00:00
|
|
|
|
|
|
|
// Control Change messages
|
2003-08-05 23:57:37 +00:00
|
|
|
void modulationWheel(byte value) { }
|
|
|
|
void pitchBendFactor(byte value) { }
|
|
|
|
void detune(byte value) { }
|
|
|
|
void priority(byte value) { }
|
|
|
|
void sustain(bool value) { }
|
2003-05-15 00:05:32 +00:00
|
|
|
|
|
|
|
// SysEx messages
|
2008-12-19 16:21:27 +00:00
|
|
|
void sysEx_customInstrument(uint32 type, const byte *instr);
|
|
|
|
|
|
|
|
private:
|
|
|
|
byte _notes[256];
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibInstrument *_customInstruments[256];
|
2003-05-15 00:05:32 +00:00
|
|
|
};
|
|
|
|
|
2002-11-21 19:06:42 +00:00
|
|
|
struct Struct10 {
|
|
|
|
byte active;
|
2012-09-30 18:55:30 +00:00
|
|
|
int16 curVal;
|
2002-11-21 19:06:42 +00:00
|
|
|
int16 count;
|
2012-09-30 18:55:30 +00:00
|
|
|
uint16 maxValue;
|
|
|
|
int16 startValue;
|
2002-11-21 19:06:42 +00:00
|
|
|
byte loop;
|
2012-09-30 18:55:30 +00:00
|
|
|
byte tableA[4];
|
|
|
|
byte tableB[4];
|
2002-11-21 19:06:42 +00:00
|
|
|
int8 unk3;
|
2012-09-30 18:55:30 +00:00
|
|
|
int8 modWheel;
|
|
|
|
int8 modWheelLast;
|
|
|
|
uint16 speedLoMax;
|
|
|
|
uint16 numSteps;
|
|
|
|
int16 speedHi;
|
2002-11-21 19:06:42 +00:00
|
|
|
int8 direction;
|
2012-09-30 18:55:30 +00:00
|
|
|
uint16 speedLo;
|
|
|
|
uint16 speedLoCounter;
|
2002-11-21 19:06:42 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct Struct11 {
|
2012-09-30 18:55:30 +00:00
|
|
|
int16 modifyVal;
|
2002-11-21 19:06:42 +00:00
|
|
|
byte param, flag0x40, flag0x10;
|
|
|
|
Struct10 *s10;
|
|
|
|
};
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
struct AdLibVoice {
|
|
|
|
AdLibPart *_part;
|
|
|
|
AdLibVoice *_next, *_prev;
|
2012-09-30 18:55:30 +00:00
|
|
|
byte _waitForPedal;
|
2002-11-21 19:06:42 +00:00
|
|
|
byte _note;
|
|
|
|
byte _channel;
|
2012-09-30 18:55:30 +00:00
|
|
|
byte _twoChan;
|
|
|
|
byte _vol1, _vol2;
|
2002-11-21 19:06:42 +00:00
|
|
|
int16 _duration;
|
|
|
|
|
|
|
|
Struct10 _s10a;
|
|
|
|
Struct11 _s11a;
|
|
|
|
Struct10 _s10b;
|
|
|
|
Struct11 _s11b;
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
byte _secTwoChan;
|
|
|
|
byte _secVol1, _secVol2;
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibVoice() { memset(this, 0, sizeof(AdLibVoice)); }
|
2002-11-21 19:06:42 +00:00
|
|
|
};
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
struct AdLibSetParams {
|
2012-09-30 19:17:04 +00:00
|
|
|
byte registerBase;
|
|
|
|
byte shift;
|
|
|
|
byte mask;
|
|
|
|
byte inversion;
|
2002-11-21 19:06:42 +00:00
|
|
|
};
|
|
|
|
|
2012-09-30 17:59:11 +00:00
|
|
|
static const byte g_operator1Offsets[9] = {
|
2002-11-21 19:06:42 +00:00
|
|
|
0, 1, 2, 8,
|
|
|
|
9, 10, 16, 17,
|
|
|
|
18
|
|
|
|
};
|
|
|
|
|
2012-09-30 17:59:11 +00:00
|
|
|
static const byte g_operator2Offsets[9] = {
|
2002-11-21 19:06:42 +00:00
|
|
|
3, 4, 5, 11,
|
|
|
|
12, 13, 19, 20,
|
|
|
|
21
|
|
|
|
};
|
|
|
|
|
2012-09-30 17:59:11 +00:00
|
|
|
static const AdLibSetParams g_setParamTable[] = {
|
2002-11-21 19:06:42 +00:00
|
|
|
{0x40, 0, 63, 63}, // level
|
|
|
|
{0xE0, 2, 0, 0}, // unused
|
|
|
|
{0x40, 6, 192, 0}, // level key scaling
|
|
|
|
{0x20, 0, 15, 0}, // modulator frequency multiple
|
|
|
|
{0x60, 4, 240, 15}, // attack rate
|
|
|
|
{0x60, 0, 15, 15}, // decay rate
|
|
|
|
{0x80, 4, 240, 15}, // sustain level
|
|
|
|
{0x80, 0, 15, 15}, // release rate
|
2006-06-06 11:07:03 +00:00
|
|
|
{0xE0, 0, 3, 0}, // waveformSelect select
|
2002-11-21 19:06:42 +00:00
|
|
|
{0x20, 7, 128, 0}, // amp mod
|
|
|
|
{0x20, 6, 64, 0}, // vib
|
|
|
|
{0x20, 5, 32, 0}, // eg typ
|
|
|
|
{0x20, 4, 16, 0}, // ksr
|
|
|
|
{0xC0, 0, 1, 0}, // decay alg
|
|
|
|
{0xC0, 1, 14, 0} // feedback
|
|
|
|
};
|
|
|
|
|
2012-09-30 17:59:11 +00:00
|
|
|
static const byte g_paramTable1[16] = {
|
2002-11-21 19:06:42 +00:00
|
|
|
29, 28, 27, 0,
|
|
|
|
3, 4, 7, 8,
|
|
|
|
13, 16, 17, 20,
|
|
|
|
21, 30, 31, 0
|
|
|
|
};
|
|
|
|
|
2012-09-30 17:59:11 +00:00
|
|
|
static const uint16 g_maxValTable[16] = {
|
2002-11-21 19:06:42 +00:00
|
|
|
0x2FF, 0x1F, 0x7, 0x3F,
|
|
|
|
0x0F, 0x0F, 0x0F, 0x3,
|
|
|
|
0x3F, 0x0F, 0x0F, 0x0F,
|
|
|
|
0x3, 0x3E, 0x1F, 0
|
|
|
|
};
|
|
|
|
|
2012-09-30 17:59:11 +00:00
|
|
|
static const uint16 g_numStepsTable[] = {
|
2002-11-21 19:06:42 +00:00
|
|
|
1, 2, 4, 5,
|
|
|
|
6, 7, 8, 9,
|
|
|
|
10, 12, 14, 16,
|
|
|
|
18, 21, 24, 30,
|
|
|
|
36, 50, 64, 82,
|
|
|
|
100, 136, 160, 192,
|
|
|
|
240, 276, 340, 460,
|
|
|
|
600, 860, 1200, 1600
|
|
|
|
};
|
|
|
|
|
2012-09-30 17:59:11 +00:00
|
|
|
static const byte g_noteFrequencies[] = {
|
2002-11-21 19:06:42 +00:00
|
|
|
90, 91, 92, 92, 93, 94, 94, 95,
|
|
|
|
96, 96, 97, 98, 98, 99, 100, 101,
|
|
|
|
101, 102, 103, 104, 104, 105, 106, 107,
|
|
|
|
107, 108, 109, 110, 111, 111, 112, 113,
|
|
|
|
114, 115, 115, 116, 117, 118, 119, 120,
|
|
|
|
121, 121, 122, 123, 124, 125, 126, 127,
|
|
|
|
128, 129, 130, 131, 132, 132, 133, 134,
|
|
|
|
135, 136, 137, 138, 139, 140, 141, 142,
|
|
|
|
143, 145, 146, 147, 148, 149, 150, 151,
|
|
|
|
152, 153, 154, 155, 157, 158, 159, 160,
|
|
|
|
161, 162, 163, 165, 166, 167, 168, 169,
|
|
|
|
171, 172, 173, 174, 176, 177, 178, 180,
|
|
|
|
181, 182, 184, 185, 186, 188, 189, 190,
|
|
|
|
192, 193, 194, 196, 197, 199, 200, 202,
|
|
|
|
203, 205, 206, 208, 209, 211, 212, 214,
|
|
|
|
215, 217, 218, 220, 222, 223, 225, 226,
|
|
|
|
228, 230, 231, 233, 235, 236, 238, 240,
|
2007-08-20 10:43:07 +00:00
|
|
|
242, 243, 245, 247, 249, 251, 252, 254
|
2002-11-21 19:06:42 +00:00
|
|
|
};
|
|
|
|
|
2012-09-30 17:59:11 +00:00
|
|
|
static const AdLibInstrument g_gmInstruments[128] = {
|
2003-08-08 12:06:14 +00:00
|
|
|
// 0x00
|
2012-09-30 18:25:57 +00:00
|
|
|
{ 0xC2, 0xC5, 0x2B, 0x99, 0x58, 0xC2, 0x1F, 0x1E, 0xC8, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x23 },
|
|
|
|
{ 0x22, 0x53, 0x0E, 0x8A, 0x30, 0x14, 0x06, 0x1D, 0x7A, 0x5C, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x06, 0x00, 0x1C, 0x79, 0x40, 0x02, 0x00, 0x4B, 0x79, 0x58, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC2, 0x89, 0x2A, 0x89, 0x49, 0xC2, 0x16, 0x1C, 0xB8, 0x7C, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x23 },
|
|
|
|
{ 0xC2, 0x17, 0x3D, 0x6A, 0x00, 0xC4, 0x2E, 0x2D, 0xC9, 0x20, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x06, 0x1E, 0x1C, 0x99, 0x00, 0x02, 0x3A, 0x4C, 0x79, 0x00, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x84, 0x40, 0x3B, 0x5A, 0x6F, 0x81, 0x0E, 0x3B, 0x5A, 0x7F, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x84, 0x40, 0x3B, 0x5A, 0x63, 0x81, 0x00, 0x3B, 0x5A, 0x7F, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x8C, 0x80, 0x05, 0xEA, 0x59, 0x82, 0x0A, 0x3C, 0xAA, 0x64, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x85, 0x40, 0x0D, 0xEC, 0x71, 0x84, 0x58, 0x3E, 0xCB, 0x7C, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x8A, 0xC0, 0x0C, 0xDC, 0x50, 0x88, 0x58, 0x3D, 0xDA, 0x7C, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC9, 0x40, 0x2B, 0x78, 0x42, 0xC2, 0x04, 0x4C, 0x8A, 0x7C, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x1A },
|
|
|
|
{ 0x2A, 0x0E, 0x17, 0x89, 0x28, 0x22, 0x0C, 0x1B, 0x09, 0x70, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE7, 0x9B, 0x08, 0x08, 0x26, 0xE2, 0x06, 0x0A, 0x08, 0x70, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC5, 0x05, 0x00, 0xFC, 0x40, 0x84, 0x00, 0x00, 0xDC, 0x50, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x86, 0x40, 0x5D, 0x5A, 0x41, 0x81, 0x00, 0x0B, 0x5A, 0x7F, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
2003-08-08 12:06:14 +00:00
|
|
|
// 0x10
|
2012-09-30 18:25:57 +00:00
|
|
|
{ 0xED, 0x00, 0x7B, 0xC8, 0x40, 0xE1, 0x99, 0x4A, 0xE9, 0x7E, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE8, 0x4F, 0x3A, 0xD7, 0x7C, 0xE2, 0x97, 0x49, 0xF9, 0x7D, 0x05, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE1, 0x10, 0x2F, 0xF7, 0x7D, 0xF3, 0x45, 0x8F, 0xC7, 0x62, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x01, 0x8C, 0x9F, 0xDA, 0x70, 0xE4, 0x50, 0x9F, 0xDA, 0x6A, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x08, 0xD5, 0x9D, 0xA5, 0x45, 0xE2, 0x3F, 0x9F, 0xD6, 0x49, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE5, 0x0F, 0x7D, 0xB8, 0x2E, 0xA2, 0x0F, 0x7C, 0xC7, 0x61, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xF2, 0x2A, 0x9F, 0xDB, 0x01, 0xE1, 0x04, 0x8F, 0xD7, 0x62, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0x88, 0x9C, 0x50, 0x64, 0xE2, 0x18, 0x70, 0xC4, 0x7C, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x02, 0xA3, 0x0D, 0xDA, 0x01, 0xC2, 0x35, 0x5D, 0x58, 0x00, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x18 },
|
|
|
|
{ 0x42, 0x55, 0x3E, 0xEB, 0x24, 0xD4, 0x08, 0x0D, 0xA9, 0x71, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x18 },
|
|
|
|
{ 0xC2, 0x00, 0x2B, 0x17, 0x51, 0xC2, 0x1E, 0x4D, 0x97, 0x7C, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x19 },
|
|
|
|
{ 0xC6, 0x01, 0x2D, 0xA7, 0x44, 0xC2, 0x06, 0x0E, 0xA7, 0x79, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC2, 0x0C, 0x06, 0x06, 0x55, 0xC2, 0x3F, 0x09, 0x86, 0x7D, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0A },
|
|
|
|
{ 0xC2, 0x2E, 0x4F, 0x77, 0x00, 0xC4, 0x08, 0x0E, 0x98, 0x59, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC2, 0x30, 0x4F, 0xCA, 0x01, 0xC4, 0x0D, 0x0E, 0xB8, 0x7F, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC4, 0x29, 0x4F, 0xCA, 0x03, 0xC8, 0x0D, 0x0C, 0xB7, 0x7D, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0B },
|
2003-08-08 12:06:14 +00:00
|
|
|
// 0x20
|
2012-09-30 18:25:57 +00:00
|
|
|
{ 0xC2, 0x40, 0x3C, 0x96, 0x58, 0xC4, 0xDE, 0x0E, 0xC7, 0x7C, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x20 },
|
|
|
|
{ 0x31, 0x13, 0x2D, 0xD7, 0x3C, 0xE2, 0x18, 0x2E, 0xB8, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x22, 0x86, 0x0D, 0xD7, 0x50, 0xE4, 0x18, 0x5E, 0xB8, 0x7C, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x28 },
|
|
|
|
{ 0xF2, 0x0A, 0x0D, 0xD7, 0x40, 0xE4, 0x1F, 0x5E, 0xB8, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xF2, 0x09, 0x4B, 0xD6, 0x48, 0xE4, 0x1F, 0x1C, 0xB8, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x28 },
|
|
|
|
{ 0x62, 0x11, 0x0C, 0xE6, 0x3C, 0xE4, 0x1F, 0x0C, 0xC8, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x12, 0x3D, 0xE6, 0x34, 0xE4, 0x1F, 0x7D, 0xB8, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x13, 0x3D, 0xE6, 0x34, 0xE4, 0x1F, 0x5D, 0xB8, 0x7D, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xA2, 0x40, 0x5D, 0xBA, 0x3F, 0xE2, 0x00, 0x8F, 0xD8, 0x79, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x40, 0x3D, 0xDA, 0x3B, 0xE1, 0x00, 0x7E, 0xD8, 0x7A, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x62, 0x00, 0x6D, 0xFA, 0x5D, 0xE2, 0x00, 0x8F, 0xC8, 0x79, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE1, 0x00, 0x4E, 0xDB, 0x4A, 0xE3, 0x18, 0x6F, 0xE9, 0x7E, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE1, 0x00, 0x4E, 0xDB, 0x66, 0xE2, 0x00, 0x7F, 0xE9, 0x7E, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x02, 0x0F, 0x66, 0xAA, 0x51, 0x02, 0x64, 0x29, 0xF9, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 },
|
|
|
|
{ 0x16, 0x4A, 0x04, 0xBA, 0x39, 0xC2, 0x58, 0x2D, 0xCA, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0x02, 0x00, 0x01, 0x7A, 0x79, 0x02, 0x3F, 0x28, 0xEA, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
2003-08-08 12:06:14 +00:00
|
|
|
// 0x30
|
2012-09-30 18:25:57 +00:00
|
|
|
{ 0x62, 0x53, 0x9C, 0xBA, 0x31, 0x62, 0x5B, 0xAD, 0xC9, 0x55, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xF2, 0x40, 0x6E, 0xDA, 0x49, 0xE2, 0x13, 0x8F, 0xF9, 0x7D, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x40, 0x8F, 0xFA, 0x50, 0xF2, 0x04, 0x7F, 0xFA, 0x7D, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0xA0, 0xCE, 0x5B, 0x02, 0xE2, 0x32, 0x7F, 0xFB, 0x3D, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE6, 0x80, 0x9C, 0x99, 0x42, 0xE2, 0x04, 0x7D, 0x78, 0x60, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xEA, 0xA0, 0xAC, 0x67, 0x02, 0xE2, 0x00, 0x7C, 0x7A, 0x7C, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE7, 0x94, 0xAD, 0xB7, 0x03, 0xE2, 0x00, 0x7C, 0xBA, 0x7C, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC3, 0x3F, 0x4B, 0xE9, 0x7E, 0xC1, 0x3F, 0x9B, 0xF9, 0x7F, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 },
|
|
|
|
{ 0xB2, 0x20, 0xAD, 0xE9, 0x00, 0x62, 0x05, 0x8F, 0xC8, 0x68, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xF2, 0x00, 0x8F, 0xFB, 0x50, 0xF6, 0x47, 0x8F, 0xE9, 0x68, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xF2, 0x00, 0xAF, 0x88, 0x58, 0xF2, 0x54, 0x6E, 0xC9, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xF2, 0x2A, 0x9F, 0x98, 0x01, 0xE2, 0x84, 0x4E, 0x78, 0x6C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x02, 0x9F, 0xB8, 0x48, 0x22, 0x89, 0x9F, 0xE8, 0x7C, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x2A, 0x7F, 0xB8, 0x01, 0xE4, 0x00, 0x0D, 0xC5, 0x7C, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0x28, 0x8E, 0xE8, 0x01, 0xF2, 0x00, 0x4D, 0xD6, 0x7D, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x62, 0x23, 0x8F, 0xEA, 0x00, 0xF2, 0x00, 0x5E, 0xD9, 0x7C, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
2003-08-08 12:06:14 +00:00
|
|
|
// 0x40
|
2012-09-30 18:25:57 +00:00
|
|
|
{ 0xB4, 0x26, 0x6E, 0x98, 0x01, 0x62, 0x00, 0x7D, 0xC8, 0x7D, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x2E, 0x20, 0xD9, 0x01, 0xF2, 0x0F, 0x90, 0xF8, 0x78, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0x28, 0x7E, 0xF8, 0x01, 0xE2, 0x23, 0x8E, 0xE8, 0x7D, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xB8, 0x28, 0x9E, 0x98, 0x01, 0x62, 0x00, 0x3D, 0xC8, 0x7D, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x62, 0x00, 0x8E, 0xC9, 0x3D, 0xE6, 0x00, 0x7E, 0xD8, 0x68, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x00, 0x5F, 0xF9, 0x48, 0xE6, 0x98, 0x8F, 0xF8, 0x7D, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x62, 0x0C, 0x6E, 0xD8, 0x3D, 0x2A, 0x06, 0x7D, 0xD8, 0x58, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0x00, 0x7E, 0x89, 0x38, 0xE6, 0x84, 0x80, 0xF8, 0x68, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0x80, 0x6C, 0xD9, 0x30, 0xE2, 0x00, 0x8D, 0xC8, 0x7C, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x80, 0x88, 0x48, 0x40, 0xE2, 0x0A, 0x7D, 0xA8, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0x00, 0x77, 0xC5, 0x54, 0xE2, 0x00, 0x9E, 0xD7, 0x70, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0x80, 0x86, 0xB9, 0x64, 0xE2, 0x05, 0x9F, 0xD7, 0x78, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x00, 0x68, 0x68, 0x56, 0xE2, 0x08, 0x9B, 0xB3, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0x00, 0xA6, 0x87, 0x41, 0xE2, 0x0A, 0x7E, 0xC9, 0x7C, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0x80, 0x9A, 0xB8, 0x48, 0xE2, 0x00, 0x9E, 0xF9, 0x60, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x80, 0x8E, 0x64, 0x68, 0xE2, 0x28, 0x6F, 0x73, 0x7C, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
2003-08-08 12:06:14 +00:00
|
|
|
// 0x50
|
2012-09-30 18:25:57 +00:00
|
|
|
{ 0xE8, 0x00, 0x7D, 0x99, 0x54, 0xE6, 0x80, 0x80, 0xF8, 0x7C, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE6, 0x00, 0x9F, 0xB9, 0x6D, 0xE1, 0x00, 0x8F, 0xC8, 0x7D, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0x00, 0x09, 0x68, 0x4A, 0xE2, 0x2B, 0x9E, 0xF3, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC4, 0x00, 0x99, 0xE8, 0x3B, 0xE2, 0x25, 0x6F, 0x93, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE6, 0x00, 0x6F, 0xDA, 0x69, 0xE2, 0x05, 0x2F, 0xD8, 0x6A, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xEC, 0x60, 0x9D, 0xC7, 0x00, 0xE2, 0x21, 0x7F, 0xC9, 0x7C, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE3, 0x00, 0x0F, 0xF7, 0x7D, 0xE1, 0x3F, 0x0F, 0xA7, 0x01, 0x0D, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0xA9, 0x0F, 0xA8, 0x02, 0xE2, 0x3C, 0x5F, 0xDA, 0x3C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE8, 0x40, 0x0D, 0x89, 0x7D, 0xE2, 0x17, 0x7E, 0xD9, 0x7C, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE1, 0x00, 0xDF, 0x8A, 0x56, 0xE2, 0x5E, 0xCF, 0xBA, 0x7E, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x00, 0x0B, 0x68, 0x60, 0xE2, 0x01, 0x9E, 0xB8, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xEA, 0x00, 0xAE, 0xAB, 0x49, 0xE2, 0x00, 0xAE, 0xBA, 0x6C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xEB, 0x80, 0x8C, 0xCB, 0x3A, 0xE2, 0x86, 0xAF, 0xCA, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE5, 0x40, 0xDB, 0x3B, 0x3C, 0xE2, 0x80, 0xBE, 0xCA, 0x71, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0x00, 0x9E, 0xAA, 0x3D, 0xE1, 0x43, 0x0F, 0xBA, 0x7E, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE7, 0x40, 0xEC, 0xCA, 0x44, 0xE2, 0x03, 0xBF, 0xBA, 0x66, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
2003-08-08 12:06:14 +00:00
|
|
|
// 0x60
|
2012-09-30 18:25:57 +00:00
|
|
|
{ 0xEA, 0x00, 0x68, 0xB8, 0x48, 0xE2, 0x0A, 0x8E, 0xB8, 0x7C, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x61, 0x00, 0xBE, 0x99, 0x7E, 0xE3, 0x40, 0xCF, 0xCA, 0x7D, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xCD, 0x00, 0x0B, 0x00, 0x48, 0xC2, 0x58, 0x0C, 0x00, 0x7C, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x1C },
|
|
|
|
{ 0xE2, 0x00, 0x0E, 0x00, 0x52, 0xE2, 0x58, 0x5F, 0xD0, 0x7D, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xCC, 0x00, 0x7D, 0xDA, 0x40, 0xC2, 0x00, 0x5E, 0x9B, 0x58, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE9, 0xC0, 0xEE, 0xD8, 0x43, 0xE2, 0x05, 0xDD, 0xAA, 0x70, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xDA, 0x00, 0x8F, 0xAC, 0x4A, 0x22, 0x05, 0x8D, 0x8A, 0x75, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x62, 0x8A, 0xCB, 0x7A, 0x74, 0xE6, 0x56, 0xAF, 0xDB, 0x70, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC2, 0x41, 0xAC, 0x5B, 0x5B, 0xC2, 0x80, 0x0D, 0xCB, 0x7D, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x12 },
|
|
|
|
{ 0x75, 0x00, 0x0E, 0xCB, 0x5A, 0xE2, 0x1E, 0x0A, 0xC9, 0x7D, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 },
|
|
|
|
{ 0x41, 0x00, 0x0E, 0xEA, 0x53, 0xC2, 0x00, 0x08, 0xCA, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 },
|
|
|
|
{ 0xC1, 0x40, 0x0C, 0x59, 0x6A, 0xC2, 0x80, 0x3C, 0xAB, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0D },
|
|
|
|
{ 0x4B, 0x00, 0x0A, 0xF5, 0x61, 0xC2, 0x19, 0x0C, 0xE9, 0x7C, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 },
|
|
|
|
{ 0x62, 0x00, 0x7F, 0xD8, 0x54, 0xEA, 0x00, 0x8F, 0xD8, 0x7D, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE1, 0x00, 0x7F, 0xD9, 0x56, 0xE1, 0x00, 0x8F, 0xD8, 0x7E, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE1, 0x00, 0x7F, 0xD9, 0x56, 0xE1, 0x00, 0x8F, 0xD8, 0x7E, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
2003-08-08 12:06:14 +00:00
|
|
|
// 0x70
|
2012-09-30 18:25:57 +00:00
|
|
|
{ 0xCF, 0x40, 0x09, 0xEA, 0x54, 0xC4, 0x00, 0x0C, 0xDB, 0x64, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0xCF, 0x40, 0x0C, 0xAA, 0x54, 0xC4, 0x00, 0x18, 0xF9, 0x64, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0xC9, 0x0E, 0x88, 0xD9, 0x3E, 0xC2, 0x08, 0x1A, 0xEA, 0x6C, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 },
|
|
|
|
{ 0x03, 0x00, 0x15, 0x00, 0x64, 0x02, 0x00, 0x08, 0x00, 0x7C, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x01, 0x00, 0x47, 0xD7, 0x6C, 0x01, 0x3F, 0x0C, 0xFB, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 },
|
|
|
|
{ 0x00, 0x00, 0x36, 0x67, 0x7C, 0x01, 0x3F, 0x0E, 0xFA, 0x7C, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 },
|
|
|
|
{ 0x02, 0x00, 0x36, 0x68, 0x7C, 0x01, 0x3F, 0x0E, 0xFA, 0x7C, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 },
|
|
|
|
{ 0xCB, 0x00, 0xAF, 0x00, 0x7E, 0xC0, 0x00, 0xC0, 0x06, 0x7F, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0F },
|
|
|
|
{ 0x05, 0x0D, 0x80, 0xA6, 0x7F, 0x0B, 0x38, 0xA9, 0xD8, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 },
|
|
|
|
{ 0x0F, 0x00, 0x90, 0xFA, 0x68, 0x06, 0x00, 0xA7, 0x39, 0x54, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 },
|
|
|
|
{ 0xC9, 0x15, 0xDD, 0xFF, 0x7C, 0x00, 0x00, 0xE7, 0xFC, 0x6C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x38 },
|
|
|
|
{ 0x48, 0x3C, 0x30, 0xF6, 0x03, 0x0A, 0x38, 0x97, 0xE8, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 },
|
|
|
|
{ 0x07, 0x80, 0x0B, 0xC8, 0x65, 0x02, 0x3F, 0x0C, 0xEA, 0x7C, 0x0F, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 },
|
|
|
|
{ 0x00, 0x21, 0x66, 0x40, 0x03, 0x00, 0x3F, 0x47, 0x00, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x08, 0x00, 0x0B, 0x3C, 0x7C, 0x08, 0x3F, 0x06, 0xF3, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x00, 0x3F, 0x4C, 0xFB, 0x00, 0x00, 0x3F, 0x0A, 0xE9, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 }
|
2002-11-21 19:06:42 +00:00
|
|
|
};
|
|
|
|
|
2012-09-30 17:59:11 +00:00
|
|
|
static AdLibInstrument g_gmPercussionInstruments[39] = {
|
2012-09-30 18:25:57 +00:00
|
|
|
{ 0x1A, 0x3F, 0x15, 0x05, 0x7C, 0x02, 0x21, 0x2B, 0xE4, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 },
|
|
|
|
{ 0x11, 0x12, 0x04, 0x07, 0x7C, 0x02, 0x23, 0x0B, 0xE5, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 },
|
|
|
|
{ 0x0A, 0x3F, 0x0B, 0x01, 0x7C, 0x1F, 0x1C, 0x46, 0xD0, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x01 },
|
|
|
|
{ 0x00, 0x3F, 0x0F, 0x00, 0x7C, 0x10, 0x12, 0x07, 0x00, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x0F, 0x3F, 0x0B, 0x00, 0x7C, 0x1F, 0x0F, 0x19, 0xD0, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x00, 0x3F, 0x1F, 0x00, 0x7E, 0x1F, 0x16, 0x07, 0x00, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0x12, 0x3F, 0x05, 0x06, 0x7C, 0x03, 0x1F, 0x4A, 0xD9, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0xCF, 0x7F, 0x08, 0xFF, 0x7E, 0x00, 0xC7, 0x2D, 0xF7, 0x73, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x12, 0x3F, 0x05, 0x06, 0x7C, 0x43, 0x21, 0x0C, 0xE9, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0xCF, 0x7F, 0x08, 0xCF, 0x7E, 0x00, 0x45, 0x2A, 0xF8, 0x4B, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0C },
|
|
|
|
{ 0x12, 0x3F, 0x06, 0x17, 0x7C, 0x03, 0x27, 0x0B, 0xE9, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0xCF, 0x7F, 0x08, 0xCD, 0x7E, 0x00, 0x40, 0x1A, 0x69, 0x63, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0C },
|
|
|
|
{ 0x13, 0x3F, 0x05, 0x06, 0x7C, 0x03, 0x17, 0x0A, 0xD9, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0x15, 0x3F, 0x05, 0x06, 0x7C, 0x03, 0x21, 0x0C, 0xE9, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0xCF, 0x3F, 0x2B, 0xFB, 0x7E, 0xC0, 0x1E, 0x1A, 0xCA, 0x7F, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 },
|
|
|
|
{ 0x17, 0x3F, 0x04, 0x09, 0x7C, 0x03, 0x22, 0x0D, 0xE9, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0xCF, 0x3F, 0x0F, 0x5E, 0x7C, 0xC6, 0x13, 0x00, 0xCA, 0x7F, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0xCF, 0x3F, 0x7E, 0x9D, 0x7C, 0xC8, 0xC0, 0x0A, 0xBA, 0x74, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 },
|
|
|
|
{ 0xCF, 0x3F, 0x4D, 0x9F, 0x7C, 0xC6, 0x00, 0x08, 0xDA, 0x5B, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 },
|
|
|
|
{ 0xCF, 0x3F, 0x5D, 0xAA, 0x7A, 0xC0, 0xA4, 0x67, 0x99, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0xCF, 0x3F, 0x4A, 0xFD, 0x7C, 0xCF, 0x00, 0x59, 0xEA, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x0F, 0x18, 0x0A, 0xFA, 0x57, 0x06, 0x07, 0x06, 0x39, 0x7C, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0xCF, 0x3F, 0x2B, 0xFC, 0x7C, 0xCC, 0xC6, 0x0B, 0xEA, 0x7F, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 },
|
|
|
|
{ 0x05, 0x1A, 0x04, 0x00, 0x7C, 0x12, 0x10, 0x0C, 0xEA, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 },
|
|
|
|
{ 0x04, 0x19, 0x04, 0x00, 0x7C, 0x12, 0x10, 0x2C, 0xEA, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 },
|
|
|
|
{ 0x04, 0x0A, 0x04, 0x00, 0x6C, 0x01, 0x07, 0x0D, 0xFA, 0x74, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 },
|
|
|
|
{ 0x15, 0x14, 0x05, 0x00, 0x7D, 0x01, 0x07, 0x5C, 0xE9, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 },
|
|
|
|
{ 0x10, 0x10, 0x05, 0x08, 0x7C, 0x01, 0x08, 0x0D, 0xEA, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 },
|
|
|
|
{ 0x11, 0x00, 0x06, 0x87, 0x7F, 0x02, 0x40, 0x09, 0x59, 0x68, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x08 },
|
|
|
|
{ 0x13, 0x26, 0x04, 0x6A, 0x7F, 0x01, 0x00, 0x08, 0x5A, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x08 },
|
|
|
|
{ 0xCF, 0x4E, 0x0C, 0xAA, 0x50, 0xC4, 0x00, 0x18, 0xF9, 0x54, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0xCF, 0x4E, 0x0C, 0xAA, 0x50, 0xC3, 0x00, 0x18, 0xF8, 0x54, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0xCB, 0x3F, 0x8F, 0x00, 0x7E, 0xC5, 0x00, 0x98, 0xD6, 0x5F, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0D },
|
|
|
|
{ 0x0C, 0x18, 0x87, 0xB3, 0x7F, 0x19, 0x10, 0x55, 0x75, 0x7C, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x05, 0x11, 0x15, 0x00, 0x64, 0x02, 0x08, 0x08, 0x00, 0x5C, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x04, 0x08, 0x15, 0x00, 0x48, 0x01, 0x08, 0x08, 0x00, 0x60, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0xDA, 0x00, 0x53, 0x30, 0x68, 0x07, 0x1E, 0x49, 0xC4, 0x7E, 0x03, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x1C, 0x00, 0x07, 0xBC, 0x6C, 0x0C, 0x14, 0x0B, 0x6A, 0x7E, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0x0A, 0x0E, 0x7F, 0x00, 0x7D, 0x13, 0x20, 0x28, 0x03, 0x7C, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 }
|
2003-05-15 00:05:32 +00:00
|
|
|
};
|
|
|
|
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
static const AdLibInstrument g_gmInstrumentsOPL3[128][2] = {
|
|
|
|
{ { 0xC2, 0xC2, 0x0A, 0x6B, 0xA0, 0xC2, 0x08, 0x0D, 0x88, 0xC8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x23 },
|
|
|
|
{ 0x02, 0x00, 0x0C, 0x78, 0x61, 0x04, 0x4C, 0x0B, 0x9A, 0xC8, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x23 } },
|
|
|
|
{ { 0x22, 0x53, 0x0E, 0x8A, 0x60, 0x14, 0x06, 0x1D, 0x7A, 0xB8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x22, 0x5A, 0x0E, 0x8A, 0x40, 0x14, 0x2F, 0x0E, 0x7A, 0x88, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x06, 0x00, 0x1C, 0x79, 0x70, 0x02, 0x00, 0x4B, 0x79, 0xA8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x06, 0x00, 0x1A, 0x79, 0x60, 0x02, 0x00, 0x4C, 0xA9, 0xC8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xC2, 0x80, 0x0B, 0x89, 0x90, 0xC2, 0x06, 0x1B, 0xA8, 0xB0, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x23 },
|
|
|
|
{ 0x04, 0x28, 0x5D, 0xB8, 0x01, 0x02, 0x00, 0x3C, 0x70, 0x88, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xC2, 0x17, 0x3D, 0x6A, 0x00, 0xC4, 0x2E, 0x2D, 0xC9, 0x40, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC2, 0x17, 0x3D, 0x6A, 0x00, 0xC4, 0x2E, 0x2D, 0xC9, 0x40, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x06, 0x1E, 0x1C, 0x99, 0x00, 0x02, 0x3A, 0x4C, 0x79, 0x00, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x06, 0x1E, 0x1C, 0x99, 0x00, 0x02, 0x3A, 0x4C, 0x79, 0x00, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x84, 0x40, 0x3B, 0x5A, 0x63, 0x81, 0x00, 0x3B, 0x5A, 0xD3, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x87, 0x40, 0x3A, 0x5A, 0x94, 0x82, 0x04, 0x3D, 0x59, 0xAC, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x84, 0x40, 0x3B, 0x5A, 0xC3, 0x81, 0x00, 0x3B, 0x5A, 0xFB, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x84, 0x40, 0x3B, 0x5A, 0xC3, 0x81, 0x00, 0x3B, 0x5A, 0xFB, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x8C, 0x80, 0x05, 0xEA, 0xA9, 0x82, 0x04, 0x3D, 0xAA, 0xB0, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x8C, 0x80, 0x06, 0x98, 0xA9, 0x86, 0x10, 0x36, 0x7A, 0xFD, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x85, 0x40, 0x0D, 0xEC, 0xE1, 0x84, 0x58, 0x3E, 0xCB, 0xF8, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x84, 0x40, 0x0D, 0xEB, 0xE0, 0x84, 0x48, 0x3E, 0xCA, 0xC0, 0x05, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x8A, 0xC0, 0x0C, 0xDC, 0xA0, 0x88, 0x58, 0x3D, 0xDA, 0xF8, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x8A, 0xC0, 0x0C, 0xDC, 0xA0, 0x88, 0x58, 0x3D, 0xDA, 0xF8, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xC9, 0x40, 0x2B, 0x78, 0x8A, 0xC2, 0x0A, 0x4C, 0x8A, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x1A },
|
|
|
|
{ 0xCA, 0x40, 0x47, 0xCA, 0xB4, 0xC2, 0x00, 0x57, 0x8A, 0xB8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x1A } },
|
|
|
|
{ { 0x2A, 0x0E, 0x17, 0x89, 0x50, 0x22, 0x0C, 0x1B, 0x09, 0xE0, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x2A, 0x1A, 0x19, 0x8A, 0x00, 0x22, 0x38, 0x0B, 0x0A, 0x00, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE7, 0x9B, 0x08, 0x08, 0x4A, 0xE2, 0x06, 0x0A, 0x08, 0xE0, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE7, 0x9B, 0x08, 0x08, 0x4A, 0xE2, 0x2F, 0x0A, 0x08, 0x68, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xC5, 0x0A, 0x05, 0xDC, 0xB8, 0x84, 0x06, 0x00, 0xEC, 0xC0, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x09, 0x10, 0x04, 0x5B, 0xA5, 0x02, 0x08, 0x00, 0xEC, 0x70, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x86, 0x40, 0x5D, 0x5A, 0x81, 0x81, 0x00, 0x0B, 0x5A, 0xFB, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x86, 0x40, 0x5D, 0x5A, 0x81, 0x81, 0x00, 0x0B, 0x5A, 0xFB, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xED, 0x0F, 0x5B, 0xC8, 0xC8, 0xE2, 0x9F, 0x4A, 0xE9, 0xF9, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE6, 0x40, 0x0A, 0xA7, 0x64, 0xE2, 0x8B, 0x6A, 0x79, 0xB1, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE8, 0x4F, 0x3A, 0xD7, 0xF8, 0xE2, 0x97, 0x49, 0xF9, 0xF9, 0x05, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC9, 0x02, 0x16, 0x9A, 0xAB, 0xC4, 0x15, 0x46, 0xBA, 0xF8, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE1, 0x08, 0x2F, 0xF7, 0xE1, 0xF3, 0x42, 0x8F, 0xC7, 0xC2, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE3, 0x00, 0x2D, 0xF7, 0xC1, 0xE4, 0x40, 0x7F, 0xC7, 0xD2, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x01, 0x8C, 0x9F, 0xDA, 0xE8, 0xE4, 0x50, 0x9F, 0xDA, 0xF2, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x02, 0x80, 0x9F, 0xDA, 0x00, 0xE3, 0x50, 0x9F, 0xD9, 0xFA, 0x03, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x08, 0xD5, 0x9D, 0xA5, 0x89, 0xE2, 0x3F, 0x9F, 0xD6, 0x91, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x08, 0xD5, 0x9D, 0xA5, 0x89, 0xE2, 0x3F, 0x9F, 0xD6, 0x91, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE5, 0x0F, 0x7D, 0xB8, 0x5A, 0xA2, 0x0C, 0x7C, 0xC7, 0xC1, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x06, 0x4C, 0xAC, 0x56, 0x31, 0x02, 0x08, 0x8D, 0x46, 0xDC, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xF2, 0x2A, 0x9F, 0xDB, 0x01, 0xE1, 0x04, 0x8F, 0xD7, 0xC2, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xF2, 0x00, 0x9F, 0xDB, 0xA9, 0xE1, 0x00, 0x8F, 0xD7, 0xBA, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE4, 0x88, 0x9C, 0x50, 0xC8, 0xE2, 0x18, 0x70, 0xC4, 0xF8, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE6, 0x00, 0x9C, 0x50, 0xB0, 0xE4, 0x00, 0x70, 0xC4, 0xA0, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x02, 0xA3, 0x0D, 0xDA, 0x01, 0xC2, 0x35, 0x5D, 0x58, 0x00, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x18 },
|
|
|
|
{ 0x02, 0xA3, 0x0D, 0xDA, 0x01, 0xC2, 0x35, 0x5D, 0x58, 0x00, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x18 } },
|
|
|
|
{ { 0x42, 0x53, 0x3E, 0xEB, 0x48, 0xD4, 0x05, 0x1D, 0xA9, 0xC9, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x18 },
|
|
|
|
{ 0x42, 0x54, 0x6F, 0xEB, 0x61, 0xD4, 0x02, 0x2E, 0xA9, 0xC8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x18 } },
|
|
|
|
{ { 0xC2, 0x00, 0x59, 0x17, 0xB1, 0xC2, 0x1E, 0x6D, 0x98, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x19 },
|
|
|
|
{ 0xC2, 0x00, 0x08, 0xB3, 0x99, 0xC2, 0x06, 0x2B, 0x58, 0xFA, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x19 } },
|
|
|
|
{ { 0xC6, 0x01, 0x2D, 0xA7, 0x88, 0xC2, 0x08, 0x0E, 0xA7, 0xC1, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC4, 0x00, 0x2D, 0xA7, 0x91, 0xC2, 0x02, 0x0E, 0xA7, 0xD1, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xC2, 0x0C, 0x06, 0x06, 0xA9, 0xC2, 0x3F, 0x08, 0xB8, 0xF9, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0A },
|
|
|
|
{ 0xC1, 0x00, 0x68, 0x50, 0xB8, 0xC2, 0x00, 0x48, 0x84, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0A } },
|
|
|
|
{ { 0xC2, 0x2E, 0x4F, 0x77, 0x00, 0xC4, 0x08, 0x0E, 0x98, 0xB1, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC2, 0x2F, 0x6F, 0x79, 0x00, 0xC8, 0x0F, 0x5E, 0x98, 0xB9, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xC2, 0x30, 0x4F, 0xCA, 0x01, 0xC4, 0x0D, 0x0E, 0xB8, 0xFB, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC2, 0x30, 0x4F, 0xCA, 0x01, 0xC4, 0x0D, 0x0E, 0xB8, 0xFB, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xC4, 0x29, 0x4F, 0xCA, 0x03, 0xC8, 0x0D, 0x0C, 0xB7, 0xF9, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0B },
|
|
|
|
{ 0xC4, 0x29, 0x4F, 0xCA, 0x03, 0xC8, 0x0D, 0x0C, 0xB7, 0xF9, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0B } },
|
|
|
|
{ { 0xC2, 0x41, 0x3D, 0x96, 0x88, 0xC4, 0xCA, 0x0E, 0xC7, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x20 },
|
|
|
|
{ 0xC2, 0x04, 0x58, 0xC9, 0x90, 0xC2, 0x94, 0x2C, 0xB9, 0xF0, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x20 } },
|
|
|
|
{ { 0x31, 0x13, 0x2D, 0xD7, 0x78, 0xE2, 0x18, 0x2E, 0xB8, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x31, 0x13, 0x2D, 0xD7, 0x78, 0xE2, 0x18, 0x2E, 0xB8, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x22, 0x86, 0x0D, 0xD7, 0xA0, 0xE4, 0x18, 0x5E, 0xB8, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x28 },
|
|
|
|
{ 0x22, 0x86, 0x0D, 0xD7, 0xA0, 0xE4, 0x18, 0x5E, 0xB8, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x28 } },
|
|
|
|
{ { 0xF2, 0x0A, 0x0D, 0xD7, 0x80, 0xE4, 0x1F, 0x5E, 0xB8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xD2, 0x06, 0x9A, 0xD7, 0xA0, 0xC2, 0x1F, 0x59, 0xB8, 0xF8, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xF2, 0x09, 0x4B, 0xD6, 0x90, 0xE4, 0x1F, 0x1C, 0xB8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x28 },
|
|
|
|
{ 0xF2, 0x09, 0x4B, 0xD6, 0x90, 0xE4, 0x1F, 0x1C, 0xB8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x28 } },
|
|
|
|
{ { 0x62, 0x11, 0x0C, 0xE6, 0x78, 0xE4, 0x1F, 0x0C, 0xC8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x62, 0x11, 0x0C, 0xE6, 0x78, 0xE4, 0x1F, 0x0C, 0xC8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE2, 0x12, 0x3D, 0xE6, 0x68, 0xE4, 0x1F, 0x7D, 0xB8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x12, 0x3D, 0xE6, 0x68, 0xE4, 0x1F, 0x7D, 0xB8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE2, 0x13, 0x3D, 0xE6, 0x68, 0xE4, 0x1F, 0x5D, 0xB8, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x13, 0x3D, 0xE6, 0x68, 0xE4, 0x1F, 0x5D, 0xB8, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xA2, 0x40, 0x5D, 0xBA, 0x7B, 0xE2, 0x00, 0x8F, 0xD8, 0xF1, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xA2, 0x40, 0x5D, 0xBA, 0x7B, 0xE2, 0x00, 0x8F, 0xD8, 0xF1, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE2, 0x40, 0x3D, 0xDA, 0x73, 0xE1, 0x00, 0x7E, 0xD8, 0xF2, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x40, 0x3D, 0xDA, 0x73, 0xE1, 0x00, 0x7E, 0xD8, 0xF2, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x62, 0x00, 0x6D, 0xFA, 0xB9, 0xE2, 0x00, 0x8F, 0xC8, 0xF1, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x62, 0x00, 0x6D, 0xFA, 0xB9, 0xE2, 0x00, 0x8F, 0xC8, 0xF1, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE1, 0x00, 0x4E, 0xDB, 0x92, 0xE3, 0x18, 0x6F, 0xE9, 0xFA, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE1, 0x00, 0x4E, 0xDB, 0xCA, 0xE2, 0x00, 0x6F, 0xE9, 0xFA, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE1, 0x00, 0x4E, 0xDB, 0xCA, 0xE2, 0x00, 0x7F, 0xE9, 0xFA, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE1, 0x00, 0x4E, 0xDB, 0xCA, 0xE2, 0x00, 0x7F, 0xE9, 0xFA, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x02, 0x0F, 0x66, 0xAA, 0xA1, 0x02, 0x64, 0x29, 0xF9, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 },
|
|
|
|
{ 0x02, 0x00, 0x65, 0xAA, 0xF1, 0x02, 0x4A, 0x28, 0xF9, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 } },
|
|
|
|
{ { 0x16, 0x4A, 0x04, 0xBA, 0x71, 0xC2, 0x48, 0x2E, 0xCA, 0xF0, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0x14, 0xC0, 0x66, 0x08, 0x90, 0xC2, 0x48, 0x2C, 0x0A, 0xA0, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } },
|
|
|
|
{ { 0x02, 0x0A, 0x01, 0x7A, 0xB1, 0x02, 0x12, 0x2A, 0xEA, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x02, 0x06, 0x75, 0x05, 0xB1, 0x01, 0x3F, 0x28, 0xEA, 0xF9, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x16 } },
|
|
|
|
{ { 0x62, 0x53, 0x9C, 0xBA, 0x61, 0x62, 0x5A, 0xAD, 0xCA, 0xC1, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xF2, 0x40, 0x9F, 0x8A, 0x98, 0xE2, 0x11, 0x7F, 0xB8, 0xFA, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xF2, 0x40, 0x6E, 0xDA, 0x91, 0xE2, 0x13, 0x8F, 0xF9, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xF2, 0x40, 0x6E, 0xDA, 0x91, 0xE2, 0x13, 0x8F, 0xF9, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE2, 0x40, 0x8F, 0xFA, 0xA0, 0xF2, 0x04, 0x7F, 0xFA, 0xF9, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x40, 0x8F, 0xFA, 0xA0, 0xF2, 0x04, 0x7F, 0xFA, 0xF9, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE4, 0xA0, 0xCE, 0x5B, 0x02, 0xE2, 0x32, 0x7F, 0xFB, 0x79, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0xA0, 0xCE, 0x5B, 0x02, 0xE2, 0x32, 0x7F, 0xFB, 0x79, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE6, 0x80, 0x9C, 0x99, 0x82, 0xE2, 0x04, 0x8D, 0x78, 0xC0, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE0, 0x44, 0x8A, 0xA9, 0x5B, 0xE1, 0x06, 0x8D, 0x79, 0xBA, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE8, 0xA0, 0xAC, 0x67, 0x02, 0xE2, 0x06, 0x7C, 0x7A, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xEA, 0xA0, 0xAC, 0x67, 0x02, 0xE2, 0x00, 0x7C, 0x7A, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE7, 0x94, 0xAD, 0xB7, 0x03, 0xE2, 0x00, 0x7C, 0xBA, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE7, 0x94, 0xAD, 0xB7, 0x03, 0xE2, 0x00, 0x7C, 0xBA, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xC3, 0x3F, 0x4B, 0xE9, 0xFA, 0xC1, 0x3F, 0x9B, 0xF9, 0xFB, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 },
|
|
|
|
{ 0xC3, 0x3F, 0x4B, 0xE9, 0xFA, 0xC1, 0x3F, 0x9B, 0xF9, 0xFB, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 } },
|
|
|
|
{ { 0xB2, 0x20, 0xAD, 0xE9, 0x00, 0x62, 0x05, 0x8F, 0xC8, 0xD0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xB2, 0x25, 0xAD, 0xE9, 0x00, 0x62, 0x00, 0x8F, 0xC8, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xF2, 0x02, 0xAF, 0xFB, 0x90, 0xF6, 0x54, 0x8F, 0xE9, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x00, 0x9F, 0xFA, 0xB0, 0xF2, 0x58, 0x7F, 0xEA, 0xF8, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xF2, 0x00, 0xAF, 0x88, 0xA8, 0xF2, 0x46, 0x6E, 0xC9, 0xE0, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xD2, 0x00, 0x7B, 0x88, 0xA8, 0xD2, 0x4C, 0x69, 0xE9, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xF2, 0x2A, 0x9F, 0x98, 0x01, 0xE2, 0x8F, 0x4E, 0x78, 0xC0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xD2, 0x02, 0x85, 0x89, 0xC8, 0xD2, 0x94, 0x77, 0x49, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE2, 0x02, 0x9F, 0xB8, 0x90, 0x22, 0x8A, 0x9F, 0xE8, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC2, 0x00, 0x86, 0xB8, 0x98, 0x02, 0x8F, 0x89, 0xE8, 0xF9, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE2, 0x2A, 0x7F, 0xB8, 0x01, 0xE4, 0x00, 0x0D, 0xC5, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x2A, 0x7F, 0xB8, 0x01, 0xE4, 0x00, 0x0D, 0xC5, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE4, 0x28, 0x8E, 0xE8, 0x01, 0xF2, 0x00, 0x4D, 0xD6, 0xF9, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0x28, 0x8E, 0xE8, 0x01, 0xF2, 0x00, 0x4D, 0xD6, 0xF9, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x62, 0x23, 0x8F, 0xEA, 0x00, 0xF2, 0x00, 0x5E, 0xD9, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x62, 0x23, 0x8F, 0xEA, 0x00, 0xF2, 0x00, 0x5E, 0xD9, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xB4, 0x26, 0x6E, 0x98, 0x01, 0x62, 0x00, 0x7D, 0xC8, 0xF9, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xB4, 0x26, 0x6E, 0x98, 0x01, 0x62, 0x00, 0x7D, 0xC8, 0xF9, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE2, 0x2E, 0x20, 0xD9, 0x01, 0xF2, 0x1A, 0x90, 0xF8, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xD2, 0x10, 0x69, 0x18, 0xCF, 0xD4, 0x14, 0x5B, 0x04, 0xFD, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE4, 0x28, 0x7E, 0xF8, 0x01, 0xE2, 0x23, 0x8E, 0xE8, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0x28, 0x7E, 0xF8, 0x01, 0xE2, 0x23, 0x8E, 0xE8, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xB8, 0x28, 0x9E, 0x98, 0x01, 0x62, 0x00, 0x3D, 0xC8, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xB8, 0x28, 0x9E, 0x98, 0x01, 0x62, 0x00, 0x3D, 0xC8, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x62, 0x00, 0x8E, 0xC9, 0x79, 0xE6, 0x00, 0x7E, 0xD8, 0xD0, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x62, 0x00, 0x8E, 0xC9, 0x79, 0xE6, 0x00, 0x7E, 0xD8, 0xD0, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE2, 0x00, 0x5F, 0xF9, 0x88, 0xE4, 0x9E, 0x8F, 0xF8, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC2, 0x00, 0x97, 0xF9, 0x90, 0xC9, 0x80, 0x69, 0x98, 0xA0, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x62, 0x0C, 0x6E, 0xD8, 0x79, 0x2A, 0x09, 0x7D, 0xD8, 0xC0, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x02, 0x04, 0x8A, 0xD8, 0x80, 0x0C, 0x12, 0x85, 0xD8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE4, 0x00, 0x7E, 0x89, 0x70, 0xE6, 0x8F, 0x80, 0xF8, 0xF0, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC4, 0x00, 0x67, 0x59, 0x70, 0xC6, 0x8A, 0x77, 0xA8, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE4, 0x80, 0x6C, 0xD9, 0x60, 0xE2, 0x00, 0x8D, 0xC8, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0x80, 0x6C, 0xD9, 0x60, 0xE2, 0x00, 0x8D, 0xC8, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE2, 0x80, 0x88, 0x48, 0x98, 0xE2, 0x1E, 0x8E, 0xC9, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xF2, 0x40, 0xA8, 0xB9, 0x80, 0xE2, 0x0C, 0x89, 0x09, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE4, 0x00, 0x77, 0xC5, 0xA8, 0xE2, 0x00, 0x9E, 0xD7, 0xE0, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0x00, 0x77, 0xC5, 0xA8, 0xE2, 0x00, 0x9E, 0xD7, 0xE0, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE4, 0x80, 0x86, 0xB9, 0xA8, 0xE2, 0x14, 0x9F, 0xD7, 0xB0, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC2, 0x80, 0x94, 0x09, 0x78, 0xC2, 0x00, 0x97, 0x97, 0xF8, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE2, 0x00, 0x68, 0x68, 0xAA, 0xE2, 0x0A, 0x9B, 0xB3, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC2, 0x00, 0x86, 0x68, 0xA0, 0xC2, 0x00, 0x77, 0x47, 0xE0, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE4, 0x00, 0xA6, 0x87, 0x81, 0xE2, 0x0A, 0x7E, 0xC9, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x00, 0x89, 0x40, 0x79, 0xE2, 0x00, 0x7E, 0xC9, 0x90, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE4, 0x80, 0xAA, 0xB8, 0x90, 0xE2, 0x00, 0x9E, 0xF9, 0xC0, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE6, 0x80, 0x9D, 0xB8, 0x51, 0xE2, 0x00, 0x9E, 0xF9, 0xA0, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE2, 0x80, 0x8E, 0x64, 0xD0, 0xE2, 0x28, 0x6F, 0x73, 0xF8, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x80, 0x8E, 0x64, 0xD0, 0xE2, 0x28, 0x6F, 0x73, 0xF8, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE8, 0x00, 0x7D, 0x99, 0xA8, 0xE6, 0x80, 0x80, 0xF8, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE8, 0x00, 0x7D, 0x99, 0xA8, 0xE6, 0x80, 0x80, 0xF8, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE6, 0x00, 0x9F, 0xB9, 0xD9, 0xE1, 0x00, 0x8F, 0xC8, 0xF9, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE6, 0x00, 0x9F, 0xB9, 0xD9, 0xE1, 0x00, 0x8F, 0xC8, 0xF9, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE4, 0x00, 0x09, 0x68, 0x92, 0xE2, 0x2B, 0x9E, 0xF3, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0x00, 0x09, 0x68, 0x92, 0xE2, 0x2B, 0x9E, 0xF3, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xC4, 0x00, 0x99, 0xE8, 0x73, 0xE2, 0x25, 0x6F, 0x93, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xC4, 0x00, 0x99, 0xE8, 0x73, 0xE2, 0x25, 0x6F, 0x93, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE6, 0x00, 0x6F, 0xDA, 0xC9, 0xE2, 0x05, 0x2F, 0xD8, 0xAA, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x00, 0x4F, 0xDA, 0xC8, 0xE2, 0x00, 0x0F, 0xD8, 0xD0, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xEC, 0x60, 0x9D, 0xC7, 0x00, 0xE2, 0x21, 0x7F, 0xC9, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xEC, 0x60, 0x9D, 0xC7, 0x00, 0xE2, 0x21, 0x7F, 0xC9, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE3, 0x00, 0x0F, 0xF7, 0xF9, 0xE1, 0x3F, 0x0F, 0xA7, 0x01, 0x0D, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE3, 0x00, 0x0F, 0xF7, 0xF9, 0xE1, 0x3F, 0x0F, 0xA7, 0x01, 0x0D, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE4, 0xA9, 0x0F, 0xA8, 0x02, 0xE2, 0x3C, 0x5F, 0xDA, 0x78, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0xA9, 0x0F, 0xA8, 0x02, 0xE2, 0x3C, 0x5F, 0xDA, 0x78, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE8, 0x40, 0x0D, 0x89, 0xF9, 0xE2, 0x17, 0x7E, 0xD9, 0xF8, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE8, 0x40, 0x0D, 0x89, 0xF9, 0xE2, 0x17, 0x7E, 0xD9, 0xF8, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE1, 0x00, 0xDF, 0x8A, 0xAA, 0xE2, 0x5E, 0xCF, 0xBA, 0xFA, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE1, 0x00, 0xDF, 0x8A, 0xAA, 0xE2, 0x5E, 0xCF, 0xBA, 0xFA, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE2, 0x00, 0x0B, 0x68, 0xC0, 0xE2, 0x01, 0x9E, 0xB8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x00, 0x0B, 0x68, 0xC0, 0xE2, 0x01, 0x9E, 0xB8, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xEA, 0x00, 0xAE, 0xAB, 0x91, 0xE2, 0x00, 0xAE, 0xBA, 0xD8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xEA, 0x00, 0xAE, 0xAB, 0x91, 0xE2, 0x00, 0xAE, 0xBA, 0xD8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xEB, 0x80, 0x8C, 0xCB, 0x72, 0xE2, 0x86, 0xAF, 0xCA, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xEB, 0xC3, 0x9C, 0xCB, 0xA2, 0xE2, 0x4C, 0xAE, 0xCA, 0xFA, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE5, 0x40, 0xDB, 0x3B, 0x78, 0xE2, 0x80, 0xBE, 0xCA, 0xE1, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x80, 0x8E, 0xCB, 0xC0, 0xE2, 0x90, 0xAE, 0xCA, 0xFB, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE4, 0x00, 0x9E, 0xAA, 0x79, 0xE1, 0x43, 0x0F, 0xBA, 0xFA, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE4, 0x00, 0x9E, 0xAA, 0x79, 0xE1, 0x43, 0x0F, 0xBA, 0xFA, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE7, 0x40, 0xEB, 0xCA, 0x80, 0xE2, 0x03, 0xBF, 0xBA, 0xC2, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE3, 0x80, 0xDB, 0xCA, 0x40, 0xE2, 0x08, 0xDF, 0xBA, 0xC1, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xEA, 0x00, 0x68, 0xB8, 0x90, 0xE2, 0x0A, 0x8E, 0xB8, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xEA, 0x00, 0x68, 0xB8, 0x90, 0xE2, 0x0A, 0x8E, 0xB8, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x61, 0x00, 0xBE, 0x99, 0xFA, 0xE3, 0x40, 0xCF, 0xCA, 0xF9, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x62, 0x00, 0xCE, 0x9A, 0xA8, 0xE2, 0x45, 0xCF, 0xCA, 0xA0, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xCD, 0x00, 0x0B, 0x00, 0x90, 0xC2, 0x58, 0x0C, 0x00, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x1C },
|
|
|
|
{ 0xCD, 0x00, 0x0B, 0x00, 0x90, 0xC2, 0x58, 0x0C, 0x00, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x1C } },
|
|
|
|
{ { 0xE2, 0x00, 0x0E, 0x00, 0xA2, 0xE2, 0x58, 0x5F, 0xD0, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE2, 0x00, 0x0E, 0x00, 0xA2, 0xE2, 0x58, 0x5F, 0xD0, 0xF9, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xEC, 0x00, 0x7D, 0xDA, 0x80, 0xE2, 0x00, 0x5E, 0x9B, 0xA8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE6, 0x0A, 0x4C, 0xC9, 0x60, 0xE2, 0x07, 0x0C, 0x7A, 0xB8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE9, 0xC0, 0xEE, 0xD8, 0x83, 0xE2, 0x05, 0xDD, 0xAA, 0xE0, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xED, 0x48, 0xDE, 0xD8, 0xB4, 0xE1, 0x00, 0xDD, 0xAA, 0xA9, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xDA, 0x00, 0x8F, 0xAC, 0x92, 0x22, 0x05, 0x8D, 0x8A, 0xE9, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xEF, 0x00, 0x8C, 0xAA, 0x67, 0x25, 0x00, 0x9D, 0xAB, 0xC1, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x62, 0x82, 0xCB, 0x7A, 0xD8, 0xE6, 0x56, 0xAF, 0xDB, 0xE0, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x62, 0x84, 0xBB, 0xAA, 0xCA, 0xCF, 0x41, 0xAC, 0xDA, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xC2, 0x41, 0xAC, 0xBB, 0xBB, 0xC2, 0x85, 0x0E, 0xCB, 0xF9, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x12 },
|
|
|
|
{ 0xC2, 0x03, 0x6A, 0x5B, 0xA4, 0xC2, 0x0D, 0x2A, 0xBB, 0xFC, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x12 } },
|
|
|
|
{ { 0x75, 0x00, 0x0E, 0xBB, 0xB2, 0xE2, 0x1E, 0x0A, 0xA9, 0xF9, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 },
|
|
|
|
{ 0x62, 0x00, 0x04, 0x9A, 0xE8, 0xE2, 0x00, 0x0A, 0x48, 0xFD, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 } },
|
|
|
|
{ { 0x41, 0x00, 0x0E, 0xEA, 0xA3, 0xC2, 0x00, 0x08, 0xCA, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 },
|
|
|
|
{ 0x41, 0x00, 0x0E, 0xEA, 0xA3, 0xC2, 0x00, 0x08, 0xCA, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 } },
|
|
|
|
{ { 0xC1, 0x40, 0x0C, 0x59, 0xD2, 0xC2, 0x80, 0x3C, 0xAB, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0D },
|
|
|
|
{ 0xC1, 0x40, 0x0C, 0x59, 0xD2, 0xC2, 0x80, 0x3C, 0xAB, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0D } },
|
|
|
|
{ { 0x4B, 0x00, 0x0A, 0xF5, 0xC1, 0xC2, 0x19, 0x0C, 0xE9, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 },
|
|
|
|
{ 0x4B, 0x00, 0x0A, 0xF5, 0xC1, 0xC2, 0x19, 0x0C, 0xE9, 0xF8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 } },
|
|
|
|
{ { 0x62, 0x00, 0x7F, 0xD8, 0xA8, 0xEA, 0x00, 0x8F, 0xD8, 0xF9, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0x62, 0x00, 0x7F, 0xD8, 0xA8, 0xEA, 0x00, 0x8F, 0xD8, 0xF9, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE1, 0x00, 0x7F, 0xD9, 0xAA, 0xE1, 0x00, 0x8F, 0xD8, 0xFA, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE1, 0x00, 0x7F, 0xD9, 0xAA, 0xE1, 0x00, 0x8F, 0xD8, 0xFA, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xE1, 0x00, 0x7F, 0xD9, 0xAA, 0xE1, 0x00, 0x8F, 0xD8, 0xFA, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xE1, 0x00, 0x7F, 0xD9, 0xAA, 0xE1, 0x00, 0x8F, 0xD8, 0xFA, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0xCF, 0x40, 0x09, 0xEA, 0xA8, 0xC4, 0x00, 0x0C, 0xDB, 0xC8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0xCF, 0x40, 0x09, 0xEA, 0xA8, 0xC4, 0x00, 0x0C, 0xDB, 0xC8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } },
|
|
|
|
{ { 0xCF, 0x40, 0x0C, 0xAA, 0xA8, 0xC4, 0x00, 0x18, 0xF9, 0xC8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0xCF, 0x40, 0x0C, 0xAA, 0xA8, 0xC4, 0x00, 0x18, 0xF9, 0xC8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } },
|
|
|
|
{ { 0xC9, 0x0C, 0x88, 0xD9, 0x6A, 0xC2, 0x14, 0x3A, 0xEA, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 },
|
|
|
|
{ 0xC5, 0x00, 0x98, 0xD9, 0x92, 0xC1, 0x16, 0x6E, 0xF9, 0xE8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 } },
|
|
|
|
{ { 0x03, 0x00, 0x15, 0x00, 0xC8, 0x02, 0x00, 0x08, 0x00, 0xF8, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x03, 0x00, 0x15, 0x00, 0xC8, 0x02, 0x00, 0x08, 0x00, 0xF8, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } },
|
|
|
|
{ { 0x01, 0x0C, 0x44, 0xE6, 0xE8, 0x01, 0x3F, 0x0C, 0xEA, 0xF8, 0x0C, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 },
|
|
|
|
{ 0x02, 0x3F, 0x05, 0x08, 0xF8, 0x03, 0x3F, 0x3C, 0xF9, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 } },
|
|
|
|
{ { 0x00, 0x00, 0x36, 0x67, 0xF8, 0x01, 0x3F, 0x0E, 0xFA, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 },
|
|
|
|
{ 0x00, 0x00, 0x36, 0x67, 0xF8, 0x01, 0x3F, 0x0E, 0xFA, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 } },
|
|
|
|
{ { 0x02, 0x00, 0x36, 0x68, 0xF8, 0x01, 0x3F, 0x0E, 0xFA, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 },
|
|
|
|
{ 0x02, 0x00, 0x36, 0x68, 0xF8, 0x01, 0x3F, 0x0E, 0xFA, 0xF8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 } },
|
|
|
|
{ { 0xCB, 0x00, 0xAF, 0x00, 0xFA, 0xC0, 0x00, 0xC0, 0x06, 0xFB, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0F },
|
|
|
|
{ 0xCB, 0x00, 0xAF, 0x00, 0xFA, 0xC0, 0x00, 0xC0, 0x06, 0xFB, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0F } },
|
|
|
|
{ { 0x05, 0x0D, 0x80, 0xA6, 0xFB, 0x0B, 0x38, 0xA9, 0xD8, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 },
|
|
|
|
{ 0x05, 0x0D, 0x80, 0xA6, 0xFB, 0x0B, 0x38, 0xA9, 0xD8, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 } },
|
|
|
|
{ { 0x0F, 0x00, 0x90, 0xFA, 0xD0, 0x06, 0x00, 0xA7, 0x39, 0xA8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 },
|
|
|
|
{ 0x0F, 0x00, 0x90, 0xFA, 0xD0, 0x06, 0x00, 0xA7, 0x39, 0xA8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 } },
|
|
|
|
{ { 0xC9, 0x15, 0xDD, 0xFF, 0xF8, 0x00, 0x00, 0xE7, 0xFC, 0xD8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x38 },
|
|
|
|
{ 0xC9, 0x15, 0xDD, 0xFF, 0xF8, 0x00, 0x00, 0xE7, 0xFC, 0xD8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x38 } },
|
|
|
|
{ { 0x48, 0x3C, 0x30, 0xF6, 0x03, 0x0A, 0x38, 0x97, 0xE8, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 },
|
|
|
|
{ 0x48, 0x3C, 0x30, 0xF6, 0x03, 0x0A, 0x38, 0x97, 0xE8, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 } },
|
|
|
|
{ { 0x07, 0x80, 0x0B, 0xC8, 0xC9, 0x02, 0x3F, 0x0C, 0xEA, 0xF8, 0x0F, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 },
|
|
|
|
{ 0x07, 0x80, 0x0B, 0xC8, 0xC9, 0x02, 0x3F, 0x0C, 0xEA, 0xF8, 0x0F, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 } },
|
|
|
|
{ { 0x00, 0x21, 0x66, 0x40, 0x03, 0x00, 0x3F, 0x47, 0x00, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x00, 0x21, 0x66, 0x40, 0x03, 0x00, 0x3F, 0x47, 0x00, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } },
|
|
|
|
{ { 0x08, 0x00, 0x0B, 0x3C, 0xF8, 0x08, 0x3F, 0x06, 0xF3, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x08, 0x00, 0x0B, 0x3C, 0xF8, 0x08, 0x3F, 0x06, 0xF3, 0x00, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } },
|
|
|
|
{ { 0x00, 0x3F, 0x4C, 0xFB, 0x00, 0x00, 0x3F, 0x0A, 0xE9, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 },
|
2012-11-22 01:23:36 +00:00
|
|
|
{ 0x00, 0x3F, 0x4C, 0xFB, 0x00, 0x00, 0x3F, 0x0A, 0xE9, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 } }
|
2012-09-30 23:51:04 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
static const AdLibInstrument g_gmPercussionInstrumentsOPL3[39][2] = {
|
|
|
|
{ { 0x1A, 0x3F, 0x15, 0x05, 0xF8, 0x02, 0x21, 0x2B, 0xE4, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 },
|
|
|
|
{ 0x11, 0x18, 0x15, 0x00, 0xF8, 0x12, 0x00, 0x2B, 0x03, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 } },
|
|
|
|
{ { 0x11, 0x12, 0x04, 0x07, 0xF8, 0x02, 0x18, 0x0B, 0xE5, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 },
|
|
|
|
{ 0x11, 0x28, 0x06, 0x04, 0xF8, 0x02, 0x1E, 0x1B, 0x02, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 } },
|
|
|
|
{ { 0x0A, 0x3F, 0x0B, 0x01, 0xF8, 0x1F, 0x13, 0x46, 0xD0, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x01 },
|
|
|
|
{ 0x04, 0x18, 0x06, 0x01, 0xB0, 0x10, 0x00, 0x07, 0x00, 0x90, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x01 } },
|
|
|
|
{ { 0x00, 0x3F, 0x0F, 0x00, 0xF8, 0x10, 0x0A, 0x07, 0x00, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x02, 0x14, 0x04, 0x00, 0xC0, 0x11, 0x08, 0x07, 0x00, 0xC6, 0x02, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } },
|
|
|
|
{ { 0x0F, 0x3F, 0x0B, 0x00, 0xF8, 0x1F, 0x07, 0x19, 0xD0, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x0E, 0x32, 0x76, 0x03, 0xF8, 0x1F, 0x0F, 0x77, 0xD4, 0xFC, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } },
|
|
|
|
{ { 0x00, 0x3F, 0x1F, 0x00, 0xFA, 0x1F, 0x0C, 0x07, 0x00, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0x07, 0x11, 0x13, 0x00, 0xA0, 0x13, 0x00, 0x07, 0x00, 0xC8, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } },
|
|
|
|
{ { 0x12, 0x3F, 0x05, 0x06, 0xF8, 0x03, 0x16, 0x4A, 0xD9, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0x02, 0x22, 0x05, 0xB6, 0xF8, 0x04, 0x0A, 0x59, 0x03, 0xF8, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } },
|
|
|
|
{ { 0xCF, 0x7F, 0x08, 0xFF, 0xFA, 0x00, 0xC0, 0x2D, 0xF7, 0xE3, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0xD2, 0x7F, 0x04, 0x0F, 0xFA, 0x10, 0xCD, 0x24, 0x07, 0xFB, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } },
|
|
|
|
{ { 0x12, 0x3F, 0x05, 0x06, 0xF8, 0x43, 0x17, 0x0C, 0xE9, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0x12, 0x13, 0x09, 0x96, 0xF8, 0x44, 0x0A, 0x07, 0x03, 0xF8, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } },
|
|
|
|
{ { 0xCF, 0x7F, 0x08, 0xCF, 0xFA, 0x00, 0x40, 0x2A, 0xF8, 0x8B, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0C },
|
|
|
|
{ 0xCF, 0x7F, 0x05, 0x07, 0xFA, 0x00, 0x40, 0x25, 0x08, 0xC3, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0C } },
|
|
|
|
{ { 0x12, 0x3F, 0x06, 0x17, 0xF8, 0x03, 0x1D, 0x0B, 0xE9, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0x12, 0x1A, 0x08, 0x96, 0xF8, 0x44, 0x00, 0x08, 0x03, 0xF8, 0x05, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } },
|
|
|
|
{ { 0xCF, 0x7F, 0x08, 0xCD, 0xFA, 0x00, 0x40, 0x1A, 0x69, 0xB3, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0C },
|
|
|
|
{ 0xCD, 0x3F, 0x36, 0x05, 0xFC, 0x0F, 0x47, 0x46, 0x06, 0xDF, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0C } },
|
|
|
|
{ { 0x13, 0x3F, 0x05, 0x06, 0xF8, 0x03, 0x0D, 0x0A, 0xD9, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0x12, 0x14, 0x09, 0x96, 0xF8, 0x44, 0x02, 0x07, 0x03, 0xF8, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } },
|
|
|
|
{ { 0x15, 0x3F, 0x05, 0x06, 0xF8, 0x03, 0x16, 0x0C, 0xE9, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0x12, 0x00, 0x07, 0x96, 0xE8, 0x44, 0x02, 0x08, 0x03, 0xF8, 0x07, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } },
|
|
|
|
{ { 0xCF, 0x3F, 0x2B, 0xFB, 0xFA, 0xC0, 0x16, 0x1A, 0xCA, 0xFB, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 },
|
|
|
|
{ 0xCF, 0x3F, 0x2B, 0xFB, 0xFA, 0xC0, 0x1E, 0x1A, 0xCA, 0xFB, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 } },
|
|
|
|
{ { 0x17, 0x3F, 0x04, 0x09, 0xF8, 0x03, 0x18, 0x0D, 0xE9, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0x12, 0x00, 0x07, 0x96, 0xF8, 0x44, 0x02, 0x08, 0xF9, 0xF8, 0x01, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } },
|
|
|
|
{ { 0xCF, 0x3F, 0x0F, 0x5E, 0xF8, 0xC6, 0x0C, 0x00, 0xCA, 0xFB, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0xCF, 0x3F, 0x04, 0x57, 0xF8, 0xC5, 0x13, 0x06, 0x05, 0xFF, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } },
|
|
|
|
{ { 0xCF, 0x3F, 0x7E, 0x9D, 0xF8, 0xC8, 0xC0, 0x0A, 0xBA, 0xD0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 },
|
|
|
|
{ 0xCF, 0x3F, 0x77, 0x09, 0xF8, 0xC2, 0xC0, 0x08, 0xB5, 0xEA, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x06 } },
|
|
|
|
{ { 0xCF, 0x3F, 0x4D, 0x9F, 0xF8, 0xC6, 0x00, 0x08, 0xDA, 0xAB, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 },
|
|
|
|
{ 0xCF, 0x3F, 0x47, 0x06, 0xF8, 0xCD, 0x00, 0x07, 0x05, 0xB3, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 } },
|
|
|
|
{ { 0xCF, 0x3F, 0x5D, 0xAA, 0xF2, 0xC0, 0x8A, 0x67, 0x99, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0xCF, 0x3F, 0x9A, 0x69, 0xF8, 0xCF, 0x88, 0x88, 0x48, 0xFA, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } },
|
|
|
|
{ { 0xCF, 0x3F, 0x4A, 0xFD, 0xF8, 0xCF, 0x00, 0x59, 0xEA, 0xD8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0xCF, 0x3F, 0x48, 0x06, 0xF8, 0xCF, 0x00, 0x54, 0x04, 0xF9, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } },
|
|
|
|
{ { 0x0F, 0x18, 0x0A, 0xFA, 0xAB, 0x06, 0x06, 0x06, 0x39, 0xF8, 0x0A, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x03, 0x18, 0x04, 0x09, 0xAC, 0x05, 0x07, 0x08, 0x07, 0xF8, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } },
|
|
|
|
{ { 0xCF, 0x3F, 0x2B, 0xFC, 0xF8, 0xCC, 0xC4, 0x0B, 0xEA, 0xFB, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 },
|
|
|
|
{ 0xCF, 0x3F, 0x25, 0x06, 0xF8, 0xCC, 0xD7, 0x05, 0x02, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x10 } },
|
|
|
|
{ { 0x05, 0x1A, 0x04, 0x00, 0xF8, 0x12, 0x08, 0x0C, 0xEA, 0xE0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 },
|
|
|
|
{ 0x01, 0x00, 0x09, 0x08, 0x40, 0x13, 0x00, 0x2A, 0x0A, 0xD8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 } },
|
|
|
|
{ { 0x04, 0x19, 0x04, 0x00, 0xF8, 0x12, 0x08, 0x2C, 0xEA, 0xE0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 },
|
|
|
|
{ 0x04, 0x00, 0x07, 0x08, 0x40, 0x12, 0x00, 0x29, 0x08, 0xE0, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x04 } },
|
|
|
|
{ { 0x04, 0x0A, 0x04, 0x00, 0xD8, 0x01, 0x02, 0x0D, 0xFA, 0xE0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 },
|
|
|
|
{ 0x04, 0x00, 0x03, 0x09, 0x93, 0x02, 0x00, 0x28, 0x09, 0xE8, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x07 } },
|
|
|
|
{ { 0x15, 0x14, 0x05, 0x00, 0xF9, 0x01, 0x03, 0x5C, 0xE9, 0xD8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 },
|
|
|
|
{ 0x05, 0x00, 0x03, 0x03, 0x49, 0x02, 0x00, 0x58, 0x08, 0xE0, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 } },
|
|
|
|
{ { 0x10, 0x10, 0x05, 0x08, 0xF8, 0x01, 0x03, 0x0D, 0xEA, 0xE8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 },
|
|
|
|
{ 0x10, 0x00, 0x0C, 0x0C, 0x48, 0x02, 0x00, 0x08, 0xB9, 0xE0, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x05 } },
|
|
|
|
{ { 0x11, 0x00, 0x06, 0x87, 0xFB, 0x02, 0x40, 0x09, 0x59, 0xC0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x08 },
|
|
|
|
{ 0x15, 0x00, 0x04, 0x87, 0xFB, 0x02, 0x40, 0x09, 0x59, 0xD0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x08 } },
|
|
|
|
{ { 0x13, 0x26, 0x04, 0x6A, 0xFB, 0x01, 0x00, 0x08, 0x5A, 0xE0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x08 },
|
|
|
|
{ 0x12, 0x26, 0x03, 0x6A, 0xFB, 0x02, 0x00, 0x06, 0x5A, 0xC0, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x08 } },
|
|
|
|
{ { 0xCF, 0x4D, 0x0C, 0xAA, 0xA0, 0xC4, 0x00, 0x18, 0xF9, 0x90, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0xCF, 0x4E, 0x05, 0xA6, 0xA0, 0xC6, 0x00, 0x16, 0xF8, 0x60, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } },
|
|
|
|
{ { 0xCF, 0x4D, 0x0C, 0xAA, 0xA0, 0xC3, 0x00, 0x18, 0xF8, 0x98, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0xCF, 0x4E, 0x06, 0xAA, 0xA0, 0xC5, 0x00, 0x19, 0xF9, 0x90, 0x04, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } },
|
|
|
|
{ { 0xCB, 0x3F, 0x8F, 0x00, 0xFA, 0xC5, 0x06, 0x98, 0xD6, 0xBB, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0D },
|
|
|
|
{ 0xC0, 0x00, 0xF0, 0x00, 0x00, 0xC0, 0x00, 0xF0, 0x00, 0x00, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x0D } },
|
|
|
|
{ { 0x0C, 0x18, 0x87, 0xB3, 0xFB, 0x19, 0x0B, 0x55, 0x75, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x0C, 0x18, 0x87, 0xB3, 0xFB, 0x1B, 0x10, 0x57, 0x75, 0xF8, 0x0E, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } },
|
|
|
|
{ { 0x05, 0x11, 0x15, 0x00, 0xC8, 0x02, 0x00, 0x08, 0x00, 0xA8, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x02, 0x11, 0x13, 0x00, 0xC8, 0x02, 0x00, 0x05, 0x00, 0x80, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } },
|
|
|
|
{ { 0x04, 0x08, 0x15, 0x00, 0x90, 0x01, 0x00, 0x08, 0x00, 0xC0, 0x08, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 },
|
|
|
|
{ 0x03, 0x08, 0x14, 0x00, 0x90, 0x02, 0x00, 0x07, 0x00, 0xA8, 0x00, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x02 } },
|
|
|
|
{ { 0xDA, 0x00, 0x53, 0x30, 0xC0, 0x07, 0x10, 0x49, 0xC4, 0xDA, 0x03, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
|
|
|
{ 0xD2, 0x00, 0x56, 0x30, 0x90, 0x06, 0x00, 0x46, 0x56, 0x62, 0x09, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } },
|
|
|
|
{ { 0x1C, 0x00, 0x07, 0xBC, 0xC8, 0x0C, 0x0A, 0x0B, 0x6A, 0xF2, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 },
|
|
|
|
{ 0x18, 0x00, 0x07, 0xBC, 0x88, 0x09, 0x00, 0x0B, 0x6A, 0xBA, 0x0B, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x03 } },
|
|
|
|
{ { 0x0A, 0x0E, 0x7F, 0x00, 0xF9, 0x13, 0x16, 0x28, 0x03, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 },
|
2012-11-22 01:23:36 +00:00
|
|
|
{ 0x01, 0x0E, 0x54, 0x00, 0xF9, 0x15, 0x03, 0x27, 0x03, 0xF8, 0x06, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, { 0, 0, 0, 0, 0, 0, 0, 0 }, 0x00 } }
|
2012-09-30 23:51:04 +00:00
|
|
|
};
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
|
2012-09-30 17:59:11 +00:00
|
|
|
static const byte g_gmPercussionInstrumentMap[128] = {
|
2005-07-30 21:11:48 +00:00
|
|
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
|
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
|
|
0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C,
|
|
|
|
0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0xFF, 0xFF, 0x17, 0x18, 0x19, 0x1A,
|
|
|
|
0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x21, 0x22, 0x23, 0xFF, 0xFF,
|
|
|
|
0x24, 0x25, 0xFF, 0xFF, 0xFF, 0x26, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
|
|
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
|
2007-08-20 10:43:07 +00:00
|
|
|
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
|
2003-05-15 00:05:32 +00:00
|
|
|
};
|
|
|
|
|
2012-09-30 17:59:11 +00:00
|
|
|
static byte g_volumeLookupTable[64][32];
|
2006-10-27 22:47:53 +00:00
|
|
|
|
2012-09-30 17:59:11 +00:00
|
|
|
static const byte g_volumeTable[] = {
|
2002-11-21 19:06:42 +00:00
|
|
|
0, 4, 7, 11,
|
|
|
|
13, 16, 18, 20,
|
|
|
|
22, 24, 26, 27,
|
|
|
|
29, 30, 31, 33,
|
|
|
|
34, 35, 36, 37,
|
|
|
|
38, 39, 40, 41,
|
|
|
|
42, 43, 44, 44,
|
|
|
|
45, 46, 47, 47,
|
|
|
|
48, 49, 49, 50,
|
|
|
|
51, 51, 52, 53,
|
|
|
|
53, 54, 54, 55,
|
|
|
|
55, 56, 56, 57,
|
|
|
|
57, 58, 58, 59,
|
|
|
|
59, 60, 60, 60,
|
|
|
|
61, 61, 62, 62,
|
|
|
|
62, 63, 63, 63
|
|
|
|
};
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
static int lookupVolume(int a, int b) {
|
2002-11-21 19:06:42 +00:00
|
|
|
if (b == 0)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
if (b == 31)
|
|
|
|
return a;
|
|
|
|
|
|
|
|
if (a < -63 || a > 63) {
|
|
|
|
return b * (a + 1) >> 5;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (b < 0) {
|
|
|
|
if (a < 0) {
|
2012-09-30 17:59:11 +00:00
|
|
|
return g_volumeLookupTable[-a][-b];
|
2002-11-21 19:06:42 +00:00
|
|
|
} else {
|
2012-09-30 17:59:11 +00:00
|
|
|
return -g_volumeLookupTable[a][-b];
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (a < 0) {
|
2012-09-30 17:59:11 +00:00
|
|
|
return -g_volumeLookupTable[-a][b];
|
2002-11-21 19:06:42 +00:00
|
|
|
} else {
|
2012-09-30 17:59:11 +00:00
|
|
|
return g_volumeLookupTable[a][b];
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
static void createLookupTable() {
|
2002-11-21 19:06:42 +00:00
|
|
|
int i, j;
|
|
|
|
int sum;
|
|
|
|
|
|
|
|
for (i = 0; i < 64; i++) {
|
|
|
|
sum = i;
|
|
|
|
for (j = 0; j < 32; j++) {
|
2012-09-30 17:59:11 +00:00
|
|
|
g_volumeLookupTable[i][j] = sum >> 5;
|
2002-11-21 19:06:42 +00:00
|
|
|
sum += i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for (i = 0; i < 64; i++)
|
2012-09-30 17:59:11 +00:00
|
|
|
g_volumeLookupTable[i][0] = 0;
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
////////////////////////////////////////
|
|
|
|
//
|
2010-01-12 21:07:56 +00:00
|
|
|
// AdLib MIDI driver
|
2002-11-21 19:06:42 +00:00
|
|
|
//
|
|
|
|
////////////////////////////////////////
|
|
|
|
|
2015-04-30 04:01:30 +00:00
|
|
|
class MidiDriver_ADLIB : public MidiDriver {
|
2010-01-12 21:07:56 +00:00
|
|
|
friend class AdLibPart;
|
|
|
|
friend class AdLibPercussionChannel;
|
2002-11-26 16:54:58 +00:00
|
|
|
|
2002-11-21 19:06:42 +00:00
|
|
|
public:
|
2015-04-30 04:01:30 +00:00
|
|
|
MidiDriver_ADLIB();
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2020-03-09 15:08:19 +00:00
|
|
|
int open() override;
|
|
|
|
void close() override;
|
2020-02-19 17:51:53 +00:00
|
|
|
void send(uint32 b) override;
|
2020-07-07 10:18:20 +00:00
|
|
|
void send(int8 channel, uint32 b) override; // Supports higher than channel 15
|
2020-03-09 15:08:19 +00:00
|
|
|
uint32 property(int prop, uint32 param) override;
|
|
|
|
bool isOpen() const override { return _isOpen; }
|
|
|
|
uint32 getBaseTempo() override { return 1000000 / OPL::OPL::kDefaultCallbackFrequency; }
|
2002-12-01 15:51:29 +00:00
|
|
|
|
2020-03-09 15:08:19 +00:00
|
|
|
void setPitchBendRange(byte channel, uint range) override;
|
|
|
|
void sysEx_customInstrument(byte channel, uint32 type, const byte *instr) override;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2020-03-09 15:08:19 +00:00
|
|
|
MidiChannel *allocateChannel() override;
|
|
|
|
MidiChannel *getPercussionChannel() override { return &_percussion; } // Percussion partially supported
|
2002-11-26 16:54:58 +00:00
|
|
|
|
2020-03-09 15:08:19 +00:00
|
|
|
virtual void setTimerCallback(void *timerParam, Common::TimerManager::TimerProc timerProc) override;
|
2015-04-03 14:59:10 +00:00
|
|
|
|
2002-11-21 19:06:42 +00:00
|
|
|
private:
|
2012-09-30 18:25:57 +00:00
|
|
|
bool _scummSmallHeader; // FIXME: This flag controls a special mode for SCUMM V3 games
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
bool _opl3Mode;
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 19:36:52 +00:00
|
|
|
OPL::OPL *_opl;
|
2012-09-30 18:55:30 +00:00
|
|
|
byte *_regCache;
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
byte *_regCacheSecondary;
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2015-04-03 14:59:10 +00:00
|
|
|
Common::TimerManager::TimerProc _adlibTimerProc;
|
|
|
|
void *_adlibTimerParam;
|
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
int _timerCounter;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
uint16 _channelTable2[9];
|
|
|
|
int _voiceIndex;
|
|
|
|
int _timerIncrease;
|
|
|
|
int _timerThreshold;
|
|
|
|
uint16 _curNotTable[9];
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibVoice _voices[9];
|
|
|
|
AdLibPart _parts[32];
|
|
|
|
AdLibPercussionChannel _percussion;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2015-04-30 04:01:30 +00:00
|
|
|
bool _isOpen;
|
|
|
|
|
2004-11-08 10:16:07 +00:00
|
|
|
void onTimer();
|
2012-09-30 23:51:04 +00:00
|
|
|
void partKeyOn(AdLibPart *part, const AdLibInstrument *instr, byte note, byte velocity, const AdLibInstrument *second, byte pan);
|
2012-09-30 19:08:40 +00:00
|
|
|
void partKeyOff(AdLibPart *part, byte note);
|
|
|
|
|
|
|
|
void adlibKeyOff(int chan);
|
|
|
|
void adlibNoteOn(int chan, byte note, int mod);
|
|
|
|
void adlibNoteOnEx(int chan, byte note, int mod);
|
|
|
|
int adlibGetRegValueParam(int chan, byte data);
|
2012-09-30 23:51:04 +00:00
|
|
|
void adlibSetupChannel(int chan, const AdLibInstrument *instr, byte vol1, byte vol2);
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
void adlibSetupChannelSecondary(int chan, const AdLibInstrument *instr, byte vol1, byte vol2, byte pan);
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 19:08:40 +00:00
|
|
|
byte adlibGetRegValue(byte reg) {
|
2012-09-30 18:55:30 +00:00
|
|
|
return _regCache[reg];
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
byte adlibGetRegValueSecondary(byte reg) {
|
|
|
|
return _regCacheSecondary[reg];
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
void adlibSetParam(int channel, byte param, int value, bool primary = true);
|
2012-09-30 19:08:40 +00:00
|
|
|
void adlibKeyOnOff(int channel);
|
|
|
|
void adlibWrite(byte reg, byte value);
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
void adlibWriteSecondary(byte reg, byte value);
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 19:08:40 +00:00
|
|
|
void adlibPlayNote(int channel, int note);
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
AdLibVoice *allocateVoice(byte pri);
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
void mcOff(AdLibVoice *voice);
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
static void linkMc(AdLibPart *part, AdLibVoice *voice);
|
|
|
|
void mcIncStuff(AdLibVoice *voice, Struct10 *s10, Struct11 *s11);
|
|
|
|
void mcInitStuff(AdLibVoice *voice, Struct10 *s10, Struct11 *s11, byte flags,
|
2012-09-30 23:51:04 +00:00
|
|
|
const InstrumentExtra *ie);
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 23:51:04 +00:00
|
|
|
void struct10Init(Struct10 *s10, const InstrumentExtra *ie);
|
2012-09-30 19:08:40 +00:00
|
|
|
static byte struct10OnTimer(Struct10 *s10, Struct11 *s11);
|
|
|
|
static void struct10Setup(Struct10 *s10);
|
|
|
|
static int randomNr(int a);
|
2012-09-30 23:51:04 +00:00
|
|
|
void mcKeyOn(AdLibVoice *voice, const AdLibInstrument *instr, byte note, byte velocity, const AdLibInstrument *second, byte pan);
|
2002-11-21 19:06:42 +00:00
|
|
|
};
|
|
|
|
|
2002-11-26 16:54:58 +00:00
|
|
|
// MidiChannel method implementations
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPart::init(MidiDriver_ADLIB *owner, byte channel) {
|
2002-11-26 16:54:58 +00:00
|
|
|
_owner = owner;
|
2002-12-18 07:48:02 +00:00
|
|
|
_channel = channel;
|
2012-09-30 18:55:30 +00:00
|
|
|
_priEff = 127;
|
2006-11-08 18:47:33 +00:00
|
|
|
programChange(0);
|
2002-11-26 16:54:58 +00:00
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
MidiDriver *AdLibPart::device() {
|
2002-12-18 07:53:45 +00:00
|
|
|
return _owner;
|
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPart::send(uint32 b) {
|
2004-11-08 10:16:07 +00:00
|
|
|
_owner->send(_channel, b);
|
2003-08-08 11:54:24 +00:00
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPart::noteOff(byte note) {
|
2003-08-15 16:40:17 +00:00
|
|
|
#ifdef DEBUG_ADLIB
|
2012-09-30 17:59:11 +00:00
|
|
|
debug(6, "%10d: noteOff(%d)", g_tick, note);
|
2003-08-15 16:40:17 +00:00
|
|
|
#endif
|
2012-09-30 19:08:40 +00:00
|
|
|
_owner->partKeyOff(this, note);
|
2002-11-26 16:54:58 +00:00
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPart::noteOn(byte note, byte velocity) {
|
2003-08-15 16:40:17 +00:00
|
|
|
#ifdef DEBUG_ADLIB
|
2012-09-30 17:59:11 +00:00
|
|
|
debug(6, "%10d: noteOn(%d,%d)", g_tick, note, velocity);
|
2003-08-15 16:40:17 +00:00
|
|
|
#endif
|
2012-11-22 01:18:51 +00:00
|
|
|
_owner->partKeyOn(this, &_partInstr, note, velocity,
|
|
|
|
#ifdef ENABLE_OPL3
|
|
|
|
&_partInstrSecondary,
|
|
|
|
#else
|
|
|
|
NULL,
|
|
|
|
#endif
|
|
|
|
_pan);
|
2002-11-26 16:54:58 +00:00
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPart::programChange(byte program) {
|
2003-03-06 18:30:44 +00:00
|
|
|
if (program > 127)
|
|
|
|
return;
|
2002-11-26 16:54:58 +00:00
|
|
|
|
2012-09-30 18:25:57 +00:00
|
|
|
/*
|
2002-11-26 16:54:58 +00:00
|
|
|
uint i;
|
|
|
|
uint count = 0;
|
2012-09-30 17:59:11 +00:00
|
|
|
for (i = 0; i < ARRAYSIZE(g_gmInstruments[0]); ++i)
|
|
|
|
count += g_gmInstruments[program][i];
|
2002-11-26 16:54:58 +00:00
|
|
|
if (!count)
|
2011-05-10 10:27:14 +00:00
|
|
|
warning("No AdLib instrument defined for GM program %d", (int)program);
|
2012-09-30 18:25:57 +00:00
|
|
|
*/
|
2002-11-26 16:54:58 +00:00
|
|
|
_program = program;
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
if (!_owner->_opl3Mode) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
memcpy(&_partInstr, &g_gmInstruments[program], sizeof(AdLibInstrument));
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
} else {
|
|
|
|
memcpy(&_partInstr, &g_gmInstrumentsOPL3[program][0], sizeof(AdLibInstrument));
|
|
|
|
memcpy(&_partInstrSecondary, &g_gmInstrumentsOPL3[program][1], sizeof(AdLibInstrument));
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2002-11-26 16:54:58 +00:00
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPart::pitchBend(int16 bend) {
|
|
|
|
AdLibVoice *voice;
|
2002-11-26 16:54:58 +00:00
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
_pitchBend = bend;
|
2003-05-15 00:05:32 +00:00
|
|
|
for (voice = _voice; voice; voice = voice->_next) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
if (!_owner->_opl3Mode) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
_owner->adlibNoteOn(voice->_channel, voice->_note/* + _transposeEff*/,
|
|
|
|
(_pitchBend * _pitchBendFactor >> 6) + _detuneEff);
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
} else {
|
|
|
|
_owner->adlibNoteOn(voice->_channel, voice->_note, _pitchBend >> 1);
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2002-11-26 16:54:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPart::controlChange(byte control, byte value) {
|
2002-11-26 16:54:58 +00:00
|
|
|
switch (control) {
|
2008-01-27 19:47:41 +00:00
|
|
|
case 0:
|
|
|
|
case 32:
|
2012-09-30 18:25:57 +00:00
|
|
|
// Bank select. Not supported
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
modulationWheel(value);
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
volume(value);
|
|
|
|
break;
|
|
|
|
case 10:
|
2012-09-30 23:51:04 +00:00
|
|
|
panPosition(value);
|
2012-09-30 18:25:57 +00:00
|
|
|
break;
|
|
|
|
case 16:
|
|
|
|
pitchBendFactor(value);
|
|
|
|
break;
|
|
|
|
case 17:
|
|
|
|
detune(value);
|
|
|
|
break;
|
|
|
|
case 18:
|
|
|
|
priority(value);
|
|
|
|
break;
|
|
|
|
case 64:
|
|
|
|
sustain(value > 0);
|
|
|
|
break;
|
|
|
|
case 91:
|
|
|
|
// Effects level. Not supported.
|
|
|
|
break;
|
|
|
|
case 93:
|
|
|
|
// Chorus level. Not supported.
|
|
|
|
break;
|
|
|
|
case 119:
|
|
|
|
// Unknown, used in Simon the Sorcerer 2
|
|
|
|
break;
|
|
|
|
case 121:
|
|
|
|
// reset all controllers
|
2005-01-03 11:33:12 +00:00
|
|
|
modulationWheel(0);
|
|
|
|
pitchBendFactor(0);
|
|
|
|
detune(0);
|
|
|
|
sustain(0);
|
|
|
|
break;
|
2012-09-30 18:25:57 +00:00
|
|
|
case 123:
|
|
|
|
allNotesOff();
|
|
|
|
break;
|
2002-11-26 16:54:58 +00:00
|
|
|
default:
|
2012-09-30 18:25:57 +00:00
|
|
|
warning("AdLib: Unknown control change message %d (%d)", (int)control, (int)value);
|
2002-11-26 16:54:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPart::modulationWheel(byte value) {
|
|
|
|
AdLibVoice *voice;
|
2002-11-26 16:54:58 +00:00
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
_modWheel = value;
|
2003-05-15 00:05:32 +00:00
|
|
|
for (voice = _voice; voice; voice = voice->_next) {
|
|
|
|
if (voice->_s10a.active && voice->_s11a.flag0x40)
|
2012-09-30 18:55:30 +00:00
|
|
|
voice->_s10a.modWheel = _modWheel >> 2;
|
2003-05-15 00:05:32 +00:00
|
|
|
if (voice->_s10b.active && voice->_s11b.flag0x40)
|
2012-09-30 18:55:30 +00:00
|
|
|
voice->_s10b.modWheel = _modWheel >> 2;
|
2002-11-26 16:54:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPart::volume(byte value) {
|
|
|
|
AdLibVoice *voice;
|
2002-11-26 16:54:58 +00:00
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
_volEff = value;
|
2003-05-15 00:05:32 +00:00
|
|
|
for (voice = _voice; voice; voice = voice->_next) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
if (!_owner->_opl3Mode) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
_owner->adlibSetParam(voice->_channel, 0, g_volumeTable[g_volumeLookupTable[voice->_vol2][_volEff >> 2]]);
|
|
|
|
if (voice->_twoChan) {
|
|
|
|
_owner->adlibSetParam(voice->_channel, 13, g_volumeTable[g_volumeLookupTable[voice->_vol1][_volEff >> 2]]);
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
} else {
|
|
|
|
_owner->adlibSetParam(voice->_channel, 0, g_volumeTable[((voice->_vol2 + 1) * _volEff) >> 7], true);
|
|
|
|
_owner->adlibSetParam(voice->_channel, 0, g_volumeTable[((voice->_secVol2 + 1) * _volEff) >> 7], false);
|
|
|
|
if (voice->_twoChan) {
|
|
|
|
_owner->adlibSetParam(voice->_channel, 13, g_volumeTable[((voice->_vol1 + 1) * _volEff) >> 7], true);
|
|
|
|
}
|
|
|
|
if (voice->_secTwoChan) {
|
|
|
|
_owner->adlibSetParam(voice->_channel, 13, g_volumeTable[((voice->_secVol1 + 1) * _volEff) >> 7], false);
|
|
|
|
}
|
2002-11-26 16:54:58 +00:00
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2002-11-26 16:54:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-30 23:51:04 +00:00
|
|
|
void AdLibPart::panPosition(byte value) {
|
|
|
|
_pan = value;
|
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPart::pitchBendFactor(byte value) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
// Not supported in OPL3 mode.
|
|
|
|
if (_owner->_opl3Mode) {
|
|
|
|
return;
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibVoice *voice;
|
2002-11-26 16:54:58 +00:00
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
_pitchBendFactor = value;
|
2003-05-15 00:05:32 +00:00
|
|
|
for (voice = _voice; voice; voice = voice->_next) {
|
2012-09-30 19:22:03 +00:00
|
|
|
_owner->adlibNoteOn(voice->_channel, voice->_note/* + _transposeEff*/,
|
2012-09-30 18:55:30 +00:00
|
|
|
(_pitchBend * _pitchBendFactor >> 6) + _detuneEff);
|
2002-11-26 16:54:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPart::detune(byte value) {
|
2012-09-30 23:51:04 +00:00
|
|
|
// Sam&Max's OPL3 driver uses this for a completly different purpose. It
|
|
|
|
// is related to voice allocation. We ignore this for now.
|
|
|
|
// TODO: We probably need to look how the interpreter side of Sam&Max's
|
|
|
|
// iMuse version handles all this too. Implementing the driver side here
|
|
|
|
// would be not that hard.
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
if (_owner->_opl3Mode) {
|
|
|
|
//_maxNotes = value;
|
|
|
|
return;
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibVoice *voice;
|
2002-11-26 16:54:58 +00:00
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
_detuneEff = value;
|
2003-05-15 00:05:32 +00:00
|
|
|
for (voice = _voice; voice; voice = voice->_next) {
|
2012-09-30 19:22:03 +00:00
|
|
|
_owner->adlibNoteOn(voice->_channel, voice->_note/* + _transposeEff*/,
|
2012-09-30 18:55:30 +00:00
|
|
|
(_pitchBend * _pitchBendFactor >> 6) + _detuneEff);
|
2002-11-26 16:54:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPart::priority(byte value) {
|
2012-09-30 18:55:30 +00:00
|
|
|
_priEff = value;
|
2002-11-26 16:54:58 +00:00
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPart::sustain(bool value) {
|
|
|
|
AdLibVoice *voice;
|
2002-11-26 16:54:58 +00:00
|
|
|
|
|
|
|
_pedal = value;
|
|
|
|
if (!value) {
|
2003-05-15 00:05:32 +00:00
|
|
|
for (voice = _voice; voice; voice = voice->_next) {
|
2012-09-30 18:55:30 +00:00
|
|
|
if (voice->_waitForPedal)
|
2012-09-30 19:08:40 +00:00
|
|
|
_owner->mcOff(voice);
|
2002-11-26 16:54:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPart::allNotesOff() {
|
2003-05-15 00:05:32 +00:00
|
|
|
while (_voice)
|
2012-09-30 19:08:40 +00:00
|
|
|
_owner->mcOff(_voice);
|
2002-11-26 16:54:58 +00:00
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPart::sysEx_customInstrument(uint32 type, const byte *instr) {
|
2012-09-30 23:51:04 +00:00
|
|
|
// Sam&Max allows for instrument overwrites, but we will not support it
|
|
|
|
// until we can find any track actually using it.
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
if (_owner->_opl3Mode) {
|
|
|
|
warning("AdLibPart::sysEx_customInstrument: Used in OPL3 mode");
|
|
|
|
return;
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
|
2003-05-15 00:05:32 +00:00
|
|
|
if (type == 'ADL ') {
|
2012-09-30 18:55:30 +00:00
|
|
|
memcpy(&_partInstr, instr, sizeof(AdLibInstrument));
|
2003-05-15 00:05:32 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// MidiChannel method implementations for percussion
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibPercussionChannel::~AdLibPercussionChannel() {
|
2008-12-19 16:21:27 +00:00
|
|
|
for (int i = 0; i < ARRAYSIZE(_customInstruments); ++i) {
|
|
|
|
delete _customInstruments[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPercussionChannel::init(MidiDriver_ADLIB *owner, byte channel) {
|
|
|
|
AdLibPart::init(owner, channel);
|
2012-09-30 18:55:30 +00:00
|
|
|
_priEff = 0;
|
|
|
|
_volEff = 127;
|
2008-12-19 16:21:27 +00:00
|
|
|
|
|
|
|
// Initialize the custom instruments data
|
|
|
|
memset(_notes, 0, sizeof(_notes));
|
|
|
|
memset(_customInstruments, 0, sizeof(_customInstruments));
|
2003-05-15 00:05:32 +00:00
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPercussionChannel::noteOff(byte note) {
|
2012-09-30 19:27:55 +00:00
|
|
|
if (_customInstruments[note]) {
|
|
|
|
note = _notes[note];
|
|
|
|
}
|
|
|
|
|
|
|
|
// This used to ignore note off events, since the builtin percussion
|
|
|
|
// instrument data has a duration value, which causes the percussion notes
|
|
|
|
// to stop automatically. This is not the case for (Groovie's) custom
|
|
|
|
// percussion instruments though. Also the OPL3 driver of Sam&Max actually
|
|
|
|
// does not handle the duration value, so we need it there too.
|
2012-09-30 19:08:40 +00:00
|
|
|
_owner->partKeyOff(this, note);
|
2003-05-15 00:05:32 +00:00
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPercussionChannel::noteOn(byte note, byte velocity) {
|
2012-09-30 23:51:04 +00:00
|
|
|
const AdLibInstrument *inst = NULL;
|
|
|
|
const AdLibInstrument *sec = NULL;
|
2008-12-19 16:21:27 +00:00
|
|
|
|
|
|
|
// The custom instruments have priority over the default mapping
|
2012-11-22 01:22:25 +00:00
|
|
|
// We do not support custom instruments in OPL3 mode though.
|
|
|
|
#ifdef ENABLE_OPL3
|
|
|
|
if (!_owner->_opl3Mode) {
|
|
|
|
#endif
|
|
|
|
inst = _customInstruments[note];
|
|
|
|
if (inst)
|
|
|
|
note = _notes[note];
|
|
|
|
#ifdef ENABLE_OPL3
|
|
|
|
}
|
|
|
|
#endif
|
2008-12-19 16:21:27 +00:00
|
|
|
|
|
|
|
if (!inst) {
|
2012-09-30 17:59:11 +00:00
|
|
|
// Use the default GM to FM mapping as a fallback
|
|
|
|
byte key = g_gmPercussionInstrumentMap[note];
|
2012-09-30 23:51:04 +00:00
|
|
|
if (key != 0xFF) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
if (!_owner->_opl3Mode) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
inst = &g_gmPercussionInstruments[key];
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
} else {
|
|
|
|
inst = &g_gmPercussionInstrumentsOPL3[key][0];
|
|
|
|
sec = &g_gmPercussionInstrumentsOPL3[key][1];
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
}
|
2008-12-19 16:21:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!inst) {
|
|
|
|
debug(2, "No instrument FM definition for GM percussion key %d", (int)note);
|
2003-05-15 00:05:32 +00:00
|
|
|
return;
|
|
|
|
}
|
2008-12-19 16:21:27 +00:00
|
|
|
|
2012-09-30 23:51:04 +00:00
|
|
|
_owner->partKeyOn(this, inst, note, velocity, sec, _pan);
|
2008-12-19 16:21:27 +00:00
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
void AdLibPercussionChannel::sysEx_customInstrument(uint32 type, const byte *instr) {
|
2012-11-22 01:22:25 +00:00
|
|
|
// We do not allow custom instruments in OPL3 mode right now.
|
|
|
|
#ifdef ENABLE_OPL3
|
|
|
|
if (_owner->_opl3Mode) {
|
|
|
|
warning("AdLibPercussionChannel::sysEx_customInstrument: Used in OPL3 mode");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2008-12-19 16:21:27 +00:00
|
|
|
if (type == 'ADLP') {
|
|
|
|
byte note = instr[0];
|
|
|
|
_notes[note] = instr[1];
|
|
|
|
|
|
|
|
// Allocate memory for the new instruments
|
|
|
|
if (!_customInstruments[note]) {
|
2010-01-12 21:07:56 +00:00
|
|
|
_customInstruments[note] = new AdLibInstrument;
|
2011-06-02 22:03:56 +00:00
|
|
|
memset(_customInstruments[note], 0, sizeof(AdLibInstrument));
|
2008-12-19 16:21:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Save the new instrument data
|
2012-09-30 18:55:30 +00:00
|
|
|
_customInstruments[note]->modCharacteristic = instr[2];
|
|
|
|
_customInstruments[note]->modScalingOutputLevel = instr[3];
|
|
|
|
_customInstruments[note]->modAttackDecay = instr[4];
|
|
|
|
_customInstruments[note]->modSustainRelease = instr[5];
|
|
|
|
_customInstruments[note]->modWaveformSelect = instr[6];
|
|
|
|
_customInstruments[note]->carCharacteristic = instr[7];
|
|
|
|
_customInstruments[note]->carScalingOutputLevel = instr[8];
|
|
|
|
_customInstruments[note]->carAttackDecay = instr[9];
|
|
|
|
_customInstruments[note]->carSustainRelease = instr[10];
|
|
|
|
_customInstruments[note]->carWaveformSelect = instr[11];
|
2008-12-19 16:21:27 +00:00
|
|
|
_customInstruments[note]->feedback = instr[12];
|
|
|
|
}
|
2002-11-26 16:54:58 +00:00
|
|
|
}
|
|
|
|
|
2002-11-21 19:06:42 +00:00
|
|
|
// MidiDriver method implementations
|
|
|
|
|
2015-04-30 04:01:30 +00:00
|
|
|
MidiDriver_ADLIB::MidiDriver_ADLIB() {
|
2002-11-21 19:06:42 +00:00
|
|
|
uint i;
|
2003-05-20 13:05:14 +00:00
|
|
|
|
2007-02-16 13:30:41 +00:00
|
|
|
_scummSmallHeader = false;
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
_opl3Mode = false;
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2003-05-20 13:05:14 +00:00
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
_regCache = 0;
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
_regCacheSecondary = 0;
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2003-05-20 13:05:14 +00:00
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
_timerCounter = 0;
|
2012-09-30 23:51:04 +00:00
|
|
|
_voiceIndex = -1;
|
2012-09-30 18:55:30 +00:00
|
|
|
for (i = 0; i < ARRAYSIZE(_curNotTable); ++i) {
|
|
|
|
_curNotTable[i] = 0;
|
2003-05-20 13:05:14 +00:00
|
|
|
}
|
|
|
|
|
2002-11-21 19:06:42 +00:00
|
|
|
for (i = 0; i < ARRAYSIZE(_parts); ++i) {
|
2003-08-08 11:54:24 +00:00
|
|
|
_parts[i].init(this, i + ((i >= 9) ? 1 : 0));
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
2003-08-08 11:54:24 +00:00
|
|
|
_percussion.init(this, 9);
|
2012-09-30 18:55:30 +00:00
|
|
|
_timerIncrease = 0xD69;
|
|
|
|
_timerThreshold = 0x411B;
|
2012-09-30 23:51:04 +00:00
|
|
|
_opl = 0;
|
2015-04-03 14:59:10 +00:00
|
|
|
_adlibTimerProc = 0;
|
2021-04-15 20:16:21 +00:00
|
|
|
_adlibTimerParam = 0;
|
2015-04-30 04:01:30 +00:00
|
|
|
_isOpen = false;
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2003-03-06 18:30:44 +00:00
|
|
|
int MidiDriver_ADLIB::open() {
|
2002-12-11 16:09:58 +00:00
|
|
|
if (_isOpen)
|
2002-11-21 19:06:42 +00:00
|
|
|
return MERR_ALREADY_OPEN;
|
2004-10-17 17:49:45 +00:00
|
|
|
|
2015-04-30 04:01:30 +00:00
|
|
|
_isOpen = true;
|
2003-08-05 23:58:24 +00:00
|
|
|
|
2002-11-21 19:06:42 +00:00
|
|
|
int i;
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibVoice *voice;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2003-05-15 00:05:32 +00:00
|
|
|
for (i = 0, voice = _voices; i != ARRAYSIZE(_voices); i++, voice++) {
|
|
|
|
voice->_channel = i;
|
|
|
|
voice->_s11a.s10 = &voice->_s10b;
|
|
|
|
voice->_s11b.s10 = &voice->_s10a;
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2012-09-30 23:51:04 +00:00
|
|
|
// Try to use OPL3 when requested.
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
if (_opl3Mode) {
|
|
|
|
_opl = OPL::Config::create(OPL::Config::kOpl3);
|
|
|
|
}
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 23:51:04 +00:00
|
|
|
// Initialize plain OPL2 when no OPL3 is intiailized already.
|
|
|
|
if (!_opl) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
_opl = OPL::Config::create();
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
_opl3Mode = false;
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2015-04-03 05:05:03 +00:00
|
|
|
_opl->init();
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 23:51:04 +00:00
|
|
|
_regCache = (byte *)calloc(256, 1);
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
adlibWrite(8, 0x40);
|
|
|
|
adlibWrite(0xBD, 0x00);
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
if (!_opl3Mode) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
adlibWrite(1, 0x20);
|
|
|
|
createLookupTable();
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
} else {
|
|
|
|
_regCacheSecondary = (byte *)calloc(256, 1);
|
|
|
|
adlibWriteSecondary(5, 1);
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2015-04-03 14:59:10 +00:00
|
|
|
_opl->start(new Common::Functor0Mem<void, MidiDriver_ADLIB>(this, &MidiDriver_ADLIB::onTimer));
|
2002-11-21 19:06:42 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-03-06 18:30:44 +00:00
|
|
|
void MidiDriver_ADLIB::close() {
|
2003-05-18 23:55:53 +00:00
|
|
|
if (!_isOpen)
|
|
|
|
return;
|
2004-10-17 17:49:45 +00:00
|
|
|
_isOpen = false;
|
|
|
|
|
2015-04-30 04:01:30 +00:00
|
|
|
// Stop the OPL timer
|
|
|
|
_opl->stop();
|
2003-05-18 23:55:53 +00:00
|
|
|
|
2002-11-21 19:19:14 +00:00
|
|
|
uint i;
|
2003-05-15 00:05:32 +00:00
|
|
|
for (i = 0; i < ARRAYSIZE(_voices); ++i) {
|
2004-11-08 10:16:07 +00:00
|
|
|
if (_voices[i]._part)
|
2012-09-30 19:08:40 +00:00
|
|
|
mcOff(&_voices[i]);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2003-06-15 01:05:03 +00:00
|
|
|
// Turn off the OPL emulation
|
2012-09-30 19:36:52 +00:00
|
|
|
delete _opl;
|
2012-09-30 23:51:04 +00:00
|
|
|
_opl = 0;
|
2005-07-30 21:11:48 +00:00
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
free(_regCache);
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
free(_regCacheSecondary);
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2004-11-08 10:16:07 +00:00
|
|
|
void MidiDriver_ADLIB::send(uint32 b) {
|
|
|
|
send(b & 0xF, b & 0xFFFFFFF0);
|
2003-08-08 11:54:24 +00:00
|
|
|
}
|
|
|
|
|
2020-07-07 10:18:20 +00:00
|
|
|
void MidiDriver_ADLIB::send(int8 chan, uint32 b) {
|
2002-11-21 19:19:14 +00:00
|
|
|
//byte param3 = (byte) ((b >> 24) & 0xFF);
|
2012-09-30 18:25:57 +00:00
|
|
|
byte param2 = (byte)((b >> 16) & 0xFF);
|
|
|
|
byte param1 = (byte)((b >> 8) & 0xFF);
|
|
|
|
byte cmd = (byte)(b & 0xF0);
|
2003-05-15 00:05:32 +00:00
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibPart *part;
|
2003-05-15 00:05:32 +00:00
|
|
|
if (chan == 9)
|
|
|
|
part = &_percussion;
|
|
|
|
else
|
2004-11-08 10:16:07 +00:00
|
|
|
part = &_parts[chan];
|
2002-11-21 19:06:42 +00:00
|
|
|
|
|
|
|
switch (cmd) {
|
|
|
|
case 0x80:// Note Off
|
2003-08-05 23:57:37 +00:00
|
|
|
part->noteOff(param1);
|
2003-03-06 18:30:44 +00:00
|
|
|
break;
|
2002-11-21 19:06:42 +00:00
|
|
|
case 0x90: // Note On
|
2003-08-05 23:57:37 +00:00
|
|
|
part->noteOn(param1, param2);
|
2003-03-06 18:30:44 +00:00
|
|
|
break;
|
2002-11-21 19:06:42 +00:00
|
|
|
case 0xA0: // Aftertouch
|
2002-11-26 16:54:58 +00:00
|
|
|
break; // Not supported.
|
2002-11-21 19:06:42 +00:00
|
|
|
case 0xB0: // Control Change
|
2003-08-05 23:57:37 +00:00
|
|
|
part->controlChange(param1, param2);
|
2003-03-06 18:30:44 +00:00
|
|
|
break;
|
2002-11-21 19:06:42 +00:00
|
|
|
case 0xC0: // Program Change
|
2003-08-05 23:57:37 +00:00
|
|
|
part->programChange(param1);
|
2002-11-21 19:06:42 +00:00
|
|
|
break;
|
|
|
|
case 0xD0: // Channel Pressure
|
2002-11-26 16:54:58 +00:00
|
|
|
break; // Not supported.
|
2002-11-21 19:06:42 +00:00
|
|
|
case 0xE0: // Pitch Bend
|
2003-08-05 23:57:37 +00:00
|
|
|
part->pitchBend((param1 | (param2 << 7)) - 0x2000);
|
2003-03-06 18:30:44 +00:00
|
|
|
break;
|
2002-11-21 19:06:42 +00:00
|
|
|
case 0xF0: // SysEx
|
|
|
|
// We should never get here! SysEx information has to be
|
|
|
|
// sent via high-level semantic methods.
|
2003-08-05 23:57:37 +00:00
|
|
|
warning("MidiDriver_ADLIB: Receiving SysEx command on a send() call");
|
2002-11-21 19:06:42 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
2003-08-05 23:57:37 +00:00
|
|
|
warning("MidiDriver_ADLIB: Unknown send() command 0x%02X", cmd);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2003-08-05 23:57:37 +00:00
|
|
|
uint32 MidiDriver_ADLIB::property(int prop, uint32 param) {
|
2002-12-01 15:51:29 +00:00
|
|
|
switch (prop) {
|
2012-09-30 18:25:57 +00:00
|
|
|
case PROP_OLD_ADLIB: // Older games used a different operator volume algorithm
|
|
|
|
_scummSmallHeader = (param > 0);
|
|
|
|
if (_scummSmallHeader) {
|
2012-09-30 18:55:30 +00:00
|
|
|
_timerIncrease = 473;
|
|
|
|
_timerThreshold = 1000;
|
2012-09-30 18:25:57 +00:00
|
|
|
} else {
|
2012-09-30 18:55:30 +00:00
|
|
|
_timerIncrease = 0xD69;
|
|
|
|
_timerThreshold = 0x411B;
|
2012-09-30 18:25:57 +00:00
|
|
|
}
|
|
|
|
return 1;
|
2012-09-30 23:51:04 +00:00
|
|
|
|
|
|
|
case PROP_SCUMM_OPL3: // Sam&Max OPL3 support.
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
_opl3Mode = (param > 0);
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
return 1;
|
2019-11-17 08:20:01 +00:00
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
2002-12-01 15:51:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2003-08-05 23:57:37 +00:00
|
|
|
void MidiDriver_ADLIB::setPitchBendRange(byte channel, uint range) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
// Not supported in OPL3 mode.
|
|
|
|
if (_opl3Mode) {
|
|
|
|
return;
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibVoice *voice;
|
|
|
|
AdLibPart *part = &_parts[channel];
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
part->_pitchBendFactor = range;
|
2003-05-15 00:05:32 +00:00
|
|
|
for (voice = part->_voice; voice; voice = voice->_next) {
|
2012-09-30 19:22:03 +00:00
|
|
|
adlibNoteOn(voice->_channel, voice->_note/* + part->_transposeEff*/,
|
2012-09-30 18:55:30 +00:00
|
|
|
(part->_pitchBend * part->_pitchBendFactor >> 6) + part->_detuneEff);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-02-27 01:59:07 +00:00
|
|
|
void MidiDriver_ADLIB::sysEx_customInstrument(byte channel, uint32 type, const byte *instr) {
|
2003-08-05 23:57:37 +00:00
|
|
|
_parts[channel].sysEx_customInstrument(type, instr);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2003-03-06 18:30:44 +00:00
|
|
|
MidiChannel *MidiDriver_ADLIB::allocateChannel() {
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibPart *part;
|
2002-11-26 16:54:58 +00:00
|
|
|
uint i;
|
2003-03-06 18:30:44 +00:00
|
|
|
|
2002-11-26 16:54:58 +00:00
|
|
|
for (i = 0; i < ARRAYSIZE(_parts); ++i) {
|
|
|
|
part = &_parts[i];
|
|
|
|
if (!part->_allocated) {
|
|
|
|
part->allocate();
|
2004-11-08 10:16:07 +00:00
|
|
|
return part;
|
2002-11-26 16:54:58 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
// All the code brought over from IMuseAdLib
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
void MidiDriver_ADLIB::adlibWrite(byte reg, byte value) {
|
2012-09-30 23:51:04 +00:00
|
|
|
if (_regCache[reg] == value) {
|
2002-11-21 19:06:42 +00:00
|
|
|
return;
|
2012-09-30 23:51:04 +00:00
|
|
|
}
|
2003-08-15 16:40:17 +00:00
|
|
|
#ifdef DEBUG_ADLIB
|
2012-09-30 19:08:40 +00:00
|
|
|
debug(6, "%10d: adlibWrite[%x] = %x", g_tick, reg, value);
|
2003-08-15 16:40:17 +00:00
|
|
|
#endif
|
2012-09-30 18:55:30 +00:00
|
|
|
_regCache[reg] = value;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 19:36:52 +00:00
|
|
|
_opl->writeReg(reg, value);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
void MidiDriver_ADLIB::adlibWriteSecondary(byte reg, byte value) {
|
|
|
|
assert(_opl3Mode);
|
|
|
|
|
|
|
|
if (_regCacheSecondary[reg] == value) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
#ifdef DEBUG_ADLIB
|
|
|
|
debug(6, "%10d: adlibWriteSecondary[%x] = %x", g_tick, reg, value);
|
|
|
|
#endif
|
|
|
|
_regCacheSecondary[reg] = value;
|
|
|
|
|
|
|
|
_opl->writeReg(reg | 0x100, value);
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
|
2004-11-08 10:16:07 +00:00
|
|
|
void MidiDriver_ADLIB::onTimer() {
|
2015-04-03 14:59:10 +00:00
|
|
|
if (_adlibTimerProc)
|
|
|
|
(*_adlibTimerProc)(_adlibTimerParam);
|
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
_timerCounter += _timerIncrease;
|
|
|
|
while (_timerCounter >= _timerThreshold) {
|
|
|
|
_timerCounter -= _timerThreshold;
|
2003-08-15 16:40:17 +00:00
|
|
|
#ifdef DEBUG_ADLIB
|
2012-09-30 17:59:11 +00:00
|
|
|
g_tick++;
|
2003-08-15 16:40:17 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
// Sam&Max's OPL3 driver does not have any timer handling like this.
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
if (!_opl3Mode) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
AdLibVoice *voice = _voices;
|
|
|
|
for (int i = 0; i != ARRAYSIZE(_voices); i++, voice++) {
|
|
|
|
if (!voice->_part)
|
|
|
|
continue;
|
|
|
|
if (voice->_duration && (voice->_duration -= 0x11) <= 0) {
|
|
|
|
mcOff(voice);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (voice->_s10a.active) {
|
|
|
|
mcIncStuff(voice, &voice->_s10a, &voice->_s11a);
|
|
|
|
}
|
|
|
|
if (voice->_s10b.active) {
|
|
|
|
mcIncStuff(voice, &voice->_s10b, &voice->_s11b);
|
|
|
|
}
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-04-03 14:59:10 +00:00
|
|
|
void MidiDriver_ADLIB::setTimerCallback(void *timerParam, Common::TimerManager::TimerProc timerProc) {
|
|
|
|
_adlibTimerProc = timerProc;
|
|
|
|
_adlibTimerParam = timerParam;
|
|
|
|
}
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
void MidiDriver_ADLIB::mcOff(AdLibVoice *voice) {
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibVoice *tmp;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
adlibKeyOff(voice->_channel);
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2003-05-15 00:05:32 +00:00
|
|
|
tmp = voice->_prev;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2003-05-15 00:05:32 +00:00
|
|
|
if (voice->_next)
|
|
|
|
voice->_next->_prev = tmp;
|
2002-11-21 19:06:42 +00:00
|
|
|
if (tmp)
|
2003-05-15 00:05:32 +00:00
|
|
|
tmp->_next = voice->_next;
|
2002-11-21 19:06:42 +00:00
|
|
|
else
|
2003-05-15 00:05:32 +00:00
|
|
|
voice->_part->_voice = voice->_next;
|
|
|
|
voice->_part = NULL;
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
void MidiDriver_ADLIB::mcIncStuff(AdLibVoice *voice, Struct10 *s10, Struct11 *s11) {
|
2002-11-21 19:06:42 +00:00
|
|
|
byte code;
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibPart *part = voice->_part;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
code = struct10OnTimer(s10, s11);
|
2002-11-21 19:06:42 +00:00
|
|
|
|
|
|
|
if (code & 1) {
|
|
|
|
switch (s11->param) {
|
|
|
|
case 0:
|
2012-09-30 18:55:30 +00:00
|
|
|
voice->_vol2 = s10->startValue + s11->modifyVal;
|
2007-02-16 13:30:41 +00:00
|
|
|
if (!_scummSmallHeader) {
|
2012-09-30 19:08:40 +00:00
|
|
|
adlibSetParam(voice->_channel, 0,
|
2012-09-30 18:55:30 +00:00
|
|
|
g_volumeTable[g_volumeLookupTable[voice->_vol2]
|
|
|
|
[part->_volEff >> 2]]);
|
2003-08-12 16:09:41 +00:00
|
|
|
} else {
|
2012-09-30 19:08:40 +00:00
|
|
|
adlibSetParam(voice->_channel, 0, voice->_vol2);
|
2003-08-12 16:09:41 +00:00
|
|
|
}
|
2002-11-21 19:06:42 +00:00
|
|
|
break;
|
|
|
|
case 13:
|
2012-09-30 18:55:30 +00:00
|
|
|
voice->_vol1 = s10->startValue + s11->modifyVal;
|
|
|
|
if (voice->_twoChan && !_scummSmallHeader) {
|
2012-09-30 19:08:40 +00:00
|
|
|
adlibSetParam(voice->_channel, 13,
|
2012-09-30 18:55:30 +00:00
|
|
|
g_volumeTable[g_volumeLookupTable[voice->_vol1]
|
|
|
|
[part->_volEff >> 2]]);
|
2002-11-21 19:06:42 +00:00
|
|
|
} else {
|
2012-09-30 19:08:40 +00:00
|
|
|
adlibSetParam(voice->_channel, 13, voice->_vol1);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 30:
|
2012-09-30 18:55:30 +00:00
|
|
|
s11->s10->modWheel = (char)s11->modifyVal;
|
2002-11-21 19:06:42 +00:00
|
|
|
break;
|
|
|
|
case 31:
|
2012-09-30 18:55:30 +00:00
|
|
|
s11->s10->unk3 = (char)s11->modifyVal;
|
2002-11-21 19:06:42 +00:00
|
|
|
break;
|
|
|
|
default:
|
2012-09-30 19:08:40 +00:00
|
|
|
adlibSetParam(voice->_channel, s11->param,
|
2012-09-30 18:55:30 +00:00
|
|
|
s10->startValue + s11->modifyVal);
|
2002-11-21 19:06:42 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (code & 2 && s11->flag0x10)
|
2012-09-30 19:08:40 +00:00
|
|
|
adlibKeyOnOff(voice->_channel);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
void MidiDriver_ADLIB::adlibKeyOff(int chan) {
|
2009-04-22 20:18:12 +00:00
|
|
|
byte reg = chan + 0xB0;
|
2012-09-30 19:08:40 +00:00
|
|
|
adlibWrite(reg, adlibGetRegValue(reg) & ~0x20);
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
if (_opl3Mode) {
|
|
|
|
adlibWriteSecondary(reg, adlibGetRegValueSecondary(reg) & ~0x20);
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
byte MidiDriver_ADLIB::struct10OnTimer(Struct10 *s10, Struct11 *s11) {
|
2002-11-21 19:06:42 +00:00
|
|
|
byte result = 0;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if (s10->count && (s10->count -= 17) <= 0) {
|
|
|
|
s10->active = 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
i = s10->curVal + s10->speedHi;
|
|
|
|
s10->speedLoCounter += s10->speedLo;
|
|
|
|
if (s10->speedLoCounter >= s10->speedLoMax) {
|
|
|
|
s10->speedLoCounter -= s10->speedLoMax;
|
2002-11-21 19:06:42 +00:00
|
|
|
i += s10->direction;
|
|
|
|
}
|
2012-09-30 18:55:30 +00:00
|
|
|
if (s10->curVal != i || s10->modWheel != s10->modWheelLast) {
|
|
|
|
s10->curVal = i;
|
|
|
|
s10->modWheelLast = s10->modWheel;
|
2012-09-30 19:08:40 +00:00
|
|
|
i = lookupVolume(i, s10->modWheelLast);
|
2012-09-30 18:55:30 +00:00
|
|
|
if (i != s11->modifyVal) {
|
|
|
|
s11->modifyVal = i;
|
2002-11-21 19:06:42 +00:00
|
|
|
result = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
if (!--s10->numSteps) {
|
2002-11-21 19:06:42 +00:00
|
|
|
s10->active++;
|
|
|
|
if (s10->active > 4) {
|
|
|
|
if (s10->loop) {
|
|
|
|
s10->active = 1;
|
|
|
|
result |= 2;
|
2012-09-30 19:08:40 +00:00
|
|
|
struct10Setup(s10);
|
2002-11-21 19:06:42 +00:00
|
|
|
} else {
|
|
|
|
s10->active = 0;
|
|
|
|
}
|
|
|
|
} else {
|
2012-09-30 19:08:40 +00:00
|
|
|
struct10Setup(s10);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2012-09-30 23:51:04 +00:00
|
|
|
void MidiDriver_ADLIB::adlibSetParam(int channel, byte param, int value, bool primary) {
|
2010-01-12 21:07:56 +00:00
|
|
|
const AdLibSetParams *as;
|
2009-04-22 20:18:12 +00:00
|
|
|
byte reg;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
|
|
|
assert(channel >= 0 && channel < 9);
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
assert(!_opl3Mode || (param == 0 || param == 13));
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2002-11-21 19:06:42 +00:00
|
|
|
|
|
|
|
if (param <= 12) {
|
2012-09-30 17:59:11 +00:00
|
|
|
reg = g_operator2Offsets[channel];
|
2002-11-21 19:06:42 +00:00
|
|
|
} else if (param <= 25) {
|
|
|
|
param -= 13;
|
2012-09-30 17:59:11 +00:00
|
|
|
reg = g_operator1Offsets[channel];
|
2002-11-21 19:06:42 +00:00
|
|
|
} else if (param <= 27) {
|
|
|
|
param -= 13;
|
2009-04-22 20:18:12 +00:00
|
|
|
reg = channel;
|
2002-11-21 19:06:42 +00:00
|
|
|
} else if (param == 28 || param == 29) {
|
|
|
|
if (param == 28)
|
|
|
|
value -= 15;
|
|
|
|
else
|
|
|
|
value -= 383;
|
2017-11-30 01:27:57 +00:00
|
|
|
value *= 16;
|
2012-09-30 18:55:30 +00:00
|
|
|
_channelTable2[channel] = value;
|
2012-09-30 19:08:40 +00:00
|
|
|
adlibPlayNote(channel, _curNotTable[channel] + value);
|
2002-11-21 19:06:42 +00:00
|
|
|
return;
|
|
|
|
} else {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-09-30 17:59:11 +00:00
|
|
|
as = &g_setParamTable[param];
|
2012-09-30 19:17:04 +00:00
|
|
|
if (as->inversion)
|
|
|
|
value = as->inversion - value;
|
|
|
|
reg += as->registerBase;
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
if (primary) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
adlibWrite(reg, (adlibGetRegValue(reg) & ~as->mask) | (((byte)value) << as->shift));
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
} else {
|
|
|
|
adlibWriteSecondary(reg, (adlibGetRegValueSecondary(reg) & ~as->mask) | (((byte)value) << as->shift));
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
void MidiDriver_ADLIB::adlibKeyOnOff(int channel) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
assert(!_opl3Mode);
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
|
2002-11-21 19:06:42 +00:00
|
|
|
byte val;
|
2009-04-22 20:18:12 +00:00
|
|
|
byte reg = channel + 0xB0;
|
2002-11-21 19:06:42 +00:00
|
|
|
assert(channel >= 0 && channel < 9);
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
val = adlibGetRegValue(reg);
|
|
|
|
adlibWrite(reg, val & ~0x20);
|
|
|
|
adlibWrite(reg, val | 0x20);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
void MidiDriver_ADLIB::struct10Setup(Struct10 *s10) {
|
2002-11-21 19:06:42 +00:00
|
|
|
int b, c, d, e, f, g, h;
|
|
|
|
byte t;
|
|
|
|
|
|
|
|
b = s10->unk3;
|
|
|
|
f = s10->active - 1;
|
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
t = s10->tableA[f];
|
2012-09-30 17:59:11 +00:00
|
|
|
e = g_numStepsTable[g_volumeLookupTable[t & 0x7F][b]];
|
2002-11-21 19:06:42 +00:00
|
|
|
if (t & 0x80) {
|
2012-09-30 19:08:40 +00:00
|
|
|
e = randomNr(e);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
if (e == 0)
|
|
|
|
e++;
|
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
s10->numSteps = s10->speedLoMax = e;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
|
|
|
if (f != 2) {
|
2012-09-30 18:55:30 +00:00
|
|
|
c = s10->maxValue;
|
|
|
|
g = s10->startValue;
|
|
|
|
t = s10->tableB[f];
|
2012-09-30 19:08:40 +00:00
|
|
|
d = lookupVolume(c, (t & 0x7F) - 31);
|
2002-11-21 19:06:42 +00:00
|
|
|
if (t & 0x80) {
|
2012-09-30 19:08:40 +00:00
|
|
|
d = randomNr(d);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
if (d + g > c) {
|
|
|
|
h = c - g;
|
|
|
|
} else {
|
|
|
|
h = d;
|
|
|
|
if (d + g < 0)
|
|
|
|
h = -g;
|
|
|
|
}
|
2012-09-30 18:55:30 +00:00
|
|
|
h -= s10->curVal;
|
2002-11-21 19:06:42 +00:00
|
|
|
} else {
|
|
|
|
h = 0;
|
|
|
|
}
|
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
s10->speedHi = h / e;
|
2002-11-21 19:06:42 +00:00
|
|
|
if (h < 0) {
|
|
|
|
h = -h;
|
|
|
|
s10->direction = -1;
|
|
|
|
} else {
|
|
|
|
s10->direction = 1;
|
|
|
|
}
|
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
s10->speedLo = h % e;
|
|
|
|
s10->speedLoCounter = 0;
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
void MidiDriver_ADLIB::adlibPlayNote(int channel, int note) {
|
2002-11-21 19:06:42 +00:00
|
|
|
byte old, oct, notex;
|
|
|
|
int note2;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
note2 = (note >> 7) - 4;
|
2003-07-11 06:25:37 +00:00
|
|
|
note2 = (note2 < 128) ? note2 : 0;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2003-05-22 21:24:36 +00:00
|
|
|
oct = (note2 / 12);
|
|
|
|
if (oct > 7)
|
|
|
|
oct = 7 << 2;
|
|
|
|
else
|
|
|
|
oct <<= 2;
|
|
|
|
notex = note2 % 12 + 3;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
old = adlibGetRegValue(channel + 0xB0);
|
2002-11-21 19:06:42 +00:00
|
|
|
if (old & 0x20) {
|
|
|
|
old &= ~0x20;
|
|
|
|
if (oct > old) {
|
|
|
|
if (notex < 6) {
|
|
|
|
notex += 12;
|
|
|
|
oct -= 4;
|
|
|
|
}
|
|
|
|
} else if (oct < old) {
|
|
|
|
if (notex > 11) {
|
|
|
|
notex -= 12;
|
|
|
|
oct += 4;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
i = (notex << 3) + ((note >> 4) & 0x7);
|
2012-09-30 19:08:40 +00:00
|
|
|
adlibWrite(channel + 0xA0, g_noteFrequencies[i]);
|
|
|
|
adlibWrite(channel + 0xB0, oct | 0x20);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
int MidiDriver_ADLIB::randomNr(int a) {
|
2012-09-30 18:55:30 +00:00
|
|
|
static byte _randSeed = 1;
|
|
|
|
if (_randSeed & 1) {
|
|
|
|
_randSeed >>= 1;
|
|
|
|
_randSeed ^= 0xB8;
|
2004-03-19 07:36:20 +00:00
|
|
|
} else {
|
2012-09-30 18:55:30 +00:00
|
|
|
_randSeed >>= 1;
|
2004-03-19 07:36:20 +00:00
|
|
|
}
|
2012-09-30 18:55:30 +00:00
|
|
|
return _randSeed * a >> 8;
|
2004-03-19 07:36:20 +00:00
|
|
|
}
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
void MidiDriver_ADLIB::partKeyOff(AdLibPart *part, byte note) {
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibVoice *voice;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2003-05-15 00:05:32 +00:00
|
|
|
for (voice = part->_voice; voice; voice = voice->_next) {
|
|
|
|
if (voice->_note == note) {
|
2002-11-21 19:06:42 +00:00
|
|
|
if (part->_pedal)
|
2012-09-30 18:55:30 +00:00
|
|
|
voice->_waitForPedal = true;
|
2002-11-21 19:06:42 +00:00
|
|
|
else
|
2012-09-30 19:08:40 +00:00
|
|
|
mcOff(voice);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-30 23:51:04 +00:00
|
|
|
void MidiDriver_ADLIB::partKeyOn(AdLibPart *part, const AdLibInstrument *instr, byte note, byte velocity, const AdLibInstrument *second, byte pan) {
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibVoice *voice;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
voice = allocateVoice(part->_priEff);
|
2003-05-15 00:05:32 +00:00
|
|
|
if (!voice)
|
2002-11-21 19:06:42 +00:00
|
|
|
return;
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
linkMc(part, voice);
|
2012-09-30 23:51:04 +00:00
|
|
|
mcKeyOn(voice, instr, note, velocity, second, pan);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
AdLibVoice *MidiDriver_ADLIB::allocateVoice(byte pri) {
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibVoice *ac, *best = NULL;
|
2002-11-21 19:06:42 +00:00
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < 9; i++) {
|
2012-09-30 18:55:30 +00:00
|
|
|
if (++_voiceIndex >= 9)
|
|
|
|
_voiceIndex = 0;
|
|
|
|
ac = &_voices[_voiceIndex];
|
2002-11-21 19:06:42 +00:00
|
|
|
if (!ac->_part)
|
|
|
|
return ac;
|
|
|
|
if (!ac->_next) {
|
2012-09-30 18:55:30 +00:00
|
|
|
if (ac->_part->_priEff <= pri) {
|
|
|
|
pri = ac->_part->_priEff;
|
2002-11-21 19:06:42 +00:00
|
|
|
best = ac;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-02-16 13:30:41 +00:00
|
|
|
/* SCUMM V3 games don't have note priorities, first comes wins. */
|
|
|
|
if (_scummSmallHeader)
|
2003-08-17 19:31:10 +00:00
|
|
|
return NULL;
|
|
|
|
|
2002-11-21 19:06:42 +00:00
|
|
|
if (best)
|
2012-09-30 19:08:40 +00:00
|
|
|
mcOff(best);
|
2002-11-21 19:06:42 +00:00
|
|
|
return best;
|
|
|
|
}
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
void MidiDriver_ADLIB::linkMc(AdLibPart *part, AdLibVoice *voice) {
|
2003-05-15 00:05:32 +00:00
|
|
|
voice->_part = part;
|
2010-01-12 21:07:56 +00:00
|
|
|
voice->_next = (AdLibVoice *)part->_voice;
|
2003-05-15 00:05:32 +00:00
|
|
|
part->_voice = voice;
|
|
|
|
voice->_prev = NULL;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2003-05-15 00:05:32 +00:00
|
|
|
if (voice->_next)
|
|
|
|
voice->_next->_prev = voice;
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2012-09-30 23:51:04 +00:00
|
|
|
void MidiDriver_ADLIB::mcKeyOn(AdLibVoice *voice, const AdLibInstrument *instr, byte note, byte velocity, const AdLibInstrument *second, byte pan) {
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibPart *part = voice->_part;
|
2012-09-30 18:55:30 +00:00
|
|
|
byte vol1, vol2;
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-11-23 19:01:38 +00:00
|
|
|
byte secVol1 = 0, secVol2 = 0;
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
voice->_twoChan = instr->feedback & 1;
|
2003-05-15 00:05:32 +00:00
|
|
|
voice->_note = note;
|
2012-09-30 18:55:30 +00:00
|
|
|
voice->_waitForPedal = false;
|
2003-05-15 00:05:32 +00:00
|
|
|
voice->_duration = instr->duration;
|
|
|
|
if (voice->_duration != 0)
|
|
|
|
voice->_duration *= 63;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-12-01 10:40:33 +00:00
|
|
|
if (!_scummSmallHeader) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-12-01 10:48:51 +00:00
|
|
|
if (_opl3Mode)
|
|
|
|
vol1 = (instr->modScalingOutputLevel & 0x3F) + (velocity * ((instr->modWaveformSelect >> 3) + 1)) / 64;
|
2012-12-01 10:40:33 +00:00
|
|
|
else
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-12-01 10:48:51 +00:00
|
|
|
vol1 = (instr->modScalingOutputLevel & 0x3F) + g_volumeLookupTable[velocity >> 1][instr->modWaveformSelect >> 2];
|
2012-12-01 10:40:33 +00:00
|
|
|
} else {
|
2012-09-30 18:55:30 +00:00
|
|
|
vol1 = 0x3f - (instr->modScalingOutputLevel & 0x3F);
|
2012-12-01 10:40:33 +00:00
|
|
|
}
|
2012-09-30 18:55:30 +00:00
|
|
|
if (vol1 > 0x3F)
|
|
|
|
vol1 = 0x3F;
|
|
|
|
voice->_vol1 = vol1;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-12-01 10:40:33 +00:00
|
|
|
if (!_scummSmallHeader) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-12-01 10:48:51 +00:00
|
|
|
if (_opl3Mode)
|
|
|
|
vol2 = (instr->carScalingOutputLevel & 0x3F) + (velocity * ((instr->carWaveformSelect >> 3) + 1)) / 64;
|
2012-12-01 10:40:33 +00:00
|
|
|
else
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-12-01 10:48:51 +00:00
|
|
|
vol2 = (instr->carScalingOutputLevel & 0x3F) + g_volumeLookupTable[velocity >> 1][instr->carWaveformSelect >> 2];
|
2012-12-01 10:40:33 +00:00
|
|
|
} else {
|
2012-09-30 18:55:30 +00:00
|
|
|
vol2 = 0x3f - (instr->carScalingOutputLevel & 0x3F);
|
2012-12-01 10:40:33 +00:00
|
|
|
}
|
2012-09-30 18:55:30 +00:00
|
|
|
if (vol2 > 0x3F)
|
|
|
|
vol2 = 0x3F;
|
|
|
|
voice->_vol2 = vol2;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
if (_opl3Mode) {
|
|
|
|
voice->_secTwoChan = second->feedback & 1;
|
|
|
|
secVol1 = (second->modScalingOutputLevel & 0x3F) + (velocity * ((second->modWaveformSelect >> 3) + 1)) / 64;
|
|
|
|
if (secVol1 > 0x3F) {
|
|
|
|
secVol1 = 0x3F;
|
|
|
|
}
|
|
|
|
voice->_secVol1 = secVol1;
|
|
|
|
secVol2 = (second->carScalingOutputLevel & 0x3F) + (velocity * ((second->carWaveformSelect >> 3) + 1)) / 64;
|
|
|
|
if (secVol2 > 0x3F) {
|
|
|
|
secVol2 = 0x3F;
|
|
|
|
}
|
|
|
|
voice->_secVol2 = secVol2;
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2007-02-16 13:30:41 +00:00
|
|
|
if (!_scummSmallHeader) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
if (!_opl3Mode) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
int c = part->_volEff >> 2;
|
|
|
|
vol2 = g_volumeTable[g_volumeLookupTable[vol2][c]];
|
|
|
|
if (voice->_twoChan)
|
|
|
|
vol1 = g_volumeTable[g_volumeLookupTable[vol1][c]];
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
} else {
|
|
|
|
vol2 = g_volumeTable[((vol2 + 1) * part->_volEff) >> 7];
|
|
|
|
secVol2 = g_volumeTable[((secVol2 + 1) * part->_volEff) >> 7];
|
|
|
|
if (voice->_twoChan)
|
|
|
|
vol1 = g_volumeTable[((vol1 + 1) * part->_volEff) >> 7];
|
|
|
|
if (voice->_secTwoChan)
|
|
|
|
secVol1 = g_volumeTable[((secVol1 + 1) * part->_volEff) >> 7];
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2003-08-12 16:09:41 +00:00
|
|
|
}
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
adlibSetupChannel(voice->_channel, instr, vol1, vol2);
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
if (!_opl3Mode) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
adlibNoteOnEx(voice->_channel, /*part->_transposeEff + */note, part->_detuneEff + (part->_pitchBend * part->_pitchBendFactor >> 6));
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 23:51:04 +00:00
|
|
|
if (instr->flagsA & 0x80) {
|
|
|
|
mcInitStuff(voice, &voice->_s10a, &voice->_s11a, instr->flagsA, &instr->extraA);
|
|
|
|
} else {
|
|
|
|
voice->_s10a.active = 0;
|
|
|
|
}
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 23:51:04 +00:00
|
|
|
if (instr->flagsB & 0x80) {
|
|
|
|
mcInitStuff(voice, &voice->_s10b, &voice->_s11b, instr->flagsB, &instr->extraB);
|
|
|
|
} else {
|
|
|
|
voice->_s10b.active = 0;
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2002-11-21 19:06:42 +00:00
|
|
|
} else {
|
2012-09-30 23:51:04 +00:00
|
|
|
adlibSetupChannelSecondary(voice->_channel, second, secVol1, secVol2, pan);
|
|
|
|
adlibNoteOnEx(voice->_channel, note, part->_pitchBend >> 1);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2012-09-30 23:51:04 +00:00
|
|
|
void MidiDriver_ADLIB::adlibSetupChannel(int chan, const AdLibInstrument *instr, byte vol1, byte vol2) {
|
2002-11-21 19:06:42 +00:00
|
|
|
assert(chan >= 0 && chan < 9);
|
|
|
|
|
2012-09-30 23:51:04 +00:00
|
|
|
byte channel = g_operator1Offsets[chan];
|
2012-09-30 19:08:40 +00:00
|
|
|
adlibWrite(channel + 0x20, instr->modCharacteristic);
|
|
|
|
adlibWrite(channel + 0x40, (instr->modScalingOutputLevel | 0x3F) - vol1);
|
|
|
|
adlibWrite(channel + 0x60, 0xff & (~instr->modAttackDecay));
|
|
|
|
adlibWrite(channel + 0x80, 0xff & (~instr->modSustainRelease));
|
|
|
|
adlibWrite(channel + 0xE0, instr->modWaveformSelect);
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 17:59:11 +00:00
|
|
|
channel = g_operator2Offsets[chan];
|
2012-09-30 19:08:40 +00:00
|
|
|
adlibWrite(channel + 0x20, instr->carCharacteristic);
|
|
|
|
adlibWrite(channel + 0x40, (instr->carScalingOutputLevel | 0x3F) - vol2);
|
|
|
|
adlibWrite(channel + 0x60, 0xff & (~instr->carAttackDecay));
|
|
|
|
adlibWrite(channel + 0x80, 0xff & (~instr->carSustainRelease));
|
|
|
|
adlibWrite(channel + 0xE0, instr->carWaveformSelect);
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-11-22 01:18:51 +00:00
|
|
|
adlibWrite((byte)chan + 0xC0, instr->feedback
|
|
|
|
#ifdef ENABLE_OPL3
|
|
|
|
| (_opl3Mode ? 0x30 : 0)
|
|
|
|
#endif
|
|
|
|
);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
void MidiDriver_ADLIB::adlibSetupChannelSecondary(int chan, const AdLibInstrument *instr, byte vol1, byte vol2, byte pan) {
|
2002-11-21 19:06:42 +00:00
|
|
|
assert(chan >= 0 && chan < 9);
|
2012-09-30 23:51:04 +00:00
|
|
|
assert(_opl3Mode);
|
|
|
|
|
|
|
|
byte channel = g_operator1Offsets[chan];
|
|
|
|
adlibWriteSecondary(channel + 0x20, instr->modCharacteristic);
|
|
|
|
adlibWriteSecondary(channel + 0x40, (instr->modScalingOutputLevel | 0x3F) - vol1);
|
|
|
|
adlibWriteSecondary(channel + 0x60, 0xff & (~instr->modAttackDecay));
|
|
|
|
adlibWriteSecondary(channel + 0x80, 0xff & (~instr->modSustainRelease));
|
|
|
|
adlibWriteSecondary(channel + 0xE0, instr->modWaveformSelect);
|
|
|
|
|
|
|
|
channel = g_operator2Offsets[chan];
|
|
|
|
adlibWriteSecondary(channel + 0x20, instr->carCharacteristic);
|
|
|
|
adlibWriteSecondary(channel + 0x40, (instr->carScalingOutputLevel | 0x3F) - vol2);
|
|
|
|
adlibWriteSecondary(channel + 0x60, 0xff & (~instr->carAttackDecay));
|
|
|
|
adlibWriteSecondary(channel + 0x80, 0xff & (~instr->carSustainRelease));
|
|
|
|
adlibWriteSecondary(channel + 0xE0, instr->carWaveformSelect);
|
|
|
|
|
|
|
|
// The original uses the following (strange) behavior:
|
|
|
|
#if 0
|
|
|
|
if (instr->feedback | (pan > 64)) {
|
|
|
|
adlibWriteSecondary((byte)chan + 0xC0, 0x20);
|
2012-11-20 02:26:43 +00:00
|
|
|
} else {
|
|
|
|
adlibWriteSecondary((byte)chan + 0xC0, 0x10);
|
2012-09-30 23:51:04 +00:00
|
|
|
}
|
2012-11-20 02:26:43 +00:00
|
|
|
#else
|
2012-09-30 23:51:04 +00:00
|
|
|
adlibWriteSecondary((byte)chan + 0xC0, instr->feedback | ((pan > 64) ? 0x20 : 0x10));
|
2012-11-20 02:26:43 +00:00
|
|
|
#endif
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
void MidiDriver_ADLIB::mcInitStuff(AdLibVoice *voice, Struct10 *s10,
|
2012-09-30 23:51:04 +00:00
|
|
|
Struct11 *s11, byte flags, const InstrumentExtra *ie) {
|
2010-01-12 21:07:56 +00:00
|
|
|
AdLibPart *part = voice->_part;
|
2012-09-30 18:55:30 +00:00
|
|
|
s11->modifyVal = 0;
|
2002-11-21 19:06:42 +00:00
|
|
|
s11->flag0x40 = flags & 0x40;
|
|
|
|
s10->loop = flags & 0x20;
|
|
|
|
s11->flag0x10 = flags & 0x10;
|
2012-09-30 17:59:11 +00:00
|
|
|
s11->param = g_paramTable1[flags & 0xF];
|
2012-09-30 18:55:30 +00:00
|
|
|
s10->maxValue = g_maxValTable[flags & 0xF];
|
2002-11-21 19:06:42 +00:00
|
|
|
s10->unk3 = 31;
|
|
|
|
if (s11->flag0x40) {
|
2012-09-30 18:55:30 +00:00
|
|
|
s10->modWheel = part->_modWheel >> 2;
|
2002-11-21 19:06:42 +00:00
|
|
|
} else {
|
2012-09-30 18:55:30 +00:00
|
|
|
s10->modWheel = 31;
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
switch (s11->param) {
|
|
|
|
case 0:
|
2012-09-30 18:55:30 +00:00
|
|
|
s10->startValue = voice->_vol2;
|
2002-11-21 19:06:42 +00:00
|
|
|
break;
|
|
|
|
case 13:
|
2012-09-30 18:55:30 +00:00
|
|
|
s10->startValue = voice->_vol1;
|
2002-11-21 19:06:42 +00:00
|
|
|
break;
|
|
|
|
case 30:
|
2012-09-30 18:55:30 +00:00
|
|
|
s10->startValue = 31;
|
|
|
|
s11->s10->modWheel = 0;
|
2002-11-21 19:06:42 +00:00
|
|
|
break;
|
|
|
|
case 31:
|
2012-09-30 18:55:30 +00:00
|
|
|
s10->startValue = 0;
|
2002-11-21 19:06:42 +00:00
|
|
|
s11->s10->unk3 = 0;
|
|
|
|
break;
|
|
|
|
default:
|
2012-09-30 19:08:40 +00:00
|
|
|
s10->startValue = adlibGetRegValueParam(voice->_channel, s11->param);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
struct10Init(s10, ie);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2012-09-30 23:51:04 +00:00
|
|
|
void MidiDriver_ADLIB::struct10Init(Struct10 *s10, const InstrumentExtra *ie) {
|
2002-11-21 19:06:42 +00:00
|
|
|
s10->active = 1;
|
2007-02-16 13:30:41 +00:00
|
|
|
if (!_scummSmallHeader) {
|
2012-09-30 18:55:30 +00:00
|
|
|
s10->curVal = 0;
|
2003-08-12 16:09:41 +00:00
|
|
|
} else {
|
2012-09-30 18:55:30 +00:00
|
|
|
s10->curVal = s10->startValue;
|
|
|
|
s10->startValue = 0;
|
2003-08-12 16:09:41 +00:00
|
|
|
}
|
2012-09-30 18:55:30 +00:00
|
|
|
s10->modWheelLast = 31;
|
2002-11-21 19:06:42 +00:00
|
|
|
s10->count = ie->a;
|
|
|
|
if (s10->count)
|
|
|
|
s10->count *= 63;
|
2012-09-30 18:55:30 +00:00
|
|
|
s10->tableA[0] = ie->b;
|
|
|
|
s10->tableA[1] = ie->d;
|
|
|
|
s10->tableA[2] = ie->f;
|
|
|
|
s10->tableA[3] = ie->g;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 18:55:30 +00:00
|
|
|
s10->tableB[0] = ie->c;
|
|
|
|
s10->tableB[1] = ie->e;
|
|
|
|
s10->tableB[2] = 0;
|
|
|
|
s10->tableB[3] = ie->h;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
struct10Setup(s10);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
int MidiDriver_ADLIB::adlibGetRegValueParam(int chan, byte param) {
|
2010-01-12 21:07:56 +00:00
|
|
|
const AdLibSetParams *as;
|
2002-11-21 19:06:42 +00:00
|
|
|
byte val;
|
2009-04-22 20:18:12 +00:00
|
|
|
byte channel;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
|
|
|
assert(chan >= 0 && chan < 9);
|
|
|
|
|
|
|
|
if (param <= 12) {
|
2012-09-30 17:59:11 +00:00
|
|
|
channel = g_operator2Offsets[chan];
|
2002-11-21 19:06:42 +00:00
|
|
|
} else if (param <= 25) {
|
|
|
|
param -= 13;
|
2012-09-30 17:59:11 +00:00
|
|
|
channel = g_operator1Offsets[chan];
|
2002-11-21 19:06:42 +00:00
|
|
|
} else if (param <= 27) {
|
|
|
|
param -= 13;
|
2009-04-22 20:18:12 +00:00
|
|
|
channel = chan;
|
2002-11-21 19:06:42 +00:00
|
|
|
} else if (param == 28) {
|
|
|
|
return 0xF;
|
|
|
|
} else if (param == 29) {
|
|
|
|
return 0x17F;
|
|
|
|
} else {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2012-09-30 17:59:11 +00:00
|
|
|
as = &g_setParamTable[param];
|
2012-09-30 19:17:04 +00:00
|
|
|
val = adlibGetRegValue(channel + as->registerBase);
|
|
|
|
val &= as->mask;
|
|
|
|
val >>= as->shift;
|
|
|
|
if (as->inversion)
|
|
|
|
val = as->inversion - val;
|
2002-11-21 19:06:42 +00:00
|
|
|
|
|
|
|
return val;
|
|
|
|
}
|
|
|
|
|
2012-09-30 19:08:40 +00:00
|
|
|
void MidiDriver_ADLIB::adlibNoteOn(int chan, byte note, int mod) {
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
if (_opl3Mode) {
|
|
|
|
adlibNoteOnEx(chan, note, mod);
|
|
|
|
return;
|
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
|
2002-11-21 19:06:42 +00:00
|
|
|
assert(chan >= 0 && chan < 9);
|
2012-09-30 23:51:04 +00:00
|
|
|
int code = (note << 7) + mod;
|
2012-09-30 18:55:30 +00:00
|
|
|
_curNotTable[chan] = code;
|
2012-09-30 19:08:40 +00:00
|
|
|
adlibPlayNote(chan, (int16)_channelTable2[chan] + code);
|
2002-11-21 19:06:42 +00:00
|
|
|
}
|
2008-05-14 14:56:29 +00:00
|
|
|
|
2012-09-30 23:51:04 +00:00
|
|
|
void MidiDriver_ADLIB::adlibNoteOnEx(int chan, byte note, int mod) {
|
|
|
|
assert(chan >= 0 && chan < 9);
|
|
|
|
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
if (_opl3Mode) {
|
|
|
|
const int noteAdjusted = note + (mod >> 8) - 7;
|
|
|
|
const int pitchAdjust = (mod >> 5) & 7;
|
|
|
|
|
|
|
|
adlibWrite(0xA0 + chan, g_noteFrequencies[(noteAdjusted % 12) * 8 + pitchAdjust + 6 * 8]);
|
|
|
|
adlibWriteSecondary(0xA0 + chan, g_noteFrequencies[(noteAdjusted % 12) * 8 + pitchAdjust + 6 * 8]);
|
|
|
|
adlibWrite(0xB0 + chan, (CLIP(noteAdjusted / 12, 0, 7) << 2) | 0x20);
|
|
|
|
adlibWriteSecondary(0xB0 + chan, (CLIP(noteAdjusted / 12, 0, 7) << 2) | 0x20);
|
|
|
|
} else {
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
int code = (note << 7) + mod;
|
|
|
|
_curNotTable[chan] = code;
|
|
|
|
_channelTable2[chan] = 0;
|
|
|
|
adlibPlayNote(chan, code);
|
2012-11-22 01:18:51 +00:00
|
|
|
#ifdef ENABLE_OPL3
|
2012-09-30 23:51:04 +00:00
|
|
|
}
|
2012-11-22 01:18:51 +00:00
|
|
|
#endif
|
2012-09-30 23:51:04 +00:00
|
|
|
}
|
2008-05-14 14:56:29 +00:00
|
|
|
|
|
|
|
// Plugin interface
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
class AdLibEmuMusicPlugin : public MusicPluginObject {
|
2008-05-14 14:56:29 +00:00
|
|
|
public:
|
2008-06-13 16:04:43 +00:00
|
|
|
const char *getName() const {
|
2018-07-22 20:28:12 +00:00
|
|
|
return _s("AdLib emulator");
|
2008-05-14 14:56:29 +00:00
|
|
|
}
|
|
|
|
|
2008-06-13 16:04:43 +00:00
|
|
|
const char *getId() const {
|
2008-05-14 14:56:29 +00:00
|
|
|
return "adlib";
|
|
|
|
}
|
|
|
|
|
2008-06-13 16:04:43 +00:00
|
|
|
MusicDevices getDevices() const;
|
2010-06-21 21:36:36 +00:00
|
|
|
Common::Error createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle = 0) const;
|
2008-05-14 14:56:29 +00:00
|
|
|
};
|
|
|
|
|
2010-01-12 21:07:56 +00:00
|
|
|
MusicDevices AdLibEmuMusicPlugin::getDevices() const {
|
2008-06-13 16:04:43 +00:00
|
|
|
MusicDevices devices;
|
|
|
|
devices.push_back(MusicDevice(this, "", MT_ADLIB));
|
|
|
|
return devices;
|
|
|
|
}
|
|
|
|
|
2010-06-21 21:36:36 +00:00
|
|
|
Common::Error AdLibEmuMusicPlugin::createInstance(MidiDriver **mididriver, MidiDriver::DeviceHandle) const {
|
2015-04-30 04:01:30 +00:00
|
|
|
*mididriver = new MidiDriver_ADLIB();
|
2008-05-14 14:56:29 +00:00
|
|
|
|
2008-11-05 17:24:56 +00:00
|
|
|
return Common::kNoError;
|
2008-05-14 14:56:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//#if PLUGIN_ENABLED_DYNAMIC(ADLIB)
|
2010-01-12 21:07:56 +00:00
|
|
|
//REGISTER_PLUGIN_DYNAMIC(ADLIB, PLUGIN_TYPE_MUSIC, AdLibEmuMusicPlugin);
|
2008-05-14 14:56:29 +00:00
|
|
|
//#else
|
2010-01-12 21:07:56 +00:00
|
|
|
REGISTER_PLUGIN_STATIC(ADLIB, PLUGIN_TYPE_MUSIC, AdLibEmuMusicPlugin);
|
2008-05-14 14:56:29 +00:00
|
|
|
//#endif
|