1. 程式人生 > >13. 製作光電子琴與MIDI電子鼓

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樂器相連
實驗軟體: