Browse Source

More work on tempo map

tags/non-daw-v1.1.0
Jonathan Moore Liles 17 years ago
parent
commit
a2ea182810
3 changed files with 83 additions and 3 deletions
  1. +1
    -1
      Region.C
  2. +76
    -2
      Timeline.H
  3. +6
    -0
      main.C

+ 1
- 1
Region.C View File

@@ -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 );



+ 76
- 2
Timeline.H View File

@@ -30,7 +30,41 @@

#include <FL/fl_draw.H>

#include <list>
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_event> tempo_points;
list <signature_event> 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 <tempo_event>::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() );

for ( int x = X; x < X + W; ++x )
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 );
}
};


+ 6
- 0
main.C View File

@@ -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 );


Loading…
Cancel
Save