Arduino播放midi文件

时间:2014-06-06 08:59:11

标签: audio arduino midi electronics

我已组装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() {}

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

1 个答案:

答案 0 :(得分:0)

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

此外,你需要一个基本的软件合成器(如@CL所述) - 虽然我不同意,Arduino能够处理它。虽然,你真的不需要DAC。

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