Arduino播放midi文件

Posted

技术标签:

【中文标题】Arduino播放midi文件【英文标题】:Arduino play midi files 【发布时间】:2014-06-06 08:59:11 【问题描述】:

我已经组装了 8 位 DAC 并将其连接到我的 Arduino。我连接了扬声器到我的 DAC。现在我想知道如何播放 MIDI 文件。我发现了很多信息,但几乎所有信息都使用了一些盾牌。我找到的最好的是this。 读完后我复制粘贴了一些代码,所以它变成了

#include <avr/pgmspace.h>
byte sample[] PROGMEM = /*midi here*/;
int sampleSize = (sizeof(sample)-1);
int nextdata;
int sampleNUM=0;//current index

ISR(TIMER2_COMPA_vect) 
    nextdata = 127;
    nextdata += (127-pgm_read_byte_near(sample+sampleNUM));
    if (nextdata > 255)nextdata = 255;
    else if(nextdata < 0)nextdata=0;
    PORTA = nextdata;
    if (sampleNUM == sampleSize)sampleNUM = 0;
    else sampleNUM += 1;


void setup() 
    DDRA = 0xFF;
    cli();
    TCCR2A = 0;// set entire TCCR2A register to 0
    TCCR2B = 0;// same for TCCR2B
    OCR2A = 249;// = (1/44100) / ((1/(16*10^6))*8) - 1
    TCCR2B |= (1 << WGM12);
    TCCR2B |= (1 << CS11);   
    TIMSK2 |= (1 << OCIE2A);
    sei();//allow interrupts

void loop() 

我尝试使用教程中的应用程序转换音乐,甚至使用教程中的示例,但它只会产生白噪声

【问题讨论】:

看起来您正在将 midi 数据解释为示例音频数据。您需要构建一个音调振荡器,将 Midi 中的音符事件转换为字节流以发送到您的 DAC... 你需要一个软件合成器。而 Arduino 太弱了。 【参考方案1】:

我预计您的 DAC 无法驱动正常的扬声器负载。 (没有任何放大)

此外,您需要一个基本的软件合成器(如@CL 所述)——尽管我不同意,但 Arduino 能够处理这个问题。不过,您并不真的需要 DAC。

只需使用经过低通滤波的 pwm 信号(您在这里肯定需要放大 - 单个晶体管就可以解决问题),其中 pwm 基频必须比您想要产生的音调频率高 2 倍以上。 如果 pwm 基频较高,扬声器本身(机械和电子)可能已经是一个足够的滤波器

【讨论】:

以上是关于Arduino播放midi文件的主要内容,如果未能解决你的问题,请参考以下文章

Arduino Uno:从 Cubase 捕获 MIDI 以在按下 PLAY、STOP、RECORD 时打开 RECORDING 标志

合并 Arduino 草图 (MIDI)

从 Arduino Yun 上的 USB 接口获取 MIDI 音符

用于 Arduino 的 Korg Nanokey MIDI 控制器?

使用 Arduino 发送 MIDI SysEx 消息?

为啥 Arduino Midi 库将十六进制 F7 读取为 0