mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-16 16:10: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:
parent
38f24a42ef
commit
952a22c8b1
@ -173,6 +173,7 @@ audio tracks.
|
|||||||
#include "LabelTrack.h"
|
#include "LabelTrack.h"
|
||||||
#include "TimeTrack.h"
|
#include "TimeTrack.h"
|
||||||
#include "Prefs.h"
|
#include "Prefs.h"
|
||||||
|
#include "prefs/SpectrumPrefs.h"
|
||||||
#include "Sequence.h"
|
#include "Sequence.h"
|
||||||
#include "Spectrum.h"
|
#include "Spectrum.h"
|
||||||
#include "ViewInfo.h"
|
#include "ViewInfo.h"
|
||||||
@ -270,14 +271,6 @@ TrackArtist::TrackArtist()
|
|||||||
|
|
||||||
SetColours();
|
SetColours();
|
||||||
vruler = new Ruler();
|
vruler = new Ruler();
|
||||||
|
|
||||||
#ifdef EXPERIMENTAL_FFT_Y_GRID
|
|
||||||
fftYGridOld=true;
|
|
||||||
#endif //EXPERIMENTAL_FFT_Y_GRID
|
|
||||||
|
|
||||||
#ifdef EXPERIMENTAL_FIND_NOTES
|
|
||||||
fftFindNotesOld=false;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TrackArtist::~TrackArtist()
|
TrackArtist::~TrackArtist()
|
||||||
@ -811,14 +804,14 @@ void TrackArtist::UpdateVRuler(Track *t, wxRect & r)
|
|||||||
|
|
||||||
int maxFreq = GetSpectrumMaxFreq(freq);
|
int maxFreq = GetSpectrumMaxFreq(freq);
|
||||||
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
maxFreq/=(mFftSkipPoints+1);
|
maxFreq/=(fftSkipPoints+1);
|
||||||
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
if(maxFreq > freq)
|
if(maxFreq > freq)
|
||||||
maxFreq = freq;
|
maxFreq = freq;
|
||||||
|
|
||||||
int minFreq = GetSpectrumMinFreq(0);
|
int minFreq = GetSpectrumMinFreq(0);
|
||||||
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
minFreq/=(mFftSkipPoints+1);
|
minFreq/=(fftSkipPoints+1);
|
||||||
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
if(minFreq < 0)
|
if(minFreq < 0)
|
||||||
minFreq = 0;
|
minFreq = 0;
|
||||||
@ -857,14 +850,14 @@ void TrackArtist::UpdateVRuler(Track *t, wxRect & r)
|
|||||||
|
|
||||||
int maxFreq = GetSpectrumLogMaxFreq(freq);
|
int maxFreq = GetSpectrumLogMaxFreq(freq);
|
||||||
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
maxFreq/=(mFftSkipPoints+1);
|
maxFreq/=(fftSkipPoints+1);
|
||||||
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
if(maxFreq > freq)
|
if(maxFreq > freq)
|
||||||
maxFreq = freq;
|
maxFreq = freq;
|
||||||
|
|
||||||
int minFreq = GetSpectrumLogMinFreq(freq/1000.0);
|
int minFreq = GetSpectrumLogMinFreq(freq/1000.0);
|
||||||
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
minFreq/=(mFftSkipPoints+1);
|
minFreq/=(fftSkipPoints+1);
|
||||||
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
if(minFreq < 1)
|
if(minFreq < 1)
|
||||||
minFreq = 1;
|
minFreq = 1;
|
||||||
@ -1936,9 +1929,16 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int range = gPrefs->Read(wxT("/Spectrum/Range"), 80L);
|
const SpectrogramSettings &settings = SpectrogramSettings::defaults();
|
||||||
int gain = gPrefs->Read(wxT("/Spectrum/Gain"), 20L);
|
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);
|
dc.SetPen(*wxTRANSPARENT_PEN);
|
||||||
|
|
||||||
@ -1959,7 +1959,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache,
|
|||||||
t0, pps, autocorrelation);
|
t0, pps, autocorrelation);
|
||||||
|
|
||||||
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
int fftSkipPoints = gPrefs->Read(wxT("/Spectrum/FFTSkipPoints"), 0L);
|
int fftSkipPoints = SpectrogramSettings::defaults().fftSkipPoints;
|
||||||
int fftSkipPoints1 = fftSkipPoints + 1;
|
int fftSkipPoints1 = fftSkipPoints + 1;
|
||||||
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
|
|
||||||
@ -2009,8 +2009,8 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache,
|
|||||||
for (int y = 0; y < mid.height; y++) {
|
for (int y = 0; y < mid.height; y++) {
|
||||||
float n = (float(y) / mid.height*scale2 - lmin2) * 12;
|
float n = (float(y) / mid.height*scale2 - lmin2) * 12;
|
||||||
float n2 = (float(y + 1) / 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 f = float(minFreq) / (fftSkipPoints + 1)*powf(2.0f, n / 12.0f + lmin2);
|
||||||
float f2 = float(minFreq) / (mFftSkipPoints + 1)*powf(2.0f, n2 / 12.0f + lmin2);
|
float f2 = float(minFreq) / (fftSkipPoints + 1)*powf(2.0f, n2 / 12.0f + lmin2);
|
||||||
n = logf(f / 440) / log2 * 12;
|
n = logf(f / 440) / log2 * 12;
|
||||||
n2 = logf(f2 / 440) / log2 * 12;
|
n2 = logf(f2 / 440) / log2 * 12;
|
||||||
if (floor(n) < floor(n2))
|
if (floor(n) < floor(n2))
|
||||||
@ -2024,13 +2024,13 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache,
|
|||||||
&& gain == clip->mSpecPxCache->gain
|
&& gain == clip->mSpecPxCache->gain
|
||||||
&& range == clip->mSpecPxCache->range
|
&& range == clip->mSpecPxCache->range
|
||||||
#ifdef EXPERIMENTAL_FFT_Y_GRID
|
#ifdef EXPERIMENTAL_FFT_Y_GRID
|
||||||
&& mFftYGrid==fftYGridOld
|
&& fftYGrid==fftYGridOld
|
||||||
#endif //EXPERIMENTAL_FFT_Y_GRID
|
#endif //EXPERIMENTAL_FFT_Y_GRID
|
||||||
#ifdef EXPERIMENTAL_FIND_NOTES
|
#ifdef EXPERIMENTAL_FIND_NOTES
|
||||||
&& mFftFindNotes==fftFindNotesOld
|
&& fftFindNotes==fftFindNotesOld
|
||||||
&& mFindNotesMinA==findNotesMinAOld
|
&& findNotesMinA==findNotesMinAOld
|
||||||
&& mNumberOfMaxima==findNotesNOld
|
&& numberOfMaxima==findNotesNOld
|
||||||
&& mFindNotesQuantize==findNotesQuantizeOld
|
&& findNotesQuantize==findNotesQuantizeOld
|
||||||
#endif
|
#endif
|
||||||
) {
|
) {
|
||||||
// cache is up to date
|
// cache is up to date
|
||||||
@ -2042,17 +2042,17 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache,
|
|||||||
clip->mSpecPxCache->gain = gain;
|
clip->mSpecPxCache->gain = gain;
|
||||||
clip->mSpecPxCache->range = range;
|
clip->mSpecPxCache->range = range;
|
||||||
#ifdef EXPERIMENTAL_FIND_NOTES
|
#ifdef EXPERIMENTAL_FIND_NOTES
|
||||||
fftFindNotesOld=mFftFindNotes;
|
fftFindNotesOld = fftFindNotes;
|
||||||
findNotesMinAOld=mFindNotesMinA;
|
findNotesMinAOld = findNotesMinA;
|
||||||
findNotesNOld=mNumberOfMaxima;
|
findNotesNOld = numberOfMaxima;
|
||||||
findNotesQuantizeOld=mFindNotesQuantize;
|
findNotesQuantizeOld = findNotesQuantize;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef EXPERIMENTAL_FIND_NOTES
|
#ifdef EXPERIMENTAL_FIND_NOTES
|
||||||
const float
|
const float
|
||||||
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
lmins = logf(float(minFreq) / (mFftSkipPoints + 1)),
|
lmins = logf(float(minFreq) / (fftSkipPoints + 1)),
|
||||||
lmaxs = logf(float(maxFreq) / (mFftSkipPoints + 1)),
|
lmaxs = logf(float(maxFreq) / (fftSkipPoints + 1)),
|
||||||
#else //!EXPERIMENTAL_FFT_SKIP_POINTS
|
#else //!EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
lmins = lmin,
|
lmins = lmin,
|
||||||
lmaxs = lmax,
|
lmaxs = lmax,
|
||||||
@ -2065,7 +2065,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache,
|
|||||||
float maxima0[128], maxima1[128];
|
float maxima0[128], maxima1[128];
|
||||||
const float
|
const float
|
||||||
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
f2bin = half / (rate / 2.0f / (mFftSkipPoints + 1)),
|
f2bin = half / (rate / 2.0f / (fftSkipPoints + 1)),
|
||||||
#else //!EXPERIMENTAL_FFT_SKIP_POINTS
|
#else //!EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
f2bin = half / (rate / 2.0f),
|
f2bin = half / (rate / 2.0f),
|
||||||
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
@ -2092,7 +2092,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache,
|
|||||||
else {
|
else {
|
||||||
#ifdef EXPERIMENTAL_FIND_NOTES
|
#ifdef EXPERIMENTAL_FIND_NOTES
|
||||||
int maximas=0;
|
int maximas=0;
|
||||||
if (!usePxCache && mFftFindNotes) {
|
if (!usePxCache && fftFindNotes) {
|
||||||
for (int i = maxTableSize-1; i >= 0; i--)
|
for (int i = maxTableSize-1; i >= 0; i--)
|
||||||
indexes[i]=-1;
|
indexes[i]=-1;
|
||||||
|
|
||||||
@ -2111,7 +2111,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache,
|
|||||||
int index=indexes[i];
|
int index=indexes[i];
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
float freqi=freq[x0+index];
|
float freqi=freq[x0+index];
|
||||||
if (freqi < mFindNotesMinA)
|
if (freqi < findNotesMinA)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
bool ok=true;
|
bool ok=true;
|
||||||
@ -2125,7 +2125,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache,
|
|||||||
}
|
}
|
||||||
if (ok) {
|
if (ok) {
|
||||||
maxima[maximas++] = index;
|
maxima[maximas++] = index;
|
||||||
if (maximas >= mNumberOfMaxima)
|
if (maximas >= numberOfMaxima)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2138,7 +2138,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache,
|
|||||||
for (int i=0; i < maximas; i++) {
|
for (int i=0; i < maximas; i++) {
|
||||||
int index=maxima[i];
|
int index=maxima[i];
|
||||||
float f = float(index)*bin2f;
|
float f = float(index)*bin2f;
|
||||||
if (mFindNotesQuantize)
|
if (findNotesQuantize)
|
||||||
{ f = expf(int(log(f/440)/log2*12-0.5)/12.0f*log2)*440;
|
{ f = expf(int(log(f/440)/log2*12-0.5)/12.0f*log2)*440;
|
||||||
maxima[i] = f*f2bin;
|
maxima[i] = f*f2bin;
|
||||||
}
|
}
|
||||||
@ -2172,7 +2172,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache,
|
|||||||
float value;
|
float value;
|
||||||
|
|
||||||
#ifdef EXPERIMENTAL_FIND_NOTES
|
#ifdef EXPERIMENTAL_FIND_NOTES
|
||||||
if (mFftFindNotes) {
|
if (fftFindNotes) {
|
||||||
if (it < maximas) {
|
if (it < maximas) {
|
||||||
float i0=maxima0[it];
|
float i0=maxima0[it];
|
||||||
if (yy >= i0)
|
if (yy >= i0)
|
||||||
@ -2182,7 +2182,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache,
|
|||||||
float i1=maxima1[it];
|
float i1=maxima1[it];
|
||||||
if (yy+1 <= i1) {
|
if (yy+1 <= i1) {
|
||||||
value=sumFreqValues(freq, x0, bin0, bin1);
|
value=sumFreqValues(freq, x0, bin0, bin1);
|
||||||
if (value < mFindNotesMinA)
|
if (value < findNotesMinA)
|
||||||
value = minColor;
|
value = minColor;
|
||||||
else
|
else
|
||||||
value = (value + gain + range) / (double)range;
|
value = (value + gain + range) / (double)range;
|
||||||
@ -2253,7 +2253,7 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache,
|
|||||||
unsigned char rv, gv, bv;
|
unsigned char rv, gv, bv;
|
||||||
const float value =
|
const float value =
|
||||||
clip->mSpecPxCache->values[x * mid.height + yy];
|
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;
|
int px = ((mid.height - 1 - yy) * mid.width + x) * 3;
|
||||||
data[px++] = rv;
|
data[px++] = rv;
|
||||||
data[px++] = gv;
|
data[px++] = gv;
|
||||||
@ -2293,10 +2293,10 @@ void TrackArtist::DrawClipSpectrum(WaveTrackCache &cache,
|
|||||||
yy2 = yy2_base;
|
yy2 = yy2_base;
|
||||||
|
|
||||||
unsigned char rv, gv, bv;
|
unsigned char rv, gv, bv;
|
||||||
GetColorGradient(value, selected, mIsGrayscale, &rv, &gv, &bv);
|
GetColorGradient(value, selected, isGrayscale, &rv, &gv, &bv);
|
||||||
|
|
||||||
#ifdef EXPERIMENTAL_FFT_Y_GRID
|
#ifdef EXPERIMENTAL_FFT_Y_GRID
|
||||||
if (mFftYGrid && yGrid[yy]) {
|
if (fftYGrid && yGrid[yy]) {
|
||||||
rv /= 1.1f;
|
rv /= 1.1f;
|
||||||
gv /= 1.1f;
|
gv /= 1.1f;
|
||||||
bv /= 1.1f;
|
bv /= 1.1f;
|
||||||
@ -3043,99 +3043,74 @@ void TrackArtist::UpdatePrefs()
|
|||||||
mdBrange = gPrefs->Read(wxT("/GUI/EnvdBRange"), mdBrange);
|
mdBrange = gPrefs->Read(wxT("/GUI/EnvdBRange"), mdBrange);
|
||||||
mShowClipping = gPrefs->Read(wxT("/GUI/ShowClipping"), mShowClipping);
|
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();
|
gPrefs->Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get various preference values
|
// Get various preference values
|
||||||
int TrackArtist::GetSpectrumMinFreq(int deffreq)
|
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)
|
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)
|
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)
|
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)
|
int TrackArtist::GetSpectrumWindowSize(bool includeZeroPadding)
|
||||||
{
|
{
|
||||||
|
includeZeroPadding;
|
||||||
|
const int &windowSize = SpectrogramSettings::defaults().windowSize;
|
||||||
#ifdef EXPERIMENTAL_ZERO_PADDED_SPECTROGRAMS
|
#ifdef EXPERIMENTAL_ZERO_PADDED_SPECTROGRAMS
|
||||||
if (includeZeroPadding)
|
if (includeZeroPadding) {
|
||||||
return mWindowSize * mZeroPaddingFactor;
|
const int &zeroPaddingFactor = SpectrogramSettings::defaults().zeroPaddingFactor;
|
||||||
|
return windowSize * zeroPaddingFactor;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
return mWindowSize;
|
return windowSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
int TrackArtist::GetSpectrumFftSkipPoints()
|
int TrackArtist::GetSpectrumFftSkipPoints()
|
||||||
{
|
{
|
||||||
return mFftSkipPoints;
|
return SpectrogramSettings::defaults().fftSkipPoints;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Set various preference values
|
// Set various preference values
|
||||||
void TrackArtist::SetSpectrumMinFreq(int freq)
|
void TrackArtist::SetSpectrumMinFreq(int freq)
|
||||||
{
|
{
|
||||||
mMinFreq = freq;
|
SpectrogramSettings::defaults().minFreq = freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrackArtist::SetSpectrumMaxFreq(int freq)
|
void TrackArtist::SetSpectrumMaxFreq(int freq)
|
||||||
{
|
{
|
||||||
mMaxFreq = freq;
|
SpectrogramSettings::defaults().maxFreq = freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrackArtist::SetSpectrumLogMinFreq(int freq)
|
void TrackArtist::SetSpectrumLogMinFreq(int freq)
|
||||||
{
|
{
|
||||||
mLogMinFreq = freq;
|
SpectrogramSettings::defaults().logMinFreq = freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrackArtist::SetSpectrumLogMaxFreq(int 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
|
// Draws the sync-lock bitmap, tiled; always draws stationary relative to the DC
|
||||||
|
@ -173,32 +173,8 @@ class AUDACITY_DLL_API TrackArtist {
|
|||||||
// Preference values
|
// Preference values
|
||||||
float mdBrange; // "/GUI/EnvdBRange"
|
float mdBrange; // "/GUI/EnvdBRange"
|
||||||
long mShowClipping; // "/GUI/ShowClipping"
|
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"
|
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 mInsetLeft;
|
||||||
int mInsetTop;
|
int mInsetTop;
|
||||||
int mInsetRight;
|
int mInsetRight;
|
||||||
|
@ -214,6 +214,8 @@ is time to refresh some aspect of the screen.
|
|||||||
|
|
||||||
#include "ondemand/ODManager.h"
|
#include "ondemand/ODManager.h"
|
||||||
|
|
||||||
|
#include "prefs/SpectrumPrefs.h"
|
||||||
|
|
||||||
#include "toolbars/ControlToolBar.h"
|
#include "toolbars/ControlToolBar.h"
|
||||||
#include "toolbars/ToolManager.h"
|
#include "toolbars/ToolManager.h"
|
||||||
#include "toolbars/ToolsToolBar.h"
|
#include "toolbars/ToolsToolBar.h"
|
||||||
@ -3045,8 +3047,7 @@ void TrackPanel::StartSnappingFreqSelection (WaveTrack *pTrack)
|
|||||||
|
|
||||||
while(windowSize > effectiveLength)
|
while(windowSize > effectiveLength)
|
||||||
windowSize >>= 1;
|
windowSize >>= 1;
|
||||||
int windowType;
|
const int windowType = SpectrogramSettings::defaults().windowType;
|
||||||
gPrefs->Read(wxT("/Spectrum/WindowType"), &windowType, 3);
|
|
||||||
mFrequencySnapper->Calculate(
|
mFrequencySnapper->Calculate(
|
||||||
SpectrumAnalyst::Spectrum, windowType, windowSize, rate,
|
SpectrumAnalyst::Spectrum, windowType, windowSize, rate,
|
||||||
&frequencySnappingData[0], length);
|
&frequencySnappingData[0], length);
|
||||||
@ -4722,7 +4723,7 @@ void TrackPanel::HandleVZoomButtonUp( wxMouseEvent & event )
|
|||||||
// Always spectrogram, never pitch view, pass true
|
// Always spectrogram, never pitch view, pass true
|
||||||
windowSize = mTrackArtist->GetSpectrumWindowSize(true);
|
windowSize = mTrackArtist->GetSpectrumWindowSize(true);
|
||||||
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
fftSkipPoints = mTrackArtist->GetSpectrumFftSkipPoints();
|
fftSkipPoints = SpectrogramSettings::defaults().fftSkipPoints;
|
||||||
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
binSize = rate / windowSize;
|
binSize = rate / windowSize;
|
||||||
minBins = wxMin(10, windowSize/2); //minimum 10 freq bins, unless there are less
|
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
|
// Always spectrogram, never pitch view, pass true
|
||||||
windowSize = mTrackArtist->GetSpectrumWindowSize(true);
|
windowSize = mTrackArtist->GetSpectrumWindowSize(true);
|
||||||
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
fftSkipPoints = mTrackArtist->GetSpectrumFftSkipPoints();
|
fftSkipPoints = SpectrogramSettings::defaults().fftSkipPoints;
|
||||||
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
binSize = rate / windowSize;
|
binSize = rate / windowSize;
|
||||||
minBins = wxMin(10, windowSize/2); //minimum 10 freq bins, unless there are less
|
minBins = wxMin(10, windowSize/2); //minimum 10 freq bins, unless there are less
|
||||||
|
@ -39,6 +39,8 @@ drawing). Cache's the Spectrogram frequency samples.
|
|||||||
#include "Resample.h"
|
#include "Resample.h"
|
||||||
#include "Project.h"
|
#include "Project.h"
|
||||||
|
|
||||||
|
#include "prefs/SpectrumPrefs.h"
|
||||||
|
|
||||||
#include <wx/listimpl.cpp>
|
#include <wx/listimpl.cpp>
|
||||||
WX_DEFINE_LIST(WaveClipList);
|
WX_DEFINE_LIST(WaveClipList);
|
||||||
|
|
||||||
@ -904,16 +906,21 @@ bool WaveClip::GetSpectrogram(WaveTrackCache &waveTrackCache,
|
|||||||
double t0, double pixelsPerSecond,
|
double t0, double pixelsPerSecond,
|
||||||
bool autocorrelation)
|
bool autocorrelation)
|
||||||
{
|
{
|
||||||
int frequencyGain = gPrefs->Read(wxT("/Spectrum/FrequencyGain"), 0L);
|
const SpectrogramSettings &settings = SpectrogramSettings::defaults();
|
||||||
int windowType;
|
|
||||||
int windowSize = gPrefs->Read(wxT("/Spectrum/FFTSize"), 256);
|
|
||||||
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
#ifdef EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
int fftSkipPoints = gPrefs->Read(wxT("/Spectrum/FFTSkipPoints"), 0L);
|
int fftSkipPoints = settings.fftSkipPoints;
|
||||||
int fftSkipPoints1 = fftSkipPoints + 1;
|
int fftSkipPoints1 = fftSkipPoints + 1;
|
||||||
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
#endif //EXPERIMENTAL_FFT_SKIP_POINTS
|
||||||
const int zeroPaddingFactor =
|
|
||||||
autocorrelation ? 1 : gPrefs->Read(wxT("/Spectrum/ZeroPaddingFactor"), 1);
|
const int &frequencyGain = settings.frequencyGain;
|
||||||
gPrefs->Read(wxT("/Spectrum/WindowType"), &windowType, 3);
|
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
|
// FFT length may be longer than the window of samples that affect results
|
||||||
// because of zero padding done for increased frequency resolution
|
// because of zero padding done for increased frequency resolution
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
*//*******************************************************************/
|
*//*******************************************************************/
|
||||||
|
|
||||||
#include "../Audacity.h"
|
#include "../Audacity.h"
|
||||||
|
#include "SpectrumPrefs.h"
|
||||||
|
|
||||||
#include <wx/defs.h>
|
#include <wx/defs.h>
|
||||||
#include <wx/intl.h>
|
#include <wx/intl.h>
|
||||||
@ -23,7 +24,6 @@
|
|||||||
#include "../Prefs.h"
|
#include "../Prefs.h"
|
||||||
#include "../Project.h"
|
#include "../Project.h"
|
||||||
#include "../ShuttleGui.h"
|
#include "../ShuttleGui.h"
|
||||||
#include "SpectrumPrefs.h"
|
|
||||||
#include "../FFT.h"
|
#include "../FFT.h"
|
||||||
|
|
||||||
SpectrumPrefs::SpectrumPrefs(wxWindow * parent)
|
SpectrumPrefs::SpectrumPrefs(wxWindow * parent)
|
||||||
@ -352,10 +352,12 @@ bool SpectrumPrefs::Apply()
|
|||||||
ShuttleGui S(this, eIsSavingToPrefs);
|
ShuttleGui S(this, eIsSavingToPrefs);
|
||||||
PopulateOrExchange(S);
|
PopulateOrExchange(S);
|
||||||
|
|
||||||
|
SpectrogramSettings::defaults().UpdatePrefs();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpectrumPrefs::OnWindowSize(wxCommandEvent &event)
|
void SpectrumPrefs::OnWindowSize(wxCommandEvent &)
|
||||||
{
|
{
|
||||||
wxChoice *const pWindowSizeControl =
|
wxChoice *const pWindowSizeControl =
|
||||||
static_cast<wxChoice*>(wxWindow::FindWindowById(ID_WINDOW_SIZE, this));
|
static_cast<wxChoice*>(wxWindow::FindWindowById(ID_WINDOW_SIZE, this));
|
||||||
@ -366,3 +368,61 @@ void SpectrumPrefs::OnWindowSize(wxCommandEvent &event)
|
|||||||
BEGIN_EVENT_TABLE(SpectrumPrefs, PrefsPanel)
|
BEGIN_EVENT_TABLE(SpectrumPrefs, PrefsPanel)
|
||||||
EVT_CHOICE(ID_WINDOW_SIZE, SpectrumPrefs::OnWindowSize)
|
EVT_CHOICE(ID_WINDOW_SIZE, SpectrumPrefs::OnWindowSize)
|
||||||
END_EVENT_TABLE()
|
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
|
||||||
|
}
|
||||||
|
@ -71,4 +71,46 @@ class SpectrumPrefs:public PrefsPanel
|
|||||||
#endif
|
#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
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user