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乐器相连
实验软件:

猜你喜欢

转载自blog.csdn.net/acktomas/article/details/84104701
今日推荐