triggerbox: resolve MIDI notes whenever a MIDI cue is stopped

This commit is contained in:
Paul Davis 2022-01-06 16:50:55 -07:00
parent 2755847294
commit 2f9b84fd48
2 changed files with 36 additions and 23 deletions

View File

@ -149,7 +149,7 @@ class LIBARDOUR_API Trigger : public PBD::Stateful {
virtual timepos_t current_length() const = 0; /* offset from start() */
virtual timepos_t natural_length() const = 0; /* offset from start() */
void process_state_requests ();
void process_state_requests (BufferSet& bufs, pframes_t dest_offset);
bool active() const { return _state >= Running; }
State state() const { return _state; }
@ -220,9 +220,9 @@ class LIBARDOUR_API Trigger : public PBD::Stateful {
bool legato () const { return _legato; }
virtual void startup ();
virtual void shutdown ();
virtual void shutdown (BufferSet& bufs, pframes_t dest_offset);
virtual void jump_start ();
virtual void jump_stop ();
virtual void jump_stop (BufferSet& bufs, pframes_t dest_offset);
void begin_stop (bool explicit_stop = false);
bool explicitly_stopped() const { return _explicitly_stopped; }
@ -300,7 +300,7 @@ class LIBARDOUR_API Trigger : public PBD::Stateful {
std::atomic<Trigger*> _pending;
void when_stopped_during_run ();
void when_stopped_during_run (BufferSet& bufs, pframes_t dest_offset);
void set_region_internal (boost::shared_ptr<Region>);
virtual void retrigger() = 0;
virtual void set_usable_length () = 0;
@ -332,7 +332,7 @@ class LIBARDOUR_API AudioTrigger : public Trigger {
int set_region_in_worker_thread (boost::shared_ptr<Region>);
void startup ();
void jump_start ();
void jump_stop ();
void jump_stop (BufferSet& bufs, pframes_t dest_offset);
XMLNode& get_state (void);
int set_state (const XMLNode&, int version);
@ -405,7 +405,8 @@ class LIBARDOUR_API MIDITrigger : public Trigger {
int set_region_in_worker_thread (boost::shared_ptr<Region>);
void startup ();
void jump_start ();
void jump_stop ();
void shutdown (BufferSet& bufs, pframes_t dest_offset);
void jump_stop (BufferSet& bufs, pframes_t dest_offset);
XMLNode& get_state (void);
int set_state (const XMLNode&, int version);

View File

@ -419,7 +419,7 @@ Trigger::startup()
}
void
Trigger::shutdown ()
Trigger::shutdown (BufferSet& bufs, pframes_t dest_offset)
{
_state = Stopped;
_gain = 1.0;
@ -441,12 +441,12 @@ Trigger::jump_start()
}
void
Trigger::jump_stop()
Trigger::jump_stop (BufferSet& bufs, pframes_t dest_offset)
{
/* this is used when we start a new trigger in legato mode. We do not
wait for quantization.
*/
shutdown ();
shutdown (bufs, dest_offset);
DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 requested state %2\n", index(), enum_2_string (_state)));
PropertyChanged (ARDOUR::Properties::running);
}
@ -464,7 +464,7 @@ Trigger::begin_stop (bool explicit_stop)
}
void
Trigger::process_state_requests ()
Trigger::process_state_requests (BufferSet& bufs, pframes_t dest_offset)
{
bool stop = _requests.stop.exchange (false);
@ -473,7 +473,7 @@ Trigger::process_state_requests ()
/* This is for an immediate stop, not a quantized one */
if (_state != Stopped) {
shutdown ();
shutdown (bufs, dest_offset);
DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 immediate stop implemented\n", name()));
}
@ -554,7 +554,7 @@ Trigger::process_state_requests ()
case WaitingToStart:
/* didn't even get started */
shutdown ();
shutdown (bufs, dest_offset);
DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 unbanged, never started, now stopped\n", index()));
}
}
@ -692,7 +692,7 @@ Trigger::maybe_compute_next_transition (samplepos_t start_sample, Temporal::Beat
}
void
Trigger::when_stopped_during_run ()
Trigger::when_stopped_during_run (BufferSet& bufs, pframes_t dest_offset)
{
if (_state == Stopped || _state == Stopping) {
@ -708,7 +708,7 @@ Trigger::when_stopped_during_run ()
/* have played the specified number of times, we're done */
DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 loop cnt %2 satisfied, now stopped\n", index(), _follow_count));
shutdown ();
shutdown (bufs, dest_offset);
} else if (_state == Stopping) {
@ -719,7 +719,7 @@ Trigger::when_stopped_during_run ()
*/
DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 not at end, but ow stopped\n", index()));
shutdown ();
shutdown (bufs, dest_offset);
} else {
@ -808,9 +808,9 @@ AudioTrigger::jump_start ()
}
void
AudioTrigger::jump_stop ()
AudioTrigger::jump_stop (BufferSet& bufs, pframes_t dest_offset)
{
Trigger::jump_stop ();
Trigger::jump_stop (bufs, dest_offset);
retrigger ();
}
@ -1414,7 +1414,7 @@ AudioTrigger::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_sa
}
if (_state == Stopped || _state == Stopping) {
when_stopped_during_run ();
when_stopped_during_run (bufs, dest_offset);
}
return orig_nframes - nframes;
@ -1484,9 +1484,21 @@ MIDITrigger::jump_start ()
}
void
MIDITrigger::jump_stop ()
MIDITrigger::shutdown (BufferSet& bufs, pframes_t dest_offset)
{
Trigger::jump_stop ();
Trigger::shutdown (bufs, dest_offset);
MidiBuffer& mb (bufs.get_midi (0));
tracker.resolve_notes (mb, dest_offset);
}
void
MIDITrigger::jump_stop (BufferSet& bufs, pframes_t dest_offset)
{
Trigger::jump_stop (bufs, dest_offset);
MidiBuffer& mb (bufs.get_midi (0));
tracker.resolve_notes (mb, dest_offset);
retrigger ();
}
@ -1771,7 +1783,7 @@ MIDITrigger::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_sam
}
if (_state == Stopped || _state == Stopping) {
when_stopped_during_run ();
when_stopped_during_run (bufs, dest_offset);
}
return orig_nframes - nframes;
@ -2383,7 +2395,7 @@ TriggerBox::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
std::vector<uint32_t> to_run;
for (uint32_t n = 0; n < all_triggers.size(); ++n) {
all_triggers[n]->process_state_requests ();
all_triggers[n]->process_state_requests (bufs, nframes - 1);
}
/* cue handling is over at this point, reset _active_scene to reflect this */
@ -2490,7 +2502,7 @@ TriggerBox::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_samp
nxt = trigger (n);
nxt->jump_start ();
_currently_playing->jump_stop ();
_currently_playing->jump_stop (bufs, dest_offset);
/* and switch */
DEBUG_TRACE (DEBUG::Triggers, string_compose ("%1 => %2 switched to in legato mode\n", _currently_playing->index(), nxt->index()));
_currently_playing = nxt;