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
Mit Midi hab ich gerade auch so meine Probleme. Schau dir mal das an: http://jakob-werner.de/Midi/Dateiaufbau.htm http://www.larsrichter-online.de/lmids/midformat.php http://home.snafu.de/sicpaul/midi/midi4.htm Oder auf Englisch: http://www.wotsit.org/list.asp?page=3&fc=12&search=&al=
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
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 ?
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?
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.
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.
1. UART auf 31250 Baud einstellen 2. TX-pin mit Synth verbinden 3. Messages senden: http://www.midi.org/techspecs/midimessages.php
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
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.
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 ;-)
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!?
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
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.
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
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?
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
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.
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!
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
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...
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.
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.
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.
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.
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ß
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.
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'.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.