attempt to handle poly-pressure (polyphonic aftertouch) similarly to other MIDI messages
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 18 Aug 2016 13:44:20 +0000 (09:44 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Fri, 19 Aug 2016 12:32:44 +0000 (08:32 -0400)
libs/evoral/evoral/MIDIEvent.hpp
libs/evoral/src/SMF.cpp
libs/evoral/src/Sequence.cpp

index 00e8577cda76e3406e28c1a26f5d26a8c6065b20..1ce70747883ccd186a6cf8ad9b433f106e71e4df 100644 (file)
@@ -71,7 +71,7 @@ public:
        inline bool     is_pitch_bender()       const { return (type() == MIDI_CMD_BENDER); }
        inline bool     is_pgm_change()         const { return (type() == MIDI_CMD_PGM_CHANGE); }
        inline bool     is_note()               const { return (is_note_on() || is_note_off()); }
-       inline bool     is_aftertouch()         const { return (type() == MIDI_CMD_NOTE_PRESSURE); }
+       inline bool     is_poly_pressure()      const { return (type() == MIDI_CMD_NOTE_PRESSURE); }
        inline bool     is_channel_pressure()   const { return (type() == MIDI_CMD_CHANNEL_PRESSURE); }
        inline uint8_t  note()                  const { return (this->_buf[1]); }
        inline void     set_note(uint8_t n)           { this->_buf[1] = n; }
@@ -92,7 +92,8 @@ public:
                                                                | (0x7F & this->_buf[1]) ); }
        inline uint8_t  pgm_number()              const { return (this->_buf[1]); }
        inline void     set_pgm_number(uint8_t number)  { this->_buf[1] = number; }
-       inline uint8_t  aftertouch()              const { return (this->_buf[1]); }
+       inline uint8_t  poly_note()               const { return (this->_buf[1]); }
+       inline uint8_t  poly_pressure()           const { return (this->_buf[2]); }
        inline uint8_t  channel_pressure()        const { return (this->_buf[1]); }
        inline bool     is_channel_event()        const { return (0x80 <= type()) && (type() <= 0xE0); }
        inline bool     is_smf_meta_event()       const { return this->_buf[0] == 0xFF; }
@@ -112,7 +113,7 @@ public:
                case MIDI_CMD_BENDER:
                        return pitch_bender_value();
                case MIDI_CMD_NOTE_PRESSURE:
-                       return aftertouch();
+                       return poly_pressure();
                case MIDI_CMD_CHANNEL_PRESSURE:
                        return channel_pressure();
                default:
index 45109b50e57e01a7016ca1e630dc8438afe14fe7..65304c4e4d994e0f8c124381709d7aad93d2afa1 100644 (file)
@@ -338,6 +338,7 @@ SMF::append_event_delta(uint32_t delta_t, uint32_t size, const uint8_t* buf, eve
        bool const store_id = (
                c == MIDI_CMD_NOTE_ON ||
                c == MIDI_CMD_NOTE_OFF ||
+               c == MIDI_CMD_NOTE_PRESSURE ||
                c == MIDI_CMD_PGM_CHANGE ||
                (c == MIDI_CMD_CONTROL && (buf[1] == MIDI_CTL_MSB_BANK || buf[1] == MIDI_CTL_LSB_BANK))
                               );
index 19a0fb140962990049444283f3d1e421666163a1..c578a9ebec537dceeb7b407911d0a71d34bd9e64 100644 (file)
@@ -933,6 +933,8 @@ Sequence<Time>::append(const Event<Time>& event, event_id_t evid)
                        ev.time(), double ((0x7F & ev.pitch_bender_msb()) << 7
                                           | (0x7F & ev.pitch_bender_lsb())),
                        evid);
+       } else if (ev.is_poly_pressure()) {
+               append_control_unlocked (Parameter (ev.event_type(), ev.channel(), ev.poly_note()), ev.time(), ev.poly_pressure(), evid);
        } else if (ev.is_channel_pressure()) {
                append_control_unlocked(
                        Parameter(ev.event_type(), ev.channel()),