Fix loading, recording & saving MIDI with PolyKeyPressure events.
authorRobin Gareus <robin@gareus.org>
Sun, 27 Nov 2016 16:25:42 +0000 (17:25 +0100)
committerRobin Gareus <robin@gareus.org>
Sun, 27 Nov 2016 16:25:42 +0000 (17:25 +0100)
GUI still does not handle this (neither automation lane, nor List Editor),
but the file loads, plays and exports correctly.

libs/ardour/event_type_map.cc
libs/evoral/src/Sequence.cpp

index 0b62d4a54bb9c27e768fe6ca4c0c0aca571ee97b..87fe4bc6e13219ec1d0a99a7f05116f74ba32271 100644 (file)
@@ -115,7 +115,7 @@ EventTypeMap::interpolation_of(const Evoral::Parameter& param)
                break;
        case MidiPgmChangeAutomation:       return Evoral::ControlList::Discrete; break;
        case MidiChannelPressureAutomation: return Evoral::ControlList::Linear; break;
                break;
        case MidiPgmChangeAutomation:       return Evoral::ControlList::Discrete; break;
        case MidiChannelPressureAutomation: return Evoral::ControlList::Linear; break;
-       case MidiNotePressureAutomation: return Evoral::ControlList::Linear; break;
+       case MidiNotePressureAutomation:    return Evoral::ControlList::Linear; break;
        case MidiPitchBenderAutomation:     return Evoral::ControlList::Linear; break;
        default: assert(false);
        }
        case MidiPitchBenderAutomation:     return Evoral::ControlList::Linear; break;
        default: assert(false);
        }
@@ -258,7 +258,7 @@ EventTypeMap::to_symbol(const Evoral::Parameter& param) const
                return string_compose("midi-pitch-bender-%1", int(param.channel()));
        } else if (t == MidiChannelPressureAutomation) {
                return string_compose("midi-channel-pressure-%1", int(param.channel()));
                return string_compose("midi-pitch-bender-%1", int(param.channel()));
        } else if (t == MidiChannelPressureAutomation) {
                return string_compose("midi-channel-pressure-%1", int(param.channel()));
-       } else if (t == MidiChannelPressureAutomation) {
+       } else if (t == MidiNotePressureAutomation) {
                return string_compose("midi-note-pressure-%1-%2", int(param.channel()), param.id());
        } else {
                PBD::warning << "Uninitialized Parameter symbol() called." << endmsg;
                return string_compose("midi-note-pressure-%1-%2", int(param.channel()), param.id());
        } else {
                PBD::warning << "Uninitialized Parameter symbol() called." << endmsg;
index 283ea009a3edaa8892c6665c2c4774aa61379807..1d518c3f07d765c5054e88018ed5bdca25004d41 100644 (file)
@@ -337,6 +337,7 @@ Sequence<Time>::const_iterator::operator++()
                   || ev.is_pgm_change()
                   || ev.is_pitch_bender()
                   || ev.is_channel_pressure()
                   || ev.is_pgm_change()
                   || ev.is_pitch_bender()
                   || ev.is_channel_pressure()
+                  || ev.is_poly_pressure()
                   || ev.is_sysex()) ) {
                cerr << "WARNING: Unknown event (type " << _type << "): " << hex
                     << int(ev.buffer()[0]) << int(ev.buffer()[1]) << int(ev.buffer()[2]) << endl;
                   || ev.is_sysex()) ) {
                cerr << "WARNING: Unknown event (type " << _type << "): " << hex
                     << int(ev.buffer()[0]) << int(ev.buffer()[1]) << int(ev.buffer()[2]) << endl;
@@ -573,6 +574,19 @@ Sequence<Time>::control_to_midi_event(
                ev->buffer()[2] = (uint16_t(iter.y) >> 7) & 0x7F; // MSB
                break;
 
                ev->buffer()[2] = (uint16_t(iter.y) >> 7) & 0x7F; // MSB
                break;
 
+       case MIDI_CMD_NOTE_PRESSURE:
+               assert(iter.list.get());
+               assert(iter.list->parameter().channel() < 16);
+               assert(iter.list->parameter().id() <= INT8_MAX);
+               assert(iter.y <= INT8_MAX);
+
+               ev->set_time(Time(iter.x));
+               ev->realloc(3);
+               ev->buffer()[0] = MIDI_CMD_NOTE_PRESSURE + iter.list->parameter().channel();
+               ev->buffer()[1] = (uint8_t)iter.list->parameter().id();
+               ev->buffer()[2] = (uint8_t)iter.y;
+               break;
+
        case MIDI_CMD_CHANNEL_PRESSURE:
                assert(iter.list.get());
                assert(iter.list->parameter().channel() < 16);
        case MIDI_CMD_CHANNEL_PRESSURE:
                assert(iter.list.get());
                assert(iter.list->parameter().channel() < 16);