GodotEngineで波形生成する方法。

自分でも書き方すっかり忘れておったわ。

AudioStreamGenerator — Godotエンジン (安定版) ドキュメント (英語)

注意なのが、関連してるノードから書かないとダメ。
つまり、ノードを作って、そこから子ノードでAudioStreamPlayerを作って、
最初に作ったノードにスクリプトをアタッチさせる、という感じ。

あとこのサンプルだとずっと鳴るようにはできないので、ずっと鳴るようにした。

extends Node

## 1秒あたりのバッファ数を取得する
@onready var sample_hz = $AudioStreamPlayer.stream.mix_rate

## サイン波の周波数(基準周波数)
var pulse_hz = 440.0 # The frequency of the sound wave.

## ここに書き込み可能なバッファがたまる。
var playback # Will hold the AudioStreamGeneratorPlayback.

## 位相。サイン波を生成した際に途切れないように波の生成タイミングを保存しておく
var phase =0.0

func _ready():
    ## AudioStreamPlayerとしては常に鳴らしておく
    $AudioStreamPlayer.play()
    ## バッファを取得する。
    playback = $AudioStreamPlayer.get_stream_playback()
    # fill_buffer()

func _process(delta):
    fill_buffer()

func fill_buffer():
    # var phase = 0.0
    
    ## 位相の変化差分を求める
    var increment = pulse_hz / sample_hz
    
    ## 利用可能なバッファサイズを取得する
    var frames_available = playback.get_frames_available()

    ## バッファに対しサイン波の書き込みを行う処理
    for i in range(frames_available):
        ## 1バイトずつサイン波を書き込みする
        playback.push_frame(Vector2.ONE * sin(phase * TAU))
        
        ## 位相を変化させる
        phase = fmod(phase + increment, 1.0)