FM音源プログラム

新版FM音源プログラム (29)

Cortex-M シリーズを離れて、Espressif Systems 製の ESP-WROOM-32 モジュール (Cadence/Tensilica の Xtensa LX6 デュアル・コア内蔵) に対してプログラムを作成し、所要サイクル数を測定してみました。 具体的には、ハードウェアとしては「ESP32-DevKitC E…

新版FM音源プログラム (28)

gcc の「インライン・アセンブラ」で書いた ARMv7E-M (Cortex-M4) 版の acc_calc_slot() 関数のリストを下に示します。 「中身」は armcc 版と同等です。

新版FM音源プログラム (27)

gcc の「インライン・アセンブラ」で書いた ARMv7-M (Cortex-M3) 版の acc_calc_slot() 関数のリストを下に示します。 「中身」は armcc 版と同等です。

新版FM音源プログラム (26)

gcc の「インライン・アセンブラ」で書いた ARMv6-M (Cortex-M0) 版の acc_calc_slot() 関数のリストを下に示します。 「中身」は armcc 版と同等です。

新版FM音源プログラム (25)

armcc のエンベデッド・アセンブリ関数で書いた「アキュムレータ機能」付きのスロット計算関数「acc_calc_slot()」の Cortex-M0 版のリストを下に示します。

新版FM音源プログラム (24)

armcc のエンベデッド・アセンブリ関数で書いた「アキュムレータ機能」付きのスロット計算関数「acc_calc_slot()」の Cortex-M3 版のリストを下に示します。

新版FM音源プログラム (23)

armcc のエンベデッド・アセンブリ関数で書いた「アキュムレータ機能」付きのスロット計算関数「acc_calc_slot()」のリストを下に示します。 (2018 年 3 月 23 日追記: #if により各種アーキテクチャに対応させているのをやめて、Cortex-M4 専用のソースとし…

新版FM音源プログラム (22)

オリジナルの OPL3 (YMF262) および FM 音源 + ウェーブテーブル 音源である OPL4 (YMF278B) では、FM 合成された音の出力先を CHA/CHB/CHC/CHD の 4 系統の出力チャネルの中から任意の組み合わせで選べるようになっています。 ただし、DAC (YMF262 の場合は…

新版FM音源プログラム (21)

STM32F4 シリーズには、「Adaptive real-time accelerator」(ART Accelerator) と称するフラッシュ・メモリ読み出しのためのキャッシュ機構が備えられています。 フラッシュの読み出し幅は 128 ビット (16 バイト) で、フラッシュ上の命令 (I-Code) に対して…

新版FM音源プログラム (20)

Cortex-M4 用の結果では、フラッシュのキャッシュ機構の構成が同じ STM32F446 と STM32F407 とがほぼ同じ結果で、別のキャッシュ機構を持つ STM32F303 がやや異なる結果となりました。 PSoC5LP にはフラッシュのキャッシュのヒット/ミスの回数を計測するレジ…

新版FM音源プログラム (19)

今回からは実行サイクル数の検討に入ります。 まずは、ARMv6-M アーキテクチャの Cortex-M0 である NXP LPC1114、Cypress PSoC4 から始めます。 アセンブリ言語で書いたスロット (オペレータ) 計算プログラムをコンパイルして得られたオブジェクトを逆アセン…

新版FM音源プログラム (18)

アセンブリ言語によるスロット (オペレータ) 計算プログラムでは、ARMv6-M (Cortex-M0) の 16 ビット Thumb 命令を主に使うこととし、ARMv7-M (Cortex-M3/M4) に対しては一部を 32 ビット Thumb2 命令で記述することにより効率化しています。 以下に、その「…

新版FM音源プログラム (17)

armcc の「エンベデッド・アセンブラ」では、関数まるごとアセンブリ言語で記述し、関数冒頭のレジスタ・セーブや、関数最後のレジスタ・リストアやリターン命令まですべてを記述する必要がありました。 gcc の「インライン・アセンブラ」では、C 言語での記…

新版FM音源プログラム (16)

オペレータ処理をアセンブリ言語で書く場合、C プログラム・ソースの構造体アクセスの o_p->ph_acc のような表現は、アセンブリ言語ソースとしては最終的には ldr r2, [r0, #4] のように「定数オフセット」にまで変換される必要があります。 C プログラム・…

新版FM音源プログラム (15)

今回は各種のチップ/コンパイラの組み合わせのオブジェクトに対する逆アセンブル・リストを掲載します。 もとの C ソース・ファイルでの記述を少し変えると、コンパイル後のオブジェクトはかなり大きく変化するので、あまり細部に渡る追及はしないでおきます…

新版FM音源プログラム (14)

プログラムを動作させるマイコン・ボードとしては、オペレータ出力波形をオシロで手軽にチェックするために、手持ちの中で DAC を内蔵するチップを搭載している次のボードを選びました。 Nucleo-F446RE (STM32F446RET6, Cortex-M4) STMF4-Discovery (STM32F4…

新版FM音源プログラム (13)

これまでのFM音源プログラムでは、オペレータ (スロット) ひとつ分を実現する関数を定義し、それをオペレータの個数だけ呼び出していました。 より効率化するために、ひとつの関数内ですべてのオペレータの計算を行なうように変更することを考えています。…

新版FM音源プログラム (12)

2016 年 1 月 1 日付けの記事 (→こちら) の 4 K エントリの場合と同様に、テーブル・インデクスを「マスク」する方法により、テーブル・サイズを 3.75 K (3840) エントリまで削減することができました。 また、4 K エントリの場合と同様に、符号の操作も併用…

新版FM音源プログラム (11)

2016 年 1 月 1 日付けの記事 (→こちら) の 8 K (8192) エントリの「ウェーブテーブル」を用いる方式で、波形の一部を共有するすることによりテーブル容量を 6 K (6144) エントリまで減らすことができました。 サンプルごとの処理では、8 K エントリ方式と同…

新版FM音源プログラム (10)

FM 音源の「オペレータ」のフェーズ・ジェネレータ部、EG 部を除く、波形生成部分の計算量を見積もる作業をしています。 以下のような、波形テーブルのサイズの違う 3 種類のプロトタイプのプログラムを作ってみました。 8 K (8 × 1024 = 8192) エントリのテ…

新版FM音源プログラム (9)

STM32F4xx シリーズの DMAC は STM32F1xx シリーズの DMAC に比べて機能が拡張されており、ハードウェアで「ダブル・バッファ」機能をサポートしています。 これは、メモリ・ベース・アドレス・レジスタを「2 面」の DMA バッファに対応して 2 組持っていて…

新版FM音源プログラム (8)

BSP_AUDIO_OUT_Init() で初期化したあとは、 BSP_AUDIO_OUT_Play(uint16_t* pBuffer, uint32_t Size) で実際に DMA 転送によるオーディオ・データ出力を開始します。 第一引数 pBuffer は、配列要素がハーフワード (16 ビット) の DMA バッファ配列の先頭へ…

新版FM音源プログラム (7)

前回までの話は BSP (Board Support Package) ライブラリの「固定部分」を組み込むための手順でした。 手順 5. はユーザ・アプリケーションから API (Application Programming Interface) 関数を介して BSP ライブラリを利用する方法で、手順 6. は BSP ライ…

新版FM音源プログラム (6)

前回の記事の手順 3. に示した、開発環境にコンパイル/インクルード対象として登録すべき BSP_AUDIO_OUT 関係のファイルを下に示します。

新版FM音源プログラム (5)

STM32CubeFx ライブラリでは、HAL (Hardware Abstraction Layer) ライブラリ、BSP (Board Support Package) の他に、各ボード用のサンプル/デモ・プロジェクトが含まれています。 例として、STM32CubeF4 V1.7.0 の場合のフォルダ構成を下に示します。 主にST…

新版FM音源プログラム (4)

STM32CubeMX で新規プロジェクトを立ち上げる際のダイアログで「MCU Selector」タブではなく「Board Selector」タブを選ぶと、選択したボードで使われているピン (ポート) のコンフィギュレーションがあらかじめ設定されたプロジェクトが生成されます。 ただ…

新版FM音源プログラム (3)

BSP (Board Support Package) とは、その名の通り STMicro 製の Nucleo ポード類、Discovery ボード類、および各種の評価ボード類に実装されているペリフェラルをサポートするドライバ類のパッケージです。 これらは、以前の「Standard Peripheral Library」…

新版FM音源プログラム (2)

「ペリフェラル初期化 C ソースコード・ジェネレータ」である STM32CubeMX では、以下の開発環境によるビルドに対応しています。 ARM/Keil MDK-ARM IAR EW-ARM Attolic TrueSTUDIO AC6 SW4STM32 このうち、最初の 3 つは商用の開発環境で、STMicro 以外の他…

新版FM音源プログラム (1)

過去、いろいろなマイコンに対して FM 音源プログラムを移植して来ましたが、その中身自体は数年前に大きく書き直してからは基本的に変わっていませんでした。 8 ビット AVR 用を除けば、当初からフラッシュがたくさんあるマイコン用として、スピード重視で…

Nucleo-F401RE 用FM音源プログラム -- TGF401RE (1)

6 月 24 日付けの記事では、STM32F4-Discovery 用のFM音源プログラム TGSTM32F4 に手を入れて Nucleo-F401RE にも対応させるつもりでしたが、方針を変更して、Nucleo 用のプログラムは独立させることにしました。 周辺モジュールの操作部分は STM32Cube を…