annotate base/Pitch.cpp @ 84:e5907ae6de17

* Add GPL and README; some tidying
author Chris Cannam
date Mon, 13 Dec 2010 14:55:28 +0000
parents 054c384d860d
children fdaa63607c15
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.
Chris@84 7
Chris@84 8 This program is free software; you can redistribute it and/or
Chris@84 9 modify it under the terms of the GNU General Public License as
Chris@84 10 published by the Free Software Foundation; either version 2 of the
Chris@84 11 License, or (at your option) any later version. See the file
Chris@84 12 COPYING included with this distribution for more information.
cannam@0 13 */
cannam@0 14
cannam@0 15 #include "Pitch.h"
cannam@0 16
cannam@79 17 #include <math.h>
cannam@0 18
cannam@0 19 float
cannam@0 20 Pitch::getFrequencyForPitch(int midiPitch,
cannam@0 21 float centsOffset,
cannam@0 22 float concertA)
cannam@0 23 {
cannam@0 24 float p = float(midiPitch) + (centsOffset / 100);
cannam@0 25 return concertA * powf(2.0, (p - 69.0) / 12.0);
cannam@0 26 }
cannam@0 27
cannam@0 28 int
cannam@0 29 Pitch::getPitchForFrequency(float frequency,
cannam@0 30 float *centsOffsetReturn,
cannam@0 31 float concertA)
cannam@0 32 {
cannam@0 33 float p = 12.0 * (log(frequency / (concertA / 2.0)) / log(2.0)) + 57.0;
cannam@0 34
cannam@0 35 int midiPitch = int(p + 0.00001);
cannam@0 36 float centsOffset = (p - midiPitch) * 100.0;
cannam@0 37
cannam@0 38 if (centsOffset >= 50.0) {
cannam@0 39 midiPitch = midiPitch + 1;
cannam@0 40 centsOffset = -(100.0 - centsOffset);
cannam@0 41 }
cannam@0 42
cannam@0 43 if (centsOffsetReturn) *centsOffsetReturn = centsOffset;
cannam@0 44 return midiPitch;
cannam@0 45 }
cannam@0 46