logue SDKによるαJuno DCOのエミュレータの続き

Prologueを入手したので、なんとか時間を作って、以前logue SDKで開発したαJuno DCOのエミュレーションをするオシレータを久しぶりにいじっています。

このオシレータはCPUの処理能力ぎりぎりで動かしており、Prologueで動作するかちょっと心配でしたが、処理速度に関しては問題ありませんでした。

その代わり、オシロスコープに波形が上下逆さまに表示される問題が発覚したので、#ifdefで切り分けるようにコードを追加しました。

Prologue特有の問題はこれだけでしたが、以前開発中に棚上げにしていた問題に改めて取り組んでいます。

1つはHPFです。以前、αJunoの回路図を調べて書いた解説では、HPFの設定が「0」のときのローパスフィルタのカットオフは回路の定数から約58Hzとしていました。

また、ローパス後の信号と元信号を加算回路で足し合わせるのですが、その比率は計算上は

47KΩ/47KΩ : 47KΩ/(10KΩ+27KΩ) = 1.0 : 1.29

くらいと見込んでいました。

ですが、実際にこれで作って、実機と音を聴き比べてみると、ちょっと違うんですね。
CRローパスフィルタとbiquad filterで実装したローパスフィルタでは減衰が違うのかもしれませんし、私の回路図の解釈が間違っているのかもしれません。

結局、音の感じや、波形の変化の具合などを見て、カット&トライで調節して

カットオフ:180Hz
比率: 1 : 1.5

としました。

また、併せて波形ごとの音量の比率なども実機となるべく一致するように再調整しました。パルス、ノイズ、サブオシレータ、ノイズが等分なのかと思ったら、ノイズだけ若干少ないようです。

といった調整をした実装結果と、実機との比較が以下のビデオになります。PULSE1+SAW1+SUB1+NOISE(SUBとNOISEのレベルはいずれも最大)の信号について、HPFを0→1→2→3→2→1→0と切り替えた場合の音で、最初が実機、2番目がエミュレーションです。

もう1つの問題は、LFOによるShapeパラメータのモジュレーションについてです。
この問題は以前にも書いたのですが、PWMをLFOで揺らすと、minilogueやprologueではαJunoと異なる挙動になってしまうという問題です。

αJunoでPWMをLFOで揺らすと、LFO depthが最大のとき0.5から0までの間で変動します。これは、LFO depth(モジュレーションの強度)の設定値をd(0 < d < 1.0)としたときに、LFOの値は常に正の値、すなわち0..dの間で変動し、PWMはこれに合わせて(0.5 - 0)..(0.5-d/2)の範囲で変動しているのだと思われます。なおαJunoではPWMの固定値の設定(logue系シンセのShapeパラメータ相当)はLFO depthと排他になっており、LFO depth > 0のときはPWMの固定値を設定できません。

ところが、minilogue xdやprologueでは、同じ条件の時にLFOの値が負の値も取ります。つまり、-d..dの間で変動するのです。また、ShapeとLFO depth(intensity)は共存します。その結果、PWMのデューティ比は(Shapeの設定値-d)..(Shapeの設定値+d)までの間で変動します。

PWMはαJunoではポイントとなる音色ですし、PWMの値の変動範囲は音色に大きく影響しますので、ここはオリジナルに一致させたいところです。その方法(LFOの値の絶対値を使う)も以前の記事で書きましたが、副作用もあるのでベストとは言い切れないと感じており、logue-SDKのGithubリポジトリにもissueとして投稿しました。

が、今のところ状況は変わっていないので、苦肉の策としてこの方法自体のオン・オフをパラメータにすることにしました。デフォルトはオンで、オフにするとLFOの値に手を加えずにそのまま使います。LFO波形に矩形や鋸波を使いたい場合はオフにします。

最後に、コーラスも少しだけドライ/ウエットのバランスを変更しました。
回路図を見る限りでは、原信号とコーラス成分の比率は1:0.96くらいだろうと思われたのですが、実際にこれで作った波形を見ると少しコーラス成分が弱かったので、1:1.2としました。

さて、こうして作ったオシレータですが、今回はGumroadでの販売をしようと思っています。以前HooverサウンドオシレータをGumroadで販売しましたが、その上位版という感じです。(もちろん、上位互換ではありませんが。)

コメント