FM音源プログラム TGFM3 (V1.2) readme 2012/06/17 pcm1723 ●はじめに このプログラムは、 Cortex-M3 コア搭載 富士通製マイコン MB9BF618T 使用の CQ 出版発行「インターフェース」誌 2012 年 6 月号付属基板 「CQ-FRK-FM3」 用のFM音源プログラム (V1.2) のパッケージです。 V1.2 では、シリアル MIDI使用時のマルチ・ポート対応で同時発音数 32 (24 kHz サンプリング、モノラル設定の場合) を実現しました。 ステレオ (パンポット) 対応と、従来の SMAF (Synthetic music Mobile Application File) シーケンサに代えて SMF (Standard MIDI File) シーケンサの組み込みにより、同時発音数を活かしたデモ曲を内蔵しました。 非商用利用のみ許可します。 内容的には、既存の TGSTARM/TGSTVL などの STMicro 製 Cortex-M3 用 プログラムをベースにしたもので、機能は Renesas RX62N 用のプログラム (V1.2) と同等のものです。 FM3 マイコン内蔵の PWM モジュールを DAC として利用したオーディオ出力と、 外付けのディジタル・オーディオ DAC BU9480F (ROHM) からの出力に対応して います。 内蔵 PWM を利用する場合でも、外部にローパス・フィルタ (LPF) 回路が 必要となります。 もちろん、(標準) MIDI / シリアル MIDI 入力の MIDI 音源として機能 させるには、外部回路として MIDI インターフェースが必要になります。 プログラム・サイズが、 KEIL および IAR の無償版開発環境のサイズ制限 を超えるので、gcc のツールチェインを利用してコンパイルしています。 2012/05/21 版ではスタートアップ・ルーチンは、ねむいさんがアセンブラで 書かれたものを使っていましたが、2012/06/17 版では、スタートアップ・ ルーチン(C ランタイム) は iruka さんが C で作成された「crt0.c / .h」 を一部改変して使っています。 コンパイル方法としては、2 種類用意してあります。 まず、インターフェース誌 2012 年 7 月号付属の DVD-ROMに収録されている、 Eclipse/CDT + gcc ツールチェインという構成による無償で使える GUI 開発 環境「PizzaFactory8 (CQ 版)」を使う方法です。 もうひとつは、「Programmer's Notepad 2」+ gcc ツールチェインによる 簡易 GUI 環境による方法です。 オブジェクトの hex ファイルは、富士通製のアプリケーション 「FLASH USB DIRECT Programmer」 を利用して書き込みます。 もちろん、JTAG/SWD 経由での書き込みも可能なはずですが、確認はしていません。 多くの部分は ADuC7026版や、V850版と同様なので、Web サイト http://www.geocities.jp/pcm1723/ のADuC7026版や、V850版の説明を参照してください。 含まれている音色データはフリーの「std.sb」から変換したものなので、上記 サイトの記述のように、「MA2 オーサリングツール」付属の音色データと差し 替えることをお勧めします。 ソースファイルの再コンパイルによらず、HEX ファイルの音色データ部分のみを 差し替える方法も用意してあります。 上記サイトの「音色データの差し替え/再コンパイルなしの差し替え」の項 http://www.geocities.jp/pcm1723/compile.htm#fmdata_4 を参照してください。 出来上がりのファイル名 (パス名) は、 TGFM3/Debug/TGFM3ma.mhx TGFM3/Debug/TGFM3ma2.mhx です。 ●仕様 - CQ-FRK-FM3 基板上の PWM 出力からのオーデャBオ出力と、外付けのディジタル・ オーディオ DAC (ROHM BU9480F) からのオーディオ出力に対応 - サンプリング周波数は 24 kHz、32 kHz、48 kHz に対応し、スイッチ操作で選択可能 - デフォルトのサンプリング周波数は 48 kHz bナ、同時発音数は 12 (ステレオ)  サンプリング周波数と同時発音数の対応は次の通り     fs NPOLY NPOLY (モノラル) (ステレオ) -------- ------ ------ 48.0 kHz 16 12 32.0 kHz 24 19 24.0 kHz 32 25  サンプリング周波数の誤差は、メイン・クロック (4 MHz) の周波数誤差に  起因するものだけとなる ステレオとモノラルの切り替えはコンパイル時のオプションであり、デフォルト  ではステレオになっている  ステレオ対応は、MIDI コントロール・チェンジ 10 番 (CC#10) の  「パンポット」の指定により、ステレオ音場内での「定位」を設定するだけ  の機能で、音源自体にステレオの広がりを持たせるわけではない 各 MIDI チャンネルとも、後着優先のモノモード、つまり、1チャンネル  あたり1音しか発音できない 16 音 (以上) を同時発音させるためには、16 MIDI チャンネルすべてを使う 必要があり、事実上、シーケンサーによる演奏に限られる V1.2 では、SMF シーケンサを内蔵し、デモ曲のデータも上述の事情を考慮  して作成してあるので、同時発音数を活かした演奏となっている  また、次項のマルチ・ポートは、単なる「MIDI プレイヤー」では対応して  いない場合が多く、シーケンサー・ソフトによる再生が必要になる - 「シリアル MIDI」の「マルチ・ポート」に対ホ応し、2 ポート、最大 32 音  まで発音可能 同時発音数 16 以下の場合は、すべて「ポート 0」に割り付けられ、同時  発音数 16 を超える分が「ポート 1」に割り付けられる  ホスト PC のアプリケーション側で、たとえば YAMAHA の「CBX ドライバ」  で "YAMAMHA CBX A Driver" を選ぶとポート 0 側、"YAMAHA CBX B Driver"  を指定するとポート 1 側が選ばれる - 通常のマルチティンバー音源では、MIDI チャャ塔lル 10 はリズム音源の チャンネルだが、本機ではリズム音源の機能はない 同時発音数 10 以上 15 以下の場合には、MIDI チャンネル 10 をスキップ  して割り当てるように変更 (V1.2) 同時発音数 16 以上では、MIDI チャンネル 10 のスキップ機能はないので、  リズムデータを含む演奏データを再生する場合には、MIDI チャンネル 10 を  送信側でオフにして、リズムデータを送出しない設定にする必要がある - フィードバック・ディレイによる簡易ディジャ^ル・リバーブ (エコー) を実装 - フォトカプラを使った通常の MIDI 入力 (31..25 kbps) と、RS-232-C 経由の シリアル MIDI 入力 (38.4 kbps) に対応 - 16 文字 x 2 行のキャラクタ LCD を接続してト、簡易 MIDI モニタ、CPU 負荷率  などの表示や、サンプリング周波数の切り替えが可能 ●ハードウェア 回路図「TGFM3.pdf」を、HEX パッケージでは、この「readme.txt」ファイルと 同じフォルダに、ソース・パッケージでは「TGFM3/sch」フォルダに置いて あります。 オーディオ信号出力は 基板上の PWM 出力端子と、外付け DAC (ROHM BU9480F2) から出力されます。 PWM 出力は、 PA0/RTO20_0 (CN3-27) 「AOUT_L」(左チャンネル) PA2/RTO22_0 (CN3-29) 「AOUT_R」(右チャンネル) から出力されます。 これは、「FM マイコン専用 Ethernet 拡張ボード」の信号 割り付けに合わせてあります。 サンプリング周波数にかかわらず、PWM の繰り返し周波数は 96 kHz に固定です。 オーディオ信号として、アンプ等に接続するためにはローパス・フィルタ (LPF) が必要です。 回路例は、前記 Web サイトを参照してください。 外付けのシリアル入力 16 ビット・ステレオ・ディジタル・オーディオ DAC とは、 次のように接続します。 P12/SOT1_1 (CN1-41) ---- SDAT (BU9480F 6 番ピン) P13/SCK1_1 (CN1-42) ---- BCLK (BU9480F 7 番ピン) P56/TIOA09_2 (CN2-42) ---- LRCK (BU9480F 5 番ピン) ディジタル・オーディオ DAC とのインターフェースに、MFS (Multi Function Serial) の SPI モードを利用しているので、シリアルクロックの出力開始 タイミングはソフトウェアの実行タイミングに左右され、ジッタが乗っています。 ROHM BU9480F では、シリアルクロックのジッタがオーディオ・アナログ出力に 影響しませんが、他の DAC の場合、アナログ出力にジッタとして現れる可能性が あります。 入力は通常の MIDI 入力 (31.25 kbps) と、シリアル MIDI (38.4 kbps) に対応して います。 具体的なインターフェース回路は、Web サイトを参照してください。 インターフェース回路のマイコン側「RxD」出力を コネクタ CN3 ピン 33 (CN3-33) P48/SIN3_2 「RxD」 につなぎます。 TxD 側は使用していないので、特に接続する必要はありません。 このピンは 5 V トレラント入力ではないので、インターフェース回路は 3.3 V 電源で動作させる必要があります。 これは、「FM マイコン専用 Ethernet 拡張ボード」の信号割り付けに合わせて ありますから、専用拡張ボードを使用する場合には、ボード上の USB-シリアル 変換チップを介して PC と USB 接続でき、シリアル MIDI 入力として利用できます。 サウンドボート用のいわゆる MIDI ケーブルは +5V 用ですが、GRAVIS ULTRASOUND の MIDI 接続ボックスで試したところ、+3.3V 電源でも動作しました。 回路図の コネクタ CN1 ピン 44 (CN1-44) PCA に接続する「SENS」信号は、MIDI / シリアル MIDI のボーレート切り替えのためで、 オープンまたは「H」レベルでシリアル MIDI (38.4 kbps)、「L」レベルで通常の (legacy) MIDI (31.25 kbps)を選択します。 シリアル MIDI だけを使う場合には、何も接続せず、オープンで構いません。 プログラムを実行するとCQ-FRK-FM3 基板上のオレンジ色の LED が薄暗く 点灯します。 CPU 負荷が小さい時は明るく、負荷が大きい時は暗くなります。 LED のカソード側を、デューティー測定可能なテスターでを測定すると、 CPU の負荷率が求められます。 これまでのプログラムでは、LCD 画面での CPU 負荷率表示のために、外部回路 および AD コンバータを使用していましたが、FM3 用プログラムでは、カウンタ を利用した方式に変更したので、外部回路は不要になりました。 プログラムを実行すると、デモ曲を自動演奏しますから、MIDI 入力はなくても 音は出ます。 基板上の JPP3 に NMI スイッチを実装している場合には、それを長押し (数秒) すると、デモ演奏を終了できます。 デモ演奏中に NMI スイッチをクリック (短く押す) すると、最初に戻って演奏を 再開します。 JPP3 の回路は、単に入力ポートとして利用しており、NMI (Non Maskable Interrupt) 機能は使用していません。 RX62N 版と同様に、8 ビット MCU を利用してキャラクタ LCD / キー・スイッチと のインターフェースを実現しています。 今回は、従来の PIC16F628 版 (18 ピン DIP) と、AVR ATtiny2313 版 (20 ピン DIP) に加え、14 ピン DIP パッケージの PIC16F1823 版も用意してあります。 HEX パッケージには PIC16F1823 版の回路図の pdfファイルと、プログラムの hex ファイルのみを同梱してあります。 この回路を実装しなくても、FM 音源プログラムの動作には全く影響はありません。 ボード上の NMI スイッチが「INC」キーと同等の機能を持っており、少々 操作が面倒になることを覚悟すれば、キースイッチは付けないで済ますことも できます。 同時発音数が 16 以上になるモードでは、LCD の「チャンネル・アサイン」画面は 表示されません。 ●パッケージ HEX パッケージと、ソース・パッケージを用意してあります。 zip 形式で圧縮されていますので、Windows 自体の機能で解凍できます。 オブジェクトの HEX ファイルは、 TGFM3.mhx です。 このファイルを書き込みます。 書き込みには、富士通製のアプリケーション「FLASH USB DIRECT Programmer」 を利用します。 「FLASH USB DIRECT Programmer」のダウンロード/インストール/使用方法に ついては、インターフェース本誌を参照してください。 JTAG/SWD 経由での書き込みについては確認してありません。 ●HEX パッケージの内容 licence.txt : ライセンス条件のファイル readme.txt : このファイル TGFM3.mhx : FM 音源プログラムの hex ファイル (モトローラ S フォーマット) TGFM3.pdf : 外部ハードウェアとの接続回路図の pdf ファイル LCD1823.hex : PIC16F1823 に書き込むプログラムの HEX ファイル ara_sp12.mid : デモ曲の smf ファイル (C.A.ドビュッシー: アラベスク第 1 番) (同時発音数 12) ●ソース・パッケージの内容 パッケージを解凍すると、「TGFM3」フォルダの下にファイルが展開されます。 以下では、TGFM3 フォルダを基準に話を進めます・ \TGFM3 | +-- readme.txt : このファイル | +-- licence.txt : ライセンス条件のファイル | +-- makefile : gcc ツールチェイン用のメイクファイル | +-- .project : PizzaFactory8 (CQ 版) 用のプロジェクトファイル | +-- .cproject : PizzaFactory8 (CQ 版) 用のプロジェクトファイル | +-- TGFM3.pnproj : Programmer's Notepad 2 用のプロジェクトファイル | +-- TGFM3.pnps : Programmer's Notepad 2 用のプロジェクトファイル | +-- \gen_tab : テーブル定義ファイル作成用ツール | | | +-- Makefile : テーブル一括生成のためのメイクファイル | | | +-- *.c : C ソースファイル | | | +-- *.awk : gawk ソースファイル | +-- \src : ソースファイルフォルダ | | | +-- \common : 各マイコン独立、あるいは依存性の少ないソースのフォルダ | | | | | +-- *.c : C ソースファイル | | | | | +-- *.h : ヘッダ・ファイル | | | +-- \FM3 : FM3 (MB9BF618T) 固有のソースファイルのフォルダ | | | +-- *.c : C ソースファイル | | | +-- *.h : ヘッダ・ファイル | +-- \Debug : オブジェクトファイルが格納されるフォルダ | +-- \Libraries : ライブラリ関係ファイルのフォルダ | | | +-- \CMSIS : CMSIS 関係のファイルのフォルダ | | | +-- \mb9bf61xt : 富士通/ねむいさん/iruka さん提供のファイルのフォルダ | | | +-- \newlib : string 関係のライブラリ関数のソース | +-- \sch : 回路図のフォルダ | | | +-- TGFM3.ce3 : bsch3v で書いた CQ-FRK-FM3 用の回路図 | | | +-- TGFM3.pdf : CQ-FRK-FM3 用回路図の pdf ファイル | | | +-- LCD628.ce3 : bsch3v で書いた PIC16F628 用の LCD インターフェース回路図 | | | +-- LCD628.pdf : PIC16F628 用の LCD インターフェース回路図の pdf ファイル | | | +-- LCD1823.ce3 : bsch3v で書いた PIC16F1823 用の LCD インターフェース回路図 | | | +-- LCD1823.pdf : PIC16F1823 用の LCD インターフェース回路図の pdf ファイル | | | +-- LCD2313.ce3 : bsch3v で書いた ATtiny2313 用の LCD インターフェース回路図 | | | +-- LCD2313.pdf : ATtiny2313 用の LCD インターフェース回路図の pdf ファイル | +-- \mcu_lcd : 8 ビット MCU (PIC/AVR) によるキャラクタ LCD インターフェースのファームのフォルダ | | | +-- \PIC : PIC 版のフォルダ | | | | | +-- \lcd4pic : MPLAB 用の ASM プロジェクトのフォルダ (PIC16F628) | | | | | | | +-- lcd4pic.asm : ASM ソースファイル | | | | | | | +-- lcd4pic.hex : オブジェクトの HEX ファイル | | | | | | | +-- lcd4pic.m* : MPLAB 用ワークスペース/プロジェクト・ファイル | | | | | +-- \lcd1823 : MPLAB 用の ASM プロジェクトのフォルダ (PIC16F1823) | | | | | +-- lcd1823.asm : ASM ソースファイル | | | | | +-- lcd1823.hex : オブジェクトの HEX ファイル | | | | | +-- lcd1823.m* : MPLAB 用ワークスペース/プロジェクト・ファイル | | | +-- \AVR : PIC 版のフォルダ | | | +-- \lcd4avr : AVR Studio 4 / WinAVR 用の C プロジェクトのフォルダ (ATtiny2313) | | | +-- lcd4avr.c : C ソースファイル | | | +-- lcd4pic.a* : AVR Studio 用ワークスペース/プロジェクト・ファイル | | | +-- \default : オブジェクトのフォルダ | | | +-- lcd4avr.hex : オブジェクトの HEX ファイル | +-- \smf : デモ曲の SMF | +-- arabe_f1.mid : C.A.Debussy: アラベスク第一番 (SMF フォーマット 1) | +-- arabe_sp.mid : arabe_f1.mid を MIDI チャンネル当たり 1 音の発音に | なるように振り分けたもの (同時発音数 15) | +-- ara_sp12.mid : arabe_f1.mid を MIDI チャンネル当たり 1 音の発音に | なるように振り分けたもの (V1.2 の内蔵デモ曲の元) | (同時発音数 12) | +-- arabesq1.mid : C.A.Debussy: アラベスク第一番 (部分) (V1.1 以前用) | +-- Chopin66.mid : F.F.Chopin: 幻想即興曲 (部分) (V1.1 以前用) | +-- invent13.mid : J.S.Bach: インベンション第 13 番 (V1.1 以前用) ●インターフェース誌 2012 年 7 月号付属 DVD-ROM 収録の PizzaFactory8 (CQ 版) によるコンパイル方法 まず、インターフェース本誌の記述にしたがい、PizzaFactory8 のインストール およびインストーラのパッチ当てを行い、アップデートを完了してください。 次に、PizzaFactory8 を起動し、新規のワークスペースを立ち上げ、そこに TGFM3 のプロジェクトを読み込みます。 その手順は、メニューバーから、「File」-->「Import...」 とクリックして、 「Import/Select」ダイアログを開きます。 ツリービューの先頭にある「General」フォルダをダブル・クリックして開き、 「Existing Projects into Workspace」 をダブル・クリックします。 そうすると、「Import/Import Projects」ダイアログが開きますから、 「Select root directory」の欄の右端にある「Browse...」ボタンをクリックして開く ダイアログで、ソースパッケージを展開してできた TGFM3 フォルダを指定します。 「Import Projects」ダイアログに戻ると、「Projects」のペインにチェック・マーク 付きで「TGFM3」が表示されているはずです。 それを確認したら、ダイアログの「Finish」ボタンをクリックすればプロジェクトが 読み込まれます。 あとは、F5 キーを押す、あるいはメニューバーから、「File」-->「Refresh」と クリックして、PizzaFactory8 がコンパイルのために使用する makefile を再構築します。 そして、メニューバーから、「Project」-->「Build All」でビルドできます。 PizzaFactory8 (CQ 版) 付属のツールチェインでは、Cortex-M プロセッサ用に コンパイルすると libc や libm のリンク時にエラーとなり、そのままでは オブジェクトが生成されません。 これは、単に ELF ヘッダのフラグの不一致を検出しているだけで、実際のライブラリ のコードには問題はありません。 「バッド・ノウハウ」としては、リンカ・オプションとして --no-warn-mismatch を指定して不一致を検出しない方法もありますが、FM 音源プログラムでは、 string 関係のライブラリ関数を 4 つ使用しているだけなので、newlib から 持ってきたソース・ファイルを一緒にコンパイルするような設定にしています。 ●gcc ツールチェインと Programmer's Notepad 2 によるコンパイル方法 まず、以下のリンクを参照して、gcc ツールチェインと Programmer's Notepad 2 (以下 PN2 と 略記) のセットアップを行って下さい。 「ねむいさんのぶろぐ」--「ARM マイコンを GCC でビルドする環境を整える (2012 年版)」 http://nemuisan.blog.bai.ne.jp/?eid=188089 ただし、コンパイル自体は必ずしも PN2 を使う必要はなく、直接に make することもできます。 PN2 を使う場合には、.pnproj との関連付けが出来ていれば、 TGFM3/TGFM3.pnproj をダブルクリックすれば PN2 が立ち上がり、プロジェクトの画面になります。 関連付けされていない場合には、まず PN2 を立ち上げ、メニュー・バーから 「File」 --> 「Open Project(s)...」とクリックして開くダイアログで上記のプロジェクト・ ファイルを指定します。 左上の「Projects」ペインの「makefile」をダブルクリックしてエディタを開き、使用する ツールチェインのパスを設定します。 具体的には「makefile」の 32 行目の TOOLDIR = D:/app/cs/2012.03-56 を実際に使用するパスに書き換えます。 もとのねむいさんの makefile では、「echo.exe」を使ってメッセージを出していましたが、 echo を使っている部分は全てコメントアウトしてあります。 その他、OpenOCD ツールなど、今回の件に関係ない部分は大幅に削ってあります。 したがって、ツールチェインの gcc, ar, objcopy, objdump, size などと、make, rm だけ あればコンパイルできます。 PN2 の「Tool」の設定が済んでいれば、メニューから「Tool」 --> 「MAKE ALL」でコンパイルでき ます。 オブジェクトは TGFM3/Debug の下に作成されます。 PN2 を使わず、直接 make する場合には、GNU make が使える環境で $ cd TGFM3 $ make のようにします。 その場合でも、あらかじめ makefile 中でツールチェインへのパスを正しく設定しておく必要 があります。 コンパイル時に、定義されているが使用されていない変数があるという意味のウォーニング・ メッセージがいくつか出ますが、プログラムの動作には問題ありません。 この方法によるコンパイルでは、下記のバージョンのツールチェインで正常にコンパイル でき、実機で動作することを確かめてあります。 Cortex-M3 コアなので、Cortex-M4 コアに対応していない古いバージョンでも コンパイルできます。 バージョンの違いにより、使えるコンパイラ・オプションや動作に差があるので、 オプションの指定は控えめにしてあります。 たとえば、-flto (Link Time Optimization) や -fdata-sections は指定していません。 gcc ツールチェインの バージョン  バージョン等 ---------- ---------------------- (1) gcc-4.3.2 Sourcery G++ Lite for ARM EABI 2008q3-66 "arm-2008q3-66-arm-none-eabi.exe" (2) gcc-4.4.1 Sourcery G++ Lite for ARM EABI 2010q1-188 "arm-2010q1-188-arm-none-eabi.exe" (3) gcc-4.5.2 Sourcery G++ Lite for ARM EABI 2011.03-42 "arm-2011.03-42-arm-none-eabi.exe" (4) gcc-4.6.0 interface 誌 2012 年 7 月号付属 DVD-ROM 収録 PizzaFactory8 (CQ 版) 付属のツールチェイン (5) gcc-4.6.2 GNU Tools for ARM Embedded Processors GCC ARM Embedded 2011-q4-major (6) gcc-4.6.3 Sourcery CodeBench Lite for ARM EABI 2012.03-56 "arm-2012.03-56-arm-none-eabi.exe" (7) gcc-4.7.0 interface 誌 2012 年 7 月号記事 (App.5) アップウインドテクノロジー製 GNUWing-20120402 ツールチェイン (cygwin 用) このうち、(1) でコンパイルしたオブジェクトはスピードが十分ではなく、出力に ノイズが乗ります。 また、(6) の PizzaFactory8 (CQ 版) 付属のツールチェインでは、ライブラリの リンク時にエラーになるので、リンカに --no-warn-mismatch オプションを渡して エラーを無視させる必要があります。 makefile の 240 行目にコメント・アウトした形で記述してありますから、LDFLAGS の設定が 有効になるようにしてください。 (7) のツールチェインは cygwin 用なので、cygwin 環境から実行する必要があります。 Windows のコマンド・プロンプトからでは実行できません。 ●コンパイル時のオプション 「TGFM3/src/FM3/TGFM3.h」ファイル中の #define で設定する値によってプログラムの構成を 変更することができます。 定数名 意味 設定可能値 デフォルト STEREO_MODE ステレオ/モノラル切り替え 1 = ステレオ 1 0 = モノラル USE_SMF SMF シーケンサ使用フラグ 定義: SMF     定義 未定義:SMAF