Actually use tempo track for tempo data.
This commit is contained in:
parent
44904bc640
commit
045bb504c3
2
Makefile
2
Makefile
|
@ -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 );
|
||||||
|
}
|
67
Timeline.H
67
Timeline.H
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
11
main.C
11
main.C
|
@ -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 );
|
||||||
|
|
Loading…
Reference in New Issue