stlと申します。
「音声ファイル(MIDIデータ)の再生をPWM機能を使って実現しようと試みています。
音声データを .bin ファイルに変換したものを、プログラムファイルと一緒にビルドする方法について教えていただけますか?
.bin
>>固定番地に配置するのであればリンカスクリプトでバイナリファイルを直接突っ込む方法が適しているかもしれません
こちらの方法が良いと思われるのはなぜでしょうか?
> こちらの方法が良いと思われるのはなぜでしょうか?セクション名もラベルも使わず記述できる点(多少使った方が分かり易そうですが)、ファイルが複数あってもリンカスクリプトの記述だけで完結できる点です。後からデータを差し替えられるようにしたいなら、スタティックリンクせず上記のように *mot(*.srec, *.hex) ファイルを別々に作った方が良いかもしれません。
バイナリファイルのデータをプログラムから使用したい場合、私は以下の様にやってます。
test.bin (お試しデータ)
$ cat test.bin | od -An -v -t x1 | sed -e "s/ /0x/" | sed -e "s/ /,0x/g" | sed -e "s/$/,/" [コマンドラインからの入力]0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, [コンソール(画面出力)]0xaa,0xaa,0xaa,0xaa,0xbb,0xbb,0xbb,0xbb,0xcc,0xcc,0xcc,0xcc,0xdd,0xdd,0xdd,0xdd,
UNIXのコマンドラインか、Windowsだとcygwinのコマンドラインなどで実行出来ます。
上記をちょっと加工して、
unsigned char data[xxx] = { //手で追加, サイズは自分で設定0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, 0xaa,0xaa,0xaa,0xaa,0xbb,0xbb,0xbb,0xbb,0xcc,0xcc,0xcc,0xcc,0xdd,0xdd,0xdd,0xdd}; //最後のカンマは手で消す "};"を追加
Cのソースに貼り付けて、コンパイルすれば、binファイルの中身がROMデータの中に入ります。
objcopy --set-start=0xFFE00000 とかでできますよ。
mot / hex 形式はたいていファイルの1行目がスタートレコード、末尾の1行がエンドレコードとなっています。片方のエンドレコード1行を sed '$1d' で削除し、もう一方のスタートレコード1行を sed '1d' で削除し cat でくっつければだいたい目的のことは達成できると思います。
MIDIデータは音声データじゃない件はさておき
リンカスクリプトとか詳しくなくて、私もこれが好き。私はPythonを使いますが、BINデータをプログラムとかで配列データのコードに生成するちっちゃなプログラムでしています!!!グラフィック液晶のフォントデータとかで使います。
最後のカンマは消さなくても C/C++ の言語仕様上、全く問題ないです。データ列末尾のカンマは単純に無視されます。まさにこういう、簡単なツールで機械生成したデータを加工せずに受け取るための仕様です。
PgRelief が「データ続いていませんか?」と文句言うのですが逸脱を選択しています。
単純 mot 結合で作るよりビルド時間がかかるのが玉に瑕っスね。デバッガで変数名が見えるのは Good 。
Okraさん
お答えいただきありがとうございました。
cacao99さん
>>mot / hex 形式はたいていファイルの1行目がスタートレコード、末尾の1行がエンドレコードとなっています。片方のエンドレコード1行を sed '$1d' で削除し、もう一方のスタートレコード1行を sed '1d' で削除し cat でくっつければ
プログラムファイルのMOTファイルと音声のMOTファイルに対して、上記のような操作を行えば結合できるのですね。スタートレコード・エンドレコードを削除するのは、プログラムファイル、音声ファイルのどちらでも構わないのでしょうか?
こちらのやり方が一番簡単そうだと思ったのですが、ビルドに時間がかかってしまうのですね。
立て続けの質問で恐縮ですが、cacao99さんがおっしゃっている方法では、プログラムファイルが変更されるたびに、結合作業などを行う必要があるのでしょうか?