Make 'Tap tempo' set the bpm to a running average
Keep a running average of the interval between clicks on the 'Tap tempo' button, and use that average to set the bpm value.
This commit is contained in:
parent
e0eaea6471
commit
61d413ada4
|
@ -263,17 +263,28 @@ TempoDialog::tap_tempo ()
|
|||
if (last_tap.tv_sec >= 0 || last_tap.tv_usec > 0) {
|
||||
struct timeval diff;
|
||||
double interval, bpm;
|
||||
static const double decay = 0.5;
|
||||
|
||||
timersub (&now, &last_tap, &diff);
|
||||
interval = diff.tv_sec + diff.tv_usec * 1.0e-6;
|
||||
|
||||
bpm = 60.0 / interval;
|
||||
if (bpm >= 20) {
|
||||
if (interval <= 0.25) {
|
||||
// >= 15 bpm, say
|
||||
if (average_interval > 0) {
|
||||
average_interval = interval * decay
|
||||
+ average_interval * (1.0-decay);
|
||||
} else {
|
||||
average_interval = interval;
|
||||
}
|
||||
|
||||
bpm = 60.0 / average_interval;
|
||||
bpm_spinner.set_value (bpm);
|
||||
} else {
|
||||
average_interval = 0;
|
||||
}
|
||||
} else {
|
||||
average_interval = 0;
|
||||
}
|
||||
last_tap = now;
|
||||
|
||||
|
||||
}
|
||||
|
||||
MeterDialog::MeterDialog (TempoMap& map, framepos_t frame, const string&)
|
||||
|
|
|
@ -58,6 +58,7 @@ private:
|
|||
NoteTypes note_types;
|
||||
|
||||
struct timeval last_tap;
|
||||
double average_interval;
|
||||
|
||||
Gtk::ComboBoxText pulse_selector;
|
||||
Gtk::Adjustment bpm_adjustment;
|
||||
|
|
Loading…
Reference in New Issue
Block a user