改变振荡器频率

时间:2016-10-27 18:08:58

标签: javascript web-audio

我开始尝试使用 Web Audio API ,尝试创建不同的振荡器以产生声波。

由于我对整个过程并不熟悉,我想知道是否有一种方法可以播放音调,而不是频率恒定,而是在中途改变它们。

实施例 我想要一个音调,从 300 Hz 开始 3秒,然后线性增加 400 Hz 下一个 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.io - Acoustic wave generator

1 个答案:

答案 0 :(得分:0)

你不需要一个PeriodicWave - 那就是谐波(加法)合成。

这非常简单 - 你只需要使用频率AudioParam的调度方法“setValueAtTime”和“linearRampToValueAtTime”。试试这个:

org.springframework.jndi.JndiObjectFactoryBean cf = new org.springframework.jndi.JndiObjectFactoryBean();
JndiTemplate jndiTemplate = new org.springframework.jndi.JndiTemplate();
Properties environment = new Properties();
environment.setProperty("java.naming.factory.initial", "com.xxx"); //initial context
environment.setProperty("java.naming.provider.url", "xxx://xxx"); //url
jndiTemplate.setEnvironment(environment);
cf.setJndiTemplate(jndiTemplate);
cf.setJndiName("XXX");
//System.out.println(cf.getObject()); //null
cf.afterPropertiesSet();
//System.out.println(cf.getObject()); //now has the value

org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter adapter = new org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter();
adapter.setTargetConnectionFactory((ConnectionFactory) cf.getObject());