diff --git a/miditones_scroll.c b/miditones_scroll.c index 77068ac..2062b43 100644 --- a/miditones_scroll.c +++ b/miditones_scroll.c @@ -104,9 +104,11 @@ * 6 August 2016, L. Shustek, V1.5 * - Handle optional instrument change information. * - Look for the optional self-describing file header. +* 30 September 2016, L. Shustek, V1.6 +* - Count the number of unnecessary "stop note" commands in the bytestream */ -#define VERSION "1.5" +#define VERSION "1.6" #include #include @@ -126,13 +128,15 @@ int gen_note[MAX_TONEGENS]; // the note we're playing, or SILENT int gen_volume[MAX_TONEGENS]; // the volume we're playing int gen_instrument[MAX_TONEGENS]; // the instrument we're playing bool gen_instrument_changed[MAX_TONEGENS]; +bool gen_did_stopnote[MAX_TONEGENS]; // did we just do a stopnote? FILE *infile, *outfile; unsigned char *buffer, *bufptr; unsigned long buflen; unsigned int num_tonegens = 6; // default number of generators unsigned int max_tonegen_found = 0; -unsigned int notes_skipped; +unsigned int notes_skipped = 0; +unsigned int stopnotes_before_startnote = 0; unsigned long timenow = 0; unsigned char cmd, gen; @@ -512,6 +516,8 @@ int main (int argc, char *argv[]) { delay = ((unsigned int) cmd << 8) + *++bufptr; print_status (); // tone generator status now timenow += delay; // advance time + for (gen = 0; gen < MAX_TONEGENS; ++gen) + gen_did_stopnote[gen] = false; } else if (cmd != 0xf0) { /* a command */ gen = cmd & 0x0f; if (gen > max_tonegen_found) @@ -520,6 +526,10 @@ int main (int argc, char *argv[]) { if (cmd == 0x90) { /* note on */ gen_note[gen] = *++bufptr; // note number tonegens_used |= 1 << gen; // record that we used this generator at least once + if (gen_did_stopnote[gen]) { + ++stopnotes_before_startnote; + // printf("unnecessary stopnote on gen %d\n", gen); + } if (expect_volume) gen_volume[gen] = *++bufptr; // volume if (gen >= num_tonegens) @@ -528,6 +538,7 @@ int main (int argc, char *argv[]) { if (gen_note[gen] == SILENT) file_error ("tone generator not on", bufptr); gen_note[gen] = SILENT; + gen_did_stopnote[gen] = true; } else if (cmd == 0xc0) { /* change instrument */ gen_instrument[gen] = *++bufptr & 0x7f; gen_instrument_changed[gen] = true; @@ -555,5 +566,6 @@ int main (int argc, char *argv[]) { if (notes_skipped) printf ("%u notes were not displayed because we were told to show only %u generators.\n", notes_skipped, num_tonegens); + printf("%u stopnote commands were unnecessary.\n", stopnotes_before_startnote); printf ("Done.\n"); } diff --git a/miditones_scroll.exe b/miditones_scroll.exe index 33b39eb..47d3654 100644 Binary files a/miditones_scroll.exe and b/miditones_scroll.exe differ