logue SDK のサンプルコードを macOS 上でコンパイルして KORG NTS-1 で動かすまで

# 表記について

KORG が公開した [logue SDK](https://www.korg.com/jp/products/synthesizers/prologue/sdk.php#download) ですが、[prologue SDK](https://www.korg.com/jp/products/synthesizers/prologue/sdk.php#download), [logue-sdk](https://github.com/korginc/logue-sdk) など表記が様々です。ひとまずここでは "logue SDK" を採用します。

# 環境
- Software
 - macOS 10.15
 - git version 2.21.0 (Apple Git-122.2)
- Hardwre
 - [KORG NTS-1 digital kit](https://www.korg.com/jp/products/dj/nts_1/index.php)

# logue SDK のセットアップ
SDK のセットアップは [NuTekt NTS-1 digital SDK Source and Template Projects](https://github.com/korginc/logue-sdk/tree/master/platform/nutekt-digital) で説明されているステップそのままですが、最初に作業用のディレクトリを掘っておくのが良いでしょう。

### ディレクトリの作成
```shell
 $ cd ~
 $ mkdir -p dev/logue-sdk
 $ cd dev/logue-sdk
```

### logue SDK のセットアップ
```shell
 $ git clone https://github.com/korginc/logue-sdk.git
 $ cd logue-sdk
 $ git submodule update --init
```

# コンパイル環境のセットアップ
logue SDK を使ったコードのコンパイルに使用するコンパイラをセットアップします。macOS 標準の開発環境 Xcode との関係性は詳しく調べてはいませんが、logue SDK のコンパイル環境を構成するファイル群は作業ディレクトリ以下にインストールされるようなので、Xcode とのコンフリクトはなさそうに見えます。少なくとも手元の環境では特に問題なく Xcode 共存できています。

```shell
 $ cd logue-sdk/tools/gcc
 $ ./get_gcc_osx.sh
```

# サンプルコード（オシレータ）のビルド
環境が整えば make 一発でサンプルコードをビルドできます。 `logue-sdk/platform/nutekt-digital/demos/waves` 以下にカスタムオシレータのサンプルコードがあるのでこれをビルドしてみます。

```shell
 $ cd logue-sdk/platform/nutekt-digital/demos/waves
 $ make
```
エラーが出なければ、カレントディレクトリに `waves.ntkdigunit` が出来上がっているはずです。

# ライブラリ管理用 CLI ツールのセットアップ
ビルドしたオシレータを NTS-1 の実機で動かすには、出来上がった `waves.ntkdigunit` を MIDI 経由で本体に転送する必要があります。モジュールの管理や転送を行うための [GUI のライブラリ管理ツール](https://www.korg.com/jp/products/dj/nts_1/librarian_contents.php#part1)も提供されていますが、SDK にはコマンドラインツールも同梱されています。make でビルドしたりしていると、GUI よりもコマンドラインのほうが楽なケースもあるので、ここではコマンドラインツールをセットアップして使ってみます。

```shell
 $ cd logue-sdk/tools/logue-cli
 $ ./get_logue_cli_osx.sh
```

### NTS-1 を接続して CLI で叩いてみる
NTS-1 を USB ケーブルで接続してから、先程セットアップした `logue-cli` を以下のように叩いてみます。

```shell
$ cd logue-cli-osx-0.07-2b

# NTS-1 実機の情報
$ ./logue-cli probe
> Device: nutekt digital
> System version: 1.02
> Logue API version: 1.01-0
> Available modules:

Modulation FX: [ slot_count: 16, max_payload_size: 8180, max_load_size: 6144 ]
Delay FX: [ slot_count: 8, max_payload_size: 16368, max_load_size: 12288 ]
Reverb FX: [ slot_count: 8, max_payload_size: 16368, max_load_size: 12288 ]
Oscillator: [ slot_count: 16, max_payload_size: 36848, max_load_size: 32768 ]

# NTS-1 実機上のオシレータの情報
$ ./logue-cli probe -m osc
> Device: nutekt digital
> System version: 1.02
> Logue API version: 1.01-0
> Oscillator status:
[0]: "waves" v1.00-0 api:1.00-0 did:00000000 uid:00000000
# これ以下 Qiita では何故か空行として表示されますが実際は [1]: free. - [15]:free が表示されます。
[1]: free.
[2]: free.
[3]: free.
[4]: free.
[5]: free.
[6]: free.
[7]: free.
[8]: free.
[9]: free.
[10]: free.
[11]: free.
[12]: free.
[13]: free.
[14]: free.
[15]: free.
```

# サンプルオシレータを NTS-1 に転送する
先程コンパイルした `waves.ntkdigunit` を転送してみます。`-s` は転送先のスロット番号を示します。

```shell
$ ./logue-cli load -u ../relative/path/to/waves.ntkdigunit -s 1
> Parsing nutekt digital unit archive
> Parsing manifest
> Parsing unit binary payload
> Handshaking...
> Target platform: "nutekt digital"
> Target module: "Oscillator"
size: c84 crc32: ae821cd5

$ ./logue-cli probe -m osc
> Device: nutekt digital
> System version: 1.02
> Logue API version: 1.01-0
> Oscillator status:
[0]: "waves" v1.00-0 api:1.00-0 did:00000000 uid:00000000
[1]: "waves" v1.00-1 api:1.01-0 did:00000000 uid:00000000
# これ以下 Qiita では何故か空行として表示されますが実際は [2]: free. - [15]:free が表示されます。
[2]: free.
[3]: free.
[4]: free.
[5]: free.
[6]: free.
[7]: free.
[8]: free.
[9]: free.
[10]: free.
[11]: free.
[12]: free.
[13]: free.
[14]: free.
[15]: free.
```

# 鳴らしてみる
NTS-1 を OSC モードにして TYPE ノブを右目いっぱいに回すと、転送したカスタムオシレータ waves が選択されます。デフォルトでスロット0に入っているオシレータと同名なので分かりづらいですね。これを選択した状態で NTS-1 のリボンコントローラを触るとカスタムオシレータが呼ばれ、生成された音がスピーカから鳴ります。

# まとめ
ここまでで logue SDK の開発環境を macOS 上に構築し、サンプルコードをビルドしてそれを NTS-1 実機で動かすことができました。次はオシレータの中身をいじりたいところですが、色々と暗黙の前提があるようで、サンプルコードを読むだけでも意外とすんなりとはいかないようです。