MIDI Clock mit dem Arduino empfangen und auswerten!

Hi habe heute mal das Probiert

#include <MIDI.h>
#include <midi_Defs.h>
#include <midi_Message.h>
#include <midi_Namespace.h>
#include <midi_Settings.h>


MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI);


//MIDI_CREATE_DEFAULT_INSTANCE();




// -----------------------------------------------------------------------------

// This example shows the old way of checking for input messages.
// It's simpler to use the callbacks now, check out the dedicated example.

#define LED 13 // LED pin on Arduino Uno
int RX1 = 0;
// -----------------------------------------------------------------------------

void BlinkLed(byte num) // Basic blink function
{
for (byte i=0;i<num;i++)
{
digitalWrite(LED,HIGH);
delay(50);
digitalWrite(LED,LOW);
delay(50);
}
}

// -----------------------------------------------------------------------------

void setup()
{
pinMode (RX1,INPUT);
pinMode(LED, OUTPUT);
MIDI.begin(); // Launch MIDI, by default listening to channel 1.
}

void loop()
{
if (MIDI.read()) // Is there a MIDI message incoming ?
{
switch(MIDI.getType()) // Get the type of the message we caught
{
case midi::NoteOn: // If it is a Program Change,
BlinkLed(MIDI.getData1()); // blink the LED a number of times
// correponding to the program number
// (0 to 127, it can last a while..)
break;
// See the online reference for other message types
default:
break;
}
}
}


Leider geht Nix keine Plan warum.

Ich arbeite mit dem Teensy 3.1

Eingang für MIDI ist RX1 an Pin 0
LED an Pin 13

Ich sende NoteOne auf midi CH 1

Da passt was nicht mit dem MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI); oder ?

Gruß Michael
 
Hi danke ich wollte erstmal testen ob das Midi.h mit dem Teensy 3.1 funktioniert.. Aber das geht leider nicht .
Das andere habe ich mir schon angesehen. Es is als Anfäger nicht ganz so einfach :) ist mein erstes Projekt in der Richtung.

Würde mich über jede Hilfe freun .

Gruss Michael
 
Ich fürchte, da hilft nur probieren, wieso es nicht funktioniert...

Deine Schaltung scheint ja zu funktionieren, wenn du Befehle empfangen und senden kannst.

Ich würde für den Anfang das von mink99 gepostete Beispiel mal so erweitern, dass bei Note On eine LED angeht, damit kannst du die Library grundsätzlich mal testen.
 
Ansonsten, blink mit wait() ist doof, wenn man ne genaue Zeitmessung machen will....
Also bei Note on lämpli einschalten, Note off wieder aus....
 
mink99 schrieb:
case midi::NoteOn: // If it is a Program Change,
Blinkend(MIDI.getData1()); // blink the LED a number of times

Bist du dir ganz sicher ? :?
hi ja ich hatte das geändert nur den Kommentar halt nicht . Ich habe versucht NoteOn zusenden um zu sehen ob die led blinkt . Geht aber nicht . Bis jetzt habe ich den Teensy3.1 mit Midi.h 4.2 nicht zum blinken bekommen . Da passt was mit der Serial Einstellung nicht . Wie gesagt Serial1 ist bei mir der Eingang für die MIDI Daten . Das geht bestimmt irgend wie .
 
So ich gebe auf habe alles Probiert die MIDI.h zum laufen zu kriegen. Geht nicht mit dem Teensy 3.1!

Es werden keine Mididaten empfangen an RX1 Pin 0.

Ich sende ProgramChange auf Midikanal 1!

Welche Version ist für den Teensy die richtige es gibt drei . Ich arbeite grade mit 4.2.

Hier noch mal der Sketch der erst laufen soll damit ich später mit den Callbacks weitermachen kann. Was muss ich in diesem Skech ändern damit das ganze lauft. LED2 soll bei eingang von
ProgramChange auf Midikanal 1 blinken. Das kann doch nicht so schwer sein oder ? Die LED1 blinkt und das war es dann :)

Gruß Michael



#include <MIDI.h>
#include <midi_Defs.h>
#include <midi_Message.h>
#include <midi_Namespace.h>
#include <midi_Settings.h>

//Teensy 3.1


MIDI_CREATE_INSTANCE(HardwareSerial,Serial1,MIDI);




// -----------------------------------------------------------------------------

// This example shows the old way of checking for input messages.
// It's simpler to use the callbacks now, check out the dedicated example.

#define LED1 13 // LED pin on Arduino Uno
#define LED2 14
// -----------------------------------------------------------------------------

void BlinkLed1(byte num) // Basic blink function
{
for (byte i=0;i<num;i++)
{
digitalWrite(LED1,HIGH);
delay(50);
digitalWrite(LED1,LOW);
delay(50);
}
}

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------

void BlinkLed2(byte num) // Basic blink function
{
for (byte i=0;i<num;i++)
{
digitalWrite(LED2,HIGH);
delay(50);
digitalWrite(LED2,LOW);
delay(50);
}
}

// -----------------------------------------------------------------------------

void setup()
{
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
MIDI.begin(); // Launch MIDI, by default listening to channel 1.
}

void loop()
{
BlinkLed1(5);

if (MIDI.read()) // Is there a MIDI message incoming ?
{
switch(MIDI.getType()) // Get the type of the message we caught
{
case midi::ProgramChange: // If it is a Program Change,

BlinkLed2(MIDI.getData1()); // blink the LED a number of times
// correponding to the program number
// (0 to 127, it can last a while..)
break;
// See the online reference for other message types
default:
break;
}
}
}
 
SEQ303 schrieb:
So ich gebe auf habe alles Probiert die MIDI.h zum laufen zu kriegen. Geht nicht mit dem Teensy 3.1!

Es werden keine Mididaten empfangen an RX1 Pin 0.

Ich sende ProgramChange auf Midikanal 1!

Welche Version ist für den Teensy die richtige es gibt drei . Ich arbeite grade mit 4.2.

https://www.pjrc.com/teensy/td_libs_MIDI.html

Hier noch mal der Sketch der erst laufen soll damit ich später mit den Callbacks weitermachen kann. Was muss ich in diesem Skech ändern damit das ganze lauft. LED2 soll bei eingang von
ProgramChange auf Midikanal 1 blinken. Das kann doch nicht so schwer sein oder ? Die LED1 blinkt und das war es dann :)

Gruß Michael



#include <MIDI.h>
#include <midi_Defs.h>
#include <midi_Message.h>
#include <midi_Namespace.h>
#include <midi_Settings.h>

//Teensy 3.1


MIDI_CREATE_INSTANCE(HardwareSerial,Serial1,MIDI);




// -----------------------------------------------------------------------------

// This example shows the old way of checking for input messages.
// It's simpler to use the callbacks now, check out the dedicated example.

#define LED1 13 // LED pin on Arduino Uno
#define LED2 14
// -----------------------------------------------------------------------------

void BlinkLed1(byte num) // Basic blink function
{
for (byte i=0;i<num;i++)
{
digitalWrite(LED1,HIGH);
delay(50);
digitalWrite(LED1,LOW);
delay(50);
}
}

// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------

void BlinkLed2(byte num) // Basic blink function
{
for (byte i=0;i<num;i++)
{
digitalWrite(LED2,HIGH);
delay(50);
digitalWrite(LED2,LOW);
delay(50);
}
}

// -----------------------------------------------------------------------------

void setup()
{
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
MIDI.begin(); // Launch MIDI, by default listening to channel 1.
}

void loop()
{
BlinkLed1(5);

if (MIDI.read()) // Is there a MIDI message incoming ?
{
switch(MIDI.getType()) // Get the type of the message we caught
{
case midi::ProgramChange: // If it is a Program Change,

BlinkLed2(MIDI.getData1()); // blink the LED a number of times
// correponding to the program number
// (0 to 127, it can last a while..)
break;
// See the online reference for other message types
default:
break;
}
}
}
 
1.) es gibt nicht "den Midi.h" das Ding heisst "arduino Midi Library"
2.) es gibt das Makro "MIDI_CREATE_DEFAULT_INSTANCE() " oder "MIDI_CREATE_INSTANCE(Type, SerialPort, Name)"
Diese definieren den Port etc.

Ich habe leider die Situation, dass alle Sketches bei mir funktionieren, allerdings mit arduino due und Nano .

Zeig mal deinen Code ....
 
mink99 schrieb:
1.) es gibt nicht "den Midi.h" das Ding heisst "arduino Midi Library"
2.) es gibt das Makro "MIDI_CREATE_DEFAULT_INSTANCE() " oder "MIDI_CREATE_INSTANCE(Type, SerialPort, Name)"
Diese definieren den Port etc.

Ich habe leider die Situation, dass alle Sketches bei mir funktionieren, allerdings mit arduino due und Nano .

Zeig mal deinen Code ....
Hi der Code weiter oben ! Ich möchte ja nur testen ob die Library mit dem Teensy 3.1 läuft . Habe ich die Parameter für das Makro richtig eingegeben ?
 
Code:
#include <MIDI.h>  // Add Midi Library
#include <midi_Defs.h> 
#include <midi_Message.h> 
#include <midi_Namespace.h> 
#include <midi_Settings.h> 

#define LED 13    // Arduino Board LED is on Pin 13

MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDI);

void setup() {

 
  
  pinMode (LED, OUTPUT); // Set Arduino board pin 13 to output
    
  MIDI.begin(MIDI_CHANNEL_OMNI); // Initialize the Midi Library.
  // OMNI sets it to listen to all channels.. MIDI.begin(2) would set it 
  // to respond to notes on channel 2 only.
  MIDI.setHandleNoteOn(MyHandleNoteOn); // This is important!! This command
  // tells the Midi Library which function you want to call when a NOTE ON command
  // is received. In this case it's "MyHandleNoteOn".
  MIDI.setHandleNoteOff(MyHandleNoteOff); // This command tells the Midi Library 
  // to call "MyHandleNoteOff" when a NOTE OFF command is received.
}

void loop() { // Main loop
 
  MIDI.read(); // Continuously check if Midi data has been received.
}

// MyHandleNoteON is the function that will be called by the Midi Library
// when a MIDI NOTE ON message is received.
// It will be passed bytes for Channel, Pitch, and Velocity
void MyHandleNoteOn(byte channel, byte pitch, byte velocity) { 
  digitalWrite(LED,HIGH);  //Turn LED on
}

// MyHandleNoteOFF is the function that will be called by the Midi Library
// when a MIDI NOTE OFF message is received.
// * A NOTE ON message with Velocity = 0 will be treated as a NOTE OFF message *
// It will be passed bytes for Channel, Pitch, and Velocity
void MyHandleNoteOff(byte channel, byte pitch, byte velocity) { 
  digitalWrite(LED,LOW);  //Turn LED off
}
 
Der Code sollte tun.

Geht das lämpli einmal an und nie wieder aus oder garnicht an ?

Hast du evtl ein Problem in der Hardware ? optokoppler auf 3.3 Volt ?

Versuch mal nen anderen port, auf serial 3 umstecken ?
 
mink99 schrieb:
Der Code sollte tun.

Geht das lämpli einmal an und nie wieder aus oder garnicht an ?

Hast du evtl ein Problem in der Hardware ? optokoppler auf 3.3 Volt ?

Versuch mal nen anderen port, auf serial 3 umstecken ?

Die LED leuchtet nie !

Der Optokoppler läuft mit 5V. ( wenn ich mit Serial1.read arbeite werden über RX1 MIDI.Daten empfangen.

Ich habe schon das Ganze mit Serial1 Serial2 und Serial3 getestet. Immer das gleiche .

MIDI.read geht glaube ich nicht ! Kann mann das nicht testen mit Serial.print, ich weiß nur nicht wie .

Die LED ist auch ok . Funktionieren mit einem anderen Sketch an Pin 13 und 14.
 
Vielleicht ist es nur "Serial"? (also ohne Nummer)

Andere Idee: Probier es mal mit "midi1" statt "MIDI", also: MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, midi1); Und dann "MIDI" überall durch "midi1" ersetzen (midi1.begin() / midi1.read()...)
 
Hallo Max,

das hatte ich auch schon probiert, ich vermute das der RX1 nicht sauber liest. Habe grade ein Testprogramm geschrieben um RX1 zu testen.

Ergebniss manche Bytes werden gelesen andere nicht. Das steht über den Case Befehlen was wann gelesen wird. Dann habe ich mal Mididaten über TX3 ------- Brücke------ RX1 gesendet.

Dann werden alle Bytes sauber empfangen ( Die Leitung nach dem Optokoppler 6N139 habe ich vorher nätürlich getrennt). Jetzt prüfe ich grade die MIDI Verkabelung. Wenn nix gesendet wird muss dann die Spannung 0V oder 5V haben an RX1 ? 5V Oder ?

Hier mal mein RX1 Testprogramm!
Code:
// MIDI **** (byte) *************************************************************************

byte MidiInput = 0;
byte MidiBuffer []= {0,0,0};
//System Realtime Massage
const byte M_Song_Position_Ptr[] = {242,0,0};    // Drei Bytes
const byte M_Clock = 248;
const byte M_Start = 250;
const byte M_Continue = 251;
const byte M_Stop = 252;
const byte M_Active_Sense = 254;


const byte M_Note_On = 144;
const byte M_Note_Off =128;
const byte M_CC = 176;
const byte M_PC = 192;

const int RX1_LED = 13;

void setup() 
{
// Pinbelgung festlegen !

  pinMode(RX1_LED,    OUTPUT);
  Serial1.begin(31250);     // DIN MIDI
  //Serial3.begin(31250);     // DIN MIDI

}

void loop() 
{ 
     //Serial3.write(M_Active_Sense); // Mit brücke von TX3 zu RX1 geht es super!
     // Serial3.write(0);
     //   Serial3.write(0);
     //delay(50);

  
  if (Serial1.available()> 0)
  { 
    MidiInput = Serial1.read();

    if (MidiInput >= 127) // Start Byte finden! Beginnt mit 1
    {
      MidiBuffer[0] = MidiInput;
      
      MidiBuffer[1] = Serial1.read();
      if ((MidiBuffer[1])== 255)
      {
           MidiBuffer[1] = 0;
      }
           MidiBuffer[2] = Serial1.read();
      if ((MidiBuffer[2])== 255)
      {
           MidiBuffer[2] = 0;
      }
    
  
      if (MidiBuffer[0] >= 242) // Filter nur Realtime Massages verarbeiten !
      { 
        //Serial.println(MidiInput);
        switch (MidiBuffer[0])                   // Die Punke sind nur für die Lesbarkeit !!
        {
        case 242: // Fehler!!!  Wird nicht erkannt BIN 1111.0010
        Serial.println("Song_Position_Ptr "+String(MidiBuffer[0])+","+String(MidiBuffer[1])+","+String(MidiBuffer[2]));
        //delay(10);
        break;
      
        case 248: // Wird sauber erkannt ! BIN 1111.1000
        Serial.println("Timing Clock "+String(MidiBuffer[0])+","+String(MidiBuffer[1])+","+String(MidiBuffer[2]));
        //delay(10);
        break;
    
        case 250: // Fehler!!!  Wird nicht erkannt BIN 1111.1010
        Serial.println("Start "+String(MidiBuffer[0])+","+String(MidiBuffer[1])+","+String(MidiBuffer[2]));
        //delay(10);
        break;
    
        case 251: // Fehler!!!  Wird nicht richtig erkannt BIN 1111.1011 erkannt wird BIN 1111.1110 DEC 254
        Serial.println("Continue "+String(MidiBuffer[0])+","+String(MidiBuffer[1])+","+String(MidiBuffer[2]));
        //delay(10);
        break;
    
        case 252: // Wird sauber erkannt ! BIN 1111.1100
        Serial.println("Stop "+String(MidiBuffer[0])+","+String(MidiBuffer[1])+","+String(MidiBuffer[2]));
        //delay(10);
        break;
    
        case 254: // Fehler!!!  Wird nicht richtig erkannt BIN 1111.1110 erkannt wird BIN 1111.11100 DEC 252
        Serial.println("Active_Sense "+String(MidiBuffer[0])+","+String(MidiBuffer[1])+","+String(MidiBuffer[2]));
        //delay(10);
        break;
        }
      } 
    
   
      }
  }
}
 
Du liest bei jeder Message (>=127) drei Bytes ein. Realtime Messages haben kein Data 1 &2 , das heisst, nach jeder reaktive Message verschluckst du die nächsten beiden Bytes .

Sollte heissen :

midiInput = serial1.read();
if (isRealtimeMessage(midiInput))
{
// so something useful
}
else
{
if (isAnyOtherMessage(midiInput)) // >= 127
{
midiMessage = midiInput;
data1 = -1;
data2 = -1;
}
else // Daten <127
{
if (pendingData1() // data1 == -1
{
data1 = midiInput;
}
if (pendingData2()// data2== -1
{
data2= midiInput;
processMessage(midiMessage,data1,data2(); // jetzt darfst du draufbeissen
}
}
}
}
Da beim lesen von data1 und data2 immer noch ne realtime Message kommen kann statt der erwarteten. Ist ein direktes lesen von data1&2 falsch;

@max hab ich auf dem iPad geschrieben, wenn du Tippfehler findest, darfst du sie behalten :floet:
 
Hallo

so das Hauptprogramm läuft so weit ich hatte einen Fehler beim MIDI Eingang.

Mal eine andere Frage: Ich möchte gern mit PWM eine CV Spannung von 0.0V bis 3.3V erzeugen was auch gut klappt.

Hier mal der Code dazu.
Code:
/* RGB Analog Example, Teensyduino Tutorial #2
   http://www.pjrc.com/teensy/tutorial2.html

   This example code is in the public domain.
*/

const int LED1 =  23;
const int RangeMax =  4095;
const int Speed = 2;  // Pulsweite


void setup()   {                
 
  pinMode(LED1, OUTPUT);
  analogWriteResolution(12);  // analogWrite value 0 to  4095  12 BIT
  //analogWriteResolution(8);   // analogWrite value 0 to   255  8  BIT
  //analogWriteResolution(7);     // analogWrite value 0 to   127  7  BIT
}

void loop() // LFO Sinus                     
{

  // fade in from min to max in increments of 5 points:
  for (int fadeValue = 0 ; fadeValue <= RangeMax; fadeValue +=5) 
  {
    // sets the value (range from 0 to 255):
    analogWrite(LED1, fadeValue);
    // wait for 30 milliseconds to see the dimming effect
    delay(Speed);
  }

  // fade out from max to min in increments of 5 points:
  for (int fadeValue = RangeMax ; fadeValue >= 0; fadeValue -=5) 
  {
    // sets the value (range from 0 to 255):
    analogWrite(LED1, fadeValue);
    // wait for 30 milliseconds to see the dimming effect
    delay(Speed);
  }


}

Ich brauche aber -5.0V und +5.0V für eine vernünftige CV Spannung zum steuern vom System 100m. Aber wie setze ich das elektronisch um ?
Mit einem OP erhöhen und dann ???

Hier mal meine Idea! geht aber so nicht weil ich nicht weiß wie ich -5V und +5V wieder zusammen fügen soll.

Allso ein Eingang und ein Ausgang wäre das Ziel , aber wie ?

Habt ihr da eine Idea ?

Gruss Michael
 

Anhänge

  • OP2.gif
    OP2.gif
    9,5 KB · Aufrufe: 25
Hallo Comboy,

erst mal danke für den Tipp! Ich habe es jetzt so umgesetzt und getestet. Und ich kann exakt -5 und +5V einstellen. :supi: Aber wie kann ich das Ganze noch so begrenzen das nicht mehr als -5V oder +5V rauskommen? Zu Sicherheit !!!
Ich möchte mein System 100M nicht zerstören!

Ist die Schaltung so ok?

Gruß Michael und danke nochmal :phat:
 

Anhänge

  • CV Ausgang.gif
    CV Ausgang.gif
    19,7 KB · Aufrufe: 15


Zurück
Oben