我正在尝试制作带有蜂鸣器的复音音乐播放器。 Arduino的。我正在关注this教程作为指导,但我无法弄明白。代码就像:
EC2Cloud cloud = Jenkins.instance.clouds.find { it instanceof EC2Cloud }
KeyPair key_pair= cloud.getKeyPair()
private_key_text = key_pair.keyMaterial
def secret_key = hudson.util.Secret.decrypt(cloud.getSecretKey()).toString()
我被困在“digitalWrite(speakerOut,HIGH);”线。在我调用playTone函数之前确定我设置了“tone_ = melody [i];”但在函数中我们只在延迟函数中使用它。
我的问题是它如何跟随旋律数组?基于此,我将添加一个蜂鸣器,并通过另一个阵列控制它,但现在我无法做任何事情......
答案 0 :(得分:0)
我看到您的困惑,因为您的程序正在阻塞(只是循环延迟),您不能并行添加更多旋律。解决方案是使用计时器/计数器和迭代过程将代码重写为无阻塞界面。为了简单起见,假设简单的数字1位声音。为了确保后面的复音,我们需要使用PWM,以便我们可以将更多的通道添加在一起。
让我们以单音开头
对于每个声音通道,您都需要存储实际状态,例如:
test
[T]的时间段,T
T = ftimer/ftone
[T]中的实际时间,其中t
0 <= t <= T
[-]或音量应为A
A <= T/2
(打开/关闭)
其中[T]代表某个计时器/计数器的周期,该周期将通过(采样率)将所有值转换为整数进行更新。现在,您只需创建一个on
函数,该函数就会以足够高的频率从某个计时器定期调用,并确定扬声器的状态(开/关)。
旋律
只需添加一些计数器update
[T],它代表当前音调应播放多少个周期。并在n
中递减,如果递减为零,则从您的旋律表中获取新音调。因此,您还需要添加一些索引,以从您的旋律中播放当前正在播放的音调。
复音
您可以通过硬件连接或连接更多数字引脚(每个通道一个)来实现。但这也可以通过软件手段来实现。只需通过对每个应声道的update
值进行逻辑运算,即可将每个声道逻辑上加在一起,并根据其结果(on
)设置发言人。那个工作但是输出质量不是很好。更好的方法是使用算术加法(A|B
)并将结果用作PWM输出,其输出具有用于音调合成的采样频率的几倍。
您也可以使用DAC代替PWM ...
我没有为ARDUINO编码,所以我无法共享完整代码。但是在我的AVR32上,C / C ++代码如下所示:
A+B
因此,我只有一组//---------------------------------------------------------------------------
#ifndef _music_h
#define _music_h
//---------------------------------------------------------------------------
#ifdef VCL_H
#define U8 BYTE
#define U16 WORD
#define U32 DWORD
#endif
//---------------------------------------------------------------------------
//#define _music_shifted_notes
//---------------------------------------------------------------------------
// volume
#define music_A 5
// max channels
#define music_sys_T 3
// _music update freq
#define music_f ftim0/music_sys_T
//---------------------------------------------------------------------------
// music frequency 100*f [Hz], C_0 means C#0, P means pause
//---------------------------------------------------------------------------
#define P 0
#ifdef _music_shifted_notes
// musics data shifted frequencies C4 -> C1
#define C1 26163
#define C_1 27718
#define D1 29366
#define D_1 31113
#define E1 32963
#define F1 34923
#define F_1 36999
#define G1 39200
#define G_1 41530
#define A1 44000
#define A_1 46616
#define B1 49388
#define C2 52325
#define C_2 55437
#define D2 58733
#define D_2 62225
#define E2 65925
#define F2 69846
#define F_2 73999
#define G2 78399
#define G_2 83061
#define A2 88000
#define A_2 93233
#define B2 98777
#define C3 104650
#define C_3 110873
#define D3 117466
#define D_3 124451
#define E3 131851
#define F3 139691
#define F_3 147998
#define G3 156798
#define G_3 166122
#define A3 176000
#define A_3 186466
#define B3 197553
#define C4 209300
#define C_4 221746
#define D4 234932
#define D_4 248902
#define E4 263702
#define F4 279383
#define F_4 295996
#define G4 313596
#define G_4 332244
#define A4 352000
#define A_4 372931
#define B4 395107
#else
// real note frequuencies
#define C0 1635
#define C_0 1732
#define D0 1835
#define D_0 1945
#define E0 2060
#define F0 2183
#define F_0 2312
#define G0 2450
#define G_0 2596
#define A0 2750
#define A_0 2914
#define B0 3087
#define C1 3270
#define C_1 3465
#define D1 3671
#define D_1 3889
#define E1 4120
#define F1 4365
#define F_1 4625
#define G1 4900
#define G_1 5191
#define A1 5500
#define A_1 5827
#define B1 6174
#define C2 6541
#define C_2 6930
#define D2 7342
#define D_2 7778
#define E2 8241
#define F2 8731
#define F_2 9250
#define G2 9800
#define G_2 10383
#define A2 11000
#define A_2 11654
#define B2 12347
#define C3 13081
#define C_3 13859
#define D3 14683
#define D_3 15556
#define E3 16481
#define F3 17461
#define F_3 18500
#define G3 19600
#define G_3 20765
#define A3 22000
#define A_3 23308
#define B3 24694
#define C4 26163
#define C_4 27718
#define D4 29366
#define D_4 31113
#define E4 32963
#define F4 34923
#define F_4 36999
#define G4 39200
#define G_4 41530
#define A4 44000
#define A_4 46616
#define B4 49388
#define C5 52325
#define C_5 55437
#define D5 58733
#define D_5 62225
#define E5 65925
#define F5 69846
#define F_5 73999
#define G5 78399
#define G_5 83061
#define A5 88000
#define A_5 93233
#define B5 98777
#define C6 104650
#define C_6 110873
#define D6 117466
#define D_6 124451
#define E6 131851
#define F6 139691
#define F_6 147998
#define G6 156798
#define G_6 166122
#define A6 176000
#define A_6 186466
#define B6 197553
#define C7 209300
#define C_7 221746
#define D7 234932
#define D_7 248902
#define E7 263702
#define F7 279383
#define F_7 295996
#define G7 313596
#define G_7 332244
#define A7 352000
#define A_7 372931
#define B7 395107
#define C8 418601
#define C_8 443492
#define D8 469863
#define D_8 497803
#define E8 527404
#define F8 558765
#define F_8 591991
#define G8 627193
#define G_8 664488
#define A8 704000
#define A_8 745862
#define B8 790213
#endif
#define H0 B0
#define H1 B1
#define H2 B2
#define H3 B3
#define H4 B4
#define H5 B5
#define H6 B6
#define H7 B7
#define H8 B8
#define H_0 B_0
#define H_1 B_1
#define H_2 B_2
#define H_3 B_3
#define H_4 B_4
#define H_5 B_5
#define H_6 B_6
#define H_7 B_7
#define H_8 B_8
//---------------------------------------------------------------------------
// music tempo delays [ms]
//---------------------------------------------------------------------------
#define T32 62
#define T20 100
#define T16 125
#define T10 200
#define T9 222
#define T8 250
#define T7 285
#define T6 333
#define T5 400
#define T4 500
#define T3 666
#define T2 1000
#define T1 2000
//---------------------------------------------------------------------------
typedef struct
{
U32 T,t,n,on;
U32 *melody;
} _music;
//---------------------------------------------------------------------------
void music_play(_music *m,U32 *melody)
{
m->melody=melody;
m->t=0;
m->T=0;
m->on=0;
m->n=1;
}
//---------------------------------------------------------------------------
void music_stop(_music *m)
{
m->melody=NULL;
m->t=0;
m->T=0;
m->on=0;
m->n=1;
}
//---------------------------------------------------------------------------
void music_update(_music *m)
{
if (m->melody==NULL) { m->on=0; return; }
m->n--; if (!m->n)
{
U32 x;
m->T=m->melody[0]; m->melody++;
if (m->T) m->T=(100*music_f)/m->T;
if (m->melody==NULL) { m->on=0; return; }
m->n=(m->melody[0]*music_f)/1000; m->melody++;
m->on=1; m->t=0;
if (m->n==0) m->melody=NULL;
}
m->t++; if (m->t==m->T){ m->on=1; m->t=0; }
if (m->t==music_A) m->on=0;
}
//---------------------------------------------------------------------------
void music_sys_init(_music *m,int n)
{
for (int i=0;i<n;i++) music_stop(m+i);
}
//---------------------------------------------------------------------------
void music_sys_update(_music *m,int n,U32 pin)
{
static U32 t=0,A=0;
int i;
t++;
if (t==music_sys_T)
{
t=0; A=0;
for (i=0;i<n;i++)
{
music_update(m+i);
if (m[i].on) A++;
}
if (A) gpio_set_gpio_pin(pin);
}
if (t==A) gpio_clr_gpio_pin(pin);
}
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
代表我的所有频道,并在某个计时器中以_music
的频率调用music_sys_update
,我使用的是ftim0
[Hz]。
ftim0=200000
因此,只需将其移植到您的环境中,即可享受乐趣:)...