【发布时间】:2020-02-08 16:03:03
【问题描述】:
代码如下:
我想创建一个音频程序,可以播放从低频到高频的音频。
但是,此代码会导致不同的输出(即使使用相同的设备):
- 声音突然发出 - 预期的结果是逐渐发出。我确信我的听力没问题,因为我已经让我的朋友听过;
- 同一频率下的音频听起来不同。
警告:请在运行此脚本之前将音量调至非常低,以防万一受伤。
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
// create Oscillator node
var oscillator = audioCtx.createOscillator();
var osc_arr = [];
function purgeSound(){
osc_arr.forEach(function(v){
try {
v.stop();
v.disconnect(audioCtx.destination);
} catch (e) {}
})
}
function playSoundAtFreq(fq){
purgeSound();
var osc = audioCtx.createOscillator();
osc_arr.push(osc);
osc.type = 'square';
osc.frequency.setValueAtTime(fq, audioCtx.currentTime); // value in hertz
$('#fff').val(fq);
osc.connect(audioCtx.destination);
osc.start();
}
$('#stop').click(function(){
purgeSound();
_break = true;
})
var _break = false;
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
var pointer = 0;
var go = appendAttemptAsync(10000);
async function appendAttemptAsync(range) {
if(_break) return;
var target = pointer+range;
for (pointer; pointer<range; pointer++) {
playSoundAtFreq(pointer);
console.log(pointer)
//if(pointer % 1 == 0) {
await sleep(100)
//}
}
return 5221;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id='stop'>stop</button>
<input id="fff" type="text" />
警告:请在运行此脚本之前将音量调至非常低,以防万一受伤。
感谢您提出任何改进我的代码的建议。
【问题讨论】:
-
“逐渐出来”是什么意思?你是什么意思音频在相同频率下听起来不同?您的测试产生的频率不同。
-
“逐渐”这个词的意思是,我想创造一种从低频到高频的声音。
-
不确定您在寻找什么。至少在 chrome 上,在按下停止之前您不会听到任何声音,因为 chrome 的自动播放策略会阻止输出,直到有用户手势。如果您添加一个启动按钮来启动振荡器,那么我怀疑它会为您工作。
-
但是对于我的 Chrome,它会自动启动。它不需要开始按钮。而我正在寻找的只是这样的东西:youtube.com/watch?v=H-iCZElJ8m0我想用JavaScript来模拟这个视频中的东西。
标签: html5-audio web-audio-api audiocontext