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;
}
}
}
댓글 없음:
댓글 쓰기