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

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

最佳答案

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

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

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

07-26 06:28