BASIC4MCU | 질문게시판 | 아두이노 record, replay 기능 질문
페이지 정보
작성자 gksl 작성일2018-08-03 13:29 조회12,238회 댓글1건본문
아두이노 우노, MIDI 쉴드, 마이크로 스위치(건반역할), 택트스위치 를 사용하여 전자피아노를 만드는 중입니다.
D6~13 핀은 도,레,미,파,솔,라,시,도~ 기능으로 만들었고,
추가할 기능으로 A12핀과 연결된 택트스위치를 누르고 연주한 노래를 A13핀과 연결된택트스위치를 누르면 재생되는 record-playback 기능을 만들고 싶은데 어떻게 소스를 작성해야할지 감이 안와서요ㅜㅜ 도움부탁드립니다ㅠㅠ
아래의 소스는 원본은 길이가 너무 길어서 도,레,미,파 까지만 적었습니당!
#include <SoftwareSerial.h>
#define btn1 13 // 버튼1의 아두이노 핀번호 정의
#define btn2 12
#define btn3 11
#define btn4 10
#define btn12 A2 //recording
#define btn13 A1 //replay
SoftwareSerial mySerial(2, 3);byte note = 0;
byte resetMIDI = 4;
byte ledPin = 13;
boolean bs1 = false; // 버튼1의 현재상태(눌림 or 안눌림)
boolean bs2 = false;
boolean bs3 = false;
boolean bs4 = false;
boolean bs12 = false;
boolean bs13 = false;
boolean br1; // 버튼1 상태 확인용 입력값 임시저장용
boolean br2;
boolean br3;
boolean br4;
boolean br12;
boolean br13;
int patch = 0;
int bn1 = 60; //버튼1 도
int bn2 = 62; //버튼2 레
int bn3 = 64; //버튼3 미
int bn4 = 65; //버튼4 파byte byteData;
void setup()
{
Serial.begin(31250);
mySerial.begin(31250);
pinMode(resetMIDI, OUTPUT);
digitalWrite(resetMIDI, LOW);
delay(100);
digitalWrite(resetMIDI, HIGH);
delay(100);
pinMode( btn1, INPUT); // 버튼1 입력용 핀모드를 입력모드로 전환
digitalWrite( btn1, HIGH); // 스위치 내부 PullUp , 나머지 하나는 GND
pinMode( btn2, INPUT);
digitalWrite( btn2, HIGH);
pinMode( btn3, INPUT);
digitalWrite( btn3, HIGH);
pinMode( btn4, INPUT);
digitalWrite( btn4, HIGH);
pinMode( btn12, INPUT);
digitalWrite( btn12, HIGH);
pinMode( btn13, INPUT);
digitalWrite( btn13, HIGH);
void loop()
{
br1 = digitalRead(btn1);
br2 = digitalRead(btn2);
br3 = digitalRead(btn3);
br4 = digitalRead(btn4);
br12 = digitalRead(btn12);
br13 = digitalRead(btn13);
if( !bs1 && !br1 )
{
noteOn(0, bn1,100);
bs1 = true;
}
else if(bs1 && br1)
{
noteOff(0, bn1,0);
bs1 = false;
}
if( !bs2 && !br2 )
{
noteOn(0, bn2,100);
bs2 = true;
}
else if(bs2 && br2)
{
noteOff(0, bn2,0);
bs2 = false;
}
if( !bs3 && !br3 )
{
noteOn(0, bn3,100);
bs3 = true;
}
else if(bs3 && br3)
{
noteOff(0, bn3,0);
bs3 = false;
}
if( !bs4 && !br4 )
{
noteOn(0, bn4,100);
bs4 = true;
}else if(bs4 && br4)
{
noteOff(0, bn4,0);
bs4 = false;
}
if( !bs12 && !br12 )
{
}
}
if( !bs13 && !br13 )
{
}if(Serial.available() > 0)
{
byteData = Serial.read();
mySerial.write( byteData);
}
}
void noteOn(byte channel, byte note, byte attack_velocity)
{
talkMIDI( (0x90 | channel), note, attack_velocity);
}
void noteOff(byte channel, byte note, byte release_velocity)
{
talkMIDI( (0x80 | channel), note, release_velocity);
}
void talkMIDI(byte cmd, byte data1, byte data2)
{
digitalWrite(ledPin, HIGH);
mySerial.write(cmd );
mySerial.write(data1 );
if( (cmd & 0xF0) <= 0xB0)
mySerial.write(data2 );digitalWrite(ledPin, LOW);
}
댓글 1
조회수 12,238master님의 댓글
master 작성일
두개의 스위치로 무엇을 하고 싶다는 것인지 이해가 안갑니다.
소스코드가 길면 첨부파일로 올리면 됩니다.