Ticket #8064: imuse.pitchbend2.diff

File imuse.pitchbend2.diff, 4.0 KB (added by SF/jamieson630, 22 years ago)

Patch against iMuse.cpp 1.54 (October 12, 2002)

  • scummvm/scumm/imuse.cpp

    RCS file: /cvsroot/scummvm/scummvm/scumm/imuse.cpp,v
    retrieving revision 1.54
    diff -u -r1.54 imuse.cpp
     
    283283
    284284        void update_pris();
    285285
    286         void changed(byte what);
     286        void changed(uint16 what);
    287287};
    288288
    289289/* Abstract IMuseInternal driver class */
     
    298298                pcEffectLevel = 32,
    299299                pcProgram = 64,
    300300                pcChorus = 128,
    301                 pcAll = 255,
     301                pcPitchBendFactor = 256,
     302                pcAll = 511,
    302303        };
    303304
    304305        virtual void on_timer() = 0;
     
    312313        virtual void part_key_on(Part *part, byte note, byte velocity) = 0;
    313314        virtual void part_key_off(Part *part, byte note) = 0;
    314315        virtual void part_off(Part *part) = 0;
    315         virtual void part_changed(Part *part, byte what) = 0;
     316        virtual void part_changed(Part *part, uint16 what) = 0;
    316317        virtual void part_set_param(Part *part, byte param, int value) = 0;
    317318        virtual int part_update_active(Part *part, uint16 *active) = 0;
    318319};
     
    573574        void part_key_on(Part *part, byte note, byte velocity);
    574575        void part_key_off(Part *part, byte note);
    575576        void part_set_param(Part *part, byte param, int value);
    576         void part_changed(Part *part, byte what);
     577        void part_changed(Part *part, uint16 what);
    577578        void part_off(Part *part);
    578579        int part_update_active(Part *part, uint16 *active);
    579580        void adjust_priorities() {
     
    602603        MidiChannelGM _midi_channels[9];
    603604
    604605        int16 _midi_pitchbend_last[16];
     606        byte _midi_pitchbend_factor_last[16];
    605607        uint8 _midi_volume_last[16];
    606608        bool _midi_pedal_last[16];
    607609        byte _midi_modwheel_last[16];
     
    611613
    612614
    613615        void midiPitchBend(byte chan, int16 pitchbend);
     616        void midiPitchBendFactor (byte chan, byte factor);
    614617        void midiVolume(byte chan, byte volume);
    615618        void midiPedal(byte chan, bool pedal);
    616619        void midiModWheel(byte chan, byte modwheel);
     
    638641        void part_set_param(Part *part, byte param, int value) {}
    639642        void part_key_on(Part *part, byte note, byte velocity);
    640643        void part_key_off(Part *part, byte note);
    641         void part_changed(Part *part, byte what);
     644        void part_changed(Part *part, uint16 what);
    642645
    643646        static int midi_driver_thread(void *param);
    644647
     
    20662074        case 0xE:                                                                               /* pitch bend */
    20672075                part = get_part(chan);
    20682076                if (part)
    2069                         part->set_pitchbend(((s[1] - 0x40) << 7) | s[0]);
     2077                        // part->set_pitchbend(((s[1] - 0x40) << 7) | s[0]);
     2078                        part->set_pitchbend(((s[1] << 7) | s[0]) - 0x2000);
    20702079                s += 2;
    20712080                break;
    20722081
     
    32003217                return;
    32013218        set_pitchbend(0);
    32023219        _pitchbend_factor = value;
     3220        changed (IMuseDriver::pcPitchBendFactor);
    32033221}
    32043222
    32053223void Part::set_onoff(bool on)
     
    32933311        _drv->part_off(this);
    32943312}
    32953313
    3296 void Part::changed(byte what)
     3314void Part::changed(uint16 what)
    32973315{
    32983316        _drv->part_changed(this, what);
    32993317}
     
    41424160};
    41434161
    41444162
    4145 void IMuseAdlib::part_changed(Part *part, byte what)
     4163void IMuseAdlib::part_changed(Part *part, uint16 what)
    41464164{
    41474165        MidiChannelAdl *mc;
    41484166
     
    44494467        }
    44504468}
    44514469
     4470void IMuseGM::midiPitchBendFactor (byte chan, byte factor) {
     4471        if (_midi_pitchbend_factor_last[chan] != factor) {
     4472                _midi_pitchbend_factor_last[chan] = factor;
     4473                _md->send((   0   << 16) | (101 << 8) | (0xB0 | chan));
     4474                _md->send((   0   << 16) | (100 << 8) | (0xB0 | chan));
     4475                _md->send((factor << 16) | (  6 << 8) | (0xB0 | chan));
     4476                _md->send((   0   << 16) | ( 38 << 8) | (0xB0 | chan));
     4477        }
     4478}
     4479
    44524480void IMuseGM::midiVolume(byte chan, byte volume)
    44534481{
    44544482        if (_midi_volume_last[chan] != volume) {
     
    47144742        return count;
    47154743}
    47164744
    4717 void IMuseGM::part_changed(Part *part, byte what)
     4745void IMuseGM::part_changed(Part *part, uint16 what)
    47184746{
    47194747        MidiChannelGM *mc;
    47204748
     
    47334761                memset(mc->_actives, 0, sizeof(mc->_actives));
    47344762                return;
    47354763        }
     4764
     4765        if (what & pcPitchBendFactor)
     4766                midiPitchBendFactor (mc->_chan, part->_pitchbend_factor);
    47364767
    47374768        if (what & pcMod)
    47384769                midiPitchBend(mc->_chan,