Sound - kuimoani/defold GitHub Wiki
Sound
μ΄ λ©λ΄μΌμ Defold νλ‘μ νΈλ‘ μ¬μ΄λλ₯Ό κ°μ Έμ μ¬μνκ³ μ μ΄νλ λ°©λ²μ λν μ±λ©Έν©λλ€.
Defoldμ μ¬μ΄λ ꡬνμ κ°λ¨νμ§λ§ κ°λ ₯ν©λλ€. μμ λμ΄μΌ ν κ°λ μ λ κ°μ§ λΏμ λλ€.
Sound components
μ΄ μ»΄ν¬λνΈλ μ리λ₯Ό μ¬μνκΈ° μν μ€μ μ¬μ΄λλ₯Ό ν¬ν¨νκ³ μμ΅λλ€.
Sound groups
κ° μ¬μ΄λ μ»΄ν¬λνΈλ₯Ό κ·Έλ£Ήμ μνλλ‘ μ§μ ν μλ μμ΅λλ€. κ·Έλ£Ήμ μ¬μ©νμ¬ μμλ μ¬μ΄λλ€μ μ§κ΄μ μΈ λ°©λ²μΌλ‘ μ½κ² κ΄λ¦¬ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, "sound_fx" κ°μ κ·Έλ£Ήμ λ§λ€μ΄ κ°λ¨ν ν¨μ νΈμΆλ‘ λ€λ₯Έ κ·Έλ£Ήμ μ¬μ΄λλ€μ μλ¦¬κ° μμμ§κ² ν μ μμ΅λλ€.
Creating a sound component
μ¬μ΄λ μ»΄ν¬λνΈλ κ²μ μ€λΈμ νΈμ λ΄μ₯ μ€λΈμ νΈλ‘λ§ λ§λ€ μ μμ΅λλ€. μ κ²μ μ€λΈμ νΈλ₯Ό λ§λ€κ³ μ€λ₯Έμͺ½ ν΄λ¦νκ³ Add Componentλ₯Ό μ νν©λλ€. Soundλ₯Ό μ ννκ³ OKλ₯Ό λλ₯΄μΈμ.

μμ±λ μ»΄ν¬λνΈμλ μλμ κ°μ μμ±λ€μ΄ μμ΅λλ€.
Sound
Soundλ νλ‘μ νΈμ μλ μ¬μ΄λ νμΌλ‘ μ€μ λλ©° Waveλ Ogg Vorbis ν¬λ©§μ μ§μν©λλ€. (μμΈν λ΄μ©μ http://en.wikipedia.org/wiki/WAV μ http://en.wikipedia.org/wiki/Vorbis μ°Έκ³ )
Looping
체ν¬λμ΄ μλ€λ©΄ μ§μ μ μΌλ‘ μ€λ¨ μν¬λ κΉμ§ μ¬μμ΄ λ°λ³΅λ©λλ€.
Gain
μ΄ μ»΄ν¬λνΈμμ μ¬μ΄λμ κ²μΈ(gain)μ μ§μ μ€μ ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ΄λ νΈμ§ νλ‘κ·Έλ¨μΌλ‘ λλμκ°μ μ¬μμ νκ³ λ€μ μ΅μ€ν¬νΈνλ κ³Όμ μμ΄ μ½κ² κ²μΈ(gain)μ μ‘°μ νκ² ν΄ μ€λλ€. μ΄λ»κ² κ²μΈ(gain)μ΄ κ³μ°λλμ§ μμΈν μλ €λ©΄ μλλ₯Ό μ°Έκ³ νμμμ€.
Group
μ¬μ΄λκ° μν μ¬μ΄λ κ·Έλ£Ήμ μ΄λ¦μ λλ€. μ΄ μμ±κ°μ΄ λΉμ΄μλ€λ©΄, μ¬μ΄λλ κΈ°λ³Έμ μΌλ‘ "master" κ·Έλ£Ήμ ν λΉλ©λλ€.

Gain

μ¬μ΄λ μμ€ν μ 4κ°μ§ λ¨κ³λ‘ κ²μΈ(gain)μ κ³μ°νμ¬ μ²λ¦¬ν©λλ€.
- μ¬μ΄λ μ»΄ν¬λνΈμμ μ ν λ κ²μΈ(gain)
- "play_sound" λ©μΈμ§λ₯Ό ν΅ν΄ μ ν λκ±°λ "set_gain" λ©μΈμ§λ₯Ό ν΅ν΄ λ³κ²½λλ κ²μΈ(gain)
- sound.set_group_gain() ν¨μλ₯Ό νΈμΆν΄μ κ·Έλ£Ήμ μ ν λλ κ²μΈ(gain)
- "master" κ·Έλ£Ήμ μ ν λ κ²μΈ(gain). μ΄λ sound.set_group_gain(hash("master")) λ‘ λ³κ²½ κ°λ₯
μμ 4λ¨κ³μ κ²μΈ(gain)μ κ³±νμ¬ μ΅μ΄ μΆλ ₯ κ²μΈ(gain)μ κ³μ°ν©λλ€. κΈ°λ³Έ κ²μΈ(gain)μ μ΄λμμλ 1.0μ λλ€. (0 dB)
Sound groups
μ¬μ΄λ κ·Έλ£Ήμ μ΄λ¦μ΄ μ§μ λ μ¬μ΄λ μ»΄ν¬λνΈλ ν΄λΉ μ΄λ¦μ μ¬μ΄λ κ·Έλ£Ήμ μνκ² λ©λλ€. λ§μ½ κ·Έλ£Ήμ μ§μ νμ§ μμλ€λ©΄ κΈ°λ³Έμ μΌλ‘ "master" κ·Έλ£Ήμ ν λΉλ©λλ€. λν μ¬μ΄λ μ»΄ν¬λνΈμ κ·Έλ£Ήμ λͺ μμ μΌλ‘ "master" κ·Έλ£Ήμ μ§μ ν΄λ λ©λλ€.
λͺ ν¨μλ μ¬μ©κ°λ₯ν λͺ¨λ κ·Έλ£Ήμ κ°μ Έμ κ·Έλ£Ήμ μ΄λ¦μ μμλ΄κ³ κ²μΈ(gain), rms( http://en.wikipedia.org/wiki/Root_mean_square μ°Έκ³ ), νΌν¬ κ²μΈ(peak gain)μ μ»κ±°λ μ€μ ν μ μμ΅λλ€. λν λμ λλ°μ΄μ€μ μμ νλ μ΄μ΄κ° μ€νμ€μΈμ§ ν μ€νΈνλ ν¨μλ μμ΅λλ€.
-- μμ΄ν°μ΄λ μλλ‘μ΄λ λλ°μ΄μ€μμ μ¬μ΄λκ° νλ μ΄ μ€μ΄λΌλ©΄, λͺ¨λ μ리λ₯Ό μ€μ¬λ²λ¦Ό
if sound.is_music_playing() then
for i, group_hash in ipairs(sound.get_groups()) do
sound.set_group_gain(group_hash, 0)
end
end
μ΄ κ·Έλ£Ήλ€μ ν΄μ¬(hash) κ°μΌλ‘ μλ³λ©λλ€. λ¬Έμμ΄λ‘ λ μ΄λ¦μ sound.get_group_name() μ μ¬μ©νμ¬ κ°μ Έμ¬ μ μμΌλ©° μ΄ μ΄λ¦μ κ°λ°λꡬμμ μ¬μ΄λ κ·Έλ£Ή μ΄λ¦μ νμν΄μΌν κ²½μ° μ¬μ©λ μ μμ΅λλ€. (μλ€ λ€μ΄ μ¬μ΄λλ₯Ό μ‘°μ νλ λ―Ήμ λ±)

릴리μ¦λ λΉλμμλ μ¬μ©ν μ μμΌλ―λ‘ μ¬μ΄λ κ·Έλ£Ήμ λ¬Έμμ΄κ°μ μμ‘΄νλ μ½λλ₯Ό μμ±νλ©΄ μλ©λλ€.
λͺ¨λ κ°μ 0κ³Ό 1.0(0 dB) μ¬μ΄μ κ°μ λλ€. λ°μλ²¨λ‘ λ³ννλ €λ©΄, κ°λ¨νκ² db = 20 * math.log10(gain) νμ€κ³΅μμ μ¬μ©νλ©΄ λ©λλ€.
for i, group_hash in ipairs(sound.get_groups()) do
-- λ¬Έμμ΄ μ΄λ¦μ λλ²κ·Έ λΉλμμλ§ μ¬μ©κ°λ₯ν¨. 릴리μ¦λΉλμμ "unknown_*"λΌκ³ λ°νλ¨
local name = sound.get_group_name(group_hash)
local gain = sound.get_group_gain(group_hash)
-- λ°μλ²¨λ‘ λ³ννκΈ°
local db = 20 * math.log10(gain)
-- RMS (gain Root Mean Square) μ»κΈ°. μΌμͺ½ μ€λ₯Έμͺ½ μ±λ λΆλ¦¬
local left_rms, right_rms = sound.get_rms(group_hash, 2048 / 65536.0)
left_rmsdb = 20 * math.log10(left_rms)
right_rmsdb = 20 * math.log10(right_rms)
-- gain peak μ»κΈ°. μΌμͺ½ μ€λ₯Έμͺ½μΌλ‘ λΆλ¦¬
left_peak, right_peak = sound.get_peak(group_hash, 2048 * 10 / 65536.0)
left_peakdb = 20 * math.log10(left_peak)
right_peakdb = 20 * math.log10(right_peak)
end
-- master gainμ +6 dB λ‘ μ€μ νκΈ° (math.pow(10, 6/20))
sound.set_group_gain("master", 1.995)
Gating sounds
λ§μ½ κ²μμ΄ νΉμ μ΄λ²€νΈλ§λ€ λμΌν μ¬μ΄λλ‘ μ¬μλκ³ μ΄ μ΄λ²€νΈκ° μμ£Ό νΈλ¦¬κ±° λλ€λ©΄, λμΌ μ¬μ΄λλ₯Ό κ±°μ λμμ μ¬μλμ΄ λ²λ¦¬λ λ¬Έμ κ° λ°μν©λλ€. λμ λλ νμμΌλ‘λ μμ λ³μ΄(phase-shift ) νμμ΄ μκΈ°λ λ¬Έμ κ° μμ΅λλ€.

μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ κ°μ₯ μ¬μ΄ λ°©λ²μ μ¬μ΄λ λ©μΈμ§λ₯Ό νν°λ§νλ κΈ°λ₯(gate)μ λ§λ€μ΄ νΉμ μκ° κ°κ²© λ΄μμλ λμΌν μ¬μ΄λκ° μ¬μλλ κ²μ λ§λ λ°©λ²μ΄ μμ΅λλ€.
-- gate_time μκ° λ΄μμ λμΌν μ¬μ΄λκ° μ¬μλλκ±Έ λ§μ
local gate_time = 0.3
function init(self)
-- μ¬μλ μ¬μ΄λμ νμ΄λ¨Έλ€μ ν
μ΄λΈλ‘ κ΄λ¦¬νκ³ λ§€ νλ μλ§λ€ "gate_time" μ΄κ° λ λκΉμ§ μΉ΄μ΄νΈ λ€μ΄ν¨. κ·Έλ¦¬κ³ λμ μμ
self.sounds = {}
end
function update(self, dt)
-- μ μ₯λ νμ΄λ¨Έλ€μ μΉ΄μ΄νΈ λ€μ΄ ν¨
for k,_ in pairs(self.sounds) do
self.sounds[k] = self.sounds[k] - dt
if self.sounds[k] < 0 then
self.sounds[k] = nil
end
end
end
function on_message(self, message_id, message, sender)
if message_id == hash("play_gated_sound") then
-- νμ¬ κ²μ΄ν
ν
μ΄λΈ(gating table)μ μλ μ¬μ΄λλ§ μ¬μνμ
if self.sounds[message.soundcomponent] == nil then
-- ν
μ΄λΈμ μ¬μ΄λ νμ΄λ¨Έλ₯Ό μ μ₯ν¨
self.sounds[message.soundcomponent] = gate_time
-- "play_sound" λ©μΈμ§λ₯Ό μ€μ νκ²μΌλ‘ 보λ
msg.post(message.soundcomponent, "play_sound", { gain = message.gain })
else
-- μ¬μνλ €λ μ¬μ΄λλ₯Ό λ§μμ
print("gated " .. message.soundcomponent)
end
end
end
κ²μ΄νΈ(gate)λ₯Ό μ¬μ©νλ €λ©΄, κ°λ¨ν "play_gated_sound" λ©μΈμ§μ νκ² μ¬μ΄λ μ»΄ν¬λνΈμ μ¬μ΄λ κ²μΈ(gain)μ μ§μ ν΄μ μ μ‘νλ©΄ λ©λλ€. μ΄ κ²μ΄νΈλ κ²μ΄νΈκ° μ΄λ € μλ€λ©΄ "play_sound" λ©μΈμ§λ₯Ό νκ² μ¬μ΄λ μ»΄ν¬λνΈλ‘ 보λ΄κ² λ©λλ€.
msg.post("/sound_gate#script", "play_gated_sound", { soundcomponent = "/sounds#explosion1, gain = 1.0 })
"play_sound"λ Defold μμ§μ μν΄ μμ½λ μ΄λ¦μ΄λ―λ‘ κ²μ΄νΈλ μ΄ λ©μΈμ§λ₯Ό λ€μ μ μμ΅λλ€. μμ½λ λ©μΈμ§ μ΄λ¦μ μ¬μ©νλ©΄ μκΈ°μΉ μμ λμμ΄ λ°μν μ μμ΅λλ€.