diff --git a/go.mod b/go.mod index dddc867..3d62cca 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/vsariola/sointu go 1.15 require ( - gioui.org v0.0.0-20210201160312-bb56b8183c84 + gioui.org v0.0.0-20210301085932-857143370701 github.com/Masterminds/goutils v1.1.0 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible diff --git a/go.sum b/go.sum index 5663c12..df25af4 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,6 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210201160312-bb56b8183c84 h1:legrGmmVL4FObz/D6sekGrFcrSZISML76QE29cyIArk= -gioui.org v0.0.0-20210201160312-bb56b8183c84/go.mod h1:Y+uS7hHMvku1Q+ooaoq6fYD5B2LGoT8JtFgvmYmRzTw= +gioui.org v0.0.0-20210301085932-857143370701 h1:0Pkwt4IMdpX0Y2EnekPx9VeA5EfSw9LsYiFlKyBtBIw= +gioui.org v0.0.0-20210301085932-857143370701/go.mod h1:Y+uS7hHMvku1Q+ooaoq6fYD5B2LGoT8JtFgvmYmRzTw= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Masterminds/goutils v1.1.0 h1:zukEsf/1JZwCMgHiK3GZftabmxiCw4apj3a28RPBiVg= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= diff --git a/tracker/model.go b/tracker/model.go index f21da37..ccb462e 100644 --- a/tracker/model.go +++ b/tracker/model.go @@ -3,6 +3,7 @@ package tracker import ( "errors" "fmt" + "math" "strconv" "strings" @@ -765,6 +766,12 @@ func (m *Model) NumParams() int { if numSettableParams == 0 { numSettableParams = 1 } + if unit.Type == "delay" { + numSettableParams += 1 + len(unit.VarArgs) + if len(unit.VarArgs)%2 == 1 && unit.Parameters["stereo"] == 1 { + numSettableParams++ + } + } return numSettableParams } @@ -814,6 +821,28 @@ func (m *Model) Param(index int) (Parameter, error) { } return Parameter{Type: IntegerParameter, Min: 0, Max: len(GmDlsEntries), Name: "sample", Hint: hint, Value: val}, nil } + if unit.Type == "delay" { + if index == 0 { + 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-- + if index < len(unit.VarArgs) { + val := unit.VarArgs[index] + var text string + if unit.Parameters["notetracking"] == 1 { + relPitch := float64(val) / 10787 + semitones := -math.Log2(relPitch) * 12 + text = fmt.Sprintf("%v / %.3f st", val, semitones) + } else { + text = fmt.Sprintf("%v / %.3f rows", val, float32(val)/float32(m.song.SamplesPerRow())) + } + return Parameter{Type: IntegerParameter, Min: 1, Max: 65535, Name: "delaytime", Hint: text, Value: val}, nil + } + } return Parameter{}, errors.New("invalid parameter") } @@ -832,11 +861,30 @@ func (m *Model) SetParam(value int) { return } unit := m.Unit() - if unit.Parameters[p.Name] == value { - return + if p.Name == "delaylines" { + m.saveUndo("SetParam", 20) + targetLines := value + if unit.Parameters["stereo"] == 1 { + targetLines *= 2 + } + for len(m.Instrument().Units[m.unitIndex].VarArgs) < targetLines { + m.Instrument().Units[m.unitIndex].VarArgs = append(m.Instrument().Units[m.unitIndex].VarArgs, 1) + } + m.Instrument().Units[m.unitIndex].VarArgs = m.Instrument().Units[m.unitIndex].VarArgs[:targetLines] + } else if p.Name == "delaytime" { + m.saveUndo("SetParam", 20) + index := m.paramIndex - 7 + for len(m.Instrument().Units[m.unitIndex].VarArgs) <= index { + m.Instrument().Units[m.unitIndex].VarArgs = append(m.Instrument().Units[m.unitIndex].VarArgs, 1) + } + m.Instrument().Units[m.unitIndex].VarArgs[index] = value + } else { + if unit.Parameters[p.Name] == value { + return + } + m.saveUndo("SetParam", 20) + unit.Parameters[p.Name] = value } - m.saveUndo("SetParam", 20) - unit.Parameters[p.Name] = value m.clampPositions() m.notifyPatchChange() }