10. Узнать частоту по ноте.
Условие:
Частоты нот одной октавы:
- С4 = 261.63
- D4 = 293.66
- E4 = 329.63
- F4 = 349.23
- G4 = 392.00
- A4 = 440.00
- B4 = 493.88
Пусть ваша программа запрашивает у пользователя обозначение ноты и показывает ее частоту согласно приведенной таблице.
После этого вы можете доработать свою программу таким образом, чтобы она поддерживала все октавы, начиная от субконтроктавы (C0) до пятой октавы (C8).
И хотя можно это реализовать путем добавления бесконечного количества блоков if, это будет довольно громоздким, недостаточно элегантным и просто неприемлемым решением данной задачи.
Вместо этого при расчетах лучше использовать отношения между одними и теми же нотами в соседствующих октавах.
К примеру, частота любой ноты октавы n будет составлять ровно половину от частоты той же ноты октавы n + 1. Используя это соотношение, вы без труда сможете добавить в свою программу учет всех нот любой октавы без присутствия бесчисленных условных блоков.
Код:
print("%70s" % "Ноты:", "%20s" % "C, D, E, F, G, A, B.")
print("%70s" % "Октавы:", "%20s" % "0, 1, 2, 3, 4, 5, 6, 7, 8.")
note = input("%71s" % "Введите ноту и октаву (к примеру: C4 или B8): ")
C4 = 261.63; D4 = 293.66; E4 = 329.63; F4 = 349.23; G4 = 392.00; A4 = 440.00; B4 = 493.88 # можно записывать строки через ";", но лучше так не делать. Здесь очень подходящий случай.
base_digit = "4" # введена 4 для точки отсчёта
octave = "012345678" # октава может находится только среди этих чисел
try:
if note[0] == "C" and len(note) == 2 and note[-1] in octave: # условие, при кот. проверяется существование ноты, октавы, и длины ноты не более 2-х знаков. Если условие не будет выполнено, то не будет создана переменная для расчёта.
base = C4
elif note[0] == "D" and len(note) == 2 and note[-1] in octave:
base = D4
elif note[0] == "E" and len(note) == 2 and note[-1] in octave:
base = E4
elif note[0] == "F" and len(note) == 2 and note[-1] in octave:
base = F4
elif note[0] == "G" and len(note) == 2 and note[-1] in octave:
base = G4
elif note[0] == "A" and len(note) == 2 and note[-1] in octave:
base = A4
elif note[0] == "B" and len(note) == 2 and note[-1] in octave:
base = B4
if note[-1] == base_digit:
mgz = base
elif note[-1] < base_digit:
base_digit = int(base_digit)
digit = int(note[-1])
while digit != base_digit:
base_digit -= 1
base /= 2
mgz = base
elif note[-1] > base_digit:
base_digit = int(base_digit)
digit = int(note[-1])
while digit != base_digit:
base_digit += 1
base *= 2
mgz = base
print("%70s" % "Частота ноты:", round(mgz, 2))
except:
print("%70s" % "Была допущена ошибка в вводе.")