First steps on Vectorizing Audio Plugins: which Instruction Set do you use in 2018?

DSP, Plug-in and Host development discussion.
juha_p
KVRian
517 posts since 21 Feb, 2006 from FI

Post Wed Jan 16, 2019 4:01 am

Nowhk wrote:
Wed Jan 16, 2019 3:16 am
...
Do you already have the SSE2 version?

Note: how much a sin(freq * pitchMultiplier) will (in this worst case, since is the max error) drift?
IIRC, I've done just the float version of it floating somewhere (in your test routine biggest error was 2.319926441174402498290874063968658447265625e-06)

Hmm... do you mean sN := Truncate(Exp(z+O(z^N)));

Note: Exp() approximation using Taylor and Remez needs to be implemented as 'order' 13 and using double precicion to get accurate approximation.
Last edited by juha_p on Wed Jan 16, 2019 7:17 am, edited 2 times in total.

User avatar
Nowhk
KVRian
864 posts since 2 Oct, 2013

Re: First steps on Vectorizing Audio Plugins: which Instruction Set do you use in 2018?

Post Wed Jan 16, 2019 6:21 am

Tried the accuracy between the float approx of the Pade provided by juha_p and the SSE2 code provided by 2DaT. On the same range (-48 to 48 with become -2.77259 to 2.77259), the juha_p have a max error of 9.5367431640625e-07, while the 2DaT is about 2.86102294921875e-06.

I'd like to get the double SSE2 version of 2DaT, and test double precision.
But honestly, I think both will work perfect (IPP ippsExp_32f_I is 1.9073486328125e-06).

Didn't test the performance yet, since I don't have the SSE2 version of juha_p's links.

juha_p
KVRian
517 posts since 21 Feb, 2006 from FI

Re: First steps on Vectorizing Audio Plugins: which Instruction Set do you use in 2018?

Post Wed Jan 16, 2019 6:33 am

Nowhk wrote:
Wed Jan 16, 2019 6:21 am
...
Didn't test the performance yet, since I don't have the SSE2 version of juha_p's links.
2DaT's exp_mp() from the camsr's "b^x" thread mentioned earlier is about 2x faster than SSE version of Pade based approximation I linked (speed result is from the test routine 2DaT posted on that same thread) ... due to div() needeed in Pade version I quess. IIRC, results which test gave was for std::exp(): 26.7, for exp_mp(): 3.14 and for Pade based method: 6.27.

mystran
KVRAF
5150 posts since 12 Feb, 2006 from Helsinki, Finland

Re: First steps on Vectorizing Audio Plugins: which Instruction Set do you use in 2018?

Post Wed Jan 16, 2019 8:52 am

This is somewhat pedantic I guess, but when it comes to accuracy of exponential approximations, it typically makes far more sense to look at the maximum relative error rather than the maximum absolute error. Further, since the (base-2) integer part has no effect on the relative error when adjusting the exponent directly (since it's scales the actual value and error by exactly the same amount), you only really need to look at the (relative) error over one octave.

Which actually brings me to this random thought: has anyone tried to do a min-max approximation with reciprocal exponential weighting (ie. min-max the relative rather than the absolute error) to see if one can get away with a lower over polynomial while preserving the same maximum relative error and/or bring the relative error down for the same order? What I mean is, at the upper end of the octave, one can tolerate twice as much absolute error while still keeping the same maximum relative error and given that we double the absolute error anyway as soon as we cross into the next octave, I wonder if one could somehow extract some computational benefits out of this?
If you'd like Signaldust to return, please ask Katinka Tuisku to resign.

User avatar
karrikuh
KVRist
298 posts since 6 Apr, 2008

Re: First steps on Vectorizing Audio Plugins: which Instruction Set do you use in 2018?

Post Wed Jan 16, 2019 11:16 am

mystran wrote:
Wed Jan 16, 2019 8:52 am
This is somewhat pedantic I guess, but when it comes to accuracy of exponential approximations, it typically makes far more sense to look at the maximum relative error rather than the maximum absolute error. Further, since the (base-2) integer part has no effect on the relative error when adjusting the exponent directly (since it's scales the actual value and error by exactly the same amount), you only really need to look at the (relative) error over one octave.

Which actually brings me to this random thought: has anyone tried to do a min-max approximation with reciprocal exponential weighting (ie. min-max the relative rather than the absolute error) to see if one can get away with a lower over polynomial while preserving the same maximum relative error and/or bring the relative error down for the same order? What I mean is, at the upper end of the octave, one can tolerate twice as much absolute error while still keeping the same maximum relative error and given that we double the absolute error anyway as soon as we cross into the next octave, I wonder if one could somehow extract some computational benefits out of this?
Min-max. relative error is the approach for the approximation I'm using:

Code: Select all

__m128 exp2(__m128 x)
{
  // max. |rel. error| < 3e-3
 // round towards -inf
	__m128i i = _mm_sub_epi32(_mm_cvttps_epi32(x + _mm_set1_ps(1000)), _mm_set1_epi32(1000));
  const __m128 f = _mm_sub_ps(x, _mm_cvtepi32_ps(i));

  // compute 2^i
	i = _mm_add_epi32(i, _mm_set1_epi32(0x7f)); // add bias to 8-bit exponent of IEEE-754 float
	i = _mm_slli_epi32(i, 23); // move i into 8-bit exponent of IEEE-754 float
	x = _mm_castsi128_ps(i);

  // correction polynomial for fractional part f of x
  //x *= (_mm_set1_ps(3.414692918186411e-01)*f + _mm_set1_ps(6.505932505987956e-01))*f + _mm_set1_ps(1.003535716095788e+00); // Least squares
	x = x * (_mm_set1_ps(0.339)*f + _mm_set1_ps(0.661))*f + x; // min. max |relative error| with exact identity at integer x
  //x *= ((7.874613133337634e-02*f + 2.245312867885735e-01)*f + 6.966683995032704e-01)*f + 9.998303405097351e-01;
  return x;
}
Accuracy is sufficient for pretty much all my needs in the area of audio DSP and I still think it's hard to beat in terms of accuracy/CPU_cycles.

2DaT
KVRist
343 posts since 21 Jun, 2013

Re: First steps on Vectorizing Audio Plugins: which Instruction Set do you use in 2018?

Post Wed Jan 16, 2019 11:39 pm

mystran wrote:
Wed Jan 16, 2019 8:52 am
Which actually brings me to this random thought: has anyone tried to do a min-max approximation with reciprocal exponential weighting (ie. min-max the relative rather than the absolute error) to see if one can get away with a lower over polynomial while preserving the same maximum relative error and/or bring the relative error down for the same order? What I mean is, at the upper end of the octave, one can tolerate twice as much absolute error while still keeping the same maximum relative error and given that we double the absolute error anyway as soon as we cross into the next octave, I wonder if one could somehow extract some computational benefits out of this?
I already did that in my approximations. Relative error is 2x improvement, but 1 polynomial degree is 10x.

Apparently, MSVC can't generate a good code around FMA instructions :-x
https://godbolt.org/z/y-Q6jd

And even with trashy msvc code, on a modern 8-width FMA processor you can calculate it faster than you can fetch from RAM (~0.85 cycles/float for computation, ~1.7 cycles/float for RAM access with linear prefetch).

camsr
KVRAF
6914 posts since 17 Feb, 2005

Re: First steps on Vectorizing Audio Plugins: which Instruction Set do you use in 2018?

Post Thu Jan 17, 2019 1:20 am

IDK the godbolt compilers are giving some much different outputs on some code I pasted.
Maybe try setting the DAZ and FTZ flags to see what they do.
Image

User avatar
Nowhk
KVRian
864 posts since 2 Oct, 2013

Re: First steps on Vectorizing Audio Plugins: which Instruction Set do you use in 2018?

Post Thu Jan 17, 2019 6:38 am

mystran wrote:
Wed Jan 16, 2019 8:52 am
it typically makes far more sense to look at the maximum relative error rather than the maximum absolute error
Even if the cases I've checked are the ones of interess?
i.e. I'm going from -48.0 to 48.0 (semitones), step 0.1, and I've checked ONLY the += 0.1 step (doing a round(nextValue / step) * step).

So I believe only those semitones (and thus, every 1/10 semitones) are importants.
Thus, the absolute refer to the max error I'll get in that range.

Does it makes sense? :D

User avatar
Max M.
KVRist
298 posts since 20 Apr, 2005 from Moscow, Russian Federation

Re: First steps on Vectorizing Audio Plugins: which Instruction Set do you use in 2018?

Post Thu Jan 17, 2019 9:12 am

Nowhk wrote:
Thu Jan 17, 2019 6:38 am
So I believe only those semitones are importants.
Sort of, but since the values you get there (if I understand your code correctly) are frequency multipliers (not the pitch in semitones), still: a relative error value (aproxValue / refValue) makes much more sense than the absolute difference (aproxValue - refValue).

E.g. 1.050 <-> 1.055 error for the multiplier is much higher pitch error than 5.050 <-> 5.055
(or in other words: add/sub in pitch scale translates to mul/div in frequency scale).

---
This would be easy to grasp if you modify that code to print the errors directly in semitones instead.

mystran
KVRAF
5150 posts since 12 Feb, 2006 from Helsinki, Finland

Re: First steps on Vectorizing Audio Plugins: which Instruction Set do you use in 2018?

Post Thu Jan 17, 2019 6:17 pm

In my experience, if you are only concerned about is tuning, then having an accuracy of about 0.1 cent (ie. 1/12000 octave) or so is typically more than enough. That's roughly about half Hertz at 10kHz and typically roughly on the order of magnitude of what you would hope to get from a typical fine-tuning knob on a synth (ie. 1/1000 of a semitone).

That means roughly 16 good bits in the mantissa and for low frequencies (eg. below ~340Hz for 44.1kHz sampling if my quick estimate is correct) this is actually more than you can use with a single precision phase accumulator anyway, so if you decide that you need more, then you should probably also use double precision accumulators (which arguably is probably a waste, but just saying). Having more accuracy doesn't really hurt, but it does get somewhat academic unless you also need it for some secondary purpose.
If you'd like Signaldust to return, please ask Katinka Tuisku to resign.

User avatar
Nowhk
KVRian
864 posts since 2 Oct, 2013

Re: First steps on Vectorizing Audio Plugins: which Instruction Set do you use in 2018?

Post Fri Jan 18, 2019 2:47 am

Max M. wrote:
Thu Jan 17, 2019 9:12 am
Nowhk wrote:
Thu Jan 17, 2019 6:38 am
So I believe only those semitones are importants.
Sort of, but since the values you get there (if I understand your code correctly) are frequency multipliers (not the pitch in semitones), still: a relative error value (aproxValue / refValue) makes much more sense than the absolute difference (aproxValue - refValue).

E.g. 1.050 <-> 1.055 error for the multiplier is much higher pitch error than 5.050 <-> 5.055
(or in other words: add/sub in pitch scale translates to mul/div in frequency scale).

---
This would be easy to grasp if you modify that code to print the errors directly in semitones instead.
Here's the complete code (including the Pade header suggested by juha_p), applied to the freq:

Code: Select all

#include <iostream>
#include <math.h>
#include <algorithm>
#include "exp.h"

#define BUFFER_SIZE 10000

const float ln2per12f = logf(2.0f) / 12.0f;

class ExpFloat
{
public:
	float min = -48.0f;
	float max = 48.0f;
	float step = 0.1f;
	float freq = 523.26f;

	float range = max - min;
	int numSteps = (int)(range / step + 1);

	float normalizedValue = 0.0;
	alignas(16) float valueExp[BUFFER_SIZE];
	alignas(16) float valueExpApprox[BUFFER_SIZE];

	ExpFloat() {
		for (int i = 0; i < numSteps; i++) {
			float value = GetSnappedValue(normalizedValue) * ln2per12f;

			// scalar
			valueExp[i] = expf(value);
		
			// Pade https://root.cern.ch/doc/v606/exp_8h_source.html
			valueExpApprox[i] = fast_expf(value);

			normalizedValue += step / range;
		}

		// errors
		float absoluteError = 0.0;

		for (int i = 0; i < numSteps; i++) {
			float ref = valueExp[i] * freq;
			float approx = valueExpApprox[i] * freq;

			float relativeError = fabs(ref - approx);
			if (relativeError > absoluteError) absoluteError = relativeError;

			std::cout << i << " -              ref " << ref << std::endl;
			std::cout << i << " -           approx " << approx << std::endl;
			std::cout << i << " -         relative " << relativeError << std::endl << std::endl;
		}

		std::cout << "absolute error " << absoluteError << std::endl;
	}

        float GetSnappedValue(float normalizedValue) {
		// i reach the normalized value from gui/daw, so i convert it to value
		float value = min + normalizedValue * range;

		// snap the value
		// I° error introduced by fp, but can't avoid it i think
		value = round(value / step) * step;

		// since later i could add interal modulation (from envelope or lfo), i need to re-normalize it
		// II° error introduced by fp, but can't avoid it i think
		float valueSnappedNormalized = (value - min) / range;

		// add the modulation; for the purpose of this test, let say modulation is 0.0
		// III° error introduced by fp, but can't avoid it i think
		float valueSnappedNormalizedSmoothed = valueSnappedNormalized + 0.0f;

		// back to the final value, which is not the normalized one
		// IV° error introduced by fp, but can't avoid it i think
		float valueSnappedFinal = min + valueSnappedNormalizedSmoothed * range;

		return valueSnappedFinal;
	}
};

int main() {
	std::cout.precision(100);

	ExpFloat expFloat;
	
	return 0;
}
Here's the absolute error (with a freq of 523.26f) in float: 0.00048828125.
I'm still away from the "real" value (considering an ideal exp and without the errors introduced by fp calculating the snapped value).
And of course this don't even consider the "phase" accumulator error I'll introduce at every sample, later.

Opinions?

User avatar
Nowhk
KVRian
864 posts since 2 Oct, 2013

Re: First steps on Vectorizing Audio Plugins: which Instruction Set do you use in 2018?

Post Thu Jan 24, 2019 8:05 am

Max M. wrote:
Thu Jan 17, 2019 9:12 am
This would be easy to grasp if you modify that code to print the errors directly in semitones instead.
Do you mean to convert it back (i.e. log(value) / ln2per12f) to semitones after to calculate the exp() function?
Such as:

Code: Select all

#define BUFFER_SIZE 10000

class ExpFloat
{
public:
	int min = -480;
	int max = 480;
	int step = 10;

	int range = max - min;
	int numSteps = range + 1;

	int inc = min;
	
	float valueExp[BUFFER_SIZE];
	float valueExpApprox[BUFFER_SIZE];

	ExpFloat() {
		for (int i = 0; i < numSteps; i++) {
			float value = (inc / (double)step) * ln2per12f;

			// scalar
			valueExp[i] = expf(value);

			// Pade https://root.cern.ch/doc/v606/exp_8h_source.html
			valueExpApprox[i] = vdt::fast_expf(value);

			inc++;
		}

		// errors
		float absoluteError = 0.0f;

		for (int i = 0; i < numSteps; i++) {
			float ref = log(valueExp[i]) / ln2per12f;
			float approx = log(valueExpApprox[i]) / ln2per12f;

			float relativeError = fabs(ref - approx);
			if (relativeError > absoluteError) absoluteError = relativeError;

			std::cout << i << " -              ref " << ref << std::endl;
			std::cout << i << " -           approx " << approx << std::endl;
			std::cout << i << " -         relative " << relativeError << std::endl << std::endl;
		}

		std::cout << "absolute error " << absoluteError << std::endl;
	}
};
They seems pretty good, with an absolute error of 2.86102294921875e-06.
Not sure if I got what do you mean with relative/absolute here :D

Are you saying that C0 * pitchMultWithError has lower impact rather than C10 * pitchMultWithError?
Uhm...

User avatar
Nowhk
KVRian
864 posts since 2 Oct, 2013

Re: First steps on Vectorizing Audio Plugins: which Instruction Set do you use in 2018?

Post Fri Jan 25, 2019 1:59 am

Ok, I think I've got it :) Its about the "classic" motivation: the more you multiply big with small number, the more error you introduce in fp.

Here's the test I've did, considering (for each ref/approx exp values) 11 octaves (C0 to C11) and comparing "scalar" exp() with the Pade approx:

Code: Select all

#include <iostream>
#include <math.h>

#define BUFFER_SIZE 10000
const float ln2per12f = logf(2.0f) / 12.0f;

class ExpFloat
{
public:
	int min = -480;
	int max = 480;
	int step = 10;

	int range = max - min;
	int numSteps = range + 1;

	int inc = min;

	alignas(16) float refValues[BUFFER_SIZE];
	alignas(16) float approxValues[BUFFER_SIZE];

	ExpFloat() {
		for (int i = 0; i < numSteps; i++) {
			float value = (inc / (double)step) * ln2per12f;

			// scalar (ref)
			refValues[i] = expf(value);

			// Pade (approx)
			approxValues[i] = vdt::fast_expf(value);

			inc++;
		}

		// errors
		const int numOctaves = 11;
		float octaves[numOctaves] = { 16.352f, 32.703f, 65.406f, 130.813f, 261.626f, 523.251f, 1046.502f, 2093.005f, 4186.009f , 8372.018f, 16744.036f }; // C0-C11
		
		float absoluteError = 0.0f;

		for (int octaveIndex = 0; octaveIndex < numOctaves; octaveIndex++) {
			float freq = octaves[octaveIndex];
			
			for (int i = 0; i < numSteps; i++) {
				float ref = refValues[i] * freq;
				float approx = approxValues[i] * freq;

				float relativeError = fabs(ref - approx);
				if (relativeError > absoluteError) absoluteError = relativeError;

				if (relativeError != 0.0) {
					std::cout << i << " - semitones " << log(refValues[i]) / ln2per12f << std::endl;
					std::cout << i << " -      freq " << freq << std::endl;
					std::cout << i << " -       ref " << ref << std::endl;
					std::cout << i << " -    approx " << approx << std::endl;
					std::cout << i << " -  relative " << relativeError << std::endl << std::endl;
				}
			}
		}

		std::cout << "absolute error " << absoluteError << std::endl;
	}
};
Some results:

Code: Select all

...

7 - semitones -47.299999237060546875
7 -      freq 2093.0048828125
7 -       ref 136.210418701171875
7 -    approx 136.2104339599609375
7 -  relative 1.52587890625e-05

10 - semitones -47.000003814697265625
10 -      freq 2093.0048828125
10 -       ref 138.59130859375
10 -    approx 138.5913238525390625
10 -  relative 1.52587890625e-05

39 - semitones -44.09999847412109375
39 -      freq 2093.0048828125
39 -       ref 163.8645477294921875
39 -    approx 163.86456298828125
39 -  relative 1.52587890625e-05

46 - semitones -43.399997711181640625
46 -      freq 2093.0048828125
46 -       ref 170.6259613037109375
46 -    approx 170.6259765625
46 -  relative 1.52587890625e-05

53 - semitones -42.700000762939453125
53 -      freq 2093.0048828125
53 -       ref 177.66632080078125
53 -    approx 177.666351318359375
53 -  relative 3.0517578125e-05

66 - semitones -41.40000152587890625
66 -      freq 2093.0048828125
66 -       ref 191.5211334228515625
66 -    approx 191.521148681640625
66 -  relative 1.52587890625e-05

69 - semitones -41.100002288818359375
69 -      freq 2093.0048828125
69 -       ref 194.868865966796875
69 -    approx 194.8688812255859375
69 -  relative 1.52587890625e-05

86 - semitones -39.399997711181640625
86 -      freq 2093.0048828125
86 -       ref 214.975250244140625
86 -    approx 214.9752655029296875
86 -  relative 1.52587890625e-05

114 - semitones -36.600002288818359375
114 -      freq 2093.0048828125
114 -       ref 252.7136383056640625
114 -    approx 252.713653564453125
114 -  relative 1.52587890625e-05

127 - semitones -35.299999237060546875
127 -      freq 2093.0048828125
127 -       ref 272.42083740234375
127 -    approx 272.420867919921875
127 -  relative 3.0517578125e-05

130 - semitones -35.000003814697265625
130 -      freq 2093.0048828125
130 -       ref 277.1826171875
130 -    approx 277.182647705078125
130 -  relative 3.0517578125e-05

142 - semitones -33.799999237060546875
142 -      freq 2093.0048828125
142 -       ref 297.0770263671875
142 -    approx 297.077056884765625
142 -  relative 3.0517578125e-05

173 - semitones -30.700000762939453125
173 -      freq 2093.0048828125
173 -       ref 355.3326416015625
173 -    approx 355.33270263671875
173 -  relative 6.103515625e-05

189 - semitones -29.1000003814697265625
189 -      freq 2093.0048828125
189 -       ref 389.73773193359375
189 -    approx 389.737762451171875
189 -  relative 3.0517578125e-05

361 - semitones -11.89999866485595703125
361 -      freq 2093.0048828125
361 -       ref 1052.5648193359375
361 -    approx 1052.564697265625
361 -  relative 0.0001220703125

365 - semitones -11.5
365 -      freq 2093.0048828125
365 -       ref 1077.1673583984375
365 -    approx 1077.167236328125
365 -  relative 0.0001220703125

369 - semitones -11.1000003814697265625
369 -      freq 2093.0048828125
369 -       ref 1102.344970703125
369 -    approx 1102.3448486328125
369 -  relative 0.0001220703125

373 - semitones -10.69999980926513671875
373 -      freq 2093.0048828125
373 -       ref 1128.1109619140625
373 -    approx 1128.11083984375
373 -  relative 0.0001220703125

377 - semitones -10.299999237060546875
377 -      freq 2093.0048828125
377 -       ref 1154.4793701171875
377 -    approx 1154.479248046875
377 -  relative 0.0001220703125

381 - semitones -9.8999996185302734375
381 -      freq 2093.0048828125
381 -       ref 1181.4639892578125
381 -    approx 1181.4638671875
381 -  relative 0.0001220703125

383 - semitones -9.69999980926513671875
383 -      freq 2093.0048828125
383 -       ref 1195.19189453125
383 -    approx 1195.1920166015625
383 -  relative 0.0001220703125

385 - semitones -9.5
385 -      freq 2093.0048828125
385 -       ref 1209.0794677734375
385 -    approx 1209.079345703125
385 -  relative 0.0001220703125

387 - semitones -9.30000019073486328125
387 -      freq 2093.0048828125
387 -       ref 1223.128173828125
387 -    approx 1223.1282958984375
387 -  relative 0.0001220703125

389 - semitones -9.1000003814697265625
389 -      freq 2093.0048828125
389 -       ref 1237.34033203125
389 -    approx 1237.3402099609375
389 -  relative 0.0001220703125

391 - semitones -8.90000057220458984375
391 -      freq 2093.0048828125
391 -       ref 1251.7174072265625
391 -    approx 1251.717529296875
391 -  relative 0.0001220703125

395 - semitones -8.50000095367431640625
395 -      freq 2093.0048828125
395 -       ref 1280.9749755859375
395 -    approx 1280.97509765625
395 -  relative 0.0001220703125

397 - semitones -8.30000019073486328125
397 -      freq 2093.0048828125
397 -       ref 1295.8592529296875
397 -    approx 1295.859130859375
397 -  relative 0.0001220703125

403 - semitones -7.700000286102294921875
403 -      freq 2093.0048828125
403 -       ref 1341.5576171875
403 -    approx 1341.5577392578125
403 -  relative 0.0001220703125

405 - semitones -7.499999523162841796875
405 -      freq 2093.0048828125
405 -       ref 1357.145751953125
405 -    approx 1357.1456298828125
405 -  relative 0.0001220703125

409 - semitones -7.09999942779541015625
409 -      freq 2093.0048828125
409 -       ref 1388.8675537109375
409 -    approx 1388.867431640625
409 -  relative 0.0001220703125

411 - semitones -6.90000057220458984375
411 -      freq 2093.0048828125
411 -       ref 1405.00537109375
411 -    approx 1405.0054931640625
411 -  relative 0.0001220703125

431 - semitones -4.8999996185302734375
431 -      freq 2093.0048828125
431 -       ref 1577.0653076171875
431 -    approx 1577.065185546875
431 -  relative 0.0001220703125

481 - semitones 0.1000005900859832763671875
481 -      freq 2093.0048828125
481 -       ref 2105.129638671875
481 -    approx 2105.12939453125
481 -  relative 0.000244140625

483 - semitones 0.299999415874481201171875
483 -      freq 2093.0048828125
483 -       ref 2129.58984375
483 -    approx 2129.590087890625
483 -  relative 0.000244140625

485 - semitones 0.500000059604644775390625
485 -      freq 2093.0048828125
485 -       ref 2154.334716796875
485 -    approx 2154.33447265625
485 -  relative 0.000244140625

487 - semitones 0.69999992847442626953125
487 -      freq 2093.0048828125
487 -       ref 2179.36669921875
487 -    approx 2179.366943359375
487 -  relative 0.000244140625

489 - semitones 0.900000393390655517578125
489 -      freq 2093.0048828125
489 -       ref 2204.68994140625
489 -    approx 2204.689697265625
489 -  relative 0.000244140625

493 - semitones 1.2999999523162841796875
493 -      freq 2093.0048828125
493 -       ref 2256.221923828125
493 -    approx 2256.2216796875
493 -  relative 0.000244140625

497 - semitones 1.7000005245208740234375
497 -      freq 2093.0048828125
497 -       ref 2308.958740234375
497 -    approx 2308.95849609375
497 -  relative 0.000244140625

501 - semitones 2.1000001430511474609375
501 -      freq 2093.0048828125
501 -       ref 2362.927978515625
501 -    approx 2362.927734375
501 -  relative 0.000244140625

503 - semitones 2.2999999523162841796875
503 -      freq 2093.0048828125
503 -       ref 2390.3837890625
503 -    approx 2390.384033203125
503 -  relative 0.000244140625

505 - semitones 2.5000002384185791015625
505 -      freq 2093.0048828125
505 -       ref 2418.158935546875
505 -    approx 2418.15869140625
505 -  relative 0.000244140625

507 - semitones 2.69999980926513671875
507 -      freq 2093.0048828125
507 -       ref 2446.25634765625
507 -    approx 2446.256591796875
507 -  relative 0.000244140625

509 - semitones 2.900000095367431640625
509 -      freq 2093.0048828125
509 -       ref 2474.6806640625
509 -    approx 2474.680419921875
509 -  relative 0.000244140625

515 - semitones 3.499999523162841796875
515 -      freq 2093.0048828125
515 -       ref 2561.949951171875
515 -    approx 2561.9501953125
515 -  relative 0.000244140625

517 - semitones 3.7000000476837158203125
517 -      freq 2093.0048828125
517 -       ref 2591.718505859375
517 -    approx 2591.71826171875
517 -  relative 0.000244140625

523 - semitones 4.299999713897705078125
523 -      freq 2093.0048828125
523 -       ref 2683.115234375
523 -    approx 2683.115478515625
523 -  relative 0.000244140625

525 - semitones 4.500000476837158203125
525 -      freq 2093.0048828125
525 -       ref 2714.29150390625
525 -    approx 2714.291259765625
525 -  relative 0.000244140625

529 - semitones 4.90000057220458984375
529 -      freq 2093.0048828125
529 -       ref 2777.735107421875
529 -    approx 2777.73486328125
529 -  relative 0.000244140625

531 - semitones 5.09999942779541015625
531 -      freq 2093.0048828125
531 -       ref 2810.0107421875
531 -    approx 2810.010986328125
531 -  relative 0.000244140625

541 - semitones 6.1000003814697265625
541 -      freq 2093.0048828125
541 -       ref 2977.102783203125
541 -    approx 2977.1025390625
541 -  relative 0.000244140625

551 - semitones 7.1000003814697265625
551 -      freq 2093.0048828125
551 -       ref 3154.130615234375
551 -    approx 3154.13037109375
551 -  relative 0.000244140625

567 - semitones 8.700000762939453125
567 -      freq 2093.0048828125
567 -       ref 3459.529296875
567 -    approx 3459.529052734375
567 -  relative 0.000244140625

603 - semitones 12.299999237060546875
603 -      freq 2093.0048828125
603 -       ref 4259.1796875
603 -    approx 4259.18017578125
603 -  relative 0.00048828125

607 - semitones 12.69999980926513671875
607 -      freq 2093.0048828125
607 -       ref 4358.7333984375
607 -    approx 4358.73388671875
607 -  relative 0.00048828125

613 - semitones 13.30000019073486328125
613 -      freq 2093.0048828125
613 -       ref 4512.44384765625
613 -    approx 4512.443359375
613 -  relative 0.00048828125

617 - semitones 13.700000762939453125
617 -      freq 2093.0048828125
617 -       ref 4617.91748046875
617 -    approx 4617.9169921875
617 -  relative 0.00048828125

621 - semitones 14.1000003814697265625
621 -      freq 2093.0048828125
621 -       ref 4725.85595703125
621 -    approx 4725.85546875
621 -  relative 0.00048828125

623 - semitones 14.30000019073486328125
623 -      freq 2093.0048828125
623 -       ref 4780.767578125
623 -    approx 4780.76806640625
623 -  relative 0.00048828125

625 - semitones 14.5
625 -      freq 2093.0048828125
625 -       ref 4836.31787109375
625 -    approx 4836.3173828125
625 -  relative 0.00048828125

627 - semitones 14.69999980926513671875
627 -      freq 2093.0048828125
627 -       ref 4892.5126953125
627 -    approx 4892.51318359375
627 -  relative 0.00048828125

629 - semitones 14.8999996185302734375
629 -      freq 2093.0048828125
629 -       ref 4949.361328125
629 -    approx 4949.36083984375
629 -  relative 0.00048828125

635 - semitones 15.49999904632568359375
635 -      freq 2093.0048828125
635 -       ref 5123.89990234375
635 -    approx 5123.900390625
635 -  relative 0.00048828125

637 - semitones 15.69999980926513671875
637 -      freq 2093.0048828125
637 -       ref 5183.43701171875
637 -    approx 5183.4365234375
637 -  relative 0.00048828125

642 - semitones 16.200000762939453125
642 -      freq 2093.0048828125
642 -       ref 5335.32373046875
642 -    approx 5335.32275390625
642 -  relative 0.0009765625

643 - semitones 16.299999237060546875
643 -      freq 2093.0048828125
643 -       ref 5366.23046875
643 -    approx 5366.23095703125
643 -  relative 0.00048828125

645 - semitones 16.5
645 -      freq 2093.0048828125
645 -       ref 5428.5830078125
645 -    approx 5428.58251953125
645 -  relative 0.00048828125

649 - semitones 16.8999996185302734375
649 -      freq 2093.0048828125
649 -       ref 5555.47021484375
649 -    approx 5555.4697265625
649 -  relative 0.00048828125

651 - semitones 17.09999847412109375
651 -      freq 2093.0048828125
651 -       ref 5620.021484375
651 -    approx 5620.02197265625
651 -  relative 0.00048828125

667 - semitones 18.700000762939453125
667 -      freq 2093.0048828125
667 -       ref 6164.1806640625
667 -    approx 6164.18017578125
667 -  relative 0.00048828125

717 - semitones 23.6999988555908203125
717 -      freq 2093.0048828125
717 -       ref 8228.193359375
717 -    approx 8228.1923828125
717 -  relative 0.0009765625

753 - semitones 27.299999237060546875
753 -      freq 2093.0048828125
753 -       ref 10130.09375
753 -    approx 10130.0927734375
753 -  relative 0.0009765625

762 - semitones 28.200000762939453125
762 -      freq 2093.0048828125
762 -       ref 10670.6474609375
762 -    approx 10670.6455078125
762 -  relative 0.001953125

767 - semitones 28.700000762939453125
767 -      freq 2093.0048828125
767 -       ref 10983.3212890625
767 -    approx 10983.3203125
767 -  relative 0.0009765625

783 - semitones 30.3000011444091796875
783 -      freq 2093.0048828125
783 -       ref 12046.78125
783 -    approx 12046.7802734375
783 -  relative 0.0009765625

787 - semitones 30.700000762939453125
787 -      freq 2093.0048828125
787 -       ref 12328.361328125
787 -    approx 12328.3603515625
787 -  relative 0.0009765625

809 - semitones 32.899997711181640625
809 -      freq 2093.0048828125
809 -       ref 13998.9072265625
809 -    approx 13998.90625
809 -  relative 0.0009765625

834 - semitones 35.399997711181640625
834 -      freq 2093.0048828125
834 -       ref 16173.673828125
834 -    approx 16173.6728515625
834 -  relative 0.0009765625

837 - semitones 35.700000762939453125
837 -      freq 2093.0048828125
837 -       ref 16456.38671875
837 -    approx 16456.384765625
837 -  relative 0.001953125

845 - semitones 36.5
845 -      freq 2093.0048828125
845 -       ref 17234.677734375
845 -    approx 17234.67578125
845 -  relative 0.001953125

872 - semitones 39.200000762939453125
872 -      freq 2093.0048828125
872 -       ref 20143.5
872 -    approx 20143.498046875
872 -  relative 0.001953125

873 - semitones 39.299999237060546875
873 -      freq 2093.0048828125
873 -       ref 20260.1875
873 -    approx 20260.185546875
873 -  relative 0.001953125

887 - semitones 40.700000762939453125
887 -      freq 2093.0048828125
887 -       ref 21966.642578125
887 -    approx 21966.640625
887 -  relative 0.001953125

896 - semitones 41.59999847412109375
896 -      freq 2093.0048828125
896 -       ref 23138.8046875
896 -    approx 23138.802734375
896 -  relative 0.001953125

899 - semitones 41.90000152587890625
899 -      freq 2093.0048828125
899 -       ref 23543.265625
899 -    approx 23543.263671875
899 -  relative 0.001953125

903 - semitones 42.299999237060546875
903 -      freq 2093.0048828125
903 -       ref 24093.5625
903 -    approx 24093.560546875
903 -  relative 0.001953125

907 - semitones 42.700000762939453125
907 -      freq 2093.0048828125
907 -       ref 24656.72265625
907 -    approx 24656.720703125
907 -  relative 0.001953125

918 - semitones 43.8000030517578125
918 -      freq 2093.0048828125
918 -       ref 26274.21875
918 -    approx 26274.21484375
918 -  relative 0.00390625

925 - semitones 44.5
925 -      freq 2093.0048828125
925 -       ref 27358.34375
925 -    approx 27358.341796875
925 -  relative 0.001953125

926 - semitones 44.600002288818359375
926 -      freq 2093.0048828125
926 -       ref 27516.833984375
926 -    approx 27516.83203125
926 -  relative 0.001953125

929 - semitones 44.899997711181640625
929 -      freq 2093.0048828125
929 -       ref 27997.814453125
929 -    approx 27997.8125
929 -  relative 0.001953125

942 - semitones 46.200000762939453125
942 -      freq 2093.0048828125
942 -       ref 30181.150390625
942 -    approx 30181.1484375
942 -  relative 0.001953125

953 - semitones 47.299999237060546875
953 -      freq 2093.0048828125
953 -       ref 32161.04296875
953 -    approx 32161.041015625
953 -  relative 0.001953125

954 - semitones 47.399997711181640625
954 -      freq 2093.0048828125
954 -       ref 32347.34765625
954 -    approx 32347.345703125
954 -  relative 0.001953125

957 - semitones 47.700000762939453125
957 -      freq 2093.0048828125
957 -       ref 32912.7734375
957 -    approx 32912.76953125
957 -  relative 0.00390625

7 - semitones -47.299999237060546875
7 -      freq 4186.0087890625
7 -       ref 272.4207763671875
7 -    approx 272.420806884765625
7 -  relative 3.0517578125e-05

10 - semitones -47.000003814697265625
10 -      freq 4186.0087890625
10 -       ref 277.18255615234375
10 -    approx 277.182586669921875
10 -  relative 3.0517578125e-05

39 - semitones -44.09999847412109375
39 -      freq 4186.0087890625
39 -       ref 327.729034423828125
39 -    approx 327.72906494140625
39 -  relative 3.0517578125e-05

46 - semitones -43.399997711181640625
46 -      freq 4186.0087890625
46 -       ref 341.251861572265625
46 -    approx 341.25189208984375
46 -  relative 3.0517578125e-05

53 - semitones -42.700000762939453125
53 -      freq 4186.0087890625
53 -       ref 355.33258056640625
53 -    approx 355.332611083984375
53 -  relative 3.0517578125e-05

66 - semitones -41.40000152587890625
66 -      freq 4186.0087890625
66 -       ref 383.04217529296875
66 -    approx 383.042205810546875
66 -  relative 3.0517578125e-05

69 - semitones -41.100002288818359375
69 -      freq 4186.0087890625
69 -       ref 389.737640380859375
69 -    approx 389.7376708984375
69 -  relative 3.0517578125e-05

86 - semitones -39.399997711181640625
86 -      freq 4186.0087890625
86 -       ref 429.950408935546875
86 -    approx 429.950439453125
86 -  relative 3.0517578125e-05

114 - semitones -36.600002288818359375
114 -      freq 4186.0087890625
114 -       ref 505.427154541015625
114 -    approx 505.427215576171875
114 -  relative 6.103515625e-05

127 - semitones -35.299999237060546875
127 -      freq 4186.0087890625
127 -       ref 544.841552734375
127 -    approx 544.84161376953125
127 -  relative 6.103515625e-05

130 - semitones -35.000003814697265625
130 -      freq 4186.0087890625
130 -       ref 554.3651123046875
130 -    approx 554.36517333984375
130 -  relative 6.103515625e-05

142 - semitones -33.799999237060546875
142 -      freq 4186.0087890625
142 -       ref 594.1539306640625
142 -    approx 594.15399169921875
142 -  relative 6.103515625e-05

173 - semitones -30.700000762939453125
173 -      freq 4186.0087890625
173 -       ref 710.6651611328125
173 -    approx 710.66522216796875
173 -  relative 6.103515625e-05

189 - semitones -29.1000003814697265625
189 -      freq 4186.0087890625
189 -       ref 779.47528076171875
189 -    approx 779.475341796875
189 -  relative 6.103515625e-05

361 - semitones -11.89999866485595703125
361 -      freq 4186.0087890625
361 -       ref 2105.129150390625
361 -    approx 2105.12890625
361 -  relative 0.000244140625

365 - semitones -11.5
365 -      freq 4186.0087890625
365 -       ref 2154.334228515625
365 -    approx 2154.333740234375
365 -  relative 0.00048828125

369 - semitones -11.1000003814697265625
369 -      freq 4186.0087890625
369 -       ref 2204.689208984375
369 -    approx 2204.68896484375
369 -  relative 0.000244140625

373 - semitones -10.69999980926513671875
373 -      freq 4186.0087890625
373 -       ref 2256.221435546875
373 -    approx 2256.22119140625
373 -  relative 0.000244140625

377 - semitones -10.299999237060546875
377 -      freq 4186.0087890625
377 -       ref 2308.958251953125
377 -    approx 2308.9580078125
377 -  relative 0.000244140625

381 - semitones -9.8999996185302734375
381 -      freq 4186.0087890625
381 -       ref 2362.927490234375
381 -    approx 2362.92724609375
381 -  relative 0.000244140625

383 - semitones -9.69999980926513671875
383 -      freq 4186.0087890625
383 -       ref 2390.38330078125
383 -    approx 2390.383544921875
383 -  relative 0.000244140625

385 - semitones -9.5
385 -      freq 4186.0087890625
385 -       ref 2418.158203125
385 -    approx 2418.157958984375
385 -  relative 0.000244140625

387 - semitones -9.30000019073486328125
387 -      freq 4186.0087890625
387 -       ref 2446.255859375
387 -    approx 2446.256103515625
387 -  relative 0.000244140625

389 - semitones -9.1000003814697265625
389 -      freq 4186.0087890625
389 -       ref 2474.679931640625
389 -    approx 2474.6796875
389 -  relative 0.000244140625

391 - semitones -8.90000057220458984375
391 -      freq 4186.0087890625
391 -       ref 2503.434326171875
391 -    approx 2503.4345703125
391 -  relative 0.000244140625

395 - semitones -8.50000095367431640625
395 -      freq 4186.0087890625
395 -       ref 2561.949462890625
395 -    approx 2561.94970703125
395 -  relative 0.000244140625

397 - semitones -8.30000019073486328125
397 -      freq 4186.0087890625
397 -       ref 2591.7177734375
397 -    approx 2591.717529296875
397 -  relative 0.000244140625

403 - semitones -7.700000286102294921875
403 -      freq 4186.0087890625
403 -       ref 2683.114501953125
403 -    approx 2683.11474609375
403 -  relative 0.000244140625

405 - semitones -7.499999523162841796875
405 -      freq 4186.0087890625
405 -       ref 2714.291015625
405 -    approx 2714.290771484375
405 -  relative 0.000244140625

409 - semitones -7.09999942779541015625
409 -      freq 4186.0087890625
409 -       ref 2777.734619140625
409 -    approx 2777.734130859375
409 -  relative 0.00048828125

411 - semitones -6.90000057220458984375
411 -      freq 4186.0087890625
411 -       ref 2810.010009765625
411 -    approx 2810.01025390625
411 -  relative 0.000244140625

431 - semitones -4.8999996185302734375
431 -      freq 4186.0087890625
431 -       ref 3154.1298828125
431 -    approx 3154.129638671875
431 -  relative 0.000244140625

481 - semitones 0.1000005900859832763671875
481 -      freq 4186.0087890625
481 -       ref 4210.25830078125
481 -    approx 4210.2578125
481 -  relative 0.00048828125

483 - semitones 0.299999415874481201171875
483 -      freq 4186.0087890625
483 -       ref 4259.1787109375
483 -    approx 4259.17919921875
483 -  relative 0.00048828125

485 - semitones 0.500000059604644775390625
485 -      freq 4186.0087890625
485 -       ref 4308.66845703125
485 -    approx 4308.66748046875
485 -  relative 0.0009765625

487 - semitones 0.69999992847442626953125
487 -      freq 4186.0087890625
487 -       ref 4358.732421875
487 -    approx 4358.73291015625
487 -  relative 0.00048828125

489 - semitones 0.900000393390655517578125
489 -      freq 4186.0087890625
489 -       ref 4409.37841796875
489 -    approx 4409.3779296875
489 -  relative 0.00048828125

493 - semitones 1.2999999523162841796875
493 -      freq 4186.0087890625
493 -       ref 4512.44287109375
493 -    approx 4512.4423828125
493 -  relative 0.00048828125

497 - semitones 1.7000005245208740234375
497 -      freq 4186.0087890625
497 -       ref 4617.91650390625
497 -    approx 4617.916015625
497 -  relative 0.00048828125

501 - semitones 2.1000001430511474609375
501 -      freq 4186.0087890625
501 -       ref 4725.85498046875
501 -    approx 4725.8544921875
501 -  relative 0.00048828125

503 - semitones 2.2999999523162841796875
503 -      freq 4186.0087890625
503 -       ref 4780.7666015625
503 -    approx 4780.76708984375
503 -  relative 0.00048828125

505 - semitones 2.5000002384185791015625
505 -      freq 4186.0087890625
505 -       ref 4836.31640625
505 -    approx 4836.31591796875
505 -  relative 0.00048828125

507 - semitones 2.69999980926513671875
507 -      freq 4186.0087890625
507 -       ref 4892.51171875
507 -    approx 4892.51220703125
507 -  relative 0.00048828125

509 - semitones 2.900000095367431640625
509 -      freq 4186.0087890625
509 -       ref 4949.35986328125
509 -    approx 4949.359375
509 -  relative 0.00048828125

515 - semitones 3.499999523162841796875
515 -      freq 4186.0087890625
515 -       ref 5123.89892578125
515 -    approx 5123.8994140625
515 -  relative 0.00048828125

517 - semitones 3.7000000476837158203125
517 -      freq 4186.0087890625
517 -       ref 5183.435546875
517 -    approx 5183.43505859375
517 -  relative 0.00048828125

523 - semitones 4.299999713897705078125
523 -      freq 4186.0087890625
523 -       ref 5366.22900390625
523 -    approx 5366.2294921875
523 -  relative 0.00048828125

525 - semitones 4.500000476837158203125
525 -      freq 4186.0087890625
525 -       ref 5428.58203125
525 -    approx 5428.58154296875
525 -  relative 0.00048828125

529 - semitones 4.90000057220458984375
529 -      freq 4186.0087890625
529 -       ref 5555.46923828125
529 -    approx 5555.46826171875
529 -  relative 0.0009765625

531 - semitones 5.09999942779541015625
531 -      freq 4186.0087890625
531 -       ref 5620.02001953125
531 -    approx 5620.0205078125
531 -  relative 0.00048828125

541 - semitones 6.1000003814697265625
541 -      freq 4186.0087890625
541 -       ref 5954.2041015625
541 -    approx 5954.20361328125
541 -  relative 0.00048828125

551 - semitones 7.1000003814697265625
551 -      freq 4186.0087890625
551 -       ref 6308.259765625
551 -    approx 6308.25927734375
551 -  relative 0.00048828125

567 - semitones 8.700000762939453125
567 -      freq 4186.0087890625
567 -       ref 6919.056640625
567 -    approx 6919.05615234375
567 -  relative 0.00048828125

603 - semitones 12.299999237060546875
603 -      freq 4186.0087890625
603 -       ref 8518.357421875
603 -    approx 8518.3583984375
603 -  relative 0.0009765625

607 - semitones 12.69999980926513671875
607 -      freq 4186.0087890625
607 -       ref 8717.46484375
607 -    approx 8717.4658203125
607 -  relative 0.0009765625

613 - semitones 13.30000019073486328125
613 -      freq 4186.0087890625
613 -       ref 9024.8857421875
613 -    approx 9024.884765625
613 -  relative 0.0009765625

617 - semitones 13.700000762939453125
617 -      freq 4186.0087890625
617 -       ref 9235.8330078125
617 -    approx 9235.83203125
617 -  relative 0.0009765625

621 - semitones 14.1000003814697265625
621 -      freq 4186.0087890625
621 -       ref 9451.7099609375
621 -    approx 9451.708984375
621 -  relative 0.0009765625

623 - semitones 14.30000019073486328125
623 -      freq 4186.0087890625
623 -       ref 9561.533203125
623 -    approx 9561.5341796875
623 -  relative 0.0009765625

625 - semitones 14.5
625 -      freq 4186.0087890625
625 -       ref 9672.6328125
625 -    approx 9672.6318359375
625 -  relative 0.0009765625

627 - semitones 14.69999980926513671875
627 -      freq 4186.0087890625
627 -       ref 9785.0234375
627 -    approx 9785.0244140625
627 -  relative 0.0009765625

629 - semitones 14.8999996185302734375
629 -      freq 4186.0087890625
629 -       ref 9898.7197265625
629 -    approx 9898.71875
629 -  relative 0.0009765625

635 - semitones 15.49999904632568359375
635 -      freq 4186.0087890625
635 -       ref 10247.7978515625
635 -    approx 10247.798828125
635 -  relative 0.0009765625

637 - semitones 15.69999980926513671875
637 -      freq 4186.0087890625
637 -       ref 10366.87109375
637 -    approx 10366.8701171875
637 -  relative 0.0009765625

642 - semitones 16.200000762939453125
642 -      freq 4186.0087890625
642 -       ref 10670.64453125
642 -    approx 10670.6435546875
642 -  relative 0.0009765625

643 - semitones 16.299999237060546875
643 -      freq 4186.0087890625
643 -       ref 10732.4580078125
643 -    approx 10732.458984375
643 -  relative 0.0009765625

645 - semitones 16.5
645 -      freq 4186.0087890625
645 -       ref 10857.1640625
645 -    approx 10857.1630859375
645 -  relative 0.0009765625

649 - semitones 16.8999996185302734375
649 -      freq 4186.0087890625
649 -       ref 11110.9384765625
649 -    approx 11110.9365234375
649 -  relative 0.001953125

651 - semitones 17.09999847412109375
651 -      freq 4186.0087890625
651 -       ref 11240.0400390625
651 -    approx 11240.041015625
651 -  relative 0.0009765625

667 - semitones 18.700000762939453125
667 -      freq 4186.0087890625
667 -       ref 12328.3583984375
667 -    approx 12328.357421875
667 -  relative 0.0009765625

717 - semitones 23.6999988555908203125
717 -      freq 4186.0087890625
717 -       ref 16456.3828125
717 -    approx 16456.380859375
717 -  relative 0.001953125

753 - semitones 27.299999237060546875
753 -      freq 4186.0087890625
753 -       ref 20260.18359375
753 -    approx 20260.181640625
753 -  relative 0.001953125

762 - semitones 28.200000762939453125
762 -      freq 4186.0087890625
762 -       ref 21341.2890625
762 -    approx 21341.287109375
762 -  relative 0.001953125

767 - semitones 28.700000762939453125
767 -      freq 4186.0087890625
767 -       ref 21966.638671875
767 -    approx 21966.63671875
767 -  relative 0.001953125

783 - semitones 30.3000011444091796875
783 -      freq 4186.0087890625
783 -       ref 24093.556640625
783 -    approx 24093.5546875
783 -  relative 0.001953125

787 - semitones 30.700000762939453125
787 -      freq 4186.0087890625
787 -       ref 24656.716796875
787 -    approx 24656.71484375
787 -  relative 0.001953125

809 - semitones 32.899997711181640625
809 -      freq 4186.0087890625
809 -       ref 27997.80859375
809 -    approx 27997.806640625
809 -  relative 0.001953125

834 - semitones 35.399997711181640625
834 -      freq 4186.0087890625
834 -       ref 32347.341796875
834 -    approx 32347.337890625
834 -  relative 0.00390625

837 - semitones 35.700000762939453125
837 -      freq 4186.0087890625
837 -       ref 32912.765625
837 -    approx 32912.76171875
837 -  relative 0.00390625

845 - semitones 36.5
845 -      freq 4186.0087890625
845 -       ref 34469.34765625
845 -    approx 34469.33984375
845 -  relative 0.0078125

872 - semitones 39.200000762939453125
872 -      freq 4186.0087890625
872 -       ref 40286.98828125
872 -    approx 40286.984375
872 -  relative 0.00390625

873 - semitones 39.299999237060546875
873 -      freq 4186.0087890625
873 -       ref 40520.3671875
873 -    approx 40520.36328125
873 -  relative 0.00390625

887 - semitones 40.700000762939453125
887 -      freq 4186.0087890625
887 -       ref 43933.27734375
887 -    approx 43933.2734375
887 -  relative 0.00390625

896 - semitones 41.59999847412109375
896 -      freq 4186.0087890625
896 -       ref 46277.59765625
896 -    approx 46277.59375
896 -  relative 0.00390625

899 - semitones 41.90000152587890625
899 -      freq 4186.0087890625
899 -       ref 47086.51953125
899 -    approx 47086.515625
899 -  relative 0.00390625

903 - semitones 42.299999237060546875
903 -      freq 4186.0087890625
903 -       ref 48187.11328125
903 -    approx 48187.109375
903 -  relative 0.00390625

907 - semitones 42.700000762939453125
907 -      freq 4186.0087890625
907 -       ref 49313.43359375
907 -    approx 49313.4296875
907 -  relative 0.00390625

918 - semitones 43.8000030517578125
918 -      freq 4186.0087890625
918 -       ref 52548.421875
918 -    approx 52548.41796875
918 -  relative 0.00390625

925 - semitones 44.5
925 -      freq 4186.0087890625
925 -       ref 54716.67578125
925 -    approx 54716.671875
925 -  relative 0.00390625

926 - semitones 44.600002288818359375
926 -      freq 4186.0087890625
926 -       ref 55033.65625
926 -    approx 55033.65234375
926 -  relative 0.00390625

929 - semitones 44.899997711181640625
929 -      freq 4186.0087890625
929 -       ref 55995.6171875
929 -    approx 55995.61328125
929 -  relative 0.00390625

942 - semitones 46.200000762939453125
942 -      freq 4186.0087890625
942 -       ref 60362.28515625
942 -    approx 60362.28125
942 -  relative 0.00390625

953 - semitones 47.299999237060546875
953 -      freq 4186.0087890625
953 -       ref 64322.0703125
953 -    approx 64322.06640625
953 -  relative 0.00390625

954 - semitones 47.399997711181640625
954 -      freq 4186.0087890625
954 -       ref 64694.68359375
954 -    approx 64694.67578125
954 -  relative 0.0078125

957 - semitones 47.700000762939453125
957 -      freq 4186.0087890625
957 -       ref 65825.53125
957 -    approx 65825.5234375
957 -  relative 0.0078125

7 - semitones -47.299999237060546875
7 -      freq 8372.017578125
7 -       ref 544.841552734375
7 -    approx 544.84161376953125
7 -  relative 6.103515625e-05

10 - semitones -47.000003814697265625
10 -      freq 8372.017578125
10 -       ref 554.3651123046875
10 -    approx 554.36517333984375
10 -  relative 6.103515625e-05

39 - semitones -44.09999847412109375
39 -      freq 8372.017578125
39 -       ref 655.45806884765625
39 -    approx 655.4581298828125
39 -  relative 6.103515625e-05

46 - semitones -43.399997711181640625
46 -      freq 8372.017578125
46 -       ref 682.50372314453125
46 -    approx 682.5037841796875
46 -  relative 6.103515625e-05

53 - semitones -42.700000762939453125
53 -      freq 8372.017578125
53 -       ref 710.6651611328125
53 -    approx 710.66522216796875
53 -  relative 6.103515625e-05

66 - semitones -41.40000152587890625
66 -      freq 8372.017578125
66 -       ref 766.0843505859375
66 -    approx 766.08441162109375
66 -  relative 6.103515625e-05

69 - semitones -41.100002288818359375
69 -      freq 8372.017578125
69 -       ref 779.47528076171875
69 -    approx 779.475341796875
69 -  relative 6.103515625e-05

86 - semitones -39.399997711181640625
86 -      freq 8372.017578125
86 -       ref 859.90081787109375
86 -    approx 859.90087890625
86 -  relative 6.103515625e-05

114 - semitones -36.600002288818359375
114 -      freq 8372.017578125
114 -       ref 1010.85430908203125
114 -    approx 1010.85443115234375
114 -  relative 0.0001220703125

127 - semitones -35.299999237060546875
127 -      freq 8372.017578125
127 -       ref 1089.68310546875
127 -    approx 1089.6832275390625
127 -  relative 0.0001220703125

130 - semitones -35.000003814697265625
130 -      freq 8372.017578125
130 -       ref 1108.730224609375
130 -    approx 1108.7303466796875
130 -  relative 0.0001220703125

142 - semitones -33.799999237060546875
142 -      freq 8372.017578125
142 -       ref 1188.307861328125
142 -    approx 1188.3079833984375
142 -  relative 0.0001220703125

173 - semitones -30.700000762939453125
173 -      freq 8372.017578125
173 -       ref 1421.330322265625
173 -    approx 1421.3304443359375
173 -  relative 0.0001220703125

189 - semitones -29.1000003814697265625
189 -      freq 8372.017578125
189 -       ref 1558.9505615234375
189 -    approx 1558.95068359375
189 -  relative 0.0001220703125

361 - semitones -11.89999866485595703125
361 -      freq 8372.017578125
361 -       ref 4210.25830078125
361 -    approx 4210.2578125
361 -  relative 0.00048828125

365 - semitones -11.5
365 -      freq 8372.017578125
365 -       ref 4308.66845703125
365 -    approx 4308.66748046875
365 -  relative 0.0009765625

369 - semitones -11.1000003814697265625
369 -      freq 8372.017578125
369 -       ref 4409.37841796875
369 -    approx 4409.3779296875
369 -  relative 0.00048828125

373 - semitones -10.69999980926513671875
373 -      freq 8372.017578125
373 -       ref 4512.44287109375
373 -    approx 4512.4423828125
373 -  relative 0.00048828125

377 - semitones -10.299999237060546875
377 -      freq 8372.017578125
377 -       ref 4617.91650390625
377 -    approx 4617.916015625
377 -  relative 0.00048828125

381 - semitones -9.8999996185302734375
381 -      freq 8372.017578125
381 -       ref 4725.85498046875
381 -    approx 4725.8544921875
381 -  relative 0.00048828125

383 - semitones -9.69999980926513671875
383 -      freq 8372.017578125
383 -       ref 4780.7666015625
383 -    approx 4780.76708984375
383 -  relative 0.00048828125

385 - semitones -9.5
385 -      freq 8372.017578125
385 -       ref 4836.31640625
385 -    approx 4836.31591796875
385 -  relative 0.00048828125

387 - semitones -9.30000019073486328125
387 -      freq 8372.017578125
387 -       ref 4892.51171875
387 -    approx 4892.51220703125
387 -  relative 0.00048828125

389 - semitones -9.1000003814697265625
389 -      freq 8372.017578125
389 -       ref 4949.35986328125
389 -    approx 4949.359375
389 -  relative 0.00048828125

391 - semitones -8.90000057220458984375
391 -      freq 8372.017578125
391 -       ref 5006.86865234375
391 -    approx 5006.869140625
391 -  relative 0.00048828125

395 - semitones -8.50000095367431640625
395 -      freq 8372.017578125
395 -       ref 5123.89892578125
395 -    approx 5123.8994140625
395 -  relative 0.00048828125

397 - semitones -8.30000019073486328125
397 -      freq 8372.017578125
397 -       ref 5183.435546875
397 -    approx 5183.43505859375
397 -  relative 0.00048828125

403 - semitones -7.700000286102294921875
403 -      freq 8372.017578125
403 -       ref 5366.22900390625
403 -    approx 5366.2294921875
403 -  relative 0.00048828125

405 - semitones -7.499999523162841796875
405 -      freq 8372.017578125
405 -       ref 5428.58203125
405 -    approx 5428.58154296875
405 -  relative 0.00048828125

409 - semitones -7.09999942779541015625
409 -      freq 8372.017578125
409 -       ref 5555.46923828125
409 -    approx 5555.46826171875
409 -  relative 0.0009765625

411 - semitones -6.90000057220458984375
411 -      freq 8372.017578125
411 -       ref 5620.02001953125
411 -    approx 5620.0205078125
411 -  relative 0.00048828125

431 - semitones -4.8999996185302734375
431 -      freq 8372.017578125
431 -       ref 6308.259765625
431 -    approx 6308.25927734375
431 -  relative 0.00048828125

481 - semitones 0.1000005900859832763671875
481 -      freq 8372.017578125
481 -       ref 8420.5166015625
481 -    approx 8420.515625
481 -  relative 0.0009765625

483 - semitones 0.299999415874481201171875
483 -      freq 8372.017578125
483 -       ref 8518.357421875
483 -    approx 8518.3583984375
483 -  relative 0.0009765625

485 - semitones 0.500000059604644775390625
485 -      freq 8372.017578125
485 -       ref 8617.3369140625
485 -    approx 8617.3349609375
485 -  relative 0.001953125

487 - semitones 0.69999992847442626953125
487 -      freq 8372.017578125
487 -       ref 8717.46484375
487 -    approx 8717.4658203125
487 -  relative 0.0009765625

489 - semitones 0.900000393390655517578125
489 -      freq 8372.017578125
489 -       ref 8818.7568359375
489 -    approx 8818.755859375
489 -  relative 0.0009765625

493 - semitones 1.2999999523162841796875
493 -      freq 8372.017578125
493 -       ref 9024.8857421875
493 -    approx 9024.884765625
493 -  relative 0.0009765625

497 - semitones 1.7000005245208740234375
497 -      freq 8372.017578125
497 -       ref 9235.8330078125
497 -    approx 9235.83203125
497 -  relative 0.0009765625

501 - semitones 2.1000001430511474609375
501 -      freq 8372.017578125
501 -       ref 9451.7099609375
501 -    approx 9451.708984375
501 -  relative 0.0009765625

503 - semitones 2.2999999523162841796875
503 -      freq 8372.017578125
503 -       ref 9561.533203125
503 -    approx 9561.5341796875
503 -  relative 0.0009765625

505 - semitones 2.5000002384185791015625
505 -      freq 8372.017578125
505 -       ref 9672.6328125
505 -    approx 9672.6318359375
505 -  relative 0.0009765625

507 - semitones 2.69999980926513671875
507 -      freq 8372.017578125
507 -       ref 9785.0234375
507 -    approx 9785.0244140625
507 -  relative 0.0009765625

509 - semitones 2.900000095367431640625
509 -      freq 8372.017578125
509 -       ref 9898.7197265625
509 -    approx 9898.71875
509 -  relative 0.0009765625

515 - semitones 3.499999523162841796875
515 -      freq 8372.017578125
515 -       ref 10247.7978515625
515 -    approx 10247.798828125
515 -  relative 0.0009765625

517 - semitones 3.7000000476837158203125
517 -      freq 8372.017578125
517 -       ref 10366.87109375
517 -    approx 10366.8701171875
517 -  relative 0.0009765625

523 - semitones 4.299999713897705078125
523 -      freq 8372.017578125
523 -       ref 10732.4580078125
523 -    approx 10732.458984375
523 -  relative 0.0009765625

525 - semitones 4.500000476837158203125
525 -      freq 8372.017578125
525 -       ref 10857.1640625
525 -    approx 10857.1630859375
525 -  relative 0.0009765625

529 - semitones 4.90000057220458984375
529 -      freq 8372.017578125
529 -       ref 11110.9384765625
529 -    approx 11110.9365234375
529 -  relative 0.001953125

531 - semitones 5.09999942779541015625
531 -      freq 8372.017578125
531 -       ref 11240.0400390625
531 -    approx 11240.041015625
531 -  relative 0.0009765625

541 - semitones 6.1000003814697265625
541 -      freq 8372.017578125
541 -       ref 11908.408203125
541 -    approx 11908.4072265625
541 -  relative 0.0009765625

551 - semitones 7.1000003814697265625
551 -      freq 8372.017578125
551 -       ref 12616.51953125
551 -    approx 12616.5185546875
551 -  relative 0.0009765625

567 - semitones 8.700000762939453125
567 -      freq 8372.017578125
567 -       ref 13838.11328125
567 -    approx 13838.1123046875
567 -  relative 0.0009765625

603 - semitones 12.299999237060546875
603 -      freq 8372.017578125
603 -       ref 17036.71484375
603 -    approx 17036.716796875
603 -  relative 0.001953125

607 - semitones 12.69999980926513671875
607 -      freq 8372.017578125
607 -       ref 17434.9296875
607 -    approx 17434.931640625
607 -  relative 0.001953125

613 - semitones 13.30000019073486328125
613 -      freq 8372.017578125
613 -       ref 18049.771484375
613 -    approx 18049.76953125
613 -  relative 0.001953125

617 - semitones 13.700000762939453125
617 -      freq 8372.017578125
617 -       ref 18471.666015625
617 -    approx 18471.6640625
617 -  relative 0.001953125

621 - semitones 14.1000003814697265625
621 -      freq 8372.017578125
621 -       ref 18903.419921875
621 -    approx 18903.41796875
621 -  relative 0.001953125

623 - semitones 14.30000019073486328125
623 -      freq 8372.017578125
623 -       ref 19123.06640625
623 -    approx 19123.068359375
623 -  relative 0.001953125

625 - semitones 14.5
625 -      freq 8372.017578125
625 -       ref 19345.265625
625 -    approx 19345.263671875
625 -  relative 0.001953125

627 - semitones 14.69999980926513671875
627 -      freq 8372.017578125
627 -       ref 19570.046875
627 -    approx 19570.048828125
627 -  relative 0.001953125

629 - semitones 14.8999996185302734375
629 -      freq 8372.017578125
629 -       ref 19797.439453125
629 -    approx 19797.4375
629 -  relative 0.001953125

635 - semitones 15.49999904632568359375
635 -      freq 8372.017578125
635 -       ref 20495.595703125
635 -    approx 20495.59765625
635 -  relative 0.001953125

637 - semitones 15.69999980926513671875
637 -      freq 8372.017578125
637 -       ref 20733.7421875
637 -    approx 20733.740234375
637 -  relative 0.001953125

642 - semitones 16.200000762939453125
642 -      freq 8372.017578125
642 -       ref 21341.2890625
642 -    approx 21341.287109375
642 -  relative 0.001953125

643 - semitones 16.299999237060546875
643 -      freq 8372.017578125
643 -       ref 21464.916015625
643 -    approx 21464.91796875
643 -  relative 0.001953125

645 - semitones 16.5
645 -      freq 8372.017578125
645 -       ref 21714.328125
645 -    approx 21714.326171875
645 -  relative 0.001953125

649 - semitones 16.8999996185302734375
649 -      freq 8372.017578125
649 -       ref 22221.876953125
649 -    approx 22221.873046875
649 -  relative 0.00390625

651 - semitones 17.09999847412109375
651 -      freq 8372.017578125
651 -       ref 22480.080078125
651 -    approx 22480.08203125
651 -  relative 0.001953125

667 - semitones 18.700000762939453125
667 -      freq 8372.017578125
667 -       ref 24656.716796875
667 -    approx 24656.71484375
667 -  relative 0.001953125

717 - semitones 23.6999988555908203125
717 -      freq 8372.017578125
717 -       ref 32912.765625
717 -    approx 32912.76171875
717 -  relative 0.00390625

753 - semitones 27.299999237060546875
753 -      freq 8372.017578125
753 -       ref 40520.3671875
753 -    approx 40520.36328125
753 -  relative 0.00390625

762 - semitones 28.200000762939453125
762 -      freq 8372.017578125
762 -       ref 42682.578125
762 -    approx 42682.57421875
762 -  relative 0.00390625

767 - semitones 28.700000762939453125
767 -      freq 8372.017578125
767 -       ref 43933.27734375
767 -    approx 43933.2734375
767 -  relative 0.00390625

783 - semitones 30.3000011444091796875
783 -      freq 8372.017578125
783 -       ref 48187.11328125
783 -    approx 48187.109375
783 -  relative 0.00390625

787 - semitones 30.700000762939453125
787 -      freq 8372.017578125
787 -       ref 49313.43359375
787 -    approx 49313.4296875
787 -  relative 0.00390625

809 - semitones 32.899997711181640625
809 -      freq 8372.017578125
809 -       ref 55995.6171875
809 -    approx 55995.61328125
809 -  relative 0.00390625

834 - semitones 35.399997711181640625
834 -      freq 8372.017578125
834 -       ref 64694.68359375
834 -    approx 64694.67578125
834 -  relative 0.0078125

837 - semitones 35.700000762939453125
837 -      freq 8372.017578125
837 -       ref 65825.53125
837 -    approx 65825.5234375
837 -  relative 0.0078125

845 - semitones 36.5
845 -      freq 8372.017578125
845 -       ref 68938.6953125
845 -    approx 68938.6796875
845 -  relative 0.015625

872 - semitones 39.200000762939453125
872 -      freq 8372.017578125
872 -       ref 80573.9765625
872 -    approx 80573.96875
872 -  relative 0.0078125

873 - semitones 39.299999237060546875
873 -      freq 8372.017578125
873 -       ref 81040.734375
873 -    approx 81040.7265625
873 -  relative 0.0078125

887 - semitones 40.700000762939453125
887 -      freq 8372.017578125
887 -       ref 87866.5546875
887 -    approx 87866.546875
887 -  relative 0.0078125

896 - semitones 41.59999847412109375
896 -      freq 8372.017578125
896 -       ref 92555.1953125
896 -    approx 92555.1875
896 -  relative 0.0078125

899 - semitones 41.90000152587890625
899 -      freq 8372.017578125
899 -       ref 94173.0390625
899 -    approx 94173.03125
899 -  relative 0.0078125

903 - semitones 42.299999237060546875
903 -      freq 8372.017578125
903 -       ref 96374.2265625
903 -    approx 96374.21875
903 -  relative 0.0078125

907 - semitones 42.700000762939453125
907 -      freq 8372.017578125
907 -       ref 98626.8671875
907 -    approx 98626.859375
907 -  relative 0.0078125

918 - semitones 43.8000030517578125
918 -      freq 8372.017578125
918 -       ref 105096.84375
918 -    approx 105096.8359375
918 -  relative 0.0078125

925 - semitones 44.5
925 -      freq 8372.017578125
925 -       ref 109433.3515625
925 -    approx 109433.34375
925 -  relative 0.0078125

926 - semitones 44.600002288818359375
926 -      freq 8372.017578125
926 -       ref 110067.3125
926 -    approx 110067.3046875
926 -  relative 0.0078125

929 - semitones 44.899997711181640625
929 -      freq 8372.017578125
929 -       ref 111991.234375
929 -    approx 111991.2265625
929 -  relative 0.0078125

942 - semitones 46.200000762939453125
942 -      freq 8372.017578125
942 -       ref 120724.5703125
942 -    approx 120724.5625
942 -  relative 0.0078125

953 - semitones 47.299999237060546875
953 -      freq 8372.017578125
953 -       ref 128644.140625
953 -    approx 128644.1328125
953 -  relative 0.0078125

954 - semitones 47.399997711181640625
954 -      freq 8372.017578125
954 -       ref 129389.3671875
954 -    approx 129389.3515625
954 -  relative 0.015625

957 - semitones 47.700000762939453125
957 -      freq 8372.017578125
957 -       ref 131651.0625
957 -    approx 131651.046875
957 -  relative 0.015625

7 - semitones -47.299999237060546875
7 -      freq 16744.03515625
7 -       ref 1089.68310546875
7 -    approx 1089.6832275390625
7 -  relative 0.0001220703125

10 - semitones -47.000003814697265625
10 -      freq 16744.03515625
10 -       ref 1108.730224609375
10 -    approx 1108.7303466796875
10 -  relative 0.0001220703125

39 - semitones -44.09999847412109375
39 -      freq 16744.03515625
39 -       ref 1310.9161376953125
39 -    approx 1310.916259765625
39 -  relative 0.0001220703125

46 - semitones -43.399997711181640625
46 -      freq 16744.03515625
46 -       ref 1365.0074462890625
46 -    approx 1365.007568359375
46 -  relative 0.0001220703125

53 - semitones -42.700000762939453125
53 -      freq 16744.03515625
53 -       ref 1421.330322265625
53 -    approx 1421.3304443359375
53 -  relative 0.0001220703125

66 - semitones -41.40000152587890625
66 -      freq 16744.03515625
66 -       ref 1532.168701171875
66 -    approx 1532.1688232421875
66 -  relative 0.0001220703125

69 - semitones -41.100002288818359375
69 -      freq 16744.03515625
69 -       ref 1558.9505615234375
69 -    approx 1558.95068359375
69 -  relative 0.0001220703125

86 - semitones -39.399997711181640625
86 -      freq 16744.03515625
86 -       ref 1719.8016357421875
86 -    approx 1719.8017578125
86 -  relative 0.0001220703125

114 - semitones -36.600002288818359375
114 -      freq 16744.03515625
114 -       ref 2021.7086181640625
114 -    approx 2021.7088623046875
114 -  relative 0.000244140625

127 - semitones -35.299999237060546875
127 -      freq 16744.03515625
127 -       ref 2179.3662109375
127 -    approx 2179.366455078125
127 -  relative 0.000244140625

130 - semitones -35.000003814697265625
130 -      freq 16744.03515625
130 -       ref 2217.46044921875
130 -    approx 2217.460693359375
130 -  relative 0.000244140625

142 - semitones -33.799999237060546875
142 -      freq 16744.03515625
142 -       ref 2376.61572265625
142 -    approx 2376.615966796875
142 -  relative 0.000244140625

173 - semitones -30.700000762939453125
173 -      freq 16744.03515625
173 -       ref 2842.66064453125
173 -    approx 2842.660888671875
173 -  relative 0.000244140625

189 - semitones -29.1000003814697265625
189 -      freq 16744.03515625
189 -       ref 3117.901123046875
189 -    approx 3117.9013671875
189 -  relative 0.000244140625

361 - semitones -11.89999866485595703125
361 -      freq 16744.03515625
361 -       ref 8420.5166015625
361 -    approx 8420.515625
361 -  relative 0.0009765625

365 - semitones -11.5
365 -      freq 16744.03515625
365 -       ref 8617.3369140625
365 -    approx 8617.3349609375
365 -  relative 0.001953125

369 - semitones -11.1000003814697265625
369 -      freq 16744.03515625
369 -       ref 8818.7568359375
369 -    approx 8818.755859375
369 -  relative 0.0009765625

373 - semitones -10.69999980926513671875
373 -      freq 16744.03515625
373 -       ref 9024.8857421875
373 -    approx 9024.884765625
373 -  relative 0.0009765625

377 - semitones -10.299999237060546875
377 -      freq 16744.03515625
377 -       ref 9235.8330078125
377 -    approx 9235.83203125
377 -  relative 0.0009765625

381 - semitones -9.8999996185302734375
381 -      freq 16744.03515625
381 -       ref 9451.7099609375
381 -    approx 9451.708984375
381 -  relative 0.0009765625

383 - semitones -9.69999980926513671875
383 -      freq 16744.03515625
383 -       ref 9561.533203125
383 -    approx 9561.5341796875
383 -  relative 0.0009765625

385 - semitones -9.5
385 -      freq 16744.03515625
385 -       ref 9672.6328125
385 -    approx 9672.6318359375
385 -  relative 0.0009765625

387 - semitones -9.30000019073486328125
387 -      freq 16744.03515625
387 -       ref 9785.0234375
387 -    approx 9785.0244140625
387 -  relative 0.0009765625

389 - semitones -9.1000003814697265625
389 -      freq 16744.03515625
389 -       ref 9898.7197265625
389 -    approx 9898.71875
389 -  relative 0.0009765625

391 - semitones -8.90000057220458984375
391 -      freq 16744.03515625
391 -       ref 10013.7373046875
391 -    approx 10013.73828125
391 -  relative 0.0009765625

395 - semitones -8.50000095367431640625
395 -      freq 16744.03515625
395 -       ref 10247.7978515625
395 -    approx 10247.798828125
395 -  relative 0.0009765625

397 - semitones -8.30000019073486328125
397 -      freq 16744.03515625
397 -       ref 10366.87109375
397 -    approx 10366.8701171875
397 -  relative 0.0009765625

403 - semitones -7.700000286102294921875
403 -      freq 16744.03515625
403 -       ref 10732.4580078125
403 -    approx 10732.458984375
403 -  relative 0.0009765625

405 - semitones -7.499999523162841796875
405 -      freq 16744.03515625
405 -       ref 10857.1640625
405 -    approx 10857.1630859375
405 -  relative 0.0009765625

409 - semitones -7.09999942779541015625
409 -      freq 16744.03515625
409 -       ref 11110.9384765625
409 -    approx 11110.9365234375
409 -  relative 0.001953125

411 - semitones -6.90000057220458984375
411 -      freq 16744.03515625
411 -       ref 11240.0400390625
411 -    approx 11240.041015625
411 -  relative 0.0009765625

431 - semitones -4.8999996185302734375
431 -      freq 16744.03515625
431 -       ref 12616.51953125
431 -    approx 12616.5185546875
431 -  relative 0.0009765625

481 - semitones 0.1000005900859832763671875
481 -      freq 16744.03515625
481 -       ref 16841.033203125
481 -    approx 16841.03125
481 -  relative 0.001953125

483 - semitones 0.299999415874481201171875
483 -      freq 16744.03515625
483 -       ref 17036.71484375
483 -    approx 17036.716796875
483 -  relative 0.001953125

485 - semitones 0.500000059604644775390625
485 -      freq 16744.03515625
485 -       ref 17234.673828125
485 -    approx 17234.669921875
485 -  relative 0.00390625

487 - semitones 0.69999992847442626953125
487 -      freq 16744.03515625
487 -       ref 17434.9296875
487 -    approx 17434.931640625
487 -  relative 0.001953125

489 - semitones 0.900000393390655517578125
489 -      freq 16744.03515625
489 -       ref 17637.513671875
489 -    approx 17637.51171875
489 -  relative 0.001953125

493 - semitones 1.2999999523162841796875
493 -      freq 16744.03515625
493 -       ref 18049.771484375
493 -    approx 18049.76953125
493 -  relative 0.001953125

497 - semitones 1.7000005245208740234375
497 -      freq 16744.03515625
497 -       ref 18471.666015625
497 -    approx 18471.6640625
497 -  relative 0.001953125

501 - semitones 2.1000001430511474609375
501 -      freq 16744.03515625
501 -       ref 18903.419921875
501 -    approx 18903.41796875
501 -  relative 0.001953125

503 - semitones 2.2999999523162841796875
503 -      freq 16744.03515625
503 -       ref 19123.06640625
503 -    approx 19123.068359375
503 -  relative 0.001953125

505 - semitones 2.5000002384185791015625
505 -      freq 16744.03515625
505 -       ref 19345.265625
505 -    approx 19345.263671875
505 -  relative 0.001953125

507 - semitones 2.69999980926513671875
507 -      freq 16744.03515625
507 -       ref 19570.046875
507 -    approx 19570.048828125
507 -  relative 0.001953125

509 - semitones 2.900000095367431640625
509 -      freq 16744.03515625
509 -       ref 19797.439453125
509 -    approx 19797.4375
509 -  relative 0.001953125

515 - semitones 3.499999523162841796875
515 -      freq 16744.03515625
515 -       ref 20495.595703125
515 -    approx 20495.59765625
515 -  relative 0.001953125

517 - semitones 3.7000000476837158203125
517 -      freq 16744.03515625
517 -       ref 20733.7421875
517 -    approx 20733.740234375
517 -  relative 0.001953125

523 - semitones 4.299999713897705078125
523 -      freq 16744.03515625
523 -       ref 21464.916015625
523 -    approx 21464.91796875
523 -  relative 0.001953125

525 - semitones 4.500000476837158203125
525 -      freq 16744.03515625
525 -       ref 21714.328125
525 -    approx 21714.326171875
525 -  relative 0.001953125

529 - semitones 4.90000057220458984375
529 -      freq 16744.03515625
529 -       ref 22221.876953125
529 -    approx 22221.873046875
529 -  relative 0.00390625

531 - semitones 5.09999942779541015625
531 -      freq 16744.03515625
531 -       ref 22480.080078125
531 -    approx 22480.08203125
531 -  relative 0.001953125

541 - semitones 6.1000003814697265625
541 -      freq 16744.03515625
541 -       ref 23816.81640625
541 -    approx 23816.814453125
541 -  relative 0.001953125

551 - semitones 7.1000003814697265625
551 -      freq 16744.03515625
551 -       ref 25233.0390625
551 -    approx 25233.037109375
551 -  relative 0.001953125

567 - semitones 8.700000762939453125
567 -      freq 16744.03515625
567 -       ref 27676.2265625
567 -    approx 27676.224609375
567 -  relative 0.001953125

603 - semitones 12.299999237060546875
603 -      freq 16744.03515625
603 -       ref 34073.4296875
603 -    approx 34073.43359375
603 -  relative 0.00390625

607 - semitones 12.69999980926513671875
607 -      freq 16744.03515625
607 -       ref 34869.859375
607 -    approx 34869.86328125
607 -  relative 0.00390625

613 - semitones 13.30000019073486328125
613 -      freq 16744.03515625
613 -       ref 36099.54296875
613 -    approx 36099.5390625
613 -  relative 0.00390625

617 - semitones 13.700000762939453125
617 -      freq 16744.03515625
617 -       ref 36943.33203125
617 -    approx 36943.328125
617 -  relative 0.00390625

621 - semitones 14.1000003814697265625
621 -      freq 16744.03515625
621 -       ref 37806.83984375
621 -    approx 37806.8359375
621 -  relative 0.00390625

623 - semitones 14.30000019073486328125
623 -      freq 16744.03515625
623 -       ref 38246.1328125
623 -    approx 38246.13671875
623 -  relative 0.00390625

625 - semitones 14.5
625 -      freq 16744.03515625
625 -       ref 38690.53125
625 -    approx 38690.52734375
625 -  relative 0.00390625

627 - semitones 14.69999980926513671875
627 -      freq 16744.03515625
627 -       ref 39140.09375
627 -    approx 39140.09765625
627 -  relative 0.00390625

629 - semitones 14.8999996185302734375
629 -      freq 16744.03515625
629 -       ref 39594.87890625
629 -    approx 39594.875
629 -  relative 0.00390625

635 - semitones 15.49999904632568359375
635 -      freq 16744.03515625
635 -       ref 40991.19140625
635 -    approx 40991.1953125
635 -  relative 0.00390625

637 - semitones 15.69999980926513671875
637 -      freq 16744.03515625
637 -       ref 41467.484375
637 -    approx 41467.48046875
637 -  relative 0.00390625

642 - semitones 16.200000762939453125
642 -      freq 16744.03515625
642 -       ref 42682.578125
642 -    approx 42682.57421875
642 -  relative 0.00390625

643 - semitones 16.299999237060546875
643 -      freq 16744.03515625
643 -       ref 42929.83203125
643 -    approx 42929.8359375
643 -  relative 0.00390625

645 - semitones 16.5
645 -      freq 16744.03515625
645 -       ref 43428.65625
645 -    approx 43428.65234375
645 -  relative 0.00390625

649 - semitones 16.8999996185302734375
649 -      freq 16744.03515625
649 -       ref 44443.75390625
649 -    approx 44443.74609375
649 -  relative 0.0078125

651 - semitones 17.09999847412109375
651 -      freq 16744.03515625
651 -       ref 44960.16015625
651 -    approx 44960.1640625
651 -  relative 0.00390625

667 - semitones 18.700000762939453125
667 -      freq 16744.03515625
667 -       ref 49313.43359375
667 -    approx 49313.4296875
667 -  relative 0.00390625

717 - semitones 23.6999988555908203125
717 -      freq 16744.03515625
717 -       ref 65825.53125
717 -    approx 65825.5234375
717 -  relative 0.0078125

753 - semitones 27.299999237060546875
753 -      freq 16744.03515625
753 -       ref 81040.734375
753 -    approx 81040.7265625
753 -  relative 0.0078125

762 - semitones 28.200000762939453125
762 -      freq 16744.03515625
762 -       ref 85365.15625
762 -    approx 85365.1484375
762 -  relative 0.0078125

767 - semitones 28.700000762939453125
767 -      freq 16744.03515625
767 -       ref 87866.5546875
767 -    approx 87866.546875
767 -  relative 0.0078125

783 - semitones 30.3000011444091796875
783 -      freq 16744.03515625
783 -       ref 96374.2265625
783 -    approx 96374.21875
783 -  relative 0.0078125

787 - semitones 30.700000762939453125
787 -      freq 16744.03515625
787 -       ref 98626.8671875
787 -    approx 98626.859375
787 -  relative 0.0078125

809 - semitones 32.899997711181640625
809 -      freq 16744.03515625
809 -       ref 111991.234375
809 -    approx 111991.2265625
809 -  relative 0.0078125

834 - semitones 35.399997711181640625
834 -      freq 16744.03515625
834 -       ref 129389.3671875
834 -    approx 129389.3515625
834 -  relative 0.015625

837 - semitones 35.700000762939453125
837 -      freq 16744.03515625
837 -       ref 131651.0625
837 -    approx 131651.046875
837 -  relative 0.015625

845 - semitones 36.5
845 -      freq 16744.03515625
845 -       ref 137877.390625
845 -    approx 137877.359375
845 -  relative 0.03125

872 - semitones 39.200000762939453125
872 -      freq 16744.03515625
872 -       ref 161147.953125
872 -    approx 161147.9375
872 -  relative 0.015625

873 - semitones 39.299999237060546875
873 -      freq 16744.03515625
873 -       ref 162081.46875
873 -    approx 162081.453125
873 -  relative 0.015625

887 - semitones 40.700000762939453125
887 -      freq 16744.03515625
887 -       ref 175733.109375
887 -    approx 175733.09375
887 -  relative 0.015625

896 - semitones 41.59999847412109375
896 -      freq 16744.03515625
896 -       ref 185110.390625
896 -    approx 185110.375
896 -  relative 0.015625

899 - semitones 41.90000152587890625
899 -      freq 16744.03515625
899 -       ref 188346.078125
899 -    approx 188346.0625
899 -  relative 0.015625

903 - semitones 42.299999237060546875
903 -      freq 16744.03515625
903 -       ref 192748.453125
903 -    approx 192748.4375
903 -  relative 0.015625

907 - semitones 42.700000762939453125
907 -      freq 16744.03515625
907 -       ref 197253.734375
907 -    approx 197253.71875
907 -  relative 0.015625

918 - semitones 43.8000030517578125
918 -      freq 16744.03515625
918 -       ref 210193.6875
918 -    approx 210193.671875
918 -  relative 0.015625

925 - semitones 44.5
925 -      freq 16744.03515625
925 -       ref 218866.703125
925 -    approx 218866.6875
925 -  relative 0.015625

926 - semitones 44.600002288818359375
926 -      freq 16744.03515625
926 -       ref 220134.625
926 -    approx 220134.609375
926 -  relative 0.015625

929 - semitones 44.899997711181640625
929 -      freq 16744.03515625
929 -       ref 223982.46875
929 -    approx 223982.453125
929 -  relative 0.015625

942 - semitones 46.200000762939453125
942 -      freq 16744.03515625
942 -       ref 241449.140625
942 -    approx 241449.125
942 -  relative 0.015625

953 - semitones 47.299999237060546875
953 -      freq 16744.03515625
953 -       ref 257288.28125
953 -    approx 257288.265625
953 -  relative 0.015625

954 - semitones 47.399997711181640625
954 -      freq 16744.03515625
954 -       ref 258778.734375
954 -    approx 258778.703125
954 -  relative 0.03125

957 - semitones 47.700000762939453125
957 -      freq 16744.03515625
957 -       ref 263302.125
957 -    approx 263302.09375
957 -  relative 0.03125
The worst case is C11 with 36.5 semitones (or 47.4 or 47.7): absolute error 0.03125
But even in some other cases, the magnitudes of errors are similar (around 0.015625 in many freq/semitones pairs).

2Dat approx seems even worst: absolute error 0.046875
ippsExp_32f_I the same of 2Dat approx: absolute error 0.046875

Is in your opinions these error relevants in terms of pitch/freq?

Not really able to quantify it honestly... but it seems "noticeable" a drift of ±1/32, isn't?

2DaT
KVRist
343 posts since 21 Jun, 2013

Re: First steps on Vectorizing Audio Plugins: which Instruction Set do you use in 2018?

Post Fri Jan 25, 2019 5:35 am

Nowhk wrote:
Fri Jan 25, 2019 1:59 am
Ok, I think I've got it :) Its about the "classic" motivation: the more you multiply big with small number, the more error you introduce in fp.
No such thing.

32-bit float can't give you more than ~1.1e-07 relative accuracy anyway.

Code: Select all

std::numeric_limits<float>::epsilon()
Also, your relative error calculation is wrong. :roll:

User avatar
Nowhk
KVRian
864 posts since 2 Oct, 2013

Re: First steps on Vectorizing Audio Plugins: which Instruction Set do you use in 2018?

Post Fri Jan 25, 2019 6:29 am

2DaT wrote:
Fri Jan 25, 2019 5:35 am
No such thing.

32-bit float can't give you more than ~1.1e-07 relative accuracy anyway.

Code: Select all

std::numeric_limits<float>::epsilon()
I meant that if the relative error (for multiplier) is low, once multiplied for a higher value, also the error will increment (I think is what Max M. meant with the example of 1.050 <-> 1.055 and 5.050 <-> 5.055). In fact:

Code: Select all

float freq = 16744.03515625;	

float ref = 15.72512912750244140625;
float app = 15.725128173828125;
float deltaErr = fabs(ref - app);
std::cout << deltaErr << std::endl;

float finalRef = freq * ref;
float finalApp = freq * app;
float deltaFinalErr = fabs(finalRef - finalApp);
std::cout << deltaFinalErr << std::endl;
If the relative error of multiplier calculation is 9.5367431640625e-07, once multiplied for a higher value it becomes 0.03125 (which is waaay higher).
2DaT wrote:
Fri Jan 25, 2019 5:35 am
Also, your relative error calculation is wrong. :roll:
Where am I wrong?

Return to “DSP and Plug-in Development”