From b6ec5d1a042cb506b1da0cafdb728804ca6117b2 Mon Sep 17 00:00:00 2001 From: "5684185+vsariola@users.noreply.github.com" <5684185+vsariola@users.noreply.github.com> Date: Fri, 20 Oct 2023 01:50:38 +0300 Subject: [PATCH] style(tracker): group code into less number of files --- tracker/defaultsong.go | 101 ---------------------- tracker/gioui/instrumenteditor.go | 4 +- tracker/gmdlsentry.go | 22 ----- tracker/model.go | 18 ++++ tracker/note_id.go | 19 ----- tracker/presets.go | 135 +++++++++++++++++++++++++++--- 6 files changed, 144 insertions(+), 155 deletions(-) delete mode 100644 tracker/defaultsong.go delete mode 100644 tracker/gmdlsentry.go delete mode 100644 tracker/note_id.go diff --git a/tracker/defaultsong.go b/tracker/defaultsong.go deleted file mode 100644 index ec0aee6..0000000 --- a/tracker/defaultsong.go +++ /dev/null @@ -1,101 +0,0 @@ -package tracker - -import ( - "sort" - - "github.com/vsariola/sointu" -) - -var UnitTypeNames []string - -var defaultUnits = map[string]sointu.Unit{ - "envelope": {Type: "envelope", Parameters: map[string]int{"stereo": 0, "attack": 64, "decay": 64, "sustain": 64, "release": 64, "gain": 64}}, - "oscillator": {Type: "oscillator", Parameters: map[string]int{"stereo": 0, "transpose": 64, "detune": 64, "phase": 0, "color": 64, "shape": 64, "gain": 64, "type": sointu.Sine}}, - "noise": {Type: "noise", Parameters: map[string]int{"stereo": 0, "shape": 64, "gain": 64}}, - "mulp": {Type: "mulp", Parameters: map[string]int{"stereo": 0}}, - "mul": {Type: "mul", Parameters: map[string]int{"stereo": 0}}, - "add": {Type: "add", Parameters: map[string]int{"stereo": 0}}, - "addp": {Type: "addp", Parameters: map[string]int{"stereo": 0}}, - "push": {Type: "push", Parameters: map[string]int{"stereo": 0}}, - "pop": {Type: "pop", Parameters: map[string]int{"stereo": 0}}, - "xch": {Type: "xch", Parameters: map[string]int{"stereo": 0}}, - "receive": {Type: "receive", Parameters: map[string]int{"stereo": 0}}, - "loadnote": {Type: "loadnote", Parameters: map[string]int{"stereo": 0}}, - "loadval": {Type: "loadval", Parameters: map[string]int{"stereo": 0, "value": 64}}, - "pan": {Type: "pan", Parameters: map[string]int{"stereo": 0, "panning": 64}}, - "gain": {Type: "gain", Parameters: map[string]int{"stereo": 0, "gain": 64}}, - "invgain": {Type: "invgain", Parameters: map[string]int{"stereo": 0, "invgain": 64}}, - "crush": {Type: "crush", Parameters: map[string]int{"stereo": 0, "resolution": 64}}, - "clip": {Type: "clip", Parameters: map[string]int{"stereo": 0}}, - "hold": {Type: "hold", Parameters: map[string]int{"stereo": 0, "holdfreq": 64}}, - "distort": {Type: "distort", Parameters: map[string]int{"stereo": 0, "drive": 64}}, - "filter": {Type: "filter", Parameters: map[string]int{"stereo": 0, "frequency": 64, "resonance": 64, "lowpass": 1, "bandpass": 0, "highpass": 0, "negbandpass": 0, "neghighpass": 0}}, - "out": {Type: "out", Parameters: map[string]int{"stereo": 1, "gain": 64}}, - "outaux": {Type: "outaux", Parameters: map[string]int{"stereo": 1, "outgain": 64, "auxgain": 64}}, - "aux": {Type: "aux", Parameters: map[string]int{"stereo": 1, "gain": 64, "channel": 2}}, - "delay": {Type: "delay", - Parameters: map[string]int{"damp": 0, "dry": 128, "feedback": 96, "notetracking": 2, "pregain": 40, "stereo": 0}, - VarArgs: []int{48}}, - "in": {Type: "in", Parameters: map[string]int{"stereo": 1, "channel": 2}}, - "speed": {Type: "speed", Parameters: map[string]int{}}, - "compressor": {Type: "compressor", Parameters: map[string]int{"stereo": 0, "attack": 64, "release": 64, "invgain": 64, "threshold": 64, "ratio": 64}}, - "send": {Type: "send", Parameters: map[string]int{"stereo": 0, "amount": 128, "voice": 0, "unit": 0, "port": 0, "sendpop": 1}}, - "sync": {Type: "sync", Parameters: map[string]int{}}, -} - -var defaultInstrument = sointu.Instrument{ - Name: "Instr", - NumVoices: 1, - Units: []sointu.Unit{ - defaultUnits["envelope"], - defaultUnits["oscillator"], - defaultUnits["mulp"], - defaultUnits["delay"], - defaultUnits["pan"], - defaultUnits["outaux"], - }, -} - -var defaultSong = sointu.Song{ - BPM: 100, - RowsPerBeat: 4, - Score: sointu.Score{ - RowsPerPattern: 16, - Length: 1, - Tracks: []sointu.Track{ - {NumVoices: 1, Order: sointu.Order{0}, Patterns: []sointu.Pattern{{72, 0}}}, - }, - }, - Patch: sointu.Patch{defaultInstrument, - {Name: "Global", NumVoices: 1, Units: []sointu.Unit{ - defaultUnits["in"], - {Type: "delay", - Parameters: map[string]int{"damp": 64, "dry": 128, "feedback": 125, "notetracking": 0, "pregain": 40, "stereo": 1}, - VarArgs: []int{1116, 1188, 1276, 1356, 1422, 1492, 1556, 1618, - 1140, 1212, 1300, 1380, 1446, 1516, 1580, 1642, - }}, - {Type: "out", Parameters: map[string]int{"stereo": 1, "gain": 128}}, - }}}, -} - -type delayPreset struct { - name string - stereo int - varArgs []int -} - -var reverbs = []delayPreset{ - {"stereo", 1, []int{1116, 1188, 1276, 1356, 1422, 1492, 1556, 1618, - 1140, 1212, 1300, 1380, 1446, 1516, 1580, 1642, - }}, - {"left", 0, []int{1116, 1188, 1276, 1356, 1422, 1492, 1556, 1618}}, - {"right", 0, []int{1140, 1212, 1300, 1380, 1446, 1516, 1580, 1642}}, -} - -func init() { - UnitTypeNames = make([]string, 0, len(sointu.UnitTypes)) - for k := range sointu.UnitTypes { - UnitTypeNames = append(UnitTypeNames, k) - } - sort.Strings(UnitTypeNames) -} diff --git a/tracker/gioui/instrumenteditor.go b/tracker/gioui/instrumenteditor.go index 87ac963..cfd0803 100644 --- a/tracker/gioui/instrumenteditor.go +++ b/tracker/gioui/instrumenteditor.go @@ -75,7 +75,7 @@ func NewInstrumentEditor() *InstrumentEditor { paramEditor: NewParamEditor(), presetMenuItems: []MenuItem{}, } - for _, instr := range tracker.Presets { + for _, instr := range tracker.InstrumentPresets { ret.presetMenuItems = append(ret.presetMenuItems, MenuItem{Text: instr.Name, IconBytes: icons.ImageAudiotrack}) } return ret @@ -195,7 +195,7 @@ func (ie *InstrumentEditor) layoutInstrumentHeader(gtx C, t *Tracker) D { m := PopupMenu(t.Theme, &ie.presetMenu) for item, clicked := ie.presetMenu.Clicked(); clicked; item, clicked = ie.presetMenu.Clicked() { - t.SetInstrument(tracker.Presets[item]) + t.SetInstrument(tracker.InstrumentPresets[item]) } header := func(gtx C) D { diff --git a/tracker/gmdlsentry.go b/tracker/gmdlsentry.go deleted file mode 100644 index 2219a0b..0000000 --- a/tracker/gmdlsentry.go +++ /dev/null @@ -1,22 +0,0 @@ -package tracker - -import "github.com/vsariola/sointu/vm" - -type GmDlsEntry struct { - Start int - LoopStart int - LoopLength int - SuggestedTranspose int - Name string -} - -var GmDlsEntryMap = make(map[vm.SampleOffset]int) - -func init() { - for i, e := range GmDlsEntries { - key := vm.SampleOffset{Start: uint32(e.Start), LoopStart: uint16(e.LoopStart), LoopLength: uint16(e.LoopLength)} - GmDlsEntryMap[key] = i - } -} - -//go:generate go run generate/main.go diff --git a/tracker/model.go b/tracker/model.go index 68a32b9..b62f1c5 100644 --- a/tracker/model.go +++ b/tracker/model.go @@ -59,6 +59,16 @@ type ( modelMessages chan<- interface{} } + // Describes a note triggered either a track or an instrument + // If Go had union or Either types, this would be it, but in absence + // those, this uses a boolean to define if the instrument is defined or the track + NoteID struct { + IsInstr bool + Instr int + Track int + Note byte + } + ModelPlayingChangedMessage struct { bool } @@ -1474,6 +1484,14 @@ func (m *Model) computePatternUseCounts() { } } +func NoteIDInstr(instr int, note byte) NoteID { + return NoteID{IsInstr: true, Instr: instr, Note: note} +} + +func NoteIDTrack(track int, note byte) NoteID { + return NoteID{IsInstr: false, Track: track, Note: note} +} + func clamp(a, min, max int) int { if a < min { return min diff --git a/tracker/note_id.go b/tracker/note_id.go deleted file mode 100644 index 68b568d..0000000 --- a/tracker/note_id.go +++ /dev/null @@ -1,19 +0,0 @@ -package tracker - -// Describes a note triggered either a track or an instrument -// If Go had union or Either types, this would be it, but in absence -// those, this uses a boolean to define if the instrument is defined or the track -type NoteID struct { - IsInstr bool - Instr int - Track int - Note byte -} - -func NoteIDInstr(instr int, note byte) NoteID { - return NoteID{IsInstr: true, Instr: instr, Note: note} -} - -func NoteIDTrack(track int, note byte) NoteID { - return NoteID{IsInstr: false, Track: track, Note: note} -} diff --git a/tracker/presets.go b/tracker/presets.go index 1d8d21a..3423afa 100644 --- a/tracker/presets.go +++ b/tracker/presets.go @@ -6,25 +6,138 @@ import ( "sort" "github.com/vsariola/sointu" + "github.com/vsariola/sointu/vm" "gopkg.in/yaml.v3" ) -type PresetList []sointu.Instrument +//go:generate go run generate/main.go -//go:embed presets/* -var presetFS embed.FS +type GmDlsEntry struct { + Start int + LoopStart int + LoopLength int + SuggestedTranspose int + Name string +} -var Presets PresetList +var GmDlsEntryMap = make(map[vm.SampleOffset]int) func init() { - fs.WalkDir(presetFS, ".", func(path string, d fs.DirEntry, err error) error { + for i, e := range GmDlsEntries { + key := vm.SampleOffset{Start: uint32(e.Start), LoopStart: uint16(e.LoopStart), LoopLength: uint16(e.LoopLength)} + GmDlsEntryMap[key] = i + } +} + +var defaultUnits = map[string]sointu.Unit{ + "envelope": {Type: "envelope", Parameters: map[string]int{"stereo": 0, "attack": 64, "decay": 64, "sustain": 64, "release": 64, "gain": 64}}, + "oscillator": {Type: "oscillator", Parameters: map[string]int{"stereo": 0, "transpose": 64, "detune": 64, "phase": 0, "color": 64, "shape": 64, "gain": 64, "type": sointu.Sine}}, + "noise": {Type: "noise", Parameters: map[string]int{"stereo": 0, "shape": 64, "gain": 64}}, + "mulp": {Type: "mulp", Parameters: map[string]int{"stereo": 0}}, + "mul": {Type: "mul", Parameters: map[string]int{"stereo": 0}}, + "add": {Type: "add", Parameters: map[string]int{"stereo": 0}}, + "addp": {Type: "addp", Parameters: map[string]int{"stereo": 0}}, + "push": {Type: "push", Parameters: map[string]int{"stereo": 0}}, + "pop": {Type: "pop", Parameters: map[string]int{"stereo": 0}}, + "xch": {Type: "xch", Parameters: map[string]int{"stereo": 0}}, + "receive": {Type: "receive", Parameters: map[string]int{"stereo": 0}}, + "loadnote": {Type: "loadnote", Parameters: map[string]int{"stereo": 0}}, + "loadval": {Type: "loadval", Parameters: map[string]int{"stereo": 0, "value": 64}}, + "pan": {Type: "pan", Parameters: map[string]int{"stereo": 0, "panning": 64}}, + "gain": {Type: "gain", Parameters: map[string]int{"stereo": 0, "gain": 64}}, + "invgain": {Type: "invgain", Parameters: map[string]int{"stereo": 0, "invgain": 64}}, + "crush": {Type: "crush", Parameters: map[string]int{"stereo": 0, "resolution": 64}}, + "clip": {Type: "clip", Parameters: map[string]int{"stereo": 0}}, + "hold": {Type: "hold", Parameters: map[string]int{"stereo": 0, "holdfreq": 64}}, + "distort": {Type: "distort", Parameters: map[string]int{"stereo": 0, "drive": 64}}, + "filter": {Type: "filter", Parameters: map[string]int{"stereo": 0, "frequency": 64, "resonance": 64, "lowpass": 1, "bandpass": 0, "highpass": 0, "negbandpass": 0, "neghighpass": 0}}, + "out": {Type: "out", Parameters: map[string]int{"stereo": 1, "gain": 64}}, + "outaux": {Type: "outaux", Parameters: map[string]int{"stereo": 1, "outgain": 64, "auxgain": 64}}, + "aux": {Type: "aux", Parameters: map[string]int{"stereo": 1, "gain": 64, "channel": 2}}, + "delay": {Type: "delay", + Parameters: map[string]int{"damp": 0, "dry": 128, "feedback": 96, "notetracking": 2, "pregain": 40, "stereo": 0}, + VarArgs: []int{48}}, + "in": {Type: "in", Parameters: map[string]int{"stereo": 1, "channel": 2}}, + "speed": {Type: "speed", Parameters: map[string]int{}}, + "compressor": {Type: "compressor", Parameters: map[string]int{"stereo": 0, "attack": 64, "release": 64, "invgain": 64, "threshold": 64, "ratio": 64}}, + "send": {Type: "send", Parameters: map[string]int{"stereo": 0, "amount": 128, "voice": 0, "unit": 0, "port": 0, "sendpop": 1}}, + "sync": {Type: "sync", Parameters: map[string]int{}}, +} + +var defaultInstrument = sointu.Instrument{ + Name: "Instr", + NumVoices: 1, + Units: []sointu.Unit{ + defaultUnits["envelope"], + defaultUnits["oscillator"], + defaultUnits["mulp"], + defaultUnits["delay"], + defaultUnits["pan"], + defaultUnits["outaux"], + }, +} + +var defaultSong = sointu.Song{ + BPM: 100, + RowsPerBeat: 4, + Score: sointu.Score{ + RowsPerPattern: 16, + Length: 1, + Tracks: []sointu.Track{ + {NumVoices: 1, Order: sointu.Order{0}, Patterns: []sointu.Pattern{{72, 0}}}, + }, + }, + Patch: sointu.Patch{defaultInstrument, + {Name: "Global", NumVoices: 1, Units: []sointu.Unit{ + defaultUnits["in"], + {Type: "delay", + Parameters: map[string]int{"damp": 64, "dry": 128, "feedback": 125, "notetracking": 0, "pregain": 40, "stereo": 1}, + VarArgs: []int{1116, 1188, 1276, 1356, 1422, 1492, 1556, 1618, + 1140, 1212, 1300, 1380, 1446, 1516, 1580, 1642, + }}, + {Type: "out", Parameters: map[string]int{"stereo": 1, "gain": 128}}, + }}}, +} + +type delayPreset struct { + name string + stereo int + varArgs []int +} + +var reverbs = []delayPreset{ + {"stereo", 1, []int{1116, 1188, 1276, 1356, 1422, 1492, 1556, 1618, + 1140, 1212, 1300, 1380, 1446, 1516, 1580, 1642, + }}, + {"left", 0, []int{1116, 1188, 1276, 1356, 1422, 1492, 1556, 1618}}, + {"right", 0, []int{1140, 1212, 1300, 1380, 1446, 1516, 1580, 1642}}, +} + +var UnitTypeNames []string + +func init() { + UnitTypeNames = make([]string, 0, len(sointu.UnitTypes)) + for k := range sointu.UnitTypes { + UnitTypeNames = append(UnitTypeNames, k) + } + sort.Strings(UnitTypeNames) +} + +type instrumentPresets []sointu.Instrument + +//go:embed presets/* +var instrumentPresetFS embed.FS +var InstrumentPresets instrumentPresets + +func init() { + fs.WalkDir(instrumentPresetFS, ".", func(path string, d fs.DirEntry, err error) error { if err != nil { return err } if d.IsDir() { return nil } - data, err := fs.ReadFile(presetFS, path) + data, err := fs.ReadFile(instrumentPresetFS, path) if err != nil { return nil } @@ -32,20 +145,20 @@ func init() { if yaml.Unmarshal(data, &instr) != nil { return nil } - Presets = append(Presets, instr) + InstrumentPresets = append(InstrumentPresets, instr) return nil }) - sort.Sort(Presets) + sort.Sort(InstrumentPresets) } -func (p PresetList) Len() int { +func (p instrumentPresets) Len() int { return len(p) } -func (p PresetList) Less(i, j int) bool { +func (p instrumentPresets) Less(i, j int) bool { return p[i].Name < p[j].Name } -func (p PresetList) Swap(i, j int) { +func (p instrumentPresets) Swap(i, j int) { p[i], p[j] = p[j], p[i] }