- SF800 Solar Speicher Tutorial         
Ergebnis 11 bis 16 von 16

Thema: MIDI Übertragungsfehler [gelöst]

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #13
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.05.2007
    Alter
    33
    Beiträge
    183
    Hallo mal wieder!

    Hatte einigen Schulstress, deshalb melde ich mich jetzt erst. Danke schonmal für die zahlreichen Antworten!

    Welche Werte hast du für r5, r6 ?
    Die Werte der Widerstände, die den Optokoppler betreffen, entsprechen denen im von mir geposteten Schaltplan (hier).

    Wenn ich das mit dem running status richtig verstanden habe, dann beherrsche ich den. Ich verwende solange das letzte Statusbyte (also das der letzten vollen Message), bis wieder ein Statusbyte ankommt. Ich habe nochmal zwei Kommentare in GROSSBUCHSTABEN angefügt, die diese Thematik betreffen.
    Code:
    // This function is called, when new data from the keyboard reaches the UART-RX. 
    
    // It stores all bytes in "LastMessage", until a NoteOn or NoteOff message is complete.
    
    void Keyboard_ReceiveMessage(unsigned char c){
    	// WENN DAS EMPFANGENE BYTE GROESSER IST ASL 127 (ALSO VORNE EINE 1 HAT => EIN STATUSBYTE IST) WIRD ES ALS LETZTES STATUSBYTE VERMERKT	
    	if (c > 127) {		// if c is a command-byte, restart receiving  message
    		received = 0;
    	}
    	
    	LastMessage[received] = c;
    	received++;
    	
    	if (((received == 3) && ((LastMessage[0]>>4) == 0b00001001)) ||  	// if the received message has 3 bytes and is a NoteOn-Event
    		((received == 2) && ((LastMessage[0]>>4) == 0b00001000))) {  	// or if it has 2 bytes and is a NoteOff-Event
    		
    		// wait if the Buffer is full.
    		sei();
    		while((KEYBOARDBUFFERSIZE + Keyboard_Buffer_Start - Keyboard_Buffer_End) % KEYBOARDBUFFERSIZE > 
    			  (KEYBOARDBUFFERSIZE - 2));
    		cli();
    		// This Message is now complete => it can be filled in the buffer
    		Keyboard_Buffer[Keyboard_Buffer_Start][0] = LastMessage[0];
    		Keyboard_Buffer[Keyboard_Buffer_Start][1] = LastMessage[1];
    		Keyboard_Buffer[Keyboard_Buffer_Start][2] = LastMessage[2];
    		Keyboard_Buffer_Start++ ;
    		if (Keyboard_Buffer_Start > KEYBOARDBUFFERSIZE - 1) {
    			Keyboard_Buffer_Start = 0;
    		}
    		
    		// reset to get the next (one/two) databytes
    		// HIER WIRD WIEDER ZURÜCKGESETZT, ABER SO, DASS DAS LETZTE STATUSBYTE  ERHALTEN BLEIBT
    		received = 1;		
    
    	}
    }
    Ja, der Code soll nur Note-On oder Note-Off erkennen, da ich damit die Daten aus der Platine einer Klaviatur auslese. Das ganze findet in meiner Keytar Verwendung (siehe Anhang).
    Keyboards, die so funktionieren, wie z.B.
    das Oxygen V2 von M-Audio, kennen daher auch kein echtes "Note Off" (0x8n), sondern
    machen für "Note Off" nochmals ein "Note On" (Bzw. bleibt es beim Status 0x9n) mit der Velocity 0 auf die entsprechende Notennummer.
    Auch das funktioniert bei mir.

    Nochmals zur Problembeschreibung: Die falsch gesendeten Töne (kommt bei Note-Ons und bei Note-Offs vor) kommen eher sporadisch. Es gibt Phasen, da geht alles und es gibt Phasen, da spielt meine Keytar nur Müll. Ich vermute sehr stark, dass es da geringe Einflüsse von außen gibt (z.B. Felder von Boxen oder sonstwas) die Dank falscher Beschaltung bzw. falschem Optokoppler dick ins Gewicht fallen...
    Ich würde das gerne mal am Oszi betrachten, um zu sehen, wo das Problem liegt - ich habe auch einen (wenn er die Bezeichnung Oszi verdient). Bild siehe Anhang. Ich hab keine Ahnung, wie man den benutzt...

    Nochmal zum PC900: Ich werde mir mal einen kaufen. Wie sieht die Beschaltung bei dir aus, wkrug?

    Vielen Dank,
    Bääääär
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken russen-oszi.jpg   keytar.jpg  

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress