feat: generate bounded ascending and descending MIDI arpeggio patterns

This commit is contained in:
Johannes Findeisen 2026-11-06 00:42:33 +01:00
commit ea0b4ca3da
9 changed files with 89 additions and 5 deletions

View file

@ -1390,6 +1390,8 @@ int main(int argc, char **argv)
CHECK(s->transform_midi(human)==XTC_OK);CHECK(window.undo()==XTC_OK);
CHECK(s->select(0,0));CHECK(s->make_chord({4,7})==XTC_OK);
size_t notes=0;xtc_project_note_count(s->project(),&notes);CHECK(notes==3);
CHECK(s->arpeggiate(80,50,false)==XTC_OK);xtc_project_note_count(s->project(),&notes);CHECK(notes==3);
CHECK(window.undo()==XTC_OK);xtc_project_note_count(s->project(),&notes);CHECK(notes==3);
window.do_callback();
}
if (failures != 0) return 1;

View file

@ -142,4 +142,25 @@ static void chords(void)
assert(xtc_project_note_count(p,&count)==XTC_OK && count==XTC_PROJECT_MAX_NOTES);
xtc_project_destroy(p);
}
int main(void){markers();sections();ripple();duplicate_track();split_midi();merge_midi();humanize();chords();puts("Next DAW workflow tests passed.");return 0;}
static void arpeggio(void)
{
xtc_project *p=NULL,*q=NULL;uint64_t t,c,n;size_t count;xtc_note_info note;int intervals[2]={4,7};
assert(xtc_project_create(&p)==XTC_OK && xtc_project_add_track(p,"Track",&t)==XTC_OK);
assert(xtc_project_add_midi_clip(p,t,0,960,&c)==XTC_OK && xtc_project_add_note(p,c,0,960,60,100,0,&n)==XTC_OK);
assert(xtc_project_chordify(p,&c,1,intervals,2)==XTC_OK);
assert(xtc_project_clone(p,&q)==XTC_OK && xtc_project_arpeggiate(q,&c,1,240,50,1)==XTC_OK);
assert(xtc_project_get_note(q,0,&note)==XTC_OK && note.pitch==67);xtc_project_destroy(q);
assert(xtc_project_arpeggiate(p,&c,1,240,50,0)==XTC_OK);
assert(xtc_project_note_count(p,&count)==XTC_OK && count==4);
assert(xtc_project_get_note(p,1,&note)==XTC_OK && note.start_tick==240 && note.pitch==64 && note.length_tick==120);
assert(xtc_project_get_note(p,3,&note)==XTC_OK && note.start_tick==720 && note.pitch==60);
assert(xtc_project_arpeggiate(p,&c,1,1,100,0)==XTC_OK);
assert(xtc_project_note_count(p,&count)==XTC_OK && count==480);
assert(xtc_project_arpeggiate(p,&c,1,0,100,0)==XTC_ERR_INVALID_ARGUMENT);
xtc_project_destroy(p);p=NULL;
assert(xtc_project_create(&p)==XTC_OK && xtc_project_add_track(p,"Track",&t)==XTC_OK);
assert(xtc_project_add_midi_clip(p,t,0,XTC_PROJECT_MAX_TICK,&c)==XTC_OK && xtc_project_add_note(p,c,0,XTC_PROJECT_MAX_TICK,60,100,0,&n)==XTC_OK);
assert(xtc_project_arpeggiate(p,&c,1,1,100,0)==XTC_ERR_CAPACITY);
assert(xtc_project_note_count(p,&count)==XTC_OK && count==1);xtc_project_destroy(p);
}
int main(void){markers();sections();ripple();duplicate_track();split_midi();merge_midi();humanize();chords();arpeggio();puts("Next DAW workflow tests passed.");return 0;}