⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bassboost.cpp

📁 Audacity是一款用於錄音和編輯聲音的、免費的開放源碼軟體。它可以執行於Mac OS X、Microsoft Windows、GNU/Linux和其它作業系統
💻 CPP
字号:
/**********************************************************************  Audacity: A Digital Audio Editor  BassBoost.cpp  Effect programming:  Nasca Octavian Paul  UI programming:  Dominic Mazzoni (with the help of wxDesigner)  Vaughan Johnson (Preview)**********************************************************************/#include "BassBoost.h"#include "../WaveTrack.h"#include <wx/button.h>#include <wx/msgdlg.h>#include <wx/sizer.h>#include <wx/stattext.h>#include <wx/textctrl.h>#include <math.h>#define ID_BUTTON_PREVIEW      10005//// EffectBassBoost//EffectBassBoost::EffectBassBoost(){   frequency = 200;   dB_boost = 12;}wxString EffectBassBoost::GetEffectDescription() {    // Note: This is useful only after values have been set.    return wxString::Format(_("Applied effect: %s frequency = %.0f Hz, boost = %.0f dB"),                            this->GetEffectName().c_str(), frequency, dB_boost); } bool EffectBassBoost::NewTrackSimpleMono(){//(re)initialise filter parameters   xn1=0;   xn2=0;   yn1=0;   yn2=0;   /* Compute coefficents of the biquand IIR filter */   omega = 2 * 3.141592653589 * frequency / mCurRate;   sn = sin(omega);   cs = cos(omega);   a = exp(log(10.0) * dB_boost / 40);   shape = float(1.0);           /*Low Shelf filter's shape, if this is too large                            or too small it will result an unstable filter */   beta = sqrt((a * a + 1) / shape - (pow((a - 1), 2)));   /*  Coefficients  */   b0 = a * ((a + 1) - (a - 1) * cs + beta * sn);   b1 = 2 * a * ((a - 1) - (a + 1) * cs);   b2 = a * ((a + 1) - (a - 1) * cs - beta * sn);   a0 = ((a + 1) + (a - 1) * cs + beta * sn);   a1 = -2 * ((a - 1) + (a + 1) * cs);   a2 = (a + 1) + (a - 1) * cs - beta * sn;   return true;}bool EffectBassBoost::PromptUser(){   BassBoostDialog dlog(this, mParent, -1, _("BassBoost"));   dlog.freq = frequency;   dlog.boost = dB_boost;   dlog.TransferDataToWindow();   dlog.CentreOnParent();   dlog.ShowModal();   if (!dlog.GetReturnCode())      return false;   frequency = dlog.freq;   dB_boost = dlog.boost;   return true;}bool EffectBassBoost::TransferParameters( Shuttle & shuttle ){     shuttle.TransferFloat(wxT("Boost"),dB_boost,0.0);   shuttle.TransferFloat(wxT("Freq"),frequency,0.0);   return true;}bool EffectBassBoost::ProcessSimpleMono(float *buffer, sampleCount len){   /* initialise the filter */   float out, in = 0;   for (int i = 0; i < len; i++) {      in = buffer[i];      out = (b0 * in + b1 * xn1 + b2 * xn2 - a1 * yn1 - a2 * yn2) / a0;      xn2 = xn1;      xn1 = in;      yn2 = yn1;      yn1 = out;      if (out < -1.0)         out = float(-1.0);      else if (out > 1.0)         out = float(1.0);        //Prevents clipping      buffer[i] = out;   }   return true;}// WDR: class implementations//----------------------------------------------------------------------------// BassBoostDialog//----------------------------------------------------------------------------#define FREQ_MIN 1#define FREQ_MAX 1000#define BOOST_MIN 0#define BOOST_MAX 36BEGIN_EVENT_TABLE(BassBoostDialog, wxDialog)    EVT_BUTTON(ID_BUTTON_PREVIEW, BassBoostDialog::OnPreview)    EVT_BUTTON(wxID_OK, BassBoostDialog::OnOk)    EVT_BUTTON(wxID_CANCEL, BassBoostDialog::OnCancel)    EVT_SLIDER(ID_FREQ_SLIDER, BassBoostDialog::OnFreqSlider)    EVT_SLIDER(ID_BOOST_SLIDER, BassBoostDialog::OnBoostSlider)    EVT_TEXT(ID_FREQ_TEXT, BassBoostDialog::OnFreqText)    EVT_TEXT(ID_BOOST_TEXT, BassBoostDialog::OnBoostText)END_EVENT_TABLE()BassBoostDialog::BassBoostDialog(EffectBassBoost *effect,                                 wxWindow * parent, wxWindowID id,                                 const wxString & title,                                 const wxPoint & position,                                 const wxSize & size,                                 long style):   wxDialog(parent, id, title, position, size, style),   mEffect(effect){   MakeBassBoostDialog(this, TRUE, TRUE);}bool BassBoostDialog::Validate(){   return TRUE;}bool BassBoostDialog::TransferDataToWindow(){   wxSlider *slider;   slider = GetBoostSlider();   if (slider)      slider->SetValue((int)boost);   slider = GetFreqSlider();   if (slider)      slider->SetValue((int)freq);   wxTextCtrl *text = GetBoostText();   if (text) {      wxString str;      str.Printf(wxT("%d"), (int) boost);      text->SetValue(str);   }   text = GetFreqText();   if (text) {      wxString str;      str.Printf(wxT("%d"), (int) freq);      text->SetValue(str);   }   return TRUE;}bool BassBoostDialog::TransferDataFromWindow(){   wxTextCtrl *c = GetBoostText();   if (c) {      long b;      wxString val = c->GetValue();      val.ToLong(&b);      boost = TrapLong(b, BOOST_MIN, BOOST_MAX);   }   c = GetFreqText();   if (c) {      long f;      wxString val = c->GetValue();      val.ToLong(&f);      freq = TrapLong(f, FREQ_MIN, FREQ_MAX);   }   return TRUE;}// WDR: handler implementations for BassBoostDialogvoid BassBoostDialog::OnBoostText(wxCommandEvent & event){   wxTextCtrl *c = GetBoostText();   if (c) {      long boost;      c->GetValue().ToLong(&boost);      boost = TrapLong(boost, BOOST_MIN, BOOST_MAX);      wxSlider *slider = GetBoostSlider();      if (slider)         slider->SetValue(boost);   }}void BassBoostDialog::OnFreqText(wxCommandEvent & event){   wxTextCtrl *c = GetFreqText();   if (c) {      long freq;      c->GetValue().ToLong(&freq);      freq = TrapLong(freq, FREQ_MIN, FREQ_MAX);      wxSlider *slider = GetFreqSlider();      if (slider)         slider->SetValue(freq);   }}void BassBoostDialog::OnBoostSlider(wxCommandEvent & event){   wxString str;   str.Printf(wxT("%d"), GetBoostSlider()->GetValue());   GetBoostText()->SetValue(str);}void BassBoostDialog::OnFreqSlider(wxCommandEvent & event){   wxString str;   long freq = GetFreqSlider()->GetValue();   freq = ((freq + 5) / 10) * 10;       // round to nearest multiple of 10   str.Printf(wxT("%ld"), freq);   GetFreqText()->SetValue(str);}void BassBoostDialog::OnPreview(wxCommandEvent & event){   TransferDataFromWindow();   mEffect->frequency = freq;   mEffect->dB_boost = boost;   mEffect->Preview();}void BassBoostDialog::OnOk(wxCommandEvent & event){   TransferDataFromWindow();   if (Validate())      EndModal(true);   else {      event.Skip();   }}void BassBoostDialog::OnCancel(wxCommandEvent & event){   EndModal(false);}wxSizer *BassBoostDialog::MakeBassBoostDialog(wxWindow * parent, bool call_fit,                                              bool set_sizer){   wxBoxSizer *item0 = new wxBoxSizer(wxVERTICAL);   wxStaticText *item1 =       new wxStaticText(parent, -1,                        _("BassBoost by Nasca Octavian Paul"),                        wxDefaultPosition, wxDefaultSize, 0);   item0->Add(item1, 0, wxALIGN_CENTRE | wxALL, 5);   wxFlexGridSizer *item2 = new wxFlexGridSizer(3, 0, 0);   wxStaticText *item3 =       new wxStaticText(parent, -1, _("Frequency (Hz):"),                        wxDefaultPosition, wxDefaultSize, 0);   item2->Add(item3, 0, wxALIGN_CENTRE | wxALL, 5);   wxTextCtrl *item4 =       new wxTextCtrl(parent, ID_FREQ_TEXT, wxT(""), wxDefaultPosition,                      wxSize(40, -1), 0);   item2->Add(item4, 0, wxALIGN_CENTRE | wxALL, 5);   wxSlider *item5 =       new wxSlider(parent, ID_FREQ_SLIDER, 0, FREQ_MIN, FREQ_MAX,                    wxDefaultPosition, wxSize(100, -1), wxSL_HORIZONTAL);   //item5->SetValue(200);   item2->Add(item5, 0, wxALIGN_CENTRE | wxALL, 5);   wxStaticText *item6 =       new wxStaticText(parent, -1, _("Boost (dB):"), wxDefaultPosition,                        wxDefaultSize, 0);   item2->Add(item6, 0, wxALIGN_CENTRE | wxALL, 5);   wxTextCtrl *item7 =       new wxTextCtrl(parent, ID_BOOST_TEXT, wxT(""), wxDefaultPosition,                      wxSize(40, -1), 0);   item2->Add(item7, 0, wxALIGN_CENTRE | wxALL, 5);   wxSlider *item8 =       new wxSlider(parent, ID_BOOST_SLIDER, 0, BOOST_MIN, BOOST_MAX,                    wxDefaultPosition, wxSize(100, -1), wxSL_HORIZONTAL);   //item8->SetValue(12);   item2->Add(item8, 0, wxALIGN_CENTRE | wxALL, 5);   item0->Add(item2, 0, wxALIGN_CENTRE | wxALL, 5);   wxBoxSizer *item9 = new wxBoxSizer(wxHORIZONTAL);   wxButton *item9b =      new wxButton(parent, ID_BUTTON_PREVIEW, mEffect->GetPreviewName());   item9->Add(item9b, 0, wxALIGN_CENTRE | wxALL, 5);   item9->Add(20, 5); // horizontal spacer   wxButton *item11 =       new wxButton(parent, wxID_CANCEL, _("Cancel"), wxDefaultPosition,                    wxDefaultSize, 0);   item9->Add(item11, 0, wxALIGN_CENTRE | wxALL, 5);   wxButton *item10 =       new wxButton(parent, wxID_OK, _("OK"), wxDefaultPosition,                    wxDefaultSize, 0);   item10->SetDefault();   item10->SetFocus();   item9->Add(item10, 0, wxALIGN_CENTRE | wxALL, 5);   item0->Add(item9, 0, wxALIGN_CENTRE | wxALL, 5);   if (set_sizer) {      parent->SetAutoLayout(TRUE);      parent->SetSizer(item0);      if (call_fit) {         item0->Fit(parent);         item0->SetSizeHints(parent);      }   }   return item0;}// Indentation settings for Vim and Emacs and unique identifier for Arch, a// version control system. Please do not modify past this point.//// Local Variables:// c-basic-offset: 3// indent-tabs-mode: nil// End://// vim: et sts=3 sw=3// arch-tag: 25dfd7cb-9e1b-4c8d-a188-ed406c2b51b7

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -