2016년 10월 2일 일요일

GenericTone

GenericTone은 아두이노의 Tone라이브러리를 사용하기 위한 Controller입니다.
Tone라이브러리는 Buzzer와 같은 소리를 내는 부품을 제어할 때 사용합니다.
소리는 물체의 진동으로 인해 발생되기 때문에 컴퓨터가 소리를 내려면 진동을 만들어야 합니다.
컴퓨터의 소리 출력 장치로 사용되는 스피커는 작은 진동도 효과적으로 전달할 수 있는 구조를 갖고 있습니다.
컴퓨터의 소리 전달 장치인 스피커

아주 단순하면서 값싼 스피커는 피에조 부저(Piezo Buzzer)입니다. 얇은 전극판으로 이루어져서 전기적 신호의 변화로 떨림을 만들어낼 수 있는 부품입니다.
피에조 부저(Piezo Buzzer)

소리는 신호로 표현할 수 있는데 이때 사용하는 것이 진폭(Amplitude)와 진동수(Frequency)입니다.
  • 진폭(Amplitude): 소리의 크기를 표현
  • 진동수(Frequency): 소리의 높낮이를 표현
진폭의 개념

진동수의 개념

현실 세계에서는 여러 종류의 진폭과 진동수가 섞여서 전달되므로 아래와 같은 그림이 될 것입니다.
현실에서의 소리 파형 모습

아두이노 Tone 라이브러리는 멜로디 소리를 낼 수 있도록 음계(Musical Scale)에 해당되는 진동수를 쉽게 만들어 줍니다.
도, 레, 미, 파 등의 음계는 모두 고유한 진동수를 갖고 있기때문에 피에조 부저에 전기 신호를 이와 같이 만들어주면 멜로디 소리를 만들 수 있습니다.
GenericTone은 이와같은 음계 진동수를 제어할 때 사용합니다.


GenericTone을 설정하려면 다음의 정보가 필요합니다.
  • id: ArdunityApp이 ArdunityController를 구분하기 위한 식별자
  • pin: 음계 진동수를 만들어낼 핀 번호
  • Tone Frequency: 음계 진동수
  • Mute: 소리내는 것을 멈춤
GenericTone에서는 음계 진동수를 쉽게 선택할 수 있도록 각 진동수에 이름을 붙였습니다.

이 이름 규칙을 이해하려면 먼저 국제적으로 음계를 어떻게 표기하고 있는지 알아야 합니다. 우리는 도, 레, 미, 파 등으로 부르지만 국제적으로는 C, D, E, F 등으로 표기됩니다.
음계 표기 방법

반음 올림 표시인 #은 Sharp의 약자로 S만 표기하고, 제일 뒤의 숫자는 옥타브(Octave)를 뜻합니다. 따라서 DS3은 3 옥타브 D#이라는 뜻입니다.

아두니티에서 피에조 버저를 제어하기 위한 연결은 Wire Editor에서 다음과 같이 표현됩니다.

위 정보를 아두이노 스케치로 Export한 후 Upload하면 제어할 준비가 완료됩니다.

GenericTone에서 사용하는 ToneFrequency는 Enum으로 다음과 같이 정의되어 있습니다. 각 숫자는 실제 진동수인 Hz를 의미합니다.

using UnityEngine;
public enum ToneFrequency
{
 MUTE = 0,
 B0 = 31,
 C1  = 33,
 CS1 = 35,
 D1  = 37,
 DS1 = 39,
 E1  = 41,
 F1  = 44,
 FS1 = 46,
 G1  = 49,
 GS1 = 52,
 A1  = 55,
 AS1 = 58,
 B1  = 62,
 C2  = 65,
 CS2 = 69,
 D2  = 73,
 DS2 = 78,
 E2  = 82,
 F2  = 87,
 FS2 = 93,
 G2  = 98,
 GS2 = 104,
 A2  = 110,
 AS2 = 117,
 B2  = 123,
 C3  = 131,
 CS3 = 139,
 D3  = 147,
 DS3 = 156,
 E3  = 165,
 F3  = 175,
 FS3 = 185,
 G3  = 196,
 GS3 = 208,
 A3  = 220,
 AS3 = 233,
 B3  = 247,
 C4  = 262,
 CS4 = 277,
 D4  = 294,
 DS4 = 311,
 E4  = 330,
 F4  = 349,
 FS4 = 370,
 G4  = 392,
 GS4 = 415,
 A4  = 440,
 AS4 = 466,
 B4  = 494,
 C5  = 523,
 CS5 = 554,
 D5  = 587,
 DS5 = 622,
 E5  = 659,
 F5  = 698,
 FS5 = 740,
 G5  = 784,
 GS5 = 831,
 A5  = 880,
 AS5 = 932,
 B5  = 988,
 C6  = 1047,
 CS6 = 1109,
 D6  = 1175,
 DS6 = 1245,
 E6  = 1319,
 F6  = 1397,
 FS6 = 1480,
 G6  = 1568,
 GS6 = 1661,
 A6  = 1760,
 AS6 = 1865,
 B6  = 1976,
 C7  = 2093,
 CS7 = 2217,
 D7  = 2349,
 DS7 = 2489,
 E7  = 2637,
 F7  = 2794,
 FS7 = 2960,
 G7  = 3136,
 GS7 = 3322,
 A7  = 3520,
 AS7 = 3729,
 B7  = 3951,
 C8  = 4186,
 CS8 = 4435,
 D8  = 4699,
 DS8 = 4978
}

다음 예제는 아두이노 보드가 연결되면 1초에 한번씩 도, 레, 미, 파, 솔, 라, 시, 도를 연주합니다.

using UnityEngine;
using System.Collections;
using Ardunity;

public class MyComponent : MonoBehaviour
{
 public GenericTone genericTone;

 private float _time = 0f;
 private int _musicalScale = 0;
 
 void Update ()
 {
  if(genericTone.connected)
  {
   _time += Time.deltaTime;
   if(_time >= 1f)  // per 1 second
   {
    _time = 0f;

    switch(_musicalScale)
    {
     case 0:
      genericTone.toneFrequency = ToneFrequency.C3;
      break;

     case 1:
      genericTone.toneFrequency = ToneFrequency.D3;
      break;

     case 2:
      genericTone.toneFrequency = ToneFrequency.E3;
      break;

     case 3:
      genericTone.toneFrequency = ToneFrequency.F3;
      break;

     case 4:
      genericTone.toneFrequency = ToneFrequency.G3;
      break;

     case 5:
      genericTone.toneFrequency = ToneFrequency.A3;
      break;

     case 6:
      genericTone.toneFrequency = ToneFrequency.B3;
      break;

     case 7:
      genericTone.toneFrequency = ToneFrequency.C4;
      break;
   }

   _musicalScale++; // Increase Musical Scale
   if(_musicalScale > 7)
    _musicalScale = 0;
  }  
 }
}


댓글 없음:

댓글 쓰기