So-net無料ブログ作成
  • ブログをはじめる
  • ログイン

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