Skip to content

Commit

Permalink
Tweak frequency calculations
Browse files Browse the repository at this point in the history
+ Remove override of paintEvent
  • Loading branch information
sakertooth committed Aug 29, 2023
1 parent 4d44de9 commit 330135b
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 72 deletions.
24 changes: 21 additions & 3 deletions plugins/Tuner/Tuner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,13 +78,31 @@ bool Tuner::processAudioBuffer(sampleFrame* buf, const fpp_t frames)
if (m_samplesCounter % m_hopSize == 0 && m_samplesCounter > 0)
{
aubio_pitch_do(m_aubioPitch, m_inputBuffer, m_outputBuffer);
emit frequencyCalculated(fvec_get_sample(m_outputBuffer, 0));
m_samplesCounter = 0;

const float frequency = fvec_get_sample(m_outputBuffer, 0);
m_finalFrequency += (frequency - m_finalFrequency) / ++m_numOutputsCounter;

if (m_numOutputsCounter % m_numOutputsPerUpdate == 0)
{
emit frequencyCalculated(m_finalFrequency);
m_finalFrequency = 0.0f;
m_numOutputsCounter = 0;
}
}

fvec_set_sample(m_inputBuffer, (buf[i][0] + buf[i][1]) * 0.5f, m_samplesCounter);
++m_samplesCounter;
fvec_set_sample(m_inputBuffer, (buf[i][0] + buf[i][1]) * 0.5f, m_samplesCounter++);
}

if (!m_clearInputBuffer)
{
m_clearInputBuffer = true;
}
}
else if (m_clearInputBuffer)
{
fvec_zeros(m_inputBuffer);
m_clearInputBuffer = false;
}

checkGate(outSum / frames);
Expand Down
4 changes: 4 additions & 0 deletions plugins/Tuner/Tuner.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,11 @@ class Tuner : public Effect

const int m_windowSize = 8192;
const int m_hopSize = 128;
int m_numOutputsPerUpdate = 32;
int m_numOutputsCounter = 0;
int m_samplesCounter = 0;
float m_finalFrequency = 0.0f;
bool m_clearInputBuffer = false;

aubio_pitch_t* m_aubioPitch;
fvec_t* m_inputBuffer;
Expand Down
107 changes: 41 additions & 66 deletions plugins/Tuner/TunerControlDialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
TunerControlDialog::TunerControlDialog(TunerControls* controls)
: EffectControlDialog(controls)
{
setFixedSize(240, 240);
setFixedSize(128, 128);
setAutoFillBackground(true);

auto pal = QPalette();
Expand Down Expand Up @@ -75,16 +75,6 @@ TunerControlDialog::TunerControlDialog(TunerControls* controls)
QObject::connect(controls->m_tuner, &Tuner::frequencyCalculated, this, [this](float frequency){ frequencyCalculated(frequency); });
}

void TunerControlDialog::paintEvent(QPaintEvent* event)
{
auto painter = QPainter(this);
painter.setPen(Qt::white);
painter.drawArc(QRectF{20.0, 50.0, 200.0, 60.0}, 30 * 16, 120 * 16);

painter.setBrush(Qt::white);
painter.drawEllipse(QPoint{120, 50}, 8, 8);
}

void TunerControlDialog::frequencyCalculated(float frequency)
{
// A4 = referenceFrequency
Expand All @@ -94,77 +84,62 @@ void TunerControlDialog::frequencyCalculated(float frequency)
const int octavesFromReference = std::round(centsFromReference / 1200.0f);
const int octaveOfNote = 4 + octavesFromReference;

int centsRemaining = (centsFromReference - (octavesFromReference * 1200));
int semitonesFromReference = centsRemaining / 100;
int centsOfNote = centsRemaining % 100;
int centsRemaining = centsFromReference - (octavesFromReference * 1200);
int semitonesFromReference = std::round(centsRemaining / 100);
int centsOfNote = centsRemaining - (semitonesFromReference * 100);

// If it is over 50ct, we can roll over to the nearest semitone
if (centsOfNote >= 50 || centsOfNote <= -50)
if (semitonesFromReference < 0) { semitonesFromReference += 12; }
auto note = noteToString(static_cast<NoteName>(semitonesFromReference));
m_noteLabel->setText(QString::fromStdString(note));

//Only give back the octave if it is in a useful range
if (octaveOfNote >= -1 && octaveOfNote <= 8) { m_octaveLabel->setText(QString::number(octaveOfNote)); };

m_centsLabel->setText((centsOfNote >= 0 ? "+" : "") + QString::number(centsOfNote) + "ct");
auto centDistance = std::abs(centsOfNote);
if (centDistance >= 0 && centDistance <= 10)
{
const auto centsOfNoteNormalized = centsOfNote / std::abs(centsOfNote);
semitonesFromReference += centsOfNoteNormalized;
centsOfNote = 100 - (centsOfNote * centsOfNoteNormalized);
m_centsLabel->setStyleSheet("QLabel { color : green; }");
}
else if (centDistance > 10 && centDistance <= 30)
{
m_centsLabel->setStyleSheet("QLabel { color : yellow; }");
}
else if (centDistance > 30)
{
m_centsLabel->setStyleSheet("QLabel { color : red; }");
}
}

if (semitonesFromReference < 0) { semitonesFromReference += 12; }
std::string note = "";

switch (static_cast<NoteName>(semitonesFromReference))
std::string TunerControlDialog::noteToString(NoteName note)
{
switch (note)
{
case NoteName::A:
note = "A";
break;
return "A";
case NoteName::ASharp:
note = "A#";
break;
return "A#";
case NoteName::B:
note = "B";
break;
return "B";
case NoteName::C:
note = "C";
break;
return "C";
case NoteName::CSharp:
note = "C#";
break;
return "C#";
case NoteName::D:
note = "D";
break;
return "D";
case NoteName::DSharp:
note = "D#";
break;
return "D#";
case NoteName::E:
note = "E";
break;
return "E";
case NoteName::F:
note = "F";
break;
return "F";
case NoteName::FSharp:
note = "F#";
break;
return "F#";
case NoteName::G:
note = "G";
break;
return "G";
case NoteName::GSharp:
note = "G#";
break;
return "G#";
default:
note = "";
return "";
};

m_noteLabel->setText(QString::fromStdString(note));
if (octaveOfNote >= -1) { m_octaveLabel->setText(QString::number(octaveOfNote)); };
m_centsLabel->setText((centsOfNote >= 0 ? "+" : "") + QString::number(centsOfNote) + "ct");

if (centsOfNote >= 0 && centsOfNote <= 10)
{
m_centsLabel->setStyleSheet("QLabel { color : green; }");
}
else if (centsOfNote > 10 && centsOfNote <= 30)
{
m_centsLabel->setStyleSheet("QLabel { color : yellow; }");
}
else if (centsOfNote > 30)
{
m_centsLabel->setStyleSheet("QLabel { color : red; }");
}
}
}
6 changes: 3 additions & 3 deletions plugins/Tuner/TunerControlDialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,17 +49,17 @@ class TunerControlDialog : public EffectControlDialog
G,
GSharp
};

TunerControlDialog(TunerControls* controls);
void paintEvent(QPaintEvent* event) override;
void frequencyCalculated(float frequency);

std::string noteToString(NoteName name);
private:
LcdWidget* m_centsWidget;
LcdWidget* m_freqWidget;
QLabel* m_noteLabel;
QLabel* m_octaveLabel;
QLabel* m_centsLabel;
QLabel* m_frequencyLabel;
friend class TunerControls;
};

Expand Down

0 comments on commit 330135b

Please sign in to comment.