annotate base/Pitch.cpp @ 58:d72fcd34d9a7

* Fixes to problems shown up by vamp-plugin-tester. Still not all plugins pass all tests, though
author cannam
date Mon, 23 Mar 2009 16:28:53 +0000
parents d7116e3183f8
children 054c384d860d
rev   line source
cannam@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
cannam@0 2
cannam@0 3 /*
cannam@0 4 QM DSP library
cannam@0 5 Centre for Digital Music, Queen Mary, University of London.
cannam@0 6 This file Copyright 2006 Chris Cannam.
cannam@0 7 All rights reserved.
cannam@0 8 */
cannam@0 9
cannam@0 10 #include "Pitch.h"
cannam@0 11
cannam@0 12 #include <cmath>
cannam@0 13
cannam@0 14 float
cannam@0 15 Pitch::getFrequencyForPitch(int midiPitch,
cannam@0 16 float centsOffset,
cannam@0 17 float concertA)
cannam@0 18 {
cannam@0 19 float p = float(midiPitch) + (centsOffset / 100);
cannam@0 20 return concertA * powf(2.0, (p - 69.0) / 12.0);
cannam@0 21 }
cannam@0 22
cannam@0 23 int
cannam@0 24 Pitch::getPitchForFrequency(float frequency,
cannam@0 25 float *centsOffsetReturn,
cannam@0 26 float concertA)
cannam@0 27 {
cannam@0 28 float p = 12.0 * (log(frequency / (concertA / 2.0)) / log(2.0)) + 57.0;
cannam@0 29
cannam@0 30 int midiPitch = int(p + 0.00001);
cannam@0 31 float centsOffset = (p - midiPitch) * 100.0;
cannam@0 32
cannam@0 33 if (centsOffset >= 50.0) {
cannam@0 34 midiPitch = midiPitch + 1;
cannam@0 35 centsOffset = -(100.0 - centsOffset);
cannam@0 36 }
cannam@0 37
cannam@0 38 if (centsOffsetReturn) *centsOffsetReturn = centsOffset;
cannam@0 39 return midiPitch;
cannam@0 40 }
cannam@0 41