下記ディレクトリに minilogue xd synthesizer で使用できる自作オシレーターやエフェクトのビルドに必要なファイルが全て揃っています.
SDK version 1.1-0 でビルドされた user units (ビルド済みのカスタムコードバイナリ)を実行するためには, version 2.00以降のファームウェアが製品本体にインストールされている必要があります.
- inc/ : ヘッダファイル
- dummy-osc/ : 自作オシレーターのテンプレートプロジェクト
- dummy-modfx/ : 自作モジュレーション・エフェクトのテンプレートプロジェクト
- dummy-delfx/ : 自作ディレイ・エフェクトのテンプレートプロジェクト
- dummy-revfx/ : 自作リバーブ・エフェクトのテンプレートプロジェクト
- waves/ : デモオシレータープロジェクト
- このリポジトリをクローンし, 初期化とサブモジュールのアップデートを行います.
$ git clone https://github.com/korginc/logue-sdk.git
$ cd logue-sdk
$ git submodule update --init
- 必要なツールチェーンをインストールします: GNU Arm Embedded Toolchain
- その他のユーティリティをインストールします:
Docker-based Build Environment をご参照ください.
Waves はlogue-sdkのオシレーターAPIで提供されているウェーブテーブルを使用したモーフィング・ウェーブテーブル・オシレーターです. APIの機能やパラメーターの使い方を学ぶ上で良いリファレンスになるでしょう. ソースコードや詳細は waves/ を見て下さい.
- プロジェクトのディレクトリに移動します.
$ cd logue-sdk/platform/minilogue-xd/waves/
- プロジェクをビルドするために
make
を実行します.
$ make
Compiler Options
<path>/logue-sdk/tools/gcc/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gcc -c -mcpu=cortex-m4 -mthumb -mno-thumb-interwork -DTHUMB_NO_INTERWORKING -DTHUMB_PRESENT -g -Os -mlittle-endian -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant -fcheck-new -std=c11 -mstructure-size-boundary=8 -W -Wall -Wextra -Wa,-alms=<path>/logue-sdk/platform/minilogue-xd/waves/build/lst/ -DSTM32F401xC -DCORTEX_USE_FPU=TRUE -DARM_MATH_CM4 -D__FPU_PRESENT -I. -I<path>/logue-sdk/platform/minilogue-xd/waves/inc -I<path>/logue-sdk/platform/minilogue-xd/waves/inc/api -I<path>/logue-sdk/platform/minilogue-xd/inc -I<path>/logue-sdk/platform/minilogue-xd/inc/dsp -I<path>/logue-sdk/platform/minilogue-xd/inc/utils -I<path>/logue-sdk/platform/minilogue-xd/../ext/CMSIS/CMSIS/Include
Compiling _unit.c
Compiling waves.cpp
Linking <path>/logue-sdk/platform/minilogue-xd/waves/build/waves.elf
Creating <path>/logue-sdk/platform/minilogue-xd/waves/build/waves.hex
Creating <path>/logue-sdk/platform/minilogue-xd/waves/build/waves.bin
Creating <path>/logue-sdk/platform/minilogue-xd/waves/build/waves.dmp
text data bss dec hex filename
2040 4 144 2188 88c <path>/logue-sdk/platform/minilogue-xd/waves/build/waves.elf
Creating <path>/logue-sdk/platform/minilogue-xd/waves/build/waves.list
Done
- 最終パッケージファイル (.mnlgxdunit)を作成するために
make install
を実行します.
$ make install
Packaging to <path>/logue-sdk/platform/minilogue-xd/waves/build/waves.mnlgxdunit
Deploying to <path>/logue-sdk/platform/minilogue-xd/waves/waves.mnlgxdunit
Done
- .mnlgxdunit ファイルが生成されます. これがビルド成果物となります.
- docker/run_interactive.sh を実行します.
$ docker/run_interactive.sh
user@logue-sdk $
1.1. (オプション) ビルド可能なプロジェクトを表示したい場合は下記コマンドを実行します.
user@logue-sdk:~$ build -l --minilogue-xd
- minilogue-xd/dummy-delfx
- minilogue-xd/dummy-modfx
- minilogue-xd/dummy-osc
- minilogue-xd/dummy-revfx
- minilogue-xd/waves
- ビルドしたいプロジェクトのパスを指定し, ビルドコマンドを実行します (下記は
minilogue-xd/waves
をビルドする例です).
user@logue-sdk:~$ build minilogue-xd/waves
>> Initializing minilogue-xd development environment.
Note: run 'env -r' to reset the environment
>> Building /workspace/minilogue-xd/waves
Compiler Options
/usr/bin/arm-none-eabi-gcc -c -mcpu=cortex-m4 -mthumb -mno-thumb-interwork -DTHUMB_NO_INTERWORKING -DTHUMB_PRESENT -g -Os -mlittle-endian -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant -fcheck-new -std=c11 -mstructure-size-boundary=8 -W -Wall -Wextra -Wa,-alms=/workspace/minilogue-xd/waves/build/lst/ -DSTM32F401xC -DCORTEX_USE_FPU=TRUE -DARM_MATH_CM4 -D__FPU_PRESENT -I. -I/workspace/minilogue-xd/waves/inc -I/workspace/minilogue-xd/waves/inc/api -I/workspace/minilogue-xd/inc -I/workspace/minilogue-xd/inc/dsp -I/workspace/minilogue-xd/inc/utils -I/workspace/ext/CMSIS/CMSIS/Include
Compiling _unit.c
Compiling waves.cpp
cc1: warning: option '-mstructure-size-boundary' is deprecated
Linking /workspace/minilogue-xd/waves/build/waves.elf
Creating /workspace/minilogue-xd/waves/build/waves.hex
Creating /workspace/minilogue-xd/waves/build/waves.bin
Creating /workspace/minilogue-xd/waves/build/waves.dmp
Creating /workspace/minilogue-xd/waves/build/waves.list
text data bss dec hex filename
2032 4 144 2180 884 /workspace/minilogue-xd/waves/build/waves.elf
Done
>> Installing /workspace/minilogue-xd/waves
Packaging to /workspace/minilogue-xd/waves/build/waves.mnlgxdunit
Deploying to /workspace/minilogue-xd/waves/waves.mnlgxdunit
Done
>> Resetting environment
>> Cleaning up minilogue-xd development environment.
.mnlgxdunit ファイルは自作コンテンツのバイナリデータ本体とメタデータを含む簡潔なパッケージファイルです. このファイルは logue-cli utility もしくは Librarian application 経由で minilogue xd にアップロードすることが出来ます.
-
作成したいコンテンツ(osc/modfx/delfx/revfx)のテンプレートプロジェクトをコピーし, 好きな名前に変更して下さい.
-
Makefile の先頭にある PLATFORMDIR 変数が platform/ ディレクトリを指していることを確認してください. このパスは外部依存ファイルや必要なツールを参照するのに用いられます.
-
project.mk に好きなプロジェクト名を入力して下さい. 構文についての詳細は project.mk のセクションを参照して下さい.
-
プロジェクトにソースファイルを追加した際は, project.mk* ファイルを編集し, ビルドの際にソースファイルが発見できるようにする必要があります.
-
manifest.json ファイルを編集し, 適切なメタデータをプロジェクトに追加します. 構文についての詳細は manifest.json のセクションを参照して下さい.
manifestファイルはjsonフォーマットで下記の例のように書きます.
{
"header" :
{
"platform" : "minilogue-xd",
"module" : "osc",
"api" : "1.1-0",
"dev_id" : 0,
"prg_id" : 0,
"version" : "1.0-0",
"name" : "waves",
"num_param" : 6,
"params" : [
["Wave A", 0, 45, ""],
["Wave B", 0, 43, ""],
["Sub Wave", 0, 15, ""],
["Sub Mix", 0, 100, "%"],
["Ring Mix", 0, 100, "%"],
["Bit Crush", 0, 100, "%"]
]
}
}
- platform (string) : プラットフォームの名前. minilogue-xd に設定します.
- module (string) : モジュールの名前, osc, modfx, delfx, revfx のいずれかに設定して下さい.
- api (string) : 使用している API バージョン. (フォーマット: MAJOR.MINOR-PATCH)
- dev_id (int) : デベロッパーID. 現在は未使用, 0に設定します.
- prg_id (int) : プログラムID. 現在は未使用, リファレンスとして設定しても構いません.
- version (string) : プログラムのバージョン. (フォーマット: MAJOR.MINOR-PATCH)
- name (string) : プログラムの名前. (本体のディスプレイに表示されます.)
- num_params (int) : エディットメニューで操作可能なパラメーターの数. osc のプロジェクトの時のみ使用し, エフェクトのプロジェクトでは0に設定します. オシレーターは最大6個のパラメーターを持つことが出来ます.
- params (array) : パラメーターの詳細. osc のプロジェクトにのみ有効です. オシレーター以外の場合はempty array([])にする必要があります.
パラメーターの詳細は下記のフォーマットで, 4個の要素を持つ配列として定義されています.
- name (string) : 最大10文字がエディットメニューで表示できます
- minimum value (int) : -100, 100 の間に設定します.
- maximum value (int) : -100, 100 の間に設定し, なおかつ minimum value より大きな値に設定します.
- type (string) : "%" を入れると百分率の値として扱われ, "" にすると型無しの値として扱われます.
型無しの値に設定した場合, minimum value と maximum value は正の値に設定する必要があります. また表示される値は1オフセットされます.(0-9は1-10として表示されます.)
このファイルはカスタムを簡単にするためにメインのMakefileに含まれています.
下記の変数が宣言されています:
- PROJECT : プロジェクト名. ビルドされたプロジェクトのファイルネームになります.
- UCSRC : Cのソースファイル.
- UCXXSRC : C++のソースファイル.
- UINCDIR : ヘッダーの検索パス.
- UDEFS : カスタムgccの定義フラグ.
- ULIB : リンカライブライブラリのフラグ.
- ULIBDIR : リンカライブラリの検索パス.
この tests/ ディレクトリにはオシレーターやエフェクトの書き方の説明したシンプルなテストコードがあります. 有用なコンテンツではありませんが、環境のテスト等を行う際に参照して下さい.
logue SDK での「unit」作成にあたり, 中心となるAPIの概要を説明します.
主要な機能のソースファイルには userosc.h をインクルードし, 下記の関数を含む必要があります.
-
void OSC_INIT(uint32_t platform, uint32_t api)
: オシレーターのインスタンス化の際に呼ばれます. このコールバック関数を使用して必要な初期化処理を行います. -
void OSC_CYCLE(const user_osc_param_t * const params, int32_t *yn, const uint32_t frames)
: ここで実際の波形が計算されます. この関数は frames サンプルで必ず呼ばれます(フレーム毎に1サンプル). サンプルは yn バッファーに書き込む必要があります. 出力されるサンプルはQ31 固定小数点フォーマット にする必要があります.Note:
inc/utils/fixed_math.h
で定義されているf32_to_q31(f)
マクロを使うことで, 浮動小数点数をQ31フォーマットに変換できます.user_osc_param_t
の定義についてはinc/userosc.h
も参照して下さい.Note: 最大64フレームまでのバッファサイズをサポートする必要があります. 必要な場合はより小さいバッファーで複数の処理を実行することができます. (2のべき乗で最適化してください : 16, 32, 64)
-
void OSC_NOTEON(const user_osc_param_t * const params)
: ノート・オン時に呼ばれます. -
void OSC_NOTEOFF(const user_osc_param_t * const params)
: ノート・オフ時に呼ばれます. -
void OSC_PARAM(uint16_t index, uint16_t value)
: パラメーター変更時に呼ばれます.
より詳細な情報については Oscillator Instance API reference を参照してください. また, Oscillator Runtime API, Arithmetic Utilities , Common DSP Utilities も役に立ちます.
主要な機能のソースファイルには usermodfx.h をインクルードし, 下記の関数を含む必要があります.
-
void MODFX_INIT(uint32_t platform, uint32_t api)
: エフェクトのインスタンス化の際に呼ばれます. このコールバック関数を使用して必要な初期化処理を行います. APIについての詳細はinc/userprg.h
を参照して下さい. -
void MODFX_PROCESS(const float *main_xn, float *main_yn, const float *sub_xn, float *sub_yn, uint32_t frames)
: ここでは入力サンプルを処理します. この関数は frames サンプルで必ず呼ばれます(フレーム毎に1サンプル). *_xn は入力バッファ, *_yn は出力バッファとなり, ここで処理結果を書き込みます。Note: prologueの2ティンバーをサポートするために、main_とsub_の入力と出力のバージョンがあります. prologueではmainとsubの両方に同じ方法で並列に処理する必要があります. マルチティンバーでないプラットフォームでは sub_xn , sub_yn は無視できます.
Note: 最大64フレームまでのバッファサイズをサポートする必要があります. 必要な場合はより小さいバッファーで複数の処理を実行することができます. (2のべき乗で最適化してください : 16, 32, 64)
-
void MODFX_PARAM(uint8_t index, uint32_t value)
: パラメーター変更時に呼ばれます.
より詳細な情報については Modulation Effect Instance API reference 参照してください. また, Effects Runtime API, Arithmetic Utilities, Common DSP Utilities も役に立ちます.
主要な機能のソースファイルには userdelfx.h をインクルードし, 下記の関数を含む必要があります.
-
void DELFX_INIT(uint32_t platform, uint32_t api)
: エフェクトのインスタンス化の際に呼ばれます. このコールバック関数を使用して必要な初期化処理を行います. -
void DELFX_PROCESS(float *xn, uint32_t frames)
: ここでは入力サンプルを処理します. この関数は frames サンプルで必ず呼ばれます(フレーム毎に1サンプル). この場合, xn は入力と出力バッファーの両方になります. 結果はDryとWetを適切な割合で合わせて書き込む必要があります. (例: shift-depthパラメーターで設定する)Note: 最大64フレームまでのバッファサイズをサポートする必要があります. 必要な場合はより小さいバッファーで複数の処理を実行することができます. (2のべき乗で最適化してください : 16, 32, 64)
-
void DELFX_PARAM(uint8_t index, uint32_t value)
: パラメーター変更時に呼ばれます.
より詳細な情報については Delay Effect Instance API reference を参照してください. また Effects Runtime API, Arithmetic Utilities , Common DSP Utilities も役に立ちます.
主要な機能のソースファイルには userrevfx.h をインクルードし, 下記の関数を含む必要があります.
-
void REVFX_INIT(uint32_t platform, uint32_t api)
: エフェクトのインスタンス化の際に呼ばれます. このコールバック関数を使用して必要な初期化処理を行います. -
void REVFX_PROCESS(float *xn, uint32_t frames)
: ここでは入力サンプルを処理します. この関数は frames サンプルで必ず呼ばれます(フレーム毎に1サンプル). この場合, xn は入力と出力バッファーの両方になります. 結果はDryとWetを適切な割合で合わせて書き込む必要があります. (例: shift-depthパラメーターで設定する)Note: 最大64フレームまでのバッファサイズをサポートする必要があります. 必要な場合はより小さいバッファーで複数の処理を実行することができます. (2のべき乗で最適化してください : 16, 32, 64)
-
void REVFX_PARAM(uint8_t index, uint32_t value)
: パラメーター変更時に呼ばれます.
より詳細な情報については Reverb Effect Instance API reference を参照してください. また. Effects Runtime API, Arithmetic Utilities , Common DSP Utilities も役に立ちます.
Web Assembly(Emscripten) のビルドと Web Audio Player がalpha/wasm-builds branchにあります. これはまだ実験的な機能で、正しく動作しない可能性があります.
CMSIS submodule の初期化とアップデートが行われていない可能性があります.
git submodule update --init
を実行して下さい。