2018年12月24日

Metroのクロックレートを調整する

実用面から考えると無駄に速かったArpeggiatorのクロックに1/2分周を行った。

WS001524.JPG

ついでにSequencerにも同じ手当を行った結果、実用的なテンポを設定することが出来るようになった。

WS001526.JPG

要は、Metroがアクセプト出来るインターバルの制限が1000msなために発生していた不具合だが、分周によって最長1980msのインターバルでクロックをドライヴすることが可能となった。
posted by Yasuski at 18:07| LaVoixski

条件分岐処理の合理化を考える

アルペジエーター関連のタスクを積み上げ過ぎた結果、音質に悪影響が出てきた。 設定の処理を行うループ内にタスクが集中していることが原因と思われる。 今回追加したタスクの大半が条件分岐なので、この部分の処理速度を上げるのが手っ取り早い高速化のメソッドだろう。

処理の合理化をキーワードにしてWebの資料を漁った結果、if の代わりに switch を使うことで選択後の分岐処理をスキップ出来ることが解った。 

例えば、if()構文で条件分岐を行う場合、条件がヒットした後であってもタスクの終了後に残りの条件が総当りで参照されてしまい、この過程が処理の遅延に直結する。 記事で提案されていたのは switch/case で分岐を組む手法。 処理を行った後にbreakを行うことで、他の余分な条件をすっ飛ばして分岐のルーティンを終了するところが良い。

実際に行っていた処理の例では、アルペジエーターの再生パターンの選択やメモリーの管理をif()構文で行っているのだが、これが結構な量のステップを消費しているように見える。 そこで、この部分を switch による条件分岐に書き換えて、稼働試験を行った。

Screen Shot 2018-12-24 at 9.15.37.png

結果は発音に明らかな改善が見られたので、if()構文を可能な限りswitch/caseに書き換えることにした。

その他、発音機構のタスクを減らすために constrain で行っていたヴォリューム関連の出力制限をより単純な value && 0X0FFF によるマスキングに変更している。 弊害として、最小ヴォリュームから桁下がりで最大値に転換してしまう閾値周りの挙動が荒っぽくなるが、実用上は問題無さそうだったので、しばらくの間はこの仕様で様子を見ることにする。
posted by Yasuski at 10:12| LaVoixski