# HG changeset patch # User Chris Cannam # Date 1173108775 0 # Node ID d7eeffbb8aaff8634499551521ade14ff7a25ff4 # Parent 4cd620bd4c619a2ddaa5dc1b6c4495c8ab2847c7 * Add fuzzy interpolation option as an alternative to zero padding in spectrogram (looks terrible though) * Make spectrogram appear more quickly by having the FFT server notify of updates more often near the start of its run diff -r 4cd620bd4c61 -r d7eeffbb8aaf base/Preferences.cpp --- a/base/Preferences.cpp Fri Mar 02 14:00:12 2007 +0000 +++ b/base/Preferences.cpp Mon Mar 05 15:32:55 2007 +0000 @@ -35,7 +35,7 @@ } Preferences::Preferences() : - m_smoothSpectrogram(true), + m_spectrogramSmoothing(SpectrogramZeroPadded), m_tuningFrequency(440), m_propertyBoxLayout(VerticallyStacked), m_windowType(HanningWindow), @@ -43,7 +43,8 @@ { QSettings settings; settings.beginGroup("Preferences"); - m_smoothSpectrogram = settings.value("smooth-spectrogram", true).toBool(); + m_spectrogramSmoothing = SpectrogramSmoothing + (settings.value("spectrogram-smoothing", int(m_spectrogramSmoothing)).toInt()); m_tuningFrequency = settings.value("tuning-frequency", 440.f).toDouble(); m_propertyBoxLayout = PropertyBoxLayout (settings.value("property-box-layout", int(VerticallyStacked)).toInt()); @@ -61,7 +62,7 @@ Preferences::getProperties() const { PropertyList props; - props.push_back("Smooth Spectrogram"); + props.push_back("Spectrogram Smoothing"); props.push_back("Tuning Frequency"); props.push_back("Property Box Layout"); props.push_back("Window Type"); @@ -72,8 +73,8 @@ QString Preferences::getPropertyLabel(const PropertyName &name) const { - if (name == "Smooth Spectrogram") { - return tr("Smooth spectrogram display by zero padding FFT"); + if (name == "Spectrogram Smoothing") { + return tr("Spectrogram y-axis smoothing:"); } if (name == "Tuning Frequency") { return tr("Frequency of concert A"); @@ -93,8 +94,8 @@ Preferences::PropertyType Preferences::getPropertyType(const PropertyName &name) const { - if (name == "Smooth Spectrogram") { - return ToggleProperty; + if (name == "Spectrogram Smoothing") { + return ValueProperty; } if (name == "Tuning Frequency") { return RangeProperty; @@ -115,11 +116,11 @@ Preferences::getPropertyRangeAndValue(const PropertyName &name, int *min, int *max, int *deflt) const { - if (name == "Smooth Spectrogram") { + if (name == "Spectrogram Smoothing") { if (min) *min = 0; - if (max) *max = 1; - if (deflt) *deflt = 1; - return m_smoothSpectrogram ? 1 : 0; + if (max) *max = 2; + if (deflt) *deflt = int(SpectrogramZeroPadded); + return int(m_spectrogramSmoothing); } //!!! freq mapping @@ -176,6 +177,14 @@ case 2: return tr("Highest quality"); } } + if (name == "Spectrogram Smoothing") { + switch (value) { + case NoSpectrogramSmoothing: return tr("None - blocky but accurate"); + case SpectrogramInterpolated: return tr("Interpolate - fast but fuzzy"); + case SpectrogramZeroPadded: return tr("Zero pad FFT - slow but clear"); + } + } + return ""; } @@ -194,8 +203,8 @@ void Preferences::setProperty(const PropertyName &name, int value) { - if (name == "Smooth Spectrogram") { - setSmoothSpectrogram(value > 0.1); + if (name == "Spectrogram Smoothing") { + setSpectrogramSmoothing(SpectrogramSmoothing(value)); } else if (name == "Tuning Frequency") { //!!! } else if (name == "Property Box Layout") { @@ -208,15 +217,19 @@ } void -Preferences::setSmoothSpectrogram(bool smooth) +Preferences::setSpectrogramSmoothing(SpectrogramSmoothing smoothing) { - if (m_smoothSpectrogram != smooth) { - m_smoothSpectrogram = smooth; + if (m_spectrogramSmoothing != smoothing) { + + // "smoothing" is one of those words that looks increasingly + // ridiculous the more you see it. Smoothing smoothing smoothing. + m_spectrogramSmoothing = smoothing; + QSettings settings; settings.beginGroup("Preferences"); - settings.setValue("smooth-spectrogram", smooth); + settings.setValue("spectrogram-smoothing", int(smoothing)); settings.endGroup(); - emit propertyChanged("Smooth Spectrogram"); + emit propertyChanged("Spectrogram Smoothing"); } } diff -r 4cd620bd4c61 -r d7eeffbb8aaf base/Preferences.h --- a/base/Preferences.h Fri Mar 02 14:00:12 2007 +0000 +++ b/base/Preferences.h Mon Mar 05 15:32:55 2007 +0000 @@ -35,7 +35,14 @@ virtual QString getPropertyContainerName() const; virtual QString getPropertyContainerIconName() const; - bool getSmoothSpectrogram() const { return m_smoothSpectrogram; } + enum SpectrogramSmoothing { + NoSpectrogramSmoothing, + SpectrogramInterpolated, + SpectrogramZeroPadded, + SpectrogramZeroPaddedAndInterpolated + }; + + SpectrogramSmoothing getSpectrogramSmoothing() const { return m_spectrogramSmoothing; } float getTuningFrequency() const { return m_tuningFrequency; } WindowType getWindowType() const { return m_windowType; } int getResampleQuality() const { return m_resampleQuality; } @@ -50,7 +57,7 @@ public slots: virtual void setProperty(const PropertyName &, int); - void setSmoothSpectrogram(bool smooth); + void setSpectrogramSmoothing(SpectrogramSmoothing smoothing); void setTuningFrequency(float freq); void setPropertyBoxLayout(PropertyBoxLayout layout); void setWindowType(WindowType type); @@ -62,7 +69,7 @@ static Preferences *m_instance; - bool m_smoothSpectrogram; + SpectrogramSmoothing m_spectrogramSmoothing; float m_tuningFrequency; PropertyBoxLayout m_propertyBoxLayout; WindowType m_windowType; diff -r 4cd620bd4c61 -r d7eeffbb8aaf data/fft/FFTDataServer.cpp --- a/data/fft/FFTDataServer.cpp Fri Mar 02 14:00:12 2007 +0000 +++ b/data/fft/FFTDataServer.cpp Mon Mar 05 15:32:55 2007 +0000 @@ -1135,8 +1135,9 @@ size_t remainingEnd = end; int counter = 0; - int updateAt = (end / m_server.m_windowIncrement) / 20; - if (updateAt < 100) updateAt = 100; + int updateAt = 1; + int maxUpdateAt = (end / m_server.m_windowIncrement) / 20; + if (maxUpdateAt < 100) maxUpdateAt = 100; if (m_fillFrom > start) { @@ -1166,6 +1167,10 @@ m_completion = size_t(100 * fabsf(float(f - m_fillFrom) / float(end - start))); counter = 0; + if (updateAt < maxUpdateAt) { + updateAt *= 2; + if (updateAt > maxUpdateAt) updateAt = maxUpdateAt; + } } } @@ -1200,6 +1205,10 @@ size_t(100 * fabsf(float(f - start) / float(end - start))); counter = 0; + if (updateAt < maxUpdateAt) { + updateAt *= 2; + if (updateAt > maxUpdateAt) updateAt = maxUpdateAt; + } } }