Audio

Web Audio API

audio element둜 λΆˆκ°€λŠ₯ν•œ λ³΅μž‘ν•œ μΈν„°λ ‰ν‹°λΈŒν•œ μ˜€λ””μ˜€ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λ € ν•  λ•Œ μ‚¬μš© λœλ‹€.

  • κ·Έλž˜ν”„μ— κΈ°λ°˜ν•œ μ˜€λ””μ˜€ ν”„λ‘œκ·Έλž˜λ° API

  • Audio Node라 λΆˆλ¦¬μš°λŠ” λ‹€μ–‘ν•œ μš”μ†Œλ“€μ„ μ—°κ²°ν•˜μ—¬ κ·Έλž˜ν”„λ₯Ό λ§Œλ“ λ‹€.

Audio Element

  • λ―Έλ””μ–΄ μž¬μƒ

Web Audio API

  • κ²Œμž„

  • ν™”μƒνšŒμ˜

  • μŒμ•… μ œμž‘

  • μŒμ•… ꡐ윑

  • μž…μ²΄ 음ν–₯

AudioContext

λͺ¨λ“  μ›Ή μ˜€λ””μ˜€ κΈ°λŠ₯에 λͺ¨μ²΄κ°€ λ˜λŠ” 객체

  • λ‹€μ–‘ν•œ μ˜€λ””μ˜€ λ…Έλ“œλ₯Ό λ§Œλ“¦

  • μ˜€λ””μ˜€ μž¬μƒμ„ μ‹œμž‘ν•˜κ±°λ‚˜ λ©ˆμΆ”λŠ” κΈ°λŠ₯을 제곡

const ctx = new AudioContext();

AudioBuffer

μ˜€λ””μ˜€ 데이터λ₯Ό μ €μž₯ν•˜λŠ” 객체

AudioBufferλ₯Ό μ‚¬μš©ν•΄μ„œ mp3 파일과 같은 μ™ΈλΆ€ μ˜€λ””μ˜€ λ¦¬μ†ŒμŠ€λ₯Ό μ›Ήμ—μ„œ μž¬μƒμ‹œν‚€λŠ” 방법은 λ‹€μŒκ³Ό κ°™λ‹€.

  1. μ™ΈλΆ€ μ˜€λ””μ˜€ νŒŒμΌμ„ λ‘œλ“œν•˜κ³ , arrayBuffer 객체둜 λ³€ν™˜ ν›„ audio context에 μ „λ‹¬ν•œλ‹€.

  2. decodeAudioDataλ₯Ό ν™œμš©ν•˜μ—¬ arrayBufferλ₯Ό web audio apiκ°€ 이해할 수 μžˆλŠ” ν˜•μ‹μœΌλ‘œ λ³€ν™˜(decode)ν•œλ‹€.

  3. AudioBufferSourceNodeλ₯Ό 톡해 μ˜€λ””μ˜€λ₯Ό μž¬μƒμ‹œν‚¨λ‹€.

const ctx = new AudioContext();
const res = await window.fetch(url);
const arrayBuffer = await res.arrayBuffer();
const audioBuffer = await ctx.decodeAudioData(arrayBuffer);
const source = ctx.createBufferSource();

source.buffer = audioBuffer;
source.connect(ctx.destination);
source.start();

λ²„νΌλŠ” 데이터λ₯Ό μž„μ‹œλ‘œ μ €μž₯ν•˜λŠ” κ³΅κ°„μ΄λ‚˜ μž₯치λ₯Ό 의미

  • arrayBuffer β†’ 2진 λ°μ΄ν„°λ‘œ κ΅¬μ„±λœ 버퍼λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 객체

Oscillator

νŒŒλ™ 생성을 λ‹΄λ‹Ή

νŒŒλ™ νƒ€μž…

  • "sine", "square", "sawtooth", "triangle", "custom"

const osc = ctx.createOscillator();
osc.type = "sign";

Gain

λ³Όλ₯¨ λ‹΄λ‹Ή

const amp = ctx.createGain();

Compressor

음ν–₯의 Dynamic Rangeλ₯Ό μ’νžˆλŠ”λ° μ‚¬μš©

const convolver = ctx.createDynamicsCompressor();
  • Dyanmic Rangeλ₯Ό μ˜λ„μ μœΌλ‘œ 쀄인뒀 μ†Œλ¦¬μ˜ 전체적인 μŒλŸ‰μ„ μ¦κ°€μ‹œμΌœμ„œ 쑰금 더 λ°•λ ₯μžˆλŠ” μ†Œλ¦¬λ₯Ό λ‚˜νƒ€λ‚΄κ²Œ ν•œλ‹€. (with Gain)

Dynamic Range μž¬μƒκ°€λŠ”ν•œ μŒλŸ‰μ˜ 큰 λΆ€λΆ„κ³Ό μž‘μ€ λΆ€λΆ„μ˜ μ°¨

νŒŒλΌλ―Έν„°

  • Threshold β†’ Compressorκ°€ μ‹œμž‘λ  μŒλŸ‰

    • μž…λ ₯ 음ν–₯이 ν•΄λ‹Ή νŒŒλΌλ―Έν„°λ³΄λ‹€ 크면 Compressorκ°€ λ™μž‘ν•΄ 좜λ ₯ μŒλŸ‰μ„ μ€„μ΄κ²Œ λœλ‹€.

  • Ratio β†’ μŒλŸ‰μ„ μ–Όλ§ˆλ‚˜ 쀄인것인지

    • Threshold와 μ‘°ν•©ν•˜μ—¬ μ†Œλ¦¬κ°€ 가진 Dynamic Rangeλ₯Ό μ œμ–΄ν•  수 μžˆλ‹€.

  • Makeup Gain β†’ μ••μΆ•λœ Dynamic Rangeλ₯Ό λ³΄μƒν•΄μ£ΌλŠ” μ—­ν• 

    • μ••μΆ•λœ 만큼 μ†Œλ¦¬λ₯Ό 올렀주면 λ°•λ ₯μžˆλŠ” μ†Œλ¦¬λ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

λ²„μŠ€ μ΄νŽ™νŠΈ

μ—¬λŸ¬ μ†Œλ¦¬κ°€ ν•˜λ‚˜λ‘œ ν•©μ³μ§€λŠ” 경둜λ₯Ό λ²„μŠ€λΌ ν•œλ‹€.

  • μ»΄ν”„λ ˆμ„œλŠ” λ²„μŠ€ κΈΈλͺ©μ— μ‚½μž…λ˜μ–΄μ Έμ•Ό ν•œλ‹€.

  • Dynamic Compressor NodeλŠ” CPU μ†Œλͺ¨κ°€ κ½€ 크닀.

  • 각 μƒ˜ν”Œλ§ˆλ‹€ κ°œλ³„μ μœΌλ‘œ μ μš©μ‹œν‚€κΈ° λ³΄λ‹€λŠ” μ΅œμ’… 좜λ ₯에 μ μš©ν•˜λŠ”κ²Œ νš¨μœ¨μ μ΄λ‹€.

  • λͺ¨λ“  μ†Œλ¦¬κ°€ ν•˜λ‚˜μ˜ μ»΄ν”„λ ˆμ„œλ₯Ό ν†΅κ³Όμ‹œν‚€κ²Œ ν•¨μœΌλ‘œμ¨ 전체적인 μŒμƒ‰μ˜ 일관성도 지킬 수 μžˆλ‹€.

Convolver

리벌브(μž”ν–₯) 효과 λ‹΄λ‹Ή

  • Convolver Nodeλ§ŒμœΌλ‘œλŠ” μ•„λ¬΄λŸ° 효과λ₯Ό λ‚Ό 수 μ—†λ‹€.

  • μž„νŽ„μŠ€ 응닡(Impuls Response)이라 λΆˆλ¦¬λŠ” μ˜€λ””μ˜€ νŒŒμΌμ„ μ˜€λ””μ˜€ λ²„νΌλ‘œ λΆˆλŸ¬λ“€μ—¬μ„œ 컨볼버에 ν• λ‹Ήν•΄μ€˜μ•Ό ν•œλ‹€

  • λ§ˆμ°¬κ°€μ§€λ‘œ CPUμ†Œλͺ¨κ°€ 크기 λ•Œλ¬Έμ— λ²„μŠ€μ΄νŽ™νŠΈλ₯Ό μ‚¬μš©ν•΄μ„œ μ΅œμ’… 좜λ ₯에 μ μš©ν•˜μž.

const convolver = ctx.createConvolver();

μž„νŽ„μŠ€ 응닡(Impuls Response)

  • μ†Œλ¦¬μ˜ μšΈλ¦Όμ†Œλ¦¬μ˜ νŠΉμ„±μ„ 가지고 μžˆλŠ” 것

  • 곡간 μžμ²΄κ°€ 가지고 μžˆλŠ” μŒμƒ‰, 울림의 κΈΈκ³  짧음

  • 즉 κ³΅κ°„μ˜ νŠΉμ„±μ„ 가지고 있음

Analyser

뢄석 및 μ‹œκ°ν™” λͺ©μ μœΌλ‘œ μ‹€μ‹œκ°„ 정보λ₯Ό μΆ”μΆœ

const analyser = ctx.createAnalyser();

MediaElementAudioSourceNode

μŒμ›μœΌλ‘œ μž…λ ₯λ˜μ–΄ μžˆλŠ” Audio의 좜λ ₯을 μžλ™μœΌλ‘œ νŠΈλž˜ν‚Ήν•œλ‹€.

const mediaElementSource = ctx.createMediaElementSource(audio);

μƒμ„±μž 방식: 일뢀 λΈŒλΌμš°μ €μ—μ„œ μ§€μ›λ˜μ§€ μ•Šμ„ 수 μžˆλ‹€.

const mediaElementSource = new MediaElementAudioSourceNode(ctx, {mediaElement: audio});

Last updated