mirror of
https://github.com/cookiengineer/audacity
synced 2025-09-24 16:01:16 +02:00
Be a bit more careful about CRLF to LF changes.
This commit is contained in:
parent
b4ba110811
commit
51cb9d9196
500
images/Arrow.xpm
500
images/Arrow.xpm
@ -1,250 +1,250 @@
|
||||
/* XPM */
|
||||
static const char * arrow_xpm[] = {
|
||||
"9 16 3 1",
|
||||
"# c #000000",
|
||||
"+ c #808080",
|
||||
". c #FFFFFF",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
"....#....",
|
||||
"....##...",
|
||||
"....###..",
|
||||
"########.",
|
||||
"#########",
|
||||
"########+",
|
||||
"++++###+.",
|
||||
"....##+..",
|
||||
"....#+...",
|
||||
"....+....",
|
||||
".........",
|
||||
"........."};
|
||||
|
||||
static const char * empty_9x16_xpm[] = {
|
||||
"9 16 2 1",
|
||||
"# c #000000",
|
||||
". c #FFFFFF",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
"........."};
|
||||
|
||||
/* XPM */
|
||||
static const char * arrow15x15_xpm[] = {
|
||||
"15 15 24 1",
|
||||
" c None",
|
||||
". c #FFFFFF",
|
||||
"+ c #929292",
|
||||
"@ c #000000",
|
||||
"# c #9F9F9F",
|
||||
"$ c #262626",
|
||||
"% c #D8D8D8",
|
||||
"& c #5F5F5F",
|
||||
"* c #FEFEFE",
|
||||
"= c #4F4F4F",
|
||||
"- c #888888",
|
||||
"; c #808080",
|
||||
"> c #828282",
|
||||
", c #2A2A2A",
|
||||
"' c #7F7F7F",
|
||||
") c #D5D5D5",
|
||||
"! c #111111",
|
||||
"~ c #646464",
|
||||
"{ c #B8B8B8",
|
||||
"] c #989898",
|
||||
"^ c #3A3A3A",
|
||||
"/ c #9B9B9B",
|
||||
"( c #EDEDED",
|
||||
"_ c #C9C9C9",
|
||||
"...............",
|
||||
"...............",
|
||||
"...............",
|
||||
"......+@+......",
|
||||
"......#@@$%....",
|
||||
"......#@@@@&*..",
|
||||
"@@@@@@@@@@@@@#.",
|
||||
"@@@@@@@@@@@@@@@",
|
||||
"@@@@@@@@@@@@@=-",
|
||||
";;;;>-=@@@@,').",
|
||||
"......#@@!~{*..",
|
||||
"......]@^/(....",
|
||||
"......_;_......",
|
||||
"...............",
|
||||
"..............."};
|
||||
|
||||
/* XPM */
|
||||
static const char * unchecked_xpm[] = {
|
||||
"15 15 56 1",
|
||||
" c None",
|
||||
". c #FFFFFF",
|
||||
"+ c #8E8F8F",
|
||||
"@ c #F4F4F4",
|
||||
"# c #AEB3B9",
|
||||
"$ c #AFB4BA",
|
||||
"% c #B4B9BD",
|
||||
"& c #BBBEC1",
|
||||
"* c #CBCFD5",
|
||||
"= c #D0D3D8",
|
||||
"- c #D5D8DC",
|
||||
"; c #DBDDDF",
|
||||
"> c #C1C3C5",
|
||||
", c #CDD1D6",
|
||||
"' c #D2D5DA",
|
||||
") c #D8DBDE",
|
||||
"! c #DDDFE1",
|
||||
"~ c #E2E3E4",
|
||||
"{ c #C6C7C8",
|
||||
"] c #CDD1D7",
|
||||
"^ c #D0D4D9",
|
||||
"/ c #D4D7DB",
|
||||
"( c #E1E2E3",
|
||||
"_ c #E5E6E6",
|
||||
": c #E8E8E8",
|
||||
"< c #CCCDCD",
|
||||
"[ c #B2B7BC",
|
||||
"} c #DADCDF",
|
||||
"| c #E0E1E3",
|
||||
"1 c #ECECEC",
|
||||
"2 c #EDEDED",
|
||||
"3 c #D4D5D6",
|
||||
"4 c #B8BBBF",
|
||||
"5 c #E4E5E5",
|
||||
"6 c #EAEAEA",
|
||||
"7 c #EFEFEF",
|
||||
"8 c #F2F2F2",
|
||||
"9 c #DCDDDE",
|
||||
"0 c #BCBFC2",
|
||||
"a c #E3E4E5",
|
||||
"b c #E9E9E9",
|
||||
"c c #F5F5F5",
|
||||
"d c #E1E2E2",
|
||||
"e c #C2C4C6",
|
||||
"f c #F0F0F0",
|
||||
"g c #F6F6F6",
|
||||
"h c #E6E6E6",
|
||||
"i c #CACBCC",
|
||||
"j c #D4D4D5",
|
||||
"k c #DBDBDC",
|
||||
"l c #E0E1E1",
|
||||
"m c #E6E7E7",
|
||||
"n c #EAEBEB",
|
||||
"o c #EBECEC",
|
||||
"p c #EBEBEC",
|
||||
"q c #E9E9EA",
|
||||
"...............",
|
||||
".+++++++++++++.",
|
||||
".+@@@@@@@@@@@+.",
|
||||
".+@######$%&@+.",
|
||||
".+@#****=-;>@+.",
|
||||
".+@#**,')!~{@+.",
|
||||
".+@#]^/;(_:<@+.",
|
||||
".+@[-}|:1223@+.",
|
||||
".+@4!5678889@+.",
|
||||
".+@0ab28@c@d@+.",
|
||||
".+@eb2f@gggh@+.",
|
||||
".+@ijklmnopq@+.",
|
||||
".+@@@@@@@@@@@+.",
|
||||
".+++++++++++++.",
|
||||
"..............."};
|
||||
|
||||
/* XPM */
|
||||
static const char * checked_xpm[] = {
|
||||
"15 15 70 1",
|
||||
" c #FFFFFF",
|
||||
". c #8E8F8F",
|
||||
"+ c #F4F4F4",
|
||||
"@ c #F8F8F8",
|
||||
"# c #F9F9F9",
|
||||
"$ c #F6F6F6",
|
||||
"% c #AEB3B9",
|
||||
"& c #C9CCD0",
|
||||
"* c #76DB7E",
|
||||
"= c #45CE4F",
|
||||
"- c #DCDFE4",
|
||||
"; c #F5F5F5",
|
||||
"> c #CBCFD5",
|
||||
", c #C9D3D2",
|
||||
"' c #EBEFEF",
|
||||
") c #2EAF37",
|
||||
"! c #289730",
|
||||
"~ c #9CE5A2",
|
||||
"{ c #CDD1D6",
|
||||
"] c #E0E2E6",
|
||||
"^ c #90E196",
|
||||
"/ c #3DB351",
|
||||
"( c #E4EAE5",
|
||||
"_ c #ADB5B7",
|
||||
": c #D5D9DD",
|
||||
"< c #DFE2E5",
|
||||
"[ c #D5D8DC",
|
||||
"} c #EFF5F1",
|
||||
"| c #30B93A",
|
||||
"1 c #289B31",
|
||||
"2 c #A1E6A6",
|
||||
"3 c #DBDCDC",
|
||||
"4 c #C5C9CD",
|
||||
"5 c #B3EAB7",
|
||||
"6 c #87D693",
|
||||
"7 c #E9F1EA",
|
||||
"8 c #A0E5A5",
|
||||
"9 c #299E32",
|
||||
"0 c #33C23D",
|
||||
"a c #D5D5D6",
|
||||
"b c #CDF2D0",
|
||||
"c c #3ACB45",
|
||||
"d c #299A33",
|
||||
"e c #BFE9C6",
|
||||
"f c #33C43E",
|
||||
"g c #2A9F32",
|
||||
"h c #9BE4A0",
|
||||
"i c #F5F7F5",
|
||||
"j c #DCDDDE",
|
||||
"k c #C8D4CC",
|
||||
"l c #D0EFD5",
|
||||
"m c #299C31",
|
||||
"n c #32BD3C",
|
||||
"o c #F7FAF9",
|
||||
"p c #DFE4E0",
|
||||
"q c #C6C8CA",
|
||||
"r c #E5F0E9",
|
||||
"s c #62D56A",
|
||||
"t c #2BA233",
|
||||
"u c #93E299",
|
||||
"v c #F7F9F8",
|
||||
"w c #E5E7E5",
|
||||
"x c #CACBCC",
|
||||
"y c #D9DBDA",
|
||||
"z c #DEE3E8",
|
||||
"A c #76C38B",
|
||||
"B c #F2F3F6",
|
||||
"C c #ECEDED",
|
||||
"D c #EBEBEC",
|
||||
"E c #E9E9EA",
|
||||
" ",
|
||||
" ............. ",
|
||||
" .+++++++@#$+. ",
|
||||
" .+%%%%%&*=-;. ",
|
||||
" .+%>>>,')!~$. ",
|
||||
" .+%>>{]^!/(+. ",
|
||||
" .+_:<[}|123+. ",
|
||||
" .+4567890@a+. ",
|
||||
" .+bcdefghij+. ",
|
||||
" .+klm9gno+p+. ",
|
||||
" .+qrs9tuv$w+. ",
|
||||
" .+xyzsABCDE+. ",
|
||||
" .+++;#@;++++. ",
|
||||
" ............. ",
|
||||
" "};
|
||||
/* XPM */
|
||||
static const char * arrow_xpm[] = {
|
||||
"9 16 3 1",
|
||||
"# c #000000",
|
||||
"+ c #808080",
|
||||
". c #FFFFFF",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
"....#....",
|
||||
"....##...",
|
||||
"....###..",
|
||||
"########.",
|
||||
"#########",
|
||||
"########+",
|
||||
"++++###+.",
|
||||
"....##+..",
|
||||
"....#+...",
|
||||
"....+....",
|
||||
".........",
|
||||
"........."};
|
||||
|
||||
static const char * empty_9x16_xpm[] = {
|
||||
"9 16 2 1",
|
||||
"# c #000000",
|
||||
". c #FFFFFF",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
".........",
|
||||
"........."};
|
||||
|
||||
/* XPM */
|
||||
static const char * arrow15x15_xpm[] = {
|
||||
"15 15 24 1",
|
||||
" c None",
|
||||
". c #FFFFFF",
|
||||
"+ c #929292",
|
||||
"@ c #000000",
|
||||
"# c #9F9F9F",
|
||||
"$ c #262626",
|
||||
"% c #D8D8D8",
|
||||
"& c #5F5F5F",
|
||||
"* c #FEFEFE",
|
||||
"= c #4F4F4F",
|
||||
"- c #888888",
|
||||
"; c #808080",
|
||||
"> c #828282",
|
||||
", c #2A2A2A",
|
||||
"' c #7F7F7F",
|
||||
") c #D5D5D5",
|
||||
"! c #111111",
|
||||
"~ c #646464",
|
||||
"{ c #B8B8B8",
|
||||
"] c #989898",
|
||||
"^ c #3A3A3A",
|
||||
"/ c #9B9B9B",
|
||||
"( c #EDEDED",
|
||||
"_ c #C9C9C9",
|
||||
"...............",
|
||||
"...............",
|
||||
"...............",
|
||||
"......+@+......",
|
||||
"......#@@$%....",
|
||||
"......#@@@@&*..",
|
||||
"@@@@@@@@@@@@@#.",
|
||||
"@@@@@@@@@@@@@@@",
|
||||
"@@@@@@@@@@@@@=-",
|
||||
";;;;>-=@@@@,').",
|
||||
"......#@@!~{*..",
|
||||
"......]@^/(....",
|
||||
"......_;_......",
|
||||
"...............",
|
||||
"..............."};
|
||||
|
||||
/* XPM */
|
||||
static const char * unchecked_xpm[] = {
|
||||
"15 15 56 1",
|
||||
" c None",
|
||||
". c #FFFFFF",
|
||||
"+ c #8E8F8F",
|
||||
"@ c #F4F4F4",
|
||||
"# c #AEB3B9",
|
||||
"$ c #AFB4BA",
|
||||
"% c #B4B9BD",
|
||||
"& c #BBBEC1",
|
||||
"* c #CBCFD5",
|
||||
"= c #D0D3D8",
|
||||
"- c #D5D8DC",
|
||||
"; c #DBDDDF",
|
||||
"> c #C1C3C5",
|
||||
", c #CDD1D6",
|
||||
"' c #D2D5DA",
|
||||
") c #D8DBDE",
|
||||
"! c #DDDFE1",
|
||||
"~ c #E2E3E4",
|
||||
"{ c #C6C7C8",
|
||||
"] c #CDD1D7",
|
||||
"^ c #D0D4D9",
|
||||
"/ c #D4D7DB",
|
||||
"( c #E1E2E3",
|
||||
"_ c #E5E6E6",
|
||||
": c #E8E8E8",
|
||||
"< c #CCCDCD",
|
||||
"[ c #B2B7BC",
|
||||
"} c #DADCDF",
|
||||
"| c #E0E1E3",
|
||||
"1 c #ECECEC",
|
||||
"2 c #EDEDED",
|
||||
"3 c #D4D5D6",
|
||||
"4 c #B8BBBF",
|
||||
"5 c #E4E5E5",
|
||||
"6 c #EAEAEA",
|
||||
"7 c #EFEFEF",
|
||||
"8 c #F2F2F2",
|
||||
"9 c #DCDDDE",
|
||||
"0 c #BCBFC2",
|
||||
"a c #E3E4E5",
|
||||
"b c #E9E9E9",
|
||||
"c c #F5F5F5",
|
||||
"d c #E1E2E2",
|
||||
"e c #C2C4C6",
|
||||
"f c #F0F0F0",
|
||||
"g c #F6F6F6",
|
||||
"h c #E6E6E6",
|
||||
"i c #CACBCC",
|
||||
"j c #D4D4D5",
|
||||
"k c #DBDBDC",
|
||||
"l c #E0E1E1",
|
||||
"m c #E6E7E7",
|
||||
"n c #EAEBEB",
|
||||
"o c #EBECEC",
|
||||
"p c #EBEBEC",
|
||||
"q c #E9E9EA",
|
||||
"...............",
|
||||
".+++++++++++++.",
|
||||
".+@@@@@@@@@@@+.",
|
||||
".+@######$%&@+.",
|
||||
".+@#****=-;>@+.",
|
||||
".+@#**,')!~{@+.",
|
||||
".+@#]^/;(_:<@+.",
|
||||
".+@[-}|:1223@+.",
|
||||
".+@4!5678889@+.",
|
||||
".+@0ab28@c@d@+.",
|
||||
".+@eb2f@gggh@+.",
|
||||
".+@ijklmnopq@+.",
|
||||
".+@@@@@@@@@@@+.",
|
||||
".+++++++++++++.",
|
||||
"..............."};
|
||||
|
||||
/* XPM */
|
||||
static const char * checked_xpm[] = {
|
||||
"15 15 70 1",
|
||||
" c #FFFFFF",
|
||||
". c #8E8F8F",
|
||||
"+ c #F4F4F4",
|
||||
"@ c #F8F8F8",
|
||||
"# c #F9F9F9",
|
||||
"$ c #F6F6F6",
|
||||
"% c #AEB3B9",
|
||||
"& c #C9CCD0",
|
||||
"* c #76DB7E",
|
||||
"= c #45CE4F",
|
||||
"- c #DCDFE4",
|
||||
"; c #F5F5F5",
|
||||
"> c #CBCFD5",
|
||||
", c #C9D3D2",
|
||||
"' c #EBEFEF",
|
||||
") c #2EAF37",
|
||||
"! c #289730",
|
||||
"~ c #9CE5A2",
|
||||
"{ c #CDD1D6",
|
||||
"] c #E0E2E6",
|
||||
"^ c #90E196",
|
||||
"/ c #3DB351",
|
||||
"( c #E4EAE5",
|
||||
"_ c #ADB5B7",
|
||||
": c #D5D9DD",
|
||||
"< c #DFE2E5",
|
||||
"[ c #D5D8DC",
|
||||
"} c #EFF5F1",
|
||||
"| c #30B93A",
|
||||
"1 c #289B31",
|
||||
"2 c #A1E6A6",
|
||||
"3 c #DBDCDC",
|
||||
"4 c #C5C9CD",
|
||||
"5 c #B3EAB7",
|
||||
"6 c #87D693",
|
||||
"7 c #E9F1EA",
|
||||
"8 c #A0E5A5",
|
||||
"9 c #299E32",
|
||||
"0 c #33C23D",
|
||||
"a c #D5D5D6",
|
||||
"b c #CDF2D0",
|
||||
"c c #3ACB45",
|
||||
"d c #299A33",
|
||||
"e c #BFE9C6",
|
||||
"f c #33C43E",
|
||||
"g c #2A9F32",
|
||||
"h c #9BE4A0",
|
||||
"i c #F5F7F5",
|
||||
"j c #DCDDDE",
|
||||
"k c #C8D4CC",
|
||||
"l c #D0EFD5",
|
||||
"m c #299C31",
|
||||
"n c #32BD3C",
|
||||
"o c #F7FAF9",
|
||||
"p c #DFE4E0",
|
||||
"q c #C6C8CA",
|
||||
"r c #E5F0E9",
|
||||
"s c #62D56A",
|
||||
"t c #2BA233",
|
||||
"u c #93E299",
|
||||
"v c #F7F9F8",
|
||||
"w c #E5E7E5",
|
||||
"x c #CACBCC",
|
||||
"y c #D9DBDA",
|
||||
"z c #DEE3E8",
|
||||
"A c #76C38B",
|
||||
"B c #F2F3F6",
|
||||
"C c #ECEDED",
|
||||
"D c #EBEBEC",
|
||||
"E c #E9E9EA",
|
||||
" ",
|
||||
" ............. ",
|
||||
" .+++++++@#$+. ",
|
||||
" .+%%%%%&*=-;. ",
|
||||
" .+%>>>,')!~$. ",
|
||||
" .+%>>{]^!/(+. ",
|
||||
" .+_:<[}|123+. ",
|
||||
" .+4567890@a+. ",
|
||||
" .+bcdefghij+. ",
|
||||
" .+klm9gno+p+. ",
|
||||
" .+qrs9tuv$w+. ",
|
||||
" .+xyzsABCDE+. ",
|
||||
" .+++;#@;++++. ",
|
||||
" ............. ",
|
||||
" "};
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,152 +1,152 @@
|
||||
/**********************************************************************
|
||||
|
||||
Audacity: A Digital Audio Editor
|
||||
Audacity(R) is copyright (c) 1999-2013 Audacity Team.
|
||||
License: GPL v2. See License.txt.
|
||||
|
||||
Reverb.h
|
||||
Rob Sykes, Vaughan Johnson
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __AUDACITY_EFFECT_REVERB__
|
||||
#define __AUDACITY_EFFECT_REVERB__
|
||||
|
||||
#include <wx/checkbox.h>
|
||||
#include <wx/dialog.h>
|
||||
#include <wx/intl.h>
|
||||
#include <wx/slider.h>
|
||||
|
||||
#include "Effect.h"
|
||||
|
||||
class wxSpinCtrl;
|
||||
class WaveTrack;
|
||||
|
||||
struct Reverb_priv_t;
|
||||
|
||||
class EffectReverb : public Effect
|
||||
{
|
||||
public:
|
||||
EffectReverb();
|
||||
virtual ~EffectReverb() {};
|
||||
|
||||
// Base class:
|
||||
wxString GetEffectName() {return _("Reverb...");}
|
||||
wxString GetEffectAction() {return _("Applying Reverb");}
|
||||
wxString GetEffectDescription(); // Useful only after PromptUser values have been set.
|
||||
bool TransferParameters(Shuttle & shuttle);
|
||||
|
||||
protected:
|
||||
bool PromptUser();
|
||||
bool Process();
|
||||
|
||||
// Processing:
|
||||
void Create(double rate, bool isStereo);
|
||||
bool ProcessOneBlock(sampleCount len, float * const * chans);
|
||||
bool ProcessOneTrack(size_t n, WaveTrack * track, WaveTrack * track2, wxString const & msg);
|
||||
void Delete();
|
||||
double mCurT0, mCurT1;
|
||||
Reverb_priv_t * mP;
|
||||
|
||||
// Settings:
|
||||
wxString SettingsPath(int settingsNumber) const;
|
||||
wxString SettingsName(int settingsNumber) const;
|
||||
|
||||
struct Params {
|
||||
double mRoomSize;
|
||||
double mDelay;
|
||||
double mReverberance;
|
||||
double mHfDamping;
|
||||
double mToneLow;
|
||||
double mToneHigh;
|
||||
double mWetGain;
|
||||
double mDryGain;
|
||||
double mStereoWidth;
|
||||
bool mWetOnly;
|
||||
};
|
||||
void LoadSettings(int settingsNumber, Params & params);
|
||||
void SaveSettings(int settingsNumber, Params const * params, wxString const * name = 0) const;
|
||||
|
||||
Params mParams;
|
||||
|
||||
friend class ReverbDialogue;
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// ReverbDialogue
|
||||
//----------------------------------------------------------------------------
|
||||
class ReverbDialogue : public EffectDialog
|
||||
{
|
||||
public:
|
||||
ReverbDialogue(EffectReverb * effect, wxWindow * parent);
|
||||
virtual ~ReverbDialogue() {};
|
||||
|
||||
private:
|
||||
void SetTitle(wxString const & name = wxT(""));
|
||||
void PopulateOrExchange(ShuttleGui &);
|
||||
bool TransferDataToWindow();
|
||||
bool TransferDataFromWindow();
|
||||
|
||||
void LoadPreset(wxCommandEvent & WXUNUSED(event));
|
||||
int ChooseSettings(wxString const & message);
|
||||
void LoadSettings(wxCommandEvent & WXUNUSED(event));
|
||||
void RenameSettings(wxCommandEvent & WXUNUSED(event));
|
||||
void SaveSettings(wxCommandEvent & WXUNUSED(event));
|
||||
void OnPreview(wxCommandEvent & event);
|
||||
|
||||
// event handlers and member vars
|
||||
void OnRoomSizeWidget(wxCommandEvent & event);
|
||||
void OnRoomSizeText(wxCommandEvent & event);
|
||||
wxSlider * mRoomSizeWidget;
|
||||
wxSpinCtrl * mRoomSizeText;
|
||||
|
||||
void OnDelayWidget(wxCommandEvent & event);
|
||||
void OnDelayText(wxCommandEvent & event);
|
||||
wxSlider * mDelayWidget;
|
||||
wxSpinCtrl * mDelayText;
|
||||
|
||||
void OnReverberanceWidget(wxCommandEvent & event);
|
||||
void OnReverberanceText(wxCommandEvent & event);
|
||||
wxSlider * mReverberanceWidget;
|
||||
wxSpinCtrl * mReverberanceText;
|
||||
|
||||
void OnHfDampingWidget(wxCommandEvent & event);
|
||||
void OnHfDampingText(wxCommandEvent & event);
|
||||
wxSlider * mHfDampingWidget;
|
||||
wxSpinCtrl * mHfDampingText;
|
||||
|
||||
void OnToneLowWidget(wxCommandEvent & event);
|
||||
void OnToneLowText(wxCommandEvent & event);
|
||||
wxSlider * mToneLowWidget;
|
||||
wxSpinCtrl * mToneLowText;
|
||||
|
||||
void OnToneHighWidget(wxCommandEvent & event);
|
||||
void OnToneHighText(wxCommandEvent & event);
|
||||
wxSlider * mToneHighWidget;
|
||||
wxSpinCtrl * mToneHighText;
|
||||
|
||||
void OnWetGainWidget(wxCommandEvent & event);
|
||||
void OnWetGainText(wxCommandEvent & event);
|
||||
wxSlider * mWetGainWidget;
|
||||
wxSpinCtrl * mWetGainText;
|
||||
|
||||
void OnDryGainWidget(wxCommandEvent & event);
|
||||
void OnDryGainText(wxCommandEvent & event);
|
||||
wxSlider * mDryGainWidget;
|
||||
wxSpinCtrl * mDryGainText;
|
||||
|
||||
void OnStereoWidthWidget(wxCommandEvent & event);
|
||||
void OnStereoWidthText(wxCommandEvent & event);
|
||||
wxSlider * mStereoWidthWidget;
|
||||
wxSpinCtrl * mStereoWidthText;
|
||||
|
||||
wxCheckBox * mWetOnlyWidget;
|
||||
|
||||
|
||||
EffectReverb & mEffect;
|
||||
EffectReverb::Params & mParams;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
#endif
|
||||
/**********************************************************************
|
||||
|
||||
Audacity: A Digital Audio Editor
|
||||
Audacity(R) is copyright (c) 1999-2013 Audacity Team.
|
||||
License: GPL v2. See License.txt.
|
||||
|
||||
Reverb.h
|
||||
Rob Sykes, Vaughan Johnson
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#ifndef __AUDACITY_EFFECT_REVERB__
|
||||
#define __AUDACITY_EFFECT_REVERB__
|
||||
|
||||
#include <wx/checkbox.h>
|
||||
#include <wx/dialog.h>
|
||||
#include <wx/intl.h>
|
||||
#include <wx/slider.h>
|
||||
|
||||
#include "Effect.h"
|
||||
|
||||
class wxSpinCtrl;
|
||||
class WaveTrack;
|
||||
|
||||
struct Reverb_priv_t;
|
||||
|
||||
class EffectReverb : public Effect
|
||||
{
|
||||
public:
|
||||
EffectReverb();
|
||||
virtual ~EffectReverb() {};
|
||||
|
||||
// Base class:
|
||||
wxString GetEffectName() {return _("Reverb...");}
|
||||
wxString GetEffectAction() {return _("Applying Reverb");}
|
||||
wxString GetEffectDescription(); // Useful only after PromptUser values have been set.
|
||||
bool TransferParameters(Shuttle & shuttle);
|
||||
|
||||
protected:
|
||||
bool PromptUser();
|
||||
bool Process();
|
||||
|
||||
// Processing:
|
||||
void Create(double rate, bool isStereo);
|
||||
bool ProcessOneBlock(sampleCount len, float * const * chans);
|
||||
bool ProcessOneTrack(size_t n, WaveTrack * track, WaveTrack * track2, wxString const & msg);
|
||||
void Delete();
|
||||
double mCurT0, mCurT1;
|
||||
Reverb_priv_t * mP;
|
||||
|
||||
// Settings:
|
||||
wxString SettingsPath(int settingsNumber) const;
|
||||
wxString SettingsName(int settingsNumber) const;
|
||||
|
||||
struct Params {
|
||||
double mRoomSize;
|
||||
double mDelay;
|
||||
double mReverberance;
|
||||
double mHfDamping;
|
||||
double mToneLow;
|
||||
double mToneHigh;
|
||||
double mWetGain;
|
||||
double mDryGain;
|
||||
double mStereoWidth;
|
||||
bool mWetOnly;
|
||||
};
|
||||
void LoadSettings(int settingsNumber, Params & params);
|
||||
void SaveSettings(int settingsNumber, Params const * params, wxString const * name = 0) const;
|
||||
|
||||
Params mParams;
|
||||
|
||||
friend class ReverbDialogue;
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// ReverbDialogue
|
||||
//----------------------------------------------------------------------------
|
||||
class ReverbDialogue : public EffectDialog
|
||||
{
|
||||
public:
|
||||
ReverbDialogue(EffectReverb * effect, wxWindow * parent);
|
||||
virtual ~ReverbDialogue() {};
|
||||
|
||||
private:
|
||||
void SetTitle(wxString const & name = wxT(""));
|
||||
void PopulateOrExchange(ShuttleGui &);
|
||||
bool TransferDataToWindow();
|
||||
bool TransferDataFromWindow();
|
||||
|
||||
void LoadPreset(wxCommandEvent & WXUNUSED(event));
|
||||
int ChooseSettings(wxString const & message);
|
||||
void LoadSettings(wxCommandEvent & WXUNUSED(event));
|
||||
void RenameSettings(wxCommandEvent & WXUNUSED(event));
|
||||
void SaveSettings(wxCommandEvent & WXUNUSED(event));
|
||||
void OnPreview(wxCommandEvent & event);
|
||||
|
||||
// event handlers and member vars
|
||||
void OnRoomSizeWidget(wxCommandEvent & event);
|
||||
void OnRoomSizeText(wxCommandEvent & event);
|
||||
wxSlider * mRoomSizeWidget;
|
||||
wxSpinCtrl * mRoomSizeText;
|
||||
|
||||
void OnDelayWidget(wxCommandEvent & event);
|
||||
void OnDelayText(wxCommandEvent & event);
|
||||
wxSlider * mDelayWidget;
|
||||
wxSpinCtrl * mDelayText;
|
||||
|
||||
void OnReverberanceWidget(wxCommandEvent & event);
|
||||
void OnReverberanceText(wxCommandEvent & event);
|
||||
wxSlider * mReverberanceWidget;
|
||||
wxSpinCtrl * mReverberanceText;
|
||||
|
||||
void OnHfDampingWidget(wxCommandEvent & event);
|
||||
void OnHfDampingText(wxCommandEvent & event);
|
||||
wxSlider * mHfDampingWidget;
|
||||
wxSpinCtrl * mHfDampingText;
|
||||
|
||||
void OnToneLowWidget(wxCommandEvent & event);
|
||||
void OnToneLowText(wxCommandEvent & event);
|
||||
wxSlider * mToneLowWidget;
|
||||
wxSpinCtrl * mToneLowText;
|
||||
|
||||
void OnToneHighWidget(wxCommandEvent & event);
|
||||
void OnToneHighText(wxCommandEvent & event);
|
||||
wxSlider * mToneHighWidget;
|
||||
wxSpinCtrl * mToneHighText;
|
||||
|
||||
void OnWetGainWidget(wxCommandEvent & event);
|
||||
void OnWetGainText(wxCommandEvent & event);
|
||||
wxSlider * mWetGainWidget;
|
||||
wxSpinCtrl * mWetGainText;
|
||||
|
||||
void OnDryGainWidget(wxCommandEvent & event);
|
||||
void OnDryGainText(wxCommandEvent & event);
|
||||
wxSlider * mDryGainWidget;
|
||||
wxSpinCtrl * mDryGainText;
|
||||
|
||||
void OnStereoWidthWidget(wxCommandEvent & event);
|
||||
void OnStereoWidthText(wxCommandEvent & event);
|
||||
wxSlider * mStereoWidthWidget;
|
||||
wxSpinCtrl * mStereoWidthText;
|
||||
|
||||
wxCheckBox * mWetOnlyWidget;
|
||||
|
||||
|
||||
EffectReverb & mEffect;
|
||||
EffectReverb::Params & mParams;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -1,270 +1,270 @@
|
||||
/**********************************************************************
|
||||
|
||||
Audacity: A Digital Audio Editor
|
||||
|
||||
Reverb_libSoX.h
|
||||
Stereo reverberation effect from libSoX,
|
||||
adapted for Audacity (audacity.sourceforge.net)
|
||||
|
||||
Copyright (c) 2007-2013 robs@users.sourceforge.net
|
||||
Licence: LGPL v2.1
|
||||
Filter configuration based on freeverb by Jezar Wakefield.
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#include <cstring>
|
||||
#include <cstdlib>
|
||||
#ifdef __WXMSW__
|
||||
#define M_LN10 2.30258509299404568402 /* log_e 10 */
|
||||
#else
|
||||
#include <cmath>
|
||||
#endif
|
||||
#include <algorithm>
|
||||
using std::min;
|
||||
using std::max;
|
||||
|
||||
#define array_length(a) (sizeof(a)/sizeof(a[0]))
|
||||
#define dB_to_linear(x) exp((x) * M_LN10 * 0.05)
|
||||
#define midi_to_freq(n) (440 * pow(2,((n)-69)/12.))
|
||||
#define FIFO_SIZE_T size_t
|
||||
#define FIFO_MIN 0x4000
|
||||
#define fifo_read_ptr(f) fifo_read(f, (FIFO_SIZE_T)0, NULL)
|
||||
#define lsx_zalloc(var, n) var = (float *)calloc(n, sizeof(*var))
|
||||
#define filter_advance(p) if (--(p)->ptr < (p)->buffer) (p)->ptr += (p)->size
|
||||
#define filter_delete(p) free((p)->buffer)
|
||||
|
||||
typedef struct {
|
||||
char * data;
|
||||
size_t allocation; /* Number of bytes allocated for data. */
|
||||
size_t item_size; /* Size of each item in data */
|
||||
size_t begin; /* Offset of the first byte to read. */
|
||||
size_t end; /* 1 + Offset of the last byte byte to read. */
|
||||
} fifo_t;
|
||||
|
||||
static void fifo_clear(fifo_t * f)
|
||||
{
|
||||
f->end = f->begin = 0;
|
||||
}
|
||||
|
||||
static void * fifo_reserve(fifo_t * f, FIFO_SIZE_T n)
|
||||
{
|
||||
n *= f->item_size;
|
||||
|
||||
if (f->begin == f->end)
|
||||
fifo_clear(f);
|
||||
|
||||
while (1) {
|
||||
if (f->end + n <= f->allocation) {
|
||||
void *p = f->data + f->end;
|
||||
|
||||
f->end += n;
|
||||
return p;
|
||||
}
|
||||
if (f->begin > FIFO_MIN) {
|
||||
memmove(f->data, f->data + f->begin, f->end - f->begin);
|
||||
f->end -= f->begin;
|
||||
f->begin = 0;
|
||||
continue;
|
||||
}
|
||||
f->allocation += n;
|
||||
f->data = (char *)realloc(f->data, f->allocation);
|
||||
}
|
||||
}
|
||||
|
||||
static void * fifo_write(fifo_t * f, FIFO_SIZE_T n, void const * data)
|
||||
{
|
||||
void * s = fifo_reserve(f, n);
|
||||
if (data)
|
||||
memcpy(s, data, n * f->item_size);
|
||||
return s;
|
||||
}
|
||||
|
||||
static void * fifo_read(fifo_t * f, FIFO_SIZE_T n, void * data)
|
||||
{
|
||||
char * ret = f->data + f->begin;
|
||||
n *= f->item_size;
|
||||
if (n > (FIFO_SIZE_T)(f->end - f->begin))
|
||||
return NULL;
|
||||
if (data)
|
||||
memcpy(data, ret, (size_t)n);
|
||||
f->begin += n;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void fifo_delete(fifo_t * f)
|
||||
{
|
||||
free(f->data);
|
||||
}
|
||||
|
||||
static void fifo_create(fifo_t * f, FIFO_SIZE_T item_size)
|
||||
{
|
||||
f->item_size = item_size;
|
||||
f->allocation = FIFO_MIN;
|
||||
f->data = (char *)malloc(f->allocation);
|
||||
fifo_clear(f);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
size_t size;
|
||||
float * buffer, * ptr;
|
||||
float store;
|
||||
} filter_t;
|
||||
|
||||
static float comb_process(filter_t * p, /* gcc -O2 will inline this */
|
||||
float const * input, float const * feedback, float const * hf_damping)
|
||||
{
|
||||
float output = *p->ptr;
|
||||
p->store = output + (p->store - output) * *hf_damping;
|
||||
*p->ptr = *input + p->store * *feedback;
|
||||
filter_advance(p);
|
||||
return output;
|
||||
}
|
||||
|
||||
static float allpass_process(filter_t * p, /* gcc -O2 will inline this */
|
||||
float const * input)
|
||||
{
|
||||
float output = *p->ptr;
|
||||
*p->ptr = *input + output * .5;
|
||||
filter_advance(p);
|
||||
return output - *input;
|
||||
}
|
||||
|
||||
typedef struct {double b0, b1, a1, i1, o1;} one_pole_t;
|
||||
|
||||
static float one_pole_process(one_pole_t * p, float i0)
|
||||
{
|
||||
float o0 = i0*p->b0 + p->i1*p->b1 - p->o1*p->a1;
|
||||
p->i1 = i0;
|
||||
return p->o1 = o0;
|
||||
}
|
||||
|
||||
static const size_t /* Filter delay lengths in samples (44100Hz sample-rate) */
|
||||
comb_lengths[] = {1116, 1188, 1277, 1356, 1422, 1491, 1557, 1617},
|
||||
allpass_lengths[] = {225, 341, 441, 556}, stereo_adjust = 12;
|
||||
|
||||
typedef struct {
|
||||
filter_t comb [array_length(comb_lengths)];
|
||||
filter_t allpass[array_length(allpass_lengths)];
|
||||
one_pole_t one_pole[2];
|
||||
} filter_array_t;
|
||||
|
||||
static void filter_array_create(filter_array_t * p, double rate,
|
||||
double scale, double offset, double fc_highpass, double fc_lowpass)
|
||||
{
|
||||
size_t i;
|
||||
double r = rate * (1 / 44100.); /* Compensate for actual sample-rate */
|
||||
|
||||
for (i = 0; i < array_length(comb_lengths); ++i, offset = -offset)
|
||||
{
|
||||
filter_t * pcomb = &p->comb[i];
|
||||
pcomb->size = (size_t)(scale * r * (comb_lengths[i] + stereo_adjust * offset) + .5);
|
||||
pcomb->ptr = lsx_zalloc(pcomb->buffer, pcomb->size);
|
||||
}
|
||||
for (i = 0; i < array_length(allpass_lengths); ++i, offset = -offset)
|
||||
{
|
||||
filter_t * pallpass = &p->allpass[i];
|
||||
pallpass->size = (size_t)(r * (allpass_lengths[i] + stereo_adjust * offset) + .5);
|
||||
pallpass->ptr = lsx_zalloc(pallpass->buffer, pallpass->size);
|
||||
}
|
||||
{ /* EQ: highpass */
|
||||
one_pole_t * q = &p->one_pole[0];
|
||||
q->a1 = -exp(-2 * M_PI * fc_highpass / rate);
|
||||
q->b0 = (1 - q->a1)/2, q->b1 = -q->b0;
|
||||
}
|
||||
{ /* EQ: lowpass */
|
||||
one_pole_t * q = &p->one_pole[1];
|
||||
q->a1 = -exp(-2 * M_PI * fc_lowpass / rate);
|
||||
q->b0 = 1 + q->a1, q->b1 = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void filter_array_process(filter_array_t * p,
|
||||
size_t length, float const * input, float * output,
|
||||
float const * feedback, float const * hf_damping, float const * gain)
|
||||
{
|
||||
while (length--) {
|
||||
float out = 0, in = *input++;
|
||||
|
||||
size_t i = array_length(comb_lengths) - 1;
|
||||
do out += comb_process(p->comb + i, &in, feedback, hf_damping);
|
||||
while (i--);
|
||||
|
||||
i = array_length(allpass_lengths) - 1;
|
||||
do out = allpass_process(p->allpass + i, &out);
|
||||
while (i--);
|
||||
|
||||
out = one_pole_process(&p->one_pole[0], out);
|
||||
out = one_pole_process(&p->one_pole[1], out);
|
||||
*output++ = out * *gain;
|
||||
}
|
||||
}
|
||||
|
||||
static void filter_array_delete(filter_array_t * p)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < array_length(allpass_lengths); ++i)
|
||||
filter_delete(&p->allpass[i]);
|
||||
for (i = 0; i < array_length(comb_lengths); ++i)
|
||||
filter_delete(&p->comb[i]);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
float feedback;
|
||||
float hf_damping;
|
||||
float gain;
|
||||
fifo_t input_fifo;
|
||||
filter_array_t chan[2];
|
||||
float * out[2];
|
||||
} reverb_t;
|
||||
|
||||
static void reverb_create(reverb_t * p, double sample_rate_Hz,
|
||||
double wet_gain_dB,
|
||||
double room_scale, /* % */
|
||||
double reverberance, /* % */
|
||||
double hf_damping, /* % */
|
||||
double pre_delay_ms,
|
||||
double stereo_depth,
|
||||
double tone_low, /* % */
|
||||
double tone_high, /* % */
|
||||
size_t buffer_size,
|
||||
float * * out)
|
||||
{
|
||||
size_t i, delay = pre_delay_ms / 1000 * sample_rate_Hz + .5;
|
||||
double scale = room_scale / 100 * .9 + .1;
|
||||
double depth = stereo_depth / 100;
|
||||
double a = -1 / log(1 - /**/.3 /**/); /* Set minimum feedback */
|
||||
double b = 100 / (log(1 - /**/.98/**/) * a + 1); /* Set maximum feedback */
|
||||
double fc_highpass = midi_to_freq(72 - tone_low / 100 * 48);
|
||||
double fc_lowpass = midi_to_freq(72 + tone_high/ 100 * 48);
|
||||
|
||||
memset(p, 0, sizeof(*p));
|
||||
p->feedback = 1 - exp((reverberance - b) / (a * b));
|
||||
p->hf_damping = hf_damping / 100 * .3 + .2;
|
||||
p->gain = dB_to_linear(wet_gain_dB) * .015;
|
||||
fifo_create(&p->input_fifo, sizeof(float));
|
||||
memset(fifo_write(&p->input_fifo, delay, 0), 0, delay * sizeof(float));
|
||||
for (i = 0; i <= ceil(depth); ++i) {
|
||||
filter_array_create(p->chan + i, sample_rate_Hz, scale, i * depth, fc_highpass, fc_lowpass);
|
||||
out[i] = lsx_zalloc(p->out[i], buffer_size);
|
||||
}
|
||||
}
|
||||
|
||||
static void reverb_process(reverb_t * p, size_t length)
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; i < 2 && p->out[i]; ++i)
|
||||
filter_array_process(p->chan + i, length, (float *) fifo_read_ptr(&p->input_fifo), p->out[i], &p->feedback, &p->hf_damping, &p->gain);
|
||||
fifo_read(&p->input_fifo, length, NULL);
|
||||
}
|
||||
|
||||
static void reverb_delete(reverb_t * p)
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; i < 2 && p->out[i]; ++i) {
|
||||
free(p->out[i]);
|
||||
filter_array_delete(p->chan + i);
|
||||
}
|
||||
fifo_delete(&p->input_fifo);
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
|
||||
Audacity: A Digital Audio Editor
|
||||
|
||||
Reverb_libSoX.h
|
||||
Stereo reverberation effect from libSoX,
|
||||
adapted for Audacity (audacity.sourceforge.net)
|
||||
|
||||
Copyright (c) 2007-2013 robs@users.sourceforge.net
|
||||
Licence: LGPL v2.1
|
||||
Filter configuration based on freeverb by Jezar Wakefield.
|
||||
|
||||
**********************************************************************/
|
||||
|
||||
#include <cstring>
|
||||
#include <cstdlib>
|
||||
#ifdef __WXMSW__
|
||||
#define M_LN10 2.30258509299404568402 /* log_e 10 */
|
||||
#else
|
||||
#include <cmath>
|
||||
#endif
|
||||
#include <algorithm>
|
||||
using std::min;
|
||||
using std::max;
|
||||
|
||||
#define array_length(a) (sizeof(a)/sizeof(a[0]))
|
||||
#define dB_to_linear(x) exp((x) * M_LN10 * 0.05)
|
||||
#define midi_to_freq(n) (440 * pow(2,((n)-69)/12.))
|
||||
#define FIFO_SIZE_T size_t
|
||||
#define FIFO_MIN 0x4000
|
||||
#define fifo_read_ptr(f) fifo_read(f, (FIFO_SIZE_T)0, NULL)
|
||||
#define lsx_zalloc(var, n) var = (float *)calloc(n, sizeof(*var))
|
||||
#define filter_advance(p) if (--(p)->ptr < (p)->buffer) (p)->ptr += (p)->size
|
||||
#define filter_delete(p) free((p)->buffer)
|
||||
|
||||
typedef struct {
|
||||
char * data;
|
||||
size_t allocation; /* Number of bytes allocated for data. */
|
||||
size_t item_size; /* Size of each item in data */
|
||||
size_t begin; /* Offset of the first byte to read. */
|
||||
size_t end; /* 1 + Offset of the last byte byte to read. */
|
||||
} fifo_t;
|
||||
|
||||
static void fifo_clear(fifo_t * f)
|
||||
{
|
||||
f->end = f->begin = 0;
|
||||
}
|
||||
|
||||
static void * fifo_reserve(fifo_t * f, FIFO_SIZE_T n)
|
||||
{
|
||||
n *= f->item_size;
|
||||
|
||||
if (f->begin == f->end)
|
||||
fifo_clear(f);
|
||||
|
||||
while (1) {
|
||||
if (f->end + n <= f->allocation) {
|
||||
void *p = f->data + f->end;
|
||||
|
||||
f->end += n;
|
||||
return p;
|
||||
}
|
||||
if (f->begin > FIFO_MIN) {
|
||||
memmove(f->data, f->data + f->begin, f->end - f->begin);
|
||||
f->end -= f->begin;
|
||||
f->begin = 0;
|
||||
continue;
|
||||
}
|
||||
f->allocation += n;
|
||||
f->data = (char *)realloc(f->data, f->allocation);
|
||||
}
|
||||
}
|
||||
|
||||
static void * fifo_write(fifo_t * f, FIFO_SIZE_T n, void const * data)
|
||||
{
|
||||
void * s = fifo_reserve(f, n);
|
||||
if (data)
|
||||
memcpy(s, data, n * f->item_size);
|
||||
return s;
|
||||
}
|
||||
|
||||
static void * fifo_read(fifo_t * f, FIFO_SIZE_T n, void * data)
|
||||
{
|
||||
char * ret = f->data + f->begin;
|
||||
n *= f->item_size;
|
||||
if (n > (FIFO_SIZE_T)(f->end - f->begin))
|
||||
return NULL;
|
||||
if (data)
|
||||
memcpy(data, ret, (size_t)n);
|
||||
f->begin += n;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void fifo_delete(fifo_t * f)
|
||||
{
|
||||
free(f->data);
|
||||
}
|
||||
|
||||
static void fifo_create(fifo_t * f, FIFO_SIZE_T item_size)
|
||||
{
|
||||
f->item_size = item_size;
|
||||
f->allocation = FIFO_MIN;
|
||||
f->data = (char *)malloc(f->allocation);
|
||||
fifo_clear(f);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
size_t size;
|
||||
float * buffer, * ptr;
|
||||
float store;
|
||||
} filter_t;
|
||||
|
||||
static float comb_process(filter_t * p, /* gcc -O2 will inline this */
|
||||
float const * input, float const * feedback, float const * hf_damping)
|
||||
{
|
||||
float output = *p->ptr;
|
||||
p->store = output + (p->store - output) * *hf_damping;
|
||||
*p->ptr = *input + p->store * *feedback;
|
||||
filter_advance(p);
|
||||
return output;
|
||||
}
|
||||
|
||||
static float allpass_process(filter_t * p, /* gcc -O2 will inline this */
|
||||
float const * input)
|
||||
{
|
||||
float output = *p->ptr;
|
||||
*p->ptr = *input + output * .5;
|
||||
filter_advance(p);
|
||||
return output - *input;
|
||||
}
|
||||
|
||||
typedef struct {double b0, b1, a1, i1, o1;} one_pole_t;
|
||||
|
||||
static float one_pole_process(one_pole_t * p, float i0)
|
||||
{
|
||||
float o0 = i0*p->b0 + p->i1*p->b1 - p->o1*p->a1;
|
||||
p->i1 = i0;
|
||||
return p->o1 = o0;
|
||||
}
|
||||
|
||||
static const size_t /* Filter delay lengths in samples (44100Hz sample-rate) */
|
||||
comb_lengths[] = {1116, 1188, 1277, 1356, 1422, 1491, 1557, 1617},
|
||||
allpass_lengths[] = {225, 341, 441, 556}, stereo_adjust = 12;
|
||||
|
||||
typedef struct {
|
||||
filter_t comb [array_length(comb_lengths)];
|
||||
filter_t allpass[array_length(allpass_lengths)];
|
||||
one_pole_t one_pole[2];
|
||||
} filter_array_t;
|
||||
|
||||
static void filter_array_create(filter_array_t * p, double rate,
|
||||
double scale, double offset, double fc_highpass, double fc_lowpass)
|
||||
{
|
||||
size_t i;
|
||||
double r = rate * (1 / 44100.); /* Compensate for actual sample-rate */
|
||||
|
||||
for (i = 0; i < array_length(comb_lengths); ++i, offset = -offset)
|
||||
{
|
||||
filter_t * pcomb = &p->comb[i];
|
||||
pcomb->size = (size_t)(scale * r * (comb_lengths[i] + stereo_adjust * offset) + .5);
|
||||
pcomb->ptr = lsx_zalloc(pcomb->buffer, pcomb->size);
|
||||
}
|
||||
for (i = 0; i < array_length(allpass_lengths); ++i, offset = -offset)
|
||||
{
|
||||
filter_t * pallpass = &p->allpass[i];
|
||||
pallpass->size = (size_t)(r * (allpass_lengths[i] + stereo_adjust * offset) + .5);
|
||||
pallpass->ptr = lsx_zalloc(pallpass->buffer, pallpass->size);
|
||||
}
|
||||
{ /* EQ: highpass */
|
||||
one_pole_t * q = &p->one_pole[0];
|
||||
q->a1 = -exp(-2 * M_PI * fc_highpass / rate);
|
||||
q->b0 = (1 - q->a1)/2, q->b1 = -q->b0;
|
||||
}
|
||||
{ /* EQ: lowpass */
|
||||
one_pole_t * q = &p->one_pole[1];
|
||||
q->a1 = -exp(-2 * M_PI * fc_lowpass / rate);
|
||||
q->b0 = 1 + q->a1, q->b1 = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void filter_array_process(filter_array_t * p,
|
||||
size_t length, float const * input, float * output,
|
||||
float const * feedback, float const * hf_damping, float const * gain)
|
||||
{
|
||||
while (length--) {
|
||||
float out = 0, in = *input++;
|
||||
|
||||
size_t i = array_length(comb_lengths) - 1;
|
||||
do out += comb_process(p->comb + i, &in, feedback, hf_damping);
|
||||
while (i--);
|
||||
|
||||
i = array_length(allpass_lengths) - 1;
|
||||
do out = allpass_process(p->allpass + i, &out);
|
||||
while (i--);
|
||||
|
||||
out = one_pole_process(&p->one_pole[0], out);
|
||||
out = one_pole_process(&p->one_pole[1], out);
|
||||
*output++ = out * *gain;
|
||||
}
|
||||
}
|
||||
|
||||
static void filter_array_delete(filter_array_t * p)
|
||||
{
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < array_length(allpass_lengths); ++i)
|
||||
filter_delete(&p->allpass[i]);
|
||||
for (i = 0; i < array_length(comb_lengths); ++i)
|
||||
filter_delete(&p->comb[i]);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
float feedback;
|
||||
float hf_damping;
|
||||
float gain;
|
||||
fifo_t input_fifo;
|
||||
filter_array_t chan[2];
|
||||
float * out[2];
|
||||
} reverb_t;
|
||||
|
||||
static void reverb_create(reverb_t * p, double sample_rate_Hz,
|
||||
double wet_gain_dB,
|
||||
double room_scale, /* % */
|
||||
double reverberance, /* % */
|
||||
double hf_damping, /* % */
|
||||
double pre_delay_ms,
|
||||
double stereo_depth,
|
||||
double tone_low, /* % */
|
||||
double tone_high, /* % */
|
||||
size_t buffer_size,
|
||||
float * * out)
|
||||
{
|
||||
size_t i, delay = pre_delay_ms / 1000 * sample_rate_Hz + .5;
|
||||
double scale = room_scale / 100 * .9 + .1;
|
||||
double depth = stereo_depth / 100;
|
||||
double a = -1 / log(1 - /**/.3 /**/); /* Set minimum feedback */
|
||||
double b = 100 / (log(1 - /**/.98/**/) * a + 1); /* Set maximum feedback */
|
||||
double fc_highpass = midi_to_freq(72 - tone_low / 100 * 48);
|
||||
double fc_lowpass = midi_to_freq(72 + tone_high/ 100 * 48);
|
||||
|
||||
memset(p, 0, sizeof(*p));
|
||||
p->feedback = 1 - exp((reverberance - b) / (a * b));
|
||||
p->hf_damping = hf_damping / 100 * .3 + .2;
|
||||
p->gain = dB_to_linear(wet_gain_dB) * .015;
|
||||
fifo_create(&p->input_fifo, sizeof(float));
|
||||
memset(fifo_write(&p->input_fifo, delay, 0), 0, delay * sizeof(float));
|
||||
for (i = 0; i <= ceil(depth); ++i) {
|
||||
filter_array_create(p->chan + i, sample_rate_Hz, scale, i * depth, fc_highpass, fc_lowpass);
|
||||
out[i] = lsx_zalloc(p->out[i], buffer_size);
|
||||
}
|
||||
}
|
||||
|
||||
static void reverb_process(reverb_t * p, size_t length)
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; i < 2 && p->out[i]; ++i)
|
||||
filter_array_process(p->chan + i, length, (float *) fifo_read_ptr(&p->input_fifo), p->out[i], &p->feedback, &p->hf_damping, &p->gain);
|
||||
fifo_read(&p->input_fifo, length, NULL);
|
||||
}
|
||||
|
||||
static void reverb_delete(reverb_t * p)
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; i < 2 && p->out[i]; ++i) {
|
||||
free(p->out[i]);
|
||||
filter_array_delete(p->chan + i);
|
||||
}
|
||||
fifo_delete(&p->input_fifo);
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -243,17 +243,17 @@ wxString wxNumberFormatter::ToString(wxLongLong_t val, int style)
|
||||
|
||||
wxString wxNumberFormatter::ToString(double val, int precision, int style)
|
||||
{
|
||||
wxString format;
|
||||
if ( precision == -1 )
|
||||
{
|
||||
format = wxT("%g");
|
||||
}
|
||||
else // Use fixed precision.
|
||||
{
|
||||
format.Printf(wxT("%%.%df"), precision);
|
||||
}
|
||||
|
||||
wxString s = wxString::Format(format, val);
|
||||
wxString format;
|
||||
if ( precision == -1 )
|
||||
{
|
||||
format = wxT("%g");
|
||||
}
|
||||
else // Use fixed precision.
|
||||
{
|
||||
format.Printf(wxT("%%.%df"), precision);
|
||||
}
|
||||
|
||||
wxString s = wxString::Format(format, val);
|
||||
|
||||
if ( style & Style_WithThousandsSep )
|
||||
AddThousandsSeparators(s);
|
||||
|
Loading…
x
Reference in New Issue
Block a user