NTS-3、プログラムを作れるだけでもかなり面白くて、いろいろいじってあっという間に週末が終わりそうになっていますが、SDKのほうもNTS-3のAPIを使ってみました。
以前NTS-1 mk2用に作ったシンプルなオシレータをNTS-3用に焼き直しただけで、正直NTS-1 mkIIとそれほど大きな違いはないだろうと思っていたのですが、いくつか気づきをまとめておきます。(ちなみにNTS-1 mkIIのファームウェアも、v1.2にアップデートされていろいろバグが解消されていますので、更新をお勧めします。)
とりあえず作ってみたのが以下のコードです。オシレータそのものは上記の記事とほぼ同じですが、パッドのX軸をピッチ、Y軸をPWM、FX DEPTHを入力信号とのミックス比率にしています。また、パッドに割り当てないパラメータとして、音程を半音単位にジャンプするかスムーズに変更するかを設定するChromaというパラメータを用意しました。
header.c
は全体は省きますが、パラメータの記述は以下のようになっています。
主要なコードが入っているeffect.h
は以下の通りです。
コードとして意味があるのは65行目からの波形を生成している部分と、新しくAPIに加わったイベントハンドラtouchEvent()
の109行目の部分です。
パラメータは、setParameter()
の中で必要な計算をしておくほうが常道ですが、今回はすべてProcess()
の中で計算しています。
setParameter()
はパッドを触っているかどうかを知ることはできません。タッチしている間だけオシレータの音を出すように、touchEvent()
でオンオフ状態を取得して、変数noteon_
を設定してProcess()
の中で使っています。
パッドのY軸に割り当てているPWMは、パラメータの定義上は0%~100%の範囲で設定可能ですが、マッピングのデフォルト設定で、最小値を50%に設定しています。これはデフォルトの設定ですがユーザがマッピングを変更することは可能です。このあたり、なかなか柔軟で良いなと思いました。
また、出力する信号は入力する信号とミックスし、そのミックス比率はFX DEPTHで設定できるようにしています。
気づいたことなど
前掲のコードでは、Process()
はパルス波を生成します。その振幅幅ですが、NTS-1 mkII用の実装では-1.0~1.0としていました。しかし、NTS-3ではこれだとかなり大きな音になります。
そのため、上記のコードでは1/10の-0.1~0.1としています。これくらいが入力音声とのバランスではちょうどいい感じです。(デフォルトのグローバル設定の場合です。グローバル設定で入力音声のゲインは変更できます。)
入力信号とのミックスですが、エフェクトの入力バッファと出力バッファは実際には同一のバッファで、同じバッファからデータを読み取って上書きしているようです。あるエフェクトがバッファに何も書き込まなければ、入力バッファがそのまま出力バッファとして後段のエフェクタへ送られるわけです。
上のコードでは、CHROMAパラメータをONにすると、パッドの入力が一応半音ごとの音程にスナップされます。
しかし、実際には半音ごとではなくスケールを指定したいところです。また、全音階をパッドで入力するのは困難なので、下限値と上限値も音程で設定したいところです。【2024/8/4追記:下限上限の設定はmappingで指定できます。】
このような処理を実装したコードが、KORG DIY CLUBさんから提供されています。以下の「x-to-note example」ですが、NTS-3でオシレータを実装するなら必見と言えます。むしろなぜSDKに入れなかったんだろうというレベルです・・・。
コメント