音樂播放器 ( 播放、暫停、停止、上下首、循環播放 )
這個範例會使用 Scratch 實作一個「音樂播放器」,音樂播放器的功能包含:播放、暫停、停止、上一首、下一首、循環播放、單首循環和顯示播放進度等功能。
快速導覽:
繪製角色造型
使用繪畫方式建立第一個角色「play」,負責控制音樂的播放、暫停和繼續播放,替角色繪製三組造型,造型名稱分別是 stop ( 黑色三角 )、play ( 綠色三角 ) 和 pause ( 兩條紅色直線 )。
使用繪畫方式建立第二個角色「stop」,負責將音樂停止,造型使用一個黑色正方形。
使用繪畫方式建立第三個角色「next」,負責播放下一首,造型使用一個兩個較薄的「向右」黑色三角形。
使用繪畫方式建立第四個角色「pre」,負責播放上一首,造型使用一個兩個較薄的「向左」黑色三角形。
使用繪畫方式建立第五個角色「repeat」,負責控制音樂的不循環、單首循環和全部循環,替角色繪製三組造型,造型名稱分別是 no ( 灰色停止循環標誌 )、one ( 黑色循環一次標誌 ) 和 all ( 黑色循環標誌 )。
使用繪畫方式建立第六個角色「line」,負責進度條的底色,造型繪製一個 382x15 的灰色長條形,對齊畫布中心。
使用繪畫方式建立第七個角色「line_color」,負責進度條的進度顏色,造型繪製一個 14x14 的橘色圓形,對齊畫布中心。
建立音樂角色並上傳音樂
使用繪畫方式建立第八個角色「music」,建立角色後,切換到「音效」頁籤,上傳自己要播放的音樂。
接著切換到「造型」頁籤,上傳幾首音樂就建立幾個造型,造型的順序必須對應音樂的順序,並使用「音樂長度」作為造型名稱。
在舞台上排列角色
八個角色都繪製完成後,按照下圖,在舞台上排列這八個角色。
程式原理 ( music )
編輯「music」角色的程式,從左側積木選單裡,建立一個名為「音樂時間清單」的函式,並勾選「執行完畢再更新畫面」,再來將會透過這個函式,「自動」快速紀錄目前的歌曲數量。
點擊綠旗時,新增一個變數 music_num 為 1,表示目前要播放的音樂為第一首,並根據 music_num 更換造型,同時使用函式紀錄所有造型名稱,紀錄完成後,清單的長度就是音樂的數量。
函式執行後,發送 stop 廣播訊號,並在接收到 stop 廣播訊號時,設定變數 state 為 stop ( 從左側積木裡新增一個變數 state ),且停止所有音效。
編輯收到廣播訊息 pause 和 play 的程式,使用「降低播放速度和靜音」模擬音樂暫停,並透過 state 的內容判斷音樂是否從頭開始播放。
新增一個名為「切換」的函式,「不用勾選」執行完畢再更新畫面。
使用接收廣播 next 和 pre 的做法,實作上一首和下一首的程式,不論是收到哪種訊號,都會先透過 music_num 變數取得播放的音樂項目號碼,接著根據號碼播放音樂。
程式原理 ( play )
編輯「play」角色的程式,內容大多是點擊角色後,改變造型並發送對應的廣播訊息,主要邏輯規則如下:
造型 | 目前狀態 | 點擊後的行為 |
---|---|---|
stop 造型 ( 黑色三角 ) | 停止狀態 | 廣播 play 後呈現 pause 造型 ( 紅色雙槓 )。 |
play 造型 ( 綠色三角 ) | 暫停狀態 | 廣播 play 後並呈現 pause 造型 ( 紅色雙槓 )。 |
pause 造型 ( 紅色雙槓 ) | 播放狀態 | 發送 pause 開始播放,並呈現 play 造型 ( 色三角 )。 |
程式原理 ( stop )
編輯「stop」角色的程式,點擊角色後廣播 stop。
程式原理 ( next )
編輯「next」角色的程式,點擊角色後廣播 next。
程式原理 ( pre )
編輯「pre」角色的程式,點擊角色後廣播 pre。
程式原理 ( repeat )
編輯「repeat」角色的程式,點擊綠旗時,預設使用 all 造型標示「全部循環」,並新增一個 repeat 變數,變數值為目前的造型名稱 ( all ),點擊角色後切換造型,再將 repeat 設定為目前的造型名稱。
程式原理 ( line )
編輯「line」角色的程式,點擊綠旗時進行定位和移到最下層 ( 避免蓋住進度顏色 ),接著加入畫筆積木,在收到 stop 廣播時,進行「蓋章」的動作並隱藏角色,就能在每次停止時,重置進度條「底色」。
程式原理 ( line_color )
編輯「line_color」角色的程式,首先是收到 stop 廣播時,將進度點移動到進度條最前方,圖層移動到最上層,並設定畫筆的顏色和粗細與造型相同。
當收到 play 廣播時,使用 step 變數表示「每一秒移動的距離」,計算方式為「灰色進度底色的長度,除以目前的音樂長度」,利用清單 music_time 搭配目前第幾首音樂的 music_num 就能讀取音樂長度,讀取每一秒移動的距離後,讓 line_color 每隔 0.5 秒移動半步 ( step/2 ),搭配畫筆的「下筆」,就能製作出音樂播放的進度條。
當進度條完成後,根據目前 repeat 變數的內容,決定接下來要繼續播放下一首、停止播放還是重複播放這一首。
完成效果
程式完成後,點擊綠旗,就可以透過音樂播放器的按鈕,控制音樂播放、暫停、停止、上一首、下一首、循環播放、單首循環和顯示播放進度。
範例解答
小結
雖然這個音樂播放器可以做到基本的控制,但美中不足的是不能「真正暫停」音樂,也不能讓音樂跳轉到指定的位置,不過整篇範例使用了不少有趣的技巧,例如造型名稱、廣播溝通、畫筆...等,是相當有意思的範例喔!
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~