[JavaScript μ€λμ€ μ΄νν° λ§λ€κΈ°] μ리μ νλ¦μ νμ νμ
μ΄λ² ν¬μ€ν μμλ μ»΄ν¨ν°λ μ΄λ»κ² μ리λ₯Ό λ€μκΉ? ν¬μ€ν μμ μ§ννλ μ€λμ€ νν 그리기μ μ΄μ΄μ μ€λμ€μ μ¬λ¬κ°μ§ ν¨κ³Όλ₯Ό μ€ μ μλ μ΄νν°λ₯Ό λ§λλ κ³Όμ μ μ€λͺ νλ €κ³ νλ€. HTML5μ Audio APIλ μ€λμ€μ ν¨κ³Όλ₯Ό μ€ μ μλ μ¬λ¬κ°μ§ λ Έλλ₯Ό μ 곡νλλ°, λλΆλΆμ μ΄νν°λ μ΄ λ Έλλ€λ§ μ¬μ©ν΄λ ꡬνν μ μμ μ λλ‘ μμ±λμλ APIλ₯Ό μ 곡νλ€.
λν μ΄ ν¬μ€ν
μ μ΄ λνΈμ λλ μ μμ±λ μμ μ΄λ©°, μ΄λ² ν¬μ€ν
μμλ HTML5 Audio API
μ κ°μμ μ€λμ€μ μλμ μ‘°μ ν μ μλ GainNode
λ₯Ό μ¬μ©νλ λ°©λ²μ λν΄μ, λ€μ ν¬μ€ν
μμλ μ’ λ 볡μ‘ν μ€λμ€ μ΄νν°λ€μ λν μ€λͺ
κ³Ό μ μ κ³Όμ μ μ€λͺ
ν μμ μ΄λ€.
μ§λ ν¬μ€ν μμ μ΄λ―Έ μ€λμ€μ κ΄ν κΈ°λ³Έμ μΈ μ΄λ‘ μ μ€λͺ νμΌλ μ΄λ²μλ κΈ°λ³Έμ μΈ μ΄λ‘ μ΄ μλλΌ μ€μ λ‘ λ Ήμμ€μμ μ€λμ€λ₯Ό μ΄λ€ λ°©μμΌλ‘ 컨νΈλ‘€νκ³ ν¨κ³Όλ₯Ό μ£Όλ μ§μ λν λ°©λ²μ λν΄ μ΄μ μ λ§μΆκ³ μ€λͺ μ μ§ννλλ‘ νκ² λ€.
μ€λμ€ μ νΈλ νλ₯΄λ κ²μ΄λ€
μΌλ°μ μΈ λ
Ήμμ€μμ μ°λ¦¬λ λ§μ΄ν¬λ₯Ό ν΅ν΄μ μ€λμ€λ₯Ό λ
Ήμνκ±°λ νΉμ μ΄λ―Έ λ
Ήμλ μ€λμ€λ₯Ό Logic Pro
λ Cubase
μ κ°μ DAW(Digital Audio Workstation)
μΌλ‘ λΆλ¬μμ μ¬μ©νκ² λλ€. μ΄λ μ²μμΌλ‘ λ°κ²λλ μ΄ μ€λμ€λ₯Ό μμ€(Source)
λΌκ³ νλ€.
μ΄ μμ€λ μ°ν, μ»΄νλ μ, μ΄νλΌμ΄μ λ± μ€λμ€μ νΉλ³ν λλμ μ€ μ μλ μ¬λ¬κ°μ§ μ΄νν°λ€μ μ§λμ μ΅μ’
μ μΌλ‘ μ€νΌμ»€λ ν€λν°μ ν΅ν΄μ μΆλ ₯λκ² λλ€. μ΄ νλ¦μ μκ³ λλ©΄ HTML5μ Audio APIκ° μ 곡νλ λ
Έλ(Node)
μ κ°λ
μ μ½κ² μ΄ν΄ν μ μλ€. μΌλ¨ μ΄ν΄λ₯Ό λκΈ° μν΄ νμκ° μμ μ μ¬μ΄λ μμ§λμ΄λ‘ μΌν λ μ¬μ©νλ μμ€ν
μ μλ‘ λ€κ² λ€.
μ¬μ§μ μ€μμ μλ 컀λ€λ μ₯λΉλ μλ§ μ¬λ¬λΆλ TVμμ λͺλ² λ³΄μλ μ₯λΉμΌ κ²μ΄λ€. μ΄ μ₯λΉλ μ¬λ¬ κ°μ μ±λλ‘ λλ μ§ μ€λμ€ μμ€μ λ³Όλ₯¨μ΄λ ν¨λ, μ΄νλΌμ΄μ§κΉμ§ ν μ μλ μΌμ’ μ 컨νΈλ‘€ νμ μν μ νλ λ―Ήμ± μ½μμ΄λ€.
κ·Έλ¦¬κ³ λ―Ήμ± μ½μμ μ€λ₯Έμͺ½μ μλ κ²λ€μ΄ λ°λ‘ μ€λμ€μ ν¨κ³Όλ₯Ό μ€ μ μλ μ΄νν°λ€μ΄λ€. 보ν΅μ λ―Ήμ± μ½μ μμͺ½μ κ°λ μ±μλκ³ μ°λλ° μ μ¬μ§μ μμ§ λ
Ήμμ€ μ
μ
μ΄ λ λλ¬μ λλΌμ λͺκ°μ§ μ₯λΉλ§ λ€μ΄κ° μλ€. κ·Έλ¦¬κ³ μ¬μ§μλ λμ€μ§ μμμ§λ§ λ°λ‘ μ½μ λ(Console Rack)
μ΄λΌλ μ λ°μ λκ³ κ±°κΈ°μλ μ΄νν°λ€μ΄ κ°λ μ±μμ Έ μλ€.
κ·Έλ¦¬κ³ μ΄νν°λ€μ μμͺ½μ 보면 λΆμμ μ μ΄ κ½νμλ κ²μ λ³Ό μ μλλ°, μ μ₯λΉκ° μ€λμ€μ νλ¦
μ 컨νΈλ‘€ν μ μλ ν¨μΉ ν
μ΄λΈ(Patch Table)
μ΄λΌκ³ νλ μ₯λΉμ΄λ€.
λ³΄ν΅ μ¬μ΄λ μμ§λμ΄λ€μ κ°μ μν μ νλ μ΄νν°λΌκ³ νλλΌλ μ¬λ¬ μ’
λ₯μ μ₯λΉλ₯Ό μ¬μ©νκ² λλλ°, μ΄λ κ°μ μν μ νλ μ΄νν°λΌκ³ νλλΌλ μ₯λΉλ§λ€ μ‘°κΈμ© μλ¦¬κ° λ€λ₯Ό μ μκΈ° λλ¬Έμ΄λ€. μ¦, κ°μ 리λ²λΈλ₯Ό μ¬μ©νλ€κ³ ν΄λ μ΅μ’
μ μΌλ‘ λ§λ€κ³ μνλ μλ¦¬κ° μ΄λ€ λλμΈμ§μ λ°λΌ A 리λ²λΈ
λ₯Ό μ¬μ©ν μλ μκ³ B 리λ²λΈ
λ₯Ό μ¬μ©ν μλ μλ€λ κ²μ΄λ€. κ·Έλμ μ΄λ° μ리μ μ§μ λ§λλ κ³ μ ν μκ³ λ¦¬μ¦μ μ΄νν° μ μ‘° νμ¬λ€μ κΈ°μ
λΉλ°μ΄λ€.
νμ§λ§ λ€λ₯Έ μ΄νν°λ₯Ό μ¬μ©νκ³ μΆμ λλ§λ€ μ₯λΉμ κ½νμλ μΌμ΄λΈμ μΌμΌν νλνλ λΉΌμ λ€μ λ€λ₯Έ μ₯λΉμ μ°κ²°νλ κ²μ λΉν¨μ¨μ μ΄κΈ°λ νκ³ μΌμ΄λΈμ κ³μ λΊλ€κ° κΌλ€κ° νλ©΄ μ₯λΉμ μμμ΄ κ°μλ μκΈ° λλ¬Έμ λͺ¨λ μ₯λΉμ λΌμΈμ μ ν¨μΉ ν μ΄λΈμ μ°κ²°ν΄λκ³ μ¬μ©νλ κ²μ΄λ€. κ²λ€κ° μΌμ΄λΈμ λλΆλΆ μ₯λΉ λ€μͺ½μ μμΉνκΈ° λλ¬Έμ μ λ―Ήμ± μ½μμ μμΌλ‘ μ΄μ§ λ°κ³ λ΄μΌνλλ°, λ± λ΄λ μ ν° μ₯λΉλ₯Ό κ³μ λ°μλ€ λΉκ²Όλ€ νκΈ°μλ 무거μ 보μ΄μ§ μλκ°? ν리 λκ°λ€.
μ¬μ΄λ μμ§λμ΄λ μ΄λ κ² λ³΅μ‘ν μ¬λ¬ κ°μ μ₯λΉ μ¬μ΄λ₯Ό νλ¬λ€λλ μ€λμ€ μ νΈμ νλ¦μ ν¨μΉ ν μ΄λΈμ ν΅ν΄μ νλ²μ νμ νκ³ μ»¨νΈλ‘€ ν μ μλ€. μ리λ₯Ό 컨νΈλ‘€νλ μ¬λμκ² μ€λμ€ μ νΈμ νλ¦μ΄λΌλ κ°λ μ κ΅μ₯ν μ€μνλ€. νμκ° λ°©κΈ μλ‘ λ νλμ¨μ΄ μ₯λΉ λΏλ§ μλλΌ μννΈμ¨μ΄λ‘ ꡬνλ μ΄νν°λ₯Ό μ¬μ©νλ €ν λλ κ²°κ΅μ μ΄ νλ¦μ νλ‘κ·Έλ¨ λ΄λΆμμ κ·Έλλ‘ κ΅¬νν΄μ€μΌνκΈ° λλ¬Έμ΄λ€.
μ μ¬μ§μ μ μΈκ³ λ
Ήμμ€ μ€ 90%κ° μ¬μ©νκ³ μλ ProtoolsλΌλ DAWμ λ―Ήμ μ°½μ΄λ€. μ¬μ§μ κ°μ‘°λ λΆλΆμ Vocal Bus
λΌκ³ μ νμλ κ³³μ 보면 맨 μ€λ₯Έμͺ½ μ±λμ μμͺ½μ μμΉνκ³ μκ³ λλ¨Έμ§ μ±λμ μλμͺ½μ μμΉνκ³ μλ€. I/O
λ©λ΄μμ μμͺ½μ In
μ μλ―Ένκ³ μλμͺ½μ Out
μ μλ―ΈνκΈ° λλ¬Έμ μ΄ κ·Έλ¦Όμμ μ€λμ€μ νλ¦μ λλ΅ λ€μκ³Ό κ°μ΄ λνλ μ μλ€.
μ΄λ μ λ€λͺ¨ νλνλκ° HTML5μ Audio APIμμ μ 곡ν΄μ£Όλ
λ Έλ
μ μ νν κ°μ κ°λ μ΄λ€. μ¦, μλ°μ€ν¬λ¦½νΈλ‘ μ νλ¦μ μλ²½ν λμΌνκ² κ΅¬νν μ μλ€λ λ»μ΄λ€.
μ΄ν΄λ₯Ό λκΈ° μν΄ μ λ
Έλλ€μ μν μ λν΄μ μ‘°κΈ λ λΆκ°μ€λͺ
μ νμλ©΄, μΌλ¨ Lead Vox
λ λ§ κ·Έλλ‘ λ³΄μ»¬μ λ
Έλ μμ€λ₯Ό κ°μ§ λ
Έλμ΄κ³ LeadVxDbl
μ λ
Έλλ₯Ό νλΆνκ² λ€λ¦¬κ² νκΈ° μν΄ κ°μ λ©λ‘λλ₯Ό νλ² λ λ
Ήμν κ², μ¦ λλΈλ§ μμ
μ ν λ
Έλμ΄λ€. κ·Έλ¦¬κ³ Vox Fill
μ νμμ μμ μ½λ¬μ€λ₯Ό λ΄μ λ
Έλμ΄λ€.
κ·Έλ¦¬κ³ λ³΄μ»¬μ΄ λ
Έλν μ΄ μ€λμ€ μμ€λ₯Ό λͺ¨λ Vocal Bus
λΌλ λ
Έλλ‘ λͺ¨μΌκ³ μλ€. μ΄λ κ² νλ μ΄μ λ μ¬λ¬ κ°μ μ€λμ€ μμ€μ μ΄νν°λ₯Ό κ°κ° μ¬μ©νλ©΄ λ
Έλλ§λ€ μ‘°κΈμ© μ리μ λλμ΄ λ¬λΌμ§ μ μκΈ° λλ¬Έμ Vocal Bus
λΌλ νλμ λ
Έλλ‘ μ€λμ€ μ νΈλ₯Ό λͺ¨μ λ€μ ν΄λΉ λ
Έλμλ§ μ΄νν°λ₯Ό κ±Έμ΄μ£Όλ κ²μ΄λ€. μ΄λ κ² νλ©΄ λͺ¨λ λ
Έλμ μ΄νν°λ₯Ό μ¬μ©νμ§μκ³ νλμ λ
Έλμλ§ μ΄νν°λ₯Ό μ¬μ©ν΄λ λκΈ° λλ¬Έμ λ©λͺ¨λ¦¬ λΉμ©λ μλ μ μκ³ , 보컬
μ΄λΌλ νλμ μμ€μ λμΌν λλμ λΆμ¬ν μ μλ€.
κ·Έλ¦¬κ³ μ΅μ’
μ μΌλ‘ μ νΈκ° λ€μ΄κ°λ Sub Master
λ
Έλλ μλ§ μ΅μ’
μμνμΌλ‘ μλ¦¬κ° λκ°κΈ° μ μ νλ² λ μ΄νν° μ²λ¦¬λ₯Ό νκ³ μΆμ΄μ μμ±ν κ²μΌ ν
κ³ , Sub MasterκΉμ§ λλ¬ν μ€λμ€λ μμν, μ¦ μ€νΌμ»€λ₯Ό ν΅ν΄ μΆλ ₯λμ΄ μ°λ¦¬μ κ·λ‘ λ€μ΄μ€κ² λλ κ²μ΄λ€. κ²°κ΅ in -> out -> in -> out
μ κ³μλ λ°λ³΅μ΄λΌκ³ 보면 λλ€. κ·Έλμ νμκ° μ€λμ€μ νλ¦
μ΄λΌκ³ νννλ κ²μ΄λ€.
μ΄μ μ€λμ€ μμ€μ νλ¦μ΄λΌλ κ²μ΄ λλ΅ μ΄ν΄κ° λμμΌλ©΄ νλ² μ§μ HTML5μ Audio APIλ₯Ό μ¬μ©ν΄μ μ΄ νλ¦μ ꡬνν΄λ³΄λλ‘ νμ.
μ€λμ€μ μλμ μ‘°μ νκΈ°
μμμ μ΄μΌκΈ°νλ―μ΄ μ΄λ² ν¬μ€ν
μμλ 본격μ μΌλ‘ μ΄νν°λ₯Ό ꡬνν΄λ³΄κΈ°μ μμ μ€λμ€μ νλ¦μ μ§μ ꡬνν΄λ³΄κ³ 체νν΄λ³΄λ κ²μ μ΄μ μ λ§μΆ κ²μ΄λ€. κ·Έλμ μ΄νν°λΌκΈ°μλ μ‘°κΈ μ 맀ν λ¨μν ꡬ쑰μ νλ¦μ λ§λ€μ΄λ³΄λ €κ³ νλ€. λ°λ‘ μ€λμ€μ μλμ μ‘°μ νλ νλ¦μ΄λ€. HTML5 Audio APIμ GainNode
λ₯Ό μ¬μ©νλ©΄ μ€λμ€ μμ€μ μλμ μμ½κ² μ‘°μ ν μ μλ€.
Gainμ΄λ 무μμΈκ°μ?
κ²μΈ(Gain)
μ΄λ μ½κ² λ§νλ©΄ μ
λ ₯ λ³Όλ₯¨μ μλ―Ένλ€. κ²μΈμ μ¬μ©νμ¬ λ§μ΄ν¬μμ μ€λμ€ λ―Ήμλ λ
ΉμκΈ°λ‘ μ€λμ€ μ νΈλ₯Ό λ³΄λΌ λ κ·Έ μ νΈλμ 컨νΈλ‘€νλ κ²μ΄λ€. μ²μ μ€λμ€μ μ
λ¬Ένμλ λΆλ€μ΄ κ²μΈ(Gain)
κ³Ό λ³Όλ₯¨(Volume)
μ μ°¨μ΄μ λν΄ ν·κ°λ €νμλλ°, μ½κ² λ§νλ©΄ κ²μΈμ βμ
λ ₯ μ νΈλ₯Ό μ‘°μ νλ κ²βμ΄κ³ λ³Όλ₯¨μ βμΆλ ₯ μ νΈλ₯Ό μ‘°μ νλ κ²βμ΄λ€.
λ§μ½ 100
μ λ μΈκΈ°μ μ νΈλ₯Ό μ²λ¦¬ν μ μλ λ
ΉμκΈ°κ° μλ€κ³ μκ°ν΄λ³΄μ. μ΄λ μ°λ¦¬κ° λ§μ΄ν¬μ λκ³ 80
μ λμ μΈκΈ°λ‘ μ리λ₯Ό μ! μ§λ₯΄λ©΄ μ΄ λ
ΉμκΈ°λ 무리μμ΄ μ΄ μ νΈλ₯Ό λ°μλ€μΌ μ μμ§λ§, 150
μ μΈκΈ°λ‘ μ리λ₯Ό μ§λ₯΄κ² λλ©΄ μ΄ λ
ΉμκΈ°λ 50
λ§νΌμ μ리λ₯Ό λ°μλ€μ΄μ§ λͺ»νκ³ κ·Έλλ‘ μ μ€μν¨λ€.
μ΄ νμμ μ¬λ¬λΆλ μ΄λ©΄μ λͺλ² κ²½νν νμμΌν
λ°, μ€νΌμ»€λ‘ μ리λ₯Ό μμ² ν¬κ² νλ©΄ μ§μ§μ§
거리λ μ‘μμ΄ λ°μνλ κ²μ λ€μ΄λ³Έ μ μ΄ μμ κ²μ΄λ€. μ΄λ κ² μ₯λΉκ° μ²λ¦¬ν μ μλ μ νΈμ μΈκΈ°λ₯Ό λμ΄κ°λ νμμ ν΄λ¦¬ν(Clipping)
μ΄λΌκ³ νλ€. λ§ κ·Έλλ μ νΈκ° μλ €λκ°λ κ²μ΄λ€.
μ΄λ κ² μλ €λκ° μ νΈλ μ κ·Έλ¦Όμμ λ³Ό μ μλ―μ΄ λ¨Έλ¦¬κ° λ€λͺ¨ λ°λ―ν μ¬κ°ν
μ ννλ₯Ό κ°μ§κ² λλλ°, μ΄ μ¬κ°νλ μ°λ¦¬κ° EDM λ±μμ λ©λ‘λλ₯Ό ννν λ λ§μ΄ λ€μ μ μλ μ λμ¬μ΄μ 리λ(Lead)
κ³μ΄μ μμμ~
νλ κΈμμ± μ리λ₯Ό λΈλ€. λ§λ‘λ μ μ΄ν΄κ° μλ ν
λ νλ² μμ
μΌλ‘ λ€μ΄λ³΄λ©΄μ μ μ μ¬μ΄κ°λλ‘ νμ. μλ§ ν΄λ½ μ’ λ€λ
보μ λΆλ€μ μ! μ΄ μ리
ν κ²μ΄λ€.
μ무λλ 리λλ μ
κΈ°λ‘μ¨ ννμ΄ μ΄λ μ λ μ μ λ μνμ΄κΈ° λλ¬Έμ ν΄λ¦¬νμ΄ λ°μνμ λ λλ μ리λ μ΄κ²λ³΄λ€ λ κ±°μΉ κ³ λ μΉ΄λ‘λ€. μ°Έκ³ λ‘ μ΄λ κ² ννμ λ°λΌ μλ¦¬κ° λ¬λΌμ§λ€λ κ°λ
μ μ곑κ³(Distortion)
μ΄νν°λ₯Ό λ§λ€λλ μ¬μ©νλ κ°λ
μ΄κΈ° λλ¬Έμ κΈ°μ΅ν΄λλ©΄ μ’λ€.
μ΄μ¨λ μ΄λ° ν΄λ¦¬ν λ¬Έμ λλ¬Έμ μ¬μ΄λ μμ§λμ΄λ€μ μ€λμ€ μμ€μ λ€μ μ₯λΉ μ¬μ΄μ κ²μΈμ μ‘°μ ν μ μλ μ₯μΉλ₯Ό λκ³ , μ₯λΉκ° λ°μλ€μΌ μ μλ μ νΈμ μΈκΈ°μ λ§μΆ°μ μλ§κ² κ²μΈμ μ‘°μ νμ¬ μμ€ μ€λμ€μ μ νΈκ° 컀μ§λλΌλ λͺ¨λ μ νΈλ₯Ό λ€ λ΄μ μ μλλ‘ νλ€.
λ°λλ‘ λ³Όλ₯¨μ μ리λ₯Ό λ΄λ³΄λΌ λ μΌλ§λ μ¦νμν¬ κ²μ΄λλ₯Ό μλ―Ένλ€. λ§μ λΆλ€μ΄ κ²μΈκ³Ό λ³Όλ₯¨μ ν·κ°λ €νλ μ΄μ κ° λ λ€ μ리λ₯Ό μ¦νμν€κ±°λ κ°μμν€λ μν μ νκΈ° λλ¬ΈμΈλ°, λ³Όλ₯¨μ μ΄λ―Έ μ λ ₯λ μ νΈλ₯Ό μΆλ ₯ν λ 건λ리λ κ²μ΄κΈ° λλ¬Έμ ν΄λ¦¬νμ΄ λ°μνλλΌλ λ³Όλ₯¨μ μ€μ΄λ©΄ μ νΈκ° λμμ€μ§λ§ λ Ήμν λ κ²μΈμ μλͺ» μ€μ νμ¬ μ μ€λ μ리λ λ€μ λμμ€μ§ μλλ€.
μ νΈ μ
λ ₯ λ¨κ³μμ μ΄λ―Έ μ μ€λ κ²μ΄κΈ° λλ¬Έμ μμν μ΄λ³μΈ κ²μ΄λ€. κ²λ€κ° λ
Ήμμ΄λΌλ νΉμ± μ κ·Έ μλ³Έ μμ€λ μ¬λ
μΈ κ²½μ°κ° λ§λ€. κ²°κ΅ μ΄ μ μ€λ μ νΈλ₯Ό λ€μ μ΄λ €λΌ μ μκΈ° λλ¬Έμ κ²μΈμ μλͺ» μ€μ νλ©΄ λ€μ λ
Ήμμ ν΄μΌνλ μ¬ν μν©μ΄ λ²μ΄μ§ μ μλ κ²μ΄λ€.
κ·Έλμ μ¬μ΄λ μμ§λμ΄λ€μ μ리λ₯Ό λ
Ήμν λ κ²μΈμ μ λ€λ£¨λ κ²
μ μμ² μ€μνκ² μκ°νλ€. μ¬μ€ κ²μΈλ§ ν΄λ μ’ λ κΉμ΄ λ€μ΄κ°λ©΄ νκ³ μΆμ μ΄μΌκΈ°κ° λ§μ§λ§, μ΄ ν¬μ€ν
μ μ€λμ€ μ λ¬Έ ν¬μ€ν
μ΄ μλλ―λ‘ κ·Έλ₯ λΉμ·ν κ±°λΌκ³ μκ°νκ³ λμ΄κ°λ μκ΄μλ€.
μ΄μ κ²μΈμ΄ 무μμΈμ§ μ΄ν΄νλ€λ©΄ GainNode
μ ν¨κ» μ€λμ€ μμ€μ μ νΈ μΈκΈ°λ₯Ό μ‘°μ ν΄μ μ리μ ν¬κΈ°λ₯Ό λ³νμμΌλ³΄μ!
Gain Nodeλ₯Ό μ¬μ©νμ¬ μλμ μ‘°μ ν΄λ³΄μ
μΌλ¨ κ²μΈμ μ¬μ©ν΄λ³΄λ €λ©΄ μ€λμ€ μμ€κ° νμνλ€. μ€λμ€ μμ€λ HTML5μ <audio>
νκ·Έλ₯Ό μ¬μ©νκ±°λ μ¬μ©μκ° μ§μ μ
λ‘λν νμΌμμ μΆμΆνλ λκ°μ§ λ°©λ²μ΄ μλλ°, νμλ μ΄ μ€ νμμ λ°©λ²μ μ¬μ©νμλ€.
μ΄κ²λ μλ°ν λ§νμλ©΄ <audio>
νκ·Έλ₯Ό μ¬μ©νμ¬ μμ€λ₯Ό μΆμΆνμ λμ νμΌ λ²νΌμμ μ§μ μΆμΆνμ λλ λ€λ₯Έ μμ€ λ
Έλ κ°μ²΄κ° μμ±λκΈ΄ νμ§λ§ κΈ°λ₯μ ν° μ°¨μ΄ μμΌλ―λ‘ κ·Έλ₯ κ°μΈμ μ·¨ν₯λλ‘ νλ©΄ λλ€.
const audioContext = new (Audiocontext || webkitAudioContext)();
document.getElementById('audio-uploader').onchange = evt => {
const file = evt.currentTarget.files[0];
if (!file) {
return;
}
const reader = new FileReader();
reader.onload = async evt => {
const buffer = await audioContext.decodeAudioData(file);
const sourceNode = audioContext.createBufferSource();
sourceNode.buffer = buffer;
console.log(sourceNode);
}
};
AudioBufferSourceNode {buffer: AudioBuffer, playbackRate: AudioParam, detune: AudioParam, loop: false, loopStart: 0, β¦}
μ°μ κ°λ¨ν μ€λͺ
μ νμλ©΄ buffer
λ³μμ λ΄κΈ΄ μ€λμ€ λ°μ΄ν°λ rawν μ€λμ€ λ°μ΄ν°μΌ λΏ μμ§ νλμ λ
Έλκ° μλκΈ° λλ¬Έμ μ¬μ©ν μ μλ μνμ΄λ€. κ·Έλ κΈ° λλ¬Έμ createBufferSource
λ©μλλ₯Ό μ¬μ©νμ¬ μμ€ λ
Έλλ₯Ό μμ±ν ν ν΄λΉ μμ€ λ
Έλμ μ€λμ€ λ°μ΄ν°λ₯Ό μ
λ ₯ν΄μ€μΌλ§ λΉλ‘μ μ€λμ€ λ°μ΄ν°λ₯Ό μ¬μ©ν μ μλ μνκ° λλ κ²μ΄λ€.
μ΄λ νμλ μ¬μ©μκ° μ
λ‘λν νμΌμμ μ§μ μ€λμ€ λ²νΌ λ°μ΄ν°λ₯Ό λ½μμμ λ
Έλλ₯Ό λ§λ κ²μ΄κΈ° λλ¬Έμ createBufferSource
λ©μλλ₯Ό μ¬μ©νμ¬ μμ€ λ
Έλλ₯Ό μμ±νμ§λ§, λ§μ½ <audio>
νκ·Έμμ μΆμΆν μ€λμ€ λ°μ΄ν°λ₯Ό μ¬μ©νμ¬ μμ€ λ
Έλλ₯Ό μμ±νκ³ μΆλ€λ©΄ createMediaElementSource
λ©μλλ₯Ό μ¬μ©ν΄μΌ νλ€.
κ·ΈλΌ μ΄μ GainNode
λ₯Ό μμ±νκ³ μμ€ λ
Έλμ μ°κ²°λ§ μμΌμ£Όλ©΄ λ°λ‘ μ΄ μ€λμ€ μμ€μ μλμ μ‘°μ ν μ μκ² λλ€.
const gainNode = audioContext.createGain();
sourceNode.connect(gainNode);
gainNode.connect(audioContext.destination);
μ΄ μ½λμμ μμ€ -> κ²μΈ -> λ°μ€ν°λ€μ΄μ
μΌλ‘ μ€μ λ μ€λμ€μ νλ¦μ΄ 보μΈλ€λ©΄ μ¬μ€μ Audio APIμ λν μ΄ν΄λ κ±°μ λλ¬λ€κ³ λ΄λ 무방νλ€. μμμλ λ§νλ―μ΄ μ€λμ€λ₯Ό 컨νΈλ‘€ν λλ μ΄ κ°λ
μ μ΄ν΄νλ κ² μ μΌ μ€μνκΈ° λλ¬Έμ΄λ€.
λν gainNode
κ° μ°κ²°λ audioContext.destination
μ μ΅μ’
μμν, μ¦ μ€νΌμ»€λ‘ ν₯νλ μ 보λ₯Ό κ°μ§κ³ μλ€. κ·ΈλΌ μ΄μ μ¬κΈ°μ μ€λμ€μ μ리λ₯Ό μ¦νμν€κ±°λ κ°μμν€λ €λ©΄ μ΄λ»κ² ν΄μΌν κΉ?
gainNode.gain.value = 1.2;
// λλ
gainNode.gain.setValueAtTime(1.2, audioContext.currentTime);
// κ·Έ ν μμ€λ₯Ό μ¬μν΄λ³΄μ
sourceNode.start();
[Warinig] λ무 κ°μ ν¬κ² μ¬λ¦¬λ©΄ μ¬μνμ λ κ³ λ§ ν°μ§λλ€.
κ°λ¨νλ€. κ·Έλ₯ GainNode.gain.value
μ μ κ·Όν΄μ κ°μ λ³κ²½ν΄μ£Όλ©΄ λλ€. κ²μΈ κ°μ κ²½μ°λ κ°μ μ§μ μ κ·Όνμ¬ λ³κ²½νλ κ²μ΄ κ°λ₯νμ§λ§ λ€λ₯Έ λ
Έλμ κ²½μ° μμ μ κ°μ μ§μ λ³κ²½νλ κ²μ΄ νμ©λμ§ μλ κ²½μ°κ° μλλ°, μ΄λ΄ λλ setValueAtTime
λ©μλλ₯Ό μ¬μ©νλ©΄ λλ€.
setValueAtTime
λ©μλλ μΌμ’
μ μ€μΌμ€λ¬κ°μ κ°λ
μΈλ°, λλ²μ§Έ μΈμλ‘ λκΈ΄ μκ°μ΄ μ§λ νμ κ°μ μ μ©νλ κΈ°λ₯μ κ°μ§κ³ μλ€. μ΄λ μΈμλ‘ λκΈ°λ μκ°μ λ¨μλ μ΄
μ΄λ€. audioContext.currentTime
μ μΈμλ‘ μ¬μ©νλ©΄ 곧λ°λ‘ κ°μ λ³κ²½μ΄ μ μ©λλ€.
νμλ μ²μμ μ΄λ° λ
Έλλ€μ κ°μ λ³κ²½ν λ ν·κ°λ Έλ κ²μ΄ νλ μλλ°, λ°λ‘ min
κ³Ό max
μ΄λ€. μ¦, μ΄ λ
Έλκ° κ°μ§λ κ°μ λ²μλ₯Ό μ μκ° μμλ€. λ¬Όλ‘ κ³΅μ λ¬Έμμ λ€ λμμκΈ΄ νμ§λ§ κ·Έκ±Έ μ΄λ μΈμμ νλνλ κ²μν΄μ λ³΄κ² λκ°?
κ·Έλμ λ¬Έμλ₯Ό μ‘°κΈ λ λ€μ Έλ³΄λ μ΄ λ
Έλλ€μ΄ κ°μ§λ κ°μ 곡ν΅μ μΌλ‘ AudioParam
νμ
μ΄λΌλ κ²μ μ μ μμλ€. μ΄ νμ
μ min
, max
, defaultValue
, value
μμ±μ κ°μ§κ³ μμκ³ , μ΄ κ°λ€μ input[type="range"]
λ₯Ό μ¬μ©νμ¬ μ€λμ€λ₯Ό 컨νΈλ‘€ν λ μ μ©νκ² μ¬μ©ν μ μλ€.
console.log(gainNode.gain);
AudioParam {value: 1, automationRate: "a-rate", defaultValue: 1, minValue: -3.4028234663852886e+38, maxValue: 3.4028234663852886e+38}
μ΄ κ°μ μ νμΈνκ³ κ²μΈμ κ°μ μ€μ νλ©΄ μ μ΄λ κ³ λ§κ³Ό μ΄μ΄ν°μ΄ ν°μ Έλκ°λ λΆμμ¬λ λ°©μ§ν μ μμ κ²μ΄λ€. μμμ λ§νλ―μ΄ μ»΄ν¨ν°κ° μ²λ¦¬ν μ μλ μ νΈμ μΈκΈ°λ₯Ό λμ΄κ°κ² λλ©΄ ν΄λ¦¬ν νμμ΄ λ°μνλ©΄μ μ°’μ΄μ§λ λ―ν μλ¦¬κ° λκΈ° λλ¬Έμ λ§μ½ μ΄μ΄ν°μ λΌκ³ μμλ€λ©΄ λλ΄μ΄ μλκ³ μ§μ§ κ·μ λ¬΄λ¦¬κ° κ° μλ μλ€.
μ, μ΄λ κ² κ°λ¨νκ² μ€λμ€ μμ€μ κ²μΈμ μ‘°μ ν΄λ³΄μλ€. λλ¨Έμ§ μ΄νν°λ€λ λλΆλΆ μ΄λ° λλμΌλ‘ ꡬνλλ€. κ°νΉ μ‘°κΈ λ 볡μ‘ν μ°κ²°μ΄ νμν μ΄νν°λ€μ΄ μκΈ΄ νμ§λ§ λλΆλΆμ κ²½μ° κ°λ¨ν λͺκ°μ λ Έλλ₯Ό μ°κ²°νλ κ²λ§μΌλ‘ ꡬνν μ μκΈ° λλ¬Έμ κ·Έλ κ² μ΄λ ΅μ§ μλ€.
λ€μ ν¬μ€ν
μμλ μ΄λ²μ μμλ³Έ κ°λ
μ λ°νμΌλ‘ μ리λ₯Ό μμΆνκ±°λ 곡κ°κ°μ λΆμ¬νκ³ , νΉμ μ£Όνμλ₯Ό μλΌλ΄μ΄ μ리μ νΉλ³ν λλμ μ€ μ μλ λ€λ₯Έ μ΄νν°λ€μ λ§λ€μ΄λ³΄λλ‘ νκ² λ€. λν κΈ°νκ° λλ€λ©΄ μ΄λ―Έ μ‘΄μ¬νλ μ€λμ€ μμ€λ₯Ό λ³ννλ μ΄νν°κ° μλλΌ μ§μ§λ‘ μ€λμ€ μ νΈ μ체λ₯Ό λ§λ€μ΄ λΌ μ μλ μ€μ€λ μ΄ν°(Oscillator)
λ₯Ό μ¬μ©νμ¬ λλ§μ μ
κΈ°λ₯Ό λ§λ€μ΄λ³Ό μ μλ ν¬μ€ν
λ μ§νν μμ μ΄λ€.
μ΄μμΌλ‘ JavaScriptλ‘ μ€λμ€ μ΄νν°λ₯Ό λ§λ€μ΄λ³΄μ - μ리μ νλ¦μ νμ νμ ν¬μ€ν μ λ§μΉλ€.
- JavaScript
- μλ°μ€ν¬λ¦½νΈ
- Audio
- μ€λμ€ μ΄νν°
- JavaScript Audio API
- Logic Pro X
- λ‘μ§νλ‘
- Protools
- νλ‘ν΄μ¦
- Cubase
- νλ² μ΄μ€
- Audio Plugin
- Compressor
- Delay
- Reverb
- EQ
κ΄λ ¨ ν¬μ€ν 보λ¬κ°κΈ°
[JavaScript μ€λμ€ μ΄νν° λ§λ€κΈ°] μ€λμ€ μ΄νν°λ‘ λλ§μ μ리 λ§λ€κΈ°
μ»΄ν¨ν°λ μ΄λ»κ² μ리λ₯Ό λ€μκΉ?
[JS νλ‘ν νμ ] νλ‘ν νμ μ μ¬μ©νμ¬ μμνκΈ°
[JS νλ‘ν νμ ] μλ°μ€ν¬λ¦½νΈμ νλ‘ν νμ νμ΄λ³΄κΈ°
μ΅μ κ°κ³Ό μ΅λ κ°μ λΉ λ₯΄κ² μ°Ύμ μ μκ² λμμ£Όλ ν(Heap)