diff options
author | Johannes Schickel | 2011-07-14 00:33:16 +0200 |
---|---|---|
committer | Johannes Schickel | 2011-07-14 00:49:32 +0200 |
commit | 9565af1ae42674b67fd1ed744ae4855991ba8473 (patch) | |
tree | 968047bf7f558a676ac463a6c25208916c76c5a0 /engines | |
parent | 3e38e6e22158de309914a946e5791ea2b927078b (diff) | |
download | scummvm-rg350-9565af1ae42674b67fd1ed744ae4855991ba8473.tar.gz scummvm-rg350-9565af1ae42674b67fd1ed744ae4855991ba8473.tar.bz2 scummvm-rg350-9565af1ae42674b67fd1ed744ae4855991ba8473.zip |
SCUMM: Implement iMuse alloc part command closer to the original.
Diffstat (limited to 'engines')
-rw-r--r-- | engines/scumm/imuse/sysex_scumm.cpp | 52 |
1 files changed, 23 insertions, 29 deletions
diff --git a/engines/scumm/imuse/sysex_scumm.cpp b/engines/scumm/imuse/sysex_scumm.cpp index ec64800b20..9f795133be 100644 --- a/engines/scumm/imuse/sysex_scumm.cpp +++ b/engines/scumm/imuse/sysex_scumm.cpp @@ -49,38 +49,32 @@ void sysexHandler_Scumm(Player *player, const byte *msg, uint16 len) { switch (code = *p++) { case 0: // Allocate new part. - // There are 17 bytes of useful information here. + // There are 8 bytes (after decoding!) of useful information here. // Here is what we know about them so far: - // BYTE 00: Channel # - // BYTE 02: BIT 01(0x01): Part on?(1 = yes) + // BYTE 0: Channel # + // BYTE 1: BIT 01(0x01): Part on?(1 = yes) // BIT 02(0x02): Reverb? (1 = yes) [bug #1088045] - // BYTE 03: Priority adjustment(upper 4 bits) - // BYTE 04: Priority adjustment(lower 4 bits) - // BYTE 05: Volume(upper 4 bits) [guessing] - // BYTE 06: Volume(lower 4 bits) [guessing] - // BYTE 07: Pan(upper 4 bits) [bug #1088045] - // BYTE 08: Pan(lower 4 bits) [bug #1088045] - // BYTE 09: BIT 04(0x08): Percussion?(1 = yes) - // BYTE 13: Pitchbend range(upper 4 bits) [bug #1088045] - // BYTE 14: Pitchbend range(lower 4 bits) [bug #1088045] - // BYTE 15: Program(upper 4 bits) - // BYTE 16: Program(lower 4 bits) - - // athrxx (05-21-2011): - // BYTE 9, 10: Transpose (if set to 0x80, this means that part->_transpose_eff will be 0 (also ignoring player->_transpose) - // BYTE 11, 12: Detune + // BYTE 2: Priority adjustment + // BYTE 3: Volume [guessing] + // BYTE 4: Pan [bug #1088045] + // BYTE 5: BIT 8(0x80): Percussion?(1 = yes) [guessed?] + // BYTE 5: Transpose, if set to 0x80(=-1) it means no transpose + // BYTE 6: Detune + // BYTE 7: Pitchbend factor [bug #1088045] + // BYTE 8: Program part = player->getPart(p[0] & 0x0F); + player->decode_sysex_bytes(p + 1, buf + 1, len - 1); if (part) { - part->set_onoff(p[2] & 0x01); - part->effectLevel((p[2] & 0x02) ? 127 : 0); - part->set_pri((p[3] << 4) | p[4]); - part->volume((p[5] & 0x0F) << 4 | (p[6] & 0x0F)); - part->set_pan((p[7] & 0x0F) << 4 | (p[8] & 0x0F)); - part->_percussion = player->_isMIDI ? ((p[9] & 0x08) > 0) : false; - part->set_transpose((p[9] & 0x0F) << 4 | (p[10] & 0x0F)); - part->set_detune((p[11] & 0x0F) << 4 | (p[12] & 0x0F)); - part->pitchBendFactor((p[13] & 0x0F) << 4 | (p[14] & 0x0F)); + part->set_onoff(buf[1] & 0x01); + part->effectLevel((buf[1] & 0x02) ? 127 : 0); + part->set_pri(buf[2]); + part->volume(buf[3]); + part->set_pan(buf[4]); + part->_percussion = player->_isMIDI ? ((buf[5] & 0x80) > 0) : false; + part->set_transpose(buf[5]); + part->set_detune(buf[6]); + part->pitchBendFactor(buf[7]); if (part->_percussion) { if (part->_mc) { part->off(); @@ -93,10 +87,10 @@ void sysexHandler_Scumm(Player *player, const byte *msg, uint16 len) { // cases, a regular program change message always seems to follow // anyway. if (player->_isMIDI) { - part->_instrument.program((p[15] & 0x0F) << 4 | (p[16] & 0x0F), player->_isMT32); + part->_instrument.program(buf[8], player->_isMT32); } else if (se->_pcSpeaker) { // FIXME/HACK: This is only needed here, since when we use the following line: - // se->copyGlobalInstrument((p[15] & 0x0F) << 4 |(p[16] & 0x0F), &part->_instrument); + // se->copyGlobalInstrument(buf[8], &part->_instrument); // We would not get any instrument for PC Speaker. Because we don't default to an // "empty" instrument in case the global instrument specified is not set up. byte empty[23] = {0}; |