2017-03-08 214 views
0

我尝试编写一个带有6个扬声器的Arduino播放的小歌。这个过程应该是,我打开频率上的不同说话者并计算音符的持续时间。如果持续时间结束,我播放下一个声音或转动扬声器。我为6个扬声器定义了不同的阵列。此外,我还有很多关于音符频率的定义以及持续时间。用Arduino播放音乐

问题是,我只是得到一个深沉的嗡嗡声,但不是一个调。

有没有人有建议可能是错误的代码?

#define pause 0 
#define c1 32.7 
#define cis1 34.6 
#define d1 36.7 
#define dis1 38.9 
... 

#define l1 32 
#define l2 16 
... 

#define note 0 
#define laenge 1 

int myChannels[] = { 8, 9, 10, 11, 12, 13 }; 
int myDuration[] = { 0, 0, 0, 0, 0, 0 }; 
int myPointer[] = { 0, 0, 0, 0, 0, 0 }; 
const PROGMEM float myPlayList[6][600][2] = { 
    // 1st Voice 
    { 
    { c2, l8}, { g2, l8}, { c2, l8}, { g2, l8}, { c2, l8}, { g2, l8}, { c2, l8}, { g2, l8}, 
    { c2, l8}, { g2, l8}, { c2, l8}, { g2, l8}, { c2, l8}, { g2, l8}, { c2, l8}, { g2, 18}, 
    ... 
    } 
}; 

void play(int out, float freq, float len) { 
    if (freq > 0) { 
    tone (myChannels[out], freq); 
    } else { 
    noTone (freq); 
    } 
    myDuration[ out] = len; 
} 

void setup() { 
    for (int channel = 0; channel < 6; channel++) { 
    pinMode (myChannels[channel], OUTPUT); 
    } 
} 

void loop() { 
    boolean playing = false; 

    for (int channel = 0; channel < 6; channel++) { 
    if (myDuration[channel] == 0) { 
     if (myPointer[channel] < sizeof(myPlayList[channel])) { 
     play(channel, myPlayList[channel][myPointer[channel]][0], myPlayList[channel][myPointer[channel]][1]); 
     myPointer[channel]++; 
     playing = true; 
     } else { 
     noTone (channel); 
     } 
    } else { 
     myDuration[channel]--; 
     playing = true; 
    } 
    } 

    if (!playing) { 
    delay (10000); 
    for (int channel = 0; channel < 6; channel++) { 
     myDuration[channel] = 0; 
     myPointer[channel] = 0; 
    } 
    } 

    delay (25); 
} 

回答

0

你试图同时呼吁六个独立渠道tone()功能。由于arduino核心库中的tone()函数被指定为一次产生一个音调,所以这不能起作用。其原因是它利用单个硬件定时器来产生方波。

这里的想法如何实现你想实现什么样的不完全名单:

  1. 使您的设计单音。一针,一个扬声器,一个声音。
  2. 利用micros()手动生成正方形。
  3. 雇用Brett Hagman的音色库:https://code.google.com/archive/p/rogue-code/wikis/ToneLibraryDocumentation.wiki#Ugly_Details。这个库使用更多的硬件定时器,实际数量取决于你的电路板的Atmel芯片。请注意,您需要带有ATmega1280 +芯片的Arduino才能同时驱动六个引脚。

请注意,tone()需要两个int作为参数。