首页 文章

Arduino播放midi文件

提问于
浏览
1

我组装了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

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

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

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

相关问题