В задаче стандартная высота А4 составляет 440 Гц.Поскольку мы начинаем с клавиши А4, мы создаем массив полутонов и находим значение тона из ASCII:
A B C D E F G
0 2 -9 -7 -5 -4 -2
int semitones[] = {0, 2, -9, -7, -5, -4, -2};
float tone = semitones[note[0] - 'A'];
Случайные #
или b
поднимают или опускают ноту на один полутон.Но мы не уверены, где октава находится в примечании, и мы также должны найти ее отличие от 4-й октавы.Существуют разные сценарии, поэтому оператор switch работает хорошо:
int octave;
switch(note[1])
{
case '#':
tone++;
octave = note[2];
break;
case 'b':
tone--;
octave = note[2];
break;
default:
octave = note[1];
break;
}
octave -= '4';
Частота октавы имеет коэффициент 2. A3 будет 220 Гц, а A5 - 880 Гц.Итак,
if (octave > 0)
hz *= octave * 2;
else if (octave < 0)
hz /= abs(octave * 2);
Наконец, частота ноты составляет 2 ^ (n / 12), где n - количество полутонов из A4:
if (tone < 0)
{
tone *= -1;
hz /= pow(2, tone / 12);
}
else if (tone > 0)
hz *= pow(2, tone / 12);