Add phrase and sequence progress bar widgets.
This commit is contained in:
parent
0af405908d
commit
42f7242ba5
44
gui/ui.fl
44
gui/ui.fl
|
@ -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
|
||||||
|
|
40
sequence.C
40
sequence.C
|
@ -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 )
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
12
transport.C
12
transport.C
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue