170
173
//---------------------------------------------------------
175
//---------------------------------------------------------
177
void MidiAlsaDevice::writeRouting(int level, Xml& xml) const
180
// If this device is not actually in use by the song, do not write any routes.
181
// This prevents bogus routes from being saved and propagated in the med file.
187
//if(rwFlags() & 2) // Readable
189
//RouteList* rl = _inRoutes;
190
//for (ciRoute r = rl->begin(); r != rl->end(); ++r)
191
for (ciRoute r = _inRoutes.begin(); r != _inRoutes.end(); ++r)
193
// Since an ALSA midi device supports read + write, this is the only way we can tell if this route is using the device as input.
194
if(r->type == Route::TRACK_ROUTE)
197
if(!r->name().isEmpty())
199
xml.tag(level++, "Route");
201
//xml.strTag(level, "srcNode", r->name());
202
xml.tag(level, "source type=\"%d\" name=\"%s\"/", r->type, r->name().latin1());
204
//xml.strTag(level, "dstNode", name());
205
xml.tag(level, "dest type=\"%d\" name=\"%s\"/", Route::ALSA_MIDI_ROUTE, name().latin1());
207
xml.etag(level--, "Route");
213
for (ciRoute r = _outRoutes.begin(); r != _outRoutes.end(); ++r)
215
//if(r->type != Route::TRACK_ROUTE)
217
// printf("MidiAlsaDevice::writeRouting Warning out route is not TRACK_ROUTE type\n");
221
if(!r->name().isEmpty())
223
//xml.tag(level++, "Route");
225
s = QT_TR_NOOP("Route");
227
s += QString(QT_TR_NOOP(" channel=\"%1\"")).arg(r->channel);
231
//xml.strTag(level, "srcNode", name());
233
//xml.tag(level, "source type=\"%d\" channel=\"%d\" name=\"%s\"/", Route::ALSA_MIDI_ROUTE, r->channel, name().latin1());
234
//xml.tag(level, "source type=\"%d\" channel=\"%d\" name=\"%s\"/", Route::MIDI_DEVICE_ROUTE, r->channel, name().latin1());
235
xml.tag(level, "source devtype=\"%d\" channel=\"%d\" name=\"%s\"/", MidiDevice::ALSA_MIDI, r->channel, name().latin1());
237
//xml.tag(level, "source type=\"%d\" name=\"%s\"/", Route::ALSA_MIDI_ROUTE, name().latin1());
238
//xml.tag(level, "source type=\"%d\" name=\"%s\"/", Route::MIDI_DEVICE_ROUTE, name().latin1());
240
//xml.tag(level, "source devtype=\"%d\" name=\"%s\"/", MidiDevice::ALSA_MIDI, name().latin1());
241
xml.tag(level, "source devtype=\"%d\" name=\"%s\"/", MidiDevice::ALSA_MIDI, Xml::xmlString(name()).latin1());
244
//xml.strTag(level, "dstNode", r->name());
247
if(r->type == Route::MIDI_DEVICE_ROUTE)
248
xml.tag(level, "dest devtype=\"%d\" channel=\"%d\" name=\"%s\"/", r->device->deviceType(), r->channel, r->name().latin1());
250
xml.tag(level, "dest type=\"%d\" channel=\"%d\" name=\"%s\"/", r->type, r->channel, r->name().latin1());
254
if(r->type == Route::MIDI_DEVICE_ROUTE)
255
xml.tag(level, "dest devtype=\"%d\" name=\"%s\"/", r->device->deviceType(), r->name().latin1());
257
xml.tag(level, "dest type=\"%d\" name=\"%s\"/", r->type, r->name().latin1());
261
s = QT_TR_NOOP("dest");
262
if(r->type == Route::MIDI_DEVICE_ROUTE)
263
s += QString(QT_TR_NOOP(" devtype=\"%1\"")).arg(r->device->deviceType());
265
if(r->type != Route::TRACK_ROUTE)
266
s += QString(QT_TR_NOOP(" type=\"%1\"")).arg(r->type);
267
//s += QString(QT_TR_NOOP(" name=\"%1\"/")).arg(r->name());
268
s += QString(QT_TR_NOOP(" name=\"%1\"/")).arg(Xml::xmlString(r->name()));
271
xml.etag(level--, "Route");
276
//---------------------------------------------------------
172
278
//---------------------------------------------------------
205
311
int a = e.dataA();
206
312
int b = e.dataB();
207
313
int chn = e.channel();
208
if (a < 0x1000) { // 7 Bit Controller
315
//if (a < 0x1000) { // 7 Bit Controller
316
if (a < CTRL_14_OFFSET) { // 7 Bit Controller
209
317
snd_seq_ev_set_controller(&event, chn, a, b);
211
else if (a < 0x20000) { // 14 bit high resolution controller
319
//else if (a < 0x20000) { // 14 bit high resolution controller
320
else if (a < CTRL_RPN_OFFSET) { // 14 bit high resolution controller
212
321
int ctrlH = (a >> 8) & 0x7f;
213
322
int ctrlL = a & 0x7f;
214
323
a = (ctrlH << 7) + ctrlL;
215
324
snd_seq_ev_set_controller(&event, chn, a, b);
216
325
event.type = SND_SEQ_EVENT_CONTROL14;
218
else if (a < 0x30000) { // RPN 7-Bit Controller
327
//else if (a < 0x30000) { // RPN 7-Bit Controller
328
else if (a < CTRL_NRPN_OFFSET) { // RPN 7-Bit Controller
219
329
int ctrlH = (a >> 8) & 0x7f;
220
330
int ctrlL = a & 0x7f;
221
331
a = (ctrlH << 7) + ctrlL;
231
342
snd_seq_ev_set_controller(&event, chn, a, b);
232
343
event.type = SND_SEQ_EVENT_NONREGPARAM;
234
else if (a < 0x60000) { // RPN14 Controller
345
//else if (a < 0x60000) { // RPN14 Controller
346
else if (a < CTRL_NRPN14_OFFSET) { // RPN14 Controller
235
347
int ctrlH = (a >> 8) & 0x7f;
236
348
int ctrlL = a & 0x7f;
237
349
a = (ctrlH << 7) + ctrlL;
238
350
snd_seq_ev_set_controller(&event, chn, a, b);
239
351
event.type = SND_SEQ_EVENT_REGPARAM;
241
else if (a < 0x70000) { // NRPN14 Controller
353
//else if (a < 0x70000) { // NRPN14 Controller
354
else if (a < CTRL_NONE_OFFSET) { // NRPN14 Controller
242
355
int ctrlH = (a >> 8) & 0x7f;
243
356
int ctrlL = a & 0x7f;
244
357
a = (ctrlH << 7) + ctrlL;
715
832
case SND_SEQ_EVENT_CLOCK:
716
midiSeq->realtimeSystemInput(curPort, 0xf8);
833
midiSeq->realtimeSystemInput(curPort, ME_CLOCK);
717
834
//mdev->syncInfo().trigMCSyncDetect();
720
837
case SND_SEQ_EVENT_START:
721
midiSeq->realtimeSystemInput(curPort, 0xfa);
838
midiSeq->realtimeSystemInput(curPort, ME_START);
724
841
case SND_SEQ_EVENT_CONTINUE:
725
midiSeq->realtimeSystemInput(curPort, 0xfb);
842
midiSeq->realtimeSystemInput(curPort, ME_CONTINUE);
728
845
case SND_SEQ_EVENT_STOP:
729
midiSeq->realtimeSystemInput(curPort, 0xfc);
846
midiSeq->realtimeSystemInput(curPort, ME_STOP);
732
849
case SND_SEQ_EVENT_TICK:
733
midiSeq->realtimeSystemInput(curPort, 0xf9);
850
midiSeq->realtimeSystemInput(curPort, ME_TICK);
734
851
//mdev->syncInfo().trigTickDetect();
737
854
case SND_SEQ_EVENT_SYSEX:
856
// TODO: Deal with large sysex, which are broken up into chunks!
857
// For now, do not accept if the first byte is not SYSEX or the last byte is not EOX,
858
// meaning it's a chunk, possibly with more chunks to follow.
859
if((*((unsigned char*)ev->data.ext.ptr) != ME_SYSEX) ||
860
(*(((unsigned char*)ev->data.ext.ptr) + ev->data.ext.len - 1) != ME_SYSEX_END))
862
printf("MusE: alsaProcessMidiInput sysex chunks not supported!\n");
738
866
event.setTime(0); // mark as used
739
867
event.setType(ME_SYSEX);
740
868
event.setData((unsigned char*)(ev->data.ext.ptr)+1,