2015年1月5日月曜日
C言語で記述されたマイコンでも使えるMMLパーサー 'A tiny MML parser'
MML (Music Macro Language)
MMLは、音楽記法をテキストで簡易的に扱うための記述言語です。例えば、「ド・レ・ミ」と四分音符で歌う場合には「C4 D4 E4」と書く事で表現できます。
経緯
先日、大晦日ハッカソン2014なるものを見つけ、mrubyをBlackfinボード(UCB-BF512-B)で動かすおひとりハッカソンを企画し実行したわけですが、実は色々な小道具を整備しないとmrubyに辿りつけないとわかり何故か寄り道。Windows、Mac OS、Linuxで動作可能なChaNさんのFM音源モジュールの簡易シミュレーターの流れもあって、MMLパーサーがあれば自由に自動演奏させられるなぁという考えから実装したい衝動に負けてしまいました。'A tiny MML parser'
'A tiny MML parser'は、Cで記述されたMMLパーサーです。特徴をざっと挙げると
- シンプルなAPI
- 可搬性に優れたソースコード (C89準拠)
- 外部ライブラリに非依存 (libcも不要)
- 小さなフットプリント
- シャープ、フラット、ダブル・シャープ、ダブル・フラットなどにも正しく対応可能
- 複数の符点音符にも正しく対応可能
- 三連符に対応
など、マイコンで使う事も考慮した設計と実装になっています。
特に、シャープやフラットが複数付く場合、符点が複数付く場合、三連符に対応可能な点は、実際の曲を簡易的に表現可能という意味で重宝する仕様になっています。三連符を疑似的に入力するのとか辛いじゃないですか・・・。
どういう風に使えるの?
'A tiny MML parser'を使うには、要求されている唯一のコールバック関数を実装するだけです。このコールバック関数は、「typedef void (*MML_CALLBACK)(MML_INFO *p, void *extobj);」と宣言されており、mml_fetch関数を呼ぶ度に一つのMMLコマンドが解釈されてコールバックが呼ばれる仕組みです。
ライブラリのインターフェースは以下に示すようにたったの三つです。
まず、初期化関数mml_initでコールバック関数を渡して初期化します。
この時、extobjに外部オブジェクトへのポインタを渡してやると、コールバック関数で受け取れます。
次に設定関数mml_setupで演奏時に必要となるオプションとMMLを渡します。
「オプションなんてわけわからん!」という人は「(MML_OPTION *)0」を渡して下さい。
最後に呼び出し関数mml_fetchでMMLのパースを実行します。
このmml_fetchを呼び出す度に、一つのMMLコマンドが解釈されます。
ちなみに、このライブラリは「何が書いてあるのか?」について解釈する機能を提供します。
「それをどうするのか?」については一切関知しません。
実際のシステムに導入する場合、これを意識して使う事が結構ポイントになってきます。
デモ
Blackfin上でFM音源を構成し、そのFM音源をMMLで操作している様子をデモ映像にしました。
[フレーム]
このデモでは、ChaNさんのFM音源のコードを若干改造したものをミドルウェアとして使用しています。MMLパーサーも軽量ミドルウェアとして導入できたので、上位の実装は非常にシンプルな形で済ます事ができました。
ライセンス
ライセンスはMITです。
趣味でも業務でも、ライセンスの範囲で自由にお使い頂けます。
ダウンロード
'A tiny MML parser'のダウンロードは以下のページからどうぞ。
2014年8月31日日曜日
Blackfin BlueBoot Version 0.5.0のリリース (地味に改良しました)
■概要
今年に入って地味にアップデートを続けているBlackfin BlueBootですが、前回のVersion 0.4.0に引き続き、これまた地味にVersion 0.5.0へアップデートしました。きっかけとなったのは「KOZOS for Blackfin "BlacKOZOS"の設計方針」で始めたBlacKOZOSの作業です。この中で、コールドスタート時の動作確認用にターゲットにイメージを書き込むためにBlackfin BlueBootを使っていたのですが、稀に書き込みに失敗する事がわかりました。
■どんな失敗?
Blackfin BlueBootの場合、書き込み後に読み込みを実施して比較検証まで実施しているのですが、比較検証段階でターゲットから応答が無い(ような)状態に陥るというのが発生現象でした。現象発生時、表出現象には幾つか種類があるものの、書き込み直後の操作である事は共通した表出現象・・・。「なんだろうな?」と思って設計を見返したところ、手を抜いて気にしていた部分を見つけました。
というのも、Blackfin BlueBoot Version 0.4.0までは、ターゲット上でフラッシュロムへの書き込みがまさに終わったかどうかの確認は行なわず、ターゲット上に搭載されているフラッシュロムのデータシートに規定された書き込みにかかる最大時間をホスト側で待ってから、その次の動作に移行するという設計になっていました。
イメージ図にすること以下のようになります。
ホスト側の処理を台詞にすると、以下のように随分と乱暴な感じ。
これはいけません。
ざっくり言うと「データシートに書かれた最大時間は待ったんだから終わってんだろ?」という話ですが、これには幾つか問題があります。
- 常に最大時間待つので、必然的に書き込みが遅くなる。
- ソフトウェア上で待つという事は、必然的にバラツキを生む事になる。
- 待つ処理に対するバラツキは、実行環境によっても異なる上、それは予想し難い。
- その他。
一番目に挙げた「最大時間待つ」問題は、実はセクタ消去にも適用していたので、のっけから劇遅な状態を生んでいました。これは本来、フラッシュロムのステータスレジスタを参照して、次の処理に移行可能か確認するようにすれば高速ですし、そもそも次の処理が失敗する可能性もなくなります。
二番目に挙げた「待つ処理のバラツキ」問題は、根拠としているデータシート上の最大時間を保証できない可能性もあるという意味で大問題です。これも、先のフラッシュロムのステータスレジスタを参照してから次の処理に移行する事で解決できます。
問題の類としては、H8/3069F writer for KOZOS - kz_h8write 「h8writeリベンジ解決編」と同じとも言えなくないような・・・。
問題の類としては、H8/3069F writer for KOZOS - kz_h8write 「h8writeリベンジ解決編」と同じとも言えなくないような・・・。
■改良版
Blackfin BlueBoot Version 0.5.0では、プロトコルバージョンを2に変更した上で、フラッシュロムのステータス取得コマンドを追加しました。これにより、ターゲット側のブートローダも更新が必要になりましたが、これによって安定動作が得られるならば何の問題もありません。新しくflash_busyというインターフェースがflash.hに追加され、各ターゲットはこの定義に対する実装を要求されるようになります。
さて、改良版のホスト側の動作をイメージ図にするとこんな感じでしょうか?
ホスト側のコントローラは、ターゲットからフラッシュロムのお仕事が完了したのか、逐次必要に応じて問い合わせるようにしました。
これにより、
- 余計な待ち時間が不要となり、従来よりも動作が高速になりました。
- 書き込み処理の安定性が向上しました。
- より環境に依存せずに書き込みができるようになりました。
- その他。
という結果を得ました。
昔のどこかのバージョンで、フラッシュロムのライトサイクルとかその類の情報をターゲットから貰うようにしたのですが、これも次のバージョンでは整理したいと考えています。
■ダウンロード
Blackfin BlueBootは以下のサイトからダウンロードできます。
趣味でもお仕事でも御自由にお使い下さい。
完全無保証です。
動作させた結果、起きた如何なる問題も当方は責任を持ちません。
2014年7月27日日曜日
KOZOS for Blackfin "BlacKOZOS"の設計方針
UOS-LPC800
UOS-LPC800を公開してから早くも一年が経ちました。
思いっきり遊びでしか使えない感じのOSが一部の方に好評で、ここでも述べたようにadafruitでも紹介されたりもしています。
本当は公開後に色々機能追加する事を考えていましたが、LPC-810と組み合わせて紹介されているので、彼に入りきらなくなるのは可哀想です。どうしようかな?と考えていたら1年が経過していました。あらら。
KOZOS
UOS-LPC800は、坂井さんがお作りになったKOZOSが制作のきっかけになっています。
KOZOSは、完全ホビー向けOSでありながらソフトウェア割り込みを使ったシステムコールによる操作を実現するなど、とても興味深い作り込みになっています。坂井さんによるユニークなキャラクタであるニジマス君も見逃せません。
坂井さんの書籍が販売されてから私も早速購入して色々な活動に取り組みました。
あと、もっと楽しみたい人のためのハードウェアとか。
"BlacKOZOS" - KOZOS for Blackfin
あれから二年ほど経ち、現在は主にBlackfinを使って色々遊んでいます。
私の場合、新しいプロセッサをいじる場合には、クラスの中で小さいものを選んで使う事にしています。現在はBF592というプロセッサで離散的に遊んでいるのですが、この小さなプロセッサでキビキビ動作するOSを書いてみたくなりました。
名前も決めてあって、BlackfinとKOZOSをかけて、BlacKOZOSです。
とてもブラックな感じ。「ブラッコゾス」です。「ブッコロス」ではありません。
本体OSは何もないのに、キャラクタはもうあります。
完全に順番を間違っています。
"BlacKOZOS"の設計方針
設計は以下のように進める事にしました。
①普通に動作するだけのプログラム
普通に動作するだけのプログラムが、どうしてOSに発展するのか理解できないかもしれませんが、最初のタスクしか実行できないところから"BlacKOZOS"の開発をスタートさせる事にしました。これは、まさにOSを使うことで解決したい問題を提示した形です。ざっくり言うと、複数の仕事を並行し、かつ効率的に処理させたい、複数の仕事を協調動作させたい、という課題。
②割り込み関数でレジスタの退避と復旧
次に、①で動作している仕事を一切阻害する事なく、割り込み処理の中で①で使っているレジスタを退避、復旧させます。ここでは、コンテキストスイッチ、つまりタスクの切り替えは行わず、退避したレジスタをそのまま復旧させます。レジスタ周辺の操作は少しでも間違えると動作しません。このコンテキストスイッチなしのレジスタ退避復旧処理は、正しく実装できた時点で、みかけ上①と同じ処理を提供する事になります。つまり、レジスタの退避と復旧を正しく行いながら、依然としてかなり単純な実行モデルを維持できます。③コンテキストスイッチを追加する
レジスタの退避復旧が実現できたら、コンテキストスイッチを追加します。②を先行させる事にはもうひとつ別の理由があり、②が実現できた時点でコンテキストスイッチは基本的にC言語で記述できるようになっています。どういうことかと言うと、レジスタ退避作業によって実行中のコンテキストを復旧するためのレジスタは保存されているので、それらをかなり自由に使うC言語を使ってレジスタを汚しても、レジスタ復旧で必要な値へ復旧できるわけです。リンクリストを辿ったりする作業をアセンブラで書くのも面倒なのでうってつけというわけです。まとめ
今回は大雑把な設計方針について明らかにし、作業の道筋を立てました。
Blackfinの場合、割り込みマスクの取り扱いが1つのポイントかもしれません。
その辺りも後々触れていければと思います。
2014年3月29日土曜日
Blackfin BlueBoot Version 0.4.0
Blackfin BlueBootのVersion 0.4.0をリリースしました。
全然地味すぎです。
- ホスト/ターゲット間プロトコルを一部変更し、アクセス情報、ボード情報、CPU情報をそれぞれターゲットから取得して処理するように変更しました。
- 新しいターゲットとして、金子システム社製のUCB-BF512とTUNA-CANを追加しました。
全然地味すぎです。
ラベル:
Blackfin BlueBoot
2013年2月17日日曜日
簡単便利なBlackfin用フラッシュ書き込みツール「Blackfin BlueBoot」のVersion 0.3.0をリリースしました。
Blackfin BlueBootってなぁに?
Blackfin BlueBootってなぁに?という方は、「Blackfin BlueBoot - Blackfinに接続されたブート用外付けフラッシュ・ロムを書き換える事ができるソフトウェアのデビューです!」を御覧下さい。Blackfin BlueBootの開発プラットフォーム
2012年の12月に最初のリリースBlackfin BlueBoot Version 0.2.0をリリースしました。
このBlackfin BlueBootは、「DSPに興味はあるけど環境整備の敷居が高くて手を出せない!」という人のために設計実装した開発ツールです。メーカー純正ツールなら外付けフラッシュに書き込めるけど、それはまぁだいたい10万円です・・・なんて簡単に手を出せる物ではありません。
Blackfin BlueBootによって、無償の外付けフラッシュ書き込み環境を実現しています。
Blackfin BlueBootの開発には、市販されているDSPボードとオーディオコーデックボード用を搭載できるベース基板BlueTankを開発して使用していました。これ一台さえあればオーディオ入出力プラットフォームになるという算段です。これはなかなか便利なものでした。例えば、以下のようにオーディオアプリケーションを簡単に楽しめるようになっています。
[フレーム]
「これ一台で」というのがポイント。
ベース基板BlueTankは自分で設計しているのでI/Oの取捨選択は自分でできます。
自分が欲しくないI/Oがてんこ盛りになった評価基板なんていらないのです。
便利なオーディオプラットフォームが登場
さて、前述の市販されているDSPボードとオーディオコーデックボードは、金子システム社製のものでした。これ一台(一枚?)でDSPが楽しめますなシンプルなボード構成がとても気に入っていました。
前述のBlueTankには同社製「DSP基板」と「オーディオコーデック基板」が搭載される形式でした。
そんな折、新しく仕入れたのがTUNA-CANと呼ばれる新しいオーディオプラットフォームです。
なんと、このTUNA-CAN基板は「DSP」と「オーディオコーデック」の2つが1枚の基板にコンパクトにまとめられています。
以下がその写真です。
これにLCDとロータリースイッチを付ければもう「BlueTankいらず」です。
この新しいプラットフォームに触発され、新しいバージョンをリリースする事にしました。
この新しいプラットフォームに触発され、新しいバージョンをリリースする事にしました。
Blackfin BlueBoot Version 0.3.0
新しいBlackfin BlueBoot Version 0.3.0では、主に以下の変更を行ないました。- 書き込みセクタ数の算出バグを修正。
- LDRファイル選択時にLDR情報が更新されないバグを修正。
- TUNA-CAN用ブートローダをリリースに同梱。
- ホスト側I/Oライブラリのソースコードを同梱。
- 日本語ローカライズに対応。
ダウンロードはこちらからどうぞ。
まだまだ修正したい事は沢山あるのですが、それを待っていたらリリースができません。
今回はタイミング重視で、小さく更新してリリースする事にしました。
その他
実はBlackfin BlueBootの初版をリリースした後、別の類似ツールを作っていました。
その話と関連したあれこれは、別途機会を見てご紹介する予定です。
酔漢さんが運営されているDSP空挺団では、「ブレッドボードで作るオーディオ信号処理」が公開されています。
こちらの投稿もお勧めです。
こちらの投稿もお勧めです。
2012年12月28日金曜日
ACB-BF592とUMB-SGTL5000を使ったTalk ThroughをTOPPERS/JSP上で実現する
オーディオ・プラットフォーム・プロジェクトであるBlueTankも、ベース基板が上がってきて半年が経とうとしています。その間にベア・メタルなアプリケーションは幾つか実装したのですが、そろそろ色々な不満が出てきました。
BlueTankプロジェクトにおけるRTOS環境の出発点として、この酔漢さんの成果物をふんだんに活用させて頂く事にしました。これは本当に有難い話です。
Blackfin BF592は、ARM Cortex-Mシリーズ等と比較しても有り余るプロセッサ能力を持っています。簡単なサンプル・プログラムならともかく、システムとして様々なサービスを提供するのにRTOSを使って楽をしたくなってきました。RTOSを使えばNatural Tiny Shell (NT-Shell)もシステム・シェルとして提供できます。「ビデオやオーディオのDMAバッファの管理手法 (動かして遊べるソースコード付き!)」をRTOS上で試してみたいというのもあります。
プロジェクトを始めた当初はフラッシュ・ロムへの書き込みも出来なかったため独立した組み込みシステムとして動作しませんでした。Blackfin BlueBootを実現した事で独立した組み込みシステムとしての道筋が見え、だんだんと欲も出てきました。
幸いにも、DSP空挺団の酔漢さんが「ACB-BF592とTLV320AICを使ったTalkthroughサンプル。TOPPERS/JSPベース。 (bf592_tlv320aic23b_talkthrough) 」というものを公開して下さっています。このプロジェクトは、TOPPERS/JSP for Blackfin上に、使いやすいI2C制御層が組み込まれた上、オーディオ・フレームワークUZUMEが実装されています。
BlueTankプロジェクトにおけるRTOS環境の出発点として、この酔漢さんの成果物をふんだんに活用させて頂く事にしました。これは本当に有難い話です。
TLV320AIC23BもI2Cインターフェースを持つデバイスですから、UMB-SGTL5000に搭載されているオーディオ・コーデックに対する処理も、少しの改造で可能だろうという算段。実際に酔漢さんの丁寧な設計実装のおかげで、ものの3分でBlueTankでもTalk Throughが動作するようになりました。ちなみに、オリジナルのコードは、レジスタ互換のSSM2603が搭載されたUMB-SSM2603でも動作します。
唯一変更したソースコード : uzume.c
対応は至って簡単で、init_codec関数の中身を少し変更しただけです。
今回のTalk Throughは、氏の進めているUZUMEフレームワーク上に構成された物です。
BlueTankプロジェクトも、UZUMEフレームワークを使って色々と実験を進めようと考えています。
素晴らしいプロジェクトを公開して頂いているDSP空挺団の酔漢さんには感謝感謝です。
2012年12月7日金曜日
Blackfin BlueBoot - Blackfinに接続されたブート用外付けフラッシュ・ロムを書き換える事ができるソフトウェアのデビューです!
このプロジェクトって何なの?
Blackfin BlueBootとは、Blackfinに接続されたブート用フラッシュ・ロムを書き換える事のできるソフトウェアです。ターゲット用の専用ブート・ローダとホスト用の専用アプリケーションから構成され、両者が協調動作する事でBlackfinに接続されたブート用フラッシュ・ロムの書き換えを実行します。
Blackfinは、SPIに接続された外部フラッシュ・ロムからブートさせる事ができます。
しかし、Blackfinは予めどんな外付けフラッシュ・ロムが接続されるのか知るよしもありません。
当然のようにBlackfinが外付けフラッシュ・ロムの書き換え機能を持つわけもなく、「一体どうやったら書き換えができるの?」というわけです。
Analog Devices社は、同社純正ソフトウェアであるVisualDSP++でこの問題を解決しており、Blackfinに接続されたフラッシュ・ロムの型式を選択する事で、GUIから書き換えができるようなサービスを提供しています。
うーん、さすが有償ツール!なんて感動している場合ではありません。
VisualDSP++はとても高価なツールです。
業務で使うならまだしも、趣味のDSP開発で手の出せる金額ではない事がわかりました。
Blackfin BlueBootは、このような背景から高価なツールを購入せずともBlackfinに接続されたフラッシュ・ロムを書き換えられるようにしようというプロジェクトです。
プロジェクトのゴール
このプロジェクトは、以下のゴールを設定しました。
- Blackfin搭載のターゲットに対応可能な事。
- 幅広いフラッシュ・ロムに対応可能な事。
- とにかく簡単に使える事。
- ユーザが自由にターゲットを追加できる事。
- 業務でも趣味でも少ない制約で利用できる事。
- 入手性の良いDSPボードを使って実例を示す事。
- CUIとGUIでホスト側ツールを用意する事。
- 将来的にWindows、Linux、Mac OSのプラットフォームをサポートする事。
- ターゲット側のコードは公開し、幅広く利用してもらえるようにする事。
- その他。
上記のゴールを基に設計したのが、今回公開するBlackfin BlueBootです。
簡単に使える
Blackfin BlueBootが標準でサポートするBlackfin基板を使う場合、特に簡単に使う事ができます。
最初にリリースされるWindows版における動作を見てみましょう。
インストーラでソフトウェアをインストールすると、デスクトップにアイコンが作られます。
ダブルクリックしてソフトウェアを起動します。
ソフトウェアを起動すると、以下のような画面が出現します。
初めに行なうのは、ターゲットとホストを接続するシリアル・ポートの設定です。
次に標準的にサポートされているターゲット・ボードの選択を行ないます。
このリストにないターゲット・ボードの場合、インストール先ディレクトリに公開されているターゲット用ソース・コードと設定ファイルの更新により、独自にブート・ローダを記述する事で対応させる事ができます。(これは後日、別途記事を書きたいなぁ。)
最後に、使用するブートローダとアプリケーションを指定して選択は完了です。
Boot Loaderとは、初段でターゲットに流し込むフラッシュ・ロム書き換え用プログラムです。
Boot Loaderを流し込んで書き込みを行なう場合、ターゲットをUARTブート・モードにしておく必要があります。
Applicationとは、ターゲット上のフラッシュ・ロムに書き込むバイナリを指します。
Applicationは、初段で流し込んだブート・ローダを経由してフラッシュ・ロムに書き込まれます。
ちょっと便利なLDR表示機能
単に書き込めるだけでは面白くないのでBlackfinで使用しているLDRファイルの属性も表示できるようにしました。
Version 0.2.0ではBF592形式しか対応していませんが、順次対応を拡大しようと考えています。
あ、DEADBEEFなんて洒落ていますね。
ダウンロード
- こちらからダウンロードできます。
- 2016年2月27日現在:ウェブサーバーを変更し http://cubeatsystems.com/software/bfin-blueboot/bfin-blueboot_ja.html で公開しています。 @GarageStyleMscさんにお問い合わせ頂きました。ありがとうございます。
- ライセンスはMITです。
- 業務の開発に、趣味の開発に存分に御活用下さい。
- 無保証です。使用した結果起きる如何なる損害も当方は責任を負いません。
関連文書
- 先日の記事でM25P16の書き換えコードを公開しました。
- DSPいじりを楽しみたい方には、金子システム株式会社さんが販売されているACB-BF592をお勧めします。
- DSPなどの話題が盛りだくさんの酔漢さんのページ、DSP空挺団もお勧めです。
まとめ
今回のBlackfin BlueBootツールは、これからBlackfinを使ってみたいけどツールは高価で手が届かないという人にも、手軽にDSPを体験して頂く事のできるツールとして設計しました。Blackfin BlueBootで用いた、「第1段階に書き換え機能を持ったプログラムを流し込み」、「本当にやりたい事を第2段階でやる」という手法は、一般的に用いられる手法の一つです。
実はXilinx社のFPGAツールでもプラットフォーム・フラッシュの書き換えで同様の手法が用いられていたりします。
世の中の色々なツールの動作を観察してみるのも意外に面白いかもしれませんね。
登録:
コメント (Atom)