analyse_midi_keyboard.c
2.44 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
#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);
}
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");
}
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");
}
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;
}
Evenement wait_event(){
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)
{
return action(event);
}
} while (err > 0);
fflush(stdout);
}
}
void close_sequencer(){
snd_seq_close(seq);
}