*このパートはH8/300/TinyにMidiを導入するためのノウハウを蓄積するための場所です*
|
||||||||||||||
関連項目: H8/3664 AKI-H8 PallarellPort増設 VHDL coding 前の頁 次の頁 |
||||||||||||||
AD周りの環境整備
|
||||||||||||||
AD周りの問題は、H8上でMIDI製作を始めた当初から引きずっているが、今回思い切って処理ルーティンを改変することにした。不思議なのは、ADを1chのピックアップに限定している分には問題がないのに、これが数チャンネルに渡ってスキャンを始めた途端に精度が落ち、データのバタつきが発生してしまうことだ。これは、人間の目に見えない領域(スピード、分解能など)で何らかのトラブルが発生していることを示唆する現象だ。 オーディオ的なアプローチで電気工作に携わってきた人間なので、動的な信号を変換するよりも、静的な信号を変換する方が結果的にシステムのアラが見えてしまう現象がとても新鮮だ。まあ、よく考えたら信号の変化が遅い故に不具合が見えてくる、タダそれだけのことなのだが、、、、。 さて、結局3年間いろいろとやってはみたが、ハードウエアの改良で出来るポイントは既にやり尽くした感がある。そこで、視点を変えてWebで発見したあるサイトの意見を読んでみると、MIDI用のコントロールデータのアクイジションタイムは10ms程度が現実的な数値で、これ以上高速化してもゴミデータを吐くだけだという。 |
||||||||||||||
|
||||||||||||||
サンプリングを行った後は、得られたデータをMean(平均化)した後、過去に出力したデータとの比較を行う。比較には変化幅のスレッショルド値が設定されているが、判定されるLSBは8ビット精度なので、MIDIデータへの影響は最小限に抑えられている。データはMIDI出力手前で1ビット右にシフトされ、MIDIの規格である7ビットデータに変更される。そのため、出力には同じ値が2発返ってしまうが、最大値と最小値の境界付近で発生する不感帯の発生を、8ビット幅のデータ処理を行うことで回避している。 |
||||||||||||||
|
||||||||||||||
参考までにサンプリングした出力値を示す。 かなり高速にポーテーション・メーターを操作しても、抜群の追従性を示している。 同じデータが2回返る現象は、データの変化判定をフルスケール8ビットデータのLSBで行っているためだ。データ判定にヒステリシスを持たせた場合、どうしてもデータの最大値と最小値に不感帯が生じてしまう。以前MIDIの仕様に従って7ビットのデータ幅で処理を行っていた時は、データ値の中央付近でオフセットを持たせることで、不感帯発生の問題を回避していたが、この方法では、データの中央付近にどうしても不連続な部分ができてしまう。これは精神衛生上あまり良くないので、データの判定を8ビット精度に変更して、オフセットを廃止している。 ADルーティン以外のデータピックアップの遅れは体感上は殆ど感じられていないので、とりあえずは、デジタルフィルター方式が功を奏したといえるだろう。現在、H8/3052上で安定した動作を確認している。 が、、、後日怪談スイッチに実装して実験したところ、PUSHでER4のデータを待避したことで、受信データとのコンフリクトが発生。PUSH、POPによるレジスタのデータ回避は使用不能なことが発覚した。とはいえ、積分系のルーティンではワードデータの取り回しが必須なので、未使用のE系のレジスタを使用することで問題を回避した。また、AD部では隣接するアナログポートの相互干渉からか、ゴミデータの発生が増加している感があったので、データ判定を7ビット精度に変更し、MIDI出力直前にも重複データを監視するルーティンを追加した。これらの手当を行った結果、ようやく怪談スイッチ上でも、AD部分の正常な動作を確認するに至った。データの重複は一切存在していない。 アナログスイッチを追加することで、最大32ポート位までは、VRをセンシング出来そうだが、CH当たりの実質的な遅延時間の測定が行えていないので、センシング・ルーティンの実装が可能かどうか、今後さらに実験を行って行く予定だ。 オリジナル執筆: 2005_0808 修正加筆: 2005_0818 追加レポート:2005_0826 その後、3664シリーズに移植を試みるも度重なる失敗を経験。原因は電気系のトラブルなど複合的なモノだったが、プログラム上でAD変換終了フラグを変換終了後にクリアすることで、動作が安定したようだ。 |
||||||||||||||
つづく→ | ||||||||||||||