amerikantypewr1ter
@amerikantypewr1ter (y kawano)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

juceでエラー発生 Out-of-line definition of '' does not match any declaration in ''

解決したいこと

下記の本を参考にjuceでシンセサイザーのプラグインを作っています。
https://www.oufac.com/

コントローラーを実装してビルドしたらエラーが発生しました。
そのエラーを解決しようとしたらさらにエラーが発生。。
解決方法を教えてください。

バージョン
・xcode:13.4.1 (13F100)
・MacOS:Monterey 12.3.1

発生している問題・エラー

Out-of-line definition of 'getCurrentProgram' does not match any declaration in 'JuceJapanDemoAudioProcessor'

該当するソースコード

// パラメータのfloat値をホストに返す関数
int JuceJapanDemoAudioProcessor::getCurrentProgram(int index)
{
    if (index >= 0 && index < totalNumParam) // インデックスが配列の範囲内かチェック
        return UserParams[index]; // 配列の内、インデックスで指定した変数の値を返す
    else return 0; // インデックスが配列の範囲外であれば0を返す
}

// パラメータの値をホストから設定する関数
void JuceJapanDemoAudioProcessor::setCurrentProgram(int index, float value)
{
    switch (index){
    case MasterBypass:
        UserParams[MasterBypass] = value;
        break;
    case Gain:
        UserParams[Gain] = value;
        break;
    case Threshold:
        UserParams[Threshold] = value;
        break;
    case Volume:
        UserParams[Volume] = value;
        break;
    default: return;
    }
}

自分で試したこと

エラー文(Plugin.Processor.cpp)より、ヘッダーの定義と一致していないと判断し、ヘッダー(Plugin.Processor.h)を確認。

該当箇所と思われる部分を修正したところ、さらにエラーが2つ発生。
そのエラーを解決しようとしたらさらにエラーが発生。

    int getNumPrograms() override;// パラメータの項目数をホストに返す
    int getCurrentProgram() override;// パラメータのfloat値をホストに返す
    void setCurrentProgram(int index) override;// パラメータの値をホストから設定する
    const juce::String getProgramName(int index) override;// パラメータの名前をホストに返す

↓修正

    int getNumPrograms() override;// パラメータの項目数をホストに返す
    int getCurrentProgram(int index) override;// パラメータのfloat値をホストに返す
    void setCurrentProgram(int index, float value) override;// パラメータの値をホストから設定する
    const juce::String getProgramName(int index) override;// パラメータの名前をホストに返す

↓異なるエラーが2つ発生

エラー①

Non-virtual member function marked 'override' hides virtual member function

xcodeが示すエラー箇所は「juce_AudioProcessor.h」の下記。

    /** Returns the number of the currently active program. */
    virtual int getCurrentProgram() = 0;

    /** Called by the host to change the current program. */
    virtual void setCurrentProgram (int index) = 0;

↓エラー文より、非仮想メンバ関数が仮想メンバ関数を隠している?、と判断し、下記修正。

    /** Returns the number of the currently active program. */
    virtual int getCurrentProgram(int index) = 0;

    /** Called by the host to change the current program. */
    virtual void setCurrentProgram (int index, float value) = 0;

大量のエラーが発生。
エラー箇所として様々なヘッダーファイルのinclude部分が示されて迷走しかけたので一旦断念。

エラー②

Allocating an object of abstract class type 'JuceJapanDemoAudioProcessor'

↓xcodeが示すエラー箇所

// This creates new instances of the plugin..
juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter()
{
    return new JuceJapanDemoAudioProcessor();
}
0

2Answer

はじめまして。
JUCE JAPANの著者です。この度はお手に取っていただきありがとうございます。
ソースコードの記述でお困りの様でしたら、完成版のソースコードが以下のリポジトリに置いてありますので、ご参考いただければと思います。
https://github.com/COx2/JUCE_JAPAN_DEMO

ただ、JUCE自体がバージョンアップによって破壊的変更が発生しやすい仕組みになっているため、最新のJUCEでは上記のソースコードでもビルドが通らない可能性があります。
動作確認済みのJUCEバージョンについては、リポジトリのREADMEをご参考いただければ。

もし、手元の資料だけでは問題が解決できないようであれば、ビデオ会議等でハンズオンでサポートすることも可能です。
もしハンズオンサポートがご希望でしたら、私のプロフィールにあるSNSアカウントにDMをお送りいただければと思います。

※『クローズ済み』となっているため既に解決されている可能性もありますので、この回答はもしかしたらお節介になってしまっているかもしれません。

1Like

ちなみに、ご質問の投稿から察するに、以下のように記述を直せばコンパイルが通ると思います。

// パラメータのfloat値をホストに返す関数
int JuceJapanDemoAudioProcessor::getCurrentProgram(int index)
{
    if (index >= 0 && index < totalNumParam) // インデックスが配列の範囲内かチェック
        return UserParams[index]; // 配列の内、インデックスで指定した変数の値を返す
    else return 0; // インデックスが配列の範囲外であれば0を返す
}

// パラメータの値をホストから設定する関数
void JuceJapanDemoAudioProcessor::setCurrentProgram(int index, float value)
{
    switch (index){
    case MasterBypass:
        UserParams[MasterBypass] = value;
        break;
    case Gain:
        UserParams[Gain] = value;
        break;
    case Threshold:
        UserParams[Threshold] = value;
        break;
    case Volume:
        UserParams[Volume] = value;
        break;
    default: return;
    }
}

↓ 正しくは

int JuceJapanDemoAudioProcessor::getCurrentProgram()
{
    return 0;
}

void JuceJapanDemoAudioProcessor::setCurrentProgram (int index)
{
}

問題の背景を具体的に書きますと『getCurrentProgram関数』は『現在のプログラム番号(パッチ番号)を返す関数』であり、『パラメータのfloat値をホストに返す関数』ではないです。
また、juce_AudioProcessor.hはJUCEの中身の一部ですので、そのコードに変更を加えるとJUCEの依存関係全体に影響を及ぼすので、大量のエラーメッセージの原因になります。

おそらくですが、@amerikantypewr1terさんの認識において、『getParameter関数』『setParameter関数』と、『getCurrentProgram関数』『setCurrentProgram関数』の意味が逆になってしまっているかと思われます。

・getCurrentProgram関数の正しい記述

・getParameter関数の正しい記述

1Like

Comments

  1. ご回答ありがとうございます。
    確かに大きく勘違いしていたようです。
    引き続き参考にさせていただきます!

Your answer might help someone💌