忍者ブログ

マイコンとか自作 MIDI 音源とか (旧 segtter's core dump) http://segtter.iza-yoi.net/

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



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」チェックボックスをオンにするだけ.

拍手[1回]

PR
音源プロジェクト進捗.
過去に 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 音源としてはリファインしていく必要がありそうだ.

拍手[0回]

mbed で書いていた Conductor (制御用プロセッサ) のプログラムを更新した.

Conductor は入力メッセージ・ストリームを解釈して,Performer (音源プロセッサ) に送る指示を発行する.
まだ Performer の指示受信処理が間に合っていないので,とりあえず PC シリアルポートにダンプしてみた.


このプログラムは,mbed.org にて公開しています (実装は完全に自分用だけど).

拍手[0回]

この話題について,ここで進捗として色々と書く上で必要となるだろうから,
制作中のチップチューン専門 MIDI 音源の概要,とくに構成を中心に記すことにする.






上の図が大まかなブロックダイアグラム.
音源内部は,Conductor と呼ぶ制御用マイコンと,複数の Performer と呼ぶ音源用マイコンで構成されている.

Conductor
制作する音源には MIDI IN 端子を備え,音源として扱えるようにする.
この MIDI メッセージ (31,250 baud シリアル) を受信し,意味を解釈した結果
複数の Performer に分散して指示を発行する,という一連の制御を担当する.
試作段階の現在は,Conductor には mbed を使用している.

Performer
ソフトウェアで実装された音源プロセッサ.
内部に波形テーブルを持ち,上述した Conductor からの指示に従い,発音処理を行う.
同時発音数を稼ぐため,複数の Performer 用意することを前提としており,
最終的にすべての出力を加算合成し,サウンド出力とする.
なお,Conductor-Performer 間の通信は,I2C もしくは SPI とする.

Instrument
Performer 内部の各単音パートのインスタンスを,Instrument と呼んでいる.

拍手[0回]

現在,MIDI メッセージを解釈するプログラムを書いている.
よりによってブラウザ上で.


マイコンで音源を作成しようというプロジェクトを最初に立ち上げたのは 2 月の中旬.
矩形波や三角波などの単純な波形を持った,レトロゲーム風の音源にしようという方針で計画していった.
(波形メモリ音源という表現をしたら,分かる人には分かっていただけるだろうか)

とりあえず音が出るようになったのは 2 月の終わり頃.
写真はダヴィンチ 32U ボードを使った単音正弦波の動作実験.今思えば懐かしい.



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



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

そこから先が,とんでもなく長い道のりになった.

































あ,間違えた.






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



MIDI メッセージの仕様における参考書として,とりあえず Wikipedia を見ながら
メッセージの解釈処理をがりがりと記述している次第である.
このペースだと,完成は何時になるのやら…

拍手[1回]

プロフィール
HN:
KX89
性別:
男性
P R
Copyright 電子工作帳 by KX89 All Rights Reserved.
Template by テンプレート@忍者ブログ
忍者ブログ [PR]