Ticket #8284: GM_and_GS_setup.diff

File GM_and_GS_setup.diff, 3.7 KB (added by SF/logicdeluxe, 18 years ago)

This time it is the 3rd and fully working version

  • scumm\imuse.cpp

    old new  
    10841084
    10851085        case IMuse::PROP_NATIVE_MT32:
    10861086                _native_mt32 = (value > 0);
    1087                 Instrument::nativeMT32(value > 0);
    1088                 if (value > 0 && _midi_native)
    1089                         initMT32(_midi_native);
     1087                Instrument::nativeMT32(_native_mt32);
     1088                if (_midi_native ) {
     1089                        // FIXME: Why is _midi_native even set in ZAK256?
     1090                        // The g_scumm->version check is only here to prevent SDL
     1091                        // from crashing because of this.
     1092                        if (g_scumm->_version > 3) {
     1093                                if (_native_mt32)
     1094                                        initMT32(_midi_native);
     1095                                else
     1096                                        initGM(_midi_native);
     1097                        }
     1098                }
    10901099                break;
    10911100
    10921101        case IMuse::PROP_MULTI_MIDI:
     
    12041213        midi->sysEx(buffer, 31);
    12051214        g_system->delay_msecs (250);
    12061215
    1207         // Setup rythm part
     1216        // Assign some reverb free copies to notes 24-34 on the rythm part
    12081217        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);
    12091218        midi->sysEx(buffer, 52);
    12101219        g_system->delay_msecs (250);
    12111220}
    12121221
     1222void IMuseInternal::initGM(MidiDriver *midi) {
     1223        byte buffer[11];
     1224
     1225        // General MIDI reset.
     1226        // This also ensures compatibility on GS devices. We do this even
     1227        // before GS reset in case there is just a plain GM device.
     1228        midi->sysEx((byte*)"\x7E\x7F\x09\x01", 4);
     1229        g_system->delay_msecs (200);
     1230
     1231        if (g_scumm->_version < 6) {
     1232                // There are different GS SysEx manufacturer id's.
     1233                // That's why the GS data has to be sent twice with different id's.
     1234
     1235                // Roland GS SysEx
     1236                memcpy(&buffer[0], "\x41\x10\x42\x12\x40", 5);
     1237       
     1238                // GS Reset
     1239                memcpy(&buffer[5], "\x00\x7F\x00\x41", 4);
     1240                midi->sysEx(buffer, 8);
     1241                g_system->delay_msecs (200);
     1242
     1243                // Setup reverb as used with MT-32
     1244                memcpy(&buffer[5], "\x01\x30\x00\x0f", 4);
     1245                midi->sysEx(buffer, 8);
     1246
     1247
     1248                // Dream/Terratec GS SysEx
     1249                memcpy(&buffer[0], "\x00\x20\x00\x00\x00\x12\x40", 7);
     1250
     1251                // GS Reset
     1252                memcpy(&buffer[7], "\x00\x7F\x00\x41", 4);
     1253                midi->sysEx(buffer, 11);
     1254                g_system->delay_msecs (200);
     1255
     1256                // Setup reverb as used with MT-32
     1257                memcpy(&buffer[7], "\x01\x30\x00\x0f", 4);
     1258                midi->sysEx(buffer, 11);
     1259
     1260
     1261                // Enable percussion reverb (GM compilant)
     1262                midi->getPercussionChannel()->controlChange(91, 64);
     1263        }
     1264
     1265        // Set GM master volume
     1266        midi->sysEx((byte*)"\x7F\x7F\x04\x01\x00\x7F", 6);
     1267}
     1268
    12131269void IMuseInternal::init_queue() {
    12141270        _queue_adding = false;
    12151271        _queue_pos = 0;
     
    15471603        if (!_on)
    15481604                return;
    15491605
     1606        static const byte rythm_map[35] = {
     1607          0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     1608          0,  0,  0,  0,  0,  0,  0,  0, 36, 37, 38, 39, 40, 41, 66, 47,
     1609         65, 48, 56}; // This emulates the setup LEC used with the MT-32
     1610
    15501611        MidiChannel *mc = _mc;
    15511612
    15521613        // DEBUG
     
    15641625                mc = _player->getMidiDriver()->getPercussionChannel();
    15651626                if (!mc)
    15661627                        return;
    1567                 mc->volume(_vol_eff);
    1568 //              mc->programChange(_bank);
     1628                static byte prev_vol_eff = 128;
     1629                if (_vol_eff != prev_vol_eff){
     1630                        mc->volume(_vol_eff);
     1631                        prev_vol_eff = _vol_eff;
     1632                }
     1633                if ((note < 35) && (!_player->_se->isNativeMT32()))
     1634                        note = rythm_map[note];
    15691635                mc->noteOn(note, velocity);
    15701636        }
    15711637}
  • scumm\imuse_internal.h

    old new  
    398398        void handle_marker(uint id, byte data);
    399399        int get_channel_volume(uint a);
    400400        void initMidiDriver(MidiDriver *midi);
     401        void initGM(MidiDriver *midi);
    401402        void initMT32(MidiDriver *midi);
    402403        void init_players();
    403404        void init_parts();