diff options
Diffstat (limited to 'engines/scumm/imuse/imuse_player.cpp')
-rw-r--r-- | engines/scumm/imuse/imuse_player.cpp | 181 |
1 files changed, 4 insertions, 177 deletions
diff --git a/engines/scumm/imuse/imuse_player.cpp b/engines/scumm/imuse/imuse_player.cpp index fddba2fcc9..ff12e4d94a 100644 --- a/engines/scumm/imuse/imuse_player.cpp +++ b/engines/scumm/imuse/imuse_player.cpp @@ -58,10 +58,10 @@ uint16 Player::_active_notes[128]; ////////////////////////////////////////////////// Player::Player() : - _midi(0), - _parser(0), + _midi(NULL), + _parser(NULL), _passThrough(0), - _parts(0), + _parts(NULL), _active(false), _scanning(false), _id(0), @@ -393,180 +393,7 @@ void Player::sysEx(const byte *p, uint16 len) { debugC(DEBUG_IMUSE, "[%02d] SysEx:%s", _id, buf); } - switch (code = *p++) { - case 0: - if (_se->_game_id != GID_SAMNMAX) { - // There are 17 bytes of useful information beyond - // what we've read so far. All we know about them is - // as follows: - // BYTE 00: Channel # - // BYTE 02: BIT 01(0x01): Part on?(1 = yes) - // BIT 02(0x02): Reverb? (1 = yes) [bug #1088045] - // BYTE 04: Priority adjustment [guessing] - // 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) - part = getPart(p[0] & 0x0F); - if (part) { - part->set_onoff(p[2] & 0x01); - part->effectLevel ((p[2] & 0x02) ? 127 : 0); - part->set_pri(p[4]); - part->volume((p[5] & 0x0F) << 4 |(p[6] & 0x0F)); - part->set_pan((p[7] & 0x0F) << 4 | (p[8] & 0x0F)); - part->_percussion = _isMIDI ? ((p[9] & 0x08) > 0) : false; - part->pitchBendFactor ((p[13] & 0x0F) << 4 | (p[14] & 0x0F)); - if (part->_percussion) { - if (part->_mc) { - part->off(); - _se->reallocateMidiChannels(_midi); - } - } else { - // Even in cases where a program does not seem to be specified, - // i.e. bytes 15 and 16 are 0, we send a program change because - // 0 is a valid program number. MI2 tests show that in such - // cases, a regular program change message always seems to follow - // anyway. - if (_isMIDI) - part->_instrument.program((p[15] & 0x0F) << 4 |(p[16] & 0x0F), _isMT32); - part->sendAll(); - } - } - } else { - // Sam & Max: Trigger Event - // Triggers are set by doCommand(ImSetTrigger). - // When a SysEx marker is encountered whose sound - // ID and marker ID match what was set by ImSetTrigger, - // something magical is supposed to happen.... - for (a = 0; a < ARRAYSIZE(_se->_snm_triggers); ++a) { - if (_se->_snm_triggers[a].sound == _id && - _se->_snm_triggers[a].id == *p) - { - _se->_snm_triggers[a].sound = _se->_snm_triggers[a].id = 0; - _se->doCommand(8, _se->_snm_triggers[a].command); - break; - } - } - } // end if - break; - - case 1: - if (_se->_game_id != GID_SAMNMAX) { - // Shut down a part. [Bug 1088045, comments] - part = getPart (p[0]); - if (part != NULL) part->uninit(); - } else { - // Sam & Max: maybe_jump. - if (_scanning) - break; - maybe_jump(p[0], p[1] - 1, (READ_BE_UINT16(p + 2) - 1) * 4 + p[4], ((p[5] * TICKS_PER_BEAT) >> 2) + p[6]); - } - break; - - case 2: // Start of song. Ignore for now. - break; - - case 16: // Adlib instrument definition(Part) - a = *p++ & 0x0F; - ++p; // Skip hardware type - part = getPart(a); - if (part) { - if (len == 63) { - decode_sysex_bytes(p, buf, len - 3); - part->set_instrument((byte *)buf); - } else { - // SPK tracks have len == 49 here, and are not supported - part->programChange(254); // Must be invalid, but not 255 (which is reserved) - } - } - break; - - case 17: // Adlib instrument definition(Global) - p += 2; // Skip hardware type and... whatever came right before it - a = *p++; - decode_sysex_bytes(p, buf, len - 4); - _se->setGlobalAdlibInstrument(a, buf); - break; - - case 33: // Parameter adjust - a = *p++ & 0x0F; - ++p; // Skip hardware type - decode_sysex_bytes(p, buf, len - 3); - part = getPart(a); - if (part) - part->set_param(READ_BE_UINT16(buf), READ_BE_UINT16(buf + 2)); - break; - - case 48: // Hook - jump - if (_scanning) - break; - decode_sysex_bytes(p + 1, buf, len - 2); - maybe_jump(buf[0], READ_BE_UINT16(buf + 1), READ_BE_UINT16(buf + 3), READ_BE_UINT16(buf + 5)); - break; - - case 49: // Hook - global transpose - decode_sysex_bytes(p + 1, buf, len - 2); - maybe_set_transpose(buf); - break; - - case 50: // Hook - part on/off - buf[0] = *p++ & 0x0F; - decode_sysex_bytes(p, buf + 1, len - 2); - maybe_part_onoff(buf); - break; - - case 51: // Hook - set volume - buf[0] = *p++ & 0x0F; - decode_sysex_bytes(p, buf + 1, len - 2); - maybe_set_volume(buf); - break; - - case 52: // Hook - set program - buf[0] = *p++ & 0x0F; - decode_sysex_bytes(p, buf + 1, len - 2); - maybe_set_program(buf); - break; - - case 53: // Hook - set transpose - buf[0] = *p++ & 0x0F; - decode_sysex_bytes(p, buf + 1, len - 2); - maybe_set_transpose_part(buf); - break; - - case 64: // Marker - p++; - len -= 2; - while (len--) { - _se->handle_marker(_id, *p++); - } - break; - - case 80: // Loop - decode_sysex_bytes(p + 1, buf, len - 2); - setLoop(READ_BE_UINT16(buf), READ_BE_UINT16(buf + 2), - READ_BE_UINT16(buf + 4), READ_BE_UINT16(buf + 6), - READ_BE_UINT16(buf + 8)); - break; - - case 81: // End loop - clearLoop(); - break; - - case 96: // Set instrument - part = getPart(p[0] & 0x0F); - b = (p[1] & 0x0F) << 12 |(p[2] & 0x0F) << 8 |(p[4] & 0x0F) << 4 |(p[4] & 0x0F); - if (part) - part->set_instrument(b); - break; - - default: - error("Unknown SysEx command %d", (int)code); - } + if (_se->_sysex) (*_se->_sysex) (this, p, len); } void Player::decode_sysex_bytes(const byte *src, byte *dst, int len) { |