2019年01月23日

Sequencer使用時にドライヴ・クロックがオン・オフするタイミングでピッチが微妙にズレる案件

音質の改善とトレードオフする形で、Sequencer使用時にクロックのオン・オフに合わせてピッチが微妙にズレる案件が再発した。

以前はオプティマイズ・メソッドの変更で改善が見られたが、今回はどうやってもアウト。 attatchInterruptのルーチン内に集約したDACへのデータ転送ルーチンが規定時間内に終了出来ず、Loop処理を行っているパートにタスクが侵食している模様。

一方、Loop処理内に展開している「アルペジエーターの駆動を行うパート」にはインターラプト・マスクを施しているが、これらの影響でピッチの管理を行っているルーチンに破綻が生じている可能性がある。

ということで、関連するマスクを全て除去したところ、ピッチの変動に改善が見られた。

新しく導入するボードでは、より高速なDACの採用によってデータトランスファーに要する時間が圧縮できるので、現在置かれている怪し気な状況は好転すると思われる。

今回のピッチが変動するケースは、MCUの処理能力のマージンがほぼ限界に達していることを示唆する現象なので、今後はコードのダイエットを進めていかなければならない。

追記:

LaVoixskiの音声出力・CH3にはオシレーターの単独出力を固定でアサインしているが、ここにオシレーター選択機構を実装してみることにした。

オシレーターを選択するパラメーターは、ChordEditModeのみで使用している「チューニング・ノブ」に割り当てている。 

Screen Shot 2019-01-23 at 15.15.55.png

これといったエラーもなく切り替え機能を実装できたものの、発音関連のタスクが増加した影響で、SequencerModeの音のズレが再発してしまった。

やはりこの辺がTeensy3.6の性能限界ということで、今後新たに機能を追加する場合には「出音を4voiceに減らす」か、実装済みの機能のうち「使用頻度の低いものを端折る」か、機能を削る選択を迫られることになる。

折衷案としては、SequencerModeの出音のみを4Voiceに制限する方法も考えられるので、一度このダイエット法を実験してみよう。

追記2:

Pitchに生じるドリフトがLEDの点滅とあからさまに連動しているのが怪しかったので、点滅機構周りのプログラムを精査したところ、不要な条件分岐を行っていたことが発覚した。

これは、対象する全てのチャンネルのORを取るという間抜けな仕様で、この分岐構文を排除して回路を単純化した結果、SequencerMode選択時に生じていたピッチの変動を抑えこむことに成功した。

Screen Shot 2019-01-24 at 7.58.59.png

同時に、サブ出力チャンネルの選択機構を稼働させることにも成功、

Screen Shot 2019-01-24 at 8.11.18.png

ついでに、ピッチ検出機構の if() 構文をより負荷が少ない switch() 構文に変更している。

Screen Shot 2019-01-24 at 8.11.31.png
posted by Yasuski at 12:31| LaVoixski