midifile: make it possible to specify output file

This commit is contained in:
Wim Taymans 2020-04-14 20:12:23 +02:00
parent 84b048507b
commit b09caaadc0
3 changed files with 29 additions and 29 deletions

View file

@ -587,95 +587,95 @@ static const char *controller_name(uint8_t ctrl)
return controller_names[ctrl]; return controller_names[ctrl];
} }
static void dump_mem(const char *label, uint8_t *data, uint32_t size) static void dump_mem(FILE *out, const char *label, uint8_t *data, uint32_t size)
{ {
printf("%s: ", label); fprintf(out, "%s: ", label);
while (size--) while (size--)
printf("%02x ", *data++); fprintf(out, "%02x ", *data++);
} }
int midi_file_dump_event(const struct midi_event *ev) int midi_file_dump_event(FILE *out, const struct midi_event *ev)
{ {
printf("track:%2d sec:%f ", ev->track, ev->sec); fprintf(out, "track:%2d sec:%f ", ev->track, ev->sec);
switch (ev->data[0]) { switch (ev->data[0]) {
case 0x80 ... 0x8f: case 0x80 ... 0x8f:
printf("Note Off (channel %2d): note %3s%d, velocity %3d", fprintf(out, "Note Off (channel %2d): note %3s%d, velocity %3d",
(ev->data[0] & 0x0f) + 1, (ev->data[0] & 0x0f) + 1,
note_names[ev->data[1] % 12], ev->data[1] / 12 -1, note_names[ev->data[1] % 12], ev->data[1] / 12 -1,
ev->data[2]); ev->data[2]);
break; break;
case 0x90 ... 0x9f: case 0x90 ... 0x9f:
printf("Note On (channel %2d): note %3s%d, velocity %3d", fprintf(out, "Note On (channel %2d): note %3s%d, velocity %3d",
(ev->data[0] & 0x0f) + 1, (ev->data[0] & 0x0f) + 1,
note_names[ev->data[1] % 12], ev->data[1] / 12 -1, note_names[ev->data[1] % 12], ev->data[1] / 12 -1,
ev->data[2]); ev->data[2]);
break; break;
case 0xa0 ... 0xaf: case 0xa0 ... 0xaf:
printf("Aftertouch (channel %2d): note %3s%d, pressure %3d", fprintf(out, "Aftertouch (channel %2d): note %3s%d, pressure %3d",
(ev->data[0] & 0x0f) + 1, (ev->data[0] & 0x0f) + 1,
note_names[ev->data[1] % 12], ev->data[1] / 12 -1, note_names[ev->data[1] % 12], ev->data[1] / 12 -1,
ev->data[2]); ev->data[2]);
break; break;
case 0xb0 ... 0xbf: case 0xb0 ... 0xbf:
printf("Controller (channel %2d): controller %3d (%s), value %3d", fprintf(out, "Controller (channel %2d): controller %3d (%s), value %3d",
(ev->data[0] & 0x0f) + 1, ev->data[1], (ev->data[0] & 0x0f) + 1, ev->data[1],
controller_name(ev->data[1]), ev->data[2]); controller_name(ev->data[1]), ev->data[2]);
break; break;
case 0xc0 ... 0xcf: case 0xc0 ... 0xcf:
printf("Program (channel %2d): program %3d (%s)", fprintf(out, "Program (channel %2d): program %3d (%s)",
(ev->data[0] & 0x0f) + 1, ev->data[1], (ev->data[0] & 0x0f) + 1, ev->data[1],
program_names[ev->data[1]]); program_names[ev->data[1]]);
break; break;
case 0xd0 ... 0xdf: case 0xd0 ... 0xdf:
printf("Channel Pressure (channel %2d): pressure %3d", fprintf(out, "Channel Pressure (channel %2d): pressure %3d",
(ev->data[0] & 0x0f) + 1, ev->data[1]); (ev->data[0] & 0x0f) + 1, ev->data[1]);
break; break;
case 0xe0 ... 0xef: case 0xe0 ... 0xef:
printf("Pitch Bend (channel %2d): value %d", (ev->data[0] & 0x0f) + 1, fprintf(out, "Pitch Bend (channel %2d): value %d", (ev->data[0] & 0x0f) + 1,
((int)ev->data[2] << 7 | ev->data[1]) - 0x2000); ((int)ev->data[2] << 7 | ev->data[1]) - 0x2000);
break; break;
case 0xf0: case 0xf0:
case 0xf7: case 0xf7:
dump_mem("SysEx", ev->data, ev->size); dump_mem(out, "SysEx", ev->data, ev->size);
break; break;
case 0xff: case 0xff:
printf("Meta: "); fprintf(out, "Meta: ");
switch (ev->data[1]) { switch (ev->data[1]) {
case 0x00: case 0x00:
printf("Sequence Number %3d %3d", ev->data[3], ev->data[4]); fprintf(out, "Sequence Number %3d %3d", ev->data[3], ev->data[4]);
break; break;
case 0x01 ... 0x09: case 0x01 ... 0x09:
printf("%s: %s", event_names[ev->data[1] - 1], &ev->data[ev->meta.offset]); fprintf(out, "%s: %s", event_names[ev->data[1] - 1], &ev->data[ev->meta.offset]);
break; break;
case 0x20: case 0x20:
printf("Channel Prefix: %03d", ev->data[3]); fprintf(out, "Channel Prefix: %03d", ev->data[3]);
break; break;
case 0x21: case 0x21:
printf("Midi Port: %03d", ev->data[3]); fprintf(out, "Midi Port: %03d", ev->data[3]);
break; break;
case 0x2f: case 0x2f:
printf("End Of Track"); fprintf(out, "End Of Track");
break; break;
case 0x51: case 0x51:
printf("Tempo: %d microseconds per quarter note, %.2f BPM", fprintf(out, "Tempo: %d microseconds per quarter note, %.2f BPM",
ev->meta.parsed.tempo.uspqn, ev->meta.parsed.tempo.uspqn,
60000000.0 / (double)ev->meta.parsed.tempo.uspqn); 60000000.0 / (double)ev->meta.parsed.tempo.uspqn);
break; break;
case 0x54: case 0x54:
printf("SMPTE Offset: %s %02d:%02d:%02d:%02d.%03d", fprintf(out, "SMPTE Offset: %s %02d:%02d:%02d:%02d.%03d",
smpte_rates[(ev->data[3] & 0x60) >> 5], smpte_rates[(ev->data[3] & 0x60) >> 5],
ev->data[3] & 0x1f, ev->data[4], ev->data[5], ev->data[3] & 0x1f, ev->data[4], ev->data[5],
ev->data[6], ev->data[7]); ev->data[6], ev->data[7]);
break; break;
case 0x58: case 0x58:
printf("Time Signature: %d/%d, %d clocks per click, %d notated 32nd notes per quarter note", fprintf(out, "Time Signature: %d/%d, %d clocks per click, %d notated 32nd notes per quarter note",
ev->data[3], (int)pow(2, ev->data[4]), ev->data[5], ev->data[6]); ev->data[3], (int)pow(2, ev->data[4]), ev->data[5], ev->data[6]);
break; break;
case 0x59: case 0x59:
{ {
int sf = ev->data[3]; int sf = ev->data[3];
printf("Key Signature: %d %s: %s", abs(sf), fprintf(out, "Key Signature: %d %s: %s", abs(sf),
sf > 0 ? "sharps" : "flats", sf > 0 ? "sharps" : "flats",
ev->data[4] == 0 ? ev->data[4] == 0 ?
major_keys[SPA_CLAMP(sf + 9, 0, 19)] : major_keys[SPA_CLAMP(sf + 9, 0, 19)] :
@ -683,13 +683,13 @@ int midi_file_dump_event(const struct midi_event *ev)
break; break;
} }
case 0x7f: case 0x7f:
dump_mem("Sequencer", ev->data, ev->size); dump_mem(out, "Sequencer", ev->data, ev->size);
break; break;
default: default:
dump_mem("Invalid", ev->data, ev->size); dump_mem(out, "Invalid", ev->data, ev->size);
} }
break; break;
} }
printf("\n"); fprintf(out, "\n");
return 0; return 0;
} }

View file

@ -61,4 +61,4 @@ int midi_file_read_event(struct midi_file *mf, struct midi_event *event);
int midi_file_write_event(struct midi_file *mf, const struct midi_event *event); int midi_file_write_event(struct midi_file *mf, const struct midi_event *event);
int midi_file_dump_event(const struct midi_event *event); int midi_file_dump_event(FILE *out, const struct midi_event *event);

View file

@ -987,7 +987,7 @@ static int midi_play(struct data *d, void *src, unsigned int n_frames)
midi_file_read_event(d->midi.file, &ev); midi_file_read_event(d->midi.file, &ev);
if (d->verbose) if (d->verbose)
midi_file_dump_event(&ev); midi_file_dump_event(stdout, &ev);
if (ev.data[0] == 0xff) if (ev.data[0] == 0xff)
continue; continue;
@ -1027,7 +1027,7 @@ static int midi_record(struct data *d, void *src, unsigned int n_frames)
ev.size = SPA_POD_BODY_SIZE(&c->value); ev.size = SPA_POD_BODY_SIZE(&c->value);
if (d->verbose) if (d->verbose)
midi_file_dump_event(&ev); midi_file_dump_event(stdout, &ev);
midi_file_write_event(d->midi.file, &ev); midi_file_write_event(d->midi.file, &ev);
} }