Midifizierung einer Johannus-Orgel mittels Arduinos

    • Offizieller Beitrag

    Schön, schau einmal nach ob in diesem Instrument ein Schaltnetzteil eingebaut oder ob es mit Trafos ausgestattet ist.

    Hier wurde schon darüber berichtet, dass billige Elektrolytkondensatoren auslaufen und die Platine verätzen können. Steigt durch fehlende Kapazität die Versorgungsspannung für den Prozessor ist die Orgel unreparierbar hinüber. Der Fehler muss nicht, kann aber eintreten.

    Es kann sich lohnen diese (meist smd) Kondensatoren zu ersetzen. Ist bissl Aufwand

  • Sehr schönes Projekt. Bin gespannt wie du das mit den arduinos gelöst hast. Eine diifenmatrix ist nix kompliziertes und spart dir viele Kabel. Ist bei der Hardware von gino Midi. Einfach umzusetzen. Es reizt mich das für einen arduino zu programmieren. Da fehlt mir noch die Erfahrung zu.

    Gruß Bernd

  • Leider muss man berücksichtigen, dass die analogen Kontakte eventuell nicht für digital geeignet sind. Sie riskieren häufige Ausfälle. Der alte Johannus hat wahrscheinlich nur glatten Silberdraht als Kontakt. Das ist leicht zu reinigen.

    Ich selbst habe diese Kontakte nicht, aber vielleicht haben andere User damit Erfahrung.

    Es gibt Schemata, um die Kontakte mit Widerstand und Zenerdiode pro Taste geeignet zu machen. Ich persönlich finde die gewählten Stromwerte unnötig hoch.


    This article has been most informative on the key contact question. Rather than spend the time to re-engineer the key contacts, I’ve chosen to preserve the time-honored open-air silver wire contacts and revert to a parallel sampling scheme. I will connect the existing key contacts such that each key switches a 100 mA wetting current on and off as the organist plays. Then all I need is a way to translate 100 mA of current into a 5-volt logic-level signal. Simplicity and reliability are key, as there are 305 keys and 32 pedals! Here’s the simplest circuit I can build:

    pasted-from-clipboard.png

  • Schön, schau einmal nach ob in diesem Instrument ein Schaltnetzteil eingebaut oder ob es mit Trafos ausgestattet ist.

    Hier wurde schon darüber berichtet, dass billige Elektrolytkondensatoren auslaufen und die Platine verätzen können. Steigt durch fehlende Kapazität die Versorgungsspannung für den Prozessor ist die Orgel unreparierbar hinüber. Der Fehler muss nicht, kann aber eintreten.

    Es kann sich lohnen diese (meist smd) Kondensatoren zu ersetzen. Ist bissl Aufwand

    Ich kann mal nachschauen, aber wahrscheinlich kein Schaltnetzteil. Wobei das irrelevant geworden ist, da die "alte" Orgel tot ist. Ich nutze nurmehr die vorhandenen Klaviaturen und Pedal sowie deren Verkabelung und Kontakte.

    Eine diifenmatrix ist nix kompliziertes und spart dir viele Kabel.

    Ja das stimmt. Tatsächlich sind auch viele Keyboards so aufgebaut, wie ich gelernt habe. Nur wie verhindert man "Geistertöne"? Sprich wenn sich die Spannungspfade bei mehr als X (2 oder 3?) gedrückten tasten kreuzen könnten?

    Leider muss man berücksichtigen, dass die analogen Kontakte eventuell nicht für digital geeignet sind. Sie riskieren häufige Ausfälle. Der alte Johannus hat wahrscheinlich nur glatten Silberdraht als Kontakt. Das ist leicht zu reinigen.

    Ich selbst habe diese Kontakte nicht, aber vielleicht haben andere User damit Erfahrung.

    Also in der Original-Johannus-Schaltung wurde auch mit relativ hohen Spannungen gearbeitet. Bei Arduinos ist die Spannung üblicherweise 5V, beim Arduino Due nur 3,3V. Tastenkontakt kommt über mutmaßlich Silberfeder auf Masse-Metallstange (weiß nicht, welche Legierung). Bilder dazu folgen. Das Ergebnis funktioniert gut, einzig Manual 2 spielt sich bei Akkorden etwas "pneumatisch". Meine Vermutung ist, dass hier die Kontakte bisschen oxidiert sind. Da muss ich mal mechanisch und /oder chemisch reinigen. Gibt es da Erfahrungen? Einfach mit Stahlwolle abreiben?

  • Pro Taste ein Pin ist aber alles andere als eine ideale Sache. Kannst du das ganze nicht aufteilen und eine Matrix daraus machen? Dann würde im Grunde ein Arduino für alles reichen und auch der Code wird sehr viel besser. Ich kenne den Code von dem besagten Video und der ist wirklich nicht gut.

    Ein wichtiger Hinweis für dein Projekt:

    Nimm bitte das MidiUSB.flush(); aus dem Code raus!

    Der Arduino Due hat bei seinem USB Controller nämlich eine Besonderheit die mir auch auf die Füße gefallen ist. Der Controller nimmt nur in bestimmten Zeitabständen Informationen entgegen. Sendet man zu schnell Daten, dann werden diese einfach verworfen. Bedeutet ein Midi Signal kommt nicht an deinem Rechner an. Nach einer Aktion braucht der Controller einige Zyklen um wieder Daten anzunehmen. Wenn du je nach Code für jede Taste ein SendMidi mit einem flush machst, dann kannst du innerhalb kurzer Zeit hunderte Anfragen stellen, vor allem wenn mal ein Kontakt am prellen ist oder du viele Tasten gleichzeitig spielst. Das Ergebnis in der Praxis ist dann, dass einzelne Töne nicht gespielt werden oder als Heuler zurückbleiben.

    Daher nutze flush nicht und überlasse es der Bibliothek das alleine zu machen, dann gibt es keine Probleme. Natürlich wird ohne das flush ein Signal nicht sofort versendet, sondern verzögert. Wir reden hier aber über weniger als ein Bruchteil einer Millisekunde. Ich habe BTW um die Ursache zu finden bestzimmt 100 Stunden debuggen müssen, da es absurd ist wenn alles in der Software stimmt aber die Signale hinten nicht korrekt rauskommen..

    Melodeum.de - Wissenswertes zu Harmonium

    • Offizieller Beitrag

    Nur wie verhindert man "Geistertöne"? Sprich wenn sich die Spannungspfade bei mehr als X (2 oder 3?) gedrückten tasten kreuzen könnten?

    Geistertöne treten nicht auf. Die Tasten 1-8 sind über Dioden an einen Sammelkontakt geschaltet. Die Tasten 9-16 über Dioden an den zweiten Sammelkontakt usw.

    Die Tasten und die Sammelkontakte werden nacheinander abgefragt. Es besteht dadurch eine exakte Zuordnung der gespielten Töne. Die Schaltung einer Diodenmatrix ist in einem Beitrag eingestellt. Ich kann ihn gerne suchen

  • Haralder

    Danke für dein Feedback. Ein paar Fragen dazu.

    Was ist daran nicht gut, keine Matrix zu verwenden? Wird die Funktionsweise beeinträchtigt oder ist es "nur" der Umstand, dass ich sonst mit weniger Arduinos auskommen könnte? Beim Spielen bemerke ich nämlich keine Nachteile.

    Was macht den Code nicht gut? Ich meine er basiert auf dem Standardbeispiel aus der Bibliothek. Was mir daran auch aufgefallen war, war die große Delay Zeit. Habe ich auf ein Minimum zurückgefahren. Ganz ohne hatte ich merkwürdige Tonfehler.

    Das mit dem Flush-Befehl probiere ich auch aus. Ist ja schnell rausgenommen. Die von dir beschriebenen Fehler habe ich bislang nicht bemerkt, oder aber überhört.

    Die Schaltung einer Diodenmatrix ist in einem Beitrag eingestellt. Ich kann ihn gerne suchen

    Ja kannst du ja bei Gelegenheit mal raussuchen, eilt aber nicht. Wenn ich mal Zeit und Muße habe baue ich vlt. noch einmal hin zu einer Matrix um. Für den Moment funktioniert erst einmal alles gut.

  • Was mir daran auch aufgefallen war, war die große Delay Zeit. Habe ich auf ein Minimum zurückgefahren. Ganz ohne hatte ich merkwürdige Tonfehler.

    Das wird vermutlich am Prellen der Kontakte liegen. Wenn du eine Taste drückst, dann Prellt dieser ja. Er schwingt also einige Millisekunden hin und her, öffnet und schließt sich quasi. Je nach Delay kann es dann dazu führen, dass dein Arduino denkt du würdest gerade innerhalb einer Millisekunde 400 mal die Taste drücken und sendet im Zweifel 400 Mal Taste gedrück und losgelassen. Das ist nicht nur eine Qual für die Software die damit was anfangen muss, sondern äußert sich auch in solchen Tonfehler.

    Was ist daran nicht gut, keine Matrix zu verwenden? Wird die Funktionsweise beeinträchtigt oder ist es "nur" der Umstand, dass ich sonst mit weniger Arduinos auskommen könnte?

    Das ist einfacher zu schalten. Im Grunde brauchst du für 64 Tasten 64 Kabel/Pins plus 1, also 65 Pins. Bei einer 8x8 Matrix könntest du die 64 Tasten mit nur 16 Pins abfragen. Bei zwei Manualen könntest du mit einer cleveren Schaltung und Programmierung sogar zwei Manuale mit jeweis 64 Tasten mit 24 Pins abarbeiten. Mit 32 Pins zusätzlich noch 64 Schalter.

    Vielleicht als Anregung mal ein Ausschnitt aus meinem Code. Dieser fragt 2 Manuale und ein Pedal ab, sendet die entsprechenden Tastencodes dann aus der Liste. Aber Vorsicht der Code ist auf mich zugeschnitten. Viele Abschnitte sind zwar doppelt, so ist es aber einfacher als mit verschachtelten Schleifen.

    Melodeum.de - Wissenswertes zu Harmonium

  • Kurzer Nachtrag, mit einem Pi Pico für 4 Euro geht es sogar noch leichter :) Irgendwo hier im Forum gibt es einen Beitrag dazu. Einfach die Pins eintragen für Inputs und Outputs und fertig :)

    Melodeum.de - Wissenswertes zu Harmonium

  • Ist der Code auch für Arduino Due? Dann würde ich wenn ich bei meinem Bericht an der Stelle bin sowohl "meinen", als auch deinen Code platzieren. Dann können eventuelle Nachahmer ja für sich entscheiden. Berndkoeln sucht ja zum Beispiel nach einem Matrix-Code.

  • Haralder

    Also ich kann ehrlich gesagt immernoch nicht erkennen, was an meiner Vorgehensweise oder dem verwendeten Code "schlecht" sein soll. Nach deinen Ausführungen scheint mir das einzige Manko zu sein, dass ich mehr als einen Arduino nutze. Na und? In meiner persönlichen Kosten-Nutzen-Abwägung war das die einfachere Vorgehensweise. Denn wie ich noch zeigen werde, hatte ich nichts zu verkabeln, denn es war bereits alles verkabelt. Mein Ziel war nicht, den elegantesten und Arduino-ärmsten Weg zu gehen. Mein Ziel war, mit möglichst wenig Zeiteinsatz eine funktionierende GO-Orgel zu bekommen, denn Zeit habe ich kaum. Und das ist mir mit meinem Ansatz gelungen: nach 3 Wochen hatte ich eine spielfertige Orgel, nach 4 inkl. Setzer-Anlage. In diesem Zeitrahmen muss man berücksichtigen, dass ich vorher Arduino- und Midifizierungs-mäßig komplett blank war. Allein diese Recherche hat viel Zeit gekostet. Mit Matrix wollte ich mich daher nicht beschäftigen. Ich merke im Übrigen auch keine Nachteile beim Spielen, egal ob flinke französische Toccata oder große Akkorde in beiden Händen.

    Ich zeige hier also nicht den Weg der Midifizierung, sondern lediglich meinen. Wenn sich da einer etwas von mitnehmen kann, gut. Wenn nicht, auch ok. Vielleicht sollte ich noch anfügen, dass ich bereits fertig bin und hier in der Retroperspektive berichte. Ich werde also eine funktionierende Orgel nicht ohne Not noch einmal anfassen. Die nächste baue ich dann sicher mit Diodenmatrix ;)

    Hilfreich war die Diskussion dennoch, denn du konntest Bernd weiterhelfen :)

  • oder dem verwendeten Code "schlecht" sein soll.

    Der Code ist einfach nicht sinnvoll. Er funktioniert zwar, aber so macht man das nicht. Die ca. 150 Zeilen Code könnte man mühelos und übersichtlich gut erweiterbar in vielleicht 20 Zeilen packen.

    wäre so sinnvoll:

    Code
    int AnzahlTaste = 19;
    bool TasteAlt[AnzahlTaste];

    Dann kannst du nämlich mühelos diese endlosen Zeilen sparen

    mit:

    Code
    for(int i=0; i<AnzahlTaste; i++){
    {
        tasteAlt[i] = MidiButton....;
    }

    Sowas wie in dem Beispiel lässt sich nämlich unheimlich schlecht warten. Ändere mal einen Pin und das Programm ist quasi schneller neugeschrieben als angepasst.

    Wie gesagt es funktioniert, aber man tut sich selbst mit so einem Konstrukt keinen Gefallen, außer man ist sich sicher niemals wieder was daran ändern zu müssen :)

    Melodeum.de - Wissenswertes zu Harmonium

    • Offizieller Beitrag

    Mit Matrix wollte ich mich daher nicht beschäftigen. Ich merke im Übrigen auch keine Nachteile beim Spielen, egal ob flinke französische Toccata oder große Akkorde in beiden Händen.

    Der aus meiner Sicht einzige Vorteil einer Diodenmatrix sind die meist schon vorkonvektionierten Kabel oder die einfachere Verkabelung gegenüber 64 Einzelkontakte mit ihren Anschlüssen. Dabei sind auch die Steckleisten auf dem Scanner kleiner.

    Ob nun ein nachgeschalteter Scanner 64 Kontakte einzeln abfragt oder hintereinander 8x8 Kontakte und weiterleitet gibt keinen Zeitvorteil eines der Systeme.

    Beide Scanner müssen ja ohnehin die

    "Note on oder off" Befehle seriell via MIDI übertragen.

    Manual 1 meiner Orgel ist mit 64 Leitungen an einen Scanner angeschlossen. Gleichzeitig besitzt es eine Diodenmatrix mit zugehörigen und angeschlossenen Scanner.

    Die Scanner sind mit der CPU über einen MIDI-Bus verbunden.

    Ich habe mal von Diodenmatrix auf 64 Anschlüsse beim Spielen umgeschaltet.

    Keine Änderung in irgendeiner Weise.

  • Ob nun ein nachgeschalteter Scanner 64 Kontakte einzeln abfragt oder hintereinander 8x8 Kontakte und weiterleitet gibt keinen Zeitvorteil eines der Systeme.

    Ich möchte noch einwerfen, dass in dem Code von werdeElektroniker die Pins am Ground hängen. Es wird im Grunde der Widerstand geprüft was meiner Erfahrung nach die denkbar schlechteste Idee ist. Besser ist es statt Ground eine Spannung zu nehmen und an den Pins zu schauen ob diese anliegt (also Taste gedrückt).

    Da reicht schon ein berühren von einem Kontakt damit der Arduino annimmt eine Verbindung zu Ground liegt an. Auch eine schlechte Isolation oder andere Einflüsse sorgen da gerne für Phantomereignisse.

    Wobei ich mir jetzt nicht sicher bin, ich meine hier etwas gelesen zu haben, dass in deiner Lösung eine Spannung anliegt und nicht gegen Ground geprüft wird?

    Melodeum.de - Wissenswertes zu Harmonium

  • Ob nun ein nachgeschalteter Scanner 64 Kontakte einzeln abfragt oder hintereinander 8x8 Kontakte und weiterleitet gibt keinen Zeitvorteil eines der Systeme.

    Ich muss noch als Nachtrag etwas einwerfen. Doch es gibt einen Zeitvorteil. Die Matrix ist langsamer. Beim durchgehen dieser müssen Pins umgeschaltet werden und das benötigt eine gewisse Zeit bevor man zuverlässig nach dem Verändern des Pins prüfen kann. Bedeutet also die Matrix ist tatsächlich langsamer.

    Bei dieser Anwendung spielt das aber keine Rolle, da wir hier über Microsekunden sprechen, dass hat also praktisch keinerlei Relevanz und ist eher in anderen Szenarien eine Sache die man bedenken sollte.

    Melodeum.de - Wissenswertes zu Harmonium

  • Du hast aus Sicht eines Profis, der zu zweifellos zu sein scheinst, in allen Punkten inhaltlich Recht. Für mich als Anfänger sieht es aber ganz anders aus: Die Pflicht ist, dass der Code sauber funktioniert. Tut er. Die Kür ist, dass er elegant, mit wenig Zeilen und wartungsfreundlich programmiert ist. Das ist er nicht, das weiß ich auch. Aber wieso von einem Anfänger verlangen?


    Als du angefangen hast mit Orgelspielen, konntest du da blindes Pedalspiel oder hast du immerzu runtergeguckt? Sinnvoll ist runtergucken nicht. Und man kann auch viel schneller üben, wenn man nicht ständig runterguckt. Außerdem ergibt das ein ziemliches Gehampel. Am Anfang aber trotzdem notwendig. Den Rest lernt man mit der Zeit.

    Zu warten ist an dem Code übrigens nichts, er braucht auch keinen Ölwechsel oder hat Veschleißteile. Er funktioniert, und das kann er jetzt solange tun, bis der Arduino den Löffel reicht. Ich wollte mir selbst auch nur den Gefallen tun, meine Orgel ans Laufen zu kriegen, mehr nicht.

    Im Übrigen habe ich nicht geschrieben, dass ich den Elektroniker-Code kopiert habe. Ich habe wörtlich geschrieben, dass ich ihn analysiert und für mich abgewandelt habe. Eine ganz wesentliche Änderung war, dass ich aus den Input-Pins Input-Pullup-Pins gemacht habe. Ersteres war bei ersten Tests in der Tat sehr fragil, letzteres funktioniert wie schon oft geschrieben stabil, perfomant und tadellos.

    Ich würde vorschlagen, den Rest der Diskussion zu führen, wenn du tatsächlich den bei mir in Verwendung stehenden Code gesehen hast. Wobei ich sie in Teilen nicht als besonders zielführend empfinde. Momentan liegt dir lediglich die Vorlage vom Elektroniker und eine vage Vorstellug vor. Alternativ könnten wir es auch so machen, dass du meinen Code bekommst, optimieren kannst, und wir stellen dann den optimierten hier zur Verfügung sowie den Matrix-Code. Dann kann sich jeder Leser aussuchen, was er benutzen will.

    • Offizieller Beitrag

    Dass die Matrix mehr Zeit zur Abfrage benötigt kann man nicht generell sagen.

    Ich betrachte es immer nicht nach Mikrosekunden sondern nur nach evtl. hörbarer Latenz. Und da sind die evtl Zeitunterschiede ganz weit von entfernt.

    Zur Technik

    Abfrage durch einem Scanner mit Logik-Gattern:

    Würde man zur Abfrage der Tastatur z B. die Anstiegsflanken einer gedrückten Taste und des eingeschalteten Sammel-Kontaktes der Matrix vergleichen käme immer alle 8 Töne ein Impuls vom Sammelkontakt hinzu.

    D.h. anstatt 64 Einzeltöne würden 64 + 8 = 72 Abfragen nötig. Bei einer Taktfrequenz von

    4 MHz dauerte die Abfrage des Manuals tat sächlich 8 x 0,25 us = 2 us länger. Dazu müsste die Matrix oder der Scanner aber einen Schmitt-Trigger beinhalten, der verlässlich aus dem Tastenschalter eine Flanke erzeugt.

    Den gibt es in der Matrix und im Scanner nicht.

    Tatsächlich schaltet der Sammelkontakt mit der ersten abzufragenden Taste gleichzeitig um sodass ein zusätzlich zu verarbeitender Zustand nicht entsteht und zeitlich genau 64 Abfragen stattfinden. Es wird on / off abgefragt.

    Eine gleichzeitige Einschaltung und Abfrage von Sammelkontakt und ersten Ton funktioniert zuverlässig. Sonst würden alle AND, OR, EXOR und ihre Umkehrungen nicht funktionieren.

    Beide Abfragen sind bis auf Toleranzen der eingesetzten Gatter zeitgleich.

    Abfrage über z.B. einen Arduino:

    Ein Zeitunterschied zwischen dem Befehl: "Sammelkontakt einschalten" und dem Befehl: "Taste 1 abfragen" kann evtl relevant werden wenn der Arduino nicht gleichzeitig zwei Befehle verarbeiten kann. Ich habe mich mit dem Arduino noch nicht beschäftigt.

    In dem Fall dauert die Abfrage der Matrix

    8 Befehlszeiten länger als zur Abfrage von 64 Einzelkontakten.

    Zeitunterschiede der Abfrage von 64 Kontakten im Gegensatz zur 8 x 8 Matrix entstehen, wenn überhaupt, nur durch die Art der Abfragetechnik