diff --git a/templates/amd64-386/sources.asm b/templates/amd64-386/sources.asm index 04602bd..c17a76e 100644 --- a/templates/amd64-386/sources.asm +++ b/templates/amd64-386/sources.asm @@ -172,20 +172,31 @@ su_op_oscillat_normalize_note: fmul dword [{{.Float 0.000092696138 | .Use}}] ; // st0 is now frequency su_op_oscillat_normalized: fadd dword [{{.WRK}}] - fst dword [{{.WRK}}] - fadd dword [{{.Input "oscillator" "phase"}}] {{- if .SupportsParamValue "oscillator" "type" .Sample}} test al, byte 0x80 jz short su_op_oscillat_not_sample + fst dword [{{.WRK}}] ; for samples, we store the phase without mod(p,1) +{{- if or (.SupportsParamValueOtherThan "oscillator" "phase" 0) (.SupportsModulation "oscillator" "phase")}} + fadd dword [{{.Input "oscillator" "phase"}}] +{{- end}} {{.Call "su_oscillat_sample"}} jmp su_op_oscillat_shaping ; skip the rest to avoid color phase normalization and colorloading su_op_oscillat_not_sample: {{- end}} - fld1 - fadd st1, st0 + fld1 ; we need to take mod(p,1) so the frequency does not drift as the float + fadd st1, st0 ; make no mistake: without this, there is audible drifts in oscillator pitch + fxch ; as the actual period changes once the phase becomes too big + fprem ; we actually computed mod(p+1,1) instead of mod(p,1) as the fprem takes mod + fstp st1 ; towards zero + fst dword [{{.WRK}}] ; store back the updated phase +{{- if or (.SupportsParamValueOtherThan "oscillator" "phase" 0) (.SupportsModulation "oscillator" "phase")}} + fadd dword [{{.Input "oscillator" "phase"}}] + fld1 ; this is a bit stupid, but we need to take mod(x,1) again after phase modulations + fadd st1, st0 ; as the actual oscillator functions expect x in [0,1] fxch fprem fstp st1 +{{- end}} fld dword [{{.Input "oscillator" "color"}}] ; // c p ; every oscillator test included if needed {{- if .SupportsParamValue "oscillator" "type" .Sine}} diff --git a/templates/wasm/sources.wat b/templates/wasm/sources.wat index aa13f9d..cec12c6 100644 --- a/templates/wasm/sources.wat +++ b/templates/wasm/sources.wat @@ -121,27 +121,34 @@ {{- end}} (f32.store ;; update phase (global.get $WRK) - ;; Transpose calculation starts - (f32.div - (call $inputSigned (i32.const {{.InputNumber "oscillator" "transpose"}})) - (f32.const 0.015625) - ) ;; scale back to 0 - 128 - (f32.add (local.get $detune)) ;; add detune. detune is -1 to 1 so can detune a full note up or down at max - (f32.add (select - (f32.const 0) - (f32.convert_i32_u (i32.load (global.get $voice))) - (i32.and (local.get $flags) (i32.const 0x8)) - )) ;; if lfo is not enabled, add the note number to it - (f32.mul (f32.const 0.0833333)) ;; /12, in full octaves - (call $pow2) - (f32.mul (select - (f32.const 0.000038) ;; pretty random scaling constant to get LFOs into reasonable range. Historical reasons, goes all the way back to 4klang - (f32.const 0.000092696138) ;; scaling constant to get middle-C to where it should be - (i32.and (local.get $flags) (i32.const 0x8)) - )) - (f32.add (f32.load (global.get $WRK))) ;; add the current phase of the oscillator + (local.tee $phase + (f32.sub + (local.tee $phase + ;; Transpose calculation starts + (f32.div + (call $inputSigned (i32.const {{.InputNumber "oscillator" "transpose"}})) + (f32.const 0.015625) + ) ;; scale back to 0 - 128 + (f32.add (local.get $detune)) ;; add detune. detune is -1 to 1 so can detune a full note up or down at max + (f32.add (select + (f32.const 0) + (f32.convert_i32_u (i32.load (global.get $voice))) + (i32.and (local.get $flags) (i32.const 0x8)) + )) ;; if lfo is not enabled, add the note number to it + (f32.mul (f32.const 0.0833333)) ;; /12, in full octaves + (call $pow2) + (f32.mul (select + (f32.const 0.000038) ;; pretty random scaling constant to get LFOs into reasonable range. Historical reasons, goes all the way back to 4klang + (f32.const 0.000092696138) ;; scaling constant to get middle-C to where it should be + (i32.and (local.get $flags) (i32.const 0x8)) + )) + (f32.add (f32.load (global.get $WRK))) ;; add the current phase of the oscillator + ) + (f32.floor (local.get $phase)) + ) + ) ) - (f32.add (f32.load (global.get $WRK)) (call $input (i32.const {{.InputNumber "oscillator" "phase"}}))) + (f32.add (local.get $phase) (call $input (i32.const {{.InputNumber "oscillator" "phase"}}))) (local.set $phase (f32.sub (local.tee $phase) (f32.floor (local.get $phase)))) ;; phase = phase mod 1.0 (local.set $color (call $input (i32.const {{.InputNumber "oscillator" "color"}}))) {{- if .SupportsParamValue "oscillator" "type" .Sine}} diff --git a/tests/expected_output/test_chords.raw b/tests/expected_output/test_chords.raw index 0e28a1c..011630e 100644 Binary files a/tests/expected_output/test_chords.raw and b/tests/expected_output/test_chords.raw differ diff --git a/tests/expected_output/test_clip.raw b/tests/expected_output/test_clip.raw index 6590607..4a40335 100644 Binary files a/tests/expected_output/test_clip.raw and b/tests/expected_output/test_clip.raw differ diff --git a/tests/expected_output/test_clip_stereo.raw b/tests/expected_output/test_clip_stereo.raw index c7e6c45..1662a0e 100644 Binary files a/tests/expected_output/test_clip_stereo.raw and b/tests/expected_output/test_clip_stereo.raw differ diff --git a/tests/expected_output/test_compressor.raw b/tests/expected_output/test_compressor.raw index cdab4d0..f8732fa 100644 Binary files a/tests/expected_output/test_compressor.raw and b/tests/expected_output/test_compressor.raw differ diff --git a/tests/expected_output/test_compressor_stereo.raw b/tests/expected_output/test_compressor_stereo.raw index 847462a..8b0d4fa 100644 Binary files a/tests/expected_output/test_compressor_stereo.raw and b/tests/expected_output/test_compressor_stereo.raw differ diff --git a/tests/expected_output/test_crush.raw b/tests/expected_output/test_crush.raw index 0e08f81..a832cac 100644 Binary files a/tests/expected_output/test_crush.raw and b/tests/expected_output/test_crush.raw differ diff --git a/tests/expected_output/test_crush_stereo.raw b/tests/expected_output/test_crush_stereo.raw index 0d93cbb..6cddc5e 100644 Binary files a/tests/expected_output/test_crush_stereo.raw and b/tests/expected_output/test_crush_stereo.raw differ diff --git a/tests/expected_output/test_delay.raw b/tests/expected_output/test_delay.raw index 7c5d7fd..f621d20 100644 Binary files a/tests/expected_output/test_delay.raw and b/tests/expected_output/test_delay.raw differ diff --git a/tests/expected_output/test_delay_dampmod.raw b/tests/expected_output/test_delay_dampmod.raw index 44ee653..a6af048 100644 Binary files a/tests/expected_output/test_delay_dampmod.raw and b/tests/expected_output/test_delay_dampmod.raw differ diff --git a/tests/expected_output/test_delay_drymod.raw b/tests/expected_output/test_delay_drymod.raw index 8dedd8e..b9844fd 100644 Binary files a/tests/expected_output/test_delay_drymod.raw and b/tests/expected_output/test_delay_drymod.raw differ diff --git a/tests/expected_output/test_delay_feedbackmod.raw b/tests/expected_output/test_delay_feedbackmod.raw index 1a68c5a..46480d4 100644 Binary files a/tests/expected_output/test_delay_feedbackmod.raw and b/tests/expected_output/test_delay_feedbackmod.raw differ diff --git a/tests/expected_output/test_delay_flanger.raw b/tests/expected_output/test_delay_flanger.raw index 10e125f..da17209 100644 Binary files a/tests/expected_output/test_delay_flanger.raw and b/tests/expected_output/test_delay_flanger.raw differ diff --git a/tests/expected_output/test_delay_notetracking.raw b/tests/expected_output/test_delay_notetracking.raw index 7f82c72..f3300c5 100644 Binary files a/tests/expected_output/test_delay_notetracking.raw and b/tests/expected_output/test_delay_notetracking.raw differ diff --git a/tests/expected_output/test_delay_pregainmod.raw b/tests/expected_output/test_delay_pregainmod.raw index b8704d3..8c1c71e 100644 Binary files a/tests/expected_output/test_delay_pregainmod.raw and b/tests/expected_output/test_delay_pregainmod.raw differ diff --git a/tests/expected_output/test_delay_reverb.raw b/tests/expected_output/test_delay_reverb.raw index 59e232d..7e3aed2 100644 Binary files a/tests/expected_output/test_delay_reverb.raw and b/tests/expected_output/test_delay_reverb.raw differ diff --git a/tests/expected_output/test_delay_stereo.raw b/tests/expected_output/test_delay_stereo.raw index 1fe0d18..2fba54e 100644 Binary files a/tests/expected_output/test_delay_stereo.raw and b/tests/expected_output/test_delay_stereo.raw differ diff --git a/tests/expected_output/test_distort_mod.raw b/tests/expected_output/test_distort_mod.raw index 64049bd..d35c197 100644 Binary files a/tests/expected_output/test_distort_mod.raw and b/tests/expected_output/test_distort_mod.raw differ diff --git a/tests/expected_output/test_envelope_mod.raw b/tests/expected_output/test_envelope_mod.raw index 6ea8a40..9bf7f2e 100644 Binary files a/tests/expected_output/test_envelope_mod.raw and b/tests/expected_output/test_envelope_mod.raw differ diff --git a/tests/expected_output/test_filter_band.raw b/tests/expected_output/test_filter_band.raw index 39b52c8..eaef8f7 100644 Binary files a/tests/expected_output/test_filter_band.raw and b/tests/expected_output/test_filter_band.raw differ diff --git a/tests/expected_output/test_filter_freqmod.raw b/tests/expected_output/test_filter_freqmod.raw index 76f9cc6..65a11cf 100644 Binary files a/tests/expected_output/test_filter_freqmod.raw and b/tests/expected_output/test_filter_freqmod.raw differ diff --git a/tests/expected_output/test_filter_high.raw b/tests/expected_output/test_filter_high.raw index 75e94b0..c2cae4c 100644 Binary files a/tests/expected_output/test_filter_high.raw and b/tests/expected_output/test_filter_high.raw differ diff --git a/tests/expected_output/test_filter_low.raw b/tests/expected_output/test_filter_low.raw index e8d76e9..60e15d6 100644 Binary files a/tests/expected_output/test_filter_low.raw and b/tests/expected_output/test_filter_low.raw differ diff --git a/tests/expected_output/test_filter_peak.raw b/tests/expected_output/test_filter_peak.raw index 074b481..9c9ed11 100644 Binary files a/tests/expected_output/test_filter_peak.raw and b/tests/expected_output/test_filter_peak.raw differ diff --git a/tests/expected_output/test_filter_resmod.raw b/tests/expected_output/test_filter_resmod.raw index bb0ae13..4a9211d 100644 Binary files a/tests/expected_output/test_filter_resmod.raw and b/tests/expected_output/test_filter_resmod.raw differ diff --git a/tests/expected_output/test_filter_stereo.raw b/tests/expected_output/test_filter_stereo.raw index 1db1acb..2c32791 100644 Binary files a/tests/expected_output/test_filter_stereo.raw and b/tests/expected_output/test_filter_stereo.raw differ diff --git a/tests/expected_output/test_hold_mod.raw b/tests/expected_output/test_hold_mod.raw index 0ec8924..0621318 100644 Binary files a/tests/expected_output/test_hold_mod.raw and b/tests/expected_output/test_hold_mod.raw differ diff --git a/tests/expected_output/test_oscillat_colormod.raw b/tests/expected_output/test_oscillat_colormod.raw index c16a7c6..6a9161d 100644 Binary files a/tests/expected_output/test_oscillat_colormod.raw and b/tests/expected_output/test_oscillat_colormod.raw differ diff --git a/tests/expected_output/test_oscillat_detunemod.raw b/tests/expected_output/test_oscillat_detunemod.raw index 92962e1..bba7b16 100644 Binary files a/tests/expected_output/test_oscillat_detunemod.raw and b/tests/expected_output/test_oscillat_detunemod.raw differ diff --git a/tests/expected_output/test_oscillat_gainmod.raw b/tests/expected_output/test_oscillat_gainmod.raw index bc5fd56..9238758 100644 Binary files a/tests/expected_output/test_oscillat_gainmod.raw and b/tests/expected_output/test_oscillat_gainmod.raw differ diff --git a/tests/expected_output/test_oscillat_gate.raw b/tests/expected_output/test_oscillat_gate.raw index 1a6ba20..a1808a4 100644 Binary files a/tests/expected_output/test_oscillat_gate.raw and b/tests/expected_output/test_oscillat_gate.raw differ diff --git a/tests/expected_output/test_oscillat_lfo.raw b/tests/expected_output/test_oscillat_lfo.raw index 2b28d18..9fb0660 100644 Binary files a/tests/expected_output/test_oscillat_lfo.raw and b/tests/expected_output/test_oscillat_lfo.raw differ diff --git a/tests/expected_output/test_oscillat_phasemod.raw b/tests/expected_output/test_oscillat_phasemod.raw index 51bc4f4..14e5ce8 100644 Binary files a/tests/expected_output/test_oscillat_phasemod.raw and b/tests/expected_output/test_oscillat_phasemod.raw differ diff --git a/tests/expected_output/test_oscillat_pulse.raw b/tests/expected_output/test_oscillat_pulse.raw index 8515772..5ac5b76 100644 Binary files a/tests/expected_output/test_oscillat_pulse.raw and b/tests/expected_output/test_oscillat_pulse.raw differ diff --git a/tests/expected_output/test_oscillat_sample.raw b/tests/expected_output/test_oscillat_sample.raw index 403b433..1aa2395 100644 Binary files a/tests/expected_output/test_oscillat_sample.raw and b/tests/expected_output/test_oscillat_sample.raw differ diff --git a/tests/expected_output/test_oscillat_sample_stereo.raw b/tests/expected_output/test_oscillat_sample_stereo.raw index 6dad331..44bed60 100644 Binary files a/tests/expected_output/test_oscillat_sample_stereo.raw and b/tests/expected_output/test_oscillat_sample_stereo.raw differ diff --git a/tests/expected_output/test_oscillat_shapemod.raw b/tests/expected_output/test_oscillat_shapemod.raw index 516286f..f70e658 100644 Binary files a/tests/expected_output/test_oscillat_shapemod.raw and b/tests/expected_output/test_oscillat_shapemod.raw differ diff --git a/tests/expected_output/test_oscillat_sine.raw b/tests/expected_output/test_oscillat_sine.raw index 6a5fb84..9ce226c 100644 Binary files a/tests/expected_output/test_oscillat_sine.raw and b/tests/expected_output/test_oscillat_sine.raw differ diff --git a/tests/expected_output/test_oscillat_stereo.raw b/tests/expected_output/test_oscillat_stereo.raw index dfd49e3..26730f8 100644 Binary files a/tests/expected_output/test_oscillat_stereo.raw and b/tests/expected_output/test_oscillat_stereo.raw differ diff --git a/tests/expected_output/test_oscillat_transposemod.raw b/tests/expected_output/test_oscillat_transposemod.raw index 4477a13..3eb033d 100644 Binary files a/tests/expected_output/test_oscillat_transposemod.raw and b/tests/expected_output/test_oscillat_transposemod.raw differ diff --git a/tests/expected_output/test_oscillat_trisaw.raw b/tests/expected_output/test_oscillat_trisaw.raw index a19f1aa..d83dec6 100644 Binary files a/tests/expected_output/test_oscillat_trisaw.raw and b/tests/expected_output/test_oscillat_trisaw.raw differ diff --git a/tests/expected_output/test_oscillat_unison.raw b/tests/expected_output/test_oscillat_unison.raw index a02edfb..b1a73d0 100644 Binary files a/tests/expected_output/test_oscillat_unison.raw and b/tests/expected_output/test_oscillat_unison.raw differ diff --git a/tests/expected_output/test_oscillat_unison_stereo.raw b/tests/expected_output/test_oscillat_unison_stereo.raw index 05f658e..57bc891 100644 Binary files a/tests/expected_output/test_oscillat_unison_stereo.raw and b/tests/expected_output/test_oscillat_unison_stereo.raw differ diff --git a/tests/expected_output/test_polyphony.raw b/tests/expected_output/test_polyphony.raw index cdf9b66..61514b6 100644 Binary files a/tests/expected_output/test_polyphony.raw and b/tests/expected_output/test_polyphony.raw differ diff --git a/tests/expected_output/test_speed.raw b/tests/expected_output/test_speed.raw index a6be264..bb62270 100644 Binary files a/tests/expected_output/test_speed.raw and b/tests/expected_output/test_speed.raw differ diff --git a/tests/wasm_test_renderer.es6 b/tests/wasm_test_renderer.es6 index 56964ca..3df4e59 100644 --- a/tests/wasm_test_renderer.es6 +++ b/tests/wasm_test_renderer.es6 @@ -85,7 +85,7 @@ if (process.argv.length <= 3) { } errorCount++ } - if (errorCount > 100) { + if (errorCount > 200) { console.error("got different buffer than expected. First error at: "+(firstErrorPos/2|0)+(firstErrorPos%1," right"," left")); return 1; }