53 lines
1011 B
C
53 lines
1011 B
C
|
#ifndef YAW_SCALE_INCLUDED
|
||
|
#define YAW_SCALE_INCLUDED
|
||
|
|
||
|
#include <vector>
|
||
|
|
||
|
class Scale
|
||
|
{
|
||
|
double sampleRate = 48000.0;
|
||
|
|
||
|
// freqs in hz, periods in samples
|
||
|
std::vector<double> frequencies;
|
||
|
std::vector<double> 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
|