51 lines
1.3 KiB
GDScript
51 lines
1.3 KiB
GDScript
class_name AudioFader extends Node
|
|
|
|
const DEFAULT_FADE = 0.25
|
|
const MUTE_VOLUME: float = -20.0
|
|
|
|
func _ready() -> void:
|
|
process_mode = PROCESS_MODE_ALWAYS
|
|
|
|
func fade_in(
|
|
audio: AudioStreamPlayer,
|
|
duration: float = DEFAULT_FADE,
|
|
target: float = 0.0
|
|
) -> void:
|
|
audio.play()
|
|
audio.volume_db = MUTE_VOLUME
|
|
var dbps: float = (-MUTE_VOLUME - target)/duration
|
|
while audio.volume_db < target:
|
|
audio.volume_db += dbps*(await Wait.tick())
|
|
audio.volume_db = target
|
|
|
|
func fade_out(
|
|
audio: AudioStreamPlayer,
|
|
duration: float = DEFAULT_FADE
|
|
) -> void:
|
|
var dbps: float = (audio.volume_db - MUTE_VOLUME)/duration
|
|
while audio.volume_db > MUTE_VOLUME:
|
|
audio.volume_db -= dbps*(await Wait.tick())
|
|
audio.stop()
|
|
audio.volume_db = 0.0
|
|
|
|
func cross_fade(
|
|
stop: AudioStreamPlayer,
|
|
start: AudioStreamPlayer,
|
|
duration: float = DEFAULT_FADE,
|
|
target: float = 0.0
|
|
) -> void:
|
|
var dbps_out: float = (stop.volume_db + 20.0)/duration
|
|
var dbps_in: float = (-MUTE_VOLUME - target)/duration
|
|
start.play()
|
|
start.volume_db = MUTE_VOLUME
|
|
while stop.volume_db > MUTE_VOLUME or start.volume_db < target:
|
|
var delta: float = await Wait.tick()
|
|
if stop.volume_db > MUTE_VOLUME:
|
|
stop.volume_db -= delta*dbps_out
|
|
else:
|
|
stop.stop()
|
|
if start.volume_db < target:
|
|
start.volume_db += delta*dbps_in
|
|
stop.volume_db = 0.0
|
|
start.volume_db = target
|