ì¤ëì¤ê° ì´ë»ê² ì¬ë¬ë¶ì ì±ì íµí´ì ì ì¡(route)ëëì§ë¥¼ ì¤ê³íë ëì ì¬ë¬ë¶ì´ ì ì í ê²°ì ì ë´ë¦¬ë ê²ì ë기 ìí´, ì´ ë¬¸ìë Web Audio APIì 기ë¥ì´ ì´ë»ê² ëìíëê°ë¥¼ ë·ë°ì¹¨íë ì¼ë§ê°ì ì¤ëì¤ ì´ë¡ ì ì¤ëª í©ëë¤. ì´ ë¬¸ì를 ì½ëë¤ê³ í´ì ì¬ë¬ë¶ì´ ìë ¨ë ì¬ì´ë ìì§ëì´ê° ë ìë ìì§ë§, ì Web Audio APIê° ì´ë ê² ëìíëì§ë¥¼ ì´í´í기ì ì¶©ë¶í ë°°ê²½ì§ìì ì¤ ê²ì ëë¤.
ì¤ëì¤ ê·¸ëíWeb Audio APIë ì¤ëì¤ ì»¨í ì¤í¸(audio context) ë´ì ì¤ëì¤ ì°ì°ì ë¤ë£¨ë ê²ì í¬í¨íê³ , 모ëë¬ ë¼ì°í (modular routing)ì íì©íëë¡ ì¤ê³ëììµëë¤. 기본ì ì¸ ì¤ëì¤ ì°ì°ì ì¤ëì¤ ë ¸ë(audio node)ì í¨ê» ìíëëë°, ì´ë ì¤ëì¤ ë¼ì°í ê·¸ëí를 íì±í기 ìí´ í¨ê» ì°ê²°ëì´ ììµëë¤. ë¤ë¥¸ ì íì ì±ë ë ì´ììì ê°ì§ ëªëªì ìì¤(source)ë¤ì ì¬ì§ì´ íëì 컨í ì¤í¸ ë´ìì ì§ìë©ëë¤. ì´ ëª¨ëìì(modular) ëìì¸ì ìëì ì¸ í¨ê³¼ë¥¼ ê°ì§ ë³µì¡í ì¤ëì¤ ê¸°ë¥ì ë§ëë ë° ìì´ ì ì°í¨ì ì ê³µí©ëë¤.
íë ëë ë ë§ì ìì¤ìì ììíê³ , íë ëë ë ë§ì ë ¸ë를 íµê³¼íê³ , ê·¸ë¦¬ê³ ì ëì°©ì§(destination)ìì ëëë ì²´ì¸(chain)ì íì±íë©°, ì¤ëì¤ ë ¸ëë ì ë ¥ê³¼ ì¶ë ¥ì íµí´ ì°ê²°ëì´ ììµëë¤. ê·¸ë¬ë, ì를 ë¤ì´ ì¬ë¬ë¶ì´ ë¨ì§ ì¤ëì¤ ë°ì´í°ë¥¼ ìê°íí기를 ìíë¤ë©´ ëì°©ì§ë¥¼ ë°ëì ì ê³µí íìë ììµëë¤. ì¹ ì¤ëì¤ì ë¨ìíê³ , ì¼ë°ì ì¸ ìì íë¦ì ë¤ìê³¼ ê°ìµëë¤:
<audio>
, oscillator, ëë stream.ì°¸ê³ : í ì í¸ìì ì¬ì© ê°ë¥í ì¤ëì¤ ì±ëì ì«ìë ì¢ ì¢ ì«ì íìì¼ë¡ ííëëë°, ì를 ë¤ìë©´ 2.0 ëë 5.1ê³¼ ê°ìµëë¤. ì´ê²ì ì±ë í기ë²ì´ë¼ê³ ë¶ë¦½ëë¤. 첫ë²ì§¸ ì«ìë ì í¸ê° í¬í¨íë ì ì²´ 주íì ë²ì ì¤ëì¤ ì±ëì ì«ìì ëë¤. ë§ì¹¨í ë¤ì ì«ìë ì 주í í¨ê³¼(LFE) ì¶ë ¥ì ëí´ ë¹ì¶ë ì±ëì ì를 ëíë ëë¤; ì´ ì«ìë ì¢ ì¢ ìë¸ ì°í¼(subwoofer)ë¡ ë¶ë¦½ëë¤.
ê°ê°ì ì ë ¥ ëë ì¶ë ¥ì ëªëªì ì±ëì¼ë¡ 구ì±ëì´ ìëë°, ì´ë í¹ì í ì¤ëì¤ ë ì´ììì ëíë ëë¤. ëª¨ë ¸, ì¤í ë ì¤, quad, 5.1 ë±ë±ì í¬í¨íë, ì´ë í ë³ê°ì ì±ë 구조ë ì§ìë©ëë¤.
ì¤ëì¤ ìì¤ë ë¤ìí ë°©ë²ì¼ë¡ ì»ì´ì§ ì ììµëë¤:
<video>
ëë <audio>
ì²ë¼) HTML 미ëì´ ììë¡ë¶í° ì·¨í´ì§ ì ììµëë¤.MediaStream
ë¡ë¶í° ì§ì ì ì¼ë¡ ì·¨í´ì§ ì ììµëë¤.ì¤ëì¤ ì í¸ê° ì²ë¦¬ë ë, ìíë§ì´ë ì°ì ì í¸(continuous signal)ì ë¶ì°ì ì í¸(discrete signal)ë¡ì ì íì ì미í©ëë¤; ëë ë¬ë¦¬ ë§íë©´, ë¼ì´ë¸ë¡ ì°ì£¼íê³ ìë ë°´ëì ê°ì´, ì°ìì ì¸ ìí를 ì»´í¨í°ê° ì¤ëì¤ë¥¼ 구ë³ëë ë¨ìë¡ ë¤ë£° ì ìê² íì©íë ì¼ë ¨ì ìíë¤ë¡ ì ííë ê²ì ì미í©ëë¤.
ë ë§ì ì ë³´ë ìí¤í¼ëì 문ì ìíë§ (ì í¸ ì²ë¦¬)ìì ì°¾ì ì ììµëë¤.
ì¤ëì¤ ë²í¼: íë ì, ìí, ê·¸ë¦¬ê³ ì±ëAudioBuffer
ë 매ê°ë³ìë¡ì ì±ëì ì (1ì 모ë
¸, 2ë ì¤í
ë ì¤ ë±), ë²í¼ ë´ë¶ì ìí íë ìì ì를 ì미íë 길ì´, ê·¸ë¦¬ê³ ì´ë¹ ì¬ìëë ìí íë ìì ìì¸ ìí ë ì´í¸ë¥¼ ì·¨í©ëë¤.
ìíì í¹ì í ì±ë(ì¤í ë ì¤ì ê²½ì°, ì¼ìª½ ëë ì¤ë¥¸ìª½)ìì, ê°ê°ì í¹ì í ìì ìì ì¤ëì¤ ì¤í¸ë¦¼ì ê°ì íííë ë¨ì¼ì float32 ê°ì ëë¤. íë ì ëë ìí íë ìì, í¹ì í ìì ì ì¬ìë 모ë ì±ëì 모ë ê°ë¤ì ì§í©ì ëë¤: ì¦ ê°ì ìê°ì ì¬ìëë 모ë ì±ëì 모ë ìí (ì¤í ë ì¤ ì¬ì´ëì ê²½ì° 2ê°, 5.1ì ê²½ì° 6ê° ë±)ì ëë¤.
ìí ë ì´í¸ë Hzë¡ ì¸¡ì ëë, 1ì´ì ì¬ìë ì´ ìíë¤ (ëë íë ìë¤, ìëíë©´ í íë ìì 모ë ìíë¤ì´ ê°ì ìê°ì ì¬ìëë¯ë¡) ì ìì ëë¤. ìí ë ì´í¸ê° ëììë¡ ìì§ì´ ë ì¢ìµëë¤.
ëª¨ë ¸ì ì¤í ë ì¤ ì¤ëì¤ ë²í¼ë¥¼ ì´í´ë´ ìë¤, ê°ê° 1ì´ ê¸¸ì´ê³ , 44100Hzë¡ ì¬ìë©ëë¤:
length
íë¡í¼í°ë 44100ì´ ë ê²ì
ëë¤.length
íë¡í¼í°ë íë ìì ìì ëì¼íë¯ë¡ ì¬ì í 44100ì¼ ê²ì
ëë¤.ë²í¼ê° ì¬ìë ë, ì¬ë¬ë¶ì ì ì¼ ì¼ìª½ì ìí íë ìì ë¤ì ê²ì´ê³ , ê·¸ë¦¬ê³ ì ë¤ìì ìë ì ì¼ ì¤ë¥¸ìª½ì ìí íë ì ë±ë±ì ë¤ì ê²ì ëë¤. ì¤í ë ì¤ì ê²½ì°ì, ì¬ë¬ë¶ì ì ì±ëì ëìì ë¤ì ê²ì ëë¤. ìí íë ìì ëë¨í ì ì©íë°, ìëíë©´ ìí íë ìì ì±ëì ìì ë 립ì ì´ê³ , ì ë°í ì¤ëì¤ ì¡°ìì í¨ì ìì´ ì ì©í ë°©ë²ì¼ë¡ ìê°ì ëíë´ê¸° ë문ì ëë¤.
ì°¸ê³ : íë ì ì¹´ì´í¸ë¡ë¶í° ì´ë¡ ìê°ì ì»ê¸° ìí´ìë, íë ìì ì를 ìí ë ì´í¸ë¡ ëëììì¤. ìíì ìë¡ë¶í° íë ìì ì를 ì»ê¸° ìí´ìë, ì±ë ì¹´ì´í¸ë¡ ëëììì¤.
ë ê°ì ê°ë¨í ìì ì ëë¤:
var context = new AudioContext();
var buffer = context.createBuffer(2, 22050, 44100);
ì°¸ê³ : ëì§í¸ ì¤ëì¤ìì, 44,100 Hz (ëí 44.1 kHzë¡ ííëì´ì§) ì ì¼ë°ì ì¸ ìíë§ ì£¼íìì ëë¤. ì 44.1kHzì¼ê¹ì?
첫째ë¡, ìëíë©´ ì¸ê°ì ê°ì² ë²ì(hearing range)ë ëëµì ì¼ë¡ 20 Hzìì 20,000 Hzì´ê¸° ë문ì ëë¤. í본í ì 리(NyquistâShannon sampling theorem)ì ìíì¬, ìíë§ ì£¼íìë ë°ëì ì¬ìí기를 ìíë ìµë 주íìì 2ë°°ë³´ë¤ ì»¤ì¼ í©ëë¤. ê·¸ë¬ë¯ë¡, ìíë§ ë ì´í¸ë 40 kHzë³´ë¤ ì»¤ì¼ë§ í©ëë¤.
ë째ë¡, ì í¸ë ë°ëì ìíë§ ì ì ì 주í íµê³¼ íí°(low-pass filter)를 ê±°ì³ì¼ë§ í©ëë¤, ê·¸ë ì§ ìì¼ë©´ ìì¼ë¦¬ì´ì±(aliasing)ì´ ë°ìí©ëë¤. ì´ìì ì¸ ì 주í íµê³¼ íí°ë ìë²½í 20 kHz ìëì 주íìë¤ì (ì½íìí¤ë ì¼ ìì´) íµê³¼ìí¤ê³ ìë²½í 20 kHz ìì 주íìë¤ì ìë¼ë¼ ê²ì´ì§ë§, ì¤ì ë¡ë ì²ì´ ëì(transition band)ì´ íìì ì¸ë°, ì¬ê¸°ì 주íìë¤ì ë¶ë¶ì ì¼ë¡ ì½íë©ëë¤. ì²ì´ ëìì´ ëììë¡, 주íì ì¤ë³µë°©ì§ íí°(anti-aliasing filter)를 ë§ë¤ê¸° ì½ê³ ê²½ì ì ì ëë¤. 44.1 kHz ìíë§ ì£¼íìë 2.05 kHz ì²ì´ ëìì ê°ìí©ëë¤.
ë§ì½ ìì ì´ í¸ì¶ì ì¬ì©íë¤ë©´, ì¬ë¬ë¶ì 44100Hz (ì주 ì¼ë°ì ì ëë¤, ëë¶ë¶ì ë³´íµ ì¬ì´ë ì¹´ëë ì´ ë ì´í¸ìì ì¤íë©ëë¤) ìì ì¤íëë AudioContextìì ì¬ìë ë 0.5ì´ëì ì§ìë ë ê°ì ì±ëì ê°ì§ ì¤í ë ì¤ ë²í¼ë¥¼ ì»ì ê²ì ëë¤. (22050 íë ì / 44100Hz = 0.5ì´)
var context = new AudioContext();
var buffer = context.createBuffer(1, 22050, 22050);
ë§ì½ ì´ í¸ì¶ì ì¬ì©íë¤ë©´, ì¬ë¬ë¶ì 44100Hzìì ì¤íëë AudioContextìì ì¬ìë ë ìëì ì¼ë¡ 44100Hzë¡ ë¦¬ìí(resample)ëê³ 1.0ì´ëì ì§ìë ë¨ì§ íëì ì±ëì ê°ì§ ëª¨ë ¸ ë²í¼ë¥¼ ì»ì ê²ì ëë¤. (44100 íë ì / 44100Hz = 1ì´)
ì°¸ê³ : ì¤ëì¤ ë¦¬ìíë§ì ì´ë¯¸ì§ 리ì¬ì´ì§ê³¼ 몹ì ì ì¬í©ëë¤. ì를 ë¤ì´ ì¬ë¬ë¶ì´ 16 x 16 ì´ë¯¸ì§ë¥¼ ê°ì§ê³ ìì§ë§ 32 x 32 ììì ì±ì°ê³ ì¶ë¤ê³ ê°ì í´ ë´ ìë¤. ë¹ì ì 리ì¬ì´ì¦ (ëë 리ìí) í©ëë¤. ê²°ê³¼ë ë ë®ì íì§ì ê°ì§ì§ë§ (리ì¬ì´ì§ ìê³ ë¦¬ì¦ì ë°ë¼ì, í릿íê±°ë ê°ì§ ì ììµëë¤), 리ì¬ì´ì¦ë ì´ë¯¸ì§ê° ë ì ì ê³µê°ì ì°¨ì§í ì±ë¡ ìëì í©ëë¤. 리ìíë ì¤ëì¤ë ì íí ëì¼í©ëë¤: ì¬ë¬ë¶ì ê³µê°ì ì ì¥íì§ë§, ì¤ì ë¡ë ëì 주íìì ì½í ì¸ ëë ê³ ìì ì리를 ì ì í ì¬ìí ì ìì ê²ì ëë¤.
íë©´(planar) ë ì¸í°ë¦¬ë¸(interleaved) ë²í¼Web Audio APIë íë©´ ë²í¼ í¬ë§·ì ì¬ì©í©ëë¤. ì¼ìª½ê³¼ ì¤ë¥¸ìª½ ì±ëì ë¤ìê³¼ ê°ì´ ì ì¥ë©ëë¤:
LLLLLLLLLLLLLLLLRRRRRRRRRRRRRRRR (16 íë ìì ë²í¼ì ëí´)
ì´ê²ì ì¤ëì¤ íë¡ì¸ì±ìì ì주 ì¼ë°ì ì ëë¤: ì´ê²ì ê° ì±ëì ë 립ì ì¼ë¡ ì²ë¦¬í기 ì½ê² ë§ë¤ì´ì¤ëë¤.
ëìì ì¸í°ë¦¬ë¸ ë²í¼ í¬ë§·ì ì¬ì©íë ê²ì ëë¤:
LRLRLRLRLRLRLRLRLRLRLRLRLRLRLRLR (16 íë ìì ë²í¼ì ëí´)
ì´ í¬ë§·ì ë§ì íë¡ì¸ì± ìì´ ì¤ëì¤ë¥¼ ì ì¥íê³ ì¬ìíë ë° ì주 ì¼ë°ì ì¸ë°, ì를 ë¤ìë©´ ëì½ëë MP3 ì¤í¸ë¦¼ì´ ììµëë¤.
Web Audio APIë ì¤ì§ íë©´ ë²í¼ë§ì ëë¬ë´ëë°, ìëíë©´ íë¡ì¸ì±ì ìí´ ë§ë¤ì´ì¡ê¸° ë문ì ëë¤. ì´ê²ì íë©´ì¼ë¡ ëìíë, ì¤ëì¤ê° ì¬ìì ìí´ ì¬ì´ë ì¹´ëì ì ë¬ëìì ë ì¸í°ë¦¬ë¸ë¡ ì íí©ëë¤. ìì¼ë¡, MP3ê° ëì½ëëìì ë, ì´ê²ì ì¸í°ë¦¬ë¸ í¬ë§·ì¼ë¡ ììíë, íë¡ì¸ì±ì ìí´ íë©´ì¼ë¡ ì íë©ëë¤.
ì¤ëì¤ ì±ëë¤ë¥¸ ì¤ëì¤ ë²í¼ë ë¤ë¥¸ ìì ì±ëì í¬í¨í©ëë¤: ê°ë¨í ëª¨ë ¸(ì¤ì§ í ê°ì ì±ë)ì ì¤í ë ì¤(ì¼ìª½ê³¼ ì¤ë¥¸ìª½ ì±ë)ììë¶í°, ê° ì±ëì í¬í¨ë ë¤ë¥¸ ì¬ì´ë ìíì ê°ì§ê³ ìì´ ëì± íë¶í ì리 ê²½íì ê°ë¥ì¼ íë quadì 5.1ê³¼ ê°ì ëì± ë³µì¡í ê²ë¤ê¹ì§ ììµëë¤. ì±ëë¤ì ë³´íµ ìëì í ì´ë¸ì ìì¸í ì¤ëª ë íì¤ ì½ì´ì ìí´ ííë©ëë¤:
Mono0: M: mono
Stereo 0: L: left 1: R: right
Quad 0: L: left 1: R: right 2: SL: surround left 3: SR: surround right
5.1 0: L: left 1: R: right 2: C: center 3: LFE: subwoofer 4: SL: surround left 5: SR: surround right
ì
믹ì±(up-mixing)ê³¼ ë¤ì´ë¯¹ì±(down-mixing)
ì±ëì ìê° ì
ë ¥ê³¼ ì¶ë ¥ ì¬ì´ìì ë§ì§ ìì ë, ì
ëë ë¤ì´ 믹ì±ì´ ë¤ìì ê·ì¹ì ë°ë¼ ë°ìí©ëë¤. ì´ë AudioNode.channelInterpretation
íë¡í¼í°ë¥¼ speakers
ëë discrete
ë¡ ì¤ì í¨ì¼ë¡ì¨ ì´ë ì ë ì ì´ë ì ììµëë¤.
ì¤í¼ì»¤
1
(Mono) 2
(Stereo) 모ë
¸ìì ì¤í
ë ì¤ë¡ ì
믹ì¤
M
ì
ë ¥ ì±ëì´ ì ì¶ë ¥ ì±ë (L
ì R
)ì ëí´ ì¬ì©ë©ëë¤.
output.L = input.M
output.R = input.M
1
(Mono) 4
(Quad) 모ë
¸ìì quadë¡ ì
믹ì¤
M
ì
ë ¥ ì±ëì´ ë¹ ìë¼ì´ë(non-surround) ì¶ë ¥ ì±ëì ëí´ ì¬ì©ë©ëë¤ (L
ê³¼ R
). ìë¼ì´ë ì¶ë ¥ ì±ë (SL
ê³¼ SR
)ì ìëíì§ ììµëë¤(silent).
output.L = input.M
output.R = input.M
output.SL = 0
output.SR = 0
1
(Mono) 6
(5.1) 모ë
¸ìì 5.1ë¡ ì
믹ì¤
M
ì
ë ¥ ì±ëì´ ì¼í° ì¶ë ¥ ì±ë (C
)ì ëí´ ì¬ì©ë©ëë¤. 모ë ë¤ë¥¸ ì±ëë¤(L
, R
, LFE
, SL
, ê·¸ë¦¬ê³ SR
)ì ìëíì§ ììµëë¤.
output.L = 0
output.R = 0
output.C = input.M
output.LFE = 0
output.SL = 0
output.SR = 0
2
(Stereo) 1
(Mono) ì¤í
ë ì¤ìì 모ë
¸ë¡ ë¤ì´ë¯¹ì¤
L
ê³¼ R
)ì ê³ ì í ì¶ë ¥ ì±ë (M
)ì ìì°í기 ìí´ ëë±íê² ê²°í©ë©ëë¤.
output.M = 0.5 * (input.L + input.R)
2
(Stereo) 4
(Quad) ì¤í
ë ì¤ìì quadë¡ ì
믹ì¤
L
ê³¼ R
ì
ë ¥ ì±ëì´ ê°ìì ë¹ ìë¼ì´ë ì¶ë ¥ ì±ë (L
ê³¼ R
)ì ëí´ ì¬ì©ë©ëë¤. ìë¼ì´ë ì¶ë ¥ ì±ë (SL
ê³¼ SR
) ì ìëíì§ ììµëë¤.
output.L = input.L
output.R = input.R
output.SL = 0
output.SR = 0
2
(Stereo) 6
(5.1) ì¤í
ë ì¤ìì 5.1ë¡ ì
믹ì¤
L
ê³¼ R
ì
ë ¥ ì±ëì´ ê°ìì ë¹ ìë¼ì´ë ì¶ë ¥ ì±ë (L
ê³¼ R
) ì ëí´ ì¬ì©ë©ëë¤. ìë¼ì´ë ì¶ë ¥ ì±ë (SL
ê³¼ SR
), ê·¸ë¦¬ê³ ì¼í° (C
) ì ìë¸ì°í¼ (LFE
) ì±ëì ìëíì§ ììµëë¤.
output.L = input.L
output.R = input.R
output.C = 0
output.LFE = 0
output.SL = 0
output.SR = 0
4
(Quad) 1
(Mono) quadìì 모ë
¸ë¡ ë¤ì´ë¯¹ì¤
L
, R
, SL
, and SR
) ì´ ê³ ì í ì¶ë ¥ ì±ë (M
)ì ìì°í기 ìí´ ëë±íê² ê²°í©ë©ëë¤.
output.M = 0.25 * (input.L + input.R +
input.SL + input.SR
)
4
(Quad) 2
(Stereo) quadìì ì¤í
ë ì¤ë¡ ë¤ì´ë¯¹ì¤
L
ê³¼ SL
) ë ë¤ ê³ ì í ì¼ìª½ ì¶ë ¥ ì±ë (L
)ì ìì°í기 ìí´ ëë±íê² ê²°í©ë©ëë¤. ê·¸ë¦¬ê³ ì ì¬íê², ì¤ë¥¸ìª½ ì
ë ¥ ì±ë (R
ê³¼ SR
) ë ë¤ ê³ ì í ì¤ë¥¸ìª½ ì¶ë ¥ ì±ëì ìì°í기 ìí´ ëë±íê² ê²°í©ë©ëë¤.
output.L = 0.5 * (input.L + input.SL
)
output.R = 0.5 * (input.R + input.SR
)
4
(Quad) 6
(5.1) quadìì 5.1ë¡ ì
믹ì¤
L
, R
, SL
, ê·¸ë¦¬ê³ SR
ì
ë ¥ ì±ëì´ ê°ê°ì ì¶ë ¥ ì±ë (L
ê³¼ R
)ì ëí´ ì¬ì©ë©ëë¤. ì¼í° (C
)ì ìë¸ì°í¼ (LFE
) ì±ëì ìëíì§ ìì ì±ë¡ ë¨ìììµëë¤.
output.L = input.L
output.R = input.R
output.C = 0
output.LFE = 0
output.SL = input.SL
output.SR = input.SR
6
(5.1) 1
(Mono) 5.1ìì 모ë
¸ë¡ ë¤ì´ë¯¹ì¤
L
ê³¼ SL
), ì¤ë¥¸ìª½ (R
ê³¼ SR
) ê·¸ë¦¬ê³ ì¤ì ì±ëì´ ëª¨ë í¨ê» 믹ì¤ë©ëë¤. ìë¼ì´ë ì±ëì ì½ê° ì½íëê³ regular lateral ì±ëì íëì ì±ëë¡ ì¹´ì´í¸ëëë¡ â2/2
를 ê³±í¨ì¼ë¡ì¨ íìê° ë³´ì (power-compensated)ë©ëë¤. ìë¸ì°í¼ (LFE
) ì±ëì ìì¤ë©ëë¤.
output.M = 0.7071 * (input.L + input.R) + input.C + 0.5 * (input.SL + input.SR)
6
(5.1) 2
(Stereo) 5.1ìì ì¤í
ë ì¤ë¡ ë¤ì´ë¯¹ì¤
C
)ì´ ê°ê°ì 측면 ìë¼ì´ë ì±ë(SL
ëë SR
)ê³¼ í©ê³ëê³ ê°ê°ì 측면 ì±ëë¡ ë¯¹ì¤ë©ëë¤. ë ê°ì ì±ëë¡ ë¤ì´ë¯¹ì¤ëìì¼ë¯ë¡, ë ë®ì íìë¡ ë¯¹ì¤ëììµëë¤: ê°ê°ì ê²½ì°ì â2/2
ê° ê³±í´ì§ëë¤. ìë¸ì°í¼ (LFE
) ì±ëì ìì¤ë©ëë¤.
output.L = input.L + 0.7071 * (input.C + input.SL)
output.R = input.R
+ 0.7071 * (input.C + input.SR)
6
(5.1) 4
(Quad) 5.1ìì quadë¡ ë¤ì´ë¯¹ì¤
C
) ì±ëì´ ì¸¡ë©´ì ë¹ ìë¼ì´ë ì±ë (L
ê³¼ R
)ê³¼ 믹ì¤ë©ëë¤. ë ì±ëë¡ ë¤ì´ë¯¹ì¤ëìì¼ë¯ë¡, ë ë®ì íìë¡ ë¯¹ì¤ëììµëë¤: ê°ê°ì ê²½ì°ì â2/2
ê° ê³±í´ì§ëë¤. ìë¼ì´ë ì±ëì ë³ê²½ëì§ ìì ì±ë¡ ì ë¬ë©ëë¤. ìë¸ì°í¼ (LFE
) ì±ëì ìì¤ë©ëë¤.
output.L = input.L + 0.7071 * input.C
output.R = input.R + 0.7071 * input.C
output.SL = input.SL
output.SR = input.SR
기í ë¹íì¤ ë ì´ìì ë¹íì¤ ì±ë ë ì´ììì channelInterpretation
ì´ discrete
ë¡ ì¤ì ë ê²ì²ë¼ ë¤ë¤ì§ëë¤.
discrete
any (x
) x<y
ì¸ any (y
) discrete ì±ëì ì
믹ì¤
x
) x>y
ì¸ any (y
) discrete ì±ëì ë¤ì´ë¯¹ì¤
ì¼ë°ì ì¼ë¡, ì¤ëì¤ ìê°íë ë³´íµ ì§í ì´ë(gain) ëë 주íì ë°ì´í°ì¸, ìê°ì ëí ì¤ëì¤ ë°ì´í°ì ì¶ë ¥ì ì ê·¼í¨ì¼ë¡ì¨, ê·¸ë¦¬ê³ ì ê·¸ê²ì ê·¸ëíì ê°ì´ ìê°ì ê²°ê³¼ë¡ ë°ê¾¸ê¸° ìí´ ê·¸ëí½ ê¸°ì ì ì¬ì©í¨ì¼ë¡ì¨ ì±ì·¨ë©ëë¤. Web Audio APIë íµê³¼íë ì¤ëì¤ ì í¸ë¥¼ ë³ê²½íì§ ìë AnalyserNode
를 ê°ì§ê³ ììµëë¤. ëì ì´ê²ì <canvas>
ì ê°ì ìê°í 기ì ë¡ ì ë¬ë ì ìë ì¤ëì¤ ë°ì´í°ë¥¼ ì¶ë ¥í©ëë¤.
ì¬ë¬ë¶ì ë¤ìì ë©ìëë¤ì ì¬ì©í´ ë°ì´í°ë¥¼ ì»ì ì ììµëë¤:
AnalyserNode.getFloatFrequencyData()
íì¬ ì£¼íì ë°ì´í°ë¥¼ ì´ê² ìì¼ë¡ ì ë¬ë Float32Array
ë°°ì´ ìì¼ë¡ ë³µì¬í©ëë¤.
AnalyserNode.getByteFrequencyData()
íì¬ ì£¼íì ë°ì´í°ë¥¼ ì´ê² ìì¼ë¡ ì ë¬ë Uint8Array
(unsigned byte array) ìì¼ë¡ ë³µì¬í©ëë¤.
AnalyserNode.getFloatTimeDomainData()
íì¬ íí, ëë ìê° ìì(time-domain), ë°ì´í°ë¥¼ ì´ê² ìì¼ë¡ ì ë¬ë Float32Array
ìì¼ë¡ ë³µì¬í©ëë¤.
AnalyserNode.getByteTimeDomainData()
íì¬ íí, ëë ìê° ìì, ë°ì´í°ë¥¼ ì´ê² ìì¼ë¡ ì ë¬ë Uint8Array
(unsigned byte array) ìì¼ë¡ ë³µì¬í©ëë¤.
ì°¸ê³ : ë ë§ì ì 보를 ë³´ìë ¤ë©´, Web Audio APIë¡ ìê°í 문ì를 참조íì¸ì.
ê³µê°í(Web Audio APIì PannerNode
ì AudioListener
ë
¸ëì ìí´ ë¤ë¤ì§ë) ì¤ëì¤ ê³µê°íë ê³µê°ì ì´ë¤ ì ììì ì¤ëì¤ ì í¸ì ìì¹ì íëì ëíë´ê³ (model), ì²ì(listener)ê° ê·¸ ì¤ëì¤ë¥¼ ë¤ì ì ìê² íì©í©ëë¤.
pannerì ìì¹ë right-hand ë°ì¹´ë¥´í¸ ì¢í (Cartesian coordinate)ë¡ ê¸°ì ë©ëë¤; ì´ê²ì ìì§ìì ëíë¬ í¨ê³¼ë¥¼ ìì±íëë° íìì ì¸ ìë 벡í°ë¥¼ ì¬ì©íê³ , ì´ê²ì ë°©í¥ì±(directionality)ì ë°©í¥ì± ìë¿ì ì¬ì©í©ëë¤. ì´ ìë¿ì ì주 í´ ì ìëë°, ì를 ë¤ìë©´ ì ë°©í¥ì ìì¤(omnidirectional source)ì ëí ê²ì¼ ì ììµëë¤.
ì²ìì ìì¹ë right-hand ë°ì¹´ë¥´í¸ ì¢í를 ì¬ì©í´ 기ì ë©ëë¤; ì´ê²ì ìì§ìì ìë 벡í°ë¥¼ ì¬ì©íê³ ì²ìì ë¨¸ë¦¬ê° í¥íê³ ìë ë°©í¥ì ìì ìì ë ê°ì ë°©í¥ ë²¡í°ë¥¼ ì¬ì©í©ëë¤. ì´ê²ë¤ì ê°ê° ì²ìì 머리ì ìì ë°©í¥ê³¼, ì²ìì ì½ê° ê°ë¦¬í¤ê³ ìë ë°©í¥ì ì ìíë©°, ìë¡ ì§ê°ì ììµëë¤.
ì°¸ê³ : ë ë§ì ì 보를 ë³´ìë ¤ë©´, Web audio ê³µê°í 기본 문ì를 참조íì¸ì.
í¬ ì¸(fan-in)ê³¼ í¬ ìì(fan-out)ì¤ëì¤ ì©ì´ìì, í¬ ì¸ì ChannelMergerNode
ê° ì¼ë ¨ì 모ë
¸ ì
ë ¥ ìì¤ë¥¼ ì·¨íê³ ë¨ì¼ì ë¤ì ì±ë ì í¸ë¥¼ ì¶ë ¥íë ê³¼ì ì ì¤ëª
í©ëë¤:
í¬ ììì ë°ë ê³¼ì ì ì¤ëª
íëë°, ChannelSplitterNode
ê° ë¤ì ì±ë ì
ë ¥ ìì¤ë¥¼ ì·¨íê³ ë¤ìì 모ë
¸ ì¶ë ¥ ì í¸ë¥¼ ì¶ë ¥í©ëë¤.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4