Propellerで音は出たものの
昨日、ブログを書いてから、いや、そんなに難しい訳ないだろう、と思って色々調べたところ、D/A用のライブラリがあって、取り敢えず使ってみたところ矩形波までは出たというところが昨日までの進捗。
ただ矩形波だとデジタルI/Oのオンオフと変わらず、使えてるかどうかの判断も出来ないので、まずはDCOを作ってみることにした。
元のC言語の例がSDカードのWAVファイルを読みだして鳴らすというものなので、周波数と一緒に呼び出されると、その度に順番に値を返す関数を書けばいいのだろう、という考え。
一週間チュートリアルで学んだことで、矩形波、ノコギリ派、三角波の関数自体はそんなに悩まなくても書けたが、仕様としてあってるのかよく判らない。
最初、16bitを前提に作ったけどネットで調べてみたらWAVファイルは16bitサウンドの場合、符号付き16進数でデータを持つようだが、きちんと扱えているかどうか怪しいので符号なしでいける8bitバージョンも作成。
USBでつないでシリアルコンソールから数値を2進数16進数10進数で表示させながら、期待した数値になっているか確認し、おかしなところのバグつぶし。どうやら出来たっぽい。
昨日挫折した、カウンタ・レジスタ経由のサウンド出力に再チャレンジする前に、D/A経由で音を出してみる。何か三角波はおかしいのだが、確かに矩形波とノコギリ波はちゃんと出ているようだ。相対的だけど周波数を指定してあげれば音程もちゃんと変わる。
ただボリュームの設定が思ったようには反映されない。音の大きさは対数的に変化するはずだったので、こんなもんかもしれないが聴覚的には常にフルボリュームっぽく聞こえる。
これが評価用ボードについているヘッドフォンアンプのせいなのか、D/Aの使い方が悪いのか、アルゴリズムに問題があるのか、合っているのか、判らない。悲しい。
とりあえずこの件に関しては保留にして、サンプルプログラムの改造にとりかかったが、SDカードの扱いと音の扱いのソースを上手く切り分けられず、エラーが出まくりコンパイルできない。
うーむ、まあ面白いことは面白いのだけれど、もうちょっと低めのハードルを飛び越えたいのだった。というか、まだプロペラチップおよびCPU一般とC言語に対しての経験値が低すぎる。
音の実験もしたいし、C言語の勉強もしたいので、まずは言語の勉強を
1)C言語の勉強
2)スピン言語の勉強
3)FORTHの勉強
に1個増やして、課題を
1−2)C言語でFORTHのソースを読む>C言語でプロペラにオリジナルFORTHの実装
2)スピン言語で書かれたPropForthのソースを読む>SpinForthへのDSP機能追加
3)オリジナルFORTHにDSP機能を追加
位の段取りにしないと、今の自分には正直手がかりが少ない。(あるんだろうけど気づかない、判らない)
まあでも今日は、まがりなりにもDCOが作れたので満足。