iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 13
0

0. 今日工事

  • hihat 連 high 四個八
  • source 白噪
  • gain & envelope
  • filter & envelope
  • Envelope: Control Signal

1. hihat 連 high 四個八

瞭解了噪音,剩下的就是美感了。這再複習一下AudioNode的概念:AudioNode可以簡單分成三種:Source、Effect、Destination。Source 像是吉他弦的振動產生基本訊號;Effect 是效果器增加聲音的豐富性與變化;Destination 是音響的輸出讓人們聽到跟著跳舞。上一篇介紹了 hihat 合成的 source 是 noise,這邊來談 Effect!

可以順便看一下Roland 官方對於 hihat合成的見解吧。
Yes

2. source 白噪

我們在 hihat 合成上選擇的是 white noise,主要的原因是他有衝腦量的高頻,很次很涼打起來很脆。昨天寫了一整段合成的演算,在 Tone.js 我們只需要輕輕一聲呼喊,noise 大軍隨時聽令:

var noise = new Tone.Noise({
    type  : 'white', // 'white' | 'pink' | 'brown'
    playbackRate  : 1
}).toMaster();

3. gain & envelope

就像吉他需要彈,鼓也需要敲擊;合成聲音的概念當中,source 震盪是不間斷的,但我們覺得那樣沒有節奏、沒有生命、沒有 in。需要做的事情是讓他經過一個被 envelope 控制的GainNodeGainNode所作為只是將 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

https://ithelp.ithome.com.tw/upload/images/20180102/201078289TQ8U6C5aS.png

其中一個Tone.NoiseSynth就是幫我們做好了上面的事情:

https://ithelp.ithome.com.tw/upload/images/20180102/20107828K7d3jV6GR4.png

如此一來,你只需要建立一個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"); 

4. filter & envelope

敲是敲出來了啦,但是做音樂假如不加 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");
...

5. Envelope: Control Signal

後面觀念的提點:有趣的事情是雖然我一直強調SourceNode是 noise,而EffectNode是 filter 和 gain。但了解的人其實就會知道這有點點怪怪的,那 envelope 算什麼呢?他其實嚴格來說也是一種 source,會自主產生訊號。但是之所以我們不說他是 source,是因為我們形容 oscillator 和 noise 是 source,暗暗指稱的是 Audio Source。而 envelope 則比較像是 Control Source 或說是 Control Signal,會將訊號送進一些AudioNode(包括SourceNodeEffectNode)進行參數控制,而不會直接變成聲音的組成,也是他為什麼不叫做(Audio)Source。

6. 請愛CYBER の audio / VISUAL

鼓機的最後衝刺。明天小鼓報到!
接下來,就要回到 three.js 裡面的模型載入。

關於作者

Vibert Thio

致力於將對於技術的深度研究轉化為新型態藝術創作的能量,並思考技術的拓展/侷限與其對於藝術論述/呈現的影響。專長為數位藝術創作、音像程式設計、互動設計,喜愛即時運算的臨場感與不可預測。


上一篇
§d12§ 振盪器派對!演算 の 鼓組!hihat自造所!(一)
下一篇
§d14§ 振盪器派對!演算 の 鼓組!snare進行曲!
系列文
aesthEtic,CYBERの audio / VISUAL,網頁中的聲音與影像研究30

尚未有邦友留言

立即登入留言