diff options
author | Travis Howell | 2003-08-12 16:09:41 +0000 |
---|---|---|
committer | Travis Howell | 2003-08-12 16:09:41 +0000 |
commit | b198fbc3bb09080b10e45d97995de1a84bebf301 (patch) | |
tree | 3edc22319f832b6faa4617171bad64ef3fbebc64 /backends | |
parent | fef62655f85b8f0337cdce661f785e797abc637f (diff) | |
download | scummvm-rg350-b198fbc3bb09080b10e45d97995de1a84bebf301.tar.gz scummvm-rg350-b198fbc3bb09080b10e45d97995de1a84bebf301.tar.bz2 scummvm-rg350-b198fbc3bb09080b10e45d97995de1a84bebf301.zip |
Add adlib music for indy3ega/loom and adlib sfx, patch #770862
svn-id: r9649
Diffstat (limited to 'backends')
-rw-r--r-- | backends/midi/adlib.cpp | 56 |
1 files changed, 34 insertions, 22 deletions
diff --git a/backends/midi/adlib.cpp b/backends/midi/adlib.cpp index 113edc0e2f..3c6cef3fd6 100644 --- a/backends/midi/adlib.cpp +++ b/backends/midi/adlib.cpp @@ -618,7 +618,7 @@ private: void mc_init_stuff(AdlibVoice *voice, Struct10 * s10, Struct11 * s11, byte flags, InstrumentExtra * ie); - static void struct10_init(Struct10 * s10, InstrumentExtra * ie); + 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); @@ -644,10 +644,12 @@ void AdlibPart::send (uint32 b) { } void AdlibPart::noteOff(byte note) { + debug (4, "%10d: noteOff(%d)", tick, note); _owner->part_key_off(this, note); } void AdlibPart::noteOn(byte note, byte velocity) { + debug (4, "%10d: noteOn(%d,%d)", tick, note, velocity); _owner->part_key_on(this, &_part_instr, note, velocity); } @@ -982,6 +984,7 @@ void MidiDriver_ADLIB::premix_proc(void *param, int16 *buf, uint len) { void MidiDriver_ADLIB::adlib_write(byte port, byte value) { if (_adlib_reg_cache[port] == value) return; + debug (4, "%10d: adlib_write[%x] = %x", tick, port, value); _adlib_reg_cache[port] = value; OPLWriteReg(_opl, port, value); @@ -998,7 +1001,6 @@ void MidiDriver_ADLIB::generate_samples(int16 *data, int len) { _next_tick -= step; if (!_next_tick) { - tick++; if (_timer_proc) (*_timer_proc)(_timer_param); on_timer(); @@ -1021,6 +1023,7 @@ void MidiDriver_ADLIB::on_timer() { while (_adlib_timer_counter >= 0x411B) { _adlib_timer_counter -= 0x411B; voice = _voices; + tick++; for (i = 0; i != ARRAYSIZE(_voices); i++, voice++) { if (!voice->_part) continue; @@ -1064,13 +1067,17 @@ void MidiDriver_ADLIB::mc_inc_stuff(AdlibVoice *voice, Struct10 *s10, Struct11 * switch (s11->param) { case 0: voice->_vol_2 = s10->start_value + s11->modify_val; - adlib_set_param(voice->_channel, 0, - volume_table[lookup_table[voice->_vol_2] - [part->_vol_eff >> 2]]); + if (!_game_SmallHeader) { + adlib_set_param(voice->_channel, 0, + volume_table[lookup_table[voice->_vol_2] + [part->_vol_eff >> 2]]); + } else { + adlib_set_param(voice->_channel, 0, voice->_vol_2); + } break; case 13: voice->_vol_1 = s10->start_value + s11->modify_val; - if (voice->_twochan) { + if (voice->_twochan && !_game_SmallHeader) { adlib_set_param(voice->_channel, 13, volume_table[lookup_table[voice->_vol_1] [part->_vol_eff >> 2]]); @@ -1352,21 +1359,29 @@ void MidiDriver_ADLIB::mc_key_on(AdlibVoice *voice, AdlibInstrument *instr, byte if (voice->_duration != 0) voice->_duration *= 63; - vol_1 = (instr->oplvl_1 & 0x3F) + lookup_table[velocity >> 1][instr->waveform_1 >> 2]; + if (!_game_SmallHeader) + vol_1 = (instr->oplvl_1 & 0x3F) + lookup_table[velocity >> 1][instr->waveform_1 >> 2]; + else + vol_1 = 0x3f - (instr->oplvl_1 & 0x3F); if (vol_1 > 0x3F) vol_1 = 0x3F; voice->_vol_1 = vol_1; - vol_2 = (instr->oplvl_2 & 0x3F) + lookup_table[velocity >> 1][instr->waveform_2 >> 2]; + if (!_game_SmallHeader) + vol_2 = (instr->oplvl_2 & 0x3F) + lookup_table[velocity >> 1][instr->waveform_2 >> 2]; + else + vol_2 = 0x3f - (instr->oplvl_2 & 0x3F); if (vol_2 > 0x3F) vol_2 = 0x3F; voice->_vol_2 = vol_2; c = part->_vol_eff >> 2; - vol_2 = volume_table[lookup_table[vol_2][c]]; - if (voice->_twochan) - vol_1 = volume_table[lookup_table[vol_1][c]]; + if (!_game_SmallHeader) { + vol_2 = volume_table[lookup_table[vol_2][c]]; + if (voice->_twochan) + vol_1 = volume_table[lookup_table[vol_1][c]]; + } adlib_setup_channel(voice->_channel, instr, vol_1, vol_2); adlib_note_on_ex(voice->_channel, part->_transpose_eff + note, part->_detune_eff + (part->_pitchbend * part->_pitchbend_factor >> 6)); @@ -1391,22 +1406,14 @@ void MidiDriver_ADLIB::adlib_setup_channel(int chan, AdlibInstrument *instr, byt port = channel_mappings[chan]; adlib_write(port + 0x20, instr->flags_1); - - if (!_game_SmallHeader) - adlib_write(port + 0x40, (instr->oplvl_1 | 0x3F) - vol_1 ); - else - adlib_write(port + 0x40, instr->oplvl_1); - + adlib_write(port + 0x40, (instr->oplvl_1 | 0x3F) - vol_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); - if (!_game_SmallHeader) - adlib_write(port + 0x40, (instr->oplvl_2 | 0x3F) - vol_2 ); - else - adlib_write(port + 0x40, instr->oplvl_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); @@ -1464,7 +1471,12 @@ void MidiDriver_ADLIB::mc_init_stuff(AdlibVoice *voice, Struct10 * s10, void MidiDriver_ADLIB::struct10_init(Struct10 *s10, InstrumentExtra *ie) { s10->active = 1; - s10->cur_val = 0; + if (!_game_SmallHeader) { + s10->cur_val = 0; + } else { + s10->cur_val = s10->start_value; + s10->start_value = 0; + } s10->modwheel_last = 31; s10->count = ie->a; if (s10->count) |