シンセっぽいアプリができるみたいです。
少し楽器っぽくて面白そう
JUCEプログラミング、synthの項目の「Build a sine wave synthesiser」のチュートリアルをやっていきます。サインウェーブシンセということなのですが、まずはサイン波を発音する、というだけのシンプルなアプリです。
サイン波をどのようにgetNextAudioBlock関数で処理していくかなど、そのあたりが勉強になりそうです。今回の記事では、まずは、チュートリアルの概要と、実装の準備部分までを記事にしています。
公式チュートリアルのページはこちらになります。
こんな人の役に立つかも
・JUCEプログラミングを勉強している人
・JUCEのBuild a sine wave synthesiserチュートリアルをやっている人
・「SineSynthTutorial_01.h」の実装をしたい人
概要
チュートリアルで作成するアプリについて
このチュートリアルでは、スライダーで設定した周波数の値のサイン波を発生させるようなアプリが作成できます。
シンプルですが、意外とはまるんですよね^^;
R〇D2の声見たい・・・
また、このチュートリアルでは、標準ライブラリの「std::sin()」関数を利用します。ほとんどのプラグインや、アプリのシンセでは、この標準ライブラリを使用していない可能性が高いとのことです。というのは、もっと効率的に波形を生成できる「ウェーブテーブル」というものがあり、実践的にはそれを利用することで、いろいろな波形が生成できるとのことでした。
そのうちウェーブテーブルのチュートリアルもやっていきたいです。
とりあえずstd::sin()を利用した方法を見ていきます。
プロジェクトの作成
今回のチュートリアルでは、新規にProjucerプロジェクトを作成することにしました。まずは、「Audio」のテンプレートで新規プロジェクトを作成します。
プロジェクト名は「SineSynth01」としました。
※任意の名称を付けてくださいね。
プロジェクト作成の詳細については、以前の記事に記載していますので、よろしければご参照ください。(以前の記事では、GUIテンプレートを選択していますので、Audioに変更してください。)
実装
今回は、まずプログラムの目次的な、ヘッダーの実装を行います。
チュートリアルからダウンロードできる「SineSynthTutorial_01.h」の内容をProjucerのテンプレート「Audio」の形で動作するように実装していきます。
MianComponent.h
AudioのテンプレートのMainComponentクラスに、次のプログラムを追加しました。
class MainComponent : public juce::AudioAppComponent
{
public:
//...略...
void paint (juce::Graphics& g) override;
void resized() override;
//[1]次の関数をpublicメンバに追加します。
void updateAngleDelta();
private:
//[2]次のprivateなメンバ変数を追加します。
juce::Slider frequencySlider;
double currentSampleRate = 0.0, currentAngle = 0.0, angleDelta = 0.0;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainComponent)
};
[1]では、サイン波の現在のラジアンを計算する、updateAngleDeltaという関数を定義します。内容については、cppに記載していきます。サイン波は周期で表現されて、std::sin(x)に与える引数はラジアンとなりますので、サンプル数をラジアンに変換する、といったイメージの関数でしょうか。
具体的には、cppの実装で見ていきたいと思います。
[2]では、サイン波に与えるラジアンを作成するために必要な変数を定義します。それぞれ、0.0で初期化しています。「現在のサンプルレート」としてcurrentSampleRate変数、「現在の角度」としてcurrentAngle変数、「角度の変化分」としてangleDelta変数を準備します。
サイン波がどのように処理されるかをcpp実装で見ていきたいと思います。