元々、SMF の Loop 再生は想定されていなかった運用形態なので、ここはあまり拘るポイントではないのだが、SongPosition の開始位置の表示が徐々にズレていくのは流石にマズいということで、ファイルの読出しを開始するタイミングで SongPosition のカウンタにリセットを掛けるコードを追加した。

また、TopSwitch から Pause を行った時に元のモードに戻らない「仕様」が使い難そうだったので、直前の状態を記憶する復帰用のレジスタを追加した。

通常の再生モードで、偶に発生する SongPosition が過大にカウントされる不具合には、リセット回路を追加して対応しているが、

リセットを行うことで SMF の初回再生時に行うシーケンスのステップ数の記録機構を無効化してしまう弊害が発生する。 この問題には、SongPosition をカウントするレジスタを並列化することで対処している。

参照している SMF の作りに問題がある可能性が高いとはいえ、全般的に挙動が荒っぽい感触がある。 正確な評価を行うにために、そろそろ単純な構成のファイルを用意する頃合いだろう。
追記:
PAUSE の選択時に起動していた pot01(a) は使用目的が謎なポットで、どうやら開発の初期段階に EEPROM の初期化を行うことを目的に設定されたレジスタと思われるが、SMF Reader が仕様の変更を繰り返した結果、実際にはアクセスできない状態になっていた。

無駄な機能はバグの原因になりかねないので、今回このポットを削除して、Tempo 設定を行う pot3 に入れ替えることにした。

同時に関連する表示系の内容を精査して、修正を行っている。

また、これも開発の初期段階に設定していた MOS-FET のスイッチ動作を監視する LED のポート・アサインを確認したところ、後日追加した機能とのコンフリクトが認められたので、関連する GPIO の指定を pin# 40 に修正している。

追記2:
トップページで感じた扱い難さと数値表示の問題を解消する作業を行った。
先ずデフォルトで読み出したファイルのテンポが表示されない問題を解消し、、、

読みだした数値の桁合わせを行った。

また、ファイル選択を行った場合の視認性を上げるために、上部表示エリアの背景色を操作している。

追記3:
発色が怪しかった TopSwitch 左の LED 緑の GPIO 33 番がロータリーエンコーダの LED 端子と重複していることを確認、これを空き端子 38 番に振り直した。
追記4:
Loop モードで長時間運用した場合に、1シーケンス当たりに発生する SongPosition の誤差が積算された結果、大幅にステップのカウントが狂って、初期状態へのリセットが効かなくなることが判明した。
追記5:
ライブラリを精査して getNextEvent() の解釈を再検討した結果、Loop を行っている時に発生するカウントの誤差を解消できたかもしれない。

追記6:
残念ながら Tempo を変更した際に発生する誤差を吸収しきれないことが判明したので、判定基準値 +1 step を追加して誤差を 1 step まで圧縮する方法を採った。

この方式だと、常に 1 step の誤差が交互に発生してしまう(最初の1発目が発音するタイミングが 1 step ズレたり戻ったりする)のだが、リセットが掛からずにカウンタが暴走する状態よりはマシなうえ、1 step 程度の誤差によって「実用上の問題」は発生しないので、暫定でこの誤差解消法の採用を決定した。
理想は、SMF.restartと連動してフラグを立ててカウンタをリセットする方法だが、ライブラリ本体をいじるのが手間なので、この件はペンディングとする。
追記7:
結局、ライブラリに手を加える形で問題を解決できた。
まず、本体側は isEOF フラグに連動するシンプルな形に戻し、、、

ライブラリの方は、bool MD_MIDIFile::isEOF(void) の中の restart(); の直後に songPos = 0; を記述して、カウンタをリセットしている。

追記8:
テンポを速く設定した場合に、リズムがヨレる現象に対応するために、トリガーの長さを 10ms に設定した。

また、起動後に立ち上がる最初のシーケンスのテンポを読み出せないバグに対応した。

追記9:
MCU 側に複数の midi port の実装が可能なので試してみたところ、PC 側で Teensy が認識されなくなった。仕方なく 1port に戻しているが、原因は不明。

音飛びが気になったので念の為に PC 側で midi 入力信号を確認すると、このシーケンスは 1/16ch の 2 track 分のデータを送信していて、音源側に設定していた同時発音数のキャパを超えていたのが不調の原因だった。
posted by Yasuski at 10:40|
SolenoidBell