Make 'Tap tempo' set the bpm to a running average
authorColin Fletcher <colin.m.fletcher@googlemail.com>
Wed, 12 Feb 2014 21:49:00 +0000 (21:49 +0000)
committerColin Fletcher <colin.m.fletcher@googlemail.com>
Sat, 5 Jul 2014 20:47:49 +0000 (21:47 +0100)
Keep a running average of the interval between clicks on the 'Tap tempo'
button, and use that average to set the bpm value.

gtk2_ardour/tempo_dialog.cc
gtk2_ardour/tempo_dialog.h

index 9173393ff5d3bcc04d6a01974bb560cb54029e55..56e375dc9121890cb058d2c6f4c78d3ba8ed4a5b 100644 (file)
@@ -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&)
index 848b55cb59968fec52d9197dfbd3eb85ff2b2402..9e97afa98db767454850c8fb5a3ac3b37472a21f 100644 (file)
@@ -58,6 +58,7 @@ private:
        NoteTypes note_types;
 
        struct timeval last_tap;
+       double average_interval;
 
        Gtk::ComboBoxText pulse_selector;
        Gtk::Adjustment   bpm_adjustment;