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() player.stream = null if is_instance_valid(player): player.free() 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))