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);
130 auto uSettings = std::make_unique<SpectrogramSettings>();
131 pSettings = uSettings.get();
132 track.Attachments::Assign(
key1, std::move(uSettings));
158#ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH
162#ifdef EXPERIMENTAL_FFT_Y_GRID
163 , fftYGrid(other.fftYGrid)
165#ifdef EXPERIMENTAL_FIND_NOTES
166 , fftFindNotes(other.fftFindNotes)
167 , findNotesMinA(other.findNotesMinA)
168 , numberOfMaxima(other.numberOfMaxima)
169 , findNotesQuantize(other.findNotesQuantize)
182 if (
this != &other) {
193#ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH
197#ifdef EXPERIMENTAL_FFT_Y_GRID
198 fftYGrid = other.fftYGrid;
200#ifdef EXPERIMENTAL_FIND_NOTES
201 fftFindNotes = other.fftFindNotes;
202 findNotesMinA = other.findNotesMinA;
203 numberOfMaxima = other.numberOfMaxima;
204 findNotesQuantize = other.findNotesQuantize;
244 {
wxT(
"SpecColorNew"),
XC(
"Color (Roseus)",
"spectrum prefs") },
246 {
wxT(
"SpecColorTheme"),
XC(
"Color (classic)",
"spectrum prefs") },
248 {
wxT(
"SpecGrayscale"),
XC(
"Grayscale",
"spectrum prefs") },
250 {
wxT(
"SpecInvGrayscale"),
XC(
"Inverse grayscale",
"spectrum prefs") },
264 if (isGrayscale && !
gPrefs->
Read(
wxT(
"/Spectrum/ColorScheme"), &value)) {
272 wxT(
"/Spectrum/ColorScheme"),
314"Minimum frequency must be less than maximum frequency") );
336"The frequency gain must be no more than 60 dB/dec") );
384#ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH
390#ifdef EXPERIMENTAL_FFT_Y_GRID
391 fftYGrid = SpectrumYGrid.Read();
394#ifdef EXPERIMENTAL_FIND_NOTES
395 fftFindNotes = SpectrumFindNotes.Read();
396 findNotesMinA = SpectrumFindNotesMinA.Read();
397 numberOfMaxima = SpectrumFindNotesN.Read();
398 findNotesQuantize = SpectrumFindNotesQuantize.Read();
430#ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH
436#ifdef EXPERIMENTAL_FFT_Y_GRID
437 SpectrumYGrid.Write(fftYGrid);
440#ifdef EXPERIMENTAL_FIND_NOTES
441 SpectrumFindNotes.Write(fftFindNotes);
442 SpectrumFindNotesMinA.Write(findNotesMinA);
443 SpectrumFindNotesN.Write(numberOfMaxima);
444 SpectrumFindNotesQuantize.Write(findNotesQuantize);
482#ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH
490#ifdef EXPERIMENTAL_FFT_Y_GRID
491 if (fftYGrid ==
defaults().fftYGrid)
492 fftYGrid = SpectrumYGrid.Read();
495#ifdef EXPERIMENTAL_FIND_NOTES
496 if (fftFindNotes ==
defaults().fftFindNotes)
497 fftFindNotes = SpectrumFindNotes.Read();
499 if (findNotesMinA ==
defaults().findNotesMinA)
500 findNotesMinA = SpectrumFindNotesMinA.Read();
502 if (numberOfMaxima ==
defaults().numberOfMaxima)
503 numberOfMaxima = SpectrumFindNotesN.Read();
505 if (findNotesQuantize ==
defaults().findNotesQuantize)
506 findNotesQuantize = SpectrumFindNotesQuantize.Read();
525 return std::make_unique<SpectrogramSettings>(*
this);
548 const bool extra = padding > 0;
553 const size_t endOfWindow = padding +
windowSize;
555 for (ii = 0; ii < padding; ++ii) {
557 window[fftLen - ii - 1] = 0.0;
560 for (; ii < endOfWindow; ++ii)
570 for (
int jj = padding, multiplier = -(
int)
windowSize / 2; jj < (int)endOfWindow; ++jj, ++multiplier)
583 for (ii = padding; ii < endOfWindow; ++ii)
588 for (ii = padding; ii < endOfWindow; ++ii)
600 const auto padding = (
WindowSize() * (factor - 1)) / 2;
619 size >>= 1, ++logarithm;
641 float linearBin = frequency / binUnit;
691#ifdef SPECTRAL_SELECTION_GLOBAL_SWITCH
699key2{ [](
auto &) {
return std::make_unique<SpectrogramBounds>(); } };
726 return std::make_unique<SpectrogramBounds>(*
this);
733 const double rate = wt.
GetRate();
736 const auto type =
settings.scaleType;
738 const float top = (rate / 2.);
745 const auto half =
settings.GetFFTLength() / 2;
747 const float bin2 = rate / half;
755 float spectrumMax = mSpectrumMax;
761 max = std::clamp(spectrumMax, bottom, top);
765 float spectrumMin = mSpectrumMin;
769 min = std::max(bottom, top / 1000.0f);
771 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)
audacity::BasicSettings * gPrefs
HFFT GetFFT(size_t fftlen)
IntSetting SpectrumMaxFreq
static const ChannelGroup::Attachments::RegisteredFactory key2
static const ChannelGroup::Attachments::RegisteredFactory key1
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)
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 */
PointerType Clone() const override
~SpectrogramBounds() override
void GetBounds(const WaveChannel &wc, float &min, float &max) const
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 const EnumValueSymbols & GetScaleNames()
static SpectrogramSettings & Get(const WaveTrack &track)
size_t GetFFTLength() const
SpectrogramSettings & operator=(const SpectrogramSettings &other)
void ConvertToActualWindowSizes()
static const EnumValueSymbols & GetColorSchemeNames()
static SpectrogramSettings & Own(WaveChannel &wc)
PointerType Clone() const override
static ColorSchemeEnumSetting colorSchemeSetting
size_t ZeroPaddingFactor() const
float findBin(float frequency, float binUnit) const
static void Reset(WaveChannel &channel)
Make channel lose indpendent settings and use defaults.
void ConvertToEnumeratedWindowSizes()
size_t WindowSize() const
A Track that contains audio waveform data.
double GetRate() const override
virtual bool Flush() noexcept=0
virtual bool Read(const wxString &key, bool *value) const =0
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
Owner< Base > PointerType