Go Down

Topic: Midi Clock selbst basteln (Read 4692 times) previous topic - next topic

ladio

Dec 22, 2013, 12:27 pm Last Edit: Dec 22, 2013, 12:39 pm by ladio Reason: 1
Hallo zusammen.

Ich möchte mit Arduino eine Midi Clock basteln um bei meinem MicroKorg Synthesizer über den MIDI Eingang das Tempo in Beats per minute (BPM) über einen Tap Button zu definieren. zusätzlich soll das eingetappte Tempo auf einem Display angezeigt und über einen Drehregler angepasst werden können. Insgesamt sollen zwei MIDI Ausgänge und zwei 6,3mm Klinkenanschlüsse für die Weitergabe des Tempos an andere Geräte vorhanden sein.

Um mir nicht zu viel vorzunehmen und die Laune zu verlieren teile ich das Projekt in drei Schritte auf.
(Punkte bei denen ich noch Bedenken habe sind in der Farbe Türkis dargestellt.)

Schritt 1: Definition und Anzeige des Tempos
- Eingabe des Tempos über einen Taster
- Alternative Einstellmöglichkeit über ein Dreh-Potentiometer
- Anzeige des Tempos über eine blinkende LED
- Anzeige des Tempos auf einem bereits vorhandenen 16x2 LCD-Display mit Hintergrundbeleuchtung (HD44780 Treiber)

Schritt 2: Output für Tempo-Informationen
- MIDI Output zur Weitergabe des Tempos an den Synthesizer (Mit Tempo Informationen per MIDI an sich habe ich noch keine Erfahrung, aber habe schon gesehen, dass es einige Beiträge dazu gibt.)
- Zusätzlichen MIDI Output zur Weitergabe des Tempos an einen Drum Computer / akustisches Metronom
- mehrere 6,3mm Klinkenausgänge zur Weitergabe des Tempos an verschiedene Boden Gitarren-Effektgeräte (Kurzschlussgefahr beim Einstöpseln)

Schritt 3: Eventuelle updates / features
- Ersetzen des Dreh-Potentiometers durch einen rotary encoder. Damit will ich ein bereits eingetapptes Tempo leicht variieren und wird nicht wie beim Potentiometer ignoriert und durch einen neuen Wert überschrieben. (Die Nutzung eines rotary encoders erscheint mir noch sehr kompliziert und ich hoffe, dass sich da vielleicht etwas eleganteres finden lässt. Vielleicht ein Button für +1bpm und einer für -1bpm)
- Generieren eines akustischen Metronom Signals und Ausgabe über 3,5mm Klinkenbuchse (Kurzschlussgefahr beim Einstöpseln)

Ich freue mich über jeden, der spaß an dem Thema hat und Lust hat Ideen oder Erfahrungen beizutragen.

edit: Mir ist übrigens bewusst, dass es ein Produkt gibt, was fast alles kann, was ich haben will (http://www.midiclock.de), aber ich will ja auch mal wieder ein bisschen basteln und 200€ für sowas einfaches ist mir auch zu viel.

Klaus_ww

Schönes Projekt, gefällt mir.
Die Einteilung in kleinere Projekte ist sicher sinnvoll - und noch sinnvoller ist m.E., sich von Klinkensteckern zu verabschieden  8)
Hab als Einstieg einen Midi-Controler gebaut (daher auch mein Avatar, ist das Midi-Shield), werde also hier am Ball bleiben und mitlesen.
Wenn Du nicht weiterkommst - einfach fragen!
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

ladio

Hallo Klaus_ww, vielen Dank für deine Antwort.

Ich würde sehr gerne auf Klinkenstecker verzichten (Meiner Meinung nach ist das eine schreckliche Erfindung wegen dem Kurzschluss beim Einstecken). Das Problem ist nur, dass alle Gitarren Delay/Echo Effektgeräte (Bsp: http://www.thomann.de/de/boss_dd20_giga_delay.htm) die Tempo Informationen über ein eingebautes Tap Pedal bekommen und sie haben oft die Möglichkeit ein externes Tap Pedal über die 6,3mm Klinkenbuchse anzuschließen. Also muss ich entweder bei jedem Effektgerät einen neuen Stecker anlöten oder nutze den vorhandenen 6,3mm Klinkeneingang. (Wo ich jetzt gerade aber nochmal drüber nachdenke, erscheint es mir ganz akzeptabel einen neuen Anschluss anzulöten um dieses Kurzschlussproblem zu umgehen.)

Ich hatte zum Thema Kurzschluss beim Klinkenstecker schon mal ein Thema hier gestartet aber leider vernachlässigt (http://forum.arduino.cc/index.php?topic=176265). Die Tipps dort waren aber sehr hilfreich und ich glaube, dass es damit möglich wäre den Klinkenanschluss problemlos zu nutzen, es wäre nur wieder etwas aufwändiger.

Oder fällt dir etwas ein, wie man das Problem umgehen könnte?

Klaus_ww

Naja, Midi läuft ja per Stromschleife - da ist ein kurzer Kurzer wegen der Strombegrenzung nicht so tragisch. Man kann natürlich auch erst verkabeln und dann einschalten.
Letztlich sind die Midi-Stecker/Buchsen auch nicht das Gelbe vom Ei was z.B. Zugentlastung angeht, andererseits reißt man so nix vom Ständer wenn jemand drüberstolpert.
Also wie immer: alles hat zwei Seiten
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

ladio

#4
Jan 09, 2014, 04:27 pm Last Edit: Jan 09, 2014, 04:29 pm by ladio Reason: 1
Hallo. Also ich will mal eben ein update posten:

Ich habe jetzt ein Potentiometer zum Einstellen der Geschwindigkeit, einen Schalter zum umschalten vom Modus "Voreingestellte BPMs" und "Frei einstellbare BPMs". Auf dem Display wird die Geschwindigkeit in BPM angezeigt und der Songtitel bzw. "Freier Modus" je nach Schalter Stellung. Das Tempo wird außerdem über den Befehl Serial.write(248) als MIDI Signal herausgegeben (MIDI Stecker ist schon fertig gelötet).

Das alles liegt jetzt noch etwas lose herum und wartet darauf in einem schicken case untergebracht zu werden. Das hat aber noch etwas zeit. Vorher muss noch das Tap Tempo über den 6,3mm Klinkenanschluss ausgegeben werden. Ich habe durch weiteres recherchieren herausgefunden, dass ich gar kein Kurzschluss-Problem mit dem Klinkenanschluss fürs Tap Tempo haben werde...
@Klaus_ww: die MIDI Ausgabe habe ich auch nur an dem MIDI DIN Stecker. Am Klinkenstecker kommt das Tap Tempo, was mit MIDI nichts zutun hat. Es nutzt lediglich den gleichen vordefinierten Rhytmus. Da das Signal fürs Tap Tempo eine 9V Stromschleife ist, die bei jedem Viertel-Schlag abwechselnd geschlossen und geöffnet werden muss, werde ich einfach einen Transistor benutzen wie diesen hier: http://www.conrad.de/ce/de/product/154598/Bipolar-Standard-Leistungstransistor-Fairchild-Semiconductor-BC337-16-NPN-Gehaeuseart-TO-92-IC-1-A-Emitter-Sperrspannun?ref=searchDetail.

Das wird jetzt erstmal der nächste Schritt sein. Anschließend möchte ich das Programm etwas umschreiben, sodass man durch zwei Buttons das eingestellte Tempo um einen bpm Schritt herauf oder herab stellen kann.

Klaus_ww

Klingt gut - mach doch mal ein Bild vom Drahtverhau  :D
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

ladio

Hier ist mal ein Foto mit Beschreibung der einzelnen Teile.

Vorsicht falls es jemand nachbauen will:
Am roten Kabel vom MIDI Ausgang ist ein 220 Ohm Widerstand, der auf dem Foto nicht zu sehen ist, da er mit Schrumpfschlauch umhüllt ist.

doederino

Würdest du deinen Sketch mal hier posten, damit ich mir ansehen kann, wie du das machst?

jurs


Würdest du deinen Sketch mal hier posten, damit ich mir ansehen kann, wie du das machst?


Ich weiß zwar nicht, was der Thread-Starter inzwischen für einen Code hat, aber mein Google findet Code für so ein Vorhaben ohne Probleme, z.B.:
https://github.com/gretel/MIDIsync

ladio

Ich werde jetzt hier nicht mein ganzes sketch rein laden, weil es sehr spezifisch auf unsere Songs ausgerichtet und nicht sehr übersichtlich, aber wenn du mir sagst, was genau du davon brauchst, räume ich den Teil auf und lade ihn hier hoch ;-)

doederino

#10
Apr 04, 2014, 12:42 pm Last Edit: Apr 04, 2014, 01:27 pm by doederino Reason: 1
Ich würd gerne wissen, wie du die ticks schickst. Ich hab das mal so gebastelt, werde später gucken, ob das so funktioniert:

Code: [Select]

byte midi_clock = 0xf8;
long previousMillis = 0;

void setup() {
  Serial.begin(31250);
  }

void loop() {
 
  int val_read = analogRead(1);
  int val = map(val_read, 1, 1023, 50, 200);
  int ticks = 60000/(24*val);
  unsigned long currentMillis = millis();
   
  if(currentMillis - previousMillis > ticks) {
    previousMillis = currentMillis;
    Serial.write(midi_clock);
  }
}

ladio

hier der Teil für die MIDI "Ticks":

Code: [Select]

tempo = 1000/(bpm/60);       // tempo for midi clock
MIDIinterval = tempo/24;     // tempo for midi clock
Blinkinterval = tempo/2;       // tempo for LED and Tap Tempo out

unsigned long MIDIcurrentMillis = millis();
if(MIDIcurrentMillis - MIDIprevMillis > MIDIinterval) {
    MIDIprevMillis = MIDIcurrentMillis;
Serial.write(0xF8);
}

Go Up