arduino教程- 14.制作光电子琴与MIDI电子鼓

2019-04-14 15:23发布

class="markdown_views prism-dracula">

文章目录

发声体和声音

扬声器(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能发射红外线光,若传感器前方有高反射的物体(如:白纸),红外线光将被折射,由光敏晶体管接收,而晶体管发射极将输出高电位,相反地,若前方没有物体或者是低反射的物体(如黑纸),光敏晶体管将收不到红外线光,因而输出低电位。
  • 这种元器件可应用在检测条形码,或者像上图一样,在一个圆盘上绘制黑 {MOD}条纹(称为圆盘编码器),安装在电机或其他驱动机械上,可以检测物体的旋转角度或者转动圈数。发射型光电开关和被感测物体的距离,应介于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 // 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信息更换音 {MOD}

动手做13-4 通过“虚拟MIDI”接口演奏音乐

**实验说明:**想必读者一定感到纳闷,既然MIDI接口采用串行联机,那为何我们不直接通过既有的接口,把MIDI信息传给电脑,通过音源软件发声呢?没问题!只要在电脑上安装“串口转MIDI桥接器”软件,让电脑把指定的串口看待成MIDI适配卡就可以了!当然,如果要将Arduino直接和其他MIDI乐器相连
实验软件: