UniLecs #125. Ноты фортепиано
UniLecs![](/file/acdb3ee662e96b39af3e4.jpg)
Задача: клавиатура фортепиано разделена на равные октавы по 12 нот (см. таблицу). Частоты любых двух одноимённых нот с интервалом в октаву отличаются ровно в 2 раза (чем выше октава, тем выше частота). Частоты 12 нот внутри октавы логарифмически пропорциональны. Т.е. отношение частот двух соседних нот всегда одинаково (C:C# = C#:D = D:D# и т.д.).
Необходимо по заданным номерам октавы (в научной нотации – от 0 до 8) и ноты (от 1 до 12) определить частоту ноту, если известно, что частота ноты «ля» октавы 4 равна 440 Гц.
Входные данные: номер октавы (от 0 до 8); номер ноты (от 1 до 12)
Вывод: частота ноты
Пример: октава 3, нота 10;
Answer: Частота = 220 Гц
P.S. 12 нот октавы имеют следующие названия (от самой низкой к самой высокой, которые в данной задаче обозначаются цифрами от 1 до 12):
![](/file/c1eea2a43382bdafc1327.png)
Идея: поскольку частоты двух одноимённых нот с интервалом в октаву отличаются ровно в 2 раза, а частоты нот внутри октавы логарифмически пропорциональны, и нот в октаве 12, следовательно, отношение частот двух соседних нот равно:
![](/file/f72676517bd21a1923305.png)
Поскольку нам известна только частота ноты «ля» A4 с абсолютным номером 4*12 + 10 (которая равна 440 Гц), то для вычисления частоты нужной нам ноты, сделаем следующее:
- Переведём номер октавы (octave) и ноты (note) в абсолютный номер ноты (absnote): absnote = octave * 12 + note.
- Найдем номер ноты относительно ноты с известной нам частотой (relA4): relA4 = absnote - (4*12 + 10).
- Умножим частоту 440 Гц на : freq = 440 * 2 ** (relA4/12).
- Возвращаем результат freq.
Реализация:
![](/file/fbd0cfe3f7fd0f857f999.png)
https://gist.github.com/unilecs/db8d54b78958fc6e2ecf565c72fb7098
Test: