feat(midi): strum chords with preserved note ends and undo (phase 99)
This commit is contained in:
parent
083ac05ae6
commit
bd0a63c06d
17 changed files with 172 additions and 5 deletions
|
|
@ -270,6 +270,16 @@ int creative_workflow_tests()
|
|||
engine_status.sample_position=48000;s->position(1920);CHECK(s->add_region()==XTC_OK);auto right_clip=s->selected_clip();CHECK(s->select(audio_track,left_clip) && s->toggle_clip(right_clip));
|
||||
CHECK(s->crossfade_selection()==XTC_OK);xtc_clip_info audio{};CHECK(xtc_project_find_clip(s->project(),left_clip,&audio)==XTC_OK && audio.fade_out_tick==1920);
|
||||
CHECK(window.undo()==XTC_OK && xtc_project_find_clip(s->project(),left_clip,&audio)==XTC_OK && !audio.fade_out_tick);
|
||||
engine_status.sample_position=0;
|
||||
CHECK(window.create_track(true)==XTC_OK);auto midi_track=s->selected_track();
|
||||
CHECK(s->add_midi_clip()==XTC_OK);auto chord_clip=s->selected_clip();
|
||||
CHECK(window.open_piano_roll()==XTC_OK);
|
||||
CHECK(window.piano_roll()->add_note(0,200,60,100,0)==XTC_OK);
|
||||
CHECK(window.piano_roll()->add_note(0,200,67,100,0)==XTC_OK);
|
||||
CHECK(s->select(midi_track,chord_clip) && s->strum_chords(30,false)==XTC_OK);
|
||||
xtc_note_info strummed{};size_t note_count=0;CHECK(xtc_project_note_count(s->project(),¬e_count)==XTC_OK);
|
||||
CHECK(xtc_project_get_note(s->project(),note_count-1,&strummed)==XTC_OK && strummed.start_tick==30 && strummed.length_tick==170);
|
||||
CHECK(window.undo()==XTC_OK && xtc_project_get_note(s->project(),note_count-1,&strummed)==XTC_OK && strummed.start_tick==0 && strummed.length_tick==200);
|
||||
CHECK(!panel->comparison_ready(0) && !panel->comparison_ready(1));
|
||||
window.do_callback();puts("Creative workflow GUI checks passed.");return failures ? 1 : 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -294,6 +294,22 @@ static void sample_failures(void)
|
|||
}
|
||||
xtc_sample_destroy(source);xtc_project_destroy(p);assert(rmdir(root)==0);
|
||||
}
|
||||
static void strum_failures(void)
|
||||
{
|
||||
xtc_project *p=NULL;uint64_t t,c,n;int succeeded=0;
|
||||
assert(xtc_project_create(&p)==XTC_OK && xtc_project_add_track(p,"Chord",&t)==XTC_OK);
|
||||
assert(xtc_project_add_midi_clip(p,t,0,1920,&c)==XTC_OK);
|
||||
assert(xtc_project_add_note(p,c,0,200,60,100,0,&n)==XTC_OK && xtc_project_add_note(p,c,0,200,67,100,0,&n)==XTC_OK);
|
||||
for(int failure=0;failure<128;++failure){
|
||||
xtc_project *copy=NULL;xtc_note_info note;xtc_result r;
|
||||
assert(xtc_project_clone(p,©)==XTC_OK);fail_after=failure;
|
||||
r=xtc_project_strum(copy,&c,1,30,0);fail_after=-1;
|
||||
if(r==XTC_OK)succeeded=1;
|
||||
else {assert(r==XTC_ERR_OUT_OF_MEMORY);assert(xtc_project_get_note(copy,1,¬e)==XTC_OK && note.id==n && note.start_tick==0 && note.length_tick==200);}
|
||||
xtc_project_destroy(copy);if(succeeded)break;
|
||||
}
|
||||
assert(succeeded);xtc_project_destroy(p);
|
||||
}
|
||||
static void track_insert_failures(void)
|
||||
{
|
||||
xtc_project *p=NULL;xtc_track_chain c={0};uint64_t t,clip;int mode,failure;
|
||||
|
|
@ -324,6 +340,7 @@ static void track_insert_failures(void)
|
|||
}
|
||||
int main(void)
|
||||
{
|
||||
strum_failures();
|
||||
track_insert_failures();
|
||||
sample_failures();
|
||||
composition_failures();
|
||||
|
|
|
|||
|
|
@ -45,9 +45,35 @@ static void crossfade_tests(void)
|
|||
assert(xtc_project_find_clip(p,a,&left)==XTC_OK && !memcmp(&before,&left,sizeof(left)));
|
||||
xtc_project_destroy(p);unlink(wave);
|
||||
}
|
||||
static void strum_tests(void)
|
||||
{
|
||||
xtc_project *p=NULL,*down=NULL;uint64_t t,c,n,solo,audio;xtc_note_info before[5],after;
|
||||
unsigned int pitches[]={67,60,64,72,48};
|
||||
assert(xtc_project_create(&p)==XTC_OK && xtc_project_add_track(p,"Chords",&t)==XTC_OK);
|
||||
assert(xtc_project_add_midi_clip(p,t,0,1920,&c)==XTC_OK);
|
||||
for(size_t i=0;i<5;++i){
|
||||
assert(xtc_project_add_note(p,c,i==3 ? 480 : 0,200,pitches[i],100,i==4 ? 1 : 0,&n)==XTC_OK);
|
||||
assert(xtc_project_get_note(p,i,before+i)==XTC_OK);
|
||||
}
|
||||
assert(xtc_project_clone(p,&down)==XTC_OK);
|
||||
assert(xtc_project_strum(p,&c,1,200,0)==XTC_ERR_INVALID_ARGUMENT);
|
||||
for(size_t i=0;i<5;++i){assert(xtc_project_get_note(p,i,&after)==XTC_OK && !memcmp(&after,before+i,sizeof(after)));}
|
||||
assert(xtc_project_strum(p,&c,1,0,0)==XTC_ERR_INVALID_ARGUMENT && xtc_project_strum(p,&c,1,20,2)==XTC_ERR_INVALID_ARGUMENT);
|
||||
assert(xtc_project_strum(p,&c,1,20,0)==XTC_OK && xtc_project_strum(down,&c,1,20,1)==XTC_OK);
|
||||
for(size_t i=0;i<5;++i){
|
||||
uint64_t up[]={40,0,20,480,0},descending[]={0,40,20,480,0};
|
||||
assert(xtc_project_get_note(p,i,&after)==XTC_OK && after.start_tick==up[i] && after.start_tick+after.length_tick==before[i].start_tick+200 && after.id==before[i].id && after.pitch==pitches[i] && after.velocity==100 && after.channel==before[i].channel);
|
||||
assert(xtc_project_get_note(down,i,&after)==XTC_OK && after.start_tick==descending[i]);
|
||||
}
|
||||
assert(xtc_project_add_midi_clip(p,t,3840,1920,&solo)==XTC_OK && xtc_project_add_note(p,solo,0,100,60,100,0,&n)==XTC_OK);
|
||||
assert(xtc_project_strum(p,&solo,1,20,0)==XTC_ERR_NOT_FOUND);
|
||||
assert(xtc_project_add_clip(p,t,"Audio",7680,1920,&audio)==XTC_OK);
|
||||
{uint64_t ids[]={c,audio};assert(xtc_project_strum(p,ids,2,20,0)==XTC_ERR_INVALID_STATE);}
|
||||
xtc_project_destroy(p);xtc_project_destroy(down);
|
||||
}
|
||||
int main(void)
|
||||
{
|
||||
tap_tests();crossfade_tests();
|
||||
tap_tests();crossfade_tests();strum_tests();
|
||||
xtc_track_chain c={0},out={0};
|
||||
c.output_gain=.8f;c.count=1;c.slots[0].enabled=1;c.slots[0].wet=.4f;
|
||||
assert(xtc_plugin_probe_format(XTC_PLUGIN_BUILTIN,XTC_BUILTIN_PATH,2,48000,&c.slots[0].plugin)==XTC_OK);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue