1
0
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:
lllucius 2013-11-03 02:03:19 +00:00
parent b4ba110811
commit 51cb9d9196
7 changed files with 4243 additions and 4243 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);