산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Unopad - Ableton이 포함된 Arduino MIDI 컨트롤러

구성품 및 소모품

Arduino UNO
× 1
스위치 작동기, APEM A01 시리즈 조명 푸시 버튼 스위치
× 9
점퍼 와이어(일반)
× 1

필요한 도구 및 기계

납땜 인두(일반)
선택 사항

앱 및 온라인 서비스

loopMidi
헤어리스 MIDI 직렬 브리지
Ableton Live 10 평가판

이 프로젝트 정보

요약

Midi 컨트롤러에 대한 대부분의 튜토리얼과 프로젝트는 Arduino 작업에 대한 설명에만 기반을 두고 있지만 DAW 자체에서 사용하는 것은 아닙니다. 필요한 모든 것이 한 곳에 있는 튜토리얼을 만들고 싶습니다. 이 프로젝트를 통해 초보자들이 컨트롤러를 만들고 사용하는 과정을 더 잘 이해할 수 있도록 돕고 싶었고 누군가에게 도움이 되었으면 합니다.

예전부터 미디컨트롤러를 만들고 싶었는데 드디어 하게 되었고 이제 그 프로젝트를 여러분과 공유합니다. 저는 USB를 통해 MIDI 메시지를 보낼 수 있는 기능이 없는 Arduino Uno를 사용했기 때문에 이를 위해 특별한 프로그램을 사용해야 했습니다(나중에 텍스트에서 설명하겠습니다).

다음 섹션에서는 전기 회로, Arduino 코드 및 컴퓨터와 DAW(이 경우 Ableton)에 연결하는 방법에 대해 설명합니다.

회로

아주 간단한 회로입니다. 여러 버튼을 누를 수 있는 기능을 원했기 때문에 9개의 푸시 버튼을 사용했지만 매트릭스에서는 사용하지 않았습니다.

버튼 3 ==> D2 버튼 2 ==> D3 버튼 1 ==> D4 버튼 6 ==> D5 버튼 5 ==> D6 버튼 4 ==> D7버튼 9 ==> D8 버튼 8 ==> D9 버튼 7 ==> D10  

MIDI 매핑

나는 36에서 45까지의 9개의 MIDI 노트와 NOTE_ON과 NOTE_OFF를 정의했습니다.

이 MIDI 튜토리얼은 MIDI 언어를 사용하여 MIDI 프로토콜을 사용하는 모든 장치를 제어하는 ​​방법을 이해하는 데 도움이 됩니다.

#define NOTE_ONE 36#define NOTE_TWO 37// 여기에 모든 메모를 정의합니다.#define NOTE_ON_CMD 0x90#define NOTE_OFF_CMD 0x80#define MAX_MIDI_VELOCITY 127  

USB를 통한 MIDI

Arduino Uno는 자체적으로 MIDI 노트를 DAW로 보낼 수 없기 때문에 LoopMidi와 Hairless MIDI<->Serial Bridge의 두 가지 추가 프로그램을 사용해야 합니다.

LoopMidi를 사용하여 Hairless Midi에서 Arduino 포트와 연결하는 데 사용할 수 있는 가상 MIDI 포트를 만듭니다.

코드 설명

Button 클래스를 만들고 다음과 같이 사용합니다.

int NUMBER_BUTTONS =9;버튼 버튼1(4, NOTE_ONE);버튼 버튼2(3, NOTE_TWO);버튼 버튼3(2, NOTE_THREE);버튼 버튼4(7, NOTE_FOUR);버튼 버튼5(6, NOTE_FIVE);버튼 버튼6(5, NOTE_SIX);버튼 버튼7(10, NOTE_SEVEN);버튼 버튼8(9, NOTE_EIGHT);버튼 버튼9(8, NOTE_NINE);버튼 *버튼[] {&Button1,&Button2,&Button3,&Button4,&Button5,&Button6 ,&버튼7,&버튼8,&버튼9};  

버튼 구현에 대한 자세한 내용은 Buttons.cpp를 참조하세요.

저항을 사용하지 않고 버튼을 디지털 핀과 접지에만 연결하기 때문에 INPUT 대신 INPUT_PULLUP을 사용합니다.

<사전><코드>//Buttons.cpppinMode(_pin, INPUT_PULLUP);

이것의 유일한 까다로운 부분은 HIGH 예상할 수 있는 신호 - 버튼에서 LOW가 발생합니다. <코드>(0) 눌렀을 때.

 // 버튼이 눌림 if (state ==0) { midiNoteOn(Buttons[i]->Note,127); } // 버튼이 눌러지지 않은 경우 if (state ==1) { } 

이것은 또한 초기 버튼 상태가 0이 아니라 1임을 의미합니다.

//Buttons.cpp _state =1; 

모든 NOTE ON 메시지에는 해당 NOTE OFF 메시지가 필요합니다. 버튼을 누르면 NOTE_ON 메시지가 전송됩니다. 버튼에서 손을 떼면 NOTE_OFF 메시지를 보내므로 초기 상태 외에 마지막으로 기억한 상태를 코드에 추가했습니다.

//Buttons.cpp _lastState =1; 

현재 상태가 마지막 상태와 다른 경우에만 MIDI 메시지를 보냅니다.

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

이 두 가지 기능을 사용하여 MIDI 메시지를 보냅니다. 함수 매개변수는 참고입니다. 및 midiVelocity (최대 속도를 사용했습니다).

midiNoteOn(바이트 노트, midiVelocity 바이트){ Serial.write(NOTE_ON_CMD); Serial.write(주); Serial.write(midiVelocity);}midiNoteOff 무효(바이트 메모, 바이트 midiVelocity){ Serial.write(NOTE_OFF_CMD); Serial.write(주); Serial.write(midiVelocity);} 

updateButtons 함수에 프로그램 로직을 넣었습니다. 기능.

void updateButtons() { for (int i =0; i getButtonState(); // 버튼이 눌림 if (state ==0) { midiNoteOn(Buttons[i]->Note,127); } // 버튼이 눌러지지 않은 경우 if (state ==1) midiNoteOff(Buttons[i]->Note,0); } } 

함수는 루프 메소드 내부에서 호출됩니다.

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

컨트롤러를 DAW(Ableton Live)와 함께 사용

DAW를 사용하는 초심자로서 나는 거기에 아무것도 연결하는 방법을 몰랐습니다. Korg Nanokey를 연결하면 Ableton이 스스로 인식하여 컨트롤러를 바로 사용할 수 있습니다. 이것은 (물론) Arduino 컨트롤러의 경우가 아닙니다. HID 장치가 아니고 PC가 여전히 Arduino로 인식하기 때문입니다.

Ableton Live 10에서 Arduino MIDI 컨트롤러를 연결하고 사용하는 방법을 보여 드리겠습니다.

<울>
  • Ableton과 연결
  • loopMIDI 열기 다음 이미지와 같이 새로운 가상 MIDI 포트를 생성합니다.

    hairless-midiserial 열기 다음 이미지와 같이 직렬 포트, MIDI Out 및 MIDI In을 할당합니다. Serial 포트는 Arduino Uno 포트를 선택하고 MIDI in/out은 이전 단계에서 생성한 가상 MIDI 포트를 사용합니다.

    Arduino 스케치에서 전송 속도를 동일한 속도로 설정합니다. 파일>환경 설정으로 이동합니다. , 거기에서 전송 속도를 설정해야 합니다.

    모든 것이 올바르게 완료되면 컨트롤러에서 보낸 MIDI 메시지를 디버그할 수 있습니다. 컨트롤러의 버튼을 누르고 Hairless MIDI에서 들어오는 MIDI 메시지를 확인합니다.

    털이 없는 MIDI를 닫지 마십시오!

    Ableton Live를 열고 옵션 탭으로 이동한 다음 기본 설정으로 이동합니다. 링크 MIDI 탭은 이 예와 같아야 합니다.

    모든 것이 잘 연결되어 있고 Ableton이 MIDI 메시지를 읽고 있는지 확인하기 위해 Ableton의 오른쪽 상단 모서리를 살펴보겠습니다. 다음 예와 같이 컨트롤러의 버튼을 누르면 상단 상자가 깜박여야 합니다.

    컨트롤러를 사용할 준비가 되었습니다!

    <울>
  • 컨트롤러를 드럼 랙으로 사용 또는 키보드
  • MIDI 트랙을 선택합니다. 모니터 에서 섹션 선택 , 자동 대신 , 그리고 MIDI에서 스피커 출력을 선택하십시오. 이제 키보드 소리가 들릴 것입니다. 드럼 랙도 마찬가지입니다.

    완성된 프로젝트

    이 프로젝트에 오래된 스피커 상자와 집에서 찾은 플라스틱을 사용했습니다. 두 개의 플라스틱 판을 케이스 크기에 맞게 자르고 나중에 추가할 버튼과 하나의 LED용 구멍을 뚫었습니다.

    또한 이번에는 노브와 조이스틱이 있는 다른 MIDI 컨트롤러에 사용할 동일한 케이스의 다른 구형 스피커가 있습니다.

    " />

    할 일

    - CC 모드로 변경하려면 버튼을 길게 누릅니다.

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • MidiDrumPad.ino
  • Buttons.cpp
  • 버튼.h
  • MidiDrumPad.ino아두이노
    #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;버튼 버튼1(4, NOTE_ONE);버튼 버튼2(3, NOTE_TWO);버튼 버튼3(2, NOTE_THREE);버튼 버튼4(7, NOTE_FOUR);버튼 버튼5(6, NOTE_FIVE);버튼 버튼6(5, NOTE_SIX);버튼 버튼7(10, NOTE_SEVEN);버튼 버튼8(9, NOTE_EIGHT);버튼 버튼9(8, NOTE_NINE);버튼 *버튼[] {&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 루프() { if (NUMBER_BUTTONS !=0) updateButtons( );} 무효 updateButtons() { for (int i =0; i getButtonState(); // 버튼이 눌림 if (state ==0) { midiNoteOn(Buttons[i]->Note,127); } // 버튼이 눌리지 않음 if (state ==1) { midiNoteOff(Buttons[i]->Note,0); } }}무효 RGB_color(int red_light_value, int green_light_value, int blue_light_value) { analogWrite(red_light_pin, red_light_value); analogWrite(green_light_pin, green_light_value); analogWrite(blue_light_pin, blue_light_value);}// MIDI 노트 보내기 ONvoid midiNoteOn(byte note, byte midiVelocity){ Serial.write(NOTE_ON_CMD); Serial.write(주); Serial.write(midiVelocity);}//미디 노트 보내기 OFFvoid midiNoteOff(바이트 노트, 바이트 midiVelocity){ Serial.write(NOTE_OFF_CMD); Serial.write(주); Serial.write(midiVelocity);}
    Buttons.cppArduino
    #include "Buttons.h"Button::Button(int pin, short note){ _pin =pin; 핀모드(_핀, INPUT_PULLUP); _상태 =1; _마지막 상태 =1; 참고 =참고;}int Button::getButtonState(){ int returnValue =-1; 정수 상태 =digitalRead(_pin); if(상태 ==_lastState) 반환 5; if(상태!=_lastState) { if(상태 ==0) { 반환값 =0; } 그렇지 않으면 { 반환값 =1; } } _lastState =상태; 반환값 반환;}
    Buttons.hArduino
    #ifndef Buttons_h#define Buttons_h#include //Button(핀 번호, 메모 번호)class Button{ public:Button(int pin, short note); 정수 getButtonState(); int 참고; 개인:int _pin; 짧은 _참고; 정수 _상태; int _lastState;};#endif
    내 Github에서 코드를 다운로드할 수 있습니다.
    https://github.com/sadreactonly/MidiDrumpad

    회로도


    제조공정

    1. 푸시 버튼을 사용하여 PWM으로 조명 디밍
    2. MPU-6050을 사용한 Arduino 자이로스코프 게임
    3. DHT11 센서(LED 및 피에조 스피커 포함)
    4. 아이언맨
    5. Arduino를 사용한 간단한 장애물 센서
    6. 나를 찾기
    7. Arduino 가습기 제어
    8. 4x4x4 LED 큐브(Arduino Uno 및 1쉴드 포함
    9. Arduino 조이스틱
    10. 보수계(Arduino 101)