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}}, 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}}}} 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) synth, err := bridge.Synth(patch)
if err != nil { if err != nil {
t.Fatalf("Compiling patch failed: %v", err) 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.") 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.") 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") 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") 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.") 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 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) 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 var compiledPlayer map[string]string
if compile { if compile {
var err error var err error

View File

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

View File

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

View File

@ -214,7 +214,6 @@ var UnitTypes = map[string]([]UnitParameter){
type Song struct { type Song struct {
BPM int BPM int
Output16Bit bool Output16Bit bool
Hold byte
Tracks []Track Tracks []Track
Patch Patch Patch Patch
} }
@ -299,11 +298,11 @@ func Play(synth Synth, song Song) ([]float32, error) {
for t := range song.Tracks { for t := range song.Tracks {
patternIndex := song.Tracks[t].Sequence[pattern] patternIndex := song.Tracks[t].Sequence[pattern]
note := song.Tracks[t].Patterns[patternIndex][patternRow] 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 continue
} }
synth.Release(curVoices[t]) synth.Release(curVoices[t])
if note > song.Hold { if note > 1 {
curVoices[t]++ curVoices[t]++
first := song.FirstTrackVoice(t) first := song.FirstTrackVoice(t)
if curVoices[t] >= first+song.Tracks[t].NumVoices { if curVoices[t] >= first+song.Tracks[t].NumVoices {
@ -324,29 +323,3 @@ func Play(synth Synth, song Song) ([]float32, error) {
} }
return buffer, nil 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 inc ecx ; ecx++ // ecx=the first voice of next track
jc su_calculate_voices_loop ; } while bit ecx-1 of bitmask is on jc su_calculate_voices_loop ; } while bit ecx-1 of bitmask is on
push {{.CX}} ; Stack: next_instr ptrnrow 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 je short su_update_voices_nexttrack
mov cl, byte [{{.BP}}] mov cl, byte [{{.BP}}]
mov edi, ecx 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 shl edi, 12 ; each unit = 64 bytes and there are 1<<MAX_UNITS_SHIFT units + small header
{{- .Prepare "su_synth_obj" | indent 4}} {{- .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 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 jl su_update_voices_nexttrack ; goto nexttrack
inc ecx ; curvoice++ inc ecx ; curvoice++
cmp ecx, edx ; if (curvoice >= num_voices) 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 imul eax, {{.EncodedSong.PatternLength}} ; multiply by rows per pattern, eax = offset to current pattern data
{{- .Prepare "su_patterns" .AX | indent 8}} {{- .Prepare "su_patterns" .AX | indent 8}}
movzx eax, byte [{{.Use "su_patterns" .AX}} + {{.DX}}] ; ecx = note 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 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 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 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.add (global.get $row))
(i32.load8_u offset={{index .Labels "su_patterns"}}) (i32.load8_u offset={{index .Labels "su_patterns"}})
(local.tee $note) (local.tee $note)
(if (i32.ne (i32.const {{.Song.Hold}}))(then (if (i32.ne (i32.const {{.Hold}}))(then
(i32.store offset=4164 (i32.store offset=4164
(i32.mul (i32.mul
(i32.add (i32.add
@ -227,7 +227,7 @@
) )
(i32.const 1) (i32.const 1)
) ;; release the note ) ;; 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 (local.set $di (i32.add
(i32.mul (i32.mul
(i32.add (i32.add
@ -263,9 +263,9 @@
(i32.add (global.get $row)) (i32.add (global.get $row))
(i32.load8_u offset={{index .Labels "su_patterns"}}) (i32.load8_u offset={{index .Labels "su_patterns"}})
(local.tee $note) (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 (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)) (memory.fill (local.get $di) (i32.const 0) (i32.const 4096))
(i32.store (local.get $di) (local.get $note)) (i32.store (local.get $di) (local.get $note))
)) ))

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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