@@ -5,7 +5,7 @@ CXXFLAGS=-ggdb -Wall -O0 | |||||
LIBS=-lsndfile `fltk-config --ldflags` | LIBS=-lsndfile `fltk-config --ldflags` | ||||
# CXXFLAGS=`fltk-config -cxxflags` | # 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) | OBJS=$(SRCS:.C=.o) | ||||
@@ -33,6 +33,7 @@ class Tempo_Point : public Track_Point | |||||
snprintf( _label, 40, "%.1f", _tempo ); | snprintf( _label, 40, "%.1f", _tempo ); | ||||
} | } | ||||
public: | public: | ||||
Tempo_Point ( nframes_t when, float bpm ) | Tempo_Point ( nframes_t when, float bpm ) | ||||
@@ -46,4 +47,21 @@ public: | |||||
~Tempo_Point ( ) | ~Tempo_Point ( ) | ||||
{ if ( _label ) delete[] _label; } | { 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; | |||||
} | |||||
}; | }; |
@@ -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 <list> | |||||
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 <Track_Widget *>::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 ) ); | |||||
} | |||||
}; |
@@ -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 ); | |||||
} |
@@ -34,6 +34,10 @@ class Timeline; | |||||
extern Timeline timeline; | extern Timeline timeline; | ||||
#include "Track.H" | #include "Track.H" | ||||
// #include "Tempo_Track.H" | |||||
class Tempo_Track; | |||||
// #include "Tempo_Point.H" | // #include "Tempo_Point.H" | ||||
// #include "Region.H" | // #include "Region.H" | ||||
@@ -76,7 +80,7 @@ struct Timeline { | |||||
Fl_Pack *tracks; | Fl_Pack *tracks; | ||||
Fl_Scrollbar *scrollbar; | Fl_Scrollbar *scrollbar; | ||||
Track *tempo_track; | |||||
Tempo_Track *tempo_track; | |||||
float fpp; /* frames per pixel */ | float fpp; /* frames per pixel */ | ||||
// nframes_t fpp; | // nframes_t fpp; | ||||
@@ -103,63 +107,8 @@ struct Timeline { | |||||
return x * fpp; | 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 <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_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 ); | |||||
} | |||||
}; | }; |
@@ -21,6 +21,9 @@ | |||||
#include "Track.H" | #include "Track.H" | ||||
#include <algorithm> | |||||
using namespace std; | |||||
/* Base class for virtual widget on a track */ | /* Base class for virtual widget on a track */ | ||||
class Track_Widget | class Track_Widget | ||||
{ | { | ||||
@@ -42,7 +42,7 @@ | |||||
#include "Track.H" | #include "Track.H" | ||||
#include "Audio_Track.H" | #include "Audio_Track.H" | ||||
#include "Timeline.H" | #include "Timeline.H" | ||||
#include "Tempo_Point.H" | |||||
#include "Tempo_Track.H" | |||||
#include "const.h" | #include "const.h" | ||||
@@ -100,11 +100,6 @@ main ( int argc, char **argv ) | |||||
timeline.length = 48000 * 60 * 2; | 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.sample_rate = 44100; | ||||
timeline.tracks = new Fl_Pack( 0, 0, 800, 5000 ); | 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 ); | // 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->label( "tempo map" ); | ||||
tempo_track->add( new Tempo_Point( 0, 120 ) ); | 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->add( new Tempo_Point( 56000, 250 ) ); | ||||
tempo_track->end(); | tempo_track->end(); | ||||
timeline.tempo_track = tempo_track; | |||||
} | } | ||||
Track *track1 = new Audio_Track( 40, 0, 800, 100 ); | Track *track1 = new Audio_Track( 40, 0, 800, 100 ); | ||||