analyse_midi_keyboard.c
2.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#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 20
static snd_seq_t *seq;
int NUM_PORT;
typedef struct {
int type;
int note;
int velocity;
} Evenement;
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");
}
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;
}
void boucle(){
Evenement k;
struct pollfd *pfds;
int npfds, err;
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);
}
}
int lancer(){
recup_num();
init_seq();
create_port();
connect_port();
boucle();
snd_seq_close(seq);
return 0;
}