summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-11-27 17:25:42 +0100
committerRobin Gareus <robin@gareus.org>2016-11-27 17:25:42 +0100
commit2f30d763edafb1075c9f07f8bedf3af9d3adc13e (patch)
tree0ef6ba4695e4af2a66911a821b5dd8a0952a5cf4
parent9bf4f339b945b519e72de9370d8a542a51458d39 (diff)
Fix loading, recording & saving MIDI with PolyKeyPressure events.
GUI still does not handle this (neither automation lane, nor List Editor), but the file loads, plays and exports correctly.
-rw-r--r--libs/ardour/event_type_map.cc4
-rw-r--r--libs/evoral/src/Sequence.cpp14
2 files changed, 16 insertions, 2 deletions
diff --git a/libs/ardour/event_type_map.cc b/libs/ardour/event_type_map.cc
index 0b62d4a54b..87fe4bc6e1 100644
--- a/libs/ardour/event_type_map.cc
+++ b/libs/ardour/event_type_map.cc
@@ -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;
- case MidiNotePressureAutomation: return Evoral::ControlList::Linear; break;
+ case MidiNotePressureAutomation: return Evoral::ControlList::Linear; break;
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()));
- } 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;
diff --git a/libs/evoral/src/Sequence.cpp b/libs/evoral/src/Sequence.cpp
index 283ea009a3..1d518c3f07 100644
--- a/libs/evoral/src/Sequence.cpp
+++ b/libs/evoral/src/Sequence.cpp
@@ -337,6 +337,7 @@ Sequence<Time>::const_iterator::operator++()
|| 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;
@@ -573,6 +574,19 @@ Sequence<Time>::control_to_midi_event(
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);