analyse_midi_keyboard.c 1.55 KB
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <signal.h>
#include <getopt.h>
#include <sys/poll.h>
#include <alsa/asoundlib.h>



#define NUM_PORT 24

static snd_seq_t *seq;

static void init_seq(void)
{
	int err;

	/* open sequencer */
	err = snd_seq_open(&seq, "default", SND_SEQ_OPEN_DUPLEX, 0);
	if (err<0) printf("open sequencer");

	/* set our client's name */
	err = snd_seq_set_client_name(seq, "analyseurmidi");
	if (err<0) printf("set client name");
}

static void create_port(void)
{
	int err;

	err = snd_seq_create_simple_port(seq, "analyseurmidi",
					 SND_SEQ_PORT_CAP_WRITE |
					 SND_SEQ_PORT_CAP_SUBS_WRITE,
					 SND_SEQ_PORT_TYPE_MIDI_GENERIC |
					 SND_SEQ_PORT_TYPE_APPLICATION);
	if (err<0)
	  printf("Port non créé \n");
}

static void connect_port(void)
{
	int err;
	err = snd_seq_connect_from(seq, 0, NUM_PORT, 0);
	if (err < 0)
	  printf("Impossible de se connecter au port \n");
			      
}


int main(){
  init_seq();
  struct pollfd *pfds;
  int npfds, err;
  create_port();
  connect_port();

	npfds = snd_seq_poll_descriptors_count(seq, POLLIN);
	pfds = alloca(sizeof(*pfds) * npfds);
	for (;;) {
		snd_seq_poll_descriptors(seq, pfds, npfds, POLLIN);
		if (poll(pfds, npfds, -1) < 0)
			break;
		do {
			snd_seq_event_t *event;
			err = snd_seq_event_input(seq, &event);
			if (err < 0)
				break;
			if (event)
			  {
			    if (event->type == SND_SEQ_EVENT_NOTEON) printf("coucou %d\n",event->data.note.note);
			  }
		} while (err > 0);
		fflush(stdout);
   }

  
  
  snd_seq_close(seq);
  
  return 0;
}