瞭解了噪音,剩下的就是美感了。這再複習一下AudioNode
的概念:AudioNode
可以簡單分成三種:Source、Effect、Destination。Source 像是吉他弦的振動產生基本訊號;Effect 是效果器增加聲音的豐富性與變化;Destination 是音響的輸出讓人們聽到跟著跳舞。上一篇介紹了 hihat 合成的 source 是 noise,這邊來談 Effect!
可以順便看一下Roland 官方對於 hihat合成的見解吧。
我們在 hihat 合成上選擇的是 white noise,主要的原因是他有衝腦量的高頻,很次很涼打起來很脆。昨天寫了一整段合成的演算,在 Tone.js 我們只需要輕輕一聲呼喊,noise 大軍隨時聽令:
var noise = new Tone.Noise({
type : 'white', // 'white' | 'pink' | 'brown'
playbackRate : 1
}).toMaster();
就像吉他需要彈,鼓也需要敲擊;合成聲音的概念當中,source 震盪是不間斷的,但我們覺得那樣沒有節奏、沒有生命、沒有 in。需要做的事情是讓他經過一個被 envelope 控制的GainNode
。GainNode
所作為只是將 input 進行放大或是縮小。所以,envelope 控制下的GainNode
使得聲音有了音量的變化,就像是敲擊一樣的 pulse,出現、減緩、消失,也就是玩 kick 合成時講過的ADSR。
我們可以把被當作 Source 的noise
接上一個 Tone.js 設計好的Tone.AmplitudeEnvelope
:
const ampEnv = new Tone.AmplitudeEnvelope({
"attack": 0.1,
"decay": 0.2,
"sustain": 1.0,
"release": 0.8
}).toMaster();
const noise = new Tone.Noise({
type : 'white', // 'white' | 'pink' | 'brown'
playbackRate : 1,
}).connect(ampEnv);
覺得太麻煩,玩個樂器還要兩個變數?Tone.js 考慮到使用場景太過重複,就多加了許多instruments
。
其中一個Tone.NoiseSynth
就是幫我們做好了上面的事情:
如此一來,你只需要建立一個Tone.NoiseSynth
,就能夠開始玩基本的節奏了!
// 創造 noise + envelope,並接上 output
const noiseSynth = new Tone.NoiseSynth(
noise: {
type: white // 設定 noise 類型
},
envelope: { // 設定 ADSR
attack: 0.005,
decay: 0.1,
sustain: 0,
},
}).toMaster();
// 敲擊一個八分音符
noiseSynth.triggerAttackRelease("8n");
敲是敲出來了啦,但是做音樂假如不加 filter 人家瞧不起你欸。哈哈開玩笑的啦,雞拜。就像是透過 envelope 控制音量(gain)來製造聲音動態,其實濾波器也可以這樣玩。濾波器的參數很多部分都可以調整、玩弄、嬉戲,最常被 DJ 把弄的就是 cutoff frequency。顧名思義,就是濾波器主要濾掉的範圍調整!我要做事情是將訊號串接一個高通濾波器(High Pass Filter)在出到toMaster()
。,原本接到 toMaster()
(output)的noiseSynth
接到 高通濾波器上,並用一個Tone.FrequencyEnvelope
去控制高通濾波器filter.frequency
(就是 cutoff frequency)。
...
const filter = new Tone.Filter(500, "highpass").toMaster();
const freqEnv = new Tone.FrequencyEnvelope({
"attack": 0.2,
"baseFrequency": "500",
"octaves": 4,
}).connect(filter.frequency);
noiseSynth.triggerAttackRelease("8n");
freqEnv.triggerAttackRelease("8n");
...
後面觀念的提點:有趣的事情是雖然我一直強調SourceNode
是 noise,而EffectNode
是 filter 和 gain。但了解的人其實就會知道這有點點怪怪的,那 envelope 算什麼呢?他其實嚴格來說也是一種 source,會自主產生訊號。但是之所以我們不說他是 source,是因為我們形容 oscillator 和 noise 是 source,暗暗指稱的是 Audio Source。而 envelope 則比較像是 Control Source 或說是 Control Signal,會將訊號送進一些AudioNode
(包括SourceNode
和EffectNode
)進行參數控制,而不會直接變成聲音的組成,也是他為什麼不叫做(Audio)Source。
鼓機的最後衝刺。明天小鼓報到!
接下來,就要回到 three.js 裡面的模型載入。
關於作者
Vibert Thio
致力於將對於技術的深度研究轉化為新型態藝術創作的能量,並思考技術的拓展/侷限與其對於藝術論述/呈現的影響。專長為數位藝術創作、音像程式設計、互動設計,喜愛即時運算的臨場感與不可預測。