#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