UniLecs #125. Ноты фортепиано

UniLecs #125. Ноты фортепиано

UniLecs

Задача: клавиатура фортепиано разделена на равные октавы по 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):

Идея: поскольку частоты двух одноимённых нот с интервалом в октаву отличаются ровно в 2 раза, а частоты нот внутри октавы логарифмически пропорциональны, и нот в октаве 12, следовательно, отношение частот двух соседних нот равно:

Поскольку нам известна только частота ноты «ля» A4 с абсолютным номером 4*12 + 10 (которая равна 440 Гц), то для вычисления частоты нужной нам ноты, сделаем следующее:

  1. Переведём номер октавы (octave) и ноты (note) в абсолютный номер ноты (absnote): absnote = octave * 12 + note.
  2. Найдем номер ноты относительно ноты с известной нам частотой (relA4): relA4 = absnote - (4*12 + 10).
  3. Умножим частоту 440 Гц на : freq = 440 * 2 ** (relA4/12).
  4. Возвращаем результат freq.

Реализация:

@jinxonik, Python

https://gist.github.com/unilecs/db8d54b78958fc6e2ecf565c72fb7098

Test:

https://repl.it/@unilecs/UnnaturalClientsideSource

Report Page