Brian Dunn wrote:
I would like a converter program that would recive my
juno's sySex
and output controler data on whatever controler # and midi channel
i choose, in realtime.
The program below converts the SysEx commands that are output by
Joost's juno_rose utility (I don't have a Juno). To use a specific
channel, change the "data[3]" to a fixed value.
Clemens
--
/* compile with gcc -o junosliders junosliders.c -lasound */
#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>
#define CHECK(cmd) check(cmd, #cmd)
void check(int err, const char *cmd)
{
if (err < 0) {
fprintf(stderr, "%s failed: %s\n", cmd, snd_strerror(err));
exit(EXIT_FAILURE);
}
}
int main()
{
snd_seq_t *seq;
int port;
snd_seq_event_t *ev;
CHECK(snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, 0));
CHECK(snd_seq_set_client_name(seq, "Juno SysEx->CC"));
CHECK(port = snd_seq_create_simple_port(seq, "Juno SysEx->CC",
SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_WRITE |
SND_SEQ_PORT_CAP_DUPLEX |
SND_SEQ_PORT_CAP_SUBS_READ | SND_SEQ_PORT_CAP_SUBS_WRITE,
SND_SEQ_PORT_TYPE_MIDI_GENERIC));
while (snd_seq_event_input(seq, &ev) >= 0) {
if (ev->type == SND_SEQ_EVENT_SYSEX && ev->data.ext.len >= 7) {
unsigned char *data = ev->data.ext.ptr;
if (data[0] == 0xf0 && data[1] == 0x41 && data[2] == 0x32) {
snd_seq_ev_clear(ev);
snd_seq_ev_set_controller(ev,
data[3], /* channel */
data[4] + 0x10, /* parameter number */
data[5]); /* value */
}
}
snd_seq_ev_set_subs(ev);
snd_seq_ev_set_source(ev, port);
snd_seq_ev_set_direct(ev);
snd_seq_event_output(seq, ev);
snd_seq_drain_output(seq);
}
return 0;
}