아두이노프로세싱 프로그래밍

아두이노 초보자를 위한 멜로디톤 연주(클레멘타인 곡 업데이트)

coding art 2017. 4. 5. 21:19
728x90

 

 

원래 아두이노를 만든 목적이 예능계 쪽 사람들의 컴퓨터 코딩 공부를 도우려고 만들었지만 결코 음악적인 도구로서 도움을 주기 위한 것은 아니다.

아두이노 예제 중 Digital의 toneMelody 코드를 불러내자.

아두이노의 음안 연주 톤은 사각형의 단순한 듀티 파형을 사용하므로 대단히 단조로운 편이다.

 

 

 

toneMelody 실행을 위해서 이 예제를 불러낼 때 pitches.h 라이브러리가 함께 불려와 설치됨을 알 수 있다.

이 라이브러리 내용은 계명에 해당하는 주파수 테이블을 포함하고 있는 것으로 보인다.

정수형 melody[] 어레이는 아주 짧은 음악 계명 데이터 8개를 설정하고 있다. 참고로 C4가 계명으로 "도"이다.

noteDurations[]어레이는 계명 별 음표의 길이의 역수를 정의한다. 즉 1000/noteDurations[] 가 실제 음표 길이 즉 박자에 해당한다.

계명이 총 8개이므로 8개의 음표 길이를 설정 계산한다. 계명과 음표가 준비되면 8번 디지털 핀에 연결된 스피커에 tone() 명령을 통해 실행한다.

 

 

toneMelody 연주에 사용하는 스피커는 시중의 전자공작 키트에 흔히 사용되는 모델을 사용하면 된다. 필자는 네오엘보 공작 박스에 있는 것을 하나 사용하였다.

 

 

스피커의 한 선은 GND에 다른 한 선은 디지털 8번 핀에 연결하여 회로구성을 완료한다.  그 이유는 스피커 자체의 직류 전압 하에서의 저항 값 내지는 교류 상태에서의 저항 값(임피던스)이 이미 8옴이므로 충분히 전류 제한이 가능한 상태이다. 스피커 규격은 대체로 4옴이거나 또는 8옴이 대부분이다. 크기가 작으면 아무런 문제가 없다. 압전형 부저를 사용하려면 직렬로 반드시 200∼330옴 정도의 전류제한 저항을 사용하는 것이 좋겠다.

음악이 너무 짧으므로 반복적이지만 되풀이시켜 연주 시간을 늘리려면 계명과 박자를 늘리고 아울러 thisNote<8에서 늘린 음과 박자 숫자만큼 8이라는 숫자를 늘려 주어야 한다.
Yahoo 싸이트에서 검색해 보면 좀 음악다운 멜로디 코드가 있는듯하니 각자 찾아서 연주해 보기 바란다.

 

 

다음의 클레멘타인 악보 코드를 참고하기 바란다.

 

toneMelody_Clementine

 

#include "pitches.h"

// notes in the melody:
int melody[] = {NOTE_A3, NOTE_B3, NOTE_C4, NOTE_C4,NOTE_B3,NOTE_A3, NOTE_B3, NOTE_G3, NOTE_G3, NOTE_B3, NOTE_A3, NOTE_D3, NOTE_FS3, NOTE_A3, NOTE_G3,
NOTE_G3, NOTE_G3, NOTE_G3, NOTE_D3, NOTE_B3, NOTE_B3, NOTE_B3, NOTE_G3, NOTE_G3, NOTE_B3, NOTE_D4, NOTE_D4, NOTE_C4, NOTE_B3, NOTE_A3,
NOTE_A3, NOTE_B3, NOTE_C4, NOTE_C4,NOTE_B3,NOTE_A3, NOTE_B3, NOTE_G3, NOTE_G3, NOTE_B3, NOTE_A3, NOTE_D3, NOTE_FS3, NOTE_A3, NOTE_G3,
NOTE_G3, NOTE_G3, NOTE_G3, NOTE_D3, NOTE_B3, NOTE_B3, NOTE_B3, NOTE_G3, NOTE_G3, NOTE_B3, NOTE_D4, NOTE_D4, NOTE_C4, NOTE_B3, NOTE_A3
};

// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
  3, 4, 2, 2, 3, 4, 2, 2, 4, 4, 1.5, 4, 4, 4, 1,
  3, 4, 2, 2, 3, 4, 2, 2, 4, 4, 1.5, 4, 3, 4, 1,
  3, 4, 2, 2, 3, 4, 2, 2, 4, 4, 1.5, 4, 4, 4, 1,
  3, 4, 2, 2, 3, 4, 2, 2, 4, 4, 1.5, 4, 3, 4, 1
};

void setup() {
  // iterate over the notes of the melody:
  for (int thisNote = 0; thisNote < 60; thisNote++) {

    // to calculate the note duration, take one second
    // divided by the note type.
    //e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
    int noteDuration = 1000 / noteDurations[thisNote];
    tone(8, melody[thisNote], noteDuration);

    // to distinguish the notes, set a minimum time between them.
    // the note's duration + 30% seems to work well:
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    // stop the tone playing:
    noTone(8);
  }
}

void loop() {
  // no need to repeat the melody.
}