JUCEのリファレンスメモ ~オーディオファイル読み込み編~


##はじめに
この記事は自分用のメモとして書かれているので、不定期に更新されるかもしれません。

## ファイルへのアクセスに関わるクラス
### AudioFormatManagerクラス
[参照元：AudioFormatManager Class Reference](https://docs.juce.com/master/classAudioFormatManager.html)

#### 1.　概要
使用可能なオーディオ形式をリストとして持ち、**ある特定のファイルを開くために使用する形式を決定する役割**を持つクラス。つまり、Wavファイル等のオーディオファイルにアクセスする際に、土台として必要になる物だと考えられる。

このクラスの存在から、JUCEにおいてはファイルの形式ごとに、データをプログラム内で扱う方式が変えており、それを設定する際にAudioManagerクラスが必要になると考察できる。中身はブラックボックス化しているので、おそらく設定の仕方を知っていれば十分だと思う

#### 2. 例
```cpp
juce::AudioFormatManager formatManager;    //インスタンス化
formatManager.registerBasicFormats();      //基本的には、WavとAIFF形式がリストに追加されるものと考えればよい
/*juce::AudioFormatManager::registerFormat(AudioFormat*, bool)といった、フォーマットを指定する書き方もある*/
```

#### 3. 注意するべき点
このクラスは、あくまで使用するフォーマットごとのデータ処理の行い方を定めるだけで、これ単体ではファイルへのアクセスを行う事が出来ない点


### MemoryInputStreamクラス
[参照元：MemoryInputStream Class Reference]
(https://docs.juce.com/master/classMemoryInputStream.html)
#### 1. 概要
データのブロックにストリームとしてアクセス可能とするためのクラス。予めバイナリとしてJUCE上に登録したファイルを読み込む際に用いられたりする。

#### 2. 例
```cpp
//BinaryData::sine_wavは予めバイナリデータとして登録したもの
//第一引数：読み込むバイナリデータ　第二引数：データブロックのバイト数　第三引数：trueだとコピーを渡す、falseだとそのままポインタを渡すので別の場所でデータ変更を行うとヤバイ
MemoryInputStream* inputStream = new MemoryInputStream(BinaryData::sine_wav, BinaryData::sine_wavSize, true);
```

### FileChooserクラス
[参照元：FileChooser Class Reference]
(https://docs.juce.com/master/classFileChooser.html)

#### 1. 概要
ロードや保存を行うファイルやディレクトリを選択するためのダイアログボックスを作成するクラス

#### 2. 例
```cpp
FileChooser chooser("Please select the audio file you want to load...", File(), formatManager.getWildcardForAllFormats());
```

#### 3. 引数の意味と設定
デフォルト引数を持つコンストラクタが用意されており、第一引数のみでも宣言可能となっているが、第六引数まで設定可能となっており、それぞれ以下の様になる。


第一引数：**const String型の参照**を渡す。ダイアログのタイトルを入れる。

第二引数：**const File型の参照**を渡す。ダイアログボックスが開いた時に表示するファイルやディレクトリを指定する。デフォルトではFile()が与えられており、File()を格納した場合にはデフォルトのディレクトリが開く。

第三引数：**const String型の参照**を渡す。ワイルドカードの指定をする事ができ、各パターンは「"\*.jpg;\*.gif"」の様にコンマやセミコロンで区切った文字列として渡す。空文字がデフォルトで渡されており、空文字の場合は全てのファイルが許可される。

第四引数：**bool型の値**を渡す。trueであれば、ネイティブダイアログボックスを出力し、falseの場合はJUCEベースのダイアログを出力する。デフォルトはtrue。

第五引数：**bool型の値**を渡す。trueであればOS X(MacのOS)で呼び出された際にパッケージ内のファイルを選択できる様にする。デフォルトはfalse

第六引数：**Component型のポインタ**を渡す。FileChooserの親となるオプションのコンポーネントを渡す。デフォルトのnullptrを渡すとFileChooserがトップレベルのウィンドウとなる。iOSでは、トップレベルのウィンドウがそもそも禁止されてるため、このパラメータを設定する必要が出る。

### Fileクラス
[参照元：File Class Reference](https://docs.juce.com/master/classFile.html)

#### 1.概要

ローカルファイルやディレクトリを表現するクラス。

#### 2.例
```cpp
File file("C:\\Users\\***\\Documents\\sample.txt");
```

#### 3.補足
ファイルを生成する関数等必要な機能は充実しているので、ファイルにまつわる操作を行いたい場合はこのクラスを用いるのが正しいと思う

### AudioFormatReaderクラス
[参照元:AudioFormatReader Class Reference]
(https://docs.juce.com/master/classAudioFormatReader.html)

#### 1.概要
オーディオファイルストリームを読み取って、読み込みに用いるデータを管理するクラス

#### 2.例

```cpp
//FieChooserでダイアログから選択したファイルを読み込む
File file(chooser.getResult());
//AudioFormatManagerクラスで定めたフォーマットのFileクラスのインスタンスを読み込み用のデータとして共通的な表現で実体化を行う。定めたフォーマットで開けなければnullptrを返す
AudioFormatReader* reader = formatManager.createReaderFor(file);
```

```cpp
//予め用意してあるバイナリデータから入力ストリームを獲得
MemoryInputStream* inputStream = new MemoryInputStream(BinaryData::sine_wav, BinaryData::sine_wavSize, true);
//入力ストリームから読み込み用のクラスの実体を生成する。渡されるストリームは全てのフォーマットに再配置可能となる必要性がある。もし登録されたフォーマットのいずれもストリームを解析できなければnullptrを返す
AudioFormatReader* reader = formatManager.createReaderFor(inputStream);
```

```cpp
//読み込みの例(AudioFormatReader& readerを受け取っていると仮定した場合)
numChannels = reader.numChannels;          //readerからチャンネル数を読み取る
sampleRate = reader.sampleRate;            //readerからサンプルレートを獲得
lengthInSamples = reader.lengthInSamples;  //readerからサンプルの長さを獲得
//readerから獲得する具体的なデータを格納するバッファを準備する
AudioBuffer<float> buffer;
buffer.setSize((int)numChannels, (int)lengthInSamples);
//readerからデータを獲得し、バッファに入れる
reader.read(&buffer,                    //バッファへの参照
        0,                              //バッファの開始地点
        (int)reader.lengthInSamples,    //読み込む長さ
        0,                              //readerの開始地点の指定
        true,                           //左耳用のチャンネルを読み込むかどうかのフラグ
        true);                          //右耳用のチャンネルを読み込むかどうかのフラグ
```