روش مدرن
Web Audio API از رابط AudioContext()
برای مدیریت منابع، فیلترها و مقصدها استفاده می کند. هنگامی که یک AudioContext()
جدید ایجاد کردید، یک گره منبع صوتی مانند AudioBufferSourceNode
یا OscillatorNode
ایجاد کنید. به عنوان مثال، یک اسیلاتور پایه با فیلتر پایین گذر اعمال شده را در نظر بگیرید.
با استفاده از متد createBiquadFilter()
ابتدا یک AudioContext()
جدید ایجاد کنید. سپس یک گره منبع صوتی مانند AudioBufferSourceNode
یا OscillatorNode
ایجاد کنید. برای این مثال یک گره نوسانگر sine
ایجاد خواهید کرد که از لحظه شروع پخش فرکانس آن 420 هرتز است.
const audioCtx = new (window.AudioContext || window.webkitAudioContext)();
const oscillator = audioCtx.createOscillator()
oscillator.type = 'sine';
// Value is in hertz.
oscillator.frequency.setValueAtTime(420, audioCtx.currentTime);
سپس با استفاده از createBiquadFilter()
یک گره افکت ایجاد کنید. نوع را روی lowpass
و فرکانس را برای شروع یک ثانیه پس از شروع پخش تنظیم کنید. سپس biquadFilter
را به oscillator
وصل کنید.
const biquadFilter = audioCtx.createBiquadFilter();
biquadFilter.type = 'lowpass';
biquadFilter.frequency.setValueAtTime(200, audioCtx.currentTime + 1);
oscillator.connect(biquadFilter);
در نهایت biquadFilter
را قبل از شروع oscillator
و توقف آن پس از دو ثانیه پخش به مقصد audioCtx
وصل کنید.
biquadFilter.connect(audioCtx.destination);
oscillator.start();
oscillator.stop(2);
صدای نوسانگر از فیلتر بدون تأثیر عبور داده می شود و به مقصد، که بلندگوهای رایانه شما است، می رود. پس از یک ثانیه پخش، فیلتر lowpass
فعال می شود. پس از دو ثانیه، نوسان ساز متوقف می شود.
سایر فیلترها و جلوه های موجود
گره های فیلتر دیگر را می توان به AudioContext
اضافه کرد تا جلوه های مختلفی ایجاد کند:
-
createWaveShaper()
برای اضافه کردن اعوجاج به یک منبع استفاده می شود. -
createGain()
برای تقویت سیگنال کلی منبعی که روی آن اعمال می شود استفاده می شود. -
createConvolver()
بیشتر برای افزودن Reverb به یک منبع استفاده می شود. -
createDelay()
برای اضافه کردن تاخیر به شروع یک منبع استفاده می شود. -
createDynamicsCompressor()
برای افزایش صدای ساکت ترین قسمت منبع و کاهش صدای بلندترین قسمت ها استفاده می شود. -
createPanner()
وcreateStereoPanner()
برای تغییر موقعیت مکانی خروجی صدا استفاده می شوند.
روش کلاسیک
قبل از در دسترس بودن Web Audio API، هیچ راهی برای افزودن افکت به صدا در مرورگر وجود نداشت. راهحلهایی با استفاده از رندر سمت سرور و جابهجایی بین جریانها امکانپذیر است، اما این میتواند هزینههای زیادی را در شبکه به همراه داشته باشد.
با استفاده از عنصر صوتی
تنها جلوههای صوتی که میتوان مستقیماً کنترل کرد، پخش و صدا هستند.
const audio = document.querySelector('audio');
// Sets audio volume to 50%
audio.volume = 0.5;
// Doubles the playback rate.
audio.playbackRate = 2;
بیشتر خواندن
نسخه ی نمایشی
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link
rel="icon"
href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🔉</text></svg>"
/>
<title>How to add effects to audio</title>
</head>
<body>
<h1>How to add effects to audio</h1>
<button type="button">Press to hear audio effect</button>
</body>
</html>
CSS
:root {
color-scheme: dark light;
}
html {
box-sizing: border-box;
}
*,
*:before,
*:after {
box-sizing: inherit;
}
body {
margin: 1rem;
font-family: system-ui, sans-serif;
}
JS
const button = document.querySelector('button');
button.addEventListener('click', () => {
const audioCtx = new (window.AudioContext || window.webkitAudioContext)();
const oscillator = audioCtx.createOscillator();
oscillator.type = 'sine';
// Value is in hertz.
oscillator.frequency.setValueAtTime(420, audioCtx.currentTime);
const biquadFilter = audioCtx.createBiquadFilter();
biquadFilter.type = 'lowpass';
biquadFilter.frequency.setValueAtTime(200, audioCtx.currentTime + 1);
oscillator.connect(biquadFilter);
biquadFilter.connect(audioCtx.destination);
oscillator.start();
oscillator.stop(2);
});