秋月で買ってきたAquesTalkPico用に、当面使うために
いちいちArduinoボードからIC外したりつけたりするの
面倒なので、動作基板をでっちあげる。
例の秋月版Arduino互換基板を使用。
ATP3011F4-PUは内蔵RC発振8MHzで動くので、クロック源
はもともといらないんだけど、Arduino互換基板として
も使えるように16Mhzの発振源を載せておく。いつもなら
クリスタルを載せたいところなんだけど、すでに
2つも作ってるし、1個くらい手抜きでもいいだろう
ということで16Mhzのセラロックにしておいた。
作り上げて、早速圧電素子で鳴らしてみる…。
イマイチな音質なので、スピーカを鳴らしてみよう
という方向に。
アンプICを使うのも面倒なので、マニュアルにも
載っていた2SC1815の1石D級(というほどのものでも
ないけど)で鳴らしてみる。とりあえず圧電スピーカ
よりはよく鳴った。(直流成分がカットできない
ので大出力は当然無理)

マイコンでサクッとスピーカを鳴らすには結構便利
な回路かも。PWMでのアナログ音声をちょこっと鳴らす
とか。
AquesTalkPicoは、アクセントは文節(?)の切り方で
流暢さが結構かわるんだなぁ。なかなか難しい。「/」
と「'」を上手い具合に仕込むとそれっぽい抑揚で
聴こえて面白い。
買ったものの、未だにナニに組み込んだら良いか
用途が思いつかないんだけど、手元に数個置いて
おきたいなぁ。
ここ数日取り憑かれている、マイコン1個で作るPSG。
色々調べてみると思っていたより色々な作りこみ
が必要になりそう。
一つはDACのビット数と音量。音量の数値と音量は
そのまま比例するわけじゃないらしい。
http://d4.princess.ne.jp/msx/psg/
こことか見ると、指数的に音量が変化するみたい。
この辺はDACの分解能とのご相談かな。10ビット
PWMにしたくなるところだけど、TINY2313の8ビット
パラレルI/Oを生かそうとするとタイマー1は
使えないのが悩みどころ。うーん。
同じくこのページを見ると、ノイズジェネレータを
VHDLで書いたらどうなるかって書いてあって、
これを参考に作るならバッチリな情報なんだけど、
やっぱり何故ホワイトノイズの平均周波数を上げたり
下げたりできるのかが良くわかんない…
http://beatnic.jp/takedanote/vol20/
タケダノヲトの武田さんのサイトを見てみると、
Chuckさんの作られたノイズジェネレータを使って
可変抵抗でノイズ周波数の高低を制御できるっぽい
感じ。(サンプル音声を聞いてみると、かなり
良い感じの音が出てるので、あとでソースを追って
みたいところ。
http://ja.wikipedia.org/wiki/%E6%93%AC%E4%BC%BC%E4%B9%B1%E6%95%B0
擬似乱数ロジックのうち、線形帰還シフトレジスタ
を使っているみたい。線形合同法にあたるロジック
はこれまでに使ったことが何度かあるんだけど、
線形帰還シフトレジスタはあとで検討。処理速度
を加味して何ビット幅にするか、など。
そのほか、PSGやSSGで探っていってみると、
http://ngs.no.coocan.jp/doc/wiki.cgi/TechHan?page=1%BE%CF+PSG%A4%C8%B2%BB%C0%BC%BD%D0%CE%CF
http://hp.vector.co.jp/authors/VA054130/psg.html
MSX関係っていうのが多い感じ。
ベースクロックを4Mhzで考えた方がいいのか、
それとも3.58Mhzにした方がいいのか…
(マイコン自体は16Mhzや14.3Mhzなどで動かすこと
で考えるとして)
PC-6001やPCー8801mkIIsrはいくつだったろう?
探っても情報が見当たらない…
それにしても、PSGの「音量」にデータを書き込む形
でPCMを再生しちゃうって言う荒業があったのか…。
知らなかったな。



|
ArduinoのSDライブラリと、SparkFunのMP3 Player Shield
を使って、お休みタイマー付きMP3プレイヤーのプロトを
作る作戦を進行中。
まず作戦その1。SDライブラリに書き換え。
SparkFunのMP3 Player Shield製品ページにサンプル
スケッチが置いてあったりするんだけど、ちょっと古くて、
現在Arduino公式サイトで公開されているSDライブラリ
じゃなくて、その前段のsdfatライブラリを使ったもの
になっているので、これをSDライブラリに書き換え。
あまり苦労なく置き換えられるようなスケッチだった
ので、これはすんなりと完了。サクッと音が出た。
つぎ。作戦その2。固定ファイルじゃなくて、SDカード
のfatに登録されているファイルを1個1個舐めていって
順に再生させたい。
参考に使えるのがまずopenNextFile。これは
1個1個順にファイル(もしくはディレクトリ)を
舐めていってくれる機能。で、こいつのサンプルスケッチ
を実行してみると、ルートディレクトリ内のファイルを
舐めていって、ディレクトリもその対象にしてくれる
機能ってことは判った。けど、階層の深いディレクトリ
に入っていった後、元のディレクトリに戻っていく
機能はないみたい。
で、rewindDirectoryを使ってみると、それが
実現できるようになってる。このサンプルスケッチを
実行してみたら、SDカード内の全ファイルにアクセス
出来た。
つぎ。作戦その3。拡張子MP3だけを抜き出して再生。
処理対照のFILE型インスタンスから名前を取り出して、
末尾が「.mp3」か「.MP3」になっているものを抽出。
これはString型オブジェクトでendsWithを使ってみる
ことでクリア。
C言語的な文字配列として処理するんじゃなく、String
オブジェクトとすると結構簡単で便利だな。
つぎ。作戦その4。SDカード内の曲を続けて再生
させてみる。
これまでのモノを組み合わせて1つのスケッチにして
みると…、まぁそれなりに順々に曲が再生されるのが
実現できた。
さて、じゃぁSDカード1枚内の最後の曲まで行ったら
最初に戻るっていう処理にしたい…。
なぜだかここがうまく行ってなくてもがき中。
SDカード全部が終わったら、もう一度ルートディレクトリ
を開きなおして最初から順々に…と思ってやってみた。
確かにまた1曲目に戻るんだけど…、全曲再生しては
頭に戻り、全曲再生しては頭に戻り…をしていると、
途中でルートディレクトリを開く処理で止まっちゃう。
(正確に言うと、ルートディレクトリのオープン処理
でエラーが返ってきて開けない)
途中で使っているFILE型のオブジェクトやSD型の
オブジェクト、またはString型オブジェクトの開放を
明示していないからこいつらでメモリリークして
いるんじゃないかと思って、ヒープとスタックを
調べられないかなぁと、調査方法をさがす。
http://todotani.cocolog-nifty.com/blog/2009/06/arduino-texitst.html
こちらのサイトでバッチリな機能を公開してくれて
いるので(アリガタイ)、ここにあるスケッチ中から
check_mem()関数をお借りして、実行の途中途中で
ヒープとスタックの位置を表示させるシリアル
デバッグ作戦。
予想としては、オブジェクトのインスタンスを作ると、
都度ヒープにメモリを確保するはずなので、ヒープ
が伸びていってスタックを破壊するという図式。
いざ実行してみると…どうやら、ヒープがスタック領域
まで侵食している気配なし。うーーーーん。なんだこりゃ?
メモリを乱食いしているのか、それとも下手に開放した
メモリを参照するような処理してるのか、なんとも
よくわからない状態。しばらく動いていながら、途中
で動かなくなるっていうのはメモリリークっぽい感じ
なんだけど、ヒープとスタックのアドレス見る限り
ではそうでもないみたいだし…わからん。
rewindDirectoryやopenNextFileの引数はFILE型の
オブジェクトだったりするので、ここが一番怪しい
のでは?と思うんだけど、やっぱこの中身見ないと
いけないかな?String型を扱っているところは
悪さをしている感じではないんだけどな。
サクッと解決しそうにはないから、ちょっとずつ
中身を見ていこう。
これが片付いたら、曲の途中で次に飛ばしたり、
前に戻したり、早送り再生したり、ディレクトリ
単位で飛ばしたりしたいところ。
http://www.chiaki.cc/Timpy/vs1053b_jp.html#C9
こちらが参考になりそう。少なくとも曲飛ばしは
使えないと話にならないから、あとでじっくり
読んで機能載せていこう。
http://zasshi.news.yahoo.co.jp/article?a=20120411-00000000-toyo-bus_all
ヤマト2199、これまでとはずいぶん違う公開の
仕方なのは色々作戦があるみたいだな。盛り上がる
といいな。
http://headlines.yahoo.co.jp/hl?a=20120411-00000096-mai-soci
スマトラ島付近でまた8.7の巨大地震。今のところ
1mの津波ということで大きな被害はないみたい
なのは一安心。



|
|
|