Edison で「ダース・ベイダーのテーマ」を奏でる

2015.01.06

音を鳴らそう

はじめに

わたくしハードウェアに関してはド素人ですが、最近 Intel の Edison をさわりはじめました。 前からハードウェアには興味があったので、これから色々やっていけたらいいなと思っています。 今回は Grove Starter Kit for Arduino に付属しているブザーを使用して、メロディーを作ってみました。

Edison, Arduino のセットアップについては都元先生の都元と学ぶIoTアドベントカレンダーだった2014 - シリーズ - を御覧ください。

帝国のマーチ(ダース・ベイダーのテーマ) with Intel Edison

環境

  • Edison edison-rel1-maint-weekly_build_16_2014-10-14_14-56-19
  • Grove - Buzzer (Grove Starter Kit for Arduino)
  • Arduino 1.5.3 - Intel 1.0.4

ブザー

buzzer

こちらがブザーです。 大きさは1円玉程度。 (たぶん)単一の音しか出せませんが、「音を出さない (0)」と「音を出す (1)」を繰り返し、矩形波と呼ばれる波形で音の周波数を表現し、擬似的に対応する音を出力します。

音の高低は周波数によって決まります。 低い音ほど周波数が低く、高い音ほど周波数が高くなります。

日本語の「ドレミファソラシ」は、英語では「CDEFGAB」で表現します。 そして「ラ(A)」の音は 440 Hz らしいです。 1オクターブ音を下げると周波数は半分になり、1オクターブ音を上げると周波数は倍になるようです。

詳しくはこちら

Arduino リファレンス

  • Tutorial Melody
    • 矩形波を自前で作り、音を出すチュートリアル
  • Reference Tone
    • 周波数を引数で渡し、音を出す関数
  • Tutorial Tone
    • 上記 tone() 関数を使用するチュートリアル

今回は tone() 関数を利用して音を出力してみました。

サンプルコード

「帝国のマーチ」の A メロは以下のとおりです。

ソ, ソ, ソ, レ, ラ#, ソ, レ, ラ#, ソ, レ, レ, レ, レ#, ラ#, ファ#, レ, ラ#, ソ

これらの音の周波数を「pitches.h」に定義しておきます。 (チュートリアルにかかれているもののコピペです)

ImperialMarch.ino

#include "pitches.h"

// ブザーを接続するピン 今回は D8 に接続
int buzzerPin = 8;

// 帝国のマーチ A メロ
int melody[] = {
  NOTE_G3, NOTE_G3, NOTE_G3, NOTE_DS3, NOTE_AS3, NOTE_G3, NOTE_DS3, NOTE_AS3, NOTE_G3,
  NOTE_D4, NOTE_D4, NOTE_D4, NOTE_DS4, NOTE_AS3, NOTE_FS3, NOTE_DS3, NOTE_AS3, NOTE_G3
};

// 音の長さ 2, 4, 8 はそれぞれ 2分音符、4分音符、8分音符
int noteDurations[] = {
  4, 4, 4, 6, 8, 4, 6, 8, 2,
  4, 4, 4, 6, 8, 4, 6, 8, 2
};

void setup() {
  for (int thisNote = 0; thisNote < sizeof(noteDurations) / sizeof(noteDurations[0]); thisNote++) {
    int noteDuration = 1000 / noteDurations[thisNote];
    tone(buzzerPin, melody[thisNote], noteDuration);
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    noTone(buzzerPin);
  }
}

void loop() {
  // ループはしない
}

pitches.h

/*************************************************
 * Public Constants
 *************************************************/

#define NOTE_B0  31
#define NOTE_C1  33
#define NOTE_CS1 35
#define NOTE_D1  37
#define NOTE_DS1 39
#define NOTE_E1  41
#define NOTE_F1  44
#define NOTE_FS1 46
#define NOTE_G1  49
#define NOTE_GS1 52
#define NOTE_A1  55
#define NOTE_AS1 58
#define NOTE_B1  62
#define NOTE_C2  65
#define NOTE_CS2 69
#define NOTE_D2  73
#define NOTE_DS2 78
#define NOTE_E2  82
#define NOTE_F2  87
#define NOTE_FS2 93
#define NOTE_G2  98
#define NOTE_GS2 104
#define NOTE_A2  110
#define NOTE_AS2 117
#define NOTE_B2  123
#define NOTE_C3  131
#define NOTE_CS3 139
#define NOTE_D3  147
#define NOTE_DS3 156
#define NOTE_E3  165
#define NOTE_F3  175
#define NOTE_FS3 185
#define NOTE_G3  196
#define NOTE_GS3 208
#define NOTE_A3  220
#define NOTE_AS3 233
#define NOTE_B3  247
#define NOTE_C4  262
#define NOTE_CS4 277
#define NOTE_D4  294
#define NOTE_DS4 311
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_FS4 370
#define NOTE_G4  392
#define NOTE_GS4 415
#define NOTE_A4  440
#define NOTE_AS4 466
#define NOTE_B4  494
#define NOTE_C5  523
#define NOTE_CS5 554
#define NOTE_D5  587
#define NOTE_DS5 622
#define NOTE_E5  659
#define NOTE_F5  698
#define NOTE_FS5 740
#define NOTE_G5  784
#define NOTE_GS5 831
#define NOTE_A5  880
#define NOTE_AS5 932
#define NOTE_B5  988
#define NOTE_C6  1047
#define NOTE_CS6 1109
#define NOTE_D6  1175
#define NOTE_DS6 1245
#define NOTE_E6  1319
#define NOTE_F6  1397
#define NOTE_FS6 1480
#define NOTE_G6  1568
#define NOTE_GS6 1661
#define NOTE_A6  1760
#define NOTE_AS6 1865
#define NOTE_B6  1976
#define NOTE_C7  2093
#define NOTE_CS7 2217
#define NOTE_D7  2349
#define NOTE_DS7 2489
#define NOTE_E7  2637
#define NOTE_F7  2794
#define NOTE_FS7 2960
#define NOTE_G7  3136
#define NOTE_GS7 3322
#define NOTE_A7  3520
#define NOTE_AS7 3729
#define NOTE_B7  3951
#define NOTE_C8  4186
#define NOTE_CS8 4435
#define NOTE_D8  4699
#define NOTE_DS8 4978

感想

わからないことだらけでしたが、何とか目的のものを作ることができてとても楽しかったです。 チュートリアルでは「きらきら星」が流れたので、「ダース・ベイダーのテーマ」も絶対作れる!と信じ突き進みました。 勢いって大事ですよね。

ピアノが得意で絶対音感の持ち主である妻に感謝。