Phase 34: add snap grids, MIDI velocity editing and track instrument menus
This commit is contained in:
parent
d800a6392e
commit
4873b70672
14 changed files with 481 additions and 29 deletions
|
|
@ -6,6 +6,7 @@
|
|||
#include "../../src/gui/plugin_dialog.hpp"
|
||||
#include <FL/Fl_Hold_Browser.H>
|
||||
#include <FL/Fl_Choice.H>
|
||||
#include <FL/Fl_Value_Slider.H>
|
||||
#include <unistd.h>
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/Fl_Box.H>
|
||||
|
|
@ -845,6 +846,19 @@ int main(int argc, char **argv)
|
|||
CHECK(window.save_project("/tmp/xtc-gui-instrument.xtc") == XTC_OK);
|
||||
CHECK(window.new_project() == XTC_OK && window.open_project("/tmp/xtc-gui-instrument.xtc") == XTC_OK);
|
||||
CHECK(xtc_project_get_instrument(sequence->project(),track,&spec) == XTC_OK && spec.instrument);
|
||||
CHECK(window.create_track(true) == XTC_OK);
|
||||
uint64_t second = sequence->selected_track();
|
||||
auto *selector = sequence->instrument_choice(second); CHECK(selector && selector->value() == 0);
|
||||
CHECK(selector->size() == 4); // Sine, current project instrument, load, terminator.
|
||||
selector->value(1); selector->do_callback();
|
||||
CHECK(xtc_project_get_instrument(sequence->project(),second,&spec) == XTC_OK && spec.instrument);
|
||||
CHECK(sequence->selected_track() == second);
|
||||
CHECK(sequence->move_track(-1) == XTC_OK);
|
||||
selector = sequence->instrument_choice(second); selector->value(0); selector->do_callback();
|
||||
CHECK(xtc_project_get_instrument(sequence->project(),second,&spec) == XTC_ERR_NOT_FOUND);
|
||||
CHECK(xtc_project_get_instrument(sequence->project(),track,&spec) == XTC_OK);
|
||||
CHECK(window.undo(false) == XTC_OK);
|
||||
CHECK(xtc_project_get_instrument(sequence->project(),second,&spec) == XTC_OK);
|
||||
CHECK(window.assign_instrument(track,nullptr,0) == XTC_OK);
|
||||
unlink("/tmp/xtc-gui-instrument.xtc"); window.do_callback();
|
||||
}
|
||||
|
|
@ -892,6 +906,64 @@ int main(int argc, char **argv)
|
|||
xtc_project_get_counts(sequence->project(),&tracks,&clips); CHECK(tracks == 2 && clips == 1);
|
||||
unlink("/tmp/xtc-workspace.xtc"); window.do_callback();
|
||||
}
|
||||
reset();
|
||||
{
|
||||
MainWindow window(false); window.show(); auto *sequence = timeline(&window);
|
||||
CHECK(window.create_track(true) == XTC_OK);
|
||||
uint64_t clip = sequence->selected_clip(), track = sequence->selected_track();
|
||||
auto *snap = dynamic_cast<Fl_Choice *>(find(&window,"Snap")); CHECK(snap && snap->value() == 3);
|
||||
CHECK(!std::strcmp(snap->text(3),"1/16") && !std::strcmp(snap->text(8),"1 bar"));
|
||||
snap->value(5); snap->do_callback(); CHECK(sequence->grid() == 480);
|
||||
CHECK(xtc_project_edit_clip(sequence->project(),clip,track,100,3840,0) == XTC_OK);
|
||||
CHECK(sequence->rename_selection("Off-grid") == XTC_OK);
|
||||
gesture(sequence,205,50,100,0);
|
||||
xtc_clip_info info{}; xtc_project_find_clip(sequence->project(),clip,&info);
|
||||
CHECK(info.start_tick == 1920); // Snap absolute position, including an off-grid source.
|
||||
snap->value(0); snap->do_callback(); CHECK(sequence->grid() == 1);
|
||||
gesture(sequence,300,50,1,0); xtc_project_find_clip(sequence->project(),clip,&info);
|
||||
CHECK(info.start_tick == 1940); // Off retains pointer precision rather than a musical grid.
|
||||
CHECK(window.undo(false) == XTC_OK);
|
||||
CHECK(sequence->select(track,clip));
|
||||
snap->value(5); snap->do_callback();
|
||||
gesture(sequence,466,50,-13,0); xtc_project_find_clip(sequence->project(),clip,&info);
|
||||
CHECK(info.start_tick+info.length_tick == 5280);
|
||||
gesture(sequence,277,50,13,0); xtc_project_find_clip(sequence->project(),clip,&info);
|
||||
CHECK(info.start_tick == 2400 && info.offset_tick == 480 && info.length_tick == 2880);
|
||||
int old_x = Fl::e_x, old_y = Fl::e_y, old_key = Fl::e_keysym, old_clicks = Fl::e_clicks;
|
||||
Fl::e_x = sequence->x()+320; Fl::e_y = sequence->y()+50;
|
||||
Fl::e_keysym = FL_Button+FL_LEFT_MOUSE; Fl::e_clicks = 1;
|
||||
CHECK(sequence->handle(FL_PUSH) == 1); CHECK(window.piano_roll() && window.piano_roll()->clip() == clip);
|
||||
Fl::e_x = old_x; Fl::e_y = old_y; Fl::e_keysym = old_key; Fl::e_clicks = old_clicks;
|
||||
auto *piano = window.piano_roll();
|
||||
CHECK(piano->add_note(0,960,60,100,2) == XTC_OK);
|
||||
uint64_t note_id = piano->selected_note();
|
||||
CHECK(piano->add_note(0,960,64,90,2) == XTC_OK); // Coincident notes remain individually editable.
|
||||
uint64_t chord_id = piano->selected_note();
|
||||
CHECK(piano->select_note(note_id)); pump();
|
||||
auto *velocity = dynamic_cast<Fl_Value_Slider *>(find(piano->window(),"Note velocity"));
|
||||
CHECK(velocity && velocity->active()); velocity->value(29); velocity->do_callback();
|
||||
xtc_note_info note{}, chord{};
|
||||
for (size_t i = 0; i < 2; ++i) { xtc_note_info n{}; xtc_project_get_note(sequence->project(),i,&n);
|
||||
if (n.id == note_id) note = n;
|
||||
if (n.id == chord_id) chord = n;
|
||||
}
|
||||
CHECK(note.velocity == 29 && note.start_tick == 0 && note.length_tick == 960 && note.pitch == 60 && note.channel == 2);
|
||||
CHECK(chord.velocity == 90);
|
||||
CHECK(piano->set_velocity(note_id,0) == XTC_ERR_INVALID_ARGUMENT);
|
||||
CHECK(piano->set_velocity(note_id,128) == XTC_ERR_INVALID_ARGUMENT);
|
||||
CHECK(piano->set_velocity(UINT64_MAX,40) == XTC_ERR_NOT_FOUND);
|
||||
auto *lane = window.velocity_lane(); CHECK(lane);
|
||||
gesture(lane,piano->note_x(0)-lane->x(),70,0,-30);
|
||||
xtc_project_get_note(sequence->project(),0,¬e); CHECK(note.id == note_id && note.velocity > 29);
|
||||
xtc_project_get_note(sequence->project(),1,&chord); CHECK(chord.id == chord_id && chord.velocity == 90);
|
||||
CHECK(window.undo(false) == XTC_OK);
|
||||
xtc_project_get_note(sequence->project(),0,¬e); CHECK(note.velocity == 29);
|
||||
CHECK(window.undo(true) == XTC_OK);
|
||||
CHECK(window.save_project("/tmp/xtc-grid-velocity.xtc") == XTC_OK);
|
||||
CHECK(window.new_project() == XTC_OK && window.open_project("/tmp/xtc-grid-velocity.xtc") == XTC_OK);
|
||||
xtc_project_get_note(sequence->project(),0,¬e); CHECK(note.velocity > 29 && note.pitch == 60 && note.channel == 2);
|
||||
unlink("/tmp/xtc-grid-velocity.xtc"); window.do_callback();
|
||||
}
|
||||
if (failures != 0) return 1;
|
||||
std::printf("GUI controls/errors/views/timers/cleanup passed: %u opens, %u closes.\n", opens, closes);
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue