diff options
-rw-r--r-- | scumm/imuse.cpp | 17 | ||||
-rw-r--r-- | scumm/resource.cpp | 214 |
2 files changed, 86 insertions, 145 deletions
diff --git a/scumm/imuse.cpp b/scumm/imuse.cpp index cca1b8b59c..8759725391 100644 --- a/scumm/imuse.cpp +++ b/scumm/imuse.cpp @@ -3678,16 +3678,21 @@ void IMuseAdlib::adlib_setup_channel(int chan, Instrument * instr, byte vol_1, b port = channel_mappings[chan]; adlib_write(port + 0x20, instr->flags_1); - adlib_write(port + 0x40, (instr->oplvl_1 | 0x3F) - vol_1); - adlib_write(port + 0x60, ~instr->atdec_1); - adlib_write(port + 0x80, ~instr->sustrel_1); + + if ((g_scumm->_gameId != GID_MONKEY_VGA) || (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, ~instr->atdec_2); - adlib_write(port + 0x80, ~instr->sustrel_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); diff --git a/scumm/resource.cpp b/scumm/resource.cpp index c33ceb53c4..2b3d0818b8 100644 --- a/scumm/resource.cpp +++ b/scumm/resource.cpp @@ -743,9 +743,9 @@ static char OLD256_MIDI_HACK[] = "\x00" // part/channel "\x01\x06\x02\x0a\x08\x09\x0d\x08\x04\x04" "\x04\x06\x02\x02\x03\x07\x0f\x0d" - "\x05\x04\x0c\x00\x03\x0a\x01\x00" + "\x05\x04\x0c\x00\x03\x01\x01\x00" "\x00\x00\x01\x01\x0e\x00\x02\x02" - "\x01\x00\x01\x00\x01\x02\x00\x0a" + "\x01\x00\x01\x00\x01\x02\x00\x01" "\x08\x00\x00\x00\x01\x02\x04\x00" "\x06\x02\x00\x00\x04\x00\x03\x02" "\x04\x00\x00\xf7" @@ -758,9 +758,9 @@ static char OLD256_MIDI_HACK[] = "\x01" // part/channel "\x01\x06\x02\x0a\x08\x09\x0d\x08\x04\x04" "\x04\x06\x02\x02\x03\x07\x0f\x0d" - "\x05\x04\x0c\x00\x03\x0a\x01\x00" + "\x05\x04\x0c\x00\x03\x01\x01\x00" "\x00\x00\x01\x01\x0e\x00\x02\x02" - "\x01\x00\x01\x00\x01\x02\x00\x0a" + "\x01\x00\x01\x00\x01\x02\x00\x01" "\x08\x00\x00\x00\x01\x02\x04\x00" "\x06\x02\x00\x00\x04\x00\x03\x02" "\x04\x00\x00\xf7" @@ -773,9 +773,9 @@ static char OLD256_MIDI_HACK[] = "\x02" // part/channel "\x01\x06\x02\x0a\x08\x09\x0d\x08\x04\x04" "\x04\x06\x02\x02\x03\x07\x0f\x0d" - "\x05\x04\x0c\x00\x03\x0a\x01\x00" + "\x05\x04\x0c\x00\x03\x01\x01\x00" "\x00\x00\x01\x01\x0e\x00\x02\x02" - "\x01\x00\x01\x00\x01\x02\x00\x0a" + "\x01\x00\x01\x00\x01\x02\x00\x01" "\x08\x00\x00\x00\x01\x02\x04\x00" "\x06\x02\x00\x00\x04\x00\x03\x02" "\x04\x00\x00\xf7" @@ -788,9 +788,9 @@ static char OLD256_MIDI_HACK[] = "\x03" // part/channel "\x01\x06\x02\x0a\x08\x09\x0d\x08\x04\x04" "\x04\x06\x02\x02\x03\x07\x0f\x0d" - "\x05\x04\x0c\x00\x03\x0a\x01\x00" + "\x05\x04\x0c\x00\x03\x01\x01\x00" "\x00\x00\x01\x01\x0e\x00\x02\x02" - "\x01\x00\x01\x00\x01\x02\x00\x0a" + "\x01\x00\x01\x00\x01\x02\x00\x01" "\x08\x00\x00\x00\x01\x02\x04\x00" "\x06\x02\x00\x00\x04\x00\x03\x02" "\x04\x00\x00\xf7" @@ -803,9 +803,9 @@ static char OLD256_MIDI_HACK[] = "\x04" // part/channel "\x01\x06\x02\x0a\x08\x09\x0d\x08\x04\x04" "\x04\x06\x02\x02\x03\x07\x0f\x0d" - "\x05\x04\x0c\x00\x03\x0a\x01\x00" + "\x05\x04\x0c\x00\x03\x01\x01\x00" "\x00\x00\x01\x01\x0e\x00\x02\x02" - "\x01\x00\x01\x00\x01\x02\x00\x0a" + "\x01\x00\x01\x00\x01\x02\x00\x01" "\x08\x00\x00\x00\x01\x02\x04\x00" "\x06\x02\x00\x00\x04\x00\x03\x02" "\x04\x00\x00\xf7" @@ -818,9 +818,9 @@ static char OLD256_MIDI_HACK[] = "\x05" // part/channel "\x01\x06\x02\x0a\x08\x09\x0d\x08\x04\x04" "\x04\x06\x02\x02\x03\x07\x0f\x0d" - "\x05\x04\x0c\x00\x03\x0a\x01\x00" + "\x05\x04\x0c\x00\x03\x01\x01\x00" "\x00\x00\x01\x01\x0e\x00\x02\x02" - "\x01\x00\x01\x00\x01\x02\x00\x0a" + "\x01\x00\x01\x00\x01\x02\x00\x01" "\x08\x00\x00\x00\x01\x02\x04\x00" "\x06\x02\x00\x00\x04\x00\x03\x02" "\x04\x00\x00\xf7" @@ -833,9 +833,9 @@ static char OLD256_MIDI_HACK[] = "\x06" // part/channel "\x01\x06\x02\x0a\x08\x09\x0d\x08\x04\x04" "\x04\x06\x02\x02\x03\x07\x0f\x0d" - "\x05\x04\x0c\x00\x03\x0a\x01\x00" + "\x05\x04\x0c\x00\x03\x01\x01\x00" "\x00\x00\x01\x01\x0e\x00\x02\x02" - "\x01\x00\x01\x00\x01\x02\x00\x0a" + "\x01\x00\x01\x00\x01\x02\x00\x01" "\x08\x00\x00\x00\x01\x02\x04\x00" "\x06\x02\x00\x00\x04\x00\x03\x02" "\x04\x00\x00\xf7" @@ -848,140 +848,19 @@ static char OLD256_MIDI_HACK[] = "\x07" // part/channel "\x01\x06\x02\x0a\x08\x09\x0d\x08\x04\x04" "\x04\x06\x02\x02\x03\x07\x0f\x0d" - "\x05\x04\x0c\x00\x03\x0a\x01\x00" + "\x05\x04\x0c\x00\x03\x01\x01\x00" "\x00\x00\x01\x01\x0e\x00\x02\x02" - "\x01\x00\x01\x00\x01\x02\x00\x0a" + "\x01\x00\x01\x00\x01\x02\x00\x01" "\x08\x00\x00\x00\x01\x02\x04\x00" "\x06\x02\x00\x00\x04\x00\x03\x02" "\x04\x00\x00\xf7" - "\x00\xb7\x07\x64" // Controller 7 = 100 - // 8 - "\x00\xf0\x14\x7d\x00" // sysex 00: part on/off - "\x08\x00\x03" // part/channel - "\x00\x00\x07\x0f\x00\x00\x08\x00\x00\x00\x00\x02\x00\x00\xf7" - "\x04\xf0\x41\x7d\x10" // sysex 16: set instrument - "\x08" // part/channel - "\x01\x06\x02\x0a\x08\x09\x0d\x08\x04\x04" - "\x04\x06\x02\x02\x03\x07\x0f\x0d" - "\x05\x04\x0c\x00\x03\x0a\x01\x00" - "\x00\x00\x01\x01\x0e\x00\x02\x02" - "\x01\x00\x01\x00\x01\x02\x00\x0a" - "\x08\x00\x00\x00\x01\x02\x04\x00" - "\x06\x02\x00\x00\x04\x00\x03\x02" - "\x04\x00\x00\xf7" - "\x00\xb8\x07\x64" // Controller 7 = 100 - // 9 - "\x00\xf0\x14\x7d\x00" // sysex 00: part on/off - "\x09\x00\x03" // part/channel - "\x00\x00\x07\x0f\x00\x00\x08\x00\x00\x00\x00\x02\x00\x00\xf7" - "\x04\xf0\x41\x7d\x10" // sysex 16: set instrument - "\x09" // part/channel - "\x01\x06\x02\x0a\x08\x09\x0d\x08\x04\x04" - "\x04\x06\x02\x02\x03\x07\x0f\x0d" - "\x05\x04\x0c\x00\x03\x0a\x01\x00" - "\x00\x00\x01\x01\x0e\x00\x02\x02" - "\x01\x00\x01\x00\x01\x02\x00\x0a" - "\x08\x00\x00\x00\x01\x02\x04\x00" - "\x06\x02\x00\x00\x04\x00\x03\x02" - "\x04\x00\x00\xf7" - "\x00\xb9\x07\x64" // Controller 7 = 100 - // Channels after 9 realy necessary ?!? - // A - "\x00\xf0\x14\x7d\x00" // sysex 00: part on/off - "\x0A\x00\x03" // part/channel - "\x00\x00\x07\x0f\x00\x00\x08\x00\x00\x00\x00\x02\x00\x00\xf7" - "\x04\xf0\x41\x7d\x10" // sysex 16: set instrument - "\x0A" // part/channel - "\x01\x06\x02\x0a\x08\x09\x0d\x08\x04\x04" - "\x04\x06\x02\x02\x03\x07\x0f\x0d" - "\x05\x04\x0c\x00\x03\x0a\x01\x00" - "\x00\x00\x01\x01\x0e\x00\x02\x02" - "\x01\x00\x01\x00\x01\x02\x00\x0a" - "\x08\x00\x00\x00\x01\x02\x04\x00" - "\x06\x02\x00\x00\x04\x00\x03\x02" - "\x04\x00\x00\xf7" - "\x00\xbA\x07\x64" // Controller 7 = 100 - // B - "\x00\xf0\x14\x7d\x00" // sysex 00: part on/off - "\x0B\x00\x03" // part/channel - "\x00\x00\x07\x0f\x00\x00\x08\x00\x00\x00\x00\x02\x00\x00\xf7" - "\x04\xf0\x41\x7d\x10" // sysex 16: set instrument - "\x0B" // part/channel - "\x01\x06\x02\x0a\x08\x09\x0d\x08\x04\x04" - "\x04\x06\x02\x02\x03\x07\x0f\x0d" - "\x05\x04\x0c\x00\x03\x0a\x01\x00" - "\x00\x00\x01\x01\x0e\x00\x02\x02" - "\x01\x00\x01\x00\x01\x02\x00\x0a" - "\x08\x00\x00\x00\x01\x02\x04\x00" - "\x06\x02\x00\x00\x04\x00\x03\x02" - "\x04\x00\x00\xf7" - "\x00\xbB\x07\x64" // Controller 7 = 100 - // C - "\x00\xf0\x14\x7d\x00" // sysex 00: part on/off - "\x0C\x00\x03" // part/channel - "\x00\x00\x07\x0f\x00\x00\x08\x00\x00\x00\x00\x02\x00\x00\xf7" - "\x04\xf0\x41\x7d\x10" // sysex 16: set instrument - "\x0C" // part/channel - "\x01\x06\x02\x0a\x08\x09\x0d\x08\x04\x04" - "\x04\x06\x02\x02\x03\x07\x0f\x0d" - "\x05\x04\x0c\x00\x03\x0a\x01\x00" - "\x00\x00\x01\x01\x0e\x00\x02\x02" - "\x01\x00\x01\x00\x01\x02\x00\x0a" - "\x08\x00\x00\x00\x01\x02\x04\x00" - "\x06\x02\x00\x00\x04\x00\x03\x02" - "\x04\x00\x00\xf7" - "\x00\xbC\x07\x64" // Controller 7 = 100 - // D - "\x00\xf0\x14\x7d\x00" // sysex 00: part on/off - "\x0D\x00\x03" // part/channel - "\x00\x00\x07\x0f\x00\x00\x08\x00\x00\x00\x00\x02\x00\x00\xf7" - "\x04\xf0\x41\x7d\x10" // sysex 16: set instrument - "\x0D" // part/channel - "\x01\x06\x02\x0a\x08\x09\x0d\x08\x04\x04" - "\x04\x06\x02\x02\x03\x07\x0f\x0d" - "\x05\x04\x0c\x00\x03\x0a\x01\x00" - "\x00\x00\x01\x01\x0e\x00\x02\x02" - "\x01\x00\x01\x00\x01\x02\x00\x0a" - "\x08\x00\x00\x00\x01\x02\x04\x00" - "\x06\x02\x00\x00\x04\x00\x03\x02" - "\x04\x00\x00\xf7" - "\x00\xbD\x07\x64" // Controller 7 = 100 - // E - "\x00\xf0\x14\x7d\x00" // sysex 00: part on/off - "\x0E\x00\x03" // part/channel - "\x00\x00\x07\x0f\x00\x00\x08\x00\x00\x00\x00\x02\x00\x00\xf7" - "\x04\xf0\x41\x7d\x10" // sysex 16: set instrument - "\x0E" // part/channel - "\x01\x06\x02\x0a\x08\x09\x0d\x08\x04\x04" - "\x04\x06\x02\x02\x03\x07\x0f\x0d" - "\x05\x04\x0c\x00\x03\x0a\x01\x00" - "\x00\x00\x01\x01\x0e\x00\x02\x02" - "\x01\x00\x01\x00\x01\x02\x00\x0a" - "\x08\x00\x00\x00\x01\x02\x04\x00" - "\x06\x02\x00\x00\x04\x00\x03\x02" - "\x04\x00\x00\xf7" - "\x00\xbE\x07\x64" // Controller 7 = 100 - // F - "\x00\xf0\x14\x7d\x00" // sysex 00: part on/off - "\x0F\x00\x03" // part/channel - "\x00\x00\x07\x0f\x00\x00\x08\x00\x00\x00\x00\x02\x00\x00\xf7" - "\x04\xf0\x41\x7d\x10" // sysex 16: set instrument - "\x0F" // part/channel - "\x01\x06\x02\x0a\x08\x09\x0d\x08\x04\x04" - "\x04\x06\x02\x02\x03\x07\x0f\x0d" - "\x05\x04\x0c\x00\x03\x0a\x01\x00" - "\x00\x00\x01\x01\x0e\x00\x02\x02" - "\x01\x00\x01\x00\x01\x02\x00\x0a" - "\x08\x00\x00\x00\x01\x02\x04\x00" - "\x06\x02\x00\x00\x04\x00\x03\x02" - "\x04\x00\x00\xf7" - "\x00\xbF\x07\x64"; // Controller 7 = 100 + "\x00\xb7\x07\x64"; // Controller 7 = 100 int Scumm::readSoundResourceSmallHeader(int type, int idx) { uint32 pos, total_size, size, dw, tag; uint32 best_size = 0, best_offs = 0; - byte *ptr, *track; + byte *ptr, *track, *instr; uint16 ticks, skip; debug(4, "readSoundResourceSmallHeader(%s,%d)", resTypeFromId(type), idx); @@ -1048,6 +927,11 @@ int Scumm::readSoundResourceSmallHeader(int type, int idx) } else { skip = 0x98; } + + /* copy the instrument data in another memory area */ + instr = (byte *)calloc(8 * 16, 1); + memcpy(instr, ptr + 0x19, 8*16); + ptr += skip; // size + instruments size -= skip; // drop instruments for now CHECK_HEAP @@ -1056,6 +940,7 @@ int Scumm::readSoundResourceSmallHeader(int type, int idx) error("Out of memory while allocating %d", size); } memcpy(track, ptr, size); // saving MIDI track data + nukeResource(type, idx); total_size = 8 + 16 + 14 + 8 + 7 + sizeof(OLD256_MIDI_HACK) - 1 + size; @@ -1090,6 +975,57 @@ int Scumm::readSoundResourceSmallHeader(int type, int idx) *ptr++ = (byte)((dw >> 8) & 0xFF); *ptr++ = (byte)(dw & 0xFF); memcpy(ptr, OLD256_MIDI_HACK, sizeof(OLD256_MIDI_HACK) - 1); + + /* now fill in the instruments */ + for (int i = 0; i < 8; i++) { + + /* flags_1 */ + ptr[95 * i + 30 + 0] = (instr[i * 16 + 3] >> 4) & 0xf; + ptr[95 * i + 30 + 1] = instr[i * 16 + 3] & 0xf; + + /* oplvl_1 */ + ptr[95 * i + 30 + 2] = (instr[i * 16 + 4] >> 4) & 0xf; + ptr[95 * i + 30 + 3] = instr[i * 16 + 4] & 0xf; + + /* atdec_1 */ + ptr[95 * i + 30 + 4] = ((~instr[i * 16 + 5]) >> 4) & 0xf; + ptr[95 * i + 30 + 5] = (~instr[i * 16 + 5]) & 0xf; + + /* sustrel_1 */ + ptr[95 * i + 30 + 6] = ((~instr[i * 16 + 6]) >> 4) & 0xf; + ptr[95 * i + 30 + 7] = (~instr[i * 16 + 6]) & 0xf; + + /* waveform_1 */ + ptr[95 * i + 30 + 8] = (instr[i * 16 + 7] >> 4) & 0xf; + ptr[95 * i + 30 + 9] = instr[i * 16 + 7] & 0xf; + + /* flags_2 */ + ptr[95 * i + 30 + 10] = (instr[i * 16 + 8] >> 4) & 0xf; + ptr[95 * i + 30 + 11] = instr[i * 16 + 8] & 0xf; + + /* oplvl_2 */ + ptr[95 * i + 30 + 12] = 3; + ptr[95 * i + 30 + 13] = 0xF; + + /* atdec_2 */ + ptr[95 * i + 30 + 14] = ((~instr[i * 16 + 10]) >> 4) & 0xf; + ptr[95 * i + 30 + 15] = (~instr[i * 16 + 10]) & 0xf; + + /* sustrel_2 */ + ptr[95 * i + 30 + 16] = ((~instr[i * 16 + 11]) >> 4) & 0xf; + ptr[95 * i + 30 + 17] = (~instr[i * 16 + 11]) & 0xf; + + /* waveform_2 */ + ptr[95 * i + 30 + 18] = (instr[i * 16 + 12] >> 4) & 0xf; + ptr[95 * i + 30 + 19] = instr[i * 16 + 12] & 0xf; + + /* feedback */ + ptr[95 * i + 30 + 20] = (instr[i * 16 + 2] >> 4) & 0xf; + ptr[95 * i + 30 + 21] = instr[i * 16 + 2] & 0xf; + } + + free(instr); + ptr += sizeof(OLD256_MIDI_HACK) - 1; memcpy(ptr, track, size); free(track); |