ゆるく楽しむプログラミング

ArduinoUNOのtone()でメロディーを演奏するためのデータを作成する

Arduinoで音を出すにはtone()を使うのが簡単です。
tone(ピン番号,周波数,音の長さ) で指定の出力ピンに方形波で指定の周波数の音を出すことができます。
※ notone(ピン番号) で音を止めます。

なので、ドレミを周波数表に従って変換してやればメロディーを演奏出来ます。
音程と周波数の変換表は▼コレ、緑色が基準の音階になります。
  ド  ド#  レ  レ#  ミ  ファ  ファ#  ソ  ソ#  ラ  ラ#  シ 
33 35 37 39 41 44 46 49 52 55 58 62
65 69 73 78 82 87 93 98 104 110 117 123
131 139 147 156 165 175 185 196 208 220 233 247
262 277 294 311 330 349 370 392 415 440 466 494
523 554 587 622 659 698 740 784 831 880 932 988
1047 1109 1175 1245 1319 1397 1480 1568 1661 1760 1865 1976
2093 2217 2349 2489 2637 2794 2960 3136 3322 3520 3729 3951

この表を見ながらドレミをtone()に置き換えてスケッチを作れば…なんて面倒でやってられません。
「まぁ、そのうち」「暇なときに」…なんてやっている間に2週間が過ぎてしまい一向に進まないので直接的にドレミをtone()に置き換えるツールを作ってみました。

画面構成

VBのString型変数は最大2GByteの文字列を扱えますので、今回はテキストのtextアトリビュートを作業領域として使いMMMLっぽいテキストのLOAD/SAVE、変換したデータ/スケッチの格納場所に使用します。




MMLっぽい文法をtone()に変換

MMLの書式は『MML コマンド一覧』を参考にしました。
・最初にドレミ~をCDE~に変換

・1文字づつ読みこんでCDE~に対応する周波数を構造体にセット

・次の音(CDE~)が出てきたら構造体をListに登録、新しい構造体インスタンスを作成
 この時に今現在処理しているのが音符なのかテンポなのか音調なのかを認識するためにフラグを設定します。
 リスト中では mode変数がソレにあたります。
 何も処理していない状態では0をセット、音符を処理している状態なら1をセット。
 1がセットされている状態で読み込んだ文字が数字(0~9)なら音の長さ指定である。
 と言った具合に動作を制御します。

・最後にListに入っている音符情報をまとめてtone()書式のテキストに変換

の手順で作成しています。

ザックリこんな感じ(細かいところは省略)


完成

適当に取り掛かり雑に作ったので無駄な変数、無駄な処理があります。
真面目に設計すればもうちょっとシンプルに作れるかと思います。

実行モジュールとソースファイルは『MakeToneの配布ページ』を参照。

解説動画