33 L
"/Spectrum/MaxFreq", 20000 };
41 L
"/Spectrum/Algorithm", 0 };
43 L
"/Spectrum/ScaleType", 2 };
48 L
"/Spectrum/EnableSpectralSelection",
true };
50 L
"/Spectrum/FFTSize", 2048 };
52 L
"/Spectrum/FrequencyGain", 0 };
54 L
"/Spectrum/Gain", 20 };
56 L
"/Spectrum/Grayscale",
false };
58 L
"/Spectrum/MinFreq", 0 };
60 L
"/Spectrum/Range", 80 };
62 L
"/Spectrum/ZeroPaddingFactor", 2 };
64#ifdef EXPERIMENTAL_FIND_NOTES
66 L
"/Spectrum/FFTFindNotes",
false };
68 L
"/Spectrum/FindNotesMinA", -30.0 };
70 L
"/Spectrum/FindNotesN", 5 };
72 L
"/Spectrum/FindNotesQuantize",
false };
75#ifdef EXPERIMENTAL_FFT_Y_GRID
77 L
"/Spectrum/FFTYGrid",
false};
88#ifdef SPECTRAL_SELECTION_GLOBAL_SWITCH
95#ifdef SPECTRAL_SELECTION_GLOBAL_SWITCH
108key1{ [](
auto &) {
return nullptr; } };
112 auto &mutTrack =
const_cast<WaveTrack&
>(track);
113 auto pSettings = mutTrack.
GetGroupData().Track::ChannelGroupAttachments
123 auto pSettings = track.
GetGroupData().Track::ChannelGroupAttachments
126 auto uSettings = std::make_unique<SpectrogramSettings>();
127 pSettings = uSettings.get();
129 ::Assign(
key1, std::move(uSettings));
137 ::Assign(
key1,
nullptr);
156#ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH
160#ifdef EXPERIMENTAL_FFT_Y_GRID
161 , fftYGrid(other.fftYGrid)
163#ifdef EXPERIMENTAL_FIND_NOTES
164 , fftFindNotes(other.fftFindNotes)
165 , findNotesMinA(other.findNotesMinA)
166 , numberOfMaxima(other.numberOfMaxima)
167 , findNotesQuantize(other.findNotesQuantize)
180 if (
this != &other) {
191#ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH
195#ifdef EXPERIMENTAL_FFT_Y_GRID
196 fftYGrid = other.fftYGrid;
198#ifdef EXPERIMENTAL_FIND_NOTES
199 fftFindNotes = other.fftFindNotes;
200 findNotesMinA = other.findNotesMinA;
201 numberOfMaxima = other.numberOfMaxima;
202 findNotesQuantize = other.findNotesQuantize;
242 {
wxT(
"SpecColorNew"),
XC(
"Color (default)",
"spectrum prefs") },
244 {
wxT(
"SpecColorTheme"),
XC(
"Color (classic)",
"spectrum prefs") },
246 {
wxT(
"SpecGrayscale"),
XC(
"Grayscale",
"spectrum prefs") },
248 {
wxT(
"SpecInvGrayscale"),
XC(
"Inverse grayscale",
"spectrum prefs") },
262 if (isGrayscale && !
gPrefs->Read(
wxT(
"/Spectrum/ColorScheme"), &value)) {
270 wxT(
"/Spectrum/ColorScheme"),
312"Minimum frequency must be less than maximum frequency") );
334"The frequency gain must be no more than 60 dB/dec") );
382#ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH
388#ifdef EXPERIMENTAL_FFT_Y_GRID
389 fftYGrid = SpectrumYGrid.Read();
392#ifdef EXPERIMENTAL_FIND_NOTES
393 fftFindNotes = SpectrumFindNotes.Read();
394 findNotesMinA = SpectrumFindNotesMinA.Read();
395 numberOfMaxima = SpectrumFindNotesN.Read();
396 findNotesQuantize = SpectrumFindNotesQuantize.Read();
428#ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH
434#ifdef EXPERIMENTAL_FFT_Y_GRID
435 SpectrumYGrid.Write(fftYGrid);
438#ifdef EXPERIMENTAL_FIND_NOTES
439 SpectrumFindNotes.Write(fftFindNotes);
440 SpectrumFindNotesMinA.Write(findNotesMinA);
441 SpectrumFindNotesN.Write(numberOfMaxima);
442 SpectrumFindNotesQuantize.Write(findNotesQuantize);
480#ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH
488#ifdef EXPERIMENTAL_FFT_Y_GRID
489 if (fftYGrid ==
defaults().fftYGrid)
490 fftYGrid = SpectrumYGrid.Read();
493#ifdef EXPERIMENTAL_FIND_NOTES
494 if (fftFindNotes ==
defaults().fftFindNotes)
495 fftFindNotes = SpectrumFindNotes.Read();
497 if (findNotesMinA ==
defaults().findNotesMinA)
498 findNotesMinA = SpectrumFindNotesMinA.Read();
500 if (numberOfMaxima ==
defaults().numberOfMaxima)
501 numberOfMaxima = SpectrumFindNotesN.Read();
503 if (findNotesQuantize ==
defaults().findNotesQuantize)
504 findNotesQuantize = SpectrumFindNotesQuantize.Read();
523 return std::make_unique<SpectrogramSettings>(*
this);
546 const bool extra = padding > 0;
551 const size_t endOfWindow = padding +
windowSize;
553 for (ii = 0; ii < padding; ++ii) {
555 window[fftLen - ii - 1] = 0.0;
558 for (; ii < endOfWindow; ++ii)
568 for (
int jj = padding, multiplier = -(
int)
windowSize / 2; jj < (int)endOfWindow; ++jj, ++multiplier)
581 for (ii = padding; ii < endOfWindow; ++ii)
586 for (ii = padding; ii < endOfWindow; ++ii)
598 const auto padding = (
WindowSize() * (factor - 1)) / 2;
617 size >>= 1, ++logarithm;
639 float linearBin = frequency / binUnit;
689#ifdef SPECTRAL_SELECTION_GLOBAL_SWITCH
697key2{ [](
auto &) {
return std::make_unique<SpectrogramBounds>(); } };
701 return track.
GetGroupData().Track::ChannelGroupAttachments
715 return std::make_unique<SpectrogramBounds>(*
this);
721 const double rate = wt.
GetRate();
724 const auto type =
settings.scaleType;
726 const float top = (rate / 2.);
733 const auto half =
settings.GetFFTLength() / 2;
735 const float bin2 = rate / half;
743 float spectrumMax = mSpectrumMax;
749 max = std::clamp(spectrumMax, bottom, top);
753 float spectrumMin = mSpectrumMin;
757 min = std::max(bottom, top / 1000.0f);
759 min = std::clamp(spectrumMin, bottom, top);
int AudacityMessageBox(const TranslatableString &message, const TranslatableString &caption, long style, wxWindow *parent, int x, int y)
void NewWindowFunc(int whichFunction, size_t NumSamplesIn, bool extraSample, float *in)
void DerivativeOfWindowFunc(int whichFunction, size_t NumSamples, bool extraSample, float *in)
HFFT GetFFT(size_t fftlen)
IntSetting SpectrumMaxFreq
static const Track::ChannelGroupAttachments::RegisteredFactory key1
static const Track::ChannelGroupAttachments::RegisteredFactory key2
static Settings & settings()
std::vector< TranslatableString > TranslatableStrings
static const int colorSchemes
This specialization of Setting for bool adds a Toggle method to negate the saved value.
bool Write(const wxString &value)
Client code makes static instance from a factory of attachments; passes it to Get or Find as a retrie...
Specialization of Setting for double.
bool WriteEnum(Enum value)
virtual bool Flush(bool bCurrentOnly=false) wxOVERRIDE
Specialization of Setting for int.
bool Write(const T &value)
Write value to config and return true if successful.
bool Read(T *pVar) const
overload of Read returning a boolean that is true if the value was previously defined */
void GetBounds(const WaveTrack &wt, float &min, float &max) const
PointerType Clone() const override
~SpectrogramBounds() override
static SpectrogramBounds & Get(WaveTrack &track)
Get either the global default settings, or the track's own if previously created.
void Migrate(wxString &value) override
Spectrogram settings, either for one track or as defaults.
static SpectrogramSettings & defaults()
void UpdatePrefs() override
static const TranslatableStrings & GetAlgorithmNames()
NumberScale GetScale(float minFreq, float maxFreq) const
bool SpectralSelectionEnabled() const
bool Validate(bool quiet)
static void Reset(WaveTrack &track)
Make track lose indpendent settings and use defaults.
static const EnumValueSymbols & GetScaleNames()
static SpectrogramSettings & Get(const WaveTrack &track)
Mutative access to attachment even if the track argument is const.
size_t GetFFTLength() const
SpectrogramSettings & operator=(const SpectrogramSettings &other)
void ConvertToActualWindowSizes()
static const EnumValueSymbols & GetColorSchemeNames()
PointerType Clone() const override
static ColorSchemeEnumSetting colorSchemeSetting
size_t ZeroPaddingFactor() const
float findBin(float frequency, float binUnit) const
static SpectrogramSettings & Own(WaveTrack &track)
void ConvertToEnumeratedWindowSizes()
size_t WindowSize() const
ChannelGroupData & GetGroupData()
A Track that contains audio waveform data.
double GetRate() const override
IntSetting SpectrumWindowFunction
BoolSetting SpectrumGrayscale
void RecreateWindow(Floats &window, int which, size_t fftLen, size_t padding, int windowType, size_t windowSize, double &scale)
BoolSetting SpectrumEnableSelection
IntSetting SpectrumFrequencyGain
IntSetting SpectrumZeroPaddingFactor
IntSetting SpectrumFFTSize
IntSetting SpectrumAlgorithm
IntSetting SpectrumMinFreq
ClientData::UniquePtr< Base > PointerType