JUCEでASIO対応アプリケーションを作る

JUCEの公式チュートリアルでもあまり触れられていませんが、JUCEの機能を使うことで、ASIOドライバ対応のアプリケーションを簡単に作ることができます。
本記事では、ASIO対応アプリケーションの作成におけるチュートリアルとしてサンプルプロジェクト”Plugin Host”をASIOに対応させる作業を紹介します。
新規プロジェクトから作成したアプリケーションをASIO対応させるまでの作業については後日投稿予定です。

■本記事の概要

1. ASIO SDKをダウンロードする
2. ASIO SDKのzipファイルを解凍する
3. Projucerでサンプルプロジェクト”Plugin Host”のjucerファイルを開く
4. [Modules] → [juce_audio_devices] → [JUCE_ASIO]を “Enabled”にする
5. [Exporters] → [Header Search paths]にASIO SDKのパスを入力する
6. プロジェクトを保存し、IDE (Visual Studio)でビルドする
7. ビルドしたアプリケーションを起動し、オーディオ設定パネルを開く
8. オーディオドライバ一覧から”ASIO”を選択する
9. ASIO対応デバイスのオーディオ入出力を設定する

■ASIOとは?


出典:https://www.steinberg.net/en/company/technologies.html
ASIO(Audio Stream Input Output)は、低遅延、高同期性、高いスループットを特徴とする、オーディオデバイスのドライバインタフェースです。
Windowsにも予めオーディオドライバ(DirectSound、WASAPI)は存在しますが、ASIOはそれよりもレイテンシー(データ送信から音声が出力されるまでの遅延時間)を低く抑えることができるので、例えばMIDI入力を受けてから実際に音が耳に届くまでの時間はOS標準のドライバよりも圧倒的に短くすることができます。
ASIOではマシンの処理速度が許す限りはあらゆるチャンネル数の入出力、標本化周波数、量子化ビット数のデータを扱うことができるので、マルチチャンネルシステムの構築を実現することができます。
つまり、DAWやハイレゾオーディオプレーヤーに代表されるASIO対応のアプリケーションの土台部分を簡単に作ることができます。そう、JUCEなら。

 


1.ASIO SDKをダウンロードする

Steinbergの開発者向けページからダウンロードすることができます。
URL:https://www.steinberg.net/en/company/developers.html

 


2.zipファイルを解凍する

ASIO SDKをダウンロードしたら、zipファイルを解凍しておきましょう。
本記事では、”C:/SDKs/Steinberg SDK/ASIOSDK2.3″に解凍しておきます。
ASIO SDKにはソースコード、サンプルプロジェクト、ドキュメントが含まれています。

 


3.Projucerでプロジェクトを開く

本記事では、JUCEフレームワークに付属されたサンプルプロジェクト”Plugin Host”を事例に、ASIOに対応させる手順を紹介します。
このサンプルプロジェクトは、DAWのようにオーディオデバイスからの音声入力・出力やMIDI入出力を行うことができるアプリケーションです。また、VSTプラグインをロードすることができるので、オーディオ入力にエフェクトを掛けたり、MIDI入力からプラグインを操作することができます。

◆今回使用するサンプルプロジェクト”JUCE/examples/audio plugin host”

◆ “Plugin Host.jucer”をProjucerで読み込みます

 


4.JUCEモジュール設定でASIO対応を有効にする

①プロジェクト設定から[Modules]→[juce_audio_devices]を選択します。
②[JUCE_ASIO]を “Enabled”に変更します。

 


5.エクスポート設定でASIO SDKのヘッダーファイルパスを追加する

①[Exporters]から、ビルドを実行するIDEのビルド設定アイテムを選択します。
②[Header Search Paths]欄に、上記(2)の作業で配置したASIO SDKのソースコードへのパスを入力します。
本記事では “C:/SDKs/Steinberg SDK/ASIOSDK2.3/common” を入力しました。
※画像ではReleaseビルドの設定項目にパスを追加していますが、DebugビルドでもASIO対応させたい場合は、同様にDebugビルドの設定項目にパスを追加してください。

 


6.プロジェクトの保存とIDE (Visual Studio)でビルド

Projucerでの作業が完了したら、プロジェクトを保存し、IDE(Visual Studio)でプロジェクトを開きます。
AppConfig.h内の”JUCE_ASIO”定義が有効になっていることと、ASIO SDKのヘッダーファイルが参照されていることが確認できたら、ビルドを実行します。

◆ AppConfig.h

◆ ASIO SDKへの参照

 


7.ビルドしたアプリケーションの起動とASIOの有効化

▼アプリケーションを起動する
ビルドした”Plugin Host.exe”を起動すると、以下のウインドウが表示されます。

▼オーディオデバイス設定パネルを開く
メニュー項目の[Options] → [Change the audio device settings]をクリックまたは、ショートカットキーの[Ctrl + A]から、オーディオデバイス設定パネルを開きます

▼オーディオデバイス設定パネル
オーディオデバイス設定パネルを開いた際に、Windows Audio(WASAPI)で動作している場合の例を以下に示します。

Audio device type オーディオドライバの形式(WASAPI/DirectSound/ASIO)を選択
Output オーディオ出力先の有効/無効
Input オーディオ入力元の有効/無効
[Test]ボタン [Output]デバイスから動作確認用のサイン波を鳴らします
Audio buffer size オーディオデバイスのバッファサイズ(サンプル数/バッファ)
Active MIDI Inputs .MIDI機器ごとの入力の有効/無効
MIDI Output MIDI信号を出力するデバイス・ポートを選択

 

▼オーディオデバイスドライバをASIOに切り替える
[Audio device type]のコンボボックスから”ASIO”を選択します。

▼ASIO対応デバイスの設定を行う
[Device]のコンボボックス、[Control Panel]ボタン、[Reset Device]ボタンが追加されます。
[Device]のコンボボックスにASIO対応のデバイス一覧が表示されるので、使用するオーディオデバイスを選択します。
[Control Panel]ボタンをクリックすると、ASIOデバイス毎に設けられたコントロールパネルが開きます。

▼ASIO対応で低レイテンシーの快適なVSTホストが完成しました。

 

今回はASIO対応アプリケーションを作成するために最低限必要な設定項目を説明するため、サンプルプロジェクトを改造する手順で紹介しました。新規プロジェクトを作成した場合は、これ以外に必要なコードの記述もありますので、別記事にて掲載予定です。

Raspberry Pi でJUCEをビルドする -Raspbian Stretch対応-

2017年8月にRaspbian Stretch がリリースされました。
7月に投稿したレシピからの変更点がありますので、別記事として投稿しました。

レシピ

ROLI社のFabianがJUCE Forumにレシピをポストしてくれました。
ターミナルから以下のコマンドを実行するとビルドします。
※cdコマンドのディレクトリは各自の環境に合わせて入力してください。

// JUCEリポジトリをクローン
$ git clone https://github.com/WeAreROLI/JUCE.git

// 依存パッケージをインストール
$ sudo apt-get install clang freeglut3-dev g++ libasound2-dev libcurl4-openssl-dev libfreetype6-dev libjack-jackd2-dev libx11-dev libxcomposite-dev libxcursor-dev libxinerama-dev libxrandr-dev mesa-common-dev webkit2gtk-4.0 ladspa-sdk

// 作業ディレクトリに移動
$ cd JUCE/extras/Projucer/Builds/LinuxMakefile

// GCCでコンパイルする場合
$ make CXX=g++ -j4

// LLVM-Clangでコンパイルする場合
$ make CXX=clang++ "TARGET_ARCH=-march=armv7-a" -j4

 

1.準備

まずはJUCEをダウンロードしましょう。公式ダウンロードサイト、Windows/macOS/Linuxから選択することができますが、Linux向けを選択すれば良いです。
※Linux用のProjucerが同梱されていますがx86をターゲットにしているため、CPUアーキテクチャが異なるRaspberry Pi (ARM)上では動作しません。Raspberry Pi用のProjucerは上記レシピでビルドすることができます。

GitHubからクローンする場合は、ターミナルを開いて次のコマンドを実行します。

$ git clone https://github.com/WeAreROLI/JUCE.git

 

2.依存パッケージのインストール

$ sudo apt-get install clang freeglut3-dev g++ libasound2-dev libcurl4-openssl-dev libfreetype6-dev libjack-jackd2-dev libx11-dev libxcomposite-dev libxcursor-dev libxinerama-dev libxrandr-dev mesa-common-dev webkit2gtk-4.0 ladspa-sdk

JUCEライブラリのビルドに必要な依存パッケージをインストールします。ついでにLLVM-Clangコンパイラをインストールします。なお、GCCでもコンパイルできることを確認しています。

 

3.作業ディレクトリへの移動

$ cd JUCE/extras/Projucer/Builds/LinuxMakefile

LinuxMakefileが置かれたディレクトリに移動します。
※ディレクトリは各自の環境に合わせて入力してください。
※サンプルプロジェクトの一部に”LinuxMakefile”用プロジェクトが同梱されています。

 

4.コンパイル

4-1.GCCでコンパイルする場合

 $ make CXX=g++ -j4

LinuxMakefileからビルドを実行します。
ビルドモードは”Debug”がデフォルトです。
各種オプションについては以下の通りです。

CXX=g++
LinuxMakefileオプションです。C++コンパイラにg++を使用します

・ -j4
… makeコマンドのオプションです。同時に実行できるジョブの数(並行処理の数)を指定します。必須ではありませんが、CPUのコア数を有効利用できます。

※Raspbian Jessieの場合は、こちらのバグに当たるためアーキテクチャをコマンドから指定する必要がありましたが、Raspbian Stretchでは解消されたようです。

4-2.LLVM-Clangでコンパイルする場合

$ make CXX=clang++ "TARGET_ARCH=-march=armv7-a" -j4

LinuxMakefileからビルドを実行します。
ビルドモードは”Debug”がデフォルトです。
各種オプションについては以下の通りです。

CXX=clang++
LinuxMakefileオプションです。C++コンパイラにclang++を使用します

“TARGET_ARCH=-march=armv7-a”
… LinuxMakefileオプションです。ターゲットアーキテクチャを明示的に指定します
※Raspbian Jessieでは不要でしたが、Raspbian Stretchでは指定が必要なようです。

・ -j4
… makeコマンドのオプションです。同時に実行できるジョブの数(並行処理の数)を指定します。必須ではありませんが、Raspberry Piのコア数を有効利用できます。

 

5.補足:Releaseビルド時のコマンド

// GCCでコンパイルする場合
$ make CXX=g++ -j4 CONFIG=Release

// LLVM-Clangでコンパイルする場合
$ make CXX=clang++ "TARGET_ARCH=-march=armv7-a" -j4 CONFIG=Release

・CONFIG=Release
… LinuxMakefileオプションです。”Release”モードでビルドします。

筆者にて動作確認した環境

◆ハードウェア
・Raspberry Pi 3 Model B

◆OS
・Raspbian Stretch (Debian 9系)

◆JUCE バージョン
・JUCE 5.3.2

Raspberry Pi でJUCEをビルドする -Raspbian Jessie対応-

Raspberry Pi (Raspbian)でJUCEのプロジェクトをビルドしたので、レシピを紹介します。

同梱のVSTプラグイン/ ホストのサンプルプロジェクトをビルドしました。
PCと遜色なく快適に動きますし、MIDI入出力、音声入出力が可能なので、省電力なVSTシンセサイザ/エフェクトとして使用することができます。

レシピ

ROLI社のFabianがJUCE Forumにレシピをポストしてくれました。
ターミナルから以下のコマンドを実行するとビルドします。
※cdコマンドのディレクトリは各自の環境に合わせて入力してください。

// JUCEリポジトリをクローン 
$ git clone https://github.com/WeAreROLI/JUCE.git 

// 依存パッケージをインストール
$ sudo apt-get install clang freeglut3-dev g++ libasound2-dev libcurl4-openssl-dev libfreetype6-dev libjack-jackd2-dev libx11-dev libxcomposite-dev libxcursor-dev libxinerama-dev libxrandr-dev mesa-common-dev webkit2gtk-4.0 ladspa-sdk

// 作業ディレクトリに移動
$ cd JUCE/extras/Projucer/Builds/LinuxMakefile

// GCCでコンパイルする場合
$ make CXX=g++ "TARGET_ARCH=-march=armv7-a" -j4

// LLVM-Clangでコンパイルする場合
$ make CXX=clang++ -j4

1.準備

先ずはJUCEをダウンロードしましょう。公式ダウンロードサイト、Windows/macOS/Linuxから選択することができますが、Linux向けを選択すれば良いです。
※Linux用のProjucerが同梱されていますがx86をターゲットにしているため、CPUアーキテクチャが異なるRaspberry Pi (ARM)上では動作しません。Raspberry Pi用のProjucerは上記レシピでビルドすることができます。

GitHubからクローンする場合は、ターミナルを開いて次のコマンドを実行します。

$ git clone https://github.com/WeAreROLI/JUCE.git

 

2. 依存パッケージのインストール

$ sudo apt-get install clang freeglut3-dev g++ libasound2-dev libcurl4-openssl-dev libfreetype6-dev libjack-jackd2-dev libx11-dev libxcomposite-dev libxcursor-dev libxinerama-dev libxrandr-dev mesa-common-dev webkit2gtk-4.0 ladspa-sdk

JUCEライブラリのビルドに必要な依存パッケージをインストールします。ついでにLLVM-Clangコンパイラをインストールしています。なお、GCCでもコンパイルできることを確認しています。
※GCCでビルドする場合、こちらのバグに当たってしまうことを確認しています。GCCでビルドする際は”make”コマンドのオプションに “TARGET_ARCH=-march=armv7-a” を追加すると正常にビルドが実行されます。

 

 3.作業ディレクトリへの移動

$ cd JUCE/extras/Projucer/Builds/LinuxMakefile

LinuxMakefileが置かれたディレクトリに移動します。
※ディレクトリは各自の環境に合わせて入力してください。
※サンプルプロジェクトの一部に”LinuxMakefile”用プロジェクトが同梱されています。

 

4. コンパイル

4-1.GCCでコンパイルする場合

 $ make CXX=g++ "TARGET_ARCH=-march=armv7-a" -j4

LinuxMakefileからビルドを実行します。
ビルドモードは”Debug”がデフォルトです。
各種オプションについては以下の通りです。

CXX=g++
LinuxMakefileオプションです。C++コンパイラにg++を使用します

・ -j4
… makeコマンドのオプションです。同時に実行できるジョブの数(並行処理の数)を指定します。必須ではありませんが、CPUのコア数を有効利用できます。

※Raspbian Jessieの場合は、こちらのバグに当たるためアーキテクチャをコマンドから指定する必要があります。Raspbian Stretchでは解消されたようです。

4-2.LLVM-Clangでコンパイルする場合

$ make CXX=clang++ -j4

LinuxMakefileからビルドを実行します。
ビルドモードは”Debug”がデフォルトです。
各種オプションについては以下の通りです。

・CXX=clang++
… LinuxMakefileオプションです。C++コンパイラにclang++を使用します

・ -j4
… makeコマンドのオプションです。同時に実行できるジョブの数(並行処理の数)を指定します。必須ではありませんが、Raspberry Piのコア数を有効利用できます。

 

5.補足:Releaseビルド時のコマンド

// GCCでコンパイルする場合
$ make CXX=g++ -j4 CONFIG=Release

// LLVM-Clangでコンパイルする場合
$ make CXX=clang++ "TARGET_ARCH=-march=armv7-a" -j4 CONFIG=Release

・CONFIG=Release
… LinuxMakefileオプションです。”Release”モードでビルドします。

筆者にて動作確認した環境

◆ハードウェア
・Raspberry Pi 2 Model B
・Raspberry Pi 3 Model B

◆OS
・Raspbian Jessie With Pixel (Debian 8系)

◆JUCE バージョン
・JUCE 5.3.2

JUCE 5 がリリースされました

2017年4月27日、ROLI Ltd.,よりJUCE ver.5 (Huckleberry JUCE)がリリースされました。[引用] 公式サイト

リリースから2週間程経ったこともあり、JUCE ver.4 (Grapefruit JUCE)から大きく変わった点について、一部紹介したいと思います。

  1. ライセンス形態の大幅改定
  2. VST/AUプラグインのスタンドアロンアプリ出力
  3. Bluetooth LEのサポート
  4. [Projucer] JUCE 4 からの変更点
  5. [Projucer] ライブコーディングエンジンについて
  6. スプラッシュスクリーンについて

1. ライセンス形態の大幅改定

JUCE 5ではライセンス形態が大幅に改定されました。詳しくは公式の案内とエンドユーザーライセンスを見ていただければと思います(公式サイト)。そのなかでも、今回新設されたPersonalライセンスについてざっくりと紹介します。

  • JUCE Personal
    • 利用条件
      • 起動時のスプラッシュスクリーン表示が必須
      • 年間の収入または資本金額が$50k未満であること
    • 特徴
      • 無償でクローズドソースソフトウェアに使用できるようになった
      • ライブコーディングエンジンが無償版にも解放された

Personalライセンスは、クローズドソースソフトウェアを配布したい開発者の要望に応えるように設定されたようです。以前から無償利用できるFreeライセンスは存在していましたが、GPLライセンスが適用されるという条件に同意する必要があったため、オープンソースにしたくない場合は有償ライセンスを購入する必要がありました。
ただし、利用条件として、①起動時のスプラッシュスクリーンを表示すること。②年間の収入または資本金額が$50k未満であること。という条件を満たす必要があります。とは言え、極小規模な個人開発者にとっては利用しやすくなったと思います。
なお、利用条件を満たせない場合はどうなるかというと、JUCE 5 End User License Agreement の 1.8.に記載されている通り、有償ライセンスを購入する若しくはGPLライセンスが適用される点には注意しておいた方がいいでしょう。

1,8. Remember, unless you upgrade to JUCE Indie or JUCE Pro, if you exceed the Revenue Limit for JUCE Personal, then your JUCE Personal licence is governed by the GNU License which is an open-source licence and requires, among other things, that you make your source code available and license modified files and larger derived works (including all linked code) under the same terms of the GNU License. Please review the terms of the GNU License carefully.

ライセンスタイプ JUCE Personal JUCE Indie JUCE Pro Education
スプラッシュ
スクリーン
 “made with JUCE”
表示必須
変更可
非表示可
変更可
非表示可
“made with JUCE”
表示必須
年間の収入または資本金額の限度  $50k  $200k  No limit  No limit
 最低契約期間   12ヵ月  12ヵ月  
サブスクリプションライセンス料金 無料 $35/月 $65/月 無料
永続ライセンス料金   $700 $1,300  

 


2.  VST/AUプラグインのスタンドアロンアプリ出力

VST, VST3, AudioUnit, Audio Unit v3, AAX のフォーマットで作成したオーディオプラグインを、スタンドアロンアプリケーションとして出力できるフォーマットが追加されました。
Projucerのプロジェクト設定画面に『Build Standalone Plug-In』という項目が追加されていますので、そちらをチェックして保存をすると、IDE用のプロジェクトファイルにスタンドアロンアプリ用のものが生成されます。簡単ですね。

試しに、JUCE JAPAN vol.2 で制作したパラメトリックイコライザをスタンドアロンアプリ形式でビルドしてみました。
左上の『Options』メニューをクリックすることでオーディオインターフェース、MIDIインターフェースを設定するウインドウが開きます。

私も以前、VSTプラグインをスタンドアロンアプリ化させるために簡易VSTホストのオブジェクトにVSTプラグインをロードするというラッパー的な手法で実装したことはありました。
ですがこれからは、出力フォーマットオプションにチェックを入れるだけでできてしまうんですね。感動です。

 


3. Bluetooth LEのサポート

JUCE 5では、Bluetooth を介したMIDIデバイスとの接続を管理する”BluetoothMidiDevicePairingDialogue”クラスが追加されました。
(公式クラスリファレンス)
公式リファレンスによると、このクラスはBluetooth MIDIペアリングダイアログを開き、近くにあるBluetooth MIDIデバイスを表示して接続することができるようです。このダイアログでは、MIDI以外のBluetoothデバイスは無視されるとのこと。
Bluetooth MIDIデバイスがペアになった後でのみ、JUCEのMidiInputおよびMidiOutputクラスからMIDIポートを使用できます。
現在はモバイルプラットフォーム(iOS/Android)でのみ使用できます。

実際にテストできるサンプルが “JUCE/examples/MidiTest” に収録されています。
モバイルプラットフォームでは、MIDI over Bluetooth LE機能へのアクセスをアプリごとに許可しておく必要がある場合があります。iOSの場合、Xcodeの [capabilities]設定でBluetooth LE機能を許可してから、ビルド・デプロイします。

 

アプリケーションをビルドして起動すると以下の画面が表示されます。

 

画面中央にある[MIDI Bluetooth devices…]ボタンをクリック/タップすると、デバイスとの接続ダイアログが開きます。
ダイアログにはMIDI over Bluetooth LEに対応したデバイスの一覧が表示されます。
接続したMIDIデバイスを選択します。

 

MIDIデバイスが接続できると、MIDI信号の入出力がモニタリングできます。

 

余談ですが、ROLI Ltd., が開発・販売しているモジュラー・ミュージック・スタジオ 『BLOCKS』があります。BLOCKSは、BluetoothによってiPhone/iPadと接続して音源アプリ『NOISE』を利用してサウンドシステムを構成します。
NOISEはJUCEフレームワークで実装されていることから、Bluetooth LEをサポートするようになった経緯もある程度想像できるでしょう。
※”JUCE/examples/BLOCKS” にBLOCKSと連携するためのアプリケーションを開発するためのサンプルコードが収録されていますので、BLOCKSがお手元にある方はぜひ試してみてください。

 


4. [Projucer] JUCE 4 からの変更点

JUCE 5 のリリースに合わせて、ProjucerのGUIが大幅に変更されています。個人的にJUCE 4 から目立つ変化点としては以下の通りです。

  • フラットデザイン化、カラースキンが3種類(Dark/Grey/Light)
  • 【Files】【Modules】【Exporters】ツリーを一括表示
  • 【Config】タブのアイコン化
  • 【Exporter】メニューの一部アイコン化

また、JUCE 5 では新たにVisual Studio 2017のソリューションファイルの出力をサポートしています。代わりに、これまで対応していたVisual Studio 2005~2012のサポートは終了し、出力プラットフォームのリストからは削除されています。

 


5. [Projucer] ライブコーディングエンジンについて

JUCE 4 では商用ライセンスを購入することで使用可能だったライブコーディングエンジンが、JUCE 5 では無償のPersonal版でも使用することができるようになりました。

ライブコーディング機能を有効にすると、Projucerでプロジェクト設定やソースコードに変更を加えた際に即時にビルドが実行されます。ただし、Windows環境ではインクルードでエラーを吐いたり、IDE側で設定が反映されるものについては予め設定しておくなど、多少使い勝手に癖があるので、個人的にまだまだ検証してから実際の開発に利用していきたいですね。


6. スプラッシュスクリーンについて

Personal版では無償利用できる条件として、アプリケーションの起動時、具体的にはGUIを表示すると同時に数秒間 “made with JUCE” と書かれたスプラッシュスクリーンを表示する必要があります。画面右下の表示がそれです。

このスプラッシュスクリーンは約5秒ほど表示した後フェードアウトするように画面から消えていきます。

なお、スプラッシュスクリーンにはJUCE公式サイトへのハイパーリンクが設定されています。
クリックするとブラウザが起動し、JUCE公式サイトが表示されます。

 

スプラッシュスクリーンに関する設定は、Projucerのプロジェクト設定にて行うことができます。Personalライセンスで使用している場合は、表示・非表示の設定を行うことはできません。他にはスプラッシュスクリーンの色を2種類から選択することができます。

glslEditor for VST サンプルコード

MIDI CC入力のサンプルコード

MIDI CC入力を受信していることを確認する実装例です。

varying vec4 destinationColour;
varying vec2 textureCoordOut;

#extension GL_OES_standard_derivatives : enable

uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;
uniform float midiCC[128];
uniform float wave[256];
uniform float spectrum[256];

#define pi 3.1415

void main()
{
    vec2 position = (gl_FragCoord.xy / resolution.xy);
 
    float power = midiCC[position.x * 128];

    float r = position.y * 1.0;
    float g = 1-position.y * 1.0;
    float b = 0.;

    if(position.y < power * 0.01)
    {
        gl_FragColor = vec4(r, g, b, 1.0);
    }
    else
    { 
        gl_FragColor = vec4(0, 0, 0, 0.0);
    }
}