aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/imuse.cpp1326
1 files changed, 7 insertions, 1319 deletions
diff --git a/scumm/imuse.cpp b/scumm/imuse.cpp
index 25aba61c78..e1699e7a4b 100644
--- a/scumm/imuse.cpp
+++ b/scumm/imuse.cpp
@@ -262,22 +262,6 @@ struct IsNoteCmdData {
};
-/*
-struct MidiChannel {
- Part *_part;
- MidiChannel() : _part(0) {}
- MidiChannelAdl *adl() { return (MidiChannelAdl *)this; }
- MidiChannelGM *gm() { return (MidiChannelGM *)this; }
-};
-
-
-struct MidiChannelGM : MidiChannel {
- byte _chan;
-// uint16 _actives[8];
-// MidiChannelGM() : _chan(0) { memset(_actives, 0, 16); }
-};
-*/
-
struct Part {
int _slot;
IMuseDriver *_drv;
@@ -513,34 +497,6 @@ public:
};
-/* IMuseAdlib classes */
-
-struct Struct10 {
- byte active;
- int16 cur_val;
- int16 count;
- uint16 param;
- int16 start_value;
- byte loop;
- byte table_a[4];
- byte table_b[4];
- int8 unk3;
- int8 modwheel;
- int8 modwheel_last;
- uint16 speed_lo_max;
- uint16 num_steps;
- int16 speed_hi;
- int8 direction;
- uint16 speed_lo;
- uint16 speed_lo_counter;
-};
-
-struct Struct11 {
- int16 modify_val;
- byte param, flag0x40, flag0x10;
- Struct10 *s10;
-};
-
struct InstrumentExtra {
byte a, b, c, d, e, f, g, h;
};
@@ -564,108 +520,6 @@ struct Instrument {
byte duration;
};
-struct MidiChannelAdl : MidiChannel {
- MidiChannelAdl *_next, *_prev;
- byte _waitforpedal;
- byte _note;
- byte _channel;
- byte _twochan;
- byte _vol_1, _vol_2;
- int16 _duration;
-
- Struct10 _s10a;
- Struct11 _s11a;
- Struct10 _s10b;
- Struct11 _s11b;
-
- MidiChannelAdl() : _next(0), _prev(0) {}
-};
-/*
-class IMuseAdlib : public IMuseDriver {
-private:
- FM_OPL *_opl;
- byte *_adlib_reg_cache;
- IMuseInternal *_se;
- SoundMixer *_mixer;
-
- int _adlib_timer_counter;
-
- uint16 channel_table_2[9];
- int _midichan_index;
- int _next_tick;
- uint16 curnote_table[9];
- MidiChannelAdl _midi_channels[9];
-
- Instrument _part_instr[32];
- Instrument _glob_instr[32];
-
- void adlib_key_off(int chan);
- void adlib_note_on(int chan, byte note, int mod);
- void adlib_note_on_ex(int chan, byte note, int mod);
- int adlib_read_param(int chan, byte data);
- void adlib_setup_channel(int chan, Instrument * instr, byte vol_1, byte vol_2);
- byte adlib_read(byte port) {
- return _adlib_reg_cache[port];
- }
- void adlib_set_param(int channel, byte param, int value);
- void adlib_key_onoff(int channel);
- void adlib_write(byte port, byte value);
- void adlib_playnote(int channel, int note);
-
- MidiChannelAdl *allocate_midichan(byte pri);
-
- void reset_tick();
- void mc_off(MidiChannel * mc);
-
- static void link_mc(Part *part, MidiChannelAdl *mc);
- static void mc_inc_stuff(MidiChannelAdl *mc, Struct10 * s10, Struct11 * s11);
- static void mc_init_stuff(MidiChannelAdl *mc, Struct10 * s10, Struct11 * s11, byte flags,
- InstrumentExtra * ie);
- static void struct10_init(Struct10 * s10, InstrumentExtra * ie);
- static byte struct10_ontimer(Struct10 * s10, Struct11 * s11);
- static void struct10_setup(Struct10 * s10);
- static int random_nr(int a);
- void mc_key_on(MidiChannel * mc, byte note, byte velocity);
-
- static void premix_proc(void *param, int16 *buf, uint len);
-
-public:
- IMuseAdlib(SoundMixer *mixer) {
- _mixer = mixer;
- }
- void uninit() {}
- void init(IMuseInternal *eng, OSystem *syst);
- void update_pris() {
- }
- void generate_samples(int16 *buf, int len);
- void on_timer();
- void set_instrument(uint slot, byte *instr);
- void part_set_instrument(Part *part, Instrument * instr);
- void part_key_on(Part *part, byte note, byte velocity);
- void part_key_off(Part *part, byte note);
- void part_set_param(Part *part, byte param, int value);
- void part_changed(Part *part, uint16 what);
- void part_off(Part *part);
- int part_update_active(Part *part, uint16 *active);
- byte get_channel_program (byte) { return 255; }
-
- void adjust_priorities() {
- }
-
- uint32 get_base_tempo() {
-#ifdef _WIN32_WCE
- return 0x1D9000 * 2; // Sampled down to 11 kHz
-#else //_WIN32_WCE
- return 0x1D9000;
-#endif //_WIN32_WCE
- }
-
- byte get_hardware_type() {
- return 1;
- }
-};
-*/
-
/* IMuseGM classes */
class IMuseGM : public IMuseDriver {
@@ -2155,6 +2009,7 @@ void Player::uninit_parts()
error("asd");
while (_parts)
_parts->uninit();
+ _se->_driver->update_pris(); // In case another player couldn't allocate all its parts
}
void Player::uninit_seq()
@@ -3618,8 +3473,6 @@ void Part::uninit()
_player = NULL;
_next = NULL;
_prev = NULL;
-
- update_pris(); // In case another player couldn't allocate all its parts
}
void Part::off()
@@ -3665,1110 +3518,6 @@ void Part::set_instrument(uint b)
//********************************************
-//***** ADLIB PART OF IMUSE STARTS HERE ******
-//********************************************
-
-/*
-static byte lookup_table[64][32];
-const byte volume_table[] = {
- 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
-};
-
-int lookup_volume(int a, int b)
-{
- 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) {
- return lookup_table[-a][-b];
- } else {
- return -lookup_table[a][-b];
- }
- } else {
- if (a < 0) {
- return -lookup_table[-a][b];
- } else {
- return lookup_table[a][b];
- }
- }
-}
-
-void create_lookup_table()
-{
- int i, j;
- int sum;
-
- for (i = 0; i < 64; i++) {
- sum = i;
- for (j = 0; j < 32; j++) {
- lookup_table[i][j] = sum >> 5;
- sum += i;
- }
- }
- for (i = 0; i < 64; i++)
- lookup_table[i][0] = 0;
-}
-
-MidiChannelAdl *IMuseAdlib::allocate_midichan(byte pri)
-{
- MidiChannelAdl *ac, *best = NULL;
- int i;
-
- for (i = 0; i < 9; i++) {
- if (++_midichan_index >= 9)
- _midichan_index = 0;
- ac = &_midi_channels[_midichan_index];
- if (!ac->_part)
- return ac;
- if (!ac->_next) {
- if (ac->_part->_pri_eff <= pri) {
- pri = ac->_part->_pri_eff;
- best = ac;
- }
- }
- }
-
- if (best)
- mc_off(best);
- else; //debug(1, "Denying adlib channel request");
- return best;
-}
-
-void IMuseAdlib::premix_proc(void *param, int16 *buf, uint len)
-{
- ((IMuseAdlib *) param)->generate_samples(buf, len);
-}
-
-void IMuseAdlib::init(IMuseInternal *eng, OSystem *syst)
-{
- int i;
- MidiChannelAdl *mc;
-
- _se = eng;
-
- for (i = 0, mc = _midi_channels; i != ARRAYSIZE(_midi_channels); i++, mc++) {
- mc->_channel = i;
- mc->_s11a.s10 = &mc->_s10b;
- mc->_s11b.s10 = &mc->_s10a;
- }
-
- _adlib_reg_cache = (byte *)calloc(256, 1);
-
- _opl = OPLCreate(OPL_TYPE_YM3812, 3579545, syst->property(OSystem::PROP_GET_SAMPLE_RATE, 0));
-
- adlib_write(1, 0x20);
- adlib_write(8, 0x40);
- adlib_write(0xBD, 0x00);
- create_lookup_table();
-
- _mixer->setupPremix(this, premix_proc);
-}
-
-void IMuseAdlib::adlib_write(byte port, byte value)
-{
- if (_adlib_reg_cache[port] == value)
- return;
- _adlib_reg_cache[port] = value;
-
- OPLWriteReg(_opl, port, value);
-}
-
-void IMuseAdlib::adlib_key_off(int chan)
-{
- byte port = chan + 0xB0;
- adlib_write(port, adlib_read(port) & ~0x20);
-}
-
-struct AdlibSetParams {
- byte a, b, c, d;
-};
-
-static const byte channel_mappings[9] = {
- 0, 1, 2, 8,
- 9, 10, 16, 17,
- 18
-};
-
-static const byte channel_mappings_2[9] = {
- 3, 4, 5, 11,
- 12, 13, 19, 20,
- 21
-};
-
-static const AdlibSetParams adlib_setparam_table[] = {
- {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
- {0xE0, 0, 3, 0}, // waveform select
- {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
-};
-
-void IMuseAdlib::adlib_set_param(int channel, byte param, int value)
-{
- const AdlibSetParams *as;
- byte port;
-
- assert(channel >= 0 && channel < 9);
-
- if (param <= 12) {
- port = channel_mappings_2[channel];
- } else if (param <= 25) {
- param -= 13;
- port = channel_mappings[channel];
- } else if (param <= 27) {
- param -= 13;
- port = channel;
- } else if (param == 28 || param == 29) {
- if (param == 28)
- value -= 15;
- else
- value -= 383;
- value <<= 4;
- channel_table_2[channel] = value;
- adlib_playnote(channel, curnote_table[channel] + value);
- return;
- } else {
- return;
- }
-
- as = &adlib_setparam_table[param];
- if (as->d)
- value = as->d - value;
- port += as->a;
- adlib_write(port, (adlib_read(port) & ~as->c) | (((byte)value) << as->b));
-}
-
-static const byte octave_numbers[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5,
- 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 7, 7, 7, 7
-};
-
-static const byte note_numbers[] = {
- 3, 4, 5, 6, 7, 8, 9, 10,
- 11, 12, 13, 14, 3, 4, 5, 6,
- 7, 8, 9, 10, 11, 12, 13, 14,
- 3, 4, 5, 6, 7, 8, 9, 10,
- 11, 12, 13, 14, 3, 4, 5, 6,
- 7, 8, 9, 10, 11, 12, 13, 14,
- 3, 4, 5, 6, 7, 8, 9, 10,
- 11, 12, 13, 14, 3, 4, 5, 6,
- 7, 8, 9, 10, 11, 12, 13, 14,
- 3, 4, 5, 6, 7, 8, 9, 10,
- 11, 12, 13, 14, 3, 4, 5, 6,
- 7, 8, 9, 10, 11, 12, 13, 14,
- 3, 4, 5, 6, 7, 8, 9, 10,
- 11, 12, 13, 14, 3, 4, 5, 6,
- 7, 8, 9, 10, 11, 12, 13, 14,
- 3, 4, 5, 6, 7, 8, 9, 10
-};
-
-static const byte note_to_f_num[] = {
- 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,
- 242, 243, 245, 247, 249, 251, 252, 254,
-};
-
-void IMuseAdlib::adlib_playnote(int channel, int note)
-{
- byte old, oct, notex;
- int note2;
- int i;
-
- note2 = (note >> 7) - 4;
-
- oct = octave_numbers[note2] << 2;
- notex = note_numbers[note2];
-
- old = adlib_read(channel + 0xB0);
- 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);
- adlib_write(channel + 0xA0, note_to_f_num[i]);
- adlib_write(channel + 0xB0, oct | 0x20);
-}
-
-void IMuseAdlib::adlib_note_on(int chan, byte note, int mod)
-{
- int code;
- assert(chan >= 0 && chan < 9);
- code = (note << 7) + mod;
- curnote_table[chan] = code;
- adlib_playnote(chan, channel_table_2[chan] + code);
-}
-
-void IMuseAdlib::adlib_note_on_ex(int chan, byte note, int mod)
-{
- int code;
- assert(chan >= 0 && chan < 9);
- code = (note << 7) + mod;
- curnote_table[chan] = code;
- channel_table_2[chan] = 0;
- adlib_playnote(chan, code);
-}
-
-void IMuseAdlib::adlib_key_onoff(int channel)
-{
- byte val;
- byte port = channel + 0xB0;
- assert(channel >= 0 && channel < 9);
-
- val = adlib_read(port);
- adlib_write(port, val & ~0x20);
- adlib_write(port, val | 0x20);
-}
-
-void IMuseAdlib::adlib_setup_channel(int chan, Instrument * instr, byte vol_1, byte vol_2)
-{
- byte port;
-
- assert(chan >= 0 && chan < 9);
-
- port = channel_mappings[chan];
- adlib_write(port + 0x20, instr->flags_1);
-
- if (!(g_scumm->_features & GF_SMALL_HEADER) || (instr->feedback & 1))
- adlib_write(port + 0x40, (instr->oplvl_1 | 0x3F) - vol_1 );
- else
- adlib_write(port + 0x40, instr->oplvl_1);
-
- adlib_write(port + 0x60, 0xff & (~instr->atdec_1));
- adlib_write(port + 0x80, 0xff & (~instr->sustrel_1));
- adlib_write(port + 0xE0, instr->waveform_1);
-
- port = channel_mappings_2[chan];
- adlib_write(port + 0x20, instr->flags_2);
- adlib_write(port + 0x40, (instr->oplvl_2 | 0x3F) - vol_2 );
- adlib_write(port + 0x60, 0xff & (~instr->atdec_2));
- adlib_write(port + 0x80, 0xff & (~instr->sustrel_2));
- adlib_write(port + 0xE0, instr->waveform_2);
-
- adlib_write((byte)chan + 0xC0, instr->feedback);
-}
-
-int IMuseAdlib::adlib_read_param(int chan, byte param)
-{
- const AdlibSetParams *as;
- byte val;
- byte port;
-
- assert(chan >= 0 && chan < 9);
-
- if (param <= 12) {
- port = channel_mappings_2[chan];
- } else if (param <= 25) {
- param -= 13;
- port = channel_mappings[chan];
- } else if (param <= 27) {
- param -= 13;
- port = chan;
- } else if (param == 28) {
- return 0xF;
- } else if (param == 29) {
- return 0x17F;
- } else {
- return 0;
- }
-
- as = &adlib_setparam_table[param];
- val = adlib_read(port + as->a);
- val &= as->c;
- val >>= as->b;
- if (as->d)
- val = as->d - val;
-
- return val;
-}
-
-void IMuseAdlib::generate_samples(int16 *data, int len)
-{
- int step;
-
- if (!_opl) {
- memset(data, 0, len * sizeof(int16));
- return;
- }
-
- do {
- step = len;
- if (step > _next_tick)
- step = _next_tick;
- YM3812UpdateOne(_opl, data, step);
-
- if (!(_next_tick -= step)) {
- _se->on_timer();
- reset_tick();
- }
- data += step;
- } while (len -= step);
-}
-
-
-void IMuseAdlib::reset_tick()
-{
- _next_tick = 88;
-}
-
-void IMuseAdlib::on_timer()
-{
- MidiChannelAdl *mc;
- int i;
-
- _adlib_timer_counter += 0xD69;
- while (_adlib_timer_counter >= 0x411B) {
- _adlib_timer_counter -= 0x411B;
- mc = _midi_channels;
- for (i = 0; i != ARRAYSIZE(_midi_channels); i++, mc++) {
- if (!mc->_part)
- continue;
- if (mc->_duration && (mc->_duration -= 0x11) <= 0) {
- mc_off(mc);
- return;
- }
- if (mc->_s10a.active) {
- mc_inc_stuff(mc, &mc->_s10a, &mc->_s11a);
- }
- if (mc->_s10b.active) {
- mc_inc_stuff(mc, &mc->_s10b, &mc->_s11b);
- }
- }
- }
-}
-
-const byte param_table_1[16] = {
- 29, 28, 27, 0,
- 3, 4, 7, 8,
- 13, 16, 17, 20,
- 21, 30, 31, 0
-};
-
-const uint16 param_table_2[16] = {
- 0x2FF, 0x1F, 0x7, 0x3F,
- 0x0F, 0x0F, 0x0F, 0x3,
- 0x3F, 0x0F, 0x0F, 0x0F,
- 0x3, 0x3E, 0x1F, 0
-};
-
-static const uint16 num_steps_table[] = {
- 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
-};
-
-int IMuseAdlib::random_nr(int a)
-{
- static byte _rand_seed = 1;
- if (_rand_seed & 1) {
- _rand_seed >>= 1;
- _rand_seed ^= 0xB8;
- } else {
- _rand_seed >>= 1;
- }
- return _rand_seed * a >> 8;
-}
-
-void IMuseAdlib::struct10_setup(Struct10 * s10)
-{
- int b, c, d, e, f, g, h;
- byte t;
-
- b = s10->unk3;
- f = s10->active - 1;
-
- t = s10->table_a[f];
- e = num_steps_table[lookup_table[t & 0x7F][b]];
- if (t & 0x80) {
- e = random_nr(e);
- }
- if (e == 0)
- e++;
-
- s10->num_steps = s10->speed_lo_max = e;
-
- if (f != 2) {
- c = s10->param;
- g = s10->start_value;
- t = s10->table_b[f];
- d = lookup_volume(c, (t & 0x7F) - 31);
- if (t & 0x80) {
- d = random_nr(d);
- }
- if (d + g > c) {
- h = c - g;
- } else {
- h = d;
- if (d + g < 0)
- h = -g;
- }
- h -= s10->cur_val;
- } else {
- h = 0;
- }
-
- s10->speed_hi = h / e;
- if (h < 0) {
- h = -h;
- s10->direction = -1;
- } else {
- s10->direction = 1;
- }
-
- s10->speed_lo = h % e;
- s10->speed_lo_counter = 0;
-}
-
-byte IMuseAdlib::struct10_ontimer(Struct10 * s10, Struct11 * s11)
-{
- byte result = 0;
- int i;
-
- if (s10->count && (s10->count -= 17) <= 0) {
- s10->active = 0;
- return 0;
- }
-
- i = s10->cur_val + s10->speed_hi;
- s10->speed_lo_counter += s10->speed_lo;
- if (s10->speed_lo_counter >= s10->speed_lo_max) {
- s10->speed_lo_counter -= s10->speed_lo_max;
- i += s10->direction;
- }
- if (s10->cur_val != i || s10->modwheel != s10->modwheel_last) {
- s10->cur_val = i;
- s10->modwheel_last = s10->modwheel;
- i = lookup_volume(i, s10->modwheel_last);
- if (i != s11->modify_val) {
- s11->modify_val = i;
- result = 1;
- }
- }
-
- if (!--s10->num_steps) {
- s10->active++;
- if (s10->active > 4) {
- if (s10->loop) {
- s10->active = 1;
- result |= 2;
- struct10_setup(s10);
- } else {
- s10->active = 0;
- }
- } else {
- struct10_setup(s10);
- }
- }
-
- return result;
-}
-
-void IMuseAdlib::struct10_init(Struct10 * s10, InstrumentExtra * ie)
-{
- s10->active = 1;
- s10->cur_val = 0;
- s10->modwheel_last = 31;
- s10->count = ie->a;
- if (s10->count)
- s10->count *= 63;
- s10->table_a[0] = ie->b;
- s10->table_a[1] = ie->d;
- s10->table_a[2] = ie->f;
- s10->table_a[3] = ie->g;
-
- s10->table_b[0] = ie->c;
- s10->table_b[1] = ie->e;
- s10->table_b[2] = 0;
- s10->table_b[3] = ie->h;
-
- struct10_setup(s10);
-}
-
-void IMuseAdlib::mc_init_stuff(MidiChannelAdl *mc, Struct10 * s10,
- Struct11 * s11, byte flags, InstrumentExtra * ie)
-{
- Part *part = mc->_part;
-
- s11->modify_val = 0;
- s11->flag0x40 = flags & 0x40;
- s10->loop = flags & 0x20;
- s11->flag0x10 = flags & 0x10;
- s11->param = param_table_1[flags & 0xF];
- s10->param = param_table_2[flags & 0xF];
- s10->unk3 = 31;
- if (s11->flag0x40) {
- s10->modwheel = part->_modwheel >> 2;
- } else {
- s10->modwheel = 31;
- }
-
- switch (s11->param) {
- case 0:
- s10->start_value = mc->_vol_2;
- break;
- case 13:
- s10->start_value = mc->_vol_1;
- break;
- case 30:
- s10->start_value = 31;
- s11->s10->modwheel = 0;
- break;
- case 31:
- s10->start_value = 0;
- s11->s10->unk3 = 0;
- break;
- default:
- s10->start_value = ((IMuseAdlib *) part->_drv)->adlib_read_param(mc->_channel, s11->param);
- }
-
- struct10_init(s10, ie);
-}
-
-void IMuseAdlib::mc_inc_stuff(MidiChannelAdl *mc, Struct10 * s10, Struct11 * s11)
-{
- byte code;
- Part *part = mc->_part;
-
- code = struct10_ontimer(s10, s11);
-
- if (code & 1) {
- switch (s11->param) {
- case 0:
- mc->_vol_2 = s10->start_value + s11->modify_val;
- ((IMuseAdlib *) part->_drv)->adlib_set_param(mc->_channel, 0,
- volume_table[lookup_table[mc->_vol_2]
- [part->_vol_eff >> 2]]);
- break;
- case 13:
- mc->_vol_1 = s10->start_value + s11->modify_val;
- if (mc->_twochan) {
- ((IMuseAdlib *) part->_drv)->adlib_set_param(mc->_channel, 13,
- volume_table[lookup_table[mc->_vol_1]
- [part->_vol_eff >> 2]]);
- } else {
- ((IMuseAdlib *) part->_drv)->adlib_set_param(mc->_channel, 13, mc->_vol_1);
- }
- break;
- case 30:
- s11->s10->modwheel = (char)s11->modify_val;
- break;
- case 31:
- s11->s10->unk3 = (char)s11->modify_val;
- break;
- default:
- ((IMuseAdlib *) part->_drv)->adlib_set_param(mc->_channel, s11->param,
- s10->start_value + s11->modify_val);
- break;
- }
- }
-
- if (code & 2 && s11->flag0x10)
- ((IMuseAdlib *) part->_drv)->adlib_key_onoff(mc->_channel);
-}
-
-static byte map_gm_to_fm [128][30] = {
-// DERIVED FROM DAY OF THE TENTACLE
-{ 0x2F, 0x0B, 0x08, 0x78, 0x16, 0x24, 0x22, 0x0B, 0x9A, 0x34, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x2F, 0x0B, 0x08, 0x78, 0x16, 0x24, 0x22, 0x0B, 0x9A, 0x34, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Extrapolated
-{ 0x84, 0x40, 0x3B, 0x5A, 0x63, 0x81, 0x00, 0x3B, 0x5A, 0x7F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x2F, 0x0B, 0x08, 0x78, 0x16, 0x24, 0x22, 0x0B, 0x9A, 0x34, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Extrapolated
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x84, 0x40, 0x3B, 0x5A, 0x63, 0x81, 0x00, 0x3B, 0x5A, 0x7F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x85, 0x80, 0x05, 0xEA, 0x3D, 0x84, 0x18, 0x3C, 0xAA, 0x7C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xE2, 0x00, 0x6C, 0x77, 0x7D, 0xE4, 0x40, 0x7D, 0xA7, 0x66, 0x07, 0xA1, 0x00, 0x02, 0x1E, 0x01, 0x20, 0x01, 0x01, 0x1F, 0xAC, 0x00, 0x04, 0x24, 0x02, 0x21, 0x02, 0x02, 0x21, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0xC9, 0x40, 0x3A, 0x78, 0x5E, 0xC2, 0x00, 0x4D, 0x9A, 0x7C, 0x00, 0xA1, 0xA0, 0x08, 0x1F, 0x05, 0x1E, 0x02, 0x05, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x28, 0x1D, 0x19, 0x68, 0x02, 0x22, 0x35, 0x09, 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Extrapolated
-{ 0x28, 0x1D, 0x19, 0x68, 0x02, 0x22, 0x35, 0x09, 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xC6, 0x40, 0x3B, 0x78, 0x5E, 0xC2, 0x00, 0x4D, 0x9A, 0x7C, 0x00, 0xA1, 0xA0, 0x08, 0x1F, 0x05, 0x1E, 0x02, 0x05, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Extrapolated
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0xE2, 0x00, 0x6C, 0x77, 0x7D, 0xE4, 0x40, 0x7D, 0xA7, 0x66, 0x07, 0xA1, 0x00, 0x02, 0x1E, 0x01, 0x20, 0x01, 0x01, 0x1F, 0xAC, 0x00, 0x04, 0x24, 0x02, 0x21, 0x02, 0x02, 0x21, 0x00 },
-{ 0xE2, 0x28, 0x38, 0xE8, 0x02, 0xE6, 0x33, 0x0B, 0xF9, 0x00, 0x08, 0xA1, 0x00, 0x02, 0x1E, 0x02, 0x20, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Extrapolated
-{ 0xE2, 0x28, 0x38, 0xE8, 0x02, 0xE6, 0x33, 0x0B, 0xF9, 0x00, 0x08, 0xA1, 0x00, 0x02, 0x1E, 0x02, 0x20, 0x00, 0x02, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xE2, 0x00, 0x6C, 0x77, 0x7D, 0xE4, 0x40, 0x7D, 0xA7, 0x66, 0x07, 0xA1, 0x00, 0x02, 0x1E, 0x01, 0x20, 0x01, 0x01, 0x1F, 0xAC, 0x00, 0x04, 0x24, 0x02, 0x21, 0x02, 0x02, 0x21, 0x00 },
-{ 0x85, 0x80, 0x05, 0xEA, 0x3D, 0x84, 0x18, 0x3C, 0xAA, 0x7C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Extrapolated
-{ 0x85, 0x80, 0x05, 0xEA, 0x3D, 0x84, 0x18, 0x3C, 0xAA, 0x7C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Extrapolated
-{ 0x85, 0x80, 0x05, 0xEA, 0x3D, 0x84, 0x18, 0x3C, 0xAA, 0x7C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0xC6, 0x00, 0x2E, 0xC7, 0x59, 0xC2, 0x06, 0x0E, 0xA7, 0x7D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Extrapolated
-{ 0xC6, 0x00, 0x2E, 0xC7, 0x59, 0xC2, 0x06, 0x0E, 0xA7, 0x7D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Extrapolated
-{ 0xC6, 0x00, 0x2E, 0xC7, 0x59, 0xC2, 0x06, 0x0E, 0xA7, 0x7D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xC6, 0x00, 0x2E, 0xC7, 0x59, 0xC2, 0x06, 0x0E, 0xA7, 0x7D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x84, 0x40, 0x3B, 0x5A, 0x63, 0x81, 0x00, 0x3B, 0x5A, 0x7F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xC6, 0x00, 0x2E, 0xC7, 0x59, 0xC2, 0x06, 0x0E, 0xA7, 0x7D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x31, 0x0C, 0x2D, 0xD7, 0x40, 0x62, 0x18, 0x2E, 0xB8, 0x7C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x01, 0x1C, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00 },
-{ 0x22, 0x19, 0x79, 0x67, 0x00, 0x22, 0x3F, 0x2A, 0xC6, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x31, 0x0C, 0x2D, 0xD7, 0x40, 0x62, 0x18, 0x2E, 0xB8, 0x7C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x01, 0x1C, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00 },
-{ 0x31, 0x0C, 0x2D, 0xD7, 0x40, 0x62, 0x18, 0x2E, 0xB8, 0x7C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x01, 0x1C, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x31, 0x0C, 0x2D, 0xD7, 0x40, 0x62, 0x18, 0x2E, 0xB8, 0x7C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x01, 0x1C, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0xE2, 0x15, 0x7B, 0xB5, 0x02, 0xE1, 0x33, 0xAF, 0xF4, 0x36, 0x08, 0xA1, 0x00, 0x04, 0x1E, 0x04, 0x1F, 0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0xC6, 0x00, 0x2E, 0xC7, 0x59, 0xC2, 0x06, 0x0E, 0xA7, 0x7D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xF4, 0x40, 0x9F, 0xFA, 0x61, 0xE2, 0x13, 0x7F, 0xFA, 0x7D, 0x02, 0x21, 0x00, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x35, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x02, 0x00, 0x67, 0xAA, 0x65, 0x02, 0x64, 0x28, 0xF9, 0x7C, 0x08, 0x81, 0x00, 0x04, 0x1D, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x02, 0x40, 0x04, 0x9A, 0x55, 0xC2, 0x4B, 0x2B, 0xCB, 0x7C, 0x06, 0x41, 0x00, 0x00, 0x20, 0x06, 0x1C, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x02, 0x0C, 0x03, 0x6A, 0x7D, 0x02, 0x00, 0x23, 0xEA, 0x7C, 0x02, 0x81, 0x00, 0x02, 0x20, 0x01, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xF4, 0x40, 0x9F, 0xFA, 0x61, 0xE2, 0x13, 0x7F, 0xFA, 0x7D, 0x02, 0x21, 0x00, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x35, 0x00 },
-{ 0xF4, 0x40, 0x9F, 0xFA, 0x61, 0xE2, 0x13, 0x7F, 0xFA, 0x7D, 0x02, 0x21, 0x00, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x35, 0x00 },
-{ 0xF4, 0x40, 0x9F, 0xFA, 0x61, 0xE2, 0x13, 0x7F, 0xFA, 0x7D, 0x02, 0x21, 0x00, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x35, 0x00 },
-{ 0x02, 0x00, 0x67, 0xAA, 0x65, 0x02, 0x64, 0x28, 0xF9, 0x7C, 0x08, 0x81, 0x00, 0x04, 0x1D, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xE1, 0x00, 0xCE, 0xD9, 0x4E, 0xE2, 0x00, 0x8F, 0x99, 0x65, 0x0E, 0x01, 0x00, 0x01, 0x1F, 0x00, 0x1E, 0x01, 0x01, 0x20, 0x01, 0x00, 0x00, 0x1F, 0x06, 0x1E, 0x00, 0x06, 0x1F, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0xE2, 0x00, 0xCE, 0xD9, 0x4C, 0xE2, 0x00, 0x8F, 0x99, 0x64, 0x0E, 0x81, 0x10, 0x00, 0x1E, 0x05, 0x1F, 0x12, 0x00, 0x1F, 0x01, 0x00, 0x00, 0x1F, 0x06, 0x1E, 0x00, 0x06, 0x1F, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0xB2, 0x25, 0xAD, 0xE9, 0x00, 0x62, 0x00, 0x8F, 0xC8, 0x7C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xF2, 0x00, 0xAF, 0xFA, 0x5C, 0xF2, 0x56, 0x9F, 0xEA, 0x7C, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xF2, 0x00, 0xAF, 0xFA, 0x5C, 0xF2, 0x56, 0x9F, 0xEA, 0x7C, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xB2, 0x25, 0xAD, 0xE9, 0x00, 0x62, 0x00, 0x8F, 0xC8, 0x7C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xE2, 0x02, 0x9F, 0xB8, 0x48, 0x22, 0x89, 0x9F, 0xE8, 0x7C, 0x00, 0x81, 0x00, 0x01, 0x1E, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0xE4, 0x28, 0x7E, 0xF8, 0x01, 0xE2, 0x23, 0x8E, 0xE8, 0x7D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xE4, 0x28, 0x7E, 0xF8, 0x01, 0xE2, 0x23, 0x8E, 0xE8, 0x7D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x31, 0x0C, 0x2D, 0xD7, 0x40, 0x62, 0x18, 0x2E, 0xB8, 0x7C, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x01, 0x1C, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00 },
-{ 0x22, 0x10, 0x7E, 0xD8, 0x35, 0x2A, 0x2E, 0x8E, 0xD8, 0x7C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xE4, 0x28, 0x7E, 0xF8, 0x01, 0xE2, 0x23, 0x8E, 0xE8, 0x7D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x22, 0x10, 0x7E, 0xD8, 0x35, 0x2A, 0x2E, 0x8E, 0xD8, 0x7C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xE4, 0x08, 0x7E, 0x99, 0x28, 0xE6, 0x16, 0x80, 0xF8, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xE4, 0x23, 0x8F, 0xF9, 0x7C, 0xE2, 0x18, 0x9F, 0x88, 0x7C, 0x01, 0x01, 0x04, 0x00, 0x1E, 0x00, 0x1F, 0x06, 0x05, 0x1F, 0x03, 0x29, 0x01, 0x1F, 0x02, 0x21, 0x01, 0x02, 0x1F, 0x00 },
-{ 0xE4, 0x23, 0x8F, 0xF9, 0x7C, 0xE2, 0x18, 0x9F, 0x88, 0x7C, 0x01, 0x01, 0x04, 0x00, 0x1E, 0x00, 0x1F, 0x06, 0x05, 0x1F, 0x03, 0x29, 0x01, 0x1F, 0x02, 0x21, 0x01, 0x02, 0x1F, 0x00 },
-{ 0xE4, 0x23, 0x8F, 0xF9, 0x7C, 0xE2, 0x18, 0x9F, 0x88, 0x7C, 0x01, 0x01, 0x04, 0x00, 0x1E, 0x00, 0x1F, 0x06, 0x05, 0x1F, 0x03, 0x29, 0x01, 0x1F, 0x02, 0x21, 0x01, 0x02, 0x1F, 0x00 },
-{ 0x2A, 0x1E, 0x98, 0xA9, 0x00, 0x62, 0x00, 0x9F, 0xB9, 0x7C, 0x00, 0x01, 0x00, 0x01, 0x1E, 0x00, 0x1F, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x2A, 0x1E, 0x98, 0xA9, 0x00, 0x62, 0x00, 0x9F, 0xB9, 0x7C, 0x00, 0x01, 0x00, 0x01, 0x1E, 0x00, 0x1F, 0x01, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x62, 0xA8, 0x9D, 0x84, 0x44, 0x62, 0x23, 0x7F, 0xD5, 0x4C, 0x03, 0xA1, 0x00, 0x01, 0x1E, 0x02, 0x21, 0x01, 0x01, 0x20, 0xA8, 0x00, 0x01, 0x24, 0x06, 0x20, 0x04, 0x03, 0x24, 0x00 },
-{ 0xE4, 0x28, 0x7E, 0xF8, 0x01, 0xE2, 0x23, 0x8E, 0xE8, 0x7D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0xE4, 0x08, 0x7E, 0x99, 0x28, 0xE6, 0x16, 0x80, 0xF8, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0xE4, 0x28, 0x7E, 0xF8, 0x01, 0xE2, 0x23, 0x8E, 0xE8, 0x7D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x22, 0x10, 0x7E, 0xD8, 0x35, 0x2A, 0x2E, 0x8E, 0xD8, 0x7C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xE4, 0x07, 0x05, 0xAA, 0x7C, 0xE2, 0x50, 0xBE, 0xC8, 0x7D, 0x07, 0x01, 0x00, 0x03, 0x1E, 0x01, 0x1E, 0x00, 0x00, 0x1E, 0xA8, 0x00, 0x01, 0x20, 0x06, 0x23, 0x04, 0x03, 0x20, 0x00 },
-{ 0x85, 0x80, 0x05, 0xEA, 0x3D, 0x84, 0x18, 0x3C, 0xAA, 0x7C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xB2, 0x25, 0xAD, 0xE9, 0x00, 0x62, 0x00, 0x8F, 0xC8, 0x7C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xF2, 0x00, 0xAF, 0xFA, 0x5C, 0xF2, 0x56, 0x9F, 0xEA, 0x7C, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0xE2, 0x02, 0x9F, 0xB8, 0x48, 0x22, 0x89, 0x9F, 0xE8, 0x7C, 0x00, 0x81, 0x00, 0x01, 0x1E, 0x00, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0xB2, 0x25, 0xAD, 0xE9, 0x00, 0x62, 0x00, 0x8F, 0xC8, 0x7C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xE2, 0x00, 0xCE, 0xD9, 0x4C, 0xE2, 0x00, 0x8F, 0x99, 0x64, 0x0E, 0x81, 0x10, 0x00, 0x1E, 0x05, 0x1F, 0x12, 0x00, 0x1F, 0x01, 0x00, 0x00, 0x1F, 0x06, 0x1E, 0x00, 0x06, 0x1F, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0xC9, 0x40, 0x3A, 0x38, 0x5E, 0xC2, 0x00, 0x4C, 0xAA, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xC9, 0x40, 0x3A, 0x78, 0x5E, 0xC2, 0x00, 0x4D, 0x9A, 0x7C, 0x00, 0xA1, 0xA0, 0x08, 0x1F, 0x05, 0x1E, 0x02, 0x05, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0xC9, 0x40, 0x3A, 0x38, 0x5E, 0xC2, 0x00, 0x4C, 0xAA, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Extrapolated
-{ 0xC9, 0x40, 0x3A, 0x78, 0x5E, 0xC2, 0x00, 0x4D, 0x9A, 0x7C, 0x00, 0xA1, 0xA0, 0x08, 0x1F, 0x05, 0x1E, 0x02, 0x05, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Extrapolated
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0xC6, 0x00, 0x2E, 0xC7, 0x59, 0xC2, 0x06, 0x0E, 0xA7, 0x7D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x02, 0x0C, 0x03, 0x6A, 0x7D, 0x02, 0x00, 0x23, 0xEA, 0x7C, 0x02, 0x81, 0x00, 0x02, 0x20, 0x01, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0xCF, 0x3B, 0x2A, 0xFE, 0x7E, 0xC0, 0xC0, 0x0C, 0xEB, 0x63, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 }, // Extrapolated
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x02, 0x0C, 0x03, 0x6A, 0x7D, 0x02, 0x00, 0x23, 0xEA, 0x7C, 0x02, 0x81, 0x00, 0x02, 0x20, 0x01, 0x1F, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x0F, 0x10, 0x10, 0x09, 0x49, 0x02, 0x12, 0x07, 0x9A, 0x7C, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0xCF, 0x3B, 0x2A, 0xFE, 0x7E, 0xC0, 0xC0, 0x0C, 0xEB, 0x63, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0xCF, 0x40, 0x0A, 0x30, 0x5C, 0xCF, 0x00, 0x0D, 0x80, 0x7C, 0x00, 0xA0, 0x00, 0x0F, 0x1E, 0x0F, 0x20, 0x00, 0x0B, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // Unknown
-{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } // Unknown
-};
-
-
-void IMuseAdlib::part_changed(Part *part, uint16 what)
-{
- MidiChannelAdl *mc;
-
- if (what & pcProgram) {
- if (part->_player ? part->_player->_isGM : false)
- part_set_instrument(part, (Instrument *) &map_gm_to_fm[part->_program]);
- else if (part->_program < 32)
- part_set_instrument(part, &_glob_instr[part->_program]);
- }
-
- if (what & pcMod) {
- for (mc = part->_mc->adl(); mc; mc = mc->_next) {
- adlib_note_on(mc->_channel, mc->_note + part->_transpose_eff,
- (part->_pitchbend * part->_pitchbend_factor >> 6) + part->_detune_eff);
- }
- }
-
- if (what & pcVolume) {
- for (mc = part->_mc->adl(); mc; mc = mc->_next) {
- adlib_set_param(mc->_channel, 0, volume_table[lookup_table[mc->_vol_2]
- [part->_vol_eff >> 2]]);
- if (mc->_twochan) {
- adlib_set_param(mc->_channel, 13, volume_table[lookup_table[mc->_vol_1]
- [part->_vol_eff >> 2]]);
- }
- }
- }
-
- if (what & pcPedal) {
- if (!part->_pedal) {
- for (mc = (MidiChannelAdl *)part->_mc; mc; mc = mc->_next) {
- if (mc->_waitforpedal)
- mc_off(mc);
- }
- }
- }
-
- if (what & pcModwheel) {
- for (mc = (MidiChannelAdl *)part->_mc; mc; mc = mc->_next) {
- if (mc->_s10a.active && mc->_s11a.flag0x40)
- mc->_s10a.modwheel = part->_modwheel >> 2;
- if (mc->_s10b.active && mc->_s11b.flag0x40)
- mc->_s10b.modwheel = part->_modwheel >> 2;
- }
- }
-}
-
-void IMuseAdlib::mc_key_on(MidiChannel * mc2, byte note, byte velocity)
-{
- MidiChannelAdl *mc = (MidiChannelAdl *)mc2;
- Part *part = mc->_part;
- Instrument *instr = &_part_instr[part->_slot];
- int c;
- byte vol_1, vol_2;
-
- mc->_twochan = instr->feedback & 1;
- mc->_note = note;
- mc->_waitforpedal = false;
- mc->_duration = instr->duration;
- if (mc->_duration != 0)
- mc->_duration *= 63;
-
- vol_1 = (instr->oplvl_1 & 0x3F) + lookup_table[velocity >> 1][instr->waveform_1 >> 2];
- if (vol_1 > 0x3F)
- vol_1 = 0x3F;
- mc->_vol_1 = vol_1;
-
- vol_2 = (instr->oplvl_2 & 0x3F) + lookup_table[velocity >> 1][instr->waveform_2 >> 2];
- if (vol_2 > 0x3F)
- vol_2 = 0x3F;
- mc->_vol_2 = vol_2;
-
- c = part->_vol_eff >> 2;
-
- vol_2 = volume_table[lookup_table[vol_2][c]];
- if (mc->_twochan)
- vol_1 = volume_table[lookup_table[vol_1][c]];
-
- adlib_setup_channel(mc->_channel, instr, vol_1, vol_2);
- adlib_note_on_ex(mc->_channel, part->_transpose_eff + note, part->_detune_eff + (part->_pitchbend * part->_pitchbend_factor >> 6));
-
- if (instr->flags_a & 0x80) {
- mc_init_stuff(mc, &mc->_s10a, &mc->_s11a, instr->flags_a, &instr->extra_a);
- } else {
- mc->_s10a.active = 0;
- }
-
- if (instr->flags_b & 0x80) {
- mc_init_stuff(mc, &mc->_s10b, &mc->_s11b, instr->flags_b, &instr->extra_b);
- } else {
- mc->_s10b.active = 0;
- }
-}
-
-void IMuseAdlib::set_instrument(uint slot, byte *data)
-{
- if (slot < 32)
- memcpy(&_glob_instr[slot], data, sizeof(Instrument));
-}
-
-
-void IMuseAdlib::link_mc(Part *part, MidiChannelAdl *mc)
-{
- mc->_part = part;
- mc->_next = (MidiChannelAdl *)part->_mc;
- part->_mc = mc;
- mc->_prev = NULL;
-
- if (mc->_next)
- mc->_next->_prev = mc;
-}
-
-void IMuseAdlib::part_key_on(Part *part, byte note, byte velocity)
-{
- MidiChannelAdl *mc;
-
- if ((part->_player ? part->_player->_isGM : false) && part->_chan == 9)
- return; // Jamieson630: GM percussion, not implemented for FM
- mc = allocate_midichan(part->_pri_eff);
- if (!mc)
- return;
-
- link_mc(part, mc);
- mc_key_on(mc, note, velocity);
-}
-
-void IMuseAdlib::part_key_off(Part *part, byte note)
-{
- MidiChannelAdl *mc;
-
- if ((part->_player ? part->_player->_isGM : false) && part->_chan == 9)
- return; // Jamieson630: GM percussion, not implemented for FM
- for (mc = (MidiChannelAdl *)part->_mc; mc; mc = mc->_next) {
- if (mc->_note == note) {
- if (part->_pedal)
- mc->_waitforpedal = true;
- else
- mc_off(mc);
- }
- }
-}
-
-struct AdlibInstrSetParams {
- byte param;
- byte shl;
- byte mask;
-};
-
-#define MKLINE(_a_,_b_,_c_) { (int)&((Instrument*)0)->_a_, _b_, ((1<<(_c_))-1)<<(_b_) }
-static const AdlibInstrSetParams adlib_instr_params[69] = {
- MKLINE(oplvl_2, 0, 6),
- MKLINE(waveform_2, 2, 5),
- MKLINE(oplvl_2, 6, 2),
- MKLINE(flags_2, 0, 4),
- MKLINE(atdec_2, 4, 4),
- MKLINE(atdec_2, 0, 4),
- MKLINE(sustrel_2, 4, 4),
- MKLINE(sustrel_2, 0, 4),
- MKLINE(waveform_2, 0, 2),
- MKLINE(flags_2, 7, 1),
- MKLINE(flags_2, 6, 1),
- MKLINE(flags_2, 5, 1),
- MKLINE(flags_2, 4, 1),
-
- MKLINE(oplvl_1, 0, 6),
- MKLINE(waveform_1, 2, 5),
- MKLINE(oplvl_1, 6, 2),
- MKLINE(flags_1, 0, 4),
- MKLINE(atdec_1, 4, 4),
- MKLINE(atdec_1, 0, 4),
- MKLINE(sustrel_1, 4, 4),
- MKLINE(sustrel_1, 0, 4),
- MKLINE(waveform_1, 0, 2),
- MKLINE(flags_1, 7, 1),
- MKLINE(flags_1, 6, 1),
- MKLINE(flags_1, 5, 1),
- MKLINE(flags_1, 4, 1),
-
- MKLINE(feedback, 0, 1),
- MKLINE(feedback, 1, 3),
-
- MKLINE(flags_a, 7, 1),
- MKLINE(flags_a, 6, 1),
- MKLINE(flags_a, 5, 1),
- MKLINE(flags_a, 4, 1),
- MKLINE(flags_a, 0, 4),
- MKLINE(extra_a.a, 0, 8),
- MKLINE(extra_a.b, 0, 7),
- MKLINE(extra_a.c, 0, 7),
- MKLINE(extra_a.d, 0, 7),
- MKLINE(extra_a.e, 0, 7),
- MKLINE(extra_a.f, 0, 7),
- MKLINE(extra_a.g, 0, 7),
- MKLINE(extra_a.h, 0, 7),
- MKLINE(extra_a.b, 7, 1),
- MKLINE(extra_a.c, 7, 1),
- MKLINE(extra_a.d, 7, 1),
- MKLINE(extra_a.e, 7, 1),
- MKLINE(extra_a.f, 7, 1),
- MKLINE(extra_a.g, 7, 1),
- MKLINE(extra_a.h, 7, 1),
-
- MKLINE(flags_b, 7, 1),
- MKLINE(flags_b, 6, 1),
- MKLINE(flags_b, 5, 1),
- MKLINE(flags_b, 4, 1),
- MKLINE(flags_b, 0, 4),
- MKLINE(extra_b.a, 0, 8),
- MKLINE(extra_b.b, 0, 7),
- MKLINE(extra_b.c, 0, 7),
- MKLINE(extra_b.d, 0, 7),
- MKLINE(extra_b.e, 0, 7),
- MKLINE(extra_b.f, 0, 7),
- MKLINE(extra_b.g, 0, 7),
- MKLINE(extra_b.h, 0, 7),
- MKLINE(extra_b.b, 7, 1),
- MKLINE(extra_b.c, 7, 1),
- MKLINE(extra_b.d, 7, 1),
- MKLINE(extra_b.e, 7, 1),
- MKLINE(extra_b.f, 7, 1),
- MKLINE(extra_b.g, 7, 1),
- MKLINE(extra_b.h, 7, 1),
-
- MKLINE(duration, 0, 8),
-};
-#undef MKLINE
-
-void IMuseAdlib::part_set_param(Part *part, byte param, int value)
-{
- const AdlibInstrSetParams *sp = &adlib_instr_params[param];
- byte *p = (byte *)&_part_instr[part->_slot] + sp->param;
- *p = (*p & ~sp->mask) | (value << sp->shl);
-
- if (param < 28) {
- MidiChannelAdl *mc;
-
- for (mc = (MidiChannelAdl *)part->_mc; mc; mc = mc->_next) {
- adlib_set_param(mc->_channel, param, value);
- }
- }
-}
-
-void IMuseAdlib::part_off(Part *part)
-{
- MidiChannelAdl *mc = (MidiChannelAdl *)part->_mc;
- part->_mc = NULL;
- for (; mc; mc = mc->_next) {
- mc_off(mc);
- }
-}
-
-void IMuseAdlib::mc_off(MidiChannel * mc2)
-{
- MidiChannelAdl *mc = (MidiChannelAdl *)mc2, *tmp;
-
- adlib_key_off(mc->_channel);
-
- tmp = mc->_prev;
-
- if (mc->_next)
- mc->_next->_prev = tmp;
- if (tmp)
- tmp->_next = mc->_next;
- else
- mc->_part->_mc = mc->_next;
- mc->_part = NULL;
-}
-
-void IMuseAdlib::part_set_instrument(Part *part, Instrument * instr)
-{
- Instrument *i = &_part_instr[part->_slot];
- memcpy(i, instr, sizeof(Instrument));
-}
-
-int IMuseAdlib::part_update_active(Part *part, uint16 *active)
-{
- uint16 bits;
- int count = 0;
- MidiChannelAdl *mc;
-
- bits = 1 << part->_chan;
-
- for (mc = part->_mc->adl(); mc; mc = mc->_next) {
- if (!(active[mc->_note] & bits)) {
- active[mc->_note] |= bits;
- count++;
- }
- }
- return count;
-}
-*/
-//********************************************
//** GENERAL MIDI PART OF IMUSE STARTS HERE **
//********************************************
@@ -4862,7 +3611,6 @@ void IMuseGM::midiProgram(MidiChannel *mc, byte program, bool mt32emulate)
if (mt32emulate)
program = mt32_to_gmidi[program];
mc->programChange (program);
-// _md->send(program << 8 | 0xC0 | chan);
}
void IMuseGM::midiPan(byte chan, int8 pan)
@@ -4892,37 +3640,29 @@ void IMuseGM::midiSilence(byte chan)
void IMuseGM::part_key_on(Part *part, byte note, byte velocity)
{
- MidiChannel/*GM*/ *mc = part->_mc;//->gm();
+ MidiChannel *mc = part->_mc;
part->_actives[note >> 4] |= (1 << (note & 0xF));
if (mc) {
-// mc->_actives[note >> 4] |= (1 << (note & 0xF));
-// midiNoteOn(mc->_chan, note, velocity);
mc->noteOn (note, velocity);
} else if (part->_percussion) {
-// midiVolume(PERCUSSION_CHANNEL, part->_vol_eff);
-// midiProgram(PERCUSSION_CHANNEL, part->_bank, part->_player->_mt32emulate);
-// midiNoteOn(PERCUSSION_CHANNEL, note, velocity);
mc = _md->getPercussionChannel();
if (!mc)
return;
mc->volume (part->_vol_eff);
- mc->programChange (part->_bank /*, part->_player->_mt32emulate*/);
+ midiProgram (mc, part->_bank, part->_player->_mt32emulate);
mc->noteOn (note, velocity);
}
}
void IMuseGM::part_key_off(Part *part, byte note)
{
- MidiChannel/*GM*/ *mc = part->_mc;//->gm();
+ MidiChannel *mc = part->_mc;
part->_actives[note >> 4] &= ~(1 << (note & 0xF));
if (mc) {
-// mc->_actives[note >> 4] &= ~(1 << (note & 0xF));
-// midiNoteOff(mc->_chan, note);
mc->noteOff (note);
} else if (part->_percussion) {
-// midiNoteOff(PERCUSSION_CHANNEL, note);
mc = _md->getPercussionChannel();
if (mc)
mc->noteOff (note);
@@ -4930,29 +3670,6 @@ void IMuseGM::part_key_off(Part *part, byte note)
}
#if !defined(__MORPHOS__)
-int IMuseGM::midi_driver_thread(void *param)
-{
- IMuseGM *mid = (IMuseGM *)param;
- int old_time, cur_time;
-
- old_time = mid->_system->get_msecs();
-
- for (;;) {
- mid->_system->delay_msecs(10);
-
- cur_time = mid->_system->get_msecs();
- while (old_time < cur_time) {
- old_time += 10;
- // Don't use mid->_se_on_timer()
- // We must come in through IMuseMonitor to protect
- // against conflicts with script access to IMuse.
- if (g_scumm->_imuse)
- g_scumm->_imuse->on_timer();
- }
- }
-
- return 0;
-}
#else
#include <proto/exec.h>
#include <proto/dos.h>
@@ -5000,7 +3717,6 @@ int IMuseGM::midi_driver_thread(void *param)
void IMuseGM::init(IMuseInternal *eng, OSystem *syst)
{
int i;
-// MidiChannel/*GM*/ *mc;
_system = syst;
@@ -5011,11 +3727,9 @@ void IMuseGM::init(IMuseInternal *eng, OSystem *syst)
// Connect to the driver's timer
_se = eng;
-// syst->create_thread(midi_driver_thread, this);
_md->setTimerCallback (NULL, &IMuseGM::timer_callback);
for (i = 0; i != ARRAYSIZE(_midi_program_last); i++) {
-// mc->_chan = i;
_midi_program_last [i] = 255;
}
}
@@ -5034,7 +3748,6 @@ void IMuseGM::update_pris()
Part *part, *hipart;
int i;
byte hipri, lopri;
-// MidiChannel/*GM*/ *mc, *lomc;
Part *lopart;
while (true) {
@@ -5082,7 +3795,6 @@ int IMuseGM::part_update_active(Part *part, uint16 *active)
bits = 1 << part->_chan;
-// act = part->_mc->gm()->_actives;
act = part->_actives;
for (i = 8; i; i--) {
@@ -5116,56 +3828,44 @@ void IMuseGM::set_instrument(uint slot, byte *data)
void IMuseGM::part_changed(Part *part, uint16 what)
{
- MidiChannel/*GM*/ *mc;
+ MidiChannel *mc;
// Mark for re-schedule if program changed when in pre-state
if (what & pcProgram && !part->_percussion && !part->_mc) {
update_pris();
}
- if (!(mc = part->_mc/*->gm()*/))
+ if (!(mc = part->_mc))
return;
if (part->_player == NULL) { // No player, so dump phantom channel
part->_mc->release();
part->_mc = NULL;
-// mc->_part = NULL;
-// memset(mc->_actives, 0, sizeof(mc->_actives));
memset(part->_actives, 0, sizeof(part->_actives));
return;
}
if (what & pcPitchBendFactor)
-// midiPitchBendFactor (mc->_chan, part->_pitchbend_factor);
mc->pitchBendFactor (part->_pitchbend_factor);
if (what & pcMod)
-// midiPitchBend(mc->_chan,
-// clamp(part->_pitchbend +
-// (part->_detune_eff * 64 / 12) +
-// (part->_transpose_eff * 8192 / 12), -8192, 8191));
mc->pitchBend (clamp(part->_pitchbend +
(part->_detune_eff * 64 / 12) +
(part->_transpose_eff * 8192 / 12), -8192, 8191));
if (what & pcVolume)
-// midiVolume(mc->_chan, part->_vol_eff);
mc->volume (part->_vol_eff);
if (what & pcPedal)
-// midiPedal(mc->_chan, part->_pedal);
mc->sustain (part->_pedal);
if (what & pcModwheel)
-// midiModWheel(mc->_chan, part->_modwheel);
mc->modulationWheel (part->_modwheel);
if (what & pcPan)
-// midiPan(mc->_chan, part->_pan_eff);
mc->panPosition (part->_pan_eff);
if (what & pcEffectLevel)
-// midiEffectLevel(mc->_chan, part->_effect_level);
mc->effectLevel (part->_effect_level);
if (what & pcProgram) {
@@ -5173,16 +3873,10 @@ void IMuseGM::part_changed(Part *part, uint16 what)
if (part->_program < 128) {
_midi_program_last [part->_chan] = part->_program;
if (part->_bank) {
-// midiControl0(mc->_chan, part->_bank);
-// midiProgram(mc->_chan, part->_program, part->_player->_mt32emulate);
-// midiControl0(mc->_chan, 0);
mc->controlChange (0, part->_bank);
midiProgram (mc, part->_program, part->_player->_mt32emulate);
-// mc->programChange (part->_program /*, part->_player->_mt32emulate*/);
mc->controlChange (0, 0);
} else {
-// midiProgram(mc->_chan, part->_program, part->_player->_mt32emulate);
- mc->programChange (part->_program /*, part->_player->_mt32emulate*/);
midiProgram (mc, part->_program, part->_player->_mt32emulate);
}
}
@@ -5190,32 +3884,26 @@ void IMuseGM::part_changed(Part *part, uint16 what)
if (part->_program < 32) {
memcpy (&_part_instr [part->_slot], &_glob_instr[part->_program], sizeof (Instrument));
}
-// _md->sysEx_customInstrument (mc->_chan, 'ADL ', (byte *) (&_part_instr [part->_slot]));
mc->sysEx_customInstrument ('ADL ', (byte *) (&_part_instr [part->_slot]));
}
}
if (what & pcChorus)
-// midiChorus(mc->_chan, part->_effect_level);
mc->chorusLevel (part->_effect_level);
if (what & pcPriority)
-// _md->send ((part->_pri_eff << 16) | (18 << 8) | 0xB0 | mc->_chan);
mc->priority (part->_pri_eff);
}
void IMuseGM::part_off(Part *part)
{
- MidiChannel/*GM*/ *mc = part->_mc/*->gm()*/;
+ MidiChannel *mc = part->_mc;
if (mc) {
mc->allNotesOff();
mc->release();
part->_mc = NULL;
-// mc->_part = NULL;
-// memset(mc->_actives, 0, sizeof(mc->_actives));
memset(part->_actives, 0, sizeof(part->_actives));
-// midiSilence(mc->_chan);
}
}