stlと申します。
「音声ファイル(MIDIデータ)の再生をPWM機能を使って実現しようと試みています。
音声データを .bin ファイルに変換したものを、プログラムファイルと一緒にビルドする方法について教えていただけますか?
.bin
バイナリファイルのデータをプログラムから使用したい場合、私は以下の様にやってます。
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データの中に入ります。
最後のカンマは消さなくても C/C++ の言語仕様上、全く問題ないです。データ列末尾のカンマは単純に無視されます。まさにこういう、簡単なツールで機械生成したデータを加工せずに受け取るための仕様です。
PgRelief が「データ続いていませんか?」と文句言うのですが逸脱を選択しています。
単純 mot 結合で作るよりビルド時間がかかるのが玉に瑕っスね。デバッガで変数名が見えるのは Good 。
こちらのやり方が一番簡単そうだと思ったのですが、ビルドに時間がかかってしまうのですね。
この方法を使う時にセクションの頭にラベルを打っておけばラベル名をextern変数として参照できるし、コマンド実行も要らないのでビルド時間も延びません。工夫次第。https://mcuoneclipse.com/2022/06/17/include-bin-binary-files-in-a-gnu-linker-file/リンカスクリプトの諸々については詳しく解説しているページが色々とありますのでググってみてください。https://blog.thea.codes/the-most-thoroughly-commented-linker-script/
Okraさん
ありがとうございます。そちらの方法が良いのではないかと思いました。
cacao99 さま
>最後のカンマは消さなくても
ホントだ。
なんとなく消さなきゃダメだと思ってました。
binファイルのサイズ次第かと思いますが、64kBとか128kB程度だとビルド時間に差が生じる事は、体感的なレベルでは感じません。
stlさま
今回は、ターゲットが音声データという事で、後からデータを変更する事はしないかと思いましたが、
-----add_addr.awk
BEGIN{ addr = 0;}
{ printf("%s //0x%04X\n", $0, addr); addr += 16;}
-----
普段は、上記の様なスクリプトをかまして
od -An -v -t x1 test.bin | sed -e "s/ /0x/" | sed -e "s/ /,0x/g" | sed -e "s/$/,/" | awk -f add_addr.awk0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f, //0x00000xaa,0xaa,0xaa,0xaa,0xbb,0xbb,0xbb,0xbb,0xcc,0xcc,0xcc,0xcc,0xdd,0xdd,0xdd,0xdd, //0x0010
アドレスの情報を末尾に付与しています。後から特定のデータを変更する場合は、付けておくと便利です。
stlです。
tf様
教えていただきありがとうございました。