comparison base/Pitch.cpp @ 1527:710e6250a401 zoom

Merge from default branch
author Chris Cannam
date Mon, 17 Sep 2018 13:51:14 +0100
parents 48e9f538e6e9
children
comparison
equal deleted inserted replaced
1324:d4a28d1479a8 1527:710e6250a401
19 19
20 #include <cmath> 20 #include <cmath>
21 21
22 double 22 double
23 Pitch::getFrequencyForPitch(int midiPitch, 23 Pitch::getFrequencyForPitch(int midiPitch,
24 double centsOffset, 24 double centsOffset,
25 double concertA) 25 double concertA)
26 { 26 {
27 if (concertA <= 0.0) { 27 if (concertA <= 0.0) {
28 concertA = Preferences::getInstance()->getTuningFrequency(); 28 concertA = Preferences::getInstance()->getTuningFrequency();
29 } 29 }
30 double p = double(midiPitch) + (centsOffset / 100); 30 double p = double(midiPitch) + (centsOffset / 100);
31 return concertA * pow(2.0, (p - 69.0) / 12.0); 31 return concertA * pow(2.0, (p - 69.0) / 12.0);
32 } 32 }
33 33
34 int 34 int
35 Pitch::getPitchForFrequency(double frequency, 35 Pitch::getPitchForFrequency(double frequency,
36 double *centsOffsetReturn, 36 double *centsOffsetReturn,
37 double concertA) 37 double concertA)
38 { 38 {
39 if (concertA <= 0.0) { 39 if (concertA <= 0.0) {
40 concertA = Preferences::getInstance()->getTuningFrequency(); 40 concertA = Preferences::getInstance()->getTuningFrequency();
41 } 41 }
42 double p = 12.0 * (log(frequency / (concertA / 2.0)) / log(2.0)) + 57.0; 42 double p = 12.0 * (log(frequency / (concertA / 2.0)) / log(2.0)) + 57.0;
43 43
44 int midiPitch = int(round(p)); 44 int midiPitch = int(round(p));
45 double centsOffset = (p - midiPitch) * 100.0; 45 double centsOffset = (p - midiPitch) * 100.0;
46 46
47 if (centsOffset >= 50.0) { 47 if (centsOffset >= 50.0) {
48 midiPitch = midiPitch + 1; 48 midiPitch = midiPitch + 1;
49 centsOffset = -(100.0 - centsOffset); 49 centsOffset = -(100.0 - centsOffset);
50 } 50 }
51 if (centsOffset < -50.0) { 51 if (centsOffset < -50.0) {
52 midiPitch = midiPitch - 1; 52 midiPitch = midiPitch - 1;
53 centsOffset = (100.0 + centsOffset); 53 centsOffset = (100.0 + centsOffset);
54 } 54 }
55 55
56 if (centsOffsetReturn) *centsOffsetReturn = centsOffset; 56 if (centsOffsetReturn) *centsOffsetReturn = centsOffset;
57 return midiPitch; 57 return midiPitch;
58 } 58 }
78 78
79 int midiPitch = int(p + 0.00001); 79 int midiPitch = int(p + 0.00001);
80 double centsOffset = (p - midiPitch) * 100.0; 80 double centsOffset = (p - midiPitch) * 100.0;
81 81
82 if (centsOffset >= 50.0) { 82 if (centsOffset >= 50.0) {
83 midiPitch = midiPitch + 1; 83 midiPitch = midiPitch + 1;
84 centsOffset = -(100.0 - centsOffset); 84 centsOffset = -(100.0 - centsOffset);
85 } 85 }
86 86
87 if (centsOffsetReturn) *centsOffsetReturn = centsOffset; 87 if (centsOffsetReturn) *centsOffsetReturn = centsOffset;
88 return midiPitch; 88 return midiPitch;
89 } 89 }
118 // boundaries because Cb is enharmonic with B (not B#) and B# is 118 // boundaries because Cb is enharmonic with B (not B#) and B# is
119 // enharmonic with C (not Cb). So neither B# nor Cb will be 119 // enharmonic with C (not Cb). So neither B# nor Cb will be
120 // spelled from a MIDI pitch + flats flag in isolation. 120 // spelled from a MIDI pitch + flats flag in isolation.
121 121
122 if (midiPitch < 0) { 122 if (midiPitch < 0) {
123 while (midiPitch < 0) { 123 while (midiPitch < 0) {
124 midiPitch += 12; 124 midiPitch += 12;
125 --octave; 125 --octave;
126 } 126 }
127 } else { 127 } else {
128 octave = midiPitch / 12 + baseOctave; 128 octave = midiPitch / 12 + baseOctave;
129 } 129 }
130 130
131 note = midiPitch % 12; 131 note = midiPitch % 12;
132 } 132 }
133 133
134 QString 134 QString
135 Pitch::getPitchLabel(int midiPitch, 135 Pitch::getPitchLabel(int midiPitch,
136 double centsOffset, 136 double centsOffset,
137 bool useFlats) 137 bool useFlats)
138 { 138 {
139 int note, octave; 139 int note, octave;
140 getNoteAndOctaveForPitch(midiPitch, note, octave); 140 getNoteAndOctaveForPitch(midiPitch, note, octave);
141 141
142 QString plain = (useFlats ? flatNotes : notes)[note].arg(octave); 142 QString plain = (useFlats ? flatNotes : notes)[note].arg(octave);
147 else return QString("%1%2c").arg(plain).arg(ic); 147 else return QString("%1%2c").arg(plain).arg(ic);
148 } 148 }
149 149
150 QString 150 QString
151 Pitch::getPitchLabelForFrequency(double frequency, 151 Pitch::getPitchLabelForFrequency(double frequency,
152 double concertA, 152 double concertA,
153 bool useFlats) 153 bool useFlats)
154 { 154 {
155 if (concertA <= 0.0) { 155 if (concertA <= 0.0) {
156 concertA = Preferences::getInstance()->getTuningFrequency(); 156 concertA = Preferences::getInstance()->getTuningFrequency();
157 } 157 }
158 double centsOffset = 0.0; 158 double centsOffset = 0.0;