39 lines
1.1 KiB
GDScript
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))
|