Browse Source

Draw beat lines.

tags/non-daw-v1.1.0
Jonathan Moore Liles 17 years ago
parent
commit
609e00eecf
5 changed files with 50 additions and 8 deletions
  1. +15
    -7
      Region.C
  2. +2
    -0
      Region.H
  3. +30
    -0
      Timeline.H
  4. +2
    -0
      Track.C
  5. +1
    -1
      main.C

+ 15
- 7
Region.C View File

@@ -36,6 +36,8 @@ using namespace std;

extern Timeline timeline;

Fl_Boxtype Region::_box = FL_PLASTIC_UP_BOX;

void
Region::init ( void )
{
@@ -296,6 +298,7 @@ Region::resize ( void )
// Fl_Widget::resize( X, y(), W, h() );
}

int measure = 40;

/* X is the timeline offset, W is the width of the track */
void
@@ -304,6 +307,8 @@ Region::draw ( int X, int Y, int W, int H )
if ( ! ( W > 0 && H > 0 ) )
return;



if ( _offset > timeline.xoffset + timeline.x_to_ts( _track->w() ) ||
( _offset < timeline.xoffset &&
_offset + (_end - _start) < timeline.xoffset ) )
@@ -331,12 +336,15 @@ Region::draw ( int X, int Y, int W, int H )
fl_push_clip( rx, Y, rw, H );

/* dirty hack to keep the box from flipping to vertical at small sizes */
fl_draw_box( FL_PLASTIC_UP_BOX, rx - 10, Y, rw + 50, H, _box_color );
fl_draw_box( box(), rx - 10, Y, rw + 50, H, _box_color );


// fl_push_clip( x() + Fl::box_dx( box() ), y(), w() - Fl::box_dw( box() ), h() );

draw_waveform( rx, Y, rw, H, _clip, _start + offset, min( (_end - _start) - offset, _end), _scale, _color );

timeline.draw_measure_lines( rx, Y, rw, H, _box_color );

fl_color( FL_BLACK );
fl_line( rx, Y, rx, Y + H );
fl_line( rx + rw - 1, Y, rx + rw - 1, Y + H );
@@ -346,10 +354,10 @@ Region::draw ( int X, int Y, int W, int H )
fl_font( FL_HELVETICA, 14 );
fl_color( FL_BLACK );

int bx = Fl::box_dx( FL_PLASTIC_UP_BOX );
int by = Fl::box_dy( FL_PLASTIC_UP_BOX );
int bw = Fl::box_dw( FL_PLASTIC_UP_BOX );
int bh = Fl::box_dh( FL_PLASTIC_UP_BOX );
int bx = Fl::box_dx( box() );
int by = Fl::box_dy( box() );
int bw = Fl::box_dw( box() );
int bh = Fl::box_dh( box() );

int dx = min( 32767, timeline.ts_to_x( offset ) );

@@ -363,8 +371,8 @@ Region::draw ( int X, int Y, int W, int H )
//(Fl_Align)FL_ALIGN_LEFT | FL_ALIGN_BOTTOM );


fl_color( FL_RED );
fl_line( x(), y(), x(), y() + h() );
/* fl_color( FL_RED ); */
/* fl_line( x(), y(), x(), y() + h() ); */


}

+ 2
- 0
Region.H View File

@@ -87,9 +87,11 @@ class Region : public TrackWidget

float _scale; /* amplitude adjustment */

static Fl_Boxtype _box;
static Fl_Color _selection_color;
static Fl_Color selection_color ( void ) { return _selection_color; }
static void selection_color ( Fl_Color v ) { _selection_color = v; }
static Fl_Boxtype box ( void ) { return _box; }

enum trim_e { NO, LEFT, RIGHT };
void trim ( enum trim_e t, int X );


+ 30
- 0
Timeline.H View File

@@ -28,6 +28,8 @@

#include <assert.h>

#include <FL/fl_draw.H>

struct Timeline {
Fl_Scroll *scroll;
Fl_Pack *tracks;
@@ -40,6 +42,9 @@ struct Timeline {

nframes_t xoffset;

int _beats_per_bar;
float _beats_per_minute;

int
ts_to_x( nframes_t ts )
{
@@ -52,6 +57,31 @@ struct Timeline {
{
return x * fpp;
}


float
beats_per_minute ( void ) const
{
// TODO: this should check a tempo map.
return _beats_per_minute;
}

/* draw appropriate measure lines inside the given bounding box */
void
draw_measure_lines ( int X, int Y, int W, int H, Fl_Color color )
{
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() );

for ( int x = X; x < X + W; ++x )

if ( 0 == (ts_to_x( xoffset ) + x) % measure )
fl_line( x, Y, x, Y + H );

fl_line_style( FL_SOLID, 0 );
}
};

extern Timeline timeline;

+ 2
- 0
Track.C View File

@@ -29,6 +29,8 @@ Track::draw ( void )
{
Fl_Group::draw();

timeline.draw_measure_lines( x(), y(), w(), h(), color() );

fl_push_clip( x(), y(), w(), h() );

for ( list <Region *>::iterator r = _regions.begin(); r != _regions.end(); r++ )


+ 1
- 1
main.C View File

@@ -113,7 +113,7 @@ main ( int argc, char **argv )
timeline.scroll = new Fl_Scroll( 0, 24, 800, 600 - (24 * 2) );
timeline.scroll->type( Fl_Scroll::VERTICAL );
timeline.fpp = 256;
timeline._beats_per_minute = 120;

timeline.sample_rate = 44100;



Loading…
Cancel
Save