package main import ( "encoding/json" "fmt" "os" ) type Config struct { Instrument string `json:"instrument"` Tuning []string `json:"tuning"` Frets int `json:"frets"` MaxFingers int `json:"max_fingers"` BaselineShift int `json:"baseline_shift"` RangeDown int `json:"range_down"` RangeUp int `json:"range_up"` } func LoadConfig(path string) (Config, error) { var cfg Config data, err := os.ReadFile(path) if err != nil { return cfg, err } err = json.Unmarshal(data, &cfg) return cfg, err } func SaveConfig(path string, cfg Config) error { data, err := json.MarshalIndent(cfg, "", " ") if err != nil { return err } return os.WriteFile(path, data, 0644) } func ValidateConfig(cfg Config) error { if len(cfg.Tuning) == 0 { return fmt.Errorf("tuning must have at least one string") } for _, note := range cfg.Tuning { if _, ok := NoteToSemitone[note]; !ok { return fmt.Errorf("invalid note: %s", note) } } if cfg.Frets < 1 || cfg.Frets > 24 { return fmt.Errorf("frets must be between 1 and 24") } if cfg.MaxFingers < 1 || cfg.MaxFingers > 6 { return fmt.Errorf("max fingers must be between 1 and 6") } return nil }