JUCEとChat GPTを活用したVSTプラグイン開発
最近何かと話題のChat GPT。私も仕事で大変お世話になっています。
何が凄いかと言うと、従来の直訳したような歪な日本語ではなく、
本当に日本人が答えているのかと思わせるような自然な会話ができるというところがすごい!!
更に、今日の献立考えて!といった話題から、悩み相談に関する回答まで、ありとあらゆる事にも答えてくれます。
あまり口では出せませんが、最近だと米国製品で非常に複雑な機械に対するトラブルシューティングなんかもできてしまう。という事を知り、とても驚いています。
こんなに色々知っているのだから、ひょっとしたらChat GPTはVSTプラグインの開発もできるのではないのか?と思わずにはいられません。
その可能性を探求するために、今回から、アプリ開発ソフト『JUCE』とCHAT GPTを使ってプラグインの作成を試みていきます。
JUCEとは?
JUCEは、オーディオアプリケーションやプラグインの開発に特化したクロスプラットフォームのC++フレームワークです。以下にJUCEの特徴と利点をわかりやすく説明します。
クロスプラットフォームのサポート:
JUCEは、Windows、Mac、Linuxなど、さまざまなオペレーティングシステムで動作するアプリケーションの開発をサポートしています。一度の開発で複数のプラットフォームに対応することができます。ユーザーフレンドリーなGUI設計:
JUCEは、ビジュアルな要素を簡単に作成できる強力なGUI設計ツールキットを提供します。ボタン、スライダー、メーターなどのコントロールを直感的に配置し、魅力的なユーザーインターフェースを作成することができます。高度なオーディオ処理:
JUCEは、オーディオ処理において高いパフォーマンスと柔軟性を提供します。リアルタイムなエフェクト処理、シンセサイザーの作成、MIDI入出力のサポートなど、さまざまなオーディオ関連の機能を簡単に実装することができます。多機能なライブラリ:
JUCEには、グラフィックス処理、ファイル処理、ネットワーキング、データ構造など、さまざまな領域に対応する豊富なライブラリが組み込まれています。これにより、アプリケーションの開発に必要なさまざまな機能を簡単に利用することができます。アクティブなコミュニティとドキュメント:
JUCEは、アクティブな開発者コミュニティが存在し、豊富なドキュメントやチュートリアルが提供されています。これにより、初心者から上級者まで、幅広いレベルの開発者がJUCEを学び、サポートを受けることができます。
JUCEは、その堅牢な設計と豊富な機能セットにより、多くのプロフェッショナルなオーディオアプリケーション開発者に支持されています。オーディオ処理やGUIデザインに特化しており、高度な機能を柔軟に実装することができます。
さらに、JUCEはオープンソースではなく商用ライセンスとなっており、商業製品の開発にも利用することができます。商用利用においても信頼性と安定性が求められるオーディオアプリケーション開発において、JUCEは幅広いプロジェクトで利用されています。
JUCEの開発チームは、定期的にアップデートやメンテナンスを行っており、新しい機能や修正が継続的に提供されます。これにより、最新の技術や要件にも迅速に対応することができます。
また、JUCEはその柔軟性から、音楽制作ソフトウェアや仮想楽器の開発だけでなく、教育や研究、オーディオプロジェクトのプロトタイピングなど、さまざまな用途にも利用されています。
JUCEの強力な機能と豊富なサポート体制により、オーディオアプリケーション開発者は効率的かつ信頼性の高いソフトウェアを開発することができます。(CHAT GPTによるJUCEについての記述)
JUCEを知ったきっかけ
そもそも私がJUCEを知ったきっかけは、コロナ渦の緊急事態宣言の時でした。やる事がなさすぎて暇を持て余していた時、ふとプログラミングの勉強をしてみたいと思ったのがきっかけです。
どうせやるなら自分がずっとやっているDTMに関してのソフトを作ってみたいと思ったのが最初でした。
その時に、Roli社が出しているJUCEというソフトの存在を知りました。
ですが、そもそもJUCEというソフトは勉強方法が英語のみ、1冊のみ存在する書籍もバージョンが古い為、微妙に画面が違っていたりするので途中であきらめてしまいました。
その後、しばらくしてChat GPTの存在を知りました。
何気なく聞いてみたところ、簡単なプログラムコードまで書いてくれ、使い方もわかりやすく説明してくれるので、
『ひょっとしたらこれは使えるのではないか』
そう思い、また始めてみようと思いました。
これから少しずつJUCEを使ってプラグインの作り方を勉強していきたいと思います。
Chat GPTに作り方を聞いてみた
早速Chat GPTにJUCEの使い方を聞いてみました。
プログラミングに関しての知識は全くないので不明点を確認。
すると、下記のような回答が来ました。
Q:UCEのプロジェクト作成時の注意点と、ビルドについて教えて
A:JUCEのプロジェクト作成とビルドに関する注意点と手順を説明します。
プロジェクト作成時の注意点:
プロジェクトのテンプレート選択時に、VST形式のプラグインを作成するためには、「Plugin Code」セクションで「VST」を選択する必要があります。
プロジェクト名やプラグインの情報(ベンダー名、プラグイン名など)は、適切な値を設定してください。これらの情報はプラグインファイルに埋め込まれます。
ビルドについての手順:
JUCEプロジェクトマネージャを開きます。
「Config」セクションで、ビルド設定を行います。ターゲットプラットフォーム(Windows、Macなど)とビルドタイプ(デバッグ、リリースなど)を選択します。
「Exporters」セクションで、プロジェクトのエクスポーターを選択します。エクスポーターはビルドに必要な設定やファイルを自動的に生成します。
必要なビルド設定を行います。例えば、ターゲットプラットフォームのSDKパスやビルドオプションなどを設定します。
ビルドボタンをクリックしてビルドを開始します。ビルドが進行すると、コンパイルやリンクが行われます。
ビルドが成功すると、指定された出力ディレクトリにVSTプラグインファイルが生成されます。
ビルドに関する追加の注意点:
ターゲットプラットフォームに合わせてビルド設定を行ってください。異なるプラットフォームでのビルドには、対応するSDKが必要です。
エクスポーターによって生成されるプロジェクトファイルやビルド設定は、必要に応じてカスタマイズすることもできます。
ビルド時にエラーや警告が発生した場合、エラーメッセージやビルドログを確認し、必要な修正を行ってください。
ビルドが成功した場合でも、生成されたプラグインが正常に動作するかを確認するために、テストを行うことが重要です。
これらの手順を参考にしながら、JUCEでのプロジェクト作成とビルドを行ってください。JUCEのドキュメントやコミュニティも活用すると、より詳細な情報やサポートを得ることができます。
回答がかなりスムーズなので、非常に分かりやすいです。
試しにエフェクターのプログラムを考えてもらった
テストとして、まずノイズゲートの作り方を教えてもらいました。
Q:JUCEでノイズゲートを作りたい。作り方を教えて。
A:JUCEを使用してノイズゲート(Noise Gate)を作成する手順を説明します。ノイズゲートは、信号のレベルがしきい値以下になると音をカットするエフェクトです。
以下の手順に従って進めてください:
JUCEプロジェクトの作成:
JUCEプロジェクトを作成し、VSTプラグイン用の設定を行ってください。先ほど説明した手順を参考に、新しいプロジェクトを作成しましょう。プラグインのGUIデザイン:
ノイズゲートの設定を調整するためのGUIを作成します。JUCEのデザイナーツールを使用して、ボタンやスライダーなどのGUIコンポーネントを配置し、必要なパラメータを調整できるようにします。プラグインの処理クラスの作成:
プロジェクト内の`PluginProcessor.cpp`ファイルと`PluginProcessor.h`ファイルに、ノイズゲートの処理を行うクラスを作成します。例えば、`NoiseGateProcessor`という名前のクラスを作成しましょう。ノイズゲートのパラメータの定義:
`NoiseGateProcessor`クラスに、ノイズゲートのしきい値やリリース時間などのパラメータを定義します。これらのパラメータは、GUIから制御可能にすることができます。オーディオの処理:
`NoiseGateProcessor`クラス内に、オーディオの処理コードを実装します。入力信号のレベルを測定し、しきい値以下の場合は音をカットする処理を追加します。この処理は、`processBlock()`メソッド内に記述します。プラグインのGUIと処理クラスの連携:
`PluginEditor.cpp`ファイルと`PluginEditor.h`ファイルを編集して、GUIと処理クラスを連携させます。GUI上のパラメータ変更イベントを処理クラスに伝え、処理クラスのパラメータを更新します。ビルドとテスト:
ビルド設定を行い、プラグインをビルドします。生成されたVSTプラグインファイルをVSTホストアプリケーションやDAWにインポートし、ノイズゲートの動作をテストします。パラメータを変更して、音のカットが適切に行われることを確認しましょう。
これらの手順に従って、JUCEでノイズゲートを作成することができます。処理クラスの実装やGUIとの連携については、JUCEのドキュメントやサンプルコードを参考にすると良いでしょう。
以下に、JUCEを使用してノイズゲートを実装するためのコードの一例を示します。このコードは、JUCEのプラグインプロジェクトの`PluginProcessor.cpp`ファイルに追加することができます。
#include "PluginProcessor.h"
//==============================================================================
MyAudioProcessor::MyAudioProcessor()
{
// ノイズゲートのパラメータの初期化
threshold = 0.1f; // しきい値
releaseTime = 100; // リリース時間(ミリ秒)
// サンプルレートの取得
sampleRate = getSampleRate();
// ノイズゲートの状態の初期化
isNoiseGateOpen = true;
noiseGateLevel = 0.0f;
}
void MyAudioProcessor::prepareToPlay(double sampleRate, int samplesPerBlock)
{
// サンプルレートの更新
this->sampleRate = sampleRate;
// リリース時間をサンプル数に変換
releaseTimeSamples = static_cast<int>(releaseTime * sampleRate / 1000.0);
// バッファの初期化
releaseBuffer.setSize(1, releaseTimeSamples);
releaseBuffer.clear();
}
void MyAudioProcessor::processBlock(AudioBuffer<float>& buffer, MidiBuffer& midiMessages)
{
const int numChannels = buffer.getNumChannels();
const int numSamples = buffer.getNumSamples();
// 入力バッファのポインタを取得
float* channelData = buffer.getWritePointer(0);
// ノイズゲートの処理
for (int sample = 0; sample < numSamples; ++sample)
{
// 現在のサンプルの絶対値を取得
float currentSampleValue = std::abs(channelData[sample]);
// ノイズゲートが閾値を下回った場合
if (currentSampleValue < threshold)
{
// リリースバッファに現在のサンプルを追加
releaseBuffer.setSample(0, (sampleCount + sample) % releaseTimeSamples, currentSampleValue);
// リリースバッファの最大値を更新
noiseGateLevel = releaseBuffer.findMax(0, releaseTimeSamples);
// リリースバッファの最大値が閾値未満の場合、ノイズゲートを閉じる
if (noiseGateLevel < threshold)
isNoiseGateOpen = false;
}
// ノイズゲートが閾値を上回った場合、ノイズゲートを開く
if (currentSampleValue >= threshold)
{
isNoiseGateOpen = true;
releaseBuffer.clear();
}
// ノイズゲートが閉じている場合、サンプル値を0にする
if (!isNoiseGateOpen)
channelData[sample] = 0.0f;
}
// サンプルカウントを更新
sampleCount += numSamples;
}
//==============================================================================
bool MyAudioProcessor::isBusesLayoutSupported(const BusesLayout& layouts) const
{
// 入力と出力のチャンネル数を同じにする
if (layouts.getMainInputChannelSet() != layouts.getMainOutputChannelSet())
return false;
// モノラルまたはステレオのみサポート
if (layouts.getMainOutputChannelSet().size() > 2)
return false;
return true;
}
//==============================================================================
void MyAudioProcessor::getStateInformation(MemoryBlock& destData)
{
// プラグインの状態を保存
}
void MyAudioProcessor::setStateInformation(const void* data, int sizeInBytes)
{
// プラグインの状態を復元
}
このコードでは、`threshold`変数でしきい値を設定し、`releaseTime`変数でリリース時間を設定しています。プラグインの処理は`processBlock()`メソッド内で行われ、入力バッファのサンプルを順番に処理しています。ノイズゲートが閾値を下回った場合はリリースバッファにサンプルを追加し、リリースバッファの最大値を取得して閾値未満であればノイズゲートを閉じます。閾値を上回った場合はノイズゲートを開き、閉じている場合は出力サンプル値を0にします。
このコードはベースとなる実装であり、必要に応じてパラメータや機能をカスタマイズしてください。また、GUIやプロジェクトの設定も適切に行ってください。
と、このようにプログラムまで書いてくれます。
Chat GPTの可能性
Chat GPTに関しては賛否両論がありますが、自分で調べる力があって、文章の意図を汲み取る事ができる方であれば、非常に早いペースで技術を習得できる可能性が広いと感じました。
私自身、まだまだ初心者ですが、Chat GPTがなかったら勉強しようという気すら起きなかったと思います。今はChat GPTが登場した事に感謝しています。
おまけ
試しにChat GPTに悩み相談をしてみました。
これだと私がメンヘラみたいですねw
それでも回答をくれるChat GPT。これもう一種のカウンセリングですね。
というように使い方は様々ですので、皆様もなにかやりたい事や相談したい事があればChat GPTを活用してみてはどうでしょうか。
この記事が気に入ったらサポートをしてみませんか?