【发布时间】:2017-03-08 19:08:14
【问题描述】:
我尝试编写一首用 Arduino 播放的小曲,该 Arduino 连接了 6 个扬声器。这个过程应该是我在频率上打开不同的扬声器并倒计时音符的持续时间。如果持续时间结束,我会播放下一个声音或打开扬声器。我为 6 个扬声器定义了不同的阵列。我对音符频率和持续时间也有很多定义。
问题是,我只能听到低沉的嗡嗡声,而不是曲调。
有人建议代码有什么问题吗?
#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);
}
【问题讨论】: