From 01f696abb06ce48717a92b75ced74455e5c2b3a6 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 25 May 2026 19:17:25 +0100 Subject: [PATCH] Align spectrum spline camera and layout --- config/mimir-spectrum-field.aquafield | 2 +- src/Mimir.Runtime/MimirRuntime.cs | 44 ++++++++++++++++----------- state/evidence.jsonl | 1 + 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/config/mimir-spectrum-field.aquafield b/config/mimir-spectrum-field.aquafield index 9c06d33..29c2228 100644 --- a/config/mimir-spectrum-field.aquafield +++ b/config/mimir-spectrum-field.aquafield @@ -8,6 +8,6 @@ surface id=curvature op=d2Fdx2 inputs=amplitude value=0,0,0,0 surface id=emission op=mix inputs=amplitude,derivative,curvature value=1.0,0.72,0.22,1.0 surface id=coverage op=sdf.tube inputs=amplitude,derivative,curvature value=0.74,0.20,0.0,0.0 -splinefield id=asioSpectrumWaterfall texture=spectrumHistory frequencyAxis=x firstColumn=0 columns=160 columnStride=1 rollingModulo=160 subdivisions=4 density=1.0 minimumContribution=0.004 origin=-0.82,0.40,-0.18 axisStep=0.016,0.0,0.0 columnStep=0.0,-0.0055,0.0060 amplitudeScale=0.34 radius=0.064 alpha=0.98 zeroThreshold=0.68 feather=0.18 tangent=1.0 curvature=0.68 normal=0.34 derivative=0.88 emission=1.0,0.72,0.22,4.0 seed=2971668797 +splinefield id=asioSpectrumWaterfall texture=spectrumHistory frequencyAxis=x firstColumn=0 columns=$ROW_COUNT columnStride=1 rollingModulo=$ROW_COUNT subdivisions=4 density=1.0 minimumContribution=0.004 origin=-6.0,0.0,0.0 axisStep=0.2553,0.0,0.0 columnStep=0.0,0.0,0.18 columnGroupSize=$HISTORY_COUNT columnGroupStep=0.0,1.75,0.0 amplitudeScale=1.1 radius=0.042 alpha=0.98 zeroThreshold=0.68 feather=0.18 tangent=1.0 curvature=0.68 normal=0.34 derivative=0.88 emission=1.0,0.72,0.22,4.0 seed=2971668797 lowering mode=auto maxSplines=384 maxControlPoints=32768 maxSplats=131072 lodBias=1.0 diff --git a/src/Mimir.Runtime/MimirRuntime.cs b/src/Mimir.Runtime/MimirRuntime.cs index 9ba1d51..7126640 100644 --- a/src/Mimir.Runtime/MimirRuntime.cs +++ b/src/Mimir.Runtime/MimirRuntime.cs @@ -32,7 +32,7 @@ surface id=derivative op=dFdx inputs=amplitude value=0,0,0,0 surface id=curvature op=d2Fdx2 inputs=amplitude value=0,0,0,0 surface id=emission op=mix inputs=amplitude,derivative,curvature value=1.0,0.72,0.22,1.0 surface id=coverage op=sdf.tube inputs=amplitude,derivative,curvature value=0.74,0.20,0.0,0.0 -splinefield id=asioSpectrumWaterfall texture=spectrumHistory frequencyAxis=x firstColumn=0 columns=160 columnStride=1 rollingModulo=160 subdivisions=4 density=1.0 minimumContribution=0.004 origin=-0.82,0.40,-0.18 axisStep=0.016,0.0,0.0 columnStep=0.0,-0.0055,0.0060 amplitudeScale=0.34 radius=0.064 alpha=0.98 zeroThreshold=0.68 feather=0.18 tangent=1.0 curvature=0.68 normal=0.34 derivative=0.88 emission=1.0,0.72,0.22,4.0 seed=2971668797 +splinefield id=asioSpectrumWaterfall texture=spectrumHistory frequencyAxis=x firstColumn=0 columns=$ROW_COUNT columnStride=1 rollingModulo=$ROW_COUNT subdivisions=4 density=1.0 minimumContribution=0.004 origin=-6.0,0.0,0.0 axisStep=0.2553,0.0,0.0 columnStep=0.0,0.0,0.18 columnGroupSize=$HISTORY_COUNT columnGroupStep=0.0,1.75,0.0 amplitudeScale=1.1 radius=0.042 alpha=0.98 zeroThreshold=0.68 feather=0.18 tangent=1.0 curvature=0.68 normal=0.34 derivative=0.88 emission=1.0,0.72,0.22,4.0 seed=2971668797 lowering mode=auto maxSplines=384 maxControlPoints=32768 maxSplats=131072 lodBias=1.0 """; private readonly MimirSynchronizationHub synchronization; @@ -132,19 +132,9 @@ lowering mode=auto maxSplines=384 maxControlPoints=32768 maxSplats=131072 lodBia private AquariumFrame CreateFrame() { var channelCount = Math.Max(1, lastAudioSpectra.Count); - var cameraZ = channelCount * SpectrumChannelSeparation; var bufferFieldFrame = BuildSpectrumBufferFieldFrame(); - var directField = bufferFieldFrame.HasInput && !bufferFieldFrame.UseReservoirLowering; - var cameraPosition = directField - ? new Vector3(0.0f, -1.85f, 0.68f) - : bufferFieldFrame.HasInput - ? new Vector3(0.0f, -13.5f, 10.5f) - : new Vector3(0.0f, 0.0f, cameraZ); - var cameraTarget = directField - ? new Vector3(0.0f, -0.04f, 0.08f) - : bufferFieldFrame.HasInput - ? new Vector3(0.0f, 0.0f, 12.0f) - : new Vector3(0.0f, 0.0f, cameraZ + 12.0f); + var cameraPosition = SpectrumCameraPosition(channelCount); + var cameraTarget = SpectrumSplineAabbCenter(channelCount, spectrumHistory.Count); return new AquariumFrame( new ViewFrame(Vector2.Zero, 24.0f), cameraPosition, @@ -160,6 +150,20 @@ lowering mode=auto maxSplines=384 maxControlPoints=32768 maxSplats=131072 lodBia }); } + private static Vector3 SpectrumCameraPosition(int spectrumCount) + { + var distance = Math.Max(1, spectrumCount) * SpectrumChannelSeparation; + return new Vector3(0.0f, distance, -distance); + } + + private static Vector3 SpectrumSplineAabbCenter(int spectrumCount, int windowCount) + { + var x = 0.0f; + var y = (Math.Max(1, spectrumCount) - 1) * SpectrumChannelSeparation * 0.5f + SpectrumAmplitudeHeight * 0.5f; + var z = Math.Max(0, windowCount - 1) * SpectrumWindowDepthSeparation * 0.5f; + return new Vector3(x, y, z); + } + public AquariumSynthDocument Synth => AquariumSynthDocument.Empty; public void RegisterStreamSource(IMimirStreamSource source) @@ -726,7 +730,7 @@ lowering mode=auto maxSplines=384 maxControlPoints=32768 maxSplats=131072 lodBia continue; } - var row = baseRow + windowIndex * sourceIds.Length + channelIndex; + var row = baseRow + channelIndex * SpectrumHistoryWindowCount + windowIndex; WriteSpectrumRow(samples, row * bandCount, spectrum); } } @@ -740,7 +744,7 @@ lowering mode=auto maxSplines=384 maxControlPoints=32768 maxSplats=131072 lodBia AquariumRollingModuloMode.Rows, samples); return AquariumFieldScriptCompiler.Compile( - LoadSpectrumFieldScript(), + LoadSpectrumFieldScript(rowCount), new Dictionary(StringComparer.Ordinal) { [texture.Id] = texture, @@ -763,18 +767,22 @@ lowering mode=auto maxSplines=384 maxControlPoints=32768 maxSplats=131072 lodBia private static bool ShouldRenderSpectrumPreviewSplines() => string.Equals(Environment.GetEnvironmentVariable("MIMIR_SPECTRUM_PREVIEW_SPLINES"), "1", StringComparison.Ordinal); - private static string LoadSpectrumFieldScript() + private static string LoadSpectrumFieldScript(int rowCount) { + string Expand(string script) => script + .Replace("$ROW_COUNT", rowCount.ToString(System.Globalization.CultureInfo.InvariantCulture), StringComparison.Ordinal) + .Replace("$HISTORY_COUNT", SpectrumHistoryWindowCount.ToString(System.Globalization.CultureInfo.InvariantCulture), StringComparison.Ordinal); + foreach (var basePath in AncestorDirectories(Environment.CurrentDirectory).Concat(AncestorDirectories(AppContext.BaseDirectory))) { var candidate = Path.Combine(basePath, SpectrumFieldScriptPath); if (File.Exists(candidate)) { - return File.ReadAllText(candidate); + return Expand(File.ReadAllText(candidate)); } } - return DefaultSpectrumFieldScript; + return Expand(DefaultSpectrumFieldScript); } private static IEnumerable AncestorDirectories(string path) diff --git a/state/evidence.jsonl b/state/evidence.jsonl index 5f75bac..5088c67 100644 --- a/state/evidence.jsonl +++ b/state/evidence.jsonl @@ -121,3 +121,4 @@ {"ts": "2026-05-25T17:43:25+01:00", "type": "decision", "status": "ok", "note": "Fensalir direct splinefield correction: texture-derived tube trails are direct SDF envelope surfaces, not point-splat fractal dust. AquariumFieldScriptCompiler supports direct; D3D12Renderer now derives AquariumSplineFrame tube-envelope trails from BufferFieldFrame texture spline programs, the spline pipeline declares triangle topology, and D3D12SplinePS writes color, metadata/control, and reservoirGuide outputs. Mimir capture artifacts/runtime/mimir-direct-sdf-tube-spectrum.png proves the DSL-authored ASIO spectrum appears through the direct SDF tube path with ~0.64 ms record CPU in the canary."} {"ts": "2026-05-25T18:01:04+01:00", "type": "decision", "status": "ok", "note": "EVE native program output is now a D3D12 shared-texture contract: Fensalir owns completed backbuffer pixels and publishes Global\\MimirFensalirProgramTexture when FENSALIR_PROGRAM_OUTPUT_D3D12=1; Mimir records the EVE publication profile and WebKit remains forbidden as pixel/layout authority."} {"ts": "2026-05-25T18:25:00+01:00", "type": "decision", "status": "ok", "note": "Mimir's spectrum field script no longer chooses direct or reservoir backend lowering. It declares rolling texture-to-splinefield intent plus an auto lowering budget; Fensalir owns backend selection and LOD. MIMIR_SYNTHETIC_SPECTRUM_PREVIEW=1 exists only as a render-proof source when ASIO startup would block headless capture; real audio buffers remain runtime authority."} +{"ts": "2026-05-25T19:14:58+01:00", "type": "implementation", "status": "ok", "note": "Mimir spectrum layout now matches the intended coordinate contract: frequency runs along X, amplitude displaces Y, history windows step along Z, channels stack along Y via Fensalir column groups, and the runtime camera is placed at (0, spectrumCount * spacing, -spectrumCount * spacing) looking at the spline AABB center. Proof capture: artifacts/runtime/mimir-aabb-camera-spectrum-splines.png."}