From f35f948118b0ab7ce6a9bb9e8d99ba9a659d2ad1 Mon Sep 17 00:00:00 2001 From: "5684185+vsariola@users.noreply.github.com" <5684185+vsariola@users.noreply.github.com> Date: Sun, 24 Sep 2023 10:25:07 +0300 Subject: [PATCH] fix(vm/compiler/templates/wasm): add support for mono out Adds also a test case to make sure mono out also works. --- CHANGELOG.md | 1 + tests/CMakeLists.txt | 1 + tests/expected_output/test_out.raw | Bin 0 -> 846720 bytes tests/test_out.yml | 16 ++++++++++++++++ vm/compiler/templates/wasm/sinks.wat | 10 +++++++++- 5 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 tests/expected_output/test_out.raw create mode 100644 tests/test_out.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 309ab7f..36e8ab0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Fixed - In the WebAssembly core, $WRK was messed after stereo oscillators, making modulations not work +- The Webassembly implementation of mono version of "out" unit ### Changed - The crush resolution is now in bits instead of linear range; this is a diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index cc917ba..897896d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -65,6 +65,7 @@ endfunction(regression_test) regression_test(test_envelope "" ENVELOPE) regression_test(test_envelope_stereo ENVELOPE) +regression_test(test_out ENVELOPE) regression_test(test_loadval "" LOADVAL) regression_test(test_loadval_stereo LOADVAL LOADVAL_STEREO) regression_test(test_gain LOADVAL GAIN) diff --git a/tests/expected_output/test_out.raw b/tests/expected_output/test_out.raw new file mode 100644 index 0000000000000000000000000000000000000000..01ac885669f5aa0a793601c77960092276e3edb9 GIT binary patch literal 846720 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 zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q zQ6LILfhZ6KqCgag0#P6eM1d#}1)@L{hyqa{3Pgb@5Cx(@6o>**APPi*C=dmrKop1q eQ6LILfhZ6KqCgag0#P6eM1d#}1^)k4;Qs+<1lm*p literal 0 HcmV?d00001 diff --git a/tests/test_out.yml b/tests/test_out.yml new file mode 100644 index 0000000..a7cdf52 --- /dev/null +++ b/tests/test_out.yml @@ -0,0 +1,16 @@ +bpm: 100 +rowsperbeat: 4 +score: + rowsperpattern: 16 + length: 1 + tracks: + - numvoices: 1 + order: [0] + patterns: [[64, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]] +patch: + - numvoices: 1 + units: + - type: envelope + parameters: {attack: 64, decay: 64, gain: 64, release: 80, stereo: 0, sustain: 64} + - type: out + parameters: {gain: 128, stereo: 0} diff --git a/vm/compiler/templates/wasm/sinks.wat b/vm/compiler/templates/wasm/sinks.wat index 3e3c53a..fce3635 100644 --- a/vm/compiler/templates/wasm/sinks.wat +++ b/vm/compiler/templates/wasm/sinks.wat @@ -147,7 +147,11 @@ (f32.load (local.get $ptr)) ) ) - (local.set $ptr (i32.const {{add (index .Labels "su_globalports") 4}})) ;; synth.right, note that ATM does not seem to support mono ocpode at all + {{- if .StereoAndMono "out"}} + (if (local.get $stereo)(then + {{- end}} + {{- if .Stereo "out"}} + (local.set $ptr (i32.const {{add (index .Labels "su_globalports") 4}})) ;; synth.right (f32.store (local.get $ptr) (f32.add (f32.mul @@ -157,6 +161,10 @@ (f32.load (local.get $ptr)) ) ) + {{- end}} + {{- if .StereoAndMono "out"}} + )) + {{- end}} ) {{end}}