[Sv1-devel] SF.net SVN: sv1: [288] sonic-visualiser/trunk/main
Brought to you by:
cannam
From: <ca...@us...> - 2006-07-21 16:03:58
|
Revision: 288 Author: cannam Date: 2006-07-21 09:03:42 -0700 (Fri, 21 Jul 2006) ViewCVS: http://svn.sourceforge.net/sv1/?rev=288&view=rev Log Message: ----------- * Finish preferences dialog (as far as it's going at the moment) and connect it up * Fix Parzen window shape (was triangular!) * Various fixes to spectrogram draw coordinates in smoothing mode etc * Draw C keys in grey on the piano Modified Paths: -------------- sonic-visualiser/trunk/base/Pitch.cpp sonic-visualiser/trunk/base/Pitch.h sonic-visualiser/trunk/base/Preferences.cpp sonic-visualiser/trunk/base/PropertyContainer.h sonic-visualiser/trunk/base/View.cpp sonic-visualiser/trunk/base/View.h sonic-visualiser/trunk/base/Window.h sonic-visualiser/trunk/layer/SpectrogramLayer.cpp sonic-visualiser/trunk/layer/SpectrogramLayer.h sonic-visualiser/trunk/main/MainWindow.cpp sonic-visualiser/trunk/main/MainWindow.h sonic-visualiser/trunk/main/PreferencesDialog.cpp sonic-visualiser/trunk/main/PreferencesDialog.h sonic-visualiser/trunk/main/main.cpp sonic-visualiser/trunk/widgets/Pane.cpp sonic-visualiser/trunk/widgets/PluginParameterDialog.cpp Modified: sonic-visualiser/trunk/base/Pitch.cpp =================================================================== --- sonic-visualiser/trunk/base/Pitch.cpp 2006-07-20 16:51:20 UTC (rev 287) +++ sonic-visualiser/trunk/base/Pitch.cpp 2006-07-21 16:03:42 UTC (rev 288) @@ -14,6 +14,7 @@ */ #include "Pitch.h" +#include "Preferences.h" #include <cmath> @@ -22,6 +23,9 @@ float centsOffset, float concertA) { + if (concertA <= 0.0) { + concertA = Preferences::getInstance()->getTuningFrequency(); + } float p = float(midiPitch) + (centsOffset / 100); return concertA * powf(2.0, (p - 69.0) / 12.0); } @@ -31,6 +35,9 @@ float *centsOffsetReturn, float concertA) { + if (concertA <= 0.0) { + concertA = Preferences::getInstance()->getTuningFrequency(); + } float p = 12.0 * (log(frequency / (concertA / 2.0)) / log(2.0)) + 57.0; int midiPitch = int(p + 0.00001); @@ -86,6 +93,9 @@ float concertA, bool useFlats) { + if (concertA <= 0.0) { + concertA = Preferences::getInstance()->getTuningFrequency(); + } float centsOffset = 0.0; int midiPitch = getPitchForFrequency(frequency, ¢sOffset, concertA); return getPitchLabel(midiPitch, centsOffset, useFlats); Modified: sonic-visualiser/trunk/base/Pitch.h =================================================================== --- sonic-visualiser/trunk/base/Pitch.h 2006-07-20 16:51:20 UTC (rev 287) +++ sonic-visualiser/trunk/base/Pitch.h 2006-07-21 16:03:42 UTC (rev 288) @@ -21,20 +21,22 @@ class Pitch { public: + /* If concertA <= 0, it will be taken from current preferences */ + static float getFrequencyForPitch(int midiPitch, float centsOffset = 0, - float concertA = 440.0); + float concertA = 0.0); static int getPitchForFrequency(float frequency, float *centsOffsetReturn = 0, - float concertA = 440.0); + float concertA = 0.0); static QString getPitchLabel(int midiPitch, float centsOffset = 0, bool useFlats = false); static QString getPitchLabelForFrequency(float frequency, - float concertA = 440.0, + float concertA = 0.0, bool useFlats = false); }; Modified: sonic-visualiser/trunk/base/Preferences.cpp =================================================================== --- sonic-visualiser/trunk/base/Preferences.cpp 2006-07-20 16:51:20 UTC (rev 287) +++ sonic-visualiser/trunk/base/Preferences.cpp 2006-07-21 16:03:42 UTC (rev 288) @@ -41,16 +41,16 @@ Preferences::getPropertyLabel(const PropertyName &name) const { if (name == "Smooth Spectrogram") { - return tr("Spectrogram Display Smoothing"); + return tr("Smooth spectrogram display by zero padding FFT"); } if (name == "Tuning Frequency") { - return tr("Tuning Frequency (concert A)"); + return tr("Frequency of concert A"); } if (name == "Property Box Layout") { - return tr("Arrangement of Layer Properties"); + return tr("Property box layout"); } if (name == "Window Type") { - return tr("Spectral Analysis Window Shape"); + return tr("Spectral analysis window shape"); } return name; } @@ -105,13 +105,13 @@ int value) const { if (name == "Property Box Layout") { - if (value == 0) return tr("Vertically Stacked"); - else return tr("Layered"); + if (value == 0) return tr("Show boxes for all panes"); + else return tr("Show box for current pane only"); } if (name == "Window Type") { switch (WindowType(value)) { case RectangularWindow: return tr("Rectangular"); - case BartlettWindow: return tr("Bartlett"); + case BartlettWindow: return tr("Triangular"); case HammingWindow: return tr("Hamming"); case HanningWindow: return tr("Hanning"); case BlackmanWindow: return tr("Blackman"); @@ -153,7 +153,7 @@ { if (m_smoothSpectrogram != smooth) { m_smoothSpectrogram = smooth; -//!!! emit + emit propertyChanged("Smooth Spectrogram"); } } @@ -162,7 +162,7 @@ { if (m_tuningFrequency != freq) { m_tuningFrequency = freq; - //!!! emit + emit propertyChanged("Tuning Frequency"); } } @@ -171,7 +171,7 @@ { if (m_propertyBoxLayout != layout) { m_propertyBoxLayout = layout; - //!!! emit + emit propertyChanged("Property Box Layout"); } } @@ -180,7 +180,7 @@ { if (m_windowType != type) { m_windowType = type; - //!!! emit + emit propertyChanged("Window Type"); } } Modified: sonic-visualiser/trunk/base/PropertyContainer.h =================================================================== --- sonic-visualiser/trunk/base/PropertyContainer.h 2006-07-20 16:51:20 UTC (rev 287) +++ sonic-visualiser/trunk/base/PropertyContainer.h 2006-07-21 16:03:42 UTC (rev 288) @@ -90,7 +90,7 @@ virtual PlayParameters *getPlayParameters() { return 0; } signals: - void propertyChanged(PropertyName); + void propertyChanged(PropertyContainer::PropertyName); public slots: /** Modified: sonic-visualiser/trunk/base/View.cpp =================================================================== --- sonic-visualiser/trunk/base/View.cpp 2006-07-20 16:51:20 UTC (rev 287) +++ sonic-visualiser/trunk/base/View.cpp 2006-07-21 16:03:42 UTC (rev 288) @@ -1514,8 +1514,8 @@ ViewPropertyContainer::ViewPropertyContainer(View *v) : m_v(v) { - connect(m_v, SIGNAL(propertyChanged(PropertyName)), - this, SIGNAL(propertyChanged(PropertyName))); + connect(m_v, SIGNAL(propertyChanged(PropertyContainer::PropertyName)), + this, SIGNAL(propertyChanged(PropertyContainer::PropertyName))); } #ifdef INCLUDE_MOCFILES Modified: sonic-visualiser/trunk/base/View.h =================================================================== --- sonic-visualiser/trunk/base/View.h 2006-07-20 16:51:20 UTC (rev 287) +++ sonic-visualiser/trunk/base/View.h 2006-07-21 16:03:42 UTC (rev 288) @@ -237,7 +237,7 @@ void propertyContainerRemoved(PropertyContainer *pc); void propertyContainerPropertyChanged(PropertyContainer *pc); void propertyContainerNameChanged(PropertyContainer *pc); - void propertyChanged(PropertyName); + void propertyChanged(PropertyContainer::PropertyName); void centreFrameChanged(void *, unsigned long, bool); void zoomLevelChanged(void *, unsigned long, bool); Modified: sonic-visualiser/trunk/base/Window.h =================================================================== --- sonic-visualiser/trunk/base/Window.h 2006-07-20 16:51:20 UTC (rev 287) +++ sonic-visualiser/trunk/base/Window.h 2006-07-21 16:03:42 UTC (rev 288) @@ -69,56 +69,67 @@ template <typename T> void Window<T>::encache() { - size_t n = m_size; + int n = int(m_size); T *mult = new T[n]; - size_t i; + int i; for (i = 0; i < n; ++i) mult[i] = 1.0; switch (m_type) { case RectangularWindow: for (i = 0; i < n; ++i) { - mult[i] = mult[i] * 0.5; + mult[i] *= 0.5; } break; case BartlettWindow: for (i = 0; i < n/2; ++i) { - mult[i] = mult[i] * (i / T(n/2)); - mult[i + n/2] = mult[i + n/2] * (1.0 - (i / T(n/2))); + mult[i] *= (i / T(n/2)); + mult[i + n/2] *= (1.0 - (i / T(n/2))); } break; case HammingWindow: for (i = 0; i < n; ++i) { - mult[i] = mult[i] * (0.54 - 0.46 * cos(2 * M_PI * i / n)); + mult[i] *= (0.54 - 0.46 * cos(2 * M_PI * i / n)); } break; case HanningWindow: for (i = 0; i < n; ++i) { - mult[i] = mult[i] * (0.50 - 0.50 * cos(2 * M_PI * i / n)); + mult[i] *= (0.50 - 0.50 * cos(2 * M_PI * i / n)); } break; case BlackmanWindow: for (i = 0; i < n; ++i) { - mult[i] = mult[i] * (0.42 - 0.50 * cos(2 * M_PI * i / n) + mult[i] *= (0.42 - 0.50 * cos(2 * M_PI * i / n) + 0.08 * cos(4 * M_PI * i / n)); } break; case GaussianWindow: for (i = 0; i < n; ++i) { - mult[i] = mult[i] * exp(-(pow(i - (n-1)/2.0, 2) / + mult[i] *= exp(-(pow(i - (n-1)/2.0, 2) / (2 * pow(0.25 * n, 2)))); // sd = 0.25 } break; case ParzenWindow: - for (i = 0; i < n; ++i) { - mult[i] = mult[i] * (1.0 - fabs((T(2*i) - n) / T(n + 1))); - } + { + int N = n-1; + for (i = 0; i < N/4; ++i) { + T m = 2 * pow(1.0 - (T(N)/2 - i) / (T(N)/2), 3); + mult[i] *= m; + mult[N-i] *= m; + } + for (i = N/4; i <= N/2; ++i) { + int wn = i - N/2; + T m = 1.0 - 6 * pow(wn / (T(N)/2), 2) * (1.0 - abs(wn) / (T(N)/2)); + mult[i] *= m; + mult[N-i] *= m; + } + } break; } Modified: sonic-visualiser/trunk/layer/SpectrogramLayer.cpp =================================================================== --- sonic-visualiser/trunk/layer/SpectrogramLayer.cpp 2006-07-20 16:51:20 UTC (rev 287) +++ sonic-visualiser/trunk/layer/SpectrogramLayer.cpp 2006-07-21 16:03:42 UTC (rev 288) @@ -79,6 +79,11 @@ setNormalizeColumns(true); } + Preferences *prefs = Preferences::getInstance(); + connect(prefs, SIGNAL(propertyChanged(PropertyContainer::PropertyName)), + this, SLOT(preferenceChanged(PropertyContainer::PropertyName))); + setWindowType(prefs->getWindowType()); + setColourmap(); } @@ -549,6 +554,25 @@ } void +SpectrogramLayer::preferenceChanged(PropertyContainer::PropertyName name) +{ + std::cerr << "SpectrogramLayer::preferenceChanged(" << name.toStdString() << ")" << std::endl; + + if (name == "Window Type") { + setWindowType(Preferences::getInstance()->getWindowType()); + return; + } + if (name == "Smooth Spectrogram") { + invalidatePixmapCaches(); + invalidateMagnitudes(); + emit layerParametersChanged(); + } + if (name == "Tuning Frequency") { + emit layerParametersChanged(); + } +} + +void SpectrogramLayer::setChannel(int ch) { if (m_channel == ch) return; @@ -1336,8 +1360,6 @@ int sr = m_model->getSampleRate(); - //!!! wrong for smoothing -- wrong fft size for fft adapter - for (int q = q0i; q <= q1i; ++q) { if (q == q0i) freqMin = (sr * q) / m_fftSize; if (q == q1i) freqMax = (sr * (q+1)) / m_fftSize; @@ -1437,6 +1459,10 @@ bool rv = false; + size_t zp = getZeroPadLevel(v); + q0i *= zp + 1; + q1i *= zp + 1; + FFTFuzzyAdapter *fft = getFFTAdapter(v); if (fft) { @@ -1864,6 +1890,10 @@ m_drawBuffer.fill(m_colourMap.getColour(0).rgb()); int sr = m_model->getSampleRate(); + + // Set minFreq and maxFreq to the frequency extents of the possibly + // zero-padded visible bin range, and displayMinFreq and displayMaxFreq + // to the actual scale frequency extents (presumably not zero padded). size_t bins = fftSize / 2; if (m_maxFrequency > 0) { @@ -1881,9 +1911,17 @@ float minFreq = (float(minbin) * sr) / fftSize; float maxFreq = (float(bins) * sr) / fftSize; + float displayMinFreq = minFreq; + float displayMaxFreq = maxFreq; + + if (fftSize != m_fftSize) { + displayMinFreq = getEffectiveMinFrequency(); + displayMaxFreq = getEffectiveMaxFrequency(); + } + float ymag[h]; float ydiv[h]; - float yval[bins + 1]; //!!! cache this + float yval[bins + 1]; //!!! cache this? size_t increment = getWindowIncrement(); @@ -1891,7 +1929,9 @@ for (size_t q = minbin; q <= bins; ++q) { float f0 = (float(q) * sr) / fftSize; - yval[q] = v->getYForFrequency(f0, minFreq, maxFreq, logarithmic); + yval[q] = v->getYForFrequency(f0, displayMinFreq, displayMaxFreq, + logarithmic); +// std::cerr << "min: " << minFreq << ", max: " << maxFreq << ", yval[" << q << "]: " << yval[q] << std::endl; } MagnitudeRange overallMag = m_viewMags[v]; @@ -1959,7 +1999,7 @@ steady); y0 = y1 = v->getYForFrequency - (f, minFreq, maxFreq, logarithmic); + (f, displayMinFreq, displayMaxFreq, logarithmic); } int y0i = int(y0 + 0.001); @@ -2429,6 +2469,8 @@ return; } + Profiler profiler("SpectrogramLayer::paintVerticalScale", true); + //!!! cache this? int h = rect.height(), w = rect.width(); @@ -2615,14 +2657,34 @@ float minf = getEffectiveMinFrequency(); float maxf = getEffectiveMaxFrequency(); - int py = h; + int py = h, ppy = h; paint.setBrush(paint.pen().color()); for (int i = 0; i < 128; ++i) { float f = Pitch::getFrequencyForPitch(i); int y = lrintf(v->getYForFrequency(f, minf, maxf, true)); + + if (y < -2) break; + if (y > h + 2) { + continue; + } + int n = (i % 12); + + if (n == 1) { + // C# -- fill the C from here + if (ppy - y > 2) { + paint.fillRect(w - pkw, +// y - (py - y) / 2 - (py - y) / 4, + y, + pkw, + (py + ppy) / 2 - y, +// py - y + 1, + Qt::gray); + } + } + if (n == 1 || n == 3 || n == 6 || n == 8 || n == 10) { // black notes paint.drawLine(w - pkw, y, w, y); @@ -2630,12 +2692,13 @@ if (rh < 2) rh = 2; paint.drawRect(w - pkw, y - (py-y)/4, pkw/2, rh); } else if (n == 0 || n == 5) { - // C, A + // C, F if (py < h) { paint.drawLine(w - pkw, (y + py) / 2, w, (y + py) / 2); } } + ppy = py; py = y; } } Modified: sonic-visualiser/trunk/layer/SpectrogramLayer.h =================================================================== --- sonic-visualiser/trunk/layer/SpectrogramLayer.h 2006-07-20 16:51:20 UTC (rev 287) +++ sonic-visualiser/trunk/layer/SpectrogramLayer.h 2006-07-21 16:03:42 UTC (rev 288) @@ -20,6 +20,7 @@ #include "base/Window.h" #include "base/RealTime.h" #include "base/Thread.h" +#include "base/PropertyContainer.h" #include "model/PowerOfSqrtTwoZoomConstraint.h" #include "model/DenseTimeValueModel.h" @@ -211,6 +212,8 @@ protected slots: void cacheInvalid(); void cacheInvalid(size_t startFrame, size_t endFrame); + + void preferenceChanged(PropertyContainer::PropertyName name); void fillTimerTimedOut(); Modified: sonic-visualiser/trunk/main/MainWindow.cpp =================================================================== --- sonic-visualiser/trunk/main/MainWindow.cpp 2006-07-20 16:51:20 UTC (rev 287) +++ sonic-visualiser/trunk/main/MainWindow.cpp 2006-07-21 16:03:42 UTC (rev 288) @@ -24,6 +24,7 @@ #include "model/WaveFileModel.h" #include "model/SparseOneDimensionalModel.h" #include "base/ViewManager.h" +#include "base/Preferences.h" #include "layer/WaveformLayer.h" #include "layer/TimeRulerLayer.h" #include "layer/TimeInstantLayer.h" @@ -167,6 +168,11 @@ connect(m_viewManager, SIGNAL(outputLevelsChanged(float, float)), this, SLOT(outputLevelsChanged(float, float))); + connect(Preferences::getInstance(), + SIGNAL(propertyChanged(PropertyContainer::PropertyName)), + this, + SLOT(preferenceChanged(PropertyContainer::PropertyName))); + setupMenus(); setupToolbars(); @@ -2847,6 +2853,19 @@ } void +MainWindow::preferenceChanged(PropertyContainer::PropertyName name) +{ + if (name == "Property Box Layout") { + if (Preferences::getInstance()->getPropertyBoxLayout() == + Preferences::VerticallyStacked) { + m_paneStack->setLayoutStyle(PaneStack::PropertyStackPerPaneLayout); + } else { + m_paneStack->setLayoutStyle(PaneStack::SinglePropertyStackLayout); + } + } +} + +void MainWindow::preferences() { if (!m_preferencesDialog) { Modified: sonic-visualiser/trunk/main/MainWindow.h =================================================================== --- sonic-visualiser/trunk/main/MainWindow.h 2006-07-20 16:51:20 UTC (rev 287) +++ sonic-visualiser/trunk/main/MainWindow.h 2006-07-21 16:03:42 UTC (rev 288) @@ -22,6 +22,7 @@ #include "base/Command.h" #include "base/ViewManager.h" +#include "base/PropertyContainer.h" #include "layer/LayerFactory.h" #include "transform/Transform.h" #include "fileio/SVFileReader.h" @@ -176,6 +177,8 @@ void rightButtonMenuRequested(Pane *, QPoint point); + void preferenceChanged(PropertyContainer::PropertyName); + void showLayerTree(); void website(); Modified: sonic-visualiser/trunk/main/PreferencesDialog.cpp =================================================================== --- sonic-visualiser/trunk/main/PreferencesDialog.cpp 2006-07-20 16:51:20 UTC (rev 287) +++ sonic-visualiser/trunk/main/PreferencesDialog.cpp 2006-07-21 16:03:42 UTC (rev 288) @@ -18,7 +18,11 @@ #include <QGridLayout> #include <QComboBox> #include <QCheckBox> +#include <QGroupBox> +#include <QDoubleSpinBox> #include <QLabel> +#include <QPushButton> +#include <QHBoxLayout> #include <QPainter> #include <QPainterPath> @@ -27,14 +31,24 @@ PreferencesDialog::PreferencesDialog(QWidget *parent) : QDialog(parent) { + setWindowTitle(tr("Application Preferences")); + Preferences *prefs = Preferences::getInstance(); QGridLayout *grid = new QGridLayout; setLayout(grid); + QGroupBox *groupBox = new QGroupBox; + groupBox->setTitle(tr("Sonic Visualiser Application Preferences")); + grid->addWidget(groupBox, 0, 0); + + QGridLayout *subgrid = new QGridLayout; + groupBox->setLayout(subgrid); + QComboBox *windowCombo = new QComboBox; int min, max, i; int window = prefs->getPropertyRangeAndValue("Window Type", &min, &max); + m_initialWindowType = window; for (i = min; i <= max; ++i) { windowCombo->addItem(prefs->getPropertyValueLabel("Window Type", i)); @@ -47,21 +61,74 @@ connect(windowCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(windowTypeChanged(int))); windowTypeChanged(window); - - grid->addWidget(new QLabel(prefs->getPropertyLabel("Window Type")), 0, 0); - grid->addWidget(windowCombo, 0, 1); - grid->addWidget(m_windowExampleLabel, 0, 2); - QCheckBox *smoothing = new QCheckBox(prefs->getPropertyLabel("Smooth Spectrogram")); - smoothing->setCheckState(prefs->getPropertyRangeAndValue - ("Smooth Spectrogram", 0, 0) ? + QCheckBox *smoothing = new QCheckBox; + m_initialSmoothSpectrogram = prefs->getSmoothSpectrogram(); + smoothing->setCheckState(m_initialSmoothSpectrogram ? Qt::Checked : Qt::Unchecked); connect(smoothing, SIGNAL(stateChanged(int)), this, SLOT(smoothSpectrogramChanged(int))); + + QComboBox *propertyLayout = new QComboBox; + int pl = prefs->getPropertyRangeAndValue("Property Box Layout", &min, &max); + m_initialPropertyLayout = pl; + + for (i = min; i <= max; ++i) { + propertyLayout->addItem(prefs->getPropertyValueLabel("Property Box Layout", i)); + } + + propertyLayout->setCurrentIndex(pl); + + connect(propertyLayout, SIGNAL(currentIndexChanged(int)), + this, SLOT(propertyLayoutChanged(int))); + + m_initialTuningFrequency = prefs->getTuningFrequency(); + + QDoubleSpinBox *frequency = new QDoubleSpinBox; + frequency->setMinimum(100.0); + frequency->setMaximum(5000.0); + frequency->setSuffix(" Hz"); + frequency->setSingleStep(1); + frequency->setValue(m_initialTuningFrequency); + frequency->setDecimals(2); + + connect(frequency, SIGNAL(valueChanged(double)), + this, SLOT(tuningFrequencyChanged(double))); + + int row = 0; + + subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel + ("Property Box Layout"))), + row, 0); + subgrid->addWidget(propertyLayout, row++, 1, 1, 2); + + subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel + ("Tuning Frequency"))), + row, 0); + subgrid->addWidget(frequency, row++, 1, 1, 2); + + subgrid->addWidget(new QLabel(prefs->getPropertyLabel + ("Smooth Spectrogram")), + row, 0, 1, 2); + subgrid->addWidget(m_windowExampleLabel, row, 3, 2, 1); + subgrid->addWidget(smoothing, row++, 2); + + subgrid->addWidget(new QLabel(tr("%1:").arg(prefs->getPropertyLabel + ("Window Type"))), + row, 0); + subgrid->addWidget(windowCombo, row++, 1, 1, 2); - grid->addWidget(smoothing, 1, 0, 2, 1); + QHBoxLayout *hbox = new QHBoxLayout; + grid->addLayout(hbox, 1, 0); + QPushButton *ok = new QPushButton(tr("OK")); + QPushButton *cancel = new QPushButton(tr("Cancel")); + hbox->addStretch(10); + hbox->addWidget(ok); + hbox->addWidget(cancel); + connect(ok, SIGNAL(clicked()), this, SLOT(accept())); + connect(cancel, SIGNAL(clicked()), this, SLOT(cancelClicked())); } PreferencesDialog::~PreferencesDialog() @@ -71,33 +138,60 @@ void PreferencesDialog::windowTypeChanged(int value) { - int w = 64, h = 64; + int step = 24; + int peak = 48; + int w = step * 4, h = 64; WindowType type = WindowType(value); + Window<float> windower = Window<float>(type, step * 2); QPixmap label(w, h + 1); label.fill(Qt::white); QPainter painter(&label); - painter.setPen(Qt::black); QPainterPath path; + + path.moveTo(0, h - peak + 1); + path.lineTo(w, h - peak + 1); + + painter.setPen(Qt::gray); + painter.setRenderHint(QPainter::Antialiasing, true); + painter.drawPath(path); - Window<float> windower = Window<float>(type, w); - for (int i = 0; i < w; ++i) { - int y = h - h * windower.getValue(i) + 1; - if (i > 1) { - path.lineTo(i, y); - } else { - path.moveTo(i, y); + path = QPainterPath(); + + float acc[w]; + for (int i = 0; i < w; ++i) acc[i] = 0.f; + for (int j = 0; j < 3; ++j) { + for (int i = 0; i < step * 2; ++i) { + acc[j * step + i] += windower.getValue(i); } } + for (int i = 0; i < w; ++i) { + int y = h - int(peak * acc[i] + 0.001) + 1; + if (i == 0) path.moveTo(i, y); + else path.lineTo(i, y); + } + painter.drawPath(path); + painter.setRenderHint(QPainter::Antialiasing, false); + + path = QPainterPath(); + + painter.setPen(Qt::black); + + for (int i = 0; i < step * 2; ++i) { + int y = h - int(peak * windower.getValue(i) + 0.001) + 1; + if (i == 0) path.moveTo(i + step, float(y)); + else path.lineTo(i + step, float(y)); + } + if (type == RectangularWindow) { painter.drawPath(path); path = QPainterPath(); } painter.setRenderHint(QPainter::Antialiasing, true); - path.addRect(0, 0, w, h + 1); + path.addRect(0, 0, w, h); painter.drawPath(path); m_windowExampleLabel->setPixmap(label); @@ -111,3 +205,28 @@ Preferences::getInstance()->setSmoothSpectrogram(state == Qt::Checked); } +void +PreferencesDialog::propertyLayoutChanged(int layout) +{ + Preferences::getInstance()->setPropertyBoxLayout + (Preferences::PropertyBoxLayout(layout)); +} + +void +PreferencesDialog::tuningFrequencyChanged(double freq) +{ + Preferences::getInstance()->setTuningFrequency(freq); +} + +void +PreferencesDialog::cancelClicked() +{ + Preferences *prefs = Preferences::getInstance(); + prefs->setWindowType(WindowType(m_initialWindowType)); + prefs->setSmoothSpectrogram(m_initialSmoothSpectrogram); + prefs->setPropertyBoxLayout(Preferences::PropertyBoxLayout + (m_initialPropertyLayout)); + prefs->setTuningFrequency(m_initialTuningFrequency); + reject(); +} + Modified: sonic-visualiser/trunk/main/PreferencesDialog.h =================================================================== --- sonic-visualiser/trunk/main/PreferencesDialog.h 2006-07-20 16:51:20 UTC (rev 287) +++ sonic-visualiser/trunk/main/PreferencesDialog.h 2006-07-21 16:03:42 UTC (rev 288) @@ -31,9 +31,18 @@ protected slots: void windowTypeChanged(int type); void smoothSpectrogramChanged(int state); + void propertyLayoutChanged(int layout); + void tuningFrequencyChanged(double freq); + void cancelClicked(); + protected: QLabel *m_windowExampleLabel; + + int m_initialWindowType; + bool m_initialSmoothSpectrogram; + int m_initialPropertyLayout; + float m_initialTuningFrequency; }; #endif Modified: sonic-visualiser/trunk/main/main.cpp =================================================================== --- sonic-visualiser/trunk/main/main.cpp 2006-07-20 16:51:20 UTC (rev 287) +++ sonic-visualiser/trunk/main/main.cpp 2006-07-21 16:03:42 UTC (rev 288) @@ -17,6 +17,7 @@ #include "base/System.h" #include "base/TempDirectory.h" +#include "base/PropertyContainer.h" #include <QMetaType> #include <QApplication> @@ -140,8 +141,9 @@ svTranslator.load(svTrName, ":i18n"); application.installTranslator(&svTranslator); - // Permit size_t to be used as an argument in queued signal calls + // Permit size_t and PropertyName to be used as args in queued signal calls qRegisterMetaType<size_t>("size_t"); + qRegisterMetaType<PropertyContainer::PropertyName>("PropertyContainer::PropertyName"); MainWindow gui; Modified: sonic-visualiser/trunk/widgets/Pane.cpp =================================================================== --- sonic-visualiser/trunk/widgets/Pane.cpp 2006-07-20 16:51:20 UTC (rev 287) +++ sonic-visualiser/trunk/widgets/Pane.cpp 2006-07-21 16:03:42 UTC (rev 288) @@ -109,6 +109,8 @@ void Pane::paintEvent(QPaintEvent *e) { + Profiler profiler("Pane::paintEvent", true); + QPainter paint; QRect r(rect()); Modified: sonic-visualiser/trunk/widgets/PluginParameterDialog.cpp =================================================================== --- sonic-visualiser/trunk/widgets/PluginParameterDialog.cpp 2006-07-20 16:51:20 UTC (rev 287) +++ sonic-visualiser/trunk/widgets/PluginParameterDialog.cpp 2006-07-21 16:03:42 UTC (rev 288) @@ -38,6 +38,8 @@ m_channel(defaultChannel), m_parameterBox(0) { + setWindowTitle(tr("Plugin Parameters")); + QGridLayout *grid = new QGridLayout; setLayout(grid); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |