import streamlit as st
from gpiozero import PWMOutputDevice
from time import sleep

st.set_page_config(page_title="GPIO 鋼琴", layout="centered")

# =========================
# GPIO 初始化（只做一次）
# =========================
@st.cache_resource
def init_buzzer():
    return PWMOutputDevice(17)

buzzer = init_buzzer()

# =========================
# 音階設定（C 大調）
# =========================
NOTES = {
    "C": 262,
    "D": 294,
    "E": 330,
    "F": 349,
    "G": 392,
    "A": 440,
    "B": 494,
    "C5": 523
}

# =========================
# 播放音符
# =========================
def play_tone(freq, duration=0.3):
    buzzer.frequency = freq
    buzzer.value = 0.5   # 音量 (0~1)
    sleep(duration)
    buzzer.off()

# =========================
# UI
# =========================
st.title("🎹 Raspberry Pi GPIO 鋼琴")
st.write("點擊按鈕播放音符（GPIO17 被動蜂鳴器）")

cols = st.columns(len(NOTES))

for col, (note, freq) in zip(cols, NOTES.items()):
    with col:
        if st.button(note, use_container_width=True):
            play_tone(freq)

st.divider()

# =========================
# 安全停止（保護用）
# =========================
if st.button("🔇 停止蜂鳴器"):
    buzzer.off()