多功能數位電子琴
宜蘭縣第八屆scratch競賽國小外部感應器組題目:電子琴
請各位同學設計一個可以單奏出音階的樂器
遊戲基本玩法:
1.請以按鈕設計一個可以擁有七個音階的樂器
2.樂器的聲音必需以蜂鳴器模組發聲
3.每一個音階RGB LED必須對應顯示一種顏色
4. 一開始可以選擇4種模式
5.第一種模式是彈奏模式,依所按的按鈕發出音階,與點亮RGB LED顏色0.5秒
6.第二種模式是演出版亂彈模式,隨便按哪個按鈕都能正確演奏出一首歌,RGB LED同時要依音階顯示顏色。
7.第三種是練習教學模式,演奏每個音後等待按鈕輸入,輸入正確就亮綠燈0.5秒,錯誤就亮紅燈0.5秒。
8.第四種是彈奏紀錄模式,紀錄每個彈奏的聲音,當同時按下第一與第二按鈕時結束紀錄,並撥放剛剛彈奏的音樂。
————————–
參考解答(沒有標準答案)
硬體:chromebook(或PC、MAC)+arduino UNO+麵包板+按鈕開關+RGB LED+蜂鳴器
軟體:scratch2+WFduino
一、接線圖:
「按鍵(按鈕)」請參考:http://blog.ilc.edu.tw/blog/blog/868/post/97509/685217
「RGB LED」請參考:http://blog.ilc.edu.tw/blog/blog/868/post/97509/638508
「蜂鳴器」請參考:http://blog.ilc.edu.tw/blog/blog/868/post/97509/638509
「按鍵」一邊接地(GND),另一邊接一條訊號線到數位腳當作判斷輸入訊號。
Do、Re、Me、Fa、So、La、Si共7個音分別接數位腳D2、D3、D4、D5、D6、D7、D8。
還有一顆「停止鍵」接數位腳D12
共陰極「RGB LED」為了避免電流太大,負極接地前先接一顆電阻,其他三支腳分別接D9(藍)、D10(綠)、D11(紅)。
「蜂鳴器」的正極(長腳)接數位腳D13,負極接GND。
(這裡用便宜的有源蜂鳴器,發出的音調有點不準)
二、程式說明
螢幕主畫面
主要畫面由舞台的造型來設定改變。
左邊的變數資料可以方便檢測程式執行是否正確,正式啟用時可以在[資料變數]欄位上取消打勾,就可以去掉,讓畫面更完整。
舞台程式:
程式一開始先宣告各腳位的模式。
D2、D3、D4、D5、D6、D7、D8、D12是「按鍵(按鈕)」,使用[INPUT_PULLUP](上拉電阻)。
D9、D10、D11是共陰極「RGB LED」使用[OUTPUT]
D13是「蜂鳴器」使用[OUTPUT]
[等待一秒]:程式原來內定所有腳位為OUTPUT,現在更改,需要給電腦時間做設定更改。
建立四個角色分別執行四種功能。
使用[廣播訊息]積木,當執行某種功能模式時,舞台造型就進行切換。
[彈奏模式](一般電子琴) 腳色程式:
使用[廣播訊息]積木,當執行某種功能模式時,腳色造型就進行切換。
循環執行檢查哪一個按鍵被按下,直到按下停止鍵(D12),結束這個功能,返回[重新開始]模式。
如果按下對應的音調按鍵,就依所按的按鈕發出音階,與點亮RGB LED顏色0.5秒,然後關閉所有顏色輸出。
[演出版亂彈模式](亂彈小星星)腳色程式:
使用[廣播訊息]積木,當執行某種功能模式時,腳色造型就進行切換。
[循環無限次]:如果停止鍵被按下(D12=0),就結束這個功能,返回[重新開始]模式。
[循環無限次]:檢查有沒有按鍵被按下,如果有任意一個按鍵被按下,就演奏出一首歌,RGB LED同時要依音階顯示顏色。
使用[製作一個積木]:
一般歌曲都會有一些重複的曲段,因此將歌曲分成數段,使用[製作一個積木],將重複部分自訂成積木,可以縮短程式。
以小星星為例,主要分成3段,各用了2次。
主程式變得很簡短。
註:如果使用[製作一個積木]來寫程式的好處就是程式比較有規律,修改、除錯都比較容易。
因為要對應依音階顯示顏色,所以製作的積木顯得有點複雜,每一個音都要跟著調整顏色。
[練習教學模式]腳色程式:
使用[廣播訊息]積木,當執行某種功能模式時,腳色造型就進行切換。
[循環無限次]:如果停止鍵被按下(D12=0),就結束這個功能,返回[重新開始]模式。
[循環無限次]:執行演奏每個音後等待按鈕輸入,輸入正確就亮綠燈0.5秒,錯誤就亮紅燈0.5秒。
建立[按鍵]變數,儲存按下的按鍵代號。
建立[演奏音]變數,儲存按下的演奏音代號。
[變數(演奏音)設為隨機取數(2)到(8)]:Do、Re、Me、Fa、So、La、Si共7個音分別接數位腳D2、D3、D4、D5、D6、D7、D8。隨機選取一個(演奏音)。
[如果演奏音=( )那麼( )]:依照音調代碼發出對應的聲音音階。
等待按下按鍵
依照按下按鍵,設定變數[按鍵]的數值代號。
如果(按鍵)=(演奏音)那麼亮綠燈0.5秒,否則亮紅燈0.5秒,然後關燈。
重複上面的流程,直到停止鍵被按下。
[彈奏紀錄模式]腳色程式:
原題目 [ 同時按下第一與第二按鈕時結束紀錄],難度太高,稍微修改一下題目,改成[當按下停止鍵時結束紀錄]
使用[廣播訊息]積木,當執行某種功能模式時,腳色造型就進行切換。
建立[彈奏紀錄]清單,儲存按下的按鍵代號。
[刪除第(全部)項目(彈奏紀錄)]:先清除原來儲存的清單資料。
[循環無限次]:執行紀錄每個彈奏的聲音
等待按下按鍵
依照按下按鍵,發出對應的聲音,並設定變數[按鍵]的數值代號。
[新增項目(按鍵)(彈奏紀錄)],將按下的按鍵代號儲存到[彈奏紀錄]清單。
[循環無限次]:如果停止鍵被按下(D12=0),就廣播[播音]程式。
[當收到訊息(播音)]:依照[彈奏紀錄]清單內的資料撥放剛剛彈奏的音樂,然後結束這個功能,返回[重新開始]模式。
[循環(清單彈奏紀錄的項目數)次]:將彈奏紀錄清單儲存的音階資料依序播放出來。
[變數(演奏音)設為(清單第N項彈奏紀錄)]:取出彈奏紀錄清單第N項紀錄設為變數(演奏音)
[如果演奏音=( )那麼( )]:依照音調代碼發出對應的聲音音階。
彈奏紀錄清單播完,就結束這個功能,返回[重新開始]模式。
——————————————–
相關連結:
新DiFi課程目錄
http://blog.ilc.edu.tw/blog/blog/868/post/104089/678192
WFduino(Arduino)課程目錄
http://blog.ilc.edu.tw/blog/blog/868/post/97509/641433