我已组装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() {}
我尝试使用教程中的应用程序转换音乐,甚至使用教程中的示例,但它只会产生白噪声
答案 0 :(得分:0)
我希望您的DAC无法驱动正常的扬声器负载。 (没有任何放大)
此外,你需要一个基本的软件合成器(如@CL所述) - 虽然我不同意,Arduino能够处理它。虽然,你真的不需要DAC。
只需使用低通滤波的pwm信号(这里你肯定需要放大 - 单个晶体管可以做到这一点),其中pwm基频必须比你想要产生的音调频率高2倍。 如果pwm基频很高,扬声器本身(机械地和电子地)可能已经是一个足够的滤波器