Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.



Midi bericht koppel...
 
Deel:
Meldingen
Alles wissen

[Opgelost] Midi bericht koppelen aan een opdracht

2 Berichten
2 Gebruikers
0 Reactions
770 Bekeken
(@djdeeno)
Eminent Member
Deelgenomen: 4 jaar geleden
Berichten: 27
Topic starter  

Hoi, tijdje terug werd ik hier goed geholpen en dacht, ik had weer een vraag.....laat ik hem hier weer stellen. Nu enkele maanden met arduino aan het spelen gaat me steeds beter af, toch begrijp ik sommige dingen niet echt.

Met MIDIUSB kun je oa midi berichten uit je pc op je arduino binnen krijgen, zoals hieronder in de sketch. Dit werkt prima, alleen nu wil ik dat als er een bepaalde bericht binnen komt, arduino een opdracht doet.

In dit geval komt er het volgende midi bericht binnen: 9-90-0-F en hiermee moet hij een ledje laten branden:

digitalWrite (LED_BUILTIN, HIGH) , maar als bijvoorbeeld het bericht 8-80-3-F binnekomt doe dan digitalWrite(LED_BUILTIN, LOW).

Alleen weet ik niet hoe deze koppel, via serial monitor zie ik de berichten wel maar geen idee hoe dit aan te pakken.

sketch wat ik gebruik is:

#include "MIDIUSB.h"

void noteOn(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOn = {0x09, 0x90 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOn);
}

void noteOff(byte channel, byte pitch, byte velocity) {
  midiEventPacket_t noteOff = {0x08, 0x80 | channel, pitch, velocity};
  MidiUSB.sendMIDI(noteOff);
}

void setup() {
  Serial.begin(115200);
}

// First parameter is the event type (0x0B = control change).
// Second parameter is the event type, combined with the channel.
// Third parameter is the control number number (0-119).
// Fourth parameter is the control value (0-127).

void controlChange(byte channel, byte control, byte value) {
  midiEventPacket_t event = {0x0B, 0xB0 | channel, control, value};
  MidiUSB.sendMIDI(event);
}

void loop() {
  midiEventPacket_t rx;
  do {
    rx = MidiUSB.read();
    if (rx.header != 0) {
      Serial.print("Received: ");
      Serial.print(rx.header, HEX);
      Serial.print("-");
      Serial.print(rx.byte1, HEX);
      Serial.print("-");
      Serial.print(rx.byte2, HEX);
      Serial.print("-");
      Serial.println(rx.byte3, HEX);
    }
  } while (rx.header != 0);
  if (rx.header= 9-90-0-F ){
      digitalWrite(LED_BUILTIN, HIGH);
      }
        if (rx.header= 8-80-3-F ){
      digitalWrite(LED_BUILTIN, LOW);
      }
}

   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2762
 

Hoi DJDeeno ... 😊 

MIDI opdrachten - dat doet me denken aan m'n Commodore Amiga dagen 😜 

Maar goed even naar jouw vraag ... koste even wat moeite om de juiste library te vinden. Ik neem aan dat het deze library is.

Voor zover ik begrijp worden er dus 4 nummers gegeven ALS er een MIDI signaal binnen komt.
Vergelijken moet dus binnen de while lus plaats vinden ..

Vervolgens moeten we de 4 waarden matchen met 0x09, 0x90, 0x00, 0x0F (hexadecimale getallen, maar je mag ook de decimale tegenhangers gebruiken, dus 9, 144, 0 , 15) en 0x08, 0x80, 0x03, en 0x0F.

Dus (zie ook Arduino Cursus - Beslissingen maken) als volgt:

if( (rx.header==0x09) && (rx.byte1==0x90) && (rx.byte2==0x00) && (rx.byte3==0x0F) ) { ... }  

 

 Dus de while lus in de loop wordt dat dan ( && = EN of AND):

void loop() {
  midiEventPacket_t rx;
    
  do {
    rx = MidiUSB.read();

    if (rx.header != 0) {
      Serial.print("Received: ");
      Serial.print(rx.header, HEX);
      Serial.print("-");
      Serial.print(rx.byte1, HEX);
      Serial.print("-");
      Serial.print(rx.byte2, HEX);
      Serial.print("-");
      Serial.println(rx.byte3, HEX);

      if( (rx.header==0x09) && (rx.byte1==0x90) && (rx.byte2==0x00) && (rx.byte3==0x0F) ) 
     { 
        digitalWrite(LED_BUILTIN, HIGH);
      } 
     else if( (rx.header==0x08) && (rx.byte1==0x80) && (rx.byte2==0x03) && (rx.byte3==0x0F) ) 
     {
        digitalWrite(LED_BUILTIN, LOW);
      } 
    }
  } while (rx.header != 0);
}

 

 

Ik hoop dat dit werkt en behulpzaam was 😊 

(n.b. links staan er bij voor mogelijke andere lezers)


   
BeantwoordenCiteren
Deel: