2016-10-27 2 views
0

Я начал экспериментировать с Web Audio API, пытаясь создать различные осцилляторы для создания акустических волн.Изменение частоты генератора

Поскольку я доволен всем процессом, мне интересно, есть ли способ играть тоны, а не с постоянной частотой, но менять их на полпути.

Пример: Я хочу тон, который начинается в 300 Гц для 3 секунды, а затем поднимают линейно к 400 Гц в течение следующих 4 секунд .

Я Источника, но я не совсем уверен, если это то, что я ищу:

osc.setPeriodicWave(wave); 

Мой JavaScript до сих пор:

$(document).ready(function() { 

// Function that plays the tone. 
var playTone = function(duration, frequency) { 
var context = new(window.AudioContext || window.webkitAudioContext)(); 
var osc = context.createOscillator(); 
// Sine is the default type. Also available: square, sawtooth and triangle waveforms. 
osc.type = 'sine'; 
// Frequency in Hz. 
osc.frequency.value = frequency; // Frequency in Hz 
osc.connect(context.destination); 
osc.start(context.currentTime); 
osc.stop(context.currentTime + duration); 
} 

// Button and input functionality. 
$("button").on("click", function() { 

var whichButton = $(this).text() 
var duration = document.getElementById("durationInput").value; 
var frequency = document.getElementById("f1Input").value; 
if (whichButton == " Play") { 
    playTone(duration, frequency); 
} 

}); 

}); 

Мои codepen с работой до сих пор:Codepen.io - Acoustic wave generator

+0

Пожалуйста, включите в свой вопрос весь соответствующий код в [mcve], а не на сторонний сайт. –

+0

Выполнено в соответствии с запросом! Простите за это. – Konsal

ответ

0

Вы не хотите, чтобы PeriodicWave - это гармонический (аддитивный) синтез.

Это довольно просто - вам просто нужно использовать частотные методы настройки AudioParam «setValueAtTime» и «linearRampToValueAtTime». Попробуйте следующее:

// Function that plays the tone. 
var playTone = function(duration, frequency) { 
    var context = new(window.AudioContext || window.webkitAudioContext)(); 
    var osc = context.createOscillator(); 
    // Sine is the default type. Also available: square, sawtooth and triangle waveforms. 
    osc.type = 'sine'; 
    var now = context.currentTime; 
    // Frequency in Hz. 
    // Set initial value. (you can use .value=freq if you want) 
    osc.frequency.setValueAtTime(frequency, now); 
    // set a "checkpoint" in 3 seconds - that will be the starting point of the ramp. 
    osc.frequency.setValueAtTime(frequency, now+3); 
    // set a ramp to freq+100Hz over the next 4 seconds. 
    osc.frequency.linearRampToValueAtTime(frequency+100,now+7) 
    osc.connect(context.destination); 
    osc.start(now); 
    osc.stop(now + duration); 
} 
+0

Спасибо за информацию и помощь! Тем не менее, он ведет себя странно. ** Снижение частоты работает отлично **, но если я попытаюсь повысить частоту (в моем примере для ** 3 <время <7 секунд **), он будет воспроизводить исходный тон в течение первых 3 секунд, а затем он будет создайте ** высокий шаг за 0,5 секунды и остановите **. – Konsal

+0

Предоставьте минимальный пример этой проблемы, не видя этого, это действительно трудно понять, в чем проблема. –

+0

По-видимому, если я избавлюсь от jQuery, linearlinearRampToValueAtTime отлично работает, повышая или понижая частоту. Что-то не так в jQuery, которое разрушает повышение частоты, используя код @cwilso. – Konsal