Ticket #8626: kyra_fmt_music_NOTELENGTH.patch

File kyra_fmt_music_NOTELENGTH.patch, 2.4 KB (added by athrxx, 17 years ago)

kyra fm-towns music patch (note length, tempo)

  • sound_towns.cpp

     
    144144        MidiParser_EuD();
    145145
    146146        bool loadMusic (byte *data, uint32 unused = 0);
    147         void setTempo(int32 tempo);
     147        int32 calculateTempo(int16 val);
     148
    148149protected:
    149150        void parseNextEvent (EventInfo &info);
    150151        void resetTracking();
     
    155156        byte * _adjVelo;
    156157        int8 * _adjNote;
    157158
     159        byte _tempo[3];
     160
    158161        uint8 _firstBaseTickStep;
    159162        uint8 _nextBaseTickStep;
    160         uint8 _initialTempo;
     163        uint32 _initialTempo;
    161164        uint32 _baseTick;
    162165};
    163166
     
    744747}
    745748
    746749MidiParser_EuD::MidiParser_EuD() : MidiParser(),
    747         _firstBaseTickStep(0x33), _nextBaseTickStep(0x33), _initialTempo(0x5a) {
     750        _firstBaseTickStep(0x33), _nextBaseTickStep(0x33) {
     751                _initialTempo = calculateTempo(0x5a);
    748752}
    749753
    750754void MidiParser_EuD::parseNextEvent(EventInfo &info) {
     
    764768                                info.delta = (tick < last) ? 0 : (tick - last);
    765769
    766770                                info.event = 0x90 | _channel[chan];
    767                                 info.length = pos[7] | (pos[8] << 4);
     771                                info.length = pos[7] | (pos[8] << 4) | (pos[9] << 8) | (pos[10] << 12);
    768772
    769773                                int8 note = (int8) pos[4];
    770774                                if (_adjNote[chan]) {
     
    811815                        _nextBaseTickStep = pos[1];
    812816                        pos += 6;
    813817                } else if (cmd == 0xF8) {
    814                         int16 tempo = pos[4] | (pos[5] << 7);
    815                         setTempo(tempo);
     818                        int32 tempo = calculateTempo(pos[4] | (pos[5] << 7));
     819                        info.event = 0xff;
     820                        info.length = 3;
     821                        info.ext.type = 0x51;
     822                        _tempo[0] = (tempo >> 16) & 0xff;
     823                        _tempo[1] = (tempo >> 8) & 0xff;
     824                        _tempo[2] = tempo & 0xff;
     825                        info.ext.data = (byte*) _tempo;
    816826                        pos += 6;
     827                        break;
    817828                } else if (cmd == 0xFD || cmd == 0xFE) {
    818829                        // End of track.
    819830                        if (_autoLoop)
     
    848859        _adjNote = (int8*) data + 0x3D4;
    849860
    850861        _firstBaseTickStep = data[0x804];
    851         _initialTempo = (data[0x805] > 0xfc) ? 0x5a : data[0x805];
     862        _initialTempo = calculateTempo((data[0x805] > 0xfc) ? 0x5a : data[0x805]);
    852863
    853864        _num_tracks = 1;
    854865        _ppqn = 120;
     
    860871        return true;
    861872}
    862873
    863 void MidiParser_EuD::setTempo(int32 tempo) {
    864         if (!tempo) {
    865                 MidiParser::setTempo(0);
    866                 return;
    867         }
     874int32 MidiParser_EuD::calculateTempo(int16 val) {
     875        int32 tempo = val;
    868876
    869877        if (tempo < 0)
    870878                tempo = 0;
     
    876884                tempo <<= 1;
    877885        tempo <<= 8;
    878886
    879         MidiParser::setTempo(tempo);
     887        return tempo;
    880888}
    881889
    882890void MidiParser_EuD::resetTracking() {