Forum: Mikrocontroller und Digitale Elektronik MIDI Protokoll


von Matze77 (Gast)


Lesenswert?

Hallo µC gemeinde,

Ich weis nicht ob ich hier überhaupt richtig bin aber beim letztenmal 
habt ihr mir wunderbar geholfen. Sollte der Beitrag hier nicht passen 
dan einfach verschieben.
So jetzt aber mal zu meiner frage und zwar kennt sich hier jemand mit 
dem MIDI Protokoll aus? ich wollte wissen ob das MIDI protokoll 
festgelegt ist sowie zum beispiel Hexcode oder binär.
Ich möchte einen Audrino MEGA 2560 so programmieren das er einen 
Syntheziser anspricht und die ausgeählten töne ausgibt.
ALso stell ich mir vor das auf dem I/O Port ein midi Code ausgegeben 
wird.
JETZT DIE FRAGE: Geht das überhaupt und wenn ja wie?

Danke schonmal

Gruß
Matze7

von Sam .. (sam1994)


Lesenswert?


von Bernhard R. (barnyhh)


Lesenswert?

1. es geht
2. wikipedia ist auch zum Thema "MIDI" Dein Freund. Dort kannst Du die 
relevanten Informationen bzw. Links zu entsprechenden Seiten finden.

Bernhard

von Lehrmann M. (ubimbo)


Lesenswert?

Matze77 schrieb:
> ich wollte wissen ob das MIDI protokoll
> festgelegt ist sowie zum beispiel Hexcode oder binär.

Midi ist ein Datenübertragungs-Protokoll
Hex und Binär sind Darstellungsweisen von Zahlen

das hat miteinander überhaupt nichts zu tun.

Google mal nach 'avr midi' ... ist doch wirklich nicht so schwer oder ?

von Matze77 (Gast)


Lesenswert?

Versteh ich das dann richtig wenn ich denke das ich einer hexzahl einen 
MIDI code zuweisen kann und dieser dann übr den MIDI Port an denn 
Synthesizer geht?

von Sam .. (sam1994)


Lesenswert?

Matze77 schrieb:
> Versteh ich das dann richtig wenn ich denke das ich einer hexzahl einen
> MIDI code zuweisen kann und dieser dann übr den MIDI Port an denn
> Synthesizer geht?

Eine Hex Zahl ist das: 5A der kannst du nichts zuweisen. Du kannst sie 
aber auch als 90 (Dezimal) 01011010 (Binär) oder 112 (Oktal) schreiben.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Matze77 schrieb:
> Versteh ich das dann richtig wenn ich denke das ich einer hexzahl einen
> MIDI code zuweisen kann und dieser dann übr den MIDI Port an denn
> Synthesizer geht?

Nein. Die MIDI-Codes sind bereits fertig definiert und zugewiesen, Du 
musst sie nur senden. Beispiel 0x90 0x45 0x7F schaltet zum Beispiel Note 
A auf Kanal 0 mit voller Lautstärke ein.

von Stefan P. (form)


Lesenswert?

1. UART auf 31250 Baud einstellen
2. TX-pin mit Synth verbinden
3. Messages senden: http://www.midi.org/techspecs/midimessages.php

von Matze77 (Gast)


Lesenswert?

gut ok Danke erstmal dann versteh ich das jetzt vielleicht richtig wenn 
ich sage dass das midi protokoll immer das selbe ist. unabhängig vom 
synthesizer!
Nochmal für mich: ich gebe im MIDI protokoll lediglich an welcher ton 
auf welchem Kanal wie laut ist. aber nicht das instrument (z.B. Piano) 
dieses muss ich am synthesizer einstellen.
Und ich kann die MIDI codes ganz normal in C an den entsprechenden MIDI 
port senden?

Gruß
Matze

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Matze77 schrieb:
> aber nicht das instrument (z.B. Piano)
> dieses muss ich am synthesizer einstellen.

Im Prinzip ja. Mit sogenannten "SysEx"-Messages kann aber an manchen 
Instrumenten auch deren Parametrierung über Midi erfolgen.

> Und ich kann die MIDI codes ganz normal in C an den entsprechenden MIDI
> port senden?

Wenn Du mit "MIDI port" die serielle Schnittstelle meinst, dann ja.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Matze77 schrieb:
> dann versteh ich das jetzt vielleicht richtig wenn
> ich sage dass das midi protokoll immer das selbe ist. unabhängig vom
> synthesizer!

Bedingt. Es gibt auch Sondermeldungen, sogenannte System Exclusive 
Messages, die nur von Geräten einer zugeordneten Marke verstanden 
werden. Weiterhin gibt es Messages, die von einigen Geräten nicht oder 
nicht vollständig implementiert werden. Nicht zuletzt deswegen findet 
man auf den letzten Seiten der Bedienungsanleitung die sogenannte 
MIDI-Implementationsliste (MIDI implementation chart)

Matze77 schrieb:
> ich gebe im MIDI protokoll lediglich an welcher ton
> auf welchem Kanal wie laut ist. aber nicht das instrument (z.B. Piano)
> dieses muss ich am synthesizer einstellen.

Ja und nein. Es gibt außer NoteOn auch noch ProgramChange Messages, die 
genau für das Umschalten der Instrumente gedacht sind. Weiterhin gibt es 
sogenannte Controller, mit denen man die Instrumente in Echtzeit 
verändern kann (Modulation/Effekt), wenn der Synth dies unterstützt.

Matze77 schrieb:
> Und ich kann die MIDI codes ganz normal in C an den entsprechenden MIDI
> port senden?

MIDI ist ein UART. Wenn Dein Controller ein UART besitzt, dann die 
Einstellungen meines Vorredners übernehmen und senden. Ob das in C oder 
E-Moll passiert, ist ganz egal ;-)

von Matze77 (Gast)


Lesenswert?

ah ok langsam kommt da licht ins dunkle ;)
Also noch hat es keine MIDI Schnittstelle (UART) aber das müsste ja auch 
so zu realisieren sein wie es hier beschrieben ist denke ich:

http://itp.nyu.edu/physcomp/Labs/MIDIOutput

und dann ainfach die acht schalter an die I/O Ports und gut is!?

von debounce (Gast)


Lesenswert?

Midi besteht ja aus einer Hardwareschnittstelle (Stecker und Pegel, idr. 
über Optokoppler angeschlossen) und der UART Schnittstelle (Baudrate, 
Parameter), wie oben auch schon angesprochen.

Darüber gehen dann die Signale.

www.ucapps.de bietet einen ganz guten Einstieg, da dort auch Projekte 
beschrieben sind. Müssen dann "nur" noch auf ARDUINO angepasst werden 
;-)

z.B. http://www.ucapps.de/mbhp_iic_midi.html

HTH

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Matze77 schrieb:
> wie es hier beschrieben ist denke ich:
>
> http://itp.nyu.edu/physcomp/Labs/MIDIOutput

Nicht ganz. Die MIDI-Ausgangsbuchse erhält normalerweise in jeder der 
beiden Signalleitungen einen Widerstand von 220 Ohm. Nur so ist 
sichergestellt, dass im Kurzschlussfall mit der Masse oder zwischen 
beiden Signalleitungen keine nennenswerten Ströme fließen. NIE legt man 
einen offenen Controllerpin direkt an eine nach außen führende Leitung.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Die Optokoppler sollten "schnelle" Typen sein, beliebt sind 6N137, die 
können bis zu 10 MHz, viele andere sind schon für die Midi-Baudrate 
31,25 kBd etwas langsam. Besonders Typen mit Darlington-Fototransistor 
liegen eher bei 10 kHz Grenzfrequenz, das wird knapp.
http://www.avagotech.com/pages/en/optocouplers_plastic/plastic_digital_optocoupler/

Lies auch mal über den "General MIDI" Standard nach, das ist in 
PC-Soundkarten enthalten. Da werden die Instrumente über Midi 
ausgewählt.
http://de.wikipedia.org/wiki/General_MIDI

von Matze77 (Gast)


Lesenswert?

Ich wollte es eigentlich schon so machen das ich das Instrument am 
synthesizer auswähle und einfach nur mit dem Microcontroller auf den 
MIDI in des Synt geh und dieser dann über verstärker und LS die töne 
ausspuckt.

Also die lieste des general MIDI entspricht der liste die auch dem 
synthesizer beiliegt. von daher passt das ja.

wäre es denn dann am einfachsten mir so ne fertige schnittstelle für den 
arduino zu holen. oder bau iich das am schnellsten selbst mit optokopler 
und Widerständen?

von Matze77 (Gast)


Lesenswert?

Hi zusammen,

Kann mir mal bitte jemnad helfen ich hab da mal was in WinAVR 
geschrieben aber da sind ne menge Fehler drin und ich bin mit winavr 
nicht so vertraut kann mir vielleeicht einer erklären oder helfen wie 
das programm richtig auszusehen hat:

#include <avr/io.h>
#include <stdlib.h>
#define BAUDRATE 31250

int LS1 = PL0;
int LS2 = PL1;
int LS3 = PL2;
int LS4 = PL3;
int LS5 = PL4;
int LS6 = PL5;
int LS7 = PL6;
int LS8 = PL7;
int power = 1;
int tx0 = 0x00 0x00 0x00;      //deklaration der Variablen

int main (void)
{
do                   // Endlosschleife
{

if (LS1=0);              //Abfrage der 1 Lichtschranke Note C

  do
  {
    tx0=0x81 0x3C 0x88;      //Ausgangsport tx0 mit der Kanal1 (0x81) 
Note C (0x3C) Lautstärke (0x88)
  }

  while (LS1=0);

if (LS2=0);              //Abfrage der 2 Lichtschranke Note D

  do
  {
    tx0=0x81 0x3E 0x88;      //Ausgangsport tx0 mit der Kanal1 (0x81) 
Note C (0x3E) Lautstärke (0x88)
  }

  while (LS2=0);

if (LS3=0);              //Abfrage der 3 Lichtschranke Note E

  do
  {
    tx0=0x81 0x40 0x88;      //Ausgangsport tx0 mit der Kanal1 (0x81) 
Note C (0x40) Lautstärke (0x88)
  }

  while (LS3=0);

if (LS4=0);              //Abfrage der 4 Lichtschranke Note F

  do
  {
    tx0=0x81 0x41 0x88;      //Ausgangsport tx0 mit der Kanal1 (0x81) 
Note C (0x41) Lautstärke (0x88)
  }

  while (LS4=0);

if (LS5=0);              //Abfrage der 5 Lichtschranke Note G

  do
  {
    tx0=0x81 0x43 0x88;      //Ausgangsport tx0 mit der Kanal1 (0x81) 
Note C (0x43) Lautstärke (0x88)
  }

  while (LS5=0);          //Abfrage der 6 Lichtschranke Note A

if (LS6=0);

  do
  {
    tx0=0x81 0x45 0x88;      //Ausgangsport tx0 mit der Kanal1 (0x81) 
Note C (0x45) Lautstärke (0x88)
  }

  while (LS6=0);

if (LS7=0);              //Abfrage der 7 Lichtschranke Note H

  do
  {
    tx0=0x81 0x47 0x88;      //Ausgangsport tx0 mit der Kanal1 (0x81) 
Note C (0x47) Lautstärke (0x88)
  }

  while (LS7=0);

if (LS8=0);              //Abfrage der 8 Lichtschranke Note C

  do
  {
    tx0=0x81 0x48 0x88;      //Ausgangsport tx0 mit der Kanal1 (0x81) 
Note C (0x48) Lautstärke (0x88)
  }

  while (LS8=0);

}
while (power=1);

return 0;
}


Brauch da echt dringend hilfe hab mich total verrannt und übernommen!

Danke schonmal

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Matze77 schrieb:
> tx0=0x81 0x3C 0x88;      //Ausgangsport tx0 mit der Kanal1 (0x81)
> Note C (0x3C) Lautstärke (0x88)

Der Befehl sollte 0x91 0x3C 0x88 lauten, da 0x81 die Note 
_aus_schaltet.

Demzufolge musst Du zu dieser jetzigen noch eine weitere Bedingung 
schaffen, die die Noten ausschaltet, wenn die Lichtschranken wieder frei 
sind. MIDI-Signale werden immer nur dann gesendet, wenn der Zustand der 
Tasten/Regler verändert wird. Du solltest also in einer Routine alle 
Lichtschranken abfragen und die Ergebnisse in einen Speicherblock 
eintragen. Sind beim nächsten Durchlauf Unterschiede zum vorherigen 
Durchlaug festgestellt worden, wird die entspechende MIDI-Meldung 
generiert. Nach allen Ausgaben wird der Speicherblock mit den neuen 
Ergebnissen aktualisiert, um beim nächsten Mal die Unterschiede 
festzusellen. Sollten die Tasten prellen, muß man mehrere Ergebnisse 
miteinander vergleichen und erst nach einer Mehrheitsentscheidung die 
Betätigung der Taste auswerten.

von Matze77 (Gast)


Lesenswert?

ok, Dnake schonmal...das heist in demfall sollte das ganze so aussehen 
pro LS:

if (LS1=0);              //Abfrage der 1 Lichtschranke Note C

  do
  {
    tx0=0x91 0x3C 0x88;      //Ausgangsport tx0 mit der Kanal1 (0x81) 
Note C (0x3C) Lautstärke (0x88)
  }

  while (LS1=0);

if (LS1=0);              //Abfrage der 1 Lichtschranke Note C

  do
  {
    tx0=0x81 0x3C 0x88;      //Ausgangsport tx0 mit der Kanal1 Note aus
  }

aber was ist mit dem eigentlichen programm kann das denn so 
funktionieren?
Sorry bin schon ne weile weg vom Stoff!

von Simon B. (nomis)


Lesenswert?

Matze77 schrieb:
> aber was ist mit dem eigentlichen programm kann das denn so
> funktionieren?

Nein. Was Du da geschrieben hast hat bestenfalls ungefähr etwas mit C zu 
tun.

> Sorry bin schon ne weile weg vom Stoff!

Dann mache Dir das Problem kleiner. Hänge eine LED an den 
Mikrocontroller und versuche die zum blinken zu bringen. Dann schließe 
eine Lichtschranke an und koppele die LED via Programm an deine 
Lichtschranke. Dann hast Du eine Basis die Du auf mehrere Lichtschranken 
aufbohren kannst.

Wenn das geschafft ist, dann kannst Du mal vorsichtig anfangen, die 
serielle Schnittstelle in Betrieb zu nehmen. Mit
1
tx0 = 0x81 0x3C 0x88;

geht das garantiert schief, das ist nichtmal gültiges C. Du wirst eine 
Hilfsfunktion brauchen um ordentlich mit der seriellen Schnittstelle zu 
kommunizieren.

Für all das findest Du hier im Forum und im Netz sehr viele Tutorials 
und Quellen. Du musst lernen, damit umzugehen und sie an Deine 
Problemstellung anzupassen. Wir können Dir hier im Rahmen eines Threads 
nicht die Grundzüge der Mikrocontroller-Programmierung beibringen, deine 
Hardware erraten und dein Problem lösen, das würde eine endlose, 
frustrierende Geschichte.

Wird leider nicht ohne etwas Arbeit deinerseits gehen.

Viele Grüße,
        Simon

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Soll das etwa ein C-Quelltext sein? Falls ja, solltest Du erst einmal 
die Programmiersprache erlernen, vorzugsweise direkt auf Deinem PC.

Anschließend kannst Du Dich der Microcontroller-Programmierung widmen.

Wenn Du es schaffst, auf dem Microcontroller Deiner Wahl einfach eine 
LED blinken zu lassen, und zwar mit Hilfe eines komplett 
selbstgeschriebenen Programms(!), kannst Du Dich mit den 
Peripherieblöcken vertraut machen, z.B. dem UART. Wenn Du es dann 
irgendwann geschafft hast, ein "Hello world!" über den UART an einen 
angeschlossenen PC zu schicken, kannst Du Dich mit MIDI usw. befassen. 
Nicht vorher, weil Dir einfach die Grundlagen fehlen...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Matze77 schrieb:
1
 #include <avr/io.h>
2
 #include <stdlib.h>
3
 #define BAUDRATE 31250
4
 
5
 int LS1 = PL0;  // für später: LS1 ist eine Variable. Kein Eingang!
6
 int LS2 = PL1;  // und was sind eigentlich PL0 und PL1?
7
 :
8
 int tx0 = 0x00 0x00 0x00; // HÄH? Wie soll denn das gehen? Drei Werte an tx0 zuweisen?
9
 
10
int main (void)
11
{
12
13
  // Hier muss erst mal die Hardware initialisiert werden!!
14
15
  do               // Endlosschleife
16
  {
17
     if (LS1=0);   // Abfrage der 1 Lichtschranke .. WELCHE LICHTSCHRANKE? LS1 ist eine Variable 
18
                   // --> und anschliessend: nichts tun. Wegen des Strichpunkts!!
19
  do
20
  {
21
    tx0=0x81 0x3C 0x88; // HUCH... das geht schon mal gleich gar nicht...
22
  }
23
  while (LS1=0);   // Und hier? Laufend weitersenden solange die Lichtschranke aktiv ist?
Kauf dir ein C-Buch, denn du hast ABSOLUT kein Problem mit WinAVR, 
sondern erst mal mit C! Und wenn du das grundsätzlich kapiert hast, dann 
lies hier im Forum das Tutorial zum GCC.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Lothar Miller schrieb:
>      if (LS1=0);   // Abfrage der 1 Lichtschranke .. WELCHE
> LICHTSCHRANKE? LS1 ist eine Variable
>                    // --> und anschliessend: nichts tun. Wegen des
> Strichpunkts!!

Nö, da ist keine wirkliche Abfrage, sondern eine Zuweisung mit einem 
konstanten Wert. Aus schon erwähntem Grunde ist das aber ohnehin egal.

von Matze77 (Gast)


Lesenswert?

jap ich hab das jetzt schon soweit verstanden ich hab da gedacht das die 
MIDI daten komplett gesendet werden konnen zwecks ton lautstärke etc.
Muss man doch nicht gleich so reagieren....

ich versuch doch nur wieder rein zu kommen.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Matze77 schrieb:
> ich hab da gedacht das die
> MIDI daten komplett gesendet werden konnen zwecks ton lautstärke etc.

Das Eine hat mit dem Anderen nichts zu tun. Ein UART sendet immer ein 
Byte zu einer Zeit. Will man mehrere Bytes schicken, muss man diese 
nacheinander in das Ausgaberegister schreiben. Bei MIDI muss man dafür 
Sorge tragen, dass alle zu einem Befehl gehörende Bytes zusammenhängend, 
also direkt nacheinander übertragen werden.

von Matze77 (Gast)


Lesenswert?

Hi zusammen,

Ich hab das jetzt alles mal soweit hingekriegt danke schonmal für die 
Unterstützung.
Jetzt hab ich ne frage und zwar meint ihr es wäre möglich das dich noch 
Polyphon zu betreiben? so das alle 8 LS gleichzeitig betätigt werden 
können?
Wenn ja wie muss ich mir das ungefähr vorstellen?

Gruß

von Sam .. (sam1994)


Lesenswert?

Matze77 schrieb:
> Hi zusammen,
>
> Ich hab das jetzt alles mal soweit hingekriegt danke schonmal für die
> Unterstützung.
Was hast du hingekriegt?
> Jetzt hab ich ne frage und zwar meint ihr es wäre möglich das dich noch
> Polyphon zu betreiben? so das alle 8 LS gleichzeitig betätigt werden
> können?
Das läuft normal über einen Lautsprecher (bei Stereo 2, mehr 
unterstützt midi nicht).
> Wenn ja wie muss ich mir das ungefähr vorstellen?
Die Kanäle werden gemischt. In Software oder Hardware.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Samuel K. schrieb:
> bei Stereo 2, mehr
> unterstützt midi nicht

Wer sagt denn sowas? MIDI unterstützt alles, was der Synthesizer kann. 
Es ist ein reines Steuerprotokoll und nicht in seinen Aufgaben 
limitiert. Über Controller kann man auch auf 7.1 routen, wenn nötig. 
MIDI wird auch zum Steuern von 64-kanaligen Lichtpulten benutzt. Da 
liegt das Problem also nicht.

Matze77 schrieb:
> Jetzt hab ich ne frage und zwar meint ihr es wäre möglich das dich noch
> Polyphon zu betreiben? so das alle 8 LS gleichzeitig betätigt werden
> können?
> Wenn ja wie muss ich mir das ungefähr vorstellen?

Dazu musst Du den Synthesizer anweisen, ein entsprechendes Audiorouting 
durchzuführen, so dass das Anspielen bestimmter Stimmen oder MIDI-Kanäle 
auf verschiedenen Audio-Kanälen ausgegeben wird. Dies geschieht über 
sogenanntes 'Mapping'.

von Sam .. (sam1994)


Lesenswert?

Knut Ballhause schrieb:
> Wer sagt denn sowas? MIDI unterstützt alles, was der Synthesizer kann.
> Es ist ein reines Steuerprotokoll und nicht in seinen Aufgaben
> limitiert. Über Controller kann man auch auf 7.1 routen, wenn nötig.
> MIDI wird auch zum Steuern von 64-kanaligen Lichtpulten benutzt. Da
> liegt das Problem also nicht.

Naja es gibt nur einen Stereobalance Befehl, alles andere ist 
Geräte-spezifisch.

von Matthias Larisch (Gast)


Lesenswert?

Es ist ja schön, dass ihr über Midi diskutiert :) Aber dem OP ging es 
eher darum, ob sein Lichtschrankenprogramm auch in der Lage sein kann 
(d.h. ob es eine Software gibt, die das ermöglichen würde) das er 
mehrere Note-ON Befehle erzeugen kann bevor ein Note-OFF kommt.

Falls man den Sarkasmus nicht erkannt hat:
OP, bitte bitte geh programmieren lernen. Dann kannst du in ein paar 
Monaten mit der Mikrocontrollerprogrammierung, meinetwegen auch in C, 
anfangen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.