feat: humanize MIDI timing and dynamics with reproducible seeded edits

This commit is contained in:
Johannes Findeisen 2026-11-06 00:39:19 +01:00
commit d034417c8c
9 changed files with 51 additions and 7 deletions

View file

@ -1385,6 +1385,9 @@ int main(int argc, char **argv)
CHECK(s->select(0,0));CHECK(s->duplicate_selection()==XTC_OK);s->select_all_clips();CHECK(s->merge_midi()==XTC_OK);
xtc_project_get_counts(s->project(),&tracks,&clips);CHECK(clips==1);
CHECK(window.undo()==XTC_OK);xtc_project_get_counts(s->project(),&tracks,&clips);CHECK(clips==2);
CHECK(s->select(0,0));CHECK(window.open_piano_roll()==XTC_OK);CHECK(window.piano_roll()->add_note(480,240,60)==XTC_OK);
xtc_midi_transform human{};human.type=XTC_MIDI_TRANSFORM_HUMANIZE;human.seed=42;human.timing_variation=12;human.velocity_variation=8;
CHECK(s->transform_midi(human)==XTC_OK);CHECK(window.undo()==XTC_OK);
window.do_callback();
}
if (failures != 0) return 1;

View file

@ -111,4 +111,19 @@ static void merge_midi(void)
assert(xtc_project_get_note(p,1,&note)==XTC_OK && note.start_tick==960 && note.length_tick==240 && note.pitch==67);
xtc_project_destroy(p);
}
int main(void){markers();sections();ripple();duplicate_track();split_midi();merge_midi();puts("Next DAW workflow tests passed.");return 0;}
static void humanize(void)
{
xtc_project *p=NULL,*q=NULL;uint64_t t,c,n;xtc_note_info a,b;xtc_midi_transform edit={0};
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,1920,&c)==XTC_OK && xtc_project_add_note(p,c,480,120,60,100,0,&n)==XTC_OK);
assert(xtc_project_clone(p,&q)==XTC_OK);
edit.type=XTC_MIDI_TRANSFORM_HUMANIZE;edit.seed=42;edit.timing_variation=30;edit.velocity_variation=12;
assert(xtc_project_transform_midi(p,&c,1,&edit)==XTC_OK && xtc_project_transform_midi(q,&c,1,&edit)==XTC_OK);
assert(xtc_project_get_note(p,0,&a)==XTC_OK && xtc_project_get_note(q,0,&b)==XTC_OK && !memcmp(&a,&b,sizeof(a)));
assert(a.start_tick>=450 && a.start_tick<=510 && a.velocity>=88 && a.velocity<=112 && a.id==n);
assert(xtc_project_edit_note(p,n,0,1920,60,100,0)==XTC_OK);edit.timing_variation=960;
assert(xtc_project_transform_midi(p,&c,1,&edit)==XTC_ERR_INVALID_ARGUMENT);
assert(xtc_project_get_note(p,0,&a)==XTC_OK && a.start_tick==0 && a.velocity==100);
xtc_project_destroy(p);xtc_project_destroy(q);
}
int main(void){markers();sections();ripple();duplicate_track();split_midi();merge_midi();humanize();puts("Next DAW workflow tests passed.");return 0;}