SSブログ

Arduino ProminiでPWMDAC_Synthを使って和音の曲を奏でる。(追記あり) [ds-DCCデコーダ]

 題名が?だが、今回の最終的にやりたいことは、DSdecに駅の発車メロディーを入れて、アクセサリーデコーダにするか、それとも、モーターのデコーダに発車音を詰め込むかである。
 実際の電車では、音はホームから流れるもので、電車から流れるものではないが
、でも、発車メロディーのスイッチ入れているのは車掌さんだし・・・。
 で、今回はそこまで行かずに和音で発車メロディーが流れるだけ。
 ことの始まりは、Yaasan様からDSdecR2+SoundOptionを頒布いただいたので、それで、まずはサンプルを聞いて、Arduinoってちゃんと音鳴るんだ!っと気づいたこと。(先に知っとけよというのはあるが)
 ただ、モーターのスケッチと一緒には載せられないようで、じゃあ、載せられるぐらい小さいものといえば、発車メロディーか?と思ったからである。
 もともとはKatoのかわね路号を買って、後ろの客車に蒸気機関車の音を入れようかと思ったのだが、昔、乗りに行ったときはビデオとらずに写真しかなく、サンプリングできそうな音がない・・・。ということで、この壮大な計画は早々にまた今度にしてしまった。
 で、題名のとおり、発車メロディーを奏でることにした。
 まず、Arduino、和音、ライブラリとかで検索すると良く出てくるのがMozziというライブラリ。とても高機能なようで、とりあえず、サンプルを落としてきて、ProMiniに入れたら、多分そうなんだろうなあという気はしていたが、ライブラリが大きすぎて、「不安定になるよ」という警告や、「メモリ足りないからコンパイルできません」。なんか、英語でよくわかんないし、そんな高機能いらなそうだし(負け惜しみ)と思い、他を探すことにした。
 次に見つけたのが、@きよし – Akiyoshi Kamide 様のPWMDAC_Synthというライブラリ。いろいろなところで紹介されているが、本家のページでも質問されているとおり、どうすれば音がなるのか、いまいちわからない。
 で、ソースを探すと、tadfmacさんのBlogにサンプルがあったので、鳴らし方はなんとなくわかった。
 それがわかると、本家のページの質問と回答が大体読めてきた。
 あとはライブラリにReadme.txtがあり、こちらの説明も有用だった。
 で、これらをベースにまずは一音で鳴るものを作った。ファイルの名前はかえるの歌だが、曲はドレミの歌だったりする。(なんだっていいって)
 構成だが、音はTimer2で11pinから出力する。これは、
-----------------
#define PWMDAC_OUTPUT_PIN 11
-----------------
 でTimer2の3,11、Tmer1の9,10ピンからを選べるようで、都合がよさそうである。
 それを、DSdecR2+SoundOptionのPAM8012をYaasan様のいうとおりにコンデンサなど付けて使用している。スピーカーも同じようにHDR9225をそのまま使用した。以下が写真。配線も11pinとVCC,GNDを繋いでいる。
和音実験.jpg
 そして、いよいよ和音。なんか、noteOnを音数分やれば和音になるそうで、そのように作った。出来たものの動画がこちら。

 なかなか良さげに鳴っているような気がする。(デバッグしながら一日中聞いていたら、気が狂いそうになっている)
 (修正)このときのスケッチは公開すると著作権にひかっかるようなので、代わりに「花」(春のうららの隅田川)の冒頭だけを入れたものを公開する。こちら
 今回からSoundOptionのスケッチを見習って、データはヘッダ(拡張子hのファイル)に入れるように変更した。
 発車メロディーの楽譜はYoutubeの動画から使わせていただいたが、個人的な使用はいいんだよね?でも、多分、公開はだめなのでしない。
 で、この演奏データファイルを見てもらうとわかるが、書くのがとても大変だった。
 (探せばMMLを書いてそれを変換してくれるライブラリあるんだろうけれども)
 ということで、もう一段、今度はこのヘッダファイル内のスケッチにわからせるためのデータ変換用のソフトを作った。画面はこんな感じで、プロジェクトはこちら(名前をデフォルトから変え忘れた・・・。)。\bin\debug\WindowsApplication1.exeが実行ファイル。
 MML風変換.png
 ソフトの使い方は、いわゆるMML風のものを入れると変換してくれるが、今回はオルゴール風のため、音を伸ばすという機能は無視しているので、いろいろと機能を限定した。(4分音符で延ばすとか8分音符で延ばすとか、テンポ指定するとかそういう機能は無い)。また、ドレミファがCDEFというのも、気に入らなかったので、ドレミファと入れられるようにした。(名残で普通の半角の”AB>CD+<A"みたいな書き方も受け付けるが。)
 ソースを読むと詳しくはわかるが、適当な機能を言うと、
ド、レ、ミ、ファ、ソ、ラ、シ、ド・・・音
+、-(マイナス)・・・半音あげる、下げる
ー(全角の長音)、R,r・・・休符
>・・・オクターブ上げ
<・・・オクターブ下げ
で、一連の曲は出来るはず。
気をつけなければいけないのが"-"(半角/全角 マイナス)と”ー”(全角 長音)で
前者はb(フラット)の意味で後者は休符の意味。Windowsが変換で、意訳をしてしまうので
+の後のー(長音)は注意。Windowsはまずマイナスにしたがる。
実際であるが、GK3-1,2という曲の一番上のパートについて
--------------
シラ+ファ+レ+ーーーーーレ+ファ+ラ+シラ+ファ+レ+
>ド+<ラファ+ミーーーーー>ド+レド+レド+<ラファ+
ミーーーーーーーーーーーーーーー
--------------
と入れて、変換ボタンを押すと
--------------
59, 58, 54, 51, 0, 0, 0, 0, 0, 51, 54, 58, 59, 58, 54, 51,
61, 57, 54, 52, 0, 0, 0, 0, 0, 61, 62, 61, 62, 61, 57, 54,
52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-------------- 
と変換してくれる。これをヘッダファイルにコピペすればよい。
ヘッダファイル(曲のデータファイル)の説明だが、
notes1[]~notes5[]まであり、5重和音が出せる。
pitch[]はピッチと書いてあるが、中身は周期で大きい数で遅くなる。(名前つける時点でしくじった)
音はこっそりnotes1~5でタイミングが異なり、和音発音時にpitchの大きさを大きくすると、ポロロロンとなるようにした。もちろん全体をすべて書き直せば曲のピッチを変えられる。
 (修正)著作権が切れていない音楽は問題があるようなので、切れたものや、著作権放棄されているもの、妄想ものなどを考える。JASRAC超怖いし。(youtubeへの投稿は問題ないらしい)
 
 そして、コンパイル後のProMini(168)のROM,RAMの余りは、
-----------------------------------
スケッチが プログラムストレージ領域の 5,192バイト (36%) を使用しています。最大は 14,336バイト です。
グローバル変数が 445バイト (43%) の 動的メモリを使用しており、ローカル変数に 579 バイトが残っています。最高は 1,024バイトです。
-----------------------------------
となっており、
 UnoであればTimerがバッティングしなければモーターデコーダに入りそうな気がする。(Prominiだとアクセサリーデコーダーかなあ。)
 
 
 
 
コメント(0)  トラックバック(0) 

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。