NTS-1 mk2でピッチ・チェンジャーを作ってみた

以前の記事でも触れましたが、NTS-1 mkIIではオシレータからAUDIO INのデータを利用することができます。AUDIO INを使ったオシレータの実験として、AUDIO INの音声を音高を変化させて再生する、簡単なピッチチェンジャーを作ってみました。作成したコードはこちらにあります。

GitHub - boochow/pitchy
Contribute to boochow/pitchy development by creating an account on GitHub.

また、バイナリはこちらで配布しています。ちなみにネーミングやイラスト、マニュアルの作成にはChatGPTのお世話になりました。おかげでこのあたりの作成にかかる負担は1/10くらいに減った感じです。今まではこの作成が面倒でGitHubのリリースページにバイナリもアップロードすることが多かったのですが、GitHubは普通の人にはちょっと分かりにくいサイトなので、無料のものでもなるべくGumroadを使っていこうかと思っています。

Pitchy: pitch shifter oscillator for NTS-1 markII
Pitchy is a custom oscillator unit for KORG NTS-1 markII. Pitchy changes the pitch of the sound from the AUDIO IN jack. ...

ピッチ変換は単純な実装で、AUDIO INのデータをバッファにコピーした後、そのバッファをウエーブテーブルと見て、ピッチに応じた速度で再生しています。ピッチを変更しなければ結果的にAUDIO INのデータがそのままオシレータの出力として出ていきます。ピッチが高ければバッファしたデータが繰り返し再生され、ピッチが低ければ全部再生し終わる前にバッファが上書きされます。

当然バッファのデータには不連続な箇所が生じてプチノイズが出ますが、これをちゃんと消そうとすると結構面倒なので、現状は放置しています。グラニュラーシンセシスだとグレインにウインドウ関数をかけますが、今回はウインドウ関数だけだとあまり効果はありませんでした。【Update on 2024/5/19】バッファの不連続な部分を隠すため、グレインからの読み出しデータに対して、不連続部分が0となるようなADエンベロープ型のウインドウ関数をかけています。これだけだとウインドウ関数の音が聴こえてしまいますので、バッファ長の1/2だけ読み出し位置をずらしたデータを用意し、ウインドウ関数としては「1.0-前述のウインドウ関数」(つまり、2つを重ね合わせた結果は常に1.0)を用いて、これらを重ね合わせています。この手法はThe Synthesis ToolKitnのピッチチェンジャで使われていた方式を参考にしました。ただ、位相がずれた2つの波形を重ねていることになりますので、音色は微妙に入力とは変わります。

オシレータからはSDRAMは使えないことになっていますので、AUDIO INのデータをコピーするバッファは最大32KB(モノラル)としました。AUDIO INのデータはステレオですが、オシレータの出力はモノラルですので、バッファもモノラルです。

お遊び機能として、バッファにデータをコピーする際に上書きではなく、元データとミックスするオプションをつけてみました。これによって古いバッファのデータが繰り返し再生され、ディレイのような効果が得られます。

元データとピッチチェンジ後のデータのミキシング、およびゲイン調整も設定可能です。ゲインはNTS-1側の設定(デフォルトは-6dB)もあるので、設定によっては音割れします。

ピッチの情報は今回はキーボード(ノート番号)から取っていますが、LFOでピッチをいじりたければ、先日書いたようにランタイム・コンテキストからピッチ情報を取る必要があります。このへんは後日アップデートするかもしれません。また、キーボードのオン・オフ情報が取れるので、元の音声およびピッチチェンジ後の音声について、常に流すかキーを押している間だけ流すかを選択できるようにしてあります。

コメント