每次麦克风听到手指轻弹时,我都会尝试加1。
var mic;
var vol;
var count = 0;
function setup() {
createCanvas(windowWidth, windowHeight);
mic = new p5.AudioIn();
mic.start();
}
function draw() {
background('pink');
vol = mic.getLevel(); // level is between 0 and 1
vol = vol * 100;
if (vol > 6) {
count += 1;
text(count, 60, 300);
//if (count += 1) {
// vol = 0;
//}
} else {
text(count, 60, 300);
}
}
问题: 用我当前的代码,它会在手指弹响的持续时间内继续计数。我该怎么写才能在每个手指扣一次将var计数加1
答案 0 :(得分:0)
如果要计算何时音量超过6,则需要一个标志来知道何时音量已降至该阈值以下。
因此,设置一个像这样的变量:
var waitingForVolumeIncrease = true;
然后在代码中,当您增加计数时,还将标志设置为false。
添加另一个条件来检查音量是否小于6,将标志重置为true。
最后,您只想在标记设置为true时增加计数,因此您需要更新检查以确保标记设置为true。
答案 1 :(得分:0)
记录最后的快照开始时间,并检查是否在old_snap_time + snap_duration
之后到达新的快照:
var mic;
var vol;
var count = 0;
var snapDurationMs = 500;
var lastSnap = 0;
function setup() {
createCanvas(windowWidth, windowHeight);
strokeWeight(4);
stroke('rgba(0,255,0,0.25)');
fill(color(0, 0, 255));
textSize(40);
mic = new p5.AudioIn();
mic.start();
}
function draw() {
background('pink');
vol = mic.getLevel(); // level is between 0 and 1
vol = vol * 100;
let now = millis();
if (vol > 25 && now - lastSnap > snapDurationMs) {
count += 1;
lastSnap = now;
}
text(count, 100, 300);
}
顺便说一句,平局中不需要其他{}部分,因为在这种情况下,您将丢失一些帧
编辑
稍微更改了常量。在我的麦克风中,合理的声音阈值约为输入电平的25%-30%
(如果较低)-我们开始检测麦克风中的随机噪声事件。拍拍持续时间也更改为500 ms
,因为如果拍拍持续时间较短,我们可能会开始对同一拍拍计数两次甚至更多。
即使使用这些修复程序,有时麦克风仍会检测到“重音捕捉”,因为麦克风是具有极低信噪比的设备。因此,为了获得更高的准确性,需要使用其他方法,例如:
但是这个算法是完全不同的故事,所以不在这里