아두이노 우노로 어벤져스 테마 폴리포닉 연주기 만들기 (Playtune 라이브러리)
부품 및 소모품
아두이노 우노
1개
브레드보드 하프 사이즈
1개
스피커 3W 4Ω (또는 소형 스피커 박스)
1개 ※ 부저는 음량 부족
저항 220Ω
3개 (각 채널 직렬)
저항 10kΩ
1개
저항 4.75kΩ
1개
저항 56Ω
1개
LED (채널별 신호 표시용, 옵션)
3개
회로도
디지털 핀 10, 11, 12 → 각각 220Ω 저항 → 공통 연결 → 스피커 + 단자. 스피커 - 단자 → GND. 각 채널 중간에서 LED + 저항으로 GND 연결 시 채널 활동 표시 가능 (옵션).
브레드보드 조립
간단하게 브레드보드에 구성 가능. 스피커 박스(무전원)를 사용하면 음질/음량 향상.
핵심 아이디어: Playtune 라이브러리
아두이노 기본 tone() 함수는 단음(모노포닉)만 가능. Len Shustek의 Playtune 라이브러리 를 사용하면 타이머 인터럽트를 활용해 **최대 3채널(우노) / 6채널(메가) 폴리포닉 재생**이 가능합니다.
프로그래밍
악보 데이터는 PROGMEM 바이트 배열로 저장. tune_initchan(핀)으로 3채널 초기화 후 tune_playscore()로 재생. 재생 중에는 tune_playing 플래그로 대기, 곡 끝나면 3초 대기 후 반복.
#include <Playtune.h>
// 어벤져스 테마 악보 데이터 (PROGMEM)
const byte PROGMEM avengers[] = {
0x90,0x3E,0x00,0x7A,0x80,0x00,0x02,0x90,0x3E,0x00,0x7A,0x80,0x00,0x02,0x90,0x3E,
0x00,0x7A,0x80,0x01,0x79,0x90,0x3E,0x00,0x7A,0x80,0x00,0x02,0x90,0x3E,0x00,0x7A,
0x80,0x00,0x02,0x90,0x3E,0x00,0x7A,0x80,0x01,0x79,0x90,0x3E,0x00,0x7A,0x80,0x00,
0x02,0x90,0x3E,0x00,0x7A,0x80,0x00,0x02,0x90,0x3E,0x00,0x7A,0x80,0x00,0x02,0x90,
0x3E,0x00,0x7A,0x80,0x00,0x02,0x90,0x3F,0x00,0x7A,0x80,0x00,0x02,0x90,0x3F,0x00,
0x7A,0x80,0x00,0x02,0x90,0x3F,0x00,0x7A,0x80,0x01,0x79,0x90,0x3F,0x00,0x7A,0x80,
0x00,0x02,0x90,0x3F,0x00,0x7A,0x80,0x00,0x02,0x90,0x40,0x00,0x7A,0x80,0x01,0x79,
0x90,0x40,0x00,0x7A,0x80,0x00,0x02,0x90,0x40,0x00,0x7A,0x80,0x00,0x02,0x90,0x40,
0x00,0x7A,0x80,0x00,0x02,0x90,0x40,0x00,0x7A,0x80,0x00,0x02,0x90,0x41,0x00,0x7A,
0x80,0x00,0x02,0x90,0x41,0x00,0x7A,0x80,0x00,0x02,0x90,0x41,0x00,0x7A,0x80,0x01,
0x79,0x90,0x41,0x00,0x7A,0x80,0x00,0x02,0x90,0x41,0x00,0x7A,0x80,0x00,0x02,0x90,
0x40,0x00,0x7A,0x80,0x01,0x79,0x90,0x40,0x00,0x7A,0x80,0x00,0x02,0x90,0x40,0x00,
0x7A,0x80,0x00,0x02,0x90,0x40,0x00,0x7A,0x80,0x00,0x02,0x90,0x40,0x00,0x7A,0x80,
0x00,0x02,0x90,0x3F,0x00,0x7A,0x80,0x00,0x02,0x90,0x3F,0x00,0x7A,0x80,0x00,0x02,
0x90,0x3F,0x00,0x7A,0x80,0x01,0x79,0x90,0x3F,0x00,0x7A,0x80,0x00,0x02,0x90,0x3F,
0x00,0x7A,0x80,0x00,0x02,0x90,0x3A,0x00,0xF7,0x80,0x00,0xFC,0x90,0x3C,0x00,0xF7,
0x80,0x00,0xFC,0x90,0x4A,0x91,0x37,0x92,0x4F,0x00,0x7A,0x80,0x81,0x00,0x02,0x90,
0x3E,0x91,0x4A,0x00,0x7A,0x80,0x81,0x00,0x02,0x90,0x3E,0x91,0x4A,0x00,0x7A,0x80,
0x81,0x01,0x79,0x90,0x3E,0x91,0x4A,0x00,0x7A,0x80,0x81,0x00,0x02,0x90,0x3E,0x91,
0x4A,0x00,0x7A,0x80,0x81,0x00,0x02,0x90,0x3E,0x91,0x4A,0x00,0x7A,0x80,0x81,0x01,
0x79,0x90,0x3E,0x91,0x4A,0x00,0x7A,0x80,0x81,0x00,0x02,0x90,0x3E,0x91,0x4A,0x00,
0x7A,0x80,0x81,0x00,0x02,0x90,0x3E,0x91,0x4A,0x00,0x7A,0x82,0x80,0x81,0x00,0x02,
0x92,0x4F,0x90,0x3F,0x91,0x4B,0x00,0x7A,0x80,0x81,0x00,0x02,
// ... (이하 생략, 전체 데이터는 GitHub 또는 원문 참조)
0x0F,0x9D,0x82,0x81,0x80,0xF0
};
Playtune p;
void setup() {
p.tune_initchan(10); // 채널 0
p.tune_initchan(11); // 채널 1
p.tune_initchan(12); // 채널 2
}
void loop() {
p.tune_playscore(avengers); // 재생 시작
while (p.tune_playing); // 재생 대기
p.tune_delay(3000); // 3초 쉼 (아두이노 delay() 사용 금지)
}
악보 데이터 생성 팁
MIDI 파일을 Playtune 포맷으로 변환하는 툴(midi2playtune)이 라이브러리에 포함되어 있습니다. 원하는 곡의 MIDI를 구해 변환하면 손쉽게 새 곡 추가 가능.
추가 자료
마무리
단 3개의 디지털 핀과 간단한 저항/스피커 구성으로 영화관급 웅장한 폴리포닉 사운드를 아두이노 우노에서 구현할 수 있습니다. Playtune 라이브러리의 강력함을 체감해 보세요. 어벤져스 테마 외에도 좋아하는 곡을 MIDI로 변환해 넣어 나만의 미니 오케스트라를 만들어 보시길 추천합니다!