diff --git a/libs/ardour/ardour/triggerbox.h b/libs/ardour/ardour/triggerbox.h index d752b0a619..6441649bdf 100644 --- a/libs/ardour/ardour/triggerbox.h +++ b/libs/ardour/ardour/triggerbox.h @@ -501,6 +501,11 @@ class LIBARDOUR_API MIDITrigger : public Trigger { void unset_all_patch_changes (); bool patch_change_set (uint8_t channel) const; + void set_channel_map (int channel, int target); + void unset_channel_map (int channel); + int channel_map (int channel); + std::vector const & channel_map() const { return _channel_map; } + protected: void retrigger (); @@ -520,6 +525,7 @@ class LIBARDOUR_API MIDITrigger : public Trigger { boost::shared_ptr model; Evoral::PatchChange _patch_change[16]; + std::vector _channel_map; int load_data (boost::shared_ptr); void compute_and_set_length (); diff --git a/libs/ardour/triggerbox.cc b/libs/ardour/triggerbox.cc index 79e2df3cdf..7ab1ba465f 100644 --- a/libs/ardour/triggerbox.cc +++ b/libs/ardour/triggerbox.cc @@ -1706,12 +1706,44 @@ MIDITrigger::MIDITrigger (uint32_t n, TriggerBox& b) { Evoral::PatchChange pc (0, 0, 12, 0); set_patch_change (pc); + + _channel_map.assign (16, -1); } MIDITrigger::~MIDITrigger () { } +void +MIDITrigger::set_channel_map (int channel, int target) +{ + if (channel < 0 || channel >= 16) { + return; + } + if (target < 0 || target >= 16) { + return; + } + _channel_map[channel] = target; +} + +void +MIDITrigger::unset_channel_map (int channel) +{ + if (channel < 0 || channel >= 16) { + return; + } + _channel_map[channel] = -1; +} + +int +MIDITrigger::channel_map (int channel) +{ + if (channel < 0 || channel >= 16) { + return -1; + } + return _channel_map[channel]; +} + void MIDITrigger::set_patch_change (Evoral::PatchChange const & pc) { @@ -2124,6 +2156,10 @@ MIDITrigger::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_sam ev.scale_velocity (_gain); } + if (_channel_map[ev.channel()] > 0) { + ev.set_channel (_channel_map[ev.channel()]); + } + if (ev.is_pgm_change() || (ev.is_cc() && ((ev.cc_number() == MIDI_CTL_LSB_BANK) || (ev.cc_number() == MIDI_CTL_MSB_BANK)))) { if (_patch_change[ev.channel()].is_set()) { /* skip pgm change info in data because trigger has its own */