diff --git a/lib/scale/scale.h b/lib/scale/scale.h new file mode 100644 index 0000000..6b46cdf --- /dev/null +++ b/lib/scale/scale.h @@ -0,0 +1,53 @@ +#ifndef YAW_SCALE_INCLUDED +#define YAW_SCALE_INCLUDED + +#include + +class Scale +{ + double sampleRate = 48000.0; + + // freqs in hz, periods in samples + std::vector frequencies; + std::vector periods; + +public: + void newSampleRate(double rate) + { + double ratio = rate / sampleRate; + sampleRate = rate; + for (double ¬e : periods) + note *= ratio; + }; + + // Default ctor: 12TET @ 48kHz + Scale(double hz = 440.0) + { + hz /= 32.0; + + for (int i = 0; i < 12 * 8; ++i) + { + frequencies.push_back(hz); + periods.push_back(sampleRate / hz); + hz *= exp2(1.0 / 12.0); + } + } + + double getNearestPeriod(double period) + { + for (auto note : periods) + { + if (period > note) + return note; + } + + // This should NOT happen. + return 0; + } + + // TODO: parse scala files. new ctor that parses arbitrary scales +}; + + + +#endif \ No newline at end of file