Створюємо музичний інструмент у терміналі: Консольне піаніно на Python
Чи замислювалися ви, як професійні розробники створюють інструменти, що працюють виключно в терміналі? Сьогодні ми відійдемо від графічних вікон і навчимося робити консольне піаніно. Цей проєкт ідеально демонструє, як обробляти натискання клавіш у реальному часі та працювати з системними звуками.
Чому ми не використовуємо Tkinter?
Графічні інтерфейси (GUI) — це круто, але іноді вони відволікають від самої логіки коду. Робота в консолі дозволяє:
- Глибше зрозуміти низькорівневе введення даних.
- Навчитися використовувати словники (dictionaries) для оптимізації коду.
- Створити максимально швидкий застосунок, що не потребує графічних ресурсів.
Математична основа: Частоти нот
Перш ніж писати код, нам потрібні дані. Звук — це фізична хвиля, і кожна нота має свою частоту. Ми використаємо першу октаву:
| Клавіша | Нота | Частота (Гц) |
| A | C (До) | 261 |
| S | D (Ре) | 293 |
| D | E (Мі) | 329 |
| F | F (Фа) | 349 |
| G | G (Соль) | 392 |
| H | A (Ля) | 440 |
| J | B (Сі) | 493 |
Повний код проєкту
Нижче наведено чистий та прокоментований код. Він використовує стандартні модулі Windows, тому не потребує встановлення додаткових бібліотек.
Python
import winsound
import msvcrt
import sys
# 1. Налаштування бази даних (Клавіша -> Частота)
# Використовуємо байтові рядки b'', бо msvcrt зчитує символи саме так
piano_keys = {
b'a': 261, # C
b's': 293, # D
b'd': 329, # E
b'f': 349, # F
b'g': 392, # G
b'h': 440, # A
b'j': 493, # B
}
def start_piano():
print("========================================")
print(" PYTHON CONSOLE PIANO - СТУДІЯ")
print("========================================")
print(" Керування: A S D F G H J")
print(" Вихід: клавіша 'Q'")
print("----------------------------------------")
while True:
# Перевіряємо, чи натиснута будь-яка клавіша
if msvcrt.kbhit():
# Отримуємо код натиснутої клавіші
key = msvcrt.getch().lower()
# Умова виходу
if key == b'q':
print("\n\nПрограма завершена. До нових зустрічей!")
break
# Перевіряємо, чи є ця клавіша в нашому піаніно
if key in piano_keys:
hz = piano_keys[key]
# Виводимо назву ноти та частоту в один і той самий рядок (\r)
print(f" Граємо: {hz} Гц ", end='\r')
winsound.Beep(hz, 250) # частота та тривалість (250 мс)
if __name__ == "__main__":
start_piano()
Розбір найкращих практик (Best Practices)
1. Використання словників замість if-else
Ми не пишемо if key == 'a': ... elif key == 's': .... Це поганий тон. Словник piano_keys дозволяє миттєво знайти потрібну частоту за ключем. Це робить код швидшим і чистішим.
2. Реальний час з msvcrt
Зазвичай функція input() зупиняє програму і чекає на Enter. У нашому випадку це не підходить для музичного інструменту. Модуль msvcrt дозволяє зчитувати натискання клавіші миттєво, що критично для анімацій та ігор.
3. Чистий термінал
Використання end='\r' у функції print дозволяє оновлювати інформацію в одному рядку. Це не створює довгу “стрічку” тексту і виглядає як професійний інтерфейс.
Завдання для самостійної роботи (Challenge)
Щоб закріпити навички, спробуйте вдосконалити програму:
- Додайте другу октаву: Використайте клавіші
W, E, R, T, Y...для вищих звуків. - Захист від помилок: Додайте звуковий сигнал помилки, якщо користувач натискає клавішу, якої немає в списку.
- Випадкова мелодія: Напишіть функцію, яка при натисканні клавіші
R(Random) грає випадкову послідовність нот.
Висновок
Консольне програмування — це база, на якій тримається вся цифрова індустрія. Створення такого піаніно навчає головному: як перетворити фізичну дію (натискання клавіші) на цифровий сигнал (звук).
Маєте питання по коду? Пишіть у коментарях, розберемося разом!