From 952a22c8b1f65f0e8f3a807c8d705494a00b1df3 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Thu, 4 Jun 2015 00:05:46 -0400 Subject: [PATCH] Created a global structure to hold spectrogram preferences... Don't read "/Spectrum/" preferences anywhere but in SpectrumPrefs.cpp. Don't store global values in TrackArtist. Possibly some day, there will be other instances of SpectrogramSettings so we can have independent per-track settings. --- src/TrackArtist.cpp | 143 +++++++++++++++--------------------- src/TrackArtist.h | 24 ------ src/TrackPanel.cpp | 9 ++- src/WaveClip.cpp | 23 ++++-- src/prefs/SpectrumPrefs.cpp | 64 +++++++++++++++- src/prefs/SpectrumPrefs.h | 42 +++++++++++ 6 files changed, 183 insertions(+), 122 deletions(-) diff --git a/src/TrackArtist.cpp b/src/TrackArtist.cpp index bca4ee442..8b9d1f18a 100644 --- a/src/TrackArtist.cpp +++ b/src/TrackArtist.cpp @@ -173,6 +173,7 @@ audio tracks. #include "LabelTrack.h" #include "TimeTrack.h" #include "Prefs.h" +#include "prefs/SpectrumPrefs.h" #include "Sequence.h" #include "Spectrum.h" #include "ViewInfo.h" @@ -270,14 +271,6 @@ TrackArtist::TrackArtist() SetColours(); vruler = new Ruler(); - -#ifdef EXPERIMENTAL_FFT_Y_GRID - fftYGridOld=true; -#endif //EXPERIMENTAL_FFT_Y_GRID - -#ifdef EXPERIMENTAL_FIND_NOTES - fftFindNotesOld=false; -#endif } TrackArtist::~TrackArtist() @@ -811,14 +804,14 @@ void TrackArtist::UpdateVRuler(Track *t, wxRect & r) int maxFreq = GetSpectrumMaxFreq(freq); #ifdef EXPERIMENTAL_FFT_SKIP_POINTS - maxFreq/=(mFftSkipPoints+1); + maxFreq/=(fftSkipPoints+1); #endif //EXPERIMENTAL_FFT_SKIP_POINTS if(maxFreq > freq) maxFreq = freq; int minFreq = GetSpectrumMinFreq(0); #ifdef EXPERIMENTAL_FFT_SKIP_POINTS - minFreq/=(mFftSkipPoints+1); + minFreq/=(fftSkipPoints+1); #endif //EXPERIMENTAL_FFT_SKIP_POINTS if(minFreq < 0) minFreq = 0; @@ -857,14 +850,14 @@ void TrackArtist::UpdateVRuler(Track *t, wxRect & r) int maxFreq = GetSpectrumLogMaxFreq(freq); #ifdef EXPERIMENTAL_FFT_SKIP_POINTS - maxFreq/=(mFftSkipPoints+1); + maxFreq/=(fftSkipPoints+1); #endif //EXPERIMENTAL_FFT_SKIP_POINTS if(maxFreq > freq) maxFreq = freq; int minFreq = GetSpectrumLogMinFreq(freq/1000.0); #ifdef EXPERIMENTAL_FFT_SKIP_POINTS - minFreq/=(mFftSkipPoints+1); + minFreq/=(fftSkipPoints+1); #endif //EXPERIMENTAL_FFT_SKIP_POINTS if(minFreq < 1) minFreq = 1; @@ -1936,9 +1929,16 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache, } #endif - int range = gPrefs->Read(wxT("/Spectrum/Range"), 80L); - int gain = gPrefs->Read(wxT("/Spectrum/Gain"), 20L); - + const SpectrogramSettings &settings = SpectrogramSettings::defaults(); + const bool &isGrayscale = settings.isGrayscale; + const int &range = settings.range; + const int &gain = settings.gain; +#ifdef EXPERIMENTAL_FIND_NOTES + const bool &fftFindNotes = settings.fftFindNotes; + const bool &findNotesMinA = settings.findNotesMinA; + const bool &numberOfMaxima = settings.numberOfMaxima; + const bool &findNotesQuantize = settings.findNotesQuantize; +#endif dc.SetPen(*wxTRANSPARENT_PEN); @@ -1959,7 +1959,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache, t0, pps, autocorrelation); #ifdef EXPERIMENTAL_FFT_SKIP_POINTS - int fftSkipPoints = gPrefs->Read(wxT("/Spectrum/FFTSkipPoints"), 0L); + int fftSkipPoints = SpectrogramSettings::defaults().fftSkipPoints; int fftSkipPoints1 = fftSkipPoints + 1; #endif //EXPERIMENTAL_FFT_SKIP_POINTS @@ -2009,8 +2009,8 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache, for (int y = 0; y < mid.height; y++) { float n = (float(y) / mid.height*scale2 - lmin2) * 12; float n2 = (float(y + 1) / mid.height*scale2 - lmin2) * 12; - float f = float(minFreq) / (mFftSkipPoints + 1)*powf(2.0f, n / 12.0f + lmin2); - float f2 = float(minFreq) / (mFftSkipPoints + 1)*powf(2.0f, n2 / 12.0f + lmin2); + float f = float(minFreq) / (fftSkipPoints + 1)*powf(2.0f, n / 12.0f + lmin2); + float f2 = float(minFreq) / (fftSkipPoints + 1)*powf(2.0f, n2 / 12.0f + lmin2); n = logf(f / 440) / log2 * 12; n2 = logf(f2 / 440) / log2 * 12; if (floor(n) < floor(n2)) @@ -2024,13 +2024,13 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache, && gain == clip->mSpecPxCache->gain && range == clip->mSpecPxCache->range #ifdef EXPERIMENTAL_FFT_Y_GRID - && mFftYGrid==fftYGridOld + && fftYGrid==fftYGridOld #endif //EXPERIMENTAL_FFT_Y_GRID #ifdef EXPERIMENTAL_FIND_NOTES - && mFftFindNotes==fftFindNotesOld - && mFindNotesMinA==findNotesMinAOld - && mNumberOfMaxima==findNotesNOld - && mFindNotesQuantize==findNotesQuantizeOld + && fftFindNotes==fftFindNotesOld + && findNotesMinA==findNotesMinAOld + && numberOfMaxima==findNotesNOld + && findNotesQuantize==findNotesQuantizeOld #endif ) { // cache is up to date @@ -2042,17 +2042,17 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache, clip->mSpecPxCache->gain = gain; clip->mSpecPxCache->range = range; #ifdef EXPERIMENTAL_FIND_NOTES - fftFindNotesOld=mFftFindNotes; - findNotesMinAOld=mFindNotesMinA; - findNotesNOld=mNumberOfMaxima; - findNotesQuantizeOld=mFindNotesQuantize; + fftFindNotesOld = fftFindNotes; + findNotesMinAOld = findNotesMinA; + findNotesNOld = numberOfMaxima; + findNotesQuantizeOld = findNotesQuantize; #endif #ifdef EXPERIMENTAL_FIND_NOTES const float #ifdef EXPERIMENTAL_FFT_SKIP_POINTS - lmins = logf(float(minFreq) / (mFftSkipPoints + 1)), - lmaxs = logf(float(maxFreq) / (mFftSkipPoints + 1)), + lmins = logf(float(minFreq) / (fftSkipPoints + 1)), + lmaxs = logf(float(maxFreq) / (fftSkipPoints + 1)), #else //!EXPERIMENTAL_FFT_SKIP_POINTS lmins = lmin, lmaxs = lmax, @@ -2065,7 +2065,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache, float maxima0[128], maxima1[128]; const float #ifdef EXPERIMENTAL_FFT_SKIP_POINTS - f2bin = half / (rate / 2.0f / (mFftSkipPoints + 1)), + f2bin = half / (rate / 2.0f / (fftSkipPoints + 1)), #else //!EXPERIMENTAL_FFT_SKIP_POINTS f2bin = half / (rate / 2.0f), #endif //EXPERIMENTAL_FFT_SKIP_POINTS @@ -2092,7 +2092,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache, else { #ifdef EXPERIMENTAL_FIND_NOTES int maximas=0; - if (!usePxCache && mFftFindNotes) { + if (!usePxCache && fftFindNotes) { for (int i = maxTableSize-1; i >= 0; i--) indexes[i]=-1; @@ -2111,7 +2111,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache, int index=indexes[i]; if (index >= 0) { float freqi=freq[x0+index]; - if (freqi < mFindNotesMinA) + if (freqi < findNotesMinA) break; bool ok=true; @@ -2125,7 +2125,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache, } if (ok) { maxima[maximas++] = index; - if (maximas >= mNumberOfMaxima) + if (maximas >= numberOfMaxima) break; } } @@ -2138,7 +2138,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache, for (int i=0; i < maximas; i++) { int index=maxima[i]; float f = float(index)*bin2f; - if (mFindNotesQuantize) + if (findNotesQuantize) { f = expf(int(log(f/440)/log2*12-0.5)/12.0f*log2)*440; maxima[i] = f*f2bin; } @@ -2172,7 +2172,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache, float value; #ifdef EXPERIMENTAL_FIND_NOTES - if (mFftFindNotes) { + if (fftFindNotes) { if (it < maximas) { float i0=maxima0[it]; if (yy >= i0) @@ -2182,7 +2182,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache, float i1=maxima1[it]; if (yy+1 <= i1) { value=sumFreqValues(freq, x0, bin0, bin1); - if (value < mFindNotesMinA) + if (value < findNotesMinA) value = minColor; else value = (value + gain + range) / (double)range; @@ -2253,7 +2253,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache, unsigned char rv, gv, bv; const float value = clip->mSpecPxCache->values[x * mid.height + yy]; - GetColorGradient(value, selected, mIsGrayscale, &rv, &gv, &bv); + GetColorGradient(value, selected, isGrayscale, &rv, &gv, &bv); int px = ((mid.height - 1 - yy) * mid.width + x) * 3; data[px++] = rv; data[px++] = gv; @@ -2293,10 +2293,10 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache, yy2 = yy2_base; unsigned char rv, gv, bv; - GetColorGradient(value, selected, mIsGrayscale, &rv, &gv, &bv); + GetColorGradient(value, selected, isGrayscale, &rv, &gv, &bv); #ifdef EXPERIMENTAL_FFT_Y_GRID - if (mFftYGrid && yGrid[yy]) { + if (fftYGrid && yGrid[yy]) { rv /= 1.1f; gv /= 1.1f; bv /= 1.1f; @@ -3043,99 +3043,74 @@ void TrackArtist::UpdatePrefs() mdBrange = gPrefs->Read(wxT("/GUI/EnvdBRange"), mdBrange); mShowClipping = gPrefs->Read(wxT("/GUI/ShowClipping"), mShowClipping); - // mMaxFreq should have the same default as in SpectrumPrefs. - mMaxFreq = gPrefs->Read(wxT("/Spectrum/MaxFreq"), 8000L); - mMinFreq = gPrefs->Read(wxT("/Spectrum/MinFreq"), -1); - mLogMaxFreq = gPrefs->Read(wxT("/SpectrumLog/MaxFreq"), -1); - if( mLogMaxFreq < 0 ) - mLogMaxFreq = mMaxFreq; - mLogMinFreq = gPrefs->Read(wxT("/SpectrumLog/MinFreq"), -1); - if( mLogMinFreq < 0 ) - mLogMinFreq = mMinFreq; - if (mLogMinFreq < 1) - mLogMinFreq = 1; - - mWindowSize = gPrefs->Read(wxT("/Spectrum/FFTSize"), 256); -#ifdef EXPERIMENTAL_ZERO_PADDED_SPECTROGRAMS - mZeroPaddingFactor = gPrefs->Read(wxT("/Spectrum/ZeroPaddingFactor"), 1); -#endif - mIsGrayscale = (gPrefs->Read(wxT("/Spectrum/Grayscale"), 0L) != 0); - -#ifdef EXPERIMENTAL_FFT_Y_GRID - mFftYGrid = (gPrefs->Read(wxT("/Spectrum/FFTYGrid"), 0L) != 0); -#endif //EXPERIMENTAL_FFT_Y_GRID - -#ifdef EXPERIMENTAL_FIND_NOTES - mFftFindNotes = (gPrefs->Read(wxT("/Spectrum/FFTFindNotes"), 0L) != 0); - mFindNotesMinA = gPrefs->Read(wxT("/Spectrum/FindNotesMinA"), -30.0); - mNumberOfMaxima = gPrefs->Read(wxT("/Spectrum/FindNotesN"), 5L); - mFindNotesQuantize = (gPrefs->Read(wxT("/Spectrum/FindNotesQuantize"), 0L) != 0); -#endif //EXPERIMENTAL_FIND_NOTES - -#ifdef EXPERIMENTAL_FFT_SKIP_POINTS - mFftSkipPoints = gPrefs->Read(wxT("/Spectrum/FFTSkipPoints"), 0L); -#endif //EXPERIMENTAL_FFT_SKIP_POINTS - gPrefs->Flush(); } // Get various preference values int TrackArtist::GetSpectrumMinFreq(int deffreq) { - return mMinFreq < 0 ? deffreq : mMinFreq; + const int &minFreq = SpectrogramSettings::defaults().minFreq; + return minFreq < 0 ? deffreq : minFreq; } int TrackArtist::GetSpectrumMaxFreq(int deffreq) { - return mMaxFreq < 0 ? deffreq : mMaxFreq; + const int &maxFreq = SpectrogramSettings::defaults().maxFreq; + return maxFreq < 0 ? deffreq : maxFreq; } int TrackArtist::GetSpectrumLogMinFreq(int deffreq) { - return mLogMinFreq < 0 ? deffreq : mLogMinFreq; + const int &logMinFreq = SpectrogramSettings::defaults().logMinFreq; + return logMinFreq < 0 ? deffreq : logMinFreq; } int TrackArtist::GetSpectrumLogMaxFreq(int deffreq) { - return mLogMaxFreq < 0 ? deffreq : mLogMaxFreq; + const int &logMaxFreq = SpectrogramSettings::defaults().logMaxFreq; + return logMaxFreq < 0 ? deffreq : logMaxFreq; } int TrackArtist::GetSpectrumWindowSize(bool includeZeroPadding) { + includeZeroPadding; + const int &windowSize = SpectrogramSettings::defaults().windowSize; #ifdef EXPERIMENTAL_ZERO_PADDED_SPECTROGRAMS - if (includeZeroPadding) - return mWindowSize * mZeroPaddingFactor; + if (includeZeroPadding) { + const int &zeroPaddingFactor = SpectrogramSettings::defaults().zeroPaddingFactor; + return windowSize * zeroPaddingFactor; + } else #endif - return mWindowSize; + return windowSize; } #ifdef EXPERIMENTAL_FFT_SKIP_POINTS int TrackArtist::GetSpectrumFftSkipPoints() { - return mFftSkipPoints; + return SpectrogramSettings::defaults().fftSkipPoints; } #endif // Set various preference values void TrackArtist::SetSpectrumMinFreq(int freq) { - mMinFreq = freq; + SpectrogramSettings::defaults().minFreq = freq; } void TrackArtist::SetSpectrumMaxFreq(int freq) { - mMaxFreq = freq; + SpectrogramSettings::defaults().maxFreq = freq; } void TrackArtist::SetSpectrumLogMinFreq(int freq) { - mLogMinFreq = freq; + SpectrogramSettings::defaults().logMinFreq = freq; } void TrackArtist::SetSpectrumLogMaxFreq(int freq) { - mLogMaxFreq = freq; + SpectrogramSettings::defaults().logMaxFreq = freq; } // Draws the sync-lock bitmap, tiled; always draws stationary relative to the DC diff --git a/src/TrackArtist.h b/src/TrackArtist.h index cb78093eb..a192d0998 100644 --- a/src/TrackArtist.h +++ b/src/TrackArtist.h @@ -173,32 +173,8 @@ class AUDACITY_DLL_API TrackArtist { // Preference values float mdBrange; // "/GUI/EnvdBRange" long mShowClipping; // "/GUI/ShowClipping" - int mLogMaxFreq; // "/SpectrumLog/MaxFreq" - int mLogMinFreq; // "/SpectrumLog/MinFreq" - int mMaxFreq; // "/Spectrum/MaxFreq" - int mMinFreq; // "/Spectrum/MinFreq" - int mWindowSize; // "/Spectrum/FFTSize" -#ifdef EXPERIMENTAL_ZERO_PADDED_SPECTROGRAMS - int mZeroPaddingFactor; // "/Spectrum/ZeroPaddingFactor" -#endif - bool mIsGrayscale; // "/Spectrum/Grayscale" bool mbShowTrackNameInWaveform; // "/GUI/ShowTrackNameInWaveform" -#ifdef EXPERIMENTAL_FFT_SKIP_POINTS - int mFftSkipPoints; // "/Spectrum/FFTSkipPoints" -#endif //EXPERIMENTAL_FFT_SKIP_POINTS - -#ifdef EXPERIMENTAL_FFT_Y_GRID - bool mFftYGrid; // "/Spectrum/FFTYGrid" -#endif //EXPERIMENTAL_FFT_Y_GRID - -#ifdef EXPERIMENTAL_FIND_NOTES - bool mFftFindNotes; // "/Spectrum/FFTFindNotes" - float mFindNotesMinA; // "/Spectrum/FindNotesMinA" - int mNumberOfMaxima; // "/Spectrum/FindNotesN" - bool mFindNotesQuantize; // "/Spectrum/FindNotesQuantize") -#endif //EXPERIMENTAL_FIND_NOTES - int mInsetLeft; int mInsetTop; int mInsetRight; diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index 5b2102588..c88df224d 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -214,6 +214,8 @@ is time to refresh some aspect of the screen. #include "ondemand/ODManager.h" +#include "prefs/SpectrumPrefs.h" + #include "toolbars/ControlToolBar.h" #include "toolbars/ToolManager.h" #include "toolbars/ToolsToolBar.h" @@ -3045,8 +3047,7 @@ void TrackPanel::StartSnappingFreqSelection (WaveTrack *pTrack) while(windowSize > effectiveLength) windowSize >>= 1; - int windowType; - gPrefs->Read(wxT("/Spectrum/WindowType"), &windowType, 3); + const int windowType = SpectrogramSettings::defaults().windowType; mFrequencySnapper->Calculate( SpectrumAnalyst::Spectrum, windowType, windowSize, rate, &frequencySnappingData[0], length); @@ -4722,7 +4723,7 @@ void TrackPanel::HandleVZoomButtonUp( wxMouseEvent & event ) // Always spectrogram, never pitch view, pass true windowSize = mTrackArtist->GetSpectrumWindowSize(true); #ifdef EXPERIMENTAL_FFT_SKIP_POINTS - fftSkipPoints = mTrackArtist->GetSpectrumFftSkipPoints(); + fftSkipPoints = SpectrogramSettings::defaults().fftSkipPoints; #endif //EXPERIMENTAL_FFT_SKIP_POINTS binSize = rate / windowSize; minBins = wxMin(10, windowSize/2); //minimum 10 freq bins, unless there are less @@ -4739,7 +4740,7 @@ void TrackPanel::HandleVZoomButtonUp( wxMouseEvent & event ) // Always spectrogram, never pitch view, pass true windowSize = mTrackArtist->GetSpectrumWindowSize(true); #ifdef EXPERIMENTAL_FFT_SKIP_POINTS - fftSkipPoints = mTrackArtist->GetSpectrumFftSkipPoints(); + fftSkipPoints = SpectrogramSettings::defaults().fftSkipPoints; #endif //EXPERIMENTAL_FFT_SKIP_POINTS binSize = rate / windowSize; minBins = wxMin(10, windowSize/2); //minimum 10 freq bins, unless there are less diff --git a/src/WaveClip.cpp b/src/WaveClip.cpp index 34a5b119a..7dc0175d3 100644 --- a/src/WaveClip.cpp +++ b/src/WaveClip.cpp @@ -39,6 +39,8 @@ drawing). Cache's the Spectrogram frequency samples. #include "Resample.h" #include "Project.h" +#include "prefs/SpectrumPrefs.h" + #include WX_DEFINE_LIST(WaveClipList); @@ -904,16 +906,21 @@ bool WaveClip::GetSpectrogram(WaveTrackCache &waveTrackCache, double t0, double pixelsPerSecond, bool autocorrelation) { - int frequencyGain = gPrefs->Read(wxT("/Spectrum/FrequencyGain"), 0L); - int windowType; - int windowSize = gPrefs->Read(wxT("/Spectrum/FFTSize"), 256); + const SpectrogramSettings &settings = SpectrogramSettings::defaults(); + #ifdef EXPERIMENTAL_FFT_SKIP_POINTS - int fftSkipPoints = gPrefs->Read(wxT("/Spectrum/FFTSkipPoints"), 0L); - int fftSkipPoints1 = fftSkipPoints+1; + int fftSkipPoints = settings.fftSkipPoints; + int fftSkipPoints1 = fftSkipPoints + 1; #endif //EXPERIMENTAL_FFT_SKIP_POINTS - const int zeroPaddingFactor = - autocorrelation ? 1 : gPrefs->Read(wxT("/Spectrum/ZeroPaddingFactor"), 1); - gPrefs->Read(wxT("/Spectrum/WindowType"), &windowType, 3); + + const int &frequencyGain = settings.frequencyGain; + const int &windowSize = settings.windowSize; + const int &windowType = settings.windowType; +#ifdef EXPERIMENTAL_ZERO_PADDED_SPECTROGRAMS + const int &zeroPaddingFactor = autocorrelation ? 1 : settings.zeroPaddingFactor; +#else + const int zeroPaddingFactor = 1; +#endif // FFT length may be longer than the window of samples that affect results // because of zero padding done for increased frequency resolution diff --git a/src/prefs/SpectrumPrefs.cpp b/src/prefs/SpectrumPrefs.cpp index 344fbc2fc..a2e6c13f6 100644 --- a/src/prefs/SpectrumPrefs.cpp +++ b/src/prefs/SpectrumPrefs.cpp @@ -15,6 +15,7 @@ *//*******************************************************************/ #include "../Audacity.h" +#include "SpectrumPrefs.h" #include #include @@ -23,7 +24,6 @@ #include "../Prefs.h" #include "../Project.h" #include "../ShuttleGui.h" -#include "SpectrumPrefs.h" #include "../FFT.h" SpectrumPrefs::SpectrumPrefs(wxWindow * parent) @@ -352,10 +352,12 @@ bool SpectrumPrefs::Apply() ShuttleGui S(this, eIsSavingToPrefs); PopulateOrExchange(S); + SpectrogramSettings::defaults().UpdatePrefs(); + return true; } -void SpectrumPrefs::OnWindowSize(wxCommandEvent &event) +void SpectrumPrefs::OnWindowSize(wxCommandEvent &) { wxChoice *const pWindowSizeControl = static_cast(wxWindow::FindWindowById(ID_WINDOW_SIZE, this)); @@ -366,3 +368,61 @@ void SpectrumPrefs::OnWindowSize(wxCommandEvent &event) BEGIN_EVENT_TABLE(SpectrumPrefs, PrefsPanel) EVT_CHOICE(ID_WINDOW_SIZE, SpectrumPrefs::OnWindowSize) END_EVENT_TABLE() + +SpectrogramSettings::SpectrogramSettings() +{ + UpdatePrefs(); +} + +SpectrogramSettings& SpectrogramSettings::defaults() +{ + static SpectrogramSettings instance; + return instance; +} + +void SpectrogramSettings::UpdatePrefs() +{ + minFreq = gPrefs->Read(wxT("/Spectrum/MinFreq"), -1L); + maxFreq = gPrefs->Read(wxT("/Spectrum/MaxFreq"), 8000L); + + // These preferences are not written anywhere in the program as of now, + // but I keep this legacy here. Who knows, someone might edit prefs files + // directly. PRL + logMaxFreq = gPrefs->Read(wxT("/SpectrumLog/MaxFreq"), -1); + if (logMaxFreq < 0) + logMaxFreq = maxFreq; + logMinFreq = gPrefs->Read(wxT("/SpectrumLog/MinFreq"), -1); + if (logMinFreq < 0) + logMinFreq = minFreq; + if (logMinFreq < 1) + logMinFreq = 1; + + range = gPrefs->Read(wxT("/Spectrum/Range"), 80L); + gain = gPrefs->Read(wxT("/Spectrum/Gain"), 20L); + frequencyGain = gPrefs->Read(wxT("/Spectrum/FrequencyGain"), 0L); + + windowSize = gPrefs->Read(wxT("/Spectrum/FFTSize"), 256); + +#ifdef EXPERIMENTAL_ZERO_PADDED_SPECTROGRAMS + zeroPaddingFactor = gPrefs->Read(wxT("/Spectrum/ZeroPaddingFactor"), 1); +#endif + + gPrefs->Read(wxT("/Spectrum/WindowType"), &windowType, 3); + + isGrayscale = (gPrefs->Read(wxT("/Spectrum/Grayscale"), 0L) != 0); + +#ifdef EXPERIMENTAL_FFT_SKIP_POINTS + fftSkipPoints = gPrefs->Read(wxT("/Spectrum/FFTSkipPoints"), 0L); +#endif + +#ifdef EXPERIMENTAL_FFT_Y_GRID + fftYGrid = (gPrefs->Read(wxT("/Spectrum/FFTYGrid"), 0L) != 0); +#endif //EXPERIMENTAL_FFT_Y_GRID + +#ifdef EXPERIMENTAL_FIND_NOTES + fftFindNotes = (gPrefs->Read(wxT("/Spectrum/FFTFindNotes"), 0L) != 0); + findNotesMinA = gPrefs->Read(wxT("/Spectrum/FindNotesMinA"), -30.0); + numberOfMaxima = gPrefs->Read(wxT("/Spectrum/FindNotesN"), 5L); + findNotesQuantize = (gPrefs->Read(wxT("/Spectrum/FindNotesQuantize"), 0L) != 0); +#endif //EXPERIMENTAL_FIND_NOTES +} diff --git a/src/prefs/SpectrumPrefs.h b/src/prefs/SpectrumPrefs.h index acb08866e..b40ef4483 100644 --- a/src/prefs/SpectrumPrefs.h +++ b/src/prefs/SpectrumPrefs.h @@ -71,4 +71,46 @@ class SpectrumPrefs:public PrefsPanel #endif }; + +struct SpectrogramSettings +{ + static SpectrogramSettings &defaults(); + SpectrogramSettings(); + + void UpdatePrefs(); + + int minFreq; + int maxFreq; + + int logMinFreq; + int logMaxFreq; + + int range; + int gain; + int frequencyGain; + + int windowType; + int windowSize; +#ifdef EXPERIMENTAL_ZERO_PADDED_SPECTROGRAMS + int zeroPaddingFactor; +#endif + + bool isGrayscale; + +#ifdef EXPERIMENTAL_FFT_SKIP_POINTS + int fftSkipPoints; +#endif + +#ifdef EXPERIMENTAL_FFT_Y_GRID + bool fftYGrid; +#endif //EXPERIMENTAL_FFT_Y_GRID + +#ifdef EXPERIMENTAL_FIND_NOTES + bool fftFindNotes; + bool findNotesMinA; + bool numberOfMaxima; + bool findNotesQuantize; +#endif //EXPERIMENTAL_FIND_NOTES +}; + #endif