mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-07 23:35:03 +01:00
beatcnt is a derived property from tempo and segment-length
This commit is contained in:
parent
b3ec5df8a8
commit
d8b3fbb94e
1 changed files with 34 additions and 18 deletions
|
|
@ -487,7 +487,6 @@ Trigger::get_state (void)
|
||||||
node->set_property (X_("index"), _index);
|
node->set_property (X_("index"), _index);
|
||||||
node->set_property (X_("estimated-tempo"), _estimated_tempo);
|
node->set_property (X_("estimated-tempo"), _estimated_tempo);
|
||||||
node->set_property (X_("segment-tempo"), _segment_tempo);
|
node->set_property (X_("segment-tempo"), _segment_tempo);
|
||||||
node->set_property (X_("beatcnt"), _beatcnt);
|
|
||||||
|
|
||||||
if (_region) {
|
if (_region) {
|
||||||
node->set_property (X_("region"), _region->id());
|
node->set_property (X_("region"), _region->id());
|
||||||
|
|
@ -514,8 +513,10 @@ 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_("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_("beatcnt"), _beatcnt);
|
double tempo;
|
||||||
|
node.get_property (X_("segment-tempo"), tempo);
|
||||||
|
set_segment_tempo(tempo);
|
||||||
|
|
||||||
node.get_property (X_("index"), _index);
|
node.get_property (X_("index"), _index);
|
||||||
set_values (node);
|
set_values (node);
|
||||||
|
|
@ -1033,25 +1034,35 @@ void
|
||||||
AudioTrigger::set_segment_tempo (double t)
|
AudioTrigger::set_segment_tempo (double t)
|
||||||
{
|
{
|
||||||
if (_segment_tempo != t) {
|
if (_segment_tempo != t) {
|
||||||
_segment_tempo = t; //TODO : this data will likely get stored in the SegmentDescriptor, not the trigger itself
|
|
||||||
|
_segment_tempo = t;
|
||||||
|
|
||||||
|
/*beatcnt is a derived property from segment tempo and the file's length*/
|
||||||
|
const double seconds = (double) data.length / _box.session().sample_rate();
|
||||||
|
_beatcnt = _segment_tempo * (seconds/60.0);
|
||||||
|
|
||||||
send_property_change (ARDOUR::Properties::tempo_meter);
|
send_property_change (ARDOUR::Properties::tempo_meter);
|
||||||
_box.session().set_dirty();
|
_box.session().set_dirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TODO: once we have a Region Trimmer, this could get more complicated:
|
||||||
|
* this segment might overlap another SD (Coverage==Internal|Start|End)
|
||||||
|
* in which case we might be setting both SDs, or not. TBD*/
|
||||||
|
SegmentDescriptor segment = get_segment_descriptor();
|
||||||
|
for (auto & src : _region->sources()) {
|
||||||
|
src->set_segment_descriptor (segment);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
AudioTrigger::set_segment_beatcnt (double count)
|
AudioTrigger::set_segment_beatcnt (double count)
|
||||||
{
|
{
|
||||||
if (_beatcnt != count) {
|
//given a beatcnt from the user, we use the data length to re-calc tempo internally
|
||||||
_beatcnt = count;
|
// ... TODO: provide a graphical trimmer to give the user control of data.length by dragging the start and end of the sample.
|
||||||
|
const double seconds = (double) data.length / _box.session().sample_rate();
|
||||||
|
double tempo = count / (seconds/60.0);
|
||||||
|
|
||||||
//given a beatcnt from the user, we use the data length to re-calc tempo internally
|
set_segment_tempo(tempo);
|
||||||
// ... TODO: provide a graphical trimmer to give the user control of data.length by dragging the start and end of the sample.
|
|
||||||
const double seconds = (double) data.length / _box.session().sample_rate();
|
|
||||||
double tempo = _beatcnt / (seconds/60.0);
|
|
||||||
|
|
||||||
set_segment_tempo(tempo);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
@ -1065,6 +1076,7 @@ AudioTrigger::get_segment_descriptor () const
|
||||||
{
|
{
|
||||||
SegmentDescriptor sd;
|
SegmentDescriptor sd;
|
||||||
|
|
||||||
|
sd.set_extent (_region->start_sample(), _region->length_samples());
|
||||||
sd.set_tempo (Temporal::Tempo (_segment_tempo, 4));
|
sd.set_tempo (Temporal::Tempo (_segment_tempo, 4));
|
||||||
|
|
||||||
return sd;
|
return sd;
|
||||||
|
|
@ -1326,8 +1338,11 @@ AudioTrigger::set_region_in_worker_thread (boost::shared_ptr<Region> r)
|
||||||
|
|
||||||
load_data (ar);
|
load_data (ar);
|
||||||
|
|
||||||
estimate_tempo (); //TODO: should first check if we already know this info from xml
|
estimate_tempo (); /* NOTE: if this is an existing clip (D+D copy) then it will likely have a SD tempo, and that short-circuits minibpm for us */
|
||||||
_segment_tempo = _estimated_tempo;
|
|
||||||
|
/* given an initial tempo guess, we need to set our operating tempo and beat_cnt value.
|
||||||
|
* this may be reset momentarily with user-settings (UIState) from a d+d operation */
|
||||||
|
set_segment_tempo(_estimated_tempo);
|
||||||
|
|
||||||
setup_stretcher ();
|
setup_stretcher ();
|
||||||
|
|
||||||
|
|
@ -1471,12 +1486,13 @@ AudioTrigger::estimate_tempo ()
|
||||||
resulting in small or larger gaps in output if they are repeating.
|
resulting in small or larger gaps in output if they are repeating.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
double beatcount;
|
||||||
if ((_estimated_tempo != 0.)) {
|
if ((_estimated_tempo != 0.)) {
|
||||||
/* fractional beatcnt */
|
/* fractional beatcnt */
|
||||||
double maybe_beats = (seconds / 60.) * _estimated_tempo;
|
double maybe_beats = (seconds / 60.) * _estimated_tempo;
|
||||||
_beatcnt = round (maybe_beats);
|
beatcount = round (maybe_beats);
|
||||||
double est = _estimated_tempo;
|
double est = _estimated_tempo;
|
||||||
_estimated_tempo = _beatcnt / (seconds/60.);
|
_estimated_tempo = beatcount / (seconds/60.);
|
||||||
DEBUG_TRACE (DEBUG::Triggers, string_compose ("given original estimated tempo %1, rounded beatcnt is %2 : resulting in working bpm = %3\n", est, _beatcnt, _estimated_tempo));
|
DEBUG_TRACE (DEBUG::Triggers, string_compose ("given original estimated tempo %1, rounded beatcnt is %2 : resulting in working bpm = %3\n", est, _beatcnt, _estimated_tempo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1489,7 +1505,7 @@ AudioTrigger::estimate_tempo ()
|
||||||
|
|
||||||
cerr << "estimated tempo: " << _estimated_tempo << endl;
|
cerr << "estimated tempo: " << _estimated_tempo << endl;
|
||||||
cerr << "one beat in samples: " << one_beat << endl;
|
cerr << "one beat in samples: " << one_beat << endl;
|
||||||
cerr << "beatcnt = " << round (_beatcnt) << endl;
|
cerr << "rounded beatcount = " << round (beatcount) << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue