Ticket #8284: gs-setup-and-rythm-emulation.diff

File gs-setup-and-rythm-emulation.diff, 3.2 KB (added by SF/logicdeluxe, 18 years ago)

revised verion also takes care of the rythm map

  • scumm\imuse.cpp

    old new  
    11731173        if (result)
    11741174                error("IMuse initialization - %s", MidiDriver::getErrorName(result));
    11751175
     1176//TODO: this if does not what it suggest. This even break other games!
     1177      if ((_midi_native) && (!_native_mt32)) {
     1178                // Special setup for General Synthesizer
     1179                byte buffer[11];
     1180               
     1181                // General MIDI reset.
     1182                // This also ensures compatibility on GS devices. We do this even
     1183                // before GS reset in case there is just a plain GM device.
     1184                midi->sysEx((byte*)"\x7E\x7F\x09\x01", 4);
     1185                g_system->delay_msecs (200);
     1186
     1187//TODO: use this block only for SCUMM version < 6! (write a proper if state!)
     1188                {
     1189                        // There are different GS SysEx manufacturer id's.
     1190                        // That's why the GS data has to be sent twice with different id's.
     1191
     1192                        // Roland GS SysEx
     1193                        memcpy(&buffer[0], "\x41\x10\x42\x12\x40", 5);
     1194               
     1195                        // GS Reset
     1196                        memcpy(&buffer[5], "\x00\x7F\x00\x41", 4);
     1197                        midi->sysEx(buffer, 8);
     1198                        g_system->delay_msecs (200);
     1199
     1200                        // Setup reverb as used with MT-32
     1201                        memcpy(&buffer[5], "\x01\x30\x00\x0f", 4);
     1202                        midi->sysEx(buffer, 8);
     1203
     1204                        // Dream/Terratec GS SysEx
     1205                        memcpy(&buffer[0], "\x00\x20\x00\x00\x00\x12\x40", 7);
     1206               
     1207                        // GS Reset
     1208                        memcpy(&buffer[7], "\x00\x7F\x00\x41", 4);
     1209                        midi->sysEx(buffer, 11);
     1210                        g_system->delay_msecs (200);
     1211
     1212                        // Setup reverb as used with MT-32
     1213                        memcpy(&buffer[7], "\x01\x30\x00\x0f", 4);
     1214                        midi->sysEx(buffer, 11);
     1215
     1216                        // Enable percussion reverb (GM compilant)
     1217                        midi->getPercussionChannel()->controlChange(91, 64);
     1218                }
     1219
     1220                // Set GM master volume
     1221                midi->sysEx((byte*)"\x7F\x7F\x04\x01\x00\x7F", 6);
     1222        }
     1223
    11761224        // Connect to the driver's timer
    11771225        midi->setTimerCallback(midi, &IMuseInternal::midiTimerCallback);
    11781226}
     
    12101258        midi->sysEx(buffer, 31);
    12111259        g_system->delay_msecs (250);
    12121260
    1213         // Setup rythm part
     1261        // Assign some reverb free copies to notes 24-34 on the rythm part
    12141262        memcpy(&buffer[4], "\x03\x01\x10\x40\x64\x07\x00\x4a\x64\x06\x00\x41\x64\x07\x00\x4b\x64\x08\x00\x45\x64\x06\x00\x44\x64\x0b\x00\x51\x64\x05\x00\x43\x64\x08\x00\x50\x64\x07\x00\x42\x64\x03\x00\x4c\x64\x07\x00\x44", 48);
    12151263        midi->sysEx(buffer, 52);
    12161264        g_system->delay_msecs (250);
     
    15371585}
    15381586
    15391587void Part::noteOn(byte note, byte velocity) {
     1588        static const byte rythm_map[35] = {
     1589        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     1590          0,  0,  0,  0,  0,  0,  0,  0, 36, 37, 38, 39, 40, 41, 66, 47,
     1591         65, 48, 56}; // This emulates the setup LEC used with the MT-32
     1592
    15401593        if (!_on)
    15411594                return;
    15421595
     
    15571610                mc = _player->getMidiDriver()->getPercussionChannel();
    15581611                if (!mc)
    15591612                        return;
    1560                 mc->volume(_vol_eff);
    1561 //              mc->programChange(_bank);
     1613                static byte prev_vol_eff = -1;
     1614                if (_vol_eff != prev_vol_eff){
     1615                        mc->volume(_vol_eff);
     1616                        prev_vol_eff = _vol_eff;
     1617                }
     1618//              mc->programChange(_bank); // This line really should be removed! Setting a bank on a rythm part insn't even GM/GS compilant!
     1619                if ((note < 35) && (!_player->_se->isNativeMT32()))
     1620                        note = rythm_map[note];
    15621621                mc->noteOn(note, velocity);
    15631622        }
    15641623}