【JUCEプラグイン開発】ディレイプラグイン、テンポ同期の種類を追加、8T、16Tなどの実装

パンダさん

付点八分などのテンポシンクも追加したいですね

コパンダ

テンポの計算式を見直してみよう〜

ディレイプラグインのテンポシンク機能で、付点8分音符などの種類を追加しました。前回の記事からの流れで、再度ディレイタイミングの計算式についての概要を備忘録します。

目次

ディレイタイムの計算方法

前回の記事で、DAWのBPMに対する1ビートが四分音符なので、次の式でディレイタイムが計算できます。

val2は左チャンネルのディレイタイムを格納する変数です。

val2 = ((float)60.0 / current_bpm) * (4.0f / delayNum);

式の前半は、60/BPMで、四分音符の秒数となります。

式前半の、四分音符の秒数を基準に、式後半の係数を掛けることで何分音符毎のディレイタイムにするかを計算します。

4.0fは四分音符を基準としているので、delayNumは四分音符の時「4」を入れることにします。

それぞれの音の長さを求めるには、後ろの式の係数部分を次のようにすれば良いことになります。

付点八分は、四分音符が1なので、0.75という係数にすれば良いので、delayNumは約5.3333となります。ここでは、小数点4桁までとしています。

コンボボックスへの項目の追加

コンボボックスは、項目と一対一対応とするように設定するので、APVTSの最大値をコンボボックスの個数と合わせる必要があります。こうすることで、1~7というAPVTSの数値にコンボボックスが対応してくれます。これは、コンボボックスをAPVTSへ紐づけるときの値の関係性もあります。以前の記事でこの関係性を記載していますので、ご参照ください。

「8T、16、16T」という項目を追加したいので、今までの「whole、2、4、8」に3個拡張を行うので、最大値を7.0とします。

            std::make_unique<juce::AudioParameterInt>( "delayNumerator",  // ID
                                                       "DelayNumerator",  // name
                                                       1.0f,  // min
                                                       7.0f,  // max ここを変更しました。
                                                       3.0f)  // default
                                                        ,
            std::make_unique<juce::AudioParameterInt>( "delayNumerator2",  // ID
                                                       "DelayNumerator2",  // name
                                                       1.0f,  // min
                                                       7.0f,  // max ここを変更しました。
                                                       3.0f)  // default
                                                        ,

PluginProcessor.cppには、もう一つ、DelayTimeCalc関数でのコンボボックスの値の条件があります。追加した5.0、6.0、7.0の条件を処理に追加しておきます。今は、とりあえずDBGで文字を出力する処理を仮に入れておきました。

void TheDelayAudioProcessor::DelayTimeCalc(float& val2, float& val3){
//...略...
        float selected_delayNum = *delayNumerator;
        float delayNum = 0.0f;
        if (selected_delayNum == 1.0f) {
            delayNum = 1.0f;
        }
        else if (selected_delayNum == 2.0f) {
            delayNum = 2.0f;
        }
        else if (selected_delayNum == 3.0f) {
            delayNum = 4.0f;
        }
        else if (selected_delayNum == 4.0f) {
            delayNum = 8.0f;
        }
        //[1]ここから追加しました。
        else if (selected_delayNum == 5.0f) {
            DBG("8T");
        }
        else if (selected_delayNum == 6.0f) {
            DBG("16");
        }
        else if (selected_delayNum == 7.0f) {
            DBG("16T");
        }
//...略...
        else if (selected_delayNum == 4.0f) {
            delayNum = 8.0f;
        }
        //[2]ここから追加しました。
        else if (selected_delayNum == 5.0f) {
            DBG("2:8T");
        }
        else if (selected_delayNum == 6.0f) {
            DBG("2:16");
        }
        else if (selected_delayNum == 7.0f) {
            DBG("2:16T");
        }
//...略...

PluginEditor.cppで、コンボボックスの初期化の際に、項目を追加します。

//コンストラクタ内のコンボボックス初期化    
//Tempo Sync Combobox
    addAndMakeVisible(DelayNumerator);
    DelayNumeratorAttachment.reset(new ComboBoxAttachment(valueTreeState, "delayNumerator", DelayNumerator));
    DelayNumerator.addItem("Whole", 1);
    DelayNumerator.addItem("2", 2);
    DelayNumerator.addItem("4", 3);
    DelayNumerator.addItem("8", 4);
//[1]addItemで以下の3項目を追加します。
    DelayNumerator.addItem("8T", 5);
    DelayNumerator.addItem("16", 6);
    DelayNumerator.addItem("16T", 7);
    DelayNumerator.setSelectedId(3);
    DelayNumerator.setSelectedId(*(vts.getRawParameterValue("delayNumerator")));
    
    addAndMakeVisible(DelayNumerator2);
    DelayNumeratorAttachment2.reset(new ComboBoxAttachment(valueTreeState, "delayNumerator2", DelayNumerator2));
    DelayNumerator2.addItem("Whole", 1);
    DelayNumerator2.addItem("2", 2);
    DelayNumerator2.addItem("4", 3);
    DelayNumerator2.addItem("8", 4);
//[2]addItemで以下の3項目を追加します。
    DelayNumerator2.addItem("8T", 5);
    DelayNumerator2.addItem("16", 6);
    DelayNumerator2.addItem("16T", 7);
    DelayNumerator2.setSelectedId(3);
    DelayNumerator2.setSelectedId(*(vts.getRawParameterValue("delayNumerator2")));

計算処理の追加

DelayTimeCalc関数へdelayNumの値を追加します。

コンボボックスで選択した数値から、delayNum変数を当てはめます。

//...略...
            float selected_delayNum = *delayNumerator;
            float delayNum = 0.0f;
            if (selected_delayNum == 1.0f) {
                //whole
                delayNum = 1.0f;
            }
            else if (selected_delayNum == 2.0f) {
                //2
                delayNum = 2.0f;
            }
            else if (selected_delayNum == 3.0f) {
                //4
                delayNum = 4.0f;
            }
            else if (selected_delayNum == 4.0f) {
                //8
                delayNum = 8.0f;
            }
            else if (selected_delayNum == 5.0f) {
                //8T
                delayNum = 5.3333f;
            }
            else if (selected_delayNum == 6.0f) {
                //16
                delayNum = 16.0f;
            }
            else if (selected_delayNum == 7.0f) {
                //16T
                delayNum = 10.6666f;
            }
            val2 = ((float)60.0 / current_bpm) * (4.0f / delayNum);
//...略...

省略していますが、右チャンネルのval3への値も同じ処理を追加しました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次