1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-17 00:20:06 +02:00

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.
This commit is contained in:
Paul Licameli 2015-06-04 00:05:46 -04:00
parent 38f24a42ef
commit 952a22c8b1
6 changed files with 183 additions and 122 deletions

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -39,6 +39,8 @@ drawing). Cache's the Spectrogram frequency samples.
#include "Resample.h"
#include "Project.h"
#include "prefs/SpectrumPrefs.h"
#include <wx/listimpl.cpp>
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

View File

@ -15,6 +15,7 @@
*//*******************************************************************/
#include "../Audacity.h"
#include "SpectrumPrefs.h"
#include <wx/defs.h>
#include <wx/intl.h>
@ -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<wxChoice*>(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
}

View File

@ -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