JUCE 備忘録

この記事は↓の22日のやつです。
 
昨日はこれ
 
明日(今日)はこれ
 
 
JUCEについてはこちらを読んでください。
 
最近仕事でJUCEを使う機会があって、それから色々C++の勉強ついでに書いてます。
で、今回はこのJUCEを使ってボイチェンまがいのことしてみようかなぁとか適当に思ってアドカレの枠取ったんですが。。。
そのあたりから仕事が暗黒面に落ち始めて平日家に帰ると疲れきってついマイクラを無限にやってしまう生活続けていたら準備する暇がありませんでした。
他に記事ネタもないので、なんか無いかなぁとか色々考えて、Tips的なものを備忘録ついでに書くかぁとなりました。
なおこの記事はJUCEについてある程度知っている人向けです。
また、今のところAudioPluginでしかコード書いてないのでそれ以外の動作についてはサポートしません。
ただ、JUCEハンズオンの記事にはAudioPluginで初期から定義されている細かいクラスの動作など載ってなかったのでそこも含めて解説します。
 
 
準備
JUCEの入れ方などはハンズオンの記事見てください。
今回のTips関係の解説するにあたって以下の状態に持っていってくださいな
  1. ProjucerでFile→new Project選択(Ctrl+Nでも可)
  2. Audio Plug-In選択
  3. Project Name、Project Folder、TargetPlatformsなどを設定してCreate...を選択
  4. 作ったProject画面で左上のプロジェクト名歯車マークをクリック
  5. Plugin Formatsを確認、Standaloneが選択されていることを確認
  6. Selected exporterでIDEを選択
  7. File→Save Project and Open in IDEを選択(IDEのマークでも可)
 
 
AudioPluginについて
AudioPluginはその名の通りDAWに使えるプラグイン作成を行えるプロジェクト設定になります。
VSTAU、AAX、Unityなど対応しております。
また、Standaloneにした場合、単体で動くアプリができます。
 
AudioPluginのクラス構成について
AudioPluginでProjectを作った場合、以下の4ファイルが自動で作成されます。
・PluginProcessor.cpp
・PluginProcessor.h
・PluginEditor.cpp
・PluginEditor.h
それぞれのcpp/hの組み合わせに、
[Project名]Processorクラス(以下Processorクラス)
[Editor名]ProcessorEditorクラス(以下Editorクラス)
が作成されます。
 
クラス内の主な関数について解説

Processorクラス

コンストラク
inputバス、outputバス設定などの設定を行えます。
prepareToPlay
音声再生前に一度は必ず呼び出される関数、ホスト側のsample数、sampling rate、チャネル設定など変えた場合呼び出されます。
processBlock
オーディオスレッドにて再生中に毎フレーム叩かれる関数、引数のAudioBuffer<float>型の変数内に毎フレーム入力された音声データが格納されます。
ここで最重要なのは、processBlockにて取得できるAudioBuffer<float>内の音声データのサンプル数は一定であることを保証されていないということです。
よって、サンプル数に依存しない処理を書く必要があります。
isBusesLayoutSupported
バスのチャネル制限設定を行うことができます。
createEditor
エディタクラスを生成します。
エディタクラスはPluginEditor.hにて定義しているものです。
ちなみにEditorクラスは引数にあるようにProcessorクラスを見ることができますが、ProcessorクラスからはEditorクラスを見ることができません。
つまりProcessorからGUIに対してなにか行いたい場合は間接的なオブジェクトを経る必要があります。
getStateInfomation
プリセットデータ保存を行える関数です。
大体のDAWプラグインごとにpresetデータの保存を行うことができ、その際に叩かれる関数になります。
setStateInformation
プリセットデータ読み込みを行える関数です。
 

Editorクラス

コンストラク
Processorクラスの取得、GUI画面のサイズ設定などを行えます。
paint
GUI画面が描画される際に呼び出される関数です。
線や点の描画、フォント設定、色設定など描画に関することの処理を行うことができます。
resized
GUI画面サイズが変更された際に呼び出される関数です。
GUIにてスライダコンポーネントなど位置調整処理などを行うことができます。
 
↓からTips備忘録
 

リアルタイム録音

File
juceにおけるファイルの取り扱いをするクラス
OutputStream
juceにおけるstreamのbaseクラス
もちろんInputStreamも存在しております。
streamに対して書き込みを行う際にフォーマットを指定、エンディアンの指定などを行うことができます。
基本的にFileOutputStreamをよく使います。
 
AudioFormatWriter
音声フォーマットに関するクラス
こちらを使うことで音声形式ファイルに対してstreamを経てデータを送ることができます。
以下のクラスにて説明する関数にて作成することができます。
 
WavAudioFormat
wavフォーマットでファイル書き出すを行う際に利用するクラスになります。
こちらのクラス内のcreateWriterFor関数にOutputStreamやファイルクラスオブジェクトを渡すことでAudioFormatWriterクラスを作ることができます。
ここで注意するのが、createWriterFor関数にて作成されたAudioFormatWriterクラスは、渡したOutputStreamオブジェクトを自動で開放してくれるということです。
うっかりdelete処理を書いてしまうと2重deleteが発生して死にます。
 
これらを用いることでリアルタイム録音処理を簡単に行うことができます.
後日処理関係追記します。
 
 

AlertWindow

これ単体ではアラートウィンドウを制御するクラスでしか無いですが、こちら内部のstaticクラスであるshowMessageBox系の関数は好きなタイミングでアラートウィンドウを呼べます。
つまりGUI側を見ることができないProcessorクラスにてエラー処理を行う際にわざわざ各エラー情報をGUIに渡す、などの処理を行わずともこちらにてエラー情報をユーザーに渡すことができます。
エラー処理系で便利なものになります。
 
 
DEBUG
JUCEフレームワークではデフォルトで何故かDEBUGというマクロを奪っています。
動作を確認したところ「DEBUGビルド時にのみ定義されるマクロ」みたいなので、
デバッグビルド時の処理分けとして使えるようにしているみたいです。
これ、自分用に作ってた場合、JUCEが優先されるため、うまくいかなる時があります。
デバッグ動作のようなものを作る場合、別のマクロを定義したほうがいいです。
(フレームワーク側で割と使われそうなマクロ定義すんなカス) 
 
DBG
デバッグビルドの話をしたついでにこちらの備忘録も
DBGは「デバッグビルド時にのみ動作する標準出力」になります。
デバッグ時に動作中の変数の数値の確認などを行いたい場合に使えます。
 
やっべ、Tips思い出せない。。。
明日コード見て色々思い出して追記しよ。。。