NTS-1 mkIIのlogue SDKでパラメータが初期化できない件


NTS-1 mk2用ユーザユニットの開発中に出くわしたバグ?の話です。

logue SDK v2のAPIには、ユニットのロード時、最初に一度だけ呼ばれる初期化関数 unit_init() があります。変数はこの関数中で初期化します。

ユーザが変更できるパラメータは、header.cの中で
・最小値
・最大値
・中央値
・デフォルト値
を定義するようになっています。また、パラメータが変更されたときには都度 unit_set_param_value() が呼ばれます。

実際にパラメータ(に対応する変数)の値が使われるのは、波形を生成する際に呼ばれる関数 unit_render() の中です。パラメータは、この関数が呼ばれる前に初期化されている必要があります。

今日出くわしたバグというのは、
(1)header.cで定義したパラメータに対応する変数を、初期化関数の中でデフォルト値に初期化した。
(2)unit_render()の動作がおかしく、調べてみると(1)で設定した変数がおかしな値(ゼロ)になっている。
という現象でした。これに気づいたのは、この変数のデフォルト値がゼロではないからです。

いろいろと調べてみると(こういうとき、前回紹介した文字列の出力が役に立ちます)、初期化した後、unit_render()が呼ばれるまでの間に、unit_set_param_value()が呼ばれており、その値がゼロであるらしいことがわかりました。

NTS-1のノブは操作していませんので、パラメータを変化させたわけではありません。何より、このパラメータの最小値の設定はゼロより大きいので、ゼロになるのはおかしいのです。どうも、初期化関数が呼ばれた後に、すべてのパラメータをゼロに設定するようにunit_set_param_value()が呼ばれているのではないかと思われました。

そこで、フラグ変数を用意して初期化時にfalseに設定し、unit_render()が呼ばれたらtrueになるようにして、このフラグがfalseのときはunit_set_param_value()が呼ばれても何もせずにreturnするようにしたところ、この現象は解消しました。

このような挙動は、もしかしたらNTS-1の名残なのかもしれません。NTS-1では、パラメータ毎のデフォルト値を決めることはできず、常にゼロがデフォルト値となっていました。しかしlogue SDK v2ではパラメータの詳細が決められるようになったのですから、この挙動は廃止してほしいと思います。

コメント