stlと申します。
「音声ファイル(MIDIデータ)の再生をPWM機能を使って実現しようと試みています。
音声データを .bin ファイルに変換したものを、プログラムファイルと一緒にビルドする方法について教えていただけますか?
.bin
音声ファイルが例えば「ぺいぺい」とか「わおーん」とか提供されたものを改変せず使う(=開発中に更新される頻度が極めて少ない)のであれば、開発中のプログラムに直接組み込む必要はないわけです。プログラムとは離れた固定アドレスに格納するだけ。そういう場合、ウチでは次の手順としています。
1. マイコン内 CodeFlash のどこにその音声データを置くか決める
2. bin ファイルを当該アドレスに配置された mot / hex 形式に変換する。
3. 開発環境上、ポストビルド工程でプログラムの mot / hex と音声の mot / hex を単純に結合する
(begin / end レコードだけ特別扱いしないといけません)
RX671 2MiB マイコンだと FFE0000H-FFFFFFFFH が CodeFlash ですから
音声データを FFE00000H から配置する(ような mot に変換する)
プログラムは FFF00000H から配置する(ようにリンカスクリプトを書く)
mot と mot を結合する
こうしておくと音声データが最大 1MiB まで格納できます。コンパイラやリンカに音声データを食わせなくてよくて、ビルド時間が短縮できてハッピーになれそうです。
固定番地に配置するのであればリンカスクリプトでバイナリファイルを直接突っ込む方法が適しているかもしれません。(参考) Include .bin Binary Files in a GNU Linker Filehttps://mcuoneclipse.com/2022/06/17/include-bin-binary-files-in-a-gnu-linker-file/
>>2. bin ファイルを当該アドレスに配置された mot / hex 形式に変換する。
これはobjcopyで出来ますでしょうか?
>>3. 開発環境上、ポストビルド工程でプログラムの mot / hex と音声の mot / hex を単純に結合する
この結合はツールなどを使用するのでしょうか?
>>固定番地に配置するのであればリンカスクリプトでバイナリファイルを直接突っ込む方法が適しているかもしれません
こちらの方法が良いと思われるのはなぜでしょうか?
> こちらの方法が良いと思われるのはなぜでしょうか?セクション名もラベルも使わず記述できる点(多少使った方が分かり易そうですが)、ファイルが複数あってもリンカスクリプトの記述だけで完結できる点です。後からデータを差し替えられるようにしたいなら、スタティックリンクせず上記のように *mot(*.srec, *.hex) ファイルを別々に作った方が良いかもしれません。
objcopy --set-start=0xFFE00000 とかでできますよ。
mot / hex 形式はたいていファイルの1行目がスタートレコード、末尾の1行がエンドレコードとなっています。片方のエンドレコード1行を sed '$1d' で削除し、もう一方のスタートレコード1行を sed '1d' で削除し cat でくっつければだいたい目的のことは達成できると思います。
Okraさん
お答えいただきありがとうございました。
cacao99さん
>>mot / hex 形式はたいていファイルの1行目がスタートレコード、末尾の1行がエンドレコードとなっています。片方のエンドレコード1行を sed '$1d' で削除し、もう一方のスタートレコード1行を sed '1d' で削除し cat でくっつければ
プログラムファイルのMOTファイルと音声のMOTファイルに対して、上記のような操作を行えば結合できるのですね。スタートレコード・エンドレコードを削除するのは、プログラムファイル、音声ファイルのどちらでも構わないのでしょうか?
立て続けの質問で恐縮ですが、cacao99さんがおっしゃっている方法では、プログラムファイルが変更されるたびに、結合作業などを行う必要があるのでしょうか?