Inhoudsopgave:

EAL - Arduino MIDI-controller - Ajarnpa
EAL - Arduino MIDI-controller - Ajarnpa

Video: EAL - Arduino MIDI-controller - Ajarnpa

Video: EAL - Arduino MIDI-controller - Ajarnpa
Video: How to Build Arduino MIDI Controllers - The Complete Guide 2024, Juli-
Anonim
EAL - Arduino MIDI-controller
EAL - Arduino MIDI-controller

Gemaakt door Søren Østergaard Petersen, OEAAM16EDA

Dit instructable beschrijft een op arduino gebaseerde MIDI-controller. Dit is een schoolproject. Door je hand te gebruiken kun je eenvoudige melodieën spelen via de MIDI-aansluiting en een aangesloten MIDI-instrument (of zoals in dit geval een notebook met softsynth-software). U kunt noten spelen van een C majeur toonladder, c-d-e-f-g-a-b-c. Om de MIDI-controller op een notebook aan te sluiten, heb je een MIDI-naar-USB-interface zoals m-audio Uno nodig.

Stap 1: Demonstratievideo

Image
Image

Zet het volume hoger en geniet!

Hoe het werkt:

De MIDI-controller maakt gebruik van een Arduino MEGA 2560-bord. Twee lichtsensoren (LDR) ingebouwd in een elektrische buis van 16 mm vormen een dubbel sensorsysteem en worden gebruikt voor het creëren van een stabiele trigger zonder valse dubbele triggering. Een zaklamp creëert een lichtstraal, wanneer de straal wordt onderbroken door de hand die de controller bespeelt, detecteert de onderste lichtsensor de ontbrekende straal en een HC-SR04 ultrasone sensor meet de afstand van sensor tot hand.

De gemeten afstand wordt in het Arduino-programma gebruikt voor het berekenen en instellen van de juiste nootnummerwaarde die moet worden verpakt in een MIDI Note On-bericht en wordt verzonden op de MIDI-interface. De MIDI-uitgangsinterface maakt gebruik van een 74HC14 hex-omvormer en is vrijwel een standaardcircuit. MIDI-communicatie maakt gebruik van serial1, de standaard seriële poort wordt gebruikt voor debuggen.

Wanneer de hand recht omhoog en weg van de lichtstraal wordt bewogen, detecteert de bovenste lichtsensor de lichtstraal opnieuw en wordt een MIDI Note Off-bericht verpakt en verzonden op de MIDI-uitgang.

Het speelgebied tussen de sensoren is ongeveer 63 cm en de totale lengte van de MIDI-controller is ongeveer 75 cm.

Stap 2: Details van de lichtsensoren

Details van de lichtsensoren
Details van de lichtsensoren
Details van de lichtsensoren
Details van de lichtsensoren

De twee lichtsensoren zijn boven elkaar gemonteerd om een dubbel sensorsysteem te vormen. Het voorkomt valse triggering bij correct gebruik in de software. Elke lichtsensor bestaat uit een fotoweerstandsmodule ingebouwd in een standaard elektrische buis van 16 mm. In elke buis wordt met een ijzerzaag een gleuf gemaakt en de printplaat van de fotoweerstand kan in de gleuf worden gedrukt. De sensoren zijn aan elkaar geplakt met ducttape en ook vastgemaakt aan een uiteinde van een stuk hout. Er mag geen licht de sensoren van achteren kunnen bereiken. De lichtsensoren hebben ingebouwde 10k pull-up weerstanden.

Stap 3: Details van de HC-SR04 ultrasone sensor

Details van de HC-SR04 ultrasone sensor
Details van de HC-SR04 ultrasone sensor

De HC-SR04 ultrasone sensor is bevestigd aan het andere uiteinde van de MIDI-controller. Ook hier is een felle zaklamp geplaatst, deze zorgt voor de nodige lichtstraal.

Stap 4: Het Aduino-circuit

Het Aduino-circuit
Het Aduino-circuit
Het Aduino-circuit
Het Aduino-circuit

Het MIDI-uitgangscircuit is in feite een standaard 74HC14 hex-omvormer en een paar weerstanden plus een 5-pins DIN-vrouwelijke connector. Het 74HC14-circuit stuurt de MIDI-uitgang aan en biedt tegelijkertijd enige bescherming voor het Arduino-bord tegen de "echte wereld" die is aangesloten op de MIDI-uitgang. Een extra praktische functie is de MIDI-activiteits-LED die aangeeft wanneer gegevens worden verzonden.

Ik heb een goed prototype PCB voor mijn hardware gebruikt omdat ik veel problemen had met slechte verbindingen op mijn breadboard. Het schema is gemaakt in Fritzing, een hoge resolutie pdf-kopie kan worden gedownload door op de onderstaande link te klikken. Ik gebruik liever een goed schemaprogramma zoals Kicad, ik denk dat Fritzing te beperkt is voor alles behalve de eenvoudigste experimenten.

Gebruikte materialen:

1 stuks Arduino MEGA 2560

2 stuks fotoweerstand (LDR) met ingebouwde pull-up weerstand (van 37 sensorkit)

1 stuks HC-SR04 ultrasone sensor

1 stuks 74HC14 hex inverterende Schmitt-trigger

2 stuks weerstand 220 Ohm 0.25W

1 stuks weerstand 1k Ohm 0.25W

1 stuks LED lage stroom 2mA

1 stuks 100nF keramische condensator (voor ontkoppeling van de voeding, direct op de voedingspinnen van de 74HC14)

Breadboard of prototype PCB

2 stuks 16 mm elektrische buis, lengte 65 mm

1 stuks hout, lengte 75cm

Duct tape

Draden

Stap 5: I/O-lijst

I/O-lijst
I/O-lijst

Stap 6: De Aduino-code

De sketch test_Midi6 gebruikt de NewPing-bibliotheek die u in uw Arduino-programmeeromgeving moet opnemen om de HC-SC04 ultrasone sensor te gebruiken. De schets is becommentarieerd in het Deens, sorry.. Om de schets goed gestructureerd te houden, zijn aparte functies gemaakt voor verschillende logische delen van de schets en worden globale variabelen meestal vermeden. Het programmaverloop wordt gevisualiseerd in de MIDI-controller flowchart pdf.

// 15-05-2017 versie: test_Midi6

// Søren Østergaard Petesen // Arduino MEGA 2560 // Dette programma udgør en simpele MIDI-controller voor een aantal kan styre en ekstern MIDI enhed, f.eks en softsynt op en PC. // MIDI-controllers die toneanslag kunnen verzenden (opmerking op kommando) hhv. (note off kommando) voor en oktav C-C, C dur skala. // Der spilles med en "karate hånd" på et brædt // hvor sensorerne er monteret. MIDI kommandoerne activeert en dobbelt LDR-sensor, da der skal laves en sikker // detektering af både når hånden lander på brættet (note on), samen når hånden fjernes igen (note off). // MIDI-commando's "note on" en "note off" består hver af 3 bytes som sendes på serial1 porten // vha det i hardware opbyggede MIDI-interface. // Tonehøjden bestemmes vha ultralydssensor HC-SR04 #include // bibliotek til den anvendte ultralydssensor HC-SR04 #define TRIGGER_PIN 3 // Arduino pin til trigger pin på ultrasone sensor #define ECHO_PIN 2 // Arduino pin til echo pin på ultrasone sensor definieer MAX_DISTANCE 100 // Maximale afstand voor Ping #define Mediaan 5 // Antal målinger der beregnes gennemsnit af voor op få en sikker afstandsbestemmelse NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Het NewPing-object maken. int Senspin1 = 53; //Underste LDR1 føler int Senspin2 = 52; //Øverste LDR2 føler byte MIDIByte2; // Variabeldeclaratie voor MIDIByte2 bool klar_note_on = 1; //Variabel deklaration for klar_note_on, styr afsendelse af note on kommando. Første kommando er en note on kommando bool klar_note_off = 0; // Variabele deklaratie voor klar_note_off, styr afsendelse af note off kommando void setup () { pinMode (Senspin1, INPUT); // sæt sensor input pinMode (Senspin2, INPUT); // sæt sensoringang Serial1.begin (31250); // Serial1 brugge tot MIDI-communicatie: 31250 bit/sekundt Serial.begin (9600); // seriële monitor, tot test} void loop () { bool Sensor1 = digitalRead (Senspin1); //Ls LDR1 - underte LDR bool Sensor2 = digitalRead (Senspin2); //læs LDR2 - øverste LDR if (Sensor1 && klar_note_on) //hvis LDR1 actief en klar til note on { byte Note_Byte = Hent_tonehojde(); // Hent toon højde via ultralyds-sensor MIDIByte2 = Hent_MidiByte2 (Note_Byte); // Hent MidByte2, MIDI-nootnummer, værdien 0xFF er buiten bereik Send_Note_On (MIDIByte2); // kald Send_Note_On functie klar_note_on = 0; // der skal kun sendes en opmerking over kommando klar_note_off = 1; // næste kommando er notitie uit } if (Sensor2 && !Sensor1 && klar_note_off) // Hvis der skal stuurt een notitie uit kommando gøres det her.. { Send_Note_Off(MIDIByte2); // stuur een notitie van kommando klar_note_off = 0; // der skal kun sendes en note off kommando } if (!Sensor1 && !Sensor2) // her gøres klar til ny note on kommando, hånd er væk fra brædt { klar_note_on = 1; } } byte Hent_MidiByte2 (byte NoteByte) { // Denne funktion returnerer MIDI-nootnummer, waarde van NoteByte byte MIDIB2; switch (NoteByte) // her definieert het gebruik van MIDIByte2 skal hebben ud fra værdien uit Note_Byte { case 0: { MIDIB2 = 0x3C; // toon 'C' } pauze; geval 1: { MIDIB2 = 0x3E; // toon 'D' } pauze; geval 2: { MIDIB2 = 0x40; // toon 'E' } pauze; geval 3: { MIDIB2 = 0x41; // toon 'F' } pauze; geval 4: { MIDIB2 = 0x43; // toon 'G' } pauze; geval 5: { MIDIB2 = 0x45; // toon 'A' } pauze; geval 6: { MIDIB2 = 0x47; // toon 'B' } pauze; geval 7: { MIDIB2 = 0x48; // toon 'C' } pauze; standaard: {MIDIB2 = 0xFF; // buiten bereik } } retourneer MIDIB2; // returner MIDI-nootnummer} byte Hent_tonehojde () {// Denne functie henter resultaat van ultralydsmålingen unsigned int Tid_uS; // målt tid i us byte Afstand; // beregnet afstand i cm byte resultaat; // inddeling van spille område const float Omregningsfaktor = 58.3; // 2*(1/343 m/s)/100 = 58, 3uS/cm, der ganges med 2 da tiden er summen af tiden frem og tilbage. Tid_uS = sonar.ping_mediaan (mediaan); // Send ping, få tid retur i us, genemsint af Median målinger Distance = Tid_uS / Omregningsfaktor; // Omregn tid til afstand i cm (0 = buiten afstandsbereik) resultat = Afstand / 8; //Beregn resultaat bij terugkeer resultaat; //Returner resultaat } void Send_Note_On(byte tonenr) {//Denne funktion sender en note on kommando på MIDI interfacet const byte kommando = 0x90; // Opmerking over kommando op MIDI-kanaal 1 const byte volumen = 0xFF; // volumen / Velocity = 127 Serial1.write (kommando); // stuur een notitie over kommando Serial1.write (tonenr); //zendtoonnummer Serial1.write(volumen); //send volumen (snelheid) } void Send_Note_Off (byte tonenr) {//Denne funktion sender note off kommando på MIDI interfacet const byte kommando = 0x80; // Let op kommando op MIDI-kanaal 1 const byte volumen = 0xFF; // volumen / Velocity = 127 Serial1.write (kommando); // stuur een notitie van kommando Serial1.write (tonenr); //zendtoonnummer Serial1.write(volumen); // stuur volumen (snelheid)}

Stap 7: De basis van MIDI-communicatie

MIDI (Musical Instrument Digital Interface) is een universeel serieel communicatieprotocol voor het koppelen van elektronische muziekinstrumenten en andere apparaten. Er wordt seriële communicatie gebruikt (31250 bit/s, transmissiemedium is een stroomlus, opto-geïsoleerd aan de ontvangerzijde. Er worden 5pin DIN-connectoren gebruikt. 16 logische communicatiekanalen zijn mogelijk in één fysieke MIDI-verbinding. Veel commando's zijn gedefinieerd in de MIDI standaard gebruik ik twee commando's in dit project, deze commando's bestaan uit 3 bytes:

a) Opmerking Op commando:

1. byte zenden = 0x90 betekent noot op commando op MIDI-kanaal 1

2. byte send = 0xZZ ZZ is het nootnummer, ik gebruik het bereik 0x3C tot 0x48

3. byte verzenden =0xFF FF = 255 wat betekent max volume, bereik 0x00 tot 0xFF

b) Opmerking Uit-commando:1. byte send = 0x80 betekenis noot uit commando op MIDI kanaal 1

2. byte verzenden = 0xZZ ZZ is het nootnummer, ik gebruik het bereik 0x3C tot 0x48

3. byte verzenden =0xFF FF = 255 wat betekent max volume, bereik 0x00 tot 0xFF

Aanbevolen: