아두이노로 미디(MIDI)신호를 출력하고 싶은데
USB를 통한 Serial 방식으로는 불가능한것은 아니지만 간단한 방법이 따로 없는것 같아서요.
MIDI케이블을 하나 잘라서 아두이노에 연결해버렸습니다.
싹둑....
MIDI신호를 직접 출력하기 때문에 MIDI신호를 받을 수 있는 인터페이스가 따로 필요합니다.
다행히 오디오 인터페이스에 MIDI in/out단자가 같이 있어서 MIDI신호를 받는데에는 문제가 없었네요.
Arduino 공식사이트에 있는 MIDI튜토리얼을 참고해서만들었습니다.
먼저 위 그림과 같이 미디 케이블과 아두이노를 연결하고 적당한 미디신호를 출력하도록 코드를 넣었습니다.
공식사이트의 레퍼런스를 보면 아래와같이 noteOn이라는 함수를 만들어놓고 실행하도록 되어있습니다..
// plays a MIDI note. Doesn't check to see that
// cmd is greater than 127, or that data values are less than 127:
void noteOn(int cmd, int pitch, int velocity) {
Serial.write(cmd);
Serial.write(pitch);
Serial.write(velocity);
}
이런식으로 noteOn의 첫 번째 입력변수로 0x90를 쓰면 noteOn이 되는데요,
키를 누를 때, noteOn(0x90, 0x4A ,0x45)가 실행되도록 하면 0x4A에 해당하는 음을 출력합니다.
구글링을 통해 MIDI신호의 체계에 대한 자료도 조금 긁어 모았습니다.
noteOn의 첫 번째 입력변수(cmd)로 0x90를 쓰면 note on이 된다고 하는데요.
아두이노 예제에는 없지만 위 표를 참조하여 0x90대신 0x80을 쓰면 note off가 됩니다.
note on을 시켰다가, note off를 시키면 재생되던 음이 중지됩니다.
(참고: 숫자에 0x가 붙은 것은 그 수가 16진수라는 표시입니다.)
키를 누를때는 note on명령을 주고, 키를 뗄 때는 note off명령을 주면 더욱 리얼한 연주를 만들수 있습니다.
noteOff라고 할지라도 velocity가 0이 아닌 값을 넣어야 정상적으로 off가 되는 것 같네요.
참고 :
댓글
댓글 쓰기