컴플리트 MIDI 북을 보고 MIDI데이터 규격에 맞춰
아날로그 입력을 노트온벨러서티로 출력하도록 스케치를 작성했다.
아날로그 0번에 압력 감지 센서를 달고 그 값을 건반 누른 세기로 바꿔주면 끝나는 간단한 구조다
압력 감지 센서를 이용했지만, 가속도 센서를 이용하면 탬버린 등을 만들 수도 있을 것이며
다양한 센서를 이용해서 여러가지 음악 입력장치를 만들 수 있다.
—-
// Variables:
byte note = 35; // 재생될 MIDI NOTE값
int AnalogValue = 0; // 아날로그 입력값
byte noteOnVel = 0; // 노트온벨러서티 값
boolean lastPlay = 0; // 눌린상태 체크
void setup() {
// Set MIDI baud rate:
Serial.begin(31250);
}
void loop() {
AnalogValue = analogRead(0); // 아날로그 입력 체크
noteOnVel = AnalogValue/8; // 1024->128로 변환
if (noteOnVel > 0){ // 눌린 값이 있나?
if(lastPlay==0){ // 기존에 눌리지 않았다면
noteOn(0x90, note, noteOnVel); // 0채널 note값에 눌린값의 세기로 출력
lastPlay = 1; // 이미 눌렸다
}
} else { // 손을 뗐으면 다시 리셋
lastPlay = 0;
}
delay(5); //반응속도에 따라 값 조정 할 것.
}
// 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(byte cmd, byte data1, byte data2) {
Serial.print(cmd, BYTE);
Serial.print(data1, BYTE);
Serial.print(data2, BYTE);
}
흠 여러 조건을 넣으려고 if를 중복으로 썼는데, 하나 밖에 없으니 한 줄로 줄여도 되겠다.
그러고 보니 입력 종료 알리는 커맨드를 안 넣어줬네. 중복으로 놔둬야겠다.







asteris@chol.com님에게 덧글 달기 응답 취소