Пишем код
Нам понадобятся 2 функции: одна для воспроизведения конкретной ноты, а вторая - для воспроизведения всей мелодии.
Воспроизводим ноту
def play_note(note, duration):
notes = {
'C4': 261,
...
}
# Пауза - это тоже часть нотной записи
if note == 'delay':
time.sleep(duration / 1000)
else:
winsound.Beep(notes[note], duration)
Воспроизводим мелодию
def play_melody(notes, bpm):
"""Воспроизводит мелодию из набора нот с заданным темпом.
Args:
notes: Набор нот. Каждая нота - кортеж вида (note, duration)
bpm: Темп, то есть количество "ударов" в минуту.
"""
for note, value in melody:
# Не будем слишком подробно останавливаться
# на механике перевода BPM в миллисекунды
duration = int(value * 4 * 1000 * (60 / bpm))
play_note(note, duration)
Наслаждаемся результатами
Оригинальный темп мелодии - 103 BPM.
play_melody(melody, 103)
Полный код
import winsound
import time
def play_note(note, duration):
notes = {
'C4': 261,
'D4': 294,
'E4': 330,
'F4': 349,
'G4': 392,
'G4#': 415,
'A4': 440,
'A4#': 466,
'C5': 523,
'C5#': 554,
'D5': 587,
'D5#': 622,
'E5': 659,
'F5': 698,
'F5#': 740,
'G5': 784,
'G5#': 830,
'A5': 880,
}
if note == 'delay':
time.sleep(duration/1000)
else:
winsound.Beep(notes[note], duration)
def play_melody(notes, bpm):
for note, value in melody:
duration = int(value * 4 * 1000 * (60 / bpm))
play_note(note, duration)
melody = (
('A4', 1/4), ('A4', 1/4), ('A4', 1/4),
('F4', 3/16), ('C5', 1/16), ('A4', 1/4),
('F4', 3/16), ('C5', 1/16), ('A4', 1/2),
('E5', 1/4), ('E5', 1/4), ('E5', 1/4),
('F5', 3/16), ('C5', 1/16), ('G4#', 1/4),
('F4', 3/16), ('C5', 1/16), ('A4', 1/2),
('A5', 1/4), ('A4', 3/16), ('A4', 1/16),
('A5', 1/4), ('G5#', 3/16), ('G5', 1/16),
('F5#', 1/16), ('F5', 1/16), ('F5#', 1/8),
('delay', 1/8), ('A4#', 1/8), ('D5#', 1/4),
('D5', 1/6), ('C5#', 1/16),
('C5', 1/16), ('A4#', 1/16), ('C5', 1/8),
('delay', 1/8), ('F4', 1/8), ('G4#', 1/4),
('F4', 3/16), ('A4', 1/16), ('C5', 1/4),
('A4', 3/16), ('C5', 1/16), ('E5', 1/2),
('A5', 1/4), ('A4', 3/16), ('A4', 1/16),
('A5', 1/4), ('G5#', 3/16), ('G5', 1/16),
('F5#', 1/16), ('F5', 1/16), ('F5#', 1/8),
('delay', 1/8), ('A4#', 1/8), ('D5#', 1/4),
('D5', 3/16), ('C5#', 1/16),
('C5', 1/16), ('A4#', 1/16), ('C5', 1/8),
('delay', 1/8), ('F4', 1/8), ('G4#', 1/4),
('F4', 3/16), ('C5', 1/16), ('A4', 1/4),
('F4', 3/16), ('C4', 1/16), ('A4', 1/2),
)
play_melody(melody, 103)