マイコンとか自作 MIDI 音源とか (旧 segtter's core dump) http://segtter.iza-yoi.net/
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
半年以上前に購入して以来放置していた 8pin ARM マイコン,LPC810 をとりあえず試食してみた.しばらくの間 mbed などの手軽な開発手法ばかり触ってきたので,良いリハビリになるかもしれない.
開発環境の準備
開発環境は LPCXpresso IDE を使用.動作はそれなりに重いけど,ビルドコンフィグ周りの面倒を見てくれるので,gcc + コマンドライン・ツールよりはある程度スタートは早いかも.開発元の作成した CMSIS コア・ライブラリ一式も一緒にインストールされる (インポートは手動).
ハードウェアの準備
LPC-Link 等のデバッガ基板,もしくは ISP 書き込み用のシリアル・インターフェースを用意.今回は,秋月電子の USB-UART モジュールと ZIF ソケットを組み合わせた基板を新しく作成.
LPC1114 と LPC810 両方に対応するため,28pin DIP.この 2 種類の IC は,1pin 位置を合わせたときに ISP 関連の端子が競合しないので,単純にソケット側で分岐するだけでも一応動く.
Intel HEX ファイル出力設定
LPCXpresso で自動的に作られたプロジェクトは,.axf および .bin ファイルのみを生成し,Intel HEX 形式ファイル (.hex) は生成しない.以下の情報を参考に,objcopy.exe をビルド時に呼び出すよう変更すると,Intel HEX ファイルが Debug/Release 各ビルドディレクトリに生成されるようになる.FlashMagic や lpcsp 等のツール経由で書き込む場合に有用.
Iketronix: How to generate .hex files from Code Red's LPCXpresso to use with FlashMagic
早速 L チカ
最初にメモリ空間を直接叩いてペリフェラルを動かす方法で GPIO を触るコードを書いて,L チカしてみた.
プロジェクト作成時にソースの雛形が用意されるので,main 関数のみ次のように変更.
int main() {
// クロック設定を確認し,SystemCoreClock を再計算
SystemCoreClockUpdate();
// IOCON, SWM, GPIO ブロックにクロックを供給
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<18) | (1<<8) | (1<<6);
// PIO0_2, 3 に割り当てられた SWD 機能を無効化
LPC_SWM->PINENABLE0 |= (1<<3) | (1<<2);
// PIO0_2, 3 を出力に設定
LPC_GPIO_PORT->DIR0 = 0b001100;
// PIO0_2, 3 を high, low に設定し,一定時間ごとに交互に入れ替える
LPC_GPIO_PORT->SET0 = 0b000100;
while (1) {
LPC_GPIO_PORT->NOT0 = 0b001100;
for (i = 0; i < 500000; i++); // 時間稼ぎ暫定実装
}
return 0;
}
ユーザーマニュアル首っ引きで行う開発も悪くないけど,AVR マイコンで遊んでいた時と同じような感覚でやるには少々分量が多い.この時点で I2C マスター・デバイスとしてキャラクタ LCD と通信するプログラムまで既に書いてみたが,今後は開発環境同梱のドライバ・ライブラリや LPCOpen などのライブラリを積極的に利用したほうが良さそうだ.
つづく
開発環境の準備
開発環境は LPCXpresso IDE を使用.動作はそれなりに重いけど,ビルドコンフィグ周りの面倒を見てくれるので,gcc + コマンドライン・ツールよりはある程度スタートは早いかも.開発元の作成した CMSIS コア・ライブラリ一式も一緒にインストールされる (インポートは手動).
ハードウェアの準備
LPC-Link 等のデバッガ基板,もしくは ISP 書き込み用のシリアル・インターフェースを用意.今回は,秋月電子の USB-UART モジュールと ZIF ソケットを組み合わせた基板を新しく作成.
LPC1114 と LPC810 両方に対応するため,28pin DIP.この 2 種類の IC は,1pin 位置を合わせたときに ISP 関連の端子が競合しないので,単純にソケット側で分岐するだけでも一応動く.
Intel HEX ファイル出力設定
LPCXpresso で自動的に作られたプロジェクトは,.axf および .bin ファイルのみを生成し,Intel HEX 形式ファイル (.hex) は生成しない.以下の情報を参考に,objcopy.exe をビルド時に呼び出すよう変更すると,Intel HEX ファイルが Debug/Release 各ビルドディレクトリに生成されるようになる.FlashMagic や lpcsp 等のツール経由で書き込む場合に有用.
Iketronix: How to generate .hex files from Code Red's LPCXpresso to use with FlashMagic
早速 L チカ
最初にメモリ空間を直接叩いてペリフェラルを動かす方法で GPIO を触るコードを書いて,L チカしてみた.
プロジェクト作成時にソースの雛形が用意されるので,main 関数のみ次のように変更.
int main() {
// クロック設定を確認し,SystemCoreClock を再計算
SystemCoreClockUpdate();
// IOCON, SWM, GPIO ブロックにクロックを供給
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<18) | (1<<8) | (1<<6);
// PIO0_2, 3 に割り当てられた SWD 機能を無効化
LPC_SWM->PINENABLE0 |= (1<<3) | (1<<2);
// PIO0_2, 3 を出力に設定
LPC_GPIO_PORT->DIR0 = 0b001100;
// PIO0_2, 3 を high, low に設定し,一定時間ごとに交互に入れ替える
LPC_GPIO_PORT->SET0 = 0b000100;
while (1) {
LPC_GPIO_PORT->NOT0 = 0b001100;
for (i = 0; i < 500000; i++); // 時間稼ぎ暫定実装
}
return 0;
}
ユーザーマニュアル首っ引きで行う開発も悪くないけど,AVR マイコンで遊んでいた時と同じような感覚でやるには少々分量が多い.この時点で I2C マスター・デバイスとしてキャラクタ LCD と通信するプログラムまで既に書いてみたが,今後は開発環境同梱のドライバ・ライブラリや LPCOpen などのライブラリを積極的に利用したほうが良さそうだ.
つづく
PR
DIN5 コネクタを装備し,MIDI ケーブル経由でメッセージを受信して何かする装置を電子工作するとき,テスト目的で演奏情報を送るのはたいてい PC (上で起動したシーケンサや MIDI プレーヤーなど) からになると思う.
そういう PC にはサウンドカードなり USB-MIDI インターフェースなり,この厄介な形状のケーブルを挿すところを用意しなければならない.外に持って行ってデモや開発をするときには,ノート PC と制作物の他に MIDI ケーブルと USB-MIDI を一緒に持ち歩かないといけない,というのはあまりにも面倒…
MIDI ケーブルの代わりにシリアル通信を使って演奏情報をマイコンに送る方法ならば,必要となるハードウェアは制作物の基板と USB ケーブルのみで済む.これを実現するためには,PC 上で動く MIDI イベントを発生するソフトウェアと (仮想) シリアルポートを接続するソフトウェア・ブリッジを使えばよい.必要となるソフトウェアは二つ.
まずは,仮想 MIDI ドライバの LoopBe.非商用に限り無償で使用出来る LoopBe1 は仮想 MIDI ポートの個数が 1 個のみに限定されている.LoopBe1 をインストールし,MIDI 送信プログラムの MIDI 出力ポートを「LoopBe Internal MIDI」に設定する.
(OS X は標準でこれに相当する機能を搭載しているため,仮想 MIDI ドライバを別に用意する必要はない.「Audio MIDI 設定」より,IAC ドライバを有効にすれば,シーケンサ等の MIDI 出力ポートとして利用できるようになる)
次に,MIDI ポート ⇔ シリアルブリッジ.何種類か公開されているが,使い方が簡単でマルチプラットフォーム対応の Hairless MIDI to Serial Bridge がおすすめ.使い方は簡単で,左側の「Serial port」にマイコンの COM ポートを,「MIDI In」に「LoopBe Internal MIDI」を選択.ボー・レートは Preferences より設定する.以上の設定が終了したら,左上の「Serial<->MIDI Bridge On」チェックボックスをオンにするだけ.
音源プロジェクト進捗.
過去に mbed 用に書いていた音源クラスを,固定シーケンスからリアルタイム制御対応へ書き直す作業が完了した.
計画当初から,この音源ハードウェアでは,機能を
しかし現在は当初の計画と異なり,プロトタイピングを理由に mbed を利用している.御存知の通り,96 MHz で動作する Cortex-M3 コアを搭載しているマイコンボードだ.Arduino からマイコンや電子工作を始めた身としては,32 ビットプロセッサの性能を「正直甘く見ていた」かもしれない.コードレベルで最適化をほとんど考慮していないにもかかわらず,結構処理性能には余裕があることがわかった.
mbed を使うならば,上記の両方の機能を 1 台にまとめてやらせてはどうか.
もちろん複数のマイコンを並べたほうが性能に余裕が出来,同時発音数などのスペックを引き上げられるのは確かだが,小規模なもので良ければ,こういった解決法も悪くはないのでは?
というわけで,Conductor 専用プログラムに着手する前に,通信処理を行わず単一のプロセッサ内で完結するバージョンを作ってみることにした.これが何和音対応できるのかは見当が付かないので,まずは動かした結果を観測してみようと思う.

mbed と LPF & オーディオ基板 (MARY-CB 基板互換) を載せた実験基板.もしこの案で実用レベルのスペックを確保できたとすれば,この写真に MIDI 入力回路を加えただけで音源モジュールが作成できそうだ.
7/9 追記:
とりあえず 1 台の mbed 上ですべての処理を完結させたバージョンが動いた.12 和音 @ 40 kHz に対応する処理能力があることを確認.思ったよりも余裕があった.もっとも,現状の実装ではノート・オンまたはオフ以外の大半のメッセージを読み飛ばしているので,音色すら変えられない.まだまだ MIDI 音源としてはリファインしていく必要がありそうだ.
過去に mbed 用に書いていた音源クラスを,固定シーケンスからリアルタイム制御対応へ書き直す作業が完了した.
計画当初から,この音源ハードウェアでは,機能を
- Conductor (MIDI 受信・解釈,演奏情報送信)
- Performer (演奏情報受信,発声)
しかし現在は当初の計画と異なり,プロトタイピングを理由に mbed を利用している.御存知の通り,96 MHz で動作する Cortex-M3 コアを搭載しているマイコンボードだ.Arduino からマイコンや電子工作を始めた身としては,32 ビットプロセッサの性能を「正直甘く見ていた」かもしれない.コードレベルで最適化をほとんど考慮していないにもかかわらず,結構処理性能には余裕があることがわかった.
mbed を使うならば,上記の両方の機能を 1 台にまとめてやらせてはどうか.
もちろん複数のマイコンを並べたほうが性能に余裕が出来,同時発音数などのスペックを引き上げられるのは確かだが,小規模なもので良ければ,こういった解決法も悪くはないのでは?
というわけで,Conductor 専用プログラムに着手する前に,通信処理を行わず単一のプロセッサ内で完結するバージョンを作ってみることにした.これが何和音対応できるのかは見当が付かないので,まずは動かした結果を観測してみようと思う.
mbed と LPF & オーディオ基板 (MARY-CB 基板互換) を載せた実験基板.もしこの案で実用レベルのスペックを確保できたとすれば,この写真に MIDI 入力回路を加えただけで音源モジュールが作成できそうだ.
7/9 追記:
とりあえず 1 台の mbed 上ですべての処理を完結させたバージョンが動いた.12 和音 @ 40 kHz に対応する処理能力があることを確認.思ったよりも余裕があった.もっとも,現状の実装ではノート・オンまたはオフ以外の大半のメッセージを読み飛ばしているので,音色すら変えられない.まだまだ MIDI 音源としてはリファインしていく必要がありそうだ.
マイコン電子工作をするときは,だいたい八割がたのプロジェクトに AVR を採用している.競合する PIC に興味がなかったわけではないのだが,Arduino から入った身としては他に選択する余地がなかっただけとも言える.それに,今以上に知識がなかった昔は単に「難しそう」と敬遠していた.
”PIC18F の試食”のつづきはこちら
先日 6 月 23 日,高松市にある香川高専にて開かれた電子工作イベント
「えれくら! 第 4 回」に参加してきた.
このイベント,最近は 2 ヶ月に一度のペースで開催されており,近所に似たような催しがない自分にとってはかなり楽しみにしていたものである.
今回の「えれくら!」では,NT 京都でも作品を出展された ohguma さんによる
Arduino 用の「LED キューブシールド」の制作会があり,イベントの目玉企画となっていた.
http://www.slideshare.net/ohguma/201306-ledcube-part1
http://www.slideshare.net/ohguma/201306-ledcube-part2
僕は以前に自分でキューブを作ったことがあるけれど,
その時は安物の LED を使ったため,光が弱くて残念な出来栄えになってしまった.
今回は新発売の高輝度アイスブルー (水色?) LED を持ち込んで再チャレンジと意気込むも
光を良く拡散させるために全部の LED の樹脂部分をヤスリがけする工程に時間を取られ
キューブの構体ができあがった直後でタイムアップ.
(なんと,企画参加者全員が時間内に動作できなかったという事態に)
その後,持ち帰って続きの作業を終え,なんとか完成.





その他,イベントでは
ねこ太郎さんの無線センサーモジュール制作レポートや,
香川高専の村上先生による,電子百葉箱プロジェクトについての取材 VTR 放映,
@kama_AGE さんの Maker Faire Taipei の突入レポート
を聴くことができた.
出来れば自分も今制作中の MIDI 音源を発表できる段階までこぎつけたかったところだが,
8 月開催の次回を新しく目標として,ぼちぼち続けていくことにしようと思う.
* 参加者の皆様,どうもありがとうございました.次回もよろしくお願いいたします *
「えれくら! 第 4 回」に参加してきた.
このイベント,最近は 2 ヶ月に一度のペースで開催されており,近所に似たような催しがない自分にとってはかなり楽しみにしていたものである.
今回の「えれくら!」では,NT 京都でも作品を出展された ohguma さんによる
Arduino 用の「LED キューブシールド」の制作会があり,イベントの目玉企画となっていた.
http://www.slideshare.net/ohguma/201306-ledcube-part1
http://www.slideshare.net/ohguma/201306-ledcube-part2
僕は以前に自分でキューブを作ったことがあるけれど,
その時は安物の LED を使ったため,光が弱くて残念な出来栄えになってしまった.
今回は新発売の高輝度アイスブルー (水色?) LED を持ち込んで再チャレンジと意気込むも
光を良く拡散させるために全部の LED の樹脂部分をヤスリがけする工程に時間を取られ
キューブの構体ができあがった直後でタイムアップ.
(なんと,企画参加者全員が時間内に動作できなかったという事態に)
その後,持ち帰って続きの作業を終え,なんとか完成.
その他,イベントでは
ねこ太郎さんの無線センサーモジュール制作レポートや,
香川高専の村上先生による,電子百葉箱プロジェクトについての取材 VTR 放映,
@kama_AGE さんの Maker Faire Taipei の突入レポート
を聴くことができた.
出来れば自分も今制作中の MIDI 音源を発表できる段階までこぎつけたかったところだが,
8 月開催の次回を新しく目標として,ぼちぼち続けていくことにしようと思う.
* 参加者の皆様,どうもありがとうございました.次回もよろしくお願いいたします *
mbed で書いていた Conductor (制御用プロセッサ) のプログラムを更新した.
Conductor は入力メッセージ・ストリームを解釈して,Performer (音源プロセッサ) に送る指示を発行する.
まだ Performer の指示受信処理が間に合っていないので,とりあえず PC シリアルポートにダンプしてみた.

このプログラムは,mbed.org にて公開しています (実装は完全に自分用だけど).
Conductor は入力メッセージ・ストリームを解釈して,Performer (音源プロセッサ) に送る指示を発行する.
まだ Performer の指示受信処理が間に合っていないので,とりあえず PC シリアルポートにダンプしてみた.
このプログラムは,mbed.org にて公開しています (実装は完全に自分用だけど).
この話題について,ここで進捗として色々と書く上で必要となるだろうから,
制作中のチップチューン専門 MIDI 音源の概要,とくに構成を中心に記すことにする.

上の図が大まかなブロックダイアグラム.
音源内部は,Conductor と呼ぶ制御用マイコンと,複数の Performer と呼ぶ音源用マイコンで構成されている.
◆ Conductor
制作する音源には MIDI IN 端子を備え,音源として扱えるようにする.
この MIDI メッセージ (31,250 baud シリアル) を受信し,意味を解釈した結果
複数の Performer に分散して指示を発行する,という一連の制御を担当する.
試作段階の現在は,Conductor には mbed を使用している.
◆ Performer
ソフトウェアで実装された音源プロセッサ.
内部に波形テーブルを持ち,上述した Conductor からの指示に従い,発音処理を行う.
同時発音数を稼ぐため,複数の Performer 用意することを前提としており,
最終的にすべての出力を加算合成し,サウンド出力とする.
なお,Conductor-Performer 間の通信は,I2C もしくは SPI とする.
◆ Instrument
Performer 内部の各単音パートのインスタンスを,Instrument と呼んでいる.
制作中のチップチューン専門 MIDI 音源の概要,とくに構成を中心に記すことにする.
上の図が大まかなブロックダイアグラム.
音源内部は,Conductor と呼ぶ制御用マイコンと,複数の Performer と呼ぶ音源用マイコンで構成されている.
◆ Conductor
制作する音源には MIDI IN 端子を備え,音源として扱えるようにする.
この MIDI メッセージ (31,250 baud シリアル) を受信し,意味を解釈した結果
複数の Performer に分散して指示を発行する,という一連の制御を担当する.
試作段階の現在は,Conductor には mbed を使用している.
◆ Performer
ソフトウェアで実装された音源プロセッサ.
内部に波形テーブルを持ち,上述した Conductor からの指示に従い,発音処理を行う.
同時発音数を稼ぐため,複数の Performer 用意することを前提としており,
最終的にすべての出力を加算合成し,サウンド出力とする.
なお,Conductor-Performer 間の通信は,I2C もしくは SPI とする.
◆ Instrument
Performer 内部の各単音パートのインスタンスを,Instrument と呼んでいる.
現在,MIDI メッセージを解釈するプログラムを書いている.
よりによってブラウザ上で.
マイコンで音源を作成しようというプロジェクトを最初に立ち上げたのは 2 月の中旬.
矩形波や三角波などの単純な波形を持った,レトロゲーム風の音源にしようという方針で計画していった.
(波形メモリ音源という表現をしたら,分かる人には分かっていただけるだろうか)
とりあえず音が出るようになったのは 2 月の終わり頃.
写真はダヴィンチ 32U ボードを使った単音正弦波の動作実験.今思えば懐かしい.

3 月末には各種マイコンで,楽譜を内蔵した再生専用の音源プレイヤーが完成した.
写真のボードでは ATmega168P を 3 個使い,各パートごとに違う楽譜を入れて 9 和音で再生する.
リセットを同時にかけたり,定期的にタイミング同期を掛けたりと色々面倒なうえにトラブルの多いやつだ.


このプログラムでは,演奏情報は配列データとして埋め込まれたもので,わずか 1 分半足らずの曲をでっち上げるのにも一苦労する代物.コンバータを作るにせよ,MML のサブセット的なものを作るにせよ,聴くまでにそこそこの労力がかかるので,いっその事 MIDI 音源にしてしまえという発想に至った.
そこから先が,とんでもなく長い道のりになった.

あ,間違えた.
自分の現時点で持ち合わせる知識など諸々をかんがみて,最初は楽に実装できる環境から取り掛かろうということにした.マイコンボードを mbed に変更して,MIDI を解釈して音源を制御するプログラムを書きはじめる.

MIDI メッセージの仕様における参考書として,とりあえず Wikipedia を見ながら
メッセージの解釈処理をがりがりと記述している次第である.
このペースだと,完成は何時になるのやら…
よりによってブラウザ上で.
マイコンで音源を作成しようというプロジェクトを最初に立ち上げたのは 2 月の中旬.
矩形波や三角波などの単純な波形を持った,レトロゲーム風の音源にしようという方針で計画していった.
(波形メモリ音源という表現をしたら,分かる人には分かっていただけるだろうか)
とりあえず音が出るようになったのは 2 月の終わり頃.
写真はダヴィンチ 32U ボードを使った単音正弦波の動作実験.今思えば懐かしい.
3 月末には各種マイコンで,楽譜を内蔵した再生専用の音源プレイヤーが完成した.
写真のボードでは ATmega168P を 3 個使い,各パートごとに違う楽譜を入れて 9 和音で再生する.
リセットを同時にかけたり,定期的にタイミング同期を掛けたりと色々面倒なうえにトラブルの多いやつだ.
このプログラムでは,演奏情報は配列データとして埋め込まれたもので,わずか 1 分半足らずの曲をでっち上げるのにも一苦労する代物.コンバータを作るにせよ,MML のサブセット的なものを作るにせよ,聴くまでにそこそこの労力がかかるので,いっその事 MIDI 音源にしてしまえという発想に至った.
そこから先が,とんでもなく長い道のりになった.
あ,間違えた.
自分の現時点で持ち合わせる知識など諸々をかんがみて,最初は楽に実装できる環境から取り掛かろうということにした.マイコンボードを mbed に変更して,MIDI を解釈して音源を制御するプログラムを書きはじめる.
MIDI メッセージの仕様における参考書として,とりあえず Wikipedia を見ながら
メッセージの解釈処理をがりがりと記述している次第である.
このペースだと,完成は何時になるのやら…
プロフィール
HN:
KX89
性別:
男性
最新記事
(04/03)
(07/15)
(07/08)
(06/29)
(06/25)
P R