pitch.hpp (1097B)
1 #pragma once 2 3 namespace bogaudio { 4 namespace dsp { 5 6 const float referenceFrequency = 261.626; // C4; frequency at which Rack 1v/octave CVs are zero. 7 const float referenceSemitone = 60.0; // C4; value of C4 in semitones is arbitrary here, so have it match midi note numbers when rounded to integer. 8 const float twelfthRootTwo = 1.0594630943592953; 9 const float logTwelfthRootTwo = logf(1.0594630943592953); 10 11 inline float frequencyToSemitone(float frequency) { 12 return logf(frequency / referenceFrequency) / logTwelfthRootTwo + referenceSemitone; 13 } 14 15 inline float semitoneToFrequency(float semitone) { 16 return powf(twelfthRootTwo, semitone - referenceSemitone) * referenceFrequency; 17 } 18 19 inline float frequencyToCV(float frequency) { 20 return log2f(frequency / referenceFrequency); 21 } 22 23 inline float cvToFrequency(float cv) { 24 return powf(2.0, cv) * referenceFrequency; 25 } 26 27 inline float cvToSemitone(float cv) { 28 return frequencyToSemitone(cvToFrequency(cv)); 29 } 30 31 inline float semitoneToCV(float semitone) { 32 return frequencyToCV(semitoneToFrequency(semitone)); 33 } 34 35 } // namespace dsp 36 } // namespace bogaudio