多功能數位電子琴

宜蘭縣第八屆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

roc

宜蘭縣國小資訊小站

您可能也會喜歡…