Files

39 lines
1.1 KiB
GDScript

class_name P91AudioAdapter
extends RefCounted
var player: AudioStreamPlayer
var playback: AudioStreamGeneratorPlayback
func attach(parent: Node) -> void:
var generator := AudioStreamGenerator.new()
generator.mix_rate = 22050.0
generator.buffer_length = 0.25
player = AudioStreamPlayer.new()
player.name = "PrototypeSFX"
player.bus = &"SFX"
player.playback_type = AudioServer.PLAYBACK_TYPE_STREAM
player.stream = generator
parent.add_child(player)
player.play()
playback = player.get_stream_playback()
func cleanup() -> void:
if player != null:
player.stop()
playback = null
player = null
func play(kind: StringName, muted: bool) -> void:
if muted or playback == null:
return
var frequency: float = {
&"select": 360.0, &"confirm": 440.0, &"depart": 300.0,
&"hit": 180.0, &"role": 540.0, &"victory": 680.0,
}.get(kind, 400.0)
var duration := 0.13 if kind in [&"hit", &"victory"] else 0.08
var frames := int(22050.0 * duration)
for index in range(frames):
var envelope := sin(PI * float(index) / float(frames)) * 0.035
var value := sin(TAU * frequency * float(index) / 22050.0) * envelope
playback.push_frame(Vector2(value, value))