From b455ef0f3c0c6fd9c2ae40eea9fd05e9f50f1cbb Mon Sep 17 00:00:00 2001 From: "5684185+vsariola@users.noreply.github.com" <5684185+vsariola@users.noreply.github.com> Date: Sat, 14 Oct 2023 14:58:38 +0300 Subject: [PATCH] feat(tracker): add reverb presets for delay unit The options are stereo, left and right. Similar to oscillator sample settings, if you tamper with these, it starts to show "custom". Used some of the generic features of go1.18, so had to update go.mod to require go1.18. --- CHANGELOG.md | 2 ++ go.mod | 2 +- tracker/defaultsong.go | 14 ++++++++++++++ tracker/model.go | 38 +++++++++++++++++++++++++++++++++++--- 4 files changed, 52 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84de66b..04c78bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Instrument presets. The presets are embedded in the executable and there's a button to open a menu to load one of the presets. - Frequency modulation target for oscillator, as it was in 4klang +- Reverb preset settings for a delay unit, with stereo, left and right + options ### Fixed - The sointu-vsti-native plugin has different plugin ID and plugin name diff --git a/go.mod b/go.mod index 7409d1e..d97425b 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/vsariola/sointu -go 1.17 +go 1.18 require ( gioui.org v0.3.0 diff --git a/tracker/defaultsong.go b/tracker/defaultsong.go index c1a586c..ec0aee6 100644 --- a/tracker/defaultsong.go +++ b/tracker/defaultsong.go @@ -78,6 +78,20 @@ var defaultSong = sointu.Song{ }}}, } +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 { diff --git a/tracker/model.go b/tracker/model.go index 222972e..ea156e2 100644 --- a/tracker/model.go +++ b/tracker/model.go @@ -11,6 +11,7 @@ import ( "github.com/vsariola/sointu" "github.com/vsariola/sointu/vm" + "golang.org/x/exp/slices" "gopkg.in/yaml.v2" ) @@ -863,6 +864,23 @@ func (m *Model) setGmDlsEntry(index int) { m.notifyPatchChange() } +func (m *Model) setReverb(index int) { + if index < 0 || index >= len(reverbs) { + return + } + entry := reverbs[index] + unit := &m.d.Song.Patch[m.d.InstrIndex].Units[m.d.UnitIndex] + if unit.Type != "delay" { + return + } + m.saveUndo("setReverb", 20) + unit.Parameters["stereo"] = entry.stereo + unit.Parameters["notetracking"] = 0 + unit.VarArgs = make([]int, len(entry.varArgs)) + copy(unit.VarArgs, entry.varArgs) + m.notifyPatchChange() +} + func (m *Model) SwapUnits(i, j int) { units := m.Instrument().Units if i < 0 || j < 0 || i >= len(units) || j >= len(units) || i == j { @@ -1121,7 +1139,7 @@ func (m *Model) NumParams() int { numSettableParams = 1 } if unit.Type == "delay" { - numSettableParams += 1 + len(unit.VarArgs) + numSettableParams += 2 + len(unit.VarArgs) if len(unit.VarArgs)%2 == 1 && unit.Parameters["stereo"] == 1 { numSettableParams++ } @@ -1181,13 +1199,23 @@ func (m *Model) Param(index int) (Parameter, error) { } if unit.Type == "delay" { if index == 0 { + i := slices.IndexFunc(reverbs, func(p delayPreset) bool { + return p.stereo == unit.Parameters["stereo"] && unit.Parameters["notetracking"] == 0 && slices.Equal(p.varArgs, unit.VarArgs) + }) + hint := "0 / custom" + if i >= 0 { + hint = fmt.Sprintf("%v / %v", i+1, reverbs[i].name) + } + return Parameter{Type: IntegerParameter, Min: 0, Max: len(reverbs), Name: "reverb", Hint: hint, Value: i + 1}, nil + } + if index == 1 { l := len(unit.VarArgs) if unit.Parameters["stereo"] == 1 { l = (l + 1) / 2 } return Parameter{Type: IntegerParameter, Min: 1, Max: 32, Name: "delaylines", Hint: strconv.Itoa(l), Value: l}, nil } - index-- + index -= 2 if index < len(unit.VarArgs) { val := unit.VarArgs[index] var text string @@ -1305,6 +1333,10 @@ func (m *Model) SetParam(value int) { m.setGmDlsEntry(value - 1) return } + if p.Name == "reverb" { + m.setReverb(value - 1) + return + } unit := m.Unit() if p.Name == "delaylines" { m.saveUndo("SetParam", 20) @@ -1318,7 +1350,7 @@ func (m *Model) SetParam(value int) { m.Instrument().Units[m.d.UnitIndex].VarArgs = m.Instrument().Units[m.d.UnitIndex].VarArgs[:targetLines] } else if p.Name == "delaytime" { m.saveUndo("SetParam", 20) - index := m.d.ParamIndex - 7 + index := m.d.ParamIndex - 8 for len(m.Instrument().Units[m.d.UnitIndex].VarArgs) <= index { m.Instrument().Units[m.d.UnitIndex].VarArgs = append(m.Instrument().Units[m.d.UnitIndex].VarArgs, 1) }