29#include "../widgets/AudacityMessageBox.h"
32 L
"/Spectrum/MaxFreq", 20000 };
40 L
"/Spectrum/Algorithm", 0 };
42 L
"/Spectrum/ScaleType", 2 };
47 L
"/Spectrum/EnableSpectralSelection",
true };
49 L
"/Spectrum/FFTSize", 2048 };
51 L
"/Spectrum/FrequencyGain", 0 };
53 L
"/Spectrum/Gain", 20 };
55 L
"/Spectrum/Grayscale",
false };
57 L
"/Spectrum/MinFreq", 0 };
59 L
"/Spectrum/Range", 80 };
61 L
"/Spectrum/ZeroPaddingFactor", 2 };
63#ifdef EXPERIMENTAL_FIND_NOTES
65 L
"/Spectrum/FFTFindNotes",
false };
67 L
"/Spectrum/FindNotesMinA", -30.0 };
69 L
"/Spectrum/FindNotesN", 5 };
71 L
"/Spectrum/FindNotesQuantize",
false };
74#ifdef EXPERIMENTAL_FFT_Y_GRID
76 L
"/Spectrum/FFTYGrid",
false};
87#ifdef SPECTRAL_SELECTION_GLOBAL_SWITCH
94#ifdef SPECTRAL_SELECTION_GLOBAL_SWITCH
122#ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH
126#ifdef EXPERIMENTAL_FFT_Y_GRID
127 , fftYGrid(other.fftYGrid)
129#ifdef EXPERIMENTAL_FIND_NOTES
130 , fftFindNotes(other.fftFindNotes)
131 , findNotesMinA(other.findNotesMinA)
132 , numberOfMaxima(other.numberOfMaxima)
133 , findNotesQuantize(other.findNotesQuantize)
146 if (
this != &other) {
157#ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH
161#ifdef EXPERIMENTAL_FFT_Y_GRID
162 fftYGrid = other.fftYGrid;
164#ifdef EXPERIMENTAL_FIND_NOTES
165 fftFindNotes = other.fftFindNotes;
166 findNotesMinA = other.findNotesMinA;
167 numberOfMaxima = other.numberOfMaxima;
168 findNotesQuantize = other.findNotesQuantize;
208 {
wxT(
"SpecColorNew"),
XC(
"Color (default)",
"spectrum prefs") },
210 {
wxT(
"SpecColorTheme"),
XC(
"Color (classic)",
"spectrum prefs") },
212 {
wxT(
"SpecGrayscale"),
XC(
"Grayscale",
"spectrum prefs") },
214 {
wxT(
"SpecInvGrayscale"),
XC(
"Inverse grayscale",
"spectrum prefs") },
228 if (isGrayscale && !
gPrefs->Read(
wxT(
"/Spectrum/ColorScheme"), &value)) {
236 wxT(
"/Spectrum/ColorScheme"),
278"Minimum frequency must be less than maximum frequency") );
300"The frequency gain must be no more than 60 dB/dec") );
348#ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH
354#ifdef EXPERIMENTAL_FFT_Y_GRID
355 fftYGrid = SpectrumYGrid.Read();
358#ifdef EXPERIMENTAL_FIND_NOTES
359 fftFindNotes = SpectrumFindNotes.Read();
360 findNotesMinA = SpectrumFindNotesMinA.Read();
361 numberOfMaxima = SpectrumFindNotesN.Read();
362 findNotesQuantize = SpectrumFindNotesQuantize.Read();
394#ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH
400#ifdef EXPERIMENTAL_FFT_Y_GRID
401 SpectrumYGrid.Write(fftYGrid);
404#ifdef EXPERIMENTAL_FIND_NOTES
405 SpectrumFindNotes.Write(fftFindNotes);
406 SpectrumFindNotesMinA.Write(findNotesMinA);
407 SpectrumFindNotesN.Write(numberOfMaxima);
408 SpectrumFindNotesQuantize.Write(findNotesQuantize);
446#ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH
454#ifdef EXPERIMENTAL_FFT_Y_GRID
455 if (fftYGrid ==
defaults().fftYGrid)
456 fftYGrid = SpectrumYGrid.Read();
459#ifdef EXPERIMENTAL_FIND_NOTES
460 if (fftFindNotes ==
defaults().fftFindNotes)
461 fftFindNotes = SpectrumFindNotes.Read();
463 if (findNotesMinA ==
defaults().findNotesMinA)
464 findNotesMinA = SpectrumFindNotesMinA.Read();
466 if (numberOfMaxima ==
defaults().numberOfMaxima)
467 numberOfMaxima = SpectrumFindNotesN.Read();
469 if (findNotesQuantize ==
defaults().findNotesQuantize)
470 findNotesQuantize = SpectrumFindNotesQuantize.Read();
507 const bool extra = padding > 0;
512 const size_t endOfWindow = padding +
windowSize;
514 for (ii = 0; ii < padding; ++ii) {
516 window[fftLen - ii - 1] = 0.0;
519 for (; ii < endOfWindow; ++ii)
529 for (
int jj = padding, multiplier = -(
int)
windowSize / 2; jj < (int)endOfWindow; ++jj, ++multiplier)
542 for (ii = padding; ii < endOfWindow; ++ii)
547 for (ii = padding; ii < endOfWindow; ++ii)
559 const auto padding = (
WindowSize() * (factor - 1)) / 2;
578 size >>= 1, ++logarithm;
600 float linearBin = frequency / binUnit;
650#ifdef SPECTRAL_SELECTION_GLOBAL_SWITCH
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
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)
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 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 const EnumValueSymbols & GetScaleNames()
size_t GetFFTLength() const
SpectrogramSettings & operator=(const SpectrogramSettings &other)
void ConvertToActualWindowSizes()
static const EnumValueSymbols & GetColorSchemeNames()
static ColorSchemeEnumSetting colorSchemeSetting
size_t ZeroPaddingFactor() const
float findBin(float frequency, float binUnit) const
void ConvertToEnumeratedWindowSizes()
void CacheWindows() const
size_t WindowSize() const
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