Mercurial > hg > svgui
comparison widgets/UnitConverter.cpp @ 892:af63372e9002
Start connecting up tempo bits
author | Chris Cannam |
---|---|
date | Tue, 09 Dec 2014 13:53:44 +0000 |
parents | 09b2940f483a |
children | 78ae34f388f6 |
comparison
equal
deleted
inserted
replaced
891:09b2940f483a | 892:af63372e9002 |
---|---|
88 m_cents->setDecimals(4); | 88 m_cents->setDecimals(4); |
89 m_cents->setMinimum(-50); | 89 m_cents->setMinimum(-50); |
90 m_cents->setMaximum(50); | 90 m_cents->setMaximum(50); |
91 connect(m_cents, SIGNAL(valueChanged(double)), | 91 connect(m_cents, SIGNAL(valueChanged(double)), |
92 this, SLOT(centsChanged(double))); | 92 this, SLOT(centsChanged(double))); |
93 | |
94 m_piano = new QSpinBox; | |
95 //!!! | |
96 | 93 |
97 int row = 1; | 94 int row = 1; |
98 | 95 |
99 grid->addWidget(m_freq, row, 0, 2, 1); | 96 grid->addWidget(m_freq, row, 0, 2, 1, Qt::AlignRight | Qt::AlignVCenter); |
100 grid->addWidget(new QLabel(tr("=")), row, 1, 2, 1); | 97 grid->addWidget(new QLabel(tr("=")), row, 1, 2, 1, Qt::AlignHCenter | Qt::AlignVCenter); |
101 | 98 |
102 grid->addWidget(new QLabel(tr("+")), row, 7, 2, 1); | 99 grid->addWidget(new QLabel(tr("+")), row, 7, 2, 1, Qt::AlignHCenter | Qt::AlignVCenter); |
103 grid->addWidget(m_cents, row, 8, 2, 1); | 100 grid->addWidget(m_cents, row, 8, 2, 1, Qt::AlignLeft | Qt::AlignVCenter); |
104 | 101 |
105 grid->addWidget(new QLabel(tr("Piano note")), row, 2, 1, 2); | 102 grid->addWidget(new QLabel(tr("Piano note")), row, 2, 1, 2); |
106 grid->addWidget(m_note, row, 4); | 103 grid->addWidget(m_note, row, 4); |
107 grid->addWidget(new QLabel(tr("in octave")), row, 5); | 104 grid->addWidget(new QLabel(tr("in octave")), row, 5); |
108 grid->addWidget(m_octave, row, 6); | 105 grid->addWidget(m_octave, row, 6); |
130 tabs->addTab(frame, tr("Tempo")); | 127 tabs->addTab(frame, tr("Tempo")); |
131 | 128 |
132 grid = new QGridLayout; | 129 grid = new QGridLayout; |
133 frame->setLayout(grid); | 130 frame->setLayout(grid); |
134 | 131 |
132 m_samples = new QDoubleSpinBox; | |
133 m_samples->setSuffix(QString(" samples")); | |
134 m_samples->setDecimals(3); | |
135 m_samples->setMinimum(2); | |
136 m_samples->setMaximum(1e10); | |
137 m_samples->setValue(22050); | |
138 connect(m_samples, SIGNAL(valueChanged(double)), | |
139 this, SLOT(samplesChanged(double))); | |
140 | |
141 m_period = new QDoubleSpinBox; | |
142 m_period->setSuffix(QString(" ms")); | |
143 m_period->setDecimals(4); | |
144 m_period->setMinimum(1e-10); | |
145 m_period->setMaximum(1000); | |
146 m_period->setValue(500); | |
147 connect(m_period, SIGNAL(valueChanged(double)), | |
148 this, SLOT(periodChanged(double))); | |
149 | |
150 m_bpm = new QDoubleSpinBox; | |
151 m_bpm->setSuffix(QString(" bpm")); | |
152 m_bpm->setDecimals(4); | |
153 m_bpm->setMinimum(0.1); | |
154 m_bpm->setMaximum(1e6); | |
155 m_bpm->setValue(120); | |
156 connect(m_bpm, SIGNAL(valueChanged(double)), | |
157 this, SLOT(bpmChanged(double))); | |
158 | |
159 m_tempofreq = new QDoubleSpinBox; | |
160 m_tempofreq->setSuffix(QString(" beats/sec")); | |
161 m_tempofreq->setDecimals(4); | |
162 m_tempofreq->setMinimum(1e-4); | |
163 m_tempofreq->setMaximum(1e6); | |
164 m_tempofreq->setValue(0.5); | |
165 connect(m_tempofreq, SIGNAL(valueChanged(double)), | |
166 this, SLOT(tempofreqChanged(double))); | |
167 | |
168 m_samplerate = new QComboBox; | |
169 QList<int> rates; | |
170 rates << 8000; | |
171 for (int i = 1; i <= 16; i *= 2) { | |
172 rates << 11025 * i << 12000 * i; | |
173 } | |
174 foreach (int r, rates) { | |
175 m_samplerate->addItem(QString("%1 Hz").arg(r)); | |
176 } | |
177 connect(m_samplerate, SIGNAL(currentItemChanged(QString)), | |
178 this, SLOT(samplerateChanged(QString))); | |
179 m_samplerate->setCurrentText("44100 Hz"); | |
180 | |
135 connect(Preferences::getInstance(), | 181 connect(Preferences::getInstance(), |
136 SIGNAL(propertyChanged(PropertyContainer::PropertyName)), | 182 SIGNAL(propertyChanged(PropertyContainer::PropertyName)), |
137 this, SLOT(preferenceChanged(PropertyContainer::PropertyName))); | 183 this, SLOT(preferenceChanged(PropertyContainer::PropertyName))); |
138 | 184 |
185 row = 1; | |
186 | |
187 grid->addWidget(new QLabel(tr("Beat period")), row, 0); | |
188 grid->addWidget(m_samples, row, 1); | |
189 grid->addWidget(new QLabel(tr("=")), row, 2); | |
190 | |
191 grid->addWidget(new QLabel(tr("at sample rate")), row, 4); | |
192 grid->addWidget(m_samplerate, row, 5); | |
193 | |
194 grid->addWidget(m_bpm, row, 3); | |
195 | |
196 ++row; | |
197 | |
198 grid->addWidget(m_period, row, 3); | |
199 | |
200 ++row; | |
201 | |
202 grid->addWidget(m_tempofreq, row, 3); | |
203 | |
139 updatePitchesFromFreq(); | 204 updatePitchesFromFreq(); |
140 updatePitchPrefsLabel(); | 205 updatePitchPrefsLabel(); |
141 updateTempiFromSamples(); | 206 updateTempiFromSamples(); |
142 } | 207 } |
143 | 208 |
209 cerr << "freq -> " << freq << endl; | 274 cerr << "freq -> " << freq << endl; |
210 m_freq->setValue(freq); | 275 m_freq->setValue(freq); |
211 } | 276 } |
212 | 277 |
213 void | 278 void |
214 UnitConverter::pianoChanged(int piano) | |
215 { | |
216 cerr << "pianoChanged: " << piano << endl; | |
217 } | |
218 | |
219 void | |
220 UnitConverter::updatePitchesFromFreq() | 279 UnitConverter::updatePitchesFromFreq() |
221 { | 280 { |
222 float cents = 0; | 281 double cents = 0; |
223 int pitch = Pitch::getPitchForFrequency(m_freq->value(), ¢s); | 282 int pitch = Pitch::getPitchForFrequency(m_freq->value(), ¢s); |
224 int note, octave; | 283 int note, octave; |
225 Pitch::getNoteAndOctaveForPitch(pitch, note, octave); | 284 Pitch::getNoteAndOctaveForPitch(pitch, note, octave); |
226 | 285 |
227 cerr << "pitch " << pitch << " note " << note << " octave " << octave << " cents " << cents << endl; | 286 cerr << "pitch " << pitch << " note " << note << " octave " << octave << " cents " << cents << endl; |
241 m_note->blockSignals(false); | 300 m_note->blockSignals(false); |
242 m_octave->blockSignals(false); | 301 m_octave->blockSignals(false); |
243 } | 302 } |
244 | 303 |
245 void | 304 void |
305 UnitConverter::samplesChanged(double) | |
306 { | |
307 updateTempiFromSamples(); | |
308 } | |
309 | |
310 void | |
311 UnitConverter::periodChanged(double) | |
312 { | |
313 double rate = getSampleRate(); | |
314 double sec = m_period->value() / 1000.0; | |
315 double samples = rate * sec; | |
316 m_samples->setValue(samples); | |
317 } | |
318 | |
319 void | |
320 UnitConverter::bpmChanged(double) | |
321 { | |
322 double rate = getSampleRate(); | |
323 double sec = 60.0 / m_bpm->value(); | |
324 double samples = rate * sec; | |
325 m_samples->setValue(samples); | |
326 } | |
327 | |
328 void | |
329 UnitConverter::tempofreqChanged(double) | |
330 { | |
331 double rate = getSampleRate(); | |
332 double samples = rate / m_tempofreq->value(); | |
333 m_samples->setValue(samples); | |
334 } | |
335 | |
336 void | |
337 UnitConverter::samplerateChanged(QString) | |
338 { | |
339 updateTempiFromSamples(); | |
340 } | |
341 | |
342 double | |
343 UnitConverter::getSampleRate() | |
344 { | |
345 return double(atoi(m_samplerate->currentText().toLocal8Bit().data())); | |
346 } | |
347 | |
348 void | |
246 UnitConverter::updateTempiFromSamples() | 349 UnitConverter::updateTempiFromSamples() |
247 { | 350 { |
351 double samples = m_samples->value(); | |
352 double rate = getSampleRate(); | |
353 | |
354 cerr << samples << " samples at rate " << rate << endl; | |
355 | |
356 double sec = samples / rate; | |
357 double hz = rate / samples; | |
358 double bpm = 60.0 / sec; | |
359 | |
360 m_bpm->blockSignals(true); | |
361 m_period->blockSignals(true); | |
362 m_tempofreq->blockSignals(true); | |
363 | |
364 m_bpm->setValue(bpm); | |
365 m_period->setValue(sec * 1000.0); | |
366 m_tempofreq->setValue(hz); | |
367 | |
368 m_bpm->blockSignals(false); | |
369 m_period->blockSignals(false); | |
370 m_tempofreq->blockSignals(false); | |
248 } | 371 } |
249 | 372 |
250 | 373 |