feat: remove hold from song

assume songs code it as 1 always; implementations are free to change this during compilation, but this should be a compile time flag / optimization; not a concern of song.
This commit is contained in:
vsariola 2021-01-05 15:50:27 +02:00
parent 994c11e8db
commit 30379c981d
96 changed files with 14 additions and 138 deletions

View File

@ -40,7 +40,7 @@ func TestOscillatSine(t *testing.T) {
sointu.Unit{Type: "out", Parameters: map[string]int{"stereo": 1, "gain": 128}},
}}}}
tracks := []sointu.Track{{NumVoices: 1, Sequence: []byte{0}, Patterns: [][]byte{{64, 0, 68, 0, 32, 0, 0, 0, 75, 0, 78, 0, 0, 0, 0, 0}}}}
song := sointu.Song{BPM: 100, Tracks: tracks, Patch: patch, Output16Bit: false, Hold: 1}
song := sointu.Song{BPM: 100, Tracks: tracks, Patch: patch, Output16Bit: false}
synth, err := bridge.Synth(patch)
if err != nil {
t.Fatalf("Compiling patch failed: %v", err)

View File

@ -39,7 +39,6 @@ func main() {
tmplDir := flag.String("t", "", "When compiling, use the templates in this directory instead of the standard templates.")
directory := flag.String("o", "", "Directory where to output all files. The directory and its parents are created if needed. By default, everything is placed in the same directory where the original song file is.")
extensionsOut := flag.String("e", "", "Output only the compiled files with these comma separated extensions. For example: h,asm")
hold := flag.Int("hold", -1, "New value to be used as the hold value. -1 = do not change.")
targetArch := flag.String("arch", runtime.GOARCH, "Target architecture. Defaults to OS architecture. Possible values: 386, amd64")
targetOs := flag.String("os", runtime.GOOS, "Target OS. Defaults to current OS. Possible values: windows, darwin, linux. Anything else is assumed linuxy.")
flag.Usage = printUsage
@ -108,12 +107,6 @@ func main() {
return fmt.Errorf("song could not be unmarshaled as a .json (%v) or .yml (%v)", errJSON, errYaml)
}
}
if *hold > -1 {
err = song.UpdateHold(byte(*hold))
if err != nil {
return fmt.Errorf("error updating the hold value of the song: %v", err)
}
}
var compiledPlayer map[string]string
if compile {
var err error

View File

@ -104,7 +104,8 @@ func (com *Compiler) Song(song *sointu.Song) (map[string]string, error) {
SongMacros
*EncodedPatch
EncodedSong *EncodedSong
}{compilerMacros, featureSetMacros, x86Macros, songMacros, encodedPatch, encodedSong}
Hold int
}{compilerMacros, featureSetMacros, x86Macros, songMacros, encodedPatch, encodedSong, 1}
populatedTemplate, extension, err = com.compile(templateName, &data)
} else if com.Arch == "wasm" {
wasmMacros := *NewWasmMacros()
@ -115,7 +116,8 @@ func (com *Compiler) Song(song *sointu.Song) (map[string]string, error) {
SongMacros
*EncodedPatch
EncodedSong *EncodedSong
}{compilerMacros, featureSetMacros, wasmMacros, songMacros, encodedPatch, encodedSong}
Hold int
}{compilerMacros, featureSetMacros, wasmMacros, songMacros, encodedPatch, encodedSong, 1}
populatedTemplate, extension, err = com.compile(templateName, &data)
}
if err != nil {

View File

@ -10,7 +10,6 @@ import (
func TestPatternReusing(t *testing.T) {
song := sointu.Song{
Hold: 1,
Tracks: []sointu.Track{{
Patterns: [][]byte{{64, 1, 1, 1, 0, 0, 0, 0}, {72, 0, 0, 0, 0, 0, 0, 0}},
Sequence: []byte{0, 1},
@ -34,7 +33,6 @@ func TestPatternReusing(t *testing.T) {
func TestUnnecessaryHolds(t *testing.T) {
song := sointu.Song{
Hold: 1,
Tracks: []sointu.Track{{
Patterns: [][]byte{{64, 1, 1, 1, 0, 1, 0, 0}, {72, 0, 1, 0, 1, 0, 0, 0}},
Sequence: []byte{0, 1},
@ -58,7 +56,6 @@ func TestUnnecessaryHolds(t *testing.T) {
func TestDontCares(t *testing.T) {
song := sointu.Song{
Hold: 1,
Tracks: []sointu.Track{{
Patterns: [][]byte{{64, 1, 1, 1, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}},
Sequence: []byte{0, 1},

View File

@ -214,7 +214,6 @@ var UnitTypes = map[string]([]UnitParameter){
type Song struct {
BPM int
Output16Bit bool
Hold byte
Tracks []Track
Patch Patch
}
@ -299,11 +298,11 @@ func Play(synth Synth, song Song) ([]float32, error) {
for t := range song.Tracks {
patternIndex := song.Tracks[t].Sequence[pattern]
note := song.Tracks[t].Patterns[patternIndex][patternRow]
if note > 0 && note <= song.Hold { // anything but hold causes an action.
if note > 0 && note <= 1 { // anything but hold causes an action.
continue
}
synth.Release(curVoices[t])
if note > song.Hold {
if note > 1 {
curVoices[t]++
first := song.FirstTrackVoice(t)
if curVoices[t] >= first+song.Tracks[t].NumVoices {
@ -324,29 +323,3 @@ func Play(synth Synth, song Song) ([]float32, error) {
}
return buffer, nil
}
func (s *Song) UpdateHold(newHold byte) error {
if newHold == 0 {
return errors.New("hold value cannot be 0, 0 is reserved for release")
}
for _, track := range s.Tracks {
for _, pat := range track.Patterns {
for _, v := range pat {
if v > s.Hold && v <= newHold {
return errors.New("song uses note values greater or equal to the new hold value")
}
}
}
}
for _, track := range s.Tracks {
for _, pat := range track.Patterns {
for i, v := range pat {
if v > 0 && v <= s.Hold {
pat[i] = newHold
}
}
}
}
s.Hold = newHold
return nil
}

View File

@ -112,7 +112,7 @@ su_calculate_voices_loop: ; do {
inc ecx ; ecx++ // ecx=the first voice of next track
jc su_calculate_voices_loop ; } while bit ecx-1 of bitmask is on
push {{.CX}} ; Stack: next_instr ptrnrow
cmp al, {{.Song.Hold}} ; anything but hold causes action
cmp al, {{.Hold}} ; anything but hold causes action
je short su_update_voices_nexttrack
mov cl, byte [{{.BP}}]
mov edi, ecx
@ -120,7 +120,7 @@ su_calculate_voices_loop: ; do {
shl edi, 12 ; each unit = 64 bytes and there are 1<<MAX_UNITS_SHIFT units + small header
{{- .Prepare "su_synth_obj" | indent 4}}
inc dword [{{.Use "su_synth_obj"}} + su_synthworkspace.voices + su_voice.release + {{.DI}}] ; set the voice currently active to release; notice that it could increment any number of times
cmp al, {{.Song.Hold}} ; if cl < HLD (no new note triggered)
cmp al, {{.Hold}} ; if cl < HLD (no new note triggered)
jl su_update_voices_nexttrack ; goto nexttrack
inc ecx ; curvoice++
cmp ecx, edx ; if (curvoice >= num_voices)
@ -160,7 +160,7 @@ su_update_voices_trackloop:
imul eax, {{.EncodedSong.PatternLength}} ; multiply by rows per pattern, eax = offset to current pattern data
{{- .Prepare "su_patterns" .AX | indent 8}}
movzx eax, byte [{{.Use "su_patterns" .AX}} + {{.DX}}] ; ecx = note
cmp al, {{.Song.Hold}} ; anything but hold causes action
cmp al, {{.Hold}} ; anything but hold causes action
je short su_update_voices_nexttrack
inc dword [{{.DI}}+su_voice.release] ; set the voice currently active to release; notice that it could increment any number of times
jb su_update_voices_nexttrack ; if cl < HLD (no new note triggered) goto nexttrack

View File

@ -216,7 +216,7 @@
(i32.add (global.get $row))
(i32.load8_u offset={{index .Labels "su_patterns"}})
(local.tee $note)
(if (i32.ne (i32.const {{.Song.Hold}}))(then
(if (i32.ne (i32.const {{.Hold}}))(then
(i32.store offset=4164
(i32.mul
(i32.add
@ -227,7 +227,7 @@
)
(i32.const 1)
) ;; release the note
(if (i32.gt_u (local.get $note) (i32.const {{.Song.Hold}}))(then
(if (i32.gt_u (local.get $note) (i32.const {{.Hold}}))(then
(local.set $di (i32.add
(i32.mul
(i32.add
@ -263,9 +263,9 @@
(i32.add (global.get $row))
(i32.load8_u offset={{index .Labels "su_patterns"}})
(local.tee $note)
(if (i32.ne (i32.const {{.Song.Hold}}))(then
(if (i32.ne (i32.const {{.Hold}}))(then
(i32.store offset=4 (local.get $di) (i32.const 1)) ;; release the note
(if (i32.gt_u (local.get $note) (i32.const {{.Song.Hold}}))(then
(if (i32.gt_u (local.get $note) (i32.const {{.Hold}}))(then
(memory.fill (local.get $di) (i32.const 0) (i32.const 4096))
(i32.store (local.get $di) (local.get $note))
))

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: true
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [1, 0, 2, 0, 3, 0, 4, 0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [1, 0, 2, 0, 3, 0, 4, 0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 2
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0, 0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]

View File

@ -1,6 +1,5 @@
bpm: 100
output16bit: false
hold: 1
tracks:
- numvoices: 1
sequence: [0]