在我的代码的第 138 行,我不断收到“预期为 ';'”错误代码 E0065我正在使用 Visual Studio 2019 社区版

问题描述

我已经包含了到目前为止我编写的所有代码,因为我不确定是否有人想尝试复制错误。可能太多了,但我不想遗漏任何东西,以防万一这是导致错误的原因。

#include

using namespace std;

#include "olcNoiseMaker.h"

上面的行显示了我正在使用的库,这是我从那里获得它的 Github 页面链接https://github.com/OneLoneCoder/synth

//Converts frequency (Hz) to angular veLocity
double w(double dHertz)
{
 return dHertz * 2.0 * PI;
}

atomic<double> dFrequencyOutput = 0.0;
double dOctaveBaseFrequency = 220.0; //A3
double d12thRootOf2 = pow(2.0,1.0 / 12.0);
sEnvelopeADSR envelope;

double osc(double dHertz,double dTime,int nType)
{
    switch (nType)
    {
    case 0: // Sine Wave
        return sin(w(dHertz) * dTime);

    case 1: // Square Wave
        return sin(w(dHertz) * dTime) > 0 ? 1.0 : -1.0;

    case 2: // Triangle Wave
        return asin(sin(w(dHertz) * dTime)) * 2.0 / PI;

    case 3: // Saw Wave (analogue / warm / slow)
        {
            double dOutput = 0.0;

            for (double n = 1.0; n < 100.0; n++)
                dOutput += (sin(n * w(dHertz) * dTime)) / n;

           return dOutput * (2.0 / PI);
        }

    case 4: // Saw Wave (optimised / harsh / fast)
        return (2.0 / PI) * (dHertz * PI * fmod(dTime,1.0 / dHertz) - (PI / 2.0));

    case 5: // Psuedo Random Noise
        return 2.0 * ((double)rand() / (double)RAND_MAX) - 1.0;

    default:
        return 0.0;
    }
}

struct sEnvelopeADSR
{
    double dAttackTime;
    double dDecayTime;
    double dReleaseTime;

    double dSustainAmplitude;
    double dStartAmplitude;

    double dTriggerOnTime;
    double dTriggerOffTime;

    bool bNoteOn;

    sEnvelopeADSR()
    {
        dAttackTime = 0.01;
        dDecayTime = 0.01;
        dStartAmplitude = 1.0;
        dSustainAmplitude = 0.8;
        dReleaseTime = 0.02;
        dTriggerOnTime = 0.0;
        dTriggerOffTime = 0.0;
        bNoteOn = false;
    }

    // Call when key is pressed
    void NoteOn(double dTimeOn)
    {
        dTriggerOnTime = dTimeOn;
        bNoteOn = true;
    }

    // Call when key is released
    void NoteOff(double dTimeOff)
    {
        dTriggerOffTime = dTimeOff;
        bNoteOn = false;
    }

    // Get the correct Amplitude at the requested point in time
    double GetAmplitude(double dTime)
    {
        double damplitude = 0.0;
        double dLifeTime = dTime - dTriggerOnTime;

        if (bNoteOn)
        {
            // ADS

            // Attack
            if (dLifeTime <= dAttackTime) {
                damplitude = (dLifeTime / dAttackTime) * dStartAmplitude;
            }

            // Decay
            if (dLifeTime > dAttackTime && dLifeTime <= (dAttackTime + dDecayTime)) {
                damplitude = ((dLifeTime - dAttackTime) / dDecayTime) * (dSustainAmplitude - dStartAmplitude) + dStartAmplitude;
            }

            // Sustain
            if (dLifeTime > (dAttackTime + dDecayTime))
            {
                damplitude = dSustainAmplitude;
            }
            else
            {
                // Release
                damplitude = ((dTime - dTriggerOffTime) / dReleaseTime) * (0.0 - dSustainAmplitude) + dSustainAmplitude;
            }

            if (damplitude <= 0.0001)
            {
                damplitude = 0;
            }

            return damplitude;
        }

    }

}

    // Function used by olcNoiseMaker to generate sound
    // Returns amplitude(-1.0 to + 1.0) as a function of time
    
    double MakeNoise(double dTime)

上面那一行是我遇到问题的地方。在 Visual Studio 2019 社区版中,我收到一条错误消息,指出在它之前的某处需要一个分号。我不明白这个问题

    {

    }

        int main()
    {

        wcout << "onelonecoder.com - Synthesizer Part 1" << endl;

        // Get all sound behaviors
        vector<wstring> devices = olcNoiseMaker<short>::Enumerate();

        //display findings
        for (auto d : devices) wcout << "Found Output Device:" << d << endl;

        // Create sound machine!!
        olcNoiseMaker<short> sound(devices[0],44100,1,8,512);

        // Link noise function with sound machine
        sound.SetUserFunction(MakeNoise);

        while (1)
        {
            //Add a keyboard like a piano
            bool bKeypressed = false;
            for (int k = 0; k < 15; k++)
            {
                if (GetAsyncKeyState((unsigned char)("ZSXCFVGBNJMK\xbcL\xbe\xbf"[k])) & 0x8000)
                {
                    dFrequencyOutput = dOctaveBaseFrequency * pow(d12thRootOf2,k);
                    envelope.bNoteOn(sound.GetTime());
                    bKeypressed = true;
                }
            }

            if (!bKeypressed)
            {
                envelope.bNoteOff(sound.GetTime());
            }
            return 0;
        }
    }

解决方法

structclass 定义的结尾需要一个 ;,即使它以 } 结尾。这是您通常只犯一次的错误之一。

这样做的原因是,您可以同时声明结构/类并创建该类型的变量,方法是将变量名称放在 ; 之前。这在 C 中使用得更频繁,你在 C++ 中很少看到它。

,

您在 } 定义的最后一个 struct osc 之后缺少分号。