//Sets a parameter a of effect e to value v. For parameters of different effects, see fmod_dsp_effects.h GMexport double FMODGMS_Effect_Set_Parameter(double e, double p, double v) { int effectIndex = (int)round(e); if ((effectIndex < 0) || (effectIndex >= (int)effectList.size())) { errorMessage = "Invalid effect index"; return GMS_error; } FMOD::DSP* effect = effectList[effectIndex]; int param = (int)round(p); int value = (int)round(v); FMOD_DSP_PARAMETER_DESC* desc = NULL; if (effect->getParameterInfo(param, &desc) != FMOD_OK) { errorMessage = "Could not get effect parameter info, probably invalid param index"; return GMS_error; } if (desc->type == FMOD_DSP_PARAMETER_TYPE_FLOAT) { if (effect->setParameterFloat(param, (float)value) == FMOD_OK) return FMODGMS_Util_ErrorChecker(); } else if (desc->type == FMOD_DSP_PARAMETER_TYPE_INT) { if (effect->setParameterInt(param, (int)round(value)) == FMOD_OK) return FMODGMS_Util_ErrorChecker(); } else if (desc->type == FMOD_DSP_PARAMETER_TYPE_BOOL) { if (effect->setParameterBool(param, (bool)(value > 0.5)) == FMOD_OK) return FMODGMS_Util_ErrorChecker(); } else { errorMessage = "Unsupported effect parameter type"; return GMS_error; } errorMessage = "Could not set effect parameter"; return GMS_error; }
int FMOD_Main() { FMOD::System *system; FMOD::Channel *channel = 0; FMOD::DSP *dsp; FMOD_RESULT result; unsigned int version; void *extradriverdata = 0; Common_Init(&extradriverdata); /* Create a System object and initialize. */ result = FMOD::System_Create(&system); ERRCHECK(result); result = system->getVersion(&version); ERRCHECK(result); if (version < FMOD_VERSION) { Common_Fatal("FMOD lib version %08x doesn't match header version %08x", version, FMOD_VERSION); } result = system->init(32, FMOD_INIT_NORMAL, extradriverdata); ERRCHECK(result); /* Create an oscillator DSP units for the tone. */ result = system->createDSPByType(FMOD_DSP_TYPE_OSCILLATOR, &dsp); ERRCHECK(result); result = dsp->setParameterFloat(FMOD_DSP_OSCILLATOR_RATE, 440.0f); /* Musical note 'A' */ ERRCHECK(result); /* Main loop */ do { Common_Update(); if (Common_BtnPress(BTN_ACTION1)) { if (channel) { result = channel->stop(); ERRCHECK(result); } result = system->playDSP(dsp, 0, true, &channel); ERRCHECK(result); result = channel->setVolume(0.5f); ERRCHECK(result); result = dsp->setParameterInt(FMOD_DSP_OSCILLATOR_TYPE, 0); ERRCHECK(result); result = channel->setPaused(false); ERRCHECK(result); } if (Common_BtnPress(BTN_ACTION2)) { if (channel) { result = channel->stop(); ERRCHECK(result); } result = system->playDSP(dsp, 0, true, &channel); ERRCHECK(result); result = channel->setVolume(0.125f); ERRCHECK(result); result = dsp->setParameterInt(FMOD_DSP_OSCILLATOR_TYPE, 1); ERRCHECK(result); result = channel->setPaused(false); ERRCHECK(result); } if (Common_BtnPress(BTN_ACTION3)) { if (channel) { result = channel->stop(); ERRCHECK(result); } result = system->playDSP(dsp, 0, true, &channel); ERRCHECK(result); result = channel->setVolume(0.125f); ERRCHECK(result); result = dsp->setParameterInt(FMOD_DSP_OSCILLATOR_TYPE, 2); ERRCHECK(result); result = channel->setPaused(false); ERRCHECK(result); } if (Common_BtnPress(BTN_ACTION4)) { if (channel) { result = channel->stop(); ERRCHECK(result); } result = system->playDSP(dsp, 0, true, &channel); ERRCHECK(result); result = channel->setVolume(0.5f); ERRCHECK(result); result = dsp->setParameterInt(FMOD_DSP_OSCILLATOR_TYPE, 4); ERRCHECK(result); result = channel->setPaused(false); ERRCHECK(result); } if (Common_BtnPress(BTN_MORE)) { if (channel) { result = channel->stop(); ERRCHECK(result); channel = 0; } } if (channel) { if (Common_BtnDown(BTN_UP) || Common_BtnDown(BTN_DOWN)) { float volume; result = channel->getVolume(&volume); ERRCHECK(result); volume += (Common_BtnDown(BTN_UP) ? +0.1f : -0.1f); volume = (volume > 1.0f) ? 1.0f : volume; volume = (volume < 0.0f) ? 0.0f : volume; result = channel->setVolume(volume); ERRCHECK(result); } if (Common_BtnDown(BTN_LEFT) || Common_BtnDown(BTN_RIGHT)) { float frequency; result = channel->getFrequency(&frequency); ERRCHECK(result); frequency += (Common_BtnDown(BTN_RIGHT) ? +500.0f : -500.0f); result = channel->setFrequency(frequency); ERRCHECK(result); } } result = system->update(); ERRCHECK(result); { float frequency = 0.0f, volume = 0.0f; bool playing = false; if (channel) { result = channel->getFrequency(&frequency); ERRCHECK(result); result = channel->getVolume(&volume); ERRCHECK(result); result = channel->isPlaying(&playing); ERRCHECK(result); } Common_Draw("=================================================="); Common_Draw("Generate Tone Example."); Common_Draw("Copyright (c) Firelight Technologies 2004-2015."); Common_Draw("=================================================="); Common_Draw(""); Common_Draw("Press %s to play a sine wave", Common_BtnStr(BTN_ACTION1)); Common_Draw("Press %s to play a square wave", Common_BtnStr(BTN_ACTION2)); Common_Draw("Press %s to play a saw wave", Common_BtnStr(BTN_ACTION3)); Common_Draw("Press %s to play a triangle wave", Common_BtnStr(BTN_ACTION4)); Common_Draw("Press %s to stop the channel", Common_BtnStr(BTN_MORE)); Common_Draw("Press %s and %s to change volume", Common_BtnStr(BTN_UP), Common_BtnStr(BTN_DOWN)); Common_Draw("Press %s and %s to change frequency", Common_BtnStr(BTN_LEFT), Common_BtnStr(BTN_RIGHT)); Common_Draw("Press %s to quit", Common_BtnStr(BTN_QUIT)); Common_Draw(""); Common_Draw("Channel is %s", playing ? "playing" : "stopped"); Common_Draw("Volume %0.2f", volume); Common_Draw("Frequency %0.2f", frequency); } Common_Sleep(50); } while (!Common_BtnPress(BTN_QUIT)); /* Shut down */ result = dsp->release(); ERRCHECK(result); result = system->close(); ERRCHECK(result); result = system->release(); ERRCHECK(result); Common_Close(); return 0; }
void AnalyzerToolUtils::getSpectrum(SoundAnalyzer* soundAnalyzer) { //FMod variable boost::thread_group threadpool; FMOD::DSP* dspSpectrum; FMOD::ChannelGroup* masterChannel; FMOD::Channel* chan; FMOD_RESULT res; //Variable int sampleRate, musicSpectrumSize; unsigned int soundTime; float niquistRate, i = 0; //sound time in MS soundAnalyzer->Sound->getLength(&soundTime, FMOD_TIMEUNIT_MS); //DSP / FFT / Window soundAnalyzer->sys->createDSPByType(FMOD_DSP_TYPE_FFT, &dspSpectrum); dspSpectrum->setParameterInt(FMOD_DSP_FFT_WINDOWSIZE, soundAnalyzer->GetWindowSize()); dspSpectrum->getParameterInt(FMOD_DSP_FFT_WINDOWSIZE, &musicSpectrumSize, 0, 0); dspSpectrum->setParameterInt(FMOD_DSP_FFT_WINDOWTYPE, FMOD_DSP_FFT_WINDOW_TRIANGLE); //Master Channel -> Add Dsp soundAnalyzer->sys->getMasterChannelGroup(&masterChannel); masterChannel->addDSP(0, dspSpectrum); soundAnalyzer->sys->setOutput(FMOD_OUTPUTTYPE_NOSOUND_NRT); //FMOD_OUTPUTTYPE_NOSOUND_NRT soundAnalyzer->sys->playSound(soundAnalyzer->Sound, masterChannel, false, &chan); soundAnalyzer->sys->setDSPBufferSize(SPECTRUM_BUFFER_SIZE, 0); soundAnalyzer->sys->update(); //Get Samplerate soundAnalyzer->sys->getSoftwareFormat(&sampleRate, 0, 0); niquistRate = sampleRate / 2.0f; soundAnalyzer->data.SpectrumData.resize(static_cast<int>(soundTime / (((double)SPECTRUM_BUFFER_SIZE / (double)sampleRate) * 1000)) + 1); soundAnalyzer->SetFrequencyStep(musicSpectrumSize / niquistRate); int index = 0; //double val; do{ FMOD_DSP_PARAMETER_FFT *dataSpectrum; dspSpectrum->getParameterData(FMOD_DSP_FFT_SPECTRUMDATA, (void **)&dataSpectrum, 0, 0, 0); SpectrumSegment segment(musicSpectrumSize / 2, musicSpectrumSize / niquistRate); threadpool.create_thread(boost::bind(&AnalyzerToolUtils::ExtractSpectrum, soundAnalyzer, boost::ref(dataSpectrum), musicSpectrumSize/2, musicSpectrumSize / niquistRate, index)); /*for (int bin = 0; bin < dataSpectrum->length/2; bin++) { val = 0; for (int channel = 0; channel < MAX_CHANNELS; channel++) { val += dataSpectrum->spectrum[channel][bin]; } segment.AddSegment(val); } soundAnalyzer->data.AddData(segment);*/ soundAnalyzer->sys->update(); index++; i += ((double)SPECTRUM_BUFFER_SIZE / (double)sampleRate) * 1000; } while (i < (soundTime)); threadpool.join_all(); }