Створення піаніно на Python без Tkinter: Консольна розробка для Windows

Створюємо музичний інструмент у терміналі: Консольне піаніно на Python

Чи замислювалися ви, як професійні розробники створюють інструменти, що працюють виключно в терміналі? Сьогодні ми відійдемо від графічних вікон і навчимося робити консольне піаніно. Цей проєкт ідеально демонструє, як обробляти натискання клавіш у реальному часі та працювати з системними звуками.


Чому ми не використовуємо Tkinter?

Графічні інтерфейси (GUI) — це круто, але іноді вони відволікають від самої логіки коду. Робота в консолі дозволяє:

  • Глибше зрозуміти низькорівневе введення даних.
  • Навчитися використовувати словники (dictionaries) для оптимізації коду.
  • Створити максимально швидкий застосунок, що не потребує графічних ресурсів.

Математична основа: Частоти нот

Перш ніж писати код, нам потрібні дані. Звук — це фізична хвиля, і кожна нота має свою частоту. Ми використаємо першу октаву:

КлавішаНотаЧастота (Гц)
AC (До)261
SD (Ре)293
DE (Мі)329
FF (Фа)349
GG (Соль)392
HA (Ля)440
JB (Сі)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)

Щоб закріпити навички, спробуйте вдосконалити програму:

  1. Додайте другу октаву: Використайте клавіші W, E, R, T, Y... для вищих звуків.
  2. Захист від помилок: Додайте звуковий сигнал помилки, якщо користувач натискає клавішу, якої немає в списку.
  3. Випадкова мелодія: Напишіть функцію, яка при натисканні клавіші R (Random) грає випадкову послідовність нот.

Висновок

Консольне програмування — це база, на якій тримається вся цифрова індустрія. Створення такого піаніно навчає головному: як перетворити фізичну дію (натискання клавіші) на цифровий сигнал (звук).

Маєте питання по коду? Пишіть у коментарях, розберемося разом!

,