diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5e7b9fc..9add7de 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -46,7 +46,7 @@ jobs: - name: Tar.gz files run: tar -zcvf sektron_${{ github.ref_name }}_${{ runner.os}}.tar.gz LICENSE -C bin sektron - if: ${{ !startsWith(matrix.os, 'windows') }} + if: ${{ github.ref_type == 'tag' }} - name: Upload artifact uses: actions/upload-artifact@v3 @@ -54,6 +54,7 @@ jobs: name: sektron_${{ github.sha }} path: sektron_${{ github.ref_name }}_${{ runner.os}}.tar.gz if-no-files-found: error + if: ${{ github.ref_type == 'tag' }} release: needs: build diff --git a/filesystem/keymap.go b/filesystem/keymap.go index f3b951f..4be11ec 100644 --- a/filesystem/keymap.go +++ b/filesystem/keymap.go @@ -14,6 +14,8 @@ type KeyMap struct { RemoveStep string `json:"remove_step"` CopyStep string `json:"copy_step"` PasteStep string `json:"paste_step"` + PreviousStep string `json:"previous_step"` + NextStep string `json:"next_step"` PageUp string `json:"page_up"` PageDown string `json:"page_down"` TempoUp string `json:"tempo_up"` @@ -44,6 +46,8 @@ func NewDefaultAzertyKeyMap() KeyMap { RemoveStep: "°", CopyStep: "ctrl+c", PasteStep: "ctrl+v", + PreviousStep: ",", + NextStep: ";", PageUp: "p", PageDown: "m", TempoUp: "shift+up", @@ -75,6 +79,8 @@ func NewDefaultAzertyMacKeyMap() KeyMap { RemoveStep: "°", CopyStep: "ctrl+c", PasteStep: "ctrl+v", + PreviousStep: ",", + NextStep: ";", PageUp: "p", PageDown: "m", TempoUp: "shift+up", @@ -105,6 +111,8 @@ func NewDefaultQwertyKeyMap() KeyMap { RemoveStep: "_", CopyStep: "ctrl+c", PasteStep: "ctrl+v", + PreviousStep: ",", + NextStep: ".", PageUp: "p", PageDown: ";", TempoUp: "shift+up", @@ -136,6 +144,8 @@ func NewDefaultQwertyMacKeyMap() KeyMap { RemoveStep: "_", CopyStep: "ctrl+c", PasteStep: "ctrl+v", + PreviousStep: ",", + NextStep: ".", PageUp: "p", PageDown: ";", TempoUp: "shift+up", diff --git a/ui/keymap.go b/ui/keymap.go index 7b9ad85..f617953 100644 --- a/ui/keymap.go +++ b/ui/keymap.go @@ -22,6 +22,9 @@ type keyMap struct { CopyStep key.Binding PasteStep key.Binding + NextStep key.Binding + PreviousStep key.Binding + StepIndex map[string]int Step key.Binding @@ -63,7 +66,7 @@ func (k keyMap) ShortHelp() []key.Binding { // key.Map interface. func (k keyMap) FullHelp() [][]key.Binding { return [][]key.Binding{ - {k.Play, k.ParamMode, k.PatternMode, k.AddTrack, k.RemoveTrack, k.AddStep, k.RemoveStep, k.TempoUp, k.TempoDown}, + {k.Play, k.ParamMode, k.PatternMode, k.AddTrack, k.RemoveTrack, k.AddStep, k.RemoveStep, k.PreviousStep, k.NextStep, k.TempoUp, k.TempoDown}, {k.Step, k.StepToggle, k.Track, k.TrackToggle, k.PageUp, k.PageDown, k.AddParam, k.RemoveParam}, {k.Validate, k.Up, k.Down, k.Left, k.Right, k.Help, k.Quit}, } @@ -108,6 +111,14 @@ func newKeyMap(keys filesystem.KeyMap) keyMap { key.WithKeys(keys.PasteStep), key.WithHelp(keys.PasteStep, "paste copied parameters into active step"), ), + PreviousStep: key.NewBinding( + key.WithKeys(keys.PreviousStep), + key.WithHelp(keys.PreviousStep, "select previous step"), + ), + NextStep: key.NewBinding( + key.WithKeys(keys.NextStep), + key.WithHelp(keys.NextStep, "select next step"), + ), StepIndex: map[string]int{}, Step: key.NewBinding( key.WithKeys(keys.Steps[:]...), diff --git a/ui/ui.go b/ui/ui.go index cc11702..bdfce22 100644 --- a/ui/ui.go +++ b/ui/ui.go @@ -91,6 +91,8 @@ func (m mainModel) Init() tea.Cmd { } func (m mainModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + m.resetPatternState() + switch msg := msg.(type) { case tea.WindowSizeMsg: @@ -162,6 +164,39 @@ func (m mainModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.seq.RemoveStep(m.activeTrack) return m, nil + case key.Matches(msg, m.keymap.PreviousStep): + if m.mode == stepMode || m.mode == trackMode { + newIndex := m.activeStep - 1 + if newIndex < 0 { + newIndex = len(m.getActiveTrack().Steps()) - 1 + } + + m.activeStep = newIndex + // Paginate if needed + m.activeTrackPage = (newIndex / stepsPerPage) + + m.mode = stepMode + m.stepModeTimer = 0 + m.updateParams() + } + return m, nil + + case key.Matches(msg, m.keymap.NextStep): + if m.mode == stepMode || m.mode == trackMode { + newIndex := m.activeStep + 1 + if newIndex > len(m.getActiveTrack().Steps())-1 { + newIndex = 0 + } + m.activeStep = newIndex + // Paginate if needed + m.activeTrackPage = (newIndex / stepsPerPage) + + m.mode = stepMode + m.stepModeTimer = 0 + m.updateParams() + } + return m, nil + case key.Matches(msg, m.keymap.Step): number := m.keymap.StepIndex[msg.String()] if m.mode == patternMode { @@ -287,6 +322,9 @@ func (m mainModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.mode = trackMode m.updateParams() } + if m.mode == stepMode { + m.seq.ToggleStep(m.activeTrack, m.activeStep) + } return m, nil case key.Matches(msg, m.keymap.Left): @@ -373,6 +411,16 @@ func (m mainModel) View() string { ) } +// resetPattern ensures that we reset active track and step state +// after a pattern chain if needed +func (m *mainModel) resetPatternState() { + if m.activeTrack >= len(m.seq.Tracks()) || m.activeStep >= len(m.seq.Tracks()[m.activeTrack].Steps()) { + m.activeTrack = 0 + m.activeTrackPage = 0 + m.activeStep = 0 + } +} + func (m *mainModel) getActiveTrack() sequencer.Track { return m.seq.Tracks()[m.activeTrack] }