제조공정
| × | 1 | ||||
| × | 9 | ||||
| × | 1 |
|
| ||||
| ||||
|
요약
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 컨트롤러를 연결하고 사용하는 방법을 보여 드리겠습니다.
<울>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="코드">#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; igetButtonState(); // 버튼이 눌림 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);}
#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 =상태; 반환값 반환;}
#ifndef Buttons_h#define Buttons_h#include//Button(핀 번호, 메모 번호)class Button{ public:Button(int pin, short note); 정수 getButtonState(); int 참고; 개인:int _pin; 짧은 _참고; 정수 _상태; int _lastState;};#endif
제조공정
구성품 및 소모품 Arduino UNO × 1 SparkFun 듀얼 H-Bridge 모터 드라이버 L298 × 1 DIY 로봇 탱크 키트 × 1 Sony PS2 무선 컨트롤러 × 1 앱 및 온라인 서비스 Arduino IDE 이 프로젝트 정보 이 튜토리얼에서는 무선 PlayStation 2(PS2) 조이스틱을 사용하여 로봇 탱크를 조종하는 방법을 보여 드리겠습니다. 이 프로젝트의 핵심에는 Arduino U
구성품 및 소모품 Arduino Nano R3 × 1 회전 전위차계(일반) × 7 SparkFun 푸시버튼 스위치 12mm × 7 MIDI 포트 × 1 저항 221옴 × 4 LED(일반) × 2 이 프로젝트 정보 2019년 3월 11일 업데이트 안녕하세요, 저는 아르페지에이터를 위한 새 펌웨어를 만들었습니다. 소스 코드가 완전히 다시 작성되었습니다. 이제 모듈식 구조를 통해 Arduino뿐만