4 분 소요

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

회로구성은 어제와 동일하다.

image

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)

  • 아두이노를 이용해 자동으로 음악 연주(자동 전자 오르간?)

  • 아두이노를 이용해서 피아노처럼 사용 (스킬이 좀더 필요함…)

\