From 6cdeed8945e72e03f47b7d098e5d6b4f3c53a5bd Mon Sep 17 00:00:00 2001 From: Ben Loftis Date: Mon, 17 Jan 2022 18:03:04 -0600 Subject: [PATCH] triggerbox: first draft: allow gui access to audio-segment meter and barcnt --- libs/ardour/ardour/triggerbox.h | 26 ++++++----- libs/ardour/triggerbox.cc | 76 +++++++++++++++++++++++---------- 2 files changed, 70 insertions(+), 32 deletions(-) diff --git a/libs/ardour/ardour/triggerbox.h b/libs/ardour/ardour/triggerbox.h index cc979780e7..b6cedf6ac8 100644 --- a/libs/ardour/ardour/triggerbox.h +++ b/libs/ardour/ardour/triggerbox.h @@ -252,6 +252,10 @@ class LIBARDOUR_API Trigger : public PBD::Stateful { TriggerBox& box() const { return _box; } + double estimated_tempo() const { return _estimated_tempo; } + + Temporal::Meter meter() const { return _meter; } + gain_t gain() const { return _gain; } void set_gain (gain_t); @@ -266,16 +270,6 @@ class LIBARDOUR_API Trigger : public PBD::Stateful { Smooth, }; - StretchMode stretch_mode() const { return _stretch_mode; } - void set_stretch_mode (StretchMode); - - double estimated_tempo() const { return _estimated_tempo; } - double segment_tempo() const { return _segment_tempo; } - void set_segment_tempo (double t); - - Temporal::Meter meter() const { return _meter; } - void set_tempo (Temporal::Meter const &); - void set_pending (Trigger*); Trigger* swap_pending (Trigger*); @@ -354,6 +348,18 @@ class LIBARDOUR_API AudioTrigger : public Trigger { pframes_t run (BufferSet&, samplepos_t start_sample, samplepos_t end_sample, Temporal::Beats const & start, Temporal::Beats const & end, pframes_t nframes, pframes_t offset, bool first, double bpm, bool); + StretchMode stretch_mode() const { return _stretch_mode; } + void set_stretch_mode (StretchMode); + + double segment_tempo() const { return _segment_tempo; } + void set_segment_tempo (double t); + + Temporal::Meter segment_meter() const { return _meter; } //TODO: might be different? + void set_segment_meter(Temporal::Meter const &); //TODO: disambiguated from a future midi::metrum + + double segment_barcnt () { return _barcnt; } + void set_segment_barcnt (double count); + void set_start (timepos_t const &); void set_end (timepos_t const &); void set_legato_offset (timepos_t const &); diff --git a/libs/ardour/triggerbox.cc b/libs/ardour/triggerbox.cc index b03cc1ce1d..ca6076d4d4 100644 --- a/libs/ardour/triggerbox.cc +++ b/libs/ardour/triggerbox.cc @@ -200,16 +200,6 @@ Trigger::set_stretchable (bool s) _box.session().set_dirty(); } -void -Trigger::set_segment_tempo (double t) -{ - if (_segment_tempo != t) { - _segment_tempo = t; //TODO : this data will likely get stored in the SegmentDescriptor, not the trigger itself - PropertyChanged (ARDOUR::Properties::tempo_meter); - _box.session().set_dirty(); - } -} - void Trigger::set_ui (void* p) { @@ -248,18 +238,6 @@ Trigger::set_gain (gain_t g) _box.session().set_dirty(); } -void -Trigger::set_stretch_mode (Trigger::StretchMode sm) -{ - if (_stretch_mode == sm) { - return; - } - - _stretch_mode = sm; - PropertyChanged (Properties::stretch_mode); - _box.session().set_dirty(); -} - void Trigger::set_midi_velocity_effect (float mve) { @@ -367,6 +345,7 @@ Trigger::set_state (const XMLNode& node, int version) node.get_property (X_("estimated-tempo"), _estimated_tempo); //TODO: for now: if we know the bpm, overwrite the value that estimate_tempo() found node.get_property (X_("segment-tempo"), _segment_tempo); + node.get_property (X_("barcnt"), _barcnt); node.get_property (X_("index"), _index); set_values (node); @@ -861,6 +840,59 @@ AudioTrigger::~AudioTrigger () delete _stretcher; } +void +AudioTrigger::set_stretch_mode (Trigger::StretchMode sm) +{ + if (_stretch_mode == sm) { + return; + } + + _stretch_mode = sm; + PropertyChanged (Properties::stretch_mode); + _box.session().set_dirty(); +} + +void +AudioTrigger::set_segment_tempo (double t) +{ + if (_segment_tempo != t) { + _segment_tempo = t; //TODO : this data will likely get stored in the SegmentDescriptor, not the trigger itself + PropertyChanged (ARDOUR::Properties::tempo_meter); + _box.session().set_dirty(); + } +} + +void +AudioTrigger::set_segment_meter (Temporal::Meter const &m) +{ + if (_meter != m) { + _meter = m; + + //given a meter from the user, tempo is assumed constant and we re-calc barcnt internally + const double seconds = (double) data.length / _box.session().sample_rate(); + const double quarters = (seconds / 60.) * _segment_tempo; + _barcnt = quarters / _meter.divisions_per_bar(); + + PropertyChanged (ARDOUR::Properties::tempo_meter); + _box.session().set_dirty(); + } +} + +void +AudioTrigger::set_segment_barcnt (double count) +{ + if (_barcnt != count) { + _barcnt = count; + + //given a barcnt from the user, meter is assumed constant and we re-calc tempo internally + const double seconds = (double) data.length / _box.session().sample_rate(); + const double quarters = _barcnt * _meter.divisions_per_bar(); //TODO: this assumes note_value=quarter + _estimated_tempo = quarters / (seconds/60.0); + + set_segment_tempo(_estimated_tempo); + } +} + bool AudioTrigger::stretching() const {