如何用 JS 合成正弦波?
How can I sythesize a sine audio wave with JS?
我想尝试使用 JavaScript 制作一个合成器,但我找不到任何关于如何这样做的基本示例。
我从研究中发现它 appears to be possible and that you should use a Canvas Pixel Array 而不是普通的 ECMA 数组
我也在 MDN Audio 中找到了信息,我以前看到过网络广播播放器用于连续播放的音频元素,虽然我不知道如何实现。
我的目标是制作一些东西,让我能够合成连续的正弦波并使用我的键盘演奏它们 而不使用预制样本。
编辑:下面的评论之一为我指出了正确的方向。我目前正在研究解决方案,但如果您也想 post 一个,请随意。
这是一个基本示例,任何人都应该能够从中弄清楚如何使用键盘演奏正弦波:
<script type="text/javascript">
//WARNING: VERY LOUD. TURN DOWN YOUR SPEAKERS BEFORE TESTING
// create web audio api context
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
// create Oscillator node
var oscillator = audioCtx.createOscillator();
oscillator.type = 'sine';
oscillator.frequency.value = 750; // value in hertz
oscillator.connect(audioCtx.destination);
oscillator.start();
//uncomment for fun
// setInterval(changeFreq, 100);
//choose a random interval from a list of consonant ratios
var intervals = [1.0, 0.5, 0.3333, 1.5, 1.3333, 2.0, 2.25]
function changeFreq() {
var intervalIndex = ~~(Math.random() * intervals.length);
var noteFreq = oscillator.frequency.value * intervals[intervalIndex];
//because this is random, make an effort to keep it in comfortable frequency range.
if(noteFreq > 1600)
noteFreq *= 0.5;
else if(noteFreq < 250)
noteFreq *= 2;
oscillator.frequency.value = noteFreq;
}
</script>
<body>
<button onclick="changeFreq()">Change Places!</button>
</body>
我想尝试使用 JavaScript 制作一个合成器,但我找不到任何关于如何这样做的基本示例。
我从研究中发现它 appears to be possible and that you should use a Canvas Pixel Array 而不是普通的 ECMA 数组
我也在 MDN Audio 中找到了信息,我以前看到过网络广播播放器用于连续播放的音频元素,虽然我不知道如何实现。
我的目标是制作一些东西,让我能够合成连续的正弦波并使用我的键盘演奏它们 而不使用预制样本。
编辑:下面的评论之一为我指出了正确的方向。我目前正在研究解决方案,但如果您也想 post 一个,请随意。
这是一个基本示例,任何人都应该能够从中弄清楚如何使用键盘演奏正弦波:
<script type="text/javascript">
//WARNING: VERY LOUD. TURN DOWN YOUR SPEAKERS BEFORE TESTING
// create web audio api context
var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
// create Oscillator node
var oscillator = audioCtx.createOscillator();
oscillator.type = 'sine';
oscillator.frequency.value = 750; // value in hertz
oscillator.connect(audioCtx.destination);
oscillator.start();
//uncomment for fun
// setInterval(changeFreq, 100);
//choose a random interval from a list of consonant ratios
var intervals = [1.0, 0.5, 0.3333, 1.5, 1.3333, 2.0, 2.25]
function changeFreq() {
var intervalIndex = ~~(Math.random() * intervals.length);
var noteFreq = oscillator.frequency.value * intervals[intervalIndex];
//because this is random, make an effort to keep it in comfortable frequency range.
if(noteFreq > 1600)
noteFreq *= 0.5;
else if(noteFreq < 250)
noteFreq *= 2;
oscillator.frequency.value = noteFreq;
}
</script>
<body>
<button onclick="changeFreq()">Change Places!</button>
</body>