3rd party JUCEモジュールの紹介 -Gin-

本記事は[JUCE Advent Calendar 2020](https://qiita.com/advent-calendar/2020/juce) の12月16日向けに投稿した記事です。

# JUCEって何？

JUCE (Jules' Utility Class Extensions)は、C++言語によるマルチメディア系アプリケーションの開発を支援するフレームワークです。クロスプラットフォーム設計のライブラリと、付属されているプロジェクトジェネレータ『Projucer』から各種IDE(VisualStudio, Xcode, Makefile)向けにプロジェクトファイルを出力することで、ワンソースからWindows, macOS, Linux, iOS, Android で動作するアプリケーションを作成することができます。
[公式サイト](https://juce.com/)

## JUCEライブラリ と Projucer

JUCEフレームワークは、各種機能を提供する『JUCEライブラリ』と、各種プラットフォーム向けのプロジェクトを出力するジェネレータ『Projucer』によって構成されます。
『JUCEライブラリ』には機能別に『モジュール』という単位で構成が分かれており、『Projucer』はプロジェクトに必要なモジュールを取り込んで、IDE用のプロジェクトファイルやビルドスクリプトに紐付ける作業を担当します。

![JUCE_Projucer.png](https://qiita-image-store.s3.amazonaws.com/0/93566/5c54d93e-2345-7ac9-6041-6b82d4731fd9.png)

JUCEライブラリは、機能別に分離されたモジュール群から成り立っています。
オーディオデバイスとの接続を処理するモジュールや、オーディオプラグインフォーマットの定義を持つモジュール、オーディオファイルを読み込む機能を持つモジュール、OSC（Open Sound Control）の機能を抽象化したモジュールなど、モダンなオーディオアプリケーションを実装するのに十分な程の機能を提供します。

|モジュール名|提供する機能|
|:------|:-----------------------|
| juce_analytics | ユーザーの利用情報を収集して送信するクラス |
| juce_audio_basics | オーディオバッファの操作、MIDIメッセージ処理、シンセサイザーなどのクラス |
| juce_audio_devices | オーディオインターフェースおよびMIDIインターフェースの制御や、再生と録音をするクラス |
| juce_audio_formats | 	さまざまなオーディオファイル形式を読み込み・書き込みするクラス |
| juce_audio_plugin_client | VST、VST3、AudioUnit、AAX、RTASプラグインを構築するためのクラス|
| juce_audio_processors | VST、AU、または内部で生成されたオーディオプロセッサのロードおよび再生をするクラス |
| juce_audio_utils | オーディオ関連のGUIおよびその他のタスク（MIDI over BLE含む）を処理するクラス |
| juce_blocks_basics | ROLI BLOCKSデバイスを低レベルで制御するためのJUCEラッパー |
| juce_box2d | 	Box2D物理エンジンといくつかのユーティリティクラス |
| juce_core	 | 他のJUCEモジュールが必要とする基本的な必須セット、コアモジュール |
| juce_cryptography | RSA、Blowfish、MD5、SHAなどのさまざまな基本暗号化機能を持つクラス |
| juce_data_structures | アンドゥ/リドゥなどを管理する、スマートなデータ構造を操作するクラス |
| juce_dsp | オーディオバッファ操作、デジタルオーディオ処理、フィルタリング、オーバーサンプリング、数学関数などを高速に実行するクラス |
| juce_events | アプリケーションのメインイベントループを実行し、メッセージ、タイマーなどを送受信するためのクラス |
| juce_graphics	 | 2Dベクトルグラフィックス、画像読み込み/保存、フォント処理などをするためのクラス |
| juce_gui_basics | 基本的なユーザーインターフェイスを作成するコンポーネントおよび関連するクラス |
| juce_gui_extra | 特別なタスクを処理するためのGUIクラス拡張 |
| juce_opengl | JUCEウィンドウでOpenGLをレンダリングするためのクラス |
| juce_osc	 | OSC(Open Sound Control)を実装したクラス |
| juce_product_unlocking | オンライン製品認証を実装するクラス |
| juce_video	 | ビデオ再生と、カメラ入力をキャプチャするためのクラス |

## カスタムJUCEモジュール

JUCEライブラリを構成するモジュールは、必要があれば自作することもできます。
参考：[JUCEモジュールを作って外部ライブラリを参照する](https://atsushieno.hatenablog.com/entry/2019/12/03/002804)

本記事では、公式以外で提供されているJUCEモジュール（3rd party JUCEモジュール）の1つである、『Gin』について紹介していきます。

# Gin

URL: https://github.com/FigBug/Gin
Author: FigBug
License: BSD 3-Clause
Feature: Image Processing, Networking, File System, Utility, Debugging, etc...

## 特徴
JUCEをベースとしつつ開発者フレンドリーな機能を追加実装している拡張モジュールです。
Ginでは機能別に5つのJUCEモジュールを提供しています。

|モジュール名|提供する機能|
|:------|:-----------------------|
| gin | Ginの基本クラス群。画像処理、ダウンローダ、ValueTreeユーティリティなどの機能を提供する。 |
| gin_dsp | DSP(信号処理）やMIDIを扱うのに特化した機能を提供する。 |
| gin_metadata | EXIFやIPTCなどの画像ファイルフォーマットのメタデータの処理に特化した機能を提供する。 |
| gin_websocket | OAuthやWebSocketなどのネットワーク通信に特化した機能を提供する。 |
| gin_plugin | ADSRのGUIやModulation Matrixなど、オーディオプラグインを開発するのに便利な機能を提供する。 |

## Example

Ginリポジトリの`Gin/examples/Demo`ディレクトリ内にある`Demo.jucer`をProjucerで開くことでDemoプロジェクトの実行ファイルをビルドすることができます。

### Demo

■ Solid Brending
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/c3b5c554-72c8-75aa-a4d3-5f301377cf0a.png)


■ Graident Map
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/46b59938-e8ce-9964-d6d4-3287dc287f30.png)

■ Message Pack
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/65669bf3-6c32-30e5-4722-b9894bdec118.png)

■ Shared Memory
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/a65cbf36-a3ae-efe4-fbc6-158514647e86.png)