MIDI-Splitter mit Arduino

trouby

....
hiho,
habn paar monophone VCO mit Arduino-Ansteuerung gebaut, nun sind meine Busse alle...
Ein weiterer Arduino soll den Splitter machen - ist eine Umschaltung des TX per Analogschalter mit Buffer möglich?

midi-split.gif
 
Zuletzt bearbeitet:
Sorry, aber ich bitte doch drum, die richtigen Begriffe zu verwenden und nicht diesen falsch übersetzten Blödsinn. Ein "MIDI Splitter" würde die Signale in einzelne Daten aufteilen, das machen manche gute Patchbays wie MIDITemp, das hier ist eine Thrubox, die alle Signale einfach parallel weiterleitet, daher bitte auch als solche Bezeichnen.
Das ist zudem auch besser im Unterforum "Lötkunst" aufgehoben sag ich mal.

Zur Schaltung: Analogschalter sind da eigentlich nicht nötig, da MIDI digital ist, kann man also wie jede normale serielle Schnittstelle behandeln, die hat ja vor der Wandlung TTL Pegel. Man muß nur dafür Sorge tragen, daß nicht während des Sendens umgeschaltet wird.

Ich hänge mal das Servicemanual einer alten MIDI Patchbay an, die Bezahlbaren damals arbeiteten alle mit gemultiplexten Ports, um die teuren ACIAs und den damit verbundenen Aufwand zu sparen. Da wird mit reinen TTL-Multiplexern gearbeitet. Denke mal, daß man da die Arbeitsweise recht gut erkennen kann. Die anderen Modelle wie Akai ME-30P(II) und ME-80P waren ähnlich aufgebaut, nur mit weniger Ports, und der steuernde Z80 Prozessor ist selbst einem kleinen Arduino haushoch unterlegen :)
 

Anhänge

  • WaldorfMidibayServicemanual.pdf
    3,4 MB · Aufrufe: 7
Ein "MIDI Splitter" würde die Signale in einzelne Daten aufteilen
Eehm, vielleicht will er ja genau das. Jeder (Arduino-basierte) Oszillator soll eine Stimme aus dem MIDI-Strom bekommen.

Allerdings wäre es doch viel einfacher das Splitting auf x MIDI-Kanäle zu machen und nur eine MIDI-Leitung zu nutzen.
 
Eehm, vielleicht will er ja genau das. Jeder (Arduino-basierte) Oszillator soll eine Stimme aus dem MIDI-Strom bekommen.
Oh, ok, das hab ich so nicht aus dem Text herausgelesen.

Allerdings wäre es doch viel einfacher das Splitting auf x MIDI-Kanäle zu machen und nur eine MIDI-Leitung zu nutzen.
Das stimmt wohl und wäre auch einfacher zu lösen, weil vor allem eine Softwaresache.
 
Also ich würde den TX des Arduino an einen Eingang der vier ANDs anschließen (Pins 10, 2, 13, 5 des 74LS08) und D12, D11, D10 und D9 an den anderen Eingang der vier ANDs. Bin mir jetzt nicht sicher, ob Du die Outputs des 74LS08 noch invertieren musst.
 
Man wird halt auch brutal mit dem Timing der Enable Signale D9-D12 aufpassen müssen, nicht dass man Teile des MIDI-Datenstroms mitten im Nibble abschneidet.
 
Man wird halt auch brutal mit dem Timing der Enable Signale D9-D12 aufpassen müssen, nicht dass man Teile des MIDI-Datenstroms mitten im Nibble abschneidet.
Ja, da muss man ganz genau wissen, was man tut. Etwa die Analyse des MIDI-Input-Buffers und dann das Multiplexen über D9-12 sowie das Senden per TX. Lässt sich alles machen, aber die Latenz sollte ja auch nicht in den hörbaren Bereich rutschen.
 
Bin mir jetzt nicht sicher, ob Du die Outputs des 74LS08 noch invertieren musst.
Normal nicht. In den früheren Standardschaltungen hat man 2 74LS14 hintereinandergeschaltet, das waren aber auch invertierende Schmitt-Trigger Buffer, die gabs glaubich nicht ohne Inverter bzw waren leichter erhältlich. Die Ausgangsschaltungen waren meist mit Nichtinvertierenden Buffern beschaltet (74LS06?).
 
Man wird halt auch brutal mit dem Timing der Enable Signale D9-D12 aufpassen müssen, nicht dass man Teile des MIDI-Datenstroms mitten im Nibble abschneidet.
Nachdem das bei nahezu sämtlichen alten, unter 1000DM MIDI Patchbays wie der oben gezeigten Waldorf MIDIbay und den Akais reibungslos funktioniert hat, sollte das auch heute gehen. Wer Z80 Maschinensprache kann und einen Disassembler hat, kann sich den Code der MIDIBay anschauen, das ROM-Binary gibts im Netz (ich habs aber auch hier) oder vielleicht hat Vladimir Salnikov (der Entwickler des Waldorf M) es sogar als Quellcode im Archiv. Die Akais haben wieder so 78xx MCUs drin, die zwar vom Z80 abgeleitet sind, aber einen eigenen Code haben (und da weiß ich grad nicht, ob die nicht sogar eine ROM-Maske auf der MCU hatten wie beim ME-20A). Von den Ensoniq/KMX Patchbays gibts leider keine Schaltpläne im Netz, da wüßte ich nichtmal, was da an CPU drinsteckt (aufgrund des US-Ursprungs sicher kein 78xx, aber von 68xx über Z80 bis Intel MCS48/51 alles möglich).

idealerweise steuert die sendene MCU auch die Multiplexer.
 
Soweit ich weiß ist Rainer eher ein Programmier-Einsteiger und das auch "nur" mit dem Arduino. Würde mich wundern, wenn ihm alter Source Code was bringt... (brächte mir auch nix...)
 
Soweit ich weiß ist Rainer eher ein Programmier-Einsteiger und das auch "nur" mit dem Arduino. Würde mich wundern, wenn ihm alter Source Code was bringt... (brächte mir auch nix...)
Einerseits sicher richtig, andererseits hab ich damals ausschließlich mit dem 6502 rumgemacht, mir hat aber fremder Sourcecode wie 6802, 6809 etc sehr viel gebracht, ich hatte mir seinerzeit extra sogar Cross-Disassembler dafür geschrieben - von dem ganzen Intel/Zilog Zeug hab ich damals schon die Finger gelassen weil auf meinen beiden Sinclairs davor hab ich auch nie Maschinensprache programmiert weil das einfach nicht an mich ging. Ist aber auch ein anderes Level, wenn man mit C einsteigt und nicht mit Maschinensprache, anderseits scheinen C-Programmierer eher einen Zugang zu Z80 Maschinencode zu haben, keine Ahnung warum:)
 
ui, so viele Antworten :)
Das Timing geht so:
Note-Befehl (Kanal) auswerten - Gate setzen - Note-command zum Ziel senden - Wartechleife bis mittleres Byte - senden - Wartechleife bis letztes Byte - senden - Abfrage ob fertig - Gate löschen - zum Anfang.
Evtl. können Pausen von 10 us vorteilhaft sein (Gate).

Der Analogschalter kann raus, stimmt :selfhammer:

(flo du verräter :D )
 
Wenn Du schon da bist ;-)
Warum willst Du separate Outs, bzw warum machst Du es nicht einfach auf verschiedenen MIDI-Kanälen?
 
Hier ausnahmsweise der Code, es geht um 4 Mono-Oszillatoren, davon 3 als duale Ausführung für Bass & Diskant.
Es können max. 5 Telegramme gepuffert werden; das Modul enthält einen Reset-Taster, wenn Datenstau auftritt...
Die Pegel passen spannungsmässig nicht, funktioniert aber trotzdem.
Als Startbit wird die negative Flanke genutzt, dehalb eine kleine Pause von 30 µs.

/* MIDI SPLIT specialized
*
* OSC 1: neon bulb dual
* OSC 2: Simplesizer dual
* OSC 3: Knatter dual
* OSC 4: Arduino DCO
*
*/

byte mid[3]; // MIDI input data
const byte midi[9] = {0,10,10,9,9,12,12,11,11}; // SRC OSC
const byte in[9] = {0,1,3,5,7,9,11,13,15}; // input channel - 1
const byte out[9] = {0,1,3,1,3,1,3,1,3}; // output channel - 1
const byte us = 30; // microseconds
byte x = 0; // loop counter
byte chan = 0; // midi channel

void setup()
{
Serial.begin(31250);
pinMode(midi[1],OUTPUT);
pinMode(midi[3],OUTPUT);
pinMode(midi[5],OUTPUT);
pinMode(midi[7],OUTPUT);
digitalWrite(midi[1],LOW);
digitalWrite(midi[3],LOW);
digitalWrite(midi[5],LOW);
digitalWrite(midi[7],LOW);
}

// noteOn = 144 + channel
// noteOff = 128 + channel

void loop()
{
midicomm:
if (Serial.available() >= 1)
{
mid[0] = Serial.read();
if (bitRead(mid[0],7) == HIGH && bitRead(mid[0],6) == LOW && bitRead(mid[0],5) == LOW)
{
chan = (bitRead(mid[0],3) * 8) + (bitRead(mid[0],2) * 4) + (bitRead(mid[0],1) * 2) + bitRead(mid[0],0);
for (x = 1;x < 9;x++)
{
if (in[x] == chan)
{
digitalWrite(midi[x],HIGH);
delayMicroseconds(us);
Serial.write(128 + (bitRead(mid[0],4) * 16) + out[x]);
break;
}
}
}
}
else
{
goto midicomm;
}

midinote:
if (Serial.available() == 1)
{
mid[1] = Serial.read();
if (bitRead(mid[1],7) == HIGH && bitRead(mid[1],6) == LOW && bitRead(mid[1],5) == LOW)
{
mid[0] = mid[1];
goto midinote;
}
else
{
Serial.write(mid[1]);
}
}
else
{
goto midinote;
}

midivol:
if (Serial.available() == 1)
{
mid[2] = Serial.read();
if (bitRead(mid[2],7) == HIGH && bitRead(mid[2],6) == LOW && bitRead(mid[2],5) == LOW)
{
mid[0] = mid[2];
goto midinote;
}
else
{
Serial.write(mid[2]);
}
}
else
{
goto midivol;
}

Serial.flush(); // warten auf Senden fertig
delayMicroseconds(us);
digitalWrite(midi[x],LOW);
}
 


News

Zurück
Oben