mirror of
https://github.com/vsariola/sointu.git
synced 2025-07-18 21:14:31 -04:00
refactor(sointu): add explicit RowsPerPattern to the song
This commit is contained in:
@ -13,7 +13,8 @@ var defaultInstrument = sointu.Instrument{
|
||||
}
|
||||
|
||||
var defaultSong = sointu.Song{
|
||||
BPM: 100,
|
||||
BPM: 100,
|
||||
RowsPerPattern: 16,
|
||||
Tracks: []sointu.Track{
|
||||
{NumVoices: 2, Sequence: []byte{0, 0, 0, 1}, Patterns: [][]byte{{64, 0, 68, 0, 32, 0, 0, 0, 75, 0, 78, 0, 0, 0, 0, 0}, {64, 0, 68, 0, 32, 0, 0, 0, 75, 0, 75, 0, 75, 0, 80, 0}}},
|
||||
{NumVoices: 2, Sequence: []byte{0, 0, 0, 1}, Patterns: [][]byte{{0, 0, 64, 0, 68, 0, 32, 0, 0, 0, 75, 0, 78, 0, 0, 0}, {32, 0, 64, 0, 68, 0, 32, 0, 0, 0, 75, 0, 68, 0, 68, 0}}},
|
||||
|
@ -75,7 +75,7 @@ func (t *Tracker) KeyEvent(e key.Event) bool {
|
||||
case key.NameUpArrow:
|
||||
delta := -1
|
||||
if e.Modifiers.Contain(key.ModCtrl) {
|
||||
delta = -t.song.PatternRows()
|
||||
delta = -t.song.RowsPerPattern
|
||||
}
|
||||
t.Cursor.Row += delta
|
||||
t.Cursor.Clamp(t.song)
|
||||
@ -87,7 +87,7 @@ func (t *Tracker) KeyEvent(e key.Event) bool {
|
||||
case key.NameDownArrow:
|
||||
delta := 1
|
||||
if e.Modifiers.Contain(key.ModCtrl) {
|
||||
delta = t.song.PatternRows()
|
||||
delta = t.song.RowsPerPattern
|
||||
}
|
||||
t.Cursor.Row += delta
|
||||
t.Cursor.Clamp(t.song)
|
||||
|
@ -18,21 +18,21 @@ type SongRect struct {
|
||||
}
|
||||
|
||||
func (r *SongRow) Wrap(song sointu.Song) {
|
||||
totalRow := r.Pattern*song.PatternRows() + r.Row
|
||||
r.Row = mod(totalRow, song.PatternRows())
|
||||
r.Pattern = mod((totalRow-r.Row)/song.PatternRows(), song.SequenceLength())
|
||||
totalRow := r.Pattern*song.RowsPerPattern + r.Row
|
||||
r.Row = mod(totalRow, song.RowsPerPattern)
|
||||
r.Pattern = mod((totalRow-r.Row)/song.RowsPerPattern, song.SequenceLength())
|
||||
}
|
||||
|
||||
func (r *SongRow) Clamp(song sointu.Song) {
|
||||
totalRow := r.Pattern*song.PatternRows() + r.Row
|
||||
totalRow := r.Pattern*song.RowsPerPattern + r.Row
|
||||
if totalRow < 0 {
|
||||
totalRow = 0
|
||||
}
|
||||
if totalRow >= song.TotalRows() {
|
||||
totalRow = song.TotalRows() - 1
|
||||
}
|
||||
r.Row = totalRow % song.PatternRows()
|
||||
r.Pattern = ((totalRow - r.Row) / song.PatternRows()) % song.SequenceLength()
|
||||
r.Row = totalRow % song.RowsPerPattern
|
||||
r.Pattern = ((totalRow - r.Row) / song.RowsPerPattern) % song.SequenceLength()
|
||||
}
|
||||
|
||||
func (p *SongPoint) Wrap(song sointu.Song) {
|
||||
|
@ -26,7 +26,7 @@ func (t *Tracker) layoutTrack(trackNo int) layout.Widget {
|
||||
op.Offset(f32.Pt(0, float32(gtx.Constraints.Max.Y/2)-trackRowHeight)).Add(gtx.Ops)
|
||||
// TODO: this is a time bomb; as soon as one of the patterns is not the same length as rest. Find a solution
|
||||
// to fix the pattern lengths to a constant value
|
||||
cursorSongRow := t.Cursor.Pattern*t.song.PatternRows() + t.Cursor.Row
|
||||
cursorSongRow := t.Cursor.Pattern*t.song.RowsPerPattern + t.Cursor.Row
|
||||
op.Offset(f32.Pt(0, (-1*trackRowHeight)*float32(cursorSongRow))).Add(gtx.Ops)
|
||||
patternRect := SongRect{
|
||||
Corner1: SongPoint{SongRow: SongRow{Pattern: t.Cursor.Pattern}, Track: t.Cursor.Track},
|
||||
@ -38,7 +38,7 @@ func (t *Tracker) layoutTrack(trackNo int) layout.Widget {
|
||||
}
|
||||
for i, s := range t.song.Tracks[trackNo].Sequence {
|
||||
if patternRect.Contains(SongPoint{Track: trackNo, SongRow: SongRow{Pattern: i}}) {
|
||||
paint.FillShape(gtx.Ops, activeTrackColor, clip.Rect{Max: image.Pt(trackWidth, trackRowHeight*t.song.PatternRows())}.Op())
|
||||
paint.FillShape(gtx.Ops, activeTrackColor, clip.Rect{Max: image.Pt(trackWidth, trackRowHeight*t.song.RowsPerPattern)}.Op())
|
||||
}
|
||||
for j, c := range t.song.Tracks[trackNo].Patterns[s] {
|
||||
songRow := SongRow{Pattern: i, Row: j}
|
||||
|
@ -188,7 +188,7 @@ func (t *Tracker) AddTrack() {
|
||||
t.SaveUndo()
|
||||
if t.song.TotalTrackVoices() < t.song.Patch.TotalVoices() {
|
||||
seq := make([]byte, t.song.SequenceLength())
|
||||
patterns := [][]byte{make([]byte, t.song.PatternRows())}
|
||||
patterns := [][]byte{make([]byte, t.song.RowsPerPattern)}
|
||||
t.song.Tracks = append(t.song.Tracks, sointu.Track{
|
||||
NumVoices: 1,
|
||||
Patterns: patterns,
|
||||
@ -233,7 +233,7 @@ func (t *Tracker) SetCurrentPattern(pat byte) {
|
||||
if int(pat) >= length {
|
||||
tail := make([][]byte, int(pat)-length+1)
|
||||
for i := range tail {
|
||||
tail[i] = make([]byte, t.song.PatternRows())
|
||||
tail[i] = make([]byte, t.song.RowsPerPattern)
|
||||
}
|
||||
t.song.Tracks[t.Cursor.Track].Patterns = append(t.song.Tracks[t.Cursor.Track].Patterns, tail...)
|
||||
}
|
||||
@ -261,8 +261,8 @@ func (t *Tracker) SetSongLength(value int) {
|
||||
}
|
||||
|
||||
func (t *Tracker) getSelectionRange() (int, int, int, int) {
|
||||
r1 := t.Cursor.Pattern*t.song.PatternRows() + t.Cursor.Row
|
||||
r2 := t.SelectionCorner.Pattern*t.song.PatternRows() + t.SelectionCorner.Row
|
||||
r1 := t.Cursor.Pattern*t.song.RowsPerPattern + t.Cursor.Row
|
||||
r2 := t.SelectionCorner.Pattern*t.song.RowsPerPattern + t.SelectionCorner.Row
|
||||
if r2 < r1 {
|
||||
r1, r2 = r2, r1
|
||||
}
|
||||
|
Reference in New Issue
Block a user