昨年作り始めて最近また少し手を入れてきていた、logue SDKによるRoland αJunoのエミュレーションですが、ようやくある程度の完成度になったので、Gumroadでリリースしました。
最後の段階では、高音階でのエイリアスノイズの解消に手間をかけましたので、少しメモを書いておきます。
エイリアスノイズというのは、サンプリング周波数よりも高い周波数の音声を入出力すると、「その信号の周波数とサンプリング周波数の差分」に相当する周波数の音が出現してくるものです。ソフトウェアシンセサイザでは、高域でのサイン波以外の波形はほぼノイズの原因になると思った方が良いです。例えばMIDIでの最高音=ノート番号127の周波数は12KHz超になりますので、2倍音は24KHzを超えてしまいますから、サンプリング周波数が48KHz程度のシステムでは倍音成分は出力できません。
logueシリーズのデジタル部分も48KHzのサンプリング周波数と思われますが、Logue SDKでは、エイリアスノイズを出さないように構成された矩形波・三角形・鋸波のウエーブテーブルが用意されています。このウエーブテーブルは、高域音階はほぼサイン波しか出力しませんので、これを普通に使っている限りはエイリアスノイズは出現しません。
今回のαJunoのエミュレーションも、基本的にはこのウエーブテーブルを使っています。ただ、αJuno特有の波形を作るために、複数の波形を組み合わせて使っており、この組み合わせ方がまずいと、波形が歪んでエイリアスノイズが出てしまいます。
例えば、αJunoのサブオシレーターの波形は2種類の矩形波を組み合わせて作ることができます。
SUB3の波形は、矩形波とその4倍の周波数の矩形波のANDを取ったものと考えられます。これをエミュレートする際に、次の図のように二つの矩形波の位相をぴったり合わせてしまうとうまくいきません。
青と赤の矩形波の信号をかけ合わせれば所望の波形が作れそうに思えたのですが、高域では波形が崩れてしまいます。高域での矩形波は倍音成分を失い、サイン波と同じ波形になります。その時の様子は次の図のようになります。
これを見ると、矩形波では位相を合わせたつもりだったのが、実は合っていないことが分かります。 サイン波の山と谷に着目して位相を合わせると、次の図のようになっていなければなりません。
これを矩形波の位相で考えると、元の図に比べて、青い方の矩形波の位相は、赤い矩形波の波長の1/4だけ遅らせる必要があります。赤い矩形波の周波数は青い矩形波の4倍なので、これは青い矩形波の波長の1/16にあたります。あるいは、青い矩形波の谷と赤い矩形波の谷が一致するようにデューティ比を調整するという方法もあります。
というようなデバッグを各波形に対して行って、高域もある程度(完全ではないのですが)綺麗な音にして、ようやくリリースとなりました。
コメント