Blame view

analyse_midi_keyboard.c 2.44 KB
73746090   aarnaude   midi vivian
1
2
3
  #include <stdio.h>
  #include <stdlib.h>
  #include <stdarg.h>
30f3c908   aarnaude   analyse flux midi
4
5
6
  #include <stdio.h>
  #include <stdbool.h>
  #include <stdlib.h>
73746090   aarnaude   midi vivian
7
8
9
10
11
12
13
14
  #include <string.h>
  #include <signal.h>
  #include <getopt.h>
  #include <sys/poll.h>
  #include <alsa/asoundlib.h>
  
  
  
8ebe9c5f   aarnaude   analyse midi
15
  //#define NUM_PORT 20
73746090   aarnaude   midi vivian
16
  
30f3c908   aarnaude   analyse flux midi
17
  
8ebe9c5f   aarnaude   analyse midi
18
19
20
21
22
23
24
  static snd_seq_t *seq;
  int NUM_PORT;
  typedef struct {
  	int type;
  	int note;
  	int velocity;	
  } Evenement;
30f3c908   aarnaude   analyse flux midi
25
26
27
  
  void recup_num(){
  	FILE* fd;
8ebe9c5f   aarnaude   analyse midi
28
  	//int NUM_PORT;
30f3c908   aarnaude   analyse flux midi
29
  	fd=fopen("num_count2.txt","r");
8ebe9c5f   aarnaude   analyse midi
30
  	fscanf(fd, "%d", &NUM_PORT);
9517040e   aarnaude   live avec le clav...
31
  	//printf("num = %d \n", NUM_PORT);
30f3c908   aarnaude   analyse flux midi
32
33
34
35
  	fclose(fd); 
  
  }
  
9517040e   aarnaude   live avec le clav...
36
  void init_seq(void)
73746090   aarnaude   midi vivian
37
38
39
40
41
42
43
44
45
46
47
48
  {
  	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");
  }
  
9517040e   aarnaude   live avec le clav...
49
  void create_port(void)
73746090   aarnaude   midi vivian
50
51
52
53
  {
  	int err;
  
  	err = snd_seq_create_simple_port(seq, "analyseurmidi",
8ebe9c5f   aarnaude   analyse midi
54
55
56
57
  			SND_SEQ_PORT_CAP_WRITE |
  			SND_SEQ_PORT_CAP_SUBS_WRITE,
  			SND_SEQ_PORT_TYPE_MIDI_GENERIC |
  			SND_SEQ_PORT_TYPE_APPLICATION);
73746090   aarnaude   midi vivian
58
  	if (err<0)
8ebe9c5f   aarnaude   analyse midi
59
  		printf("Port non créé \n");
73746090   aarnaude   midi vivian
60
61
  }
  
9517040e   aarnaude   live avec le clav...
62
  void connect_port(void)
73746090   aarnaude   midi vivian
63
64
65
66
  {
  	int err;
  	err = snd_seq_connect_from(seq, 0, NUM_PORT, 0);
  	if (err < 0)
8ebe9c5f   aarnaude   analyse midi
67
  		printf("Impossible de se connecter au port \n");
30f3c908   aarnaude   analyse flux midi
68
69
  
  }
73746090   aarnaude   midi vivian
70
  
8ebe9c5f   aarnaude   analyse midi
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
  Evenement action(snd_seq_event_t *event){
  	Evenement k;
  	if (event->type == SND_SEQ_EVENT_NOTEON) 
  	{
  		k.type=0;
  		k.note=event->data.note.note;
  		k.velocity=event->data.note.velocity;
  		//printf("note :  %d , velocite : %d\n",event->data.note.note, event->data.note.velocity);
  		return k;
  	}
  	if (event->type == SND_SEQ_EVENT_NOTEOFF) 
  	{
  		k.type=1;
  		k.note=event->data.note.note;
  		k.velocity=event->data.note.velocity;
  		//printf("noteOFF : %2d , %d velocite : %d\n", event->data.note.channel, event->data.note.note, event->data.note.velocity);
  		return k;
  	}
  /*	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);
  	}*/
  	return k;
  }
73746090   aarnaude   midi vivian
95
  
9517040e   aarnaude   live avec le clav...
96
  Evenement wait_event(){
8ebe9c5f   aarnaude   analyse midi
97
98
  	struct pollfd *pfds;
  	int npfds, err;
73746090   aarnaude   midi vivian
99
100
101
102
103
104
105
106
107
108
109
110
  	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)
8ebe9c5f   aarnaude   analyse midi
111
  			{
9517040e   aarnaude   live avec le clav...
112
  				return action(event);
8ebe9c5f   aarnaude   analyse midi
113
  			}
73746090   aarnaude   midi vivian
114
115
  		} while (err > 0);
  		fflush(stdout);
8ebe9c5f   aarnaude   analyse midi
116
  	}
9517040e   aarnaude   live avec le clav...
117
  	
73746090   aarnaude   midi vivian
118
  
8ebe9c5f   aarnaude   analyse midi
119
  }
30f3c908   aarnaude   analyse flux midi
120
121
  
  
9517040e   aarnaude   live avec le clav...
122
  void close_sequencer(){
8ebe9c5f   aarnaude   analyse midi
123
  	snd_seq_close(seq);
73746090   aarnaude   midi vivian
124
  }