cmd midi seems to work
This commit is contained in:
parent
2a6619fa5d
commit
958704bcd0
@ -211,7 +211,7 @@ static void data_callback(ma_device* pDevice, void* pOutput, const void* pInput,
|
|||||||
x_buf[BLOCK_SIZE * k + j] = in_buf[ix];
|
x_buf[BLOCK_SIZE * k + j] = in_buf[ix];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (NUM_NON_OPT_CHANNELS_IN > NUM_CHANNELS_IN) || (NUM_NON_OPT_CHANNELS_OUT > NUM_CHANNELS_OUT)
|
#if NUM_NON_OPT_CHANNELS_IN > NUM_CHANNELS_IN
|
||||||
memset(zero, 0, BLOCK_SIZE * sizeof(float));
|
memset(zero, 0, BLOCK_SIZE * sizeof(float));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
#define NUM_ALL_CHANNELS_IN {{=it.product.buses.filter(x => x.type == "audio" && x.direction == "input").reduce((a, x) => a + (x.channels == "mono" ? 1 : 2), 0)}}
|
#define NUM_ALL_CHANNELS_IN {{=it.product.buses.filter(x => x.type == "audio" && x.direction == "input").reduce((a, x) => a + (x.channels == "mono" ? 1 : 2), 0)}}
|
||||||
#define NUM_ALL_CHANNELS_OUT {{=it.product.buses.filter(x => x.type == "audio" && x.direction == "output").reduce((a, x) => a + (x.channels == "mono" ? 1 : 2), 0)}}
|
#define NUM_ALL_CHANNELS_OUT {{=it.product.buses.filter(x => x.type == "audio" && x.direction == "output").reduce((a, x) => a + (x.channels == "mono" ? 1 : 2), 0)}}
|
||||||
|
|
||||||
|
#define MIDI_BUS_IN {{=it.product.buses.findIndex(x => x.type == "midi" && x.direction == "input")}}
|
||||||
|
|
||||||
#define NUM_MIDI_INPUTS {{=it.product.buses.filter(x => x.type == "midi" && x.direction == "input").length}}
|
#define NUM_MIDI_INPUTS {{=it.product.buses.filter(x => x.type == "midi" && x.direction == "input").length}}
|
||||||
|
|
||||||
#define MIDI_BUS_IN {{=it.product.buses.findIndex(x => x.type == "midi" && x.direction == "input")}}
|
#define MIDI_BUS_IN {{=it.product.buses.findIndex(x => x.type == "midi" && x.direction == "input")}}
|
||||||
|
@ -49,9 +49,11 @@ const char * outfile = NULL;
|
|||||||
const char * midifile = NULL;
|
const char * midifile = NULL;
|
||||||
void * midi_data = NULL;
|
void * midi_data = NULL;
|
||||||
struct midi_parser midi_parser;
|
struct midi_parser midi_parser;
|
||||||
enum midi_parser_status midi_status;
|
|
||||||
int16_t midi_ticks = 0;
|
int16_t midi_ticks = 0;
|
||||||
uint32_t midi_tempo = 500000; // microseconds per quarter-note -> 120 bpm
|
uint32_t midi_tempo = 500000; // microseconds per quarter-note -> 120 bpm
|
||||||
|
enum midi_parser_status midi_status;
|
||||||
|
double midi_next;
|
||||||
|
char midi_next_read;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void usage(const char * argv0) {
|
void usage(const char * argv0) {
|
||||||
@ -403,18 +405,11 @@ int main(int argc, char * argv[]) {
|
|||||||
midi_parser.size = midi_data_size;
|
midi_parser.size = midi_data_size;
|
||||||
midi_parser.in = midi_data;
|
midi_parser.in = midi_data;
|
||||||
|
|
||||||
char done = 0;
|
|
||||||
while (!done) {
|
|
||||||
midi_status = midi_parse(&midi_parser);
|
midi_status = midi_parse(&midi_parser);
|
||||||
switch (midi_status) {
|
if (midi_status != MIDI_PARSER_HEADER) {
|
||||||
case MIDI_PARSER_EOB:
|
fprintf(stderr, "Header not found in MIDI file\n");
|
||||||
done = 1;
|
|
||||||
break;
|
|
||||||
case MIDI_PARSER_ERROR:
|
|
||||||
fprintf(stderr, "Error while parsing MIDI file\n");
|
|
||||||
goto err_midi_parse;
|
goto err_midi_parse;
|
||||||
break;
|
}
|
||||||
case MIDI_PARSER_HEADER:
|
|
||||||
if (midi_parser.header.format != 0) {
|
if (midi_parser.header.format != 0) {
|
||||||
fprintf(stderr, "Only MIDI file format 0 is supported\n");
|
fprintf(stderr, "Only MIDI file format 0 is supported\n");
|
||||||
goto err_midi_parse;
|
goto err_midi_parse;
|
||||||
@ -427,16 +422,14 @@ int main(int argc, char * argv[]) {
|
|||||||
fprintf(stderr, "Invalid 0 tick per quarter-note in MIDI file\n");
|
fprintf(stderr, "Invalid 0 tick per quarter-note in MIDI file\n");
|
||||||
goto err_midi_parse;
|
goto err_midi_parse;
|
||||||
}
|
}
|
||||||
|
|
||||||
midi_ticks = midi_parser.header.time_division;
|
midi_ticks = midi_parser.header.time_division;
|
||||||
break;
|
midi_next = 0.0;
|
||||||
case MIDI_PARSER_TRACK_META:
|
midi_next_read = 1;
|
||||||
case MIDI_PARSER_TRACK_MIDI:
|
} else {
|
||||||
done = 1;
|
midi_status = MIDI_PARSER_EOB;
|
||||||
break;
|
midi_next = 0.0;
|
||||||
default:
|
midi_next_read = 0;
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -451,44 +444,76 @@ int main(int argc, char * argv[]) {
|
|||||||
int32_t n = tinywav_read_f(&tw_in, x, bufsize);
|
int32_t n = tinywav_read_f(&tw_in, x, bufsize);
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
break;
|
break;
|
||||||
#if (NUM_NON_OPT_CHANNELS_IN > NUM_CHANNELS_IN) || (NUM_NON_OPT_CHANNELS_OUT > NUM_CHANNELS_OUT)
|
|
||||||
|
# if NUM_NON_OPT_CHANNELS_IN > NUM_CHANNELS_IN
|
||||||
memset(zero, 0, bufsize * sizeof(float));
|
memset(zero, 0, bufsize * sizeof(float));
|
||||||
#endif
|
|
||||||
plugin_process(&instance, (const float **)x, y, n);
|
|
||||||
# if PARAMETERS_N > 0
|
|
||||||
for (size_t j = 0; j < PARAMETERS_N; j++) {
|
|
||||||
if (!param_data[j].out)
|
|
||||||
continue;
|
|
||||||
param_values[j] = plugin_get_parameter(&instance, j);
|
|
||||||
printf(" %s: %g\n", param_data[j].id, param_values[j]);
|
|
||||||
}
|
|
||||||
# endif
|
# endif
|
||||||
# if NUM_CHANNELS_OUT > 0
|
|
||||||
tinywav_write_f(&tw_out, y, n);
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
size_t len = (size_t)(tw_in.h.SampleRate * length + 0.5f);
|
size_t len = (size_t)(tw_in.h.SampleRate * length + 0.5f);
|
||||||
while (i < len) {
|
while (i < len) {
|
||||||
size_t left = len - i;
|
size_t left = len - i;
|
||||||
size_t n = left > bufsize ? bufsize : left;
|
size_t n = left > bufsize ? bufsize : left;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if NUM_MIDI_INPUTS > 0
|
||||||
|
while (1) {
|
||||||
|
if (midi_next > 0.0)
|
||||||
|
break;
|
||||||
|
else if (midi_next_read == 0) {
|
||||||
|
if (midi_status == MIDI_PARSER_TRACK_META && midi_parser.meta.type == MIDI_META_SET_TEMPO)
|
||||||
|
midi_tempo = (midi_parser.meta.bytes[0] << 16) | (midi_parser.meta.bytes[1] << 8) | midi_parser.meta.bytes[2];
|
||||||
|
else if (midi_status == MIDI_PARSER_TRACK_MIDI) {
|
||||||
|
uint8_t data[3] = { (midi_parser.midi.status << 4) | midi_parser.midi.channel, midi_parser.midi.param1, midi_parser.midi.param2 };
|
||||||
|
plugin_midi_msg_in(&instance, MIDI_BUS_IN, data);
|
||||||
|
}
|
||||||
|
midi_next_read = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (midi_status == MIDI_PARSER_EOB)
|
||||||
|
break;
|
||||||
|
|
||||||
|
midi_status = midi_parse(&midi_parser);
|
||||||
|
switch (midi_status) {
|
||||||
|
case MIDI_PARSER_ERROR:
|
||||||
|
case MIDI_PARSER_HEADER:
|
||||||
|
fprintf(stderr, "Error while parsing MIDI file\n");
|
||||||
|
goto err_midi_parse;
|
||||||
|
break;
|
||||||
|
case MIDI_PARSER_TRACK_META:
|
||||||
|
case MIDI_PARSER_TRACK_MIDI:
|
||||||
|
case MIDI_PARSER_TRACK_SYSEX:
|
||||||
|
midi_next += ((double)midi_tempo / (double)midi_ticks) * midi_parser.vtime;
|
||||||
|
midi_next_read = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
midi_next -= 1e6 * ((double)n / (double)tw_in.h.SampleRate);
|
||||||
|
#endif
|
||||||
|
|
||||||
plugin_process(&instance, (const float **)x, y, n);
|
plugin_process(&instance, (const float **)x, y, n);
|
||||||
# if PARAMETERS_N > 0
|
|
||||||
|
#if PARAMETERS_N > 0
|
||||||
for (size_t j = 0; j < PARAMETERS_N; j++) {
|
for (size_t j = 0; j < PARAMETERS_N; j++) {
|
||||||
if (!param_data[j].out)
|
if (!param_data[j].out)
|
||||||
continue;
|
continue;
|
||||||
param_values[j] = plugin_get_parameter(&instance, j);
|
param_values[j] = plugin_get_parameter(&instance, j);
|
||||||
printf(" %s: %g\n", param_data[j].id, param_values[j]);
|
printf(" %s: %g\n", param_data[j].id, param_values[j]);
|
||||||
}
|
}
|
||||||
# endif
|
|
||||||
# if NUM_CHANNELS_OUT > 0
|
|
||||||
tinywav_write_f(&tw_out, y, n);
|
|
||||||
# endif
|
|
||||||
i += n;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if NUM_CHANNELS_OUT > 0
|
||||||
|
tinywav_write_f(&tw_out, y, n);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if NUM_CHANNELS_IN == 0
|
||||||
|
i += n;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
exit_code = EXIT_SUCCESS;
|
exit_code = EXIT_SUCCESS;
|
||||||
|
|
||||||
#if NUM_CHANNELS_OUT > 0
|
#if NUM_CHANNELS_OUT > 0
|
||||||
|
Loading…
Reference in New Issue
Block a user