43 lines
1.3 KiB
Go
43 lines
1.3 KiB
Go
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,
|
|
}
|
|
}
|