#1 瀏覽器 make sound

web audio apis 種類豐富腌且,看這些apis純屬個人興趣,沒事折騰一下千诬。
比較好的網(wǎng)站:

  1. learning-web-audio-api
  2. Get start with web audio api
  3. web audio school && web-audio-school github
  4. web audio tool
  5. MDN web audio api

本文就是鏈接3中的一些筆記:

基礎(chǔ)介紹

web audio api提供了很多控制音頻的apis.允許開發(fā)者選取音頻源敏储,添加音頻效果,創(chuàng)建音頻可視化踩麦,應用空間效果等。

1.創(chuàng)建AudioContext

這是是用來鏈接一系列節(jié)點氓癌,從而形成一條信號鏈(singal path):

Inputs --> Effects --> Destination

InputsDestination就是通過這個上下文來鏈接起來的谓谦。

創(chuàng)建audioContext:

var audioContext = new AudioContext();

OscillatorNode

OscillatorNode(振蕩節(jié)點): 它能夠產(chǎn)生任何頻率(frequency)和所有基本波形(wave shapes),比如: sine | sawtooth(鋸齒) | triangle | square

1.type

波形type

1.創(chuàng)建一個簡單的音頻音調(diào)

例如:

# 創(chuàng)建一個振蕩器
var oscillator = audioContext.createOscillator();
# 選擇一種信號波形(waveform shape)  
# 可選的有 sine, sawtooth, triangle, square
oscillator.type = 'sawtooth';

# 連接Destination(揚聲器)
oscillator.connect(audioContext.destination);

# currentTime 可讀可寫贪婉, 未設(shè)置默認為0
oscillator.start(audioContext.currentTime); // 開始
oscillator.stop(audioContext.currentTime + 2); // 2s后停止

完整代碼:

var audioContext = new AudioContext();
var oscillator = audioContext.createOscillator();
oscillator.type = 'square';
oscillator.connect(audioContext.destination);
oscillator.start(audioContext.currentTime);
oscillator.stop(audioContext.currentTime + 2);

2.frequency

振蕩器節(jié)點有個屬性叫 frequency反粥, 單位: Hz(赫茲), 默認為 440Hz疲迂。
改變音調(diào)才顿。

oscillator.frequencyAudioParam實例,大多數(shù)Audio Nodes都是AudioParam實例尤蒿,這個類有很多的屬性郑气。

設(shè)置頻率:

oscillator.frequency.value = 880; // 單位Hz

# 直接設(shè)置frequency,錯誤
oscillator.frequency = 800; // 錯誤

3.半音階(Chromatic Scale)

半音階計算有些技巧腰池,因為頻率(frequency)將倍率(octave)(12個半音)翻倍尾组。
(Chromatic note frequencies are slightly tricky to calculate because the frequency doubles every octace(12 semitones) you go up)

計算公式

# noteOffset: 音色偏移
baseFrequency * Math.pow(2, noteOffset / 12)

比如從 middle A 上升7個半音(7 semitones) E, 則計算為:

oscillator.frequency.value = 440 * Math.pow(2, 7 / 12); // 659.255..

再比如,下降14個半音到 G

oscillator.frequency.value = 440 * Math.pow(2, -14 / 12); // 195.998..

一個簡單點的計算方式

使用OscillatorNode的 detune(失諧)屬性示弓,這個屬性允許使用半音的百分之一讳侨。

比如使用detune,如果想從 Middle A 上升 7個半音到 E,則可以:

oscillator.detune.value = 700 // noteOffset * 100

注意點

  • 頻率與音調(diào)(半音階)之間的關(guān)系計算: baseFrequency * Math(2, noteOffset / 12)
  • Middle A 是440Hz, 即振蕩器默認的頻率
  • Octave指八度音階奏属, semitones 指音階跨跨, chromatic scale指半音階
  • 使用detune來轉(zhuǎn)換音頻,以100分之一直接設(shè)置noteOffset即可

連續(xù)播放示例

var ctx = new AudioContext();

function play(delay, pitch, duration) {
  var startTime = ctx.currentTime + delay;
  var endTime = startTime + duration;
  // 定義一個振蕩器
  var oscillator = ctx.createOscillator();
  // 定義音色  
  oscillator.frequency.value = 440 * Math.pow(2, pitch / 12);
  // 或者
  // oscillator.detune.value = pitch * 100;


  // 連接destination
  oscillator.connect(ctx.destination);
  // 開始和結(jié)束
  oscillator.start(startTime);
  oscillator.end(endTime);
}

// 調(diào)用,通過delay產(chǎn)生連續(xù)的音頻
play(0, 3, 0.5);
play(1, 10, 0.5);
play(2, 15, 0.5);

4.對音頻進行過濾:BiquadFilterNode

高通濾波(high-pass filter):即對低頻的音色進行過濾囱皿,保留高頻的音色勇婴。

使用 BiquadFilterNode 對音頻進行控制忱嘹, 過濾的類型有 lowpass(默認值) | highpass | bandpass | lowshelf | highshelf | peaking | notch | allpass.

Biquad Filter 字面意思是: 二階濾波器。

Lowpass

lowpass 過濾是默認的類型耕渴,允許低于該頻率的信號通過德谅,高頻的則過濾掉。

var filter = audioContext.createBiquadFilter();
filter.connect(audioContext.destination);
oscillator.connect(filter);

// 過濾掉所有高于500Hz的音頻
filter.type = 'lowpass';
filter.frequency.value = 500;

highpass

highpass指高頻的通過萨螺,低頻的過濾掉

// 低于3000都被過濾
filter.type = 'highpass';
filter.frequency.value = 3000;

bandpass

允許頻率有個公差(tolerance), 通過 Q 來指定窄做, Q值越大, frequency越低

filter.type = 'bandpass';
filter.frequency.value = 1000;
filter.Q.value = 1

5.調(diào)節(jié)音頻(modulate filter cutoff)

對于 AudioParam 實例 frequency 有幾個方法可以在指定時間內(nèi)改變音頻

setValueAtTime(value, time)

在一個精確的時間設(shè)置一個常量更改AudioParam的值慰技,以AudioContext.currentTime來衡量

linearRampToValueAtTime(value, endTime)

線性的改變AudioParam的值

exponentialRampToValueAtTime(value, endTime)

以指數(shù)方式該案AudioParam的值

示例:

// 預設(shè)頻率椭盏,避免在起始時就跳動
filter.frequency.value = 200;

// 計劃開始時間
filter.frequency.setValueAtTime(200, audioContext.currentTime)

// 變化(ramp)到指定值,在規(guī)定時間內(nèi)
filter.frequency.linearRampToValueAtTime(6000, audioContext.currentTime + 2) // 2s

6.Gain Node 增益效果

使用 GainNode 來改變輸出音量

# 創(chuàng)建增益節(jié)點
var amp = audioContext.createGain();
# 連接到destination
amp.connect(audioContext.destination);

# 音量減半
amp.gain.value = 0.5

可以使用 setTargetAtTime() 對增益的值進行實時掃描

/*
 * targetValue: 0 | 1, 0表示開始時吻商, 1表示結(jié)束時
 * startTime: audioContext.currentTime
 * tiemConstant: 指數(shù)衰減率(0 - 1)掏颊,時間常量,秒為單位
 */
setTargetAtTime(targetValue, startTime, timeConstant)

有兩種方式 Attact(開始時柔化聲音0-1)Release(在尾部柔化聲音1-0)

var startTime = audioContext.currentTime;
amp.gain.value = 0; // 0 - 100
amp.gain.setTargetAtTime(0, startTime, 0.1);

var endTime = startTime + 2;
amp.setTargetAtTime(1, endTime, 0.2)

7.顫音(Vibrato)

在振蕩器連接 oscillator.detune 之前放大輸出效果

改變失諧(detune)值 在 2Hz時艾帐, +/- 100 cents

var vibrato = audioContext.createGain();
vibrato.gain.value = 100;
vibrato.connect(oscillator.detune);

var lfo = audioContext.createOscillator();
lfo.connect(vibrato);
lfo.frequency.value = 2;

lfo.start(audio.currentTime);
lfo.stop(audio.currentTime + 2);

總結(jié)

對一些新的API進行了粗略的了解乌叶,大多專業(yè)名詞,但是實現(xiàn)原理比較簡單柒爸, 輸入音頻源准浴,經(jīng)過AudioContext,將各種效果節(jié)點連接起來,然后輸出音頻源

專業(yè)詞匯比如:

  1. 振蕩器(OscillatorNode)
  2. 半音階使用frequency表示的公式捎稚,也可以使用失諧detune表示
  3. 音頻過濾器BiquadFilterNode
  4. 增益都節(jié)點音量進行調(diào)節(jié)GainNode, 還可以使用顫音效果乐横, 對特定頻率的音色進行波動

其他的一些效果如下:

var audioContext = new AudioContext()
var analyser = audioContext.createAnalyser() // 分析器
var distortion = audioContext.createWaveShaper() // 扭曲器
var gainNode = audioContext.createGain() // 增益 
var convolver = audioContext.createConvolver() // 卷積器
var biquadFilter = audioContext.createBiquadFilter() // 音頻過濾器
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市今野,隨后出現(xiàn)的幾起案子葡公,更是在濱河造成了極大的恐慌,老刑警劉巖条霜,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件催什,死亡現(xiàn)場離奇詭異,居然都是意外死亡宰睡,警方通過查閱死者的電腦和手機蒲凶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夹厌,“玉大人豹爹,你說我怎么就攤上這事裆悄∶疲” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵光稼,是天一觀的道長或南。 經(jīng)常有香客問我孩等,道長,這世上最難降的妖魔是什么采够? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任肄方,我火速辦了婚禮,結(jié)果婚禮上蹬癌,老公的妹妹穿的比我還像新娘权她。我一直安慰自己,他們只是感情好逝薪,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布隅要。 她就那樣靜靜地躺著,像睡著了一般董济。 火紅的嫁衣襯著肌膚如雪步清。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天虏肾,我揣著相機與錄音廓啊,去河邊找鬼。 笑死封豪,一個胖子當著我的面吹牛谴轮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吹埠,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼书聚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了藻雌?” 一聲冷哼從身側(cè)響起雌续,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胯杭,沒想到半個月后驯杜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡做个,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年鸽心,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片居暖。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡顽频,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出太闺,到底是詐尸還是另有隱情糯景,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站蟀淮,受9級特大地震影響最住,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怠惶,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一涨缚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧策治,春花似錦脓魏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讽膏,卻和暖如春檩电,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背府树。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工俐末, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奄侠。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓卓箫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親垄潮。 傳聞我的和親對象是個殘疾皇子烹卒,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容

  • The Audio Listener acts as a microphone-like device. It r...
    Moment__格調(diào)閱讀 1,871評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)弯洗,斷路器旅急,智...
    卡卡羅2017閱讀 134,715評論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件牡整、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,124評論 4 61
  • 平時吃飯時總是對女兒說藐吮,吃飯時不能說話,好好吃飯逃贝,吃完飯再說谣辞,吃完飯再玩。 今天晚飯的時候沐扳,奶奶說了一句:...
    boy118閱讀 147評論 1 1
  • 都說你向陽 都說你勇敢 在我無助迷茫的時候 我每每告訴自己要向你一樣 因為葵花向陽 因為你充滿正能量 卻忘了你的花...
    向日葵的夢LI閱讀 253評論 0 1