/********************************************************************** Audacity: A Digital Audio Editor Noise.cpp Dominic Mazzoni *******************************************************************//** \class EffectNoise \brief An Effect for the "Generator" menu to add white noise. *//*******************************************************************/ #include "../Audacity.h" #include "../Project.h" #include "../Prefs.h" #include "../ShuttleGui.h" #include "../WaveTrack.h" #include "../widgets/NumericTextCtrl.h" #include "Noise.h" #include #ifndef M_PI #define M_PI 3.14159265358979323846 /* pi */ #endif #define AMP_MIN 0 #define AMP_MAX 1 // // EffectNoise // bool EffectNoise::Init() { gPrefs->Read(wxT("/Effects/Noise/Duration"), &mDuration, 1L); return true; } bool EffectNoise::PromptUser() { wxArrayString noiseTypeList; noiseTypeList.Add(_("White")); noiseTypeList.Add(_("Pink")); noiseTypeList.Add(_("Brownian")); NoiseDialog dlog(this, mParent, _("Noise Generator")); // dialog will be passed values from effect // Effect retrieves values from saved config // Dialog will take care of using them to initialize controls // If there is a selection, use that duration, otherwise use // value from saved config: this is useful is user wants to // replace selection with noise // if (mT1 > mT0) { mDuration = mT1 - mT0; dlog.nIsSelection = true; } else { gPrefs->Read(wxT("/Effects/Noise/Duration"), &mDuration, 30L); dlog.nIsSelection = false; } gPrefs->Read(wxT("/Effects/Noise/Type"), &noiseType, 0L); gPrefs->Read(wxT("/Effects/Noise/Amplitude"), &noiseAmplitude, 0.8f); // Initialize dialog locals dlog.nDuration = mDuration; dlog.nAmplitude = noiseAmplitude; dlog.nType = noiseType; dlog.nTypeList = &noiseTypeList; // start dialog dlog.Init(); dlog.TransferDataToWindow(); dlog.Fit(); dlog.ShowModal(); if (dlog.GetReturnCode() == wxID_CANCEL) return false; // if there was an OK, retrieve values noiseType = dlog.nType; mDuration = dlog.nDuration; noiseAmplitude = dlog.nAmplitude; return true; } bool EffectNoise::TransferParameters( Shuttle & WXUNUSED(shuttle) ) { return true; } bool EffectNoise::MakeNoise(float *buffer, sampleCount len, float fs, float amplitude) { float white; sampleCount i; float div = ((float)RAND_MAX) / 2.0f; switch (noiseType) { default: case 0: // white for(i=0; i 0.01)? 9.0/sqrt(fs) : 0.01; for(i=0; i 1.0) ? (leakage * y - white * scaling) : z; buffer[i] = amplitude * y; } break; } return true; } void EffectNoise::GenerateBlock(float *data, const WaveTrack &track, sampleCount block) { MakeNoise(data, block, track.GetRate(), noiseAmplitude); } void EffectNoise::Success() { /* save last used values save duration unless value was got from selection, so we save only when user explicitely setup a value */ if (mT1 == mT0) gPrefs->Write(wxT("/Effects/Noise/Duration"), mDuration); gPrefs->Write(wxT("/Effects/Noise/Type"), noiseType); gPrefs->Write(wxT("/Effects/Noise/Amplitude"), noiseAmplitude); gPrefs->Flush(); } //---------------------------------------------------------------------------- // NoiseDialog //---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(NoiseDialog, EffectDialog) EVT_COMMAND(wxID_ANY, EVT_TIMETEXTCTRL_UPDATED, NoiseDialog::OnTimeCtrlUpdate) END_EVENT_TABLE() NoiseDialog::NoiseDialog(EffectNoise * effect, wxWindow * parent, const wxString & title) : EffectDialog(parent, title, INSERT_EFFECT), mEffect(effect) { mNoiseDurationT = NULL; /* // already initialized in EffectNoise::PromptUser nDuration = mDuration; nAmplitude = noiseAmplitude; nType = noiseType; */ } void NoiseDialog::PopulateOrExchange( ShuttleGui & S ) { S.StartMultiColumn(2, wxCENTER); { S.TieChoice(_("Noise type:"), nType, nTypeList); S.TieNumericTextBox(_("Amplitude (0-1)") + wxString(wxT(":")), nAmplitude, 10); S.AddPrompt(_("Duration") + wxString(wxT(":"))); if (mNoiseDurationT == NULL) { mNoiseDurationT = new NumericTextCtrl(NumericConverter::TIME, this, wxID_ANY, wxT(""), nDuration, mEffect->mProjectRate, wxDefaultPosition, wxDefaultSize, true); /* use this instead of "seconds" because if a selection is passed to * the effect, I want it (nDuration) to be used as the duration, and * with "seconds" this does not always work properly. For example, * it rounds down to zero... */ mNoiseDurationT->SetName(_("Duration")); mNoiseDurationT->SetFormatString(mNoiseDurationT->GetBuiltinFormat(nIsSelection==true?(_("hh:mm:ss + samples")):(_("hh:mm:ss + milliseconds")))); mNoiseDurationT->EnableMenu(); } S.AddWindow(mNoiseDurationT, wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL); } S.EndMultiColumn(); } bool NoiseDialog::TransferDataToWindow() { EffectDialog::TransferDataToWindow(); // Must handle this ourselves since ShuttleGui doesn't know about it mNoiseDurationT->SetValue(nDuration); return true; } bool NoiseDialog::TransferDataFromWindow() { EffectDialog::TransferDataFromWindow(); nAmplitude = TrapDouble(nAmplitude, AMP_MIN, AMP_MAX); // Must handle this ourselves since ShuttleGui doesn't know about it nDuration = mNoiseDurationT->GetValue(); return true; } void NoiseDialog::OnTimeCtrlUpdate(wxCommandEvent & WXUNUSED(event)) { Fit(); }