KORG NTS-1 mk2のSDKを調べてみた


新発売のKORG NTS-1 mkIIが届きましたので、ちょっといじってみました。

手のひらサイズのシンセが大幅に機能強化して帰ってきた!KORG NTS-1 digital kit mkIIの威力|DTMステーション
2019年11月に発売されて大ヒットになった小さな小さなシンセサイザ、NTS-1。当時「1万円で買えるKORGの小さなシンセ・NTS-1に、世界中で開発されるオシレータやエフェクトを組み込んでみた」という記事でマニアック...

先代のNTS-1は開発機材として、オモチャとして、いろいろ遊べるマシンでした。mk IIは価格がだいぶ上がってしまったところが惜しいですが、プロセッサがCortex-M7になった点と、マルチタッチのキーボードが搭載された点は見逃せないポイントだと思います。

組み立て

先代同様、組み立てが必要です。といっても、ネジ止めだけです。キーボードの接続が必要ない分、若干工程が減っています。

ボードは音源部とコントローラ部に分かれていて、7ピンのピンヘッダ×2で連結するようになっています。これも先代と同じですが、先代のコントローラ部と互換性があるかどうかは分かりません。

音源部のMCUはSTM32F725IET6で、フラッシュは先代と同じ512KですがSRAMが128Kから564Kに増えています。また、先代と同じく64MbitのDRAMも接続されています。オーディオコーデックとしてはAKM4558が載っています。

また、ボードの下方にはJTAGと5端子のランドが見えます。5端子はST-Link(VDD、SWCLK、GND、SWDIO、NRST)かもしれません。

コントローラ側のボードはTIのMSP430FR2675(あるいは2676?)が使われています。これはマルチタッチ・キーボードを実現するためと思われます。

SDK

NTS-1 mkII向けに、logue SDKも更新されています。NTS-1 mkIIはハードウェアとしてはv1の系列(prologue、NTS-1、minilogue xd)に近いのですが、SDKはv2(drumlogue)のAPIに準じています。

drumlogueのときから導入されたdockerベースの開発環境も使えるようですが、私はローカルでビルドするほうがオーバーヘッドが小さいので好みです。これには専用のgccをダウンロードする必要があります。

ダウンロードは、 logue-sdk/tools/gcc/get_gcc_10_3-2021_10_linux.sh を実行します。ダウンロードに失敗した場合は、このスクリプトを再実行する前に gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2 を削除する必要があります。

オシレータのサンプルとしては、Wavesのソースコードが用意されています。

API

基本的にはv2を踏襲しています。drumlogueとの主な差分としては

・パラメータ数(drumlogueは24個)はオシレータとMod FXは最大10個、ディレイとリバーブは最大11個で、最初の2つがNTS-1 mkIIのノブAとノブBに割り当てられる(2024/4/6追記:付属サンプルで試したところ、増えたパラメータはOSCとDelayでは使えましたが、Modは2つ、Revは3つしかパラメータが使えませんでした。)
・音源部はオシレータ(旧logue SDKと同様。drumlogueのようにシンセサイザを実装する必要はない)
・ユニットサイズは最大48KB(旧logue SDKは32KB、drumlogueは32MB)
・ビットマップ型のパラメータ(k_unit_param_type_bitmaps)は使えない
・プリセットがない(drumlogueはシンセユニットでプリセットが利用可能)
・サンプルデータは使えない(drumlogueはサンプル再生が可能)

といったところが目につきました。パラメータ数は、従来の「Shape+ALT+6パラメータ」が「10パラメータで、1番目はShape、2番目はALT」になったので、実質、使えるパラメータが2つ増えたことになります。また、drumlogue同様、パラメータの値として文字列を表示させられるようになりました。

ユニットサイズが32KB→48KBと、1.5倍になったのは嬉しいところです。ウエーブテーブルを使いやすくなりました。

ビットマップ、プリセット、サンプルデータあたりはハードウェアの違いもあり、使えないのは仕方ないですね。しかし本当はエフェクタにはプリセットが使えると良いと思います。なお、KORGが提供しているライブラリアンソフトでプログラム(オシレータやフィルタなどすべての設定値のセット)のセーブ、ロード、管理は可能です。

Audio Inからの信号のオシレータでの利用

冒頭の開発者インタビュー記事で、

本体の信号をオーディオインでモジュレーションできるようにしました。だから、たとえば従来のNTS-1を持っている人がその出力をNTS-1 mkIIに突っ込むことでモジュレータとして使うことが可能になりました。

という記載があります。実際、NTS-1 mkIIに最初から入っているSAW/TRI/SQRの各オシレータでは「Input Mode」で「OFF/FM/AM/RING」の変調モードを選択でき、「Input Level」でレベルを指定してオシレータに変調をかけることができます。

これに関して、APIのドキュメントにはあまり具体的な記載は無いのですが、drumlogueのAPIでは

__unit_callback void unit_render(const float * in, float * out, uint32_t frames) : オーディオレンダリングのコールバックです. シンセユニットは引数 in を無視する必要があります.

という記載があるところ、NTS-1 mkIIのAPIではこの記載がありません。ですので、renderで渡される入力バッファには、オーディオインの信号のサンプリングデータが渡されるのではないかと思います。頑張ればボコーダーとかも実装できるかもしれませんね。

互換性・移植性

開発したコードはNTS-1とのバイナリレベルでの互換性はありません。ファイルのフォーマットが全く異なっていますので、コンバートも難しいでしょう。NTS-1用のソースコードをmkII用に移植してビルドする必要があります。

ただし、機能の分け方自体は新旧logue SDKでそれほど違いはないので、並行して開発する分にはそれほどの手間はかからないと思われます。v1で用意されていた固定小数点やバイクアッドフィルタなどのライブラリも利用可能です。内容はほぼ同一のようです。

 tree common
common
├── attributes.h
├── dsp
│   ├── biquad.hpp
│   ├── delayline.hpp
│   └── simplelfo.hpp
├── fx_api.h
├── macros.h
├── osc_api.h
├── runtime.h
├── _unit_base.c
├── unit_delfx.h
├── unit.h
├── unit_modfx.h
├── unit_osc.h
├── unit_revfx.h
└── utils
    ├── buffer_ops.h
    ├── cortexm.h
    ├── fixed_math.h
    ├── float_math.h
    └── int_math.h

さて、気になるのはこの新しいNTS-1と、まだ発売されていないNTS-3、さらにその先はあるのか? という点です。

prologueやminilogue xdのmk IIは出るのか? という期待が膨らみますが、一方でそれが仮に発売されたとして、おそらく従来機種との互換性は無く、現状のlogue SDKの資産を利用することは難しそうです。

とはいえ、NTS-1 mkIIやNTS-3だけで終わるということもビジネス的には考えづらいのですよね。2万円の機器では、1万台売っても2億円の売り上げにしかなりませんので。ここは何か、KORGさんに考えがあることを期待したいところです。

コメント