3

101 игра на python. Музыкальный калькулятор

Серия 101 игра на python

Для тех, кто не любит много читать 👉 код здесь

В этом примере будут использоваться термины из музыки.

Термины

Звук.
Звук — это колебание воздуха, характеризующееся частотой, измеряемой в герцах (Гц). Чем выше частота, тем выше звук. Простыми словами: Звук — это то, что мы слышим, когда что-то вибрирует (например, струна гитары или голосовые связки). Чем быстрее вибрация, тем выше звук.

Нота.
Нота — это символ, обозначающий конкретный звук определённой высоты. В музыке используются ноты с названиями: 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 для выполнения своей задачи.

Все примеры можно запустить в блокноте

Удачи!

Программирование на python

940 постов12K подписчиков

Правила сообщества

Публиковать могут пользователи с любым рейтингом. Однако!


Приветствуется:

• уважение к читателям и авторам

• конструктивность комментариев

• простота и информативность повествования

• тег python2 или python3, если актуально

• код публиковать в виде цитаты, либо ссылкой на специализированный сайт


Не рекомендуется:

• допускать оскорбления и провокации

• распространять вредоносное ПО

• просить решить вашу полноценную задачу за вас

• нарушать правила Пикабу

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества