aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schickel2011-07-14 00:33:16 +0200
committerJohannes Schickel2011-07-14 00:49:32 +0200
commit9565af1ae42674b67fd1ed744ae4855991ba8473 (patch)
tree968047bf7f558a676ac463a6c25208916c76c5a0
parent3e38e6e22158de309914a946e5791ea2b927078b (diff)
downloadscummvm-rg350-9565af1ae42674b67fd1ed744ae4855991ba8473.tar.gz
scummvm-rg350-9565af1ae42674b67fd1ed744ae4855991ba8473.tar.bz2
scummvm-rg350-9565af1ae42674b67fd1ed744ae4855991ba8473.zip
SCUMM: Implement iMuse alloc part command closer to the original.
-rw-r--r--engines/scumm/imuse/sysex_scumm.cpp52
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};