diff --git a/src/opcodes/effects.asm b/src/opcodes/effects.asm index 49f6324..a86f41b 100644 --- a/src/opcodes/effects.asm +++ b/src/opcodes/effects.asm @@ -24,7 +24,7 @@ su_op_distort_mono: %ifdef SU_INCLUDE_WAVESHAPER su_waveshaper: fxch ; x a - call MANGLE_FUNC(su_clip_op,0) + call su_clip fxch ; a x' (from now on just called x) fld st0 ; a a x fsub dword [c_0_5] ; a-.5 a x @@ -193,15 +193,22 @@ su_op_filter_skipneghighpass: ; Input: st0 : x ; Output: st0 : min(max(x,-1),1) ;------------------------------------------------------------------------------- -%if CLIP_ID > -1 - %define SU_INCLUDE_CLIP -%endif - -%ifdef SU_INCLUDE_CLIP - SECT_TEXT(suclip) -EXPORT MANGLE_FUNC(su_clip_op,0) +%if CLIP_ID > -1 + EXPORT MANGLE_FUNC(su_op_clip,0) + %ifdef INCLUDE_STEREO_CLIP + jnc su_op_clip_mono + call su_stereo_filterhelper + %define INCLUDE_STEREO_FILTERHELPER + su_op_clip_mono: + %endif + %define SU_INCLUDE_CLIP + ; flow into su_doclip +%endif ; CLIP_ID > -1 + +%ifdef SU_INCLUDE_CLIP +su_clip: fld1 ; 1 x a fucomi st1 ; if (1 <= x) jbe short su_clip_do ; goto Clip_Do diff --git a/src/player.asm b/src/player.asm index b6ff229..5c8893d 100644 --- a/src/player.asm +++ b/src/player.asm @@ -61,7 +61,7 @@ c_32767 dd 32767.0 mov ecx, 2 %%loop: ; loop over two channels, left & right fld dword [edi] - call MANGLE_FUNC(su_clip_op,0) + call su_clip fmul dword [c_32767] push eax fistp dword [esp] diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 613a72d..033cf0e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -89,10 +89,14 @@ regression_test(test_oscillat_gainmod "VCO_SINE;ENVELOPE;FOP_MULP;FOP_PUSH;SEND" regression_test(test_distort ENVELOPE) regression_test(test_distort_mod "VCO_SINE;ENVELOPE;SEND") regression_test(test_distort_stereo ENVELOPE) + regression_test(test_hold ENVELOPE HOLD) regression_test(test_hold_mod "VCO_SINE;ENVELOPE;SEND") regression_test(test_hold_stereo HOLD) +regression_test(test_clip "VCO_SINE;ENVELOPE;FOP_MULP;INVGAIN" CLIP) +regression_test(test_clip_stereo CLIP) + regression_test(test_filter_band "VCO_SINE;ENVELOPE;FOP_MULP") regression_test(test_filter_low "VCO_SINE;ENVELOPE;FOP_MULP") regression_test(test_filter_high "VCO_SINE;ENVELOPE;FOP_MULP") diff --git a/tests/expected_output/test_clip.raw b/tests/expected_output/test_clip.raw new file mode 100644 index 0000000..6590607 Binary files /dev/null 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 new file mode 100644 index 0000000..c7e6c45 Binary files /dev/null and b/tests/expected_output/test_clip_stereo.raw differ diff --git a/tests/test_clip.asm b/tests/test_clip.asm new file mode 100644 index 0000000..13d3ed1 --- /dev/null +++ b/tests/test_clip.asm @@ -0,0 +1,28 @@ +%define BPM 100 +%define USE_SECTIONS + +%include "../src/sointu.inc" + +SU_BEGIN_PATTERNS + PATTERN 64, 0, 68, 0, 32, 0, 0, 0, 75, 0, 78, 0, 0, 0, 0, 0, +SU_END_PATTERNS + +SU_BEGIN_TRACKS + TRACK VOICES(1),0 +SU_END_TRACKS + +SU_BEGIN_PATCH + SU_BEGIN_INSTRUMENT VOICES(1) ; Instrument0 + SU_ENVELOPE MONO, ATTAC(32),DECAY(32),SUSTAIN(128),RELEASE(64),GAIN(128) + SU_ENVELOPE MONO, ATTAC(32),DECAY(32),SUSTAIN(128),RELEASE(64),GAIN(128) + SU_OSCILLAT MONO, TRANSPOSE(64),DETUNE(64),PHASE(0),COLOR(96),SHAPE(64),GAIN(128), FLAGS(SINE) + SU_OSCILLAT MONO, TRANSPOSE(72),DETUNE(64),PHASE(64),COLOR(64),SHAPE(96),GAIN(128), FLAGS(SINE) + SU_MULP STEREO + SU_INVGAIN STEREO,INVGAIN(64) + SU_CLIP MONO + SU_GAIN STEREO,GAIN(64) + SU_OUT STEREO,GAIN(128) + SU_END_INSTRUMENT +SU_END_PATCH + +%include "../src/sointu.asm" diff --git a/tests/test_clip_stereo.asm b/tests/test_clip_stereo.asm new file mode 100644 index 0000000..c5b3a91 --- /dev/null +++ b/tests/test_clip_stereo.asm @@ -0,0 +1,28 @@ +%define BPM 100 +%define USE_SECTIONS + +%include "../src/sointu.inc" + +SU_BEGIN_PATTERNS + PATTERN 64, 0, 68, 0, 32, 0, 0, 0, 75, 0, 78, 0, 0, 0, 0, 0, +SU_END_PATTERNS + +SU_BEGIN_TRACKS + TRACK VOICES(1),0 +SU_END_TRACKS + +SU_BEGIN_PATCH + SU_BEGIN_INSTRUMENT VOICES(1) ; Instrument0 + SU_ENVELOPE MONO, ATTAC(32),DECAY(32),SUSTAIN(128),RELEASE(64),GAIN(128) + SU_ENVELOPE MONO, ATTAC(32),DECAY(32),SUSTAIN(128),RELEASE(64),GAIN(128) + SU_OSCILLAT MONO, TRANSPOSE(64),DETUNE(64),PHASE(0),COLOR(96),SHAPE(64),GAIN(128), FLAGS(SINE) + SU_OSCILLAT MONO, TRANSPOSE(72),DETUNE(64),PHASE(64),COLOR(64),SHAPE(96),GAIN(128), FLAGS(SINE) + SU_MULP STEREO + SU_INVGAIN STEREO,INVGAIN(64) + SU_CLIP STEREO + SU_GAIN STEREO,GAIN(64) + SU_OUT STEREO,GAIN(128) + SU_END_INSTRUMENT +SU_END_PATCH + +%include "../src/sointu.asm"