Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Unopad - Arduino MIDI-controller met Ableton

Componenten en benodigdheden

Arduino UNO
× 1
Schakelaar, APEM A01-serie verlichte drukknopschakelaars
× 9
Jumperdraden (algemeen)
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)
Optioneel

Apps en online services

loopMidi
Hairless MIDISerial Bridge
Ableton Live 10-proefversie

Over dit project

Samenvatting

De meeste tutorials en projecten voor Midi-controllers zijn alleen gebaseerd op een uitleg van het Arduino-werk, maar niet zozeer op het gebruik ervan in de DAW zelf. Ik wil een tutorial maken met alle benodigde dingen op één plek. Met dit project wilde ik beginners helpen het proces van het maken en gebruiken van een controller beter te begrijpen, en ik hoop dat iemand er iets aan heeft.

Ik wilde al heel lang een midi-controller maken en het is eindelijk gelukt en nu zal ik het project met je delen. Ik gebruikte een Arduino Uno die niet over de mogelijkheid beschikt om MIDI-berichten via USB te verzenden, dus daarvoor moesten speciale programma's worden gebruikt (wordt later in de tekst uitgelegd).

De volgende secties beschrijven het elektrische circuit, de Arduino-code, evenals hoe verbinding te maken met een computer en DAW, in dit geval Ableton.

Circuit

Het is een heel eenvoudig circuit. Ik gebruikte 9 drukknoppen, maar niet in matrix, omdat ik de mogelijkheid wilde hebben om op meerdere knoppen te drukken (het is gemakkelijker en ik heb ongebruikte digitale pinnen - ik gebruik 9, in matrix zou 6 zijn).

Knop 3 ==> D2 Knop 2 ==> D3 Knop 1 ==> D4 Knop 6 ==> D5 Knop 5 ==> D6 Knop 4 ==> D7Knop 9 ==> D8 Knop 8 ==> D9-knop 7 ==> D10  

MIDI-toewijzingen

Ik definieerde 9 MIDI-noten, van 36 tot 45, en NOTE_ON en NOTE_OFF.

Deze MIDI-tutorial helpt je te begrijpen hoe je de MIDI-taal kunt gebruiken om elk apparaat te besturen dat het MIDI-protocol gebruikt.

#define NOTE_ONE 36#define NOTE_TWO 37// Definieer hier alle notities.#define NOTE_ON_CMD 0x90#define NOTE_OFF_CMD 0x80#define MAX_MIDI_VELOCITY 127  

MIDI via USB

Omdat Arduino Uno zelf geen MIDI-notities naar DAW kan sturen, moeten we twee extra programma's gebruiken:LoopMidi en Hairless MIDI<->Serial Bridge.

Met LoopMidi creëren we een virtuele MIDI-poort die we in Hairless Midi kunnen gebruiken om verbinding te maken met de Arduino-poort.

Code uitleg

Ik heb Button-klasse gemaakt en ik gebruik het als volgt:

int NUMBER_BUTTONS =9;Button Button1(4, NOTE_ONE);Button Button2(3, NOTE_TWO);Button Button3(2, NOTE_THREE);Button Button4(7, NOTE_FOUR);Button Button5(6, NOTE_FIVE);Knop Button6(5, NOTE_SIX);Button Button7(10, NOTE_SEVEN);Button Button8(9, NOTE_EIGHT);Button Button9(8, NOTE_NINE);Button *Buttons[] {&Button1,&Button2,&Button3,&Button4,&Button5,&Button6 ,&Knop7,&Knop8,&Knop9};  

Voor meer informatie over de implementatie van knoppen, zie Buttons.cpp.

Omdat we geen weerstanden gebruiken maar alleen de knop verbinden met de digitale pin en aarde, gebruiken we INPUT_PULLUP in plaats van INPUT.

//Buttons.cpppinMode(_pin, INPUT_PULLUP);  

Het enige lastige hieraan is dat je niet op zoek bent naar een HIGH signaal zoals je zou verwachten - je knop geeft LOW af (0) wanneer erop wordt gedrukt.

 // Knop wordt ingedrukt als (state ==0) { midiNoteOn(Buttons[i]->Note,127); } // Knop is niet ingedrukt als (state ==1) { } 

Dit betekent ook dat de initiële knopstatus 1, niet 0 is.

//Buttons.cpp _state =1; 

Elk NOTE ON-bericht vereist het bijbehorende NOTE OFF-bericht. Wanneer de knop wordt ingedrukt, wordt het NOTE_ON-bericht verzonden. Wanneer de knop wordt losgelaten, wordt een NOTE_OFF-bericht verzonden, dus naast de initiële status heb ik de laatst herinnerde status aan de code toegevoegd.

//Buttons.cpp _lastState =1; 

We sturen alleen MIDI-berichten als de huidige status anders is dan de vorige.

//Buttons.cppif(state!=_lastState){//....} 

Gebruik deze twee functies om MIDI-berichten te verzenden. Functieparameters zijn opmerking en midiVelocity (Ik gebruikte maximale snelheid).

void midiNoteOn(byte note, byte midiVelocity){ Serial.write(NOTE_ON_CMD); Serieel.schrijven (opmerking); Serial.write(midiVelocity);}void midiNoteOff(byte note, byte midiVelocity){Serial.write(NOTE_OFF_CMD); Serieel.schrijven (opmerking); Serial.write(midiVelocity);} 

Ik zet de programmalogica in de functie updateButtons functie.

void updateButtons() { for (int i =0; i getButtonState(); // Knop wordt ingedrukt als (state ==0) { midiNoteOn (Buttons [i] -> Note, 127); } // Knop is niet ingedrukt als (state ==1) midiNoteOff(Buttons[i]->Note,0); } } 

Functie wordt binnen de lus-methode genoemd.

void loop() { if (NUMBER_BUTTONS !=0) updateButtons();} 

Gebruik je controller met DAW (Ableton Live)

Als beginner in het gebruik van DAW's, wist ik niet hoe ik daar iets moest aansluiten. Toen ik mijn Korg Nanokey aansloot, herkende Ableton hem zelf en kon ik de controller meteen gebruiken. Dit was (natuurlijk) niet het geval met de Arduino-controller, omdat het geen HID-apparaat is en de pc het nog steeds herkent als een Arduino.

Ik ga je hier laten zien hoe je je Arduino MIDI-controller kunt aansluiten en gebruiken in Ableton Live 10.

  • Maak contact met Ableton

Open loopMIDI en maak een nieuwe virtuele MIDI-poort zoals op de volgende afbeeldingen.

Open haarloos-midiserial en wijs seriële poort, MIDI Out en MIDI In toe zoals op de volgende afbeeldingen. Voor seriële poort kiezen we Arduino Uno-poort en voor MIDI in en uit gebruiken we de virtuele MIDI-poort die we in de vorige stap hebben gemaakt.

Stel de baudrate in op dezelfde snelheid in uw Arduino-schets. Ga naar Bestand>Voorkeuren , en daar zou je de baudrate moeten instellen.

Als het allemaal goed is gedaan, kun je MIDI-berichten die door de controller worden verzonden, debuggen. Druk op de knop op de controller en controleer op inkomende MIDI-berichten in Hairless MIDI.

Sluit haarloze MIDI niet!

Open Ableton Live en ga naar het tabblad Opties en vervolgens naar Voorkeuren. Het Link MIDI-tabblad zou er in dit voorbeeld uit moeten zien.

Om te controleren of alles goed is aangesloten en dat Ableton MIDI-berichten leest, kijken we in de rechterbovenhoek van Ableton. Het bovenste vak moet knipperen als de knop op de controller wordt ingedrukt, zoals in het volgende voorbeeld.

Controller is klaar voor gebruik!

  • Gebruik de controller als drumrek of Toetsenbord

Selecteer MIDI-track. In Monitor sectie kies In , in plaats van Auto , en in MIDI naar kies uw luidsprekeruitgang. Je zou nu je toetsenbord moeten horen. Hetzelfde moet worden gedaan voor het drumrek.

Mijn voltooide project

Ik gebruikte een oude luidsprekerbox voor dit project en wat plastic dat ik thuis vond. Ik heb beide plastic platen op maat van de behuizing gesneden en gaten geboord voor de knoppen en een LED die ik later zal toevoegen.

Ik heb ook nog een oude luidspreker met dezelfde behuizing die ik zal gebruiken voor een andere MIDI-controller, dit keer met knoppen en joysticks.

Te doen

- Knop lang indrukken om naar de CC-modus te gaan.

Code

  • MidiDrumPad.ino
  • Knoppen.cpp
  • Buttons.h
MidiDrumPad.inoArduino
#include "Buttons.h"//------Notes-------------#define NOTE_ONE 36#define NOTE_TWO 37#define NOTE_THREE 38#define NOTE_FOUR 39#define NOTE_FIVE 40#define NOTE_SIX 41#define NOTE_SEVEN 42#define NOTE_EIGHT 43#define NOTE_NINE 44#define NOTE_ON_CMD 0x90#define NOTE_OFF_CMD 0x80#define MAX_MIDI_VELOCITY 127//------------------ ------int NUMBER_BUTTONS =9;Button Button1(4, NOTE_ONE);Button Button2(3, NOTE_TWO);Button Button3(2, NOTE_THREE);Button Button4(7, NOTE_FOUR);Button Button5(6, NOTE_FIVE);Knop Button6(5, NOTE_SIX);Button Button7(10, NOTE_SEVEN);Button Button8(9, NOTE_EIGHT);Button Button9(8, NOTE_NINE);Button *Buttons[] {&Button1,&Button2,&Button3,&Button4,&Button5,&Button6 ,&Button7,&Button8,&Button9};int red_light_pin=11;int green_light_pin =12;int blue_light_pin =13;void setup() { Serial.begin(9600);}void loop() { if (NUMBER_BUTTONS!=0) updateButtons( );}void updateButtons() { for (int i =0; i getButtonState(); // Knop wordt ingedrukt als (state ==0) { midiNoteOn (Buttons [i] -> Note, 127); } // Knop is niet ingedrukt als (state ==1) { midiNoteOff(Buttons[i]->Note,0); } }} ongeldig RGB_color (int red_light_value, int green_light_value, int blue_light_value) {analogeWrite (red_light_pin, red_light_value); analogWrite(green_light_pin, green_light_value); analogWrite (blue_light_pin, blue_light_value);}// Stuur MIDI-notitie ONvoid midiNoteOn (byte note, byte midiVelocity){ Serial.write (NOTE_ON_CMD); Serieel.schrijven (opmerking); Serial.write(midiVelocity);}//Send MIDI-noot OFFvoid midiNoteOff(byte note, byte midiVelocity){ Serial.write(NOTE_OFF_CMD); Serieel.schrijven (opmerking); Serial.write(midiVelocity);}
Buttons.cppArduino
#include "Buttons.h"Button::Button(int pin, korte opmerking){ _pin =pin; pinMode(_pin, INPUT_PULLUP); _staat =1; _lastState =1; Opmerking =opmerking;}int Button::getButtonState(){ int returnValue =-1; int staat =digitalRead(_pin); if(state ==_lastState) retourneer 5; if (staat! =_lastState) {if (staat ==0) { returnValue =0; } else { returnValue =1; } } _lastState =staat; return returnValue;}
Buttons.hArduino
#ifndef Buttons_h#define Buttons_h#include //Button (Pin Number, Note Number)class Button{ public:Button(int pin, short note); int getButtonState(); int Opmerking; privé:int _pin; korte notitie; int _staat; int _lastState;};#endif
Je kunt code downloaden van mijn Github
https://github.com/sadreactonly/MidiDrumpad

Schema's


Productieproces

  1. Licht dimmen met PWM met drukknop
  2. Arduino-gyroscoopspel met MPU-6050
  3. DHT11-sensor met LED's en een piëzo-luidspreker
  4. Iron Man
  5. Eenvoudige obstakelsensor met Arduino
  6. Vind mij
  7. Arduino-luchtbevochtigerbediening
  8. 4x4x4 LED-kubus met Arduino Uno en 1sheeld
  9. Arduino-joystick
  10. Stappenteller (Arduino 101)
  11. Arduino kleurenmixer