Ticket #8284: GM_and_GS_setup.diff
File GM_and_GS_setup.diff, 3.7 KB (added by , 21 years ago) |
---|
-
scumm\imuse.cpp
old new 1084 1084 1085 1085 case IMuse::PROP_NATIVE_MT32: 1086 1086 _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 } 1090 1099 break; 1091 1100 1092 1101 case IMuse::PROP_MULTI_MIDI: … … 1204 1213 midi->sysEx(buffer, 31); 1205 1214 g_system->delay_msecs (250); 1206 1215 1207 // Setuprythm part1216 // Assign some reverb free copies to notes 24-34 on the rythm part 1208 1217 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); 1209 1218 midi->sysEx(buffer, 52); 1210 1219 g_system->delay_msecs (250); 1211 1220 } 1212 1221 1222 void 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 1213 1269 void IMuseInternal::init_queue() { 1214 1270 _queue_adding = false; 1215 1271 _queue_pos = 0; … … 1547 1603 if (!_on) 1548 1604 return; 1549 1605 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 1550 1611 MidiChannel *mc = _mc; 1551 1612 1552 1613 // DEBUG … … 1564 1625 mc = _player->getMidiDriver()->getPercussionChannel(); 1565 1626 if (!mc) 1566 1627 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]; 1569 1635 mc->noteOn(note, velocity); 1570 1636 } 1571 1637 } -
scumm\imuse_internal.h
old new 398 398 void handle_marker(uint id, byte data); 399 399 int get_channel_volume(uint a); 400 400 void initMidiDriver(MidiDriver *midi); 401 void initGM(MidiDriver *midi); 401 402 void initMT32(MidiDriver *midi); 402 403 void init_players(); 403 404 void init_parts();