from machine import Pin, I2C, PWM
import ssd1306
import utime
i2c = I2C(0, scl=Pin(13), sda=Pin(12))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
buzzer = PWM(Pin(26))
# Перелік нот: індекс масиву визначає рівень висоти на екрані
scale = [523, 494, 440, 392, 349, 330, 294, 262] # C5 до C4
# Звукова доріжка (індекс ноти в гамі, тривалість)
track = [(7, 200), (5, 200), (3, 200), (1, 400), (3, 200), (1, 200), (0, 600)]
# Історія екрану (для відображення блоків)
history = []
def update_pianoroll(current_note_index):
oled.fill(0)
# Малюємо роздільні лінії звукових рівнів (сітку)
for y in range(0, 64, 8):
oled.line(0, y, 128, y, 1)
# Розраховуємо Y координату для поточної ноти
y_pos = current_note_index * 8
# Малюємо активний блок
oled.fill_rect(100, y_pos + 1, 20, 6, 1)
# Текстовий індикатор октави зліва
oled.text("C4-C5", 2, 2, 1)
oled.show()
print("Запуск PianoRoll візуалізатора...")
for note_idx, duration in track:
update_pianoroll(note_idx)
buzzer.duty(512)
buzzer.freq(scale[note_idx])
utime.sleep_ms(duration)
buzzer.duty(0)
utime.sleep_ms(50)