ArduinoUNOのtone()でメロディーを演奏するためのデータを作成する
Arduinoで音を出すにはtone()を使うのが簡単です。tone(ピン番号,周波数,音の長さ) で指定の出力ピンに方形波で指定の周波数の音を出すことができます。
※ notone(ピン番号) で音を止めます。
なので、ドレミを周波数表に従って変換してやればメロディーを演奏出来ます。
音程と周波数の変換表は▼コレ、緑色が基準の音階になります。
ド | ド# | レ | レ# | ミ | ファ | ファ# | ソ | ソ# | ラ | ラ# | シ | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 33 | 35 | 37 | 39 | 41 | 44 | 46 | 49 | 52 | 55 | 58 | 62 |
2 | 65 | 69 | 73 | 78 | 82 | 87 | 93 | 98 | 104 | 110 | 117 | 123 |
3 | 131 | 139 | 147 | 156 | 165 | 175 | 185 | 196 | 208 | 220 | 233 | 247 |
4 | 262 | 277 | 294 | 311 | 330 | 349 | 370 | 392 | 415 | 440 | 466 | 494 |
5 | 523 | 554 | 587 | 622 | 659 | 698 | 740 | 784 | 831 | 880 | 932 | 988 |
6 | 1047 | 1109 | 1175 | 1245 | 1319 | 1397 | 1480 | 1568 | 1661 | 1760 | 1865 | 1976 |
7 | 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の配布ページ』を参照。