analyse_midi_keyboard.c 2.24 KB
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.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;



void recup_num(){
	FILE* fd;
	int num_port;
	fd=fopen("num_count2.txt","r");
	fscanf(fd, "%d", &num_port);
	printf("num = %d \n", num_port);
	fclose(fd); 

}

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");
			      
}

void action(snd_seq_event_t *event){
	
		if (event->type == SND_SEQ_EVENT_NOTEON) 
			{
				printf("note :  %d , velocite : %d\n",event->data.note.note, event->data.note.velocity);
			}
		if (event->type == SND_SEQ_EVENT_NOTEOFF) 
			{
				printf("noteOFF : %2d , %d velocite : %d\n", event->data.note.channel, event->data.note.note, event->data.note.velocity);
			}
		if (event->type == SND_SEQ_EVENT_CONTROLLER)
			{
				printf("programme : %2d, %d %d\n", event->data.control.channel, event->data.control.param, event->data.control.value);
			}

}

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)
			  {
				action(event);
			  }
		} while (err > 0);
		fflush(stdout);
   }

  
  
  snd_seq_close(seq);


	recup_num();	
 
  return 0;
}