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) }