作品名稱:簡易鋼琴
組員:賴廷軒、陳德榮、侯庭鈞
作品說明:
專案動機
開展這個按鍵樂器專案的動機是源於對音樂和科技的熱愛,以及對創意製作的渴望。這個專案旨在將音樂和電子裝置結合,通過創造一個互動式的音樂裝置,讓人們更輕鬆地接觸和享受音樂。
應用場景
按鍵樂器作為一種互動式音樂裝置,可以在許多場景中得到應用。它可以用作音樂愛好者的個人娛樂裝置,也可以在學校、音樂教育機構或家庭中作為一種教育工具。此外,它還可以成為藝術表演和音樂活動中的互動展示品。
專案目標
透過這個按鍵樂器專案,我們的目標是建立一個簡單易用且具有娛樂性的音樂裝置。我們希望能夠讓使用者通過按下按鍵來發出不同的音調。
成品照片:
程式碼:
#include "pitches.h" // 包含音調庫
// 定義按鍵的引腳
const int buttonPin1 = 2;
const int buttonPin2 = 3;
const int buttonPin3 = 4;
const int buttonPin4 = 5;
const int buttonPin5 = 6;
const int buttonPin6 = 7;
const int buttonPin7 = 8;
// 定義揚聲器引腳
const int speakerPin = 9;
// 初始化按鍵和揚聲器狀態
int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;
int buttonState4 = 0;
int buttonState5 = 0;
int buttonState6 = 0;
int buttonState7 = 0;
void setup() {
// 設定按鍵引腳為輸入並啟用內建上拉電阻
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(buttonPin3, INPUT_PULLUP);
pinMode(buttonPin4, INPUT_PULLUP);
pinMode(buttonPin5, INPUT_PULLUP);
pinMode(buttonPin6, INPUT_PULLUP);
pinMode(buttonPin7, INPUT_PULLUP);
// 設定揚聲器引腳為輸出
pinMode(speakerPin, OUTPUT);
}
void loop() {
// 讀取按鍵的狀態(按下時為低電平)
buttonState1 = digitalRead(buttonPin1);
buttonState2 = digitalRead(buttonPin2);
buttonState3 = digitalRead(buttonPin3);
buttonState4 = digitalRead(buttonPin4);
buttonState5 = digitalRead(buttonPin5);
buttonState6 = digitalRead(buttonPin6);
buttonState7 = digitalRead(buttonPin7);
// 檢測按鍵是否按下,如果按下則播放對應的音調
if (buttonState1 == LOW) { // 按下按鈕時,狀態為LOW
tone(speakerPin, NOTE_C5); // 按下按鈕1時,播放C5音調
} else if (buttonState2 == LOW) {
tone(speakerPin, NOTE_D5); // 按下按鈕2時,播放D5音調
} else if (buttonState3 == LOW) {
tone(speakerPin, NOTE_E5); // 按下按鈕3時,播放E5音調
} else if (buttonState4 == LOW) {
tone(speakerPin, NOTE_F5); // 按下按鈕4時,播放F5音調
} else if (buttonState5 == LOW) {
tone(speakerPin, NOTE_G5); // 按下按鈕5時,播放G5音調
} else if (buttonState6 == LOW) {
tone(speakerPin, NOTE_A5); // 按下按鈕6時,播放A5音調
} else if (buttonState7 == LOW) {
tone(speakerPin, NOTE_C6); // 按下按鈕7時,播放C6音調
} else {
noTone(speakerPin); // 如果沒有按下按鍵,則停止播放音調
}
delay(50);
}
函式庫(pitches.h):
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
心得:
賴廷軒:
一開始預計於段考後先有一份初始的架構及草稿出來,但因為遭遇0403地震,而不得已將計畫往後延。爾後因為地震緣故採線上教學,彼此不在宿舍中難免不好交談與討論,看似簡單的一份專題似乎變成操作上的困難。不過仍舊迎刃而解,三人分配1.網站上的網頁報告、2.期末報告ppt、3.報告內容講解,而組裝的部分主要由我完成(畢竟材料都在我這),而其他兩位隊員分別負責程式碼的問題及接線路上的問題,其實意外地還蠻有效率的,畢竟剛好三位各個擅長的領域都不同,並且又能相互輔佐。總體而言,我認為分工合作以完成一份專題報告是難能可貴的一件事,其中涉及組員間的相互配合,並且能夠傾聽隊員間的建議,最終得以完成只專屬於我們自己的報告。
陳德榮:
對於這個鍵盤樂器項目而言,確實其復現的難度而言並不會很高,但是考慮到這學期的特殊情況下,在項目上的溝通往來會比以往來得困難,所以只能保有基礎項目的功能(按按鈕發出固定音高)而捨棄多餘的擴充功能。在這個項目上也是有遇到意料之外的困難,我們發現因為電流的雜訊會影響到蜂鳴器的運作是未曾想到的。我感覺甚至對這個項目感到抱歉,沒有讓他使出全力呢。
侯庭鈞:
我們利用Arduino製作了一個簡易鋼琴,過程中學到了很多有關Arduino的知識。這個鋼琴是利用按鈕控制蜂鳴器發出不同的音調。在這個項目中,我們重溫了許多Arduino程式設計的基礎知識。在製作過程中,我們遇到了線材不足的問題,這使我們討論並找到最佳的解決方案。這個過程讓我們加深了對Arduino接線基礎的理解,還讓我們更加熟悉了Arduino在應用中的基本操作。最後,我們不僅掌握了更多Arduino的應用技巧,還學會了在面對問題時如何靈活應對和解決。