Add song target evidence records

This commit is contained in:
Meta Vens 2026-05-31 03:37:07 +01:00
commit 37c580c800
10 changed files with 750 additions and 62 deletions

View file

@ -36,7 +36,21 @@ public sealed class IpaTrialOrchestratorTests
[new PrimitiveTimelineFact("contact_release_peak", "contact:contact", "released_flow", .12f, "flow", 2, 2, "release witness")]);
await IpaTrialResultCultCacheStore.UpsertResultsAsync(store, [result]);
await IpaTrialResultCultCacheStore.UpsertSongChallengeEvidenceAsync(
store,
[
new SongChallengeEvidenceDocument(
"challenge-a:logmel-band-stats",
"challenge-a",
"logmel-band-stats",
"text/csv",
"band,mean,abs_delta_mean\n0,-1.2,.3",
"sha256:evidence",
"reference.wav",
"2026-05-29T12:00:00.0000000Z")
]);
var loaded = await IpaTrialResultCultCacheStore.ReadResultsAsync(store);
var evidence = await IpaTrialResultCultCacheStore.ReadSongChallengeEvidenceAsync(store);
var single = Assert.Single(loaded);
Assert.Equal("trial-a", single.TrialId);
@ -44,6 +58,9 @@ public sealed class IpaTrialOrchestratorTests
Assert.Contains(single.Metrics, metric => metric.Name == "log_mel_cosine");
Assert.Contains(single.KnownLies, lie => lie.Contains("not an IPA sample", StringComparison.Ordinal));
Assert.Contains(single.TimelineFacts, fact => fact.Name == "contact_release_peak" && fact.Value > 0);
var evidenceDocument = Assert.Single(evidence);
Assert.Equal("logmel-band-stats", evidenceDocument.Kind);
Assert.Contains("abs_delta_mean", evidenceDocument.Content, StringComparison.Ordinal);
}
finally
{

View file

@ -65,6 +65,40 @@ public sealed class PatchScriptTests
Assert.Equal(.01f, lane.Modulator.Bias, 5);
}
[Fact]
public void ParserSupportsStrudelLikePatternAndScaleSugar()
{
var patch = PatchScript.Parse("""
scale name=lead_scale path=/seq/pitch freqs=493.883,587.33,659.255,698.457 degrees=0,1,3,2 step=.2
pattern name=lead_gate path=/seq/gate pattern=x.-x step=.1 high=.8 low=.05
voice wave=saw freq=@/seq/pitch gain=@/seq/gate sustain=30 decay=.2
""");
Assert.Contains(patch.Parameters, parameter => parameter.Path == "/seq/pitch" && parameter.Unit == "Hz");
Assert.Contains(patch.Parameters, parameter => parameter.Path == "/seq/gate");
var scale = Assert.Single(patch.ControlCurves, curve => curve.Name == "lead_scale");
Assert.Equal(ControlCurveInterpolation.Hold, scale.Interpolation);
Assert.True(scale.Loop);
Assert.Equal([493.883f, 587.33f, 698.457f, 659.255f], scale.Points.Select(point => point.Value).ToArray());
var gate = Assert.Single(patch.ControlCurves, curve => curve.Name == "lead_gate");
Assert.Equal([.8f, .05f, .05f, .8f], gate.Points.Select(point => point.Value).ToArray());
}
[Fact]
public void ParserSupportsNamedScaleIntervals()
{
var patch = PatchScript.Parse("""
scale path=/seq/pitch root=440 scale=minor-pentatonic-plus-tritone degrees=0,1,2,3 step=.25
voice freq=@/seq/pitch gain=.1
""");
var curve = Assert.Single(patch.ControlCurves);
Assert.Equal(440, curve.Points[0].Value, 3);
Assert.Equal(523.251f, curve.Points[1].Value, 3);
Assert.Equal(587.33f, curve.Points[2].Value, 3);
Assert.Equal(622.254f, curve.Points[3].Value, 3);
}
[Fact]
public void ParserSupportsVoiceVowelFrames()
{