mirror of
https://github.com/vsariola/sointu.git
synced 2025-05-27 10:50:23 -04:00
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:
parent
994c11e8db
commit
30379c981d
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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 {
|
||||
|
@ -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},
|
||||
|
31
sointu.go
31
sointu.go
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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))
|
||||
))
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: true
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [1, 0, 2, 0, 3, 0, 4, 0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [1, 0, 2, 0, 3, 0, 4, 0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 2
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0, 0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
@ -1,6 +1,5 @@
|
||||
bpm: 100
|
||||
output16bit: false
|
||||
hold: 1
|
||||
tracks:
|
||||
- numvoices: 1
|
||||
sequence: [0]
|
||||
|
Loading…
Reference in New Issue
Block a user