JUCEハンズオン2021 〜JUCEをはじめよう〜

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

# はじめに

本記事は過去に投稿した[JUCE ハンズオン 〜JUCEをはじめよう〜](https://qiita.com/COx2/items/12a48c4a30c49732dcc5)の改訂版になります。
過去の記事をベースに、2021年時点での情報を記載しております。
そのため、過去の記事と内容が重複する箇所があることをあらかじめご了承ください。

# 対象とするバージョン

+ JUCE 6.1.2
+ Visual Studio 2019
+ Xcode 13
+ CMake 3.15以上
+ Git 2.0以上

# JUCEについて

JUCE (Jules' Utility Class Extensions)は、C++言語によるマルチメディア系アプリケーションの開発を支援するフレームワークです。
JUCEフレームワークは次の要素によって構成されます。

+ JUCEライブラリ：C++言語で記述されたクロスプラットフォーム設計のライブラリ
+ Projucer：JUCE専用のプロジェクトジェネレータ、ソースファイルやビルド設定等を管理し、各種IDE(VisualStudio, Xcode, Makefile)向けにプロジェクトファイルを出力する
+ CMakeモジュール：JUCEライブラリをCMakeプロジェクトにインテグレーションするためのモジュールであり、Projucerと同等の機能（リソースのバイナリ化等）も提供する

上記ライブラリ、プロジェクトジェネレータを利用してプロジェクトを構築し、各プラットフォーム用のC++開発環境でビルドすることで、ワンソースからWindows, macOS, Linux, iOS, Android で動作するアプリケーションを作成することができます。
[公式サイト](https://juce.com/)

## JUCEの特徴

JUCEの最大の特徴として、オーディオプラグインを開発するためのテンプレートが充実していることが挙げられます。VST/AudioUnit/AAX/RTASプラグインといった、DTMユーザーにはお馴染みとなっているプラグインフォーマットをワンソースから開発することができことから、日本国内外で多くの採用事例があります。
[公式サイトによる採用事例の紹介](https://juce.com/discover/made-with-juce)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/9e39d653-242e-69a2-3a92-182489a3d5ca.png)



## JUCEライブラリ と Projucer

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

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


## JUCEライブラリ と CMake

2020年にリリースされたJUCE 6から、ビルドマネジメントツール『CMake』のサポートが追加されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/8d99a4ab-1834-b508-cd44-81feec04ad1d.png)

『CMake』とは、主にC言語、C++言語などC系言語のビルドにおけるクロスプラットフォームビルド環境を提供するビルドマネジメントツールの一つです。様々なプロジェクトに採用されており、大きなエコシステムを形成しています。

https://cmake.org/

JUCEがCMakeをサポートすることで以下のメリットを得ることができるようになりました。

+ ビルド設定をCMake用のフォーマットで記述することができる
+ CMakeのエコシステムの恩恵を受けることができる
+ CMakeが独自に提供する機能を利用することができる
+ CMakeに対応した他のライブラリとのインテグレーションが容易になる
+ Projucerの使い方を習得する必要がなくなる

![JUCE_CMake.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/401bcab6-d787-d93f-955d-61d641eb005c.png)


## JUCEモジュール一覧

JUCEライブラリは、モジュールという単位で機能別にAPIが別れており、オーディオデバイスとの接続を処理するモジュールや、オーディオプラグインフォーマットの定義を持つモジュール、オーディオファイルを読み込む機能を持つモジュール、OSC（Open Sound Control）の機能を抽象化したモジュールなどが含まれています。

以下がJUCEライブラリのモジュール一覧です。(JUCE 6.1.2時点)

|モジュール名|提供する機能|
|:------|:-----------------------|
| 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_box2d | 	Box2D物理エンジンといくつかのユーティリティクラス |
| juce_core	 | JUCEモジュールの基盤となる基本クラスやAPIを含む必須セット、コアモジュール |
| juce_cryptography | RSA、Blowfish、MD5、SHAなどのさまざまな基本暗号化機能を持つクラス |
| juce_data_structures | variantなデータ型を提供する、アンドゥ/リドゥなどを管理する、スマートなデータ構造を操作するクラス |
| 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モジュール（3rd party JUCE module）を構築することが可能です。

## ライセンスについて

ライセンスの詳細は公式サイトのEULAをご参照ください。[公式: JUCE6 EULA](https://juce.com/juce-6-licence)
JUCEには複数のライセンスオプションが用意されており、ユーザーの事情に応じて選択することができます。

■ライセンスオプション一覧

+ Personal
+ Indie
+ Pro
+ Education
+ GPL v3

特筆すべき点として、無料で利用することができるPersonalライセンスとGPL v3ライセンスが設定されています。
ただし、Personalライセンスを利用するには、以下の条件を満たす必要があります。

+ 起動時のスプラッシュスクリーンを表示することに同意すること。
+ アプリケーションの利用情報を送信することに同意すること。 
+ 年間の収入または資本金額が$50k未満であること。

上記の利用条件を満たさない場合には、JUCE 6 End User License Agreement の 1.8.に記載されている通り、有償ライセンスを購入する若しくはGPLライセンスが適用される点には注意しておいた方がいいでしょう。
プロジェクト自体をオープンソースにすることでコミュニティの支援を受けたい、教育目的でソースコードを開示したいなど、GPLv3を選択することが好ましい場合もあるので、開発目的に合わせてライセンスを選択すると良いでしょう。


| ライセンスタイプ| JUCE Personal| JUCE Indie| JUCE Pro| Education| GPL v3|
|:------|:------|:------|:------|:------|:------|
|スプラッシュスクリーン           | “made with JUCE” 表示必須| 非表示可| 非表示可| “made with JUCE” 表示必須|-|
|年間の収入または資本金額の限度   | $50k | $500k  | - | - |-|
|サブスクリプション最低契約期間   | -    | 1ヵ月  | 1ヵ月 | - |-|
|サブスクリプションライセンス料金 | -    | $40/月 | $130/月 | - |-|
|永続ライセンス料金              | -     | $800  | $2,600 | - |-| 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/051a6c63-9d6b-ec6b-c18e-58169eed641f.png)


## JUCEライブラリはオープンソース

JUCEはGitHub上のGitリポジトリで開発が行われており、ソースコードも全て開示されています。IssueやPull requestを送ることで不具合報告や機能改善の要望、修正の提案などのプロジェクトに貢献することができます。また、developブランチをチェックアウトすることで、将来的に実装される機能を試すこともできます。

[Gitリポジトリ: juce-framework/JUCE](https://github.com/juce-framework/JUCE)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/332d0139-b804-862b-4b9d-b987cfa9e971.png)


# JUCEをはじめよう[Projucer版]

ここでは、Projucerを使用する方法でJUCE DemoRunnerをビルドするまでの手順について示します。

## 開発環境のセットアップ

JUCEを使用したC++プロジェクトを実行可能なプログラムにコンパイルするには、C++言語の開発環境（コンパイラ、ビルドツール等）をセットアップする必要があります。

+ Windows
    + Visual Studio 2019をインストールする
        + IDE本体をインストールする
        + C++開発環境を追加インストールする
+ macOS
    + Xcodeをインストールする
        + AppStoreまたはDeveloper Programから入手してください

## JUCEを入手する

JUCEを入手するには、大きく2つの方法があります。

+ 公式サイトからダウンロード
+ GitHub上のGitリポジトリをクローン

上記のうち、入門者には『公式サイトからダウンロード』する方法をお勧めします。
『GitHub上のGitリポジトリをクローン』する方法では、Projucerを開発環境でセルフビルドする手間がかかります。


### A. 公式サイトからダウンロード

#### JUCE公式サイトのダウンロードページにアクセス

URL: https://www.juce.com/get-juce


#### サイト内の[Download]をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/84f69886-2d78-d571-c42a-1ca739a38355.png)


#### プラットフォームごとに用意されたリンクからダウンロードします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/2902f271-651d-bf54-9fad-65063af2634b.png)



#### プラットフォーム用にビルド済みのProjucerが同梱されています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/b95065f6-ec1d-f996-2313-8c898ccd50e3.png)


---

### B. GitHub上のGitリポジトリをクローン

#### Gitリポジトリをローカル環境にクローンする

```bash

$ git clone https://github.com/juce-framework/JUCE.git

```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/93566/d2720865-1b88-0ba1-a00c-f7fda00d30a5.png)


#### Projucerをセルフビルドする

以下のディレクトリに置かれたIDE向けプロジェクトから Projucer をセルフビルドしてください。
ディレクトリ: JUCE/extras/Projucer/Builds/(プラットフォームまたはIDE名)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/6d3cfa3b-c83a-a4cb-e157-0a4617a3c3a3.png)


## Projucerのセットアップ
ここでは、Projucerからアプリケーションプロジェクトを作成するまでのセットアップの手順について示します。

### Projucerを起動する

初回起動時には、プロジェクト制作画面が表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/fc9a3d61-e368-4d51-dd01-78362f6cacee.png)


### Licenseのセッティング

※Personal版で使用する場合はアカウントの作成は不要です

1. Projucerを起動する
2. [File]→[Sign in...]メニューをクリックしてダイアログを開く
3. アカウントを持っていない場合、[Create an account]をクリックして遷移したWebサイトにてJUCEアカウントを作成する
4. JUCEアカウントを入力してサインインする
5. Webサイト上で購入したJUCEライセンス（Indie, Pro）は、サインインすることでProjucerに反映されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/8596cf3c-ffa5-55ba-bfc4-dcde027951f5.png)


### JUCEライブラリのPath設定

1. Projucerを起動する
2. [File]→[Global Paths...]メニューをクリックして『Global paths』ダイアログを開く
3. [Path to JUCE]欄にJUCEのルートディレクトリのパスを入力する（入力欄横の[...]をクリックするとファイルダイアログが開きます）
  - 公式サイトからDLした場合はZIPの解凍先ディレクトリ
  - git cloneした場合はリポジトリのルートディレクトリ
4. [JUCE Modules]欄にJUCEディレクトリの直下に置かれた『modules』ディレクトリのパスを入力する

■ Projucerのメニューから[Global Paths...]を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/c51f4d6a-3767-8e53-ba5a-bfc5dbd143aa.png)


↓

■ JUCEのルートディレクトリとmodulesディレクトリを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/a36a807d-b26e-8141-c4a2-df4898c1745b.png)


## JUCE DemoRunnerのビルドと実行

JUCEライブラリのパッケージに含まれているデモアプリケーション『JUCE DemoRunner』をビルドすることができれば、JUCEとProjucerのセットアップは完了です。

1. Projucerのメニューから[File]→[Open Example]→[Launch Demo Runner]をクリック
    - 公式サイトからDLした場合、ビルド済みのDemoRunnerバイナリが同梱されているため、ビルドをスキップしてDemoRunnerが起動する
    - git cloneした場合、DemoRunnerを新規にビルドする必要がある。ProjucerからIDEでプロジェクトを開くかどうか尋ねられるので、それにしたがってプロジェクトを開いてビルドを実行する
2. DemoRunnerの実行ファイルの用意が済んだら、Projucerの[File]→[Open Example]→[Launch Demo Runner]からDemoRunnerを起動する

■ Projucerのメニューから[Launch Demo Runner]を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/6d511f8a-8a49-3089-551c-acc76e9e6151.png)

↓ ビルド実行後に起動 or ビルド不要の場合はそのまま起動

■ JUCE DemoRunner
DemoRunnerのブラウジングメニューから様々なデモプログラムを起動してみましょう。
各デモプログラムからJUCEライブラリのリファレンス実装を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/de56f770-a883-964b-6e65-8a91da6e94c3.png)


# JUCEをはじめよう[CMake版]

ここでは、CMakeを使用してJUCE DemoRunnerをビルドするまでの手順について示します。
本記事では、CMakeの使い方およびAPI仕様についての詳細は解説しない点についてご了承ください。

## 開発環境のセットアップ

JUCEを使用したC++プロジェクトを実行可能なプログラムにコンパイルするには、C++言語の開発環境（コンパイラ、ビルドツール等）をセットアップする必要があります。

+ Windows
    + Visual Studio 2019をインストールする
        + IDE本体をインストールする
        + C++開発環境を追加インストールする
    + CMakeをインストールする
        + ダウンロードページから入手してインストールする [公式サイト](https://cmake.org/download/)
        + CMakeのパスを環境変数に追加する
+ macOS
    + Xcodeをインストールする
        + AppStoreまたはDeveloper Programから入手してください
    + CMakeをインストールする
        + Homebrewまたはダウンロードページから入手してインストールする [公式サイト](https://cmake.org/download/)
        + CMakeのパスを環境変数に追加する

## JUCEを入手する

この項目はProjucer版の説明と共通です。

+ 公式サイトからダウンロード
+ GitHub上のGitリポジトリをクローン

## JUCE DemoRunnerのビルドと実行

### Windows - Visual Studio 2019 の場合

コマンドプロンプトから以下のコマンドを実行してJUCE DemoRunnerをビルドします

```bat
REM JUCEディレクトリに移動する
cd (JUCEディレクトリの置かれた場所)/JUCE

REM CMakeのconfigureとgenerateを実行する
REM この時カレントディレクトリ直下に"build"ディレクトリを作成する
cmake -G "Visual Studio 16 2019" -B build -DJUCE_BUILD_EXAMPLES=ON

REM "build"ディレクトリ内に生成されたDemoRunnerプロジェクトのビルドを実行する
cmake --build build --target DemoRunner
```

`JUCE/build/examples/DemoRunner/DemoRunner_artefacts/Debug`ディレクトリに実行ファイル`DemoRunner.exe`が生成されます。この実行ファイルを起動すると、JUCE DemoRunnerが立ち上がります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/b158a933-4424-acd3-a4db-d19dc11d082c.png)


### macOS - Xcode の場合

ターミナルから以下のコマンドを実行してJUCE DemoRunnerをビルドします

```bash
# JUCEディレクトリに移動する
$ cd (JUCEディレクトリの置かれた場所)/JUCE

# CMakeのconfigureとgenerateを実行する
# この時カレントディレクトリ直下に"build"ディレクトリを作成する
$ cmake -G Xcode -B build -DJUCE_BUILD_EXAMPLES=ON

# "build"ディレクトリ内に生成されたDemoRunnerプロジェクトのビルドを実行する
$ cmake --build build --target DemoRunner
```

`JUCE/build/examples/DemoRunner/DemoRunner_artefacts/Debug`ディレクトリに実行ファイル`DemoRunner.app`が生成されます。この実行ファイルを起動すると、JUCE DemoRunnerが立ち上がります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/8b9cf240-f4a5-9948-8a08-0ec2a23ba01f.png)


# JUCEでHello Sinewave!

JUCEアプリケーションの開発環境が整ったら、簡単なアプリケーションを作成してみましょう。
今回は、サイン波を鳴らす処理を実装するオーディオプログラミング版 Hello world! を作成します。

## プロジェクト作成からコード編集まで [Projucer版]

### 新規プロジェクトを作成する

 Projucerを起動したら、[File]→[New Project...]をクリックして、新規プロジェクト作成画面を表示します。
今回は [Application]→[Audio] テンプレートを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/fab43e09-ceab-716f-0ace-b6138961492c.png)


新規プロジェクト作成画面の[Exporters]の項目を確認します。ターゲットとするプラットフォームに合わせてチェックを入れます。

+ macOSでの開発なら、Xcodeにチェックを入れます。
+ Windowsでの開発なら、VisualStudioにチェックを入れます（2019, 2017, 2015をサポート）。
+ Linuxでの開発なら、Linux Makefileにチェックを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/5e2da7e4-3bed-e908-4a9a-99e316dd2dd3.png)

新規プロジェクト作成画面の[Create Project]ボタンをクリックします。プロジェクトの保存先を選択するダイアログが開くので、保存先を選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/1021b91a-fb49-da1e-2fdd-5102ada8922b.png)


新規プロジェクトを作成すると、"Main.cpp","MainComponent.h","MainComponent.cpp"の3つのソースファイルが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/23699116-eda8-b076-4e23-3457c510d3d2.png)


### プロジェクトの保存とIDEを開く

Projucerで新規プロジェクトの保存と、IDE（VisualStudio、Xcode）でプロジェクトを開きます。
1. Projucer上部のコンボボックスから、起動したいIDEを選択します。
2. IDEのアイコンが表示されているボタンをクリックします。
3. プロジェクトの保存とIDEの起動が行われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/e6accae8-606a-8c2d-74c4-4ed732ad051d.png)


## プロジェクト作成からコード編集まで [CMake版]

CMakeを使用してJUCEアプリケーションを作る場合、ソースファイルの作成や、ビルド設定の記述をCMakeLists.txtに記述していく作業を開発者自身で行う必要があります。
そのため、Projucerでプロジェクトを新規作成する場合と比べると、プロジェクトの最小の構成を組み上げるまでの手順が増えることになります。
本記事ではその手順については割愛し、私が作成した最小構成のCMake向けテンプレートを使用して説明をしていきます。

### 筆者作成のテンプレートを git clone する

筆者が作成したオーディオアプリケーションのテンプレートを以下のGitリポジトリに配置しました。
コマンドプロンプトやターミナルから次のコマンドを実行して、GitリポジトリのクローンとGitサブモジュールの初期化を実行してください。
[Gitリポジトリ: juce_hands-on_2021.git](https://github.com/COx2/juce_hands-on_2021.git)

```bash
# Gitリポジトリのクローンと併せて内部のGitサブモジュールもクローンする
$ git clone --recursive https://github.com/COx2/juce_hands-on_2021.git
```

### プロジェクトのファイル構成について

このテンプレートは以下のファイル構成になっています。
`Source`ディレクトリに置かれたソースコードは、Projucer版の項目で説明したものと同一のファイルとなっています。

```
juce_hands-on_2021/
　├ External/
  │  └ JUCE/  # Gitサブモジュールとして取り込んだJUCEリポジトリ
　├ Source/   # プロジェクトのソースコードを配置するディレクトリ
  │  ├ Main.cpp
  │  ├ MainComponent.h
  │  └ MainComponent.cpp
　├ CMakeLists.txt  # CMakeで実行するビルド設定を記述するテキストファイル
　└ LICENSE
```

上記のファイルのうち、`CMakeLists.txt`は以下の記述となっています。
CMakeのプロジェクトからJUCEライブラリを取り込むことで、JUCEライブラリ内に含まれるCMakeモジュールが読み込まれ、JUCE CMake APIが使えるようになります。
JUCE CMake APIについては `JUCE/docs/CMake API.md` にドキュメントが用意されています。

```cmake
# CMakeの最低バージョンを特定する
cmake_minimum_required(VERSION 3.15)

# C++に関するオプション設定
enable_language(CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# プロジェクト名を決定する
project(NewProject VERSION 1.0.0)

# JUCEライブラリの場所を特定する
# JUCEライブラリ内に含まれるCMakeモジュールが読み込まれ、JUCE CMake APIが使えるようになる
add_subdirectory(External/JUCE)

# GUIアプリケーション版のJUCEプロジェクトを追加する
# プロジェクト名は"NewProject"にする
juce_add_gui_app(NewProject
    PRODUCT_NAME "NewProject")

# "NewProject"のソース上で"#include <JuceHeader.h>"によるJUCEライブラリのインクルードを可能にする
juce_generate_juce_header(NewProject)

# "NewProject"にC++ソースファイルを追加する
target_sources(NewProject
    PRIVATE
        Source/Main.cpp
        Source/MainComponent.h
        Source/MainComponent.cpp)

# "NewProject"に適用するコンパイル定義を設定する
target_compile_definitions(NewProject
    PRIVATE
        JUCE_APPLICATION_NAME_STRING="$<TARGET_PROPERTY:NewProject,JUCE_PRODUCT_NAME>"
        JUCE_APPLICATION_VERSION_STRING="$<TARGET_PROPERTY:NewProject,JUCE_VERSION>")

# "NewProject"にリンクするライブラリを決定する
target_link_libraries(NewProject
    PRIVATE
        juce::juce_audio_utils
    PUBLIC
        juce::juce_recommended_config_flags
        juce::juce_recommended_lto_flags
        juce::juce_recommended_warning_flags)
```

### CMakeのconfigureとgenerateを実行する

コマンドプロンプトやターミナルから次のコマンドを実行すると、CMakeのconfigureとgenerateが実行され、IDE用のプロジェクトが生成されます。
なお、`CMake --build`コマンドを実行することでコマンドラインからビルドを実行することもできます。

#### Windows - Visual Studio 2019 の場合

```bat
REM リポジトリのディレクトリに移動する
cd (リポジトリが置かれた場所)/juce_hands-on_2021

REM CMakeのconfigureとgenerateを実行する
REM この時カレントディレクトリ直下に"build"ディレクトリを作成する
cmake -G "Visual Studio 16 2019" -B build

REM "build"ディレクトリ内に生成されたプロジェクトのビルドを実行する
cmake --build build
```

#### macOS - Xcode の場合

```bash
# リポジトリのディレクトリに移動する
$ cd (リポジトリが置かれた場所)/juce_hands-on_2021

# CMakeのconfigureとgenerateを実行する
# この時カレントディレクトリ直下に"build"ディレクトリを作成する
$ cmake -G Xcode -B build

# "build"ディレクトリ内に生成されたプロジェクトのビルドを実行する
$ cmake --build build
```

### IDEでプロジェクトを開く

CMakeのconfigureとgenerateを実行すると、`juce_hands-on_2021/build`ディレクトリにIDE向けのプロジェクトファイルが生成されます。プロジェクトファイルをIDEで開くことで、IDE上でソーコードの編集を始めることができます。


## サイン波を鳴らすプログラムを実装する

プロジェクト内のソースコードを編集して、サイン波を鳴らす処理を実装してみましょう。
`MainComponent.cpp`にある関数`void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) override`の内部実装を以下のように編集します。

```cpp
#include "MainComponent.h"

~~~中略~~~

void MainComponent::getNextAudioBlock (const juce::AudioSourceChannelInfo& bufferToFill)
{
    bufferToFill.clearActiveBufferRegion();

    const float level = 0.5f;

    auto* buffer = bufferToFill.buffer;
    for (int channel = 0; channel < buffer->getNumChannels(); channel++)
    {
        float* channelData = buffer->getWritePointer(channel);

        for (int sample = 0; sample < buffer->getNumSamples(); sample++)
        {
            channelData[sample] = std::sin(juce::MathConstants<float>::twoPi * sample / buffer->getNumSamples() * 2) * level;
        }
    }
}
~~~中略~~~

```


このソースコードを記述すると、オーディオバッファを更新する度に、オーディオバッファ全体でサイン波一周分（360°=2π）を書き込む処理が実行されます。

![スライド3.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/bba31b9b-fcf7-eba4-b37f-0b5c9821fd36.png)



## ビルドと動作確認

上記のソースコードを記述したら、ビルドを実行します。
ビルドが成功したらアプリケーションを起動してみましょう。
アプリケーションを起動すると、ウインドウが表示されるとともに、オーディオデバイスとの連携が正常にできていれば、サイン波が鳴っているのが聞こえるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/0dc09e02-dc70-4c92-0e81-03fcecf797ab.png)


### トラブルシューティング：音が鳴らない場合

プログラムからオーディオデバイスを正常に取り扱えていない可能性があります。
以下の記事を参考にオーディオデバイス設定の編集を試してみてください。

https://qiita.com/COx2/items/c9e87059d349aa8ff707


# JUCEのことをもっと知りたくなったら


## ドキュメントを読んでみよう

JUCEライブラリには沢山のAPIが用意されています。JUCE APIを理解することが快適なアプリケーション開発への近道と言えるでしょう。

・API:モジュール
https://docs.juce.com/master/modules.html

・API:クラスリファレンス
https://docs.juce.com/master/index.html


公式サイトには入門者向けのチュートリアルが提供されています。チュートリアルを一通り試してみると、JUCE APIで何ができるのかを確認することができるでしょう。

・チュートリアル
https://juce.com/learn/tutorials


## フォーラムサイトを覗いてみよう

公式でフォーラムサイトを提供しています。
ユーザーからの疑問・質問にJUCEのメンテナが回答してくれたり、ユーザー間で知見の共有が行われています。

・JUCEフォーラム
https://forum.juce.com/


# JUCEを利用したオープンソースプロジェクト

JUCEを利用したオープンソースなプロジェクトを紹介します。
様々なプロジェクトのソースコードから、JUCE APIの使い方やJUCEならではの実装テクニックについても触れることができるでしょう。

## Synister

GitHubリポジトリ：https://github.com/the-synister/the-source

全部入りなVAシンセサイザ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/93566/06aecdc4-4758-8b07-7b5f-b2cf4903a1a0.png)


## dexed

GitHubリポジトリ：http://github.com/asb2m10/dexed

DX7/TX7をエミュレートしたFMシンセサイザ
DX7/TX7のSysExメッセージにも対応

![image.png](https://qiita-image-store.s3.amazonaws.com/0/93566/713918e2-c620-14bb-f643-23acf5a39727.png)


## Vital

GitHubリポジトリ：https://github.com/mtytel/vital

リッチなグラフィック表現を搭載したウェーブテーブルシンセサイザ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/0eaff160-82c2-8274-ff37-0add2746a32d.png)


## OB-Xd

GitHubリポジトリ：https://github.com/reales/OB-Xd

Oberheim OB-Xをエミュレート＆モディファイしたVAシンセサイザ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/efbfb035-3778-e080-85c8-16c9fbfc9e9c.png)


## OS-251

GitHubリポジトリ：https://github.com/utokusa/OS-251

GUIの実装に[react-juce](https://github.com/nick-thompson/react-juce)※を採用したVAシンセサイザ
※react-juce: 3rd party製のJUCEモジュール. GUIのフロントエンドの実装をReact.jsによって記述することができる.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/8c1a4b30-436a-d04a-41f8-dc4c18f90fcf.png)


## tracktion_engine

GitHubリポジトリ：https://github.com/Tracktion/tracktion_engine

Tracktion社のDAW『Waveform』で使用されている、DAWの音楽演奏・再生などを司るエンジン部分
JUCEを利用して開発されており、ライセンスを取得してオリジナルのDAWを自作することができる
[こちら](https://qiita.com/atsushieno/items/ac88a544f3625e96aa52)の解説記事が参考になります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93566/045ab3bc-0cba-8abc-c5a4-c4c289ad8d41.png)