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)
44
return -EBADE; /* Randomly selected error */
45
#elif defined(EGRATUITOUS)
46
return -EGRATUITOUS; /* Randomly selected error */
48
return -EIO; /* Randomly selected error */
56
midi_out2 (snd_seq_t * seq, int msg, int parm1)
61
if (msg < 0 || msg >= 0xff)
63
if (parm1 < 0 || parm1 > 0x7f)
69
if ((l = write (seq->fd, buf, 2)) != 2)
75
return -EBADE; /* Randomly selected error */
76
#elif defined(EGRATUITOUS)
77
return -EGRATUITOUS; /* Randomly selected error */
79
return -EIO; /* Randomly selected error */
87
convert_event (snd_seq_t * seq, snd_seq_event_t * ev)
92
("Event %2d: flags=%08x tag=%08x, q=%2d, time=%d, src=%x, dst=%x\n",
93
ev->type, ev->flags, ev->tag, ev->queue, ev->time.tick, ev->source, ev->dest);
97
case SND_SEQ_EVENT_CONTROLLER:
98
dbg_printf3 ("\tSND_SEQ_EVENT_CONTRLLER %2d, %3d, %3d\n",
99
ev->data.control.channel,
100
ev->data.control.param, ev->data.control.value);
101
if (ev->data.control.channel > 15)
103
return midi_out3 (seq, 0xB0 + ev->data.control.channel,
104
ev->data.control.param, ev->data.control.value);
107
case SND_SEQ_EVENT_PGMCHANGE:
108
dbg_printf3 ("\tSND_SEQ_EVENT_PGMCHANGE %2d, %3d, %3d\n",
109
ev->data.control.channel,
110
ev->data.control.param, ev->data.control.value);
111
if (ev->data.control.channel > 15)
113
return midi_out2 (seq, 0xC0 + ev->data.control.channel,
114
ev->data.control.value);
117
case SND_SEQ_EVENT_CHANPRESS:
118
dbg_printf3 ("\tSND_SEQ_EVENT_CHANPRESS %2d, %5d\n",
119
ev->data.control.channel, ev->data.control.value);
120
value = ev->data.control.value + 8192;
121
if (ev->data.control.channel > 15)
123
return midi_out3 (seq, 0xD0 + ev->data.control.channel,
124
value & 0x7f, (value >> 7) & 0x7f);
127
case SND_SEQ_EVENT_PITCHBEND:
128
dbg_printf3 ("\tSND_SEQ_EVENT_PITCHBEND %2d, %5d\n",
129
ev->data.control.channel, ev->data.control.value);
130
value = ev->data.control.value + 8192;
131
if (ev->data.control.channel > 15)
133
return midi_out3 (seq, 0xE0 + ev->data.control.channel,
134
value & 0x7f, (value >> 7) & 0x7f);
137
case SND_SEQ_EVENT_NOTEON:
138
dbg_printf3 ("\tSND_SEQ_EVENT_NOTEON %2d, %3d, %d\n",
139
ev->data.note.channel,
140
ev->data.note.note, ev->data.note.velocity);
141
if (ev->data.control.channel > 15)
143
return midi_out3 (seq, 0x90 + ev->data.note.channel,
144
ev->data.note.note, ev->data.note.velocity);
147
case SND_SEQ_EVENT_NOTEOFF:
148
dbg_printf3 ("\tSND_SEQ_EVENT_NOTEOFF %2d, %3d, %d\n",
149
ev->data.note.channel,
150
ev->data.note.note, ev->data.note.velocity);
151
if (ev->data.control.channel > 15)
153
return midi_out3 (seq, 0x80 + ev->data.note.channel,
154
ev->data.note.note, ev->data.note.velocity);
157
case SND_SEQ_EVENT_KEYPRESS:
158
dbg_printf3 ("\tSND_SEQ_EVENT_KEYPRESS %2d, %3d, %d\n",
159
ev->data.note.channel,
160
ev->data.note.note, ev->data.note.velocity);
161
if (ev->data.control.channel > 15)
163
return midi_out3 (seq, 0xA0 + ev->data.note.channel,
164
ev->data.note.note, ev->data.note.velocity);
167
case SND_SEQ_EVENT_SYSTEM:
168
dbg_printf ("\tSND_SEQ_EVENT_SYSTEM\n");
170
case SND_SEQ_EVENT_RESULT:
171
dbg_printf ("\tSND_SEQ_EVENT_RESULT\n");
173
case SND_SEQ_EVENT_NOTE:
174
dbg_printf ("\tSND_SEQ_EVENT_NOTE\n");
176
case SND_SEQ_EVENT_CONTROL14:
177
dbg_printf ("\tSND_SEQ_EVENT_CONTROL14\n");
179
case SND_SEQ_EVENT_NONREGPARAM:
180
dbg_printf ("\tSND_SEQ_EVENT_NONREGPARAM\n");
182
case SND_SEQ_EVENT_REGPARAM:
183
dbg_printf ("\tSND_SEQ_EVENT_REGPARAM\n");
185
case SND_SEQ_EVENT_SONGPOS:
186
dbg_printf ("\tSND_SEQ_EVENT_SONGPOS\n");
188
case SND_SEQ_EVENT_SONGSEL:
189
dbg_printf ("\tSND_SEQ_EVENT_SONGSEL\n");
191
case SND_SEQ_EVENT_QFRAME:
192
dbg_printf ("\tSND_SEQ_EVENT_QFRAME\n");
194
case SND_SEQ_EVENT_TIMESIGN:
195
dbg_printf ("\tSND_SEQ_EVENT_TIMESIGN\n");
197
case SND_SEQ_EVENT_KEYSIGN:
198
dbg_printf ("\tSND_SEQ_EVENT_KEYSIGN\n");
200
case SND_SEQ_EVENT_START:
201
dbg_printf ("\tSND_SEQ_EVENT_START\n");
203
case SND_SEQ_EVENT_CONTINUE:
204
dbg_printf ("\tSND_SEQ_EVENT_CONTINUE\n");
206
case SND_SEQ_EVENT_STOP:
207
dbg_printf ("\tSND_SEQ_EVENT_STOP\n");
209
case SND_SEQ_EVENT_SETPOS_TICK:
210
dbg_printf ("\tSND_SEQ_EVENT_SETPOS_TICK\n");
212
case SND_SEQ_EVENT_SETPOS_TIME:
213
dbg_printf ("\tSND_SEQ_EVENT_SETPOS_TIME\n");
215
case SND_SEQ_EVENT_TEMPO:
216
dbg_printf ("\tSND_SEQ_EVENT_TEMPO\n");
218
case SND_SEQ_EVENT_CLOCK:
219
dbg_printf ("\tSND_SEQ_EVENT_CLOCK\n");
221
case SND_SEQ_EVENT_TICK:
222
dbg_printf ("\tSND_SEQ_EVENT_TICK\n");
224
case SND_SEQ_EVENT_QUEUE_SKEW:
225
dbg_printf ("\tSND_SEQ_EVENT_QUEUE_SKEW\n");
227
case SND_SEQ_EVENT_SYNC_POS:
228
dbg_printf ("\tSND_SEQ_EVENT_SYNC_POS\n");
230
case SND_SEQ_EVENT_TUNE_REQUEST:
231
dbg_printf ("\tSND_SEQ_EVENT_TUNE_REQUEST\n");
233
case SND_SEQ_EVENT_RESET:
234
dbg_printf ("\tSND_SEQ_EVENT_RESET\n");
236
case SND_SEQ_EVENT_SENSING:
237
dbg_printf ("\tSND_SEQ_EVENT_SENSING\n");
239
case SND_SEQ_EVENT_ECHO:
240
dbg_printf ("\tSND_SEQ_EVENT_ECHO\n");
242
case SND_SEQ_EVENT_OSS:
243
dbg_printf ("\tSND_SEQ_EVENT_OSS\n");
245
case SND_SEQ_EVENT_CLIENT_START:
246
dbg_printf ("\tSND_SEQ_EVENT_CLIENT_START\n");
248
case SND_SEQ_EVENT_CLIENT_EXIT:
249
dbg_printf ("\tSND_SEQ_EVENT_CLIENT_EXIT\n");
251
case SND_SEQ_EVENT_CLIENT_CHANGE:
252
dbg_printf ("\tSND_SEQ_EVENT_CLIENT_CHANGE\n");
254
case SND_SEQ_EVENT_PORT_START:
255
dbg_printf ("\tSND_SEQ_EVENT_PORT_START\n");
257
case SND_SEQ_EVENT_PORT_EXIT:
258
dbg_printf ("\tSND_SEQ_EVENT_PORT_EXIT\n");
260
case SND_SEQ_EVENT_PORT_CHANGE:
261
dbg_printf ("\tSND_SEQ_EVENT_PORT_CHANGE\n");
263
case SND_SEQ_EVENT_PORT_SUBSCRIBED:
264
dbg_printf ("\tSND_SEQ_EVENT_PORT_SUBSCRIBED\n");
266
case SND_SEQ_EVENT_PORT_UNSUBSCRIBED:
267
dbg_printf ("\tSND_SEQ_EVENT_PORT_UNSUBSCRIBED\n");
269
case SND_SEQ_EVENT_USR0:
270
dbg_printf ("\tSND_SEQ_EVENT_USR0\n");
272
case SND_SEQ_EVENT_USR1:
273
dbg_printf ("\tSND_SEQ_EVENT_USR1\n");
275
case SND_SEQ_EVENT_USR2:
276
dbg_printf ("\tSND_SEQ_EVENT_USR2\n");
278
case SND_SEQ_EVENT_USR3:
279
dbg_printf ("\tSND_SEQ_EVENT_USR3\n");
281
case SND_SEQ_EVENT_USR4:
282
dbg_printf ("\tSND_SEQ_EVENT_USR4\n");
284
case SND_SEQ_EVENT_USR5:
285
dbg_printf ("\tSND_SEQ_EVENT_USR5\n");
287
case SND_SEQ_EVENT_USR6:
288
dbg_printf ("\tSND_SEQ_EVENT_USR6\n");
290
case SND_SEQ_EVENT_USR7:
291
dbg_printf ("\tSND_SEQ_EVENT_USR7\n");
293
case SND_SEQ_EVENT_USR8:
294
dbg_printf ("\tSND_SEQ_EVENT_USR8\n");
296
case SND_SEQ_EVENT_USR9:
297
dbg_printf ("\tSND_SEQ_EVENT_USR9\n");
299
case SND_SEQ_EVENT_SYSEX:
300
dbg_printf ("\tSND_SEQ_EVENT_SYSEX\n");
302
case SND_SEQ_EVENT_BOUNCE:
303
dbg_printf ("\tSND_SEQ_EVENT_BOUNCE\n");
305
case SND_SEQ_EVENT_USR_VAR0:
306
dbg_printf ("\tSND_SEQ_EVENT_USR_VAR0\n");
308
case SND_SEQ_EVENT_USR_VAR1:
309
dbg_printf ("\tSND_SEQ_EVENT_USR_VAR1\n");
311
case SND_SEQ_EVENT_USR_VAR2:
312
dbg_printf ("\tSND_SEQ_EVENT_USR_VAR2\n");
314
case SND_SEQ_EVENT_USR_VAR3:
315
dbg_printf ("\tSND_SEQ_EVENT_USR_VAR3\n");
317
case SND_SEQ_EVENT_USR_VAR4:
318
dbg_printf ("\tSND_SEQ_EVENT_USR_VAR4\n");
320
case SND_SEQ_EVENT_NONE:
321
dbg_printf ("\tSND_SEQ_EVENT_NONE\n");
324
dbg_printf ("\tUnknown event type %d\n", ev->type);