From a2ea182810dd795e9dc3655f9e2635374f02273c Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Wed, 20 Feb 2008 09:43:14 -0600 Subject: [PATCH] More work on tempo map --- Region.C | 2 +- Timeline.H | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- main.C | 6 +++++ 3 files changed, 83 insertions(+), 3 deletions(-) diff --git a/Region.C b/Region.C index 296416d..b1ca138 100644 --- a/Region.C +++ b/Region.C @@ -331,7 +331,7 @@ Region::draw ( int X, int Y, int W, int H ) int rx = x(); - printf( "rx %d, rw %d\n", rx, rw ); +// printf( "rx %d, rw %d\n", rx, rw ); fl_push_clip( rx, Y, rw, H ); diff --git a/Timeline.H b/Timeline.H index 1791716..f94552a 100644 --- a/Timeline.H +++ b/Timeline.H @@ -30,7 +30,41 @@ #include +#include +using std::list; + +class timestamped +{ +public: + + nframes_t timestamp; + + bool + operator< ( const timestamped &rhs ) const { return timestamp < rhs.timestamp; } +}; + struct Timeline { + + struct tempo_event : timestamped + { + float beats_per_minute; + }; + + struct signature_event : timestamped + { + int beats_per_bar; + int beat_type; + }; + + enum snap_flags_e { + SNAP_TO_REGION, + SNAP_TO_BAR, + SNAP_TO_BEAT + } snap_to; + + list tempo_points; + list signature_points; + Fl_Scroll *scroll; Fl_Pack *tracks; Fl_Scrollbar *scrollbar; @@ -66,6 +100,42 @@ struct Timeline { return _beats_per_minute; } + + float + beats_per_minute ( nframes_t when ) const + { + for ( list ::const_reverse_iterator i = tempo_points.rbegin(); + i != tempo_points.rend(); i++ ) + { + if ( i->timestamp < when ) + return i->beats_per_minute; + } + + return _beats_per_minute; + } + + void + beats_per_minute ( nframes_t when, float bpm ) + { + tempo_event t; + + t.timestamp = when; + t.beats_per_minute = bpm; + + tempo_points.push_back( t ); + } + +/* /\* return the offset of the closest measure line to /t/ *\/ */ +/* nframes_t */ +/* snap ( nframes t ) */ +/* { */ + + + + + +/* } */ + /* draw appropriate measure lines inside the given bounding box */ void draw_measure_lines ( int X, int Y, int W, int H, Fl_Color color ) @@ -73,13 +143,17 @@ struct Timeline { fl_line_style( FL_DASH, 2 ); fl_color( fl_color_average( FL_BLACK, color, 0.65f ) ); - int measure = ts_to_x( sample_rate * 60 / beats_per_minute() ); +// int measure = ts_to_x( sample_rate * 60 / beats_per_minute() ); + + int measure; for ( int x = X; x < X + W; ++x ) - + { + measure = ts_to_x( (double)(sample_rate * 60) / beats_per_minute( x_to_ts( x ) + xoffset )); if ( 0 == (ts_to_x( xoffset ) + x) % measure ) fl_line( x, Y, x, Y + H ); + } fl_line_style( FL_SOLID, 0 ); } }; diff --git a/main.C b/main.C index 03a1c7b..4f8e968 100644 --- a/main.C +++ b/main.C @@ -115,6 +115,12 @@ main ( int argc, char **argv ) timeline.fpp = 256; timeline._beats_per_minute = 120; + + timeline.beats_per_minute( 0, 120 ); + timeline.beats_per_minute( 48000, 250 ); + timeline.beats_per_minute( 48000 * 4, 60 ); + + timeline.sample_rate = 44100; timeline.tracks = new Fl_Pack( 0, 0, 800, 5000 );