annotate widgets/UnitConverter.cpp @ 886:01cceacee3da

Start adding piano note
author Chris Cannam
date Tue, 02 Dec 2014 13:50:49 +0000
parents 6778a82d6b76
children 139aad8bb445
rev   line source
Chris@885 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@885 2
Chris@885 3 /*
Chris@885 4 Sonic Visualiser
Chris@885 5 An audio file viewer and annotation editor.
Chris@885 6 Centre for Digital Music, Queen Mary, University of London.
Chris@885 7
Chris@885 8 This program is free software; you can redistribute it and/or
Chris@885 9 modify it under the terms of the GNU General Public License as
Chris@885 10 published by the Free Software Foundation; either version 2 of the
Chris@885 11 License, or (at your option) any later version. See the file
Chris@885 12 COPYING included with this distribution for more information.
Chris@885 13 */
Chris@885 14
Chris@885 15 #include "UnitConverter.h"
Chris@885 16
Chris@885 17 #include <QSpinBox>
Chris@885 18 #include <QComboBox>
Chris@885 19 #include <QDoubleSpinBox>
Chris@885 20 #include <QLabel>
Chris@885 21 #include <QDialogButtonBox>
Chris@885 22 #include <QGridLayout>
Chris@885 23
Chris@885 24 #include "base/Debug.h"
Chris@885 25 #include "base/Pitch.h"
Chris@885 26
Chris@885 27 using namespace std;
Chris@885 28
Chris@886 29 static QString pianoNotes[] = {
Chris@886 30 "C", "C# / Db", "D", "D# / Eb", "E",
Chris@886 31 "F", "F# / Gb", "G", "G# / Ab", "A", "A# / Bb", "B"
Chris@886 32 };
Chris@886 33
Chris@885 34 UnitConverter::UnitConverter(QWidget *parent) :
Chris@885 35 QDialog(parent)
Chris@885 36 {
Chris@885 37 QGridLayout *grid = new QGridLayout;
Chris@885 38 setLayout(grid);
Chris@885 39
Chris@885 40 m_hz = new QDoubleSpinBox;
Chris@885 41 m_hz->setSuffix(QString(" Hz"));
Chris@885 42 m_hz->setDecimals(6);
Chris@885 43 m_hz->setMinimum(1e-6);
Chris@885 44 m_hz->setMaximum(1e6);
Chris@885 45 m_hz->setValue(440);
Chris@885 46 connect(m_hz, SIGNAL(valueChanged(double)),
Chris@885 47 this, SLOT(hzChanged(double)));
Chris@885 48
Chris@885 49 m_midi = new QSpinBox;
Chris@885 50 m_midi->setMinimum(0);
Chris@885 51 m_midi->setMaximum(127);
Chris@885 52 connect(m_midi, SIGNAL(valueChanged(int)),
Chris@885 53 this, SLOT(midiChanged(int)));
Chris@885 54
Chris@885 55 m_note = new QComboBox;
Chris@886 56 for (int i = 0; i < 12; ++i) {
Chris@886 57 m_note->addItem(pianoNotes[i]);
Chris@886 58 }
Chris@886 59 connect(m_note, SIGNAL(currentIndexChanged(int)),
Chris@886 60 this, SLOT(noteChanged(int)));
Chris@885 61
Chris@885 62 m_octave = new QSpinBox;
Chris@886 63 m_octave->setMinimum(-4);
Chris@886 64 m_octave->setMaximum(12);
Chris@886 65 connect(m_octave, SIGNAL(valueChanged(int)),
Chris@886 66 this, SLOT(octaveChanged(int)));
Chris@885 67
Chris@885 68 m_cents = new QDoubleSpinBox;
Chris@885 69 m_cents->setSuffix(tr(" cents"));
Chris@885 70 m_cents->setDecimals(4);
Chris@885 71 m_cents->setMinimum(-50);
Chris@885 72 m_cents->setMaximum(50);
Chris@885 73 connect(m_cents, SIGNAL(valueChanged(double)),
Chris@885 74 this, SLOT(centsChanged(double)));
Chris@885 75
Chris@885 76 m_piano = new QSpinBox;
Chris@885 77 //!!!
Chris@885 78
Chris@886 79 int row = 1;
Chris@886 80
Chris@886 81 grid->addWidget(m_hz, row, 0);
Chris@886 82 grid->addWidget(new QLabel(tr("=")), row, 1);
Chris@885 83
Chris@886 84 grid->addWidget(new QLabel(tr("+")), row, 7);
Chris@886 85 grid->addWidget(m_cents, row, 8);
Chris@885 86
Chris@886 87 grid->addWidget(new QLabel(tr("Piano note")), row, 2, 1, 2);
Chris@886 88 grid->addWidget(m_note, row, 4);
Chris@886 89 grid->addWidget(new QLabel(tr("in octave")), row, 5);
Chris@886 90 grid->addWidget(m_octave, row, 6);
Chris@886 91
Chris@886 92 ++row;
Chris@886 93
Chris@886 94 grid->addWidget(new QLabel(tr("MIDI note")), row, 2, 1, 2);
Chris@886 95 grid->addWidget(m_midi, row, 4);
Chris@886 96
Chris@886 97 ++row;
Chris@885 98
Chris@885 99 QDialogButtonBox *bb = new QDialogButtonBox(QDialogButtonBox::Close);
Chris@886 100 grid->addWidget(bb, row, 0, 1, 9);
Chris@885 101 connect(bb, SIGNAL(rejected()), this, SLOT(close()));
Chris@885 102
Chris@885 103 updateAllFromHz();
Chris@885 104 }
Chris@885 105
Chris@885 106 UnitConverter::~UnitConverter()
Chris@885 107 {
Chris@885 108 }
Chris@885 109
Chris@885 110 void
Chris@885 111 UnitConverter::hzChanged(double hz)
Chris@885 112 {
Chris@885 113 cerr << "hzChanged: " << hz << endl;
Chris@885 114 updateAllFromHz();
Chris@885 115 }
Chris@885 116
Chris@885 117 void
Chris@885 118 UnitConverter::midiChanged(int midi)
Chris@885 119 {
Chris@885 120 cerr << "midiChanged: " << midi << endl;
Chris@885 121 m_hz->setValue(Pitch::getFrequencyForPitch(m_midi->value(), m_cents->value()));
Chris@885 122 updateAllFromHz();
Chris@885 123 }
Chris@885 124
Chris@885 125 void
Chris@885 126 UnitConverter::noteChanged(int note)
Chris@885 127 {
Chris@885 128 cerr << "noteChanged: " << note << endl;
Chris@885 129 }
Chris@885 130
Chris@885 131 void
Chris@885 132 UnitConverter::octaveChanged(int oct)
Chris@885 133 {
Chris@885 134 cerr << "octaveChanged: " << oct << endl;
Chris@885 135 }
Chris@885 136
Chris@885 137 void
Chris@885 138 UnitConverter::centsChanged(double cents)
Chris@885 139 {
Chris@885 140 cerr << "centsChanged: " << cents << endl;
Chris@885 141 m_hz->setValue(Pitch::getFrequencyForPitch(m_midi->value(), m_cents->value()));
Chris@885 142 updateAllFromHz();
Chris@885 143 }
Chris@885 144
Chris@885 145 void
Chris@885 146 UnitConverter::pianoChanged(int piano)
Chris@885 147 {
Chris@885 148 cerr << "pianoChanged: " << piano << endl;
Chris@885 149 }
Chris@885 150
Chris@885 151 void
Chris@885 152 UnitConverter::updateAllFromHz()
Chris@885 153 {
Chris@885 154 float cents = 0;
Chris@885 155 int pitch = Pitch::getPitchForFrequency(m_hz->value(), &cents);
Chris@885 156
Chris@885 157 m_midi->blockSignals(true);
Chris@885 158 m_cents->blockSignals(true);
Chris@885 159
Chris@885 160 m_midi->setValue(pitch);
Chris@885 161 m_cents->setValue(cents);
Chris@885 162
Chris@885 163 m_midi->blockSignals(false);
Chris@885 164 m_cents->blockSignals(false);
Chris@885 165 }
Chris@885 166
Chris@885 167
Chris@885 168
Chris@885 169