diff --git a/Timeline/Timeline.C b/Timeline/Timeline.C index 809f616..7cc7919 100644 --- a/Timeline/Timeline.C +++ b/Timeline/Timeline.C @@ -161,6 +161,17 @@ Timeline::menu_cb ( Fl_Widget *w, void *v ) ((Timeline*)v)->menu_cb( (Fl_Menu_*)w ); } +void +Timeline::fix_range ( void ) +{ + if ( p1 > p2 ) + { + nframes_t t = p2; + p2 = p1; + p1 = t; + } +} + void Timeline::menu_cb ( Fl_Menu_ *m ) { @@ -189,22 +200,30 @@ Timeline::menu_cb ( Fl_Menu_ *m ) Loggable::block_end(); } - else if ( ! strcmp( picked, "Tempo from range" ) ) + else if ( ! strcmp( picked, "Tempo from range (beat)" ) ) { if ( p1 != p2 ) { - if ( p1 > p2 ) - { - nframes_t t = p2; - p2 = p1; - p1 = t; - } + fix_range(); beats_per_minute( p1, sample_rate() * 60 / (float)( p2 - p1 ) ); p2 = p1; } } + else if ( ! strcmp( picked, "Tempo from range (bar)" ) ) + { + if ( p1 != p2 ) + { + fix_range(); + + position_info pi = solve_tempomap( p1 ); + + beats_per_minute( p1, sample_rate() * 60 / (float)( ( p2 - p1 ) / pi.beats_per_bar ) ); + + p2 = p1; + } + } else if ( ! strcmp( picked, "Playhead to mouse" ) ) { int X = Fl::event_x() - Track::width(); @@ -322,7 +341,8 @@ Timeline::Timeline ( int X, int Y, int W, int H, const char* L ) : Fl_Overlay_Wi /* menu->add( "Add Track", 0, 0, 0 ); */ menu->add( "Add Audio Track", 'a', 0, 0 ); - menu->add( "Tempo from range", 't', 0, 0 ); + menu->add( "Tempo from range (beat)", 't', 0, 0 ); + menu->add( "Tempo from range (bar)", FL_CTRL + 't', 0, 0 ); menu->add( "Playhead to mouse", 'p', 0, 0 ); menu->add( "P1 to mouse", '[', 0, 0 ); menu->add( "P2 to mouse", ']', 0, 0 ); diff --git a/Timeline/Timeline.H b/Timeline/Timeline.H index 38fa115..902c2b9 100644 --- a/Timeline/Timeline.H +++ b/Timeline/Timeline.H @@ -101,6 +101,7 @@ class Timeline : public Fl_Overlay_Window, public RWLock void cb_scroll ( Fl_Widget *w ); static void menu_cb ( Fl_Widget *w, void *v ); void menu_cb ( Fl_Menu_ *m ); + void fix_range ( void ); int _fpp; /* frames per pixel, power of two */