diff --git a/Makefile b/Makefile index 0a0710d..6729f33 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ CXXFLAGS=-ggdb -Wall -O0 LIBS=-lsndfile `fltk-config --ldflags` # CXXFLAGS=`fltk-config -cxxflags` -SRCS= Clip.C Waveform.C Region.C Peaks.C main.C Track.C +SRCS= Clip.C Waveform.C Region.C Peaks.C main.C Track.C Timeline.C OBJS=$(SRCS:.C=.o) diff --git a/Tempo_Point.H b/Tempo_Point.H index 5e82d24..4e8360d 100644 --- a/Tempo_Point.H +++ b/Tempo_Point.H @@ -33,6 +33,7 @@ class Tempo_Point : public Track_Point snprintf( _label, 40, "%.1f", _tempo ); } + public: Tempo_Point ( nframes_t when, float bpm ) @@ -46,4 +47,21 @@ public: ~Tempo_Point ( ) { if ( _label ) delete[] _label; } + float tempo ( void ) const { return _tempo; } + void tempo ( float v ) { _tempo = v; } + + + int + handle ( int m ) + { + int r = Track_Widget::handle( m ); + + if ( m == FL_RELEASE ) + { + _track->sort(); + timeline.tracks->redraw(); + } + return r; + } + }; diff --git a/Tempo_Track.H b/Tempo_Track.H new file mode 100644 index 0000000..e4e24e9 --- /dev/null +++ b/Tempo_Track.H @@ -0,0 +1,60 @@ + +/*******************************************************************************/ +/* Copyright (C) 2008 Jonathan Moore Liles */ +/* */ +/* This program is free software; you can redistribute it and/or modify it */ +/* under the terms of the GNU General Public License as published by the */ +/* Free Software Foundation; either version 2 of the License, or (at your */ +/* option) any later version. */ +/* */ +/* This program is distributed in the hope that it will be useful, but WITHOUT */ +/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ +/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ +/* more details. */ +/* */ +/* You should have received a copy of the GNU General Public License along */ +/* with This program; see the file COPYING. If not,write to the Free Software */ +/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/*******************************************************************************/ + +#pragma once + +#include "Track.H" +#include "Tempo_Point.H" + +#include +using std::list; + +class Tempo_Track : public Track +{ + +public: + + Tempo_Track ( int X, int Y, int W, int H ) : Track ( X, Y, W, H ) + { + + + } + + float + beats_per_minute ( nframes_t when ) + { +// sort(); + + for ( list ::const_reverse_iterator i = _widgets.rbegin(); + i != _widgets.rend(); i++ ) + { + if ( (*i)->offset() < when ) + return ((Tempo_Point*)(*i))->tempo(); + } + + return 120.0; + } + + void + beats_per_minute ( nframes_t when, float bpm ) + { + add( new Tempo_Point( when, bpm ) ); + } + +}; diff --git a/Timeline.C b/Timeline.C new file mode 100644 index 0000000..8ab0672 --- /dev/null +++ b/Timeline.C @@ -0,0 +1,57 @@ + +/*******************************************************************************/ +/* Copyright (C) 2008 Jonathan Moore Liles */ +/* */ +/* This program is free software; you can redistribute it and/or modify it */ +/* under the terms of the GNU General Public License as published by the */ +/* Free Software Foundation; either version 2 of the License, or (at your */ +/* option) any later version. */ +/* */ +/* This program is distributed in the hope that it will be useful, but WITHOUT */ +/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ +/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ +/* more details. */ +/* */ +/* You should have received a copy of the GNU General Public License along */ +/* with This program; see the file COPYING. If not,write to the Free Software */ +/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +/*******************************************************************************/ + + +#include "Timeline.H" +#include "Tempo_Track.H" + + + +float +Timeline::beats_per_minute ( nframes_t when ) const +{ + return tempo_track->beats_per_minute( when ); +} + +void +Timeline::beats_per_minute ( nframes_t when, float bpm ) +{ + tempo_track->add( new Tempo_Point( when, bpm ) ); +} + +/* draw appropriate measure lines inside the given bounding box */ +void +Timeline::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() ); + + 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/Timeline.H b/Timeline.H index e892dae..c18e2a1 100644 --- a/Timeline.H +++ b/Timeline.H @@ -34,6 +34,10 @@ class Timeline; extern Timeline timeline; #include "Track.H" +// #include "Tempo_Track.H" + +class Tempo_Track; + // #include "Tempo_Point.H" // #include "Region.H" @@ -76,7 +80,7 @@ struct Timeline { Fl_Pack *tracks; Fl_Scrollbar *scrollbar; - Track *tempo_track; + Tempo_Track *tempo_track; float fpp; /* frames per pixel */ // nframes_t fpp; @@ -103,63 +107,8 @@ struct Timeline { return x * fpp; } + float beats_per_minute ( nframes_t when ) const; + void beats_per_minute ( nframes_t when, float bpm ); + void draw_measure_lines ( int X, int Y, int W, int H, Fl_Color color ); - float - beats_per_minute ( void ) const - { - // TODO: this should check a tempo map. - 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_track->add( new Tempo_Point( when, bpm ) ); - } - -/* /\* 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 ) - { - 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; - - 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/Track_Widget.H b/Track_Widget.H index 217b0a7..486fef8 100644 --- a/Track_Widget.H +++ b/Track_Widget.H @@ -21,6 +21,9 @@ #include "Track.H" +#include +using namespace std; + /* Base class for virtual widget on a track */ class Track_Widget { diff --git a/main.C b/main.C index 9b666f3..a194c38 100644 --- a/main.C +++ b/main.C @@ -42,7 +42,7 @@ #include "Track.H" #include "Audio_Track.H" #include "Timeline.H" -#include "Tempo_Point.H" +#include "Tempo_Track.H" #include "const.h" @@ -100,11 +100,6 @@ main ( int argc, char **argv ) timeline.length = 48000 * 60 * 2; - 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 ); @@ -117,7 +112,7 @@ main ( int argc, char **argv ) // Fl_Group *pack = new Fl_Group( 0, 0, 5000, 600 ); { - Track *tempo_track = new Track( 100, 0, 800, 24 ); + Tempo_Track *tempo_track = new Tempo_Track( 100, 0, 800, 24 ); tempo_track->label( "tempo map" ); tempo_track->add( new Tempo_Point( 0, 120 ) ); @@ -125,6 +120,8 @@ main ( int argc, char **argv ) tempo_track->add( new Tempo_Point( 56000, 250 ) ); tempo_track->end(); + + timeline.tempo_track = tempo_track; } Track *track1 = new Audio_Track( 40, 0, 800, 100 );