logue SDKで以前からぼんやり疑問に思っていたことが、「オシレータのサンプリングレートは48KHzだけど、エフェクタも同じなのか?」ということです。ちなみにNTS-1の場合、DACはAKM4384で192kHz 24-Bitまで対応しています。
オシレータの場合は、サンプリングレートがヘッダファイルで
#define k_samplerate (48000)
と定義されています。
しかしエフェクタ用のヘッダファイルはこの定義が含まれていません。
ところが、前回の音量調節するだけのエフェクタのソースを眺めていて「1と0を交互に出力するようにすれば、エフェクタのサンプリングレート/2の周波数の信号を出力できる」と気づきました。ループの
for (; my != my_e; ) { *(my++) = *(mx++) * s_depth * on_off; *(my++) = *(mx++) * s_depth * on_off; *(sy++) = *(sx++) * s_depth * on_off; *(sy++) = *(sx++) * s_depth * on_off; }
という部分を
for (; my != my_e; ) { on_off = 1.0 - on_off; *(my++) = *(mx++) * s_depth * on_off; *(my++) = *(mx++) * s_depth * on_off; *(sy++) = *(sx++) * s_depth * on_off; *(sy++) = *(sx++) * s_depth * on_off; }
とするわけです。これで、サンプリングレート/2の周波数の信号をオシレータの信号で変調した信号が出力されます。
というわけでNTS-1とminilogue xdで確認してみました。
方法としては、上記の変更を加えたモジュレーションFXをインストールし、音を鳴らしてオシロで観測し、周波数を測ります。その2倍がサンプリングレートです。
鳴らす音は、鋸波でD#8としました。D#8の周波数はほぼ5KHz(4978Hz)ですので、波長は200usecとなり、周波数を測るガイドにできます。
まずNTS-1の鋸波とエフェクトかけた波形です。鋸波といっても、48KHzより上の高域成分を含まないように調整されたウエーブテーブルなので、この周波数領域でかなりサイン波に近い波形となっています。ちょっと鈍りすぎな気もしますが。
1波長あたり、波が4つ程度含まれていますので、サンプリング周波数は40KHz強、ということはまあ48KHzでしょうか。44.1KHzという可能性も考えられますが、オシレータが48KHzなのにエフェクタを44.1KHzにすることはおそらくないでしょう。
つづいてminilogue xdです。こちらはアナログVCOなので、鋸波の波形が出ています。
サンプリング周波数はNTS-1と同じのようです。ひょっとして96KHzの可能性もあるかも?と思っていたのですが、少なくともユーザカスタムエフェクトに関してはそれは無さそうです。
というわけで、結論としてはエフェクタのサンプリングレートも48KHzと考えていいらしい・・・ということになりました。
***
以下はおまけの話です。エフェクタを通すとアナログVCOの信号も48KHzでサンプリングされることになりますが、元の波形から劣化しないのでしょうか。
ちょっと気になったので、同じ測定をαJunoでもやってみました。
αJunoにはもちろんカスタムエフェクトはインストールできませんが、鋸波をスイッチングした波形を持っていますので、波形の鈍り具合を比較してみます。
まず普通の鋸波です。きれいな波形ですね。
8倍の周波数でスイッチングした波形です。といってもほとんど高周波成分が消失しています。
1オクターブ下のD#7を鳴らした波形です。これだとスイッチング成分は20KHzくらいになり、上述のNTS-1やminilogue xdとほぼ同じ条件です。鈍り具合も似たようなものでしょうかね。
ということで、エフェクタが48KHzでサンプリングしていても、出音はアナログと別に変わらないようです。
まあアナログシンセも信号経路にはコンデンサが挟まっているので、30KHz以上の成分が出力に出てくることはあまりないはずですから、48KHzサンプリングでも(高性能なADCを使う限りは)問題ないということでしょう。
余談の余談ですが、旭化成のホームページを見ていたらADC技術の入門記事が出ていました。
ちょっと面白かったのでリンクを貼っておきます。

コメント