mirror of
https://github.com/vsariola/sointu.git
synced 2025-05-28 03:10:24 -04:00
45 lines
1.4 KiB
Go
45 lines
1.4 KiB
Go
package sointu
|
|
|
|
// Track represents the patterns and orderlist for each track. Note that each
|
|
// track has its own patterns, so one track cannot use another tracks patterns.
|
|
// This makes the data more intuitive to humans, as the reusing of patterns over
|
|
// tracks is a rather rare occurence. However, the compiler will put all the
|
|
// patterns in one global table (identical patterns only appearing once), to
|
|
// optimize the runtime code.
|
|
type Track struct {
|
|
// NumVoices is the number of voices this track triggers, cycling through
|
|
// the voices. When this track triggers a new voice, the previous should be
|
|
// released.
|
|
NumVoices int
|
|
|
|
// Effect hints the GUI if this is more of an effect track than a note
|
|
// track: if true, e.g. the GUI can display the values as hexadecimals
|
|
// instead of note values.
|
|
Effect bool `yaml:",omitempty"`
|
|
|
|
// Order is a list telling which pattern comes in which order in the song in
|
|
// this track.
|
|
Order Order `yaml:",flow"`
|
|
|
|
// Patterns is a list of Patterns for this track.
|
|
Patterns []Pattern `yaml:",flow"`
|
|
}
|
|
|
|
// Copy makes a deep copy of a Track.
|
|
func (t *Track) Copy() Track {
|
|
order := make([]int, len(t.Order))
|
|
copy(order, t.Order)
|
|
patterns := make([]Pattern, len(t.Patterns))
|
|
for i, oldPat := range t.Patterns {
|
|
newPat := make(Pattern, len(oldPat))
|
|
copy(newPat, oldPat)
|
|
patterns[i] = newPat
|
|
}
|
|
return Track{
|
|
NumVoices: t.NumVoices,
|
|
Effect: t.Effect,
|
|
Order: order,
|
|
Patterns: patterns,
|
|
}
|
|
}
|