90 lines
1.8 KiB
Go
90 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestStandardTuningAppearsForEMajor(t *testing.T) {
|
|
query := ShapeQuery{
|
|
Shape: ShapeDefinition{"E major", []int{0, 2, 2, 1, 0, 0}},
|
|
TargetQuality: "major",
|
|
TargetRoot: -1,
|
|
RangeDown: 7,
|
|
RangeUp: 7,
|
|
}
|
|
|
|
results, err := findCandidateTunings(query)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
std := []int{40, 45, 50, 55, 59, 64}
|
|
found := false
|
|
for _, r := range results {
|
|
match := true
|
|
for s := 0; s < 6; s++ {
|
|
if r.tuningMIDI[s] != std[s] {
|
|
match = false
|
|
break
|
|
}
|
|
}
|
|
if match {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
if !found {
|
|
t.Error("Standard tuning not found for E major shape + major quality")
|
|
}
|
|
}
|
|
|
|
func TestBStandardReturnsItself(t *testing.T) {
|
|
// B standard = 5 semitones down from E standard
|
|
bStd := []int{35, 40, 45, 50, 54, 59} // B1 E2 A2 D3 F#3 B3
|
|
|
|
query := ShapeQuery{
|
|
Shape: ShapeDefinition{"E major", []int{0, 2, 2, 1, 0, 0}},
|
|
TargetQuality: "major",
|
|
TargetRoot: -1,
|
|
BaseTuning: bStd,
|
|
RangeDown: 3,
|
|
RangeUp: 3,
|
|
}
|
|
|
|
results, err := findCandidateTunings(query)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
t.Logf("Total candidates: %d", len(results))
|
|
found := false
|
|
for _, r := range results {
|
|
match := true
|
|
for s := 0; s < 6; s++ {
|
|
if r.tuningMIDI[s] != bStd[s] {
|
|
match = false
|
|
break
|
|
}
|
|
}
|
|
if match {
|
|
found = true
|
|
t.Logf("B standard found: root=%d midi=%v", r.root, r.tuningMIDI)
|
|
break
|
|
}
|
|
}
|
|
|
|
if !found {
|
|
for i, r := range results {
|
|
if i >= 10 {
|
|
break
|
|
}
|
|
shifts := make([]int, 6)
|
|
for s := 0; s < 6; s++ {
|
|
shifts[s] = r.tuningMIDI[s] - bStd[s]
|
|
}
|
|
t.Logf(" root=%d midi=%v shifts=%v", r.root, r.tuningMIDI, shifts)
|
|
}
|
|
t.Error("B standard tuning not found when BaseTuning=B standard, range ±3")
|
|
}
|
|
}
|