Ticket #1261: volume.diff

File volume.diff, 1.2 KB (added by SF/logicdeluxe, 20 years ago)

Fixes GM and MT-32 master volume

  • gmmusic.cpp

    old new  
    5555
    5656        uint8 sysEx[6];
    5757        _musicVolume = volume;
    58         if (volume > 0) volume = (volume * 2) / 3 + 43; // GM synths behave kinda logarithmic
    5958        sysEx[0] = 0x7F; sysEx[1] = 0x7F; sysEx[2] = 0x04; sysEx[3] = 0x01;
    60         sysEx[4] = 0; sysEx[5] = volume & 0x7F;
     59        sysEx[4] = 0; sysEx[5] = volume;
    6160        _midiDrv->sysEx(sysEx, 6);
    6261}
    6362
  • mt32music.cpp

    old new  
    6161
    6262void SkyMT32Music::setVolume(uint8 volume) {
    6363
    64         uint8 sysEx[6];
     64        uint8 sysEx[9];
    6565        _musicVolume = volume;
    66         sysEx[0] = 0x7F; sysEx[1] = 0x7F; sysEx[2] = 0x04; sysEx[3] = 0x01;
    67         sysEx[4] = 0; sysEx[5] = volume & 0x7F;
    68         _midiDrv->sysEx(sysEx, 6);
     66        volume = (volume * 100) >> 7;
     67        memcpy(&sysEx[0], "\x41\x10\x16\x12\x10\x00\x16\x00\x00", 9);
     68        sysEx[0] = 0x41; sysEx[1] = 0x10; sysEx[2] = 0x16; sysEx[3] = 0x12;
     69        sysEx[4] = 0x10; sysEx[5] = 0x00; sysEx[6] = 0x16; sysEx[7] = volume;
     70        sysEx[8] = 0x00;
     71        for (uint8 cnt = 4; cnt < 8; cnt++)
     72                sysEx[8] -= sysEx[cnt];
     73        sysEx[8] &= 0x7F;
     74        _midiDrv->sysEx(sysEx, 9);
    6975}
    7076
    7177void SkyMT32Music::setupPointers(void) {