Add phrase and sequence progress bar widgets.

This commit is contained in:
Jonathan Moore Liles 2008-02-11 00:16:31 -06:00
parent 0af405908d
commit 42f7242ba5
4 changed files with 91 additions and 13 deletions

View File

@ -55,6 +55,8 @@ handle_midi_input();
lash.process(); lash.process();
ui->progress_group->do_callback();
ui->vmetro_widget->update(); ui->vmetro_widget->update();
if ( transport.rolling ) if ( transport.rolling )
@ -134,7 +136,7 @@ if ( Fl::event() == FL_SHORTCUT && Fl::event_key() == FL_Escape )
if ( maybe_save_song() ) if ( maybe_save_song() )
quit();} open quit();} open
xywh {635 48 869 801} type Single box PLASTIC_UP_BOX color 37 resizable xclass non size_range {869 801 0 0} visible xywh {790 38 869 801} type Single box PLASTIC_UP_BOX color 37 resizable xclass non size_range {869 801 0 0} visible
} { } {
Fl_Menu_Bar {} {open Fl_Menu_Bar {} {open
xywh {0 0 869 30} color 37 xywh {0 0 869 30} color 37
@ -381,11 +383,11 @@ if ( o->value() == pattern_tab )
} { } {
Fl_Group sequence_tab { Fl_Group sequence_tab {
label Sequence open label Sequence open
xywh {0 98 868 674} color 37 hide resizable xywh {0 98 868 674} color 37 resizable
code0 {update_sequence_widgets();} code0 {update_sequence_widgets();}
} { } {
Fl_Group {} {open Fl_Group {} {open
xywh {10 125 233 502} xywh {10 125 233 502} labelsize 12
} { } {
Fl_Browser playlist_browser { Fl_Browser playlist_browser {
label Playlist label Playlist
@ -449,7 +451,7 @@ else
Fl_Input sequence_name_field { Fl_Input sequence_name_field {
label {name:} label {name:}
callback {playlist->name( o->value() );} callback {playlist->name( o->value() );}
xywh {9 635 151 26} color 36 align 20 when 1 textcolor 32 xywh {91 740 158 26} color 36 align 20 when 1 textcolor 32
} }
Fl_Light_Button detach_button { Fl_Light_Button detach_button {
label Detach label Detach
@ -466,12 +468,12 @@ else
tabs->insert( (Fl_Widget&)*sequence_tab, 0 ); tabs->insert( (Fl_Widget&)*sequence_tab, 0 );
sequence_tab->resize( pattern_tab->x(), pattern_tab->y(), pattern_tab->w(), pattern_tab->h() ); sequence_tab->resize( pattern_tab->x(), pattern_tab->y(), pattern_tab->w(), pattern_tab->h() );
}} }}
xywh {165 639 78 26} xywh {7 740 78 26}
} }
Fl_Text_Editor sequence_notes_edit { Fl_Text_Editor sequence_notes_edit {
label {Notes:} label {Notes:}
callback {playlist->notes( o->buffer()->text() );} callback {playlist->notes( o->buffer()->text() );}
xywh {16 686 844 78} selection_color 48 labelsize 12 align 5 textcolor 94 xywh {254 691 606 73} selection_color 48 labelsize 12 align 5 textcolor 94
code0 {o->buffer( sequence_notes_buffer = new Fl_Text_Buffer );} code0 {o->buffer( sequence_notes_buffer = new Fl_Text_Buffer );}
} }
Fl_Box triggers_widget { Fl_Box triggers_widget {
@ -480,6 +482,29 @@ else
code0 {o->box( FL_NO_BOX );} code0 {o->box( FL_NO_BOX );}
class Triggers class Triggers
} }
Fl_Group progress_group {
callback {if ( ! o->visible_r() )
return;
phrase *p = phrase::phrase_by_number( playlist->playing() );
if ( p )
phrase_progress->value( p->index() / (double)p->length() );
if ( playlist->length() )
sequence_progress->value( playlist->index() / (double)playlist->length() );} open
xywh {10 656 233 66}
} {
Fl_Slider phrase_progress {
label Phrase
xywh {10 656 233 24} type Horizontal labelsize 12 align 1
}
Fl_Slider sequence_progress {
label Sequence
callback {transport.locate( (tick_t)((double)playlist->length() * o->value()) );} selected
xywh {10 698 233 24} type Horizontal labelsize 12 align 1
}
}
} }
Fl_Group phrase_tab { Fl_Group phrase_tab {
label Phrase open label Phrase open
@ -531,7 +556,7 @@ o->maximum( phrase::phrases() );}
} }
Fl_Group pattern_tab { Fl_Group pattern_tab {
label Pattern open label Pattern open
xywh {0 98 868 674} color 37 xywh {0 98 868 674} color 37 hide
code0 {update_pattern_widgets();} code0 {update_pattern_widgets();}
} { } {
Fl_Box pattern_canvas_widget { Fl_Box pattern_canvas_widget {
@ -636,7 +661,7 @@ if ( 0 == strncmp( picked, "Scale", strlen( "Scale" ) ) )
pattern_c->changed_mapping(); pattern_c->changed_mapping();
pattern_key_combo->activate(); pattern_key_combo->activate();
}} open selected }} open
xywh {609 734 30 24} labeltype NO_LABEL xywh {609 734 30 24} labeltype NO_LABEL
code0 {update_mapping_menu();} code0 {update_mapping_menu();}
} { } {
@ -1074,7 +1099,8 @@ if ( g->notes() )
else else
phrase_notes_buffer->text( strdup( "" ) );} {} phrase_notes_buffer->text( strdup( "" ) );} {}
} }
Function {update_sequence_widgets()} {} { Function {update_sequence_widgets()} {open
} {
code {if ( playlist->notes() ) code {if ( playlist->notes() )
sequence_notes_buffer->text( playlist->notes() ); sequence_notes_buffer->text( playlist->notes() );
else else

View File

@ -112,8 +112,9 @@ sequence::remove ( int n )
unlock(); unlock();
} }
/** return the number of phrases in this sequence */
int int
sequence::length ( void ) const sequence::phrases ( void ) const
{ {
return _rd->num; return _rd->num;
} }
@ -204,6 +205,10 @@ sequence::play ( tick_t start, tick_t end ) const
if ( pend > start ) if ( pend > start )
{ {
// FIXME: don't really need to trigger more than once! // FIXME: don't really need to trigger more than once!
_playing = p->number();
_index = start;
p->trigger( pstart, pend ); p->trigger( pstart, pend );
p->play( start, end ); p->play( start, end );
break; break;
@ -216,6 +221,39 @@ sequence::play ( tick_t start, tick_t end ) const
} }
} }
/** return the number of the currently playing phrase, or 0 if none. */
int
sequence::playing ( void ) const
{
return _playing;
}
/** return the location of the playhead for this sequence */
tick_t
sequence::index ( void ) const
{
return _index;
}
/** return the total length of the sequence in ticks */
tick_t
sequence::length ( void ) const
{
tick_t l = 0;
for ( int i = 0; i < _rd->num; i++ )
{
phrase *p = phrase::phrase_by_number( _rd->phrases[ i ] );
if ( ! p )
break;
l += p->length();
}
return l;
}
/** return to a blank slate */ /** return to a blank slate */
void void
sequence::reset ( void ) sequence::reset ( void )

View File

@ -47,6 +47,9 @@ class sequence : public trackable {
char * _name; char * _name;
char * _notes; char * _notes;
mutable volatile int _playing;
mutable volatile tick_t _index;
void lock ( void ); void lock ( void );
void unlock ( void ); void unlock ( void );
@ -65,11 +68,14 @@ public:
void insert ( unsigned int n, int pn ); void insert ( unsigned int n, int pn );
void remove ( int n ); void remove ( int n );
void move ( int n, int dir ); void move ( int n, int dir );
int length ( void ) const; int phrases ( void ) const;
char * dump ( void ); char * dump ( void );
bool load ( const char *name ); bool load ( const char *name );
void save ( const char *name ) const; void save ( const char *name ) const;
void play ( tick_t start, tick_t end ) const; void play ( tick_t start, tick_t end ) const;
int playing ( void ) const;
tick_t index ( void ) const;
tick_t length ( void ) const;
char * name ( void ) const; char * name ( void ) const;
void name ( const char *s ); void name ( const char *s );

View File

@ -21,6 +21,8 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <math.h>
#include "transport.H" #include "transport.H"
#include "common.h" #include "common.h"
#include "const.h" #include "const.h"
@ -47,6 +49,9 @@ Transport::timebase ( jack_transport_state_t state, jack_nframes_t nframes, jack
pos->beats_per_minute = transport._master_beats_per_minute; pos->beats_per_minute = transport._master_beats_per_minute;
// FIXME: there's some problem with relocation when we're the master...
if ( new_pos || ! _done ) if ( new_pos || ! _done )
{ {
double wallclock = pos->frame / (pos->frame_rate * 60); double wallclock = pos->frame / (pos->frame_rate * 60);
@ -168,8 +173,11 @@ Transport::toggle ( void )
void void
Transport::locate ( tick_t ticks ) Transport::locate ( tick_t ticks )
{ {
MESSAGE( "Relocating transport" ); jack_nframes_t frame = trunc( ticks * transport.frames_per_tick );
jack_transport_locate( client, ticks );
MESSAGE( "Relocating transport to %lu, %lu", ticks, frame );
jack_transport_locate( client, frame );
} }
void void