Common file for handling arbitrary tunings.

This commit is contained in:
yaw-man 2022-09-16 11:38:52 -04:00
parent 846bdedf13
commit 1a6edd85a0
1 changed files with 53 additions and 0 deletions

53
lib/scale/scale.h Normal file
View File

@ -0,0 +1,53 @@
#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 &note : 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