aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/imuse.cpp17
-rw-r--r--scumm/resource.cpp214
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);