Renato Budinich wrote:
> I would like to write a program which does the following:
>
> detect the input events generated by a usb device which i own - the Rig
> Kontrol 2 from Native Instruments which is a pedal board intended for
> guitar use and which already has a linux driver - and trigger with those
> midi messages; i.e, pushing a button would create a midi note on/off,
> rolling the pedal a midi CC.
Something like this?
HTH
Clemens
/* compile with -lasound */
#include <linux/input.h>
#include <alsa/asoundlib.h>
#include <fcntl.h>
#include <stdio.h>
#define INPUT_DEVICE "/dev/input/by-path/platform-i8042-serio-0-event-kbd"
#define CHANNEL 0
#define NOTE_A 48
#define NOTE_B 52
#define CONTROLLER_X 92
int main(void)
{
struct input_event ie;
int fd, port, err;
snd_seq_t *seq;
snd_seq_event_t ev;
fd = open(INPUT_DEVICE, O_RDONLY);
if (fd == -1) {
perror(INPUT_DEVICE);
return 1;
}
err = snd_seq_open(&seq, "default", SND_SEQ_OPEN_OUTPUT, 0);
if (err < 0) {
fprintf(stderr, "cannot open sequencer: %s\n",
snd_strerror(err));
return 1;
}
snd_seq_set_client_name(seq, "Input/MIDI converter");
port = snd_seq_create_simple_port(seq, "Port 1",
SND_SEQ_PORT_CAP_READ |
SND_SEQ_PORT_CAP_SUBS_READ,
SND_SEQ_PORT_TYPE_MIDI_GENERIC |
SND_SEQ_PORT_TYPE_SOFTWARE);
if (port < 0) {
fprintf(stderr, "cannot create port: %s\n", snd_strerror(port));
return 1;
}
snd_seq_ev_clear(&ev);
snd_seq_ev_set_source(&ev, port);
snd_seq_ev_set_subs(&ev);
snd_seq_ev_set_direct(&ev);
for (;;) {
if (read(fd, &ie, sizeof(ie)) != sizeof(ie))
break;
ev.type = SND_SEQ_EVENT_NONE;
switch (ie.type) {
case EV_KEY:
switch (ie.code) {
case KEY_A:
if (ie.value)
snd_seq_ev_set_noteon(&ev, CHANNEL,
NOTE_A, 127);
else
snd_seq_ev_set_noteoff(&ev, CHANNEL,
NOTE_A, 64);
break;
case KEY_B:
if (ie.value)
snd_seq_ev_set_noteon(&ev, CHANNEL,
NOTE_B, 127);
else
snd_seq_ev_set_noteoff(&ev, CHANNEL,
NOTE_B, 64);
break;
}
break;
case EV_ABS:
switch (ie.code) {
case ABS_X:
/* value 0..127 */
snd_seq_ev_set_controller(&ev, CHANNEL,
CONTROLLER_X, ie.value);
break;
}
break;
}
if (ev.type != SND_SEQ_EVENT_NONE)
snd_seq_event_output_direct(seq, &ev);
}
snd_seq_close(seq);
close(fd);
return 0;
}
_______________________________________________
Linux-audio-dev mailing list
[email protected]
http://lists.linuxaudio.org/mailman/listinfo/linux-audio-dev