13
0

triggerbox: first draft: allow gui access to audio-segment meter and barcnt

This commit is contained in:
Ben Loftis 2022-01-17 18:03:04 -06:00
parent 8e96dd40ed
commit 6cdeed8945
2 changed files with 70 additions and 32 deletions

View File

@ -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 &);

View File

@ -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
{