Mercurial > hg > constant-q-cpp
comparison vamp/Pitch.cpp @ 121:2375457f2876
More necessary code, some work on build scripts
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Thu, 15 May 2014 14:23:42 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
120:3fa7e938e7d4 | 121:2375457f2876 |
---|---|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ | |
2 /* | |
3 Constant-Q library | |
4 Copyright (c) 2013-2014 Queen Mary, University of London | |
5 | |
6 Permission is hereby granted, free of charge, to any person | |
7 obtaining a copy of this software and associated documentation | |
8 files (the "Software"), to deal in the Software without | |
9 restriction, including without limitation the rights to use, copy, | |
10 modify, merge, publish, distribute, sublicense, and/or sell copies | |
11 of the Software, and to permit persons to whom the Software is | |
12 furnished to do so, subject to the following conditions: | |
13 | |
14 The above copyright notice and this permission notice shall be | |
15 included in all copies or substantial portions of the Software. | |
16 | |
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
18 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
20 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY | |
21 CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF | |
22 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | |
23 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
24 | |
25 Except as contained in this notice, the names of the Centre for | |
26 Digital Music; Queen Mary, University of London; and Chris Cannam | |
27 shall not be used in advertising or otherwise to promote the sale, | |
28 use or other dealings in this Software without prior written | |
29 authorization. | |
30 */ | |
31 | |
32 #include "Pitch.h" | |
33 | |
34 #include <math.h> | |
35 | |
36 float | |
37 Pitch::getFrequencyForPitch(int midiPitch, | |
38 float centsOffset, | |
39 float concertA) | |
40 { | |
41 float p = float(midiPitch) + (centsOffset / 100); | |
42 return concertA * powf(2.0, (p - 69.0) / 12.0); | |
43 } | |
44 | |
45 int | |
46 Pitch::getPitchForFrequency(float frequency, | |
47 float *centsOffsetReturn, | |
48 float concertA) | |
49 { | |
50 float p = 12.0 * (log(frequency / (concertA / 2.0)) / log(2.0)) + 57.0; | |
51 | |
52 int midiPitch = int(p + 0.00001); | |
53 float centsOffset = (p - midiPitch) * 100.0; | |
54 | |
55 if (centsOffset >= 50.0) { | |
56 midiPitch = midiPitch + 1; | |
57 centsOffset = -(100.0 - centsOffset); | |
58 } | |
59 | |
60 if (centsOffsetReturn) *centsOffsetReturn = centsOffset; | |
61 return midiPitch; | |
62 } | |
63 |