STARM マイコン基板 (4)

FM音源プログラムのソースを STM32F103 対応に書き換えていって、何とか音が出るようになりました。
しかし、最初の段階では、内蔵されているデモ曲のうち1曲は全く音が出ず、他の2曲も1部のパートしか音が出ず、しかも音が悪い状態でした。
一応、テンポも合っているし、演奏データの処理は正しく行われている感じでした。
これまでの経験から、音色データのアライメント (パッキング) がズレていて、音色データに正しくアクセスできていなのではないかと考え、調べてみると、やはりアライメントがズレていました。
オペレータ1個分の音色データは 5 バイトなのですが、バイト単位でアライメントできないプロセッサ/コンパイラを考慮し、1オペレータ当り 6 バイト、2オペレータでは 12 バイトにして音色データを作成してあります。
このコンパイラはバイト単位でアライメントするので、2オペレータで 10 バイトとなり、ズレたデータをアクセスしてしまいます。
2バイト単位でアライメントするように「#pragma pack(2)」を入れてあるのですが、このコンパイラでは有効ではありません。
そこで、音色データの定義部分にパディングのバイトを入れて、正しくアクセスできるようにしました。
これで、内蔵曲すべて音が出るようになったのですが、音が悪いのはそのままでした。
結局、これは、16 ビットの 2 の補数である出力データを 10 ビット PWM のフォーマットに変換する部分のミスで、1024 を超える数値になっていたのが原因でした。
以上の2点を修正すると、正常な動作となりました。
USART の設定をして、MIDI 入力に対応させてコンパイルすると、いままで削除されていた mididec(), sysxdec() などが有効になり、コードのサイズが増えて、再びリンクできなくなりました。
どうも、コードサイズとリードオンリ・データの合計が 7800 バイト程度になるとリンクできなくなるようです。 16 K バイトまで OK のはずですが、なぜかは良く分かりません。
デモ曲をサポートしない構成にしてコードサイズを減らしてコンパイルすると、リンクできるようになりました。
そういうわけで、TGSTARM の暫定第1版は、

  • MIDI 入力なしで、デモ演奏のみ
  • デモ演奏なしのシリアル MIDI 入力のみサポート

のふたつの HEX ファイルを用意しようと思っています。
それ以降は、コンパイラを変更しようと考えています。
音源としての性能は、現在の LCD サポートなし、外付け DAC なしの段階で、CPU 負荷が 82 % 程度で、

  • 同時発音数 10 音、サンプリング周波数 30 kHz
  • 同時発音数 16 音、サンプリング周波数 18 kHz

になります。
これは、クロック 72 MHz という期待を裏切らない高性能です。
単純に比較すれば、

  • ADuC7026 の遅い方 (H3T) の約 6.7 倍
  • ADuC7026 の早い方 (I30) の約 4.8 倍
  • FR60 の約 3.3 倍
  • V850 の約 3.1 倍

となります。