Ticket #8408: midi-mapping.diff

File midi-mapping.diff, 18.3 KB (added by eriktorbjorn, 20 years ago)

Patch against a March 21 CVS snapshot

  • kyra/sound.cpp

    diff -ur ScummVM-cvs20050321/kyra/sound.cpp ScummVM-cvs20050321+hack/kyra/sound.cpp
    old new  
    2222#include "sound.h"
    2323#include "resource.h"
    2424
    25 // Instrument mapping for MT32 tracks emulated under GM.
    26 static const byte mt32_to_gm[128] = {
    27 //    0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    28           0,   1,   0,   2,   4,   4,   5,   3,  16,  17,  18,  16,  16,  19,  20,  21, // 0x
    29           6,   6,   6,   7,   7,   7,   8, 112,  62,  62,  63,  63,  38,  38,  39,  39, // 1x
    30          88,  95,  52,  98,  97,  99,  14,  54, 102,  96,  53, 102,  81, 100,  14,  80, // 2x
    31          48,  48,  49,  45,  41,  40,  42,  42,  43,  46,  45,  24,  25,  28,  27, 104, // 3x
    32          32,  32,  34,  33,  36,  37,  35,  35,  79,  73,  72,  72,  74,  75,  64,  65, // 4x
    33          66,  67,  71,  71,  68,  69,  70,  22,  56,  59,  57,  57,  60,  60,  58,  61, // 5x
    34          61,  11,  11,  98,  14,   9,  14,  13,  12, 107, 107,  77,  78,  78,  76,  76, // 6x
    35          47, 117, 127, 118, 118, 116, 115, 119, 115, 112,  55, 124, 123,   0,  14, 117  // 7x
    36 };
    37 
    3825namespace Kyra {
    3926        MusicPlayer::MusicPlayer(MidiDriver* driver, KyraEngine* engine) {
    4027                _engine = engine;
     
    10895                        volume = volume * _volume / 255;
    10996                        b = (b & 0xFF00FFFF) | (volume << 16);
    11097                } else if ((b & 0xF0) == 0xC0 && !_nativeMT32) {
    111                         b = (b & 0xFFFF00FF) | mt32_to_gm[(b >> 8) & 0xFF] << 8;
     98                        b = (b & 0xFFFF00FF) | MidiDriver::_mt32ToGm[(b >> 8) & 0xFF] << 8;
    11299                } else if ((b & 0xFFF0) == 0x007BB0) {
    113100                        //Only respond to All Notes Off if this channel
    114101                        //has currently been allocated
  • queen/music.cpp

    diff -ur ScummVM-cvs20050321/queen/music.cpp ScummVM-cvs20050321+hack/queen/music.cpp
    old new  
    2929
    3030namespace Queen {
    3131
    32 // Instrument mapping for MT32 tracks emulated under GM.
    33 static const byte mt32_to_gm[128] = {
    34 //    0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    35           0,   1,   0,   2,   4,   4,   5,   3,  16,  17,  18,  16,  16,  19,  20,  21, // 0x
    36           6,   6,   6,   7,   7,   7,   8, 112,  62,  62,  63,  63,  38,  38,  39,  39, // 1x
    37          88,  95,  52,  98,  97,  99,  14,  54, 102,  96,  53, 102,  81, 100,  14,  80, // 2x
    38          48,  48,  49,  45,  41,  40,  42,  42,  43,  46,  45,  24,  25,  28,  27, 104, // 3x
    39          32,  32,  34,  33,  36,  37,  35,  35,  79,  73,  72,  72,  74,  75,  64,  65, // 4x
    40          66,  67,  71,  71,  68,  69,  70,  22,  56,  59,  57,  57,  60,  60,  58,  61, // 5x
    41          61,  11,  11,  98,  14,   9,  14,  13,  12, 107, 107,  77,  78,  78,  76,  76, // 6x
    42          47, 117, 127, 118, 118, 116, 115, 119, 115, 112,  55, 124, 123,   0,  14, 117  // 7x
    43 };
    44 
    4532MusicPlayer::MusicPlayer(MidiDriver *driver, byte *data, uint32 size) : _driver(driver), _isPlaying(false), _looping(false), _randomLoop(false), _masterVolume(192), _queuePos(0), _musicData(data), _musicDataSize(size), _passThrough(false), _buf(0) {
    4633        memset(_channel, 0, sizeof(_channel));
    4734        queueClear();
     
    142129                volume = volume * _masterVolume / 255;
    143130                b = (b & 0xFF00FFFF) | (volume << 16);
    144131        } else if ((b & 0xF0) == 0xC0 && !_nativeMT32) {
    145                 b = (b & 0xFFFF00FF) | mt32_to_gm[(b >> 8) & 0xFF] << 8;
     132                b = (b & 0xFFFF00FF) | MidiDriver::_mt32ToGm[(b >> 8) & 0xFF] << 8;
    146133        }
    147134        else if ((b & 0xFFF0) == 0x007BB0) {
    148135                //Only respond to All Notes Off if this channel
  • saga/music.cpp

    diff -ur ScummVM-cvs20050321/saga/music.cpp ScummVM-cvs20050321+hack/saga/music.cpp
    old new  
    3333
    3434namespace Saga {
    3535
    36 // Instrument mapping for MT32 tracks emulated under GM.
    37 static const byte mt32_to_gm[128] = {
    38 //    0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    39           0,   1,   0,   2,   4,   4,   5,   3,  16,  17,  18,  16,  16,  19,  20,  21, // 0x
    40           6,   6,   6,   7,   7,   7,   8, 112,  62,  62,  63,  63,  38,  38,  39,  39, // 1x
    41          88,  95,  52,  98,  97,  99,  14,  54, 102,  96,  53, 102,  81, 100,  14,  80, // 2x
    42          48,  48,  49,  45,  41,  40,  42,  42,  43,  46,  45,  24,  25,  28,  27, 104, // 3x
    43          32,  32,  34,  33,  36,  37,  35,  35,  79,  73,  72,  72,  74,  75,  64,  65, // 4x
    44          66,  67,  71,  71,  68,  69,  70,  22,  56,  59,  57,  57,  60,  60,  58,  61, // 5x
    45          61,  11,  11,  98,  14,   9,  14,  13,  12, 107, 107,  77,  78,  78,  76,  76, // 6x
    46          47, 117, 127, 118, 118, 116, 115, 119, 115, 112,  55, 124, 123,   0,  14, 117  // 7x
    47 };
    48 
    4936#define BUFFER_SIZE 4096
    5037
    5138// I haven't decided yet if it's a good idea to make looping part of the audio
     
    239226                volume = volume * _masterVolume / 255;
    240227                b = (b & 0xFF00FFFF) | (volume << 16);
    241228        } else if ((b & 0xF0) == 0xC0 && !_isGM && !_nativeMT32) {
    242                 b = (b & 0xFFFF00FF) | mt32_to_gm[(b >> 8) & 0xFF] << 8;
     229                b = (b & 0xFFFF00FF) | MidiDriver::_mt32ToGm[(b >> 8) & 0xFF] << 8;
    243230        }
    244231        else if ((b & 0xFFF0) == 0x007BB0) {
    245232                //Only respond to All Notes Off if this channel
  • scumm/instrument.cpp

    diff -ur ScummVM-cvs20050321/scumm/instrument.cpp ScummVM-cvs20050321+hack/scumm/instrument.cpp
    old new  
    2929
    3030static bool _native_mt32 = false;
    3131
    32 static const byte mt32_to_gm[128] = {
    33 //    0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    34           0,   1,   0,   2,   4,   4,   5,   3,  16,  17,  18,  16,  16,  19,  20,  21, // 0x
    35           6,   6,   6,   7,   7,   7,   8, 112,  62,  62,  63,  63,  38,  38,  39,  39, // 1x
    36          88,  95,  52,  98,  97,  99,  14,  54, 102,  96,  53, 102,  81, 100,  14,  80, // 2x
    37          48,  48,  49,  45,  41,  40,  42,  42,  43,  46,  45,  24,  25,  28,  27, 104, // 3x
    38          32,  32,  34,  33,  36,  37,  35,  35,  79,  73,  72,  72,  74,  75,  64,  65, // 4x
    39          66,  67,  71,  71,  68,  69,  70,  22,  56,  59,  57,  57,  60,  60,  58,  61, // 5x
    40          61,  11,  11,  98,  14,   9,  14,  13,  12, 107, 107,  77,  78,  78,  76,  76, // 6x
    41          47, 117, 127, 118, 118, 116, 115, 119, 115, 112,  55, 124, 123,   0,  14, 117  // 7x
    42 };
    43 
    44 static const byte gm_to_mt32[128] = {
    45           5,   1,   2,   7,   3,   5,  16,  21,  22, 101, 101,  97, 104, 103, 102,  20,
    46           8,   9,  11,  12,  14,  15,  87,  15,  59,  60,  61,  62,  67,  44,  79,  23,
    47          64,  67,  66,  70,  68,  69,  28,  31,  52,  54,  55,  56,  49,  51,  57, 112,
    48          48,  50,  45,  26,  34,  35,  45, 122,  89,  90,  94,  81,  92,  95,  24,  25,
    49          80,  78,  79,  78,  84,  85,  86,  82,  74,  72,  76,  77, 110, 107, 108,  76,
    50          47,  44, 111,  45,  44,  34,  44,  30,  32,  33,  88,  34,  35,  35,  38,  33,
    51          41,  36, 100,  37,  40,  34,  43,  40,  63,  21,  99, 105, 103,  86,  55,  84,
    52         101, 103, 100, 120, 117, 113,  99, 128, 128, 128, 128, 124, 123, 128, 128, 128,
    53 };
    54 
    5532static struct {
    5633        const char *name;
    5734        byte program;
     
    148125        void saveOrLoad (Serializer *s);
    149126        void send (MidiChannel *mc);
    150127        void copy_to (Instrument *dest) { dest->program (_program, _mt32); }
    151         bool is_valid() { return (_program < 128) && ((_native_mt32 == _mt32) || _native_mt32 ? (gm_to_mt32[_program] < 128) : (mt32_to_gm[_program] < 128)); }
     128        bool is_valid() { return (_program < 128) && ((_native_mt32 == _mt32) || _native_mt32 ? (MidiDriver::_gmToMt32[_program] < 128) : (MidiDriver::_mt32ToGm[_program] < 128)); }
    152129        operator int() { return (_program < 128) ? _program : 255; }
    153130};
    154131
     
    360337
    361338        byte program = _program;
    362339        if (_native_mt32 != _mt32)
    363                 program = _native_mt32 ? gm_to_mt32 [program] : mt32_to_gm [program];
     340                program = _native_mt32 ? MidiDriver::_gmToMt32 [program] : MidiDriver::_mt32ToGm [program];
    364341        if (program < 128)
    365342                mc->programChange (program);
    366343}
  • simon/midi.cpp

    diff -ur ScummVM-cvs20050321/simon/midi.cpp ScummVM-cvs20050321+hack/simon/midi.cpp
    old new  
    3535// and just provide a factory function.
    3636extern MidiParser *MidiParser_createS1D();
    3737
    38 
    39 // Instrument mapping for MT32 tracks emulated under GM.
    40 static const byte mt32_to_gm[128] = {
    41 //    0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    42           0,   1,   0,   2,   4,   4,   5,   3,  16,  17,  18,  16,  16,  19,  20,  21, // 0x
    43           6,   6,   6,   7,   7,   7,   8, 112,  62,  62,  63,  63,  38,  38,  39,  39, // 1x
    44          88,  95,  52,  98,  97,  99,  14,  54, 102,  96,  53, 102,  81, 100,  14,  80, // 2x
    45          48,  48,  49,  45,  41,  40,  42,  42,  43,  46,  45,  24,  25,  28,  27, 104, // 3x
    46          32,  32,  34,  33,  36,  37,  35,  35,  79,  73,  72,  72,  74,  75,  64,  65, // 4x
    47          66,  67,  71,  71,  68,  69,  70,  22,  56,  59,  57,  57,  60,  60,  58,  61, // 5x
    48          61,  11,  11,  98,  14,   9,  14,  13,  12, 107, 107,  77,  78,  78,  76,  76, // 6x
    49          47, 117, 127, 118, 118, 116, 115, 119, 115, 112,  55, 124, 123,   0,  14, 117  // 7x
    50 };
    51 
    52 
    53 
    5438MidiPlayer::MidiPlayer(OSystem *system) {
    5539        // Since initialize() is called every time the music changes,
    5640        // this is where we'll initialize stuff that must persist
     
    117101                volume = volume * _masterVolume / 255;
    118102                b = (b & 0xFF00FFFF) | (volume << 16);
    119103        } else if ((b & 0xF0) == 0xC0 && _map_mt32_to_gm) {
    120                 b = (b & 0xFFFF00FF) | (mt32_to_gm[(b >> 8) & 0xFF] << 8);
     104                b = (b & 0xFFFF00FF) | (MidiDriver::_mt32ToGm[(b >> 8) & 0xFF] << 8);
    121105        } else if ((b & 0xFFF0) == 0x007BB0) {
    122106                // Only respond to an All Notes Off if this channel
    123107                // has already been allocated.
  • sky/music/gmchannel.cpp

    diff -ur ScummVM-cvs20050321/sky/music/gmchannel.cpp ScummVM-cvs20050321+hack/sky/music/gmchannel.cpp
    old new  
    2525
    2626namespace Sky {
    2727
    28 GmChannel::GmChannel(uint8 *pMusicData, uint16 startOfData, MidiDriver *pMidiDrv, byte *pInstMap, uint8 *veloTab) {
     28GmChannel::GmChannel(uint8 *pMusicData, uint16 startOfData, MidiDriver *pMidiDrv, const byte *pInstMap, const byte *veloTab) {
    2929
    3030        _musicData = pMusicData;
    3131        _midiDrv = pMidiDrv;
     
    3434        _channelData.eventDataPtr = startOfData;
    3535        _channelData.channelActive = 1;
    3636        _channelData.nextEventTime = getNextEventTime();
    37         _mt32_to_gm = pInstMap;
     37        _instMap = pInstMap;
    3838        _veloTab = veloTab;
    3939
    4040        _musicVolume = 0x7F;
     
    130130                        }
    131131                } else {
    132132                        _channelData.note = opcode;
    133                         uint8 velocity = _veloTab[_musicData[_channelData.eventDataPtr]];
     133                        byte velocity = _musicData[_channelData.eventDataPtr];
     134                        if (_veloTab)
     135                                velocity = _veloTab[velocity];
    134136                        _channelData.eventDataPtr++;
    135137                        _midiDrv->send((0x90 | _channelData.midiChannelNumber) | (opcode << 8) | (velocity << 16));
    136138                }
     
    155157}
    156158
    157159void GmChannel::com90_setupInstrument(void) {
    158 
    159         _midiDrv->send((0xC0 | _channelData.midiChannelNumber) | (_mt32_to_gm[_musicData[_channelData.eventDataPtr]] << 8));
     160        byte instrument = _musicData[_channelData.eventDataPtr];
     161        if (_instMap)
     162                instrument = _instMap[instrument];
     163        _midiDrv->send((0xC0 | _channelData.midiChannelNumber) | (instrument << 8));
    160164        _channelData.eventDataPtr++;
    161165}
    162166
  • sky/music/gmchannel.h

    diff -ur ScummVM-cvs20050321/sky/music/gmchannel.h ScummVM-cvs20050321+hack/sky/music/gmchannel.h
    old new  
    3939
    4040class GmChannel : public ChannelBase {
    4141public:
    42         GmChannel(uint8 *pMusicData, uint16 startOfData, MidiDriver *pMidiDrv, byte *pInstMap, uint8 *veloTab);
     42        GmChannel(uint8 *pMusicData, uint16 startOfData, MidiDriver *pMidiDrv, const byte *pInstMap, const byte *veloTab);
    4343        virtual void stopNote(void);
    4444        virtual uint8 process(uint16 aktTime);
    4545        virtual void updateVolume(uint16 pVolume);
    4646        virtual bool isActive(void);
    4747private:
    48         byte *_mt32_to_gm;
    49         uint8 *_veloTab;
     48        const byte *_instMap;
     49        const byte *_veloTab;
    5050        MidiDriver *_midiDrv;
    5151        uint8 *_musicData;
    5252        uint16 _musicVolume;
  • sky/music/gmmusic.cpp

    diff -ur ScummVM-cvs20050321/sky/music/gmmusic.cpp ScummVM-cvs20050321+hack/sky/music/gmmusic.cpp
    old new  
    8989        channelData++;
    9090        for (uint8 cnt = 0; cnt < _numberOfChannels; cnt++) {
    9191                uint16 chDataStart = ((channelData[(cnt << 1) | 1] << 8) | channelData[cnt << 1]) + _musicDataLoc;
    92                 _channels[cnt] = new GmChannel(_musicData, chDataStart, _midiDrv, _mt32_to_gm, _veloTab);
     92                _channels[cnt] = new GmChannel(_musicData, chDataStart, _midiDrv, MidiDriver::_mt32ToGm, _veloTab);
    9393                _channels[cnt]->updateVolume(_musicVolume);
    9494        }
    9595}
     
    102102        // skip all sysEx as it can't be handled anyways.
    103103}
    104104
    105 byte GmMusic::_mt32_to_gm[128] = {
    106 //    0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    107           0,   1,   0,   2,   4,   4,   5,   3,  16,  17,  18,  16,  16,  19,  20,  21, // 0x
    108           6,   6,   6,   7,   7,   7,   8, 112,  62,  62,  63,  63,  38,  38,  39,  39, // 1x
    109          88,  95,  52,  98,  97,  99,  14,  54, 102,  96,  53, 102,  81, 100,  14,  80, // 2x
    110          48,  48,  49,  45,  41,  40,  42,  42,  43,  46,  45,  24,  25,  28,  27, 104, // 3x
    111          32,  32,  34,  33,  36,  37,  35,  35,  79,  73,  72,  72,  74,  75,  64,  65, // 4x
    112          66,  67,  71,  71,  68,  69,  70,  22,  56,  59,  57,  57,  60,  60,  58,  61, // 5x
    113          61,  11,  11,  98,  14,   9,  14,  13,  12, 107, 107,  77,  78,  78,  76,  76, // 6x
    114          47, 117, 127, 118, 118, 116, 115, 119, 115, 112,  55, 124, 123,   0,  14, 117, // 7x
    115 };
    116 
    117 uint8 GmMusic::_veloTab[128] = {
     105const byte GmMusic::_veloTab[128] = {
    118106        0x00, 0x40, 0x41, 0x41, 0x42, 0x42, 0x43, 0x43, 0x44, 0x44,
    119107        0x45, 0x45, 0x46, 0x46, 0x47, 0x47, 0x48, 0x48, 0x49, 0x49,
    120108        0x4A, 0x4A, 0x4B, 0x4B, 0x4C, 0x4C, 0x4D, 0x4D, 0x4E, 0x4E,
  • sky/music/gmmusic.h

    diff -ur ScummVM-cvs20050321/sky/music/gmmusic.h ScummVM-cvs20050321+hack/sky/music/gmmusic.h
    old new  
    4040        uint32 _timerCount;
    4141        uint8 *_sysExSequence;
    4242        MidiDriver *_midiDrv;
    43         static byte _mt32_to_gm[128];
    44         static uint8 _veloTab[128];
     43        static const byte _veloTab[128];
    4544
    4645        virtual void setupPointers(void);
    4746        virtual void setupChannels(uint8 *channelData);
  • sky/music/mt32music.cpp

    diff -ur ScummVM-cvs20050321/sky/music/mt32music.cpp ScummVM-cvs20050321+hack/sky/music/mt32music.cpp
    old new  
    4040        int midiRes = _midiDrv->open();
    4141        if (midiRes != 0)
    4242                error("Can't open midi device. Errorcode: %d",midiRes);
    43         for (uint8 cnt = 0; cnt < 128; cnt++)
    44                 _dummyMap[cnt] = cnt;
    4543        _timerCount = 0;
    4644        _midiDrv->setTimerCallback(this, passTimerFunc);
    4745}
     
    8684        channelData++;
    8785        for (uint8 cnt = 0; cnt < _numberOfChannels; cnt++) {
    8886                uint16 chDataStart = ((channelData[(cnt << 1) | 1] << 8) | channelData[cnt << 1]) + _musicDataLoc;
    89                 _channels[cnt] = new GmChannel(_musicData, chDataStart, _midiDrv, _dummyMap, _dummyMap);
     87                _channels[cnt] = new GmChannel(_musicData, chDataStart, _midiDrv, NULL, NULL);
    9088                _channels[cnt]->updateVolume(_musicVolume);
    9189        }
    9290}
  • sky/music/mt32music.h

    diff -ur ScummVM-cvs20050321/sky/music/mt32music.h ScummVM-cvs20050321+hack/sky/music/mt32music.h
    old new  
    4141        uint32 _timerCount;
    4242        uint8 *_sysExSequence;
    4343        MidiDriver *_midiDrv;
    44         uint8 _dummyMap[128];
    4544
    4645        virtual void setupPointers(void);
    4746        virtual void setupChannels(uint8 *channelData);
  • sound/mididrv.cpp

    diff -ur ScummVM-cvs20050321/sound/mididrv.cpp ScummVM-cvs20050321+hack/sound/mididrv.cpp
    old new  
    6969        {0, 0, 0}
    7070};
    7171
     72const byte MidiDriver::_mt32ToGm[128] = {
     73//        0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
     74          0,   1,   0,   2,   4,   4,   5,   3,  16,  17,  18,  16,  16,  19,  20,  21, // 0x
     75          6,   6,   6,   7,   7,   7,   8, 112,  62,  62,  63,  63,  38,  38,  39,  39, // 1x
     76         88,  95,  52,  98,  97,  99,  14,  54, 102,  96,  53, 102,  81, 100,  14,  80, // 2x
     77         48,  48,  49,  45,  41,  40,  42,  42,  43,  46,  45,  24,  25,  28,  27, 104, // 3x
     78         32,  32,  34,  33,  36,  37,  35,  35,  79,  73,  72,  72,  74,  75,  64,  65, // 4x
     79         66,  67,  71,  71,  68,  69,  70,  22,  56,  59,  57,  57,  60,  60,  58,  61, // 5x
     80         61,  11,  11,  98,  14,   9,  14,  13,  12, 107, 107,  77,  78,  78,  76,  76, // 6x
     81         47, 117, 127, 118, 118, 116, 115, 119, 115, 112,  55, 124, 123,   0,  14, 117  // 7x
     82};
     83
     84const byte MidiDriver::_gmToMt32[128] = {
     85//        0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
     86          5,   1,   2,   7,   3,   5,  16,  21,  22, 101, 101,  97, 104, 103, 102,  20, // 0x
     87          8,   9,  11,  12,  14,  15,  87,  15,  59,  60,  61,  62,  67,  44,  79,  23, // 1x
     88         64,  67,  66,  70,  68,  69,  28,  31,  52,  54,  55,  56,  49,  51,  57, 112, // 2x
     89         48,  50,  45,  26,  34,  35,  45, 122,  89,  90,  94,  81,  92,  95,  24,  25, // 3x
     90         80,  78,  79,  78,  84,  85,  86,  82,  74,  72,  76,  77, 110, 107, 108,  76, // 4x
     91         47,  44, 111,  45,  44,  34,  44,  30,  32,  33,  88,  34,  35,  35,  38,  33, // 5x
     92         41,  36, 100,  37,  40,  34,  43,  40,  63,  21,  99, 105, 103,  86,  55,  84, // 6x
     93        101, 103, 100, 120, 117, 113,  99, 128, 128, 128, 128, 124, 123, 128, 128, 128, // 7x
     94};
    7295
    7396const MidiDriverDescription *MidiDriver::getAvailableMidiDrivers() {
    7497        return midiDrivers;
  • sound/mididrv.h

    diff -ur ScummVM-cvs20050321/sound/mididrv.h ScummVM-cvs20050321+hack/sound/mididrv.h
    old new  
    9191public:
    9292        virtual ~MidiDriver() { }
    9393
     94        static const byte _mt32ToGm[128];
     95        static const byte _gmToMt32[128];
     96
    9497        /**
    9598         * Error codes returned by open.
    9699         * Can be converted to a string with getErrorName().