Почему веб-аудиовыход генератора не работает должным образом? - PullRequest
0 голосов
/ 11 октября 2019

Вот код:

Я хочу создать аудиопрограмму, которая может воспроизводить звук от очень низкой частоты до высокой частоты.

Однако этот код приводит к другому выводу (даже прито же устройство):

  1. Звук выходит внезапно - ожидаемый результат - постепенно. Я уверен, что мой слух в порядке, потому что я попросил своих друзей услышать;
  2. Звук звучит по-разному на той же частоте.

ВНИМАНИЕ: Пожалуйста, отрегулируйте громкостьдо очень низкого уровня в случае любого вреда перед запуском этого скрипта.

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" />

ВНИМАНИЕ: Пожалуйста, отрегулируйте громкость на очень низкую величину в случае любого повреждения, прежде чем запускать этот скрипт.

Спасибоза любые предложения по улучшению моего кода.

1 Ответ

1 голос
/ 15 октября 2019

Если вы хотите, чтобы осциллятор качался, как в видео на YouTube, которое вы упомянули , вы можете сделать что-то вроде:

let osc = new OscillatorNode(audioCtx);
osc.connect(audioCtx.destination);
osc.frequency.setValueAtTime(20, audioCtx.currentTime);
osc.frequency.linearRampToValueAtTime(audioCtx.sampleRate / 2, audioCtx.currentTime + 300);
osc.start();

Измените 300 на некоторое подходящее время в течениекоторый тон сметает. Я произвольно выбрал 5 минут.

Я не знаю, почему ваш пример не работает, но этот фрагмент - типичный способ поднять тон с помощью WebAudio.

...