INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Programmierung eines MIDI-Controllers
07.01.2019, 12:16
Beitrag #1
Programmierung eines MIDI-Controllers
Hallo Forengemeinde,

wie ihr sicher schon bemerkt habt, bin ich neu hier. Dummerweise nicht nur neu hier, sondern auch ziemlich neu beim Thema Arduino bzw. Microcontroller.
Vorneweg muss ich sagen, dass mich ein konkretes Problem dazu gebracht hat, mich mit Arduino und Co auseinanderzusetzen und nicht der allgemeine Wunsch etwas mit Elektronik zu machen. Es ist nur so, dass ich keine passende Lösung für mein Problem von der Stange finden konnte, und daher etwas Eigenes stricken muss. Daher ist es jetzt auch nicht meine Absicht Arduino-Bücher zu lesen, sondern mir wirklich gezielt die Dinge für mein Projekt zu erarbeiten. Wenn ich dabei auf den Geschmack komme, kann es später auch gerne weiter in die Tiefe gehen. Das Durchkauen von Büchern hat nur den Nachteil, dass man hinterher feststellt, dass man sich jede Menge Zeugs reingezogen hat, das man dann doch nicht benötigt und man die Zeit sinnvoller hätte verwenden können.
Daher erhoffe ich mir vom Forum, dass die Leute mit Überblick so eine Art Wegweiser-Funktion übernehmen, und mich davor bewahren zuviel Zeit in gerad nicht benötigtes Wissen zu investieren.
Wenn mein Projekt mal läuft, findet sich hoffentlich auch der ein oder andere Crack, der meinen wahrscheinlich noch sehr ungelenken und holprigen Code ein wenig betriebssicherer und eleganter machen kann, bzw. mir zeigt wie man das macht.

Aber nun zu meinem Problem/Projekt:

Es gibt verschiedenen Programme, die dazu dienen digital gesamplete Klänge in Echtzeit abzuspielen. Dies ist z.B. bei digitalen Aufnahmen von Pfeifenorgeln sehr verbreitet.
Das Prinzip ist hierbei eigentlich ganz einfach: Eine midi-fähige Klaviatur wird ausgelesen und ein entsprechendes Programm spielt den digitalen Originalklang über einen PC und die angeschlossene Soundanlage ab. Die Feinheiten der Klangerzeugung lasse ich hier mal weg, weil nicht relevant. Wenn jemand da mehr zu erfahren mag, gerne im Off-Topic-Bereich des Forums.

Die Kommunikation erfolgt hierbei nach dem MIDI-Protokoll. Meistens wird hier mit NoteOn und NoteOff-Befehlen gearbeitet, da bei 16 Kanälen mit jeweils 128 möglichen Einzelnoten 2048 einzelne Aktionen möglich sind.

Da man diese große Anzahl der Möglichkeiten bei einer Orgel nur für das Auslesen der Manuale und des Pedals nicht benötigt, werden die NoteOn und NoteOff-Befehle meistens auch zur Steuerung diverser Schalter und sonstiger Taster verwendet.

Um die PC-Software zu steuern, kommen oft Touchscreens zum Einsatz. Dies kommt für mich jedoch nicht in Frage, da ich an meiner Orgel keinen Platz zur Aufstellung zweier Touchscreens habe, und die Dinger außerdem in entsprechender Größe echt teuer sind.
Daher möchte ich das Ganze mit Tastern lösen, die an die Digitalpins eine Microcontrollers angeschlossen sind.

Ich habe mal eine Skizze angefertigt, aus der hervorgeht, wie ich mir das vorstelle:
   
Der Ablauf soll folgender sein:
Am Anfang sind alles Funktionen auf aus und die Leds dementsprechend dunkel.
Drückt man einen Taster, so soll die Zustandsvariable (jetzt natürlich 0) geprüft werden. Das Prüfergebnis und der gedrückte Taster lösen einen Midi-Befehl (x-einschalten) aus, der an das Midi-Gerät gesendet wird.
Das Gerät führt den Befehl aus und meldet das mit einem Midi-Befehl zurück, der die Zustandsvariable ändert.
Die geänderte Zustandsvariable führt zum Einschalten der entsprechenden Status-Led .
Ein erneuter Tasterdruck führt zusammen mit der geänderten Zustandsvariablen (jetzt 1) zu einem neuen Midi-Befehl (x-ausschalten), der an das externe Gerät gesendet wird.
Ab hier beginnt jetzt der der Rückmeldekreislauf von vorn.

Die Skizze habe ich nicht nur zur Erklärung gemacht, sondern ich habe recht früh festgestellt, dass ich mir die Fragestellung visualisieren muss, weil sonst den Überblick verliere. außerdem erscheint es mir sinnvoll das Projekt zu portionieren, da ich mir verschiedene Teilaspekte erarbeiten muss:
1. Abfrage so vieler Taster (pollen oder Interrupt, If oder case select)
2. Midi-Kommunikation
3. Umgang mit der Neopixel Library für die Status Leds
4. Sinnvoller Einsatz von Variablen/Array
5. Vermeidung unerwünschter Zufallsereignisse

Ich hatte vor, dies in dieser Reihenfolge anzugehen, da man die ersten 3 Punkte ohne großartige Hardwarebasteleien angehen kann und Ergebnisse mit dem Seriellen Monitor oder einem Midi-Monitor sichtbar gemacht werden können. Einen Neopixelstreifen mit 3 Kabeln anklemmen ist ja auch nicht das Ding.

Hardwareseitig hatte ich vor mit einem Teensy 2++ zu arbeiten. Der hat ausreichend 5V tolerante Pins, damit man erstmal ohne Schieberegister, Portexpander und ähnliches auskommt. Außerdem, und das ist das Wichtigste, er kann nativ über USB als Midi-Device auftreten, während man beim Arduino (Leonardo oder ProMicro) den USB-Chip flashen muss, was dann aber dazu führt, dass man diesen Vorgang bei jeder Programmänderung rückgängig machen muss, um den Sketch hochladen zu können. Jeder Änderung würde also 2x flashen des USB-Chips bedeuten.
Aufgrund seiner Midi-Fähigkeit gibt es für den Teensy eine sehr gute Midi-Library, die es einem abnimmt jeden Befehl Byte für Byte in Hex-Zahlen ausdrücken zu müssen.

Das mal soweit, ist ja auch für den Anfang ne ganze Menge.
Ich wäre sehr dankbar, wenn ihr mich in den einzelnen Rubriken jeweils in die richtige Richtung stupsen könntet, damit ich mir das Notwendige zielgerichtet und nicht per Gieskannenprinzip aneignen kann.

VG und besten Dank für eure Hilfe

Schraubfix
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.01.2019, 13:23
Beitrag #2
RE: Programmierung eines MIDI-Controllers
Sollen mehrere Tasten gleichzeitig möglich sein oder wird dann die als erstes erkannte genommen?
Als Matrix ist 32 (8*4) der bessere Wert. Du musst die 2 zusätzlichen Tasten ja nicht anschließen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.01.2019, 13:45
Beitrag #3
RE: Programmierung eines MIDI-Controllers
(07.01.2019 13:23)Tommy56 schrieb:  Sollen mehrere Tasten gleichzeitig möglich sein oder wird dann die als erstes erkannte genommen?
Als Matrix ist 32 (8*4) der bessere Wert. Du musst die 2 zusätzlichen Tasten ja nicht anschließen.

Gruß Tommy

Hallo Tommy,

danke für deine schnelle Antwort. 32 Taster wären auch kein Problem. Es kommen später ja immer mal neue Wünsche/Ideen dazu. Da würde sich schon eine Verwendung finden.

Ich hatte allerdings nicht an eine klassische Matrix gedacht, sondern eher jeden Taster an einen der 36 Digital I/O Pins des Teensy++ hängen wollen, um die zeitgleiche Betätigung mehrere Taster zu ermöglichen.
Bei einer Matrix könnte man zwar ordentlich Pins sparen, allerdings müsste ich dann eine Gitter aus Widerständen und Entkopplungsdioden dazu löten.

Ich sitze gerade am Auslesen der Taster und der Zustandsvariablen, wo die letzte Rückmeldung des externen Midi-Geräts gespeichert werden soll.

Ich hatte hier an ein Array gedacht um nicht 2 x 30 Variablen einzeln deklarieren zu müssen. Hat ein Array beim Arduino immer das Integer-Format und frisst daher 16 Bit pro Feld, oder kann man das auch als Byte oder Bool aufsetzen? Eigentlich muss in der Variablen ja immer nur an oder aus stehen.

Angenommen ich würde tatsächlich einzelne Variablen für jeden Taster und jede Led benötigen, könnte man die mittels einer for-Schleife einfach fortlaufend bei Programmstart deklarieren lassen?

VG
Schraubfix
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.01.2019, 14:04
Beitrag #4
RE: Programmierung eines MIDI-Controllers
(07.01.2019 13:45)Schraubfix schrieb:  Ich hatte allerdings nicht an eine klassische Matrix gedacht, sondern eher jeden Taster an einen der 36 Digital I/O Pins des Teensy++ hängen wollen, um die zeitgleiche Betätigung mehrere Taster zu ermöglichen.
Ich hatte hier an ein Array gedacht um nicht 2 x 30 Variablen einzeln deklarieren zu müssen. Hat ein Array beim Arduino immer das Integer-Format und frisst daher 16 Bit pro Feld, oder kann man das auch als Byte oder Bool aufsetzen? Eigentlich muss in der Variablen ja immer nur an oder aus stehen.
[/quote]
Du kannst auch byte oder bool (was auch 1 Byte lang ist) als Datentyp nehmen.
Code:
const byte anzahl = 30;
bool status[anzahl];
...
void initStatus() {
  for(byte i=0;i<anzahl;i++) status[i]=false;
}
Etwas umständlicher zu nutzen aber noch platzsparender sind Bitfelder. Bei 30 auf Teensy halte ich das aber nicht für notwendig.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.01.2019, 10:49 (Dieser Beitrag wurde zuletzt bearbeitet: 08.01.2019 17:13 von Schraubfix.)
Beitrag #5
RE: Programmierung eines MIDI-Controllers
Hallo,

ich habe mich dann gestern Abend doch mal hingesetzt und einen "Erprobungsträger" zusammengelötet:
   

Eigentlich eine simple Platine:
5 Drucktaster
5 WS2812b
1 Widerstand auf der Datenleitung der Leds
1 Kondensator zwischen 5V und GND in der Stromversorgung der Led

Als Microcontroller verwende ich einen Arduino Nano V3-Clone. Lustigerweise lässt er sich mit der IDE nur als UNO ansprechen und ignoriert die Ansprache als Arduino Nano. Da hat der freundliche Chinese wohl einen Uno Bootloader aufgeflashed. Naja, wenn man es erstmal rausbekommen hat, verschwinden auch die Fehlermeldungen beim Upload des Sketch.Idea

VG
Schraubfix
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.01.2019, 16:42 (Dieser Beitrag wurde zuletzt bearbeitet: 08.01.2019 16:44 von MicroBahner.)
Beitrag #6
RE: Programmierung eines MIDI-Controllers
Was da auf deinem Bild zu sehen ist, ist aber ein Nano und kein Micro. Ein Micro hat einen ganz anderen Prozesser ( 32u4 statt 328P ), da kann man nicht einfach einen UNO Bootloader draufspielen. Deinen Arduino solltest Du in der IDE auch als Nano ansprechen.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.01.2019, 17:25
Beitrag #7
RE: Programmierung eines MIDI-Controllers
(08.01.2019 16:42)MicroBahner schrieb:  Was da auf deinem Bild zu sehen ist, ist aber ein Nano und kein Micro. Ein Micro hat einen ganz anderen Prozesser ( 32u4 statt 328P ), da kann man nicht einfach einen UNO Bootloader draufspielen. Deinen Arduino solltest Du in der IDE auch als Nano ansprechen.
Du kannst in der IDE alten Bootlader und "neuen" Bootlader (unter Prozessor) für den Nano wählen. Evtl. hilft Dir das weiter.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.01.2019, 17:44
Beitrag #8
Die Tasterabfrage und ich
Hallo,

ich habe jetzt mal versucht die einzelnen Anteile, abgesehen vom MIDI-Part, zusammenzubasteln.

Allerdings reagiert der Sketch nicht wie beabsichtigt. Ich kann zwar die einzelnen Neopixel direkt aufrufen, aber auf Tasterdruck passiert gar nichts. Da ich die Verkabelung inzwischen mehrfach geprüft habe, nehme ich an, dass meine if-Abfrage fehlerhaft ist. Allerdings sehe ich gerade nicht woran es hängt, und wahrscheinlich ist es für euch ganz offensichtlich. Hier daher mal mein Code:
Code:
// NEOPIXEL
#include <Adafruit_NeoPixel.h>
const int DATAPIN = 8;
const int NUMLEDS = 5;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMLEDS, DATAPIN, NEO_GRB + NEO_KHZ800);

//Initialisierung der Taster-Pins und nötige Arrays
bool Status[] = {false,false,false,false,false};
int Tasterpins[] = {2,3,4,5,6};


void setup() {
  // put your setup code here, to run once:
strip.begin();
strip.setBrightness(32);
strip.show();
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
}

void loop() {
  // put your main code here, to run repeatedly:
  for (int i=0; i<5; i++)
  {
if ((digitalRead (Tasterpins[i]) == LOW) && (Status[i] == false)) Status[i] == true;
if ((digitalRead (Tasterpins[i]) == LOW) && (Status[i] == true)) Status[i] == false;
if (Status[i] == true) strip.setPixelColor(Status[i], 77,89,39);

  }
  strip.show();
  }

Die Tasterabfrage habe ich mit einer for-Struktur in den Loop-Teil gepackt, um die Abfrage immer wieder ablaufen zu lassen. Hinter der for-Struktur steht dann der Aufruf des Neopixel-Streifens, da man jeden Pixel erst setzen muss, bevor man die Ausgabe mit show.strip() starten kann. Bei jedem Aufruf des Befehls show muss jeder Pixel neu gesendet werden, da die Information ja durch die komplette Kaskade der IC in den Leds geschoben werden muss.

@MicroBahner: Grundsätzlich gebe ich dir Recht und der Micro an Stelle des Nano war ein Schreibfehler/Verwechslung von mir. Seltsamerweise stellt sich der Nano jedoch tot und verweigert den Upload, wenn ich ihn als Nano anspreche. Hatte auch erst gedacht, dass das Teil kaputt wäre, bis ich dann auf Arduino.cc gelesen habe, dass ein Forenuser dort das gleiche Problem hatte und durch Zufall bemerkt hat, dass UNO plötzlich funktionierte. Also habe ich das auch ausprobiert und kann tatsächlich alle Demosketches problemlos als UNO hochladen.
K.A. warum das so ist, aber wenn es als Nano nicht und als UNO funktioniert, so sei es drum. Es sei denn, ihr sagt mir jetzt, dass ich den Bootloader besser flashen soll, weil es sonst interne Probleme geben könnte?

VG
Schraubfix
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Programmierung eines ToF-Abstandssensors fragesteller1 3 159 01.02.2019 23:21
Letzter Beitrag: Tommy56
Music MIDI Software optimieren solarmusic 6 371 22.11.2018 18:20
Letzter Beitrag: Tommy56
  Prüfung eines Drucksensors mit Hilfe des Arduino r4c3 20 4.468 17.11.2018 18:25
Letzter Beitrag: Bitklopfer
  Ändern der Reihenfolge eines "Lauflichtes" rebeldesigned 3 379 05.11.2018 12:07
Letzter Beitrag: rebeldesigned
  Arduino Nano Programmierung Relais Mister_ACE 27 2.476 30.09.2018 09:22
Letzter Beitrag: Mister_ACE
  Probleme beim Hochladen eines Sketches Thandor 8 2.465 08.06.2018 13:19
Letzter Beitrag: Thandor
  Vorüberlegungen zum Bau eines Hexapoden juergen001 11 2.442 20.05.2018 23:02
Letzter Beitrag: GuaAck
  MIDI Kontroller programmieren Baimie 9 1.437 16.05.2018 09:12
Letzter Beitrag: Tommy56
  Hilfe bei der Programmierung Digitaluhr ,mit Anzeige 32x8 Lora 1 690 10.03.2018 11:44
Letzter Beitrag: hotsystems
Question Hilfe bei Programmierung Niklas 15 1.871 02.02.2018 12:55
Letzter Beitrag: Niklas

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste