13. 製作光電子琴與MIDI電子鼓
發聲體和聲音
揚聲器(speaker)和蜂鳴器(piezo transducer)
piezoelectric(壓電感應)
音訊:振動的頻率
音高(pitch):聲音的頻率(音訊)高低
tone()指令:
tone(輸出埠, 頻率, 持續時間);
或 tone(輸出埠, 頻率),若不指定時間,Arduino將持續發聲,直到執行noTone()為止。
動手做 13-1 演奏一段馬里奧旋律
程式程式碼:
const byte SP_PIN = 11; void setup() { pinMode(SP_PIN, OUTPUT); } void loop() { tone(SP_PIN, 659, 150); //彈出一個E5音高的四分音符 delay(150); tone(SP_PIN, 659, 150); delay(150); tone(SP_PIN, 659, 150); delay(300); tone(SP_PIN, 523, 150); delay(150); tone(SP_PIN, 659, 150); delay(150); tone(SP_PIN, 784, 150); delay(3000); }
使用#define 替換資料
在上面的程式加入如下:
#define E5 659
#define C5 523
#define G5 784
#define和const都能用一個名稱來代表數值
const byte LED_PIN = 13;
#define LED_PIN 13
當定義陣列常量時,只能用const。
輸出高品質的音效
自然界或樂器所發出的聲音,是由多種不同頻率的正弦波組成的複合波,而tone()指令僅能輸出固定的方波,音質無法媲美樂器,可參考幾個擴充套件模組。
- Adafruit 的Wave Shield for Arduino Kit
- Sparkfun的MP3 Player Shield
- BabbleShield
- SpeakJet Shield
13-4 認識反射型與遮光型光電開關
- 反射型光電開關: 又稱為反射型感測器,由一個紅外線發射LED以及一個光敏電晶體(紅外線接收器)所組成,它們的外觀和一般的LED一樣,它採用的是將發射和接收組裝在一個模組的反射型光電開關。
- 感測器裡的LED能發射紅外線光,若感測器前方有高反射的物體(如:白紙),紅外線光將被折射,由光敏電晶體接收,而電晶體發射極將輸出高電位,相反地,若前方沒有物體或者是低反射的物體(如黑紙),光敏電晶體將收不到紅外線光,因而輸出低電位。
- 這種元器件可應用在檢測條形碼,或者像上圖一樣,在一個圓盤上繪製黑色條紋(稱為圓盤編碼器),安裝在電機或其他驅動機械上,可以檢測物體的旋轉角度或者轉動圈數。發射型光電開關和被感測物體的距離,應介於1~8mm,2.5mm的效果最好。
- 另一種稱為遮光型光電開關的感測器,也常見於微電腦自動控制裝置。
動手做13-2 光電子琴製作
實驗說明: 本節將採用紅外線感測器當做“琴鍵”通過感應紙張上的黑白條紋,讓Arduino發出對應的音調。
MIDI資訊格式
MIDI外設以31.25kbps的速率來發送TTL形式(也就是5V代表高電位)的序列資料。一個MIDI資訊通常由3個位元組資料構成,分別代表狀態(status)、音高(pitch)和強弱(velocity,按下按鍵時的力量強弱)。MIDI資訊的3個位元組資料:MIDI的頻道號從00001111共16組,音高編號與強弱的資料位元組的最高位始終為0,因此有效的數值範圍是0127
動手做13-3 通過Arduino演奏MIDI音樂
實驗說明: 製作一個MIDI OUT(輸出)介面,從Arduino板傳輸MIDI資訊給電腦音源發出音樂。
實驗電路: MIDI介面採用5針DIN插座,此元器件的引腳比較不易插入麵包板,建議先在它的引腳焊接導線
實驗程式: 程式採用SoftwareSerial(軟體串列埠)擴充套件庫,將從中央C的前一個八度音到它的後一個八度音,依序彈奏每一個音符。
#include <SoftwareSerial.h> //
byte note;
SoftwareSerial MIDI(2, 3); //
void midiMsg(byte cmd, byte pitch, byte velocity) {
MIDI.write(cmd); //狀態資訊,write()指令用於在
MIDI.write(pitch); //音高值
MIDI.write(velocity); //強弱值
}
void setup() {
MIDI.begin(31250); //串列埠連線要設定成MIDI的傳輸速率
}
void loop() {
for (note = 48; note < 84; note ++) {
midiMsg(0x90, note, 0x40); //送出“按下琴鍵”及其他資訊。
delay(100);
midiMsg(0x80, note, 0x00); //
delay(1000);
}
}
實驗結果: 編譯並下載程式之後,將Arduino的MIDI輸出介面與電腦的MIDI 轉接線的“IN”相連,再開啟“虛擬MIDI鍵盤”軟體。
通過MIDI資訊更換音色
動手做13-4 通過“虛擬MIDI”介面演奏音樂
**實驗說明:**想必讀者一定感到納悶,既然MIDI介面採用序列聯機,那為何我們不直接通過既有的介面,把MIDI資訊傳給電腦,通過音源軟體發聲呢?沒問題!只要在電腦上安裝“串列埠轉MIDI橋接器”軟體,讓電腦把指定的串列埠看待成MIDI適配卡就可以了!當然,如果要將Arduino直接和其他MIDI樂器相連
實驗軟體: