Пишем музыку на микроконтроллере ESP8266 с помощью языка Python.

В данном уроке мы напишем небольшую мелодию, используя раннее изученные уроки. Для написания мелодии мы будем использовать ШИМ, к которому подключим динамик. Значение резистора R1 — выбирается в зависимости от максимального тока транзистора и динамика. Динамик у меня от материнской платы, транзистор взял первый попавшийся n-p-n структуры, резисторы выбрал следующие:
R1 = 2.2 Ом.
R2 = 10 кОм.
R3 = 1 кОм.
Программный код:
from machine import Pin, PWM
import math
import time

melody = [
330, 330, 330, 262, 330, 392, 196, 262, 196, 165, 220, 247, 233, 220, 196, 330, 392,
440, 349, 392, 330, 262, 294, 247, 262, 196, 165, 220, 247, 233, 220, 196, 330, 392,
440, 349, 392, 330, 262, 294, 247, 392, 370, 330, 311, 330, 208, 220, 262, 220, 262,
294, 392, 370, 330, 311, 330, 523, 523, 523, 392, 370, 330, 311, 330, 208, 220, 262,
220, 262, 294, 311, 294, 262, 262, 262, 262, 262, 294, 330, 262, 220, 196, 262, 262,
262, 262, 294, 330, 262, 262, 262, 262, 294, 330, 262, 220, 196]

noteDurations = [
8,4,4,8,4,2,2,
3,3,3,4,4,8,4,8,8,8,4,8,4,3,8,8,3,
3,3,3,4,4,8,4,8,8,8,4,8,4,3,8,8,2,
8,8,8,4,4,8,8,4,8,8,3,8,8,8,4,4,4,8,2,
8,8,8,4,4,8,8,4,8,8,3,3,3,1,
8,4,4,8,4,8,4,8,2,8,4,4,8,4,1,
8,4,4,8,4,8,4,8,2
]

music=PWM(Pin(4))
music.duty(512)

for i in range(len(melody)):
noteDuration = 800/noteDurations[i]
music.freq(melody[i]*2)
time.sleep_ms(int(noteDuration * 1.30))

music.deinit()
Разберем данный текст. Сразу хочу сказать, что текст мелодии я взял из интернета, и так:
melody — ноты, частоты нот первой октавы:
ДО — 261,6 Гц     
До диез — 277 Гц
РЕ — 293,7 Гц
Ре диез — 311 Гц
МИ — 329,6 Гц
ФА — 349,2 Гц
Фа диез -370 Гц
СОЛЬ -392 Гц
Соль диез — 415 Гц
ЛЯ — 440 Гц
Ля диез — 416 Гц
СИ -494 Гц
Каждая следующая октава — частота увеличивается в два раза. 
noteDurations — длительность ноты.
Тут думаю понятно, что количество нот (melody ) и длительности этих нот (noteDurations ) равны.
Далее мы настраиваем ШИМ на 4 ножку со скаженностью 0,5:
music=PWM(Pin(4)) 
music.duty(512)
После мы проигрываем мелодию: вычисляем длину массива, для цикла
for i in range(len(melody)):
Дальше с учетом частоты работы тактовой частоты подгоняем частоту нот, паузы и длительности для воиспроизведения мелодии:
noteDuration = 800/noteDurations[i]
music.freq(melody[i]*2)
time.sleep_ms(int(noteDuration * 1.30))
В конце останавливаем работу ШИМ, тем самым прекращаем воиспроизведение мелодии:
music.deinit()