From 1ac2ad3c7508115fd58e54b49f45b4fb20fe8ca0 Mon Sep 17 00:00:00 2001 From: "5684185+vsariola@users.noreply.github.com" <5684185+vsariola@users.noreply.github.com> Date: Sat, 2 Sep 2023 20:54:37 +0300 Subject: [PATCH] fix(vm/compiler): invert the logic of the release flag in the voices (closes #102) This makes all envelopes released by default, instead of attacking. Add also test to demonstrate the buggy behaviour. --- tests/CMakeLists.txt | 3 ++- tests/expected_output/test_polyphony_init.raw | Bin 0 -> 846720 bytes tests/test_polyphony_init.yml | 18 ++++++++++++++++++ tests/test_render_samples.c | 3 ++- tests/test_render_samples_api.c | 3 ++- vm/compiler/bridge/bridge.go | 3 ++- vm/compiler/templates/amd64-386/library.h | 2 +- vm/compiler/templates/amd64-386/player.asm | 10 ++++++---- vm/compiler/templates/amd64-386/sources.asm | 6 +++--- vm/compiler/templates/amd64-386/structs.asm | 2 +- vm/compiler/templates/wasm/player.wat | 6 ++++-- vm/compiler/templates/wasm/sources.wat | 2 +- vm/interpreter.go | 7 ++++--- 13 files changed, 46 insertions(+), 19 deletions(-) create mode 100644 tests/expected_output/test_polyphony_init.raw create mode 100644 tests/test_polyphony_init.yml diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 0dcb899..cc917ba 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -162,7 +162,8 @@ regression_test(test_delay_flanger "ENVELOPE;FOP_MULP;PANNING;VCO_SINE;SEND") regression_test(test_envelope_mod "VCO_SINE;ENVELOPE;SEND") regression_test(test_envelope_16bit ENVELOPE "" test_envelope "-i") -regression_test(test_polyphony "ENVELOPE;VCO_SINE") +regression_test(test_polyphony "ENVELOPE;VCO_SINE" POLYPHONY) +regression_test(test_polyphony_init POLYPHONY) regression_test(test_chords "ENVELOPE;VCO_SINE") regression_test(test_speed "ENVELOPE;VCO_SINE") regression_test(test_sync "ENVELOPE" "" "" "-r") diff --git a/tests/expected_output/test_polyphony_init.raw b/tests/expected_output/test_polyphony_init.raw new file mode 100644 index 0000000000000000000000000000000000000000..f0ee709bbcf0e72cb73cce4ff5828795bed10dbe GIT binary patch literal 846720 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 M7O;Q?{{I&EU-IllWB>pF literal 0 HcmV?d00001 diff --git a/tests/test_polyphony_init.yml b/tests/test_polyphony_init.yml new file mode 100644 index 0000000..ca31f49 --- /dev/null +++ b/tests/test_polyphony_init.yml @@ -0,0 +1,18 @@ +bpm: 100 +rowsperbeat: 4 +score: + rowsperpattern: 16 + length: 1 + tracks: + - numvoices: 2 + order: [0] + patterns: [[0,0, 0, 0, 64, 1, 0, 0, 64, 1, 64, 1, 0, 0, 0, 0]] +patch: + - numvoices: 2 + units: + - type: envelope + parameters: {attack: 32, decay: 32, gain: 64, release: 64, stereo: 0, sustain: 64} + - type: envelope + parameters: {attack: 32, decay: 32, gain: 64, release: 64, stereo: 0, sustain: 64} + - type: out + parameters: {gain: 128, stereo: 1} diff --git a/tests/test_render_samples.c b/tests/test_render_samples.c index fba39f6..562e761 100644 --- a/tests/test_render_samples.c +++ b/tests/test_render_samples.c @@ -26,10 +26,11 @@ void SU_CALLCONV su_render_song(float* buffer) { synth->RandSeed = 1; // triger first voice synth->SynthWrk.Voices[0].Note = 64; + synth->SynthWrk.Voices[0].Sustain = 1; samples = SU_LENGTH_IN_SAMPLES / 2; time = INT32_MAX; retval = su_render(synth, buffer, &samples, &time); - synth->SynthWrk.Voices[0].Release++; + synth->SynthWrk.Voices[0].Sustain = 0; buffer = buffer + SU_LENGTH_IN_SAMPLES; samples = SU_LENGTH_IN_SAMPLES / 2; time = INT32_MAX; diff --git a/tests/test_render_samples_api.c b/tests/test_render_samples_api.c index 2dba51a..135862f 100644 --- a/tests/test_render_samples_api.c +++ b/tests/test_render_samples_api.c @@ -37,6 +37,7 @@ int main(int argc, char* argv[]) { buffer = (float*)malloc(2 * sizeof(float) * su_max_samples); // triger first voice synth->SynthWrk.Voices[0].Note = 64; + synth->SynthWrk.Voices[0].Sustain = 1; totalrendered = 0; // First check that when we render using su_render with 0 time // we get nothing done @@ -110,7 +111,7 @@ int main(int argc, char* argv[]) { goto fail; } if (i == 8) - synth->SynthWrk.Voices[0].Release++; + synth->SynthWrk.Voices[0].Sustain = 0; } if (totalrendered != su_max_samples) { diff --git a/vm/compiler/bridge/bridge.go b/vm/compiler/bridge/bridge.go index 094bf7e..cdc1f77 100644 --- a/vm/compiler/bridge/bridge.go +++ b/vm/compiler/bridge/bridge.go @@ -102,6 +102,7 @@ func (bridgesynth *BridgeSynth) Trigger(voice int, note byte) { } s.SynthWrk.Voices[voice] = C.Voice{} s.SynthWrk.Voices[voice].Note = C.int(note) + s.SynthWrk.Voices[voice].Sustain = 1 } // Release is part of C.Synths' implementation of sointu.Synth interface @@ -110,7 +111,7 @@ func (bridgesynth *BridgeSynth) Release(voice int) { if voice < 0 || voice >= len(s.SynthWrk.Voices) { return } - s.SynthWrk.Voices[voice].Release = 1 + s.SynthWrk.Voices[voice].Sustain = 0 } // Update diff --git a/vm/compiler/templates/amd64-386/library.h b/vm/compiler/templates/amd64-386/library.h index a84cb08..6976065 100644 --- a/vm/compiler/templates/amd64-386/library.h +++ b/vm/compiler/templates/amd64-386/library.h @@ -9,7 +9,7 @@ typedef struct Unit { typedef struct Voice { int Note; - int Release; + int Sustain; float Inputs[8]; float Reserved[6]; struct Unit Units[63]; diff --git a/vm/compiler/templates/amd64-386/player.asm b/vm/compiler/templates/amd64-386/player.asm index ba7b921..111ef83 100644 --- a/vm/compiler/templates/amd64-386/player.asm +++ b/vm/compiler/templates/amd64-386/player.asm @@ -137,7 +137,7 @@ su_calculate_voices_loop: ; do { add edi, ebx shl edi, 12 ; each unit = 64 bytes and there are 1<>8, but will it actually be smaller after compression? + stosd ; save sustain + mov ecx, (su_voice.size - su_voice.inputs)/4 ; could be xor ecx, ecx; mov ch,...>>8, but will it actually be smaller after compression? xor eax, eax rep stosd ; clear the workspace of the new voice, retriggering oscillators jmp short su_update_voices_skipadd diff --git a/vm/compiler/templates/amd64-386/sources.asm b/vm/compiler/templates/amd64-386/sources.asm index e0bc1db..85e48ff 100644 --- a/vm/compiler/templates/amd64-386/sources.asm +++ b/vm/compiler/templates/amd64-386/sources.asm @@ -15,9 +15,9 @@ ret su_op_envelope_mono: {{- end}} - mov eax, dword [{{.INP}}-su_voice.inputs+su_voice.release] ; eax = su_instrument.release - test eax, eax ; if (eax == 0) - je su_op_envelope_process ; goto process + mov eax, dword [{{.INP}}-su_voice.inputs+su_voice.sustain] ; eax = su_instrument.sustain + test eax, eax ; if (eax != 0) + jne su_op_envelope_process ; goto process mov al, {{.InputNumber "envelope" "release"}} ; [state]=RELEASE mov dword [{{.WRK}}], eax ; note that mov al, XXX; mov ..., eax is less bytes than doing it directly su_op_envelope_process: diff --git a/vm/compiler/templates/amd64-386/structs.asm b/vm/compiler/templates/amd64-386/structs.asm index b0b11cd..ca9ee73 100644 --- a/vm/compiler/templates/amd64-386/structs.asm +++ b/vm/compiler/templates/amd64-386/structs.asm @@ -12,7 +12,7 @@ endstruc ;------------------------------------------------------------------------------- struc su_voice .note resd 1 - .release resd 1 + .sustain resd 1 .inputs resd 8 .reserved resd 6 ; this is done to so the whole voice is 2^n long, see polyphonic player .workspace resb 63 * su_unit.size diff --git a/vm/compiler/templates/wasm/player.wat b/vm/compiler/templates/wasm/player.wat index 42d538c..b901287 100644 --- a/vm/compiler/templates/wasm/player.wat +++ b/vm/compiler/templates/wasm/player.wat @@ -272,7 +272,7 @@ ) (i32.const 4096) ) - (i32.const 1) + (i32.const 0) ) ;; release the note (if (i32.gt_u (local.get $note) (i32.const {{.Hold}}))(then (local.set $di (i32.add @@ -290,6 +290,7 @@ )) (memory.fill (local.get $di) (i32.const 0) (i32.const 4096)) (i32.store (local.get $di) (local.get $note)) + (i32.store offset=4 (local.get $di) (local.get $note)) (i32.store8 offset={{index .Labels "su_trackcurrentvoice"}} (local.get $tracksRemaining) (local.get $voiceNo)) )) )) @@ -311,10 +312,11 @@ (i32.load8_u offset={{index .Labels "su_patterns"}}) (local.tee $note) (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 0)) ;; release the note (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)) + (i32.store offset=4 (local.get $di) (local.get $note)) )) )) (local.set $di (i32.add (local.get $di) (i32.const 4096))) diff --git a/vm/compiler/templates/wasm/sources.wat b/vm/compiler/templates/wasm/sources.wat index 09c2c19..cd7d10a 100644 --- a/vm/compiler/templates/wasm/sources.wat +++ b/vm/compiler/templates/wasm/sources.wat @@ -30,7 +30,7 @@ ;; Stereo: push the envelope valeu on stack twice ;;------------------------------------------------------------------------------- (func $su_op_envelope (param $stereo i32) (local $state i32) (local $level f32) (local $delta f32) - (if (i32.load offset=4 (global.get $voice)) (then ;; if voice.release > 0 + (if (i32.eqz (i32.load offset=4 (global.get $voice))) (then ;; if voice.sustain == 0 (i32.store (global.get $WRK) (i32.const {{.InputNumber "envelope" "release"}})) ;; set envelope state to release )) (local.set $state (i32.load (global.get $WRK))) diff --git a/vm/interpreter.go b/vm/interpreter.go index d46b560..8ebbd27 100644 --- a/vm/interpreter.go +++ b/vm/interpreter.go @@ -41,7 +41,7 @@ type unit struct { type voice struct { note byte - release bool + sustain bool units [MAX_UNITS]unit } @@ -105,10 +105,11 @@ func (s SynthService) Compile(patch sointu.Patch, bpm int) (sointu.Synth, error) func (s *Interpreter) Trigger(voiceIndex int, note byte) { s.synth.voices[voiceIndex] = voice{} s.synth.voices[voiceIndex].note = note + s.synth.voices[voiceIndex].sustain = true } func (s *Interpreter) Release(voiceIndex int) { - s.synth.voices[voiceIndex].release = true + s.synth.voices[voiceIndex].sustain = false } func (s *Interpreter) Update(patch sointu.Patch, bpm int) error { @@ -297,7 +298,7 @@ func (s *Interpreter) Render(buffer []float32, maxtime int) (samples int, time i stack = append(stack, synth.outputs[channel]) synth.outputs[channel] = 0 case opEnvelope: - if voices[0].release { + if !voices[0].sustain { unit.state[0] = envStateRelease // set state to release } state := unit.state[0]