package schema // A simple song with tracks that loop type Song struct { Name string `yaml:"name"` BPM int `yaml:"bpm"` Length int `yaml:"length"` // Total length in bars Volume float64 `yaml:"volume"` Tracks []Track `yaml:"tracks"` } // A simple instrument track that can loop or play once type Track struct { Name string `yaml:"name"` Instrument string `yaml:"instrument"` // sine, square, saw, triangle Volume float64 `yaml:"volume"` Pan float64 `yaml:"pan"` // -1.0 to 1.0 Pattern []string `yaml:"pattern"` // Pattern like ["C4", ".", "E4", "."] Loop bool `yaml:"loop,omitempty"` // If true, pattern loops. If false, plays once then silence Effects []Effect `yaml:"effects,omitempty"` // Effects applied to this track } // Defines an audio effect type Effect struct { Type string `yaml:"type"` // reverb, delay, filter, etc. Params map[string]interface{} `yaml:"params"` // Effect-specific parameters } // Returns the song length in beats (bars * 4) func (s *Song) CalculateTotalLength() float64 { return float64(s.Length * 4) // 4 beats per bar } // Returns a song with default values func DefaultSong() Song { return Song{ Name: "New Song", BPM: 120, Length: 8, // 8 bars default Volume: 0.7, } }