From 26f1578568f8b81c9c6e9abf5d0a1f4c478f6118 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 18 Aug 2016 12:35:15 -0400 Subject: [PATCH] MIDI polyphonic pressure, part 2 --- libs/ardour/ardour/parameter_types.h | 4 ++++ libs/ardour/ardour/types.h | 1 + libs/ardour/automatable.cc | 2 ++ libs/ardour/enums.cc | 1 + libs/ardour/event_type_map.cc | 10 ++++++++++ libs/ardour/midi_track.cc | 7 +++++++ libs/ardour/parameter_descriptor.cc | 1 + 7 files changed, 26 insertions(+) diff --git a/libs/ardour/ardour/parameter_types.h b/libs/ardour/ardour/parameter_types.h index 240ad2d956..151aacab6f 100644 --- a/libs/ardour/ardour/parameter_types.h +++ b/libs/ardour/ardour/parameter_types.h @@ -36,6 +36,7 @@ parameter_midi_type(AutomationType type) case MidiCCAutomation: return MIDI_CMD_CONTROL; break; case MidiPgmChangeAutomation: return MIDI_CMD_PGM_CHANGE; break; case MidiChannelPressureAutomation: return MIDI_CMD_CHANNEL_PRESSURE; break; + case MidiNotePressureAutomation: return MIDI_CMD_NOTE_PRESSURE; break; case MidiPitchBenderAutomation: return MIDI_CMD_BENDER; break; case MidiSystemExclusiveAutomation: return MIDI_CMD_COMMON_SYSEX; break; default: return 0; @@ -49,6 +50,7 @@ midi_parameter_type(uint8_t status) case MIDI_CMD_CONTROL: return MidiCCAutomation; break; case MIDI_CMD_PGM_CHANGE: return MidiPgmChangeAutomation; break; case MIDI_CMD_CHANNEL_PRESSURE: return MidiChannelPressureAutomation; break; + case MIDI_CMD_NOTE_PRESSURE: return MidiNotePressureAutomation; break; case MIDI_CMD_BENDER: return MidiPitchBenderAutomation; break; case MIDI_CMD_COMMON_SYSEX: return MidiSystemExclusiveAutomation; break; default: return NullAutomation; @@ -66,6 +68,8 @@ midi_parameter(const uint8_t* buf, const uint32_t len) return Evoral::Parameter(MidiPgmChangeAutomation, channel); case MidiChannelPressureAutomation: return Evoral::Parameter(MidiChannelPressureAutomation, channel); + case MidiNotePressureAutomation: + return Evoral::Parameter(MidiChannelPressureAutomation, channel); case MidiPitchBenderAutomation: return Evoral::Parameter(MidiPitchBenderAutomation, channel); case MidiSystemExclusiveAutomation: diff --git a/libs/ardour/ardour/types.h b/libs/ardour/ardour/types.h index e818ea707e..976c4924a7 100644 --- a/libs/ardour/ardour/types.h +++ b/libs/ardour/ardour/types.h @@ -146,6 +146,7 @@ namespace ARDOUR { MidiPgmChangeAutomation, MidiPitchBenderAutomation, MidiChannelPressureAutomation, + MidiNotePressureAutomation, MidiSystemExclusiveAutomation, FadeInAutomation, FadeOutAutomation, diff --git a/libs/ardour/automatable.cc b/libs/ardour/automatable.cc index 10d2565c90..040dbefedc 100644 --- a/libs/ardour/automatable.cc +++ b/libs/ardour/automatable.cc @@ -186,6 +186,8 @@ Automatable::describe_parameter (Evoral::Parameter param) return string_compose("Bender [%1]", int(param.channel()) + 1); } else if (param.type() == MidiChannelPressureAutomation) { return string_compose("Pressure [%1]", int(param.channel()) + 1); + } else if (param.type() == MidiNotePressureAutomation) { + return string_compose("PolyPressure [%1]", int(param.channel()) + 1); #ifdef LV2_SUPPORT } else if (param.type() == PluginPropertyAutomation) { return string_compose("Property %1", URIMap::instance().id_to_uri(param.id())); diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 6e90bd01f0..be468c2534 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -157,6 +157,7 @@ setup_enum_writer () REGISTER_ENUM (MidiPgmChangeAutomation); REGISTER_ENUM (MidiPitchBenderAutomation); REGISTER_ENUM (MidiChannelPressureAutomation); + REGISTER_ENUM (MidiNotePressureAutomation); REGISTER_ENUM (MidiSystemExclusiveAutomation); REGISTER_ENUM (FadeInAutomation); REGISTER_ENUM (FadeOutAutomation); diff --git a/libs/ardour/event_type_map.cc b/libs/ardour/event_type_map.cc index 28f688df81..0b62d4a54b 100644 --- a/libs/ardour/event_type_map.cc +++ b/libs/ardour/event_type_map.cc @@ -115,6 +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 MidiPitchBenderAutomation: return Evoral::ControlList::Linear; break; default: assert(false); } @@ -192,6 +193,13 @@ EventTypeMap::from_symbol(const string& str) const assert(channel < 16); p_id = 0; p_channel = channel; + } else if (str.length() > 19 && str.substr(0, 19) == "midi-note-pressure-") { + p_type = MidiNotePressureAutomation; + uint32_t channel = 0; + sscanf(str.c_str(), "midi-note-pressure-%d-%d", &channel, &p_id); + assert(channel < 16); + assert(p_id < 127); + p_channel = channel; } else { PBD::warning << "Unknown Parameter '" << str << "'" << endmsg; } @@ -250,6 +258,8 @@ 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) { + return string_compose("midi-note-pressure-%1-%2", int(param.channel()), param.id()); } else { PBD::warning << "Uninitialized Parameter symbol() called." << endmsg; return ""; diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index b79a1cf52c..f1344e7697 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -701,6 +701,7 @@ MidiTrack::set_parameter_automation_state (Evoral::Parameter param, AutoState st case MidiPgmChangeAutomation: case MidiPitchBenderAutomation: case MidiChannelPressureAutomation: + case MidiNotePressureAutomation: case MidiSystemExclusiveAutomation: /* The track control for MIDI parameters is for immediate events to act as a control surface, write/touch for them is not currently @@ -757,6 +758,12 @@ MidiTrack::MidiControl::actually_set_value (double val, PBD::Controllable::Group ev[1] = int(val); break; + case MidiNotePressureAutomation: + ev[0] += MIDI_CMD_NOTE_PRESSURE; + ev[1] = parameter.id(); + ev[2] = int(val); + break; + case MidiPitchBenderAutomation: ev[0] += MIDI_CMD_BENDER; ev[1] = 0x7F & int(val); diff --git a/libs/ardour/parameter_descriptor.cc b/libs/ardour/parameter_descriptor.cc index bf0c9b7af1..db567d4653 100644 --- a/libs/ardour/parameter_descriptor.cc +++ b/libs/ardour/parameter_descriptor.cc @@ -96,6 +96,7 @@ ParameterDescriptor::ParameterDescriptor(const Evoral::Parameter& parameter) case MidiCCAutomation: case MidiPgmChangeAutomation: case MidiChannelPressureAutomation: + case MidiNotePressureAutomation: lower = 0.0; normal = 0.0; upper = 127.0; -- 2.30.2