22 #ifndef CircularPeakTunner_hxx
23 #define CircularPeakTunner_hxx
44 typedef std::vector<std::pair<double, double> >
PeakList;
47 double _referenceTunning;
49 static const unsigned nSemitones = 12;
50 static const unsigned binsPerSemitone = 3;
53 : _referenceTunning(referenceTunning)
55 _output.reserve(nSemitones*binsPerSemitone);
70 double scaledPosition = peakPosition/binsPerSemitone;
71 double scaledTunning = tunning/binsPerSemitone;
72 double scaledReference = _referenceTunning/binsPerSemitone;
74 double shift =
tunningShift(scaledReference, scaledTunning);
75 double tunnedPosition =
tune(scaledPosition, shift);
77 int quantizedSemitone =
int(tunnedPosition + .5);
78 unsigned refoldedSemitone = (quantizedSemitone+nSemitones)%nSemitones;
79 return refoldedSemitone;
84 return - tunning - std::floor(reference-tunning+0.5);
86 static double tune(
double peakPosition,
double shift)
88 double tunnedPosition = peakPosition + shift;
89 while (tunnedPosition<0) tunnedPosition += nSemitones;
90 while (tunnedPosition>= nSemitones) tunnedPosition -= nSemitones;
91 return tunnedPosition;
97 const unsigned nPeaks=peaks.size();
99 for (
unsigned i=0; i<nPeaks; i++)
101 double tunnedPosition =
tune(peaks[i].first,shift);
102 _output.push_back(std::make_pair(tunnedPosition,peaks[i].second));
114 #endif// CircularPeakTunner_hxx