An meinem Roland A33 habe ich 2x MIDI OUT (OUT1, OUT2). Beide Ausgänge sind identisch und übertragen die gleichen Signale.
Das A33 kann max. mit 2 unterschiedlichen Kanälen senden. Ich möchte jetzt an OUT2 diese beiden Kanäle in andere MIDI Kanäle übersetzen. Also z.B. aus Kanal 1 und 2 wird dann Kanal 14 und 15.
OUT1 liefert die am A33 eingestellten Midikanäle 1 und 2. Dadurch hätte ich 4 unterschiedliche Midikanäle (1,2,14,15) , die mir der MIDIMerger auf eine Leitung zusammenführt.
Aber leider kann der die Kanalzuordnung nich ändern !
Ist es möglich, eine geänderte Firmware für den MIDI Merger zu erstellen, die z.B. die Kanäle von IN1 (=OUT1) auf Kanäle 14, 15 übersetzt, egal mit welchen Kanälen an diesem Port gearbeitet wird ?
kP musst jemand anders fragen Kann kein asm ausm kopf. Aber viel kanns doch nich sein. man muss ja nur im quelltext bei der ausgaberoutine die variable für den midikanal (welche ja normal die Eingängskanäle darstellt) mit einem festen Wert vertauschen. Mal so einfach ausgedrückt. Dann copy&paste mit der Zeile und den 2. kanal eingetragn.
Der Thorsten Klose hat momentan leider nur sehr wenig Zeit, eine hoehere Prioritaet haetten zumindest die anderen Leute, die schon seit Wochen auf eine Antwort von ihm warten
Ich verstehe nicht ganz, warum es ein Merger sein muss.
Du schreibst, dass die beiden MIDI Outs exakt die gleichen MIDI Daten ausgeben. Es wuerde also keinen Unterschied machen, ob die Events nun von einem Merger zusammengefuegt werden, oder ob sie einfach von einem einzigen MIDI Out dupliziert werden, richtig?
Dann saehe die Loesung naemlich ganz einfach aus - nimm einfach das C Skeleton, und setze folgendes in den MPROC_NotifyReceivedEvnt() Hook:
void MPROC_NotifyReceivedEvnt(
unsigned char evnt0, unsigned char evnt1, unsigned char evnt2) __wparam
{
switch( evnt0 & 0xf0 ) {
case 0x80: // Note-Off: 3 bytes
case 0x90: // Note-On: 3 bytes
case 0xa0: // Aftertouch: 3 bytes
case 0xb0: // CC: 3 bytes
case 0xe0: // Pitchbend: 3 bytes
MIOS_MIDI_TxBufferPut(evnt0);
MIOS_MIDI_TxBufferPut(evnt1);
MIOS_MIDI_TxBufferPut(evnt2);
// if channel 0 or 1 - send again via channel 14 and 15
if( (evnt0 & 0x0f) == 0 || (event0 & 0x0f) == 1 ) {
MIOS_MIDI_TxBufferPut(evnt0 + 14); // send again with channel offset 14
MIOS_MIDI_TxBufferPut(evnt1);
MIOS_MIDI_TxBufferPut(evnt2);
}
break;
case 0xc0: // Program Change: 2 bytes
case 0xd0: // Poly Aftertouch: 2 bytes
MIOS_MIDI_TxBufferPut(evnt0);
MIOS_MIDI_TxBufferPut(evnt1);
// if channel 0 or 1 - send again via channel 14 and 15
if( (evnt0 & 0x0f) == 0 || (event0 & 0x0f) == 1 ) {
MIOS_MIDI_TxBufferPut(evnt0 + 14); // send again with channel offset 14
MIOS_MIDI_TxBufferPut(evnt1);
}
break;
default:
// note: status messages must be handled within MPROC_NotifyReceivedByte()
break;
}
}
}
[/code]
Was passiert hier: je nach MIDI Event Typ werden entweder zwei oder drei Byte weitergeleitet.
Wenn das MIDI Event auf Kanal 0 oder 1 (wir zaehlen ab 0) empfangen wird, wird es zweimal weitergeleitet. Einmal auf dem urspruenglichen Kanal, und einmal auf Kanal +14
Das ganze laeuft dann auf einem normalen Core Modul ohne zweiten MIDI In
Gruss,
Thorsten.