[dev-session] 2026-04-25 修 bug、真實鋼琴音源、以及一些網站清理
今天的開發日誌,寫給自己看,方便回顧決策與取捨。以下按優先度整理今天修復與改進的項目與原因,讓未來同樣的問題不再反覆發生。
-
piano #23:音量沒反應的 bug 根本原因是在 AudioControls 這個元件裡,自己又呼叫 useAudioEngine 建了第二個引擎實例,導致改動的其實是影子引擎。這種錯動讓玩家的音量操作看似有效,實際上作用在另一個不存在的「鬼引擎」上。修法很直接:把 AudioControls 改成 props-driven,共享同一個 engine 實例,確保音量控制是針對同一個音源。
-
piano #24:引入 Tone.js Sampler,載入真實的鋼琴音源 換上 MusyngKite 的 acoustic grand piano 真實音源,透過 Tone.js 的 Sampler 來載入與觸發,告別過去合成振盪器帶來的機械感與局限。這次變更不只是聲音的改變,同時也讓音色的參數與控制介面對映更直覺,方便之後的使用者體驗微調。
-
dev-log #9:清理遺留內容 清除專案中仍留著的 Daniel Adrian 的相關影子與檔案,順便把 Privacy Policy 與 Terms of Service 這兩個頁面中已經不再使用的內容整併刪除,避免混淆入口與維護成本。
-
dev-log #10/#11:美化與可讀性 補上文章的縮圖欄位描述,重寫段落讓語氣更貼近人話,讓日誌讀起來像是同事彼此間的對話而非機械敘述。
-
dev-log #12:規範與準則落地 新增 AGENTS.md,正式規定今後每篇文章都必須有縮圖、文風要貼近人話,方便後續維護與社群閱讀。
結語與展望 目前整個系統的音色控制與 UI 程式碼仍在穩定過渡期,音源替換帶來的新鮮感需要更細的調整與界面提示。接下來的工作重心,會放在進一步優化音色控管的暴露介面、加強快捷鍵與 UI 反饋,以及針對行動裝置做出更友善的排版。
現在的狀態是:核心功能穩定,音源品質提升、文件與規範更加清晰。下一步打算把音色切換、音符動態與音量的聯動做成更一致的互動,並再度檢查所有入口頁面的清晰度與可訪問性。若時間允許,也會開啟更多 UI 改善,讓整個開發日誌系統更易於維護與閱讀。
— 本次更新的重點整體是為了讓開發與內容管理更有序,同時把聽感與可讀性雙向提升,讓專案長期維護更高效。
臨時 Bug 修復 Session
-
piano #27: 鋼琴完全無聲 —
- 根本原因: Tone.js Sampler 在 component mount 時建立 AudioContext,被 browser autoplay policy 封鎖
- 修法: 在 samplerEngine.initialize() 第一行加入 await Tone.start(),確保在 user gesture 後才解鎖 AudioContext
- 教訓: Web Audio API 的 autoplay policy 不只影響
-
dev-log #15: 縮圖無法顯示 —
- 根本原因: Content Security Policy 的 img-src 只允許 self 和 Cloudinary,Unsplash URL 被封鎖
- 診斷方法: 用瀏覽器直接測試,在 console 看到 CSP violation 錯誤
- 修法: 1) 在 astro.config.mjs CSP 加入 images.unsplash.com 2) 同時改用本地 SVG 縮圖更穩固
- 教訓: 外部 CDN 圖片不可靠,優先使用自托管圖片