20130430_PC 피아노 건반(?)
PC에서 serial로 char를 보내서 피아노 건반처럼 음을 연주하게 해보았다.
도 래 미 파 솔 라 시
q w e r t y u
a s d f g h j
z x c v b n m
고향의 봄
gg gg dd ff gg hh hh gg gg zz cc xx zz xx cc cc xx xx zz xx zz hh hh
회로구성은 어제와 동일하다.

source code
#define DO3 7645
#define RE3 6811
#define MI3 6068
#define PA3 5727
#define SOL3 5102
#define RA3 4545
#define SI3 4050
#define DO4 3822
#define RE4 3405
#define MI4 3034
#define PA4 2863
#define SOL4 2551
#define RA4 2273
#define SI4 2025
#define DO5 1910
#define RE5 1703
#define MI5 1517
#define PA5 1432
#define SOL5 1276
#define RA5 1136
#define SI5 1012
void LED_Control(int OnOff)
{
digitalWrite(2,OnOff);
digitalWrite(3,OnOff);
digitalWrite(4,OnOff);
digitalWrite(5,OnOff);
digitalWrite(6,OnOff);
digitalWrite(7,OnOff);
digitalWrite(8,OnOff);
}
void LED_Control_SCALE(int SCALE)
{
if(SCALE == DO3 || SCALE == DO4 || SCALE == DO5)
{
digitalWrite(2, 1);
}
if(SCALE == RE3 || SCALE == RE4 || SCALE == RE5)
{
digitalWrite(2,1);
digitalWrite(3,1);
}
if(SCALE == MI3 || SCALE == MI4 || SCALE == MI5)
{
digitalWrite(2,1);
digitalWrite(3,1);
digitalWrite(4,1);
}
if(SCALE == PA3 || SCALE == PA4 || SCALE == PA5)
{
digitalWrite(2,1);
digitalWrite(3,1);
digitalWrite(4,1);
digitalWrite(5,1);
}
if(SCALE == SOL3 || SCALE == SOL4 || SCALE == SOL5)
{
digitalWrite(2,1);
digitalWrite(3,1);
digitalWrite(4,1);
digitalWrite(5,1);
digitalWrite(6,1);
}
if(SCALE == RA3 || SCALE == RA4 || SCALE == RA5)
{
digitalWrite(2,1);
digitalWrite(3,1);
digitalWrite(4,1);
digitalWrite(5,1);
digitalWrite(6,1);
digitalWrite(7,1);
}
if(SCALE == SI3 || SCALE == SI4 || SCALE == SI5)
{
digitalWrite(2,1);
digitalWrite(3,1);
digitalWrite(4,1);
digitalWrite(5,1);
digitalWrite(6,1);
digitalWrite(7,1);
digitalWrite(8,1);
}
}
void play_music(int SCALE, int duration)
{
LED_Control_SCALE(SCALE);
// for(long i = 0; i<1000000; i=i+SCALE)
for(long i = 0; i< duration ; i=i+1)
{
digitalWrite(13,1);
delayMicroseconds(SCALE/2);
digitalWrite(13,0);
delayMicroseconds(SCALE/2);
}
// delay(duration);
LED_Control(0);
}
void setup()
{
//GPIO 2~8 -> LED control
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
//GPIO 13 -> PIEZO control
pinMode(13, OUTPUT);
Serial.begin(9600);
}
//
void loop(){
if(Serial.available())
{
char ch = Serial.read();
switch(ch)
{
case ‘q’ : play_music(DO3, 50); break;
case ‘w’ : play_music(RE3, 50); break;
case ‘e’ : play_music(MI3, 50); break;
case ‘r’ : play_music(PA3, 50); break;
case ‘t’ : play_music(SOL3, 50); break;
case ‘y’ : play_music(RA3, 50); break;
case ‘u’ : play_music(SI3, 50); break;
case ‘a’ : play_music(DO4, 50); break;
case ‘s’ : play_music(RE4, 50); break;
case ‘d’ : play_music(MI4, 50); break;
case ‘f’ : play_music(PA4, 50); break;
case ‘g’ : play_music(SOL4, 50); break;
case ‘h’ : play_music(RA4, 50); break;
case ‘j’ : play_music(SI4, 50); break;
case ‘z’ : play_music(DO5, 50); break;
case ‘x’ : play_music(RE5, 50); break;
case ‘c’ : play_music(MI5, 50); break;
case ‘v’ : play_music(PA5, 50); break;
case ‘b’ : play_music(SOL5, 50); break;
case ‘n’ : play_music(RA5, 50); break;
case ‘m’ : play_music(SI5, 50); break;
}
}
}
직접 키보드를 쳐서 연주해도 되고 미리 쳐놓은 값들을 serial terminal 프로그램을 사용해서 한번에 넣어서 연주도 가능하다.
고향의봄 : 앞소절 (gg gg dd ff gg hh hh gg gg zz cc xx zz xx cc cc xx xx zz xx zz hh hh)
-
아두이노를 이용해 자동으로 음악 연주(자동 전자 오르간?)
-
아두이노를 이용해서 피아노처럼 사용 (스킬이 좀더 필요함…)
\