diff --git a/tracker/keyevent.go b/tracker/keyevent.go index b7e2c85..f3ded38 100644 --- a/tracker/keyevent.go +++ b/tracker/keyevent.go @@ -57,10 +57,10 @@ func (t *Tracker) KeyEvent(e key.Event) bool { return true } case "A": - t.setCurrent(0) + t.SetCurrentNote(0) return true case key.NameDeleteForward: - t.setCurrent(1) + t.SetCurrentNote(1) return true case key.NameEscape: os.Exit(0) @@ -113,15 +113,22 @@ func (t *Tracker) KeyEvent(e key.Event) bool { t.CursorColumn = 0 return true } - if t.CursorColumn == 0 { - if val, ok := noteMap[e.Name]; ok { - t.NotePressed(val) + if e.Modifiers.Contain(key.ModCtrl) { + if iv, err := strconv.ParseInt(e.Name, 16, 8); err == nil { + t.SetCurrentPattern(byte(iv)) return true } } else { - if iv, err := strconv.ParseInt(e.Name, 16, 8); err == nil { - t.NumberPressed(byte(iv)) - return true + if t.CursorColumn == 0 { + if val, ok := noteMap[e.Name]; ok { + t.NotePressed(val) + return true + } + } else { + if iv, err := strconv.ParseInt(e.Name, 16, 8); err == nil { + t.NumberPressed(byte(iv)) + return true + } } } } @@ -143,12 +150,6 @@ func (t *Tracker) moveCursor(delta int) { } } -// setCurrent sets the (note) value in current pattern under cursor to iv -func (t *Tracker) setCurrent(iv byte) { - t.SaveUndo() - t.song.Tracks[t.ActiveTrack].Patterns[t.song.Tracks[t.ActiveTrack].Sequence[t.DisplayPattern]][t.CursorRow] = iv -} - // getCurrent returns the current (note) value in current pattern under the cursor func (t *Tracker) getCurrent() byte { return t.song.Tracks[t.ActiveTrack].Patterns[t.song.Tracks[t.ActiveTrack].Sequence[t.DisplayPattern]][t.CursorRow] @@ -156,7 +157,7 @@ func (t *Tracker) getCurrent() byte { // NotePressed handles incoming key presses while in the note column func (t *Tracker) NotePressed(val int) { - t.setCurrent(getNoteValue(int(t.CurrentOctave), val)) + t.SetCurrentNote(getNoteValue(int(t.CurrentOctave), val)) } // NumberPressed handles incoming presses while in either of the hex number columns @@ -167,5 +168,5 @@ func (t *Tracker) NumberPressed(iv byte) { } else if t.CursorColumn == 2 { val = (val & 0xF0) | (iv & 0xF) } - t.setCurrent(val) + t.SetCurrentNote(val) } diff --git a/tracker/tracker.go b/tracker/tracker.go index 3d1e360..24407a1 100644 --- a/tracker/tracker.go +++ b/tracker/tracker.go @@ -232,6 +232,25 @@ func (t *Tracker) AddInstrument() { } } +// SetCurrentNote sets the (note) value in current pattern under cursor to iv +func (t *Tracker) SetCurrentNote(iv byte) { + t.SaveUndo() + t.song.Tracks[t.ActiveTrack].Patterns[t.song.Tracks[t.ActiveTrack].Sequence[t.DisplayPattern]][t.CursorRow] = iv +} + +func (t *Tracker) SetCurrentPattern(pat byte) { + t.SaveUndo() + length := len(t.song.Tracks[t.ActiveTrack].Patterns) + if int(pat) >= length { + tail := make([][]byte, int(pat)-length+1) + for i := range tail { + tail[i] = make([]byte, t.song.PatternRows()) + } + t.song.Tracks[t.ActiveTrack].Patterns = append(t.song.Tracks[t.ActiveTrack].Patterns, tail...) + } + t.song.Tracks[t.ActiveTrack].Sequence[t.DisplayPattern] = pat +} + func New(audioContext sointu.AudioContext) *Tracker { t := &Tracker{ Theme: material.NewTheme(gofont.Collection()),