From 8cfd9153119e5d7d752d9939d97578168f854596 Mon Sep 17 00:00:00 2001 From: vsariola <5684185+vsariola@users.noreply.github.com> Date: Wed, 10 Feb 2021 22:39:08 +0200 Subject: [PATCH] feat(sointu): add functions to figure out the stack use and need of a unit --- sointu.go | 28 ++++++++++++++++++++++++++++ tracker/instruments.go | 37 ++++++++++++++++++++++++++++++++----- tracker/theme.go | 2 ++ tracker/tracker.go | 1 + 4 files changed, 63 insertions(+), 5 deletions(-) diff --git a/sointu.go b/sointu.go index c167c7d..97fd9cc 100644 --- a/sointu.go +++ b/sointu.go @@ -452,6 +452,34 @@ func (s *Song) ParamHintString(instrIndex, unitIndex int, param string) string { return "" } +func (u *Unit) StackChange() int { + switch u.Type { + case "addp", "mulp", "pop", "out", "outaux", "aux": + return -1 - u.Parameters["stereo"] + case "envelope", "oscillator", "push", "noise", "receive", "loadnote", "loadval", "in", "compressor": + return 1 + u.Parameters["stereo"] + case "pan": + return 1 - u.Parameters["stereo"] + case "speed": + return -1 + case "send": + return (-1 - u.Parameters["stereo"]) * u.Parameters["sendpop"] + } + return 0 +} + +func (u *Unit) StackNeed() int { + switch u.Type { + case "envelope", "oscillator", "noise", "receive", "loadnote", "loadval", "in": + return 0 + case "mulp", "mul", "add", "addp", "xch": + return 2 * (1 + u.Parameters["stereo"]) + case "speed": + return 1 + } + return 1 + u.Parameters["stereo"] +} + func Play(synth Synth, song Song) ([]float32, error) { err := song.Validate() if err != nil { diff --git a/tracker/instruments.go b/tracker/instruments.go index aa4c39f..a96c307 100644 --- a/tracker/instruments.go +++ b/tracker/instruments.go @@ -2,6 +2,7 @@ package tracker import ( "image" + "strconv" "gioui.org/io/pointer" "gioui.org/layout" @@ -154,15 +155,41 @@ func (t *Tracker) layoutInstrumentEditor(gtx C) D { addUnitBtnStyle.Inset = layout.UniformInset(unit.Dp(4)) margin := layout.UniformInset(unit.Dp(2)) + for len(t.StackUse) < len(t.song.Patch.Instruments[t.CurrentInstrument].Units) { + t.StackUse = append(t.StackUse, 0) + } + + stackHeight := 0 + for i, u := range t.song.Patch.Instruments[t.CurrentInstrument].Units { + stackHeight += u.StackChange() + t.StackUse[i] = stackHeight + } + element := func(gtx C, i int) D { gtx.Constraints = layout.Exact(image.Pt(gtx.Px(unit.Dp(120)), gtx.Px(unit.Dp(20)))) u := t.song.Patch.Instruments[t.CurrentInstrument].Units[i] - labelStyle := LabelStyle{Text: u.Type, ShadeColor: black, Color: white, Font: labelDefaultFont, FontSize: unit.Sp(12)} - if labelStyle.Text == "" { - labelStyle.Text = "---" - labelStyle.Alignment = layout.Center + unitNameLabel := LabelStyle{Text: u.Type, ShadeColor: black, Color: white, Font: labelDefaultFont, FontSize: unit.Sp(12)} + if unitNameLabel.Text == "" { + unitNameLabel.Text = "---" + unitNameLabel.Alignment = layout.Center } - return labelStyle.Layout(gtx) + var stackText string + if i < len(t.StackUse) { + stackText = strconv.FormatInt(int64(t.StackUse[i]), 10) + var prevStackUse int + if i > 0 { + prevStackUse = t.StackUse[i-1] + } + if u.StackNeed() > prevStackUse || (i == len(t.StackUse)-1 && t.StackUse[i] > 0) { + unitNameLabel.Color = errorColor + } + } + stackLabel := LabelStyle{Text: stackText, ShadeColor: black, Color: mediumEmphasisTextColor, Font: labelDefaultFont, FontSize: unit.Sp(12)} + + return layout.Flex{Axis: layout.Horizontal}.Layout(gtx, + layout.Flexed(1, unitNameLabel.Layout), + layout.Rigid(stackLabel.Layout), + ) } unitList := FilledDragList(t.Theme, t.UnitDragList, len(t.song.Patch.Instruments[t.CurrentInstrument].Units), element, t.SwapUnits) diff --git a/tracker/theme.go b/tracker/theme.go index 8586c44..8168ce7 100644 --- a/tracker/theme.go +++ b/tracker/theme.go @@ -109,3 +109,5 @@ var activeLightSurfaceColor = color.NRGBA{R: 45, G: 45, B: 45, A: 255} var cursorColor = color.NRGBA{R: 100, G: 140, B: 255, A: 48} var selectionColor = color.NRGBA{R: 100, G: 140, B: 255, A: 8} var inactiveSelectionColor = color.NRGBA{R: 140, G: 140, B: 140, A: 16} + +var errorColor = color.NRGBA{R: 207, G: 102, B: 121, A: 255} diff --git a/tracker/tracker.go b/tracker/tracker.go index fa026f2..95bc169 100644 --- a/tracker/tracker.go +++ b/tracker/tracker.go @@ -76,6 +76,7 @@ type Tracker struct { TopHorizontalSplit *Split BottomHorizontalSplit *Split VerticalSplit *Split + StackUse []int sequencer *Sequencer ticked chan struct{}