annotate base/Pitch.cpp @ 225:49844bc8a895

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