// Compare MIDI files. // Assumes exact times. // Ignores loudness. #include #include #include "h.h" typedef struct cn{uchar nv; char dur; struct cn * nxt;} cn; typedef struct{BP bp; note * mus; cn * * fm; int sz; char* name;} piece; int main(int argc, char * * argv){ if(argc < 4) {printf("usage: mdif grain fn fn.\n"); exit(0);} int grn = 1<<(atoi(argv[1])); // trill notes per quarter note (usually 8) int ncni = 0; cn* ncnp; cn * ncn(){if(!ncni) {ncnp = (cn*)malloc(sizeof(cn)*20); ncni = 20; if(!ncnp){printf("Room!\n"); exit(41);}} return ncnp+(--ncni);} piece mp(char * j){piece v; v.mus = 0; v.name = j; int pd = 0; v.mus = Read(j, &v.bp); void fedm(note n){if(n.dur pd) pd = n.start;} scan(fedm, v.mus, 0); v.sz = pd*grn/v.bp.den; v.fm = (cn * *)malloc(sizeof(cn *)*v.sz); // printf("array for %s at %p\n", j, v.fm); // .... {int j = v.sz; while(j--) v.fm[j] = 0;} void fed(note n){if(n.dur v.sz) {printf("glrp %s %d %d\n", j, when, v.sz); exit(11);} {cn * cnp = ncn(); *cnp = (cn){n.o.n.freq, n.dur, v.fm[when]}; v.fm[when] = cnp;}}} scan(fed, v.mus, 1); printf("Piece %s has %d note slots\n", j, v.sz); return v;} piece a = mp(argv[2]), b = mp(argv[3]); void rex(piece p){int j=10; int nb = 0; // printf("array for %s at %p\n", p.name, p.fm); printf("Piece %s begins:\n", p.name); while(j--) {while ((!p.fm[nb]) && nbnv); pt = pt->nxt;} printf("\n");}}} rex(a); rex(b); int cs = a.sznv]) printf("Twice played\n"); ++k[nts->nv]; nts = nts->nxt;}}} mk(ka, a.fm[j]); mk(kb, b.fm[j]); {int j=128; while(j--) if(ka[j] != kb[j]) printf("qn=%9.4f nv = %d; %d:%d\n", (float)j/grn, j, ka[j], kb[j]);}}} return 0;}