先日、Pure DataのパッチからNTS-1 mkIIで動くオシレータを作ってみました。Pure Dataではエフェクタも作ることができますので、今回はそれをNTS-1 mkIIのパッチにしてみます。
NTS-1 mkIIでは作成するユニットでは、エフェクタのフットプリント(Modで16KB、Delay/Reverbで32KB)はオシレータの場合(48KB)よりも厳しいですが、前回、不要なデータをかなり削ることができたので、簡単なエフェクトならDelay/Reverbとして動かすことが出来ます。
今回は、下図のような簡単なエフェクタを動かしてみました。
これは、入力音声を任意のサンプリング周波数でリサンプルするエフェクトです。(ただしローパスフィルタを入れていませんので、ノイズが乗りまくり、あまり実用的とは言えません。)
[samphold~]はサンプル&ホールドを行うオブジェクトで、左側の入力シグナルをサンプリングして出力します。サンプリングするのは、右側の入力が「減少するとき」のみです。実際には、右側の入力には[phasor~]を接続することが想定されています。phasorは0から1まで単調増加して0に戻るという鋸波状の波形を生成しますので、この0に戻るタイミングで、サンプル&ホールドすることが想定されているわけです。
なおエフェクタはステレオイン・ステレオアウトですので、[adc~][dac~]も2チャンネルにするためにパラメータ[1 2]を与えています。[r]は以前も書きましたが[receive]の省略形で、外部からパラメータを受け取ります。
動かしている様子がこちらです。
Pure DataのパッチをNTS-1 mkIIのDelayユニットで動かしてみるテスト。ディレイ効果は無く、入力を低い周波数でリサンプリングするユニットです。(Modユニットのバイナリファイル16Kbの制限はクリアできなかったので、32Kb利用可能なDelayで試しています) pic.twitter.com/zeOCoMPVI0
— boochowp (@boochowp) February 9, 2025
ちなみに、上のPure DataパッチではDry/Wetのミックスをする部分がありません。実際には、その部分は通常のCのコードで書いてあります。この処理をPure Dataで作ることも可能ですが、簡単な処理ですので、あえてPure Dataで作る意味はほとんど無いように思います。
コードはProcess()
とsetParameter()
の部分だけ以下に載せておきます。
hv_processInlineInterleaved(hvContext_, (float *) in, out, frames);
の部分がPure Dataパッチを実行している部分です。
ビルドの手順などは前回とほぼ同様ですので、ここでは省略します。
ビルドしたときのサイズは以下のようになりました。また、バイナリのファイルサイズは20,044バイトでした。
text data bss dec hex filename
18030 756 100 18886 49c6 ./resample.nts1mkiiunit
Delay/Reverbのバイナリの上限である32Kbまではまだ余裕がありますので、もう少し複雑なものでも作れそうですね。
しかし、今回のような方法でPure Dataでlogue SDKのエフェクトを作る際の大きな課題は、ディレイラインのようなサイズの大きなバッファをPure Data側からSDRAM上に確保することです。
現状、hvccが生成するコードはhv_malloc()でメモリを確保します。内部的には、hv_malloc()はmalloc()にdefineされています。しかし、NTS-1 mkIIやNTS-3では、大きなバッファはmalloc()でメインメモリから取る代わりにSDRAM上に確保することになっており、SDKはそのための関数が提供しています。(なお、drumlogueはmallocで大きなメモリを確保できます。)
ある程度まともなエフェクタユニットをPure Dataで作ろうとしたら、バッファの使用は避けて通れません。従って、それをlogue SDKの上で動かすにはSDRAMを扱えるようにすることが必須です。hvccのコードを手作業で修正するのは難しくはありませんが、これに関しては、もう少しいろいろ調べてみようと思っています。
コメント