Для тех, кто не любит много читать 👉 код здесь
В этом примере будут использоваться термины из музыки.
Звук.
Звук — это колебание воздуха, характеризующееся частотой, измеряемой в герцах (Гц). Чем выше частота, тем выше звук. Простыми словами: Звук — это то, что мы слышим, когда что-то вибрирует (например, струна гитары или голосовые связки). Чем быстрее вибрация, тем выше звук.
Нота.
Нота — это символ, обозначающий конкретный звук определённой высоты. В музыке используются ноты с названиями: C (до), D (ре), E (ми), F (фа), G (соль), A (ля), B (си). Простыми словами: Нота — это "имя" звука. Например, нота A4 — это звук с частотой 440 Гц.
Интервал.
Интервал — это расстояние между двумя нотами, выраженное отношением их частот. Например, октава — это интервал с соотношением частот 2:1, квинта — 3:2, кварта — 4:3. Простыми словами: Интервал — это "промежуток" между двумя нотами. Например, если вы играете ноту C (до) и затем ноту G (соль), интервал между ними называется квинтой.
Полутон.
Полутон — это наименьший интервал в западной музыкальной системе. Например, расстояние между нотами C (до) и C# (до-диез) — это полутон. Простыми словами: Полутон — это "маленький шаг" между нотами. Например, на гитаре один лад — это полутон. В восточных культурах используют микротональные системы, где интервалы меньше полутона. Это когда между нотами есть ещё более мелкие шаги, которые создают уникальное звучание, непривычное для западного уха.
Тон.
Тон — это интервал, равный двум полутонам. Например, расстояние между нотами C (до) и D (ре) — это тон. Простыми словами: Тон — это "большой шаг" между нотами. Например, на гитаре два лада — это тон.
Октава.
Октава — это интервал между двумя нотами, где частота верхней ноты ровно в два раза больше частоты нижней. Например, нота A4 имеет частоту 440 Гц, а нота A5 (на октаву выше) — 880 Гц. Простыми словами: Октава — это "расстояние" между двумя нотами с одинаковыми названиями, но разной высотой. Например, если вы поете ноту C (до) низким голосом, а потом ту же ноту C, но высоким голосом, то между ними будет октава.
Гамма.
Гамма — это последовательность нот, выстроенных в восходящем или нисходящем порядке. В западной музыке наиболее распространена диатоническая гамма, состоящая из 7 нот с комбинациями целых тонов и полутонов. Простыми словами: Гамма — это "лестница" из нот, которая помогает создавать мелодии. Например, мажорная гамма звучит весело и ярко, а минорная — грустно и задумчиво. Мажорная гамма строится по интервалам: тон-тон-полутон-тон-тон-тон-полутон. Например, гамма C мажор: C, D, E, F, G, A, B, C. Минорная гамма строится по интервалам: тон-полутон-тон-тон-полутон-тон-тон. Например, гамма A минор: A, B, C, D, E, F, G, A.
Калькулятор
Функция calculate_frequency вычисляет частоту любой ноты в хроматической гамме, зная её порядковый номер относительно A4 (где A4 это 0). Она использует экспоненциальную зависимость, основанную на степени двойки, которая в музыке описывает частотные отношения нот в хроматическом строе.
Функция calculate_interval_ratio вычисляет отношение частот между двумя нотами, представленными их номерами в хроматической гамме. Она всегда возвращает отношение так, чтобы в результате получается число больше 1, то есть частота более высокой ноты делится на частоту более низкой ноты, вне зависимости от порядка, в котором были переданы номера нот. Таким образом, функция определяет математическое значение интервала между двумя нотами.
Функция calculate_tempo_duration вычисляет общую продолжительность музыкального фрагмента в секундах, основываясь на темпе (который здесь не используется непосредственно), длительности одного удара в секундах и общем количестве ударов. Она делает это путем простого умножения длительности удара на их количество.
Функция calculate_note_duration вычисляет длительность ноты в секундах на основе темпа (в BPM) и относительной длительности ноты (например, 0.25 для четвертной ноты). Она использует темп для определения длительности одного удара, а затем умножает её на длительность ноты для получения длительности ноты в секундах.
Функция calculate_rhythm_pattern вычисляет общую продолжительность ритмического паттерна, заданного списком длительностей нот и длиной такта. Она перебирает длительности нот, умножает каждую на длину такта, и суммирует их. Результат представляет собой общую длительность паттерна в единицах целых нот.
Функция calculate_note_number вычисляет номер ноты в хроматической гамме на основе ее частоты. Она использует логарифм по основанию 2 для определения разницы в октавах между заданной нотой и эталонной нотой A4, а затем умножает это значение на 12, чтобы получить разницу в полутонах. Результат округляется до ближайшего целого числа, так как ноты нумеруются целыми числами.
Функция generate_scale_frequencies создает список частот нот, образующих заданную гамму. Она принимает номер корневой ноты, шаблон гаммы, где каждый элемент представляет собой интервал в полутонах, и эталонную частоту ноты A4. Функция перебирает интервалы в шаблоне, вычисляет частоту каждой ноты в гамме с помощью функции calculate_frequency и добавляет её в результирующий список, который затем и возвращает.
Функция calculate_tuning_deviation вычисляет отклонение фактической частоты от целевой в процентах. Она предназначена для определения того, насколько точно настроен музыкальный инструмент или звук. Она возвращает положительное значение, если фактическая частота выше целевой, и отрицательное, если ниже.
Функция get_note_name преобразует номер ноты в хроматической гамме (где A4 имеет номер 0) в её строковое представление, включая название ноты (A, A#, B, C, C# и т.д.) и номер октавы. Она использует список названий нот и вычисляет октаву и индекс ноты в пределах октавы на основе номера ноты.
Функция get_note_info_from_freq принимает частоту ноты в герцах и выводит информацию о ноте, включая её частоту, название и номер в хроматической гамме. Она использует функции calculate_note_number и get_note_name для получения этой информации. Она предоставляет удобный способ узнать, какой ноте соответствует заданная частота.
Функция tune_instrument имитирует работу тюнера для музыкального инструмента. Она принимает целевую и фактическую частоты и, используя calculate_tuning_deviation, определяет, насколько фактическая частота отклоняется от целевой. На основе величины и знака отклонения, функция выводит пользователю сообщение с указанием, нужно ли повысить, понизить или не трогать настройку инструмента.
Функция note_name_to_number преобразует строковое представление имени ноты (например, "A4", "C#5", "Bb3") в ее числовой номер в хроматической гамме, где A4 имеет номер 0. Она использует регулярное выражение для разбора строки, находит индекс ноты в списке названий нот, вычисляет разницу октав и преобразует все это в целое число. Если формат имени ноты не соответствует ожидаемому, функция возвращает None.
Функция find_nearest_notes принимает частоту ноты и возвращает названия двух ближайших нот в хроматической гамме: нижней (той, у которой частота ниже заданной) и верхней (той, у которой частота выше заданной). Она использует формулу частоты ноты, а также функции math.floor, math.ceil и get_note_name для выполнения своей задачи.
Все примеры можно запустить в блокноте