Added velocity to tracks in the sequencer.

This commit is contained in:
Johannes Findeisen 2026-11-06 21:00:20 +01:00
commit b46d4f09bb
13 changed files with 873 additions and 19 deletions

View file

@ -1214,6 +1214,56 @@ int main(int argc, char **argv)
unlink("/tmp/xtc-workspace.xtc"); window.do_callback();
}
reset();
{
MainWindow window(false,""); window.show(); auto *s=timeline(&window);
CHECK(window.create_track(true)==XTC_OK);
uint64_t track=s->selected_track(), clip=s->selected_clip(), note_id=0, chord_id=0;
CHECK(xtc_project_add_note(s->project(),clip,960,480,60,100,2,&note_id)==XTC_OK);
CHECK(xtc_project_add_note(s->project(),clip,960,480,64,40,2,&chord_id)==XTC_OK);
CHECK(window.create_track(true)==XTC_OK); // Publish notes and add a second row.
uint64_t second=s->selected_track(), second_clip=s->selected_clip();
int base=s->track_top(1)-s->y();
auto arrow=[&]() {
int ox=Fl::e_x,oy=Fl::e_y,ok=Fl::e_keysym;
Fl::e_x=s->header_left()+15; Fl::e_y=s->track_top(0)+13;
Fl::e_keysym=FL_Button+FL_LEFT_MOUSE; CHECK(s->handle(FL_PUSH)==1);
s->handle(FL_RELEASE);
Fl::e_x=ox; Fl::e_y=oy; Fl::e_keysym=ok;
};
arrow(); // Actual disclosure arrow.
CHECK(s->track_expanded(track) && s->track_top(1)-s->y()==base+88);
CHECK(s->instrument_choice(second)->y()==s->track_top(1)+30);
int px=s->header_width()+s->zoom_level();
int top=28+56, ny=top+88-8-100*60/127;
gesture(s,px,ny,0,30);
xtc_note_info note{},chord{};
xtc_project_get_note(s->project(),0,&note); xtc_project_get_note(s->project(),1,&chord);
CHECK(note.id==note_id && note.velocity<100 && note.pitch==60 && note.channel==2 && note.start_tick==960);
CHECK(chord.id==chord_id && chord.velocity==40);
CHECK(window.undo(false)==XTC_OK);
xtc_project_get_note(s->project(),0,&note); CHECK(note.velocity==100 && s->track_expanded(track));
CHECK(window.undo(true)==XTC_OK);
// Escape cancels a preview without changing the model.
xtc_project_get_note(s->project(),0,&note);
int old_x=Fl::e_x,old_y=Fl::e_y,old_key=Fl::e_keysym;
Fl::e_x=s->x()+px; Fl::e_y=s->y()+top+80-static_cast<int>(note.velocity)*60/127;
Fl::e_keysym=FL_Button+FL_LEFT_MOUSE; CHECK(s->handle(FL_PUSH)==1);
Fl::e_y-=20; CHECK(s->handle(FL_DRAG)==1);
Fl::e_keysym=FL_Escape; CHECK(s->handle(FL_KEYDOWN)==1);
xtc_note_info unchanged{}; xtc_project_get_note(s->project(),0,&unchanged); CHECK(unchanged.velocity==note.velocity);
Fl::e_x=old_x; Fl::e_y=old_y; Fl::e_keysym=old_key;
gesture(s,s->header_width()+20,s->track_top(1)-s->y()+15,0,0);
CHECK(s->selected_track()==second && s->selected_clip()==second_clip);
CHECK(s->move_track(-1)==XTC_OK && s->track_expanded(track));
CHECK(s->track_top(1)-s->y()==base); // Expansion follows the stable track ID.
CHECK(s->move_track(1)==XTC_OK);
arrow();
CHECK(!s->track_expanded(track) && s->track_top(1)-s->y()==base);
CHECK(!s->expand_track(UINT64_MAX,true));
CHECK(window.new_project()==XTC_OK && !s->track_expanded(track));
window.do_callback();
}
reset();
{
MainWindow window(false,""); window.show(); auto *sequence = timeline(&window);
CHECK(window.create_track(true) == XTC_OK);