feat(tracker): add rudimentary GUI for adjusting delay times

This commit is contained in:
vsariola 2021-03-01 20:42:37 +02:00
parent 3e7064e166
commit e46ece3648
3 changed files with 55 additions and 7 deletions

2
go.mod
View File

@ -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

4
go.sum
View File

@ -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=

View File

@ -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 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.clampPositions()
m.notifyPatchChange()
}