このブログへの投稿は久しぶりです。(なんと1年半ぶり!)
前の記事以降、これこれの制作を通して少しずつ電子工作に慣れてきました。最近も次の作品作りに向けて目下作業中です。

今回はArduinoで複雑なメロディを奏でるプロジェクトを公開します。
まず、Arduinoで音を出力するサンプルはIDEのメニューから「File > Examples > Digital > Melody」にあります。ArduinoのDOUT(デジタルアウト)ピンをスピーカーにつなぎ、そのピンの出力を一定の周期で「01」に切り替えることでパルス波を得られます。また、その周期を変えることで音高コントロールすることができます。
これを改良して、ベンド(ある音高と別の音高を滑らかに繋げること)など、より細かい設定が可能なようにしました。下に基本的な使い方を解説します。興味ある人はDLしてソースを見てみてください。スコアの記述法を考えるのが簡易なプログラミング言語を作ってる感覚で面白かったです。より扱いやすいスコアの記述法なども募集します!名前はAuduinoを真似てます。

-
Meloduino
GIthub

Version: 1.1 (ベンディング時のバグを修正)
2009.10.12
Meloduino_v1_1.zip

Version: 1
2009.10.8
Meloduino_v1.zip


使い方
下記のようにスコア(char型の配列)を用意して、playScoreに渡します。
char score[] = "E----.";
playScore(score);


ノート
スコアはノートの連なりで構成され、playScoreの第2引数で1ノート分の単位時間を指定できます。
指定しない場合はデフォルト値(50ms)になります。
// scoreの中の1ノートの長さが1000msになります。
playScore(score, 1000);


スコア記号
'A','B','C','D','E','F','G','A','B':1ノートの音高
' ':1ノートの無音
'-':1ノートの持続
'~':ベンドと1ノートの持続
'>':1オクターブ上昇
'<':1オクターブ下降
'.':SILENCE_TIMEで指定された時間分の無音
'(':ノートの変化記号開始
')':ノートの変化記号終了
'[':グローバルの変化記号開始
']':グローバルの変化記号終了
',':無視される記号(グルーピングなどに使用する)


スコアの記述
ノートの音高を指定し、持続記号で長さを指定します。音高記号はそれだけで1ノート分の長さを持ちます。
"C" 「ド」
"C-"「ド」
"C--" 「ドー」

無音部分はスペースで記述します。"."を最後につけるとループするときに一定の間隔を設けることができます
"CC  C----."「ドド・・ドーー」

ベンドによる音程の接続
"C~~~~D." 「ド」から4ノート分の長さで「レ」へ移行します。
【注意】'~'の数で持続時間を指定します。例として次のノートの長さは(3ではなく)1ノート分になります。
"E~F."

ノート固有の変化記号はノートの後ろにつけます。
"C(<)."

グローバルな変化記号はそれ以降の全てのノートに影響します。
"CDE[>]CDE."

複数指定可能です。
"CDE[>>>]CDE."

上の方のビデオの中で再生してるスコアです。再生順になってます。
char score1[] = "C--D--E----D--C--    C--D--E--D--C--D----.[>]C--D--E----D--C--    C--D--E--D--C--D----.";
char score2[] = "[<<]CDEFGAB[>]CDEFGAB[>]CDEFGAB[>]CDEFGAB[>]CDEFGAB[>]CDEFGAB[>]CDEFGAB.";
char score3[] = "E(<<)A~G(>)BB(<<)B(>)~~BF(>>>>)E(<)D D(<)AB B";
char score4[] = "[<<],E--E~~D[>>]F(<)--F--F-- ,[<<<<],E--E~~D[>>]F(<)--F--F-- E,[<<<<],E--E~~D[>>>>]F(<)--F--F--E~_E(<),[<<<<],E--E~~D[>>>>]F(<)--F--F-- E(>)";


TODO
これから追加したい機能。
・半音階
・BPMの指定
・音高の周波数指定
・シャープやフラットの変化記号