Mercurial > hg > svgui
diff widgets/UnitConverter.cpp @ 885:6778a82d6b76
Adding the unit converter code might have enhanced the previous commit a little
author | Chris Cannam |
---|---|
date | Tue, 02 Dec 2014 13:30:24 +0000 |
parents | |
children | 01cceacee3da |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/widgets/UnitConverter.cpp Tue Dec 02 13:30:24 2014 +0000 @@ -0,0 +1,146 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Sonic Visualiser + An audio file viewer and annotation editor. + Centre for Digital Music, Queen Mary, University of London. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#include "UnitConverter.h" + +#include <QSpinBox> +#include <QComboBox> +#include <QDoubleSpinBox> +#include <QLabel> +#include <QDialogButtonBox> +#include <QGridLayout> + +#include "base/Debug.h" +#include "base/Pitch.h" + +using namespace std; + +UnitConverter::UnitConverter(QWidget *parent) : + QDialog(parent) +{ + QGridLayout *grid = new QGridLayout; + setLayout(grid); + + m_hz = new QDoubleSpinBox; + m_hz->setSuffix(QString(" Hz")); + m_hz->setDecimals(6); + m_hz->setMinimum(1e-6); + m_hz->setMaximum(1e6); + m_hz->setValue(440); + connect(m_hz, SIGNAL(valueChanged(double)), + this, SLOT(hzChanged(double))); + + m_midi = new QSpinBox; + m_midi->setMinimum(0); + m_midi->setMaximum(127); + connect(m_midi, SIGNAL(valueChanged(int)), + this, SLOT(midiChanged(int))); + + m_note = new QComboBox; + //!!! + + m_octave = new QSpinBox; + //!!! + + m_cents = new QDoubleSpinBox; + m_cents->setSuffix(tr(" cents")); + m_cents->setDecimals(4); + m_cents->setMinimum(-50); + m_cents->setMaximum(50); + connect(m_cents, SIGNAL(valueChanged(double)), + this, SLOT(centsChanged(double))); + + m_piano = new QSpinBox; + //!!! + + grid->addWidget(m_hz, 1, 0); + grid->addWidget(new QLabel(tr("=")), 1, 1); + + grid->addWidget(new QLabel(tr("MIDI note")), 1, 2, 1, 2); + grid->addWidget(m_midi, 1, 4); + + grid->addWidget(new QLabel(tr("+")), 1, 5); + grid->addWidget(m_cents, 1, 6); + + QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Close); + grid->addWidget(bb, 2, 0, 1, 7); + connect(bb, SIGNAL(rejected()), this, SLOT(close())); + + updateAllFromHz(); +} + +UnitConverter::~UnitConverter() +{ +} + +void +UnitConverter::hzChanged(double hz) +{ + cerr << "hzChanged: " << hz << endl; + updateAllFromHz(); +} + +void +UnitConverter::midiChanged(int midi) +{ + cerr << "midiChanged: " << midi << endl; + m_hz->setValue(Pitch::getFrequencyForPitch(m_midi->value(), m_cents->value())); + updateAllFromHz(); +} + +void +UnitConverter::noteChanged(int note) +{ + cerr << "noteChanged: " << note << endl; +} + +void +UnitConverter::octaveChanged(int oct) +{ + cerr << "octaveChanged: " << oct << endl; +} + +void +UnitConverter::centsChanged(double cents) +{ + cerr << "centsChanged: " << cents << endl; + m_hz->setValue(Pitch::getFrequencyForPitch(m_midi->value(), m_cents->value())); + updateAllFromHz(); +} + +void +UnitConverter::pianoChanged(int piano) +{ + cerr << "pianoChanged: " << piano << endl; +} + +void +UnitConverter::updateAllFromHz() +{ + float cents = 0; + int pitch = Pitch::getPitchForFrequency(m_hz->value(), ¢s); + + m_midi->blockSignals(true); + m_cents->blockSignals(true); + + m_midi->setValue(pitch); + m_cents->setValue(cents); + + m_midi->blockSignals(false); + m_cents->blockSignals(false); +} + + + +