audioContext声音

我想做一个音乐播放器,里面要有一个节拍器,但是百度到的节拍声音都是不合适的,我想要的节拍器声音是那种和尚敲木鱼一样的滴咚咚滴咚咚的声音,有人会吗,有偿求解答,急需要这个可以调节节拍速度的节拍器

用一个滴的声音wav文件和一个哒的声音wav文件再一个100毫秒的静音wav文件,根据自己设定的节拍参数将三个文件重复组合合并生成一个节拍wav文件播放就是节拍器了

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

//define---------------------------------------------------

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define BPM_MIN 20
#define BPM_MAX 240
#define PIN_BPM A0
#define PIN_BEEP 9

//end define---------------------------------------------------

//---------------------------------------------------

int bpm;

//---------------------------------------------------

void setup() {
Serial.begin(9600);

// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
// Clear the buffer 这里如果不清理buffer,默认的显示内容为Adafruit类库的LOGO
display.clearDisplay();

// ShowText();

pinMode(PIN_BPM, INPUT);
pinMode(PIN_BEEP, OUTPUT);

delay(1000);

}

void loop() {

/*map()函数
*描述:将数字从一个范围重新映射到另一个范围。
函数原型:map(value, fromLow, fromHigh, toLow, toHigh)
参数:
value:要映射的数
fromLow:当前值范围的下限
fromHigh:当前值范围的下限
toLow:目标值范围的下限
toHigh:目标值范围的上限
返回值:映射后的值 */
//从A0口读取电位器的电压值,这个值是根据模拟电压值转换过来的,比如0V5V的电压,模拟转数字后就是01024。
//BPM_MIN, BPM_MAX分别是20和240,代表节拍器的最低最高速度。
//下面这句代码的意思就是,把电位器的电压范围值映射到节拍器的速度范围值上。
bpm = map(analogRead(A0), 0, 1023, BPM_MIN, BPM_MAX);

ShowBPM(bpm); //OLED显示节拍器速度(bpm的值)

Beep(); //蜂鸣器播放声音

}

void ShowBPM(int theNum) {
display.clearDisplay();

display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 10); //显示的坐标位置
display.println(F("BPM: "));
display.setTextSize(3);
display.setCursor(60, 10); //显示的坐标位置
display.println(theNum);
display.display(); // Show text
}

void Beep()
{
//BPM即每分钟有多少拍,那么一分钟(60000毫秒)除以BPM就是每拍的时间
//再除以4,就是四分之一拍的时间长度
float tick = 60000 / bpm /4 ;

tone(PIN_BEEP, 440); //播放440Hz的声音
delay(tick); //播放时为四分之一拍

noTone(PIN_BEEP); //停止播放声音
delay(tick*3); //空四分之三拍的时间

}