2
* Copyright (c) 2004 by Hannu Savolainen < hannu@opensound.com>
4
* This library is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU Lesser General Public License version 2.1 as
6
* published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU Lesser General Public License for more details.
13
* You should have received a copy of the GNU Lesser General Public
14
* License along with this library; if not, write to the Free Software
15
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
midi_out3 (snd_seq_t * seq, int msg, int parm1, int parm2)
27
if (msg < 0 || msg >= 0xff)
29
if (parm1 < 0 || parm1 > 0x7f)
31
if (parm2 < 0 || parm2 > 0x7f)
38
if ((l = write (seq->fd, buf, 3)) != 3)
43
return -EBADE; /* Randomly selected error */
50
midi_out2 (snd_seq_t * seq, int msg, int parm1)
55
if (msg < 0 || msg >= 0xff)
57
if (parm1 < 0 || parm1 > 0x7f)
63
if ((l = write (seq->fd, buf, 2)) != 2)
68
return -EBADE; /* Randomly selected error */
75
convert_event (snd_seq_t * seq, snd_seq_event_t * ev)
80
("Event %2d: flags=%08x tag=%08x, q=%2d, time=%d, src=%x, dst=%x\n",
81
ev->type, ev->flags, ev->tag, ev->queue, ev->time, ev->source, ev->dest);
85
case SND_SEQ_EVENT_CONTROLLER:
86
dbg_printf3 ("\tSND_SEQ_EVENT_CONTRLLER %2d, %3d, %3d\n",
87
ev->data.control.channel,
88
ev->data.control.param, ev->data.control.value);
89
if (ev->data.control.channel > 15)
91
return midi_out3 (seq, 0xB0 + ev->data.control.channel,
92
ev->data.control.param, ev->data.control.value);
95
case SND_SEQ_EVENT_PGMCHANGE:
96
dbg_printf3 ("\tSND_SEQ_EVENT_PGMCHANGE %2d, %3d, %3d\n",
97
ev->data.control.channel,
98
ev->data.control.param, ev->data.control.value);
99
if (ev->data.control.channel > 15)
101
return midi_out2 (seq, 0xC0 + ev->data.control.channel,
102
ev->data.control.value);
105
case SND_SEQ_EVENT_CHANPRESS:
106
dbg_printf3 ("\tSND_SEQ_EVENT_CHANPRESS %2d, %5d\n",
107
ev->data.control.channel, ev->data.control.value);
108
value = ev->data.control.value + 8192;
109
if (ev->data.control.channel > 15)
111
return midi_out3 (seq, 0xD0 + ev->data.control.channel,
112
value & 0x7f, (value >> 7) & 0x7f);
115
case SND_SEQ_EVENT_PITCHBEND:
116
dbg_printf3 ("\tSND_SEQ_EVENT_PITCHBEND %2d, %5d\n",
117
ev->data.control.channel, ev->data.control.value);
118
value = ev->data.control.value + 8192;
119
if (ev->data.control.channel > 15)
121
return midi_out3 (seq, 0xE0 + ev->data.control.channel,
122
value & 0x7f, (value >> 7) & 0x7f);
125
case SND_SEQ_EVENT_NOTEON:
126
dbg_printf3 ("\tSND_SEQ_EVENT_NOTEON %2d, %3d, %d\n",
127
ev->data.note.channel,
128
ev->data.note.note, ev->data.note.velocity);
129
if (ev->data.control.channel > 15)
131
return midi_out3 (seq, 0x90 + ev->data.note.channel,
132
ev->data.note.note, ev->data.note.velocity);
135
case SND_SEQ_EVENT_NOTEOFF:
136
dbg_printf3 ("\tSND_SEQ_EVENT_NOTEOFF %2d, %3d, %d\n",
137
ev->data.note.channel,
138
ev->data.note.note, ev->data.note.velocity);
139
if (ev->data.control.channel > 15)
141
return midi_out3 (seq, 0x80 + ev->data.note.channel,
142
ev->data.note.note, ev->data.note.velocity);
145
case SND_SEQ_EVENT_KEYPRESS:
146
dbg_printf3 ("\tSND_SEQ_EVENT_KEYPRESS %2d, %3d, %d\n",
147
ev->data.note.channel,
148
ev->data.note.note, ev->data.note.velocity);
149
if (ev->data.control.channel > 15)
151
return midi_out3 (seq, 0xA0 + ev->data.note.channel,
152
ev->data.note.note, ev->data.note.velocity);
155
case SND_SEQ_EVENT_SYSTEM:
156
dbg_printf ("\tSND_SEQ_EVENT_SYSTEM\n");
158
case SND_SEQ_EVENT_RESULT:
159
dbg_printf ("\tSND_SEQ_EVENT_RESULT\n");
161
case SND_SEQ_EVENT_NOTE:
162
dbg_printf ("\tSND_SEQ_EVENT_NOTE\n");
164
case SND_SEQ_EVENT_CONTROL14:
165
dbg_printf ("\tSND_SEQ_EVENT_CONTROL14\n");
167
case SND_SEQ_EVENT_NONREGPARAM:
168
dbg_printf ("\tSND_SEQ_EVENT_NONREGPARAM\n");
170
case SND_SEQ_EVENT_REGPARAM:
171
dbg_printf ("\tSND_SEQ_EVENT_REGPARAM\n");
173
case SND_SEQ_EVENT_SONGPOS:
174
dbg_printf ("\tSND_SEQ_EVENT_SONGPOS\n");
176
case SND_SEQ_EVENT_SONGSEL:
177
dbg_printf ("\tSND_SEQ_EVENT_SONGSEL\n");
179
case SND_SEQ_EVENT_QFRAME:
180
dbg_printf ("\tSND_SEQ_EVENT_QFRAME\n");
182
case SND_SEQ_EVENT_TIMESIGN:
183
dbg_printf ("\tSND_SEQ_EVENT_TIMESIGN\n");
185
case SND_SEQ_EVENT_KEYSIGN:
186
dbg_printf ("\tSND_SEQ_EVENT_KEYSIGN\n");
188
case SND_SEQ_EVENT_START:
189
dbg_printf ("\tSND_SEQ_EVENT_START\n");
191
case SND_SEQ_EVENT_CONTINUE:
192
dbg_printf ("\tSND_SEQ_EVENT_CONTINUE\n");
194
case SND_SEQ_EVENT_STOP:
195
dbg_printf ("\tSND_SEQ_EVENT_STOP\n");
197
case SND_SEQ_EVENT_SETPOS_TICK:
198
dbg_printf ("\tSND_SEQ_EVENT_SETPOS_TICK\n");
200
case SND_SEQ_EVENT_SETPOS_TIME:
201
dbg_printf ("\tSND_SEQ_EVENT_SETPOS_TIME\n");
203
case SND_SEQ_EVENT_TEMPO:
204
dbg_printf ("\tSND_SEQ_EVENT_TEMPO\n");
206
case SND_SEQ_EVENT_CLOCK:
207
dbg_printf ("\tSND_SEQ_EVENT_CLOCK\n");
209
case SND_SEQ_EVENT_TICK:
210
dbg_printf ("\tSND_SEQ_EVENT_TICK\n");
212
case SND_SEQ_EVENT_QUEUE_SKEW:
213
dbg_printf ("\tSND_SEQ_EVENT_QUEUE_SKEW\n");
215
case SND_SEQ_EVENT_SYNC_POS:
216
dbg_printf ("\tSND_SEQ_EVENT_SYNC_POS\n");
218
case SND_SEQ_EVENT_TUNE_REQUEST:
219
dbg_printf ("\tSND_SEQ_EVENT_TUNE_REQUEST\n");
221
case SND_SEQ_EVENT_RESET:
222
dbg_printf ("\tSND_SEQ_EVENT_RESET\n");
224
case SND_SEQ_EVENT_SENSING:
225
dbg_printf ("\tSND_SEQ_EVENT_SENSING\n");
227
case SND_SEQ_EVENT_ECHO:
228
dbg_printf ("\tSND_SEQ_EVENT_ECHO\n");
230
case SND_SEQ_EVENT_OSS:
231
dbg_printf ("\tSND_SEQ_EVENT_OSS\n");
233
case SND_SEQ_EVENT_CLIENT_START:
234
dbg_printf ("\tSND_SEQ_EVENT_CLIENT_START\n");
236
case SND_SEQ_EVENT_CLIENT_EXIT:
237
dbg_printf ("\tSND_SEQ_EVENT_CLIENT_EXIT\n");
239
case SND_SEQ_EVENT_CLIENT_CHANGE:
240
dbg_printf ("\tSND_SEQ_EVENT_CLIENT_CHANGE\n");
242
case SND_SEQ_EVENT_PORT_START:
243
dbg_printf ("\tSND_SEQ_EVENT_PORT_START\n");
245
case SND_SEQ_EVENT_PORT_EXIT:
246
dbg_printf ("\tSND_SEQ_EVENT_PORT_EXIT\n");
248
case SND_SEQ_EVENT_PORT_CHANGE:
249
dbg_printf ("\tSND_SEQ_EVENT_PORT_CHANGE\n");
251
case SND_SEQ_EVENT_PORT_SUBSCRIBED:
252
dbg_printf ("\tSND_SEQ_EVENT_PORT_SUBSCRIBED\n");
254
case SND_SEQ_EVENT_PORT_UNSUBSCRIBED:
255
dbg_printf ("\tSND_SEQ_EVENT_PORT_UNSUBSCRIBED\n");
257
case SND_SEQ_EVENT_USR0:
258
dbg_printf ("\tSND_SEQ_EVENT_USR0\n");
260
case SND_SEQ_EVENT_USR1:
261
dbg_printf ("\tSND_SEQ_EVENT_USR1\n");
263
case SND_SEQ_EVENT_USR2:
264
dbg_printf ("\tSND_SEQ_EVENT_USR2\n");
266
case SND_SEQ_EVENT_USR3:
267
dbg_printf ("\tSND_SEQ_EVENT_USR3\n");
269
case SND_SEQ_EVENT_USR4:
270
dbg_printf ("\tSND_SEQ_EVENT_USR4\n");
272
case SND_SEQ_EVENT_USR5:
273
dbg_printf ("\tSND_SEQ_EVENT_USR5\n");
275
case SND_SEQ_EVENT_USR6:
276
dbg_printf ("\tSND_SEQ_EVENT_USR6\n");
278
case SND_SEQ_EVENT_USR7:
279
dbg_printf ("\tSND_SEQ_EVENT_USR7\n");
281
case SND_SEQ_EVENT_USR8:
282
dbg_printf ("\tSND_SEQ_EVENT_USR8\n");
284
case SND_SEQ_EVENT_USR9:
285
dbg_printf ("\tSND_SEQ_EVENT_USR9\n");
287
case SND_SEQ_EVENT_SYSEX:
288
dbg_printf ("\tSND_SEQ_EVENT_SYSEX\n");
290
case SND_SEQ_EVENT_BOUNCE:
291
dbg_printf ("\tSND_SEQ_EVENT_BOUNCE\n");
293
case SND_SEQ_EVENT_USR_VAR0:
294
dbg_printf ("\tSND_SEQ_EVENT_USR_VAR0\n");
296
case SND_SEQ_EVENT_USR_VAR1:
297
dbg_printf ("\tSND_SEQ_EVENT_USR_VAR1\n");
299
case SND_SEQ_EVENT_USR_VAR2:
300
dbg_printf ("\tSND_SEQ_EVENT_USR_VAR2\n");
302
case SND_SEQ_EVENT_USR_VAR3:
303
dbg_printf ("\tSND_SEQ_EVENT_USR_VAR3\n");
305
case SND_SEQ_EVENT_USR_VAR4:
306
dbg_printf ("\tSND_SEQ_EVENT_USR_VAR4\n");
308
case SND_SEQ_EVENT_NONE:
309
dbg_printf ("\tSND_SEQ_EVENT_NONE\n");
312
dbg_printf ("\tUnknown event type %d\n", ev->type);