audacia/src/prefs/SpectrogramSettings.h

187 lines
4.2 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
SpectrogramSettings.h
Paul Licameli
**********************************************************************/
#ifndef __AUDACITY_SPECTROGRAM_SETTINGS__
#define __AUDACITY_SPECTROGRAM_SETTINGS__
#include "../Prefs.h"
#include "../SampleFormat.h"
#include "../RealFFTf.h"
#undef SPECTRAL_SELECTION_GLOBAL_SWITCH
class EnumValueSymbols;
struct FFTParam;
class NumberScale;
class SpectrumPrefs;
class wxArrayStringEx;
class AUDACITY_DLL_API SpectrogramSettings : public PrefsListener
{
friend class SpectrumPrefs;
public:
// Singleton for settings that are not per-track
class AUDACITY_DLL_API Globals
{
public:
static Globals &Get();
void SavePrefs();
#ifdef SPECTRAL_SELECTION_GLOBAL_SWITCH
bool spectralSelection;
#endif
private:
Globals();
void LoadPrefs();
};
enum {
LogMinWindowSize = 3,
LogMaxWindowSize = 15,
NumWindowSizes = LogMaxWindowSize - LogMinWindowSize + 1,
};
// Do not assume that this enumeration will remain the
// same as NumberScaleType in future. That enum may become
// more general purpose.
typedef int ScaleType;
enum ScaleTypeValues : int {
stLinear,
stLogarithmic,
stMel,
stBark,
stErb,
stPeriod,
stNumScaleTypes,
};
static const EnumValueSymbols &GetScaleNames();
static const EnumValueSymbols &GetColorSchemeNames();
static const TranslatableStrings &GetAlgorithmNames();
static SpectrogramSettings &defaults();
SpectrogramSettings();
SpectrogramSettings(const SpectrogramSettings &other);
SpectrogramSettings& operator= (const SpectrogramSettings &other);
~SpectrogramSettings();
bool IsDefault() const
{
return this == &defaults();
}
bool Validate(bool quiet);
void LoadPrefs();
void SavePrefs();
void UpdatePrefs() override;
void InvalidateCaches();
void DestroyWindows();
void CacheWindows() const;
void ConvertToEnumeratedWindowSizes();
void ConvertToActualWindowSizes();
// Need to be told what the bin unit is, as this structure does not know
// the rate
float findBin( float frequency, float binUnit ) const;
// If "bins" is false, units are Hz
NumberScale GetScale( float minFreq, float maxFreq ) const;
int minFreq;
int maxFreq;
bool SpectralSelectionEnabled() const;
public:
int range;
int gain;
int frequencyGain;
int windowType;
private:
int windowSize;
public:
size_t WindowSize() const { return windowSize; }
#ifdef EXPERIMENTAL_ZERO_PADDED_SPECTROGRAMS
private:
int zeroPaddingFactor;
public:
size_t ZeroPaddingFactor() const {
return algorithm == algPitchEAC ? 1 : zeroPaddingFactor;
}
#endif
size_t GetFFTLength() const; // window size (times zero padding, if STFT)
size_t NBins() const;
enum ColorScheme : int {
// Keep in correspondence with AColor::colorSchemes, AColor::gradient_pre
csColorNew = 0,
csColorTheme,
csGrayscale,
csInvGrayscale,
csNumColorScheme,
};
ColorScheme colorScheme;
class ColorSchemeEnumSetting : public EnumSetting< ColorScheme > {
using EnumSetting< ColorScheme >::EnumSetting;
void Migrate(wxString &value) override;
};
static ColorSchemeEnumSetting colorSchemeSetting;
ScaleType scaleType;
#ifndef SPECTRAL_SELECTION_GLOBAL_SWITCH
bool spectralSelection; // But should this vary per track? -- PRL
#endif
typedef int Algorithm;
enum AlgorithmValues : int {
algSTFT = 0,
algReassignment,
algPitchEAC,
algNumAlgorithms,
};
Algorithm algorithm;
#ifdef EXPERIMENTAL_FFT_Y_GRID
bool fftYGrid;
#endif //EXPERIMENTAL_FFT_Y_GRID
#ifdef EXPERIMENTAL_FIND_NOTES
bool fftFindNotes;
double findNotesMinA;
int numberOfMaxima;
bool findNotesQuantize;
#endif //EXPERIMENTAL_FIND_NOTES
// Following fields are derived from preferences.
// Variables used for computing the spectrum
mutable HFFT hFFT;
mutable Floats window;
// Two other windows for computing reassigned spectrogram
mutable Floats tWindow; // Window times time parameter
mutable Floats dWindow; // Derivative of window
};
#endif