Bypassed Unity's audio system entirely. Audio now plays via System.Media.SoundPlayer (managed .NET, wraps winmm.dll under the hood). Loops via PlayLooping, stops via Stop. The Wwise pause/resume on phase enter/exit still mutes the game music while the song plays.
Switched target framework from netstandard2.1 to net472 to access System.Media.
Volume is now applied by scaling 16-bit PCM samples in-place at load time. Changing the volume requires a game restart (SoundPlayer has no live volume API).
Stale BundleBuilder/ folder is no longer needed; safe to delete.
1.1.0
Switched audio loading to AssetBundle (AssetBundle.LoadFromMemory → LoadAllAssets<AudioClip>). Unity's runtime audio APIs (AudioClip.Create, UnityWebRequestMultimedia.GetAudioClip) all returned 0-property placeholder clips in the RoR2/BepInEx environment. Bundles bake the clip at editor time, so the loader gets a real Unity audio asset.
Added BundleBuilder/ with an Editor script and step-by-step README for producing the bundle from a small Unity 2019.4 project.
Removed all the prior workarounds (manual WAV parser, PCMReaderCallback streaming, audio-config diagnostics).
1.0.10
Diagnostic: log Unity's full AudioSettings config and try AudioSettings.Reset to recover from a stuck audio state.
1.0.9
Diagnostic build: creates a 1-second synthetic sine-wave clip on load to determine whether AudioClip.Create works at all in this environment.
1.0.8
Defer audio load by one frame past Awake — AudioClip.Create was returning placeholder clips with all zero metadata (length/samples/channels/frequency all 0) when called too early in the Unity lifecycle.
Soften clip validation (don't bail on samples=0) and log full clip state for diagnostics.
1.0.7
Streaming AudioClip via PCMReaderCallback. The non-streaming AudioClip.Create couldn't allocate the ~58 MB float buffer (SetData failed; AudioClip contains no data); streaming mode pulls samples on demand from the in-memory PCM array.
Added WAV header logging so any future parse mismatch is visible.
1.0.6
Bypassed Unity's audio decoder entirely. Even WAV via UnityWebRequestMultimedia was returning AudioClips stuck in Unloaded state in this RoR2/BepInEx environment. Now parses the embedded WAV manually (16-bit PCM) and feeds float samples into AudioClip.Create + SetData. No file URI, no decoder, no async load.
1.0.5
Switched embedded audio from OGG to WAV — Unity's OGG decoder in this RoR2/BepInEx environment was returning AudioClips stuck in Unloaded state with zero samples. WAV (PCM) skips the codec path entirely and loads reliably.
1.0.4
Wait for AudioClip decode to finish (loadState polling) — Unity's OGG decode can be async
Re-encoded embedded audio at 44.1kHz with clean start timestamp (some Unity 2019 builds choke on 48kHz / nonzero start_pts)
1.0.3
Use BepInEx cache path for the OGG temp file (avoids file URI breakage from special chars in Application.temporaryCachePath)
Switched debug trigger to Run.BeginStage (the previous Stage.Start hook didn't exist and crashed Awake)
More verbose request diagnostics
1.0.2
Added Debug.PlayOnStageStart config to play the song at every stage start (for verifying audio without grinding to Mithrix)
Fixed silent OGG load failure on Windows (proper file URI conversion)
More diagnostic logging during clip load and song start
1.0.0
Initial release
Plays the Monty Python and the Holy Grail intermission music during the chimera intermission of the Mithrix fight
Configurable phase + volume; mutes game music during the phase