diff --git a/.gitignore b/.gitignore index 3e2d4f1..e5fc080 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,8 @@ [Bb]in/ [Oo]bj/ +# CMake +build/ +# Project specific +old/ \ No newline at end of file diff --git a/4klang_VSTi/4klang.dll b/4klang_VSTi/4klang.dll deleted file mode 100644 index 529add8..0000000 Binary files a/4klang_VSTi/4klang.dll and /dev/null differ diff --git a/4klang_VSTi/8klang.dll b/4klang_VSTi/8klang.dll deleted file mode 100644 index 62de083..0000000 Binary files a/4klang_VSTi/8klang.dll and /dev/null differ diff --git a/4klang_source/4klang.asm b/4klang_source/4klang.asm deleted file mode 100644 index 6ade397..0000000 --- a/4klang_source/4klang.asm +++ /dev/null @@ -1,1766 +0,0 @@ -bits 32 - -%define WRK ebp ; // alias for unit workspace -%define VAL esi ; // alias for unit values (transformed/untransformed) -%define COM ebx ; // alias for instrument opcodes - -%include "4klang.inc" - -;// conditional defines - -%ifdef GO4K_USE_VCO_SHAPE - %define INCLUDE_WAVESHAPER -%endif -%ifdef GO4K_USE_DST - %define INCLUDE_WAVESHAPER -%endif - -%ifdef GO4K_USE_VCO_MOD_PM - %define PHASE_RENORMALIZE -%endif -%ifdef GO4K_USE_VCO_PHASE_OFFSET - %define PHASE_RENORMALIZE -%endif - -%ifdef GO4K_USE_ENVELOPE_RECORDINGS - %define GO4K_USE_BUFFER_RECORDINGS -%endif -%ifdef GO4K_USE_NOTE_RECORDINGS - %define GO4K_USE_BUFFER_RECORDINGS -%endif - -; //======================================================================================== -; // .bss section -; //======================================================================================== -%ifdef USE_SECTIONS -section .g4kbss1 bss align=1 -%else -section .bss -%endif - -; // the one and only synth object -%if MAX_VOICES > 1 -go4k_voiceindex resd 16 -%endif -go4k_transformed_values resd 16 -go4k_synth_wrk resb go4k_synth.size -global _go4k_delay_buffer_ofs -_go4k_delay_buffer_ofs resd 1 -global _go4k_delay_buffer -_go4k_delay_buffer resd 16*16*go4kDLL_wrk.size - -%ifdef AUTHORING -global __4klang_current_tick -__4klang_current_tick resd 0 -%endif - -%ifdef GO4K_USE_ENVELOPE_RECORDINGS -global __4klang_envelope_buffer -__4klang_envelope_buffer resd ((MAX_SAMPLES)/8) ; // samples every 256 samples and stores 16*2 = 32 values -%endif -%ifdef GO4K_USE_NOTE_RECORDINGS -global __4klang_note_buffer -__4klang_note_buffer resd ((MAX_SAMPLES)/8) ; // samples every 256 samples and stores 16*2 = 32 values -%endif - -; //======================================================================================== -; // .g4kdat section (initialized data for go4k) -; //======================================================================================== -%ifdef USE_SECTIONS -section .g4kdat1 data align=1 -%else -section .data -%endif - -; // some synth constants -go4k_synth_commands dd 0 - dd _go4kENV_func@0 - dd _go4kVCO_func@0 - dd _go4kVCF_func@0 - dd _go4kDST_func@0 - dd _go4kDLL_func@0 - dd _go4kFOP_func@0 - dd _go4kFST_func@0 - dd _go4kPAN_func@0 - dd _go4kOUT_func@0 - dd _go4kACC_func@0 - dd _go4kFLD_func@0 -%ifdef GO4K_USE_GLITCH - dd _go4kGLITCH_func@0 -%endif ; Peter Salomonsen removed the else _go4kFLD_func@0 for backwards compatibility with songs not using the GLITCH func -%ifdef GO4K_USE_FSTG - dd _go4kFSTG_func@0 -%endif - -%ifdef USE_SECTIONS -section .g4kdat2 data align=1 -%else -section .data -%endif - -%ifdef GO4K_USE_16BIT_OUTPUT -c_32767 dd 32767.0 -%endif -c_i128 dd 0.0078125 -c_RandDiv dd 65536*32768 -c_0_5 dd 0.5 -%ifdef GO4K_USE_VCO_GATE -c_16 dd 16.0 -%endif -%ifdef GO4K_USE_DLL_CHORUS -DLL_DEPTH dd 1024.0 -%endif -%ifdef GO4K_USE_DLL_DC_FILTER -c_dc_const dd 0.99609375 ; R = 1 - (pi*2 * frequency /samplerate) -%else - %ifdef GO4K_USE_VCO_GATE -c_dc_const dd 0.99609375 ; R = 1 - (pi*2 * frequency /samplerate) - %endif -%endif -global _RandSeed -_RandSeed dd 1 -c_24 dd 24 -c_i12 dd 0x3DAAAAAA -FREQ_NORMALIZE dd 0.000092696138 ; // 220.0/(2^(69/12)) / 44100.0 -global _LFO_NORMALIZE -_LFO_NORMALIZE dd DEF_LFO_NORMALIZE -%ifdef GO4K_USE_GROOVE_PATTERN -go4k_groove_pattern dw 0011100111001110b -%endif - -; //======================================================================================== -; // .crtemui section (emulates crt functions) -; //======================================================================================== -%ifdef USE_SECTIONS -section .crtemui code align=1 -%else -section .text -%endif - -export_func FloatRandomNumber@0 - push eax - imul eax,dword [_RandSeed],16007 - mov dword [_RandSeed], eax - fild dword [_RandSeed] - fidiv dword [c_RandDiv] - pop eax - ret - -; //======================================================================================== -; // .g4kcod* sections (code for go4k) -; //======================================================================================== - -%ifdef INCLUDE_WAVESHAPER - -%ifdef USE_SECTIONS -section .g4kcod2 code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // Waveshaper function -; //---------------------------------------------------------------------------------------- -; // Input : st0 : shaping coeff -; // st1 : input -; // Output: st0 : result -; //---------------------------------------------------------------------------------------- - -go4kWaveshaper: -%ifdef GO4K_USE_WAVESHAPER_CLIP - fxch - fld1 ; // 1 val - fucomi st1 ; // 1 val - jbe short go4kWaveshaper_clip - fchs ; // -1 val - fucomi st1 ; // -1 val - fcmovb st0, st1 ; // val -1 (if val > -1) -go4kWaveshaper_clip: - fstp st1 ; // newval - fxch -%endif - fsub dword [c_0_5] - fadd st0 - fst dword [esp-4] ; // amnt in - fadd st0 ; // 2*amnt in - fld1 ; // 1 2*amnt in - fsub dword [esp-4] ; // 1-amnt 2*amnt in - fdivp st1, st0 ; // k in - fld st1 ; // sin k in - fabs ; // a(in) k in - fmul st1 ; // k*a(in) k in - fld1 - faddp st1, st0 ; // 1+k*a(in) k in - fxch st1 ; // k 1+k*a(in) in - fld1 - faddp st1, st0 ; // 1+k 1+k*a(in) in - fmulp st2 ; // 1+k*a(in) (1+k)*in - fdivp st1, st0 ; // out - ret - -%endif - -%ifdef USE_SECTIONS -section .g4kcod3 code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // unit values preparation/transform -; //---------------------------------------------------------------------------------------- -go4kTransformValues: - push ecx - xor ecx, ecx - xor eax, eax - mov edx, go4k_transformed_values -go4kTransformValues_loop: - lodsb - push eax - fild dword [esp] - fmul dword [c_i128] - fstp dword [edx+ecx*4] - pop eax - inc ecx - cmp ecx, dword [esp+8] - jl go4kTransformValues_loop - pop ecx - ret 4 - -%ifdef USE_SECTIONS -section .g4kcod4 code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // Envelope param mapping -; //---------------------------------------------------------------------------------------- -go4kENVMap: - fld dword [edx+eax*4] -%ifdef GO4K_USE_ENV_MOD_ADR - fadd dword [WRK+go4kENV_wrk.am+eax*4] -%endif - fimul dword [c_24] - fchs -; //---------------------------------------------------------------------------------------- -; // Power function (2^x) -; //---------------------------------------------------------------------------------------- -; // Input : st0 : base -; // st1 : exponent -; // Output: st0 : result -; //---------------------------------------------------------------------------------------- -export_func Power@0 ; // base exp - fld1 - fadd st0 - fyl2x ; // log2_base - fld1 ; // 1 log2_base - fld st1 ; // log2_base 1 log2_base - fprem ; // (frac)log2_base 1 log2_base - f2xm1 ; // 2 ^ '' - 1 1 log2_base - faddp st1, st0 ; // 2 ^ '' (int)log2_base - fscale - fstp st1 - ret - -%ifdef USE_SECTIONS -section .g4kcoda code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // ENV Tick -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : eax -; //---------------------------------------------------------------------------------------- -export_func go4kENV_func@0 - push 5 - call go4kTransformValues -%ifdef GO4K_USE_ENV_CHECK -; check if current note still active - mov eax, dword [ecx-4] - test eax, eax - jne go4kENV_func_do - fldz - ret -%endif -go4kENV_func_do: - mov eax, dword [ecx-8] ; // is the instrument in release mode (note off)? - test eax, eax - je go4kENV_func_process - mov dword [WRK+go4kENV_wrk.state], ENV_STATE_RELEASE -go4kENV_func_process: - mov eax, dword [WRK+go4kENV_wrk.state] - fld dword [WRK+go4kENV_wrk.level] ; // val - -; // check for sustain state - cmp al, ENV_STATE_SUSTAIN - je short go4kENV_func_leave2 -go4kENV_func_attac: - cmp al, ENV_STATE_ATTAC - jne short go4kENV_func_decay - call go4kENVMap ; // newval - faddp st1, st0 -; // check for end of attac - fld1 ; // 1 newval - fucomi st1 ; // 1 newval - fcmovnb st0, st1 ; // newval 1 (if newval < 1) - jbe short go4kENV_func_statechange -go4kENV_func_decay: - cmp al, ENV_STATE_DECAY - jne short go4kENV_func_release - call go4kENVMap ; // newval - fsubp st1, st0 -; // check for end of decay - fld dword [edx+go4kENV_val.sustain] ; // sustain newval - fucomi st1 ; // sustain newval - fcmovb st0, st1 ; // newval sustain (if newval > sustain) - jnc short go4kENV_func_statechange -go4kENV_func_release: -; // release state? - cmp al, ENV_STATE_RELEASE - jne short go4kENV_func_leave - call go4kENVMap ; // newval - fsubp st1, st0 -; // check for end of release - fldz ; // 0 newval - fucomi st1 ; // 0 newval - fcmovb st0, st1 ; // newval 0 (if newval > 0) - jc short go4kENV_func_leave -go4kENV_func_statechange: ; // newval - inc dword [WRK+go4kENV_wrk.state] -go4kENV_func_leave: ; // newval bla - fstp st1 -; // store new env value - fst dword [WRK+go4kENV_wrk.level] -go4kENV_func_leave2: -; // mul by gain -%ifdef GO4K_USE_ENV_MOD_GM - fld dword [edx+go4kENV_val.gain] - fadd dword [WRK+go4kENV_wrk.gm] - fmulp st1, st0 -%else - fmul dword [edx+go4kENV_val.gain] -%endif - ret - - -; //---------------------------------------------------------------------------------------- -; // VCO Tick -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : eax -; //---------------------------------------------------------------------------------------- -%ifdef USE_SECTIONS -section .g4kcodp code align=1 -%else -section .text -%endif -go4kVCO_pulse: - fucomi st1 ; // c p - fld1 - jnc short go4kVCO_func_pulse_up ; // +1 c p - fchs ; // -1 c p -go4kVCO_func_pulse_up: - fstp st1 ; // +-1 p - fstp st1 ; // +-1 - ret - -%ifdef USE_SECTIONS -section .g4kcodt code align=1 -%else -section .text -%endif -go4kVCO_trisaw: - fucomi st1 ; // c p - jnc short go4kVCO_func_trisaw_up - fld1 ; // 1 c p - fsubr st2, st0 ; // 1 c 1-p - fsubrp st1, st0 ; // 1-c 1-p -go4kVCO_func_trisaw_up: - fdivp st1, st0 ; // tp'/tc - fadd st0 ; // 2*'' - fld1 ; // 1 2*'' - fsubp st1, st0 ; // 2*''-1 - ret - -%ifdef USE_SECTIONS -section .g4kcods code align=1 -%else -section .text -%endif -go4kVCO_sine: - fucomi st1 ; // c p - jnc short go4kVCO_func_sine_do - fstp st1 - fsub st0, st0 ; // 0 - ret -go4kVCO_func_sine_do - fdivp st1, st0 ; // p/c - fldpi ; // pi p - fadd st0 ; // 2*pi p - fmulp st1, st0 ; // 2*pi*p - fsin ; // sin(2*pi*p) - ret - -%ifdef GO4K_USE_VCO_GATE -%ifdef USE_SECTIONS -section .g4kcodq code align=1 -%else -section .text -%endif -go4kVCO_gate: - fxch ; // p c - fstp st1 ; // p - fmul dword [c_16] ; // p' - push eax - push eax - fistp dword [esp] ; // - - fld1 ; // 1 - pop eax - and al, 0xf - bt word [VAL-5],ax - jc go4kVCO_gate_bit - fsub st0, st0 ; // 0 -go4kVCO_gate_bit: - fld dword [WRK+go4kVCO_wrk.cm] ; // f x - fsub st1 ; // f-x x - fmul dword [c_dc_const] ; // c(f-x) x - faddp st1, st0 ; // x' - fst dword [WRK+go4kVCO_wrk.cm] - pop eax - ret -%endif - -%ifdef USE_SECTIONS -section .g4kcodb code align=1 -%else -section .text -%endif -export_func go4kVCO_func@0 -%ifdef GO4K_USE_VCO_PHASE_OFFSET - %ifdef GO4K_USE_VCO_SHAPE - %ifdef GO4K_USE_VCO_GATE - push 8 - %else - push 7 - %endif - %else - %ifdef GO4K_USE_VCO_GATE - push 7 - %else - push 6 - %endif - %endif -%else - %ifdef GO4K_USE_VCO_SHAPE - %ifdef GO4K_USE_VCO_GATE - push 7 - %else - push 6 - %endif - %else - %ifdef GO4K_USE_VCO_GATE - push 6 - %else - push 5 - %endif - %endif -%endif - call go4kTransformValues -%ifdef GO4K_USE_VCO_CHECK -; check if current note still active - mov eax, dword [ecx-4] - test eax, eax - jne go4kVCO_func_do -%ifdef GO4K_USE_VCO_STEREO - movzx eax, byte [VAL-1] ; // get flags and check for stereo - test al, byte VCO_STEREO - jz short go4kVCO_func_nostereoout - fldz -go4kVCO_func_nostereoout: -%endif - fldz - ret -go4kVCO_func_do: -%endif - movzx eax, byte [VAL-1] ; // get flags -%ifdef GO4K_USE_VCO_STEREO - test al, byte VCO_STEREO - jz short go4kVCO_func_nopswap - fld dword [WRK+go4kVCO_wrk.phase] ;// swap left/right phase values for first stereo run - fld dword [WRK+go4kVCO_wrk.phase2] - fstp dword [WRK+go4kVCO_wrk.phase] - fstp dword [WRK+go4kVCO_wrk.phase2] -go4kVCO_func_nopswap: -%endif -go4kVCO_func_process: - fld dword [edx+go4kVCO_val.transpose] - fsub dword [c_0_5] -%ifdef GO4K_USE_VCO_MOD_TM - fadd dword [WRK+go4kVCO_wrk.tm] -%endif - fdiv dword [c_i128] - fld dword [edx+go4kVCO_val.detune] - fsub dword [c_0_5] - fadd st0 -%ifdef GO4K_USE_VCO_STEREO - test al, byte VCO_STEREO - jz short go4kVCO_func_nodswap - fchs ;// negate detune for stereo -go4kVCO_func_nodswap: -%endif - faddp st1 -%ifdef GO4K_USE_VCO_MOD_DM - fadd dword [WRK+go4kVCO_wrk.dm] -%endif - ; // st0 now contains the transpose+detune offset - test al, byte LFO - jnz go4kVCO_func_skipnote - fiadd dword [ecx-4] ; // st0 is note, st1 is t+d offset -go4kVCO_func_skipnote: - fmul dword [c_i12] - call _Power@0 - test al, byte LFO - jz short go4kVCO_func_normalize_note - fmul dword [_LFO_NORMALIZE] ; // st0 is now frequency for lfo - jmp short go4kVCO_func_normalized -go4kVCO_func_normalize_note: - fmul dword [FREQ_NORMALIZE] ; // st0 is now frequency -go4kVCO_func_normalized: - fadd dword [WRK+go4kVCO_wrk.phase] -%ifdef GO4K_USE_VCO_MOD_FM - fadd dword [WRK+go4kVCO_wrk.fm] -%endif - fld1 - fadd st1, st0 - fxch - fprem - fstp st1 - fst dword [WRK+go4kVCO_wrk.phase] -%ifdef GO4K_USE_VCO_MOD_PM - fadd dword [WRK+go4kVCO_wrk.pm] -%endif -%ifdef GO4K_USE_VCO_PHASE_OFFSET - fadd dword [edx+go4kVCO_val.phaseofs] -%endif -%ifdef PHASE_RENORMALIZE - fld1 - fadd st1, st0 - fxch - fprem - fstp st1 ; // p -%endif - fld dword [edx+go4kVCO_val.color] ; // c p -%ifdef GO4K_USE_VCO_MOD_CM - fadd dword [WRK+go4kVCO_wrk.cm] ; // c p -%endif -go4kVCO_func_sine: - test al, byte SINE - jz short go4kVCO_func_trisaw - call go4kVCO_sine -go4kVCO_func_trisaw: - test al, byte TRISAW - jz short go4kVCO_func_pulse - call go4kVCO_trisaw -go4kVCO_func_pulse: - test al, byte PULSE -%ifdef GO4K_USE_VCO_GATE - jz short go4kVCO_func_gate -%else - jz short go4kVCO_func_noise -%endif - call go4kVCO_pulse -%ifdef GO4K_USE_VCO_GATE -go4kVCO_func_gate: - test al, byte GATE - jz short go4kVCO_func_noise - call go4kVCO_gate -%endif -go4kVCO_func_noise: - test al, byte NOISE - jz short go4kVCO_func_end - call _FloatRandomNumber@0 - fstp st1 - fstp st1 -go4kVCO_func_end: -%ifdef GO4K_USE_VCO_SHAPE - fld dword [edx+go4kVCO_val.shape] -%ifdef GO4K_USE_VCO_MOD_SM - fadd dword [WRK+go4kVCO_wrk.sm] -%endif - call go4kWaveshaper -%endif - fld dword [edx+go4kVCO_val.gain] -%ifdef GO4K_USE_VCO_MOD_GM - fadd dword [WRK+go4kVCO_wrk.gm] -%endif - fmulp st1, st0 - -%ifdef GO4K_USE_VCO_STEREO - test al, byte VCO_STEREO - jz short go4kVCO_func_stereodone - sub al, byte VCO_STEREO - fld dword [WRK+go4kVCO_wrk.phase] ;// swap left/right phase values again for second stereo run - fld dword [WRK+go4kVCO_wrk.phase2] - fstp dword [WRK+go4kVCO_wrk.phase] - fstp dword [WRK+go4kVCO_wrk.phase2] - jmp go4kVCO_func_process -go4kVCO_func_stereodone: -%endif - ret - -%ifdef USE_SECTIONS -section .g4kcodc code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // VCF Tick -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : eax -; //---------------------------------------------------------------------------------------- -export_func go4kVCF_func@0 - push 3 - call go4kTransformValues -%ifdef GO4K_USE_VCF_CHECK -; check if current note still active - mov eax, dword [ecx-4] - test eax, eax - jne go4kVCF_func_do - ret -go4kVCF_func_do: -%endif - movzx eax, byte [VAL-1] ; // get type flag - - fld dword [edx+go4kVCF_val.res] ; // r in -%ifdef GO4K_USE_VCF_MOD_RM - fadd dword [WRK+go4kVCF_wrk.rm] -%endif - fstp dword [esp-8] - - fld dword [edx+go4kVCF_val.freq] ; // f in -%ifdef GO4K_USE_VCF_MOD_FM - fadd dword [WRK+go4kVCF_wrk.fm] -%endif - fmul st0, st0 ; // square the input so we never get negative and also have a smoother behaviour in the lower frequencies - fstp dword [esp-4] ; // in - -%ifdef GO4K_USE_VCF_STEREO - test al, byte STEREO - jz short go4kVCF_func_process - add WRK, go4kVCF_wrk.low2 -go4kVCF_func_stereoloop: ; // switch channels - fxch st1 ; // inr inl -%endif - -go4kVCF_func_process: - fld dword [esp-8] - fld dword [esp-4] - fmul dword [WRK+go4kVCF_wrk.band] ; // f*b r in - fadd dword [WRK+go4kVCF_wrk.low] ; // l' r in - fst dword [WRK+go4kVCF_wrk.low] ; // l' r in - fsubp st2, st0 ; // r in-l' - fmul dword [WRK+go4kVCF_wrk.band] ; // r*b in-l' - fsubp st1, st0 ; // h' - fst dword [WRK+go4kVCF_wrk.high] ; // h' - fmul dword [esp-4] ; // h'*f - fadd dword [WRK+go4kVCF_wrk.band] ; // b' - fstp dword [WRK+go4kVCF_wrk.band] - fldz -go4kVCF_func_low: - test al, byte LOWPASS - jz short go4kVCF_func_high - fadd dword [WRK+go4kVCF_wrk.low] -go4kVCF_func_high: -%ifdef GO4K_USE_VCF_HIGH - test al, byte HIGHPASS - jz short go4kVCF_func_band - fadd dword [WRK+go4kVCF_wrk.high] -%endif -go4kVCF_func_band: -%ifdef GO4K_USE_VCF_BAND - test al, byte BANDPASS - jz short go4kVCF_func_peak - fadd dword [WRK+go4kVCF_wrk.band] -%endif -go4kVCF_func_peak: -%ifdef GO4K_USE_VCF_PEAK - test al, byte PEAK - jz short go4kVCF_func_processdone - fadd dword [WRK+go4kVCF_wrk.low] - fsub dword [WRK+go4kVCF_wrk.high] -%endif -go4kVCF_func_processdone: - -%ifdef GO4K_USE_VCF_STEREO - test al, byte STEREO ; // outr inl - jz short go4kVCF_func_end - sub al, byte STEREO - sub WRK, go4kVCF_wrk.low2 - jmp go4kVCF_func_stereoloop -%endif - -go4kVCF_func_end: ; // value - - - - - ret - -%ifdef USE_SECTIONS -section .g4kcodd code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // DST Tick -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : eax -; //---------------------------------------------------------------------------------------- -export_func go4kDST_func@0 -%ifdef GO4K_USE_DST -%ifdef GO4K_USE_DST_SH - %ifdef GO4K_USE_DST_STEREO - push 3 - %else - push 2 - %endif -%else - %ifdef GO4K_USE_DST_STEREO - push 2 - %else - push 1 - %endif -%endif - call go4kTransformValues -%ifdef GO4K_USE_DST_CHECK -; check if current note still active - mov eax, dword [ecx-4] - test eax, eax - jne go4kDST_func_do - ret -go4kDST_func_do: -%endif - movzx eax, byte [VAL-1] ; // get type flag -%ifdef GO4K_USE_DST_SH - fld dword [edx+go4kDST_val.snhfreq] ; // snh in (inr) -%ifdef GO4K_USE_DST_MOD_SH - fadd dword [WRK+go4kDST_wrk.sm] ; // snh' in (inr) -%endif - fmul st0, st0 ; // square the input so we never get negative and also have a smoother behaviour in the lower frequencies - fchs - fadd dword [WRK+go4kDST_wrk.snhphase]; // snh' in (inr) - fst dword [WRK+go4kDST_wrk.snhphase] - fldz ; // 0 snh' in (inr) - fucomip st1 ; // snh' in (inr) - fstp dword [esp-4] ; // in (inr) - jc short go4kDST_func_hold - fld1 ; // 1 in (inr) - fadd dword [esp-4] ; // 1+snh' in (inr) - fstp dword [WRK+go4kDST_wrk.snhphase]; // in (inr) -%endif -; // calc pregain and postgain -%ifdef GO4K_USE_DST_STEREO - test al, byte STEREO - jz short go4kDST_func_mono - fxch st1 ; // inr inl - fld dword [edx+go4kDST_val.drive] ; // drive inr inl -%ifdef GO4K_USE_DST_MOD_DM - fadd dword [WRK+go4kDST_wrk.dm] -%endif - call go4kWaveshaper ; // outr inl -%ifdef GO4K_USE_DST_SH - fst dword [WRK+go4kDST_wrk.out2] ; // outr inl -%endif - fxch st1 ; // inl outr -go4kDST_func_mono: -%endif - fld dword [edx+go4kDST_val.drive] ; // drive in (outr) -%ifdef GO4K_USE_DST_MOD_DM - fadd dword [WRK+go4kDST_wrk.dm] -%endif - call go4kWaveshaper ; // out (outr) -%ifdef GO4K_USE_DST_SH - fst dword [WRK+go4kDST_wrk.out] ; // out' (outr) -%endif - ret ; // out' (outr) -%ifdef GO4K_USE_DST_SH -go4kDST_func_hold: ; // in (inr) - fstp st0 ; // (inr) -%ifdef GO4K_USE_DST_STEREO - test al, byte STEREO - jz short go4kDST_func_monohold ; // (inr) - fstp st0 ; // - fld dword [WRK+go4kDST_wrk.out2] ; // outr -go4kDST_func_monohold: -%endif - fld dword [WRK+go4kDST_wrk.out] ; // out (outr) - ret -%endif - -%endif - -%ifdef USE_SECTIONS -section .g4kcodf code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // DLL Tick -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : eax -; //---------------------------------------------------------------------------------------- -export_func go4kDLL_func@0 -%ifdef GO4K_USE_DLL -%ifdef GO4K_USE_DLL_CHORUS - %ifdef GO4K_USE_DLL_DAMP - push 8 - %else - push 7 - %endif -%else - %ifdef GO4K_USE_DLL_DAMP - push 6 - %else - push 5 - %endif -%endif - call go4kTransformValues - pushad - movzx ebx, byte [VAL-(go4kDLL_val.size-go4kDLL_val.delay)/4] ;// delay length index -%ifdef GO4K_USE_DLL_NOTE_SYNC - test ebx, ebx - jne go4kDLL_func_process - fld1 - fild dword [ecx-4] ; // load note freq - fmul dword [c_i12] - call _Power@0 - fmul dword [FREQ_NORMALIZE] ; // normalize - fdivp st1, st0 ; // invert to get numer of samples - fistp word [_go4k_delay_times+ebx*2] ; store current comb size -%endif -go4kDLL_func_process: - mov ecx, eax ;// ecx is delay counter -%ifdef GO4K_USE_DLL_MOD - mov edi, WRK ;// edi is modulation workspace -%endif - mov WRK, dword [_go4k_delay_buffer_ofs] ;// ebp is current delay - fld st0 ;// in in -%ifdef GO4K_USE_DLL_MOD_IM - fld dword [edx+go4kDLL_val.dry] ;// dry in in - fadd dword [edi+go4kDLL_wrk2.im] ;// dry' in in - fmulp st1, st0 ;// out in -%else - fmul dword [edx+go4kDLL_val.dry] ;// out in -%endif - fxch ;// in out -%ifdef GO4K_USE_DLL_MOD_PM - fld dword [edx+go4kDLL_val.pregain] ;// pg in out - fadd dword [edi+go4kDLL_wrk2.pm] ;// pg' in out - fmul st0, st0 ;// pg'' in out - fmulp st1, st0 ;// in' out -%else - fmul dword [edx+go4kDLL_val.pregain] ;// in' out - fmul dword [edx+go4kDLL_val.pregain] ;// in' out -%endif - -%ifdef GO4K_USE_DLL_CHORUS -;// update saw lfo for chorus/flanger - fld dword [edx+go4kDLL_val.freq] ;// f in' out -%ifdef GO4K_USE_DLL_MOD_SM - fadd dword [edi+go4kDLL_wrk2.sm] ;// f' in' out -%endif - fmul st0, st0 - fmul st0, st0 - fdiv dword [DLL_DEPTH] - fadd dword [WRK+go4kDLL_wrk.phase] ;// p' in' out -;// clamp phase to 0,1 (only in editor, since delay can be active quite long) -%ifdef GO4K_USE_DLL_CHORUS_CLAMP - fld1 ;// 1 p' in' out - fadd st1, st0 ;// 1 1+p' in' out - fxch ;// 1+p' 1 in' out - fprem ;// p'' 1 in' out - fstp st1 ;// p'' in' out -%endif - fst dword [WRK+go4kDLL_wrk.phase] -;// get current sine value - fldpi ; // pi p in' out - fadd st0 ; // 2*pi p in' out - fmulp st1, st0 ; // 2*pi*p in' out - fsin ; // sin in' out - fld1 ; // 1 sin in' out - faddp st1, st0 ; // 1+sin in' out -;// mul with depth and convert to samples - fld dword [edx+go4kDLL_val.depth] ; // d 1+sin in' out -%ifdef GO4K_USE_DLL_MOD_AM - fadd dword [edi+go4kDLL_wrk2.am] ; // d' 1+sin in' out -%endif - fmul st0, st0 - fmul st0, st0 - fmul dword [DLL_DEPTH] - fmulp st1, st0 - fistp dword [esp-4] ; // in' out -%endif - -go4kDLL_func_loop: - movzx esi, word [_go4k_delay_times+ebx*2] ; fetch comb size - mov eax, dword [WRK+go4kDLL_wrk.index] ;// eax is current comb index - -%ifdef GO4K_USE_DLL_CHORUS - ;// add lfo offset and wrap buffer - add eax, dword [esp-4] - cmp eax, esi - jl short go4kDLL_func_buffer_nowrap1 - sub eax, esi -go4kDLL_func_buffer_nowrap1: -%endif - - fld dword [WRK+eax*4+go4kDLL_wrk.buffer];// cout in' out - -%ifdef GO4K_USE_DLL_CHORUS - mov eax, dword [WRK+go4kDLL_wrk.index] -%endif - - ;// add comb output to current output - fadd st2, st0 ;// cout in' out' -%ifdef GO4K_USE_DLL_DAMP - fld1 ;// 1 cout in' out' - fsub dword [edx+go4kDLL_val.damp] ;// 1-damp cout in' out' -%ifdef GO4K_USE_DLL_MOD_DM - fsub dword [edi+go4kDLL_wrk2.dm] ;// 1-damp' cout in' out' -%endif - fmulp st1, st0 ;// cout*d2 in' out' - fld dword [edx+go4kDLL_val.damp] ;// d1 cout*d2 in' out' -%ifdef GO4K_USE_DLL_MOD_DM - fadd dword [edi+go4kDLL_wrk2.dm] ;// d1' cout*d2 in' out' -%endif - fmul dword [WRK+go4kDLL_wrk.store] ;// store*d1 cout*d2 in' out' - faddp st1, st0 ;// store' in' out' - fst dword [WRK+go4kDLL_wrk.store] ;// store' in' out' -%endif -%ifdef GO4K_USE_DLL_MOD_FM - fld dword [edx+go4kDLL_val.feedback] ;// fb cout in' out' - fadd dword [edi+go4kDLL_wrk2.fm] ;// fb' cout in' out' - fmulp st1, st0 ;// cout*fb' in' out' -%else - fmul dword [edx+go4kDLL_val.feedback] ;// cout*fb in' out' -%endif -%ifdef GO4K_USE_DLL_DC_FILTER - fadd st0, st1 ;// store in' out' - fstp dword [WRK+eax*4+go4kDLL_wrk.buffer];// in' out' -%else - fsub st0, st1 ;// store in' out' - fstp dword [WRK+eax*4+go4kDLL_wrk.buffer];// in' out' - fneg -%endif - ;// wrap comb buffer pos - inc eax - cmp eax, esi - jl short go4kDLL_func_buffer_nowrap2 -%ifdef GO4K_USE_DLL_CHORUS - sub eax, esi -%else - xor eax, eax -%endif -go4kDLL_func_buffer_nowrap2: - mov dword [WRK+go4kDLL_wrk.index], eax - ;// increment buffer pointer to next buffer - inc ebx ;// go to next delay length index - add WRK, go4kDLL_wrk.size ;// go to next delay - mov dword [_go4k_delay_buffer_ofs], WRK ;// store next delay offset - loopne go4kDLL_func_loop - fstp st0 ;// out' - ;// process a dc filter to prevent heavy offsets in reverb -%ifdef GO4K_USE_DLL_DC_FILTER -; y(n) = x(n) - x(n-1) + R * y(n-1) - sub WRK, go4kDLL_wrk.size - fld dword [WRK+go4kDLL_wrk.dcout] ;// dco out' - fmul dword [c_dc_const] ;// dcc*dco out' - fsub dword [WRK+go4kDLL_wrk.dcin] ;// dcc*dco-dci out' - fxch ;// out' dcc*dco-dci - fst dword [WRK+go4kDLL_wrk.dcin] ;// out' dcc*dco-dci - faddp st1 ;// out' -%ifdef GO4K_USE_UNDENORMALIZE - fadd dword [c_0_5] ;// add and sub small offset to prevent denormalization - fsub dword [c_0_5] -%endif - fst dword [WRK+go4kDLL_wrk.dcout] -%endif - popad - ret -%endif - - -%ifdef USE_SECTIONS -section .g4kcodu code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // GLITCH Tick -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : eax -; //---------------------------------------------------------------------------------------- -export_func go4kGLITCH_func@0 -%ifdef GO4K_USE_GLITCH - push 5 - call go4kTransformValues - pushad - - mov edi, WRK - mov WRK, dword [_go4k_delay_buffer_ofs] ;// ebp is current delay - -; mov eax, dword [edx+go4kGLITCH_val.active] -; or eax, dword [edi+go4kGLITCH_wrk2.am] -; test eax, eax -; je go4kGLITCH_func_notactive ;// out - - fld dword [edx+go4kGLITCH_val.active] ;// a in - fadd dword [edi+go4kGLITCH_wrk2.am] ;// a' in - ; // check for activity - fldz ;// 0 a' in - fucomip st1 ;// a' in - fstp st0 ;// in - jnc go4kGLITCH_func_notactive ;// out - - ;// check for first call and init if so init (using slizesize slot) - mov eax, dword [WRK+go4kGLITCH_wrk.slizesize] - and eax, eax - jnz go4kGLITCH_func_process - mov dword [WRK+go4kGLITCH_wrk.index], eax - mov dword [WRK+go4kGLITCH_wrk.store], eax - movzx ebx, byte [VAL-(go4kGLITCH_val.size-go4kGLITCH_val.slicesize)/4] ;// slicesize index - movzx eax, word [_go4k_delay_times+ebx*2] ;// fetch slicesize - push eax - fld1 - fild dword [esp] - fstp dword [WRK+go4kGLITCH_wrk.slizesize] - fstp dword [WRK+go4kGLITCH_wrk.slicepitch] - pop eax -go4kGLITCH_func_process: - ;// fill buffer until full - mov eax, dword [WRK+go4kGLITCH_wrk.store] - cmp eax, MAX_DELAY - jae go4kGLITCH_func_filldone - fst dword [WRK+eax*4+go4kDLL_wrk.buffer] ;// in - inc dword [WRK+go4kGLITCH_wrk.store] -go4kGLITCH_func_filldone: - ;// save input - push eax - fstp dword [esp] ;// - - - ;// read from buffer - push eax - fld dword [WRK+go4kGLITCH_wrk.index] ;// idx - fist dword [esp] - pop eax - fld dword [WRK+eax*4+go4kDLL_wrk.buffer] ;// out idx - fxch ;// idx out - ;// progress readindex with current play speed - fadd dword [WRK+go4kGLITCH_wrk.slicepitch] ;// idx' out - fst dword [WRK+go4kGLITCH_wrk.index] - - ;// check for slice done - fld dword [WRK+go4kGLITCH_wrk.slizesize] ;// size idx' out - fxch ;// idx' size out - fucomip st1 ;// idx' out - fstp st0 ;// out - jc go4kGLITCH_func_process_done - ;// reinit for next loop - xor eax, eax - mov dword [WRK+go4kGLITCH_wrk.index], eax - - fld dword [edx+go4kGLITCH_val.dsize] - fadd dword [edi+go4kGLITCH_wrk2.sm] - fsub dword [c_0_5] - fmul dword [c_0_5] - call _Power@0 - fmul dword [WRK+go4kGLITCH_wrk.slizesize] - fstp dword [WRK+go4kGLITCH_wrk.slizesize] - - fld dword [edx+go4kGLITCH_val.dpitch] - fadd dword [edi+go4kGLITCH_wrk2.pm] - fsub dword [c_0_5] - fmul dword [c_0_5] - call _Power@0 - fmul dword [WRK+go4kGLITCH_wrk.slicepitch] - fstp dword [WRK+go4kGLITCH_wrk.slicepitch] -go4kGLITCH_func_process_done: - - ;// dry wet mix - fld dword [edx+go4kGLITCH_val.dry] ;// dry out - fadd dword [edi+go4kGLITCH_wrk2.dm] ;// dry' out - fld1 ;// 1 dry' out - fsub st1 ;// 1-dry' dry' out - fmulp st2 ;// dry' out' - fmul dword [esp] ;// in' out' - faddp st1, st0 ;// out' - - pop eax - jmp go4kGLITCH_func_leave -go4kGLITCH_func_notactive: - ;// mark as uninitialized again (using slizesize slot) - xor eax,eax - mov dword [WRK+go4kGLITCH_wrk.slizesize], eax -go4kGLITCH_func_leave: - add WRK, go4kDLL_wrk.size ;// go to next delay - mov dword [_go4k_delay_buffer_ofs], WRK ;// store next delay offset - popad - ret -%endif - -%ifdef USE_SECTIONS -section .g4kcodg code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // FOP Tick (various fp stack based operations) -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : -; //---------------------------------------------------------------------------------------- -export_func go4kFOP_func@0 - push 1 - call go4kTransformValues -go4kFOP_func_pop: - dec eax - jnz go4kFOP_func_addp - fstp st0 - ret -go4kFOP_func_addp: - dec eax - jnz go4kFOP_func_mulp - faddp st1, st0 - ret -go4kFOP_func_mulp: - dec eax - jnz go4kFOP_func_push - fmulp st1, st0 - ret -go4kFOP_func_push: - dec eax - jnz go4kFOP_func_xch - fld st0 - ret -go4kFOP_func_xch: - dec eax - jnz go4kFOP_func_add - fxch - ret -go4kFOP_func_add: - dec eax - jnz go4kFOP_func_mul - fadd st1 - ret -go4kFOP_func_mul: - dec eax - jnz go4kFOP_func_addp2 - fmul st1 - ret -go4kFOP_func_addp2: - dec eax - jnz go4kFOP_func_loadnote - faddp st2, st0 - faddp st2, st0 - ret -go4kFOP_func_loadnote: - dec eax - jnz go4kFOP_func_mulp2 - fild dword [ecx-4] - fmul dword [c_i128] - ret -go4kFOP_func_mulp2: - fmulp st2, st0 - fmulp st2, st0 - ret - -%ifdef USE_SECTIONS -section .g4kcodh code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // FST Tick (stores a value somewhere in the local workspace) -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : -; //---------------------------------------------------------------------------------------- -export_func go4kFST_func@0 - push 1 - call go4kTransformValues - fld dword [edx+go4kFST_val.amount] - fsub dword [c_0_5] - fadd st0 - fmul st1 - lodsw - and eax, 0x00003fff ; // eax is destination slot - test word [VAL-2], FST_ADD - jz go4kFST_func_set - fadd dword [ecx+eax*4] -go4kFST_func_set: - fstp dword [ecx+eax*4] - test word [VAL-2], FST_POP - jz go4kFST_func_done - fstp st0 -go4kFST_func_done: - ret - -%ifdef USE_SECTIONS -section .g4kcodm code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // FLD Tick (load a value on stack, optionally add a modulation signal beforehand) -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : signal-signal*pan , signal*pan -; // DIRTY : -; //---------------------------------------------------------------------------------------- -export_func go4kFLD_func@0 ;// in main env -%ifdef GO4K_USE_FLD - push 1 - call go4kTransformValues - fld dword [edx+go4kFLD_val.value] ;// value in - fsub dword [c_0_5] - fadd st0 -%ifdef GO4K_USE_FLD_MOD_VM - fadd dword [WRK+go4kFLD_wrk.vm] ;// value' in -%endif -%endif - ret - -%ifdef GO4K_USE_FSTG -%ifdef USE_SECTIONS -section .g4kcodi code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // FSTG Tick (stores a value anywhere in the synth (and in each voice)) -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : -; //---------------------------------------------------------------------------------------- -export_func go4kFSTG_func@0 - push 1 - call go4kTransformValues -%ifdef GO4K_USE_FSTG_CHECK -; check if current note still active - mov eax, dword [ecx-4] - test eax, eax - jne go4kFSTG_func_do - lodsw - jmp go4kFSTG_func_testpop -go4kFSTG_func_do: -%endif - fld dword [edx+go4kFST_val.amount] - fsub dword [c_0_5] - fadd st0 - fmul st1 - lodsw - and eax, 0x00003fff ; // eax is destination slot - test word [VAL-2], FST_ADD - jz go4kFSTG_func_set - fadd dword [go4k_synth_wrk+eax*4] -go4kFSTG_func_set: -%if MAX_VOICES > 1 - fst dword [go4k_synth_wrk+eax*4] - fstp dword [go4k_synth_wrk+eax*4+go4k_instrument.size] -%else - fstp dword [go4k_synth_wrk+eax*4] -%endif -go4kFSTG_func_testpop: - test word [VAL-2], FST_POP - jz go4kFSTG_func_done - fstp st0 -go4kFSTG_func_done: - ret -%endif - -%ifdef USE_SECTIONS -section .g4kcodj code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // PAN Tick (multiplies signal with main envelope and converts to stereo) -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : signal-signal*pan , signal*pan -; // DIRTY : -; //---------------------------------------------------------------------------------------- -export_func go4kPAN_func@0 ;// in main env -%ifdef GO4K_USE_PAN - push 1 - call go4kTransformValues - fld dword [edx+go4kPAN_val.panning] ;// pan in -%ifdef GO4K_USE_PAN_MOD - fadd dword [WRK+go4kPAN_wrk.pm] ;// pan in -%endif - fmul st1 ;// r in - fsub st1, st0 ;// r l - fxch ;// l r -%else - fmul dword [c_0_5] - fld st0 -%endif - ret - -%ifdef USE_SECTIONS -section .g4kcodk code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // OUT Tick ( stores stereo signal pair in temp buffers of the instrument) -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : -; //---------------------------------------------------------------------------------------- -export_func go4kOUT_func@0 ;// l r -%ifdef GO4K_USE_GLOBAL_DLL - push 2 - call go4kTransformValues - pushad - lea edi, [ecx+MAX_UNITS*MAX_UNIT_SLOTS*4] - fld st1 ;// r l r - fld st1 ;// l r l r - fld dword [edx+go4kOUT_val.auxsend] ;// as l r l r -%ifdef GO4K_USE_OUT_MOD_AM - fadd dword [WRK+go4kOUT_wrk.am] ;// am l r l r -%endif - fmulp st1, st0 ;// l' r l r - fstp dword [edi] ;// r l r - scasd - fld dword [edx+go4kOUT_val.auxsend] ;// as r l r -%ifdef GO4K_USE_OUT_MOD_AM - fadd dword [WRK+go4kOUT_wrk.am] ;// am r l r -%endif - fmulp st1, st0 ;// r' l r - fstp dword [edi] ;// l r - scasd - fld dword [edx+go4kOUT_val.gain] ;// g l r -%ifdef GO4K_USE_OUT_MOD_GM - fadd dword [WRK+go4kOUT_wrk.gm] ;// gm l r -%endif - fmulp st1, st0 ;// l' r - fstp dword [edi] ;// r - scasd - fld dword [edx+go4kOUT_val.gain] ;// g r -%ifdef GO4K_USE_OUT_MOD_GM - fadd dword [WRK+go4kOUT_wrk.gm] ;// gm r -%endif - fmulp st1, st0 ;// r' - fstp dword [edi] ;// - - scasd - popad -%else - push 1 - call go4kTransformValues - - fld dword [edx+go4kOUT_val.gain] ;// g l r -%ifdef GO4K_USE_OUT_MOD_GM - fadd dword [WRK+go4kOUT_wrk.gm] ;// gm l r -%endif - fmulp st1, st0 ;// l' r - fstp dword [ecx+MAX_UNITS*MAX_UNIT_SLOTS*4+0] ;// r - fld dword [edx+go4kOUT_val.gain] ;// g r -%ifdef GO4K_USE_OUT_MOD_GM - fadd dword [WRK+go4kOUT_wrk.gm] ;// gm r -%endif - fmulp st1, st0 ;// r' - fstp dword [ecx+MAX_UNITS*MAX_UNIT_SLOTS*4+4] ;// - - -%endif - ret - -%ifdef USE_SECTIONS -section .g4kcodl code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // ACC Tick (stereo signal accumulation for synth commands only -> dont use in instrument commands) -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : eax -; //---------------------------------------------------------------------------------------- -export_func go4kACC_func@0 - push 1 - call go4kTransformValues - pushad - mov edi, go4k_synth_wrk - add edi, go4k_instrument.size - sub edi, eax ; // eax already contains the accumulation offset from the go4kTransformValues call - mov cl, MAX_INSTRUMENTS*MAX_VOICES - fldz ;// 0 - fldz ;// 0 0 -go4kACC_func_loop: - fadd dword [edi-8] ;// l 0 - fxch ;// 0 l - fadd dword [edi-4] ;// r l - fxch ;// l r - add edi, go4k_instrument.size - dec cl - jnz go4kACC_func_loop - popad - ret - -%ifdef USE_SECTIONS -section .g4kcodw code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // Update Instrument (allocate voices, set voice to release) -; //---------------------------------------------------------------------------------------- -; // IN : -; // IN : -; // OUT : -; // DIRTY : -; //---------------------------------------------------------------------------------------- -go4kUpdateInstrument: -; // get new note - mov eax, dword [esp+4+4] ; // eax = current tick - shr eax, PATTERN_SIZE_SHIFT ; // eax = current pattern - imul edx, ecx, dword MAX_PATTERNS ; // edx = instrument pattern list index - movzx edx, byte [edx+eax+go4k_pattern_lists] ; // edx = pattern index - mov eax, dword [esp+4+4] ; // eax = current tick - shl edx, PATTERN_SIZE_SHIFT - and eax, PATTERN_SIZE-1 - movzx edx, byte [edx+eax+go4k_patterns] ; // edx = requested note in new patterntick -; // apply note changes - cmp dl, HLD ; // anything but hold causes action - je short go4kUpdateInstrument_done - inc dword [edi] ; // set release flag if needed -%if MAX_VOICES > 1 - inc dword [edi+go4k_instrument.size] ; // set release flag if needed -%endif - cmp dl, HLD ; // check for new note - jl short go4kUpdateInstrument_done -%if MAX_VOICES > 1 - pushad - xchg eax, dword [go4k_voiceindex + ecx*4] - test eax, eax - je go4kUpdateInstrument_newNote - add edi, go4k_instrument.size -go4kUpdateInstrument_newNote: - xor al,1 - xchg dword [go4k_voiceindex + ecx*4], eax -%endif - pushad - xor eax, eax - mov ecx, (8+MAX_UNITS*MAX_UNIT_SLOTS*4)/4 ; // clear only relase, note and workspace - rep stosd - popad - mov dword [edi+4], edx ; // set requested note as current note -%if MAX_VOICES > 1 - popad -%endif - jmp short go4kUpdateInstrument_done -go4kUpdateInstrument_done: - ret - -%ifdef USE_SECTIONS -section .g4kcodx code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // Render Voices -; //---------------------------------------------------------------------------------------- -; // IN : -; // IN : -; // OUT : -; // DIRTY : -; //---------------------------------------------------------------------------------------- -go4kRenderVoices: - push ecx ; // save current instrument counter -%if MAX_VOICES > 1 - push COM ; // save current instrument command index - push VAL ; // save current instrument values index -%endif - call go4k_VM_process ; // call synth vm for instrument voices - mov eax, dword [ecx+go4kENV_wrk.state] - cmp al, byte ENV_STATE_OFF - jne go4kRenderVoices_next - xor eax, eax - mov dword [ecx-4], eax ; // kill note if voice is done -go4kRenderVoices_next: -%if MAX_VOICES > 1 - pop VAL ; // restore instrument value index - pop COM ; // restore instrument command index -%endif - -%ifdef GO4K_USE_BUFFER_RECORDINGS - mov eax, dword [esp+16] ; // get current tick - shr eax, 8 ; // every 256th sample = ~ 172 hz - shl eax, 5 ; // for 16 instruments a 2 voices - add eax, dword [esp] - add eax, dword [esp] ; // + 2*currentinstrument+0 -%ifdef GO4K_USE_ENVELOPE_RECORDINGS - mov edx, dword [ecx+go4kENV_wrk.level] - mov dword [__4klang_envelope_buffer+eax*4], edx -%endif -%ifdef GO4K_USE_NOTE_RECORDINGS - mov edx, dword [ecx-4] - mov dword [__4klang_note_buffer+eax*4], edx -%endif -%endif - -%if MAX_VOICES > 1 - call go4k_VM_process ; // call synth vm for instrument voices - mov eax, dword [ecx+go4kENV_wrk.state] - cmp al, byte ENV_STATE_OFF - jne go4k_render_instrument_next2 - xor eax, eax - mov dword [ecx-4], eax ; // kill note if voice is done -go4k_render_instrument_next2: - -%ifdef GO4K_USE_BUFFER_RECORDINGS - mov eax, dword [esp+16] ; // get current tick - shr eax, 8 ; // every 256th sample = ~ 172 hz - shl eax, 5 ; // for 16 instruments a 2 voices - add eax, dword [esp] - add eax, dword [esp] ; // + 2*currentinstrument+0 -%ifdef GO4K_USE_ENVELOPE_RECORDINGS - mov edx, dword [ecx+go4kENV_wrk.level] - mov dword [__4klang_envelope_buffer+eax*4+4], edx -%endif -%ifdef GO4K_USE_NOTE_RECORDINGS - mov edx, dword [ecx-4] - mov dword [__4klang_note_buffer+eax*4+4], edx -%endif -%endif - -%endif - pop ecx ; // restore instrument counter - ret - -%ifdef USE_SECTIONS -section .g4kcody code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // the entry point for the synth -; //---------------------------------------------------------------------------------------- -%ifdef USE_SECTIONS -export_func _4klang_render@4 -%else -export_func _4klang_render -%endif - pushad -%ifdef SINGLE_TICK_RENDERING - mov ecx, dword[__4klang_current_tick] ; get stored current tick -%else - xor ecx, ecx -%endif -%ifdef GO4K_USE_BUFFER_RECORDINGS - push ecx -%endif -; loop all ticks -go4k_render_tickloop: - push ecx - xor ecx, ecx -; loop all samples per tick -go4k_render_sampleloop: - push ecx - xor ecx, ecx - mov ebx, go4k_synth_instructions ; // ebx = instrument command index - mov VAL, go4k_synth_parameter_values; // VAL = instrument values index - mov edi, _go4k_delay_buffer ; // get offset of first delay buffer - mov dword [_go4k_delay_buffer_ofs], edi ; // store offset in delaybuffer offset variable - mov edi, go4k_synth_wrk ; // edi = first instrument -; loop all instruments -go4k_render_instrumentloop: - mov eax, dword [esp] ; // eax = current tick sample - and eax, eax - jnz go4k_render_instrument_process ; // tick change? (first sample in current tick) - call go4kUpdateInstrument ; // update instrument state -; process instrument -go4k_render_instrument_process: - call go4kRenderVoices - inc ecx - cmp cl, byte MAX_INSTRUMENTS - jl go4k_render_instrumentloop - mov dword [edi+4], ecx ; // move a value != 0 into note slot, so processing will be done - call go4k_VM_process ; // call synth vm for synth -go4k_render_output_sample: -%ifdef GO4K_USE_BUFFER_RECORDINGS - inc dword [esp+8] - xchg esi, dword [esp+48] ; // edx = destbuffer -%else - xchg esi, dword [esp+44] ; // edx = destbuffer -%endif -%ifdef GO4K_CLIP_OUTPUT - fld dword [edi-8] - fld1 ; // 1 val - fucomi st1 ; // 1 val - jbe short go4k_render_clip1 - fchs ; // -1 val - fucomi st1 ; // -1 val - fcmovb st0, st1 ; // val -1 (if val > -1) -go4k_render_clip1: - fstp st1 ; // newval -%ifdef GO4K_USE_16BIT_OUTPUT - push eax - fmul dword [c_32767] - fistp dword [esp] - pop eax - mov word [esi],ax ; // store integer converted left sample - lodsw -%else - fstp dword [esi] ; // store left sample - lodsd -%endif - fld dword [edi-4] - fld1 ; // 1 val - fucomi st1 ; // 1 val - jbe short go4k_render_clip2 - fchs ; // -1 val - fucomi st1 ; // -1 val - fcmovb st0, st1 ; // val -1 (if val > -1) -go4k_render_clip2: - fstp st1 ; // newval -%ifdef GO4K_USE_16BIT_OUTPUT - push eax - fmul dword [c_32767] - fistp dword [esp] - pop eax - mov word [esi],ax ; // store integer converted right sample - lodsw -%else - fstp dword [esi] ; // store right sample - lodsd -%endif -%else - fld dword [edi-8] -%ifdef GO4K_USE_16BIT_OUTPUT - push eax - fmul dword [c_32767] - fistp dword [esp] - pop eax - mov word [esi],ax ; // store integer converted left sample - lodsw -%else - fstp dword [esi] ; // store left sample - lodsd -%endif - fld dword [edi-4] -%ifdef GO4K_USE_16BIT_OUTPUT - push eax - fmul dword [c_32767] - fistp dword [esp] - pop eax - mov word [esi],ax ; // store integer converted right sample - lodsw -%else - fstp dword [esi] ; // store right sample - lodsd -%endif -%endif -%ifdef GO4K_USE_BUFFER_RECORDINGS - xchg esi, dword [esp+48] -%else - xchg esi, dword [esp+44] -%endif - pop ecx - inc ecx -%ifdef GO4K_USE_GROOVE_PATTERN - mov ebx, dword SAMPLES_PER_TICK - mov eax, dword [esp] - and eax, 0x0f - bt dword [go4k_groove_pattern],eax - jnc go4k_render_nogroove - sub ebx, dword 3000 -go4k_render_nogroove: - cmp ecx, ebx -%else - cmp ecx, dword SAMPLES_PER_TICK -%endif - jl go4k_render_sampleloop - pop ecx - inc ecx -%ifdef AUTHORING - mov dword[__4klang_current_tick], ecx -%endif - cmp ecx, dword MAX_TICKS -%ifdef SINGLE_TICK_RENDERING - jl no_loop_yet - mov dword[__4klang_current_tick], 0 ; loop if at MAX_TICKS -no_loop_yet: -%else - jl go4k_render_tickloop -%endif -%ifdef GO4K_USE_BUFFER_RECORDINGS - pop ecx -%endif - popad - ret 4 - -%ifdef USE_SECTIONS -section .g4kcodz code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // the magic behind it :) -; //---------------------------------------------------------------------------------------- -; // IN : edi = instrument pointer -; // IN : esi = instrumet values -; // IN : ebx = instrument instructions -; // OUT : -; // DIRTY : -; //---------------------------------------------------------------------------------------- -go4k_VM_process: - lea WRK, [edi+8] ; // get current workspace pointer - mov ecx, WRK ; // ecx = workspace start -go4k_VM_process_loop: - movzx eax, byte [ebx] ; // get command byte - inc ebx - test eax, eax - je go4k_VM_process_done ; // command byte = 0? so done - call dword [eax*4+go4k_synth_commands] - add WRK, MAX_UNIT_SLOTS*4 ; // go to next workspace slot - jmp short go4k_VM_process_loop -go4k_VM_process_done: - add edi, go4k_instrument.size ; // go to next instrument voice - ret \ No newline at end of file diff --git a/4klang_source/Go4kVSTi/win/4klang.inc b/4klang_source/Go4kVSTi/win/4klang.inc deleted file mode 100644 index 1208a3f..0000000 --- a/4klang_source/Go4kVSTi/win/4klang.inc +++ /dev/null @@ -1,971 +0,0 @@ -; //---------------------------------------------------------------------------------------- -; // useful macros -; //---------------------------------------------------------------------------------------- -; // export function (make it accessable from main.cpp) -; //---------------------------------------------------------------------------------------- -%macro export_func 1 - global _%1 - _%1: -%endmacro -;%define USE_SECTIONS -; //---------------------------------------------------------------------------------------- -; // basic defines for the song/synth -; //---------------------------------------------------------------------------------------- -%define SAMPLE_RATE 44100 -%define MAX_INSTRUMENTS 9 -%define MAX_VOICES 1 -%define HLD 1 ; // can be adjusted to give crinkler some other possibilities -%define BPM 100 -%define MAX_PATTERNS 62 -%define PATTERN_SIZE_SHIFT 4 -%define PATTERN_SIZE (1 << PATTERN_SIZE_SHIFT) -%define MAX_TICKS (MAX_PATTERNS*PATTERN_SIZE) -%define SAMPLES_PER_TICK (SAMPLE_RATE*4*60/(BPM*16)) -%define DEF_LFO_NORMALIZE 0.000038 -%define MAX_SAMPLES (SAMPLES_PER_TICK*MAX_TICKS) -; //---------------------------------------------------------------------------------------- -; // some defines for unit usage, which reduce synth code size -; //---------------------------------------------------------------------------------------- -;%define GO4K_USE_16BIT_OUTPUT ; // removing this will output to 32bit floating point buffer -;%define GO4K_USE_GROOVE_PATTERN ; // removing this skips groove pattern code -;%define GO4K_USE_ENVELOPE_RECORDINGS ; // removing this skips envelope recording code -;%define GO4K_USE_NOTE_RECORDINGS ; // removing this skips note recording code -%define GO4K_USE_UNDENORMALIZE ; // removing this skips denormalization code in the units -%define GO4K_CLIP_OUTPUT ; // removing this skips clipping code for the final output -%define GO4K_USE_DST ; // removing this will skip DST unit -%define GO4K_USE_DLL ; // removing this will skip DLL unit -%define GO4K_USE_PAN ; // removing this will skip PAN unit -%define GO4K_USE_GLOBAL_DLL ; // removing this will skip global dll processing -%define GO4K_USE_FSTG ; // removing this will skip global store unit -%define GO4K_USE_FLD ; // removing this will skip float load unit -%define GO4K_USE_GLITCH ; // removing this will skip GLITCH unit -%define GO4K_USE_ENV_CHECK ; // removing this skips checks if processing is needed -%define GO4K_USE_ENV_MOD_GM ; // removing this will skip env gain modulation code -%define GO4K_USE_ENV_MOD_ADR ; // removing this will skip env attack/decay/release modulation code -%define GO4K_USE_VCO_CHECK ; // removing this skips checks if processing is needed -%define GO4K_USE_VCO_PHASE_OFFSET ; // removing this will skip initial phase offset code -%define GO4K_USE_VCO_SHAPE ; // removing this skips waveshaping code -%define GO4K_USE_VCO_GATE ; // removing this skips gate code -%define GO4K_USE_VCO_MOD_FM ; // removing this skips frequency modulation code -%define GO4K_USE_VCO_MOD_PM ; // removing this skips phase modulation code -%define GO4K_USE_VCO_MOD_TM ; // removing this skips transpose modulation code -%define GO4K_USE_VCO_MOD_DM ; // removing this skips detune modulation code -%define GO4K_USE_VCO_MOD_CM ; // removing this skips color modulation code -%define GO4K_USE_VCO_MOD_GM ; // removing this skips gain modulation code -%define GO4K_USE_VCO_MOD_SM ; // removing this skips shaping modulation code -%define GO4K_USE_VCO_STEREO ; // removing this skips stereo code -%define GO4K_USE_VCF_CHECK ; // removing this skips checks if processing is needed -%define GO4K_USE_VCF_MOD_FM ; // removing this skips frequency modulation code -%define GO4K_USE_VCF_MOD_RM ; // removing this skips resonance modulation code -%define GO4K_USE_VCF_HIGH ; // removing this skips code for high output -%define GO4K_USE_VCF_BAND ; // removing this skips code for band output -%define GO4K_USE_VCF_PEAK ; // removing this skips code for peak output -%define GO4K_USE_VCF_STEREO ; // removing this skips code for stereo filter output -%define GO4K_USE_DST_CHECK ; // removing this skips checks if processing is needed -%define GO4K_USE_DST_SH ; // removing this skips sample and hold code -%define GO4K_USE_DST_MOD_DM ; // removing this skips distortion modulation code -%define GO4K_USE_DST_MOD_SH ; // removing this skips sample and hold modulation code -%define GO4K_USE_DST_STEREO ; // removing this skips stereo processing -%define GO4K_USE_DLL_NOTE_SYNC ; // removing this will skip delay length adjusting code (karplus strong) -%define GO4K_USE_DLL_CHORUS ; // removing this will skip delay chorus/flanger code -%define GO4K_USE_DLL_CHORUS_CLAMP ; // removing this will skip chorus lfo phase clamping -%define GO4K_USE_DLL_DAMP ; // removing this will skip dll damping code -%define GO4K_USE_DLL_DC_FILTER ; // removing this will skip dll dc offset removal code -%define GO4K_USE_FSTG_CHECK ; // removing this skips checks if processing is needed -%define GO4K_USE_PAN_MOD ; // removing this will skip panning modulation code -%define GO4K_USE_OUT_MOD_AM ; // removing this skips output aux send modulation code -%define GO4K_USE_OUT_MOD_GM ; // removing this skips output gain modulation code -%define GO4K_USE_WAVESHAPER_CLIP ; // removing this will skip clipping code -%define GO4K_USE_FLD_MOD_VM ; // removing this will skip float load modulation code -%define GO4K_USE_DLL_MOD ; // define this to enable modulations for delay line -%define GO4K_USE_DLL_MOD_PM ; // define this to enable pregain modulation for delay line -%define GO4K_USE_DLL_MOD_FM ; // define this to enable feebback modulation for delay line -%define GO4K_USE_DLL_MOD_IM ; // define this to enable dry modulation for delay line -%define GO4K_USE_DLL_MOD_DM ; // define this to enable damping modulation for delay line -%define GO4K_USE_DLL_MOD_SM ; // define this to enable lfo freq modulation for delay line -%define GO4K_USE_DLL_MOD_AM ; // define this to enable lfo depth modulation for delay line - -; //---------------------------------------------------------------------------------------- -; // synth defines -; //---------------------------------------------------------------------------------------- -%define MAX_DELAY 65536 -%define MAX_UNITS 64 -%define MAX_UNIT_SLOTS 16 -%define GO4K_BEGIN_CMDDEF(def_name) -%define GO4K_END_CMDDEF db 0 -%define GO4K_BEGIN_PARAMDEF(def_name) -%define GO4K_END_PARAMDEF -; //---------------------------------------------------------------------------------------- -; // ENV structs -; //---------------------------------------------------------------------------------------- -GO4K_ENV_ID equ 1 -%macro GO4K_ENV 5 - db %1 - db %2 - db %3 - db %4 - db %5 -%endmacro -%define ATTAC(val) val -%define DECAY(val) val -%define SUSTAIN(val) val -%define RELEASE(val) val -%define GAIN(val) val -struc go4kENV_val -;// unit paramters - .attac resd 1 - .decay resd 1 - .sustain resd 1 - .release resd 1 - .gain resd 1 - .size -endstruc -struc go4kENV_wrk -;// work variables - .state resd 1 - .level resd 1 -;// modulation targets - .gm resd 1 - .am resd 1 - .dm resd 1 - .sm resd 1 - .rm resd 1 - .size -endstruc -%define ENV_STATE_ATTAC 0 -%define ENV_STATE_DECAY 1 -%define ENV_STATE_SUSTAIN 2 -%define ENV_STATE_RELEASE 3 -%define ENV_STATE_OFF 4 -; //---------------------------------------------------------------------------------------- -; // VCO structs -; //---------------------------------------------------------------------------------------- -GO4K_VCO_ID equ 2 - -%macro GO4K_VCO 8 - db %1 - db %2 -%ifdef GO4K_USE_VCO_PHASE_OFFSET - db %3 -%endif -%ifdef GO4K_USE_VCO_GATE - db %4 -%endif - db %5 -%ifdef GO4K_USE_VCO_SHAPE - db %6 -%else -%endif - db %7 - db %8 -%endmacro -%define TRANSPOSE(val) val -%define DETUNE(val) val -%define PHASE(val) val -%define GATES(val) val -%define COLOR(val) val -%define SHAPE(val) val -%define FLAGS(val) val -%define SINE 0x01 -%define TRISAW 0x02 -%define PULSE 0x04 -%define NOISE 0x08 -%define LFO 0x10 -%define GATE 0x20 -%define VCO_STEREO 0x40 -struc go4kVCO_val -;// unit paramters - .transpose resd 1 - .detune resd 1 -%ifdef GO4K_USE_VCO_PHASE_OFFSET - .phaseofs resd 1 -%endif -%ifdef GO4K_USE_VCO_GATE - .gate resd 1 -%endif - .color resd 1 -%ifdef GO4K_USE_VCO_SHAPE - .shape resd 1 -%endif - .gain resd 1 - .flags resd 1 - .size -endstruc -struc go4kVCO_wrk -;// work variables - .phase resd 1 -;// modulation targets - .tm resd 1 - .dm resd 1 - .fm resd 1 - .pm resd 1 - .cm resd 1 - .sm resd 1 - .gm resd 1 -;// stero variables - .phase2 resd 1 - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // VCF structs -; //---------------------------------------------------------------------------------------- -GO4K_VCF_ID equ 3 -%macro GO4K_VCF 3 - db %1 - db %2 - db %3 -%endmacro -%define LOWPASS 0x1 -%define HIGHPASS 0x2 -%define BANDPASS 0x4 -%define BANDSTOP 0x3 -%define ALLPASS 0x7 -%define PEAK 0x8 -%define STEREO 0x10 -%define FREQUENCY(val) val -%define RESONANCE(val) val -%define VCFTYPE(val) val -struc go4kVCF_val -;// unit paramters - .freq resd 1 - .res resd 1 - .type resd 1 - .size -endstruc -struc go4kVCF_wrk -;// work variables - .low resd 1 - .high resd 1 - .band resd 1 - .freq resd 1 ;// unused but kept so modulation target offsets stay same -;// modulation targets - .fm resd 1 - .rm resd 1 -;// stereo variables - .low2 resd 1 - .high2 resd 1 - .band2 resd 1 - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // DST structs -; //---------------------------------------------------------------------------------------- -GO4K_DST_ID equ 4 -%macro GO4K_DST 3 - db %1 -%ifdef GO4K_USE_DST_SH - db %2 - %ifdef GO4K_USE_DST_STEREO - db %3 - %endif -%else - %ifdef GO4K_USE_DST_STEREO - db %3 - %endif -%endif -%endmacro -%define DRIVE(val) val -%define SNHFREQ(val) val -%define FLAGS(val) val -struc go4kDST_val -;// unit paramters - .drive resd 1 -%ifdef GO4K_USE_DST_SH - .snhfreq resd 1 -%endif - .flags resd 1 - .size -endstruc -struc go4kDST_wrk -;// work variables - .out resd 1 - .snhphase resd 1 -;// modulation targets - .dm resd 1 - .sm resd 1 -;// stereo variables - .out2 resd 1 - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // DLL structs -; //---------------------------------------------------------------------------------------- -GO4K_DLL_ID equ 5 -%macro GO4K_DLL 8 - db %1 - db %2 - db %3 -%ifdef GO4K_USE_DLL_DAMP - db %4 -%endif -%ifdef GO4K_USE_DLL_CHORUS - db %5 - db %6 -%endif - db %7 - db %8 -%endmacro -%define PREGAIN(val) val -%define DRY(val) val -%define FEEDBACK(val) val -%define DEPTH(val) val -%define DAMP(val) val -%define DELAY(val) val -%define COUNT(val) val -struc go4kDLL_val -;// unit paramters - .pregain resd 1 - .dry resd 1 - .feedback resd 1 -%ifdef GO4K_USE_DLL_DAMP - .damp resd 1 -%endif -%ifdef GO4K_USE_DLL_CHORUS - .freq resd 1 - .depth -%endif - .delay resd 1 - .count resd 1 - .size -endstruc -struc go4kDLL_wrk -;// work variables - .index resd 1 - .store resd 1 - .dcin resd 1 - .dcout resd 1 - .phase resd 1 -;// the delay buffer - .buffer resd MAX_DELAY - .size -endstruc -struc go4kDLL_wrk2 -;// modulation targets - .pm resd 1 - .fm resd 1 - .im resd 1 - .dm resd 1 - .sm resd 1 - .am resd 1 - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // FOP structs -; //---------------------------------------------------------------------------------------- -GO4K_FOP_ID equ 6 -%macro GO4K_FOP 1 - db %1 -%endmacro -%define OP(val) val -%define FOP_POP 0x1 -%define FOP_ADDP 0x2 -%define FOP_MULP 0x3 -%define FOP_PUSH 0x4 -%define FOP_XCH 0x5 -%define FOP_ADD 0x6 -%define FOP_MUL 0x7 -%define FOP_ADDP2 0x8 -%define FOP_LOADNOTE 0x9 -%define FOP_MULP2 0xa -struc go4kFOP_val - .flags resd 1 - .size -endstruc -struc go4kFOP_wrk - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // FST structs -; //---------------------------------------------------------------------------------------- -GO4K_FST_ID equ 7 -%macro GO4K_FST 2 - db %1 - dw %2 -%endmacro -%define AMOUNT(val) val -%define DEST(val) val -%define FST_SET 0x0000 -%define FST_ADD 0x4000 -%define FST_POP 0x8000 -struc go4kFST_val - .amount resd 1 - .op1 resd 1 - .size -endstruc -struc go4kFST_wrk - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // PAN structs -; //---------------------------------------------------------------------------------------- -GO4K_PAN_ID equ 8 -%macro GO4K_PAN 1 -%ifdef GO4K_USE_PAN - db %1 -%endif -%endmacro -%define PANNING(val) val -struc go4kPAN_val -%ifdef GO4K_USE_PAN - .panning resd 1 -%endif - .size -endstruc -struc go4kPAN_wrk -;// modulation targets - .pm resd 1 - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // OUT structs -; //---------------------------------------------------------------------------------------- -GO4K_OUT_ID equ 9 -%macro GO4K_OUT 2 - db %1 -%ifdef GO4K_USE_GLOBAL_DLL - db %2 -%endif -%endmacro -%define AUXSEND(val) val -struc go4kOUT_val - .gain resd 1 -%ifdef GO4K_USE_GLOBAL_DLL - .auxsend resd 1 -%endif - .size -endstruc -struc go4kOUT_wrk -;// modulation targets - .am resd 1 - .gm resd 1 - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // ACC structs (this is for the synth def only) -; //---------------------------------------------------------------------------------------- -GO4K_ACC_ID equ 10 -%macro GO4K_ACC 1 - db %1 -%endmacro -%define OUTPUT 0 -%define AUX 8 -%define ACCTYPE(val) val -struc go4kACC_val - .acctype resd 1 - .size -endstruc -struc go4kACC_wrk - .size -endstruc -%ifdef GO4K_USE_FLD -; //---------------------------------------------------------------------------------------- -; // FLD structs -; //---------------------------------------------------------------------------------------- -GO4K_FLD_ID equ 11 -%macro GO4K_FLD 1 - db %1 -%endmacro -%define VALUE(val) val -struc go4kFLD_val - .value resd 1 - .size -endstruc -struc go4kFLD_wrk -;// modulation targets - .vm resd 1 - .size -endstruc -%endif -%ifdef GO4K_USE_GLITCH -; //---------------------------------------------------------------------------------------- -; // GLITCH structs -; //---------------------------------------------------------------------------------------- -GO4K_GLITCH_ID equ 12 -%macro GO4K_GLITCH 5 - db %1 - db %2 - db %3 - db %4 - db %5 -%endmacro -%define ACTIVE(val) val -%define SLICEFACTOR(val)val -%define PITCHFACTOR(val)val -%define SLICESIZE(val) val -struc go4kGLITCH_val -;// unit paramters - .active resd 1 - .dry resd 1 - .dsize resd 1 - .dpitch resd 1 - .slicesize resd 1 - .size -endstruc -struc go4kGLITCH_wrk -;// work variables - .index resd 1 - .store resd 1 - .slizesize resd 1 - .slicepitch resd 1 - .unused resd 1 -;// the delay buffer - .buffer resd MAX_DELAY - .size -endstruc -struc go4kGLITCH_wrk2 -;// modulation targets - .am resd 1 - .dm resd 1 - .sm resd 1 - .pm resd 1 - .size -endstruc -%endif -%ifdef GO4K_USE_FSTG -; //---------------------------------------------------------------------------------------- -; // FSTG structs -; //---------------------------------------------------------------------------------------- -GO4K_FSTG_ID equ 13 -%macro GO4K_FSTG 2 - db %1 - dw %2 -%endmacro -struc go4kFSTG_val - .amount resd 1 - .op1 resd 1 - .size -endstruc -struc go4kFSTG_wrk - .size -endstruc -%endif -; //---------------------------------------------------------------------------------------- -; // Voice struct -; //---------------------------------------------------------------------------------------- -struc go4k_instrument - .release resd 1 - .note resd 1 - .workspace resd MAX_UNITS*MAX_UNIT_SLOTS - .dlloutl resd 1 - .dlloutr resd 1 - .outl resd 1 - .outr resd 1 - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // Synth struct -; //---------------------------------------------------------------------------------------- -struc go4k_synth - .instruments resb go4k_instrument.size * MAX_INSTRUMENTS * MAX_VOICES - .global resb go4k_instrument.size * MAX_VOICES - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // Pattern Data, reduced by 967 patterns -; //---------------------------------------------------------------------------------------- -%ifdef USE_SECTIONS -section .g4kmuc1 data align=1 -%else -section .data align=1 -%endif -go4k_patterns - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - db 76, HLD, HLD, HLD, 0, 0, 0, 0, 79, HLD, HLD, HLD, 0, 0, 0, 0, - db 69, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, 0, 0, 0, 0, - db 76, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db 81, HLD, HLD, HLD, 0, 0, 0, 0, 79, HLD, HLD, HLD, 0, 0, 0, 0, - db 84, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, 0, 0, 0, 0, - db 76, HLD, HLD, HLD, 0, 0, 0, 0, 88, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, - db 76, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, 0, 0, 0, 0, - db 52, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db 60, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db 64, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db 69, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db 72, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db 40, 52, HLD, 64, HLD, 40, 52, 64, 52, HLD, HLD, HLD, 0, 0, 0, 0, - db 57, 0, 0, 57, 0, 0, 69, 0, 0, 69, 0, 0, 57, HLD, HLD, HLD, - db 52, 64, 0, 57, 0, 69, 48, 0, 48, HLD, HLD, HLD, 0, 0, 0, 0, - db 40, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db 40, 52, HLD, 40, HLD, 40, 40, 40, 52, HLD, HLD, HLD, 0, 0, 0, 0, - db 40, 0, 0, 52, 0, 0, 40, 0, 52, 40, 0, 52, 0, 40, 0, 0, - db 45, 0, 0, 57, 0, 0, 45, 0, 57, 45, 0, 57, 0, 45, 0, 0, - db 48, 0, 0, 60, 0, 0, 48, 0, 60, 48, 0, 60, 0, 48, 0, 0, - db 40, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, - db 45, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, - db 36, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, - db 0, 0, 0, 0, 60, HLD, 0, 0, 0, 0, 0, 0, 60, HLD, 0, 0, - db 60, HLD, 0, 0, 0, 0, 60, HLD, 0, 0, 60, HLD, 60, HLD, 0, 0, - db 0, 0, 0, 0, 60, HLD, 0, 0, 0, 0, 0, 0, 60, HLD, 60, HLD, - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, HLD, 0, 0, - db 60, HLD, 60, HLD, 0, 0, 60, HLD, 0, 0, 0, 0, 60, HLD, 0, 0, - db 0, 0, 60, HLD, 0, 0, 0, 0, 60, HLD, 0, 0, 0, 0, 0, 0, - db 0, 0, 60, HLD, 0, 0, 0, 0, 60, HLD, 0, 0, 60, HLD, 0, 0, - db 0, 0, 0, 60, HLD, 0, 0, 0, 0, 0, 0, 0, 60, HLD, 0, 0, - db 0, 0, 0, 60, HLD, 0, 0, 0, 0, 60, HLD, 60, 60, HLD, 0, 0, - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, - db 91, 0, 0, 88, 0, 0, 76, 0, 81, 0, 0, 0, 0, 0, 0, 0, - db 81, 0, 0, 84, 0, 0, 86, 0, 88, 0, 0, 0, 0, 0, 0, 0, - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, - db 81, 0, 0, 84, 0, 0, 86, 0, 81, 0, 0, 0, 0, 0, 0, 0, - db 84, 0, 0, 86, 0, 0, 88, 0, 0, 91, 0, 0, 84, 0, 0, 0, - db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, -go4k_patterns_end -; //---------------------------------------------------------------------------------------- -; // Pattern Index List -; //---------------------------------------------------------------------------------------- -%ifdef USE_SECTIONS -section .g4kmuc2 data align=1 -%else -section .data -%endif -go4k_pattern_lists -Instrument0List db 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 1, 2, 3, 0, 4, 5, 6, 7, 8, 2, 9, 0, 0, 0, -Instrument1List db 9, 7, 10, 7, 11, 7, 12, 7, 9, 7, 10, 7, 11, 7, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 13, 7, 14, 7, 3, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, -Instrument2List db 15, 0, 16, 0, 17, 0, 18, 0, 19, 0, 16, 0, 17, 0, 18, 0, 20, 20, 21, 21, 22, 22, 20, 20, 20, 20, 21, 21, 22, 22, 20, 20, 23, 15, 24, 16, 25, 17, 18, 0, 20, 20, 21, 21, 22, 22, 20, 20, 20, 20, 21, 21, 22, 22, 20, 20, 20, 20, 0, 0, 0, 0, -Instrument3List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, -Instrument4List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 26, 27, 26, 27, 26, 27, 28, 27, 26, 27, 26, 27, 26, 27, 28, 27, 29, 27, 29, 27, 29, 27, 29, 27, 26, 27, 26, 27, 26, 27, 28, 27, 26, 27, 26, 27, 26, 27, 28, 27, 26, 27, 0, 0, 0, -Instrument5List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 0, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 0, 0, -Instrument6List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 0, 0, 0, 0, -Instrument7List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 36, 0, 37, 38, 36, 0, 39, 35, 36, 0, 37, 38, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, -Instrument8List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 41, 0, -go4k_pattern_lists_end -; //---------------------------------------------------------------------------------------- -; // Instrument Commands -; //---------------------------------------------------------------------------------------- -%ifdef USE_SECTIONS -section .g4kmuc3 data align=1 -%else -section .data -%endif -go4k_synth_instructions -GO4K_BEGIN_CMDDEF(Instrument0) - db GO4K_ENV_ID - db GO4K_FST_ID - db GO4K_VCO_ID - db GO4K_VCO_ID - db GO4K_VCO_ID - db GO4K_FST_ID - db GO4K_FST_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_VCF_ID - db GO4K_VCF_ID - db GO4K_DST_ID - db GO4K_PAN_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument1) - db GO4K_ENV_ID - db GO4K_FST_ID - db GO4K_VCO_ID - db GO4K_VCO_ID - db GO4K_VCO_ID - db GO4K_FST_ID - db GO4K_FST_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_VCF_ID - db GO4K_VCF_ID - db GO4K_DST_ID - db GO4K_PAN_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument2) - db GO4K_ENV_ID - db GO4K_FST_ID - db GO4K_VCO_ID - db GO4K_VCO_ID - db GO4K_VCO_ID - db GO4K_FST_ID - db GO4K_FST_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_VCF_ID - db GO4K_VCF_ID - db GO4K_DST_ID - db GO4K_PAN_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument3) - db GO4K_ENV_ID - db GO4K_FST_ID - db GO4K_VCO_ID - db GO4K_FOP_ID - db GO4K_VCF_ID - db GO4K_PAN_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument4) - db GO4K_ENV_ID - db GO4K_FST_ID - db GO4K_ENV_ID - db GO4K_DST_ID - db GO4K_FST_ID - db GO4K_FOP_ID - db GO4K_VCO_ID - db GO4K_FOP_ID - db GO4K_PAN_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument5) - db GO4K_ENV_ID - db GO4K_VCO_ID - db GO4K_FOP_ID - db GO4K_VCF_ID - db GO4K_PAN_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument6) - db GO4K_ENV_ID - db GO4K_FST_ID - db GO4K_ENV_ID - db GO4K_FST_ID - db GO4K_FST_ID - db GO4K_FOP_ID - db GO4K_VCO_ID - db GO4K_VCO_ID - db GO4K_VCO_ID - db GO4K_VCF_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_VCF_ID - db GO4K_PAN_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument7) - db GO4K_ENV_ID - db GO4K_VCO_ID - db GO4K_FOP_ID - db GO4K_PAN_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument8) - db GO4K_ENV_ID - db GO4K_VCO_ID - db GO4K_FOP_ID - db GO4K_FSTG_ID - db GO4K_FSTG_ID - db GO4K_FOP_ID -GO4K_END_CMDDEF -;// global commands -GO4K_BEGIN_CMDDEF(Global) - db GO4K_ACC_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_ACC_ID - db GO4K_FOP_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -go4k_synth_instructions_end -; //---------------------------------------------------------------------------------------- -; // Intrument Data -; //---------------------------------------------------------------------------------------- -%ifdef USE_SECTIONS -section .g4kmuc4 data align=1 -%else -section .data -%endif -go4k_synth_parameter_values -GO4K_BEGIN_PARAMDEF(Instrument0) - GO4K_ENV ATTAC(72),DECAY(96),SUSTAIN(96),RELEASE(88),GAIN(128) - GO4K_FST AMOUNT(64),DEST(0*MAX_UNIT_SLOTS+2) - GO4K_VCO TRANSPOSE(64),DETUNE(60),PHASE(32),GATES(0),COLOR(80),SHAPE(64),GAIN(128),FLAGS(PULSE) - GO4K_VCO TRANSPOSE(64),DETUNE(72),PHASE(32),GATES(0),COLOR(96),SHAPE(64),GAIN(128),FLAGS(TRISAW) - GO4K_VCO TRANSPOSE(32),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(96),GAIN(128),FLAGS(SINE|LFO) - GO4K_FST AMOUNT(68),DEST(2*MAX_UNIT_SLOTS+2) - GO4K_FST AMOUNT(61),DEST(3*MAX_UNIT_SLOTS+2) - GO4K_FOP OP(FOP_POP) - GO4K_FOP OP(FOP_ADDP) - GO4K_FOP OP(FOP_MULP) - GO4K_VCF FREQUENCY(26),RESONANCE(128),VCFTYPE(PEAK) - GO4K_VCF FREQUENCY(64),RESONANCE(64),VCFTYPE(LOWPASS) - GO4K_DST DRIVE(104), SNHFREQ(128), FLAGS(0) - GO4K_PAN PANNING(64) - GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(96),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(16),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_OUT GAIN(0), AUXSEND(32) -GO4K_END_PARAMDEF -GO4K_BEGIN_PARAMDEF(Instrument1) - GO4K_ENV ATTAC(72),DECAY(96),SUSTAIN(96),RELEASE(88),GAIN(128) - GO4K_FST AMOUNT(64),DEST(0*MAX_UNIT_SLOTS+2) - GO4K_VCO TRANSPOSE(64),DETUNE(60),PHASE(32),GATES(0),COLOR(80),SHAPE(64),GAIN(128),FLAGS(TRISAW) - GO4K_VCO TRANSPOSE(64),DETUNE(72),PHASE(32),GATES(0),COLOR(96),SHAPE(112),GAIN(64),FLAGS(SINE) - GO4K_VCO TRANSPOSE(80),DETUNE(112),PHASE(0),GATES(0),COLOR(64),SHAPE(16),GAIN(128),FLAGS(PULSE|LFO) - GO4K_FST AMOUNT(68),DEST(2*MAX_UNIT_SLOTS+2) - GO4K_FST AMOUNT(60),DEST(3*MAX_UNIT_SLOTS+2) - GO4K_FOP OP(FOP_POP) - GO4K_FOP OP(FOP_ADDP) - GO4K_FOP OP(FOP_MULP) - GO4K_VCF FREQUENCY(80),RESONANCE(24),VCFTYPE(LOWPASS) - GO4K_VCF FREQUENCY(48),RESONANCE(24),VCFTYPE(HIGHPASS) - GO4K_DST DRIVE(64), SNHFREQ(128), FLAGS(0) - GO4K_PAN PANNING(64) - GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(96),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(16),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_OUT GAIN(0), AUXSEND(32) -GO4K_END_PARAMDEF -GO4K_BEGIN_PARAMDEF(Instrument2) - GO4K_ENV ATTAC(32),DECAY(64),SUSTAIN(64),RELEASE(64),GAIN(64) - GO4K_FST AMOUNT(120),DEST(0*MAX_UNIT_SLOTS+2) - GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(32),GATES(0),COLOR(80),SHAPE(64),GAIN(128),FLAGS(PULSE) - GO4K_VCO TRANSPOSE(64),DETUNE(72),PHASE(32),GATES(0),COLOR(96),SHAPE(64),GAIN(128),FLAGS(TRISAW) - GO4K_VCO TRANSPOSE(32),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(96),GAIN(128),FLAGS(SINE|LFO) - GO4K_FST AMOUNT(68),DEST(2*MAX_UNIT_SLOTS+2) - GO4K_FST AMOUNT(60),DEST(3*MAX_UNIT_SLOTS+2) - GO4K_FOP OP(FOP_POP) - GO4K_FOP OP(FOP_ADDP) - GO4K_FOP OP(FOP_MULP) - GO4K_VCF FREQUENCY(18),RESONANCE(64),VCFTYPE(PEAK) - GO4K_VCF FREQUENCY(32),RESONANCE(48),VCFTYPE(LOWPASS) - GO4K_DST DRIVE(88), SNHFREQ(128), FLAGS(0) - GO4K_PAN PANNING(64) - GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(96),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(16),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_OUT GAIN(64), AUXSEND(64) -GO4K_END_PARAMDEF -GO4K_BEGIN_PARAMDEF(Instrument3) - GO4K_ENV ATTAC(0),DECAY(76),SUSTAIN(0),RELEASE(0),GAIN(32) - GO4K_FST AMOUNT(128),DEST(0*MAX_UNIT_SLOTS+2) - GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(64),GATES(0),COLOR(64),SHAPE(64),GAIN(128),FLAGS(NOISE) - GO4K_FOP OP(FOP_MULP) - GO4K_VCF FREQUENCY(80),RESONANCE(128),VCFTYPE(LOWPASS) - GO4K_PAN PANNING(64) - GO4K_OUT GAIN(64), AUXSEND(0) -GO4K_END_PARAMDEF -GO4K_BEGIN_PARAMDEF(Instrument4) - GO4K_ENV ATTAC(0),DECAY(64),SUSTAIN(96),RELEASE(64),GAIN(128) - GO4K_FST AMOUNT(128),DEST(0*MAX_UNIT_SLOTS+2) - GO4K_ENV ATTAC(0),DECAY(70),SUSTAIN(0),RELEASE(0),GAIN(128) - GO4K_DST DRIVE(32), SNHFREQ(128), FLAGS(0) - GO4K_FST AMOUNT(80),DEST(6*MAX_UNIT_SLOTS+1) - GO4K_FOP OP(FOP_POP) - GO4K_VCO TRANSPOSE(46),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(64),GAIN(128),FLAGS(TRISAW) - GO4K_FOP OP(FOP_MULP) - GO4K_PAN PANNING(64) - GO4K_OUT GAIN(128), AUXSEND(0) -GO4K_END_PARAMDEF -GO4K_BEGIN_PARAMDEF(Instrument5) - GO4K_ENV ATTAC(0),DECAY(64),SUSTAIN(0),RELEASE(0),GAIN(128) - GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(64),GATES(0),COLOR(64),SHAPE(64),GAIN(128),FLAGS(NOISE) - GO4K_FOP OP(FOP_MULP) - GO4K_VCF FREQUENCY(128),RESONANCE(128),VCFTYPE(BANDPASS) - GO4K_PAN PANNING(64) - GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(96),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(16),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_OUT GAIN(64), AUXSEND(0) -GO4K_END_PARAMDEF -GO4K_BEGIN_PARAMDEF(Instrument6) - GO4K_ENV ATTAC(0),DECAY(72),SUSTAIN(0),RELEASE(72),GAIN(128) - GO4K_FST AMOUNT(128),DEST(0*MAX_UNIT_SLOTS+2) - GO4K_ENV ATTAC(0),DECAY(56),SUSTAIN(0),RELEASE(0),GAIN(128) - GO4K_FST AMOUNT(108),DEST(6*MAX_UNIT_SLOTS+1) - GO4K_FST AMOUNT(72),DEST(7*MAX_UNIT_SLOTS+1) - GO4K_FOP OP(FOP_POP) - GO4K_VCO TRANSPOSE(32),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(32),GAIN(64),FLAGS(SINE) - GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(80),GAIN(64),FLAGS(SINE) - GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(64),GAIN(64),FLAGS(NOISE) - GO4K_VCF FREQUENCY(104),RESONANCE(128),VCFTYPE(LOWPASS) - GO4K_FOP OP(FOP_ADDP) - GO4K_FOP OP(FOP_ADDP) - GO4K_FOP OP(FOP_MULP) - GO4K_VCF FREQUENCY(22),RESONANCE(32),VCFTYPE(HIGHPASS) - GO4K_PAN PANNING(64) - GO4K_OUT GAIN(64), AUXSEND(0) -GO4K_END_PARAMDEF -GO4K_BEGIN_PARAMDEF(Instrument7) - GO4K_ENV ATTAC(0),DECAY(0),SUSTAIN(96),RELEASE(32),GAIN(128) - GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(0),COLOR(80),SHAPE(64),GAIN(128),FLAGS(PULSE) - GO4K_FOP OP(FOP_MULP) - GO4K_PAN PANNING(64) - GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(96),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(16),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_OUT GAIN(0), AUXSEND(64) -GO4K_END_PARAMDEF -GO4K_BEGIN_PARAMDEF(Instrument8) - GO4K_ENV ATTAC(0),DECAY(0),SUSTAIN(128),RELEASE(0),GAIN(128) - GO4K_VCO TRANSPOSE(48),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(64),GAIN(128),FLAGS(TRISAW|LFO) - GO4K_FOP OP(FOP_MULP) - GO4K_FSTG AMOUNT(72),DEST(2*go4k_instrument.size*MAX_VOICES+10*MAX_UNIT_SLOTS*4+4*4+go4k_instrument.workspace) - GO4K_FSTG AMOUNT(66),DEST(1*go4k_instrument.size*MAX_VOICES+10*MAX_UNIT_SLOTS*4+4*4+go4k_instrument.workspace) - GO4K_FOP OP(FOP_POP) -GO4K_END_PARAMDEF -;// global parameters -GO4K_BEGIN_PARAMDEF(Global) - GO4K_ACC ACCTYPE(AUX) - GO4K_DLL PREGAIN(40),DRY(128),FEEDBACK(125),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(0),COUNT(8) - GO4K_FOP OP(FOP_XCH) - GO4K_DLL PREGAIN(40),DRY(128),FEEDBACK(125),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(8),COUNT(8) - GO4K_FOP OP(FOP_XCH) - GO4K_ACC ACCTYPE(OUTPUT) - GO4K_FOP OP(FOP_ADDP2) - GO4K_OUT GAIN(64), AUXSEND(0) -GO4K_END_PARAMDEF -go4k_synth_parameter_values_end -; //---------------------------------------------------------------------------------------- -; // Delay/Reverb Times -; //---------------------------------------------------------------------------------------- -%ifdef USE_SECTIONS -section .g4kmuc5 data align=1 -%else -section .data -%endif -%ifdef GO4K_USE_DLL -global _go4k_delay_times -_go4k_delay_times - dw 0 - dw 1116 - dw 1188 - dw 1276 - dw 1356 - dw 1422 - dw 1492 - dw 1556 - dw 1618 - dw 1140 - dw 1212 - dw 1300 - dw 1380 - dw 1446 - dw 1516 - dw 1580 - dw 1642 - times 100 dw 0 -%endif diff --git a/4klang_source/Go4kVSTi/win/Go4kVSTi.sln b/4klang_source/Go4kVSTi/win/Go4kVSTi.sln deleted file mode 100644 index b2034b1..0000000 --- a/4klang_source/Go4kVSTi/win/Go4kVSTi.sln +++ /dev/null @@ -1,25 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "4klang", "Go4kVSTi.vcxproj", "{107757EA-2FE1-4C5E-964F-DE7E482E253F}" -EndProject -Project("{D3783134-2AE6-4F36-A599-989377222068}") = "4klang2", "Go4kVSTi2.vcxproj", "{FA790F08-0B8E-43D9-A4B4-519AB01B820C}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {107757EA-2FE1-4C5E-964F-DE7E482E253F}.Debug|Win32.ActiveCfg = Debug|Win32 - {107757EA-2FE1-4C5E-964F-DE7E482E253F}.Debug|Win32.Build.0 = Debug|Win32 - {107757EA-2FE1-4C5E-964F-DE7E482E253F}.Release|Win32.ActiveCfg = Release|Win32 - {107757EA-2FE1-4C5E-964F-DE7E482E253F}.Release|Win32.Build.0 = Release|Win32 - {FA790F08-0B8E-43D9-A4B4-519AB01B820C}.Debug|Win32.ActiveCfg = Debug|Win32 - {FA790F08-0B8E-43D9-A4B4-519AB01B820C}.Debug|Win32.Build.0 = Debug|Win32 - {FA790F08-0B8E-43D9-A4B4-519AB01B820C}.Release|Win32.ActiveCfg = Release|Win32 - {FA790F08-0B8E-43D9-A4B4-519AB01B820C}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/4klang_source/Go4kVSTi/win/Go4kVSTi.vcproj b/4klang_source/Go4kVSTi/win/Go4kVSTi.vcproj deleted file mode 100644 index 884876e..0000000 --- a/4klang_source/Go4kVSTi/win/Go4kVSTi.vcproj +++ /dev/null @@ -1,361 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/4klang_source/Go4kVSTi/win/Go4kVSTi.vcxproj b/4klang_source/Go4kVSTi/win/Go4kVSTi.vcxproj deleted file mode 100644 index b600542..0000000 --- a/4klang_source/Go4kVSTi/win/Go4kVSTi.vcxproj +++ /dev/null @@ -1,200 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - 4klang - {107757EA-2FE1-4C5E-964F-DE7E482E253F} - Go4kVSTi - 8.1 - - - - DynamicLibrary - false - false - v140 - - - DynamicLibrary - false - v140 - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - .\$(ProjectName)\Debug\ - .\$(ProjectName)\Debug\ - true - .\$(ProjectName)\Release\ - .\$(ProjectName)\Release\ - false - false - false - AllRules.ruleset - - - AllRules.ruleset - - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Debug/vstxsynth.tlb - - - Disabled - ..\source\common;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;WINDOWS=1;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) - Sync - EnableFastChecks - MultiThreadedDebug - 1Byte - true - Fast - - - - - Level3 - true - ProgramDatabase - Default - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - odbc32.lib;odbccp32.lib;comctl32.lib;%(AdditionalDependencies) - true - .\Go4kVSTi.def - true - Windows - false - - - - - copy /Y $(TargetPath) C:\VST - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Release/vstxsynth.tlb - - - Disabled - AnySuitable - true - Speed - false - ..\source\common;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;WINDOWS=1;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) - true - Sync - MultiThreaded - 1Byte - false - false - NotSet - Fast - true - - - - - Level3 - true - - - Cdecl - Default - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - odbc32.lib;odbccp32.lib;comctl32.lib;%(AdditionalDependencies) - true - .\Go4kVSTi.def - Windows - false - - - - - copy /Y $(TargetPath) C:\VST - - - - - - - - Cdecl - - - Cdecl - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - \ No newline at end of file diff --git a/4klang_source/Go4kVSTi/win/Go4kVSTi.vcxproj.filters b/4klang_source/Go4kVSTi/win/Go4kVSTi.vcxproj.filters deleted file mode 100644 index 41cc7d4..0000000 --- a/4klang_source/Go4kVSTi/win/Go4kVSTi.vcxproj.filters +++ /dev/null @@ -1,78 +0,0 @@ - - - - - {1cf4fa67-2860-48e5-9e8b-29b87a918b97} - cpp;c;cxx;rc;def;r;odl;idl;hpj;bat - - - {8c759cfb-040e-43f2-a0c5-3f00eb100142} - h;hpp;hxx;hm;inl - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - - - - - - - \ No newline at end of file diff --git a/4klang_source/Go4kVSTi/win/Go4kVSTi2.rc b/4klang_source/Go4kVSTi/win/Go4kVSTi2.rc deleted file mode 100644 index 65a314d..0000000 --- a/4klang_source/Go4kVSTi/win/Go4kVSTi2.rc +++ /dev/null @@ -1,1432 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "WinResrc.h" -#define IDC_STATIC -1 - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// German (Germany) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) -LANGUAGE LANG_GERMAN, SUBLANG_GERMAN -#pragma code_page(1252) - -///////////////////////////////////////////////////////////////////////////// -// -// BINARY -// - -IDR_COMP_RES BINARY "nasmw.bin" -IDR_ASM_RES BINARY "4klang.bin" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_GO4KVSTIDIALOG DIALOGEX 0, 0, 594, 341 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_ACCEPTFILES -CAPTION "Alcatraz - 8klang Synth Plugin (4klang addon) - Version 3.2.2" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - PUSHBUTTON "Load Patch Data",IDC_LOAD_PATCH,13,13,70,14 - PUSHBUTTON "Save Patch Data",IDC_SAVE_PATCH,85,13,70,14 - PUSHBUTTON "Reset Patch Data",IDC_RESET_PATCH,157,13,70,14 - PUSHBUTTON "Load Instrument",IDC_LOAD_INSTRUMENT,13,31,70,14 - PUSHBUTTON "Save Instrument",IDC_SAVE_INSTRUMENT,85,31,70,14 - PUSHBUTTON "Reset Instrument",IDC_RESET_INSTRUMENT,157,31,70,14 - LTEXT "Instrument Name",IDC_STATIC,242,31,56,8 - LTEXT "Instrument",IDC_STATIC,242,17,36,8 - EDITTEXT IDC_INSTRUMENT_NAME,301,28,84,14,ES_AUTOHSCROLL - COMBOBOX IDC_INSTRUMENT,301,14,85,184,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - LTEXT "0",IDC_VOICECOUNT1,333,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT2,349,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT3,365,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT4,381,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT5,397,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT6,413,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT7,429,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT8,445,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT9,461,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT10,477,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT11,493,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT12,509,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT13,525,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT14,541,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT15,557,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT16,573,322,14,12,0,WS_EX_STATICEDGE - LTEXT "Activated Voices",IDC_STATIC,278,324,54,8 - PUSHBUTTON "Record",IDC_RECORD_BUTTON,449,10,62,14 - PUSHBUTTON "Stop",IDC_STOP_BUTTON,449,24,62,14,WS_DISABLED - CONTROL "Solo",IDC_SOLO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,398,24,29,10 - GROUPBOX "4k Export",IDC_STATIC,437,0,150,66 - COMBOBOX IDC_PATTERN_SIZE,479,38,33,94,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Current Unit",IDC_MODULE_SETTINGS,277,61,310,202 - CONTROL "",IDC_MAINTAB,"SysTabControl32",0x0,7,53,266,281 - GROUPBOX "Load/Save",IDC_STATIC,7,3,225,47 - PUSHBUTTON "PANIC!",IDC_PANIC,278,288,309,29 - GROUPBOX "Instrument Properties",IDC_STATIC,237,3,195,57 - COMBOBOX IDC_POLYPHONY,333,270,71,97,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - LTEXT "Polyphony",IDC_STATIC,278,272,34,8 - LTEXT "Pattern",IDC_STATIC,450,41,25,8 - PUSHBUTTON "Reset",IDC_UNIT_RESET,303,72,50,14 - PUSHBUTTON "Copy",IDC_UNIT_COPY,355,72,50,14 - PUSHBUTTON "Paste",IDC_UNIT_PASTE,407,72,50,14 - PUSHBUTTON "Load",IDC_UNIT_LOAD,459,72,50,14 - PUSHBUTTON "Save",IDC_UNIT_SAVE,511,72,50,14 - CONTROL "Always on top",IDC_ALWAYSONTOP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,527,267,64,20 - CONTROL "Record Notes",IDC_NOTEVALUES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,516,32,57,10 - CONTROL "Undenormalize",IDC_UNDENORMALIZE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,516,14,61,10 - CONTROL "Clip Output",IDC_CLIPOUTPUT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,516,5,52,10 - CONTROL "Record Envs",IDC_ENVLEVELS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,516,23,57,10 - CONTROL "16Bit Output",IDC_16BIT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,516,41,57,10 - CTEXT "Static",IDC_ISTACK_VALID,11,321,241,9 - CTEXT "Static",IDC_GSTACK_VALID,11,321,241,9 - COMBOBOX IDC_PATTERN_QUANT,479,51,33,94,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - LTEXT "Quant.",IDC_STATIC,449,54,24,8 - COMBOBOX IDC_OBJFORMAT,515,51,66,72,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - LTEXT "Link To",IDC_STATIC,241,47,23,8 - COMBOBOX IDC_INSTRUMENTLINK,301,44,85,184,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - CONTROL "Stayalive Noise while Recording",IDC_RECORDBUSYSIGNAL, - "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,431,267,64,21 -END - -IDD_VCO DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Oscillator",IDC_STATIC,0,0,300,170 - PUSHBUTTON "Sine",IDC_VCO_SINE,6,27,50,14,WS_DISABLED - PUSHBUTTON "Tri/Saw",IDC_VCO_TRISAW,56,27,50,14 - PUSHBUTTON "Pulse",IDC_VCO_PULSE,106,27,50,14 - PUSHBUTTON "Noise",IDC_VCO_NOISE,156,27,50,14 - CONTROL "",IDC_VCO_GAIN,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,127,200,15 - CONTROL "",IDC_VCO_TRANSPOSE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,47,200,15 - CONTROL "",IDC_VCO_DETUNE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,63,200,15 - CONTROL "",IDC_VCO_PHASE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,79,200,15 - CONTROL "",IDC_VCO_COLOR,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,95,200,15 - LTEXT "Transpose",IDC_STATIC,4,51,34,8 - LTEXT "Phase",IDC_STATIC,4,82,20,8 - LTEXT "Detune",IDC_STATIC,4,67,24,8 - LTEXT "Color",IDC_STATIC,4,98,18,8 - LTEXT "Gain",IDC_STATIC,4,130,15,8 - CONTROL "",IDC_VCO_SHAPE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,111,200,15 - LTEXT "Shape",IDC_STATIC,4,114,21,8 - CTEXT " ",IDC_VCO_TRANSPOSE_VAL,242,48,48,12,SS_SUNKEN - CTEXT " ",IDC_VCO_DETUNE_VAL,242,64,48,12,SS_SUNKEN - CTEXT " ",IDC_VCO_PHASE_VAL,242,80,48,12,SS_SUNKEN - CTEXT " ",IDC_VCO_COLOR_VAL,242,96,48,12,SS_SUNKEN - CTEXT " ",IDC_VCO_SHAPE_VAL,242,112,48,12,SS_SUNKEN - CTEXT " ",IDC_VCO_GAIN_VAL,242,128,48,12,SS_SUNKEN - CONTROL "LFO",IDC_VCO_LFO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,262,29,29,10 - CONTROL "Stereo",IDC_VCO_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,262,16,34,10 - PUSHBUTTON "Gate",IDC_VCO_GATE,206,27,50,14 - CONTROL " ",IDC_VCO_GATE1,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,43,147,8,10 - CONTROL " ",IDC_VCO_GATE2,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,55,147,8,10 - CONTROL " ",IDC_VCO_GATE3,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,67,147,8,10 - CONTROL " ",IDC_VCO_GATE4,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,79,147,8,10 - CONTROL " ",IDC_VCO_GATE5,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,91,147,8,10 - CONTROL " ",IDC_VCO_GATE6,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,103,147,8,10 - CONTROL " ",IDC_VCO_GATE7,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,115,147,8,10 - CONTROL " ",IDC_VCO_GATE8,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,127,147,8,10 - CONTROL " ",IDC_VCO_GATE9,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,139,147,8,10 - CONTROL " ",IDC_VCO_GATE10,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,151,147,8,10 - CONTROL " ",IDC_VCO_GATE11,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,163,147,8,10 - CONTROL " ",IDC_VCO_GATE12,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,175,147,8,10 - CONTROL " ",IDC_VCO_GATE13,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,187,147,8,10 - CONTROL " ",IDC_VCO_GATE14,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,199,147,8,10 - CONTROL " ",IDC_VCO_GATE15,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,211,147,8,10 - CONTROL " ",IDC_VCO_GATE16,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,223,147,8,10 - LTEXT "Gate",IDC_STATIC,4,147,16,8 -END - -IDD_VCF DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Filter",IDC_STATIC,0,0,299,170 - PUSHBUTTON "Low",IDC_VCF_LOW,5,59,42,14,WS_DISABLED - PUSHBUTTON "High",IDC_VCF_HIGH,47,59,41,14 - PUSHBUTTON "Band",IDC_VCF_BAND,89,59,41,14 - PUSHBUTTON "Notch",IDC_VCF_NOTCH,131,59,41,14 - PUSHBUTTON "Peak",IDC_VCF_PEAK,173,59,41,14 - PUSHBUTTON "All",IDC_VCF_ALL,215,59,41,14 - CONTROL "Stereo",IDC_VCF_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,258,62,37,10 - CONTROL "",IDC_VCF_FREQUENCY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,79,200,15 - CONTROL "",IDC_VCF_RESONANCE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,95,200,15 - LTEXT "Frequency",IDC_STATIC,4,82,35,8 - LTEXT "Resonance",IDC_STATIC,4,99,36,8 - CTEXT " ",IDC_VCF_FREQUENCY_VAL,242,80,48,12,SS_SUNKEN - CTEXT " ",IDC_VCF_RESONANCE_VAL,242,96,48,12,SS_SUNKEN -END - -IDD_ENV DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Envelope",IDC_STATIC,0,0,300,170 - CONTROL "",IDC_ENV_GAIN,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,109,200,15 - CONTROL "",IDC_ENV_ATTACK,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,46,200,15 - CONTROL "",IDC_ENV_DECAY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,61,200,15 - CONTROL "",IDC_ENV_SUSTAIN,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,77,200,15 - CONTROL "",IDC_ENV_RELEASE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,93,200,15 - LTEXT "Attack",IDC_STATIC,4,49,22,8 - LTEXT "Sustain",IDC_STATIC,4,80,24,8 - LTEXT "Decay",IDC_STATIC,4,65,21,8 - LTEXT "Release",IDC_STATIC,4,96,26,8 - LTEXT "Gain",IDC_STATIC,4,112,15,8 - CTEXT " ",IDC_ENV_ATTACK_VAL,242,46,48,12,SS_SUNKEN - CTEXT " ",IDC_ENV_DECAY_VAL,242,62,48,12,SS_SUNKEN - CTEXT " ",IDC_ENV_SUSTAIN_VAL,242,78,48,12,SS_SUNKEN - CTEXT " ",IDC_ENV_RELEASE_VAL,242,94,48,12,SS_SUNKEN - CTEXT " ",IDC_ENV_GAIN_VAL,242,110,48,12,SS_SUNKEN -END - -IDD_DLL DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Delay/Reverb",IDC_STATIC,0,0,300,170 - CONTROL "",IDC_DLL_DRY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,73,200,15 - CONTROL "",IDC_DLL_PREGAIN,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,42,200,15 - CONTROL "",IDC_DLL_FEEDBACK,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,57,200,15 - LTEXT "Pregain",IDC_STATIC,4,45,25,8 - LTEXT "Feedback",IDC_STATIC,4,61,32,8 - LTEXT "Dry",IDC_STATIC,4,76,12,8 - CTEXT " ",IDC_DLL_PREGAIN_VAL,242,42,48,12,SS_SUNKEN - CTEXT " ",IDC_DLL_FEEDBACK_VAL,242,58,48,12,SS_SUNKEN - CTEXT " ",IDC_DLL_DRY_VAL,242,74,48,12,SS_SUNKEN - CONTROL "",IDC_DLL_DAMP,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,90,200,15 - LTEXT "Damp",IDC_STATIC,4,93,19,8 - CTEXT " ",IDC_DLL_DAMP_VAL,242,90,48,12,SS_SUNKEN - PUSHBUTTON "Delay",IDC_DLL_DELAY,134,13,50,14 - PUSHBUTTON "Reverb",IDC_DLL_REVERB,184,13,50,14 - CONTROL "",IDC_DLL_DTIME,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,106,200,15 - LTEXT "Delay",IDC_STATIC,4,110,19,8 - PUSHBUTTON "BPM",IDC_DLL_BPMSYNC,47,15,40,10 - PUSHBUTTON "Note",IDC_DLL_NOTESYNC,87,15,40,10 - CTEXT " ",IDC_DLL_DTIME_VAL,242,106,48,12,SS_SUNKEN - CONTROL "Left Reverb",IDC_DLL_LEFTREVERB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,241,16,54,10 - PUSHBUTTON "No Sync",IDC_DLL_NOSYNC,7,15,40,10 - CONTROL "",IDC_DLL_FREQUENCY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,122,200,15 - LTEXT "Frequency",IDC_STATIC,4,127,35,8 - CTEXT " ",IDC_DLL_FREQUENCY_VAL,242,122,48,12,SS_SUNKEN - CONTROL "",IDC_DLL_DEPTH,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,138,200,15 - LTEXT "Depth",IDC_STATIC,4,143,20,8 - CTEXT " ",IDC_DLL_DEPTH_VAL,242,138,48,12,SS_SUNKEN -END - -IDD_DST DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Distortion",IDC_STATIC,0,0,299,170 - CONTROL "",IDC_DST_DRIVE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,69,200,15 - LTEXT "Drive",IDC_STATIC,4,73,18,8 - LTEXT "S&&H",IDC_STATIC,4,89,14,8 - CONTROL "",IDC_DST_SNH,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,85,200,15 - CTEXT " ",IDC_DST_DRIVE_VAL,242,70,48,12,SS_SUNKEN - CTEXT " ",IDC_DST_SNH_VAL,242,86,48,12,SS_SUNKEN - CONTROL "Stereo",IDC_DST_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,126,105,37,10 -END - -IDD_INSTRUMENT_STACK DIALOGEX 0, 0, 247, 640 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPCHILDREN | WS_SYSMENU -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - PUSHBUTTON " ",IDC_ISTACK_UNIT1,15,0,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP1,165,0,25,10,NOT WS_VISIBLE - PUSHBUTTON "Down",IDC_ISTACK_DOWN1,191,0,25,10,NOT WS_VISIBLE - CTEXT "1",IDC_ISTACK_SIGNALCOUNT1,225,0,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT2,15,10,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP2,165,10,25,10,NOT WS_VISIBLE - PUSHBUTTON "Down",IDC_ISTACK_DOWN2,191,10,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT2,225,10,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT3,15,20,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP3,165,20,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN3,191,20,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT3,225,20,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT4,15,30,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP4,165,30,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN4,191,30,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT4,225,30,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT5,15,40,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP5,165,40,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN5,191,40,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT5,225,40,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT6,15,50,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP6,165,50,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN6,191,50,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT6,225,50,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT7,15,60,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP7,165,60,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN7,191,60,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT7,225,60,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT8,15,70,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP8,165,70,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN8,191,70,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT8,225,70,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT9,15,80,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP9,165,80,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN9,191,80,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT9,225,80,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT10,15,90,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP10,165,90,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN10,191,90,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT10,225,90,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT11,15,100,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP11,165,100,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN11,191,100,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT11,225,100,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT12,15,110,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP12,165,110,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN12,191,110,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT12,225,110,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT13,15,120,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP13,165,120,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN13,191,120,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT13,225,120,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT14,15,130,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP14,165,130,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN14,191,130,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT14,225,130,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT15,15,140,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP15,165,140,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN15,191,140,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT15,225,140,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT16,15,150,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP16,165,150,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN16,191,150,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT16,225,150,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT17,15,160,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP17,165,160,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN17,191,160,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT17,225,160,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT18,15,170,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP18,165,170,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN18,191,170,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT18,225,170,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT19,15,180,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP19,165,180,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN19,191,180,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT19,225,180,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT20,15,190,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP20,165,190,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN20,191,190,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT20,225,190,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT21,15,200,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP21,165,200,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN21,191,200,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT21,225,200,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT22,15,210,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP22,165,210,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN22,191,210,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT22,225,210,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT23,15,220,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP23,165,220,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN23,191,220,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT23,225,220,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT24,15,230,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP24,165,230,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN24,191,230,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT24,225,230,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT25,15,240,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP25,165,240,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN25,191,240,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT25,225,240,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT26,15,250,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP26,165,250,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN26,191,250,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT26,225,250,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT27,15,260,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP27,165,260,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN27,191,260,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT27,225,260,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT28,15,270,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP28,165,270,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN28,191,270,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT28,225,270,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT29,15,280,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP29,165,280,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN29,191,280,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT29,225,280,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT30,15,290,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP30,165,290,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN30,191,290,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT30,225,290,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT31,15,300,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP31,165,300,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN31,191,300,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT31,225,300,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT32,15,310,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP32,165,310,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN32,191,310,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT32,225,310,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT1,15,320,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP1,165,320,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN1,191,320,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT1,225,320,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT2,15,330,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP2,165,330,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN2,191,330,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT2,225,330,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT3,15,340,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP3,165,340,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN3,191,340,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT3,225,340,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT4,15,350,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP4,165,350,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN4,191,350,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT4,225,350,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT5,15,360,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP5,165,360,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN5,191,360,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT5,225,360,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT6,15,370,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP6,165,370,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN6,191,370,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT6,225,370,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT7,15,380,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP7,165,380,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN7,191,380,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT7,225,380,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT8,15,390,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP8,165,390,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN8,191,390,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT8,225,390,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT9,15,400,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP9,165,400,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN9,191,400,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT9,225,400,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT10,15,410,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP10,165,410,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN10,191,410,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT10,225,410,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT11,15,420,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP11,165,420,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN11,191,420,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT11,225,420,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT12,15,430,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP12,165,430,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN12,191,430,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT12,225,430,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT13,15,440,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP13,165,440,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN13,191,440,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT13,225,440,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT14,15,450,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP14,165,450,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN14,191,450,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT14,225,450,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT15,15,460,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP15,165,460,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN15,191,460,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT15,225,460,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT16,15,470,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP16,165,470,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN16,191,470,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT16,225,470,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT17,15,480,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP17,165,480,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN17,191,480,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT17,225,480,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT18,15,490,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP18,165,490,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN18,191,490,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT18,225,490,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT19,15,500,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP19,165,500,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN19,191,500,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT19,225,500,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT20,15,510,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP20,165,510,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN20,191,510,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT20,225,510,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT21,15,520,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP21,165,520,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN21,191,520,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT21,225,520,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT22,15,530,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP22,165,530,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN22,191,530,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT22,225,530,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT23,15,540,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP23,165,540,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN23,191,540,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT23,225,540,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT24,15,550,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP24,165,550,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN24,191,550,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT24,225,550,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT25,15,560,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP25,165,560,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN25,191,560,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT25,225,560,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT26,15,570,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP26,165,570,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN26,191,570,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT26,225,570,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT27,15,580,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP27,165,580,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN27,191,580,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT27,225,580,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT28,15,590,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP28,165,590,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN28,191,590,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT28,225,590,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT29,15,600,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP29,165,600,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN29,191,600,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT29,225,600,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT30,15,610,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP30,165,610,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN30,191,610,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT30,225,610,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT31,15,620,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP31,165,620,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN31,191,620,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT31,225,620,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT32,15,630,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP32,165,630,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN32,191,630,25,10,NOT WS_VISIBLE - CTEXT "1",IDC_ISTACK__SIGNALCOUNT32,225,630,16,10,SS_SUNKEN - PUSHBUTTON "Set",IDC_ISTACK_SET1,106,0,25,10,NOT WS_VISIBLE - PUSHBUTTON "Clear",IDC_ISTACK_RESET1,132,0,25,10,NOT WS_VISIBLE - PUSHBUTTON "Set",IDC_ISTACK_SET2,106,10,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET2,132,10,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET3,106,20,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET3,132,20,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET4,106,30,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET4,132,30,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET5,106,40,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET5,132,40,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET6,106,50,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET6,132,50,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET7,106,60,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET7,132,60,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET8,106,70,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET8,132,70,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET9,106,80,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET9,132,80,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET10,106,90,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET10,132,90,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET11,106,100,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET11,132,100,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET12,106,110,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET12,132,110,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET13,106,120,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET13,132,120,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET14,106,130,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET14,132,130,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET15,106,140,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET15,132,140,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET16,106,150,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET16,132,150,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET17,106,160,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET17,132,160,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET18,106,170,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET18,132,170,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET19,106,180,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET19,132,180,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET20,106,190,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET20,132,190,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET21,106,200,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET21,132,200,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET22,106,210,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET22,132,210,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET23,106,220,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET23,132,220,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET24,106,230,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET24,132,230,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET25,106,240,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET25,132,240,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET26,106,250,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET26,132,250,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET27,106,260,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET27,132,260,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET28,106,270,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET28,132,270,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET29,106,280,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET29,132,280,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET30,106,290,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET30,132,290,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET31,106,300,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET31,132,300,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET32,106,310,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET32,132,310,25,10 - PUSHBUTTON "Setl",IDC_ISTACK__SET1,106,320,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET1,132,320,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET2,106,330,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET2,132,330,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET3,106,340,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET3,132,340,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET4,106,350,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET4,132,350,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET5,106,360,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET5,132,360,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET6,106,370,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET6,132,370,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET7,106,380,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET7,132,380,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET8,106,390,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET8,132,390,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET9,106,400,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET9,132,400,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET10,106,410,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET10,132,410,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET11,106,420,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET11,132,420,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET12,106,430,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET12,132,430,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET13,106,440,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET13,132,440,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET14,106,450,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET14,132,450,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET15,106,460,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET15,132,460,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET16,106,470,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET16,132,470,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET17,106,480,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET17,132,480,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET18,106,490,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET18,132,490,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET19,106,500,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET19,132,500,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET20,106,510,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET20,132,510,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET21,106,520,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET21,132,520,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET22,106,530,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET22,132,530,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET23,106,540,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET23,132,540,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET24,106,550,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET24,132,550,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET25,106,560,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET25,132,560,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET26,106,570,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET26,132,570,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET27,106,580,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET27,132,580,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET28,106,590,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET28,132,590,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET29,106,600,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET29,132,600,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET30,106,610,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET30,132,610,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET31,106,620,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET31,132,620,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET32,106,630,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET32,132,630,25,10 - LTEXT "1:",IDC_STATIC,2,1,10,8 - LTEXT "2:",IDC_STATIC,2,11,10,8 - LTEXT "3:",IDC_STATIC,2,21,10,8 - LTEXT "4:",IDC_STATIC,2,31,10,8 - LTEXT "5:",IDC_STATIC,2,41,10,8 - LTEXT "6:",IDC_STATIC,2,51,10,8 - LTEXT "7:",IDC_STATIC,2,61,10,8 - LTEXT "8:",IDC_STATIC,2,71,10,8 - LTEXT "9:",IDC_STATIC,2,81,10,8 - LTEXT "10:",IDC_STATIC,2,91,10,8 - LTEXT "11:",IDC_STATIC,2,101,10,8 - LTEXT "12:",IDC_STATIC,2,111,10,8 - LTEXT "13:",IDC_STATIC,2,121,10,8 - LTEXT "14:",IDC_STATIC,2,131,10,8 - LTEXT "15:",IDC_STATIC,2,141,10,8 - LTEXT "16:",IDC_STATIC,2,151,10,8 - LTEXT "17:",IDC_STATIC,2,161,10,8 - LTEXT "18:",IDC_STATIC,2,171,10,8 - LTEXT "19:",IDC_STATIC,2,181,10,8 - LTEXT "20:",IDC_STATIC,2,191,10,8 - LTEXT "21:",IDC_STATIC,2,201,10,8 - LTEXT "22:",IDC_STATIC,2,211,10,8 - LTEXT "23:",IDC_STATIC,2,221,10,8 - LTEXT "24:",IDC_STATIC,2,231,10,8 - LTEXT "25:",IDC_STATIC,2,241,10,8 - LTEXT "26:",IDC_STATIC,2,251,10,8 - LTEXT "27:",IDC_STATIC,2,261,10,8 - LTEXT "28:",IDC_STATIC,2,271,10,8 - LTEXT "29:",IDC_STATIC,2,281,10,8 - LTEXT "30:",IDC_STATIC,2,291,10,8 - LTEXT "31:",IDC_STATIC,2,301,10,8 - LTEXT "32:",IDC_STATIC,2,311,10,8 - LTEXT "33:",IDC_STATIC,2,321,10,8 - LTEXT "34:",IDC_STATIC,2,331,10,8 - LTEXT "35:",IDC_STATIC,2,341,10,8 - LTEXT "36:",IDC_STATIC,2,351,10,8 - LTEXT "37:",IDC_STATIC,2,361,10,8 - LTEXT "38:",IDC_STATIC,2,371,10,8 - LTEXT "39:",IDC_STATIC,2,381,10,8 - LTEXT "40:",IDC_STATIC,2,391,10,8 - LTEXT "41:",IDC_STATIC,2,401,10,8 - LTEXT "42:",IDC_STATIC,2,411,10,8 - LTEXT "43:",IDC_STATIC,2,421,10,8 - LTEXT "44:",IDC_STATIC,2,431,10,8 - LTEXT "45:",IDC_STATIC,2,441,10,8 - LTEXT "46:",IDC_STATIC,2,451,10,8 - LTEXT "47:",IDC_STATIC,2,461,10,8 - LTEXT "48:",IDC_STATIC,2,471,10,8 - LTEXT "49:",IDC_STATIC,2,481,10,8 - LTEXT "50:",IDC_STATIC,2,491,10,8 - LTEXT "51:",IDC_STATIC,2,501,10,8 - LTEXT "52:",IDC_STATIC,2,511,10,8 - LTEXT "53:",IDC_STATIC,2,521,10,8 - LTEXT "54:",IDC_STATIC,2,531,10,8 - LTEXT "55:",IDC_STATIC,2,541,10,8 - LTEXT "56:",IDC_STATIC,2,551,10,8 - LTEXT "57:",IDC_STATIC,2,561,10,8 - LTEXT "58:",IDC_STATIC,2,571,10,8 - LTEXT "59:",IDC_STATIC,2,581,10,8 - LTEXT "60:",IDC_STATIC,2,591,10,8 - LTEXT "61:",IDC_STATIC,2,601,10,8 - LTEXT "62:",IDC_STATIC,2,611,10,8 - LTEXT "63:",IDC_STATIC,2,621,10,8 - LTEXT "64:",IDC_STATIC,2,631,10,8 -END - -IDD_FOP DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Floating Point Operation",IDC_STATIC,0,0,299,170 - PUSHBUTTON "Load Note",IDC_FOP_LOADNOTE,3,11,42,14 - PUSHBUTTON "PUSH",IDC_FOP_PUSH,3,27,42,14 - PUSHBUTTON "POP",IDC_FOP_POP,3,42,42,14 - PUSHBUTTON "XCH",IDC_FOP_XCH,3,58,42,14 - PUSHBUTTON "+",IDC_FOP_ADD,3,74,42,14 - PUSHBUTTON "+/POP",IDC_FOP_ADDP,3,90,42,14 - PUSHBUTTON "*",IDC_FOP_MUL,3,106,42,14 - PUSHBUTTON "*/POP",IDC_FOP_MULP,3,122,42,14 - PUSHBUTTON "2+/POP",IDC_FOP_ADDP2,3,138,42,14 - PUSHBUTTON "2*/POP",IDC_FOP_MULP2,3,154,42,14 - LTEXT "IN: a b c d -> OUT: note a b c d",IDC_STATIC,50,13,233,8 - LTEXT "IN: a b c d -> OUT: a a b c d",IDC_STATIC,50,29,232,8 - LTEXT "IN: a b c d -> OUT: b c d",IDC_STATIC,50,44,196,8 - LTEXT "IN: a b c d -> OUT: b a c d",IDC_STATIC,50,60,214,8 - LTEXT "IN: a b c d -> OUT: a+b b c d",IDC_STATIC,50,76,216,8 - LTEXT "IN: a b c d -> OUT: a+b c d",IDC_STATIC,50,92,198,8 - LTEXT "IN: a b c d -> OUT: a*b b c d",IDC_STATIC,50,108,216,8 - LTEXT "IN: a b c d -> OUT: a*b c d",IDC_STATIC,50,124,198,8 - LTEXT "IN: a b c d -> OUT: a+c b+d",IDC_STATIC,50,141,193,8 - LTEXT "IN: a b c d -> OUT: a*c b*d",IDC_STATIC,50,156,193,8 - GROUPBOX "",IDC_STATIC,0,133,299,20 - GROUPBOX "",IDC_STATIC,0,101,299,20 - GROUPBOX "",IDC_STATIC,1,69,299,20 - GROUPBOX "",IDC_STATIC,0,37,299,20 - GROUPBOX "",IDC_STATIC,0,6,299,20 -END - -IDD_FST DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Store Signal",IDC_STATIC,0,0,299,170 - CONTROL "",IDC_FST_AMOUNT,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,36,101,200,15 - LTEXT "Amount",IDC_STATIC,3,104,26,8 - CTEXT " ",IDC_FST_AMOUNT_VAL,242,102,48,12,SS_SUNKEN - COMBOBOX IDC_FST_DESTINATION_INSTRUMENT,43,53,249,177,CBS_DROPDOWN | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP - LTEXT "Stack",IDC_STATIC,5,55,18,8 - COMBOBOX IDC_FST_DESTINATION_UNIT,43,69,249,157,CBS_DROPDOWN | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP - LTEXT "Unit",IDC_STATIC,6,71,14,8 - COMBOBOX IDC_FST_DESTINATION_SLOT,43,85,249,110,CBS_DROPDOWN | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP - LTEXT "Slot",IDC_STATIC,5,87,13,8 - PUSHBUTTON "Set",IDC_FST_SET,56,122,50,14 - PUSHBUTTON "+",IDC_FST_ADD,106,122,50,14 - CONTROL "Pop",IDC_FST_POP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,212,124,28,10 - PUSHBUTTON "*",IDC_FST_MUL,156,122,50,14,NOT WS_VISIBLE -END - -IDD_NONE DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "",-1,0,0,299,170 - LTEXT "Nothing selected",-1,123,80,54,8 -END - -IDD_OUT DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Instrument Output",IDC_STATIC,0,0,299,170 - CONTROL "",IDC_OUT_GAIN,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,37,70,200,15 - LTEXT "Gain",IDC_STATIC,6,73,15,8 - LTEXT "AUX Send",IDC_STATIC,6,89,32,8 - CONTROL "",IDC_OUT_AUXSEND,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,37,85,200,15 - CTEXT " ",IDC_OUT_GAIN_VAL,242,70,48,12,SS_SUNKEN - CTEXT " ",IDC_OUT_AUXSEND_VAL,242,86,48,12,SS_SUNKEN -END - -IDD_GLOBAL_STACK DIALOGEX 0, 0, 247, 640 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPCHILDREN -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - PUSHBUTTON " ",IDC_GSTACK_UNIT1,15,0,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP1,165,0,25,10,NOT WS_VISIBLE - PUSHBUTTON "Down",IDC_GSTACK_DOWN1,191,0,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT1,225,0,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT2,15,10,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP2,165,10,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN2,191,10,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT2,225,10,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT3,15,20,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP3,165,20,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN3,191,20,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT3,225,20,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT4,15,30,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP4,165,30,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN4,191,30,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT4,225,30,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT5,15,40,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP5,165,40,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN5,191,40,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT5,225,40,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT6,15,50,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP6,165,50,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN6,191,50,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT6,225,50,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT7,15,60,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP7,165,60,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN7,191,60,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT7,225,60,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT8,15,70,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP8,165,70,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN8,191,70,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT8,225,70,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT9,15,80,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP9,165,80,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN9,191,80,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT9,225,80,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT10,15,90,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP10,165,90,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN10,191,90,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT10,225,90,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT11,15,100,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP11,165,100,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN11,191,100,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT11,225,100,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT12,15,110,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP12,165,110,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN12,191,110,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT12,225,110,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT13,15,120,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP13,165,120,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN13,191,120,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT13,225,120,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT14,15,130,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP14,165,130,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN14,191,130,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT14,225,130,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT15,15,140,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP15,165,140,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN15,191,140,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT15,225,140,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT16,15,150,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP16,165,150,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN16,191,150,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT16,225,150,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT17,15,160,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP17,165,160,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN17,191,160,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT17,225,160,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT18,15,170,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP18,165,170,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN18,191,170,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT18,225,170,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT19,15,180,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP19,165,180,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN19,191,180,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT19,225,180,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT20,15,190,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP20,165,190,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN20,191,190,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT20,225,190,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT21,15,200,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP21,165,200,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN21,191,200,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT21,225,200,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT22,15,210,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP22,165,210,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN22,191,210,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT22,225,210,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT23,15,220,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP23,165,220,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN23,191,220,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT23,225,220,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT24,15,230,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP24,165,230,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN24,191,230,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT24,225,230,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT25,15,240,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP25,165,240,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN25,191,240,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT25,225,240,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT26,15,250,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP26,165,250,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN26,191,250,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT26,225,250,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT27,15,260,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP27,165,260,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN27,191,260,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT27,225,260,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT28,15,270,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP28,165,270,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN28,191,270,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT28,225,270,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT29,15,280,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP29,165,280,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN29,191,280,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT29,225,280,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT30,15,290,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP30,165,290,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN30,191,290,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT30,225,290,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT31,15,300,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP31,165,300,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN31,191,300,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT31,225,300,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT32,15,310,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP32,165,310,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN32,191,310,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT32,225,310,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT1,15,320,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP1,165,320,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN1,191,320,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT1,225,320,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT2,15,330,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP2,165,330,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN2,191,330,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT2,225,330,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT3,15,340,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP3,165,340,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN3,191,340,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT3,225,340,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT4,15,350,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP4,165,350,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN4,191,350,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT4,225,350,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT5,15,360,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP5,165,360,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN5,191,360,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT5,225,360,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT6,15,370,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP6,165,370,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN6,191,370,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT6,225,370,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT7,15,380,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP7,165,380,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN7,191,380,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT7,225,380,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT8,15,390,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP8,165,390,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN8,191,390,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT8,225,390,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT9,15,400,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP9,165,400,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN9,191,400,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT9,225,400,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT10,15,410,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP10,165,410,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN10,191,410,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT10,225,410,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT11,15,420,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP11,165,420,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN11,191,420,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT11,225,420,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT12,15,430,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP12,165,430,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN12,191,430,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT12,225,430,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT13,15,440,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP13,165,440,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN13,191,440,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT13,225,440,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT14,15,450,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP14,165,450,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN14,191,450,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT14,225,450,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT15,15,460,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP15,165,460,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN15,191,460,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT15,225,460,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT16,15,470,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP16,165,470,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN16,191,470,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT16,225,470,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT17,15,480,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP17,165,480,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN17,191,480,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT17,225,480,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT18,15,490,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP18,165,490,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN18,191,490,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT18,225,490,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT19,15,500,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP19,165,500,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN19,191,500,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT19,225,500,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT20,15,510,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP20,165,510,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN20,191,510,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT20,225,510,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT21,15,520,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP21,165,520,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN21,191,520,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT21,225,520,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT22,15,530,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP22,165,530,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN22,191,530,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT22,225,530,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT23,15,540,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP23,165,540,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN23,191,540,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT23,225,540,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT24,15,550,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP24,165,550,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN24,191,550,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT24,225,550,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT25,15,560,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP25,165,560,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN25,191,560,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT25,225,560,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT26,15,570,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP26,165,570,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN26,191,570,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT26,225,570,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT27,15,580,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP27,165,580,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN27,191,580,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT27,225,580,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT28,15,590,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP28,165,590,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN28,191,590,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT28,225,590,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT29,15,600,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP29,165,600,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN29,191,600,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT29,225,600,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT30,15,610,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP30,165,610,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN30,191,610,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT30,225,610,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT31,15,620,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP31,165,620,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN31,191,620,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT31,225,620,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT32,15,630,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP32,165,630,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN32,191,630,25,10,NOT WS_VISIBLE - CTEXT "1",IDC_GSTACK__SIGNALCOUNT32,225,630,16,10,SS_SUNKEN - PUSHBUTTON "Set",IDC_GSTACK_SET1,106,0,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET1,132,0,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET2,106,10,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET2,132,10,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET3,106,20,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET3,132,20,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET4,106,30,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET4,132,30,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET5,106,40,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET5,132,40,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET6,106,50,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET6,132,50,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET7,106,60,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET7,132,60,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET8,106,70,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET8,132,70,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET9,106,80,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET9,132,80,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET10,106,90,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET10,132,90,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET11,106,100,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET11,132,100,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET12,106,110,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET12,132,110,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET13,106,120,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET13,132,120,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET14,106,130,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET14,132,130,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET15,106,140,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET15,132,140,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET16,106,150,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET16,132,150,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET17,106,160,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET17,132,160,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET18,106,170,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET18,132,170,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET19,106,180,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET19,132,180,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET20,106,190,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET20,132,190,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET21,106,200,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET21,132,200,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET22,106,210,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET22,132,210,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET23,106,220,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET23,132,220,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET24,106,230,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET24,132,230,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET25,106,240,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET25,132,240,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET26,106,250,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET26,132,250,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET27,106,260,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET27,132,260,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET28,106,270,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET28,132,270,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET29,106,280,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET29,132,280,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET30,106,290,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET30,132,290,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET31,106,300,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET31,132,300,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET32,106,310,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET32,132,310,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET1,106,320,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET1,132,320,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET2,106,330,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET2,132,330,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET3,106,340,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET3,132,340,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET4,106,350,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET4,132,350,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET5,106,360,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET5,132,360,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET6,106,370,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET6,132,370,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET7,106,380,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET7,132,380,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET8,106,390,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET8,132,390,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET9,106,400,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET9,132,400,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET10,106,410,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET10,132,410,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET11,106,420,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET11,132,420,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET12,106,430,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET12,132,430,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET13,106,440,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET13,132,440,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET14,106,450,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET14,132,450,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET15,106,460,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET15,132,460,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET16,106,470,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET16,132,470,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET17,106,480,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET17,132,480,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET18,106,490,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET18,132,490,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET19,106,500,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET19,132,500,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET20,106,510,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET20,132,510,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET21,106,520,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET21,132,520,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET22,106,530,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET22,132,530,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET23,106,540,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET23,132,540,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET24,106,550,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET24,132,550,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET25,106,560,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET25,132,560,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET26,106,570,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET26,132,570,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET27,106,580,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET27,132,580,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET28,106,590,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET28,132,590,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET29,106,600,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET29,132,600,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET30,106,610,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET30,132,610,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET31,106,620,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET31,132,620,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET32,106,630,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET32,132,630,25,10 - LTEXT "1:",IDC_STATIC,2,1,10,8 - LTEXT "2:",IDC_STATIC,2,11,10,8 - LTEXT "3:",IDC_STATIC,2,21,10,8 - LTEXT "4:",IDC_STATIC,2,31,10,8 - LTEXT "5:",IDC_STATIC,2,41,10,8 - LTEXT "6:",IDC_STATIC,2,51,10,8 - LTEXT "7:",IDC_STATIC,2,61,10,8 - LTEXT "8:",IDC_STATIC,2,71,10,8 - LTEXT "9:",IDC_STATIC,2,81,10,8 - LTEXT "10:",IDC_STATIC,2,91,10,8 - LTEXT "11:",IDC_STATIC,2,101,10,8 - LTEXT "12:",IDC_STATIC,2,111,10,8 - LTEXT "13:",IDC_STATIC,2,121,10,8 - LTEXT "14:",IDC_STATIC,2,131,10,8 - LTEXT "15:",IDC_STATIC,2,141,10,8 - LTEXT "16:",IDC_STATIC,2,151,10,8 - LTEXT "17:",IDC_STATIC,2,161,10,8 - LTEXT "18:",IDC_STATIC,2,171,10,8 - LTEXT "19:",IDC_STATIC,2,181,10,8 - LTEXT "20:",IDC_STATIC,2,191,10,8 - LTEXT "21:",IDC_STATIC,2,201,10,8 - LTEXT "22:",IDC_STATIC,2,211,10,8 - LTEXT "23:",IDC_STATIC,2,221,10,8 - LTEXT "24:",IDC_STATIC,2,231,10,8 - LTEXT "25:",IDC_STATIC,2,241,10,8 - LTEXT "26:",IDC_STATIC,2,251,10,8 - LTEXT "27:",IDC_STATIC,2,261,10,8 - LTEXT "28:",IDC_STATIC,2,271,10,8 - LTEXT "29:",IDC_STATIC,2,281,10,8 - LTEXT "30:",IDC_STATIC,2,291,10,8 - LTEXT "31:",IDC_STATIC,2,301,10,8 - LTEXT "32:",IDC_STATIC,2,311,10,8 - LTEXT "33:",IDC_STATIC,2,321,10,8 - LTEXT "34:",IDC_STATIC,2,331,10,8 - LTEXT "35:",IDC_STATIC,2,341,10,8 - LTEXT "36:",IDC_STATIC,2,351,10,8 - LTEXT "37:",IDC_STATIC,2,361,10,8 - LTEXT "38:",IDC_STATIC,2,371,10,8 - LTEXT "39:",IDC_STATIC,2,381,10,8 - LTEXT "40:",IDC_STATIC,2,391,10,8 - LTEXT "41:",IDC_STATIC,2,401,10,8 - LTEXT "42:",IDC_STATIC,2,411,10,8 - LTEXT "43:",IDC_STATIC,2,421,10,8 - LTEXT "44:",IDC_STATIC,2,431,10,8 - LTEXT "45:",IDC_STATIC,2,441,10,8 - LTEXT "46:",IDC_STATIC,2,451,10,8 - LTEXT "47:",IDC_STATIC,2,461,10,8 - LTEXT "48:",IDC_STATIC,2,471,10,8 - LTEXT "49:",IDC_STATIC,2,481,10,8 - LTEXT "50:",IDC_STATIC,2,491,10,8 - LTEXT "51:",IDC_STATIC,2,501,10,8 - LTEXT "52:",IDC_STATIC,2,511,10,8 - LTEXT "53:",IDC_STATIC,2,521,10,8 - LTEXT "54:",IDC_STATIC,2,531,10,8 - LTEXT "55:",IDC_STATIC,2,541,10,8 - LTEXT "56:",IDC_STATIC,2,551,10,8 - LTEXT "57:",IDC_STATIC,2,561,10,8 - LTEXT "58:",IDC_STATIC,2,571,10,8 - LTEXT "59:",IDC_STATIC,2,581,10,8 - LTEXT "60:",IDC_STATIC,2,591,10,8 - LTEXT "61:",IDC_STATIC,2,601,10,8 - LTEXT "62:",IDC_STATIC,2,611,10,8 - LTEXT "63:",IDC_STATIC,2,621,10,8 - LTEXT "64:",IDC_STATIC,2,631,10,8 -END - -IDD_PAN DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Panning",-1,0,0,299,170 - CONTROL "",IDC_PAN_PANNING,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,77,200,15 - LTEXT "Panning",-1,6,80,26,8 - CTEXT " ",IDC_PAN_PANNING_VAL,242,77,48,12,SS_SUNKEN -END - -IDD_SET_DIALOG DIALOGEX 0, 0, 186, 44 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Set" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - DEFPUSHBUTTON "OK",IDOK,129,7,50,14 - PUSHBUTTON "Cancel",IDCANCEL,129,21,50,14 - COMBOBOX IDC_SET_UNIT,7,23,92,121,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - LTEXT "Select Unit",IDC_STATIC,7,7,36,8 -END - -IDD_ACC DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Accumulate Signals",-1,0,0,299,170 - PUSHBUTTON "Output",IDC_ACC_OUT,99,77,50,14,WS_DISABLED - PUSHBUTTON "AUX",IDC_ACC_AUX,149,77,50,14 -END - -IDD_FLD DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Load Signal",-1,0,0,299,170 - CONTROL "",IDC_FLD_VALUE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,77,200,15 - LTEXT "Value",-1,6,80,26,8 - CTEXT " ",IDC_FLD_VALUE_VAL,242,77,48,12,SS_SUNKEN -END - -IDD_SCROLLWINDOW DIALOGEX 0, 0, 263, 258 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_SYSMENU -EXSTYLE WS_EX_CLIENTEDGE -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN -END - -IDD_GLITCH DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Glitch",IDC_STATIC,0,0,300,170 - CONTROL "",IDC_GLITCH_DRY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,65,200,15 - CONTROL "",IDC_GLITCH_ACTIVE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,49,200,15 - LTEXT "Active",IDC_STATIC,4,53,21,8 - LTEXT "Dry",IDC_STATIC,4,68,12,8 - CTEXT " ",IDC_GLITCH_ACTIVE_VAL,242,50,48,12,SS_SUNKEN - CTEXT " ",IDC_GLITCH_DRY_VAL,242,66,48,12,SS_SUNKEN - CONTROL "",IDC_GLITCH_DSIZE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,97,200,15 - LTEXT "DSize",IDC_STATIC,4,100,18,8 - CTEXT " ",IDC_GLITCH_DSIZE_VAL,242,97,48,12,SS_SUNKEN - CONTROL "",IDC_GLITCH_DPITCH,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,113,200,15 - LTEXT "DPitch",IDC_STATIC,4,117,21,8 - CTEXT " ",IDC_GLITCH_DPITCH_VAL,242,113,48,12,SS_SUNKEN - CONTROL "",IDC_GLITCH_DTIME,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,81,200,15 - LTEXT "Delay",IDC_STATIC,4,85,19,8 - CTEXT " ",IDC_GLITCH_DTIME_VAL,242,81,48,12,SS_SUNKEN -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_GO4KVSTIDIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 587 - TOPMARGIN, 7 - BOTTOMMARGIN, 334 - END - - IDD_VCO, DIALOG - BEGIN - END - - IDD_VCF, DIALOG - BEGIN - END - - IDD_DLL, DIALOG - BEGIN - END - - IDD_DST, DIALOG - BEGIN - END - - IDD_FST, DIALOG - BEGIN - END - - IDD_SET_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 179 - TOPMARGIN, 7 - BOTTOMMARGIN, 35 - END - - IDD_GLITCH, DIALOG - BEGIN - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog Info -// - -IDD_GO4KVSTIDIALOG DLGINIT -BEGIN - IDC_PATTERN_SIZE, 0x403, 12, 0 -0x6538, 0x2072, 0x6150, 0x7474, 0x7265, 0x006e, - IDC_PATTERN_SIZE, 0x403, 13, 0 -0x3631, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" - IDC_PATTERN_SIZE, 0x403, 13, 0 -0x3233, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" - IDC_PATTERN_SIZE, 0x403, 13, 0 -0x3436, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" - IDC_PATTERN_QUANT, 0x403, 12, 0 -0x6538, 0x2072, 0x6150, 0x7474, 0x7265, 0x006e, - IDC_PATTERN_QUANT, 0x403, 13, 0 -0x3631, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" - IDC_PATTERN_QUANT, 0x403, 13, 0 -0x3233, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" - IDC_PATTERN_QUANT, 0x403, 13, 0 -0x3436, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" - 0 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// AFX_DIALOG_LAYOUT -// - -IDD_GO4KVSTIDIALOG AFX_DIALOG_LAYOUT -BEGIN - 0 -END - -#endif // German (Germany) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (United States) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - -#endif // English (United States) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/4klang_source/Go4kVSTi/win/Go4kVSTi2.vcxproj b/4klang_source/Go4kVSTi/win/Go4kVSTi2.vcxproj deleted file mode 100644 index cd4a1bb..0000000 --- a/4klang_source/Go4kVSTi/win/Go4kVSTi2.vcxproj +++ /dev/null @@ -1,200 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - 8klang - {FA790F08-0B8E-43D9-A4B4-519AB01B820C} - Go4kVSTi2 - 8.1 - - - - DynamicLibrary - false - false - v140 - - - DynamicLibrary - false - v140 - - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - .\$(ProjectName)\Debug\ - .\$(ProjectName)\Debug\ - true - .\$(ProjectName)\Release\ - .\$(ProjectName)\Release\ - false - false - false - AllRules.ruleset - - - AllRules.ruleset - - - - - - _DEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Debug/vstxsynth.tlb - - - Disabled - ..\source\common;%(AdditionalIncludeDirectories) - _8KLANG;WIN32;_DEBUG;_WINDOWS;WINDOWS=1;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) - Sync - EnableFastChecks - MultiThreadedDebug - 1Byte - true - Fast - - - - - Level3 - true - ProgramDatabase - Default - - - _DEBUG;%(PreprocessorDefinitions) - 0x0409 - - - odbc32.lib;odbccp32.lib;comctl32.lib;%(AdditionalDependencies) - true - .\Go4kVSTi2.def - true - Windows - false - - - - - copy /Y $(TargetPath) C:\VST - - - - - NDEBUG;%(PreprocessorDefinitions) - true - true - Win32 - .\Release/vstxsynth.tlb - - - Disabled - AnySuitable - true - Speed - false - ..\source\common;%(AdditionalIncludeDirectories) - _8KLANG;WIN32;NDEBUG;_WINDOWS;WINDOWS=1;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions) - true - Sync - MultiThreaded - 1Byte - false - false - NotSet - Fast - true - - - - - Level3 - true - - - Cdecl - Default - - - NDEBUG;%(PreprocessorDefinitions) - 0x0409 - - - odbc32.lib;odbccp32.lib;comctl32.lib;%(AdditionalDependencies) - true - .\Go4kVSTi2.def - Windows - false - - - - - copy /Y $(TargetPath) C:\VST - - - - - - - - Cdecl - - - Cdecl - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - - - - \ No newline at end of file diff --git a/4klang_source/Go4kVSTi/win/Go4kVSTi2.vcxproj.filters b/4klang_source/Go4kVSTi/win/Go4kVSTi2.vcxproj.filters deleted file mode 100644 index 3f1018f..0000000 --- a/4klang_source/Go4kVSTi/win/Go4kVSTi2.vcxproj.filters +++ /dev/null @@ -1,78 +0,0 @@ - - - - - {1cf4fa67-2860-48e5-9e8b-29b87a918b97} - cpp;c;cxx;rc;def;r;odl;idl;hpj;bat - - - {8c759cfb-040e-43f2-a0c5-3f00eb100142} - h;hpp;hxx;hm;inl - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - - - - - - - - - Source Files - - - \ No newline at end of file diff --git a/4klang_source/Go4kVSTi/win/SimpleCrypt.exe b/4klang_source/Go4kVSTi/win/SimpleCrypt.exe deleted file mode 100644 index a6d352f..0000000 Binary files a/4klang_source/Go4kVSTi/win/SimpleCrypt.exe and /dev/null differ diff --git a/4klang_source/Go4kVSTi/win/cryptfiles.bat b/4klang_source/Go4kVSTi/win/cryptfiles.bat deleted file mode 100644 index c514151..0000000 --- a/4klang_source/Go4kVSTi/win/cryptfiles.bat +++ /dev/null @@ -1,2 +0,0 @@ -SimpleCrypt.exe 4klang.asm 4klang.bin -SimpleCrypt.exe nasmw.exe nasmw.bin \ No newline at end of file diff --git a/4klang_source/Go4kVSTi/win/nasmw.exe b/4klang_source/Go4kVSTi/win/nasmw.exe deleted file mode 100644 index 8d72cc7..0000000 Binary files a/4klang_source/Go4kVSTi/win/nasmw.exe and /dev/null differ diff --git a/4klang_source/Go4kVSTi/win/shell.bat b/4klang_source/Go4kVSTi/win/shell.bat deleted file mode 100644 index 6e07473..0000000 --- a/4klang_source/Go4kVSTi/win/shell.bat +++ /dev/null @@ -1 +0,0 @@ -cmd.exe \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..128e472 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,37 @@ +cmake_minimum_required(VERSION 3.14) + +# This policy is needed so that we can set the MSVC_RUNTIME to statically linked +# i.e. set_property(TARGET 4klang PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") +cmake_policy(SET CMP0091 NEW) + +project(4klang + VERSION 3.3.2 + DESCRIPTION "A modular synthesizer for 4k/8k intros" + LANGUAGES C CXX) + +# Only do these if this is the main project, and not if it is included through add_subdirectory +if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) + # Let's ensure -std=c++xx instead of -std=g++xx + set(CMAKE_CXX_EXTENSIONS OFF) + + # Let's nicely support folders in IDE's + set_property(GLOBAL PROPERTY USE_FOLDERS ON) + + # Testing only available if this is the main app + # Note this needs to be done in the main CMakeLists + # since it calls enable_testing, which must be in the + # main CMakeLists. + include(CTest) +endif() + +enable_language(ASM_NASM) + +# The normal NASM compile object does not include +# By putting them there, we can pass the same compile definitions to C and ASM +set(CMAKE_ASM_NASM_COMPILE_OBJECT " -f ${CMAKE_ASM_NASM_OBJECT_FORMAT} -o ") + +# The compiled VSTi is here +add_subdirectory(src) + +# We should put examples here +# add_subdirectory(examples) diff --git a/CMakeSettings.json b/CMakeSettings.json new file mode 100644 index 0000000..552c223 --- /dev/null +++ b/CMakeSettings.json @@ -0,0 +1,28 @@ +{ + "configurations": [ + { + "name": "x86-Debug", + "generator": "Ninja", + "configurationType": "Debug", + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "-v", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x86" ], + "variables": [] + }, + { + "name": "x86-Release", + "generator": "Ninja", + "configurationType": "RelWithDebInfo", + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "-v", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x86" ], + "variables": [] + } + ] +} \ No newline at end of file diff --git a/4klang_source/Go4kVSTi/win/library/vstgui.lib b/extern/vstgui.lib similarity index 100% rename from 4klang_source/Go4kVSTi/win/library/vstgui.lib rename to extern/vstgui.lib diff --git a/4klang_VSTi/2010_ergon_5.4kp b/instruments/2010_ergon_5.4kp similarity index 100% rename from 4klang_VSTi/2010_ergon_5.4kp rename to instruments/2010_ergon_5.4kp diff --git a/4klang_VSTi/2010_ergon_5.xrns b/instruments/2010_ergon_5.xrns similarity index 100% rename from 4klang_VSTi/2010_ergon_5.xrns rename to instruments/2010_ergon_5.xrns diff --git a/4klang_VSTi/BA_Dark.4ki b/instruments/BA_Dark.4ki similarity index 100% rename from 4klang_VSTi/BA_Dark.4ki rename to instruments/BA_Dark.4ki diff --git a/4klang_VSTi/BA_DarkChorus.4ki b/instruments/BA_DarkChorus.4ki similarity index 100% rename from 4klang_VSTi/BA_DarkChorus.4ki rename to instruments/BA_DarkChorus.4ki diff --git a/4klang_VSTi/BA_Deepness.4ki b/instruments/BA_Deepness.4ki similarity index 100% rename from 4klang_VSTi/BA_Deepness.4ki rename to instruments/BA_Deepness.4ki diff --git a/4klang_VSTi/BA_DirectPunchMS.4ki b/instruments/BA_DirectPunchMS.4ki similarity index 100% rename from 4klang_VSTi/BA_DirectPunchMS.4ki rename to instruments/BA_DirectPunchMS.4ki diff --git a/4klang_VSTi/BA_Mighty.4ki b/instruments/BA_Mighty.4ki similarity index 100% rename from 4klang_VSTi/BA_Mighty.4ki rename to instruments/BA_Mighty.4ki diff --git a/4klang_VSTi/BA_Mighty_Feedback.4ki b/instruments/BA_Mighty_Feedback.4ki similarity index 100% rename from 4klang_VSTi/BA_Mighty_Feedback.4ki rename to instruments/BA_Mighty_Feedback.4ki diff --git a/4klang_VSTi/BA_NotFromThisWorld.4ki b/instruments/BA_NotFromThisWorld.4ki similarity index 100% rename from 4klang_VSTi/BA_NotFromThisWorld.4ki rename to instruments/BA_NotFromThisWorld.4ki diff --git a/4klang_VSTi/BA_NotFromThisWorld2.4ki b/instruments/BA_NotFromThisWorld2.4ki similarity index 100% rename from 4klang_VSTi/BA_NotFromThisWorld2.4ki rename to instruments/BA_NotFromThisWorld2.4ki diff --git a/4klang_VSTi/BA_SawBass.4ki b/instruments/BA_SawBass.4ki similarity index 100% rename from 4klang_VSTi/BA_SawBass.4ki rename to instruments/BA_SawBass.4ki diff --git a/4klang_VSTi/BA_SawBassFlanger.4ki b/instruments/BA_SawBassFlanger.4ki similarity index 100% rename from 4klang_VSTi/BA_SawBassFlanger.4ki rename to instruments/BA_SawBassFlanger.4ki diff --git a/4klang_VSTi/GA_RestInPeaceMS.4ki b/instruments/GA_RestInPeaceMS.4ki similarity index 100% rename from 4klang_VSTi/GA_RestInPeaceMS.4ki rename to instruments/GA_RestInPeaceMS.4ki diff --git a/4klang_VSTi/KY_GarageOrgan.4ki b/instruments/KY_GarageOrgan.4ki similarity index 100% rename from 4klang_VSTi/KY_GarageOrgan.4ki rename to instruments/KY_GarageOrgan.4ki diff --git a/4klang_VSTi/KY_GarageOrganChorus.4ki b/instruments/KY_GarageOrganChorus.4ki similarity index 100% rename from 4klang_VSTi/KY_GarageOrganChorus.4ki rename to instruments/KY_GarageOrganChorus.4ki diff --git a/4klang_VSTi/KY_Lullaby.4ki b/instruments/KY_Lullaby.4ki similarity index 100% rename from 4klang_VSTi/KY_Lullaby.4ki rename to instruments/KY_Lullaby.4ki diff --git a/4klang_VSTi/KY_Lullaby2.4ki b/instruments/KY_Lullaby2.4ki similarity index 100% rename from 4klang_VSTi/KY_Lullaby2.4ki rename to instruments/KY_Lullaby2.4ki diff --git a/4klang_VSTi/KY_Rhodes.4ki b/instruments/KY_Rhodes.4ki similarity index 100% rename from 4klang_VSTi/KY_Rhodes.4ki rename to instruments/KY_Rhodes.4ki diff --git a/4klang_VSTi/LD_AlphaOmegaMS.4ki b/instruments/LD_AlphaOmegaMS.4ki similarity index 100% rename from 4klang_VSTi/LD_AlphaOmegaMS.4ki rename to instruments/LD_AlphaOmegaMS.4ki diff --git a/4klang_VSTi/LD_Farscape.4ki b/instruments/LD_Farscape.4ki similarity index 100% rename from 4klang_VSTi/LD_Farscape.4ki rename to instruments/LD_Farscape.4ki diff --git a/4klang_VSTi/LD_More&MoreMS.4ki b/instruments/LD_More&MoreMS.4ki similarity index 100% rename from 4klang_VSTi/LD_More&MoreMS.4ki rename to instruments/LD_More&MoreMS.4ki diff --git a/4klang_VSTi/LD_Morpher.4ki b/instruments/LD_Morpher.4ki similarity index 100% rename from 4klang_VSTi/LD_Morpher.4ki rename to instruments/LD_Morpher.4ki diff --git a/4klang_VSTi/LD_RestInPeaceMS.4ki b/instruments/LD_RestInPeaceMS.4ki similarity index 100% rename from 4klang_VSTi/LD_RestInPeaceMS.4ki rename to instruments/LD_RestInPeaceMS.4ki diff --git a/4klang_VSTi/LD_Short&PunchyMS.4ki b/instruments/LD_Short&PunchyMS.4ki similarity index 100% rename from 4klang_VSTi/LD_Short&PunchyMS.4ki rename to instruments/LD_Short&PunchyMS.4ki diff --git a/4klang_VSTi/LightRythm.4kp b/instruments/LightRythm.4kp similarity index 100% rename from 4klang_VSTi/LightRythm.4kp rename to instruments/LightRythm.4kp diff --git a/4klang_VSTi/LightRythm.mt2 b/instruments/LightRythm.mt2 similarity index 100% rename from 4klang_VSTi/LightRythm.mt2 rename to instruments/LightRythm.mt2 diff --git a/4klang_VSTi/LightRythm.xrns b/instruments/LightRythm.xrns similarity index 100% rename from 4klang_VSTi/LightRythm.xrns rename to instruments/LightRythm.xrns diff --git a/4klang_VSTi/PA_Fairies.4ki b/instruments/PA_Fairies.4ki similarity index 100% rename from 4klang_VSTi/PA_Fairies.4ki rename to instruments/PA_Fairies.4ki diff --git a/4klang_VSTi/PA_Jarresque.4ki b/instruments/PA_Jarresque.4ki similarity index 100% rename from 4klang_VSTi/PA_Jarresque.4ki rename to instruments/PA_Jarresque.4ki diff --git a/4klang_VSTi/PA_JarresqueChorus.4ki b/instruments/PA_JarresqueChorus.4ki similarity index 100% rename from 4klang_VSTi/PA_JarresqueChorus.4ki rename to instruments/PA_JarresqueChorus.4ki diff --git a/4klang_VSTi/PA_LoFiChoir.4ki b/instruments/PA_LoFiChoir.4ki similarity index 100% rename from 4klang_VSTi/PA_LoFiChoir.4ki rename to instruments/PA_LoFiChoir.4ki diff --git a/4klang_VSTi/PA_LongPad.4ki b/instruments/PA_LongPad.4ki similarity index 100% rename from 4klang_VSTi/PA_LongPad.4ki rename to instruments/PA_LongPad.4ki diff --git a/4klang_VSTi/PA_Minorium.4ki b/instruments/PA_Minorium.4ki similarity index 100% rename from 4klang_VSTi/PA_Minorium.4ki rename to instruments/PA_Minorium.4ki diff --git a/4klang_VSTi/PA_Strangeland.4ki b/instruments/PA_Strangeland.4ki similarity index 100% rename from 4klang_VSTi/PA_Strangeland.4ki rename to instruments/PA_Strangeland.4ki diff --git a/4klang_VSTi/PA_StrangelandChorus.4ki b/instruments/PA_StrangelandChorus.4ki similarity index 100% rename from 4klang_VSTi/PA_StrangelandChorus.4ki rename to instruments/PA_StrangelandChorus.4ki diff --git a/4klang_VSTi/PA_SynastasiaMS.4ki b/instruments/PA_SynastasiaMS.4ki similarity index 100% rename from 4klang_VSTi/PA_SynastasiaMS.4ki rename to instruments/PA_SynastasiaMS.4ki diff --git a/4klang_VSTi/SY_RandomArp.4ki b/instruments/SY_RandomArp.4ki similarity index 100% rename from 4klang_VSTi/SY_RandomArp.4ki rename to instruments/SY_RandomArp.4ki diff --git a/4klang_VSTi/SY_RandomArpFlanger.4ki b/instruments/SY_RandomArpFlanger.4ki similarity index 100% rename from 4klang_VSTi/SY_RandomArpFlanger.4ki rename to instruments/SY_RandomArpFlanger.4ki diff --git a/4klang_VSTi/Untitled2.mt2 b/instruments/Untitled2.mt2 similarity index 100% rename from 4klang_VSTi/Untitled2.mt2 rename to instruments/Untitled2.mt2 diff --git a/4klang_VSTi/airy.4ki b/instruments/airy.4ki similarity index 100% rename from 4klang_VSTi/airy.4ki rename to instruments/airy.4ki diff --git a/4klang_VSTi/baghdad.4kp b/instruments/baghdad.4kp similarity index 100% rename from 4klang_VSTi/baghdad.4kp rename to instruments/baghdad.4kp diff --git a/4klang_VSTi/baghdad.xrns b/instruments/baghdad.xrns similarity index 100% rename from 4klang_VSTi/baghdad.xrns rename to instruments/baghdad.xrns diff --git a/4klang_VSTi/basedrum.4ki b/instruments/basedrum.4ki similarity index 100% rename from 4klang_VSTi/basedrum.4ki rename to instruments/basedrum.4ki diff --git a/4klang_VSTi/basedrum2.4ki b/instruments/basedrum2.4ki similarity index 100% rename from 4klang_VSTi/basedrum2.4ki rename to instruments/basedrum2.4ki diff --git a/4klang_VSTi/basedrum3.4ki b/instruments/basedrum3.4ki similarity index 100% rename from 4klang_VSTi/basedrum3.4ki rename to instruments/basedrum3.4ki diff --git a/4klang_VSTi/basedrum4.4ki b/instruments/basedrum4.4ki similarity index 100% rename from 4klang_VSTi/basedrum4.4ki rename to instruments/basedrum4.4ki diff --git a/4klang_VSTi/bass.4ki b/instruments/bass.4ki similarity index 100% rename from 4klang_VSTi/bass.4ki rename to instruments/bass.4ki diff --git a/4klang_VSTi/bass2.4ki b/instruments/bass2.4ki similarity index 100% rename from 4klang_VSTi/bass2.4ki rename to instruments/bass2.4ki diff --git a/4klang_VSTi/bf-enlighten.4kp b/instruments/bf-enlighten.4kp similarity index 100% rename from 4klang_VSTi/bf-enlighten.4kp rename to instruments/bf-enlighten.4kp diff --git a/4klang_VSTi/bf-enlighten.it b/instruments/bf-enlighten.it similarity index 100% rename from 4klang_VSTi/bf-enlighten.it rename to instruments/bf-enlighten.it diff --git a/4klang_VSTi/c0c00n_001.4kp b/instruments/c0c00n_001.4kp similarity index 100% rename from 4klang_VSTi/c0c00n_001.4kp rename to instruments/c0c00n_001.4kp diff --git a/4klang_VSTi/c0c00n_001.mt2 b/instruments/c0c00n_001.mt2 similarity index 100% rename from 4klang_VSTi/c0c00n_001.mt2 rename to instruments/c0c00n_001.mt2 diff --git a/4klang_VSTi/c0c00n_001.xrns b/instruments/c0c00n_001.xrns similarity index 100% rename from 4klang_VSTi/c0c00n_001.xrns rename to instruments/c0c00n_001.xrns diff --git a/4klang_VSTi/clap.4ki b/instruments/clap.4ki similarity index 100% rename from 4klang_VSTi/clap.4ki rename to instruments/clap.4ki diff --git a/4klang_VSTi/dollop.4kp b/instruments/dollop.4kp similarity index 100% rename from 4klang_VSTi/dollop.4kp rename to instruments/dollop.4kp diff --git a/4klang_VSTi/dollop.xrns b/instruments/dollop.xrns similarity index 100% rename from 4klang_VSTi/dollop.xrns rename to instruments/dollop.xrns diff --git a/4klang_VSTi/example.4kp b/instruments/example.4kp similarity index 100% rename from 4klang_VSTi/example.4kp rename to instruments/example.4kp diff --git a/4klang_VSTi/example.mt2 b/instruments/example.mt2 similarity index 100% rename from 4klang_VSTi/example.mt2 rename to instruments/example.mt2 diff --git a/4klang_VSTi/example.xrns b/instruments/example.xrns similarity index 100% rename from 4klang_VSTi/example.xrns rename to instruments/example.xrns diff --git a/4klang_VSTi/example2.4kp b/instruments/example2.4kp similarity index 100% rename from 4klang_VSTi/example2.4kp rename to instruments/example2.4kp diff --git a/4klang_VSTi/example2.mt2 b/instruments/example2.mt2 similarity index 100% rename from 4klang_VSTi/example2.mt2 rename to instruments/example2.mt2 diff --git a/4klang_VSTi/example2.xrns b/instruments/example2.xrns similarity index 100% rename from 4klang_VSTi/example2.xrns rename to instruments/example2.xrns diff --git a/4klang_VSTi/guitar.4ki b/instruments/guitar.4ki similarity index 100% rename from 4klang_VSTi/guitar.4ki rename to instruments/guitar.4ki diff --git a/4klang_VSTi/guitar2.4ki b/instruments/guitar2.4ki similarity index 100% rename from 4klang_VSTi/guitar2.4ki rename to instruments/guitar2.4ki diff --git a/4klang_VSTi/hihat.4ki b/instruments/hihat.4ki similarity index 100% rename from 4klang_VSTi/hihat.4ki rename to instruments/hihat.4ki diff --git a/4klang_VSTi/hihat2.4ki b/instruments/hihat2.4ki similarity index 100% rename from 4klang_VSTi/hihat2.4ki rename to instruments/hihat2.4ki diff --git a/4klang_VSTi/kevinspacy.4kp b/instruments/kevinspacy.4kp similarity index 100% rename from 4klang_VSTi/kevinspacy.4kp rename to instruments/kevinspacy.4kp diff --git a/4klang_VSTi/kevinspacy.mt2 b/instruments/kevinspacy.mt2 similarity index 100% rename from 4klang_VSTi/kevinspacy.mt2 rename to instruments/kevinspacy.mt2 diff --git a/4klang_VSTi/kevinspacy.xrns b/instruments/kevinspacy.xrns similarity index 100% rename from 4klang_VSTi/kevinspacy.xrns rename to instruments/kevinspacy.xrns diff --git a/4klang_VSTi/pad.4ki b/instruments/pad.4ki similarity index 100% rename from 4klang_VSTi/pad.4ki rename to instruments/pad.4ki diff --git a/4klang_VSTi/pad2.4ki b/instruments/pad2.4ki similarity index 100% rename from 4klang_VSTi/pad2.4ki rename to instruments/pad2.4ki diff --git a/4klang_VSTi/piano.4ki b/instruments/piano.4ki similarity index 100% rename from 4klang_VSTi/piano.4ki rename to instruments/piano.4ki diff --git a/4klang_VSTi/piano2.4ki b/instruments/piano2.4ki similarity index 100% rename from 4klang_VSTi/piano2.4ki rename to instruments/piano2.4ki diff --git a/4klang_VSTi/punqtured-sundowner.4kp b/instruments/punqtured-sundowner.4kp similarity index 100% rename from 4klang_VSTi/punqtured-sundowner.4kp rename to instruments/punqtured-sundowner.4kp diff --git a/4klang_VSTi/punqtured-sundowner.xrns b/instruments/punqtured-sundowner.xrns similarity index 100% rename from 4klang_VSTi/punqtured-sundowner.xrns rename to instruments/punqtured-sundowner.xrns diff --git a/4klang_VSTi/rimshot.4ki b/instruments/rimshot.4ki similarity index 100% rename from 4klang_VSTi/rimshot.4ki rename to instruments/rimshot.4ki diff --git a/4klang_VSTi/snare.4ki b/instruments/snare.4ki similarity index 100% rename from 4klang_VSTi/snare.4ki rename to instruments/snare.4ki diff --git a/4klang_VSTi/snare2.4ki b/instruments/snare2.4ki similarity index 100% rename from 4klang_VSTi/snare2.4ki rename to instruments/snare2.4ki diff --git a/4klang_VSTi/snare3.4ki b/instruments/snare3.4ki similarity index 100% rename from 4klang_VSTi/snare3.4ki rename to instruments/snare3.4ki diff --git a/4klang_VSTi/snare4.4ki b/instruments/snare4.4ki similarity index 100% rename from 4klang_VSTi/snare4.4ki rename to instruments/snare4.4ki diff --git a/4klang_VSTi/snare5.4ki b/instruments/snare5.4ki similarity index 100% rename from 4klang_VSTi/snare5.4ki rename to instruments/snare5.4ki diff --git a/4klang_VSTi/snare6.4ki b/instruments/snare6.4ki similarity index 100% rename from 4klang_VSTi/snare6.4ki rename to instruments/snare6.4ki diff --git a/4klang_VSTi/string.4ki b/instruments/string.4ki similarity index 100% rename from 4klang_VSTi/string.4ki rename to instruments/string.4ki diff --git a/4klang_VSTi/synth.4ki b/instruments/synth.4ki similarity index 100% rename from 4klang_VSTi/synth.4ki rename to instruments/synth.4ki diff --git a/4klang_VSTi/synthFlanger.4ki b/instruments/synthFlanger.4ki similarity index 100% rename from 4klang_VSTi/synthFlanger.4ki rename to instruments/synthFlanger.4ki diff --git a/4klang_VSTi/untitled2.4kp b/instruments/untitled2.4kp similarity index 100% rename from 4klang_VSTi/untitled2.4kp rename to instruments/untitled2.4kp diff --git a/4klang_VSTi/untitled2.xrns b/instruments/untitled2.xrns similarity index 100% rename from 4klang_VSTi/untitled2.xrns rename to instruments/untitled2.xrns diff --git a/4klang_VSTi/virgill - 4klang basics.4kp b/instruments/virgill - 4klang basics.4kp similarity index 100% rename from 4klang_VSTi/virgill - 4klang basics.4kp rename to instruments/virgill - 4klang basics.4kp diff --git a/4klang_source/Go4kVSTi/win/4klang.asm b/src/4klang.inc similarity index 96% rename from 4klang_source/Go4kVSTi/win/4klang.asm rename to src/4klang.inc index a3c896d..d6c421b 100644 --- a/4klang_source/Go4kVSTi/win/4klang.asm +++ b/src/4klang.inc @@ -1,1758 +1,1754 @@ -bits 32 - -%define WRK ebp ; // alias for unit workspace -%define VAL esi ; // alias for unit values (transformed/untransformed) -%define COM ebx ; // alias for instrument opcodes - -%include "4klang.inc" - -;// conditional defines - -%ifdef GO4K_USE_VCO_SHAPE - %define INCLUDE_WAVESHAPER -%endif -%ifdef GO4K_USE_DST - %define INCLUDE_WAVESHAPER -%endif - -%ifdef GO4K_USE_VCO_MOD_PM - %define PHASE_RENORMALIZE -%endif -%ifdef GO4K_USE_VCO_PHASE_OFFSET - %define PHASE_RENORMALIZE -%endif - -%ifdef GO4K_USE_ENVELOPE_RECORDINGS - %define GO4K_USE_BUFFER_RECORDINGS -%endif -%ifdef GO4K_USE_NOTE_RECORDINGS - %define GO4K_USE_BUFFER_RECORDINGS -%endif - -; //======================================================================================== -; // .bss section -; //======================================================================================== -%ifdef USE_SECTIONS -section .g4kbss1 bss align=1 -%else -section .bss -%endif - -; // the one and only synth object -%if MAX_VOICES > 1 -go4k_voiceindex resd 16 -%endif -go4k_transformed_values resd 16 -go4k_synth_wrk resb go4k_synth.size -global _go4k_delay_buffer_ofs -_go4k_delay_buffer_ofs resd 1 -global _go4k_delay_buffer -_go4k_delay_buffer resd 16*16*go4kDLL_wrk.size - -%ifdef AUTHORING -global __4klang_current_tick -__4klang_current_tick resd 0 -%endif - -%ifdef GO4K_USE_ENVELOPE_RECORDINGS -global __4klang_envelope_buffer -__4klang_envelope_buffer resd ((MAX_SAMPLES)/8) ; // samples every 256 samples and stores 16*2 = 32 values -%endif -%ifdef GO4K_USE_NOTE_RECORDINGS -global __4klang_note_buffer -__4klang_note_buffer resd ((MAX_SAMPLES)/8) ; // samples every 256 samples and stores 16*2 = 32 values -%endif - -; //======================================================================================== -; // .g4kdat section (initialized data for go4k) -; //======================================================================================== -%ifdef USE_SECTIONS -section .g4kdat1 data align=1 -%else -section .data -%endif - -; // some synth constants -go4k_synth_commands dd 0 - dd _go4kENV_func@0 - dd _go4kVCO_func@0 - dd _go4kVCF_func@0 - dd _go4kDST_func@0 - dd _go4kDLL_func@0 - dd _go4kFOP_func@0 - dd _go4kFST_func@0 - dd _go4kPAN_func@0 - dd _go4kOUT_func@0 - dd _go4kACC_func@0 - dd _go4kFLD_func@0 -%ifdef GO4K_USE_GLITCH - dd _go4kGLITCH_func@0 -%else - dd _go4kFLD_func@0 -%endif -%ifdef GO4K_USE_FSTG - dd _go4kFSTG_func@0 -%endif - -%ifdef USE_SECTIONS -section .g4kdat2 data align=1 -%else -section .data -%endif - -%ifdef GO4K_USE_16BIT_OUTPUT -c_32767 dd 32767.0 -%endif -c_i128 dd 0.0078125 -c_RandDiv dd 65536*32768 -c_0_5 dd 0.5 -%ifdef GO4K_USE_VCO_GATE -c_16 dd 16.0 -%endif -%ifdef GO4K_USE_DLL_CHORUS -DLL_DEPTH dd 1024.0 -%endif -%ifdef GO4K_USE_DLL_DC_FILTER -c_dc_const dd 0.99609375 ; R = 1 - (pi*2 * frequency /samplerate) -%else - %ifdef GO4K_USE_VCO_GATE -c_dc_const dd 0.99609375 ; R = 1 - (pi*2 * frequency /samplerate) - %endif -%endif -global _RandSeed -_RandSeed dd 1 -c_24 dd 24 -c_i12 dd 0x3DAAAAAA -FREQ_NORMALIZE dd 0.000092696138 ; // 220.0/(2^(69/12)) / 44100.0 -global _LFO_NORMALIZE -_LFO_NORMALIZE dd DEF_LFO_NORMALIZE -%ifdef GO4K_USE_GROOVE_PATTERN -go4k_groove_pattern dw 0011100111001110b -%endif - -; //======================================================================================== -; // .crtemui section (emulates crt functions) -; //======================================================================================== -%ifdef USE_SECTIONS -section .crtemui code align=1 -%else -section .text -%endif - -export_func FloatRandomNumber@0 - push eax - imul eax,dword [_RandSeed],16007 - mov dword [_RandSeed], eax - fild dword [_RandSeed] - fidiv dword [c_RandDiv] - pop eax - ret - -; //======================================================================================== -; // .g4kcod* sections (code for go4k) -; //======================================================================================== - -%ifdef INCLUDE_WAVESHAPER - -%ifdef USE_SECTIONS -section .g4kcod2 code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // Waveshaper function -; //---------------------------------------------------------------------------------------- -; // Input : st0 : shaping coeff -; // st1 : input -; // Output: st0 : result -; //---------------------------------------------------------------------------------------- - -go4kWaveshaper: -%ifdef GO4K_USE_WAVESHAPER_CLIP - fxch - fld1 ; // 1 val - fucomi st1 ; // 1 val - jbe short go4kWaveshaper_clip - fchs ; // -1 val - fucomi st1 ; // -1 val - fcmovb st0, st1 ; // val -1 (if val > -1) -go4kWaveshaper_clip: - fstp st1 ; // newval - fxch -%endif - fsub dword [c_0_5] - fadd st0 - fst dword [esp-4] ; // amnt in - fadd st0 ; // 2*amnt in - fld1 ; // 1 2*amnt in - fsub dword [esp-4] ; // 1-amnt 2*amnt in - fdivp st1, st0 ; // k in - fld st1 ; // sin k in - fabs ; // a(in) k in - fmul st1 ; // k*a(in) k in - fld1 - faddp st1, st0 ; // 1+k*a(in) k in - fxch st1 ; // k 1+k*a(in) in - fld1 - faddp st1, st0 ; // 1+k 1+k*a(in) in - fmulp st2 ; // 1+k*a(in) (1+k)*in - fdivp st1, st0 ; // out - ret - -%endif - -%ifdef USE_SECTIONS -section .g4kcod3 code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // unit values preparation/transform -; //---------------------------------------------------------------------------------------- -go4kTransformValues: - push ecx - xor ecx, ecx - xor eax, eax - mov edx, go4k_transformed_values -go4kTransformValues_loop: - lodsb - push eax - fild dword [esp] - fmul dword [c_i128] - fstp dword [edx+ecx*4] - pop eax - inc ecx - cmp ecx, dword [esp+8] - jl go4kTransformValues_loop - pop ecx - ret 4 - -%ifdef USE_SECTIONS -section .g4kcod4 code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // Envelope param mapping -; //---------------------------------------------------------------------------------------- -go4kENVMap: - fld dword [edx+eax*4] -%ifdef GO4K_USE_ENV_MOD_ADR - fadd dword [WRK+go4kENV_wrk.am+eax*4] -%endif - fimul dword [c_24] - fchs -; //---------------------------------------------------------------------------------------- -; // Power function (2^x) -; //---------------------------------------------------------------------------------------- -; // Input : st0 : base -; // st1 : exponent -; // Output: st0 : result -; //---------------------------------------------------------------------------------------- -export_func Power@0 ; // base exp - fld1 - fadd st0 - fyl2x ; // log2_base - fld1 ; // 1 log2_base - fld st1 ; // log2_base 1 log2_base - fprem ; // (frac)log2_base 1 log2_base - f2xm1 ; // 2 ^ '' - 1 1 log2_base - faddp st1, st0 ; // 2 ^ '' (int)log2_base - fscale - fstp st1 - ret - -%ifdef USE_SECTIONS -section .g4kcoda code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // ENV Tick -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : eax -; //---------------------------------------------------------------------------------------- -export_func go4kENV_func@0 - push 5 - call go4kTransformValues -%ifdef GO4K_USE_ENV_CHECK -; check if current note still active - mov eax, dword [ecx-4] - test eax, eax - jne go4kENV_func_do - fldz - ret -%endif -go4kENV_func_do: - mov eax, dword [ecx-8] ; // is the instrument in release mode (note off)? - test eax, eax - je go4kENV_func_process - mov dword [WRK+go4kENV_wrk.state], ENV_STATE_RELEASE -go4kENV_func_process: - mov eax, dword [WRK+go4kENV_wrk.state] - fld dword [WRK+go4kENV_wrk.level] ; // val - -; // check for sustain state - cmp al, ENV_STATE_SUSTAIN - je short go4kENV_func_leave2 -go4kENV_func_attac: - cmp al, ENV_STATE_ATTAC - jne short go4kENV_func_decay - call go4kENVMap ; // newval - faddp st1, st0 -; // check for end of attac - fld1 ; // 1 newval - fucomi st1 ; // 1 newval - fcmovnb st0, st1 ; // newval 1 (if newval < 1) - jbe short go4kENV_func_statechange -go4kENV_func_decay: - cmp al, ENV_STATE_DECAY - jne short go4kENV_func_release - call go4kENVMap ; // newval - fsubp st1, st0 -; // check for end of decay - fld dword [edx+go4kENV_val.sustain] ; // sustain newval - fucomi st1 ; // sustain newval - fcmovb st0, st1 ; // newval sustain (if newval > sustain) - jnc short go4kENV_func_statechange -go4kENV_func_release: -; // release state? - cmp al, ENV_STATE_RELEASE - jne short go4kENV_func_leave - call go4kENVMap ; // newval - fsubp st1, st0 -; // check for end of release - fldz ; // 0 newval - fucomi st1 ; // 0 newval - fcmovb st0, st1 ; // newval 0 (if newval > 0) - jc short go4kENV_func_leave -go4kENV_func_statechange: ; // newval - inc dword [WRK+go4kENV_wrk.state] -go4kENV_func_leave: ; // newval bla - fstp st1 -; // store new env value - fst dword [WRK+go4kENV_wrk.level] -go4kENV_func_leave2: -; // mul by gain -%ifdef GO4K_USE_ENV_MOD_GM - fld dword [edx+go4kENV_val.gain] - fadd dword [WRK+go4kENV_wrk.gm] - fmulp st1, st0 -%else - fmul dword [edx+go4kENV_val.gain] -%endif - ret - - -; //---------------------------------------------------------------------------------------- -; // VCO Tick -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : eax -; //---------------------------------------------------------------------------------------- -%ifdef USE_SECTIONS -section .g4kcodp code align=1 -%else -section .text -%endif -go4kVCO_pulse: - fucomi st1 ; // c p - fld1 - jnc short go4kVCO_func_pulse_up ; // +1 c p - fchs ; // -1 c p -go4kVCO_func_pulse_up: - fstp st1 ; // +-1 p - fstp st1 ; // +-1 - ret - -%ifdef USE_SECTIONS -section .g4kcodt code align=1 -%else -section .text -%endif -go4kVCO_trisaw: - fucomi st1 ; // c p - jnc short go4kVCO_func_trisaw_up - fld1 ; // 1 c p - fsubr st2, st0 ; // 1 c 1-p - fsubrp st1, st0 ; // 1-c 1-p -go4kVCO_func_trisaw_up: - fdivp st1, st0 ; // tp'/tc - fadd st0 ; // 2*'' - fld1 ; // 1 2*'' - fsubp st1, st0 ; // 2*''-1 - ret - -%ifdef USE_SECTIONS -section .g4kcods code align=1 -%else -section .text -%endif -go4kVCO_sine: - fucomi st1 ; // c p - jnc short go4kVCO_func_sine_do - fstp st1 - fsub st0, st0 ; // 0 - ret -go4kVCO_func_sine_do - fdivp st1, st0 ; // p/c - fldpi ; // pi p - fadd st0 ; // 2*pi p - fmulp st1, st0 ; // 2*pi*p - fsin ; // sin(2*pi*p) - ret - -%ifdef GO4K_USE_VCO_GATE -%ifdef USE_SECTIONS -section .g4kcodq code align=1 -%else -section .text -%endif -go4kVCO_gate: - fxch ; // p c - fstp st1 ; // p - fmul dword [c_16] ; // p' - push eax - push eax - fistp dword [esp] ; // - - fld1 ; // 1 - pop eax - and al, 0xf - bt word [VAL-5],ax - jc go4kVCO_gate_bit - fsub st0, st0 ; // 0 -go4kVCO_gate_bit: - fld dword [WRK+go4kVCO_wrk.cm] ; // f x - fsub st1 ; // f-x x - fmul dword [c_dc_const] ; // c(f-x) x - faddp st1, st0 ; // x' - fst dword [WRK+go4kVCO_wrk.cm] - pop eax - ret -%endif - -%ifdef USE_SECTIONS -section .g4kcodb code align=1 -%else -section .text -%endif -export_func go4kVCO_func@0 -%ifdef GO4K_USE_VCO_PHASE_OFFSET - %ifdef GO4K_USE_VCO_SHAPE - %ifdef GO4K_USE_VCO_GATE - push 8 - %else - push 7 - %endif - %else - %ifdef GO4K_USE_VCO_GATE - push 7 - %else - push 6 - %endif - %endif -%else - %ifdef GO4K_USE_VCO_SHAPE - %ifdef GO4K_USE_VCO_GATE - push 7 - %else - push 6 - %endif - %else - %ifdef GO4K_USE_VCO_GATE - push 6 - %else - push 5 - %endif - %endif -%endif - call go4kTransformValues -%ifdef GO4K_USE_VCO_CHECK -; check if current note still active - mov eax, dword [ecx-4] - test eax, eax - jne go4kVCO_func_do -%ifdef GO4K_USE_VCO_STEREO - movzx eax, byte [VAL-1] ; // get flags and check for stereo - test al, byte VCO_STEREO - jz short go4kVCO_func_nostereoout - fldz -go4kVCO_func_nostereoout: -%endif - fldz - ret -go4kVCO_func_do: -%endif - movzx eax, byte [VAL-1] ; // get flags -%ifdef GO4K_USE_VCO_STEREO - test al, byte VCO_STEREO - jz short go4kVCO_func_nopswap - fld dword [WRK+go4kVCO_wrk.phase] ;// swap left/right phase values for first stereo run - fld dword [WRK+go4kVCO_wrk.phase2] - fstp dword [WRK+go4kVCO_wrk.phase] - fstp dword [WRK+go4kVCO_wrk.phase2] -go4kVCO_func_nopswap: -%endif -go4kVCO_func_process: - fld dword [edx+go4kVCO_val.transpose] - fsub dword [c_0_5] -%ifdef GO4K_USE_VCO_MOD_TM - fadd dword [WRK+go4kVCO_wrk.tm] -%endif - fdiv dword [c_i128] - fld dword [edx+go4kVCO_val.detune] - fsub dword [c_0_5] - fadd st0 -%ifdef GO4K_USE_VCO_STEREO - test al, byte VCO_STEREO - jz short go4kVCO_func_nodswap - fchs ;// negate detune for stereo -go4kVCO_func_nodswap: -%endif - faddp st1 -%ifdef GO4K_USE_VCO_MOD_DM - fadd dword [WRK+go4kVCO_wrk.dm] -%endif - ; // st0 now contains the transpose+detune offset - test al, byte LFO - jnz go4kVCO_func_skipnote - fiadd dword [ecx-4] ; // st0 is note, st1 is t+d offset -go4kVCO_func_skipnote: - fmul dword [c_i12] - call _Power@0 - test al, byte LFO - jz short go4kVCO_func_normalize_note - fmul dword [_LFO_NORMALIZE] ; // st0 is now frequency for lfo - jmp short go4kVCO_func_normalized -go4kVCO_func_normalize_note: - fmul dword [FREQ_NORMALIZE] ; // st0 is now frequency -go4kVCO_func_normalized: - fadd dword [WRK+go4kVCO_wrk.phase] -%ifdef GO4K_USE_VCO_MOD_FM - fadd dword [WRK+go4kVCO_wrk.fm] -%endif - fld1 - fadd st1, st0 - fxch - fprem - fstp st1 - fst dword [WRK+go4kVCO_wrk.phase] -%ifdef GO4K_USE_VCO_MOD_PM - fadd dword [WRK+go4kVCO_wrk.pm] -%endif -%ifdef GO4K_USE_VCO_PHASE_OFFSET - fadd dword [edx+go4kVCO_val.phaseofs] -%endif -%ifdef PHASE_RENORMALIZE - fld1 - fadd st1, st0 - fxch - fprem - fstp st1 ; // p -%endif - fld dword [edx+go4kVCO_val.color] ; // c p -%ifdef GO4K_USE_VCO_MOD_CM - fadd dword [WRK+go4kVCO_wrk.cm] ; // c p -%endif -go4kVCO_func_sine: - test al, byte SINE - jz short go4kVCO_func_trisaw - call go4kVCO_sine -go4kVCO_func_trisaw: - test al, byte TRISAW - jz short go4kVCO_func_pulse - call go4kVCO_trisaw -go4kVCO_func_pulse: - test al, byte PULSE -%ifdef GO4K_USE_VCO_GATE - jz short go4kVCO_func_gate -%else - jz short go4kVCO_func_noise -%endif - call go4kVCO_pulse -%ifdef GO4K_USE_VCO_GATE -go4kVCO_func_gate: - test al, byte GATE - jz short go4kVCO_func_noise - call go4kVCO_gate -%endif -go4kVCO_func_noise: - test al, byte NOISE - jz short go4kVCO_func_end - call _FloatRandomNumber@0 - fstp st1 - fstp st1 -go4kVCO_func_end: -%ifdef GO4K_USE_VCO_SHAPE - fld dword [edx+go4kVCO_val.shape] -%ifdef GO4K_USE_VCO_MOD_SM - fadd dword [WRK+go4kVCO_wrk.sm] -%endif - call go4kWaveshaper -%endif - fld dword [edx+go4kVCO_val.gain] -%ifdef GO4K_USE_VCO_MOD_GM - fadd dword [WRK+go4kVCO_wrk.gm] -%endif - fmulp st1, st0 - -%ifdef GO4K_USE_VCO_STEREO - test al, byte VCO_STEREO - jz short go4kVCO_func_stereodone - sub al, byte VCO_STEREO - fld dword [WRK+go4kVCO_wrk.phase] ;// swap left/right phase values again for second stereo run - fld dword [WRK+go4kVCO_wrk.phase2] - fstp dword [WRK+go4kVCO_wrk.phase] - fstp dword [WRK+go4kVCO_wrk.phase2] - jmp go4kVCO_func_process -go4kVCO_func_stereodone: -%endif - ret - -%ifdef USE_SECTIONS -section .g4kcodc code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // VCF Tick -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : eax -; //---------------------------------------------------------------------------------------- -export_func go4kVCF_func@0 - push 3 - call go4kTransformValues -%ifdef GO4K_USE_VCF_CHECK -; check if current note still active - mov eax, dword [ecx-4] - test eax, eax - jne go4kVCF_func_do - ret -go4kVCF_func_do: -%endif - movzx eax, byte [VAL-1] ; // get type flag - - fld dword [edx+go4kVCF_val.res] ; // r in -%ifdef GO4K_USE_VCF_MOD_RM - fadd dword [WRK+go4kVCF_wrk.rm] -%endif - fstp dword [esp-8] - - fld dword [edx+go4kVCF_val.freq] ; // f in -%ifdef GO4K_USE_VCF_MOD_FM - fadd dword [WRK+go4kVCF_wrk.fm] -%endif - fmul st0, st0 ; // square the input so we never get negative and also have a smoother behaviour in the lower frequencies - fstp dword [esp-4] ; // in - -%ifdef GO4K_USE_VCF_STEREO - test al, byte STEREO - jz short go4kVCF_func_process - add WRK, go4kVCF_wrk.low2 -go4kVCF_func_stereoloop: ; // switch channels - fxch st1 ; // inr inl -%endif - -go4kVCF_func_process: - fld dword [esp-8] - fld dword [esp-4] - fmul dword [WRK+go4kVCF_wrk.band] ; // f*b r in - fadd dword [WRK+go4kVCF_wrk.low] ; // l' r in - fst dword [WRK+go4kVCF_wrk.low] ; // l' r in - fsubp st2, st0 ; // r in-l' - fmul dword [WRK+go4kVCF_wrk.band] ; // r*b in-l' - fsubp st1, st0 ; // h' - fst dword [WRK+go4kVCF_wrk.high] ; // h' - fmul dword [esp-4] ; // h'*f - fadd dword [WRK+go4kVCF_wrk.band] ; // b' - fstp dword [WRK+go4kVCF_wrk.band] - fldz -go4kVCF_func_low: - test al, byte LOWPASS - jz short go4kVCF_func_high - fadd dword [WRK+go4kVCF_wrk.low] -go4kVCF_func_high: -%ifdef GO4K_USE_VCF_HIGH - test al, byte HIGHPASS - jz short go4kVCF_func_band - fadd dword [WRK+go4kVCF_wrk.high] -%endif -go4kVCF_func_band: -%ifdef GO4K_USE_VCF_BAND - test al, byte BANDPASS - jz short go4kVCF_func_peak - fadd dword [WRK+go4kVCF_wrk.band] -%endif -go4kVCF_func_peak: -%ifdef GO4K_USE_VCF_PEAK - test al, byte PEAK - jz short go4kVCF_func_processdone - fadd dword [WRK+go4kVCF_wrk.low] - fsub dword [WRK+go4kVCF_wrk.high] -%endif -go4kVCF_func_processdone: - -%ifdef GO4K_USE_VCF_STEREO - test al, byte STEREO ; // outr inl - jz short go4kVCF_func_end - sub al, byte STEREO - sub WRK, go4kVCF_wrk.low2 - jmp go4kVCF_func_stereoloop -%endif - -go4kVCF_func_end: ; // value - - - - - ret - -%ifdef USE_SECTIONS -section .g4kcodd code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // DST Tick -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : eax -; //---------------------------------------------------------------------------------------- -export_func go4kDST_func@0 -%ifdef GO4K_USE_DST -%ifdef GO4K_USE_DST_SH - %ifdef GO4K_USE_DST_STEREO - push 3 - %else - push 2 - %endif -%else - %ifdef GO4K_USE_DST_STEREO - push 2 - %else - push 1 - %endif -%endif - call go4kTransformValues -%ifdef GO4K_USE_DST_CHECK -; check if current note still active - mov eax, dword [ecx-4] - test eax, eax - jne go4kDST_func_do - ret -go4kDST_func_do: -%endif - movzx eax, byte [VAL-1] ; // get type flag -%ifdef GO4K_USE_DST_SH - fld dword [edx+go4kDST_val.snhfreq] ; // snh in (inr) -%ifdef GO4K_USE_DST_MOD_SH - fadd dword [WRK+go4kDST_wrk.sm] ; // snh' in (inr) -%endif - fmul st0, st0 ; // square the input so we never get negative and also have a smoother behaviour in the lower frequencies - fchs - fadd dword [WRK+go4kDST_wrk.snhphase]; // snh' in (inr) - fst dword [WRK+go4kDST_wrk.snhphase] - fldz ; // 0 snh' in (inr) - fucomip st1 ; // snh' in (inr) - fstp dword [esp-4] ; // in (inr) - jc short go4kDST_func_hold - fld1 ; // 1 in (inr) - fadd dword [esp-4] ; // 1+snh' in (inr) - fstp dword [WRK+go4kDST_wrk.snhphase]; // in (inr) -%endif -; // calc pregain and postgain -%ifdef GO4K_USE_DST_STEREO - test al, byte STEREO - jz short go4kDST_func_mono - fxch st1 ; // inr inl - fld dword [edx+go4kDST_val.drive] ; // drive inr inl -%ifdef GO4K_USE_DST_MOD_DM - fadd dword [WRK+go4kDST_wrk.dm] -%endif - call go4kWaveshaper ; // outr inl -%ifdef GO4K_USE_DST_SH - fst dword [WRK+go4kDST_wrk.out2] ; // outr inl -%endif - fxch st1 ; // inl outr -go4kDST_func_mono: -%endif - fld dword [edx+go4kDST_val.drive] ; // drive in (outr) -%ifdef GO4K_USE_DST_MOD_DM - fadd dword [WRK+go4kDST_wrk.dm] -%endif - call go4kWaveshaper ; // out (outr) -%ifdef GO4K_USE_DST_SH - fst dword [WRK+go4kDST_wrk.out] ; // out' (outr) -%endif - ret ; // out' (outr) -%ifdef GO4K_USE_DST_SH -go4kDST_func_hold: ; // in (inr) - fstp st0 ; // (inr) -%ifdef GO4K_USE_DST_STEREO - test al, byte STEREO - jz short go4kDST_func_monohold ; // (inr) - fstp st0 ; // - fld dword [WRK+go4kDST_wrk.out2] ; // outr -go4kDST_func_monohold: -%endif - fld dword [WRK+go4kDST_wrk.out] ; // out (outr) - ret -%endif - -%endif - -%ifdef USE_SECTIONS -section .g4kcodf code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // DLL Tick -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : eax -; //---------------------------------------------------------------------------------------- -export_func go4kDLL_func@0 -%ifdef GO4K_USE_DLL -%ifdef GO4K_USE_DLL_CHORUS - %ifdef GO4K_USE_DLL_DAMP - push 8 - %else - push 7 - %endif -%else - %ifdef GO4K_USE_DLL_DAMP - push 6 - %else - push 5 - %endif -%endif - call go4kTransformValues - pushad - movzx ebx, byte [VAL-(go4kDLL_val.size-go4kDLL_val.delay)/4] ;// delay length index -%ifdef GO4K_USE_DLL_NOTE_SYNC - test ebx, ebx - jne go4kDLL_func_process - fld1 - fild dword [ecx-4] ; // load note freq - fmul dword [c_i12] - call _Power@0 - fmul dword [FREQ_NORMALIZE] ; // normalize - fdivp st1, st0 ; // invert to get numer of samples - fistp word [_go4k_delay_times+ebx*2] ; store current comb size -%endif -go4kDLL_func_process: - mov ecx, eax ;// ecx is delay counter -%ifdef GO4K_USE_DLL_MOD - mov edi, WRK ;// edi is modulation workspace -%endif - mov WRK, dword [_go4k_delay_buffer_ofs] ;// ebp is current delay - fld st0 ;// in in -%ifdef GO4K_USE_DLL_MOD_IM - fld dword [edx+go4kDLL_val.dry] ;// dry in in - fadd dword [edi+go4kDLL_wrk2.im] ;// dry' in in - fmulp st1, st0 ;// out in -%else - fmul dword [edx+go4kDLL_val.dry] ;// out in -%endif - fxch ;// in out -%ifdef GO4K_USE_DLL_MOD_PM - fld dword [edx+go4kDLL_val.pregain] ;// pg in out - fadd dword [edi+go4kDLL_wrk2.pm] ;// pg' in out - fmul st0, st0 ;// pg'' in out - fmulp st1, st0 ;// in' out -%else - fmul dword [edx+go4kDLL_val.pregain] ;// in' out - fmul dword [edx+go4kDLL_val.pregain] ;// in' out -%endif - -%ifdef GO4K_USE_DLL_CHORUS -;// update saw lfo for chorus/flanger - fld dword [edx+go4kDLL_val.freq] ;// f in' out -%ifdef GO4K_USE_DLL_MOD_SM - fadd dword [edi+go4kDLL_wrk2.sm] ;// f' in' out -%endif - fmul st0, st0 - fmul st0, st0 - fdiv dword [DLL_DEPTH] - fadd dword [WRK+go4kDLL_wrk.phase] ;// p' in' out -;// clamp phase to 0,1 (only in editor, since delay can be active quite long) -%ifdef GO4K_USE_DLL_CHORUS_CLAMP - fld1 ;// 1 p' in' out - fadd st1, st0 ;// 1 1+p' in' out - fxch ;// 1+p' 1 in' out - fprem ;// p'' 1 in' out - fstp st1 ;// p'' in' out -%endif - fst dword [WRK+go4kDLL_wrk.phase] -;// get current sine value - fldpi ; // pi p in' out - fadd st0 ; // 2*pi p in' out - fmulp st1, st0 ; // 2*pi*p in' out - fsin ; // sin in' out - fld1 ; // 1 sin in' out - faddp st1, st0 ; // 1+sin in' out -;// mul with depth and convert to samples - fld dword [edx+go4kDLL_val.depth] ; // d 1+sin in' out -%ifdef GO4K_USE_DLL_MOD_AM - fadd dword [edi+go4kDLL_wrk2.am] ; // d' 1+sin in' out -%endif - fmul st0, st0 - fmul st0, st0 - fmul dword [DLL_DEPTH] - fmulp st1, st0 - fistp dword [esp-4] ; // in' out -%endif - -go4kDLL_func_loop: - movzx esi, word [_go4k_delay_times+ebx*2] ; fetch comb size - mov eax, dword [WRK+go4kDLL_wrk.index] ;// eax is current comb index - -%ifdef GO4K_USE_DLL_CHORUS - ;// add lfo offset and wrap buffer - add eax, dword [esp-4] - cmp eax, esi - jl short go4kDLL_func_buffer_nowrap1 - sub eax, esi -go4kDLL_func_buffer_nowrap1: -%endif - - fld dword [WRK+eax*4+go4kDLL_wrk.buffer];// cout in' out - -%ifdef GO4K_USE_DLL_CHORUS - mov eax, dword [WRK+go4kDLL_wrk.index] -%endif - - ;// add comb output to current output - fadd st2, st0 ;// cout in' out' -%ifdef GO4K_USE_DLL_DAMP - fld1 ;// 1 cout in' out' - fsub dword [edx+go4kDLL_val.damp] ;// 1-damp cout in' out' -%ifdef GO4K_USE_DLL_MOD_DM - fsub dword [edi+go4kDLL_wrk2.dm] ;// 1-damp' cout in' out' -%endif - fmulp st1, st0 ;// cout*d2 in' out' - fld dword [edx+go4kDLL_val.damp] ;// d1 cout*d2 in' out' -%ifdef GO4K_USE_DLL_MOD_DM - fadd dword [edi+go4kDLL_wrk2.dm] ;// d1' cout*d2 in' out' -%endif - fmul dword [WRK+go4kDLL_wrk.store] ;// store*d1 cout*d2 in' out' - faddp st1, st0 ;// store' in' out' - fst dword [WRK+go4kDLL_wrk.store] ;// store' in' out' -%endif -%ifdef GO4K_USE_DLL_MOD_FM - fld dword [edx+go4kDLL_val.feedback] ;// fb cout in' out' - fadd dword [edi+go4kDLL_wrk2.fm] ;// fb' cout in' out' - fmulp st1, st0 ;// cout*fb' in' out' -%else - fmul dword [edx+go4kDLL_val.feedback] ;// cout*fb in' out' -%endif -%ifdef GO4K_USE_DLL_DC_FILTER - fadd st0, st1 ;// store in' out' - fstp dword [WRK+eax*4+go4kDLL_wrk.buffer];// in' out' -%else - fsub st0, st1 ;// store in' out' - fstp dword [WRK+eax*4+go4kDLL_wrk.buffer];// in' out' - fneg -%endif - ;// wrap comb buffer pos - inc eax - cmp eax, esi - jl short go4kDLL_func_buffer_nowrap2 -%ifdef GO4K_USE_DLL_CHORUS - sub eax, esi -%else - xor eax, eax -%endif -go4kDLL_func_buffer_nowrap2: - mov dword [WRK+go4kDLL_wrk.index], eax - ;// increment buffer pointer to next buffer - inc ebx ;// go to next delay length index - add WRK, go4kDLL_wrk.size ;// go to next delay - mov dword [_go4k_delay_buffer_ofs], WRK ;// store next delay offset - loopne go4kDLL_func_loop - fstp st0 ;// out' - ;// process a dc filter to prevent heavy offsets in reverb -%ifdef GO4K_USE_DLL_DC_FILTER -; y(n) = x(n) - x(n-1) + R * y(n-1) - sub WRK, go4kDLL_wrk.size - fld dword [WRK+go4kDLL_wrk.dcout] ;// dco out' - fmul dword [c_dc_const] ;// dcc*dco out' - fsub dword [WRK+go4kDLL_wrk.dcin] ;// dcc*dco-dci out' - fxch ;// out' dcc*dco-dci - fst dword [WRK+go4kDLL_wrk.dcin] ;// out' dcc*dco-dci - faddp st1 ;// out' -%ifdef GO4K_USE_UNDENORMALIZE - fadd dword [c_0_5] ;// add and sub small offset to prevent denormalization - fsub dword [c_0_5] -%endif - fst dword [WRK+go4kDLL_wrk.dcout] -%endif - popad - ret -%endif - - -%ifdef USE_SECTIONS -section .g4kcodu code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // GLITCH Tick -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : eax -; //---------------------------------------------------------------------------------------- -export_func go4kGLITCH_func@0 -%ifdef GO4K_USE_GLITCH - push 5 - call go4kTransformValues - pushad - - mov edi, WRK - mov WRK, dword [_go4k_delay_buffer_ofs] ;// ebp is current delay - -; mov eax, dword [edx+go4kGLITCH_val.active] -; or eax, dword [edi+go4kGLITCH_wrk2.am] -; test eax, eax -; je go4kGLITCH_func_notactive ;// out - - fld dword [edx+go4kGLITCH_val.active] ;// a in - fadd dword [edi+go4kGLITCH_wrk2.am] ;// a' in - ; // check for activity - fldz ;// 0 a' in - fucomip st1 ;// a' in - fstp st0 ;// in - jnc go4kGLITCH_func_notactive ;// out - - ;// check for first call and init if so init (using slizesize slot) - mov eax, dword [WRK+go4kGLITCH_wrk.slizesize] - and eax, eax - jnz go4kGLITCH_func_process - mov dword [WRK+go4kGLITCH_wrk.index], eax - mov dword [WRK+go4kGLITCH_wrk.store], eax - movzx ebx, byte [VAL-(go4kGLITCH_val.size-go4kGLITCH_val.slicesize)/4] ;// slicesize index - movzx eax, word [_go4k_delay_times+ebx*2] ;// fetch slicesize - push eax - fld1 - fild dword [esp] - fstp dword [WRK+go4kGLITCH_wrk.slizesize] - fstp dword [WRK+go4kGLITCH_wrk.slicepitch] - pop eax -go4kGLITCH_func_process: - ;// fill buffer until full - mov eax, dword [WRK+go4kGLITCH_wrk.store] - cmp eax, MAX_DELAY - jae go4kGLITCH_func_filldone - fst dword [WRK+eax*4+go4kDLL_wrk.buffer] ;// in - inc dword [WRK+go4kGLITCH_wrk.store] -go4kGLITCH_func_filldone: - ;// save input - push eax - fstp dword [esp] ;// - - - ;// read from buffer - push eax - fld dword [WRK+go4kGLITCH_wrk.index] ;// idx - fist dword [esp] - pop eax - fld dword [WRK+eax*4+go4kDLL_wrk.buffer] ;// out idx - fxch ;// idx out - ;// progress readindex with current play speed - fadd dword [WRK+go4kGLITCH_wrk.slicepitch] ;// idx' out - fst dword [WRK+go4kGLITCH_wrk.index] - - ;// check for slice done - fld dword [WRK+go4kGLITCH_wrk.slizesize] ;// size idx' out - fxch ;// idx' size out - fucomip st1 ;// idx' out - fstp st0 ;// out - jc go4kGLITCH_func_process_done - ;// reinit for next loop - xor eax, eax - mov dword [WRK+go4kGLITCH_wrk.index], eax - - fld dword [edx+go4kGLITCH_val.dsize] - fadd dword [edi+go4kGLITCH_wrk2.sm] - fsub dword [c_0_5] - fmul dword [c_0_5] - call _Power@0 - fmul dword [WRK+go4kGLITCH_wrk.slizesize] - fstp dword [WRK+go4kGLITCH_wrk.slizesize] - - fld dword [edx+go4kGLITCH_val.dpitch] - fadd dword [edi+go4kGLITCH_wrk2.pm] - fsub dword [c_0_5] - fmul dword [c_0_5] - call _Power@0 - fmul dword [WRK+go4kGLITCH_wrk.slicepitch] - fstp dword [WRK+go4kGLITCH_wrk.slicepitch] -go4kGLITCH_func_process_done: - - ;// dry wet mix - fld dword [edx+go4kGLITCH_val.dry] ;// dry out - fadd dword [edi+go4kGLITCH_wrk2.dm] ;// dry' out - fld1 ;// 1 dry' out - fsub st1 ;// 1-dry' dry' out - fmulp st2 ;// dry' out' - fmul dword [esp] ;// in' out' - faddp st1, st0 ;// out' - - pop eax - jmp go4kGLITCH_func_leave -go4kGLITCH_func_notactive: - ;// mark as uninitialized again (using slizesize slot) - xor eax,eax - mov dword [WRK+go4kGLITCH_wrk.slizesize], eax -go4kGLITCH_func_leave: - add WRK, go4kDLL_wrk.size ;// go to next delay - mov dword [_go4k_delay_buffer_ofs], WRK ;// store next delay offset - popad - ret -%endif - -%ifdef USE_SECTIONS -section .g4kcodg code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // FOP Tick (various fp stack based operations) -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : -; //---------------------------------------------------------------------------------------- -export_func go4kFOP_func@0 - push 1 - call go4kTransformValues -go4kFOP_func_pop: - dec eax - jnz go4kFOP_func_addp - fstp st0 - ret -go4kFOP_func_addp: - dec eax - jnz go4kFOP_func_mulp - faddp st1, st0 - ret -go4kFOP_func_mulp: - dec eax - jnz go4kFOP_func_push - fmulp st1, st0 - ret -go4kFOP_func_push: - dec eax - jnz go4kFOP_func_xch - fld st0 - ret -go4kFOP_func_xch: - dec eax - jnz go4kFOP_func_add - fxch - ret -go4kFOP_func_add: - dec eax - jnz go4kFOP_func_mul - fadd st1 - ret -go4kFOP_func_mul: - dec eax - jnz go4kFOP_func_addp2 - fmul st1 - ret -go4kFOP_func_addp2: - dec eax - jnz go4kFOP_func_loadnote - faddp st2, st0 - faddp st2, st0 - ret -go4kFOP_func_loadnote: - dec eax - jnz go4kFOP_func_mulp2 - fild dword [ecx-4] - fmul dword [c_i128] - ret -go4kFOP_func_mulp2: - fmulp st2, st0 - fmulp st2, st0 - ret - -%ifdef USE_SECTIONS -section .g4kcodh code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // FST Tick (stores a value somewhere in the local workspace) -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : -; //---------------------------------------------------------------------------------------- -export_func go4kFST_func@0 - push 1 - call go4kTransformValues - fld dword [edx+go4kFST_val.amount] - fsub dword [c_0_5] - fadd st0 - fmul st1 - lodsw - and eax, 0x00003fff ; // eax is destination slot - test word [VAL-2], FST_ADD - jz go4kFST_func_set - fadd dword [ecx+eax*4] -go4kFST_func_set: - fstp dword [ecx+eax*4] - test word [VAL-2], FST_POP - jz go4kFST_func_done - fstp st0 -go4kFST_func_done: - ret - -%ifdef USE_SECTIONS -section .g4kcodm code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // FLD Tick (load a value on stack, optionally add a modulation signal beforehand) -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : signal-signal*pan , signal*pan -; // DIRTY : -; //---------------------------------------------------------------------------------------- -export_func go4kFLD_func@0 ;// in main env -%ifdef GO4K_USE_FLD - push 1 - call go4kTransformValues - fld dword [edx+go4kFLD_val.value] ;// value in - fsub dword [c_0_5] - fadd st0 -%ifdef GO4K_USE_FLD_MOD_VM - fadd dword [WRK+go4kFLD_wrk.vm] ;// value' in -%endif -%endif - ret - -%ifdef GO4K_USE_FSTG -%ifdef USE_SECTIONS -section .g4kcodi code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // FSTG Tick (stores a value anywhere in the synth (and in each voice)) -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : -; //---------------------------------------------------------------------------------------- -export_func go4kFSTG_func@0 - push 1 - call go4kTransformValues -%ifdef GO4K_USE_FSTG_CHECK -; check if current note still active - mov eax, dword [ecx-4] - test eax, eax - jne go4kFSTG_func_do - lodsw - jmp go4kFSTG_func_testpop -go4kFSTG_func_do: -%endif - fld dword [edx+go4kFST_val.amount] - fsub dword [c_0_5] - fadd st0 - fmul st1 - lodsw - and eax, 0x00003fff ; // eax is destination slot - test word [VAL-2], FST_ADD - jz go4kFSTG_func_set - fadd dword [go4k_synth_wrk+eax*4] -go4kFSTG_func_set: -%if MAX_VOICES > 1 - fst dword [go4k_synth_wrk+eax*4] - fstp dword [go4k_synth_wrk+eax*4+go4k_instrument.size] -%else - fstp dword [go4k_synth_wrk+eax*4] -%endif -go4kFSTG_func_testpop: - test word [VAL-2], FST_POP - jz go4kFSTG_func_done - fstp st0 -go4kFSTG_func_done: - ret -%endif - -%ifdef USE_SECTIONS -section .g4kcodj code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // PAN Tick (multiplies signal with main envelope and converts to stereo) -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : signal-signal*pan , signal*pan -; // DIRTY : -; //---------------------------------------------------------------------------------------- -export_func go4kPAN_func@0 ;// in main env -%ifdef GO4K_USE_PAN - push 1 - call go4kTransformValues - fld dword [edx+go4kPAN_val.panning] ;// pan in -%ifdef GO4K_USE_PAN_MOD - fadd dword [WRK+go4kPAN_wrk.pm] ;// pan in -%endif - fmul st1 ;// r in - fsub st1, st0 ;// r l - fxch ;// l r -%else - fmul dword [c_0_5] - fld st0 -%endif - ret - -%ifdef USE_SECTIONS -section .g4kcodk code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // OUT Tick ( stores stereo signal pair in temp buffers of the instrument) -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : -; //---------------------------------------------------------------------------------------- -export_func go4kOUT_func@0 ;// l r -%ifdef GO4K_USE_GLOBAL_DLL - push 2 - call go4kTransformValues - pushad - lea edi, [ecx+MAX_UNITS*MAX_UNIT_SLOTS*4] - fld st1 ;// r l r - fld st1 ;// l r l r - fld dword [edx+go4kOUT_val.auxsend] ;// as l r l r -%ifdef GO4K_USE_OUT_MOD_AM - fadd dword [WRK+go4kOUT_wrk.am] ;// am l r l r -%endif - fmulp st1, st0 ;// l' r l r - fstp dword [edi] ;// r l r - scasd - fld dword [edx+go4kOUT_val.auxsend] ;// as r l r -%ifdef GO4K_USE_OUT_MOD_AM - fadd dword [WRK+go4kOUT_wrk.am] ;// am r l r -%endif - fmulp st1, st0 ;// r' l r - fstp dword [edi] ;// l r - scasd - fld dword [edx+go4kOUT_val.gain] ;// g l r -%ifdef GO4K_USE_OUT_MOD_GM - fadd dword [WRK+go4kOUT_wrk.gm] ;// gm l r -%endif - fmulp st1, st0 ;// l' r - fstp dword [edi] ;// r - scasd - fld dword [edx+go4kOUT_val.gain] ;// g r -%ifdef GO4K_USE_OUT_MOD_GM - fadd dword [WRK+go4kOUT_wrk.gm] ;// gm r -%endif - fmulp st1, st0 ;// r' - fstp dword [edi] ;// - - scasd - popad -%else - push 1 - call go4kTransformValues - - fld dword [edx+go4kOUT_val.gain] ;// g l r -%ifdef GO4K_USE_OUT_MOD_GM - fadd dword [WRK+go4kOUT_wrk.gm] ;// gm l r -%endif - fmulp st1, st0 ;// l' r - fstp dword [ecx+MAX_UNITS*MAX_UNIT_SLOTS*4+0] ;// r - fld dword [edx+go4kOUT_val.gain] ;// g r -%ifdef GO4K_USE_OUT_MOD_GM - fadd dword [WRK+go4kOUT_wrk.gm] ;// gm r -%endif - fmulp st1, st0 ;// r' - fstp dword [ecx+MAX_UNITS*MAX_UNIT_SLOTS*4+4] ;// - - -%endif - ret - -%ifdef USE_SECTIONS -section .g4kcodl code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // ACC Tick (stereo signal accumulation for synth commands only -> dont use in instrument commands) -; //---------------------------------------------------------------------------------------- -; // IN : WRK = unit workspace -; // IN : VAL = unit values -; // IN : ecx = global workspace -; // OUT : -; // DIRTY : eax -; //---------------------------------------------------------------------------------------- -export_func go4kACC_func@0 - push 1 - call go4kTransformValues - pushad - mov edi, go4k_synth_wrk - add edi, go4k_instrument.size - sub edi, eax ; // eax already contains the accumulation offset from the go4kTransformValues call - mov cl, MAX_INSTRUMENTS*MAX_VOICES - fldz ;// 0 - fldz ;// 0 0 -go4kACC_func_loop: - fadd dword [edi-8] ;// l 0 - fxch ;// 0 l - fadd dword [edi-4] ;// r l - fxch ;// l r - add edi, go4k_instrument.size - dec cl - jnz go4kACC_func_loop - popad - ret - -%ifdef USE_SECTIONS -section .g4kcodw code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // Update Instrument (allocate voices, set voice to release) -; //---------------------------------------------------------------------------------------- -; // IN : -; // IN : -; // OUT : -; // DIRTY : -; //---------------------------------------------------------------------------------------- -go4kUpdateInstrument: -; // get new note - mov eax, dword [esp+4+4] ; // eax = current tick - shr eax, PATTERN_SIZE_SHIFT ; // eax = current pattern - imul edx, ecx, dword MAX_PATTERNS ; // edx = instrument pattern list index - movzx edx, byte [edx+eax+go4k_pattern_lists] ; // edx = pattern index - mov eax, dword [esp+4+4] ; // eax = current tick - shl edx, PATTERN_SIZE_SHIFT - and eax, PATTERN_SIZE-1 - movzx edx, byte [edx+eax+go4k_patterns] ; // edx = requested note in new patterntick -; // apply note changes - cmp dl, HLD ; // anything but hold causes action - je short go4kUpdateInstrument_done - inc dword [edi] ; // set release flag if needed -%if MAX_VOICES > 1 - inc dword [edi+go4k_instrument.size] ; // set release flag if needed -%endif - cmp dl, HLD ; // check for new note - jl short go4kUpdateInstrument_done -%if MAX_VOICES > 1 - pushad - xchg eax, dword [go4k_voiceindex + ecx*4] - test eax, eax - je go4kUpdateInstrument_newNote - add edi, go4k_instrument.size -go4kUpdateInstrument_newNote: - xor al,1 - xchg dword [go4k_voiceindex + ecx*4], eax -%endif - pushad - xor eax, eax - mov ecx, (8+MAX_UNITS*MAX_UNIT_SLOTS*4)/4 ; // clear only relase, note and workspace - rep stosd - popad - mov dword [edi+4], edx ; // set requested note as current note -%if MAX_VOICES > 1 - popad -%endif - jmp short go4kUpdateInstrument_done -go4kUpdateInstrument_done: - ret - -%ifdef USE_SECTIONS -section .g4kcodx code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // Render Voices -; //---------------------------------------------------------------------------------------- -; // IN : -; // IN : -; // OUT : -; // DIRTY : -; //---------------------------------------------------------------------------------------- -go4kRenderVoices: - push ecx ; // save current instrument counter -%if MAX_VOICES > 1 - push COM ; // save current instrument command index - push VAL ; // save current instrument values index -%endif - call go4k_VM_process ; // call synth vm for instrument voices - mov eax, dword [ecx+go4kENV_wrk.state] - cmp al, byte ENV_STATE_OFF - jne go4kRenderVoices_next - xor eax, eax - mov dword [ecx-4], eax ; // kill note if voice is done -go4kRenderVoices_next: -%if MAX_VOICES > 1 - pop VAL ; // restore instrument value index - pop COM ; // restore instrument command index -%endif - -%ifdef GO4K_USE_BUFFER_RECORDINGS - mov eax, dword [esp+16] ; // get current tick - shr eax, 8 ; // every 256th sample = ~ 172 hz - shl eax, 5 ; // for 16 instruments a 2 voices - add eax, dword [esp] - add eax, dword [esp] ; // + 2*currentinstrument+0 -%ifdef GO4K_USE_ENVELOPE_RECORDINGS - mov edx, dword [ecx+go4kENV_wrk.level] - mov dword [__4klang_envelope_buffer+eax*4], edx -%endif -%ifdef GO4K_USE_NOTE_RECORDINGS - mov edx, dword [ecx-4] - mov dword [__4klang_note_buffer+eax*4], edx -%endif -%endif - -%if MAX_VOICES > 1 - call go4k_VM_process ; // call synth vm for instrument voices - mov eax, dword [ecx+go4kENV_wrk.state] - cmp al, byte ENV_STATE_OFF - jne go4k_render_instrument_next2 - xor eax, eax - mov dword [ecx-4], eax ; // kill note if voice is done -go4k_render_instrument_next2: - -%ifdef GO4K_USE_BUFFER_RECORDINGS - mov eax, dword [esp+16] ; // get current tick - shr eax, 8 ; // every 256th sample = ~ 172 hz - shl eax, 5 ; // for 16 instruments a 2 voices - add eax, dword [esp] - add eax, dword [esp] ; // + 2*currentinstrument+0 -%ifdef GO4K_USE_ENVELOPE_RECORDINGS - mov edx, dword [ecx+go4kENV_wrk.level] - mov dword [__4klang_envelope_buffer+eax*4+4], edx -%endif -%ifdef GO4K_USE_NOTE_RECORDINGS - mov edx, dword [ecx-4] - mov dword [__4klang_note_buffer+eax*4+4], edx -%endif -%endif - -%endif - pop ecx ; // restore instrument counter - ret - -%ifdef USE_SECTIONS -section .g4kcody code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // the entry point for the synth -; //---------------------------------------------------------------------------------------- -%ifdef USE_SECTIONS -export_func _4klang_render@4 -%else -export_func _4klang_render -%endif - pushad - xor ecx, ecx -%ifdef GO4K_USE_BUFFER_RECORDINGS - push ecx -%endif -; loop all ticks -go4k_render_tickloop: - push ecx - xor ecx, ecx -; loop all samples per tick -go4k_render_sampleloop: - push ecx - xor ecx, ecx - mov ebx, go4k_synth_instructions ; // ebx = instrument command index - mov VAL, go4k_synth_parameter_values; // VAL = instrument values index - mov edi, _go4k_delay_buffer ; // get offset of first delay buffer - mov dword [_go4k_delay_buffer_ofs], edi ; // store offset in delaybuffer offset variable - mov edi, go4k_synth_wrk ; // edi = first instrument -; loop all instruments -go4k_render_instrumentloop: - mov eax, dword [esp] ; // eax = current tick sample - and eax, eax - jnz go4k_render_instrument_process ; // tick change? (first sample in current tick) - call go4kUpdateInstrument ; // update instrument state -; process instrument -go4k_render_instrument_process: - call go4kRenderVoices - inc ecx - cmp cl, byte MAX_INSTRUMENTS - jl go4k_render_instrumentloop - mov dword [edi+4], ecx ; // move a value != 0 into note slot, so processing will be done - call go4k_VM_process ; // call synth vm for synth -go4k_render_output_sample: -%ifdef GO4K_USE_BUFFER_RECORDINGS - inc dword [esp+8] - xchg esi, dword [esp+48] ; // edx = destbuffer -%else - xchg esi, dword [esp+44] ; // edx = destbuffer -%endif -%ifdef GO4K_CLIP_OUTPUT - fld dword [edi-8] - fld1 ; // 1 val - fucomi st1 ; // 1 val - jbe short go4k_render_clip1 - fchs ; // -1 val - fucomi st1 ; // -1 val - fcmovb st0, st1 ; // val -1 (if val > -1) -go4k_render_clip1: - fstp st1 ; // newval -%ifdef GO4K_USE_16BIT_OUTPUT - push eax - fmul dword [c_32767] - fistp dword [esp] - pop eax - mov word [esi],ax ; // store integer converted left sample - lodsw -%else - fstp dword [esi] ; // store left sample - lodsd -%endif - fld dword [edi-4] - fld1 ; // 1 val - fucomi st1 ; // 1 val - jbe short go4k_render_clip2 - fchs ; // -1 val - fucomi st1 ; // -1 val - fcmovb st0, st1 ; // val -1 (if val > -1) -go4k_render_clip2: - fstp st1 ; // newval -%ifdef GO4K_USE_16BIT_OUTPUT - push eax - fmul dword [c_32767] - fistp dword [esp] - pop eax - mov word [esi],ax ; // store integer converted right sample - lodsw -%else - fstp dword [esi] ; // store right sample - lodsd -%endif -%else - fld dword [edi-8] -%ifdef GO4K_USE_16BIT_OUTPUT - push eax - fmul dword [c_32767] - fistp dword [esp] - pop eax - mov word [esi],ax ; // store integer converted left sample - lodsw -%else - fstp dword [esi] ; // store left sample - lodsd -%endif - fld dword [edi-4] -%ifdef GO4K_USE_16BIT_OUTPUT - push eax - fmul dword [c_32767] - fistp dword [esp] - pop eax - mov word [esi],ax ; // store integer converted right sample - lodsw -%else - fstp dword [esi] ; // store right sample - lodsd -%endif -%endif -%ifdef GO4K_USE_BUFFER_RECORDINGS - xchg esi, dword [esp+48] -%else - xchg esi, dword [esp+44] -%endif - pop ecx - inc ecx -%ifdef GO4K_USE_GROOVE_PATTERN - mov ebx, dword SAMPLES_PER_TICK - mov eax, dword [esp] - and eax, 0x0f - bt dword [go4k_groove_pattern],eax - jnc go4k_render_nogroove - sub ebx, dword 3000 -go4k_render_nogroove: - cmp ecx, ebx -%else - cmp ecx, dword SAMPLES_PER_TICK -%endif - jl go4k_render_sampleloop - pop ecx - inc ecx -%ifdef AUTHORING - mov dword[__4klang_current_tick], ecx -%endif - cmp ecx, dword MAX_TICKS - jl go4k_render_tickloop -%ifdef GO4K_USE_BUFFER_RECORDINGS - pop ecx -%endif - popad - ret 4 - -%ifdef USE_SECTIONS -section .g4kcodz code align=1 -%else -section .text -%endif -; //---------------------------------------------------------------------------------------- -; // the magic behind it :) -; //---------------------------------------------------------------------------------------- -; // IN : edi = instrument pointer -; // IN : esi = instrumet values -; // IN : ebx = instrument instructions -; // OUT : -; // DIRTY : -; //---------------------------------------------------------------------------------------- -go4k_VM_process: - lea WRK, [edi+8] ; // get current workspace pointer - mov ecx, WRK ; // ecx = workspace start -go4k_VM_process_loop: - movzx eax, byte [ebx] ; // get command byte - inc ebx - test eax, eax - je go4k_VM_process_done ; // command byte = 0? so done - call dword [eax*4+go4k_synth_commands] - add WRK, MAX_UNIT_SLOTS*4 ; // go to next workspace slot - jmp short go4k_VM_process_loop -go4k_VM_process_done: - add edi, go4k_instrument.size ; // go to next instrument voice +%define WRK ebp ; // alias for unit workspace +%define VAL esi ; // alias for unit values (transformed/untransformed) +%define COM ebx ; // alias for instrument opcodes + +;// conditional defines + +%ifdef GO4K_USE_VCO_SHAPE + %define INCLUDE_WAVESHAPER +%endif +%ifdef GO4K_USE_DST + %define INCLUDE_WAVESHAPER +%endif + +%ifdef GO4K_USE_VCO_MOD_PM + %define PHASE_RENORMALIZE +%endif +%ifdef GO4K_USE_VCO_PHASE_OFFSET + %define PHASE_RENORMALIZE +%endif + +%ifdef GO4K_USE_ENVELOPE_RECORDINGS + %define GO4K_USE_BUFFER_RECORDINGS +%endif +%ifdef GO4K_USE_NOTE_RECORDINGS + %define GO4K_USE_BUFFER_RECORDINGS +%endif + +; //======================================================================================== +; // .bss section +; //======================================================================================== +%ifdef USE_SECTIONS +section .g4kbss1 bss align=1 +%else +section .bss +%endif + +; // the one and only synth object +%if MAX_VOICES > 1 +go4k_voiceindex resd 16 +%endif +go4k_transformed_values resd 16 +go4k_synth_wrk resb go4k_synth.size +global _go4k_delay_buffer_ofs +_go4k_delay_buffer_ofs resd 1 +global _go4k_delay_buffer +_go4k_delay_buffer resd 16*16*go4kDLL_wrk.size + +%ifdef AUTHORING +global __4klang_current_tick +__4klang_current_tick resd 0 +%endif + +%ifdef GO4K_USE_ENVELOPE_RECORDINGS +global __4klang_envelope_buffer +__4klang_envelope_buffer resd ((MAX_SAMPLES)/8) ; // samples every 256 samples and stores 16*2 = 32 values +%endif +%ifdef GO4K_USE_NOTE_RECORDINGS +global __4klang_note_buffer +__4klang_note_buffer resd ((MAX_SAMPLES)/8) ; // samples every 256 samples and stores 16*2 = 32 values +%endif + +; //======================================================================================== +; // .g4kdat section (initialized data for go4k) +; //======================================================================================== +%ifdef USE_SECTIONS +section .g4kdat1 data align=1 +%else +section .data +%endif + +; // some synth constants +go4k_synth_commands dd 0 + dd _go4kENV_func@0 + dd _go4kVCO_func@0 + dd _go4kVCF_func@0 + dd _go4kDST_func@0 + dd _go4kDLL_func@0 + dd _go4kFOP_func@0 + dd _go4kFST_func@0 + dd _go4kPAN_func@0 + dd _go4kOUT_func@0 + dd _go4kACC_func@0 + dd _go4kFLD_func@0 +%ifdef GO4K_USE_GLITCH + dd _go4kGLITCH_func@0 +%else + dd _go4kFLD_func@0 +%endif +%ifdef GO4K_USE_FSTG + dd _go4kFSTG_func@0 +%endif + +%ifdef USE_SECTIONS +section .g4kdat2 data align=1 +%else +section .data +%endif + +%ifdef GO4K_USE_16BIT_OUTPUT +c_32767 dd 32767.0 +%endif +c_i128 dd 0.0078125 +c_RandDiv dd 65536*32768 +c_0_5 dd 0.5 +%ifdef GO4K_USE_VCO_GATE +c_16 dd 16.0 +%endif +%ifdef GO4K_USE_DLL_CHORUS +DLL_DEPTH dd 1024.0 +%endif +%ifdef GO4K_USE_DLL_DC_FILTER +c_dc_const dd 0.99609375 ; R = 1 - (pi*2 * frequency /samplerate) +%else + %ifdef GO4K_USE_VCO_GATE +c_dc_const dd 0.99609375 ; R = 1 - (pi*2 * frequency /samplerate) + %endif +%endif +global _RandSeed +_RandSeed dd 1 +c_24 dd 24 +c_i12 dd 0x3DAAAAAA +FREQ_NORMALIZE dd 0.000092696138 ; // 220.0/(2^(69/12)) / 44100.0 +global _LFO_NORMALIZE +_LFO_NORMALIZE dd DEF_LFO_NORMALIZE +%ifdef GO4K_USE_GROOVE_PATTERN +go4k_groove_pattern dw 0011100111001110b +%endif + +; //======================================================================================== +; // .crtemui section (emulates crt functions) +; //======================================================================================== +%ifdef USE_SECTIONS +section .crtemui code align=1 +%else +section .text +%endif + +export_func FloatRandomNumber@0 + push eax + imul eax,dword [_RandSeed],16007 + mov dword [_RandSeed], eax + fild dword [_RandSeed] + fidiv dword [c_RandDiv] + pop eax + ret + +; //======================================================================================== +; // .g4kcod* sections (code for go4k) +; //======================================================================================== + +%ifdef INCLUDE_WAVESHAPER + +%ifdef USE_SECTIONS +section .g4kcod2 code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // Waveshaper function +; //---------------------------------------------------------------------------------------- +; // Input : st0 : shaping coeff +; // st1 : input +; // Output: st0 : result +; //---------------------------------------------------------------------------------------- + +go4kWaveshaper: +%ifdef GO4K_USE_WAVESHAPER_CLIP + fxch + fld1 ; // 1 val + fucomi st1 ; // 1 val + jbe short go4kWaveshaper_clip + fchs ; // -1 val + fucomi st1 ; // -1 val + fcmovb st0, st1 ; // val -1 (if val > -1) +go4kWaveshaper_clip: + fstp st1 ; // newval + fxch +%endif + fsub dword [c_0_5] + fadd st0 + fst dword [esp-4] ; // amnt in + fadd st0 ; // 2*amnt in + fld1 ; // 1 2*amnt in + fsub dword [esp-4] ; // 1-amnt 2*amnt in + fdivp st1, st0 ; // k in + fld st1 ; // sin k in + fabs ; // a(in) k in + fmul st1 ; // k*a(in) k in + fld1 + faddp st1, st0 ; // 1+k*a(in) k in + fxch st1 ; // k 1+k*a(in) in + fld1 + faddp st1, st0 ; // 1+k 1+k*a(in) in + fmulp st2 ; // 1+k*a(in) (1+k)*in + fdivp st1, st0 ; // out + ret + +%endif + +%ifdef USE_SECTIONS +section .g4kcod3 code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // unit values preparation/transform +; //---------------------------------------------------------------------------------------- +go4kTransformValues: + push ecx + xor ecx, ecx + xor eax, eax + mov edx, go4k_transformed_values +go4kTransformValues_loop: + lodsb + push eax + fild dword [esp] + fmul dword [c_i128] + fstp dword [edx+ecx*4] + pop eax + inc ecx + cmp ecx, dword [esp+8] + jl go4kTransformValues_loop + pop ecx + ret 4 + +%ifdef USE_SECTIONS +section .g4kcod4 code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // Envelope param mapping +; //---------------------------------------------------------------------------------------- +go4kENVMap: + fld dword [edx+eax*4] +%ifdef GO4K_USE_ENV_MOD_ADR + fadd dword [WRK+go4kENV_wrk.am+eax*4] +%endif + fimul dword [c_24] + fchs +; //---------------------------------------------------------------------------------------- +; // Power function (2^x) +; //---------------------------------------------------------------------------------------- +; // Input : st0 : base +; // st1 : exponent +; // Output: st0 : result +; //---------------------------------------------------------------------------------------- +export_func Power@0 ; // base exp + fld1 + fadd st0 + fyl2x ; // log2_base + fld1 ; // 1 log2_base + fld st1 ; // log2_base 1 log2_base + fprem ; // (frac)log2_base 1 log2_base + f2xm1 ; // 2 ^ '' - 1 1 log2_base + faddp st1, st0 ; // 2 ^ '' (int)log2_base + fscale + fstp st1 + ret + +%ifdef USE_SECTIONS +section .g4kcoda code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // ENV Tick +; //---------------------------------------------------------------------------------------- +; // IN : WRK = unit workspace +; // IN : VAL = unit values +; // IN : ecx = global workspace +; // OUT : +; // DIRTY : eax +; //---------------------------------------------------------------------------------------- +export_func go4kENV_func@0 + push 5 + call go4kTransformValues +%ifdef GO4K_USE_ENV_CHECK +; check if current note still active + mov eax, dword [ecx-4] + test eax, eax + jne go4kENV_func_do + fldz + ret +%endif +go4kENV_func_do: + mov eax, dword [ecx-8] ; // is the instrument in release mode (note off)? + test eax, eax + je go4kENV_func_process + mov dword [WRK+go4kENV_wrk.state], ENV_STATE_RELEASE +go4kENV_func_process: + mov eax, dword [WRK+go4kENV_wrk.state] + fld dword [WRK+go4kENV_wrk.level] ; // val - +; // check for sustain state + cmp al, ENV_STATE_SUSTAIN + je short go4kENV_func_leave2 +go4kENV_func_attac: + cmp al, ENV_STATE_ATTAC + jne short go4kENV_func_decay + call go4kENVMap ; // newval + faddp st1, st0 +; // check for end of attac + fld1 ; // 1 newval + fucomi st1 ; // 1 newval + fcmovnb st0, st1 ; // newval 1 (if newval < 1) + jbe short go4kENV_func_statechange +go4kENV_func_decay: + cmp al, ENV_STATE_DECAY + jne short go4kENV_func_release + call go4kENVMap ; // newval + fsubp st1, st0 +; // check for end of decay + fld dword [edx+go4kENV_val.sustain] ; // sustain newval + fucomi st1 ; // sustain newval + fcmovb st0, st1 ; // newval sustain (if newval > sustain) + jnc short go4kENV_func_statechange +go4kENV_func_release: +; // release state? + cmp al, ENV_STATE_RELEASE + jne short go4kENV_func_leave + call go4kENVMap ; // newval + fsubp st1, st0 +; // check for end of release + fldz ; // 0 newval + fucomi st1 ; // 0 newval + fcmovb st0, st1 ; // newval 0 (if newval > 0) + jc short go4kENV_func_leave +go4kENV_func_statechange: ; // newval + inc dword [WRK+go4kENV_wrk.state] +go4kENV_func_leave: ; // newval bla + fstp st1 +; // store new env value + fst dword [WRK+go4kENV_wrk.level] +go4kENV_func_leave2: +; // mul by gain +%ifdef GO4K_USE_ENV_MOD_GM + fld dword [edx+go4kENV_val.gain] + fadd dword [WRK+go4kENV_wrk.gm] + fmulp st1, st0 +%else + fmul dword [edx+go4kENV_val.gain] +%endif + ret + + +; //---------------------------------------------------------------------------------------- +; // VCO Tick +; //---------------------------------------------------------------------------------------- +; // IN : WRK = unit workspace +; // IN : VAL = unit values +; // IN : ecx = global workspace +; // OUT : +; // DIRTY : eax +; //---------------------------------------------------------------------------------------- +%ifdef USE_SECTIONS +section .g4kcodp code align=1 +%else +section .text +%endif +go4kVCO_pulse: + fucomi st1 ; // c p + fld1 + jnc short go4kVCO_func_pulse_up ; // +1 c p + fchs ; // -1 c p +go4kVCO_func_pulse_up: + fstp st1 ; // +-1 p + fstp st1 ; // +-1 + ret + +%ifdef USE_SECTIONS +section .g4kcodt code align=1 +%else +section .text +%endif +go4kVCO_trisaw: + fucomi st1 ; // c p + jnc short go4kVCO_func_trisaw_up + fld1 ; // 1 c p + fsubr st2, st0 ; // 1 c 1-p + fsubrp st1, st0 ; // 1-c 1-p +go4kVCO_func_trisaw_up: + fdivp st1, st0 ; // tp'/tc + fadd st0 ; // 2*'' + fld1 ; // 1 2*'' + fsubp st1, st0 ; // 2*''-1 + ret + +%ifdef USE_SECTIONS +section .g4kcods code align=1 +%else +section .text +%endif +go4kVCO_sine: + fucomi st1 ; // c p + jnc short go4kVCO_func_sine_do + fstp st1 + fsub st0, st0 ; // 0 + ret +go4kVCO_func_sine_do + fdivp st1, st0 ; // p/c + fldpi ; // pi p + fadd st0 ; // 2*pi p + fmulp st1, st0 ; // 2*pi*p + fsin ; // sin(2*pi*p) + ret + +%ifdef GO4K_USE_VCO_GATE +%ifdef USE_SECTIONS +section .g4kcodq code align=1 +%else +section .text +%endif +go4kVCO_gate: + fxch ; // p c + fstp st1 ; // p + fmul dword [c_16] ; // p' + push eax + push eax + fistp dword [esp] ; // - + fld1 ; // 1 + pop eax + and al, 0xf + bt word [VAL-5],ax + jc go4kVCO_gate_bit + fsub st0, st0 ; // 0 +go4kVCO_gate_bit: + fld dword [WRK+go4kVCO_wrk.cm] ; // f x + fsub st1 ; // f-x x + fmul dword [c_dc_const] ; // c(f-x) x + faddp st1, st0 ; // x' + fst dword [WRK+go4kVCO_wrk.cm] + pop eax + ret +%endif + +%ifdef USE_SECTIONS +section .g4kcodb code align=1 +%else +section .text +%endif +export_func go4kVCO_func@0 +%ifdef GO4K_USE_VCO_PHASE_OFFSET + %ifdef GO4K_USE_VCO_SHAPE + %ifdef GO4K_USE_VCO_GATE + push 8 + %else + push 7 + %endif + %else + %ifdef GO4K_USE_VCO_GATE + push 7 + %else + push 6 + %endif + %endif +%else + %ifdef GO4K_USE_VCO_SHAPE + %ifdef GO4K_USE_VCO_GATE + push 7 + %else + push 6 + %endif + %else + %ifdef GO4K_USE_VCO_GATE + push 6 + %else + push 5 + %endif + %endif +%endif + call go4kTransformValues +%ifdef GO4K_USE_VCO_CHECK +; check if current note still active + mov eax, dword [ecx-4] + test eax, eax + jne go4kVCO_func_do +%ifdef GO4K_USE_VCO_STEREO + movzx eax, byte [VAL-1] ; // get flags and check for stereo + test al, byte VCO_STEREO + jz short go4kVCO_func_nostereoout + fldz +go4kVCO_func_nostereoout: +%endif + fldz + ret +go4kVCO_func_do: +%endif + movzx eax, byte [VAL-1] ; // get flags +%ifdef GO4K_USE_VCO_STEREO + test al, byte VCO_STEREO + jz short go4kVCO_func_nopswap + fld dword [WRK+go4kVCO_wrk.phase] ;// swap left/right phase values for first stereo run + fld dword [WRK+go4kVCO_wrk.phase2] + fstp dword [WRK+go4kVCO_wrk.phase] + fstp dword [WRK+go4kVCO_wrk.phase2] +go4kVCO_func_nopswap: +%endif +go4kVCO_func_process: + fld dword [edx+go4kVCO_val.transpose] + fsub dword [c_0_5] +%ifdef GO4K_USE_VCO_MOD_TM + fadd dword [WRK+go4kVCO_wrk.tm] +%endif + fdiv dword [c_i128] + fld dword [edx+go4kVCO_val.detune] + fsub dword [c_0_5] + fadd st0 +%ifdef GO4K_USE_VCO_STEREO + test al, byte VCO_STEREO + jz short go4kVCO_func_nodswap + fchs ;// negate detune for stereo +go4kVCO_func_nodswap: +%endif + faddp st1 +%ifdef GO4K_USE_VCO_MOD_DM + fadd dword [WRK+go4kVCO_wrk.dm] +%endif + ; // st0 now contains the transpose+detune offset + test al, byte LFO + jnz go4kVCO_func_skipnote + fiadd dword [ecx-4] ; // st0 is note, st1 is t+d offset +go4kVCO_func_skipnote: + fmul dword [c_i12] + call _Power@0 + test al, byte LFO + jz short go4kVCO_func_normalize_note + fmul dword [_LFO_NORMALIZE] ; // st0 is now frequency for lfo + jmp short go4kVCO_func_normalized +go4kVCO_func_normalize_note: + fmul dword [FREQ_NORMALIZE] ; // st0 is now frequency +go4kVCO_func_normalized: + fadd dword [WRK+go4kVCO_wrk.phase] +%ifdef GO4K_USE_VCO_MOD_FM + fadd dword [WRK+go4kVCO_wrk.fm] +%endif + fld1 + fadd st1, st0 + fxch + fprem + fstp st1 + fst dword [WRK+go4kVCO_wrk.phase] +%ifdef GO4K_USE_VCO_MOD_PM + fadd dword [WRK+go4kVCO_wrk.pm] +%endif +%ifdef GO4K_USE_VCO_PHASE_OFFSET + fadd dword [edx+go4kVCO_val.phaseofs] +%endif +%ifdef PHASE_RENORMALIZE + fld1 + fadd st1, st0 + fxch + fprem + fstp st1 ; // p +%endif + fld dword [edx+go4kVCO_val.color] ; // c p +%ifdef GO4K_USE_VCO_MOD_CM + fadd dword [WRK+go4kVCO_wrk.cm] ; // c p +%endif +go4kVCO_func_sine: + test al, byte SINE + jz short go4kVCO_func_trisaw + call go4kVCO_sine +go4kVCO_func_trisaw: + test al, byte TRISAW + jz short go4kVCO_func_pulse + call go4kVCO_trisaw +go4kVCO_func_pulse: + test al, byte PULSE +%ifdef GO4K_USE_VCO_GATE + jz short go4kVCO_func_gate +%else + jz short go4kVCO_func_noise +%endif + call go4kVCO_pulse +%ifdef GO4K_USE_VCO_GATE +go4kVCO_func_gate: + test al, byte GATE + jz short go4kVCO_func_noise + call go4kVCO_gate +%endif +go4kVCO_func_noise: + test al, byte NOISE + jz short go4kVCO_func_end + call _FloatRandomNumber@0 + fstp st1 + fstp st1 +go4kVCO_func_end: +%ifdef GO4K_USE_VCO_SHAPE + fld dword [edx+go4kVCO_val.shape] +%ifdef GO4K_USE_VCO_MOD_SM + fadd dword [WRK+go4kVCO_wrk.sm] +%endif + call go4kWaveshaper +%endif + fld dword [edx+go4kVCO_val.gain] +%ifdef GO4K_USE_VCO_MOD_GM + fadd dword [WRK+go4kVCO_wrk.gm] +%endif + fmulp st1, st0 + +%ifdef GO4K_USE_VCO_STEREO + test al, byte VCO_STEREO + jz short go4kVCO_func_stereodone + sub al, byte VCO_STEREO + fld dword [WRK+go4kVCO_wrk.phase] ;// swap left/right phase values again for second stereo run + fld dword [WRK+go4kVCO_wrk.phase2] + fstp dword [WRK+go4kVCO_wrk.phase] + fstp dword [WRK+go4kVCO_wrk.phase2] + jmp go4kVCO_func_process +go4kVCO_func_stereodone: +%endif + ret + +%ifdef USE_SECTIONS +section .g4kcodc code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // VCF Tick +; //---------------------------------------------------------------------------------------- +; // IN : WRK = unit workspace +; // IN : VAL = unit values +; // IN : ecx = global workspace +; // OUT : +; // DIRTY : eax +; //---------------------------------------------------------------------------------------- +export_func go4kVCF_func@0 + push 3 + call go4kTransformValues +%ifdef GO4K_USE_VCF_CHECK +; check if current note still active + mov eax, dword [ecx-4] + test eax, eax + jne go4kVCF_func_do + ret +go4kVCF_func_do: +%endif + movzx eax, byte [VAL-1] ; // get type flag + + fld dword [edx+go4kVCF_val.res] ; // r in +%ifdef GO4K_USE_VCF_MOD_RM + fadd dword [WRK+go4kVCF_wrk.rm] +%endif + fstp dword [esp-8] + + fld dword [edx+go4kVCF_val.freq] ; // f in +%ifdef GO4K_USE_VCF_MOD_FM + fadd dword [WRK+go4kVCF_wrk.fm] +%endif + fmul st0, st0 ; // square the input so we never get negative and also have a smoother behaviour in the lower frequencies + fstp dword [esp-4] ; // in + +%ifdef GO4K_USE_VCF_STEREO + test al, byte STEREO + jz short go4kVCF_func_process + add WRK, go4kVCF_wrk.low2 +go4kVCF_func_stereoloop: ; // switch channels + fxch st1 ; // inr inl +%endif + +go4kVCF_func_process: + fld dword [esp-8] + fld dword [esp-4] + fmul dword [WRK+go4kVCF_wrk.band] ; // f*b r in + fadd dword [WRK+go4kVCF_wrk.low] ; // l' r in + fst dword [WRK+go4kVCF_wrk.low] ; // l' r in + fsubp st2, st0 ; // r in-l' + fmul dword [WRK+go4kVCF_wrk.band] ; // r*b in-l' + fsubp st1, st0 ; // h' + fst dword [WRK+go4kVCF_wrk.high] ; // h' + fmul dword [esp-4] ; // h'*f + fadd dword [WRK+go4kVCF_wrk.band] ; // b' + fstp dword [WRK+go4kVCF_wrk.band] + fldz +go4kVCF_func_low: + test al, byte LOWPASS + jz short go4kVCF_func_high + fadd dword [WRK+go4kVCF_wrk.low] +go4kVCF_func_high: +%ifdef GO4K_USE_VCF_HIGH + test al, byte HIGHPASS + jz short go4kVCF_func_band + fadd dword [WRK+go4kVCF_wrk.high] +%endif +go4kVCF_func_band: +%ifdef GO4K_USE_VCF_BAND + test al, byte BANDPASS + jz short go4kVCF_func_peak + fadd dword [WRK+go4kVCF_wrk.band] +%endif +go4kVCF_func_peak: +%ifdef GO4K_USE_VCF_PEAK + test al, byte PEAK + jz short go4kVCF_func_processdone + fadd dword [WRK+go4kVCF_wrk.low] + fsub dword [WRK+go4kVCF_wrk.high] +%endif +go4kVCF_func_processdone: + +%ifdef GO4K_USE_VCF_STEREO + test al, byte STEREO ; // outr inl + jz short go4kVCF_func_end + sub al, byte STEREO + sub WRK, go4kVCF_wrk.low2 + jmp go4kVCF_func_stereoloop +%endif + +go4kVCF_func_end: ; // value - - - - + ret + +%ifdef USE_SECTIONS +section .g4kcodd code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // DST Tick +; //---------------------------------------------------------------------------------------- +; // IN : WRK = unit workspace +; // IN : VAL = unit values +; // IN : ecx = global workspace +; // OUT : +; // DIRTY : eax +; //---------------------------------------------------------------------------------------- +export_func go4kDST_func@0 +%ifdef GO4K_USE_DST +%ifdef GO4K_USE_DST_SH + %ifdef GO4K_USE_DST_STEREO + push 3 + %else + push 2 + %endif +%else + %ifdef GO4K_USE_DST_STEREO + push 2 + %else + push 1 + %endif +%endif + call go4kTransformValues +%ifdef GO4K_USE_DST_CHECK +; check if current note still active + mov eax, dword [ecx-4] + test eax, eax + jne go4kDST_func_do + ret +go4kDST_func_do: +%endif + movzx eax, byte [VAL-1] ; // get type flag +%ifdef GO4K_USE_DST_SH + fld dword [edx+go4kDST_val.snhfreq] ; // snh in (inr) +%ifdef GO4K_USE_DST_MOD_SH + fadd dword [WRK+go4kDST_wrk.sm] ; // snh' in (inr) +%endif + fmul st0, st0 ; // square the input so we never get negative and also have a smoother behaviour in the lower frequencies + fchs + fadd dword [WRK+go4kDST_wrk.snhphase]; // snh' in (inr) + fst dword [WRK+go4kDST_wrk.snhphase] + fldz ; // 0 snh' in (inr) + fucomip st1 ; // snh' in (inr) + fstp dword [esp-4] ; // in (inr) + jc short go4kDST_func_hold + fld1 ; // 1 in (inr) + fadd dword [esp-4] ; // 1+snh' in (inr) + fstp dword [WRK+go4kDST_wrk.snhphase]; // in (inr) +%endif +; // calc pregain and postgain +%ifdef GO4K_USE_DST_STEREO + test al, byte STEREO + jz short go4kDST_func_mono + fxch st1 ; // inr inl + fld dword [edx+go4kDST_val.drive] ; // drive inr inl +%ifdef GO4K_USE_DST_MOD_DM + fadd dword [WRK+go4kDST_wrk.dm] +%endif + call go4kWaveshaper ; // outr inl +%ifdef GO4K_USE_DST_SH + fst dword [WRK+go4kDST_wrk.out2] ; // outr inl +%endif + fxch st1 ; // inl outr +go4kDST_func_mono: +%endif + fld dword [edx+go4kDST_val.drive] ; // drive in (outr) +%ifdef GO4K_USE_DST_MOD_DM + fadd dword [WRK+go4kDST_wrk.dm] +%endif + call go4kWaveshaper ; // out (outr) +%ifdef GO4K_USE_DST_SH + fst dword [WRK+go4kDST_wrk.out] ; // out' (outr) +%endif + ret ; // out' (outr) +%ifdef GO4K_USE_DST_SH +go4kDST_func_hold: ; // in (inr) + fstp st0 ; // (inr) +%ifdef GO4K_USE_DST_STEREO + test al, byte STEREO + jz short go4kDST_func_monohold ; // (inr) + fstp st0 ; // + fld dword [WRK+go4kDST_wrk.out2] ; // outr +go4kDST_func_monohold: +%endif + fld dword [WRK+go4kDST_wrk.out] ; // out (outr) + ret +%endif + +%endif + +%ifdef USE_SECTIONS +section .g4kcodf code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // DLL Tick +; //---------------------------------------------------------------------------------------- +; // IN : WRK = unit workspace +; // IN : VAL = unit values +; // IN : ecx = global workspace +; // OUT : +; // DIRTY : eax +; //---------------------------------------------------------------------------------------- +export_func go4kDLL_func@0 +%ifdef GO4K_USE_DLL +%ifdef GO4K_USE_DLL_CHORUS + %ifdef GO4K_USE_DLL_DAMP + push 8 + %else + push 7 + %endif +%else + %ifdef GO4K_USE_DLL_DAMP + push 6 + %else + push 5 + %endif +%endif + call go4kTransformValues + pushad + movzx ebx, byte [VAL-(go4kDLL_val.size-go4kDLL_val.delay)/4] ;// delay length index +%ifdef GO4K_USE_DLL_NOTE_SYNC + test ebx, ebx + jne go4kDLL_func_process + fld1 + fild dword [ecx-4] ; // load note freq + fmul dword [c_i12] + call _Power@0 + fmul dword [FREQ_NORMALIZE] ; // normalize + fdivp st1, st0 ; // invert to get numer of samples + fistp word [_go4k_delay_times+ebx*2] ; store current comb size +%endif +go4kDLL_func_process: + mov ecx, eax ;// ecx is delay counter +%ifdef GO4K_USE_DLL_MOD + mov edi, WRK ;// edi is modulation workspace +%endif + mov WRK, dword [_go4k_delay_buffer_ofs] ;// ebp is current delay + fld st0 ;// in in +%ifdef GO4K_USE_DLL_MOD_IM + fld dword [edx+go4kDLL_val.dry] ;// dry in in + fadd dword [edi+go4kDLL_wrk2.im] ;// dry' in in + fmulp st1, st0 ;// out in +%else + fmul dword [edx+go4kDLL_val.dry] ;// out in +%endif + fxch ;// in out +%ifdef GO4K_USE_DLL_MOD_PM + fld dword [edx+go4kDLL_val.pregain] ;// pg in out + fadd dword [edi+go4kDLL_wrk2.pm] ;// pg' in out + fmul st0, st0 ;// pg'' in out + fmulp st1, st0 ;// in' out +%else + fmul dword [edx+go4kDLL_val.pregain] ;// in' out + fmul dword [edx+go4kDLL_val.pregain] ;// in' out +%endif + +%ifdef GO4K_USE_DLL_CHORUS +;// update saw lfo for chorus/flanger + fld dword [edx+go4kDLL_val.freq] ;// f in' out +%ifdef GO4K_USE_DLL_MOD_SM + fadd dword [edi+go4kDLL_wrk2.sm] ;// f' in' out +%endif + fmul st0, st0 + fmul st0, st0 + fdiv dword [DLL_DEPTH] + fadd dword [WRK+go4kDLL_wrk.phase] ;// p' in' out +;// clamp phase to 0,1 (only in editor, since delay can be active quite long) +%ifdef GO4K_USE_DLL_CHORUS_CLAMP + fld1 ;// 1 p' in' out + fadd st1, st0 ;// 1 1+p' in' out + fxch ;// 1+p' 1 in' out + fprem ;// p'' 1 in' out + fstp st1 ;// p'' in' out +%endif + fst dword [WRK+go4kDLL_wrk.phase] +;// get current sine value + fldpi ; // pi p in' out + fadd st0 ; // 2*pi p in' out + fmulp st1, st0 ; // 2*pi*p in' out + fsin ; // sin in' out + fld1 ; // 1 sin in' out + faddp st1, st0 ; // 1+sin in' out +;// mul with depth and convert to samples + fld dword [edx+go4kDLL_val.depth] ; // d 1+sin in' out +%ifdef GO4K_USE_DLL_MOD_AM + fadd dword [edi+go4kDLL_wrk2.am] ; // d' 1+sin in' out +%endif + fmul st0, st0 + fmul st0, st0 + fmul dword [DLL_DEPTH] + fmulp st1, st0 + fistp dword [esp-4] ; // in' out +%endif + +go4kDLL_func_loop: + movzx esi, word [_go4k_delay_times+ebx*2] ; fetch comb size + mov eax, dword [WRK+go4kDLL_wrk.index] ;// eax is current comb index + +%ifdef GO4K_USE_DLL_CHORUS + ;// add lfo offset and wrap buffer + add eax, dword [esp-4] + cmp eax, esi + jl short go4kDLL_func_buffer_nowrap1 + sub eax, esi +go4kDLL_func_buffer_nowrap1: +%endif + + fld dword [WRK+eax*4+go4kDLL_wrk.buffer];// cout in' out + +%ifdef GO4K_USE_DLL_CHORUS + mov eax, dword [WRK+go4kDLL_wrk.index] +%endif + + ;// add comb output to current output + fadd st2, st0 ;// cout in' out' +%ifdef GO4K_USE_DLL_DAMP + fld1 ;// 1 cout in' out' + fsub dword [edx+go4kDLL_val.damp] ;// 1-damp cout in' out' +%ifdef GO4K_USE_DLL_MOD_DM + fsub dword [edi+go4kDLL_wrk2.dm] ;// 1-damp' cout in' out' +%endif + fmulp st1, st0 ;// cout*d2 in' out' + fld dword [edx+go4kDLL_val.damp] ;// d1 cout*d2 in' out' +%ifdef GO4K_USE_DLL_MOD_DM + fadd dword [edi+go4kDLL_wrk2.dm] ;// d1' cout*d2 in' out' +%endif + fmul dword [WRK+go4kDLL_wrk.store] ;// store*d1 cout*d2 in' out' + faddp st1, st0 ;// store' in' out' + fst dword [WRK+go4kDLL_wrk.store] ;// store' in' out' +%endif +%ifdef GO4K_USE_DLL_MOD_FM + fld dword [edx+go4kDLL_val.feedback] ;// fb cout in' out' + fadd dword [edi+go4kDLL_wrk2.fm] ;// fb' cout in' out' + fmulp st1, st0 ;// cout*fb' in' out' +%else + fmul dword [edx+go4kDLL_val.feedback] ;// cout*fb in' out' +%endif +%ifdef GO4K_USE_DLL_DC_FILTER + fadd st0, st1 ;// store in' out' + fstp dword [WRK+eax*4+go4kDLL_wrk.buffer];// in' out' +%else + fsub st0, st1 ;// store in' out' + fstp dword [WRK+eax*4+go4kDLL_wrk.buffer];// in' out' + fneg +%endif + ;// wrap comb buffer pos + inc eax + cmp eax, esi + jl short go4kDLL_func_buffer_nowrap2 +%ifdef GO4K_USE_DLL_CHORUS + sub eax, esi +%else + xor eax, eax +%endif +go4kDLL_func_buffer_nowrap2: + mov dword [WRK+go4kDLL_wrk.index], eax + ;// increment buffer pointer to next buffer + inc ebx ;// go to next delay length index + add WRK, go4kDLL_wrk.size ;// go to next delay + mov dword [_go4k_delay_buffer_ofs], WRK ;// store next delay offset + loopne go4kDLL_func_loop + fstp st0 ;// out' + ;// process a dc filter to prevent heavy offsets in reverb +%ifdef GO4K_USE_DLL_DC_FILTER +; y(n) = x(n) - x(n-1) + R * y(n-1) + sub WRK, go4kDLL_wrk.size + fld dword [WRK+go4kDLL_wrk.dcout] ;// dco out' + fmul dword [c_dc_const] ;// dcc*dco out' + fsub dword [WRK+go4kDLL_wrk.dcin] ;// dcc*dco-dci out' + fxch ;// out' dcc*dco-dci + fst dword [WRK+go4kDLL_wrk.dcin] ;// out' dcc*dco-dci + faddp st1 ;// out' +%ifdef GO4K_USE_UNDENORMALIZE + fadd dword [c_0_5] ;// add and sub small offset to prevent denormalization + fsub dword [c_0_5] +%endif + fst dword [WRK+go4kDLL_wrk.dcout] +%endif + popad + ret +%endif + + +%ifdef USE_SECTIONS +section .g4kcodu code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // GLITCH Tick +; //---------------------------------------------------------------------------------------- +; // IN : WRK = unit workspace +; // IN : VAL = unit values +; // IN : ecx = global workspace +; // OUT : +; // DIRTY : eax +; //---------------------------------------------------------------------------------------- +export_func go4kGLITCH_func@0 +%ifdef GO4K_USE_GLITCH + push 5 + call go4kTransformValues + pushad + + mov edi, WRK + mov WRK, dword [_go4k_delay_buffer_ofs] ;// ebp is current delay + +; mov eax, dword [edx+go4kGLITCH_val.active] +; or eax, dword [edi+go4kGLITCH_wrk2.am] +; test eax, eax +; je go4kGLITCH_func_notactive ;// out + + fld dword [edx+go4kGLITCH_val.active] ;// a in + fadd dword [edi+go4kGLITCH_wrk2.am] ;// a' in + ; // check for activity + fldz ;// 0 a' in + fucomip st1 ;// a' in + fstp st0 ;// in + jnc go4kGLITCH_func_notactive ;// out + + ;// check for first call and init if so init (using slizesize slot) + mov eax, dword [WRK+go4kGLITCH_wrk.slizesize] + and eax, eax + jnz go4kGLITCH_func_process + mov dword [WRK+go4kGLITCH_wrk.index], eax + mov dword [WRK+go4kGLITCH_wrk.store], eax + movzx ebx, byte [VAL-(go4kGLITCH_val.size-go4kGLITCH_val.slicesize)/4] ;// slicesize index + movzx eax, word [_go4k_delay_times+ebx*2] ;// fetch slicesize + push eax + fld1 + fild dword [esp] + fstp dword [WRK+go4kGLITCH_wrk.slizesize] + fstp dword [WRK+go4kGLITCH_wrk.slicepitch] + pop eax +go4kGLITCH_func_process: + ;// fill buffer until full + mov eax, dword [WRK+go4kGLITCH_wrk.store] + cmp eax, MAX_DELAY + jae go4kGLITCH_func_filldone + fst dword [WRK+eax*4+go4kDLL_wrk.buffer] ;// in + inc dword [WRK+go4kGLITCH_wrk.store] +go4kGLITCH_func_filldone: + ;// save input + push eax + fstp dword [esp] ;// - + + ;// read from buffer + push eax + fld dword [WRK+go4kGLITCH_wrk.index] ;// idx + fist dword [esp] + pop eax + fld dword [WRK+eax*4+go4kDLL_wrk.buffer] ;// out idx + fxch ;// idx out + ;// progress readindex with current play speed + fadd dword [WRK+go4kGLITCH_wrk.slicepitch] ;// idx' out + fst dword [WRK+go4kGLITCH_wrk.index] + + ;// check for slice done + fld dword [WRK+go4kGLITCH_wrk.slizesize] ;// size idx' out + fxch ;// idx' size out + fucomip st1 ;// idx' out + fstp st0 ;// out + jc go4kGLITCH_func_process_done + ;// reinit for next loop + xor eax, eax + mov dword [WRK+go4kGLITCH_wrk.index], eax + + fld dword [edx+go4kGLITCH_val.dsize] + fadd dword [edi+go4kGLITCH_wrk2.sm] + fsub dword [c_0_5] + fmul dword [c_0_5] + call _Power@0 + fmul dword [WRK+go4kGLITCH_wrk.slizesize] + fstp dword [WRK+go4kGLITCH_wrk.slizesize] + + fld dword [edx+go4kGLITCH_val.dpitch] + fadd dword [edi+go4kGLITCH_wrk2.pm] + fsub dword [c_0_5] + fmul dword [c_0_5] + call _Power@0 + fmul dword [WRK+go4kGLITCH_wrk.slicepitch] + fstp dword [WRK+go4kGLITCH_wrk.slicepitch] +go4kGLITCH_func_process_done: + + ;// dry wet mix + fld dword [edx+go4kGLITCH_val.dry] ;// dry out + fadd dword [edi+go4kGLITCH_wrk2.dm] ;// dry' out + fld1 ;// 1 dry' out + fsub st1 ;// 1-dry' dry' out + fmulp st2 ;// dry' out' + fmul dword [esp] ;// in' out' + faddp st1, st0 ;// out' + + pop eax + jmp go4kGLITCH_func_leave +go4kGLITCH_func_notactive: + ;// mark as uninitialized again (using slizesize slot) + xor eax,eax + mov dword [WRK+go4kGLITCH_wrk.slizesize], eax +go4kGLITCH_func_leave: + add WRK, go4kDLL_wrk.size ;// go to next delay + mov dword [_go4k_delay_buffer_ofs], WRK ;// store next delay offset + popad + ret +%endif + +%ifdef USE_SECTIONS +section .g4kcodg code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // FOP Tick (various fp stack based operations) +; //---------------------------------------------------------------------------------------- +; // IN : WRK = unit workspace +; // IN : VAL = unit values +; // IN : ecx = global workspace +; // OUT : +; // DIRTY : +; //---------------------------------------------------------------------------------------- +export_func go4kFOP_func@0 + push 1 + call go4kTransformValues +go4kFOP_func_pop: + dec eax + jnz go4kFOP_func_addp + fstp st0 + ret +go4kFOP_func_addp: + dec eax + jnz go4kFOP_func_mulp + faddp st1, st0 + ret +go4kFOP_func_mulp: + dec eax + jnz go4kFOP_func_push + fmulp st1, st0 + ret +go4kFOP_func_push: + dec eax + jnz go4kFOP_func_xch + fld st0 + ret +go4kFOP_func_xch: + dec eax + jnz go4kFOP_func_add + fxch + ret +go4kFOP_func_add: + dec eax + jnz go4kFOP_func_mul + fadd st1 + ret +go4kFOP_func_mul: + dec eax + jnz go4kFOP_func_addp2 + fmul st1 + ret +go4kFOP_func_addp2: + dec eax + jnz go4kFOP_func_loadnote + faddp st2, st0 + faddp st2, st0 + ret +go4kFOP_func_loadnote: + dec eax + jnz go4kFOP_func_mulp2 + fild dword [ecx-4] + fmul dword [c_i128] + ret +go4kFOP_func_mulp2: + fmulp st2, st0 + fmulp st2, st0 + ret + +%ifdef USE_SECTIONS +section .g4kcodh code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // FST Tick (stores a value somewhere in the local workspace) +; //---------------------------------------------------------------------------------------- +; // IN : WRK = unit workspace +; // IN : VAL = unit values +; // IN : ecx = global workspace +; // OUT : +; // DIRTY : +; //---------------------------------------------------------------------------------------- +export_func go4kFST_func@0 + push 1 + call go4kTransformValues + fld dword [edx+go4kFST_val.amount] + fsub dword [c_0_5] + fadd st0 + fmul st1 + lodsw + and eax, 0x00003fff ; // eax is destination slot + test word [VAL-2], FST_ADD + jz go4kFST_func_set + fadd dword [ecx+eax*4] +go4kFST_func_set: + fstp dword [ecx+eax*4] + test word [VAL-2], FST_POP + jz go4kFST_func_done + fstp st0 +go4kFST_func_done: + ret + +%ifdef USE_SECTIONS +section .g4kcodm code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // FLD Tick (load a value on stack, optionally add a modulation signal beforehand) +; //---------------------------------------------------------------------------------------- +; // IN : WRK = unit workspace +; // IN : VAL = unit values +; // IN : ecx = global workspace +; // OUT : signal-signal*pan , signal*pan +; // DIRTY : +; //---------------------------------------------------------------------------------------- +export_func go4kFLD_func@0 ;// in main env +%ifdef GO4K_USE_FLD + push 1 + call go4kTransformValues + fld dword [edx+go4kFLD_val.value] ;// value in + fsub dword [c_0_5] + fadd st0 +%ifdef GO4K_USE_FLD_MOD_VM + fadd dword [WRK+go4kFLD_wrk.vm] ;// value' in +%endif +%endif + ret + +%ifdef GO4K_USE_FSTG +%ifdef USE_SECTIONS +section .g4kcodi code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // FSTG Tick (stores a value anywhere in the synth (and in each voice)) +; //---------------------------------------------------------------------------------------- +; // IN : WRK = unit workspace +; // IN : VAL = unit values +; // IN : ecx = global workspace +; // OUT : +; // DIRTY : +; //---------------------------------------------------------------------------------------- +export_func go4kFSTG_func@0 + push 1 + call go4kTransformValues +%ifdef GO4K_USE_FSTG_CHECK +; check if current note still active + mov eax, dword [ecx-4] + test eax, eax + jne go4kFSTG_func_do + lodsw + jmp go4kFSTG_func_testpop +go4kFSTG_func_do: +%endif + fld dword [edx+go4kFST_val.amount] + fsub dword [c_0_5] + fadd st0 + fmul st1 + lodsw + and eax, 0x00003fff ; // eax is destination slot + test word [VAL-2], FST_ADD + jz go4kFSTG_func_set + fadd dword [go4k_synth_wrk+eax*4] +go4kFSTG_func_set: +%if MAX_VOICES > 1 + fst dword [go4k_synth_wrk+eax*4] + fstp dword [go4k_synth_wrk+eax*4+go4k_instrument.size] +%else + fstp dword [go4k_synth_wrk+eax*4] +%endif +go4kFSTG_func_testpop: + test word [VAL-2], FST_POP + jz go4kFSTG_func_done + fstp st0 +go4kFSTG_func_done: + ret +%endif + +%ifdef USE_SECTIONS +section .g4kcodj code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // PAN Tick (multiplies signal with main envelope and converts to stereo) +; //---------------------------------------------------------------------------------------- +; // IN : WRK = unit workspace +; // IN : VAL = unit values +; // IN : ecx = global workspace +; // OUT : signal-signal*pan , signal*pan +; // DIRTY : +; //---------------------------------------------------------------------------------------- +export_func go4kPAN_func@0 ;// in main env +%ifdef GO4K_USE_PAN + push 1 + call go4kTransformValues + fld dword [edx+go4kPAN_val.panning] ;// pan in +%ifdef GO4K_USE_PAN_MOD + fadd dword [WRK+go4kPAN_wrk.pm] ;// pan in +%endif + fmul st1 ;// r in + fsub st1, st0 ;// r l + fxch ;// l r +%else + fmul dword [c_0_5] + fld st0 +%endif + ret + +%ifdef USE_SECTIONS +section .g4kcodk code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // OUT Tick ( stores stereo signal pair in temp buffers of the instrument) +; //---------------------------------------------------------------------------------------- +; // IN : WRK = unit workspace +; // IN : VAL = unit values +; // IN : ecx = global workspace +; // OUT : +; // DIRTY : +; //---------------------------------------------------------------------------------------- +export_func go4kOUT_func@0 ;// l r +%ifdef GO4K_USE_GLOBAL_DLL + push 2 + call go4kTransformValues + pushad + lea edi, [ecx+MAX_UNITS*MAX_UNIT_SLOTS*4] + fld st1 ;// r l r + fld st1 ;// l r l r + fld dword [edx+go4kOUT_val.auxsend] ;// as l r l r +%ifdef GO4K_USE_OUT_MOD_AM + fadd dword [WRK+go4kOUT_wrk.am] ;// am l r l r +%endif + fmulp st1, st0 ;// l' r l r + fstp dword [edi] ;// r l r + scasd + fld dword [edx+go4kOUT_val.auxsend] ;// as r l r +%ifdef GO4K_USE_OUT_MOD_AM + fadd dword [WRK+go4kOUT_wrk.am] ;// am r l r +%endif + fmulp st1, st0 ;// r' l r + fstp dword [edi] ;// l r + scasd + fld dword [edx+go4kOUT_val.gain] ;// g l r +%ifdef GO4K_USE_OUT_MOD_GM + fadd dword [WRK+go4kOUT_wrk.gm] ;// gm l r +%endif + fmulp st1, st0 ;// l' r + fstp dword [edi] ;// r + scasd + fld dword [edx+go4kOUT_val.gain] ;// g r +%ifdef GO4K_USE_OUT_MOD_GM + fadd dword [WRK+go4kOUT_wrk.gm] ;// gm r +%endif + fmulp st1, st0 ;// r' + fstp dword [edi] ;// - + scasd + popad +%else + push 1 + call go4kTransformValues + + fld dword [edx+go4kOUT_val.gain] ;// g l r +%ifdef GO4K_USE_OUT_MOD_GM + fadd dword [WRK+go4kOUT_wrk.gm] ;// gm l r +%endif + fmulp st1, st0 ;// l' r + fstp dword [ecx+MAX_UNITS*MAX_UNIT_SLOTS*4+0] ;// r + fld dword [edx+go4kOUT_val.gain] ;// g r +%ifdef GO4K_USE_OUT_MOD_GM + fadd dword [WRK+go4kOUT_wrk.gm] ;// gm r +%endif + fmulp st1, st0 ;// r' + fstp dword [ecx+MAX_UNITS*MAX_UNIT_SLOTS*4+4] ;// - + +%endif + ret + +%ifdef USE_SECTIONS +section .g4kcodl code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // ACC Tick (stereo signal accumulation for synth commands only -> dont use in instrument commands) +; //---------------------------------------------------------------------------------------- +; // IN : WRK = unit workspace +; // IN : VAL = unit values +; // IN : ecx = global workspace +; // OUT : +; // DIRTY : eax +; //---------------------------------------------------------------------------------------- +export_func go4kACC_func@0 + push 1 + call go4kTransformValues + pushad + mov edi, go4k_synth_wrk + add edi, go4k_instrument.size + sub edi, eax ; // eax already contains the accumulation offset from the go4kTransformValues call + mov cl, MAX_INSTRUMENTS*MAX_VOICES + fldz ;// 0 + fldz ;// 0 0 +go4kACC_func_loop: + fadd dword [edi-8] ;// l 0 + fxch ;// 0 l + fadd dword [edi-4] ;// r l + fxch ;// l r + add edi, go4k_instrument.size + dec cl + jnz go4kACC_func_loop + popad + ret + +%ifdef USE_SECTIONS +section .g4kcodw code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // Update Instrument (allocate voices, set voice to release) +; //---------------------------------------------------------------------------------------- +; // IN : +; // IN : +; // OUT : +; // DIRTY : +; //---------------------------------------------------------------------------------------- +go4kUpdateInstrument: +; // get new note + mov eax, dword [esp+4+4] ; // eax = current tick + shr eax, PATTERN_SIZE_SHIFT ; // eax = current pattern + imul edx, ecx, dword MAX_PATTERNS ; // edx = instrument pattern list index + movzx edx, byte [edx+eax+go4k_pattern_lists] ; // edx = pattern index + mov eax, dword [esp+4+4] ; // eax = current tick + shl edx, PATTERN_SIZE_SHIFT + and eax, PATTERN_SIZE-1 + movzx edx, byte [edx+eax+go4k_patterns] ; // edx = requested note in new patterntick +; // apply note changes + cmp dl, HLD ; // anything but hold causes action + je short go4kUpdateInstrument_done + inc dword [edi] ; // set release flag if needed +%if MAX_VOICES > 1 + inc dword [edi+go4k_instrument.size] ; // set release flag if needed +%endif + cmp dl, HLD ; // check for new note + jl short go4kUpdateInstrument_done +%if MAX_VOICES > 1 + pushad + xchg eax, dword [go4k_voiceindex + ecx*4] + test eax, eax + je go4kUpdateInstrument_newNote + add edi, go4k_instrument.size +go4kUpdateInstrument_newNote: + xor al,1 + xchg dword [go4k_voiceindex + ecx*4], eax +%endif + pushad + xor eax, eax + mov ecx, (8+MAX_UNITS*MAX_UNIT_SLOTS*4)/4 ; // clear only relase, note and workspace + rep stosd + popad + mov dword [edi+4], edx ; // set requested note as current note +%if MAX_VOICES > 1 + popad +%endif + jmp short go4kUpdateInstrument_done +go4kUpdateInstrument_done: + ret + +%ifdef USE_SECTIONS +section .g4kcodx code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // Render Voices +; //---------------------------------------------------------------------------------------- +; // IN : +; // IN : +; // OUT : +; // DIRTY : +; //---------------------------------------------------------------------------------------- +go4kRenderVoices: + push ecx ; // save current instrument counter +%if MAX_VOICES > 1 + push COM ; // save current instrument command index + push VAL ; // save current instrument values index +%endif + call go4k_VM_process ; // call synth vm for instrument voices + mov eax, dword [ecx+go4kENV_wrk.state] + cmp al, byte ENV_STATE_OFF + jne go4kRenderVoices_next + xor eax, eax + mov dword [ecx-4], eax ; // kill note if voice is done +go4kRenderVoices_next: +%if MAX_VOICES > 1 + pop VAL ; // restore instrument value index + pop COM ; // restore instrument command index +%endif + +%ifdef GO4K_USE_BUFFER_RECORDINGS + mov eax, dword [esp+16] ; // get current tick + shr eax, 8 ; // every 256th sample = ~ 172 hz + shl eax, 5 ; // for 16 instruments a 2 voices + add eax, dword [esp] + add eax, dword [esp] ; // + 2*currentinstrument+0 +%ifdef GO4K_USE_ENVELOPE_RECORDINGS + mov edx, dword [ecx+go4kENV_wrk.level] + mov dword [__4klang_envelope_buffer+eax*4], edx +%endif +%ifdef GO4K_USE_NOTE_RECORDINGS + mov edx, dword [ecx-4] + mov dword [__4klang_note_buffer+eax*4], edx +%endif +%endif + +%if MAX_VOICES > 1 + call go4k_VM_process ; // call synth vm for instrument voices + mov eax, dword [ecx+go4kENV_wrk.state] + cmp al, byte ENV_STATE_OFF + jne go4k_render_instrument_next2 + xor eax, eax + mov dword [ecx-4], eax ; // kill note if voice is done +go4k_render_instrument_next2: + +%ifdef GO4K_USE_BUFFER_RECORDINGS + mov eax, dword [esp+16] ; // get current tick + shr eax, 8 ; // every 256th sample = ~ 172 hz + shl eax, 5 ; // for 16 instruments a 2 voices + add eax, dword [esp] + add eax, dword [esp] ; // + 2*currentinstrument+0 +%ifdef GO4K_USE_ENVELOPE_RECORDINGS + mov edx, dword [ecx+go4kENV_wrk.level] + mov dword [__4klang_envelope_buffer+eax*4+4], edx +%endif +%ifdef GO4K_USE_NOTE_RECORDINGS + mov edx, dword [ecx-4] + mov dword [__4klang_note_buffer+eax*4+4], edx +%endif +%endif + +%endif + pop ecx ; // restore instrument counter + ret + +%ifdef USE_SECTIONS +section .g4kcody code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // the entry point for the synth +; //---------------------------------------------------------------------------------------- +%ifdef USE_SECTIONS +export_func _4klang_render@4 +%else +export_func _4klang_render +%endif + pushad + xor ecx, ecx +%ifdef GO4K_USE_BUFFER_RECORDINGS + push ecx +%endif +; loop all ticks +go4k_render_tickloop: + push ecx + xor ecx, ecx +; loop all samples per tick +go4k_render_sampleloop: + push ecx + xor ecx, ecx + mov ebx, go4k_synth_instructions ; // ebx = instrument command index + mov VAL, go4k_synth_parameter_values; // VAL = instrument values index + mov edi, _go4k_delay_buffer ; // get offset of first delay buffer + mov dword [_go4k_delay_buffer_ofs], edi ; // store offset in delaybuffer offset variable + mov edi, go4k_synth_wrk ; // edi = first instrument +; loop all instruments +go4k_render_instrumentloop: + mov eax, dword [esp] ; // eax = current tick sample + and eax, eax + jnz go4k_render_instrument_process ; // tick change? (first sample in current tick) + call go4kUpdateInstrument ; // update instrument state +; process instrument +go4k_render_instrument_process: + call go4kRenderVoices + inc ecx + cmp cl, byte MAX_INSTRUMENTS + jl go4k_render_instrumentloop + mov dword [edi+4], ecx ; // move a value != 0 into note slot, so processing will be done + call go4k_VM_process ; // call synth vm for synth +go4k_render_output_sample: +%ifdef GO4K_USE_BUFFER_RECORDINGS + inc dword [esp+8] + xchg esi, dword [esp+48] ; // edx = destbuffer +%else + xchg esi, dword [esp+44] ; // edx = destbuffer +%endif +%ifdef GO4K_CLIP_OUTPUT + fld dword [edi-8] + fld1 ; // 1 val + fucomi st1 ; // 1 val + jbe short go4k_render_clip1 + fchs ; // -1 val + fucomi st1 ; // -1 val + fcmovb st0, st1 ; // val -1 (if val > -1) +go4k_render_clip1: + fstp st1 ; // newval +%ifdef GO4K_USE_16BIT_OUTPUT + push eax + fmul dword [c_32767] + fistp dword [esp] + pop eax + mov word [esi],ax ; // store integer converted left sample + lodsw +%else + fstp dword [esi] ; // store left sample + lodsd +%endif + fld dword [edi-4] + fld1 ; // 1 val + fucomi st1 ; // 1 val + jbe short go4k_render_clip2 + fchs ; // -1 val + fucomi st1 ; // -1 val + fcmovb st0, st1 ; // val -1 (if val > -1) +go4k_render_clip2: + fstp st1 ; // newval +%ifdef GO4K_USE_16BIT_OUTPUT + push eax + fmul dword [c_32767] + fistp dword [esp] + pop eax + mov word [esi],ax ; // store integer converted right sample + lodsw +%else + fstp dword [esi] ; // store right sample + lodsd +%endif +%else + fld dword [edi-8] +%ifdef GO4K_USE_16BIT_OUTPUT + push eax + fmul dword [c_32767] + fistp dword [esp] + pop eax + mov word [esi],ax ; // store integer converted left sample + lodsw +%else + fstp dword [esi] ; // store left sample + lodsd +%endif + fld dword [edi-4] +%ifdef GO4K_USE_16BIT_OUTPUT + push eax + fmul dword [c_32767] + fistp dword [esp] + pop eax + mov word [esi],ax ; // store integer converted right sample + lodsw +%else + fstp dword [esi] ; // store right sample + lodsd +%endif +%endif +%ifdef GO4K_USE_BUFFER_RECORDINGS + xchg esi, dword [esp+48] +%else + xchg esi, dword [esp+44] +%endif + pop ecx + inc ecx +%ifdef GO4K_USE_GROOVE_PATTERN + mov ebx, dword SAMPLES_PER_TICK + mov eax, dword [esp] + and eax, 0x0f + bt dword [go4k_groove_pattern],eax + jnc go4k_render_nogroove + sub ebx, dword 3000 +go4k_render_nogroove: + cmp ecx, ebx +%else + cmp ecx, dword SAMPLES_PER_TICK +%endif + jl go4k_render_sampleloop + pop ecx + inc ecx +%ifdef AUTHORING + mov dword[__4klang_current_tick], ecx +%endif + cmp ecx, dword MAX_TICKS + jl go4k_render_tickloop +%ifdef GO4K_USE_BUFFER_RECORDINGS + pop ecx +%endif + popad + ret 4 + +%ifdef USE_SECTIONS +section .g4kcodz code align=1 +%else +section .text +%endif +; //---------------------------------------------------------------------------------------- +; // the magic behind it :) +; //---------------------------------------------------------------------------------------- +; // IN : edi = instrument pointer +; // IN : esi = instrumet values +; // IN : ebx = instrument instructions +; // OUT : +; // DIRTY : +; //---------------------------------------------------------------------------------------- +go4k_VM_process: + lea WRK, [edi+8] ; // get current workspace pointer + mov ecx, WRK ; // ecx = workspace start +go4k_VM_process_loop: + movzx eax, byte [ebx] ; // get command byte + inc ebx + test eax, eax + je go4k_VM_process_done ; // command byte = 0? so done + call dword [eax*4+go4k_synth_commands] + add WRK, MAX_UNIT_SLOTS*4 ; // go to next workspace slot + jmp short go4k_VM_process_loop +go4k_VM_process_done: + add edi, go4k_instrument.size ; // go to next instrument voice ret \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..6849b02 --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(vsti) \ No newline at end of file diff --git a/4klang_source/playosx/.gitignore b/src/playerosx/.gitignore similarity index 100% rename from 4klang_source/playosx/.gitignore rename to src/playerosx/.gitignore diff --git a/4klang_source/playosx/4klangrender.c b/src/playerosx/4klangrender.c similarity index 100% rename from 4klang_source/playosx/4klangrender.c rename to src/playerosx/4klangrender.c diff --git a/4klang_source/playosx/README.md b/src/playerosx/README.md similarity index 100% rename from 4klang_source/playosx/README.md rename to src/playerosx/README.md diff --git a/4klang_source/playosx/runosx.sh b/src/playerosx/runosx.sh similarity index 100% rename from 4klang_source/playosx/runosx.sh rename to src/playerosx/runosx.sh diff --git a/4klang_source/4klang.inc b/src/vsti/4klang.asm similarity index 97% rename from 4klang_source/4klang.inc rename to src/vsti/4klang.asm index 5f07060..8f09333 100644 --- a/4klang_source/4klang.inc +++ b/src/vsti/4klang.asm @@ -1,975 +1,979 @@ -; //---------------------------------------------------------------------------------------- -; // useful macros -; //---------------------------------------------------------------------------------------- -; // export function (make it accessable from main.cpp) -; //---------------------------------------------------------------------------------------- -%macro export_func 1 - global _%1 - _%1: -%endmacro -;%define USE_SECTIONS -; //---------------------------------------------------------------------------------------- -; // basic defines for the song/synth -; //---------------------------------------------------------------------------------------- -;%define AUTHORING ; Use to export the current tick being rendered -;%define SINGLE_TICK_RENDERING ; Use to render single tick on _4klang_render invocation ( requires AUTHORING enabled ) -%define SAMPLE_RATE 44100 -%define MAX_INSTRUMENTS 9 -%define MAX_VOICES 1 -%define HLD 1 ; // can be adjusted to give crinkler some other possibilities -%define BPM 100 -%define MAX_PATTERNS 62 -%define PATTERN_SIZE_SHIFT 4 -%define PATTERN_SIZE (1 << PATTERN_SIZE_SHIFT) -%define MAX_TICKS (MAX_PATTERNS*PATTERN_SIZE) -%define SAMPLES_PER_TICK (SAMPLE_RATE*4*60/(BPM*16)) -%define DEF_LFO_NORMALIZE 0.000038 -%define MAX_SAMPLES (SAMPLES_PER_TICK*MAX_TICKS) -; //---------------------------------------------------------------------------------------- -; // some defines for unit usage, which reduce synth code size -; //---------------------------------------------------------------------------------------- -;%define GO4K_USE_16BIT_OUTPUT ; // removing this will output to 32bit floating point buffer -;%define GO4K_USE_GROOVE_PATTERN ; // removing this skips groove pattern code -;%define GO4K_USE_ENVELOPE_RECORDINGS ; // removing this skips envelope recording code -;%define GO4K_USE_NOTE_RECORDINGS ; // removing this skips note recording code -%define GO4K_USE_UNDENORMALIZE ; // removing this skips denormalization code in the units -%define GO4K_CLIP_OUTPUT ; // removing this skips clipping code for the final output -%define GO4K_USE_DST ; // removing this will skip DST unit -%define GO4K_USE_DLL ; // removing this will skip DLL unit -%define GO4K_USE_PAN ; // removing this will skip PAN unit -%define GO4K_USE_GLOBAL_DLL ; // removing this will skip global dll processing -%define GO4K_USE_FSTG ; // removing this will skip global store unit -%define GO4K_USE_FLD ; // removing this will skip float load unit -%define GO4K_USE_GLITCH ; // removing this will skip GLITCH unit -%define GO4K_USE_ENV_CHECK ; // removing this skips checks if processing is needed -%define GO4K_USE_ENV_MOD_GM ; // removing this will skip env gain modulation code -%define GO4K_USE_ENV_MOD_ADR ; // removing this will skip env attack/decay/release modulation code -%define GO4K_USE_VCO_CHECK ; // removing this skips checks if processing is needed -%define GO4K_USE_VCO_PHASE_OFFSET ; // removing this will skip initial phase offset code -%define GO4K_USE_VCO_SHAPE ; // removing this skips waveshaping code -%define GO4K_USE_VCO_GATE ; // removing this skips gate code -%define GO4K_USE_VCO_MOD_FM ; // removing this skips frequency modulation code -%define GO4K_USE_VCO_MOD_PM ; // removing this skips phase modulation code -%define GO4K_USE_VCO_MOD_TM ; // removing this skips transpose modulation code -%define GO4K_USE_VCO_MOD_DM ; // removing this skips detune modulation code -%define GO4K_USE_VCO_MOD_CM ; // removing this skips color modulation code -%define GO4K_USE_VCO_MOD_GM ; // removing this skips gain modulation code -%define GO4K_USE_VCO_MOD_SM ; // removing this skips shaping modulation code -%define GO4K_USE_VCO_STEREO ; // removing this skips stereo code -%define GO4K_USE_VCF_CHECK ; // removing this skips checks if processing is needed -%define GO4K_USE_VCF_MOD_FM ; // removing this skips frequency modulation code -%define GO4K_USE_VCF_MOD_RM ; // removing this skips resonance modulation code -%define GO4K_USE_VCF_HIGH ; // removing this skips code for high output -%define GO4K_USE_VCF_BAND ; // removing this skips code for band output -%define GO4K_USE_VCF_PEAK ; // removing this skips code for peak output -%define GO4K_USE_VCF_STEREO ; // removing this skips code for stereo filter output -%define GO4K_USE_DST_CHECK ; // removing this skips checks if processing is needed -%define GO4K_USE_DST_SH ; // removing this skips sample and hold code -%define GO4K_USE_DST_MOD_DM ; // removing this skips distortion modulation code -%define GO4K_USE_DST_MOD_SH ; // removing this skips sample and hold modulation code -%define GO4K_USE_DST_STEREO ; // removing this skips stereo processing -%define GO4K_USE_DLL_NOTE_SYNC ; // removing this will skip delay length adjusting code (karplus strong) -%define GO4K_USE_DLL_CHORUS ; // removing this will skip delay chorus/flanger code -%define GO4K_USE_DLL_CHORUS_CLAMP ; // removing this will skip chorus lfo phase clamping -%define GO4K_USE_DLL_DAMP ; // removing this will skip dll damping code -%define GO4K_USE_DLL_DC_FILTER ; // removing this will skip dll dc offset removal code -%define GO4K_USE_FSTG_CHECK ; // removing this skips checks if processing is needed -%define GO4K_USE_PAN_MOD ; // removing this will skip panning modulation code -%define GO4K_USE_OUT_MOD_AM ; // removing this skips output aux send modulation code -%define GO4K_USE_OUT_MOD_GM ; // removing this skips output gain modulation code -%define GO4K_USE_WAVESHAPER_CLIP ; // removing this will skip clipping code -%define GO4K_USE_FLD_MOD_VM ; // removing this will skip float load modulation code -%define GO4K_USE_DLL_MOD ; // define this to enable modulations for delay line -%define GO4K_USE_DLL_MOD_PM ; // define this to enable pregain modulation for delay line -%define GO4K_USE_DLL_MOD_FM ; // define this to enable feebback modulation for delay line -%define GO4K_USE_DLL_MOD_IM ; // define this to enable dry modulation for delay line -%define GO4K_USE_DLL_MOD_DM ; // define this to enable damping modulation for delay line -%define GO4K_USE_DLL_MOD_SM ; // define this to enable lfo freq modulation for delay line -%define GO4K_USE_DLL_MOD_AM ; // define this to enable lfo depth modulation for delay line - -; //---------------------------------------------------------------------------------------- -; // synth defines -; //---------------------------------------------------------------------------------------- -%define MAX_DELAY 65536 -%define MAX_UNITS 64 -%define MAX_UNIT_SLOTS 16 -%define GO4K_BEGIN_CMDDEF(def_name) -%define GO4K_END_CMDDEF db 0 -%define GO4K_BEGIN_PARAMDEF(def_name) -%define GO4K_END_PARAMDEF -; //---------------------------------------------------------------------------------------- -; // ENV structs -; //---------------------------------------------------------------------------------------- -GO4K_ENV_ID equ 1 -%macro GO4K_ENV 5 - db %1 - db %2 - db %3 - db %4 - db %5 -%endmacro -%define ATTAC(val) val -%define DECAY(val) val -%define SUSTAIN(val) val -%define RELEASE(val) val -%define GAIN(val) val -struc go4kENV_val -;// unit paramters - .attac resd 1 - .decay resd 1 - .sustain resd 1 - .release resd 1 - .gain resd 1 - .size -endstruc -struc go4kENV_wrk -;// work variables - .state resd 1 - .level resd 1 -;// modulation targets - .gm resd 1 - .am resd 1 - .dm resd 1 - .sm resd 1 - .rm resd 1 - .size -endstruc -%define ENV_STATE_ATTAC 0 -%define ENV_STATE_DECAY 1 -%define ENV_STATE_SUSTAIN 2 -%define ENV_STATE_RELEASE 3 -%define ENV_STATE_OFF 4 -; //---------------------------------------------------------------------------------------- -; // VCO structs -; //---------------------------------------------------------------------------------------- -GO4K_VCO_ID equ 2 - -%macro GO4K_VCO 8 - db %1 - db %2 -%ifdef GO4K_USE_VCO_PHASE_OFFSET - db %3 -%endif -%ifdef GO4K_USE_VCO_GATE - db %4 -%endif - db %5 -%ifdef GO4K_USE_VCO_SHAPE - db %6 -%else -%endif - db %7 - db %8 -%endmacro -%define TRANSPOSE(val) val -%define DETUNE(val) val -%define PHASE(val) val -%define GATES(val) val -%define COLOR(val) val -%define SHAPE(val) val -%define FLAGS(val) val -%define SINE 0x01 -%define TRISAW 0x02 -%define PULSE 0x04 -%define NOISE 0x08 -%define LFO 0x10 -%define GATE 0x20 -%define VCO_STEREO 0x40 -struc go4kVCO_val -;// unit paramters - .transpose resd 1 - .detune resd 1 -%ifdef GO4K_USE_VCO_PHASE_OFFSET - .phaseofs resd 1 -%endif -%ifdef GO4K_USE_VCO_GATE - .gate resd 1 -%endif - .color resd 1 -%ifdef GO4K_USE_VCO_SHAPE - .shape resd 1 -%endif - .gain resd 1 - .flags resd 1 - .size -endstruc -struc go4kVCO_wrk -;// work variables - .phase resd 1 -;// modulation targets - .tm resd 1 - .dm resd 1 - .fm resd 1 - .pm resd 1 - .cm resd 1 - .sm resd 1 - .gm resd 1 -;// stero variables - .phase2 resd 1 - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // VCF structs -; //---------------------------------------------------------------------------------------- -GO4K_VCF_ID equ 3 -%macro GO4K_VCF 3 - db %1 - db %2 - db %3 -%endmacro -%define LOWPASS 0x1 -%define HIGHPASS 0x2 -%define BANDPASS 0x4 -%define BANDSTOP 0x3 -%define ALLPASS 0x7 -%define PEAK 0x8 -%define STEREO 0x10 -%define FREQUENCY(val) val -%define RESONANCE(val) val -%define VCFTYPE(val) val -struc go4kVCF_val -;// unit paramters - .freq resd 1 - .res resd 1 - .type resd 1 - .size -endstruc -struc go4kVCF_wrk -;// work variables - .low resd 1 - .high resd 1 - .band resd 1 - .freq resd 1 ;// unused but kept so modulation target offsets stay same -;// modulation targets - .fm resd 1 - .rm resd 1 -;// stereo variables - .low2 resd 1 - .high2 resd 1 - .band2 resd 1 - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // DST structs -; //---------------------------------------------------------------------------------------- -GO4K_DST_ID equ 4 -%macro GO4K_DST 3 - db %1 -%ifdef GO4K_USE_DST_SH - db %2 - %ifdef GO4K_USE_DST_STEREO - db %3 - %endif -%else - %ifdef GO4K_USE_DST_STEREO - db %3 - %endif -%endif -%endmacro -%define DRIVE(val) val -%define SNHFREQ(val) val -%define FLAGS(val) val -struc go4kDST_val -;// unit paramters - .drive resd 1 -%ifdef GO4K_USE_DST_SH - .snhfreq resd 1 -%endif - .flags resd 1 - .size -endstruc -struc go4kDST_wrk -;// work variables - .out resd 1 - .snhphase resd 1 -;// modulation targets - .dm resd 1 - .sm resd 1 -;// stereo variables - .out2 resd 1 - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // DLL structs -; //---------------------------------------------------------------------------------------- -GO4K_DLL_ID equ 5 -%macro GO4K_DLL 8 - db %1 - db %2 - db %3 -%ifdef GO4K_USE_DLL_DAMP - db %4 -%endif -%ifdef GO4K_USE_DLL_CHORUS - db %5 - db %6 -%endif - db %7 - db %8 -%endmacro -%define PREGAIN(val) val -%define DRY(val) val -%define FEEDBACK(val) val -%define DEPTH(val) val -%define DAMP(val) val -%define DELAY(val) val -%define COUNT(val) val -struc go4kDLL_val -;// unit paramters - .pregain resd 1 - .dry resd 1 - .feedback resd 1 -%ifdef GO4K_USE_DLL_DAMP - .damp resd 1 -%endif -%ifdef GO4K_USE_DLL_CHORUS - .freq resd 1 - .depth -%endif - .delay resd 1 - .count resd 1 - .size -endstruc -struc go4kDLL_wrk -;// work variables - .index resd 1 - .store resd 1 - .dcin resd 1 - .dcout resd 1 - .phase resd 1 -;// the delay buffer - .buffer resd MAX_DELAY - .size -endstruc -struc go4kDLL_wrk2 -;// modulation targets - .pm resd 1 - .fm resd 1 - .im resd 1 - .dm resd 1 - .sm resd 1 - .am resd 1 - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // FOP structs -; //---------------------------------------------------------------------------------------- -GO4K_FOP_ID equ 6 -%macro GO4K_FOP 1 - db %1 -%endmacro -%define OP(val) val -%define FOP_POP 0x1 -%define FOP_ADDP 0x2 -%define FOP_MULP 0x3 -%define FOP_PUSH 0x4 -%define FOP_XCH 0x5 -%define FOP_ADD 0x6 -%define FOP_MUL 0x7 -%define FOP_ADDP2 0x8 -%define FOP_LOADNOTE 0x9 -%define FOP_MULP2 0xa -struc go4kFOP_val - .flags resd 1 - .size -endstruc -struc go4kFOP_wrk - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // FST structs -; //---------------------------------------------------------------------------------------- -GO4K_FST_ID equ 7 -%macro GO4K_FST 2 - db %1 - dw %2 -%endmacro -%define AMOUNT(val) val -%define DEST(val) val -%define FST_SET 0x0000 -%define FST_ADD 0x4000 -%define FST_POP 0x8000 -struc go4kFST_val - .amount resd 1 - .op1 resd 1 - .size -endstruc -struc go4kFST_wrk - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // PAN structs -; //---------------------------------------------------------------------------------------- -GO4K_PAN_ID equ 8 -%macro GO4K_PAN 1 -%ifdef GO4K_USE_PAN - db %1 -%endif -%endmacro -%define PANNING(val) val -struc go4kPAN_val -%ifdef GO4K_USE_PAN - .panning resd 1 -%endif - .size -endstruc -struc go4kPAN_wrk -;// modulation targets - .pm resd 1 - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // OUT structs -; //---------------------------------------------------------------------------------------- -GO4K_OUT_ID equ 9 -%macro GO4K_OUT 2 - db %1 -%ifdef GO4K_USE_GLOBAL_DLL - db %2 -%endif -%endmacro -%define AUXSEND(val) val -struc go4kOUT_val - .gain resd 1 -%ifdef GO4K_USE_GLOBAL_DLL - .auxsend resd 1 -%endif - .size -endstruc -struc go4kOUT_wrk -;// modulation targets - .am resd 1 - .gm resd 1 - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // ACC structs (this is for the synth def only) -; //---------------------------------------------------------------------------------------- -GO4K_ACC_ID equ 10 -%macro GO4K_ACC 1 - db %1 -%endmacro -%define OUTPUT 0 -%define AUX 8 -%define ACCTYPE(val) val -struc go4kACC_val - .acctype resd 1 - .size -endstruc -struc go4kACC_wrk - .size -endstruc -%ifdef GO4K_USE_FLD -; //---------------------------------------------------------------------------------------- -; // FLD structs -; //---------------------------------------------------------------------------------------- -GO4K_FLD_ID equ 11 -%macro GO4K_FLD 1 - db %1 -%endmacro -%define VALUE(val) val -struc go4kFLD_val - .value resd 1 - .size -endstruc -struc go4kFLD_wrk -;// modulation targets - .vm resd 1 - .size -endstruc -%endif -%ifdef GO4K_USE_GLITCH -; //---------------------------------------------------------------------------------------- -; // GLITCH structs -; //---------------------------------------------------------------------------------------- -GO4K_GLITCH_ID equ 12 -%macro GO4K_GLITCH 5 - db %1 - db %2 - db %3 - db %4 - db %5 -%endmacro -%define ACTIVE(val) val -%define SLICEFACTOR(val)val -%define PITCHFACTOR(val)val -%define SLICESIZE(val) val -struc go4kGLITCH_val -;// unit paramters - .active resd 1 - .dry resd 1 - .dsize resd 1 - .dpitch resd 1 - .slicesize resd 1 - .size -endstruc -struc go4kGLITCH_wrk -;// work variables - .index resd 1 - .store resd 1 - .slizesize resd 1 - .slicepitch resd 1 - .unused resd 1 -;// the delay buffer - .buffer resd MAX_DELAY - .size -endstruc -struc go4kGLITCH_wrk2 -;// modulation targets - .am resd 1 - .dm resd 1 - .sm resd 1 - .pm resd 1 - .size -endstruc -%endif -%ifdef GO4K_USE_FSTG -; //---------------------------------------------------------------------------------------- -; // FSTG structs -; //---------------------------------------------------------------------------------------- -GO4K_FSTG_ID equ 13 -%macro GO4K_FSTG 2 - db %1 - dw %2 -%endmacro -struc go4kFSTG_val - .amount resd 1 - .op1 resd 1 - .size -endstruc -struc go4kFSTG_wrk - .size -endstruc -%endif -; //---------------------------------------------------------------------------------------- -; // Voice struct -; //---------------------------------------------------------------------------------------- -struc go4k_instrument - .release resd 1 - .note resd 1 - .workspace resd MAX_UNITS*MAX_UNIT_SLOTS - .dlloutl resd 1 - .dlloutr resd 1 - .outl resd 1 - .outr resd 1 - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // Synth struct -; //---------------------------------------------------------------------------------------- -struc go4k_synth - .instruments resb go4k_instrument.size * MAX_INSTRUMENTS * MAX_VOICES - .global resb go4k_instrument.size * MAX_VOICES - .size -endstruc -; //---------------------------------------------------------------------------------------- -; // Pattern Data, reduced by 967 patterns -; //---------------------------------------------------------------------------------------- -%ifdef USE_SECTIONS -section .g4kmuc1 data align=1 -%else -section .data align=1 -%endif -go4k_patterns - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - db 76, HLD, HLD, HLD, 0, 0, 0, 0, 79, HLD, HLD, HLD, 0, 0, 0, 0, - db 69, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, 0, 0, 0, 0, - db 76, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db 81, HLD, HLD, HLD, 0, 0, 0, 0, 79, HLD, HLD, HLD, 0, 0, 0, 0, - db 84, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, 0, 0, 0, 0, - db 76, HLD, HLD, HLD, 0, 0, 0, 0, 88, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, - db 76, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, 0, 0, 0, 0, - db 52, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db 60, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db 64, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db 69, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db 72, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db 40, 52, HLD, 64, HLD, 40, 52, 64, 52, HLD, HLD, HLD, 0, 0, 0, 0, - db 57, 0, 0, 57, 0, 0, 69, 0, 0, 69, 0, 0, 57, HLD, HLD, HLD, - db 52, 64, 0, 57, 0, 69, 48, 0, 48, HLD, HLD, HLD, 0, 0, 0, 0, - db 40, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, - db 40, 52, HLD, 40, HLD, 40, 40, 40, 52, HLD, HLD, HLD, 0, 0, 0, 0, - db 40, 0, 0, 52, 0, 0, 40, 0, 52, 40, 0, 52, 0, 40, 0, 0, - db 45, 0, 0, 57, 0, 0, 45, 0, 57, 45, 0, 57, 0, 45, 0, 0, - db 48, 0, 0, 60, 0, 0, 48, 0, 60, 48, 0, 60, 0, 48, 0, 0, - db 40, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, - db 45, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, - db 36, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, - db 0, 0, 0, 0, 60, HLD, 0, 0, 0, 0, 0, 0, 60, HLD, 0, 0, - db 60, HLD, 0, 0, 0, 0, 60, HLD, 0, 0, 60, HLD, 60, HLD, 0, 0, - db 0, 0, 0, 0, 60, HLD, 0, 0, 0, 0, 0, 0, 60, HLD, 60, HLD, - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, HLD, 0, 0, - db 60, HLD, 60, HLD, 0, 0, 60, HLD, 0, 0, 0, 0, 60, HLD, 0, 0, - db 0, 0, 60, HLD, 0, 0, 0, 0, 60, HLD, 0, 0, 0, 0, 0, 0, - db 0, 0, 60, HLD, 0, 0, 0, 0, 60, HLD, 0, 0, 60, HLD, 0, 0, - db 0, 0, 0, 60, HLD, 0, 0, 0, 0, 0, 0, 0, 60, HLD, 0, 0, - db 0, 0, 0, 60, HLD, 0, 0, 0, 0, 60, HLD, 60, 60, HLD, 0, 0, - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, - db 91, 0, 0, 88, 0, 0, 76, 0, 81, 0, 0, 0, 0, 0, 0, 0, - db 81, 0, 0, 84, 0, 0, 86, 0, 88, 0, 0, 0, 0, 0, 0, 0, - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, - db 81, 0, 0, 84, 0, 0, 86, 0, 81, 0, 0, 0, 0, 0, 0, 0, - db 84, 0, 0, 86, 0, 0, 88, 0, 0, 91, 0, 0, 84, 0, 0, 0, - db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, -go4k_patterns_end -; //---------------------------------------------------------------------------------------- -; // Pattern Index List -; //---------------------------------------------------------------------------------------- -%ifdef USE_SECTIONS -section .g4kmuc2 data align=1 -%else -section .data -%endif -go4k_pattern_lists -Instrument0List db 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 1, 2, 3, 0, 4, 5, 6, 7, 8, 2, 9, 0, 0, 0, -Instrument1List db 9, 7, 10, 7, 11, 7, 12, 7, 9, 7, 10, 7, 11, 7, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 13, 7, 14, 7, 3, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, -Instrument2List db 15, 0, 16, 0, 17, 0, 18, 0, 19, 0, 16, 0, 17, 0, 18, 0, 20, 20, 21, 21, 22, 22, 20, 20, 20, 20, 21, 21, 22, 22, 20, 20, 23, 15, 24, 16, 25, 17, 18, 0, 20, 20, 21, 21, 22, 22, 20, 20, 20, 20, 21, 21, 22, 22, 20, 20, 20, 20, 0, 0, 0, 0, -Instrument3List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, -Instrument4List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 26, 27, 26, 27, 26, 27, 28, 27, 26, 27, 26, 27, 26, 27, 28, 27, 29, 27, 29, 27, 29, 27, 29, 27, 26, 27, 26, 27, 26, 27, 28, 27, 26, 27, 26, 27, 26, 27, 28, 27, 26, 27, 0, 0, 0, -Instrument5List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 0, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 0, 0, -Instrument6List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 0, 0, 0, 0, -Instrument7List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 36, 0, 37, 38, 36, 0, 39, 35, 36, 0, 37, 38, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, -Instrument8List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 41, 0, -go4k_pattern_lists_end -; //---------------------------------------------------------------------------------------- -; // Instrument Commands -; //---------------------------------------------------------------------------------------- -%ifdef USE_SECTIONS -section .g4kmuc3 data align=1 -%else -section .data -%endif -go4k_synth_instructions -GO4K_BEGIN_CMDDEF(Instrument0) - db GO4K_ENV_ID - db GO4K_FST_ID - db GO4K_VCO_ID - db GO4K_VCO_ID - db GO4K_VCO_ID - db GO4K_FST_ID - db GO4K_FST_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_VCF_ID - db GO4K_VCF_ID - db GO4K_DST_ID - db GO4K_PAN_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument1) - db GO4K_ENV_ID - db GO4K_FST_ID - db GO4K_VCO_ID - db GO4K_VCO_ID - db GO4K_VCO_ID - db GO4K_FST_ID - db GO4K_FST_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_VCF_ID - db GO4K_VCF_ID - db GO4K_DST_ID - db GO4K_PAN_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument2) - db GO4K_ENV_ID - db GO4K_FST_ID - db GO4K_VCO_ID - db GO4K_VCO_ID - db GO4K_VCO_ID - db GO4K_FST_ID - db GO4K_FST_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_VCF_ID - db GO4K_VCF_ID - db GO4K_DST_ID - db GO4K_PAN_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument3) - db GO4K_ENV_ID - db GO4K_FST_ID - db GO4K_VCO_ID - db GO4K_FOP_ID - db GO4K_VCF_ID - db GO4K_PAN_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument4) - db GO4K_ENV_ID - db GO4K_FST_ID - db GO4K_ENV_ID - db GO4K_DST_ID - db GO4K_FST_ID - db GO4K_FOP_ID - db GO4K_VCO_ID - db GO4K_FOP_ID - db GO4K_PAN_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument5) - db GO4K_ENV_ID - db GO4K_VCO_ID - db GO4K_FOP_ID - db GO4K_VCF_ID - db GO4K_PAN_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument6) - db GO4K_ENV_ID - db GO4K_FST_ID - db GO4K_ENV_ID - db GO4K_FST_ID - db GO4K_FST_ID - db GO4K_FOP_ID - db GO4K_VCO_ID - db GO4K_VCO_ID - db GO4K_VCO_ID - db GO4K_VCF_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_FOP_ID - db GO4K_VCF_ID - db GO4K_PAN_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument7) - db GO4K_ENV_ID - db GO4K_VCO_ID - db GO4K_FOP_ID - db GO4K_PAN_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -GO4K_BEGIN_CMDDEF(Instrument8) - db GO4K_ENV_ID - db GO4K_VCO_ID - db GO4K_FOP_ID - db GO4K_FSTG_ID - db GO4K_FSTG_ID - db GO4K_FOP_ID -GO4K_END_CMDDEF -;// global commands -GO4K_BEGIN_CMDDEF(Global) - db GO4K_ACC_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_DLL_ID - db GO4K_FOP_ID - db GO4K_ACC_ID - db GO4K_FOP_ID - db GO4K_OUT_ID -GO4K_END_CMDDEF -go4k_synth_instructions_end -; //---------------------------------------------------------------------------------------- -; // Intrument Data -; //---------------------------------------------------------------------------------------- -%ifdef USE_SECTIONS -section .g4kmuc4 data align=1 -%else -section .data -%endif -go4k_synth_parameter_values -GO4K_BEGIN_PARAMDEF(Instrument0) - GO4K_ENV ATTAC(72),DECAY(96),SUSTAIN(96),RELEASE(88),GAIN(128) - GO4K_FST AMOUNT(64),DEST(0*MAX_UNIT_SLOTS+2) - GO4K_VCO TRANSPOSE(64),DETUNE(60),PHASE(32),GATES(0),COLOR(80),SHAPE(64),GAIN(128),FLAGS(PULSE) - GO4K_VCO TRANSPOSE(64),DETUNE(72),PHASE(32),GATES(0),COLOR(96),SHAPE(64),GAIN(128),FLAGS(TRISAW) - GO4K_VCO TRANSPOSE(32),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(96),GAIN(128),FLAGS(SINE|LFO) - GO4K_FST AMOUNT(68),DEST(2*MAX_UNIT_SLOTS+2) - GO4K_FST AMOUNT(61),DEST(3*MAX_UNIT_SLOTS+2) - GO4K_FOP OP(FOP_POP) - GO4K_FOP OP(FOP_ADDP) - GO4K_FOP OP(FOP_MULP) - GO4K_VCF FREQUENCY(26),RESONANCE(128),VCFTYPE(PEAK) - GO4K_VCF FREQUENCY(64),RESONANCE(64),VCFTYPE(LOWPASS) - GO4K_DST DRIVE(104), SNHFREQ(128), FLAGS(0) - GO4K_PAN PANNING(64) - GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(96),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(16),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_OUT GAIN(0), AUXSEND(32) -GO4K_END_PARAMDEF -GO4K_BEGIN_PARAMDEF(Instrument1) - GO4K_ENV ATTAC(72),DECAY(96),SUSTAIN(96),RELEASE(88),GAIN(128) - GO4K_FST AMOUNT(64),DEST(0*MAX_UNIT_SLOTS+2) - GO4K_VCO TRANSPOSE(64),DETUNE(60),PHASE(32),GATES(0),COLOR(80),SHAPE(64),GAIN(128),FLAGS(TRISAW) - GO4K_VCO TRANSPOSE(64),DETUNE(72),PHASE(32),GATES(0),COLOR(96),SHAPE(112),GAIN(64),FLAGS(SINE) - GO4K_VCO TRANSPOSE(80),DETUNE(112),PHASE(0),GATES(0),COLOR(64),SHAPE(16),GAIN(128),FLAGS(PULSE|LFO) - GO4K_FST AMOUNT(68),DEST(2*MAX_UNIT_SLOTS+2) - GO4K_FST AMOUNT(60),DEST(3*MAX_UNIT_SLOTS+2) - GO4K_FOP OP(FOP_POP) - GO4K_FOP OP(FOP_ADDP) - GO4K_FOP OP(FOP_MULP) - GO4K_VCF FREQUENCY(80),RESONANCE(24),VCFTYPE(LOWPASS) - GO4K_VCF FREQUENCY(48),RESONANCE(24),VCFTYPE(HIGHPASS) - GO4K_DST DRIVE(64), SNHFREQ(128), FLAGS(0) - GO4K_PAN PANNING(64) - GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(96),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(16),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_OUT GAIN(0), AUXSEND(32) -GO4K_END_PARAMDEF -GO4K_BEGIN_PARAMDEF(Instrument2) - GO4K_ENV ATTAC(32),DECAY(64),SUSTAIN(64),RELEASE(64),GAIN(64) - GO4K_FST AMOUNT(120),DEST(0*MAX_UNIT_SLOTS+2) - GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(32),GATES(0),COLOR(80),SHAPE(64),GAIN(128),FLAGS(PULSE) - GO4K_VCO TRANSPOSE(64),DETUNE(72),PHASE(32),GATES(0),COLOR(96),SHAPE(64),GAIN(128),FLAGS(TRISAW) - GO4K_VCO TRANSPOSE(32),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(96),GAIN(128),FLAGS(SINE|LFO) - GO4K_FST AMOUNT(68),DEST(2*MAX_UNIT_SLOTS+2) - GO4K_FST AMOUNT(60),DEST(3*MAX_UNIT_SLOTS+2) - GO4K_FOP OP(FOP_POP) - GO4K_FOP OP(FOP_ADDP) - GO4K_FOP OP(FOP_MULP) - GO4K_VCF FREQUENCY(18),RESONANCE(64),VCFTYPE(PEAK) - GO4K_VCF FREQUENCY(32),RESONANCE(48),VCFTYPE(LOWPASS) - GO4K_DST DRIVE(88), SNHFREQ(128), FLAGS(0) - GO4K_PAN PANNING(64) - GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(96),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(16),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_OUT GAIN(64), AUXSEND(64) -GO4K_END_PARAMDEF -GO4K_BEGIN_PARAMDEF(Instrument3) - GO4K_ENV ATTAC(0),DECAY(76),SUSTAIN(0),RELEASE(0),GAIN(32) - GO4K_FST AMOUNT(128),DEST(0*MAX_UNIT_SLOTS+2) - GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(64),GATES(0),COLOR(64),SHAPE(64),GAIN(128),FLAGS(NOISE) - GO4K_FOP OP(FOP_MULP) - GO4K_VCF FREQUENCY(80),RESONANCE(128),VCFTYPE(LOWPASS) - GO4K_PAN PANNING(64) - GO4K_OUT GAIN(64), AUXSEND(0) -GO4K_END_PARAMDEF -GO4K_BEGIN_PARAMDEF(Instrument4) - GO4K_ENV ATTAC(0),DECAY(64),SUSTAIN(96),RELEASE(64),GAIN(128) - GO4K_FST AMOUNT(128),DEST(0*MAX_UNIT_SLOTS+2) - GO4K_ENV ATTAC(0),DECAY(70),SUSTAIN(0),RELEASE(0),GAIN(128) - GO4K_DST DRIVE(32), SNHFREQ(128), FLAGS(0) - GO4K_FST AMOUNT(80),DEST(6*MAX_UNIT_SLOTS+1) - GO4K_FOP OP(FOP_POP) - GO4K_VCO TRANSPOSE(46),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(64),GAIN(128),FLAGS(TRISAW) - GO4K_FOP OP(FOP_MULP) - GO4K_PAN PANNING(64) - GO4K_OUT GAIN(128), AUXSEND(0) -GO4K_END_PARAMDEF -GO4K_BEGIN_PARAMDEF(Instrument5) - GO4K_ENV ATTAC(0),DECAY(64),SUSTAIN(0),RELEASE(0),GAIN(128) - GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(64),GATES(0),COLOR(64),SHAPE(64),GAIN(128),FLAGS(NOISE) - GO4K_FOP OP(FOP_MULP) - GO4K_VCF FREQUENCY(128),RESONANCE(128),VCFTYPE(BANDPASS) - GO4K_PAN PANNING(64) - GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(96),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(16),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_OUT GAIN(64), AUXSEND(0) -GO4K_END_PARAMDEF -GO4K_BEGIN_PARAMDEF(Instrument6) - GO4K_ENV ATTAC(0),DECAY(72),SUSTAIN(0),RELEASE(72),GAIN(128) - GO4K_FST AMOUNT(128),DEST(0*MAX_UNIT_SLOTS+2) - GO4K_ENV ATTAC(0),DECAY(56),SUSTAIN(0),RELEASE(0),GAIN(128) - GO4K_FST AMOUNT(108),DEST(6*MAX_UNIT_SLOTS+1) - GO4K_FST AMOUNT(72),DEST(7*MAX_UNIT_SLOTS+1) - GO4K_FOP OP(FOP_POP) - GO4K_VCO TRANSPOSE(32),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(32),GAIN(64),FLAGS(SINE) - GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(80),GAIN(64),FLAGS(SINE) - GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(64),GAIN(64),FLAGS(NOISE) - GO4K_VCF FREQUENCY(104),RESONANCE(128),VCFTYPE(LOWPASS) - GO4K_FOP OP(FOP_ADDP) - GO4K_FOP OP(FOP_ADDP) - GO4K_FOP OP(FOP_MULP) - GO4K_VCF FREQUENCY(22),RESONANCE(32),VCFTYPE(HIGHPASS) - GO4K_PAN PANNING(64) - GO4K_OUT GAIN(64), AUXSEND(0) -GO4K_END_PARAMDEF -GO4K_BEGIN_PARAMDEF(Instrument7) - GO4K_ENV ATTAC(0),DECAY(0),SUSTAIN(96),RELEASE(32),GAIN(128) - GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(0),COLOR(80),SHAPE(64),GAIN(128),FLAGS(PULSE) - GO4K_FOP OP(FOP_MULP) - GO4K_PAN PANNING(64) - GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(96),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(16),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1) - GO4K_FOP OP(FOP_XCH) - GO4K_OUT GAIN(0), AUXSEND(64) -GO4K_END_PARAMDEF -GO4K_BEGIN_PARAMDEF(Instrument8) - GO4K_ENV ATTAC(0),DECAY(0),SUSTAIN(128),RELEASE(0),GAIN(128) - GO4K_VCO TRANSPOSE(48),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(64),GAIN(128),FLAGS(TRISAW|LFO) - GO4K_FOP OP(FOP_MULP) - GO4K_FSTG AMOUNT(72),DEST(2*go4k_instrument.size*MAX_VOICES+10*MAX_UNIT_SLOTS*4+4*4+go4k_instrument.workspace) - GO4K_FSTG AMOUNT(66),DEST(1*go4k_instrument.size*MAX_VOICES+10*MAX_UNIT_SLOTS*4+4*4+go4k_instrument.workspace) - GO4K_FOP OP(FOP_POP) -GO4K_END_PARAMDEF -;// global parameters -GO4K_BEGIN_PARAMDEF(Global) - GO4K_ACC ACCTYPE(AUX) - GO4K_DLL PREGAIN(40),DRY(128),FEEDBACK(125),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(0),COUNT(8) - GO4K_FOP OP(FOP_XCH) - GO4K_DLL PREGAIN(40),DRY(128),FEEDBACK(125),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(8),COUNT(8) - GO4K_FOP OP(FOP_XCH) - GO4K_ACC ACCTYPE(OUTPUT) - GO4K_FOP OP(FOP_ADDP2) - GO4K_OUT GAIN(64), AUXSEND(0) -GO4K_END_PARAMDEF -go4k_synth_parameter_values_end -; //---------------------------------------------------------------------------------------- -; // Delay/Reverb Times -; //---------------------------------------------------------------------------------------- -%ifdef USE_SECTIONS -section .g4kmuc5 data align=1 -%else -section .data -%endif -%ifdef GO4K_USE_DLL -global _go4k_delay_times -_go4k_delay_times - dw 0 - dw 1116 - dw 1188 - dw 1276 - dw 1356 - dw 1422 - dw 1492 - dw 1556 - dw 1618 - dw 1140 - dw 1212 - dw 1300 - dw 1380 - dw 1446 - dw 1516 - dw 1580 - dw 1642 - dw 22050 ; Originally times 100 dw 0, but crashes for me (Peter) - so reverted to this found in an older version - dw 16537 - dw 11025 -%endif +bits 32 + +; //---------------------------------------------------------------------------------------- +; // useful macros +; //---------------------------------------------------------------------------------------- +; // export function (make it accessable from main.cpp) +; //---------------------------------------------------------------------------------------- +%macro export_func 1 + global _%1 + _%1: +%endmacro +;%define USE_SECTIONS +; //---------------------------------------------------------------------------------------- +; // basic defines for the song/synth +; //---------------------------------------------------------------------------------------- +;%define AUTHORING ; Use to export the current tick being rendered +;%define SINGLE_TICK_RENDERING ; Use to render single tick on _4klang_render invocation ( requires AUTHORING enabled ) +%define SAMPLE_RATE 44100 +%define MAX_INSTRUMENTS 9 +%define MAX_VOICES 1 +%define HLD 1 ; // can be adjusted to give crinkler some other possibilities +%define BPM 100 +%define MAX_PATTERNS 62 +%define PATTERN_SIZE_SHIFT 4 +%define PATTERN_SIZE (1 << PATTERN_SIZE_SHIFT) +%define MAX_TICKS (MAX_PATTERNS*PATTERN_SIZE) +%define SAMPLES_PER_TICK (SAMPLE_RATE*4*60/(BPM*16)) +%define DEF_LFO_NORMALIZE 0.000038 +%define MAX_SAMPLES (SAMPLES_PER_TICK*MAX_TICKS) +; //---------------------------------------------------------------------------------------- +; // some defines for unit usage, which reduce synth code size +; //---------------------------------------------------------------------------------------- +;%define GO4K_USE_16BIT_OUTPUT ; // removing this will output to 32bit floating point buffer +;%define GO4K_USE_GROOVE_PATTERN ; // removing this skips groove pattern code +;%define GO4K_USE_ENVELOPE_RECORDINGS ; // removing this skips envelope recording code +;%define GO4K_USE_NOTE_RECORDINGS ; // removing this skips note recording code +%define GO4K_USE_UNDENORMALIZE ; // removing this skips denormalization code in the units +%define GO4K_CLIP_OUTPUT ; // removing this skips clipping code for the final output +%define GO4K_USE_DST ; // removing this will skip DST unit +%define GO4K_USE_DLL ; // removing this will skip DLL unit +%define GO4K_USE_PAN ; // removing this will skip PAN unit +%define GO4K_USE_GLOBAL_DLL ; // removing this will skip global dll processing +%define GO4K_USE_FSTG ; // removing this will skip global store unit +%define GO4K_USE_FLD ; // removing this will skip float load unit +%define GO4K_USE_GLITCH ; // removing this will skip GLITCH unit +%define GO4K_USE_ENV_CHECK ; // removing this skips checks if processing is needed +%define GO4K_USE_ENV_MOD_GM ; // removing this will skip env gain modulation code +%define GO4K_USE_ENV_MOD_ADR ; // removing this will skip env attack/decay/release modulation code +%define GO4K_USE_VCO_CHECK ; // removing this skips checks if processing is needed +%define GO4K_USE_VCO_PHASE_OFFSET ; // removing this will skip initial phase offset code +%define GO4K_USE_VCO_SHAPE ; // removing this skips waveshaping code +%define GO4K_USE_VCO_GATE ; // removing this skips gate code +%define GO4K_USE_VCO_MOD_FM ; // removing this skips frequency modulation code +%define GO4K_USE_VCO_MOD_PM ; // removing this skips phase modulation code +%define GO4K_USE_VCO_MOD_TM ; // removing this skips transpose modulation code +%define GO4K_USE_VCO_MOD_DM ; // removing this skips detune modulation code +%define GO4K_USE_VCO_MOD_CM ; // removing this skips color modulation code +%define GO4K_USE_VCO_MOD_GM ; // removing this skips gain modulation code +%define GO4K_USE_VCO_MOD_SM ; // removing this skips shaping modulation code +%define GO4K_USE_VCO_STEREO ; // removing this skips stereo code +%define GO4K_USE_VCF_CHECK ; // removing this skips checks if processing is needed +%define GO4K_USE_VCF_MOD_FM ; // removing this skips frequency modulation code +%define GO4K_USE_VCF_MOD_RM ; // removing this skips resonance modulation code +%define GO4K_USE_VCF_HIGH ; // removing this skips code for high output +%define GO4K_USE_VCF_BAND ; // removing this skips code for band output +%define GO4K_USE_VCF_PEAK ; // removing this skips code for peak output +%define GO4K_USE_VCF_STEREO ; // removing this skips code for stereo filter output +%define GO4K_USE_DST_CHECK ; // removing this skips checks if processing is needed +%define GO4K_USE_DST_SH ; // removing this skips sample and hold code +%define GO4K_USE_DST_MOD_DM ; // removing this skips distortion modulation code +%define GO4K_USE_DST_MOD_SH ; // removing this skips sample and hold modulation code +%define GO4K_USE_DST_STEREO ; // removing this skips stereo processing +%define GO4K_USE_DLL_NOTE_SYNC ; // removing this will skip delay length adjusting code (karplus strong) +%define GO4K_USE_DLL_CHORUS ; // removing this will skip delay chorus/flanger code +%define GO4K_USE_DLL_CHORUS_CLAMP ; // removing this will skip chorus lfo phase clamping +%define GO4K_USE_DLL_DAMP ; // removing this will skip dll damping code +%define GO4K_USE_DLL_DC_FILTER ; // removing this will skip dll dc offset removal code +%define GO4K_USE_FSTG_CHECK ; // removing this skips checks if processing is needed +%define GO4K_USE_PAN_MOD ; // removing this will skip panning modulation code +%define GO4K_USE_OUT_MOD_AM ; // removing this skips output aux send modulation code +%define GO4K_USE_OUT_MOD_GM ; // removing this skips output gain modulation code +%define GO4K_USE_WAVESHAPER_CLIP ; // removing this will skip clipping code +%define GO4K_USE_FLD_MOD_VM ; // removing this will skip float load modulation code +%define GO4K_USE_DLL_MOD ; // define this to enable modulations for delay line +%define GO4K_USE_DLL_MOD_PM ; // define this to enable pregain modulation for delay line +%define GO4K_USE_DLL_MOD_FM ; // define this to enable feebback modulation for delay line +%define GO4K_USE_DLL_MOD_IM ; // define this to enable dry modulation for delay line +%define GO4K_USE_DLL_MOD_DM ; // define this to enable damping modulation for delay line +%define GO4K_USE_DLL_MOD_SM ; // define this to enable lfo freq modulation for delay line +%define GO4K_USE_DLL_MOD_AM ; // define this to enable lfo depth modulation for delay line + +; //---------------------------------------------------------------------------------------- +; // synth defines +; //---------------------------------------------------------------------------------------- +%define MAX_DELAY 65536 +%define MAX_UNITS 64 +%define MAX_UNIT_SLOTS 16 +%define GO4K_BEGIN_CMDDEF(def_name) +%define GO4K_END_CMDDEF db 0 +%define GO4K_BEGIN_PARAMDEF(def_name) +%define GO4K_END_PARAMDEF +; //---------------------------------------------------------------------------------------- +; // ENV structs +; //---------------------------------------------------------------------------------------- +GO4K_ENV_ID equ 1 +%macro GO4K_ENV 5 + db %1 + db %2 + db %3 + db %4 + db %5 +%endmacro +%define ATTAC(val) val +%define DECAY(val) val +%define SUSTAIN(val) val +%define RELEASE(val) val +%define GAIN(val) val +struc go4kENV_val +;// unit paramters + .attac resd 1 + .decay resd 1 + .sustain resd 1 + .release resd 1 + .gain resd 1 + .size +endstruc +struc go4kENV_wrk +;// work variables + .state resd 1 + .level resd 1 +;// modulation targets + .gm resd 1 + .am resd 1 + .dm resd 1 + .sm resd 1 + .rm resd 1 + .size +endstruc +%define ENV_STATE_ATTAC 0 +%define ENV_STATE_DECAY 1 +%define ENV_STATE_SUSTAIN 2 +%define ENV_STATE_RELEASE 3 +%define ENV_STATE_OFF 4 +; //---------------------------------------------------------------------------------------- +; // VCO structs +; //---------------------------------------------------------------------------------------- +GO4K_VCO_ID equ 2 + +%macro GO4K_VCO 8 + db %1 + db %2 +%ifdef GO4K_USE_VCO_PHASE_OFFSET + db %3 +%endif +%ifdef GO4K_USE_VCO_GATE + db %4 +%endif + db %5 +%ifdef GO4K_USE_VCO_SHAPE + db %6 +%else +%endif + db %7 + db %8 +%endmacro +%define TRANSPOSE(val) val +%define DETUNE(val) val +%define PHASE(val) val +%define GATES(val) val +%define COLOR(val) val +%define SHAPE(val) val +%define FLAGS(val) val +%define SINE 0x01 +%define TRISAW 0x02 +%define PULSE 0x04 +%define NOISE 0x08 +%define LFO 0x10 +%define GATE 0x20 +%define VCO_STEREO 0x40 +struc go4kVCO_val +;// unit paramters + .transpose resd 1 + .detune resd 1 +%ifdef GO4K_USE_VCO_PHASE_OFFSET + .phaseofs resd 1 +%endif +%ifdef GO4K_USE_VCO_GATE + .gate resd 1 +%endif + .color resd 1 +%ifdef GO4K_USE_VCO_SHAPE + .shape resd 1 +%endif + .gain resd 1 + .flags resd 1 + .size +endstruc +struc go4kVCO_wrk +;// work variables + .phase resd 1 +;// modulation targets + .tm resd 1 + .dm resd 1 + .fm resd 1 + .pm resd 1 + .cm resd 1 + .sm resd 1 + .gm resd 1 +;// stero variables + .phase2 resd 1 + .size +endstruc +; //---------------------------------------------------------------------------------------- +; // VCF structs +; //---------------------------------------------------------------------------------------- +GO4K_VCF_ID equ 3 +%macro GO4K_VCF 3 + db %1 + db %2 + db %3 +%endmacro +%define LOWPASS 0x1 +%define HIGHPASS 0x2 +%define BANDPASS 0x4 +%define BANDSTOP 0x3 +%define ALLPASS 0x7 +%define PEAK 0x8 +%define STEREO 0x10 +%define FREQUENCY(val) val +%define RESONANCE(val) val +%define VCFTYPE(val) val +struc go4kVCF_val +;// unit paramters + .freq resd 1 + .res resd 1 + .type resd 1 + .size +endstruc +struc go4kVCF_wrk +;// work variables + .low resd 1 + .high resd 1 + .band resd 1 + .freq resd 1 ;// unused but kept so modulation target offsets stay same +;// modulation targets + .fm resd 1 + .rm resd 1 +;// stereo variables + .low2 resd 1 + .high2 resd 1 + .band2 resd 1 + .size +endstruc +; //---------------------------------------------------------------------------------------- +; // DST structs +; //---------------------------------------------------------------------------------------- +GO4K_DST_ID equ 4 +%macro GO4K_DST 3 + db %1 +%ifdef GO4K_USE_DST_SH + db %2 + %ifdef GO4K_USE_DST_STEREO + db %3 + %endif +%else + %ifdef GO4K_USE_DST_STEREO + db %3 + %endif +%endif +%endmacro +%define DRIVE(val) val +%define SNHFREQ(val) val +%define FLAGS(val) val +struc go4kDST_val +;// unit paramters + .drive resd 1 +%ifdef GO4K_USE_DST_SH + .snhfreq resd 1 +%endif + .flags resd 1 + .size +endstruc +struc go4kDST_wrk +;// work variables + .out resd 1 + .snhphase resd 1 +;// modulation targets + .dm resd 1 + .sm resd 1 +;// stereo variables + .out2 resd 1 + .size +endstruc +; //---------------------------------------------------------------------------------------- +; // DLL structs +; //---------------------------------------------------------------------------------------- +GO4K_DLL_ID equ 5 +%macro GO4K_DLL 8 + db %1 + db %2 + db %3 +%ifdef GO4K_USE_DLL_DAMP + db %4 +%endif +%ifdef GO4K_USE_DLL_CHORUS + db %5 + db %6 +%endif + db %7 + db %8 +%endmacro +%define PREGAIN(val) val +%define DRY(val) val +%define FEEDBACK(val) val +%define DEPTH(val) val +%define DAMP(val) val +%define DELAY(val) val +%define COUNT(val) val +struc go4kDLL_val +;// unit paramters + .pregain resd 1 + .dry resd 1 + .feedback resd 1 +%ifdef GO4K_USE_DLL_DAMP + .damp resd 1 +%endif +%ifdef GO4K_USE_DLL_CHORUS + .freq resd 1 + .depth +%endif + .delay resd 1 + .count resd 1 + .size +endstruc +struc go4kDLL_wrk +;// work variables + .index resd 1 + .store resd 1 + .dcin resd 1 + .dcout resd 1 + .phase resd 1 +;// the delay buffer + .buffer resd MAX_DELAY + .size +endstruc +struc go4kDLL_wrk2 +;// modulation targets + .pm resd 1 + .fm resd 1 + .im resd 1 + .dm resd 1 + .sm resd 1 + .am resd 1 + .size +endstruc +; //---------------------------------------------------------------------------------------- +; // FOP structs +; //---------------------------------------------------------------------------------------- +GO4K_FOP_ID equ 6 +%macro GO4K_FOP 1 + db %1 +%endmacro +%define OP(val) val +%define FOP_POP 0x1 +%define FOP_ADDP 0x2 +%define FOP_MULP 0x3 +%define FOP_PUSH 0x4 +%define FOP_XCH 0x5 +%define FOP_ADD 0x6 +%define FOP_MUL 0x7 +%define FOP_ADDP2 0x8 +%define FOP_LOADNOTE 0x9 +%define FOP_MULP2 0xa +struc go4kFOP_val + .flags resd 1 + .size +endstruc +struc go4kFOP_wrk + .size +endstruc +; //---------------------------------------------------------------------------------------- +; // FST structs +; //---------------------------------------------------------------------------------------- +GO4K_FST_ID equ 7 +%macro GO4K_FST 2 + db %1 + dw %2 +%endmacro +%define AMOUNT(val) val +%define DEST(val) val +%define FST_SET 0x0000 +%define FST_ADD 0x4000 +%define FST_POP 0x8000 +struc go4kFST_val + .amount resd 1 + .op1 resd 1 + .size +endstruc +struc go4kFST_wrk + .size +endstruc +; //---------------------------------------------------------------------------------------- +; // PAN structs +; //---------------------------------------------------------------------------------------- +GO4K_PAN_ID equ 8 +%macro GO4K_PAN 1 +%ifdef GO4K_USE_PAN + db %1 +%endif +%endmacro +%define PANNING(val) val +struc go4kPAN_val +%ifdef GO4K_USE_PAN + .panning resd 1 +%endif + .size +endstruc +struc go4kPAN_wrk +;// modulation targets + .pm resd 1 + .size +endstruc +; //---------------------------------------------------------------------------------------- +; // OUT structs +; //---------------------------------------------------------------------------------------- +GO4K_OUT_ID equ 9 +%macro GO4K_OUT 2 + db %1 +%ifdef GO4K_USE_GLOBAL_DLL + db %2 +%endif +%endmacro +%define AUXSEND(val) val +struc go4kOUT_val + .gain resd 1 +%ifdef GO4K_USE_GLOBAL_DLL + .auxsend resd 1 +%endif + .size +endstruc +struc go4kOUT_wrk +;// modulation targets + .am resd 1 + .gm resd 1 + .size +endstruc +; //---------------------------------------------------------------------------------------- +; // ACC structs (this is for the synth def only) +; //---------------------------------------------------------------------------------------- +GO4K_ACC_ID equ 10 +%macro GO4K_ACC 1 + db %1 +%endmacro +%define OUTPUT 0 +%define AUX 8 +%define ACCTYPE(val) val +struc go4kACC_val + .acctype resd 1 + .size +endstruc +struc go4kACC_wrk + .size +endstruc +%ifdef GO4K_USE_FLD +; //---------------------------------------------------------------------------------------- +; // FLD structs +; //---------------------------------------------------------------------------------------- +GO4K_FLD_ID equ 11 +%macro GO4K_FLD 1 + db %1 +%endmacro +%define VALUE(val) val +struc go4kFLD_val + .value resd 1 + .size +endstruc +struc go4kFLD_wrk +;// modulation targets + .vm resd 1 + .size +endstruc +%endif +%ifdef GO4K_USE_GLITCH +; //---------------------------------------------------------------------------------------- +; // GLITCH structs +; //---------------------------------------------------------------------------------------- +GO4K_GLITCH_ID equ 12 +%macro GO4K_GLITCH 5 + db %1 + db %2 + db %3 + db %4 + db %5 +%endmacro +%define ACTIVE(val) val +%define SLICEFACTOR(val)val +%define PITCHFACTOR(val)val +%define SLICESIZE(val) val +struc go4kGLITCH_val +;// unit paramters + .active resd 1 + .dry resd 1 + .dsize resd 1 + .dpitch resd 1 + .slicesize resd 1 + .size +endstruc +struc go4kGLITCH_wrk +;// work variables + .index resd 1 + .store resd 1 + .slizesize resd 1 + .slicepitch resd 1 + .unused resd 1 +;// the delay buffer + .buffer resd MAX_DELAY + .size +endstruc +struc go4kGLITCH_wrk2 +;// modulation targets + .am resd 1 + .dm resd 1 + .sm resd 1 + .pm resd 1 + .size +endstruc +%endif +%ifdef GO4K_USE_FSTG +; //---------------------------------------------------------------------------------------- +; // FSTG structs +; //---------------------------------------------------------------------------------------- +GO4K_FSTG_ID equ 13 +%macro GO4K_FSTG 2 + db %1 + dw %2 +%endmacro +struc go4kFSTG_val + .amount resd 1 + .op1 resd 1 + .size +endstruc +struc go4kFSTG_wrk + .size +endstruc +%endif +; //---------------------------------------------------------------------------------------- +; // Voice struct +; //---------------------------------------------------------------------------------------- +struc go4k_instrument + .release resd 1 + .note resd 1 + .workspace resd MAX_UNITS*MAX_UNIT_SLOTS + .dlloutl resd 1 + .dlloutr resd 1 + .outl resd 1 + .outr resd 1 + .size +endstruc +; //---------------------------------------------------------------------------------------- +; // Synth struct +; //---------------------------------------------------------------------------------------- +struc go4k_synth + .instruments resb go4k_instrument.size * MAX_INSTRUMENTS * MAX_VOICES + .global resb go4k_instrument.size * MAX_VOICES + .size +endstruc +; //---------------------------------------------------------------------------------------- +; // Pattern Data, reduced by 967 patterns +; //---------------------------------------------------------------------------------------- +%ifdef USE_SECTIONS +section .g4kmuc1 data align=1 +%else +section .data align=1 +%endif +go4k_patterns + db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + db 76, HLD, HLD, HLD, 0, 0, 0, 0, 79, HLD, HLD, HLD, 0, 0, 0, 0, + db 69, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, 0, 0, 0, 0, + db 76, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 81, HLD, HLD, HLD, 0, 0, 0, 0, 79, HLD, HLD, HLD, 0, 0, 0, 0, + db 84, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, 0, 0, 0, 0, + db 76, HLD, HLD, HLD, 0, 0, 0, 0, 88, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, + db 76, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, 0, 0, 0, 0, + db 52, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 57, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 60, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 64, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 69, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 72, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 40, 52, HLD, 64, HLD, 40, 52, 64, 52, HLD, HLD, HLD, 0, 0, 0, 0, + db 57, 0, 0, 57, 0, 0, 69, 0, 0, 69, 0, 0, 57, HLD, HLD, HLD, + db 52, 64, 0, 57, 0, 69, 48, 0, 48, HLD, HLD, HLD, 0, 0, 0, 0, + db 40, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, + db 40, 52, HLD, 40, HLD, 40, 40, 40, 52, HLD, HLD, HLD, 0, 0, 0, 0, + db 40, 0, 0, 52, 0, 0, 40, 0, 52, 40, 0, 52, 0, 40, 0, 0, + db 45, 0, 0, 57, 0, 0, 45, 0, 57, 45, 0, 57, 0, 45, 0, 0, + db 48, 0, 0, 60, 0, 0, 48, 0, 60, 48, 0, 60, 0, 48, 0, 0, + db 40, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, + db 45, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, + db 36, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, + db 0, 0, 0, 0, 60, HLD, 0, 0, 0, 0, 0, 0, 60, HLD, 0, 0, + db 60, HLD, 0, 0, 0, 0, 60, HLD, 0, 0, 60, HLD, 60, HLD, 0, 0, + db 0, 0, 0, 0, 60, HLD, 0, 0, 0, 0, 0, 0, 60, HLD, 60, HLD, + db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, HLD, 0, 0, + db 60, HLD, 60, HLD, 0, 0, 60, HLD, 0, 0, 0, 0, 60, HLD, 0, 0, + db 0, 0, 60, HLD, 0, 0, 0, 0, 60, HLD, 0, 0, 0, 0, 0, 0, + db 0, 0, 60, HLD, 0, 0, 0, 0, 60, HLD, 0, 0, 60, HLD, 0, 0, + db 0, 0, 0, 60, HLD, 0, 0, 0, 0, 0, 0, 0, 60, HLD, 0, 0, + db 0, 0, 0, 60, HLD, 0, 0, 0, 0, 60, HLD, 60, 60, HLD, 0, 0, + db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, + db 91, 0, 0, 88, 0, 0, 76, 0, 81, 0, 0, 0, 0, 0, 0, 0, + db 81, 0, 0, 84, 0, 0, 86, 0, 88, 0, 0, 0, 0, 0, 0, 0, + db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93, 0, 0, 0, + db 81, 0, 0, 84, 0, 0, 86, 0, 81, 0, 0, 0, 0, 0, 0, 0, + db 84, 0, 0, 86, 0, 0, 88, 0, 0, 91, 0, 0, 84, 0, 0, 0, + db HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, HLD, +go4k_patterns_end +; //---------------------------------------------------------------------------------------- +; // Pattern Index List +; //---------------------------------------------------------------------------------------- +%ifdef USE_SECTIONS +section .g4kmuc2 data align=1 +%else +section .data +%endif +go4k_pattern_lists +Instrument0List db 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 4, 5, 6, 7, 1, 2, 3, 0, 4, 5, 6, 7, 8, 2, 9, 0, 0, 0, +Instrument1List db 9, 7, 10, 7, 11, 7, 12, 7, 9, 7, 10, 7, 11, 7, 12, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 13, 7, 14, 7, 3, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 7, 0, 0, +Instrument2List db 15, 0, 16, 0, 17, 0, 18, 0, 19, 0, 16, 0, 17, 0, 18, 0, 20, 20, 21, 21, 22, 22, 20, 20, 20, 20, 21, 21, 22, 22, 20, 20, 23, 15, 24, 16, 25, 17, 18, 0, 20, 20, 21, 21, 22, 22, 20, 20, 20, 20, 21, 21, 22, 22, 20, 20, 20, 20, 0, 0, 0, 0, +Instrument3List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, +Instrument4List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 26, 27, 26, 27, 26, 27, 28, 27, 26, 27, 26, 27, 26, 27, 28, 27, 29, 27, 29, 27, 29, 27, 29, 27, 26, 27, 26, 27, 26, 27, 28, 27, 26, 27, 26, 27, 26, 27, 28, 27, 26, 27, 0, 0, 0, +Instrument5List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 0, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 30, 31, 30, 32, 0, 0, +Instrument6List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 33, 34, 33, 33, 0, 0, 0, 0, +Instrument7List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 36, 0, 37, 38, 36, 0, 39, 35, 36, 0, 37, 38, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, +Instrument8List db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 11, 41, 41, 41, 41, 0, +go4k_pattern_lists_end +; //---------------------------------------------------------------------------------------- +; // Instrument Commands +; //---------------------------------------------------------------------------------------- +%ifdef USE_SECTIONS +section .g4kmuc3 data align=1 +%else +section .data +%endif +go4k_synth_instructions +GO4K_BEGIN_CMDDEF(Instrument0) + db GO4K_ENV_ID + db GO4K_FST_ID + db GO4K_VCO_ID + db GO4K_VCO_ID + db GO4K_VCO_ID + db GO4K_FST_ID + db GO4K_FST_ID + db GO4K_FOP_ID + db GO4K_FOP_ID + db GO4K_FOP_ID + db GO4K_VCF_ID + db GO4K_VCF_ID + db GO4K_DST_ID + db GO4K_PAN_ID + db GO4K_DLL_ID + db GO4K_FOP_ID + db GO4K_DLL_ID + db GO4K_FOP_ID + db GO4K_OUT_ID +GO4K_END_CMDDEF +GO4K_BEGIN_CMDDEF(Instrument1) + db GO4K_ENV_ID + db GO4K_FST_ID + db GO4K_VCO_ID + db GO4K_VCO_ID + db GO4K_VCO_ID + db GO4K_FST_ID + db GO4K_FST_ID + db GO4K_FOP_ID + db GO4K_FOP_ID + db GO4K_FOP_ID + db GO4K_VCF_ID + db GO4K_VCF_ID + db GO4K_DST_ID + db GO4K_PAN_ID + db GO4K_DLL_ID + db GO4K_FOP_ID + db GO4K_DLL_ID + db GO4K_FOP_ID + db GO4K_OUT_ID +GO4K_END_CMDDEF +GO4K_BEGIN_CMDDEF(Instrument2) + db GO4K_ENV_ID + db GO4K_FST_ID + db GO4K_VCO_ID + db GO4K_VCO_ID + db GO4K_VCO_ID + db GO4K_FST_ID + db GO4K_FST_ID + db GO4K_FOP_ID + db GO4K_FOP_ID + db GO4K_FOP_ID + db GO4K_VCF_ID + db GO4K_VCF_ID + db GO4K_DST_ID + db GO4K_PAN_ID + db GO4K_DLL_ID + db GO4K_FOP_ID + db GO4K_DLL_ID + db GO4K_FOP_ID + db GO4K_OUT_ID +GO4K_END_CMDDEF +GO4K_BEGIN_CMDDEF(Instrument3) + db GO4K_ENV_ID + db GO4K_FST_ID + db GO4K_VCO_ID + db GO4K_FOP_ID + db GO4K_VCF_ID + db GO4K_PAN_ID + db GO4K_OUT_ID +GO4K_END_CMDDEF +GO4K_BEGIN_CMDDEF(Instrument4) + db GO4K_ENV_ID + db GO4K_FST_ID + db GO4K_ENV_ID + db GO4K_DST_ID + db GO4K_FST_ID + db GO4K_FOP_ID + db GO4K_VCO_ID + db GO4K_FOP_ID + db GO4K_PAN_ID + db GO4K_OUT_ID +GO4K_END_CMDDEF +GO4K_BEGIN_CMDDEF(Instrument5) + db GO4K_ENV_ID + db GO4K_VCO_ID + db GO4K_FOP_ID + db GO4K_VCF_ID + db GO4K_PAN_ID + db GO4K_DLL_ID + db GO4K_FOP_ID + db GO4K_DLL_ID + db GO4K_FOP_ID + db GO4K_OUT_ID +GO4K_END_CMDDEF +GO4K_BEGIN_CMDDEF(Instrument6) + db GO4K_ENV_ID + db GO4K_FST_ID + db GO4K_ENV_ID + db GO4K_FST_ID + db GO4K_FST_ID + db GO4K_FOP_ID + db GO4K_VCO_ID + db GO4K_VCO_ID + db GO4K_VCO_ID + db GO4K_VCF_ID + db GO4K_FOP_ID + db GO4K_FOP_ID + db GO4K_FOP_ID + db GO4K_VCF_ID + db GO4K_PAN_ID + db GO4K_OUT_ID +GO4K_END_CMDDEF +GO4K_BEGIN_CMDDEF(Instrument7) + db GO4K_ENV_ID + db GO4K_VCO_ID + db GO4K_FOP_ID + db GO4K_PAN_ID + db GO4K_DLL_ID + db GO4K_FOP_ID + db GO4K_DLL_ID + db GO4K_FOP_ID + db GO4K_OUT_ID +GO4K_END_CMDDEF +GO4K_BEGIN_CMDDEF(Instrument8) + db GO4K_ENV_ID + db GO4K_VCO_ID + db GO4K_FOP_ID + db GO4K_FSTG_ID + db GO4K_FSTG_ID + db GO4K_FOP_ID +GO4K_END_CMDDEF +;// global commands +GO4K_BEGIN_CMDDEF(Global) + db GO4K_ACC_ID + db GO4K_DLL_ID + db GO4K_FOP_ID + db GO4K_DLL_ID + db GO4K_FOP_ID + db GO4K_ACC_ID + db GO4K_FOP_ID + db GO4K_OUT_ID +GO4K_END_CMDDEF +go4k_synth_instructions_end +; //---------------------------------------------------------------------------------------- +; // Intrument Data +; //---------------------------------------------------------------------------------------- +%ifdef USE_SECTIONS +section .g4kmuc4 data align=1 +%else +section .data +%endif +go4k_synth_parameter_values +GO4K_BEGIN_PARAMDEF(Instrument0) + GO4K_ENV ATTAC(72),DECAY(96),SUSTAIN(96),RELEASE(88),GAIN(128) + GO4K_FST AMOUNT(64),DEST(0*MAX_UNIT_SLOTS+2) + GO4K_VCO TRANSPOSE(64),DETUNE(60),PHASE(32),GATES(0),COLOR(80),SHAPE(64),GAIN(128),FLAGS(PULSE) + GO4K_VCO TRANSPOSE(64),DETUNE(72),PHASE(32),GATES(0),COLOR(96),SHAPE(64),GAIN(128),FLAGS(TRISAW) + GO4K_VCO TRANSPOSE(32),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(96),GAIN(128),FLAGS(SINE|LFO) + GO4K_FST AMOUNT(68),DEST(2*MAX_UNIT_SLOTS+2) + GO4K_FST AMOUNT(61),DEST(3*MAX_UNIT_SLOTS+2) + GO4K_FOP OP(FOP_POP) + GO4K_FOP OP(FOP_ADDP) + GO4K_FOP OP(FOP_MULP) + GO4K_VCF FREQUENCY(26),RESONANCE(128),VCFTYPE(PEAK) + GO4K_VCF FREQUENCY(64),RESONANCE(64),VCFTYPE(LOWPASS) + GO4K_DST DRIVE(104), SNHFREQ(128), FLAGS(0) + GO4K_PAN PANNING(64) + GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(96),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(16),COUNT(1) + GO4K_FOP OP(FOP_XCH) + GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1) + GO4K_FOP OP(FOP_XCH) + GO4K_OUT GAIN(0), AUXSEND(32) +GO4K_END_PARAMDEF +GO4K_BEGIN_PARAMDEF(Instrument1) + GO4K_ENV ATTAC(72),DECAY(96),SUSTAIN(96),RELEASE(88),GAIN(128) + GO4K_FST AMOUNT(64),DEST(0*MAX_UNIT_SLOTS+2) + GO4K_VCO TRANSPOSE(64),DETUNE(60),PHASE(32),GATES(0),COLOR(80),SHAPE(64),GAIN(128),FLAGS(TRISAW) + GO4K_VCO TRANSPOSE(64),DETUNE(72),PHASE(32),GATES(0),COLOR(96),SHAPE(112),GAIN(64),FLAGS(SINE) + GO4K_VCO TRANSPOSE(80),DETUNE(112),PHASE(0),GATES(0),COLOR(64),SHAPE(16),GAIN(128),FLAGS(PULSE|LFO) + GO4K_FST AMOUNT(68),DEST(2*MAX_UNIT_SLOTS+2) + GO4K_FST AMOUNT(60),DEST(3*MAX_UNIT_SLOTS+2) + GO4K_FOP OP(FOP_POP) + GO4K_FOP OP(FOP_ADDP) + GO4K_FOP OP(FOP_MULP) + GO4K_VCF FREQUENCY(80),RESONANCE(24),VCFTYPE(LOWPASS) + GO4K_VCF FREQUENCY(48),RESONANCE(24),VCFTYPE(HIGHPASS) + GO4K_DST DRIVE(64), SNHFREQ(128), FLAGS(0) + GO4K_PAN PANNING(64) + GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(96),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(16),COUNT(1) + GO4K_FOP OP(FOP_XCH) + GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1) + GO4K_FOP OP(FOP_XCH) + GO4K_OUT GAIN(0), AUXSEND(32) +GO4K_END_PARAMDEF +GO4K_BEGIN_PARAMDEF(Instrument2) + GO4K_ENV ATTAC(32),DECAY(64),SUSTAIN(64),RELEASE(64),GAIN(64) + GO4K_FST AMOUNT(120),DEST(0*MAX_UNIT_SLOTS+2) + GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(32),GATES(0),COLOR(80),SHAPE(64),GAIN(128),FLAGS(PULSE) + GO4K_VCO TRANSPOSE(64),DETUNE(72),PHASE(32),GATES(0),COLOR(96),SHAPE(64),GAIN(128),FLAGS(TRISAW) + GO4K_VCO TRANSPOSE(32),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(96),GAIN(128),FLAGS(SINE|LFO) + GO4K_FST AMOUNT(68),DEST(2*MAX_UNIT_SLOTS+2) + GO4K_FST AMOUNT(60),DEST(3*MAX_UNIT_SLOTS+2) + GO4K_FOP OP(FOP_POP) + GO4K_FOP OP(FOP_ADDP) + GO4K_FOP OP(FOP_MULP) + GO4K_VCF FREQUENCY(18),RESONANCE(64),VCFTYPE(PEAK) + GO4K_VCF FREQUENCY(32),RESONANCE(48),VCFTYPE(LOWPASS) + GO4K_DST DRIVE(88), SNHFREQ(128), FLAGS(0) + GO4K_PAN PANNING(64) + GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(96),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(16),COUNT(1) + GO4K_FOP OP(FOP_XCH) + GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1) + GO4K_FOP OP(FOP_XCH) + GO4K_OUT GAIN(64), AUXSEND(64) +GO4K_END_PARAMDEF +GO4K_BEGIN_PARAMDEF(Instrument3) + GO4K_ENV ATTAC(0),DECAY(76),SUSTAIN(0),RELEASE(0),GAIN(32) + GO4K_FST AMOUNT(128),DEST(0*MAX_UNIT_SLOTS+2) + GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(64),GATES(0),COLOR(64),SHAPE(64),GAIN(128),FLAGS(NOISE) + GO4K_FOP OP(FOP_MULP) + GO4K_VCF FREQUENCY(80),RESONANCE(128),VCFTYPE(LOWPASS) + GO4K_PAN PANNING(64) + GO4K_OUT GAIN(64), AUXSEND(0) +GO4K_END_PARAMDEF +GO4K_BEGIN_PARAMDEF(Instrument4) + GO4K_ENV ATTAC(0),DECAY(64),SUSTAIN(96),RELEASE(64),GAIN(128) + GO4K_FST AMOUNT(128),DEST(0*MAX_UNIT_SLOTS+2) + GO4K_ENV ATTAC(0),DECAY(70),SUSTAIN(0),RELEASE(0),GAIN(128) + GO4K_DST DRIVE(32), SNHFREQ(128), FLAGS(0) + GO4K_FST AMOUNT(80),DEST(6*MAX_UNIT_SLOTS+1) + GO4K_FOP OP(FOP_POP) + GO4K_VCO TRANSPOSE(46),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(64),GAIN(128),FLAGS(TRISAW) + GO4K_FOP OP(FOP_MULP) + GO4K_PAN PANNING(64) + GO4K_OUT GAIN(128), AUXSEND(0) +GO4K_END_PARAMDEF +GO4K_BEGIN_PARAMDEF(Instrument5) + GO4K_ENV ATTAC(0),DECAY(64),SUSTAIN(0),RELEASE(0),GAIN(128) + GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(64),GATES(0),COLOR(64),SHAPE(64),GAIN(128),FLAGS(NOISE) + GO4K_FOP OP(FOP_MULP) + GO4K_VCF FREQUENCY(128),RESONANCE(128),VCFTYPE(BANDPASS) + GO4K_PAN PANNING(64) + GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(96),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(16),COUNT(1) + GO4K_FOP OP(FOP_XCH) + GO4K_DLL PREGAIN(64),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1) + GO4K_FOP OP(FOP_XCH) + GO4K_OUT GAIN(64), AUXSEND(0) +GO4K_END_PARAMDEF +GO4K_BEGIN_PARAMDEF(Instrument6) + GO4K_ENV ATTAC(0),DECAY(72),SUSTAIN(0),RELEASE(72),GAIN(128) + GO4K_FST AMOUNT(128),DEST(0*MAX_UNIT_SLOTS+2) + GO4K_ENV ATTAC(0),DECAY(56),SUSTAIN(0),RELEASE(0),GAIN(128) + GO4K_FST AMOUNT(108),DEST(6*MAX_UNIT_SLOTS+1) + GO4K_FST AMOUNT(72),DEST(7*MAX_UNIT_SLOTS+1) + GO4K_FOP OP(FOP_POP) + GO4K_VCO TRANSPOSE(32),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(32),GAIN(64),FLAGS(SINE) + GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(80),GAIN(64),FLAGS(SINE) + GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(64),GAIN(64),FLAGS(NOISE) + GO4K_VCF FREQUENCY(104),RESONANCE(128),VCFTYPE(LOWPASS) + GO4K_FOP OP(FOP_ADDP) + GO4K_FOP OP(FOP_ADDP) + GO4K_FOP OP(FOP_MULP) + GO4K_VCF FREQUENCY(22),RESONANCE(32),VCFTYPE(HIGHPASS) + GO4K_PAN PANNING(64) + GO4K_OUT GAIN(64), AUXSEND(0) +GO4K_END_PARAMDEF +GO4K_BEGIN_PARAMDEF(Instrument7) + GO4K_ENV ATTAC(0),DECAY(0),SUSTAIN(96),RELEASE(32),GAIN(128) + GO4K_VCO TRANSPOSE(64),DETUNE(64),PHASE(0),GATES(0),COLOR(80),SHAPE(64),GAIN(128),FLAGS(PULSE) + GO4K_FOP OP(FOP_MULP) + GO4K_PAN PANNING(64) + GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(96),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(16),COUNT(1) + GO4K_FOP OP(FOP_XCH) + GO4K_DLL PREGAIN(96),DRY(128),FEEDBACK(64),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(17),COUNT(1) + GO4K_FOP OP(FOP_XCH) + GO4K_OUT GAIN(0), AUXSEND(64) +GO4K_END_PARAMDEF +GO4K_BEGIN_PARAMDEF(Instrument8) + GO4K_ENV ATTAC(0),DECAY(0),SUSTAIN(128),RELEASE(0),GAIN(128) + GO4K_VCO TRANSPOSE(48),DETUNE(64),PHASE(0),GATES(0),COLOR(64),SHAPE(64),GAIN(128),FLAGS(TRISAW|LFO) + GO4K_FOP OP(FOP_MULP) + GO4K_FSTG AMOUNT(72),DEST(2*go4k_instrument.size*MAX_VOICES+10*MAX_UNIT_SLOTS*4+4*4+go4k_instrument.workspace) + GO4K_FSTG AMOUNT(66),DEST(1*go4k_instrument.size*MAX_VOICES+10*MAX_UNIT_SLOTS*4+4*4+go4k_instrument.workspace) + GO4K_FOP OP(FOP_POP) +GO4K_END_PARAMDEF +;// global parameters +GO4K_BEGIN_PARAMDEF(Global) + GO4K_ACC ACCTYPE(AUX) + GO4K_DLL PREGAIN(40),DRY(128),FEEDBACK(125),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(0),COUNT(8) + GO4K_FOP OP(FOP_XCH) + GO4K_DLL PREGAIN(40),DRY(128),FEEDBACK(125),DAMP(64),FREQUENCY(0),DEPTH(0),DELAY(8),COUNT(8) + GO4K_FOP OP(FOP_XCH) + GO4K_ACC ACCTYPE(OUTPUT) + GO4K_FOP OP(FOP_ADDP2) + GO4K_OUT GAIN(64), AUXSEND(0) +GO4K_END_PARAMDEF +go4k_synth_parameter_values_end +; //---------------------------------------------------------------------------------------- +; // Delay/Reverb Times +; //---------------------------------------------------------------------------------------- +%ifdef USE_SECTIONS +section .g4kmuc5 data align=1 +%else +section .data +%endif +%ifdef GO4K_USE_DLL +global _go4k_delay_times +_go4k_delay_times + dw 0 + dw 1116 + dw 1188 + dw 1276 + dw 1356 + dw 1422 + dw 1492 + dw 1556 + dw 1618 + dw 1140 + dw 1212 + dw 1300 + dw 1380 + dw 1446 + dw 1516 + dw 1580 + dw 1642 + dw 22050 ; Originally times 100 dw 0, but crashes for me (Peter) - so reverted to this found in an older version + dw 16537 + dw 11025 +%endif + +%include "../4klang.inc" diff --git a/4klang_source/Go4kVSTi/win/4klang.bin b/src/vsti/4klang.bin similarity index 100% rename from 4klang_source/Go4kVSTi/win/4klang.bin rename to src/vsti/4klang.bin diff --git a/src/vsti/CMakeLists.txt b/src/vsti/CMakeLists.txt new file mode 100644 index 0000000..52bc91b --- /dev/null +++ b/src/vsti/CMakeLists.txt @@ -0,0 +1,28 @@ +file(GLOB SOURCE_LIST CONFIGURE_DEPENDS "*.cpp" "*.hpp" "*.asm" "*.rc" "*.bin") +file(GLOB AEFFECT_SOURCE_LIST CONFIGURE_DEPENDS "audioeffect/*") + +# Make an automatic library - will be static or dynamic based on user setting +add_library(4klang SHARED ${SOURCE_LIST} ${AEFFECT_SOURCE_LIST} Go4kVSTi.def) + +set_property(TARGET 4klang PROPERTY + MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") + +# The private headers +target_include_directories(4klang PRIVATE "audioeffect/") + +add_library(vstgui STATIC IMPORTED) +set_target_properties(vstgui + PROPERTIES IMPORTED_LOCATION + "${CMAKE_SOURCE_DIR}/extern/vstgui.lib") + +target_link_libraries(4klang PRIVATE comctl32 vstgui) +# add_dependencies(4klang_vsti vstgui) + +# This depends on (header only) boost +# target_link_libraries(modern_library PRIVATE Boost::boost) + +# All users of this library will need at least C++11 +#target_compile_features(modern_library PUBLIC cxx_std_11) + +# IDEs should put the headers in a nice place +#source_group(TREE "${PROJECT_SOURCE_DIR}/include" PREFIX "Header Files" #FILES ${HEADER_LIST}) diff --git a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTi.cpp b/src/vsti/Go4kVSTi.cpp similarity index 96% rename from 4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTi.cpp rename to src/vsti/Go4kVSTi.cpp index fc5fd6c..8256fb2 100644 --- a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTi.cpp +++ b/src/vsti/Go4kVSTi.cpp @@ -1,204 +1,204 @@ -#include -#include -#ifndef __Go4kVSTi__ -#include "Go4kVSTi.h" -#endif -#include "Go4kVSTiCore.h" -//----------------------------------------------------------------------------------------- -// Go4kVSTi -//----------------------------------------------------------------------------------------- - -//----------------------------------------------------------------------------------------- -Go4kVSTi::Go4kVSTi (audioMasterCallback audioMaster) : AudioEffectX (audioMaster, 0, 0) -{ - m_chunkBuffer = 0; - if (audioMaster) - { - setNumInputs (0); // no inputs - setNumOutputs (2); // 2 outputs, stereo - canProcessReplacing (); - hasVu (false); - hasClip (false); - isSynth (); - programsAreChunks (true); -#ifdef _8KLANG - setUniqueID ('8klg'); -#else - setUniqueID ('4klg'); -#endif - } - initProcess (); - suspend (); -} - -//----------------------------------------------------------------------------------------- -Go4kVSTi::~Go4kVSTi () -{ - delete[] m_chunkBuffer; -} - -//----------------------------------------------------------------------------------------- -void Go4kVSTi::setProgram (long program) -{ -} - -//----------------------------------------------------------------------------------------- -void Go4kVSTi::setProgramName (char *name) -{ -} - -//----------------------------------------------------------------------------------------- -void Go4kVSTi::getProgramName (char *name) -{ -} - -//----------------------------------------------------------------------------------------- -void Go4kVSTi::getParameterLabel (long index, char *label) -{ -} - -//----------------------------------------------------------------------------------------- -void Go4kVSTi::getParameterDisplay (long index, char *text) -{ -} - -//----------------------------------------------------------------------------------------- -void Go4kVSTi::getParameterName (long index, char *label) -{ -} - -//----------------------------------------------------------------------------------------- -void Go4kVSTi::setParameter (long index, float value) -{ -} - -//----------------------------------------------------------------------------------------- -float Go4kVSTi::getParameter (long index) -{ - return 0; -} - -//----------------------------------------------------------------------------------------- -bool Go4kVSTi::getOutputProperties (long index, VstPinProperties* properties) -{ - if (index < 2) - { - sprintf (properties->label, "Vstx %1d", index + 1); - properties->flags = kVstPinIsActive; - properties->flags |= kVstPinIsStereo; // test, make channel 1+2 stereo - return true; - } - return false; -} - -//----------------------------------------------------------------------------------------- -bool Go4kVSTi::getProgramNameIndexed (long category, long index, char* text) -{ - return false; -} - -//----------------------------------------------------------------------------------------- -bool Go4kVSTi::copyProgram (long destination) -{ - return false; -} - -//----------------------------------------------------------------------------------------- -bool Go4kVSTi::getEffectName (char* name) -{ -#ifdef _8KLANG - strcpy (name, "8klang"); -#else - strcpy (name, "4klang"); -#endif - return true; -} - -//----------------------------------------------------------------------------------------- -bool Go4kVSTi::getVendorString (char* text) -{ - strcpy (text, "Alcatraz"); - return true; -} - -//----------------------------------------------------------------------------------------- -bool Go4kVSTi::getProductString (char* text) -{ -#ifdef _8KLANG - strcpy (text, "8klang"); -#else - strcpy (text, "4klang"); -#endif - return true; -} - -//----------------------------------------------------------------------------------------- -long Go4kVSTi::canDo (char* text) -{ - if (!strcmp (text, "receiveVstEvents")) - return 1; - if (!strcmp (text, "receiveVstMidiEvent")) - return 1; - if (!strcmp (text, "receiveVstTimeInfo")) - return 1; - return -1; // explicitly can't do; 0 => don't know -} - -//----------------------------------------------------------------------------------------- -long Go4kVSTi::getChunk(void** data, bool isPreset) -{ - // serialize patch data into file, then load it back - char path[MAX_PATH]; - char filename[MAX_PATH]; - GetTempPath(MAX_PATH, path); - GetTempFileName(path, "4klang_", 0, filename); - Go4kVSTi_SavePatch(filename); - - HANDLE h = CreateFile(filename, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); - if (h == INVALID_HANDLE_VALUE) - return 0; - - DWORD dummy; - DWORD size = GetFileSize(h, &dummy); - delete[] m_chunkBuffer; - m_chunkBuffer = new unsigned char[size]; - ReadFile(h, m_chunkBuffer, size, &dummy, 0); - CloseHandle(h); - DeleteFile(filename); - - if (dummy == size) - { - *data = m_chunkBuffer; - return size; - } - return 0; -} - -//----------------------------------------------------------------------------------------- -long Go4kVSTi::setChunk(void* data, long byteSize, bool isPreset) -{ - if (!data || !byteSize) return 0; - - // write chunk into file, then deserialize as patch data - char path[MAX_PATH]; - char filename[MAX_PATH]; - GetTempPath(MAX_PATH, path); - GetTempFileName(path, "4klang_", 0, filename); - - HANDLE h = CreateFile(filename, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); - if (h == INVALID_HANDLE_VALUE) - { - DWORD err = GetLastError(); - return 0; - } - DWORD dummy; - WriteFile(h, data, byteSize, &dummy, 0); - CloseHandle(h); - - if (dummy == byteSize) - { - Go4kVSTi_LoadPatch(filename); - } - DeleteFile(filename); - return 0; -} +#include +#include +#ifndef __Go4kVSTi__ +#include "Go4kVSTi.h" +#endif +#include "Go4kVSTiCore.h" +//----------------------------------------------------------------------------------------- +// Go4kVSTi +//----------------------------------------------------------------------------------------- + +//----------------------------------------------------------------------------------------- +Go4kVSTi::Go4kVSTi (audioMasterCallback audioMaster) : AudioEffectX (audioMaster, 0, 0) +{ + m_chunkBuffer = 0; + if (audioMaster) + { + setNumInputs (0); // no inputs + setNumOutputs (2); // 2 outputs, stereo + canProcessReplacing (); + hasVu (false); + hasClip (false); + isSynth (); + programsAreChunks (true); +#ifdef _8KLANG + setUniqueID ('8klg'); +#else + setUniqueID ('4klg'); +#endif + } + initProcess (); + suspend (); +} + +//----------------------------------------------------------------------------------------- +Go4kVSTi::~Go4kVSTi () +{ + delete[] m_chunkBuffer; +} + +//----------------------------------------------------------------------------------------- +void Go4kVSTi::setProgram (long program) +{ +} + +//----------------------------------------------------------------------------------------- +void Go4kVSTi::setProgramName (char *name) +{ +} + +//----------------------------------------------------------------------------------------- +void Go4kVSTi::getProgramName (char *name) +{ +} + +//----------------------------------------------------------------------------------------- +void Go4kVSTi::getParameterLabel (long index, char *label) +{ +} + +//----------------------------------------------------------------------------------------- +void Go4kVSTi::getParameterDisplay (long index, char *text) +{ +} + +//----------------------------------------------------------------------------------------- +void Go4kVSTi::getParameterName (long index, char *label) +{ +} + +//----------------------------------------------------------------------------------------- +void Go4kVSTi::setParameter (long index, float value) +{ +} + +//----------------------------------------------------------------------------------------- +float Go4kVSTi::getParameter (long index) +{ + return 0; +} + +//----------------------------------------------------------------------------------------- +bool Go4kVSTi::getOutputProperties (long index, VstPinProperties* properties) +{ + if (index < 2) + { + sprintf (properties->label, "Vstx %1d", index + 1); + properties->flags = kVstPinIsActive; + properties->flags |= kVstPinIsStereo; // test, make channel 1+2 stereo + return true; + } + return false; +} + +//----------------------------------------------------------------------------------------- +bool Go4kVSTi::getProgramNameIndexed (long category, long index, char* text) +{ + return false; +} + +//----------------------------------------------------------------------------------------- +bool Go4kVSTi::copyProgram (long destination) +{ + return false; +} + +//----------------------------------------------------------------------------------------- +bool Go4kVSTi::getEffectName (char* name) +{ +#ifdef _8KLANG + strcpy (name, "8klang"); +#else + strcpy (name, "4klang"); +#endif + return true; +} + +//----------------------------------------------------------------------------------------- +bool Go4kVSTi::getVendorString (char* text) +{ + strcpy (text, "Alcatraz"); + return true; +} + +//----------------------------------------------------------------------------------------- +bool Go4kVSTi::getProductString (char* text) +{ +#ifdef _8KLANG + strcpy (text, "8klang"); +#else + strcpy (text, "4klang"); +#endif + return true; +} + +//----------------------------------------------------------------------------------------- +long Go4kVSTi::canDo (char* text) +{ + if (!strcmp (text, "receiveVstEvents")) + return 1; + if (!strcmp (text, "receiveVstMidiEvent")) + return 1; + if (!strcmp (text, "receiveVstTimeInfo")) + return 1; + return -1; // explicitly can't do; 0 => don't know +} + +//----------------------------------------------------------------------------------------- +long Go4kVSTi::getChunk(void** data, bool isPreset) +{ + // serialize patch data into file, then load it back + char path[MAX_PATH]; + char filename[MAX_PATH]; + GetTempPath(MAX_PATH, path); + GetTempFileName(path, "4klang_", 0, filename); + Go4kVSTi_SavePatch(filename); + + HANDLE h = CreateFile(filename, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0); + if (h == INVALID_HANDLE_VALUE) + return 0; + + DWORD dummy; + DWORD size = GetFileSize(h, &dummy); + delete[] m_chunkBuffer; + m_chunkBuffer = new unsigned char[size]; + ReadFile(h, m_chunkBuffer, size, &dummy, 0); + CloseHandle(h); + DeleteFile(filename); + + if (dummy == size) + { + *data = m_chunkBuffer; + return size; + } + return 0; +} + +//----------------------------------------------------------------------------------------- +long Go4kVSTi::setChunk(void* data, long byteSize, bool isPreset) +{ + if (!data || !byteSize) return 0; + + // write chunk into file, then deserialize as patch data + char path[MAX_PATH]; + char filename[MAX_PATH]; + GetTempPath(MAX_PATH, path); + GetTempFileName(path, "4klang_", 0, filename); + + HANDLE h = CreateFile(filename, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); + if (h == INVALID_HANDLE_VALUE) + { + DWORD err = GetLastError(); + return 0; + } + DWORD dummy; + WriteFile(h, data, byteSize, &dummy, 0); + CloseHandle(h); + + if (dummy == byteSize) + { + Go4kVSTi_LoadPatch(filename); + } + DeleteFile(filename); + return 0; +} diff --git a/4klang_source/Go4kVSTi/win/Go4kVSTi.def b/src/vsti/Go4kVSTi.def similarity index 94% rename from 4klang_source/Go4kVSTi/win/Go4kVSTi.def rename to src/vsti/Go4kVSTi.def index adb0b60..c268398 100644 --- a/4klang_source/Go4kVSTi/win/Go4kVSTi.def +++ b/src/vsti/Go4kVSTi.def @@ -1,2 +1,2 @@ -LIBRARY 4klang -EXPORTS main +LIBRARY 4klang +EXPORTS main diff --git a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTi.h b/src/vsti/Go4kVSTi.h similarity index 97% rename from 4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTi.h rename to src/vsti/Go4kVSTi.h index 3894cce..7886a2b 100644 --- a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTi.h +++ b/src/vsti/Go4kVSTi.h @@ -1,55 +1,55 @@ -#ifndef __Go4kVSTi__ -#define __Go4kVSTi__ - -#include -#include - -#ifndef __AudioEffectX__ -#include "audioeffectx.h" -#endif - -//------------------------------------------------------------------------------------------ -class Go4kVSTi : public AudioEffectX -{ -public: - Go4kVSTi(audioMasterCallback audioMaster); - ~Go4kVSTi(); - - virtual void process(float **inputs, float **outputs, long sampleframes); - virtual void processReplacing(float **inputs, float **outputs, long sampleframes); - void processAnyhow(float **inputs, float **outputs, long sampleFrames); - virtual long processEvents(VstEvents* events); - - virtual void setProgram(long program); - virtual void setProgramName(char *name); - virtual void getProgramName(char *name); - virtual void setParameter(long index, float value); - virtual float getParameter(long index); - virtual void getParameterLabel(long index, char *label); - virtual void getParameterDisplay(long index, char *text); - virtual void getParameterName(long index, char *text); - virtual void setSampleRate(float sampleRate); - virtual void setBlockSize(long blockSize); - virtual void suspend(); - virtual void resume(); - virtual bool getOutputProperties (long index, VstPinProperties* properties); - virtual bool getProgramNameIndexed (long category, long index, char* text); - virtual bool copyProgram (long destination); - virtual bool getEffectName (char* name); - virtual bool getVendorString (char* text); - virtual bool getProductString (char* text); - virtual long getVendorVersion () {return 1;} - virtual long canDo (char* text); - virtual long getChunk(void** data, bool isPreset = false) override; - virtual long setChunk(void* data, long byteSize, bool isPreset = false) override; - -private: - void initProcess(); - void ApplyEvent(VstMidiEvent *event); - - std::vector m_currentEvents; - - unsigned char *m_chunkBuffer; -}; - -#endif +#ifndef __Go4kVSTi__ +#define __Go4kVSTi__ + +#include +#include + +#ifndef __AudioEffectX__ +#include "audioeffectx.h" +#endif + +//------------------------------------------------------------------------------------------ +class Go4kVSTi : public AudioEffectX +{ +public: + Go4kVSTi(audioMasterCallback audioMaster); + ~Go4kVSTi(); + + virtual void process(float **inputs, float **outputs, long sampleframes); + virtual void processReplacing(float **inputs, float **outputs, long sampleframes); + void processAnyhow(float **inputs, float **outputs, long sampleFrames); + virtual long processEvents(VstEvents* events); + + virtual void setProgram(long program); + virtual void setProgramName(char *name); + virtual void getProgramName(char *name); + virtual void setParameter(long index, float value); + virtual float getParameter(long index); + virtual void getParameterLabel(long index, char *label); + virtual void getParameterDisplay(long index, char *text); + virtual void getParameterName(long index, char *text); + virtual void setSampleRate(float sampleRate); + virtual void setBlockSize(long blockSize); + virtual void suspend(); + virtual void resume(); + virtual bool getOutputProperties (long index, VstPinProperties* properties); + virtual bool getProgramNameIndexed (long category, long index, char* text); + virtual bool copyProgram (long destination); + virtual bool getEffectName (char* name); + virtual bool getVendorString (char* text); + virtual bool getProductString (char* text); + virtual long getVendorVersion () {return 1;} + virtual long canDo (char* text); + virtual long getChunk(void** data, bool isPreset = false) override; + virtual long setChunk(void* data, long byteSize, bool isPreset = false) override; + +private: + void initProcess(); + void ApplyEvent(VstMidiEvent *event); + + std::vector m_currentEvents; + + unsigned char *m_chunkBuffer; +}; + +#endif diff --git a/4klang_source/Go4kVSTi/win/Go4kVSTi.rc b/src/vsti/Go4kVSTi.rc similarity index 98% rename from 4klang_source/Go4kVSTi/win/Go4kVSTi.rc rename to src/vsti/Go4kVSTi.rc index f9a306f..e9092ff 100644 --- a/4klang_source/Go4kVSTi/win/Go4kVSTi.rc +++ b/src/vsti/Go4kVSTi.rc @@ -1,1433 +1,1433 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "WinResrc.h" - -#define IDC_STATIC -1 - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// German (Germany) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) -LANGUAGE LANG_GERMAN, SUBLANG_GERMAN -#pragma code_page(1252) - -///////////////////////////////////////////////////////////////////////////// -// -// BINARY -// - -IDR_COMP_RES BINARY "nasmw.bin" -IDR_ASM_RES BINARY "4klang.bin" - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_GO4KVSTIDIALOG DIALOGEX 0, 0, 594, 341 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU -EXSTYLE WS_EX_ACCEPTFILES -CAPTION "Alcatraz - 4klang Synth Plugin - Version 3.2.2" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - PUSHBUTTON "Load Patch Data",IDC_LOAD_PATCH,13,13,70,14 - PUSHBUTTON "Save Patch Data",IDC_SAVE_PATCH,85,13,70,14 - PUSHBUTTON "Reset Patch Data",IDC_RESET_PATCH,157,13,70,14 - PUSHBUTTON "Load Instrument",IDC_LOAD_INSTRUMENT,13,31,70,14 - PUSHBUTTON "Save Instrument",IDC_SAVE_INSTRUMENT,85,31,70,14 - PUSHBUTTON "Reset Instrument",IDC_RESET_INSTRUMENT,157,31,70,14 - LTEXT "Instrument Name",IDC_STATIC,242,31,56,8 - LTEXT "Instrument",IDC_STATIC,242,17,36,8 - EDITTEXT IDC_INSTRUMENT_NAME,301,28,84,14,ES_AUTOHSCROLL - COMBOBOX IDC_INSTRUMENT,301,14,85,184,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - LTEXT "0",IDC_VOICECOUNT1,333,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT2,349,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT3,365,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT4,381,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT5,397,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT6,413,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT7,429,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT8,445,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT9,461,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT10,477,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT11,493,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT12,509,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT13,525,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT14,541,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT15,557,322,14,12,0,WS_EX_STATICEDGE - LTEXT "0",IDC_VOICECOUNT16,573,322,14,12,0,WS_EX_STATICEDGE - LTEXT "Activated Voices",IDC_STATIC,278,324,54,8 - PUSHBUTTON "Record",IDC_RECORD_BUTTON,449,10,62,14 - PUSHBUTTON "Stop",IDC_STOP_BUTTON,449,24,62,14,WS_DISABLED - CONTROL "Solo",IDC_SOLO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,398,24,29,10 - GROUPBOX "4k Export",IDC_STATIC,437,0,150,66 - COMBOBOX IDC_PATTERN_SIZE,479,38,33,94,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - GROUPBOX "Current Unit",IDC_MODULE_SETTINGS,277,61,310,202 - CONTROL "",IDC_MAINTAB,"SysTabControl32",0x0,7,53,266,281 - GROUPBOX "Load/Save",IDC_STATIC,7,3,225,47 - PUSHBUTTON "PANIC!",IDC_PANIC,278,288,309,29 - GROUPBOX "Instrument Properties",IDC_STATIC,237,3,195,57 - COMBOBOX IDC_POLYPHONY,333,270,71,97,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - LTEXT "Polyphony",IDC_STATIC,278,272,34,8 - LTEXT "Pattern",IDC_STATIC,450,41,25,8 - PUSHBUTTON "Reset",IDC_UNIT_RESET,303,72,50,14 - PUSHBUTTON "Copy",IDC_UNIT_COPY,355,72,50,14 - PUSHBUTTON "Paste",IDC_UNIT_PASTE,407,72,50,14 - PUSHBUTTON "Load",IDC_UNIT_LOAD,459,72,50,14 - PUSHBUTTON "Save",IDC_UNIT_SAVE,511,72,50,14 - CONTROL "Always on top",IDC_ALWAYSONTOP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,527,267,64,20 - CONTROL "Record Notes",IDC_NOTEVALUES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,516,32,57,10 - CONTROL "Undenormalize",IDC_UNDENORMALIZE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,516,14,61,10 - CONTROL "Clip Output",IDC_CLIPOUTPUT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,516,5,52,10 - CONTROL "Record Envs",IDC_ENVLEVELS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,516,23,57,10 - CONTROL "16Bit Output",IDC_16BIT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,516,41,57,10 - CTEXT "Static",IDC_ISTACK_VALID,11,321,241,9 - CTEXT "Static",IDC_GSTACK_VALID,11,321,241,9 - COMBOBOX IDC_PATTERN_QUANT,479,51,33,94,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - LTEXT "Quant.",IDC_STATIC,449,54,24,8 - COMBOBOX IDC_OBJFORMAT,515,51,66,72,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - LTEXT "Link To",IDC_STATIC,241,47,23,8 - COMBOBOX IDC_INSTRUMENTLINK,301,44,85,184,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - CONTROL "Stayalive Noise while Recording",IDC_RECORDBUSYSIGNAL, - "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,431,267,64,21 -END - -IDD_VCO DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Oscillator",IDC_STATIC,0,0,300,170 - PUSHBUTTON "Sine",IDC_VCO_SINE,6,27,50,14,WS_DISABLED - PUSHBUTTON "Tri/Saw",IDC_VCO_TRISAW,56,27,50,14 - PUSHBUTTON "Pulse",IDC_VCO_PULSE,106,27,50,14 - PUSHBUTTON "Noise",IDC_VCO_NOISE,156,27,50,14 - CONTROL "",IDC_VCO_GAIN,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,127,200,15 - CONTROL "",IDC_VCO_TRANSPOSE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,47,200,15 - CONTROL "",IDC_VCO_DETUNE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,63,200,15 - CONTROL "",IDC_VCO_PHASE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,79,200,15 - CONTROL "",IDC_VCO_COLOR,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,95,200,15 - LTEXT "Transpose",IDC_STATIC,4,51,34,8 - LTEXT "Phase",IDC_STATIC,4,82,20,8 - LTEXT "Detune",IDC_STATIC,4,67,24,8 - LTEXT "Color",IDC_STATIC,4,98,18,8 - LTEXT "Gain",IDC_STATIC,4,130,15,8 - CONTROL "",IDC_VCO_SHAPE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,111,200,15 - LTEXT "Shape",IDC_STATIC,4,114,21,8 - CTEXT " ",IDC_VCO_TRANSPOSE_VAL,242,48,48,12,SS_SUNKEN - CTEXT " ",IDC_VCO_DETUNE_VAL,242,64,48,12,SS_SUNKEN - CTEXT " ",IDC_VCO_PHASE_VAL,242,80,48,12,SS_SUNKEN - CTEXT " ",IDC_VCO_COLOR_VAL,242,96,48,12,SS_SUNKEN - CTEXT " ",IDC_VCO_SHAPE_VAL,242,112,48,12,SS_SUNKEN - CTEXT " ",IDC_VCO_GAIN_VAL,242,128,48,12,SS_SUNKEN - CONTROL "LFO",IDC_VCO_LFO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,262,29,29,10 - CONTROL "Stereo",IDC_VCO_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,262,16,34,10 - PUSHBUTTON "Gate",IDC_VCO_GATE,206,27,50,14 - CONTROL " ",IDC_VCO_GATE1,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,43,147,8,10 - CONTROL " ",IDC_VCO_GATE2,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,55,147,8,10 - CONTROL " ",IDC_VCO_GATE3,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,67,147,8,10 - CONTROL " ",IDC_VCO_GATE4,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,79,147,8,10 - CONTROL " ",IDC_VCO_GATE5,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,91,147,8,10 - CONTROL " ",IDC_VCO_GATE6,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,103,147,8,10 - CONTROL " ",IDC_VCO_GATE7,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,115,147,8,10 - CONTROL " ",IDC_VCO_GATE8,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,127,147,8,10 - CONTROL " ",IDC_VCO_GATE9,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,139,147,8,10 - CONTROL " ",IDC_VCO_GATE10,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,151,147,8,10 - CONTROL " ",IDC_VCO_GATE11,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,163,147,8,10 - CONTROL " ",IDC_VCO_GATE12,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,175,147,8,10 - CONTROL " ",IDC_VCO_GATE13,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,187,147,8,10 - CONTROL " ",IDC_VCO_GATE14,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,199,147,8,10 - CONTROL " ",IDC_VCO_GATE15,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,211,147,8,10 - CONTROL " ",IDC_VCO_GATE16,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,223,147,8,10 - LTEXT "Gate",IDC_STATIC,4,147,16,8 -END - -IDD_VCF DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Filter",IDC_STATIC,0,0,299,170 - PUSHBUTTON "Low",IDC_VCF_LOW,5,59,42,14,WS_DISABLED - PUSHBUTTON "High",IDC_VCF_HIGH,47,59,41,14 - PUSHBUTTON "Band",IDC_VCF_BAND,89,59,41,14 - PUSHBUTTON "Notch",IDC_VCF_NOTCH,131,59,41,14 - PUSHBUTTON "Peak",IDC_VCF_PEAK,173,59,41,14 - PUSHBUTTON "All",IDC_VCF_ALL,215,59,41,14 - CONTROL "Stereo",IDC_VCF_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,258,62,37,10 - CONTROL "",IDC_VCF_FREQUENCY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,79,200,15 - CONTROL "",IDC_VCF_RESONANCE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,95,200,15 - LTEXT "Frequency",IDC_STATIC,4,82,35,8 - LTEXT "Resonance",IDC_STATIC,4,99,36,8 - CTEXT " ",IDC_VCF_FREQUENCY_VAL,242,80,48,12,SS_SUNKEN - CTEXT " ",IDC_VCF_RESONANCE_VAL,242,96,48,12,SS_SUNKEN -END - -IDD_ENV DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Envelope",IDC_STATIC,0,0,300,170 - CONTROL "",IDC_ENV_GAIN,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,109,200,15 - CONTROL "",IDC_ENV_ATTACK,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,46,200,15 - CONTROL "",IDC_ENV_DECAY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,61,200,15 - CONTROL "",IDC_ENV_SUSTAIN,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,77,200,15 - CONTROL "",IDC_ENV_RELEASE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,93,200,15 - LTEXT "Attack",IDC_STATIC,4,49,22,8 - LTEXT "Sustain",IDC_STATIC,4,80,24,8 - LTEXT "Decay",IDC_STATIC,4,65,21,8 - LTEXT "Release",IDC_STATIC,4,96,26,8 - LTEXT "Gain",IDC_STATIC,4,112,15,8 - CTEXT " ",IDC_ENV_ATTACK_VAL,242,46,48,12,SS_SUNKEN - CTEXT " ",IDC_ENV_DECAY_VAL,242,62,48,12,SS_SUNKEN - CTEXT " ",IDC_ENV_SUSTAIN_VAL,242,78,48,12,SS_SUNKEN - CTEXT " ",IDC_ENV_RELEASE_VAL,242,94,48,12,SS_SUNKEN - CTEXT " ",IDC_ENV_GAIN_VAL,242,110,48,12,SS_SUNKEN -END - -IDD_DLL DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Delay/Reverb",IDC_STATIC,0,0,300,170 - CONTROL "",IDC_DLL_DRY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,73,200,15 - CONTROL "",IDC_DLL_PREGAIN,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,42,200,15 - CONTROL "",IDC_DLL_FEEDBACK,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,57,200,15 - LTEXT "Pregain",IDC_STATIC,4,45,25,8 - LTEXT "Feedback",IDC_STATIC,4,61,32,8 - LTEXT "Dry",IDC_STATIC,4,76,12,8 - CTEXT " ",IDC_DLL_PREGAIN_VAL,242,42,48,12,SS_SUNKEN - CTEXT " ",IDC_DLL_FEEDBACK_VAL,242,58,48,12,SS_SUNKEN - CTEXT " ",IDC_DLL_DRY_VAL,242,74,48,12,SS_SUNKEN - CONTROL "",IDC_DLL_DAMP,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,90,200,15 - LTEXT "Damp",IDC_STATIC,4,93,19,8 - CTEXT " ",IDC_DLL_DAMP_VAL,242,90,48,12,SS_SUNKEN - PUSHBUTTON "Delay",IDC_DLL_DELAY,134,13,50,14 - PUSHBUTTON "Reverb",IDC_DLL_REVERB,184,13,50,14 - CONTROL "",IDC_DLL_DTIME,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,106,200,15 - LTEXT "Delay",IDC_STATIC,4,110,19,8 - PUSHBUTTON "BPM",IDC_DLL_BPMSYNC,47,15,40,10 - PUSHBUTTON "Note",IDC_DLL_NOTESYNC,87,15,40,10 - CTEXT " ",IDC_DLL_DTIME_VAL,242,106,48,12,SS_SUNKEN - CONTROL "Left Reverb",IDC_DLL_LEFTREVERB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,241,16,54,10 - PUSHBUTTON "No Sync",IDC_DLL_NOSYNC,7,15,40,10 - CONTROL "",IDC_DLL_FREQUENCY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,122,200,15 - LTEXT "Frequency",IDC_STATIC,4,127,35,8 - CTEXT " ",IDC_DLL_FREQUENCY_VAL,242,122,48,12,SS_SUNKEN - CONTROL "",IDC_DLL_DEPTH,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,138,200,15 - LTEXT "Depth",IDC_STATIC,4,143,20,8 - CTEXT " ",IDC_DLL_DEPTH_VAL,242,138,48,12,SS_SUNKEN -END - -IDD_DST DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Distortion",IDC_STATIC,0,0,299,170 - CONTROL "",IDC_DST_DRIVE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,69,200,15 - LTEXT "Drive",IDC_STATIC,4,73,18,8 - LTEXT "S&&H",IDC_STATIC,4,89,14,8 - CONTROL "",IDC_DST_SNH,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,85,200,15 - CTEXT " ",IDC_DST_DRIVE_VAL,242,70,48,12,SS_SUNKEN - CTEXT " ",IDC_DST_SNH_VAL,242,86,48,12,SS_SUNKEN - CONTROL "Stereo",IDC_DST_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,126,105,37,10 -END - -IDD_INSTRUMENT_STACK DIALOGEX 0, 0, 247, 640 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPCHILDREN | WS_SYSMENU -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - PUSHBUTTON " ",IDC_ISTACK_UNIT1,15,0,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP1,165,0,25,10,NOT WS_VISIBLE - PUSHBUTTON "Down",IDC_ISTACK_DOWN1,191,0,25,10,NOT WS_VISIBLE - CTEXT "1",IDC_ISTACK_SIGNALCOUNT1,225,0,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT2,15,10,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP2,165,10,25,10,NOT WS_VISIBLE - PUSHBUTTON "Down",IDC_ISTACK_DOWN2,191,10,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT2,225,10,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT3,15,20,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP3,165,20,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN3,191,20,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT3,225,20,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT4,15,30,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP4,165,30,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN4,191,30,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT4,225,30,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT5,15,40,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP5,165,40,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN5,191,40,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT5,225,40,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT6,15,50,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP6,165,50,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN6,191,50,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT6,225,50,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT7,15,60,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP7,165,60,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN7,191,60,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT7,225,60,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT8,15,70,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP8,165,70,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN8,191,70,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT8,225,70,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT9,15,80,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP9,165,80,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN9,191,80,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT9,225,80,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT10,15,90,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP10,165,90,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN10,191,90,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT10,225,90,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT11,15,100,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP11,165,100,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN11,191,100,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT11,225,100,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT12,15,110,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP12,165,110,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN12,191,110,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT12,225,110,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT13,15,120,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP13,165,120,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN13,191,120,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT13,225,120,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT14,15,130,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP14,165,130,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN14,191,130,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT14,225,130,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT15,15,140,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP15,165,140,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN15,191,140,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT15,225,140,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT16,15,150,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP16,165,150,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN16,191,150,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT16,225,150,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT17,15,160,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP17,165,160,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN17,191,160,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT17,225,160,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT18,15,170,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP18,165,170,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN18,191,170,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT18,225,170,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT19,15,180,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP19,165,180,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN19,191,180,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT19,225,180,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT20,15,190,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP20,165,190,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN20,191,190,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT20,225,190,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT21,15,200,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP21,165,200,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN21,191,200,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT21,225,200,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT22,15,210,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP22,165,210,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN22,191,210,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT22,225,210,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT23,15,220,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP23,165,220,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN23,191,220,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT23,225,220,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT24,15,230,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP24,165,230,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN24,191,230,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT24,225,230,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT25,15,240,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP25,165,240,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN25,191,240,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT25,225,240,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT26,15,250,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP26,165,250,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN26,191,250,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT26,225,250,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT27,15,260,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP27,165,260,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN27,191,260,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT27,225,260,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT28,15,270,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP28,165,270,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN28,191,270,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT28,225,270,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT29,15,280,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP29,165,280,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN29,191,280,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT29,225,280,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT30,15,290,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP30,165,290,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN30,191,290,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT30,225,290,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT31,15,300,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP31,165,300,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN31,191,300,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT31,225,300,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK_UNIT32,15,310,83,10 - PUSHBUTTON "Up",IDC_ISTACK_UP32,165,310,25,10 - PUSHBUTTON "Down",IDC_ISTACK_DOWN32,191,310,25,10 - CTEXT "1",IDC_ISTACK_SIGNALCOUNT32,225,310,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT1,15,320,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP1,165,320,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN1,191,320,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT1,225,320,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT2,15,330,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP2,165,330,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN2,191,330,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT2,225,330,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT3,15,340,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP3,165,340,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN3,191,340,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT3,225,340,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT4,15,350,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP4,165,350,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN4,191,350,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT4,225,350,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT5,15,360,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP5,165,360,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN5,191,360,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT5,225,360,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT6,15,370,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP6,165,370,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN6,191,370,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT6,225,370,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT7,15,380,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP7,165,380,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN7,191,380,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT7,225,380,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT8,15,390,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP8,165,390,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN8,191,390,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT8,225,390,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT9,15,400,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP9,165,400,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN9,191,400,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT9,225,400,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT10,15,410,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP10,165,410,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN10,191,410,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT10,225,410,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT11,15,420,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP11,165,420,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN11,191,420,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT11,225,420,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT12,15,430,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP12,165,430,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN12,191,430,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT12,225,430,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT13,15,440,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP13,165,440,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN13,191,440,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT13,225,440,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT14,15,450,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP14,165,450,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN14,191,450,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT14,225,450,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT15,15,460,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP15,165,460,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN15,191,460,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT15,225,460,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT16,15,470,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP16,165,470,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN16,191,470,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT16,225,470,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT17,15,480,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP17,165,480,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN17,191,480,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT17,225,480,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT18,15,490,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP18,165,490,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN18,191,490,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT18,225,490,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT19,15,500,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP19,165,500,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN19,191,500,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT19,225,500,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT20,15,510,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP20,165,510,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN20,191,510,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT20,225,510,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT21,15,520,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP21,165,520,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN21,191,520,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT21,225,520,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT22,15,530,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP22,165,530,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN22,191,530,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT22,225,530,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT23,15,540,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP23,165,540,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN23,191,540,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT23,225,540,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT24,15,550,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP24,165,550,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN24,191,550,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT24,225,550,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT25,15,560,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP25,165,560,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN25,191,560,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT25,225,560,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT26,15,570,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP26,165,570,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN26,191,570,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT26,225,570,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT27,15,580,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP27,165,580,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN27,191,580,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT27,225,580,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT28,15,590,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP28,165,590,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN28,191,590,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT28,225,590,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT29,15,600,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP29,165,600,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN29,191,600,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT29,225,600,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT30,15,610,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP30,165,610,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN30,191,610,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT30,225,610,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT31,15,620,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP31,165,620,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN31,191,620,25,10 - CTEXT "1",IDC_ISTACK__SIGNALCOUNT31,225,620,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_ISTACK__UNIT32,15,630,83,10 - PUSHBUTTON "Up",IDC_ISTACK__UP32,165,630,25,10 - PUSHBUTTON "Down",IDC_ISTACK__DOWN32,191,630,25,10,NOT WS_VISIBLE - CTEXT "1",IDC_ISTACK__SIGNALCOUNT32,225,630,16,10,SS_SUNKEN - PUSHBUTTON "Set",IDC_ISTACK_SET1,106,0,25,10,NOT WS_VISIBLE - PUSHBUTTON "Clear",IDC_ISTACK_RESET1,132,0,25,10,NOT WS_VISIBLE - PUSHBUTTON "Set",IDC_ISTACK_SET2,106,10,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET2,132,10,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET3,106,20,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET3,132,20,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET4,106,30,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET4,132,30,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET5,106,40,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET5,132,40,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET6,106,50,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET6,132,50,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET7,106,60,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET7,132,60,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET8,106,70,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET8,132,70,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET9,106,80,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET9,132,80,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET10,106,90,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET10,132,90,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET11,106,100,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET11,132,100,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET12,106,110,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET12,132,110,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET13,106,120,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET13,132,120,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET14,106,130,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET14,132,130,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET15,106,140,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET15,132,140,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET16,106,150,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET16,132,150,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET17,106,160,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET17,132,160,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET18,106,170,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET18,132,170,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET19,106,180,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET19,132,180,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET20,106,190,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET20,132,190,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET21,106,200,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET21,132,200,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET22,106,210,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET22,132,210,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET23,106,220,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET23,132,220,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET24,106,230,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET24,132,230,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET25,106,240,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET25,132,240,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET26,106,250,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET26,132,250,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET27,106,260,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET27,132,260,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET28,106,270,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET28,132,270,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET29,106,280,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET29,132,280,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET30,106,290,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET30,132,290,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET31,106,300,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET31,132,300,25,10 - PUSHBUTTON "Set",IDC_ISTACK_SET32,106,310,25,10 - PUSHBUTTON "Clear",IDC_ISTACK_RESET32,132,310,25,10 - PUSHBUTTON "Setl",IDC_ISTACK__SET1,106,320,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET1,132,320,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET2,106,330,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET2,132,330,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET3,106,340,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET3,132,340,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET4,106,350,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET4,132,350,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET5,106,360,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET5,132,360,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET6,106,370,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET6,132,370,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET7,106,380,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET7,132,380,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET8,106,390,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET8,132,390,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET9,106,400,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET9,132,400,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET10,106,410,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET10,132,410,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET11,106,420,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET11,132,420,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET12,106,430,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET12,132,430,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET13,106,440,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET13,132,440,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET14,106,450,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET14,132,450,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET15,106,460,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET15,132,460,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET16,106,470,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET16,132,470,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET17,106,480,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET17,132,480,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET18,106,490,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET18,132,490,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET19,106,500,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET19,132,500,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET20,106,510,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET20,132,510,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET21,106,520,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET21,132,520,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET22,106,530,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET22,132,530,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET23,106,540,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET23,132,540,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET24,106,550,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET24,132,550,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET25,106,560,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET25,132,560,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET26,106,570,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET26,132,570,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET27,106,580,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET27,132,580,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET28,106,590,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET28,132,590,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET29,106,600,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET29,132,600,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET30,106,610,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET30,132,610,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET31,106,620,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET31,132,620,25,10 - PUSHBUTTON "Set",IDC_ISTACK__SET32,106,630,25,10 - PUSHBUTTON "Clear",IDC_ISTACK__RESET32,132,630,25,10 - LTEXT "1:",IDC_STATIC,2,1,10,8 - LTEXT "2:",IDC_STATIC,2,11,10,8 - LTEXT "3:",IDC_STATIC,2,21,10,8 - LTEXT "4:",IDC_STATIC,2,31,10,8 - LTEXT "5:",IDC_STATIC,2,41,10,8 - LTEXT "6:",IDC_STATIC,2,51,10,8 - LTEXT "7:",IDC_STATIC,2,61,10,8 - LTEXT "8:",IDC_STATIC,2,71,10,8 - LTEXT "9:",IDC_STATIC,2,81,10,8 - LTEXT "10:",IDC_STATIC,2,91,10,8 - LTEXT "11:",IDC_STATIC,2,101,10,8 - LTEXT "12:",IDC_STATIC,2,111,10,8 - LTEXT "13:",IDC_STATIC,2,121,10,8 - LTEXT "14:",IDC_STATIC,2,131,10,8 - LTEXT "15:",IDC_STATIC,2,141,10,8 - LTEXT "16:",IDC_STATIC,2,151,10,8 - LTEXT "17:",IDC_STATIC,2,161,10,8 - LTEXT "18:",IDC_STATIC,2,171,10,8 - LTEXT "19:",IDC_STATIC,2,181,10,8 - LTEXT "20:",IDC_STATIC,2,191,10,8 - LTEXT "21:",IDC_STATIC,2,201,10,8 - LTEXT "22:",IDC_STATIC,2,211,10,8 - LTEXT "23:",IDC_STATIC,2,221,10,8 - LTEXT "24:",IDC_STATIC,2,231,10,8 - LTEXT "25:",IDC_STATIC,2,241,10,8 - LTEXT "26:",IDC_STATIC,2,251,10,8 - LTEXT "27:",IDC_STATIC,2,261,10,8 - LTEXT "28:",IDC_STATIC,2,271,10,8 - LTEXT "29:",IDC_STATIC,2,281,10,8 - LTEXT "30:",IDC_STATIC,2,291,10,8 - LTEXT "31:",IDC_STATIC,2,301,10,8 - LTEXT "32:",IDC_STATIC,2,311,10,8 - LTEXT "33:",IDC_STATIC,2,321,10,8 - LTEXT "34:",IDC_STATIC,2,331,10,8 - LTEXT "35:",IDC_STATIC,2,341,10,8 - LTEXT "36:",IDC_STATIC,2,351,10,8 - LTEXT "37:",IDC_STATIC,2,361,10,8 - LTEXT "38:",IDC_STATIC,2,371,10,8 - LTEXT "39:",IDC_STATIC,2,381,10,8 - LTEXT "40:",IDC_STATIC,2,391,10,8 - LTEXT "41:",IDC_STATIC,2,401,10,8 - LTEXT "42:",IDC_STATIC,2,411,10,8 - LTEXT "43:",IDC_STATIC,2,421,10,8 - LTEXT "44:",IDC_STATIC,2,431,10,8 - LTEXT "45:",IDC_STATIC,2,441,10,8 - LTEXT "46:",IDC_STATIC,2,451,10,8 - LTEXT "47:",IDC_STATIC,2,461,10,8 - LTEXT "48:",IDC_STATIC,2,471,10,8 - LTEXT "49:",IDC_STATIC,2,481,10,8 - LTEXT "50:",IDC_STATIC,2,491,10,8 - LTEXT "51:",IDC_STATIC,2,501,10,8 - LTEXT "52:",IDC_STATIC,2,511,10,8 - LTEXT "53:",IDC_STATIC,2,521,10,8 - LTEXT "54:",IDC_STATIC,2,531,10,8 - LTEXT "55:",IDC_STATIC,2,541,10,8 - LTEXT "56:",IDC_STATIC,2,551,10,8 - LTEXT "57:",IDC_STATIC,2,561,10,8 - LTEXT "58:",IDC_STATIC,2,571,10,8 - LTEXT "59:",IDC_STATIC,2,581,10,8 - LTEXT "60:",IDC_STATIC,2,591,10,8 - LTEXT "61:",IDC_STATIC,2,601,10,8 - LTEXT "62:",IDC_STATIC,2,611,10,8 - LTEXT "63:",IDC_STATIC,2,621,10,8 - LTEXT "64:",IDC_STATIC,2,631,10,8 -END - -IDD_FOP DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Floating Point Operation",IDC_STATIC,0,0,299,170 - PUSHBUTTON "Load Note",IDC_FOP_LOADNOTE,3,11,42,14 - PUSHBUTTON "PUSH",IDC_FOP_PUSH,3,27,42,14 - PUSHBUTTON "POP",IDC_FOP_POP,3,42,42,14 - PUSHBUTTON "XCH",IDC_FOP_XCH,3,58,42,14 - PUSHBUTTON "+",IDC_FOP_ADD,3,74,42,14 - PUSHBUTTON "+/POP",IDC_FOP_ADDP,3,90,42,14 - PUSHBUTTON "*",IDC_FOP_MUL,3,106,42,14 - PUSHBUTTON "*/POP",IDC_FOP_MULP,3,122,42,14 - PUSHBUTTON "2+/POP",IDC_FOP_ADDP2,3,138,42,14 - PUSHBUTTON "2*/POP",IDC_FOP_MULP2,3,154,42,14 - LTEXT "IN: a b c d -> OUT: note a b c d",IDC_STATIC,50,13,233,8 - LTEXT "IN: a b c d -> OUT: a a b c d",IDC_STATIC,50,29,232,8 - LTEXT "IN: a b c d -> OUT: b c d",IDC_STATIC,50,44,196,8 - LTEXT "IN: a b c d -> OUT: b a c d",IDC_STATIC,50,60,214,8 - LTEXT "IN: a b c d -> OUT: a+b b c d",IDC_STATIC,50,76,216,8 - LTEXT "IN: a b c d -> OUT: a+b c d",IDC_STATIC,50,92,198,8 - LTEXT "IN: a b c d -> OUT: a*b b c d",IDC_STATIC,50,108,216,8 - LTEXT "IN: a b c d -> OUT: a*b c d",IDC_STATIC,50,124,198,8 - LTEXT "IN: a b c d -> OUT: a+c b+d",IDC_STATIC,50,141,193,8 - LTEXT "IN: a b c d -> OUT: a*c b*d",IDC_STATIC,50,156,193,8 - GROUPBOX "",IDC_STATIC,0,133,299,20 - GROUPBOX "",IDC_STATIC,0,101,299,20 - GROUPBOX "",IDC_STATIC,1,69,299,20 - GROUPBOX "",IDC_STATIC,0,37,299,20 - GROUPBOX "",IDC_STATIC,0,6,299,20 -END - -IDD_FST DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Store Signal",IDC_STATIC,0,0,299,170 - CONTROL "",IDC_FST_AMOUNT,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,36,101,200,15 - LTEXT "Amount",IDC_STATIC,3,104,26,8 - CTEXT " ",IDC_FST_AMOUNT_VAL,242,102,48,12,SS_SUNKEN - COMBOBOX IDC_FST_DESTINATION_INSTRUMENT,43,53,249,177,CBS_DROPDOWN | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP - LTEXT "Stack",IDC_STATIC,5,55,18,8 - COMBOBOX IDC_FST_DESTINATION_UNIT,43,69,249,157,CBS_DROPDOWN | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP - LTEXT "Unit",IDC_STATIC,6,71,14,8 - COMBOBOX IDC_FST_DESTINATION_SLOT,43,85,249,110,CBS_DROPDOWN | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP - LTEXT "Slot",IDC_STATIC,5,87,13,8 - PUSHBUTTON "Set",IDC_FST_SET,56,122,50,14 - PUSHBUTTON "+",IDC_FST_ADD,106,122,50,14 - CONTROL "Pop",IDC_FST_POP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,212,124,28,10 - PUSHBUTTON "*",IDC_FST_MUL,156,122,50,14,NOT WS_VISIBLE -END - -IDD_NONE DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "",-1,0,0,299,170 - LTEXT "Nothing selected",-1,123,80,54,8 -END - -IDD_OUT DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Instrument Output",IDC_STATIC,0,0,299,170 - CONTROL "",IDC_OUT_GAIN,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,37,70,200,15 - LTEXT "Gain",IDC_STATIC,6,73,15,8 - LTEXT "AUX Send",IDC_STATIC,6,89,32,8 - CONTROL "",IDC_OUT_AUXSEND,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,37,85,200,15 - CTEXT " ",IDC_OUT_GAIN_VAL,242,70,48,12,SS_SUNKEN - CTEXT " ",IDC_OUT_AUXSEND_VAL,242,86,48,12,SS_SUNKEN -END - -IDD_GLOBAL_STACK DIALOGEX 0, 0, 247, 640 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPCHILDREN -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - PUSHBUTTON " ",IDC_GSTACK_UNIT1,15,0,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP1,165,0,25,10,NOT WS_VISIBLE - PUSHBUTTON "Down",IDC_GSTACK_DOWN1,191,0,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT1,225,0,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT2,15,10,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP2,165,10,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN2,191,10,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT2,225,10,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT3,15,20,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP3,165,20,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN3,191,20,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT3,225,20,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT4,15,30,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP4,165,30,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN4,191,30,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT4,225,30,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT5,15,40,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP5,165,40,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN5,191,40,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT5,225,40,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT6,15,50,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP6,165,50,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN6,191,50,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT6,225,50,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT7,15,60,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP7,165,60,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN7,191,60,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT7,225,60,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT8,15,70,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP8,165,70,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN8,191,70,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT8,225,70,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT9,15,80,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP9,165,80,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN9,191,80,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT9,225,80,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT10,15,90,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP10,165,90,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN10,191,90,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT10,225,90,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT11,15,100,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP11,165,100,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN11,191,100,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT11,225,100,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT12,15,110,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP12,165,110,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN12,191,110,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT12,225,110,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT13,15,120,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP13,165,120,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN13,191,120,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT13,225,120,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT14,15,130,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP14,165,130,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN14,191,130,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT14,225,130,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT15,15,140,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP15,165,140,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN15,191,140,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT15,225,140,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT16,15,150,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP16,165,150,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN16,191,150,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT16,225,150,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT17,15,160,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP17,165,160,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN17,191,160,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT17,225,160,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT18,15,170,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP18,165,170,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN18,191,170,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT18,225,170,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT19,15,180,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP19,165,180,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN19,191,180,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT19,225,180,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT20,15,190,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP20,165,190,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN20,191,190,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT20,225,190,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT21,15,200,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP21,165,200,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN21,191,200,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT21,225,200,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT22,15,210,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP22,165,210,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN22,191,210,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT22,225,210,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT23,15,220,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP23,165,220,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN23,191,220,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT23,225,220,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT24,15,230,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP24,165,230,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN24,191,230,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT24,225,230,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT25,15,240,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP25,165,240,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN25,191,240,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT25,225,240,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT26,15,250,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP26,165,250,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN26,191,250,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT26,225,250,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT27,15,260,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP27,165,260,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN27,191,260,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT27,225,260,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT28,15,270,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP28,165,270,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN28,191,270,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT28,225,270,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT29,15,280,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP29,165,280,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN29,191,280,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT29,225,280,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT30,15,290,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP30,165,290,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN30,191,290,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT30,225,290,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT31,15,300,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP31,165,300,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN31,191,300,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT31,225,300,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK_UNIT32,15,310,83,10 - PUSHBUTTON "Up",IDC_GSTACK_UP32,165,310,25,10 - PUSHBUTTON "Down",IDC_GSTACK_DOWN32,191,310,25,10 - CTEXT "1",IDC_GSTACK_SIGNALCOUNT32,225,310,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT1,15,320,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP1,165,320,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN1,191,320,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT1,225,320,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT2,15,330,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP2,165,330,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN2,191,330,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT2,225,330,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT3,15,340,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP3,165,340,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN3,191,340,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT3,225,340,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT4,15,350,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP4,165,350,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN4,191,350,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT4,225,350,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT5,15,360,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP5,165,360,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN5,191,360,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT5,225,360,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT6,15,370,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP6,165,370,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN6,191,370,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT6,225,370,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT7,15,380,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP7,165,380,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN7,191,380,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT7,225,380,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT8,15,390,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP8,165,390,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN8,191,390,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT8,225,390,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT9,15,400,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP9,165,400,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN9,191,400,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT9,225,400,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT10,15,410,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP10,165,410,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN10,191,410,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT10,225,410,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT11,15,420,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP11,165,420,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN11,191,420,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT11,225,420,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT12,15,430,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP12,165,430,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN12,191,430,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT12,225,430,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT13,15,440,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP13,165,440,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN13,191,440,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT13,225,440,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT14,15,450,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP14,165,450,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN14,191,450,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT14,225,450,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT15,15,460,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP15,165,460,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN15,191,460,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT15,225,460,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT16,15,470,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP16,165,470,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN16,191,470,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT16,225,470,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT17,15,480,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP17,165,480,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN17,191,480,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT17,225,480,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT18,15,490,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP18,165,490,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN18,191,490,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT18,225,490,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT19,15,500,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP19,165,500,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN19,191,500,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT19,225,500,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT20,15,510,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP20,165,510,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN20,191,510,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT20,225,510,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT21,15,520,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP21,165,520,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN21,191,520,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT21,225,520,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT22,15,530,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP22,165,530,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN22,191,530,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT22,225,530,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT23,15,540,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP23,165,540,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN23,191,540,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT23,225,540,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT24,15,550,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP24,165,550,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN24,191,550,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT24,225,550,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT25,15,560,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP25,165,560,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN25,191,560,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT25,225,560,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT26,15,570,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP26,165,570,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN26,191,570,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT26,225,570,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT27,15,580,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP27,165,580,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN27,191,580,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT27,225,580,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT28,15,590,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP28,165,590,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN28,191,590,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT28,225,590,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT29,15,600,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP29,165,600,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN29,191,600,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT29,225,600,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT30,15,610,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP30,165,610,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN30,191,610,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT30,225,610,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT31,15,620,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP31,165,620,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN31,191,620,25,10 - CTEXT "1",IDC_GSTACK__SIGNALCOUNT31,225,620,16,10,SS_SUNKEN - PUSHBUTTON " ",IDC_GSTACK__UNIT32,15,630,83,10 - PUSHBUTTON "Up",IDC_GSTACK__UP32,165,630,25,10 - PUSHBUTTON "Down",IDC_GSTACK__DOWN32,191,630,25,10,NOT WS_VISIBLE - CTEXT "1",IDC_GSTACK__SIGNALCOUNT32,225,630,16,10,SS_SUNKEN - PUSHBUTTON "Set",IDC_GSTACK_SET1,106,0,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET1,132,0,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET2,106,10,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET2,132,10,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET3,106,20,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET3,132,20,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET4,106,30,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET4,132,30,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET5,106,40,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET5,132,40,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET6,106,50,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET6,132,50,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET7,106,60,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET7,132,60,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET8,106,70,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET8,132,70,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET9,106,80,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET9,132,80,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET10,106,90,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET10,132,90,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET11,106,100,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET11,132,100,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET12,106,110,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET12,132,110,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET13,106,120,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET13,132,120,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET14,106,130,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET14,132,130,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET15,106,140,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET15,132,140,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET16,106,150,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET16,132,150,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET17,106,160,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET17,132,160,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET18,106,170,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET18,132,170,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET19,106,180,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET19,132,180,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET20,106,190,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET20,132,190,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET21,106,200,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET21,132,200,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET22,106,210,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET22,132,210,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET23,106,220,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET23,132,220,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET24,106,230,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET24,132,230,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET25,106,240,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET25,132,240,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET26,106,250,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET26,132,250,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET27,106,260,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET27,132,260,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET28,106,270,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET28,132,270,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET29,106,280,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET29,132,280,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET30,106,290,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET30,132,290,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET31,106,300,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET31,132,300,25,10 - PUSHBUTTON "Set",IDC_GSTACK_SET32,106,310,25,10 - PUSHBUTTON "Clear",IDC_GSTACK_RESET32,132,310,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET1,106,320,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET1,132,320,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET2,106,330,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET2,132,330,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET3,106,340,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET3,132,340,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET4,106,350,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET4,132,350,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET5,106,360,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET5,132,360,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET6,106,370,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET6,132,370,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET7,106,380,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET7,132,380,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET8,106,390,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET8,132,390,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET9,106,400,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET9,132,400,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET10,106,410,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET10,132,410,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET11,106,420,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET11,132,420,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET12,106,430,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET12,132,430,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET13,106,440,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET13,132,440,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET14,106,450,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET14,132,450,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET15,106,460,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET15,132,460,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET16,106,470,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET16,132,470,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET17,106,480,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET17,132,480,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET18,106,490,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET18,132,490,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET19,106,500,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET19,132,500,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET20,106,510,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET20,132,510,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET21,106,520,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET21,132,520,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET22,106,530,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET22,132,530,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET23,106,540,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET23,132,540,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET24,106,550,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET24,132,550,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET25,106,560,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET25,132,560,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET26,106,570,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET26,132,570,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET27,106,580,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET27,132,580,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET28,106,590,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET28,132,590,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET29,106,600,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET29,132,600,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET30,106,610,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET30,132,610,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET31,106,620,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET31,132,620,25,10 - PUSHBUTTON "Set",IDC_GSTACK__SET32,106,630,25,10 - PUSHBUTTON "Clear",IDC_GSTACK__RESET32,132,630,25,10 - LTEXT "1:",IDC_STATIC,2,1,10,8 - LTEXT "2:",IDC_STATIC,2,11,10,8 - LTEXT "3:",IDC_STATIC,2,21,10,8 - LTEXT "4:",IDC_STATIC,2,31,10,8 - LTEXT "5:",IDC_STATIC,2,41,10,8 - LTEXT "6:",IDC_STATIC,2,51,10,8 - LTEXT "7:",IDC_STATIC,2,61,10,8 - LTEXT "8:",IDC_STATIC,2,71,10,8 - LTEXT "9:",IDC_STATIC,2,81,10,8 - LTEXT "10:",IDC_STATIC,2,91,10,8 - LTEXT "11:",IDC_STATIC,2,101,10,8 - LTEXT "12:",IDC_STATIC,2,111,10,8 - LTEXT "13:",IDC_STATIC,2,121,10,8 - LTEXT "14:",IDC_STATIC,2,131,10,8 - LTEXT "15:",IDC_STATIC,2,141,10,8 - LTEXT "16:",IDC_STATIC,2,151,10,8 - LTEXT "17:",IDC_STATIC,2,161,10,8 - LTEXT "18:",IDC_STATIC,2,171,10,8 - LTEXT "19:",IDC_STATIC,2,181,10,8 - LTEXT "20:",IDC_STATIC,2,191,10,8 - LTEXT "21:",IDC_STATIC,2,201,10,8 - LTEXT "22:",IDC_STATIC,2,211,10,8 - LTEXT "23:",IDC_STATIC,2,221,10,8 - LTEXT "24:",IDC_STATIC,2,231,10,8 - LTEXT "25:",IDC_STATIC,2,241,10,8 - LTEXT "26:",IDC_STATIC,2,251,10,8 - LTEXT "27:",IDC_STATIC,2,261,10,8 - LTEXT "28:",IDC_STATIC,2,271,10,8 - LTEXT "29:",IDC_STATIC,2,281,10,8 - LTEXT "30:",IDC_STATIC,2,291,10,8 - LTEXT "31:",IDC_STATIC,2,301,10,8 - LTEXT "32:",IDC_STATIC,2,311,10,8 - LTEXT "33:",IDC_STATIC,2,321,10,8 - LTEXT "34:",IDC_STATIC,2,331,10,8 - LTEXT "35:",IDC_STATIC,2,341,10,8 - LTEXT "36:",IDC_STATIC,2,351,10,8 - LTEXT "37:",IDC_STATIC,2,361,10,8 - LTEXT "38:",IDC_STATIC,2,371,10,8 - LTEXT "39:",IDC_STATIC,2,381,10,8 - LTEXT "40:",IDC_STATIC,2,391,10,8 - LTEXT "41:",IDC_STATIC,2,401,10,8 - LTEXT "42:",IDC_STATIC,2,411,10,8 - LTEXT "43:",IDC_STATIC,2,421,10,8 - LTEXT "44:",IDC_STATIC,2,431,10,8 - LTEXT "45:",IDC_STATIC,2,441,10,8 - LTEXT "46:",IDC_STATIC,2,451,10,8 - LTEXT "47:",IDC_STATIC,2,461,10,8 - LTEXT "48:",IDC_STATIC,2,471,10,8 - LTEXT "49:",IDC_STATIC,2,481,10,8 - LTEXT "50:",IDC_STATIC,2,491,10,8 - LTEXT "51:",IDC_STATIC,2,501,10,8 - LTEXT "52:",IDC_STATIC,2,511,10,8 - LTEXT "53:",IDC_STATIC,2,521,10,8 - LTEXT "54:",IDC_STATIC,2,531,10,8 - LTEXT "55:",IDC_STATIC,2,541,10,8 - LTEXT "56:",IDC_STATIC,2,551,10,8 - LTEXT "57:",IDC_STATIC,2,561,10,8 - LTEXT "58:",IDC_STATIC,2,571,10,8 - LTEXT "59:",IDC_STATIC,2,581,10,8 - LTEXT "60:",IDC_STATIC,2,591,10,8 - LTEXT "61:",IDC_STATIC,2,601,10,8 - LTEXT "62:",IDC_STATIC,2,611,10,8 - LTEXT "63:",IDC_STATIC,2,621,10,8 - LTEXT "64:",IDC_STATIC,2,631,10,8 -END - -IDD_PAN DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Panning",-1,0,0,299,170 - CONTROL "",IDC_PAN_PANNING,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,77,200,15 - LTEXT "Panning",-1,6,80,26,8 - CTEXT " ",IDC_PAN_PANNING_VAL,242,77,48,12,SS_SUNKEN -END - -IDD_SET_DIALOG DIALOGEX 0, 0, 186, 44 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Set" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - DEFPUSHBUTTON "OK",IDOK,129,7,50,14 - PUSHBUTTON "Cancel",IDCANCEL,129,21,50,14 - COMBOBOX IDC_SET_UNIT,7,23,92,121,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP - LTEXT "Select Unit",IDC_STATIC,7,7,36,8 -END - -IDD_ACC DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Accumulate Signals",-1,0,0,299,170 - PUSHBUTTON "Output",IDC_ACC_OUT,99,77,50,14,WS_DISABLED - PUSHBUTTON "AUX",IDC_ACC_AUX,149,77,50,14 -END - -IDD_FLD DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Load Signal",-1,0,0,299,170 - CONTROL "",IDC_FLD_VALUE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,77,200,15 - LTEXT "Value",-1,6,80,26,8 - CTEXT " ",IDC_FLD_VALUE_VAL,242,77,48,12,SS_SUNKEN -END - -IDD_SCROLLWINDOW DIALOGEX 0, 0, 263, 258 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_SYSMENU -EXSTYLE WS_EX_CLIENTEDGE -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN -END - -IDD_GLITCH DIALOGEX 0, 0, 300, 170 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - GROUPBOX "Glitch",IDC_STATIC,0,0,300,170 - CONTROL "",IDC_GLITCH_DRY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,65,200,15 - CONTROL "",IDC_GLITCH_ACTIVE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,49,200,15 - LTEXT "Active",IDC_STATIC,4,53,21,8 - LTEXT "Dry",IDC_STATIC,4,68,12,8 - CTEXT " ",IDC_GLITCH_ACTIVE_VAL,242,50,48,12,SS_SUNKEN - CTEXT " ",IDC_GLITCH_DRY_VAL,242,66,48,12,SS_SUNKEN - CONTROL "",IDC_GLITCH_DSIZE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,97,200,15 - LTEXT "DSize",IDC_STATIC,4,100,18,8 - CTEXT " ",IDC_GLITCH_DSIZE_VAL,242,97,48,12,SS_SUNKEN - CONTROL "",IDC_GLITCH_DPITCH,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,113,200,15 - LTEXT "DPitch",IDC_STATIC,4,117,21,8 - CTEXT " ",IDC_GLITCH_DPITCH_VAL,242,113,48,12,SS_SUNKEN - CONTROL "",IDC_GLITCH_DTIME,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,81,200,15 - LTEXT "Delay",IDC_STATIC,4,85,19,8 - CTEXT " ",IDC_GLITCH_DTIME_VAL,242,81,48,12,SS_SUNKEN -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_GO4KVSTIDIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 587 - TOPMARGIN, 7 - BOTTOMMARGIN, 334 - END - - IDD_VCO, DIALOG - BEGIN - END - - IDD_VCF, DIALOG - BEGIN - END - - IDD_DLL, DIALOG - BEGIN - END - - IDD_DST, DIALOG - BEGIN - END - - IDD_FST, DIALOG - BEGIN - END - - IDD_SET_DIALOG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 179 - TOPMARGIN, 7 - BOTTOMMARGIN, 35 - END - - IDD_GLITCH, DIALOG - BEGIN - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog Info -// - -IDD_GO4KVSTIDIALOG DLGINIT -BEGIN - IDC_PATTERN_SIZE, 0x403, 12, 0 -0x6538, 0x2072, 0x6150, 0x7474, 0x7265, 0x006e, - IDC_PATTERN_SIZE, 0x403, 13, 0 -0x3631, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" - IDC_PATTERN_SIZE, 0x403, 13, 0 -0x3233, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" - IDC_PATTERN_SIZE, 0x403, 13, 0 -0x3436, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" - IDC_PATTERN_QUANT, 0x403, 12, 0 -0x6538, 0x2072, 0x6150, 0x7474, 0x7265, 0x006e, - IDC_PATTERN_QUANT, 0x403, 13, 0 -0x3631, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" - IDC_PATTERN_QUANT, 0x403, 13, 0 -0x3233, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" - IDC_PATTERN_QUANT, 0x403, 13, 0 -0x3436, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" - 0 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// AFX_DIALOG_LAYOUT -// - -IDD_GO4KVSTIDIALOG AFX_DIALOG_LAYOUT -BEGIN - 0x0000 -END - -#endif // German (Germany) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (United States) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - -#endif // English (United States) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "WinResrc.h" + +#define IDC_STATIC -1 + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// German (Germany) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) +LANGUAGE LANG_GERMAN, SUBLANG_GERMAN +#pragma code_page(1252) + +///////////////////////////////////////////////////////////////////////////// +// +// BINARY +// + +IDR_COMP_RES BINARY "nasmw.bin" +IDR_ASM_RES BINARY "4klang.bin" + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_GO4KVSTIDIALOG DIALOGEX 0, 0, 594, 341 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_ACCEPTFILES +CAPTION "Alcatraz - 4klang Synth Plugin - Version 3.2.2" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + PUSHBUTTON "Load Patch Data",IDC_LOAD_PATCH,13,13,70,14 + PUSHBUTTON "Save Patch Data",IDC_SAVE_PATCH,85,13,70,14 + PUSHBUTTON "Reset Patch Data",IDC_RESET_PATCH,157,13,70,14 + PUSHBUTTON "Load Instrument",IDC_LOAD_INSTRUMENT,13,31,70,14 + PUSHBUTTON "Save Instrument",IDC_SAVE_INSTRUMENT,85,31,70,14 + PUSHBUTTON "Reset Instrument",IDC_RESET_INSTRUMENT,157,31,70,14 + LTEXT "Instrument Name",IDC_STATIC,242,31,56,8 + LTEXT "Instrument",IDC_STATIC,242,17,36,8 + EDITTEXT IDC_INSTRUMENT_NAME,301,28,84,14,ES_AUTOHSCROLL + COMBOBOX IDC_INSTRUMENT,301,14,85,184,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + LTEXT "0",IDC_VOICECOUNT1,333,322,14,12,0,WS_EX_STATICEDGE + LTEXT "0",IDC_VOICECOUNT2,349,322,14,12,0,WS_EX_STATICEDGE + LTEXT "0",IDC_VOICECOUNT3,365,322,14,12,0,WS_EX_STATICEDGE + LTEXT "0",IDC_VOICECOUNT4,381,322,14,12,0,WS_EX_STATICEDGE + LTEXT "0",IDC_VOICECOUNT5,397,322,14,12,0,WS_EX_STATICEDGE + LTEXT "0",IDC_VOICECOUNT6,413,322,14,12,0,WS_EX_STATICEDGE + LTEXT "0",IDC_VOICECOUNT7,429,322,14,12,0,WS_EX_STATICEDGE + LTEXT "0",IDC_VOICECOUNT8,445,322,14,12,0,WS_EX_STATICEDGE + LTEXT "0",IDC_VOICECOUNT9,461,322,14,12,0,WS_EX_STATICEDGE + LTEXT "0",IDC_VOICECOUNT10,477,322,14,12,0,WS_EX_STATICEDGE + LTEXT "0",IDC_VOICECOUNT11,493,322,14,12,0,WS_EX_STATICEDGE + LTEXT "0",IDC_VOICECOUNT12,509,322,14,12,0,WS_EX_STATICEDGE + LTEXT "0",IDC_VOICECOUNT13,525,322,14,12,0,WS_EX_STATICEDGE + LTEXT "0",IDC_VOICECOUNT14,541,322,14,12,0,WS_EX_STATICEDGE + LTEXT "0",IDC_VOICECOUNT15,557,322,14,12,0,WS_EX_STATICEDGE + LTEXT "0",IDC_VOICECOUNT16,573,322,14,12,0,WS_EX_STATICEDGE + LTEXT "Activated Voices",IDC_STATIC,278,324,54,8 + PUSHBUTTON "Record",IDC_RECORD_BUTTON,449,10,62,14 + PUSHBUTTON "Stop",IDC_STOP_BUTTON,449,24,62,14,WS_DISABLED + CONTROL "Solo",IDC_SOLO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,398,24,29,10 + GROUPBOX "4k Export",IDC_STATIC,437,0,150,66 + COMBOBOX IDC_PATTERN_SIZE,479,38,33,94,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Current Unit",IDC_MODULE_SETTINGS,277,61,310,202 + CONTROL "",IDC_MAINTAB,"SysTabControl32",0x0,7,53,266,281 + GROUPBOX "Load/Save",IDC_STATIC,7,3,225,47 + PUSHBUTTON "PANIC!",IDC_PANIC,278,288,309,29 + GROUPBOX "Instrument Properties",IDC_STATIC,237,3,195,57 + COMBOBOX IDC_POLYPHONY,333,270,71,97,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + LTEXT "Polyphony",IDC_STATIC,278,272,34,8 + LTEXT "Pattern",IDC_STATIC,450,41,25,8 + PUSHBUTTON "Reset",IDC_UNIT_RESET,303,72,50,14 + PUSHBUTTON "Copy",IDC_UNIT_COPY,355,72,50,14 + PUSHBUTTON "Paste",IDC_UNIT_PASTE,407,72,50,14 + PUSHBUTTON "Load",IDC_UNIT_LOAD,459,72,50,14 + PUSHBUTTON "Save",IDC_UNIT_SAVE,511,72,50,14 + CONTROL "Always on top",IDC_ALWAYSONTOP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,527,267,64,20 + CONTROL "Record Notes",IDC_NOTEVALUES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,516,32,57,10 + CONTROL "Undenormalize",IDC_UNDENORMALIZE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,516,14,61,10 + CONTROL "Clip Output",IDC_CLIPOUTPUT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,516,5,52,10 + CONTROL "Record Envs",IDC_ENVLEVELS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,516,23,57,10 + CONTROL "16Bit Output",IDC_16BIT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,516,41,57,10 + CTEXT "Static",IDC_ISTACK_VALID,11,321,241,9 + CTEXT "Static",IDC_GSTACK_VALID,11,321,241,9 + COMBOBOX IDC_PATTERN_QUANT,479,51,33,94,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + LTEXT "Quant.",IDC_STATIC,449,54,24,8 + COMBOBOX IDC_OBJFORMAT,515,51,66,72,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + LTEXT "Link To",IDC_STATIC,241,47,23,8 + COMBOBOX IDC_INSTRUMENTLINK,301,44,85,184,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + CONTROL "Stayalive Noise while Recording",IDC_RECORDBUSYSIGNAL, + "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,431,267,64,21 +END + +IDD_VCO DIALOGEX 0, 0, 300, 170 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Oscillator",IDC_STATIC,0,0,300,170 + PUSHBUTTON "Sine",IDC_VCO_SINE,6,27,50,14,WS_DISABLED + PUSHBUTTON "Tri/Saw",IDC_VCO_TRISAW,56,27,50,14 + PUSHBUTTON "Pulse",IDC_VCO_PULSE,106,27,50,14 + PUSHBUTTON "Noise",IDC_VCO_NOISE,156,27,50,14 + CONTROL "",IDC_VCO_GAIN,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,127,200,15 + CONTROL "",IDC_VCO_TRANSPOSE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,47,200,15 + CONTROL "",IDC_VCO_DETUNE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,63,200,15 + CONTROL "",IDC_VCO_PHASE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,79,200,15 + CONTROL "",IDC_VCO_COLOR,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,95,200,15 + LTEXT "Transpose",IDC_STATIC,4,51,34,8 + LTEXT "Phase",IDC_STATIC,4,82,20,8 + LTEXT "Detune",IDC_STATIC,4,67,24,8 + LTEXT "Color",IDC_STATIC,4,98,18,8 + LTEXT "Gain",IDC_STATIC,4,130,15,8 + CONTROL "",IDC_VCO_SHAPE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,111,200,15 + LTEXT "Shape",IDC_STATIC,4,114,21,8 + CTEXT " ",IDC_VCO_TRANSPOSE_VAL,242,48,48,12,SS_SUNKEN + CTEXT " ",IDC_VCO_DETUNE_VAL,242,64,48,12,SS_SUNKEN + CTEXT " ",IDC_VCO_PHASE_VAL,242,80,48,12,SS_SUNKEN + CTEXT " ",IDC_VCO_COLOR_VAL,242,96,48,12,SS_SUNKEN + CTEXT " ",IDC_VCO_SHAPE_VAL,242,112,48,12,SS_SUNKEN + CTEXT " ",IDC_VCO_GAIN_VAL,242,128,48,12,SS_SUNKEN + CONTROL "LFO",IDC_VCO_LFO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,262,29,29,10 + CONTROL "Stereo",IDC_VCO_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,262,16,34,10 + PUSHBUTTON "Gate",IDC_VCO_GATE,206,27,50,14 + CONTROL " ",IDC_VCO_GATE1,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,43,147,8,10 + CONTROL " ",IDC_VCO_GATE2,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,55,147,8,10 + CONTROL " ",IDC_VCO_GATE3,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,67,147,8,10 + CONTROL " ",IDC_VCO_GATE4,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,79,147,8,10 + CONTROL " ",IDC_VCO_GATE5,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,91,147,8,10 + CONTROL " ",IDC_VCO_GATE6,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,103,147,8,10 + CONTROL " ",IDC_VCO_GATE7,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,115,147,8,10 + CONTROL " ",IDC_VCO_GATE8,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,127,147,8,10 + CONTROL " ",IDC_VCO_GATE9,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,139,147,8,10 + CONTROL " ",IDC_VCO_GATE10,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,151,147,8,10 + CONTROL " ",IDC_VCO_GATE11,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,163,147,8,10 + CONTROL " ",IDC_VCO_GATE12,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,175,147,8,10 + CONTROL " ",IDC_VCO_GATE13,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,187,147,8,10 + CONTROL " ",IDC_VCO_GATE14,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,199,147,8,10 + CONTROL " ",IDC_VCO_GATE15,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,211,147,8,10 + CONTROL " ",IDC_VCO_GATE16,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,223,147,8,10 + LTEXT "Gate",IDC_STATIC,4,147,16,8 +END + +IDD_VCF DIALOGEX 0, 0, 300, 170 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Filter",IDC_STATIC,0,0,299,170 + PUSHBUTTON "Low",IDC_VCF_LOW,5,59,42,14,WS_DISABLED + PUSHBUTTON "High",IDC_VCF_HIGH,47,59,41,14 + PUSHBUTTON "Band",IDC_VCF_BAND,89,59,41,14 + PUSHBUTTON "Notch",IDC_VCF_NOTCH,131,59,41,14 + PUSHBUTTON "Peak",IDC_VCF_PEAK,173,59,41,14 + PUSHBUTTON "All",IDC_VCF_ALL,215,59,41,14 + CONTROL "Stereo",IDC_VCF_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,258,62,37,10 + CONTROL "",IDC_VCF_FREQUENCY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,79,200,15 + CONTROL "",IDC_VCF_RESONANCE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,95,200,15 + LTEXT "Frequency",IDC_STATIC,4,82,35,8 + LTEXT "Resonance",IDC_STATIC,4,99,36,8 + CTEXT " ",IDC_VCF_FREQUENCY_VAL,242,80,48,12,SS_SUNKEN + CTEXT " ",IDC_VCF_RESONANCE_VAL,242,96,48,12,SS_SUNKEN +END + +IDD_ENV DIALOGEX 0, 0, 300, 170 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Envelope",IDC_STATIC,0,0,300,170 + CONTROL "",IDC_ENV_GAIN,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,109,200,15 + CONTROL "",IDC_ENV_ATTACK,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,46,200,15 + CONTROL "",IDC_ENV_DECAY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,61,200,15 + CONTROL "",IDC_ENV_SUSTAIN,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,77,200,15 + CONTROL "",IDC_ENV_RELEASE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,93,200,15 + LTEXT "Attack",IDC_STATIC,4,49,22,8 + LTEXT "Sustain",IDC_STATIC,4,80,24,8 + LTEXT "Decay",IDC_STATIC,4,65,21,8 + LTEXT "Release",IDC_STATIC,4,96,26,8 + LTEXT "Gain",IDC_STATIC,4,112,15,8 + CTEXT " ",IDC_ENV_ATTACK_VAL,242,46,48,12,SS_SUNKEN + CTEXT " ",IDC_ENV_DECAY_VAL,242,62,48,12,SS_SUNKEN + CTEXT " ",IDC_ENV_SUSTAIN_VAL,242,78,48,12,SS_SUNKEN + CTEXT " ",IDC_ENV_RELEASE_VAL,242,94,48,12,SS_SUNKEN + CTEXT " ",IDC_ENV_GAIN_VAL,242,110,48,12,SS_SUNKEN +END + +IDD_DLL DIALOGEX 0, 0, 300, 170 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Delay/Reverb",IDC_STATIC,0,0,300,170 + CONTROL "",IDC_DLL_DRY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,73,200,15 + CONTROL "",IDC_DLL_PREGAIN,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,42,200,15 + CONTROL "",IDC_DLL_FEEDBACK,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,57,200,15 + LTEXT "Pregain",IDC_STATIC,4,45,25,8 + LTEXT "Feedback",IDC_STATIC,4,61,32,8 + LTEXT "Dry",IDC_STATIC,4,76,12,8 + CTEXT " ",IDC_DLL_PREGAIN_VAL,242,42,48,12,SS_SUNKEN + CTEXT " ",IDC_DLL_FEEDBACK_VAL,242,58,48,12,SS_SUNKEN + CTEXT " ",IDC_DLL_DRY_VAL,242,74,48,12,SS_SUNKEN + CONTROL "",IDC_DLL_DAMP,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,90,200,15 + LTEXT "Damp",IDC_STATIC,4,93,19,8 + CTEXT " ",IDC_DLL_DAMP_VAL,242,90,48,12,SS_SUNKEN + PUSHBUTTON "Delay",IDC_DLL_DELAY,134,13,50,14 + PUSHBUTTON "Reverb",IDC_DLL_REVERB,184,13,50,14 + CONTROL "",IDC_DLL_DTIME,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,106,200,15 + LTEXT "Delay",IDC_STATIC,4,110,19,8 + PUSHBUTTON "BPM",IDC_DLL_BPMSYNC,47,15,40,10 + PUSHBUTTON "Note",IDC_DLL_NOTESYNC,87,15,40,10 + CTEXT " ",IDC_DLL_DTIME_VAL,242,106,48,12,SS_SUNKEN + CONTROL "Left Reverb",IDC_DLL_LEFTREVERB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,241,16,54,10 + PUSHBUTTON "No Sync",IDC_DLL_NOSYNC,7,15,40,10 + CONTROL "",IDC_DLL_FREQUENCY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,122,200,15 + LTEXT "Frequency",IDC_STATIC,4,127,35,8 + CTEXT " ",IDC_DLL_FREQUENCY_VAL,242,122,48,12,SS_SUNKEN + CONTROL "",IDC_DLL_DEPTH,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,138,200,15 + LTEXT "Depth",IDC_STATIC,4,143,20,8 + CTEXT " ",IDC_DLL_DEPTH_VAL,242,138,48,12,SS_SUNKEN +END + +IDD_DST DIALOGEX 0, 0, 300, 170 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Distortion",IDC_STATIC,0,0,299,170 + CONTROL "",IDC_DST_DRIVE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,69,200,15 + LTEXT "Drive",IDC_STATIC,4,73,18,8 + LTEXT "S&&H",IDC_STATIC,4,89,14,8 + CONTROL "",IDC_DST_SNH,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,85,200,15 + CTEXT " ",IDC_DST_DRIVE_VAL,242,70,48,12,SS_SUNKEN + CTEXT " ",IDC_DST_SNH_VAL,242,86,48,12,SS_SUNKEN + CONTROL "Stereo",IDC_DST_STEREO,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,126,105,37,10 +END + +IDD_INSTRUMENT_STACK DIALOGEX 0, 0, 247, 640 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPCHILDREN | WS_SYSMENU +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + PUSHBUTTON " ",IDC_ISTACK_UNIT1,15,0,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP1,165,0,25,10,NOT WS_VISIBLE + PUSHBUTTON "Down",IDC_ISTACK_DOWN1,191,0,25,10,NOT WS_VISIBLE + CTEXT "1",IDC_ISTACK_SIGNALCOUNT1,225,0,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT2,15,10,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP2,165,10,25,10,NOT WS_VISIBLE + PUSHBUTTON "Down",IDC_ISTACK_DOWN2,191,10,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT2,225,10,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT3,15,20,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP3,165,20,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN3,191,20,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT3,225,20,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT4,15,30,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP4,165,30,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN4,191,30,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT4,225,30,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT5,15,40,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP5,165,40,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN5,191,40,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT5,225,40,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT6,15,50,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP6,165,50,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN6,191,50,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT6,225,50,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT7,15,60,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP7,165,60,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN7,191,60,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT7,225,60,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT8,15,70,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP8,165,70,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN8,191,70,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT8,225,70,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT9,15,80,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP9,165,80,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN9,191,80,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT9,225,80,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT10,15,90,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP10,165,90,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN10,191,90,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT10,225,90,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT11,15,100,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP11,165,100,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN11,191,100,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT11,225,100,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT12,15,110,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP12,165,110,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN12,191,110,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT12,225,110,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT13,15,120,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP13,165,120,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN13,191,120,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT13,225,120,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT14,15,130,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP14,165,130,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN14,191,130,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT14,225,130,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT15,15,140,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP15,165,140,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN15,191,140,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT15,225,140,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT16,15,150,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP16,165,150,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN16,191,150,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT16,225,150,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT17,15,160,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP17,165,160,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN17,191,160,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT17,225,160,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT18,15,170,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP18,165,170,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN18,191,170,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT18,225,170,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT19,15,180,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP19,165,180,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN19,191,180,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT19,225,180,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT20,15,190,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP20,165,190,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN20,191,190,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT20,225,190,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT21,15,200,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP21,165,200,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN21,191,200,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT21,225,200,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT22,15,210,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP22,165,210,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN22,191,210,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT22,225,210,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT23,15,220,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP23,165,220,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN23,191,220,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT23,225,220,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT24,15,230,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP24,165,230,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN24,191,230,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT24,225,230,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT25,15,240,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP25,165,240,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN25,191,240,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT25,225,240,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT26,15,250,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP26,165,250,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN26,191,250,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT26,225,250,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT27,15,260,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP27,165,260,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN27,191,260,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT27,225,260,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT28,15,270,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP28,165,270,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN28,191,270,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT28,225,270,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT29,15,280,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP29,165,280,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN29,191,280,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT29,225,280,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT30,15,290,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP30,165,290,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN30,191,290,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT30,225,290,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT31,15,300,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP31,165,300,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN31,191,300,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT31,225,300,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK_UNIT32,15,310,83,10 + PUSHBUTTON "Up",IDC_ISTACK_UP32,165,310,25,10 + PUSHBUTTON "Down",IDC_ISTACK_DOWN32,191,310,25,10 + CTEXT "1",IDC_ISTACK_SIGNALCOUNT32,225,310,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT1,15,320,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP1,165,320,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN1,191,320,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT1,225,320,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT2,15,330,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP2,165,330,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN2,191,330,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT2,225,330,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT3,15,340,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP3,165,340,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN3,191,340,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT3,225,340,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT4,15,350,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP4,165,350,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN4,191,350,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT4,225,350,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT5,15,360,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP5,165,360,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN5,191,360,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT5,225,360,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT6,15,370,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP6,165,370,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN6,191,370,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT6,225,370,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT7,15,380,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP7,165,380,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN7,191,380,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT7,225,380,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT8,15,390,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP8,165,390,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN8,191,390,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT8,225,390,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT9,15,400,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP9,165,400,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN9,191,400,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT9,225,400,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT10,15,410,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP10,165,410,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN10,191,410,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT10,225,410,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT11,15,420,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP11,165,420,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN11,191,420,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT11,225,420,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT12,15,430,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP12,165,430,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN12,191,430,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT12,225,430,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT13,15,440,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP13,165,440,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN13,191,440,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT13,225,440,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT14,15,450,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP14,165,450,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN14,191,450,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT14,225,450,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT15,15,460,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP15,165,460,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN15,191,460,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT15,225,460,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT16,15,470,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP16,165,470,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN16,191,470,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT16,225,470,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT17,15,480,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP17,165,480,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN17,191,480,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT17,225,480,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT18,15,490,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP18,165,490,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN18,191,490,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT18,225,490,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT19,15,500,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP19,165,500,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN19,191,500,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT19,225,500,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT20,15,510,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP20,165,510,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN20,191,510,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT20,225,510,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT21,15,520,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP21,165,520,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN21,191,520,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT21,225,520,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT22,15,530,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP22,165,530,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN22,191,530,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT22,225,530,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT23,15,540,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP23,165,540,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN23,191,540,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT23,225,540,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT24,15,550,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP24,165,550,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN24,191,550,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT24,225,550,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT25,15,560,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP25,165,560,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN25,191,560,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT25,225,560,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT26,15,570,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP26,165,570,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN26,191,570,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT26,225,570,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT27,15,580,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP27,165,580,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN27,191,580,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT27,225,580,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT28,15,590,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP28,165,590,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN28,191,590,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT28,225,590,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT29,15,600,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP29,165,600,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN29,191,600,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT29,225,600,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT30,15,610,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP30,165,610,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN30,191,610,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT30,225,610,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT31,15,620,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP31,165,620,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN31,191,620,25,10 + CTEXT "1",IDC_ISTACK__SIGNALCOUNT31,225,620,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_ISTACK__UNIT32,15,630,83,10 + PUSHBUTTON "Up",IDC_ISTACK__UP32,165,630,25,10 + PUSHBUTTON "Down",IDC_ISTACK__DOWN32,191,630,25,10,NOT WS_VISIBLE + CTEXT "1",IDC_ISTACK__SIGNALCOUNT32,225,630,16,10,SS_SUNKEN + PUSHBUTTON "Set",IDC_ISTACK_SET1,106,0,25,10,NOT WS_VISIBLE + PUSHBUTTON "Clear",IDC_ISTACK_RESET1,132,0,25,10,NOT WS_VISIBLE + PUSHBUTTON "Set",IDC_ISTACK_SET2,106,10,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET2,132,10,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET3,106,20,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET3,132,20,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET4,106,30,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET4,132,30,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET5,106,40,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET5,132,40,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET6,106,50,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET6,132,50,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET7,106,60,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET7,132,60,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET8,106,70,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET8,132,70,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET9,106,80,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET9,132,80,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET10,106,90,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET10,132,90,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET11,106,100,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET11,132,100,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET12,106,110,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET12,132,110,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET13,106,120,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET13,132,120,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET14,106,130,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET14,132,130,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET15,106,140,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET15,132,140,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET16,106,150,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET16,132,150,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET17,106,160,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET17,132,160,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET18,106,170,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET18,132,170,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET19,106,180,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET19,132,180,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET20,106,190,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET20,132,190,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET21,106,200,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET21,132,200,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET22,106,210,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET22,132,210,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET23,106,220,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET23,132,220,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET24,106,230,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET24,132,230,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET25,106,240,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET25,132,240,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET26,106,250,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET26,132,250,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET27,106,260,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET27,132,260,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET28,106,270,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET28,132,270,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET29,106,280,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET29,132,280,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET30,106,290,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET30,132,290,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET31,106,300,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET31,132,300,25,10 + PUSHBUTTON "Set",IDC_ISTACK_SET32,106,310,25,10 + PUSHBUTTON "Clear",IDC_ISTACK_RESET32,132,310,25,10 + PUSHBUTTON "Setl",IDC_ISTACK__SET1,106,320,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET1,132,320,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET2,106,330,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET2,132,330,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET3,106,340,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET3,132,340,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET4,106,350,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET4,132,350,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET5,106,360,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET5,132,360,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET6,106,370,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET6,132,370,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET7,106,380,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET7,132,380,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET8,106,390,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET8,132,390,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET9,106,400,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET9,132,400,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET10,106,410,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET10,132,410,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET11,106,420,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET11,132,420,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET12,106,430,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET12,132,430,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET13,106,440,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET13,132,440,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET14,106,450,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET14,132,450,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET15,106,460,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET15,132,460,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET16,106,470,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET16,132,470,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET17,106,480,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET17,132,480,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET18,106,490,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET18,132,490,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET19,106,500,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET19,132,500,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET20,106,510,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET20,132,510,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET21,106,520,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET21,132,520,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET22,106,530,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET22,132,530,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET23,106,540,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET23,132,540,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET24,106,550,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET24,132,550,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET25,106,560,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET25,132,560,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET26,106,570,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET26,132,570,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET27,106,580,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET27,132,580,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET28,106,590,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET28,132,590,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET29,106,600,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET29,132,600,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET30,106,610,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET30,132,610,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET31,106,620,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET31,132,620,25,10 + PUSHBUTTON "Set",IDC_ISTACK__SET32,106,630,25,10 + PUSHBUTTON "Clear",IDC_ISTACK__RESET32,132,630,25,10 + LTEXT "1:",IDC_STATIC,2,1,10,8 + LTEXT "2:",IDC_STATIC,2,11,10,8 + LTEXT "3:",IDC_STATIC,2,21,10,8 + LTEXT "4:",IDC_STATIC,2,31,10,8 + LTEXT "5:",IDC_STATIC,2,41,10,8 + LTEXT "6:",IDC_STATIC,2,51,10,8 + LTEXT "7:",IDC_STATIC,2,61,10,8 + LTEXT "8:",IDC_STATIC,2,71,10,8 + LTEXT "9:",IDC_STATIC,2,81,10,8 + LTEXT "10:",IDC_STATIC,2,91,10,8 + LTEXT "11:",IDC_STATIC,2,101,10,8 + LTEXT "12:",IDC_STATIC,2,111,10,8 + LTEXT "13:",IDC_STATIC,2,121,10,8 + LTEXT "14:",IDC_STATIC,2,131,10,8 + LTEXT "15:",IDC_STATIC,2,141,10,8 + LTEXT "16:",IDC_STATIC,2,151,10,8 + LTEXT "17:",IDC_STATIC,2,161,10,8 + LTEXT "18:",IDC_STATIC,2,171,10,8 + LTEXT "19:",IDC_STATIC,2,181,10,8 + LTEXT "20:",IDC_STATIC,2,191,10,8 + LTEXT "21:",IDC_STATIC,2,201,10,8 + LTEXT "22:",IDC_STATIC,2,211,10,8 + LTEXT "23:",IDC_STATIC,2,221,10,8 + LTEXT "24:",IDC_STATIC,2,231,10,8 + LTEXT "25:",IDC_STATIC,2,241,10,8 + LTEXT "26:",IDC_STATIC,2,251,10,8 + LTEXT "27:",IDC_STATIC,2,261,10,8 + LTEXT "28:",IDC_STATIC,2,271,10,8 + LTEXT "29:",IDC_STATIC,2,281,10,8 + LTEXT "30:",IDC_STATIC,2,291,10,8 + LTEXT "31:",IDC_STATIC,2,301,10,8 + LTEXT "32:",IDC_STATIC,2,311,10,8 + LTEXT "33:",IDC_STATIC,2,321,10,8 + LTEXT "34:",IDC_STATIC,2,331,10,8 + LTEXT "35:",IDC_STATIC,2,341,10,8 + LTEXT "36:",IDC_STATIC,2,351,10,8 + LTEXT "37:",IDC_STATIC,2,361,10,8 + LTEXT "38:",IDC_STATIC,2,371,10,8 + LTEXT "39:",IDC_STATIC,2,381,10,8 + LTEXT "40:",IDC_STATIC,2,391,10,8 + LTEXT "41:",IDC_STATIC,2,401,10,8 + LTEXT "42:",IDC_STATIC,2,411,10,8 + LTEXT "43:",IDC_STATIC,2,421,10,8 + LTEXT "44:",IDC_STATIC,2,431,10,8 + LTEXT "45:",IDC_STATIC,2,441,10,8 + LTEXT "46:",IDC_STATIC,2,451,10,8 + LTEXT "47:",IDC_STATIC,2,461,10,8 + LTEXT "48:",IDC_STATIC,2,471,10,8 + LTEXT "49:",IDC_STATIC,2,481,10,8 + LTEXT "50:",IDC_STATIC,2,491,10,8 + LTEXT "51:",IDC_STATIC,2,501,10,8 + LTEXT "52:",IDC_STATIC,2,511,10,8 + LTEXT "53:",IDC_STATIC,2,521,10,8 + LTEXT "54:",IDC_STATIC,2,531,10,8 + LTEXT "55:",IDC_STATIC,2,541,10,8 + LTEXT "56:",IDC_STATIC,2,551,10,8 + LTEXT "57:",IDC_STATIC,2,561,10,8 + LTEXT "58:",IDC_STATIC,2,571,10,8 + LTEXT "59:",IDC_STATIC,2,581,10,8 + LTEXT "60:",IDC_STATIC,2,591,10,8 + LTEXT "61:",IDC_STATIC,2,601,10,8 + LTEXT "62:",IDC_STATIC,2,611,10,8 + LTEXT "63:",IDC_STATIC,2,621,10,8 + LTEXT "64:",IDC_STATIC,2,631,10,8 +END + +IDD_FOP DIALOGEX 0, 0, 300, 170 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Floating Point Operation",IDC_STATIC,0,0,299,170 + PUSHBUTTON "Load Note",IDC_FOP_LOADNOTE,3,11,42,14 + PUSHBUTTON "PUSH",IDC_FOP_PUSH,3,27,42,14 + PUSHBUTTON "POP",IDC_FOP_POP,3,42,42,14 + PUSHBUTTON "XCH",IDC_FOP_XCH,3,58,42,14 + PUSHBUTTON "+",IDC_FOP_ADD,3,74,42,14 + PUSHBUTTON "+/POP",IDC_FOP_ADDP,3,90,42,14 + PUSHBUTTON "*",IDC_FOP_MUL,3,106,42,14 + PUSHBUTTON "*/POP",IDC_FOP_MULP,3,122,42,14 + PUSHBUTTON "2+/POP",IDC_FOP_ADDP2,3,138,42,14 + PUSHBUTTON "2*/POP",IDC_FOP_MULP2,3,154,42,14 + LTEXT "IN: a b c d -> OUT: note a b c d",IDC_STATIC,50,13,233,8 + LTEXT "IN: a b c d -> OUT: a a b c d",IDC_STATIC,50,29,232,8 + LTEXT "IN: a b c d -> OUT: b c d",IDC_STATIC,50,44,196,8 + LTEXT "IN: a b c d -> OUT: b a c d",IDC_STATIC,50,60,214,8 + LTEXT "IN: a b c d -> OUT: a+b b c d",IDC_STATIC,50,76,216,8 + LTEXT "IN: a b c d -> OUT: a+b c d",IDC_STATIC,50,92,198,8 + LTEXT "IN: a b c d -> OUT: a*b b c d",IDC_STATIC,50,108,216,8 + LTEXT "IN: a b c d -> OUT: a*b c d",IDC_STATIC,50,124,198,8 + LTEXT "IN: a b c d -> OUT: a+c b+d",IDC_STATIC,50,141,193,8 + LTEXT "IN: a b c d -> OUT: a*c b*d",IDC_STATIC,50,156,193,8 + GROUPBOX "",IDC_STATIC,0,133,299,20 + GROUPBOX "",IDC_STATIC,0,101,299,20 + GROUPBOX "",IDC_STATIC,1,69,299,20 + GROUPBOX "",IDC_STATIC,0,37,299,20 + GROUPBOX "",IDC_STATIC,0,6,299,20 +END + +IDD_FST DIALOGEX 0, 0, 300, 170 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Store Signal",IDC_STATIC,0,0,299,170 + CONTROL "",IDC_FST_AMOUNT,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,36,101,200,15 + LTEXT "Amount",IDC_STATIC,3,104,26,8 + CTEXT " ",IDC_FST_AMOUNT_VAL,242,102,48,12,SS_SUNKEN + COMBOBOX IDC_FST_DESTINATION_INSTRUMENT,43,53,249,177,CBS_DROPDOWN | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP + LTEXT "Stack",IDC_STATIC,5,55,18,8 + COMBOBOX IDC_FST_DESTINATION_UNIT,43,69,249,157,CBS_DROPDOWN | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP + LTEXT "Unit",IDC_STATIC,6,71,14,8 + COMBOBOX IDC_FST_DESTINATION_SLOT,43,85,249,110,CBS_DROPDOWN | CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP + LTEXT "Slot",IDC_STATIC,5,87,13,8 + PUSHBUTTON "Set",IDC_FST_SET,56,122,50,14 + PUSHBUTTON "+",IDC_FST_ADD,106,122,50,14 + CONTROL "Pop",IDC_FST_POP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,212,124,28,10 + PUSHBUTTON "*",IDC_FST_MUL,156,122,50,14,NOT WS_VISIBLE +END + +IDD_NONE DIALOGEX 0, 0, 300, 170 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "",-1,0,0,299,170 + LTEXT "Nothing selected",-1,123,80,54,8 +END + +IDD_OUT DIALOGEX 0, 0, 300, 170 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Instrument Output",IDC_STATIC,0,0,299,170 + CONTROL "",IDC_OUT_GAIN,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,37,70,200,15 + LTEXT "Gain",IDC_STATIC,6,73,15,8 + LTEXT "AUX Send",IDC_STATIC,6,89,32,8 + CONTROL "",IDC_OUT_AUXSEND,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,37,85,200,15 + CTEXT " ",IDC_OUT_GAIN_VAL,242,70,48,12,SS_SUNKEN + CTEXT " ",IDC_OUT_AUXSEND_VAL,242,86,48,12,SS_SUNKEN +END + +IDD_GLOBAL_STACK DIALOGEX 0, 0, 247, 640 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + PUSHBUTTON " ",IDC_GSTACK_UNIT1,15,0,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP1,165,0,25,10,NOT WS_VISIBLE + PUSHBUTTON "Down",IDC_GSTACK_DOWN1,191,0,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT1,225,0,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT2,15,10,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP2,165,10,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN2,191,10,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT2,225,10,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT3,15,20,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP3,165,20,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN3,191,20,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT3,225,20,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT4,15,30,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP4,165,30,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN4,191,30,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT4,225,30,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT5,15,40,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP5,165,40,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN5,191,40,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT5,225,40,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT6,15,50,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP6,165,50,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN6,191,50,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT6,225,50,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT7,15,60,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP7,165,60,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN7,191,60,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT7,225,60,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT8,15,70,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP8,165,70,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN8,191,70,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT8,225,70,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT9,15,80,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP9,165,80,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN9,191,80,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT9,225,80,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT10,15,90,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP10,165,90,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN10,191,90,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT10,225,90,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT11,15,100,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP11,165,100,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN11,191,100,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT11,225,100,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT12,15,110,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP12,165,110,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN12,191,110,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT12,225,110,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT13,15,120,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP13,165,120,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN13,191,120,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT13,225,120,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT14,15,130,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP14,165,130,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN14,191,130,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT14,225,130,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT15,15,140,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP15,165,140,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN15,191,140,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT15,225,140,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT16,15,150,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP16,165,150,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN16,191,150,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT16,225,150,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT17,15,160,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP17,165,160,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN17,191,160,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT17,225,160,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT18,15,170,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP18,165,170,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN18,191,170,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT18,225,170,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT19,15,180,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP19,165,180,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN19,191,180,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT19,225,180,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT20,15,190,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP20,165,190,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN20,191,190,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT20,225,190,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT21,15,200,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP21,165,200,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN21,191,200,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT21,225,200,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT22,15,210,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP22,165,210,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN22,191,210,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT22,225,210,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT23,15,220,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP23,165,220,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN23,191,220,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT23,225,220,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT24,15,230,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP24,165,230,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN24,191,230,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT24,225,230,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT25,15,240,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP25,165,240,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN25,191,240,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT25,225,240,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT26,15,250,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP26,165,250,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN26,191,250,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT26,225,250,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT27,15,260,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP27,165,260,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN27,191,260,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT27,225,260,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT28,15,270,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP28,165,270,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN28,191,270,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT28,225,270,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT29,15,280,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP29,165,280,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN29,191,280,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT29,225,280,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT30,15,290,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP30,165,290,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN30,191,290,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT30,225,290,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT31,15,300,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP31,165,300,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN31,191,300,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT31,225,300,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK_UNIT32,15,310,83,10 + PUSHBUTTON "Up",IDC_GSTACK_UP32,165,310,25,10 + PUSHBUTTON "Down",IDC_GSTACK_DOWN32,191,310,25,10 + CTEXT "1",IDC_GSTACK_SIGNALCOUNT32,225,310,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT1,15,320,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP1,165,320,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN1,191,320,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT1,225,320,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT2,15,330,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP2,165,330,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN2,191,330,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT2,225,330,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT3,15,340,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP3,165,340,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN3,191,340,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT3,225,340,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT4,15,350,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP4,165,350,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN4,191,350,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT4,225,350,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT5,15,360,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP5,165,360,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN5,191,360,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT5,225,360,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT6,15,370,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP6,165,370,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN6,191,370,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT6,225,370,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT7,15,380,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP7,165,380,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN7,191,380,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT7,225,380,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT8,15,390,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP8,165,390,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN8,191,390,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT8,225,390,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT9,15,400,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP9,165,400,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN9,191,400,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT9,225,400,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT10,15,410,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP10,165,410,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN10,191,410,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT10,225,410,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT11,15,420,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP11,165,420,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN11,191,420,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT11,225,420,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT12,15,430,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP12,165,430,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN12,191,430,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT12,225,430,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT13,15,440,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP13,165,440,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN13,191,440,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT13,225,440,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT14,15,450,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP14,165,450,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN14,191,450,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT14,225,450,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT15,15,460,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP15,165,460,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN15,191,460,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT15,225,460,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT16,15,470,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP16,165,470,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN16,191,470,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT16,225,470,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT17,15,480,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP17,165,480,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN17,191,480,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT17,225,480,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT18,15,490,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP18,165,490,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN18,191,490,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT18,225,490,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT19,15,500,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP19,165,500,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN19,191,500,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT19,225,500,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT20,15,510,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP20,165,510,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN20,191,510,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT20,225,510,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT21,15,520,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP21,165,520,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN21,191,520,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT21,225,520,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT22,15,530,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP22,165,530,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN22,191,530,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT22,225,530,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT23,15,540,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP23,165,540,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN23,191,540,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT23,225,540,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT24,15,550,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP24,165,550,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN24,191,550,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT24,225,550,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT25,15,560,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP25,165,560,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN25,191,560,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT25,225,560,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT26,15,570,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP26,165,570,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN26,191,570,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT26,225,570,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT27,15,580,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP27,165,580,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN27,191,580,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT27,225,580,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT28,15,590,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP28,165,590,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN28,191,590,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT28,225,590,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT29,15,600,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP29,165,600,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN29,191,600,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT29,225,600,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT30,15,610,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP30,165,610,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN30,191,610,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT30,225,610,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT31,15,620,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP31,165,620,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN31,191,620,25,10 + CTEXT "1",IDC_GSTACK__SIGNALCOUNT31,225,620,16,10,SS_SUNKEN + PUSHBUTTON " ",IDC_GSTACK__UNIT32,15,630,83,10 + PUSHBUTTON "Up",IDC_GSTACK__UP32,165,630,25,10 + PUSHBUTTON "Down",IDC_GSTACK__DOWN32,191,630,25,10,NOT WS_VISIBLE + CTEXT "1",IDC_GSTACK__SIGNALCOUNT32,225,630,16,10,SS_SUNKEN + PUSHBUTTON "Set",IDC_GSTACK_SET1,106,0,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET1,132,0,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET2,106,10,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET2,132,10,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET3,106,20,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET3,132,20,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET4,106,30,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET4,132,30,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET5,106,40,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET5,132,40,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET6,106,50,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET6,132,50,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET7,106,60,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET7,132,60,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET8,106,70,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET8,132,70,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET9,106,80,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET9,132,80,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET10,106,90,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET10,132,90,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET11,106,100,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET11,132,100,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET12,106,110,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET12,132,110,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET13,106,120,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET13,132,120,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET14,106,130,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET14,132,130,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET15,106,140,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET15,132,140,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET16,106,150,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET16,132,150,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET17,106,160,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET17,132,160,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET18,106,170,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET18,132,170,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET19,106,180,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET19,132,180,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET20,106,190,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET20,132,190,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET21,106,200,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET21,132,200,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET22,106,210,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET22,132,210,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET23,106,220,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET23,132,220,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET24,106,230,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET24,132,230,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET25,106,240,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET25,132,240,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET26,106,250,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET26,132,250,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET27,106,260,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET27,132,260,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET28,106,270,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET28,132,270,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET29,106,280,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET29,132,280,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET30,106,290,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET30,132,290,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET31,106,300,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET31,132,300,25,10 + PUSHBUTTON "Set",IDC_GSTACK_SET32,106,310,25,10 + PUSHBUTTON "Clear",IDC_GSTACK_RESET32,132,310,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET1,106,320,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET1,132,320,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET2,106,330,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET2,132,330,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET3,106,340,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET3,132,340,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET4,106,350,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET4,132,350,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET5,106,360,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET5,132,360,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET6,106,370,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET6,132,370,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET7,106,380,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET7,132,380,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET8,106,390,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET8,132,390,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET9,106,400,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET9,132,400,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET10,106,410,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET10,132,410,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET11,106,420,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET11,132,420,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET12,106,430,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET12,132,430,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET13,106,440,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET13,132,440,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET14,106,450,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET14,132,450,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET15,106,460,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET15,132,460,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET16,106,470,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET16,132,470,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET17,106,480,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET17,132,480,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET18,106,490,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET18,132,490,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET19,106,500,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET19,132,500,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET20,106,510,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET20,132,510,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET21,106,520,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET21,132,520,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET22,106,530,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET22,132,530,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET23,106,540,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET23,132,540,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET24,106,550,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET24,132,550,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET25,106,560,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET25,132,560,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET26,106,570,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET26,132,570,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET27,106,580,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET27,132,580,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET28,106,590,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET28,132,590,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET29,106,600,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET29,132,600,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET30,106,610,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET30,132,610,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET31,106,620,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET31,132,620,25,10 + PUSHBUTTON "Set",IDC_GSTACK__SET32,106,630,25,10 + PUSHBUTTON "Clear",IDC_GSTACK__RESET32,132,630,25,10 + LTEXT "1:",IDC_STATIC,2,1,10,8 + LTEXT "2:",IDC_STATIC,2,11,10,8 + LTEXT "3:",IDC_STATIC,2,21,10,8 + LTEXT "4:",IDC_STATIC,2,31,10,8 + LTEXT "5:",IDC_STATIC,2,41,10,8 + LTEXT "6:",IDC_STATIC,2,51,10,8 + LTEXT "7:",IDC_STATIC,2,61,10,8 + LTEXT "8:",IDC_STATIC,2,71,10,8 + LTEXT "9:",IDC_STATIC,2,81,10,8 + LTEXT "10:",IDC_STATIC,2,91,10,8 + LTEXT "11:",IDC_STATIC,2,101,10,8 + LTEXT "12:",IDC_STATIC,2,111,10,8 + LTEXT "13:",IDC_STATIC,2,121,10,8 + LTEXT "14:",IDC_STATIC,2,131,10,8 + LTEXT "15:",IDC_STATIC,2,141,10,8 + LTEXT "16:",IDC_STATIC,2,151,10,8 + LTEXT "17:",IDC_STATIC,2,161,10,8 + LTEXT "18:",IDC_STATIC,2,171,10,8 + LTEXT "19:",IDC_STATIC,2,181,10,8 + LTEXT "20:",IDC_STATIC,2,191,10,8 + LTEXT "21:",IDC_STATIC,2,201,10,8 + LTEXT "22:",IDC_STATIC,2,211,10,8 + LTEXT "23:",IDC_STATIC,2,221,10,8 + LTEXT "24:",IDC_STATIC,2,231,10,8 + LTEXT "25:",IDC_STATIC,2,241,10,8 + LTEXT "26:",IDC_STATIC,2,251,10,8 + LTEXT "27:",IDC_STATIC,2,261,10,8 + LTEXT "28:",IDC_STATIC,2,271,10,8 + LTEXT "29:",IDC_STATIC,2,281,10,8 + LTEXT "30:",IDC_STATIC,2,291,10,8 + LTEXT "31:",IDC_STATIC,2,301,10,8 + LTEXT "32:",IDC_STATIC,2,311,10,8 + LTEXT "33:",IDC_STATIC,2,321,10,8 + LTEXT "34:",IDC_STATIC,2,331,10,8 + LTEXT "35:",IDC_STATIC,2,341,10,8 + LTEXT "36:",IDC_STATIC,2,351,10,8 + LTEXT "37:",IDC_STATIC,2,361,10,8 + LTEXT "38:",IDC_STATIC,2,371,10,8 + LTEXT "39:",IDC_STATIC,2,381,10,8 + LTEXT "40:",IDC_STATIC,2,391,10,8 + LTEXT "41:",IDC_STATIC,2,401,10,8 + LTEXT "42:",IDC_STATIC,2,411,10,8 + LTEXT "43:",IDC_STATIC,2,421,10,8 + LTEXT "44:",IDC_STATIC,2,431,10,8 + LTEXT "45:",IDC_STATIC,2,441,10,8 + LTEXT "46:",IDC_STATIC,2,451,10,8 + LTEXT "47:",IDC_STATIC,2,461,10,8 + LTEXT "48:",IDC_STATIC,2,471,10,8 + LTEXT "49:",IDC_STATIC,2,481,10,8 + LTEXT "50:",IDC_STATIC,2,491,10,8 + LTEXT "51:",IDC_STATIC,2,501,10,8 + LTEXT "52:",IDC_STATIC,2,511,10,8 + LTEXT "53:",IDC_STATIC,2,521,10,8 + LTEXT "54:",IDC_STATIC,2,531,10,8 + LTEXT "55:",IDC_STATIC,2,541,10,8 + LTEXT "56:",IDC_STATIC,2,551,10,8 + LTEXT "57:",IDC_STATIC,2,561,10,8 + LTEXT "58:",IDC_STATIC,2,571,10,8 + LTEXT "59:",IDC_STATIC,2,581,10,8 + LTEXT "60:",IDC_STATIC,2,591,10,8 + LTEXT "61:",IDC_STATIC,2,601,10,8 + LTEXT "62:",IDC_STATIC,2,611,10,8 + LTEXT "63:",IDC_STATIC,2,621,10,8 + LTEXT "64:",IDC_STATIC,2,631,10,8 +END + +IDD_PAN DIALOGEX 0, 0, 300, 170 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Panning",-1,0,0,299,170 + CONTROL "",IDC_PAN_PANNING,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,77,200,15 + LTEXT "Panning",-1,6,80,26,8 + CTEXT " ",IDC_PAN_PANNING_VAL,242,77,48,12,SS_SUNKEN +END + +IDD_SET_DIALOG DIALOGEX 0, 0, 186, 44 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Set" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "OK",IDOK,129,7,50,14 + PUSHBUTTON "Cancel",IDCANCEL,129,21,50,14 + COMBOBOX IDC_SET_UNIT,7,23,92,121,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP + LTEXT "Select Unit",IDC_STATIC,7,7,36,8 +END + +IDD_ACC DIALOGEX 0, 0, 300, 170 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Accumulate Signals",-1,0,0,299,170 + PUSHBUTTON "Output",IDC_ACC_OUT,99,77,50,14,WS_DISABLED + PUSHBUTTON "AUX",IDC_ACC_AUX,149,77,50,14 +END + +IDD_FLD DIALOGEX 0, 0, 300, 170 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Load Signal",-1,0,0,299,170 + CONTROL "",IDC_FLD_VALUE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,77,200,15 + LTEXT "Value",-1,6,80,26,8 + CTEXT " ",IDC_FLD_VALUE_VAL,242,77,48,12,SS_SUNKEN +END + +IDD_SCROLLWINDOW DIALOGEX 0, 0, 263, 258 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_SYSMENU +EXSTYLE WS_EX_CLIENTEDGE +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN +END + +IDD_GLITCH DIALOGEX 0, 0, 300, 170 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + GROUPBOX "Glitch",IDC_STATIC,0,0,300,170 + CONTROL "",IDC_GLITCH_DRY,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,65,200,15 + CONTROL "",IDC_GLITCH_ACTIVE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,49,200,15 + LTEXT "Active",IDC_STATIC,4,53,21,8 + LTEXT "Dry",IDC_STATIC,4,68,12,8 + CTEXT " ",IDC_GLITCH_ACTIVE_VAL,242,50,48,12,SS_SUNKEN + CTEXT " ",IDC_GLITCH_DRY_VAL,242,66,48,12,SS_SUNKEN + CONTROL "",IDC_GLITCH_DSIZE,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,97,200,15 + LTEXT "DSize",IDC_STATIC,4,100,18,8 + CTEXT " ",IDC_GLITCH_DSIZE_VAL,242,97,48,12,SS_SUNKEN + CONTROL "",IDC_GLITCH_DPITCH,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,113,200,15 + LTEXT "DPitch",IDC_STATIC,4,117,21,8 + CTEXT " ",IDC_GLITCH_DPITCH_VAL,242,113,48,12,SS_SUNKEN + CONTROL "",IDC_GLITCH_DTIME,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,38,81,200,15 + LTEXT "Delay",IDC_STATIC,4,85,19,8 + CTEXT " ",IDC_GLITCH_DTIME_VAL,242,81,48,12,SS_SUNKEN +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_GO4KVSTIDIALOG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 587 + TOPMARGIN, 7 + BOTTOMMARGIN, 334 + END + + IDD_VCO, DIALOG + BEGIN + END + + IDD_VCF, DIALOG + BEGIN + END + + IDD_DLL, DIALOG + BEGIN + END + + IDD_DST, DIALOG + BEGIN + END + + IDD_FST, DIALOG + BEGIN + END + + IDD_SET_DIALOG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 179 + TOPMARGIN, 7 + BOTTOMMARGIN, 35 + END + + IDD_GLITCH, DIALOG + BEGIN + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog Info +// + +IDD_GO4KVSTIDIALOG DLGINIT +BEGIN + IDC_PATTERN_SIZE, 0x403, 12, 0 +0x6538, 0x2072, 0x6150, 0x7474, 0x7265, 0x006e, + IDC_PATTERN_SIZE, 0x403, 13, 0 +0x3631, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" + IDC_PATTERN_SIZE, 0x403, 13, 0 +0x3233, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" + IDC_PATTERN_SIZE, 0x403, 13, 0 +0x3436, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" + IDC_PATTERN_QUANT, 0x403, 12, 0 +0x6538, 0x2072, 0x6150, 0x7474, 0x7265, 0x006e, + IDC_PATTERN_QUANT, 0x403, 13, 0 +0x3631, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" + IDC_PATTERN_QUANT, 0x403, 13, 0 +0x3233, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" + IDC_PATTERN_QUANT, 0x403, 13, 0 +0x3436, 0x7265, 0x5020, 0x7461, 0x6574, 0x6e72, "\000" + 0 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// AFX_DIALOG_LAYOUT +// + +IDD_GO4KVSTIDIALOG AFX_DIALOG_LAYOUT +BEGIN + 0x0000 +END + +#endif // German (Germany) resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/4klang_source/Go4kVSTi/win/Go4kVSTi2.def b/src/vsti/Go4kVSTi2.def similarity index 94% rename from 4klang_source/Go4kVSTi/win/Go4kVSTi2.def rename to src/vsti/Go4kVSTi2.def index 44e6f21..916e492 100644 --- a/4klang_source/Go4kVSTi/win/Go4kVSTi2.def +++ b/src/vsti/Go4kVSTi2.def @@ -1,2 +1,2 @@ -LIBRARY 8klang -EXPORTS main +LIBRARY 8klang +EXPORTS main diff --git a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiCore.cpp b/src/vsti/Go4kVSTiCore.cpp similarity index 96% rename from 4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiCore.cpp rename to src/vsti/Go4kVSTiCore.cpp index bff46b1..6eb00ef 100644 --- a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiCore.cpp +++ b/src/vsti/Go4kVSTiCore.cpp @@ -1,3480 +1,3480 @@ -#include "Go4kVSTiCore.h" - -#include - -#include "Go4kVSTiGUI.h" -#include "..\..\win\resource.h" -#include - -#include -#include -#include -#include - -DWORD versiontag10 = 0x30316b34; // 4k10 -DWORD versiontag11 = 0x31316b34; // 4k11 -DWORD versiontag12 = 0x32316b34; // 4k12 -DWORD versiontag13 = 0x33316b34; // 4k13 -DWORD versiontag = 0x34316b34; // 4k14 - -static SynthObject SynthObj; - -extern "C" void __stdcall go4kENV_func(); -extern "C" void __stdcall go4kVCO_func(); -extern "C" void __stdcall go4kVCF_func(); -extern "C" void __stdcall go4kDST_func(); -extern "C" void __stdcall go4kDLL_func(); -extern "C" void __stdcall go4kFOP_func(); -extern "C" void __stdcall go4kFST_func(); -extern "C" void __stdcall go4kPAN_func(); -extern "C" void __stdcall go4kOUT_func(); -extern "C" void __stdcall go4kACC_func(); -extern "C" void __stdcall go4kFLD_func(); -extern "C" void __stdcall go4kGLITCH_func(); -extern "C" DWORD go4k_delay_buffer_ofs; -extern "C" float go4k_delay_buffer; -extern "C" WORD go4k_delay_times; -extern "C" float LFO_NORMALIZE; - -typedef void (__stdcall *go4kFunc)(void); - -void __stdcall NULL_func() -{ -}; - -static go4kFunc SynthFuncs[] = -{ - NULL_func, - go4kENV_func, - go4kVCO_func, - go4kVCF_func, - go4kDST_func, - go4kDLL_func, - go4kFOP_func, - go4kFST_func, - go4kPAN_func, - go4kOUT_func, - go4kACC_func, - go4kFLD_func, - go4kGLITCH_func -}; - -static float BeatsPerMinute = 120.0f; - -// solo mode handling -static int SoloChannel = 0; -static int Solo = 0; - -// stream structures for recording sound -static DWORD samplesProcessed = 0; -static bool Recording = false; -static bool RecordingNoise = true; -static bool FirstRecordingEvent = false; -static DWORD PatternSize = 16; -static float SamplesPerTick; -static float TickScaler = 1.0f; -static DWORD MaxTicks; -static int InstrumentOn[MAX_INSTRUMENTS]; -static std::vector InstrumentRecord[MAX_INSTRUMENTS]; -static std::vector ReducedPatterns; -static std::vector PatternIndices[MAX_INSTRUMENTS]; -static int NumReducedPatterns = 0; - -// init synth -void Go4kVSTi_Init() -{ - static bool initialized = false; - // do one time initialisation here (e.g. wavtable generation ...) - if (!initialized) - { - memset(&SynthObj, 0, sizeof(SynthObj)); - BeatsPerMinute = 120.0f; - SoloChannel = 0; - Solo = 0; - Go4kVSTi_ResetPatch(); - initialized = true; - } -} - -// reset synth - -void Go4kVSTi_ClearInstrumentSlot(char channel, int slot) -{ - memset(SynthObj.InstrumentValues[channel][slot], 0, MAX_UNIT_SLOTS); - for (int i = 0; i < MAX_POLYPHONY; i++) - { - float* w = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+i].workspace[slot*MAX_UNIT_SLOTS]); - memset(w, 0, MAX_UNIT_SLOTS*4); - } -} - -void Go4kVSTi_ClearInstrumentWorkspace(char channel) -{ - // clear workspace - InstrumentWorkspace* w = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY]); - memset(w, 0, sizeof(InstrumentWorkspace)*MAX_POLYPHONY); -} - -void Go4kVSTi_ResetInstrument(char channel) -{ - char name[128]; - sprintf(name, "Instrument %d", channel+1); - memcpy(SynthObj.InstrumentNames[channel], name, strlen(name)); - - // clear values - BYTE* v = SynthObj.InstrumentValues[channel][0]; - memset(v, 0, MAX_UNITS*MAX_UNIT_SLOTS); - - // clear workspace - InstrumentWorkspace* w = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY]); - memset(w, 0, sizeof(InstrumentWorkspace)*MAX_POLYPHONY); - - // set default units - Go4kVSTi_InitSlot(SynthObj.InstrumentValues[channel][0], channel, M_ENV); - Go4kVSTi_InitSlot(SynthObj.InstrumentValues[channel][1], channel, M_VCO); - Go4kVSTi_InitSlot(SynthObj.InstrumentValues[channel][2], channel, M_FOP); ((FOP_valP)(SynthObj.InstrumentValues[channel][2]))->flags = FOP_MULP; - Go4kVSTi_InitSlot(SynthObj.InstrumentValues[channel][3], channel, M_DLL); - Go4kVSTi_InitSlot(SynthObj.InstrumentValues[channel][4], channel, M_PAN); - Go4kVSTi_InitSlot(SynthObj.InstrumentValues[channel][5], channel, M_OUT); - - SynthObj.HighestSlotIndex[channel] = 5; - SynthObj.InstrumentSignalValid[channel] = 1; - SynthObj.SignalTrace[channel] = 0.0f; - SynthObj.ControlInstrument[channel] = 0; - SynthObj.VoiceIndex[channel] = 0; - - - Go4kVSTi_ClearDelayLines(); -} - -void Go4kVSTi_ClearGlobalSlot(int slot) -{ - memset(SynthObj.GlobalValues[slot], 0, MAX_UNIT_SLOTS); - float* w = &(SynthObj.GlobalWork.workspace[slot*MAX_UNIT_SLOTS]); - memset(w, 0, MAX_UNIT_SLOTS*4); -} - -void Go4kVSTi_ClearGlobalWorkspace() -{ - // clear workspace - memset(&(SynthObj.GlobalWork), 0, sizeof(InstrumentWorkspace)); -} - -void Go4kVSTi_ResetGlobal() -{ - // clear values - memset(SynthObj.GlobalValues, 0, MAX_UNITS*MAX_UNIT_SLOTS); - - // clear workspace - memset(&(SynthObj.GlobalWork), 0, sizeof(InstrumentWorkspace)); - - // set default units - Go4kVSTi_InitSlot(SynthObj.GlobalValues[0], 16, M_ACC); ((ACC_valP)(SynthObj.GlobalValues[0]))->flags = ACC_AUX; - Go4kVSTi_InitSlot(SynthObj.GlobalValues[1], 16, M_DLL); - ((DLL_valP)(SynthObj.GlobalValues[1]))->reverb = 1; - ((DLL_valP)(SynthObj.GlobalValues[1]))->leftreverb = 1; - ((DLL_valP)(SynthObj.GlobalValues[1]))->feedback = 125; - ((DLL_valP)(SynthObj.GlobalValues[1]))->pregain = 40; - Go4kVSTi_InitSlot(SynthObj.GlobalValues[2], 16, M_FOP); ((FOP_valP)(SynthObj.GlobalValues[2]))->flags = FOP_XCH; - Go4kVSTi_InitSlot(SynthObj.GlobalValues[3], 16, M_DLL); - ((DLL_valP)(SynthObj.GlobalValues[3]))->reverb = 1; - ((DLL_valP)(SynthObj.GlobalValues[3]))->leftreverb = 0; - ((DLL_valP)(SynthObj.GlobalValues[3]))->feedback = 125; - ((DLL_valP)(SynthObj.GlobalValues[3]))->pregain = 40; - Go4kVSTi_InitSlot(SynthObj.GlobalValues[4], 16, M_FOP); ((FOP_valP)(SynthObj.GlobalValues[4]))->flags = FOP_XCH; - Go4kVSTi_InitSlot(SynthObj.GlobalValues[5], 16, M_ACC); - Go4kVSTi_InitSlot(SynthObj.GlobalValues[6], 16, M_FOP); ((FOP_valP)(SynthObj.GlobalValues[6]))->flags = FOP_ADDP2; - Go4kVSTi_InitSlot(SynthObj.GlobalValues[7], 16, M_OUT); - - SynthObj.HighestSlotIndex[16] = 7; - SynthObj.GlobalSignalValid = 1; - - PatternSize = 16; - - Go4kVSTi_ClearDelayLines(); -} - -// reset synth -void Go4kVSTi_ResetPatch() -{ - for (int i = 0; i < MAX_INSTRUMENTS; i ++) - { - Go4kVSTi_ResetInstrument(i); - } - // reset global settings - Go4kVSTi_ResetGlobal(); - - SynthObj.Polyphony = 1; -} - -void Go4kVSTi_FlipInstrumentSlots(char channel, int a, int b) -{ - int s = a; - if (b > a) - s = b; - if (s >= SynthObj.HighestSlotIndex[channel]) - SynthObj.HighestSlotIndex[channel] = s; - - DWORD temp[MAX_UNIT_SLOTS]; - BYTE* v1 = SynthObj.InstrumentValues[channel][a]; - BYTE* v2 = SynthObj.InstrumentValues[channel][b]; - memcpy(temp, v2, MAX_UNIT_SLOTS); - memcpy(v2, v1, MAX_UNIT_SLOTS); - memcpy(v1, temp, MAX_UNIT_SLOTS); - for (int i = 0; i < MAX_POLYPHONY; i++) - { - float* w1 = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+i].workspace[a*MAX_UNIT_SLOTS]); - float* w2 = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+i].workspace[b*MAX_UNIT_SLOTS]); - memcpy(temp, w2, MAX_UNIT_SLOTS*4); - memcpy(w2, w1, MAX_UNIT_SLOTS*4); - memcpy(w1, temp, MAX_UNIT_SLOTS*4); - } - // reset dll workspaces, they are invalid now - if ((v1[0] == M_DLL || v1[0] == M_GLITCH) && (v2[0] == M_DLL || v2[0] == M_GLITCH)) - { - Go4kVSTi_ClearDelayLines(); - Go4kVSTi_UpdateDelayTimes(); - } -} - -void Go4kVSTi_FlipGlobalSlots(int a, int b) -{ - int s = a; - if (b > a) - s = b; - if (s >= SynthObj.HighestSlotIndex[16]) - SynthObj.HighestSlotIndex[16] = s; - - DWORD temp[MAX_UNIT_SLOTS]; - BYTE* v1 = SynthObj.GlobalValues[a]; - BYTE* v2 = SynthObj.GlobalValues[b]; - memcpy(temp, v2, MAX_UNIT_SLOTS); - memcpy(v2, v1, MAX_UNIT_SLOTS); - memcpy(v1, temp, MAX_UNIT_SLOTS); - for (int i = 0; i < MAX_POLYPHONY; i++) - { - float* w1 = &(SynthObj.GlobalWork.workspace[a*MAX_UNIT_SLOTS]); - float* w2 = &(SynthObj.GlobalWork.workspace[b*MAX_UNIT_SLOTS]); - memcpy(temp, w2, MAX_UNIT_SLOTS*4); - memcpy(w2, w1, MAX_UNIT_SLOTS*4); - memcpy(w1, temp, MAX_UNIT_SLOTS*4); - } - // reset dll workspaces, they are invalid now - if ((v1[0] == M_DLL || v1[0] == M_GLITCH) && (v2[0] == M_DLL || v2[0] == M_GLITCH)) - { - Go4kVSTi_ClearDelayLines(); - Go4kVSTi_UpdateDelayTimes(); - } -} - -// init a unit slot -void Go4kVSTi_InitSlot(BYTE* slot, int channel, int type) -{ - // set default values - slot[0] = type; - if (type == M_ENV) - { - ENV_valP v = (ENV_valP)slot; - v->attac = 64; - v->decay = 64; - v->sustain = 64; - v->release = 64; - v->gain = 128; - } - if (type == M_VCO) - { - VCO_valP v = (VCO_valP)slot; - v->transpose = 64; - v->detune = 64; - v->phaseofs = 0; - v->gain =0x55; - v->color = 64; - v->shape = 64; - v->gain = 128; - v->flags = VCO_SINE; - } - if (type == M_VCF) - { - VCF_valP v = (VCF_valP)slot; - v->freq = 64; - v->res = 64; - v->type = VCF_LOWPASS; - } - if (type == M_DST) - { - DST_valP v = (DST_valP)slot; - v->drive = 64; - v->snhfreq = 128; - v->stereo = 0; - } - if (type == M_DLL) - { - DLL_valP v = (DLL_valP)slot; - v->reverb = 0; - v->delay = 0; - v->count = 1; - v->pregain = 64; - v->dry = 128; - v->feedback = 64; - v->damp = 64; - v->guidelay = 40; - v->synctype = 1; - v->leftreverb = 0; - v->depth = 0; - v->freq = 0; - } - if (type == M_FOP) - { - FOP_valP v = (FOP_valP)slot; - v->flags = FOP_MULP; - } - if (type == M_FST) - { - FST_valP v = (FST_valP)slot; - v->amount = 64; - v->type = FST_SET; - v->dest_stack = -1; - v->dest_unit = -1; - v->dest_slot = -1; - v->dest_id = -1; - } - if (type == M_PAN) - { - PAN_valP v = (PAN_valP)slot; - v->panning = 64; - } - if (type == M_OUT) - { - OUT_valP v = (OUT_valP)slot; - v->gain = 64; - v->auxsend = 0; - } - if (type == M_ACC) - { - ACC_valP v = (ACC_valP)slot; - v->flags = ACC_OUT; - } - if (type == M_FLD) - { - FLD_valP v = (FLD_valP)slot; - v->value = 64; - } - if (type == M_GLITCH) - { - GLITCH_valP v = (GLITCH_valP)slot; - v->active = 0; - v->dry = 0; - v->dsize = 64; - v->dpitch = 64; - v->guidelay = 40; - } -} - -// init a instrument slot -void Go4kVSTi_InitInstrumentSlot(char channel, int s, int type) -{ - if (s >= SynthObj.HighestSlotIndex[channel]) - SynthObj.HighestSlotIndex[channel] = s; - // clear values and workspace - Go4kVSTi_ClearInstrumentSlot(channel, s); - // init with default values - Go4kVSTi_InitSlot(SynthObj.InstrumentValues[channel][s], channel, type); - if (type == M_DLL || type == M_GLITCH) - { - Go4kVSTi_ClearDelayLines(); - Go4kVSTi_UpdateDelayTimes(); - } -} - -// init a global slot -void Go4kVSTi_InitGlobalSlot(int s, int type) -{ - if (s >= SynthObj.HighestSlotIndex[16]) - SynthObj.HighestSlotIndex[16] = s; - // clear values and workspace - Go4kVSTi_ClearGlobalSlot(s); - // init with default values - Go4kVSTi_InitSlot(SynthObj.GlobalValues[s], 16, type); - if (type == M_DLL || type == M_GLITCH) - { - Go4kVSTi_ClearDelayLines(); - Go4kVSTi_UpdateDelayTimes(); - } -} - -// panic -void Go4kVSTi_Panic() -{ - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - // clear workspace - InstrumentWorkspace* w = &(SynthObj.InstrumentWork[i*MAX_POLYPHONY]); - memset(w, 0, sizeof(InstrumentWorkspace)*MAX_POLYPHONY); - SynthObj.SignalTrace[i] = 0.0f; - } - // clear workspace - memset(&(SynthObj.GlobalWork), 0, sizeof(InstrumentWorkspace)); - Go4kVSTi_ClearDelayLines(); -} - -static float delayTimeFraction[33] = -{ - 4.0f * (1.0f/32.0f) * (2.0f/3.0f), - 4.0f * (1.0f/32.0f), - 4.0f * (1.0f/32.0f) * (3.0f/2.0f), - 4.0f * (1.0f/16.0f) * (2.0f/3.0f), - 4.0f * (1.0f/16.0f), - 4.0f * (1.0f/16.0f) * (3.0f/2.0f), - 4.0f * (1.0f/8.0f) * (2.0f/3.0f), - 4.0f * (1.0f/8.0f), - 4.0f * (1.0f/8.0f) * (3.0f/2.0f), - 4.0f * (1.0f/4.0f) * (2.0f/3.0f), - 4.0f * (1.0f/4.0f), - 4.0f * (1.0f/4.0f) * (3.0f/2.0f), - 4.0f * (1.0f/2.0f) * (2.0f/3.0f), - 4.0f * (1.0f/2.0f), - 4.0f * (1.0f/2.0f) * (3.0f/2.0f), - 4.0f * (1.0f) * (2.0f/3.0f), - 4.0f * (1.0f), - 4.0f * (1.0f) * (3.0f/2.0f), - 4.0f * (2.0f) * (2.0f/3.0f), - 4.0f * (2.0f), - 4.0f * (2.0f) * (3.0f/2.0f), - 4.0f * (3.0f/8.0f), - 4.0f * (5.0f/8.0f), - 4.0f * (7.0f/8.0f), - 4.0f * (9.0f/8.0f), - 4.0f * (11.0f/8.0f), - 4.0f * (13.0f/8.0f), - 4.0f * (15.0f/8.0f), - 4.0f * (3.0f/4.0f), - 4.0f * (5.0f/4.0f), - 4.0f * (7.0f/4.0f), - 4.0f * (3.0f/2.0f), - 4.0f * (3.0f/2.0f), -}; - -void Go4kVSTi_UpdateDelayTimes() -{ - int delayindex = 17; - for (int i = 0; i <= MAX_INSTRUMENTS; i++) - { - for (int u = 0; u < MAX_UNITS; u++) - { - DLL_valP v; - if (i < MAX_INSTRUMENTS) - v = (DLL_valP)(SynthObj.InstrumentValues[i][u]); - else - v = (DLL_valP)(SynthObj.GlobalValues[u]); - - if (v->id == M_DLL) - { - //DLL_valP v = (DLL_valP)(SynthObj.InstrumentValues[i][u]); - if (v->reverb) - { - if (v->leftreverb) - { - v->delay = 1; - v->count = 8; - } - else - { - v->delay = 9; - v->count = 8; - } - } - else - { - int delay; - if (v->synctype == 2) - { - (&go4k_delay_times)[delayindex] = 0; // added for debug. doesnt hurt though - v->delay = 0; - v->count = 1; - } - else - { - if (v->synctype == 1) - { - float ftime; - float quarterlength = 60.0f/Go4kVSTi_GetBPM(); - ftime = quarterlength*delayTimeFraction[v->guidelay>>2]; - delay = 44100.0f*ftime; - if (delay >= 65536) - delay = 65535; - } - else - { - delay = v->guidelay*16; - } - (&go4k_delay_times)[delayindex] = delay; - v->delay = delayindex; - v->count = 1; - } - delayindex++; - } - } - - if (v->id == M_GLITCH) - { - GLITCH_valP v2 = (GLITCH_valP)(v); - int delay; - float ftime; - float quarterlength = 60.0f/Go4kVSTi_GetBPM(); - ftime = quarterlength*delayTimeFraction[v2->guidelay>>2]; - delay = 44100.0f*ftime*0.25; // slice time is in fractions per beat (therefore / 4) - if (delay >= 65536) - delay = 65535; - (&go4k_delay_times)[delayindex] = delay; - v2->delay = delayindex; - - delayindex++; - } - } - } -} - -// clear delay lines -void Go4kVSTi_ClearDelayLines() -{ - memset((&go4k_delay_buffer), 0, 16*16*((65536+5)*4)); -} - -// set global bpm -void Go4kVSTi_SetBPM(float bpm) -{ - BeatsPerMinute = bpm; - LFO_NORMALIZE = bpm/(44100.0*60.0); - Go4kVSTi_UpdateDelayTimes(); -} - -// get bpm -float Go4kVSTi_GetBPM() -{ - return BeatsPerMinute; -} - -// enable solo mode for a single channel only -void Go4kVSTi_Solo(int channel, int solo) -{ - if (solo) - { - SoloChannel = channel; - Solo = true; - } - else - { - Solo = false; - } -} - -// sample times tick the whole synth pipeline. results are left and right output sample - -void Go4kVSTi_Tick(float *oleft, float *oright, int samples) -{ - if (Recording) - { - samplesProcessed += samples; - - if (RecordingNoise) - { - // send a stayalive signal to the host - for (int i = 0; i < samples; i++) - { - float signal = 0.03125*((float)(i & 255) / 128.0f - 1.0f); - *oleft++ = signal; - *oright++ = signal; - } - return; - } - } - - // do as many samples as requested - int s = 0; - while (s < samples) - { - float left=0.0f; - float right=0.0f; - - go4k_delay_buffer_ofs = (DWORD)(&go4k_delay_buffer); - // loop all instruments - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - // solo mode and not the channel we want? - if (Solo && i != SoloChannel) - { - // loop all voices and clear outputs - for (int p = 0; p < SynthObj.Polyphony; p++) - { - InstrumentWorkspaceP iwork = &(SynthObj.InstrumentWork[i*MAX_POLYPHONY+p]); - iwork->dlloutl = 0.0f; - iwork->dlloutr = 0.0f; - iwork->outl = 0.0f; - iwork->outr = 0.0f; - } - // adjust delay index - for (int s = 0; s < MAX_UNITS; s++) - { - BYTE* val = SynthObj.InstrumentValues[i][s]; - if (val[0] == M_DLL || val[0] == M_GLITCH) - go4k_delay_buffer_ofs += (5+65536)*4*SynthObj.Polyphony; - } - // go to next instrument - continue; - } - // if the instrument signal stack is valid and we still got a signal from that instrument - if (SynthObj.InstrumentSignalValid[i] && (fabs(SynthObj.SignalTrace[i]) > 0.00001f)) - { - float sumSignals = 0.0f; - // loop all voices - for (int p = 0; p < SynthObj.Polyphony; p++) - { - InstrumentWorkspaceP iwork = &(SynthObj.InstrumentWork[i*MAX_POLYPHONY+p]); - float *lwrk = iwork->workspace; - DWORD inote = iwork->note; - // loop each slot - for (int s = 0; s <= SynthObj.HighestSlotIndex[i]; s++) - { - BYTE* val = SynthObj.InstrumentValues[i][s]; - float *wrk = &(iwork->workspace[s*MAX_UNIT_SLOTS]); - if (val[0] == M_FST) - { - FST_valP v = (FST_valP)val; - // if a target slot is set - if (v->dest_slot != -1) - { - InstrumentWorkspaceP mwork; - int polyphonicStore = SynthObj.Polyphony; - int stack = v->dest_stack; - // local storage? - if (stack == -1 || stack == i) - { - // only store the sample in the current workspace - polyphonicStore = 1; - mwork = iwork; - } - else if (stack == MAX_INSTRUMENTS) - mwork = &(SynthObj.GlobalWork); - else - mwork = &(SynthObj.InstrumentWork[stack*MAX_POLYPHONY]); - - float* mdest = &(mwork->workspace[v->dest_unit*MAX_UNIT_SLOTS + v->dest_slot]); - float amount = (2.0f*v->amount - 128.0f)*0.0078125f; - int storetype = v->type; - for (int stc = 0; stc < polyphonicStore; stc++) - { - __asm - { - push eax - push ebx - - mov eax, mdest - mov ebx, storetype - - fld amount - fmul st(0), st(1) - - // test ebx, FST_MUL - // jz store_func_add - // fmul dword ptr [eax] - // jmp store_func_set - //store_func_add: - test ebx, FST_ADD - jz store_func_set - fadd dword ptr [eax] - store_func_set: - fstp dword ptr [eax] - store_func_done: - pop ebx - pop eax - } - mdest += sizeof(InstrumentWorkspace)/4; - } - // remove signal on pop flag - if (storetype & FST_POP) - { - _asm fstp st(0); - } - } - } - else - { - // only process if note active or dll unit - if (val[0]) - { - // set up and call synth core func - __asm - { - pushad - xor eax, eax - mov esi, val - lodsb - mov eax, dword ptr [SynthFuncs+eax*4] - mov ebx, inote - mov ecx, lwrk - mov ebp, wrk - call eax - popad - } - } - } - } - // check for end of note - DWORD envstate = *((BYTE*)(lwrk)); - if (envstate == ENV_STATE_OFF) - { - iwork->note = 0; - } - sumSignals += fabsf(iwork->outl) + fabsf(iwork->outr) + fabsf(iwork->dlloutl) + fabsf(iwork->dlloutr); - } - // update envelope follower only for non control instruments. (1s attack rate) for total instrument signal - if (SynthObj.ControlInstrument[i]) - SynthObj.SignalTrace[i] = 1.0f; - else - SynthObj.SignalTrace[i] = sumSignals + 0.999977324f * ( SynthObj.SignalTrace[i] - sumSignals ); - } - // instrument stack invalid - else - { - // adjust delay index - for (int s = 0; s < MAX_UNITS; s++) - { - BYTE* val = SynthObj.InstrumentValues[i][s]; - if (val[0] == M_DLL || val[0] == M_GLITCH) - go4k_delay_buffer_ofs += (5+65536)*4*SynthObj.Polyphony; - } - // loop all voices - for (int p = 0; p < SynthObj.Polyphony; p++) - { - InstrumentWorkspaceP iwork = &(SynthObj.InstrumentWork[i*MAX_POLYPHONY+p]); - iwork->dlloutl = 0.0f; - iwork->dlloutr = 0.0f; - iwork->outl = 0.0f; - iwork->outr = 0.0f; - } - } - } - // if the global stack is valid - if (SynthObj.GlobalSignalValid) - { - InstrumentWorkspaceP gwork = &(SynthObj.GlobalWork); - float *lwrk = gwork->workspace; - DWORD gnote = 1; - gwork->note = 1; - // loop all global slots - for (int s = 0; s <= SynthObj.HighestSlotIndex[16]; s++) - { - BYTE* val = SynthObj.GlobalValues[s]; - float *wrk = &(lwrk[s*MAX_UNIT_SLOTS]); - // manually accumulate signals - float ACCL = 0.0f; - float ACCR = 0.0f; - if (val[0] == M_ACC) - { - ACC_valP av = (ACC_valP)val; - if (av->flags == ACC_OUT) - { - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - for (int p = 0; p < SynthObj.Polyphony; p++) - { - ACCL += SynthObj.InstrumentWork[i*MAX_POLYPHONY+p].outl; - ACCR += SynthObj.InstrumentWork[i*MAX_POLYPHONY+p].outr; - } - } - } - else - { - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - for (int p = 0; p < SynthObj.Polyphony; p++) - { - ACCL += SynthObj.InstrumentWork[i*MAX_POLYPHONY+p].dlloutl; - ACCR += SynthObj.InstrumentWork[i*MAX_POLYPHONY+p].dlloutr; - } - } - } - // push the accumulated signals on the fp stack - __asm - { - fld ACCR - fld ACCL - } - } - // no ACC unit, check store - else if (val[0] == M_FST) - { - FST_valP v = (FST_valP)val; - // if a target slot is set - if (v->dest_slot != -1) - { - InstrumentWorkspaceP mwork; - int polyphonicStore = SynthObj.Polyphony; - int stack = v->dest_stack; - // local storage? - if (stack == -1 || stack == MAX_INSTRUMENTS) - { - // only store the sample in the current workspace - polyphonicStore = 1; - mwork = &(SynthObj.GlobalWork); - } - else - mwork = &(SynthObj.InstrumentWork[stack*MAX_POLYPHONY]); - - float* mdest = &(mwork->workspace[v->dest_unit*MAX_UNIT_SLOTS + v->dest_slot]); - float amount = (2.0f*v->amount - 128.0f)*0.0078125f;; - int storetype = v->type; - for (int stc = 0; stc < polyphonicStore; stc++) - { - __asm - { - push eax - push ebx - - mov eax, mdest - mov ebx, storetype - - fld amount - fmul st(0), st(1) - - // test ebx, FST_MUL - // jz gstore_func_add - // fmul dword ptr [eax] - // jmp gstore_func_set - //gstore_func_add: - test ebx, FST_ADD - jz gstore_func_set - fadd dword ptr [eax] - gstore_func_set: - fstp dword ptr [eax] - gstore_func_done: - pop ebx - pop eax - } - mdest += sizeof(InstrumentWorkspace)/4; - } - // remove signal on pop flag - if (storetype & FST_POP) - { - _asm fstp st(0); - } - } - } - // just call synth core func - else - { - if (val[0]) - { - __asm - { - pushad - xor eax, eax - mov esi, val - lodsb - mov eax, dword ptr [SynthFuncs+eax*4] - mov ebx, gnote - mov ecx, lwrk - mov ebp, wrk - call eax - popad - } - } - } - } - left = gwork->outl; - right = gwork->outr; - } - - // clip - if (left < -1.0f) - left = -1.0f; - if (left > 1.0f) - left = 1.0f; - if (right < -1.0f) - right = -1.0f; - if (right > 1.0f) - right = 1.0f; - - *(oleft++) = left; - *(oright++) = right; - - s++; - } // end sample loop -} - -//////////////////////////////////////////////////////////////////////////// -// -// Synth input processing -// -//////////////////////////////////////////////////////////////////////////// - -// prepare for recording the midi stream -void Go4kVSTi_Record(bool record, bool recordingNoise, int patternsize, float patternquant) -{ - Recording = record; - RecordingNoise = recordingNoise; - // if we started recording, clear all record streams - if (Recording) - { - TickScaler = patternquant; - PatternSize = (int)(patternsize*TickScaler); - // set first recording event variable to true to enable start time reset on the first occuring event - FirstRecordingEvent = true; - // clear all buffers - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - InstrumentOn[i] = -1; - InstrumentRecord[i].clear(); - for (int j = 0; j < 256*256; j++) - InstrumentRecord[i].push_back(0); - } - } - else - { - // nothing recorded? - if (FirstRecordingEvent == true) - return; - Recording = true; - for (int i = 0; i < MAX_INSTRUMENTS; i++) - Go4kVSTi_StopVoice(i, 0); - Recording = false; - // how many ticks did we record? - MaxTicks = (int)(0.5f+((float)samplesProcessed/SamplesPerTick)); - int remainder = MaxTicks % 16; - MaxTicks += remainder; - // fold patterns if TickScaler < 1, this is needed because directly recording at half samplerate leads to information loss - if (TickScaler < 1.0f) - { - MaxTicks = (int)((float)MaxTicks*TickScaler); - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - for (int j = 0; j < (int)(256*256*TickScaler); j++) - InstrumentRecord[i][j] = InstrumentRecord[i][(int)(j/TickScaler)]; - } - } - // open file dialog and save if desired ... - // the save function called from this one is GoSynth_SaveByteStream - GetStreamFileName(); - } -} - -// add a voice with given parameters to synth -void Go4kVSTi_AddVoice(int channel, int note) -{ - // record song - if (Recording) - { - // check for the first recording event - if (FirstRecordingEvent) - { - FirstRecordingEvent = false; - // reset time stamp for very first event - samplesProcessed = 0; - // Set samples per tick for this recording - if (TickScaler >= 1.0f) - SamplesPerTick = 44100.0f*4.0f*60.0f/(BeatsPerMinute*16*TickScaler); - else - SamplesPerTick = 44100.0f*4.0f*60.0f/(BeatsPerMinute*16); - } - int CurrentTick = (int)(0.5f+((float)samplesProcessed/SamplesPerTick)); - if (InstrumentOn[channel] >= 0) - { - for (int i = CurrentTick-1; i > InstrumentOn[channel]; i--) - { - if (!InstrumentRecord[channel][i]) - InstrumentRecord[channel][i] = -1; - } - } - if (!InstrumentRecord[channel][CurrentTick]) - { - InstrumentRecord[channel][CurrentTick] = note; - InstrumentOn[channel] = CurrentTick; - } - - // no signals to synth when using recording noise - if (RecordingNoise == true) - return; - } - - InstrumentWorkspaceP work,work2; - work = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+0]); - work->release = 1; - work2 = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+1]); - work2->release = 1; - // filp worspace - if (SynthObj.Polyphony > 1) - { - work = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+SynthObj.VoiceIndex[channel]]); - SynthObj.VoiceIndex[channel] = SynthObj.VoiceIndex[channel] ^ 0x1; - } - // add new note - memset(work, 0, (2+MAX_UNITS*MAX_UNIT_SLOTS)*4); - work->note = note; - SynthObj.SignalTrace[channel] = 1.0f; - // check if its a controll instrument which is played - SynthObj.ControlInstrument[channel] = 1; - for (int i = 0; i < MAX_UNITS; i++) - { - if (SynthObj.InstrumentValues[channel][i][0] == M_OUT) - { - SynthObj.ControlInstrument[channel] = 0; - break; - } - } -} - -// stop a voice with given parameters in synth -void Go4kVSTi_StopVoice(int channel, int note) -{ - // record song - if (Recording) - { - int CurrentTick = (int)(0.5f+((float)samplesProcessed/SamplesPerTick)); - if (InstrumentOn[channel] >= 0) - { - for (int i = CurrentTick-1; i > InstrumentOn[channel]; i--) - { - if (!InstrumentRecord[channel][i]) - InstrumentRecord[channel][i] = -1; - } - } -// if (!InstrumentRecord[channel][CurrentTick]) - InstrumentOn[channel] = -1; - - // no signals to synth when only using recording noise - if (RecordingNoise == true) - return; - } - - InstrumentWorkspaceP work,work2; - // release notes - work = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+0]); - work->release = 1; - work2 = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+1]); - work2->release = 1; -} - -//---------------------------------------------------------------------------------------------------- -// convenience functions for loading and storing patches and instruments -//---------------------------------------------------------------------------------------------------- - -void FlipSlotModulations(int stack, int unit1, int unit2) -{ - // look in all instruments if a store unit had its target on one of the changed units - for (int i = 0; i <= MAX_INSTRUMENTS; i++) - { - BYTE* values; - if (i < MAX_INSTRUMENTS) - values = SynthObj.InstrumentValues[i][0]; - else - values = SynthObj.GlobalValues[0]; - for (int u = 0; u < MAX_UNITS; u++) - { - if (values[u*MAX_UNIT_SLOTS+0] == M_FST) - { - FST_valP v = (FST_valP)(&values[u*MAX_UNIT_SLOTS+0]); - - int target_inst; - if (v->dest_stack == -1) - target_inst = i; - else - target_inst = v->dest_stack; - - // the store points to another stack, so continue - if (target_inst != stack) - continue; - - // a up/down process - if (unit2 != -1) - { - // if the target unit was unit1 or unit2 realign target unit - if (v->dest_unit == unit1) - { - v->dest_unit = unit2; - } - else if (v->dest_unit == unit2) - { - v->dest_unit = unit1; - } - } - } - } - } -} - -// autoconvert 1.0 instrument stacks -bool Autoconvert10(int stack) -{ - // get desired stack - BYTE* values; - if (stack < MAX_INSTRUMENTS) - values = SynthObj.InstrumentValues[stack][0]; - else - values = SynthObj.GlobalValues[0]; - - // replace the delay with the new one - for (int u = 0; u < MAX_UNITS; u++) - { - if (values[u*MAX_UNIT_SLOTS+0] == M_DLL) - { - DLL10_val ov; - memcpy(&ov, &values[u*MAX_UNIT_SLOTS+0], sizeof(DLL10_val)); - DLL_valP nv = (DLL_valP)(&values[u*MAX_UNIT_SLOTS+0]); - nv->id = ov.id; - nv->pregain = ov.pregain; - nv->dry = ov.dry; - nv->feedback = ov.feedback; - nv->damp = ov.damp; - nv->freq = 0; - nv->depth = 0; - nv->guidelay = ov.guidelay; - nv->synctype = ov.synctype; - nv->leftreverb = ov.leftreverb; - nv->reverb = ov.reverb; - } - } - return true; -} - -// autoconvert 1.1 instrument stacks -bool Autoconvert11(int stack) -{ - // get desired stack - BYTE* values; - if (stack < MAX_INSTRUMENTS) - values = SynthObj.InstrumentValues[stack][0]; - else - values = SynthObj.GlobalValues[0]; - - // replace the osc with the new one - for (int u = 0; u < MAX_UNITS; u++) - { - if (values[u*MAX_UNIT_SLOTS+0] == M_VCO) - { - VCO11_val ov; - memcpy(&ov, &values[u*MAX_UNIT_SLOTS+0], sizeof(VCO11_val)); - VCO_valP nv = (VCO_valP)(&values[u*MAX_UNIT_SLOTS+0]); - nv->id = ov.id; - nv->transpose = ov.transpose; - nv->detune = ov.detune; - nv->phaseofs = ov.phaseofs; - nv->gate = 0x55; - nv->color = ov.color; - nv->shape = ov.shape; - nv->gain = ov.gain; - nv->flags = ov.flags; - } - } - return true; -} - -// autoconvert 1.3 instrument stacks -bool Autoconvert13(int stack) -{ - // get desired stack - BYTE* values; - if (stack < MAX_INSTRUMENTS) - values = SynthObj.InstrumentValues[stack][0]; - else - values = SynthObj.GlobalValues[0]; - - // replace the osc with the new one - for (int u = 0; u < MAX_UNITS; u++) - { - if (values[u*MAX_UNIT_SLOTS+0] == M_VCO) - { - VCO_valP nv = (VCO_valP)(&values[u*MAX_UNIT_SLOTS+0]); - // correct sine color as it has a meaning now in 1.4 format - if (nv->flags & VCO_SINE) - nv->color = 128; - } - } - return true; -} - - -// load patch data -void Go4kVSTi_LoadPatch(char *filename) -{ - Go4kVSTi_ResetPatch(); - FILE *file = fopen(filename, "rb"); - if (file) - { - DWORD version; - bool version10 = false; - bool version11 = false; - bool version12 = false; - bool version13 = false; - fread(&version, 1, 4, file); - if (versiontag != version) - { - // version 1.3 file - if (version == versiontag13) - { - // only mulp2 unit added and layout for instruments changed, no need for message - //MessageBox(0,"Autoconvert. Please save file again", "1.3 File Format", MB_OK | MB_SETFOREGROUND); - version13 = true; - } - // version 1.2 file - else if (version == versiontag12) - { - // only fld unit added, no need for message - //MessageBox(0,"Autoconvert. Please save file again", "1.2 File Format", MB_OK | MB_SETFOREGROUND); - version12 = true; - version13 = true; - } - // version 1.1 file - else if (version == versiontag11) - { - MessageBox(0,"Autoconvert. Please save file again", "1.1 File Format", MB_OK | MB_SETFOREGROUND); - version11 = true; - version12 = true; - version13 = true; - } - // version 1.0 file - else if (version == versiontag10) - { - MessageBox(0,"Autoconvert. Please save file again", "1.0 File Format", MB_OK | MB_SETFOREGROUND); - version10 = true; - version11 = true; - version12 = true; - version13 = true; - } - // newer format than supported - else - { - MessageBox(0,"The file was created with a newer version of 4klang.", "File Format Error", MB_ICONERROR | MB_SETFOREGROUND); - fclose(file); - return; - } - } - - // read data - fread(&(SynthObj.Polyphony), 1, 4, file); - fread(SynthObj.InstrumentNames, 1, MAX_INSTRUMENTS*64, file); - for (int i=0; i> 1)) - { - ret++; - } - return ret; -} - -struct SynthUses -{ - bool env_gm; - bool env_adrm; - - bool vco_phaseofs; - bool vco_shape; - bool vco_fm; - bool vco_pm; - bool vco_tm; - bool vco_dm; - bool vco_cm; - bool vco_gm; - bool vco_sm; - bool vco_gate; - bool vco_stereo; - - bool vcf_fm; - bool vcf_rm; - bool vcf_stereo; - - bool dst_use; - bool dst_snh; - bool dst_dm; - bool dst_sm; - bool dst_stereo; - - bool dll_use; - bool dll_notesync; - bool dll_damp; - bool dll_chorus; - bool dll_use_mod; - bool dll_pm; - bool dll_fm; - bool dll_im; - bool dll_dm; - bool dll_sm; - bool dll_am; - - bool pan_use; - bool pan_pm; - - bool fstg_use; - - bool out_am; - bool out_gm; - - bool fld_use; - bool fld_vm; - - bool glitch_use; -}; - -void GetUses(SynthUses *uses, bool InstrumentUsed[]) -{ - for (int i = 0; i <= MAX_INSTRUMENTS; i++) - { - // skip usage checks for non used instruments - if (i < MAX_INSTRUMENTS) - if (!InstrumentUsed[i]) - continue; - - for (int u = 0; u < MAX_UNITS; u++) - { - BYTE *v; - if (i < MAX_INSTRUMENTS) - v = SynthObj.InstrumentValues[i][u]; - else - v = SynthObj.GlobalValues[u]; - - if (v[0] == M_VCO) - { - if (((VCO_valP)v)->phaseofs != 0) - uses->vco_phaseofs = true; - if (((VCO_valP)v)->shape != 64) - uses->vco_shape = true; - if (((VCO_valP)v)->flags & VCO_GATE) - uses->vco_gate = true; - if (((VCO_valP)v)->flags & VCO_STEREO) - uses->vco_stereo = true; - } - if (v[0] == M_VCF) - { - if (((VCF_valP)v)->type & VCF_STEREO) - uses->vcf_stereo = true; - } - if (v[0] == M_DST) - { - uses->dst_use = true; - if (((DST_valP)v)->snhfreq != 128) - uses->dst_snh = true; - if (((DST_valP)v)->stereo & VCF_STEREO) - uses->dst_stereo = true; - } - if (v[0] == M_DLL) - { - uses->dll_use = true; - if (((DLL_valP)v)->synctype == 2) - uses->dll_notesync = true; - if (((DLL_valP)v)->damp > 0) - uses->dll_damp = true; - if ((((DLL_valP)v)->freq > 0) && (((DLL_valP)v)->depth > 0)) - uses->dll_chorus = true; - } - if (v[0] == M_PAN) - { - if (((PAN_valP)v)->panning != 64) - uses->pan_use = true; - } - if (v[0] == M_FLD) - { - uses->fld_use = true; - } - if (v[0] == M_GLITCH) - { - uses->glitch_use = true; - } - if (v[0] == M_FST) - { - if ((((FST_valP)v)->dest_stack != -1) && (((FST_valP)v)->dest_stack != i)) - uses->fstg_use = true; - - InstrumentWorkspaceP mwork; - int stack = ((FST_valP)v)->dest_stack; - int unit = ((FST_valP)v)->dest_unit; - int slot = ((FST_valP)v)->dest_slot; - // local storage? - if (stack == -1 || stack == i) - { - stack = i; - } - else - { - uses->fstg_use = true; - } - BYTE *v2; - if (stack < MAX_INSTRUMENTS) - v2 = SynthObj.InstrumentValues[stack][unit]; - else - v2 = SynthObj.GlobalValues[unit]; - - if (v2[0] == M_ENV) - { - if (slot == 2) - uses->env_gm = true; - if (slot == 3) - uses->env_adrm = true; - if (slot == 4) - uses->env_adrm = true; - if (slot == 6) - uses->env_adrm = true; - } - if (v2[0] == M_VCO) - { - if (slot == 1) - uses->vco_tm = true; - if (slot == 2) - uses->vco_dm = true; - if (slot == 3) - uses->vco_fm = true; - if (slot == 4) - uses->vco_pm = true; - if (slot == 5) - uses->vco_cm = true; - if (slot == 6) - uses->vco_sm = true; - if (slot == 7) - uses->vco_gm = true; - } - if (v2[0] == M_VCF) - { - if (slot == 4) - uses->vcf_fm = true; - if (slot == 5) - uses->vcf_rm = true; - } - if (v2[0] == M_DST) - { - if (slot == 2) - uses->dst_dm = true; - if (slot == 3) - uses->dst_sm = true; - } - if (v2[0] == M_DLL) - { - if (slot == 0) - { - uses->dll_pm = true; - uses->dll_use_mod = true; - } - if (slot == 1) - { - uses->dll_fm = true; - uses->dll_use_mod = true; - } - if (slot == 2) - { - uses->dll_im = true; - uses->dll_use_mod = true; - } - if (slot == 3) - { - uses->dll_dm = true; - uses->dll_damp = true; - uses->dll_use_mod = true; - } - if (slot == 4) - { - uses->dll_sm = true; - uses->dll_use_mod = true; - } - if (slot == 5) - { - uses->dll_am = true; - uses->dll_use_mod = true; - } - } - if (v2[0] == M_PAN) - { - if (slot == 0) - uses->pan_pm = true; - } - if (v2[0] == M_OUT) - { - if (slot == 0) - uses->out_am = true; - if (slot == 1) - uses->out_gm = true; - } - if (v2[0] == M_FLD) - { - if (slot == 0) - uses->fld_vm = true; - } - // if (v2[0] == M_GLITCH) - // { - // if (slot == 0) - // uses->glitch_am = true; - // } - } - } - } -} - -void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, int useenotevalues, int clipoutput, int undenormalize, int objformat, int output16) -{ - std::string incfile = filename; - // extract path - std::string fpath = filename; - int sp = fpath.find_last_of("/"); - int bp = fpath.find_last_of("\\"); - if (sp < bp) - sp = bp; - std::string storePath = fpath.substr(0, sp); - - SynthUses mergeUses; - memset(&mergeUses, 0, sizeof(SynthUses)); - int mergeMaxInst = 0; - int mergeMaxPatterns = 0; - int mergeNumReducedPatterns = 0; - std::vector mergePatternIndices[MAX_INSTRUMENTS]; - std::string mergeCommandString; - std::string mergeValueString; - int mergeDelayTimes = 0; - std::vector mergeDelays; - -#ifndef _8KLANG - // init reduced patterns for primary plugin - ReducedPatterns.clear(); - NumReducedPatterns = 0; - // add NULL pattern - for (int i = 0; i < PatternSize; i++) - { - ReducedPatterns.push_back(0); - } -#else - // load merge info if available - std::string mergefile = storePath + "/8klang.merge"; - FILE *mfile = fopen(mergefile.c_str(), "rb"); - if (mfile) - { - // read unit usage info block for primary plugin - fread(&mergeUses, sizeof(SynthUses), 1, mfile); - // read number of instruments for primary plugin - fread(&mergeMaxInst, 4, 1, mfile); - // read max number of used patterns for primary plugin - fread(&mergeMaxPatterns, 4, 1, mfile); - // read and add reduced patterns from primary plugin - fread(&mergeNumReducedPatterns, 4, 1, mfile); - for (int i = 0; i < mergeNumReducedPatterns*PatternSize; i++) - { - int rpv = 0; - fread(&rpv, 4, 1, mfile); - ReducedPatterns.push_back(rpv); - } - // read pattern list for primary plugin - for (int i = 0; i < mergeMaxInst; i++) - { - for (int j = 0; j < mergeMaxPatterns; j++) - { - int pi = 0; - fread(&pi, 4, 1, mfile); - mergePatternIndices[i].push_back(pi); - } - } - char c; - // read command strings - while (true) - { - fread(&c, 1, 1, mfile); - if (c == 0) - break; - mergeCommandString += c; - }; - // read value strings - while (true) - { - fread(&c, 1, 1, mfile); - if (c == 0) - break; - mergeValueString += c; - }; - - - fread(&mergeDelayTimes, 4, 1, mfile); - for (int i = 0; i < mergeDelayTimes; i++) - { - int delaytime; - fread(&delaytime, 4, 1, mfile); - mergeDelays.push_back(delaytime); - } - - fclose(mfile); - } -#endif - - std::string pfilepath = storePath + "/patterns.dbg"; - FILE *pfile = fopen(pfilepath.c_str(), "wb"); - // now add minimal reduced instrument patterns - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - fprintf(pfile, "Instrument%d:\n", i); - PatternIndices[i].clear(); - // loop all patterns - for (int j = 0; j < MaxTicks/PatternSize; j++) - { - for (int l = 0; l < PatternSize; l++) - { - char bv = InstrumentRecord[i][j*PatternSize+l]; - if (bv >= 0) - fprintf(pfile, "%d, ", bv); - else - fprintf(pfile, "HLD, ", bv); - } - fprintf(pfile, "\n"); - - int pindex = j; - bool found = false; - // compare each tick of the current pattern to all already reduced patterns - for (int k = 0; k < ReducedPatterns.size()/PatternSize; k++) - { - bool patternMatch = true; - for (int l = 0; l < PatternSize; l++) - { - if (InstrumentRecord[i][j*PatternSize+l] != ReducedPatterns[k*PatternSize+l]) - { - patternMatch = false; - break; - } - } - if (patternMatch) - { - NumReducedPatterns++; - pindex = k; - found = true; - break; - } - } - // add new pattern if necessary - if (!found) - { - for (int k = 0; k < PatternSize; k++) - { - ReducedPatterns.push_back(InstrumentRecord[i][j*PatternSize+k]); - } - pindex = (ReducedPatterns.size()/PatternSize)-1; - } - // add new pattern index - PatternIndices[i].push_back(pindex); - } - } - fclose(pfile); - - int maxinst = 0; - FILE *file = fopen(incfile.c_str(), "w"); - if (file) - { - bool InstrumentUsed[MAX_INSTRUMENTS]; - // determine max instrument count - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - InstrumentUsed[i] = false; - for (int j = 0; j < PatternIndices[i].size(); j++) - { - if (PatternIndices[i][j]) - { - InstrumentUsed[i] = true; - break; - } - } - } - // determine max instrument count and create a mapping instrument index -> used instrument index - int InstrumentIndex[MAX_INSTRUMENTS]; - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - // dummy init - InstrumentIndex[i] = -1; - if (InstrumentUsed[i]) - { - InstrumentIndex[i] = maxinst; - maxinst++; - } - - } - std::vector delay_times; - std::vector delay_indices; - bool hasReverb = false; - bool hasNoteSync = false; -#ifdef _8KLANG - //m get delaytimes and index from primary plugin - for (int i = 0; i < mergeDelayTimes; i++) - { - delay_times.push_back(mergeDelays[i]); - if (i < 17) - delay_indices.push_back(i); - } -#else - // add notesync and reverb times - for (int i = 0; i < 17; i++) - { - DWORD times = (&go4k_delay_times)[i]; - delay_times.push_back(times); - delay_indices.push_back(i); - } - delay_times[0] = 0; -#endif - for (int i = 0; i <= MAX_INSTRUMENTS; i++) - { - for (int u = 0; u < MAX_UNITS; u++) - { - // // used instrument or global? - if (InstrumentUsed[i] || i == MAX_INSTRUMENTS) - { - DLL_valP v; - if (i < MAX_INSTRUMENTS) - v = (DLL_valP)(SynthObj.InstrumentValues[i][u]); - else - v = (DLL_valP)(SynthObj.GlobalValues[u]); - - if (v->id == M_DLL) - { - if (!v->reverb) - { - // if not notesync - if (v->synctype != 2) - { - DWORD times = (&go4k_delay_times)[delay_indices.size()]; - // check if indexed value already existed - int found = -1; - for (int j = 17; j < delay_times.size(); j++) - { - if (delay_times[j] == times) - { - found = j; - break; - } - } - if (found != -1) - { - // already in list, so let index point to that one - delay_indices.push_back(found); - } - else - { - // new value, so push it - delay_times.push_back(times); - delay_indices.push_back(delay_times.size()-1); - } - } - else - { - hasNoteSync = true; - delay_indices.push_back(0); - } - } - else - { - hasReverb = true; - } - } - if (v->id == M_GLITCH) - { - DWORD times = (&go4k_delay_times)[delay_indices.size()]; - // check if indexed value already existed - int found = -1; - for (int j = 17; j < delay_times.size(); j++) - { - if (delay_times[j] == times) - { - found = j; - break; - } - } - if (found != -1) - { - // already in list, so let index point to that one - delay_indices.push_back(found); - } - else - { - // new value, so push it - delay_times.push_back(times); - delay_indices.push_back(delay_times.size()-1); - } - } - } - // no used instrument - else - { - DLL_valP v; - v = (DLL_valP)(SynthObj.InstrumentValues[i][u]); - if (v->id == M_DLL) - { - if (!v->reverb) - { - // just push a dummy index - delay_indices.push_back(-1); - } - } - if (v->id == M_GLITCH) - { - // just push a dummy index - delay_indices.push_back(-1); - } - } - } - } -// rarely needed anyway -#if 0 - // if we dont have reverb, remove values and adjust indices - if (!hasReverb) - { - // move values - for (int i = 17; i < delay_times.size(); i++) - { - delay_times[i-16] = delay_times[i]; - } - // remove obsolete values - for (int i = 0; i < 16; i++) - { - delay_times.pop_back(); - } - // adjust indices - for (int i = 0; i < delay_indices.size(); i++) - { - if (delay_indices[i] != 0) - delay_indices[i] -= 16; - } - } - // if we dont have notesync, remove values and adjust indices - if (!hasNoteSync) - { - // move values - for (int i = 1; i < delay_times.size(); i++) - { - delay_times[i-1] = delay_times[i]; - } - // remove obsolete values - delay_times.pop_back(); - // adjust indices - for (int i = 0; i < delay_indices.size(); i++) - { - delay_indices[i] -= 1; - } - } -#endif - - SynthUses uses; -#ifndef _8KLANG - memset(&uses, 0, sizeof(SynthUses)); -#else - memcpy(&uses, &mergeUses, sizeof(SynthUses)); -#endif - GetUses(&uses, InstrumentUsed); - - // write inc file - fprintf(file, "%%macro export_func 1\n"); -// fprintf(file, " %%define %%1 _%%1\n"); - fprintf(file, " global _%%1\n"); - fprintf(file, " _%%1:\n"); - fprintf(file, "%%endmacro\n"); - -// fprintf(file, "%%macro export_dword_array 2\n"); -// fprintf(file, " %%define %%1 _%%1\n"); -// fprintf(file, " global %%1\n"); -// fprintf(file, " %%1 resd %%2\n"); -// fprintf(file, "%%endmacro\n"); - -/* if (objformat == 0) - MessageBox(0,"WINDOWS","",MB_OK); - if (objformat == 1) - MessageBox(0,"LINUX","",MB_OK); - if (objformat == 2) - MessageBox(0,"MACOSX","",MB_OK); -*/ - - if (objformat == 0) // 0:windows, 1:linux, 2:osx - { - // use sections only for windows, - // linux doesnt have any crinkler like packer to take advantage of multiple sections - // and osx export has a bug in current nasm and is not able to export custom sections - fprintf(file, "%%define USE_SECTIONS\n"); - } - - fprintf(file, "%%define SAMPLE_RATE %d\n", 44100); - fprintf(file, "%%define MAX_INSTRUMENTS %d\n", maxinst + mergeMaxInst); - fprintf(file, "%%define MAX_VOICES %d\n", SynthObj.Polyphony); - fprintf(file, "%%define HLD 1\n"); - fprintf(file, "%%define BPM %f\n", BeatsPerMinute); - fprintf(file, "%%define MAX_PATTERNS %d\n", mergeMaxPatterns > PatternIndices[0].size() ? mergeMaxPatterns : PatternIndices[0].size()); - fprintf(file, "%%define PATTERN_SIZE_SHIFT %d\n", GetShift2(PatternSize)); - fprintf(file, "%%define PATTERN_SIZE (1 << PATTERN_SIZE_SHIFT)\n"); - fprintf(file, "%%define MAX_TICKS (MAX_PATTERNS*PATTERN_SIZE)\n"); - fprintf(file, "%%define SAMPLES_PER_TICK %d\n", (int)(44100.0f*4.0f*60.0f/(BeatsPerMinute*16*TickScaler))); - fprintf(file, "%%define DEF_LFO_NORMALIZE %.10f\n", LFO_NORMALIZE); - fprintf(file, "%%define MAX_SAMPLES (SAMPLES_PER_TICK*MAX_TICKS)\n"); - fprintf(file, "%s%%define GO4K_USE_16BIT_OUTPUT\n",output16?"":";"); - fprintf(file, ";%%define GO4K_USE_GROOVE_PATTERN\n"); - fprintf(file, "%s%%define GO4K_USE_ENVELOPE_RECORDINGS\n",useenvlevels?"":";"); - fprintf(file, "%s%%define GO4K_USE_NOTE_RECORDINGS\n",useenotevalues?"":";"); - if (undenormalize) - fprintf(file, "%%define GO4K_USE_UNDENORMALIZE\n"); - if (clipoutput) - fprintf(file, "%%define GO4K_CLIP_OUTPUT\n"); - if (uses.dst_use) - fprintf(file, "%%define GO4K_USE_DST\n"); - if (uses.dll_use) - fprintf(file, "%%define GO4K_USE_DLL\n"); - if (uses.pan_use) - fprintf(file, "%%define GO4K_USE_PAN\n"); - fprintf(file, "%%define GO4K_USE_GLOBAL_DLL\n"); - if (uses.fstg_use) - fprintf(file, "%%define GO4K_USE_FSTG\n"); - if (uses.fld_use) - fprintf(file, "%%define GO4K_USE_FLD\n"); - if (uses.glitch_use) - fprintf(file, "%%define GO4K_USE_GLITCH\n"); - fprintf(file, "%%define GO4K_USE_ENV_CHECK\n"); - if (uses.env_gm) - fprintf(file, "%%define GO4K_USE_ENV_MOD_GM\n"); - if (uses.env_adrm) - fprintf(file, "%%define GO4K_USE_ENV_MOD_ADR\n"); - fprintf(file, "%%define GO4K_USE_VCO_CHECK\n"); - if (uses.vco_phaseofs) - fprintf(file, "%%define GO4K_USE_VCO_PHASE_OFFSET\n"); - if (uses.vco_shape) - fprintf(file, "%%define GO4K_USE_VCO_SHAPE\n"); - if (uses.vco_gate) - fprintf(file, "%%define GO4K_USE_VCO_GATE\n"); - if (uses.vco_fm) - fprintf(file, "%%define GO4K_USE_VCO_MOD_FM\n"); - if (uses.vco_pm) - fprintf(file, "%%define GO4K_USE_VCO_MOD_PM\n"); - if (uses.vco_tm) - fprintf(file, "%%define GO4K_USE_VCO_MOD_TM\n"); - if (uses.vco_dm) - fprintf(file, "%%define GO4K_USE_VCO_MOD_DM\n"); - if (uses.vco_cm) - fprintf(file, "%%define GO4K_USE_VCO_MOD_CM\n"); - if (uses.vco_gm) - fprintf(file, "%%define GO4K_USE_VCO_MOD_GM\n"); - if (uses.vco_sm) - fprintf(file, "%%define GO4K_USE_VCO_MOD_SM\n"); - if (uses.vco_stereo) - fprintf(file, "%%define GO4K_USE_VCO_STEREO\n"); - fprintf(file, "%%define GO4K_USE_VCF_CHECK\n"); - if (uses.vcf_fm) - fprintf(file, "%%define GO4K_USE_VCF_MOD_FM\n"); - if (uses.vcf_rm) - fprintf(file, "%%define GO4K_USE_VCF_MOD_RM\n"); - fprintf(file, "%%define GO4K_USE_VCF_HIGH\n"); - fprintf(file, "%%define GO4K_USE_VCF_BAND\n"); - fprintf(file, "%%define GO4K_USE_VCF_PEAK\n"); - if (uses.vcf_stereo) - fprintf(file, "%%define GO4K_USE_VCF_STEREO\n"); - fprintf(file, "%%define GO4K_USE_DST_CHECK\n"); - if (uses.dst_snh) - fprintf(file, "%%define GO4K_USE_DST_SH\n"); - if (uses.dst_dm) - fprintf(file, "%%define GO4K_USE_DST_MOD_DM\n"); - if (uses.dst_sm) - fprintf(file, "%%define GO4K_USE_DST_MOD_SH\n"); - if (uses.dst_stereo) - fprintf(file, "%%define GO4K_USE_DST_STEREO\n"); - if (uses.dll_notesync) - fprintf(file, "%%define GO4K_USE_DLL_NOTE_SYNC\n"); - if (uses.dll_chorus) - fprintf(file, "%%define GO4K_USE_DLL_CHORUS\n"); - fprintf(file, "%%define GO4K_USE_DLL_CHORUS_CLAMP\n"); - if (uses.dll_damp) - fprintf(file, "%%define GO4K_USE_DLL_DAMP\n"); - fprintf(file, "%%define GO4K_USE_DLL_DC_FILTER\n"); - fprintf(file, "%%define GO4K_USE_FSTG_CHECK\n"); - if (uses.pan_pm) - fprintf(file, "%%define GO4K_USE_PAN_MOD\n"); - if (uses.out_am) - fprintf(file, "%%define GO4K_USE_OUT_MOD_AM\n"); - if (uses.out_gm) - fprintf(file, "%%define GO4K_USE_OUT_MOD_GM\n"); - fprintf(file, "%%define GO4K_USE_WAVESHAPER_CLIP\n"); - if (uses.fld_vm) - fprintf(file, "%%define GO4K_USE_FLD_MOD_VM\n"); - if (uses.dll_use_mod) - fprintf(file, "%%define GO4K_USE_DLL_MOD\n"); - if (uses.dll_pm) - fprintf(file, "%%define GO4K_USE_DLL_MOD_PM\n"); - if (uses.dll_fm) - fprintf(file, "%%define GO4K_USE_DLL_MOD_FM\n"); - if (uses.dll_im) - fprintf(file, "%%define GO4K_USE_DLL_MOD_IM\n"); - if (uses.dll_dm) - fprintf(file, "%%define GO4K_USE_DLL_MOD_DM\n"); - if (uses.dll_sm) - fprintf(file, "%%define GO4K_USE_DLL_MOD_SM\n"); - if (uses.dll_am) - fprintf(file, "%%define GO4K_USE_DLL_MOD_AM\n"); - - fprintf(file, "%%define MAX_DELAY 65536\n"); - fprintf(file, "%%define MAX_UNITS 64\n"); - fprintf(file, "%%define MAX_UNIT_SLOTS 16\n"); - fprintf(file, "%%define GO4K_BEGIN_CMDDEF(def_name)\n"); - fprintf(file, "%%define GO4K_END_CMDDEF db 0\n"); - fprintf(file, "%%define GO4K_BEGIN_PARAMDEF(def_name)\n"); - fprintf(file, "%%define GO4K_END_PARAMDEF\n"); - - fprintf(file, "GO4K_ENV_ID equ 1\n"); - fprintf(file, "%%macro GO4K_ENV 5\n"); - fprintf(file, " db %%1\n"); - fprintf(file, " db %%2\n"); - fprintf(file, " db %%3\n"); - fprintf(file, " db %%4\n"); - fprintf(file, " db %%5\n"); - fprintf(file, "%%endmacro\n"); - fprintf(file, "%%define ATTAC(val) val \n"); - fprintf(file, "%%define DECAY(val) val \n"); - fprintf(file, "%%define SUSTAIN(val) val \n"); - fprintf(file, "%%define RELEASE(val) val \n"); - fprintf(file, "%%define GAIN(val) val \n"); - fprintf(file, "struc go4kENV_val\n"); - fprintf(file, " .attac resd 1\n"); - fprintf(file, " .decay resd 1\n"); - fprintf(file, " .sustain resd 1\n"); - fprintf(file, " .release resd 1\n"); - fprintf(file, " .gain resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "struc go4kENV_wrk\n"); - fprintf(file, " .state resd 1\n"); - fprintf(file, " .level resd 1\n"); - fprintf(file, " .gm resd 1\n"); - fprintf(file, " .am resd 1\n"); - fprintf(file, " .dm resd 1\n"); - fprintf(file, " .sm resd 1\n"); - fprintf(file, " .rm resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "%%define ENV_STATE_ATTAC 0\n"); - fprintf(file, "%%define ENV_STATE_DECAY 1\n"); - fprintf(file, "%%define ENV_STATE_SUSTAIN 2\n"); - fprintf(file, "%%define ENV_STATE_RELEASE 3\n"); - fprintf(file, "%%define ENV_STATE_OFF 4\n"); - - fprintf(file, "GO4K_VCO_ID equ 2\n"); - fprintf(file, "%%macro GO4K_VCO 8\n"); - fprintf(file, " db %%1\n"); - fprintf(file, " db %%2\n"); - fprintf(file, "%%ifdef GO4K_USE_VCO_PHASE_OFFSET \n"); - fprintf(file, " db %%3\n"); - fprintf(file, "%%endif \n"); - fprintf(file, "%%ifdef GO4K_USE_VCO_GATE \n"); - fprintf(file, " db %%4\n"); - fprintf(file, "%%endif \n"); - fprintf(file, " db %%5\n"); - fprintf(file, "%%ifdef GO4K_USE_VCO_SHAPE \n"); - fprintf(file, " db %%6\n"); - fprintf(file, "%%endif \n"); - fprintf(file, " db %%7\n"); - fprintf(file, " db %%8\n"); - fprintf(file, "%%endmacro\n"); - fprintf(file, "%%define TRANSPOSE(val) val \n"); - fprintf(file, "%%define DETUNE(val) val \n"); - fprintf(file, "%%define PHASE(val) val \n"); - fprintf(file, "%%define GATES(val) val \n"); - fprintf(file, "%%define COLOR(val) val \n"); - fprintf(file, "%%define SHAPE(val) val \n"); - fprintf(file, "%%define FLAGS(val) val \n"); - fprintf(file, "%%define SINE 0x01\n"); - fprintf(file, "%%define TRISAW 0x02\n"); - fprintf(file, "%%define PULSE 0x04\n"); - fprintf(file, "%%define NOISE 0x08\n"); - fprintf(file, "%%define LFO 0x10\n"); - fprintf(file, "%%define GATE 0x20\n"); - fprintf(file, "%%define VCO_STEREO 0x40\n"); - fprintf(file, "struc go4kVCO_val\n"); - fprintf(file, " .transpose resd 1\n"); - fprintf(file, " .detune resd 1\n"); - fprintf(file, "%%ifdef GO4K_USE_VCO_PHASE_OFFSET \n"); - fprintf(file, " .phaseofs resd 1\n"); - fprintf(file, "%%endif \n"); - fprintf(file, "%%ifdef GO4K_USE_VCO_GATE \n"); - fprintf(file, " .gate resd 1\n"); - fprintf(file, "%%endif \n"); - fprintf(file, " .color resd 1\n"); - fprintf(file, "%%ifdef GO4K_USE_VCO_SHAPE \n"); - fprintf(file, " .shape resd 1\n"); - fprintf(file, "%%endif \n"); - fprintf(file, " .gain resd 1\n"); - fprintf(file, " .flags resd 1 \n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "struc go4kVCO_wrk\n"); - fprintf(file, " .phase resd 1\n"); - fprintf(file, " .tm resd 1\n"); - fprintf(file, " .dm resd 1\n"); - fprintf(file, " .fm resd 1\n"); - fprintf(file, " .pm resd 1\n"); - fprintf(file, " .cm resd 1\n"); - fprintf(file, " .sm resd 1\n"); - fprintf(file, " .gm resd 1\n"); - fprintf(file, " .phase2 resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - - fprintf(file, "GO4K_VCF_ID equ 3\n"); - fprintf(file, "%%macro GO4K_VCF 3\n"); - fprintf(file, " db %%1\n"); - fprintf(file, " db %%2\n"); - fprintf(file, " db %%3\n"); - fprintf(file, "%%endmacro\n"); - fprintf(file, "%%define LOWPASS 0x1\n"); - fprintf(file, "%%define HIGHPASS 0x2\n"); - fprintf(file, "%%define BANDPASS 0x4\n"); - fprintf(file, "%%define BANDSTOP 0x3\n"); - fprintf(file, "%%define ALLPASS 0x7\n"); - fprintf(file, "%%define PEAK 0x8\n"); - fprintf(file, "%%define STEREO 0x10\n"); - fprintf(file, "%%define FREQUENCY(val) val\n"); - fprintf(file, "%%define RESONANCE(val) val\n"); - fprintf(file, "%%define VCFTYPE(val) val\n"); - fprintf(file, "struc go4kVCF_val\n"); - fprintf(file, " .freq resd 1\n"); - fprintf(file, " .res resd 1\n"); - fprintf(file, " .type resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "struc go4kVCF_wrk\n"); - fprintf(file, " .low resd 1\n"); - fprintf(file, " .high resd 1\n"); - fprintf(file, " .band resd 1\n"); - fprintf(file, " .freq resd 1\n"); - fprintf(file, " .fm resd 1\n"); - fprintf(file, " .rm resd 1\n"); - fprintf(file, " .low2 resd 1\n"); - fprintf(file, " .high2 resd 1\n"); - fprintf(file, " .band2 resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - - fprintf(file, "GO4K_DST_ID equ 4\n"); - fprintf(file, "%%macro GO4K_DST 3\n"); - fprintf(file, " db %%1\n"); - fprintf(file, "%%ifdef GO4K_USE_DST_SH\n"); - fprintf(file, " db %%2\n"); - fprintf(file, "%%ifdef GO4K_USE_DST_STEREO\n"); - fprintf(file, " db %%3\n"); - fprintf(file, "%%endif\n"); - fprintf(file, "%%else\n"); - fprintf(file, "%%ifdef GO4K_USE_DST_STEREO\n"); - fprintf(file, " db %%3\n"); - fprintf(file, "%%endif\n"); - fprintf(file, "%%endif\n"); - fprintf(file, "%%endmacro\n"); - fprintf(file, "%%define DRIVE(val) val\n"); - fprintf(file, "%%define SNHFREQ(val) val\n"); - fprintf(file, "%%define FLAGS(val) val\n"); - fprintf(file, "struc go4kDST_val\n"); - fprintf(file, " .drive resd 1\n"); - fprintf(file, "%%ifdef GO4K_USE_DST_SH \n"); - fprintf(file, " .snhfreq resd 1\n"); - fprintf(file, "%%endif \n"); - fprintf(file, " .flags resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "struc go4kDST_wrk\n"); - fprintf(file, " .out resd 1\n"); - fprintf(file, " .snhphase resd 1\n"); - fprintf(file, " .dm resd 1\n"); - fprintf(file, " .sm resd 1\n"); - fprintf(file, " .out2 resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - - fprintf(file, "GO4K_DLL_ID equ 5\n"); - fprintf(file, "%%macro GO4K_DLL 8\n"); - fprintf(file, " db %%1\n"); - fprintf(file, " db %%2\n"); - fprintf(file, " db %%3\n"); - fprintf(file, "%%ifdef GO4K_USE_DLL_DAMP \n"); - fprintf(file, " db %%4\n"); - fprintf(file, "%%endif \n"); - fprintf(file, "%%ifdef GO4K_USE_DLL_CHORUS \n"); - fprintf(file, " db %%5\n"); - fprintf(file, " db %%6\n"); - fprintf(file, "%%endif\n"); - fprintf(file, " db %%7\n"); - fprintf(file, " db %%8\n"); - fprintf(file, "%%endmacro\n"); - fprintf(file, "%%define PREGAIN(val) val\n"); - fprintf(file, "%%define DRY(val) val\n"); - fprintf(file, "%%define FEEDBACK(val) val\n"); - fprintf(file, "%%define DEPTH(val) val\n"); - fprintf(file, "%%define DAMP(val) val\n"); - fprintf(file, "%%define DELAY(val) val\n"); - fprintf(file, "%%define COUNT(val) val\n"); - fprintf(file, "struc go4kDLL_val\n"); - fprintf(file, " .pregain resd 1\n"); - fprintf(file, " .dry resd 1\n"); - fprintf(file, " .feedback resd 1\n"); - fprintf(file, "%%ifdef GO4K_USE_DLL_DAMP \n"); - fprintf(file, " .damp resd 1 \n"); - fprintf(file, "%%endif\n"); - fprintf(file, "%%ifdef GO4K_USE_DLL_CHORUS\n"); - fprintf(file, " .freq resd 1\n"); - fprintf(file, " .depth\n"); - fprintf(file, "%%endif\n"); - fprintf(file, " .delay resd 1\n"); - fprintf(file, " .count resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "struc go4kDLL_wrk\n"); - fprintf(file, " .index resd 1\n"); - fprintf(file, " .store resd 1\n"); - fprintf(file, " .dcin resd 1\n"); - fprintf(file, " .dcout resd 1\n"); - fprintf(file, "%%ifdef GO4K_USE_DLL_CHORUS\n"); - fprintf(file, " .phase resd 1\n"); - fprintf(file, "%%endif\n"); - fprintf(file, " .buffer resd MAX_DELAY\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "struc go4kDLL_wrk2\n"); - fprintf(file, " .pm resd 1\n"); - fprintf(file, " .fm resd 1\n"); - fprintf(file, " .im resd 1\n"); - fprintf(file, " .dm resd 1\n"); - fprintf(file, " .sm resd 1\n"); - fprintf(file, " .am resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - - fprintf(file, "GO4K_FOP_ID equ 6\n"); - fprintf(file, "%%macro GO4K_FOP 1\n"); - fprintf(file, " db %%1\n"); - fprintf(file, "%%endmacro\n"); - fprintf(file, "%%define OP(val) val\n"); - fprintf(file, "%%define FOP_POP 0x1\n"); - fprintf(file, "%%define FOP_ADDP 0x2\n"); - fprintf(file, "%%define FOP_MULP 0x3\n"); - fprintf(file, "%%define FOP_PUSH 0x4\n"); - fprintf(file, "%%define FOP_XCH 0x5\n"); - fprintf(file, "%%define FOP_ADD 0x6\n"); - fprintf(file, "%%define FOP_MUL 0x7\n"); - fprintf(file, "%%define FOP_ADDP2 0x8\n"); - fprintf(file, "%%define FOP_LOADNOTE 0x9\n"); - fprintf(file, "%%define FOP_MULP2 0xa\n"); - fprintf(file, "struc go4kFOP_val\n"); - fprintf(file, " .flags resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "struc go4kFOP_wrk\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - - fprintf(file, "GO4K_FST_ID equ 7\n"); - fprintf(file, "%%macro GO4K_FST 2\n"); - fprintf(file, " db %%1\n"); - fprintf(file, " dw %%2\n"); - fprintf(file, "%%endmacro\n"); - fprintf(file, "%%define AMOUNT(val) val\n"); - fprintf(file, "%%define DEST(val) val\n"); - fprintf(file, "%%define FST_SET 0x0000\n"); - fprintf(file, "%%define FST_ADD 0x4000\n"); - fprintf(file, "%%define FST_POP 0x8000\n"); - fprintf(file, "struc go4kFST_val\n"); - fprintf(file, " .amount resd 1\n"); - fprintf(file, " .op1 resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "struc go4kFST_wrk\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - - fprintf(file, "GO4K_PAN_ID equ 8\n"); - fprintf(file, "%%macro GO4K_PAN 1\n"); - fprintf(file, "%%ifdef GO4K_USE_PAN\n"); - fprintf(file, " db %%1\n"); - fprintf(file, "%%endif\n"); - fprintf(file, "%%endmacro\n"); - fprintf(file, "%%define PANNING(val) val\n"); - fprintf(file, "struc go4kPAN_val\n"); - fprintf(file, "%%ifdef GO4K_USE_PAN\n"); - fprintf(file, " .panning resd 1\n"); - fprintf(file, "%%endif\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "struc go4kPAN_wrk\n"); - fprintf(file, " .pm resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - - fprintf(file, "GO4K_OUT_ID equ 9\n"); - fprintf(file, "%%macro GO4K_OUT 2\n"); - fprintf(file, " db %%1\n"); - fprintf(file, "%%ifdef GO4K_USE_GLOBAL_DLL \n"); - fprintf(file, " db %%2\n"); - fprintf(file, "%%endif \n"); - fprintf(file, "%%endmacro\n"); - fprintf(file, "%%define AUXSEND(val) val\n"); - fprintf(file, "struc go4kOUT_val\n"); - fprintf(file, " .gain resd 1\n"); - fprintf(file, "%%ifdef GO4K_USE_GLOBAL_DLL \n"); - fprintf(file, " .auxsend resd 1\n"); - fprintf(file, "%%endif\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "struc go4kOUT_wrk\n"); - fprintf(file, " .am resd 1\n"); - fprintf(file, " .gm resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - - fprintf(file, "GO4K_ACC_ID equ 10\n"); - fprintf(file, "%%macro GO4K_ACC 1\n"); - fprintf(file, " db %%1\n"); - fprintf(file, "%%endmacro\n"); - fprintf(file, "%%define OUTPUT 0\n"); - fprintf(file, "%%define AUX 8\n"); - fprintf(file, "%%define ACCTYPE(val) val\n"); - fprintf(file, "struc go4kACC_val\n"); - fprintf(file, " .acctype resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "struc go4kACC_wrk\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - - fprintf(file, "%%ifdef GO4K_USE_FLD\n"); - fprintf(file, "GO4K_FLD_ID equ 11\n"); - fprintf(file, "%%macro GO4K_FLD 1\n"); - fprintf(file, " db %%1\n"); - fprintf(file, "%%endmacro\n"); - fprintf(file, "%%define VALUE(val) val\n"); - fprintf(file, "struc go4kFLD_val\n"); - fprintf(file, " .value resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "struc go4kFLD_wrk\n"); - fprintf(file, " .vm resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "%%endif\n"); - - fprintf(file, "%%ifdef GO4K_USE_GLITCH\n"); - fprintf(file, "GO4K_GLITCH_ID equ 12\n"); - fprintf(file, "%%macro GO4K_GLITCH 5\n"); - fprintf(file, " db %%1\n"); - fprintf(file, " db %%2\n"); - fprintf(file, " db %%3\n"); - fprintf(file, " db %%4\n"); - fprintf(file, " db %%5\n"); - fprintf(file, "%%endmacro\n"); - fprintf(file, "%%define ACTIVE(val) val\n"); - fprintf(file, "%%define SLICEFACTOR(val)val\n"); - fprintf(file, "%%define PITCHFACTOR(val)val\n"); - fprintf(file, "%%define SLICESIZE(val) val\n"); - fprintf(file, "struc go4kGLITCH_val\n"); - fprintf(file, " .active resd 1\n"); - fprintf(file, " .dry resd 1\n"); - fprintf(file, " .dsize resd 1\n"); - fprintf(file, " .dpitch resd 1\n"); - fprintf(file, " .slicesize resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "struc go4kGLITCH_wrk\n"); - fprintf(file, " .index resd 1\n"); - fprintf(file, " .store resd 1\n"); - fprintf(file, " .slizesize resd 1\n"); - fprintf(file, " .slicepitch resd 1\n"); - fprintf(file, " .unused resd 1\n"); - fprintf(file, " .buffer resd MAX_DELAY\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "struc go4kGLITCH_wrk2\n"); - fprintf(file, " .am resd 1\n"); - fprintf(file, " .dm resd 1\n"); - fprintf(file, " .sm resd 1\n"); - fprintf(file, " .pm resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "%%endif\n"); - - fprintf(file, "%%ifdef GO4K_USE_FSTG\n"); - fprintf(file, "GO4K_FSTG_ID equ 13\n"); - fprintf(file, "%%macro GO4K_FSTG 2\n"); - fprintf(file, " db %%1\n"); - fprintf(file, " dw %%2\n"); - fprintf(file, "%%endmacro\n"); - fprintf(file, "struc go4kFSTG_val\n"); - fprintf(file, " .amount resd 1\n"); - fprintf(file, " .op1 resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "struc go4kFSTG_wrk\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - fprintf(file, "%%endif\n"); - - fprintf(file, "struc go4k_instrument\n"); - fprintf(file, " .release resd 1\n"); - fprintf(file, " .note resd 1\n"); - fprintf(file, " .workspace resd MAX_UNITS*MAX_UNIT_SLOTS\n"); - fprintf(file, " .dlloutl resd 1\n"); - fprintf(file, " .dlloutr resd 1\n"); - fprintf(file, " .outl resd 1\n"); - fprintf(file, " .outr resd 1\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - - fprintf(file, "struc go4k_synth\n"); - fprintf(file, " .instruments resb go4k_instrument.size * MAX_INSTRUMENTS * MAX_VOICES\n"); - fprintf(file, " .global resb go4k_instrument.size * MAX_VOICES\n"); - fprintf(file, " .size\n"); - fprintf(file, "endstruc\n"); - - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // the patterns - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - fprintf(file, "%%ifdef USE_SECTIONS\n"); - fprintf(file, "section .g4kmuc1 data align=1\n"); - fprintf(file, "%%else\n"); - fprintf(file, "section .data align=1\n"); - fprintf(file, "%%endif\n"); - fprintf(file, "go4k_patterns\n"); - for (int i = 0; i < ReducedPatterns.size()/PatternSize; i++) - { - fprintf(file, "\tdb\t"); - for (int j = 0; j < PatternSize; j++) - { - if (ReducedPatterns[i*PatternSize+j] >= 0) - fprintf(file, "%d, ", ReducedPatterns[i*PatternSize+j]); - else - fprintf(file, "HLD, "); - } - fprintf(file, "\n"); - } - fprintf(file, "go4k_patterns_end\n"); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // the pattern indices - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - fprintf(file, "%%ifdef USE_SECTIONS\n"); - fprintf(file, "section .g4kmuc2 data align=1\n"); - fprintf(file, "%%else\n"); - fprintf(file, "section .data\n"); - fprintf(file, "%%endif\n"); - fprintf(file, "go4k_pattern_lists\n"); -#ifdef _8KLANG - // write primary plugins pattern indices - for (int i = 0; i < mergeMaxInst; i++) - { - fprintf(file, "Instrument%dList\t\tdb\t", i); - for (int j = 0; j < mergeMaxPatterns; j++) - { - fprintf(file, "%d, ", mergePatternIndices[i][j]); - } - // fill up with 0 indices when secondary plugin has more patterns - for (int j = mergeMaxPatterns; j < PatternIndices[0].size(); j++) - { - fprintf(file, "0, "); - } - fprintf(file, "\n"); - } -#endif - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - if (!InstrumentUsed[i]) continue; - fprintf(file, "Instrument%dList\t\tdb\t", i + mergeMaxInst); - for (int j = 0; j < PatternIndices[i].size(); j++) - { - fprintf(file, "%d, ", PatternIndices[i][j]); - } - // fill up with 0 indices when primary plugin had more patterns - for (int j = PatternIndices[0].size(); j < mergeMaxPatterns; j++) - { - fprintf(file, "0, "); - } - fprintf(file, "\n"); - } - - fprintf(file, "go4k_pattern_lists_end\n"); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // the instrument commands - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - fprintf(file, "%%ifdef USE_SECTIONS\n"); - fprintf(file, "section .g4kmuc3 data align=1\n"); - fprintf(file, "%%else\n"); - fprintf(file, "section .data\n"); - fprintf(file, "%%endif\n"); - fprintf(file, "go4k_synth_instructions\n"); - char comstr[1024]; - std::string CommandString; - -#ifdef _8KLANG - // add primary plugin commands first - fprintf(file, "%s", mergeCommandString.c_str()); -#endif - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - if (!InstrumentUsed[i]) continue; - sprintf(comstr, "GO4K_BEGIN_CMDDEF(Instrument%d)\n", i + mergeMaxInst); CommandString += comstr; - for (int u = 0; u < MAX_UNITS; u++) - { - comstr[0] = 0; - - if (SynthObj.InstrumentValues[i][u][0] == M_ENV) - sprintf(comstr, "\tdb GO4K_ENV_ID\n"); - if (SynthObj.InstrumentValues[i][u][0] == M_VCO) - sprintf(comstr, "\tdb GO4K_VCO_ID\n"); - if (SynthObj.InstrumentValues[i][u][0] == M_VCF) - sprintf(comstr, "\tdb GO4K_VCF_ID\n"); - if (SynthObj.InstrumentValues[i][u][0] == M_DST) - sprintf(comstr, "\tdb GO4K_DST_ID\n"); - if (SynthObj.InstrumentValues[i][u][0] == M_DLL) - sprintf(comstr, "\tdb GO4K_DLL_ID\n"); - if (SynthObj.InstrumentValues[i][u][0] == M_FOP) - sprintf(comstr, "\tdb GO4K_FOP_ID\n"); - if (SynthObj.InstrumentValues[i][u][0] == M_FST) - { - FST_valP v = (FST_valP)(SynthObj.InstrumentValues[i][u]); - // local storage - if (v->dest_stack == -1 || v->dest_stack == i) - sprintf(comstr, "\tdb GO4K_FST_ID\n"); - // global storage - else - sprintf(comstr, "\tdb GO4K_FSTG_ID\n"); - } - if (SynthObj.InstrumentValues[i][u][0] == M_PAN) - sprintf(comstr, "\tdb GO4K_PAN_ID\n"); - if (SynthObj.InstrumentValues[i][u][0] == M_OUT) - sprintf(comstr, "\tdb GO4K_OUT_ID\n"); - if (SynthObj.InstrumentValues[i][u][0] == M_ACC) - sprintf(comstr, "\tdb GO4K_ACC_ID\n"); - if (SynthObj.InstrumentValues[i][u][0] == M_FLD) - sprintf(comstr, "\tdb GO4K_FLD_ID\n"); - if (SynthObj.InstrumentValues[i][u][0] == M_GLITCH) - sprintf(comstr, "\tdb GO4K_GLITCH_ID\n"); - - CommandString += comstr; - } - sprintf(comstr, "GO4K_END_CMDDEF\n"); CommandString += comstr; - }; - fprintf(file, "%s", CommandString.c_str()); - - fprintf(file, "GO4K_BEGIN_CMDDEF(Global)\n"); - for (int u = 0; u < MAX_UNITS; u++) - { - if (SynthObj.GlobalValues[u][0] == M_ENV) - fprintf(file, "\tdb GO4K_ENV_ID\n"); - if (SynthObj.GlobalValues[u][0] == M_VCO) - fprintf(file, "\tdb GO4K_VCO_ID\n"); - if (SynthObj.GlobalValues[u][0] == M_VCF) - fprintf(file, "\tdb GO4K_VCF_ID\n"); - if (SynthObj.GlobalValues[u][0] == M_DST) - fprintf(file, "\tdb GO4K_DST_ID\n"); - if (SynthObj.GlobalValues[u][0] == M_DLL) - fprintf(file, "\tdb GO4K_DLL_ID\n"); - if (SynthObj.GlobalValues[u][0] == M_FOP) - fprintf(file, "\tdb GO4K_FOP_ID\n"); - if (SynthObj.GlobalValues[u][0] == M_FST) - { - FST_valP v = (FST_valP)(SynthObj.GlobalValues[u]); - // local storage - if (v->dest_stack == -1 || v->dest_stack == MAX_INSTRUMENTS) - fprintf(file, "\tdb GO4K_FST_ID\n"); - // global storage - else - fprintf(file, "\tdb GO4K_FSTG_ID\n"); - } - if (SynthObj.GlobalValues[u][0] == M_PAN) - fprintf(file, "\tdb GO4K_PAN_ID\n"); - if (SynthObj.GlobalValues[u][0] == M_OUT) - fprintf(file, "\tdb GO4K_OUT_ID\n"); - if (SynthObj.GlobalValues[u][0] == M_ACC) - fprintf(file, "\tdb GO4K_ACC_ID\n"); - if (SynthObj.GlobalValues[u][0] == M_FLD) - fprintf(file, "\tdb GO4K_FLD_ID\n"); - if (SynthObj.GlobalValues[u][0] == M_GLITCH) - fprintf(file, "\tdb GO4K_GLITCH_ID\n"); - } - fprintf(file, "GO4K_END_CMDDEF\n"); - fprintf(file, "go4k_synth_instructions_end\n"); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // the instrument data - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - fprintf(file, "%%ifdef USE_SECTIONS\n"); - fprintf(file, "section .g4kmuc4 data align=1\n"); - fprintf(file, "%%else\n"); - fprintf(file, "section .data\n"); - fprintf(file, "%%endif\n"); - fprintf(file, "go4k_synth_parameter_values\n"); - int delayindex = 0; - char valstr[1024]; - std::string ValueString; -#ifdef _8KLANG - // add primary plugin values first - fprintf(file, "%s", mergeValueString.c_str()); -#endif - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - if (!InstrumentUsed[i]) continue; - sprintf(valstr, "GO4K_BEGIN_PARAMDEF(Instrument%d)\n", i + mergeMaxInst); ValueString += valstr; - for (int u = 0; u < MAX_UNITS; u++) - { - valstr[0] = 0; - - if (SynthObj.InstrumentValues[i][u][0] == M_ENV) - { - ENV_valP v = (ENV_valP)(SynthObj.InstrumentValues[i][u]); - sprintf(valstr, "\tGO4K_ENV\tATTAC(%d),DECAY(%d),SUSTAIN(%d),RELEASE(%d),GAIN(%d)\n", v->attac, v->decay, v->sustain, v->release, v->gain); - } - if (SynthObj.InstrumentValues[i][u][0] == M_VCO) - { - VCO_valP v = (VCO_valP)(SynthObj.InstrumentValues[i][u]); - char type[16]; type[0] = 0; - char lfo[16]; lfo[0] = 0; - char stereo[16]; stereo[0] = 0; - if (v->flags & VCO_SINE) - sprintf(type, "SINE"); - if (v->flags & VCO_TRISAW) - sprintf(type, "TRISAW"); - if (v->flags & VCO_PULSE) - sprintf(type, "PULSE"); - if (v->flags & VCO_NOISE) - sprintf(type, "NOISE"); - if (v->flags & VCO_GATE) - sprintf(type, "GATE"); - if (v->flags & VCO_LFO) - sprintf(lfo, "|LFO"); - if (v->flags & VCO_STEREO) - sprintf(stereo, "|VCO_STEREO"); - sprintf(valstr, "\tGO4K_VCO\tTRANSPOSE(%d),DETUNE(%d),PHASE(%d),GATES(%d),COLOR(%d),SHAPE(%d),GAIN(%d),FLAGS(%s%s%s)\n", v->transpose, v->detune, v->phaseofs, v->gate, v->color, v->shape, v->gain, type, lfo, stereo); - } - if (SynthObj.InstrumentValues[i][u][0] == M_VCF) - { - VCF_valP v = (VCF_valP)(SynthObj.InstrumentValues[i][u]); - char type[16]; type[0] = 0; - char stereo[16]; stereo[0] = 0; - int t = v->type & ~VCF_STEREO; - if (t == VCF_LOWPASS) - sprintf(type, "LOWPASS"); - if (t == VCF_HIGHPASS) - sprintf(type, "HIGHPASS"); - if (t == VCF_BANDPASS) - sprintf(type, "BANDPASS"); - if (t == VCF_BANDSTOP) - sprintf(type, "BANDSTOP"); - if (t == VCF_ALLPASS) - sprintf(type, "ALLPASS"); - if (t == VCF_PEAK) - sprintf(type, "PEAK"); - if (v->type & VCF_STEREO) - sprintf(stereo, "|STEREO"); - sprintf(valstr, "\tGO4K_VCF\tFREQUENCY(%d),RESONANCE(%d),VCFTYPE(%s%s)\n", v->freq, v->res, type, stereo); - } - if (SynthObj.InstrumentValues[i][u][0] == M_DST) - { - DST_valP v = (DST_valP)(SynthObj.InstrumentValues[i][u]); - sprintf(valstr, "\tGO4K_DST\tDRIVE(%d), SNHFREQ(%d), FLAGS(%s)\n", v->drive, v->snhfreq, v->stereo & VCF_STEREO ? "STEREO" : "0"); - } - if (SynthObj.InstrumentValues[i][u][0] == M_DLL) - { - DLL_valP v = (DLL_valP)(SynthObj.InstrumentValues[i][u]); - if (v->delay < delay_indices.size()) - { - sprintf(valstr, "\tGO4K_DLL\tPREGAIN(%d),DRY(%d),FEEDBACK(%d),DAMP(%d),FREQUENCY(%d),DEPTH(%d),DELAY(%d),COUNT(%d)\n", - v->pregain, v->dry, v->feedback, v->damp, v->freq, v->depth, delay_indices[v->delay], v->count); - } - // error handling in case indices are fucked up - else - { - sprintf(valstr, "\tGO4K_DLL\tPREGAIN(%d),DRY(%d),FEEDBACK(%d),DAMP(%d),FREQUENCY(%d),DEPTH(%d),DELAY(%d),COUNT(%d) ; ERROR\n", - v->pregain, v->dry, v->feedback, v->damp, v->freq, v->depth, v->delay, v->count); - } - } - if (SynthObj.InstrumentValues[i][u][0] == M_FOP) - { - FOP_valP v = (FOP_valP)(SynthObj.InstrumentValues[i][u]); - char type[16]; type[0] = 0; - if (v->flags == FOP_POP) - sprintf(type, "FOP_POP"); - if (v->flags == FOP_PUSH) - sprintf(type, "FOP_PUSH"); - if (v->flags == FOP_XCH) - sprintf(type, "FOP_XCH"); - if (v->flags == FOP_ADD) - sprintf(type, "FOP_ADD"); - if (v->flags == FOP_ADDP) - sprintf(type, "FOP_ADDP"); - if (v->flags == FOP_MUL) - sprintf(type, "FOP_MUL"); - if (v->flags == FOP_MULP) - sprintf(type, "FOP_MULP"); - if (v->flags == FOP_ADDP2) - sprintf(type, "FOP_ADDP2"); - if (v->flags == FOP_LOADNOTE) - sprintf(type, "FOP_LOADNOTE"); - if (v->flags == FOP_MULP2) - sprintf(type, "FOP_MULP2"); - sprintf(valstr, "\tGO4K_FOP\tOP(%s)\n", type); - } - if (SynthObj.InstrumentValues[i][u][0] == M_FST) - { - FST_valP v = (FST_valP)(SynthObj.InstrumentValues[i][u]); - // local storage - if (v->dest_stack == -1 || v->dest_stack == i) - { - // skip empty units on the way to target - int emptySkip = 0; - for (int e = 0; e < v->dest_unit; e++) - { - if (SynthObj.InstrumentValues[i][e][0] == M_NONE) - emptySkip++; - } - std::string modes; - modes = "FST_SET"; - if (v->type & FST_ADD) - modes = "FST_ADD"; - //if (v->type & FST_MUL) - // modes = "FST_MUL"; - if (v->type & FST_POP) - modes += "+FST_POP"; - sprintf(valstr, "\tGO4K_FST\tAMOUNT(%d),DEST(%d*MAX_UNIT_SLOTS+%d+%s)\n", v->amount, v->dest_unit-emptySkip, v->dest_slot, modes.c_str() ); - } - // global storage - else - { - int storestack; - if (v->dest_stack == MAX_INSTRUMENTS) - storestack = maxinst; - else - storestack = InstrumentIndex[v->dest_stack] + mergeMaxInst; - // skip empty units on the way to target - int emptySkip = 0; - for (int e = 0; e < v->dest_unit; e++) - { - if (v->dest_stack == MAX_INSTRUMENTS) - { - if (SynthObj.GlobalValues[e][0] == M_NONE) - emptySkip++; - } - else - { - if (SynthObj.InstrumentValues[v->dest_stack][e][0] == M_NONE) - emptySkip++; - } - } - // invalid store target, possibly due non usage of the target instrument - if (storestack == -1) - { - sprintf(valstr, "\tGO4K_FSTG\tAMOUNT(0),DEST(7*4+go4k_instrument.workspace)\n"); - } - else - { - std::string modes; - modes = "FST_SET"; - if (v->type & FST_ADD) - modes = "FST_ADD"; - //if (v->type & FST_MUL) - // modes = "FST_MUL"; - if (v->type & FST_POP) - modes += "+FST_POP"; - sprintf(valstr, "\tGO4K_FSTG\tAMOUNT(%d),DEST((%d*go4k_instrument.size*MAX_VOICES/4)+(%d*MAX_UNIT_SLOTS+%d)+(go4k_instrument.workspace/4)+%s)\n", v->amount, storestack, v->dest_unit-emptySkip, v->dest_slot, modes.c_str()); - } - } - } - if (SynthObj.InstrumentValues[i][u][0] == M_PAN) - { - PAN_valP v = (PAN_valP)(SynthObj.InstrumentValues[i][u]); - sprintf(valstr, "\tGO4K_PAN\tPANNING(%d)\n", v->panning); - } - if (SynthObj.InstrumentValues[i][u][0] == M_OUT) - { - OUT_valP v = (OUT_valP)(SynthObj.InstrumentValues[i][u]); - sprintf(valstr, "\tGO4K_OUT\tGAIN(%d), AUXSEND(%d)\n", v->gain, v->auxsend); - } - if (SynthObj.InstrumentValues[i][u][0] == M_ACC) - { - ACC_valP v = (ACC_valP)(SynthObj.InstrumentValues[i][u]); - if (v->flags == ACC_OUT) - sprintf(valstr, "\tGO4K_ACC\tACCTYPE(OUTPUT)\n"); - else - sprintf(valstr, "\tGO4K_ACC\tACCTYPE(AUX)\n"); - } - if (SynthObj.InstrumentValues[i][u][0] == M_FLD) - { - FLD_valP v = (FLD_valP)(SynthObj.InstrumentValues[i][u]); - sprintf(valstr, "\tGO4K_FLD\tVALUE(%d)\n", v->value); - } - if (SynthObj.InstrumentValues[i][u][0] == M_GLITCH) - { - GLITCH_valP v = (GLITCH_valP)(SynthObj.InstrumentValues[i][u]); - if (v->delay < delay_indices.size()) - { - sprintf(valstr, "\tGO4K_GLITCH\tACTIVE(%d),DRY(%d),SLICEFACTOR(%d),PITCHFACTOR(%d),SLICESIZE(%d)\n", - v->active, v->dry, v->dsize, v->dpitch, delay_indices[v->delay]); - } - // error handling in case indices are fucked up - else - { - sprintf(valstr, "\tGO4K_GLITCH\tACTIVE(%d),DRY(%d),SLICEFACTOR(%d),PITCHFACTOR(%d),SLICESIZE(%d) ; ERROR\n", - v->active, v->dry, v->dsize, v->dpitch, v->delay); - } - } - - ValueString += valstr; - } - sprintf(valstr, "GO4K_END_PARAMDEF\n"); ValueString += valstr; - } - fprintf(file, "%s", ValueString.c_str()); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // the global data - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - { - fprintf(file, "GO4K_BEGIN_PARAMDEF(Global)\n"); - for (int u = 0; u < MAX_UNITS; u++) - { - if (SynthObj.GlobalValues[u][0] == M_ENV) - { - ENV_valP v = (ENV_valP)(SynthObj.GlobalValues[u]); - fprintf(file, "\tGO4K_ENV\tATTAC(%d),DECAY(%d),SUSTAIN(%d),RELEASE(%d),GAIN(%d)\n", v->attac, v->decay, v->sustain, v->release, v->gain); - } - if (SynthObj.GlobalValues[u][0] == M_VCO) - { - VCO_valP v = (VCO_valP)(SynthObj.GlobalValues[u]); - char type[16]; type[0] = 0; - char lfo[16]; lfo[0] = 0; - char stereo[16]; stereo[0] = 0; - if (v->flags & VCO_SINE) - sprintf(type, "SINE"); - if (v->flags & VCO_TRISAW) - sprintf(type, "TRISAW"); - if (v->flags & VCO_PULSE) - sprintf(type, "PULSE"); - if (v->flags & VCO_NOISE) - sprintf(type, "NOISE"); - if (v->flags & VCO_GATE) - sprintf(type, "GATE"); - if (v->flags & VCO_LFO) - sprintf(lfo, "|LFO"); - if (v->flags & VCO_STEREO) - sprintf(stereo, "|VCO_STEREO"); - fprintf(file, "\tGO4K_VCO\tTRANSPOSE(%d),DETUNE(%d),PHASE(%d),GATES(%d),COLOR(%d),SHAPE(%d),GAIN(%d),FLAGS(%s%s%s)\n", v->transpose, v->detune, v->phaseofs, v->gate, v->color, v->shape, v->gain, type, lfo, stereo); - } - if (SynthObj.GlobalValues[u][0] == M_VCF) - { - VCF_valP v = (VCF_valP)(SynthObj.GlobalValues[u]); - char type[16]; type[0] = 0; - char stereo[16]; stereo[0] = 0; - int t = v->type & ~VCF_STEREO; - if (t == VCF_LOWPASS) - sprintf(type, "LOWPASS"); - if (t == VCF_HIGHPASS) - sprintf(type, "HIGHPASS"); - if (t == VCF_BANDPASS) - sprintf(type, "BANDPASS"); - if (t == VCF_BANDSTOP) - sprintf(type, "BANDSTOP"); - if (t == VCF_ALLPASS) - sprintf(type, "ALLPASS"); - if (t == VCF_PEAK) - sprintf(type, "PEAK"); - if (v->type & VCF_STEREO) - sprintf(stereo, "|STEREO"); - fprintf(file, "\tGO4K_VCF\tFREQUENCY(%d),RESONANCE(%d),VCFTYPE(%s%s)\n", v->freq, v->res, type, stereo); - } - if (SynthObj.GlobalValues[u][0] == M_DST) - { - DST_valP v = (DST_valP)(SynthObj.GlobalValues[u]); - fprintf(file, "\tGO4K_DST\tDRIVE(%d), SNHFREQ(%d), FLAGS(%s)\n", v->drive, v->snhfreq, v->stereo & VCF_STEREO ? "STEREO" : "0"); - } - if (SynthObj.GlobalValues[u][0] == M_DLL) - { - DLL_valP v = (DLL_valP)(SynthObj.GlobalValues[u]); - if (v->delay < delay_indices.size()) - { - fprintf(file, "\tGO4K_DLL\tPREGAIN(%d),DRY(%d),FEEDBACK(%d),DAMP(%d),FREQUENCY(%d),DEPTH(%d),DELAY(%d),COUNT(%d)\n", - v->pregain, v->dry, v->feedback, v->damp, v->freq, v->depth, delay_indices[v->delay], v->count); - } - // error handling in case indices are fucked up - else - { - fprintf(file, "\tGO4K_DLL\tPREGAIN(%d),DRY(%d),FEEDBACK(%d),DAMP(%d),FREQUENCY(%d),DEPTH(%d),DELAY(%d),COUNT(%d) ; ERROR\n", - v->pregain, v->dry, v->feedback, v->damp, v->freq, v->depth, v->delay, v->count); - } - } - if (SynthObj.GlobalValues[u][0] == M_FOP) - { - FOP_valP v = (FOP_valP)(SynthObj.GlobalValues[u]); - char type[16]; type[0] = 0; - if (v->flags == FOP_POP) - sprintf(type, "FOP_POP"); - if (v->flags == FOP_PUSH) - sprintf(type, "FOP_PUSH"); - if (v->flags == FOP_XCH) - sprintf(type, "FOP_XCH"); - if (v->flags == FOP_ADD) - sprintf(type, "FOP_ADD"); - if (v->flags == FOP_ADDP) - sprintf(type, "FOP_ADDP"); - if (v->flags == FOP_MUL) - sprintf(type, "FOP_MUL"); - if (v->flags == FOP_MULP) - sprintf(type, "FOP_MULP"); - if (v->flags == FOP_ADDP2) - sprintf(type, "FOP_ADDP2"); - if (v->flags == FOP_LOADNOTE) - sprintf(type, "FOP_LOADNOTE"); - if (v->flags == FOP_MULP2) - sprintf(type, "FOP_MULP2"); - fprintf(file, "\tGO4K_FOP\tOP(%s)\n", type); - } - if (SynthObj.GlobalValues[u][0] == M_FST) - { - FST_valP v = (FST_valP)(SynthObj.GlobalValues[u]); - // local storage - if (v->dest_stack == -1 || v->dest_stack == MAX_INSTRUMENTS) - { - // skip empty units on the way to target - int emptySkip = 0; - for (int e = 0; e < v->dest_unit; e++) - { - if (SynthObj.GlobalValues[e][0] == M_NONE) - emptySkip++; - } - std::string modes; - modes = "FST_SET"; - if (v->type & FST_ADD) - modes = "FST_ADD"; - //if (v->type & FST_MUL) - // modes = "FST_MUL"; - if (v->type & FST_POP) - modes += "+FST_POP"; - fprintf(file, "\tGO4K_FST\tAMOUNT(%d),DEST(%d*MAX_UNIT_SLOTS+%d+%s)\n", v->amount, v->dest_unit-emptySkip, v->dest_slot, modes.c_str()); - } - // global storage - else - { - int storestack = InstrumentIndex[v->dest_stack] + mergeMaxInst; - // skip empty units on the way to target - int emptySkip = 0; - for (int e = 0; e < v->dest_unit; e++) - { - if (SynthObj.InstrumentValues[v->dest_stack][e][0] == M_NONE) - emptySkip++; - } - // invalid store target, possibly due non usage of the target instrument - if (storestack == -1) - { - fprintf(file, "\tGO4K_FSTG\tAMOUNT(0),DEST(7*4+go4k_instrument.workspace)\n"); - } - else - { - std::string modes; - modes = "FST_SET"; - if (v->type & FST_ADD) - modes = "FST_ADD"; - //if (v->type & FST_MUL) - // modes = "FST_MUL"; - if (v->type & FST_POP) - modes += "+FST_POP"; - fprintf(file, "\tGO4K_FSTG\tAMOUNT(%d),DEST((%d*go4k_instrument.size*MAX_VOICES/4)+(%d*MAX_UNIT_SLOTS+%d)+(go4k_instrument.workspace/4)+%s)\n", v->amount, storestack, v->dest_unit-emptySkip, v->dest_slot, modes.c_str() ); - } - } - } - if (SynthObj.GlobalValues[u][0] == M_PAN) - { - PAN_valP v = (PAN_valP)(SynthObj.GlobalValues[u]); - fprintf(file, "\tGO4K_PAN\tPANNING(%d)\n", v->panning); - } - if (SynthObj.GlobalValues[u][0] == M_OUT) - { - OUT_valP v = (OUT_valP)(SynthObj.GlobalValues[u]); - fprintf(file, "\tGO4K_OUT\tGAIN(%d), AUXSEND(%d)\n", v->gain, v->auxsend); - } - if (SynthObj.GlobalValues[u][0] == M_ACC) - { - ACC_valP v = (ACC_valP)(SynthObj.GlobalValues[u]); - if (v->flags == ACC_OUT) - fprintf(file, "\tGO4K_ACC\tACCTYPE(OUTPUT)\n"); - else - fprintf(file, "\tGO4K_ACC\tACCTYPE(AUX)\n"); - } - if (SynthObj.GlobalValues[u][0] == M_FLD) - { - FLD_valP v = (FLD_valP)(SynthObj.GlobalValues[u]); - fprintf(file, "\tGO4K_FLD\tVALUE(%d)\n", v->value); - } - if (SynthObj.GlobalValues[u][0] == M_GLITCH) - { - GLITCH_valP v = (GLITCH_valP)(SynthObj.GlobalValues[u]); - if (v->delay < delay_indices.size()) - { - fprintf(file, "\tGO4K_GLITCH\tACTIVE(%d),DRY(%d),SLICEFACTOR(%d),PITCHFACTOR(%d),SLICESIZE(%d)\n", - v->active, v->dry, v->dsize, v->dpitch, delay_indices[v->delay]); - } - // error handling in case indices are fucked up - else - { - fprintf(file, "\tGO4K_GLITCH\tACTIVE(%d),DRY(%d),SLICEFACTOR(%d),PITCHFACTOR(%d),SLICESIZE(%d) ; ERROR\n", - v->active, v->dry, v->dsize, v->dpitch, v->delay); - } - } - } - fprintf(file, "GO4K_END_PARAMDEF\n"); - } - fprintf(file, "go4k_synth_parameter_values_end\n"); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // delay line times - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // TODO: Reduction here - fprintf(file, "%%ifdef USE_SECTIONS\n"); - fprintf(file, "section .g4kmuc5 data align=1\n"); - fprintf(file, "%%else\n"); - fprintf(file, "section .data\n"); - fprintf(file, "%%endif\n"); - fprintf(file, "%%ifdef GO4K_USE_DLL\n"); - fprintf(file, "global _go4k_delay_times\n"); - fprintf(file, "_go4k_delay_times\n"); - for (int i = 0; i < delay_times.size(); i++) - { - fprintf(file, "\tdw %d\n", delay_times[i]); - } - fprintf(file, "%%endif\n"); - - fclose(file); - - - // save additional info for primary plugin so secondary can merge -#ifndef _8KLANG - std::string mergefile = storePath + "/8klang.merge"; - FILE *mfile = fopen(mergefile.c_str(), "wb"); - // write unit usage info block for primary plugin - fwrite(&uses, sizeof(SynthUses), 1, mfile); - // write number of instruments for primary plugin - fwrite(&maxinst, 4, 1, mfile); - // write max number of used patterns for primary plugin - int maxpatterns = PatternIndices[0].size(); - fwrite(&maxpatterns, 4, 1, mfile); - // write reduced patterns for primary plugin - int numreducedpatterns = ReducedPatterns.size()/PatternSize; - fwrite(&numreducedpatterns, 4, 1, mfile); - for (int i = 0; i < ReducedPatterns.size(); i++) - { - int rpv = ReducedPatterns[i]; - fwrite(&rpv, 4, 1, mfile); - } - // write pattern list for primary plugin - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - if (!InstrumentUsed[i]) continue; - for (int j = 0; j < PatternIndices[i].size(); j++) - { - int pi = PatternIndices[i][j]; - fwrite(&pi, 4, 1, mfile); - } - } - // write command strings - const char* cstr = CommandString.c_str(); - fwrite(cstr, 1, CommandString.size()+1, mfile); - // write value strings - const char* vstr = ValueString.c_str(); - fwrite(vstr, 1, ValueString.size()+1, mfile); - - // write delay times - int delaytimes = delay_times.size(); - fwrite(&delaytimes, 4, 1, mfile); - for (int i = 0; i < delay_times.size(); i++) - { - delaytimes = delay_times[i]; - fwrite(&delaytimes, 4, 1, mfile); - } - - fclose(mfile); -#endif - - } - - // write song info file - std::string infofile; - if (objformat != 0) // not windows obj - infofile = incfile.substr(0, incfile.size()-1) + "h"; - else - infofile = incfile.substr(0, incfile.size()-3) + "h"; - FILE *fnfofile = fopen(infofile.c_str(), "w"); - fprintf(fnfofile, "// some useful song defines for 4klang\n"); - fprintf(fnfofile, "#define SAMPLE_RATE %d\n", 44100); - fprintf(fnfofile, "#define BPM %f\n", BeatsPerMinute); - fprintf(fnfofile, "#define MAX_INSTRUMENTS %d\n", maxinst + mergeMaxInst); - fprintf(fnfofile, "#define MAX_PATTERNS %d\n", mergeMaxPatterns > PatternIndices[0].size() ? mergeMaxPatterns : PatternIndices[0].size()); - fprintf(fnfofile, "#define PATTERN_SIZE_SHIFT %d\n", GetShift2(PatternSize)); - fprintf(fnfofile, "#define PATTERN_SIZE (1 << PATTERN_SIZE_SHIFT)\n"); - fprintf(fnfofile, "#define MAX_TICKS (MAX_PATTERNS*PATTERN_SIZE)\n"); - fprintf(fnfofile, "#define SAMPLES_PER_TICK %d\n", ((int)(44100.0f*4.0f*60.0f/(BeatsPerMinute*16.0f*TickScaler)))); - fprintf(fnfofile, "#define MAX_SAMPLES (SAMPLES_PER_TICK*MAX_TICKS)\n"); - fprintf(fnfofile, "#define POLYPHONY %d\n", SynthObj.Polyphony); - if (output16) - { - fprintf(fnfofile, "#define INTEGER_16BIT\n"); - fprintf(fnfofile, "#define SAMPLE_TYPE short\n"); - } - else - { - fprintf(fnfofile, "#define FLOAT_32BIT\n"); - fprintf(fnfofile, "#define SAMPLE_TYPE float\n"); - } - if (objformat == 0) - { - fprintf(fnfofile, "\n#define WINDOWS_OBJECT\n\n"); - fprintf(fnfofile, "// declaration of the external synth render function, you'll always need that\n"); - fprintf(fnfofile, "extern \"C\" void __stdcall _4klang_render(void*);\n"); - fprintf(fnfofile, "// declaration of the external envelope buffer. access only if you're song was exported with that option\n"); - fprintf(fnfofile, "extern \"C\" float _4klang_envelope_buffer;\n"); - fprintf(fnfofile, "// declaration of the external note buffer. access only if you're song was exported with that option\n"); - fprintf(fnfofile, "extern \"C\" int _4klang_note_buffer;\n"); - } - if (objformat == 1) - { - fprintf(fnfofile, "\n#define LINUX_OBJECT\n\n"); - fprintf(fnfofile, "// declaration of the external synth render function, you'll always need that\n"); - fprintf(fnfofile, "extern void* __4klang_render(void*);\n"); - fprintf(fnfofile, "// declaration of the external envelope buffer. access only if you're song was exported with that option\n"); - fprintf(fnfofile, "extern float __4klang_envelope_buffer;\n"); - fprintf(fnfofile, "// declaration of the external note buffer. access only if you're song was exported with that option\n"); - fprintf(fnfofile, "extern int __4klang_note_buffer;\n"); - } - if (objformat == 2) - { - fprintf(fnfofile, "\n#define MACOSX_OBJECT\n\n"); - fprintf(fnfofile, "// declaration of the external synth render function, you'll always need that\n"); - fprintf(fnfofile, "extern void* _4klang_render(void*);\n"); - fprintf(fnfofile, "// declaration of the external envelope buffer. access only if you're song was exported with that option\n"); - fprintf(fnfofile, "extern float _4klang_envelope_buffer;\n"); - fprintf(fnfofile, "// declaration of the external note buffer. access only if you're song was exported with that option\n"); - fprintf(fnfofile, "extern int _4klang_note_buffer;\n"); - } - - fclose(fnfofile); -} - -SynthObjectP Go4kVSTi_GetSynthObject() -{ - return &SynthObj; +#include "Go4kVSTiCore.h" + +#include + +#include "Go4kVSTiGUI.h" +#include "resource.h" +#include + +#include +#include +#include +#include + +DWORD versiontag10 = 0x30316b34; // 4k10 +DWORD versiontag11 = 0x31316b34; // 4k11 +DWORD versiontag12 = 0x32316b34; // 4k12 +DWORD versiontag13 = 0x33316b34; // 4k13 +DWORD versiontag = 0x34316b34; // 4k14 + +static SynthObject SynthObj; + +extern "C" void __stdcall go4kENV_func(); +extern "C" void __stdcall go4kVCO_func(); +extern "C" void __stdcall go4kVCF_func(); +extern "C" void __stdcall go4kDST_func(); +extern "C" void __stdcall go4kDLL_func(); +extern "C" void __stdcall go4kFOP_func(); +extern "C" void __stdcall go4kFST_func(); +extern "C" void __stdcall go4kPAN_func(); +extern "C" void __stdcall go4kOUT_func(); +extern "C" void __stdcall go4kACC_func(); +extern "C" void __stdcall go4kFLD_func(); +extern "C" void __stdcall go4kGLITCH_func(); +extern "C" DWORD go4k_delay_buffer_ofs; +extern "C" float go4k_delay_buffer; +extern "C" WORD go4k_delay_times; +extern "C" float LFO_NORMALIZE; + +typedef void (__stdcall *go4kFunc)(void); + +void __stdcall NULL_func() +{ +}; + +static go4kFunc SynthFuncs[] = +{ + NULL_func, + go4kENV_func, + go4kVCO_func, + go4kVCF_func, + go4kDST_func, + go4kDLL_func, + go4kFOP_func, + go4kFST_func, + go4kPAN_func, + go4kOUT_func, + go4kACC_func, + go4kFLD_func, + go4kGLITCH_func +}; + +static float BeatsPerMinute = 120.0f; + +// solo mode handling +static int SoloChannel = 0; +static int Solo = 0; + +// stream structures for recording sound +static DWORD samplesProcessed = 0; +static bool Recording = false; +static bool RecordingNoise = true; +static bool FirstRecordingEvent = false; +static DWORD PatternSize = 16; +static float SamplesPerTick; +static float TickScaler = 1.0f; +static DWORD MaxTicks; +static int InstrumentOn[MAX_INSTRUMENTS]; +static std::vector InstrumentRecord[MAX_INSTRUMENTS]; +static std::vector ReducedPatterns; +static std::vector PatternIndices[MAX_INSTRUMENTS]; +static int NumReducedPatterns = 0; + +// init synth +void Go4kVSTi_Init() +{ + static bool initialized = false; + // do one time initialisation here (e.g. wavtable generation ...) + if (!initialized) + { + memset(&SynthObj, 0, sizeof(SynthObj)); + BeatsPerMinute = 120.0f; + SoloChannel = 0; + Solo = 0; + Go4kVSTi_ResetPatch(); + initialized = true; + } +} + +// reset synth + +void Go4kVSTi_ClearInstrumentSlot(char channel, int slot) +{ + memset(SynthObj.InstrumentValues[channel][slot], 0, MAX_UNIT_SLOTS); + for (int i = 0; i < MAX_POLYPHONY; i++) + { + float* w = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+i].workspace[slot*MAX_UNIT_SLOTS]); + memset(w, 0, MAX_UNIT_SLOTS*4); + } +} + +void Go4kVSTi_ClearInstrumentWorkspace(char channel) +{ + // clear workspace + InstrumentWorkspace* w = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY]); + memset(w, 0, sizeof(InstrumentWorkspace)*MAX_POLYPHONY); +} + +void Go4kVSTi_ResetInstrument(char channel) +{ + char name[128]; + sprintf(name, "Instrument %d", channel+1); + memcpy(SynthObj.InstrumentNames[channel], name, strlen(name)); + + // clear values + BYTE* v = SynthObj.InstrumentValues[channel][0]; + memset(v, 0, MAX_UNITS*MAX_UNIT_SLOTS); + + // clear workspace + InstrumentWorkspace* w = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY]); + memset(w, 0, sizeof(InstrumentWorkspace)*MAX_POLYPHONY); + + // set default units + Go4kVSTi_InitSlot(SynthObj.InstrumentValues[channel][0], channel, M_ENV); + Go4kVSTi_InitSlot(SynthObj.InstrumentValues[channel][1], channel, M_VCO); + Go4kVSTi_InitSlot(SynthObj.InstrumentValues[channel][2], channel, M_FOP); ((FOP_valP)(SynthObj.InstrumentValues[channel][2]))->flags = FOP_MULP; + Go4kVSTi_InitSlot(SynthObj.InstrumentValues[channel][3], channel, M_DLL); + Go4kVSTi_InitSlot(SynthObj.InstrumentValues[channel][4], channel, M_PAN); + Go4kVSTi_InitSlot(SynthObj.InstrumentValues[channel][5], channel, M_OUT); + + SynthObj.HighestSlotIndex[channel] = 5; + SynthObj.InstrumentSignalValid[channel] = 1; + SynthObj.SignalTrace[channel] = 0.0f; + SynthObj.ControlInstrument[channel] = 0; + SynthObj.VoiceIndex[channel] = 0; + + + Go4kVSTi_ClearDelayLines(); +} + +void Go4kVSTi_ClearGlobalSlot(int slot) +{ + memset(SynthObj.GlobalValues[slot], 0, MAX_UNIT_SLOTS); + float* w = &(SynthObj.GlobalWork.workspace[slot*MAX_UNIT_SLOTS]); + memset(w, 0, MAX_UNIT_SLOTS*4); +} + +void Go4kVSTi_ClearGlobalWorkspace() +{ + // clear workspace + memset(&(SynthObj.GlobalWork), 0, sizeof(InstrumentWorkspace)); +} + +void Go4kVSTi_ResetGlobal() +{ + // clear values + memset(SynthObj.GlobalValues, 0, MAX_UNITS*MAX_UNIT_SLOTS); + + // clear workspace + memset(&(SynthObj.GlobalWork), 0, sizeof(InstrumentWorkspace)); + + // set default units + Go4kVSTi_InitSlot(SynthObj.GlobalValues[0], 16, M_ACC); ((ACC_valP)(SynthObj.GlobalValues[0]))->flags = ACC_AUX; + Go4kVSTi_InitSlot(SynthObj.GlobalValues[1], 16, M_DLL); + ((DLL_valP)(SynthObj.GlobalValues[1]))->reverb = 1; + ((DLL_valP)(SynthObj.GlobalValues[1]))->leftreverb = 1; + ((DLL_valP)(SynthObj.GlobalValues[1]))->feedback = 125; + ((DLL_valP)(SynthObj.GlobalValues[1]))->pregain = 40; + Go4kVSTi_InitSlot(SynthObj.GlobalValues[2], 16, M_FOP); ((FOP_valP)(SynthObj.GlobalValues[2]))->flags = FOP_XCH; + Go4kVSTi_InitSlot(SynthObj.GlobalValues[3], 16, M_DLL); + ((DLL_valP)(SynthObj.GlobalValues[3]))->reverb = 1; + ((DLL_valP)(SynthObj.GlobalValues[3]))->leftreverb = 0; + ((DLL_valP)(SynthObj.GlobalValues[3]))->feedback = 125; + ((DLL_valP)(SynthObj.GlobalValues[3]))->pregain = 40; + Go4kVSTi_InitSlot(SynthObj.GlobalValues[4], 16, M_FOP); ((FOP_valP)(SynthObj.GlobalValues[4]))->flags = FOP_XCH; + Go4kVSTi_InitSlot(SynthObj.GlobalValues[5], 16, M_ACC); + Go4kVSTi_InitSlot(SynthObj.GlobalValues[6], 16, M_FOP); ((FOP_valP)(SynthObj.GlobalValues[6]))->flags = FOP_ADDP2; + Go4kVSTi_InitSlot(SynthObj.GlobalValues[7], 16, M_OUT); + + SynthObj.HighestSlotIndex[16] = 7; + SynthObj.GlobalSignalValid = 1; + + PatternSize = 16; + + Go4kVSTi_ClearDelayLines(); +} + +// reset synth +void Go4kVSTi_ResetPatch() +{ + for (int i = 0; i < MAX_INSTRUMENTS; i ++) + { + Go4kVSTi_ResetInstrument(i); + } + // reset global settings + Go4kVSTi_ResetGlobal(); + + SynthObj.Polyphony = 1; +} + +void Go4kVSTi_FlipInstrumentSlots(char channel, int a, int b) +{ + int s = a; + if (b > a) + s = b; + if (s >= SynthObj.HighestSlotIndex[channel]) + SynthObj.HighestSlotIndex[channel] = s; + + DWORD temp[MAX_UNIT_SLOTS]; + BYTE* v1 = SynthObj.InstrumentValues[channel][a]; + BYTE* v2 = SynthObj.InstrumentValues[channel][b]; + memcpy(temp, v2, MAX_UNIT_SLOTS); + memcpy(v2, v1, MAX_UNIT_SLOTS); + memcpy(v1, temp, MAX_UNIT_SLOTS); + for (int i = 0; i < MAX_POLYPHONY; i++) + { + float* w1 = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+i].workspace[a*MAX_UNIT_SLOTS]); + float* w2 = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+i].workspace[b*MAX_UNIT_SLOTS]); + memcpy(temp, w2, MAX_UNIT_SLOTS*4); + memcpy(w2, w1, MAX_UNIT_SLOTS*4); + memcpy(w1, temp, MAX_UNIT_SLOTS*4); + } + // reset dll workspaces, they are invalid now + if ((v1[0] == M_DLL || v1[0] == M_GLITCH) && (v2[0] == M_DLL || v2[0] == M_GLITCH)) + { + Go4kVSTi_ClearDelayLines(); + Go4kVSTi_UpdateDelayTimes(); + } +} + +void Go4kVSTi_FlipGlobalSlots(int a, int b) +{ + int s = a; + if (b > a) + s = b; + if (s >= SynthObj.HighestSlotIndex[16]) + SynthObj.HighestSlotIndex[16] = s; + + DWORD temp[MAX_UNIT_SLOTS]; + BYTE* v1 = SynthObj.GlobalValues[a]; + BYTE* v2 = SynthObj.GlobalValues[b]; + memcpy(temp, v2, MAX_UNIT_SLOTS); + memcpy(v2, v1, MAX_UNIT_SLOTS); + memcpy(v1, temp, MAX_UNIT_SLOTS); + for (int i = 0; i < MAX_POLYPHONY; i++) + { + float* w1 = &(SynthObj.GlobalWork.workspace[a*MAX_UNIT_SLOTS]); + float* w2 = &(SynthObj.GlobalWork.workspace[b*MAX_UNIT_SLOTS]); + memcpy(temp, w2, MAX_UNIT_SLOTS*4); + memcpy(w2, w1, MAX_UNIT_SLOTS*4); + memcpy(w1, temp, MAX_UNIT_SLOTS*4); + } + // reset dll workspaces, they are invalid now + if ((v1[0] == M_DLL || v1[0] == M_GLITCH) && (v2[0] == M_DLL || v2[0] == M_GLITCH)) + { + Go4kVSTi_ClearDelayLines(); + Go4kVSTi_UpdateDelayTimes(); + } +} + +// init a unit slot +void Go4kVSTi_InitSlot(BYTE* slot, int channel, int type) +{ + // set default values + slot[0] = type; + if (type == M_ENV) + { + ENV_valP v = (ENV_valP)slot; + v->attac = 64; + v->decay = 64; + v->sustain = 64; + v->release = 64; + v->gain = 128; + } + if (type == M_VCO) + { + VCO_valP v = (VCO_valP)slot; + v->transpose = 64; + v->detune = 64; + v->phaseofs = 0; + v->gain =0x55; + v->color = 64; + v->shape = 64; + v->gain = 128; + v->flags = VCO_SINE; + } + if (type == M_VCF) + { + VCF_valP v = (VCF_valP)slot; + v->freq = 64; + v->res = 64; + v->type = VCF_LOWPASS; + } + if (type == M_DST) + { + DST_valP v = (DST_valP)slot; + v->drive = 64; + v->snhfreq = 128; + v->stereo = 0; + } + if (type == M_DLL) + { + DLL_valP v = (DLL_valP)slot; + v->reverb = 0; + v->delay = 0; + v->count = 1; + v->pregain = 64; + v->dry = 128; + v->feedback = 64; + v->damp = 64; + v->guidelay = 40; + v->synctype = 1; + v->leftreverb = 0; + v->depth = 0; + v->freq = 0; + } + if (type == M_FOP) + { + FOP_valP v = (FOP_valP)slot; + v->flags = FOP_MULP; + } + if (type == M_FST) + { + FST_valP v = (FST_valP)slot; + v->amount = 64; + v->type = FST_SET; + v->dest_stack = -1; + v->dest_unit = -1; + v->dest_slot = -1; + v->dest_id = -1; + } + if (type == M_PAN) + { + PAN_valP v = (PAN_valP)slot; + v->panning = 64; + } + if (type == M_OUT) + { + OUT_valP v = (OUT_valP)slot; + v->gain = 64; + v->auxsend = 0; + } + if (type == M_ACC) + { + ACC_valP v = (ACC_valP)slot; + v->flags = ACC_OUT; + } + if (type == M_FLD) + { + FLD_valP v = (FLD_valP)slot; + v->value = 64; + } + if (type == M_GLITCH) + { + GLITCH_valP v = (GLITCH_valP)slot; + v->active = 0; + v->dry = 0; + v->dsize = 64; + v->dpitch = 64; + v->guidelay = 40; + } +} + +// init a instrument slot +void Go4kVSTi_InitInstrumentSlot(char channel, int s, int type) +{ + if (s >= SynthObj.HighestSlotIndex[channel]) + SynthObj.HighestSlotIndex[channel] = s; + // clear values and workspace + Go4kVSTi_ClearInstrumentSlot(channel, s); + // init with default values + Go4kVSTi_InitSlot(SynthObj.InstrumentValues[channel][s], channel, type); + if (type == M_DLL || type == M_GLITCH) + { + Go4kVSTi_ClearDelayLines(); + Go4kVSTi_UpdateDelayTimes(); + } +} + +// init a global slot +void Go4kVSTi_InitGlobalSlot(int s, int type) +{ + if (s >= SynthObj.HighestSlotIndex[16]) + SynthObj.HighestSlotIndex[16] = s; + // clear values and workspace + Go4kVSTi_ClearGlobalSlot(s); + // init with default values + Go4kVSTi_InitSlot(SynthObj.GlobalValues[s], 16, type); + if (type == M_DLL || type == M_GLITCH) + { + Go4kVSTi_ClearDelayLines(); + Go4kVSTi_UpdateDelayTimes(); + } +} + +// panic +void Go4kVSTi_Panic() +{ + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + // clear workspace + InstrumentWorkspace* w = &(SynthObj.InstrumentWork[i*MAX_POLYPHONY]); + memset(w, 0, sizeof(InstrumentWorkspace)*MAX_POLYPHONY); + SynthObj.SignalTrace[i] = 0.0f; + } + // clear workspace + memset(&(SynthObj.GlobalWork), 0, sizeof(InstrumentWorkspace)); + Go4kVSTi_ClearDelayLines(); +} + +static float delayTimeFraction[33] = +{ + 4.0f * (1.0f/32.0f) * (2.0f/3.0f), + 4.0f * (1.0f/32.0f), + 4.0f * (1.0f/32.0f) * (3.0f/2.0f), + 4.0f * (1.0f/16.0f) * (2.0f/3.0f), + 4.0f * (1.0f/16.0f), + 4.0f * (1.0f/16.0f) * (3.0f/2.0f), + 4.0f * (1.0f/8.0f) * (2.0f/3.0f), + 4.0f * (1.0f/8.0f), + 4.0f * (1.0f/8.0f) * (3.0f/2.0f), + 4.0f * (1.0f/4.0f) * (2.0f/3.0f), + 4.0f * (1.0f/4.0f), + 4.0f * (1.0f/4.0f) * (3.0f/2.0f), + 4.0f * (1.0f/2.0f) * (2.0f/3.0f), + 4.0f * (1.0f/2.0f), + 4.0f * (1.0f/2.0f) * (3.0f/2.0f), + 4.0f * (1.0f) * (2.0f/3.0f), + 4.0f * (1.0f), + 4.0f * (1.0f) * (3.0f/2.0f), + 4.0f * (2.0f) * (2.0f/3.0f), + 4.0f * (2.0f), + 4.0f * (2.0f) * (3.0f/2.0f), + 4.0f * (3.0f/8.0f), + 4.0f * (5.0f/8.0f), + 4.0f * (7.0f/8.0f), + 4.0f * (9.0f/8.0f), + 4.0f * (11.0f/8.0f), + 4.0f * (13.0f/8.0f), + 4.0f * (15.0f/8.0f), + 4.0f * (3.0f/4.0f), + 4.0f * (5.0f/4.0f), + 4.0f * (7.0f/4.0f), + 4.0f * (3.0f/2.0f), + 4.0f * (3.0f/2.0f), +}; + +void Go4kVSTi_UpdateDelayTimes() +{ + int delayindex = 17; + for (int i = 0; i <= MAX_INSTRUMENTS; i++) + { + for (int u = 0; u < MAX_UNITS; u++) + { + DLL_valP v; + if (i < MAX_INSTRUMENTS) + v = (DLL_valP)(SynthObj.InstrumentValues[i][u]); + else + v = (DLL_valP)(SynthObj.GlobalValues[u]); + + if (v->id == M_DLL) + { + //DLL_valP v = (DLL_valP)(SynthObj.InstrumentValues[i][u]); + if (v->reverb) + { + if (v->leftreverb) + { + v->delay = 1; + v->count = 8; + } + else + { + v->delay = 9; + v->count = 8; + } + } + else + { + int delay; + if (v->synctype == 2) + { + (&go4k_delay_times)[delayindex] = 0; // added for debug. doesnt hurt though + v->delay = 0; + v->count = 1; + } + else + { + if (v->synctype == 1) + { + float ftime; + float quarterlength = 60.0f/Go4kVSTi_GetBPM(); + ftime = quarterlength*delayTimeFraction[v->guidelay>>2]; + delay = 44100.0f*ftime; + if (delay >= 65536) + delay = 65535; + } + else + { + delay = v->guidelay*16; + } + (&go4k_delay_times)[delayindex] = delay; + v->delay = delayindex; + v->count = 1; + } + delayindex++; + } + } + + if (v->id == M_GLITCH) + { + GLITCH_valP v2 = (GLITCH_valP)(v); + int delay; + float ftime; + float quarterlength = 60.0f/Go4kVSTi_GetBPM(); + ftime = quarterlength*delayTimeFraction[v2->guidelay>>2]; + delay = 44100.0f*ftime*0.25; // slice time is in fractions per beat (therefore / 4) + if (delay >= 65536) + delay = 65535; + (&go4k_delay_times)[delayindex] = delay; + v2->delay = delayindex; + + delayindex++; + } + } + } +} + +// clear delay lines +void Go4kVSTi_ClearDelayLines() +{ + memset((&go4k_delay_buffer), 0, 16*16*((65536+5)*4)); +} + +// set global bpm +void Go4kVSTi_SetBPM(float bpm) +{ + BeatsPerMinute = bpm; + LFO_NORMALIZE = bpm/(44100.0*60.0); + Go4kVSTi_UpdateDelayTimes(); +} + +// get bpm +float Go4kVSTi_GetBPM() +{ + return BeatsPerMinute; +} + +// enable solo mode for a single channel only +void Go4kVSTi_Solo(int channel, int solo) +{ + if (solo) + { + SoloChannel = channel; + Solo = true; + } + else + { + Solo = false; + } +} + +// sample times tick the whole synth pipeline. results are left and right output sample + +void Go4kVSTi_Tick(float *oleft, float *oright, int samples) +{ + if (Recording) + { + samplesProcessed += samples; + + if (RecordingNoise) + { + // send a stayalive signal to the host + for (int i = 0; i < samples; i++) + { + float signal = 0.03125*((float)(i & 255) / 128.0f - 1.0f); + *oleft++ = signal; + *oright++ = signal; + } + return; + } + } + + // do as many samples as requested + int s = 0; + while (s < samples) + { + float left=0.0f; + float right=0.0f; + + go4k_delay_buffer_ofs = (DWORD)(&go4k_delay_buffer); + // loop all instruments + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + // solo mode and not the channel we want? + if (Solo && i != SoloChannel) + { + // loop all voices and clear outputs + for (int p = 0; p < SynthObj.Polyphony; p++) + { + InstrumentWorkspaceP iwork = &(SynthObj.InstrumentWork[i*MAX_POLYPHONY+p]); + iwork->dlloutl = 0.0f; + iwork->dlloutr = 0.0f; + iwork->outl = 0.0f; + iwork->outr = 0.0f; + } + // adjust delay index + for (int s = 0; s < MAX_UNITS; s++) + { + BYTE* val = SynthObj.InstrumentValues[i][s]; + if (val[0] == M_DLL || val[0] == M_GLITCH) + go4k_delay_buffer_ofs += (5+65536)*4*SynthObj.Polyphony; + } + // go to next instrument + continue; + } + // if the instrument signal stack is valid and we still got a signal from that instrument + if (SynthObj.InstrumentSignalValid[i] && (fabs(SynthObj.SignalTrace[i]) > 0.00001f)) + { + float sumSignals = 0.0f; + // loop all voices + for (int p = 0; p < SynthObj.Polyphony; p++) + { + InstrumentWorkspaceP iwork = &(SynthObj.InstrumentWork[i*MAX_POLYPHONY+p]); + float *lwrk = iwork->workspace; + DWORD inote = iwork->note; + // loop each slot + for (int s = 0; s <= SynthObj.HighestSlotIndex[i]; s++) + { + BYTE* val = SynthObj.InstrumentValues[i][s]; + float *wrk = &(iwork->workspace[s*MAX_UNIT_SLOTS]); + if (val[0] == M_FST) + { + FST_valP v = (FST_valP)val; + // if a target slot is set + if (v->dest_slot != -1) + { + InstrumentWorkspaceP mwork; + int polyphonicStore = SynthObj.Polyphony; + int stack = v->dest_stack; + // local storage? + if (stack == -1 || stack == i) + { + // only store the sample in the current workspace + polyphonicStore = 1; + mwork = iwork; + } + else if (stack == MAX_INSTRUMENTS) + mwork = &(SynthObj.GlobalWork); + else + mwork = &(SynthObj.InstrumentWork[stack*MAX_POLYPHONY]); + + float* mdest = &(mwork->workspace[v->dest_unit*MAX_UNIT_SLOTS + v->dest_slot]); + float amount = (2.0f*v->amount - 128.0f)*0.0078125f; + int storetype = v->type; + for (int stc = 0; stc < polyphonicStore; stc++) + { + __asm + { + push eax + push ebx + + mov eax, mdest + mov ebx, storetype + + fld amount + fmul st(0), st(1) + + // test ebx, FST_MUL + // jz store_func_add + // fmul dword ptr [eax] + // jmp store_func_set + //store_func_add: + test ebx, FST_ADD + jz store_func_set + fadd dword ptr [eax] + store_func_set: + fstp dword ptr [eax] + store_func_done: + pop ebx + pop eax + } + mdest += sizeof(InstrumentWorkspace)/4; + } + // remove signal on pop flag + if (storetype & FST_POP) + { + _asm fstp st(0); + } + } + } + else + { + // only process if note active or dll unit + if (val[0]) + { + // set up and call synth core func + __asm + { + pushad + xor eax, eax + mov esi, val + lodsb + mov eax, dword ptr [SynthFuncs+eax*4] + mov ebx, inote + mov ecx, lwrk + mov ebp, wrk + call eax + popad + } + } + } + } + // check for end of note + DWORD envstate = *((BYTE*)(lwrk)); + if (envstate == ENV_STATE_OFF) + { + iwork->note = 0; + } + sumSignals += fabsf(iwork->outl) + fabsf(iwork->outr) + fabsf(iwork->dlloutl) + fabsf(iwork->dlloutr); + } + // update envelope follower only for non control instruments. (1s attack rate) for total instrument signal + if (SynthObj.ControlInstrument[i]) + SynthObj.SignalTrace[i] = 1.0f; + else + SynthObj.SignalTrace[i] = sumSignals + 0.999977324f * ( SynthObj.SignalTrace[i] - sumSignals ); + } + // instrument stack invalid + else + { + // adjust delay index + for (int s = 0; s < MAX_UNITS; s++) + { + BYTE* val = SynthObj.InstrumentValues[i][s]; + if (val[0] == M_DLL || val[0] == M_GLITCH) + go4k_delay_buffer_ofs += (5+65536)*4*SynthObj.Polyphony; + } + // loop all voices + for (int p = 0; p < SynthObj.Polyphony; p++) + { + InstrumentWorkspaceP iwork = &(SynthObj.InstrumentWork[i*MAX_POLYPHONY+p]); + iwork->dlloutl = 0.0f; + iwork->dlloutr = 0.0f; + iwork->outl = 0.0f; + iwork->outr = 0.0f; + } + } + } + // if the global stack is valid + if (SynthObj.GlobalSignalValid) + { + InstrumentWorkspaceP gwork = &(SynthObj.GlobalWork); + float *lwrk = gwork->workspace; + DWORD gnote = 1; + gwork->note = 1; + // loop all global slots + for (int s = 0; s <= SynthObj.HighestSlotIndex[16]; s++) + { + BYTE* val = SynthObj.GlobalValues[s]; + float *wrk = &(lwrk[s*MAX_UNIT_SLOTS]); + // manually accumulate signals + float ACCL = 0.0f; + float ACCR = 0.0f; + if (val[0] == M_ACC) + { + ACC_valP av = (ACC_valP)val; + if (av->flags == ACC_OUT) + { + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + for (int p = 0; p < SynthObj.Polyphony; p++) + { + ACCL += SynthObj.InstrumentWork[i*MAX_POLYPHONY+p].outl; + ACCR += SynthObj.InstrumentWork[i*MAX_POLYPHONY+p].outr; + } + } + } + else + { + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + for (int p = 0; p < SynthObj.Polyphony; p++) + { + ACCL += SynthObj.InstrumentWork[i*MAX_POLYPHONY+p].dlloutl; + ACCR += SynthObj.InstrumentWork[i*MAX_POLYPHONY+p].dlloutr; + } + } + } + // push the accumulated signals on the fp stack + __asm + { + fld ACCR + fld ACCL + } + } + // no ACC unit, check store + else if (val[0] == M_FST) + { + FST_valP v = (FST_valP)val; + // if a target slot is set + if (v->dest_slot != -1) + { + InstrumentWorkspaceP mwork; + int polyphonicStore = SynthObj.Polyphony; + int stack = v->dest_stack; + // local storage? + if (stack == -1 || stack == MAX_INSTRUMENTS) + { + // only store the sample in the current workspace + polyphonicStore = 1; + mwork = &(SynthObj.GlobalWork); + } + else + mwork = &(SynthObj.InstrumentWork[stack*MAX_POLYPHONY]); + + float* mdest = &(mwork->workspace[v->dest_unit*MAX_UNIT_SLOTS + v->dest_slot]); + float amount = (2.0f*v->amount - 128.0f)*0.0078125f;; + int storetype = v->type; + for (int stc = 0; stc < polyphonicStore; stc++) + { + __asm + { + push eax + push ebx + + mov eax, mdest + mov ebx, storetype + + fld amount + fmul st(0), st(1) + + // test ebx, FST_MUL + // jz gstore_func_add + // fmul dword ptr [eax] + // jmp gstore_func_set + //gstore_func_add: + test ebx, FST_ADD + jz gstore_func_set + fadd dword ptr [eax] + gstore_func_set: + fstp dword ptr [eax] + gstore_func_done: + pop ebx + pop eax + } + mdest += sizeof(InstrumentWorkspace)/4; + } + // remove signal on pop flag + if (storetype & FST_POP) + { + _asm fstp st(0); + } + } + } + // just call synth core func + else + { + if (val[0]) + { + __asm + { + pushad + xor eax, eax + mov esi, val + lodsb + mov eax, dword ptr [SynthFuncs+eax*4] + mov ebx, gnote + mov ecx, lwrk + mov ebp, wrk + call eax + popad + } + } + } + } + left = gwork->outl; + right = gwork->outr; + } + + // clip + if (left < -1.0f) + left = -1.0f; + if (left > 1.0f) + left = 1.0f; + if (right < -1.0f) + right = -1.0f; + if (right > 1.0f) + right = 1.0f; + + *(oleft++) = left; + *(oright++) = right; + + s++; + } // end sample loop +} + +//////////////////////////////////////////////////////////////////////////// +// +// Synth input processing +// +//////////////////////////////////////////////////////////////////////////// + +// prepare for recording the midi stream +void Go4kVSTi_Record(bool record, bool recordingNoise, int patternsize, float patternquant) +{ + Recording = record; + RecordingNoise = recordingNoise; + // if we started recording, clear all record streams + if (Recording) + { + TickScaler = patternquant; + PatternSize = (int)(patternsize*TickScaler); + // set first recording event variable to true to enable start time reset on the first occuring event + FirstRecordingEvent = true; + // clear all buffers + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + InstrumentOn[i] = -1; + InstrumentRecord[i].clear(); + for (int j = 0; j < 256*256; j++) + InstrumentRecord[i].push_back(0); + } + } + else + { + // nothing recorded? + if (FirstRecordingEvent == true) + return; + Recording = true; + for (int i = 0; i < MAX_INSTRUMENTS; i++) + Go4kVSTi_StopVoice(i, 0); + Recording = false; + // how many ticks did we record? + MaxTicks = (int)(0.5f+((float)samplesProcessed/SamplesPerTick)); + int remainder = MaxTicks % 16; + MaxTicks += remainder; + // fold patterns if TickScaler < 1, this is needed because directly recording at half samplerate leads to information loss + if (TickScaler < 1.0f) + { + MaxTicks = (int)((float)MaxTicks*TickScaler); + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + for (int j = 0; j < (int)(256*256*TickScaler); j++) + InstrumentRecord[i][j] = InstrumentRecord[i][(int)(j/TickScaler)]; + } + } + // open file dialog and save if desired ... + // the save function called from this one is GoSynth_SaveByteStream + GetStreamFileName(); + } +} + +// add a voice with given parameters to synth +void Go4kVSTi_AddVoice(int channel, int note) +{ + // record song + if (Recording) + { + // check for the first recording event + if (FirstRecordingEvent) + { + FirstRecordingEvent = false; + // reset time stamp for very first event + samplesProcessed = 0; + // Set samples per tick for this recording + if (TickScaler >= 1.0f) + SamplesPerTick = 44100.0f*4.0f*60.0f/(BeatsPerMinute*16*TickScaler); + else + SamplesPerTick = 44100.0f*4.0f*60.0f/(BeatsPerMinute*16); + } + int CurrentTick = (int)(0.5f+((float)samplesProcessed/SamplesPerTick)); + if (InstrumentOn[channel] >= 0) + { + for (int i = CurrentTick-1; i > InstrumentOn[channel]; i--) + { + if (!InstrumentRecord[channel][i]) + InstrumentRecord[channel][i] = -1; + } + } + if (!InstrumentRecord[channel][CurrentTick]) + { + InstrumentRecord[channel][CurrentTick] = note; + InstrumentOn[channel] = CurrentTick; + } + + // no signals to synth when using recording noise + if (RecordingNoise == true) + return; + } + + InstrumentWorkspaceP work,work2; + work = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+0]); + work->release = 1; + work2 = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+1]); + work2->release = 1; + // filp worspace + if (SynthObj.Polyphony > 1) + { + work = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+SynthObj.VoiceIndex[channel]]); + SynthObj.VoiceIndex[channel] = SynthObj.VoiceIndex[channel] ^ 0x1; + } + // add new note + memset(work, 0, (2+MAX_UNITS*MAX_UNIT_SLOTS)*4); + work->note = note; + SynthObj.SignalTrace[channel] = 1.0f; + // check if its a controll instrument which is played + SynthObj.ControlInstrument[channel] = 1; + for (int i = 0; i < MAX_UNITS; i++) + { + if (SynthObj.InstrumentValues[channel][i][0] == M_OUT) + { + SynthObj.ControlInstrument[channel] = 0; + break; + } + } +} + +// stop a voice with given parameters in synth +void Go4kVSTi_StopVoice(int channel, int note) +{ + // record song + if (Recording) + { + int CurrentTick = (int)(0.5f+((float)samplesProcessed/SamplesPerTick)); + if (InstrumentOn[channel] >= 0) + { + for (int i = CurrentTick-1; i > InstrumentOn[channel]; i--) + { + if (!InstrumentRecord[channel][i]) + InstrumentRecord[channel][i] = -1; + } + } +// if (!InstrumentRecord[channel][CurrentTick]) + InstrumentOn[channel] = -1; + + // no signals to synth when only using recording noise + if (RecordingNoise == true) + return; + } + + InstrumentWorkspaceP work,work2; + // release notes + work = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+0]); + work->release = 1; + work2 = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+1]); + work2->release = 1; +} + +//---------------------------------------------------------------------------------------------------- +// convenience functions for loading and storing patches and instruments +//---------------------------------------------------------------------------------------------------- + +void FlipSlotModulations(int stack, int unit1, int unit2) +{ + // look in all instruments if a store unit had its target on one of the changed units + for (int i = 0; i <= MAX_INSTRUMENTS; i++) + { + BYTE* values; + if (i < MAX_INSTRUMENTS) + values = SynthObj.InstrumentValues[i][0]; + else + values = SynthObj.GlobalValues[0]; + for (int u = 0; u < MAX_UNITS; u++) + { + if (values[u*MAX_UNIT_SLOTS+0] == M_FST) + { + FST_valP v = (FST_valP)(&values[u*MAX_UNIT_SLOTS+0]); + + int target_inst; + if (v->dest_stack == -1) + target_inst = i; + else + target_inst = v->dest_stack; + + // the store points to another stack, so continue + if (target_inst != stack) + continue; + + // a up/down process + if (unit2 != -1) + { + // if the target unit was unit1 or unit2 realign target unit + if (v->dest_unit == unit1) + { + v->dest_unit = unit2; + } + else if (v->dest_unit == unit2) + { + v->dest_unit = unit1; + } + } + } + } + } +} + +// autoconvert 1.0 instrument stacks +bool Autoconvert10(int stack) +{ + // get desired stack + BYTE* values; + if (stack < MAX_INSTRUMENTS) + values = SynthObj.InstrumentValues[stack][0]; + else + values = SynthObj.GlobalValues[0]; + + // replace the delay with the new one + for (int u = 0; u < MAX_UNITS; u++) + { + if (values[u*MAX_UNIT_SLOTS+0] == M_DLL) + { + DLL10_val ov; + memcpy(&ov, &values[u*MAX_UNIT_SLOTS+0], sizeof(DLL10_val)); + DLL_valP nv = (DLL_valP)(&values[u*MAX_UNIT_SLOTS+0]); + nv->id = ov.id; + nv->pregain = ov.pregain; + nv->dry = ov.dry; + nv->feedback = ov.feedback; + nv->damp = ov.damp; + nv->freq = 0; + nv->depth = 0; + nv->guidelay = ov.guidelay; + nv->synctype = ov.synctype; + nv->leftreverb = ov.leftreverb; + nv->reverb = ov.reverb; + } + } + return true; +} + +// autoconvert 1.1 instrument stacks +bool Autoconvert11(int stack) +{ + // get desired stack + BYTE* values; + if (stack < MAX_INSTRUMENTS) + values = SynthObj.InstrumentValues[stack][0]; + else + values = SynthObj.GlobalValues[0]; + + // replace the osc with the new one + for (int u = 0; u < MAX_UNITS; u++) + { + if (values[u*MAX_UNIT_SLOTS+0] == M_VCO) + { + VCO11_val ov; + memcpy(&ov, &values[u*MAX_UNIT_SLOTS+0], sizeof(VCO11_val)); + VCO_valP nv = (VCO_valP)(&values[u*MAX_UNIT_SLOTS+0]); + nv->id = ov.id; + nv->transpose = ov.transpose; + nv->detune = ov.detune; + nv->phaseofs = ov.phaseofs; + nv->gate = 0x55; + nv->color = ov.color; + nv->shape = ov.shape; + nv->gain = ov.gain; + nv->flags = ov.flags; + } + } + return true; +} + +// autoconvert 1.3 instrument stacks +bool Autoconvert13(int stack) +{ + // get desired stack + BYTE* values; + if (stack < MAX_INSTRUMENTS) + values = SynthObj.InstrumentValues[stack][0]; + else + values = SynthObj.GlobalValues[0]; + + // replace the osc with the new one + for (int u = 0; u < MAX_UNITS; u++) + { + if (values[u*MAX_UNIT_SLOTS+0] == M_VCO) + { + VCO_valP nv = (VCO_valP)(&values[u*MAX_UNIT_SLOTS+0]); + // correct sine color as it has a meaning now in 1.4 format + if (nv->flags & VCO_SINE) + nv->color = 128; + } + } + return true; +} + + +// load patch data +void Go4kVSTi_LoadPatch(char *filename) +{ + Go4kVSTi_ResetPatch(); + FILE *file = fopen(filename, "rb"); + if (file) + { + DWORD version; + bool version10 = false; + bool version11 = false; + bool version12 = false; + bool version13 = false; + fread(&version, 1, 4, file); + if (versiontag != version) + { + // version 1.3 file + if (version == versiontag13) + { + // only mulp2 unit added and layout for instruments changed, no need for message + //MessageBox(0,"Autoconvert. Please save file again", "1.3 File Format", MB_OK | MB_SETFOREGROUND); + version13 = true; + } + // version 1.2 file + else if (version == versiontag12) + { + // only fld unit added, no need for message + //MessageBox(0,"Autoconvert. Please save file again", "1.2 File Format", MB_OK | MB_SETFOREGROUND); + version12 = true; + version13 = true; + } + // version 1.1 file + else if (version == versiontag11) + { + MessageBox(0,"Autoconvert. Please save file again", "1.1 File Format", MB_OK | MB_SETFOREGROUND); + version11 = true; + version12 = true; + version13 = true; + } + // version 1.0 file + else if (version == versiontag10) + { + MessageBox(0,"Autoconvert. Please save file again", "1.0 File Format", MB_OK | MB_SETFOREGROUND); + version10 = true; + version11 = true; + version12 = true; + version13 = true; + } + // newer format than supported + else + { + MessageBox(0,"The file was created with a newer version of 4klang.", "File Format Error", MB_ICONERROR | MB_SETFOREGROUND); + fclose(file); + return; + } + } + + // read data + fread(&(SynthObj.Polyphony), 1, 4, file); + fread(SynthObj.InstrumentNames, 1, MAX_INSTRUMENTS*64, file); + for (int i=0; i> 1)) + { + ret++; + } + return ret; +} + +struct SynthUses +{ + bool env_gm; + bool env_adrm; + + bool vco_phaseofs; + bool vco_shape; + bool vco_fm; + bool vco_pm; + bool vco_tm; + bool vco_dm; + bool vco_cm; + bool vco_gm; + bool vco_sm; + bool vco_gate; + bool vco_stereo; + + bool vcf_fm; + bool vcf_rm; + bool vcf_stereo; + + bool dst_use; + bool dst_snh; + bool dst_dm; + bool dst_sm; + bool dst_stereo; + + bool dll_use; + bool dll_notesync; + bool dll_damp; + bool dll_chorus; + bool dll_use_mod; + bool dll_pm; + bool dll_fm; + bool dll_im; + bool dll_dm; + bool dll_sm; + bool dll_am; + + bool pan_use; + bool pan_pm; + + bool fstg_use; + + bool out_am; + bool out_gm; + + bool fld_use; + bool fld_vm; + + bool glitch_use; +}; + +void GetUses(SynthUses *uses, bool InstrumentUsed[]) +{ + for (int i = 0; i <= MAX_INSTRUMENTS; i++) + { + // skip usage checks for non used instruments + if (i < MAX_INSTRUMENTS) + if (!InstrumentUsed[i]) + continue; + + for (int u = 0; u < MAX_UNITS; u++) + { + BYTE *v; + if (i < MAX_INSTRUMENTS) + v = SynthObj.InstrumentValues[i][u]; + else + v = SynthObj.GlobalValues[u]; + + if (v[0] == M_VCO) + { + if (((VCO_valP)v)->phaseofs != 0) + uses->vco_phaseofs = true; + if (((VCO_valP)v)->shape != 64) + uses->vco_shape = true; + if (((VCO_valP)v)->flags & VCO_GATE) + uses->vco_gate = true; + if (((VCO_valP)v)->flags & VCO_STEREO) + uses->vco_stereo = true; + } + if (v[0] == M_VCF) + { + if (((VCF_valP)v)->type & VCF_STEREO) + uses->vcf_stereo = true; + } + if (v[0] == M_DST) + { + uses->dst_use = true; + if (((DST_valP)v)->snhfreq != 128) + uses->dst_snh = true; + if (((DST_valP)v)->stereo & VCF_STEREO) + uses->dst_stereo = true; + } + if (v[0] == M_DLL) + { + uses->dll_use = true; + if (((DLL_valP)v)->synctype == 2) + uses->dll_notesync = true; + if (((DLL_valP)v)->damp > 0) + uses->dll_damp = true; + if ((((DLL_valP)v)->freq > 0) && (((DLL_valP)v)->depth > 0)) + uses->dll_chorus = true; + } + if (v[0] == M_PAN) + { + if (((PAN_valP)v)->panning != 64) + uses->pan_use = true; + } + if (v[0] == M_FLD) + { + uses->fld_use = true; + } + if (v[0] == M_GLITCH) + { + uses->glitch_use = true; + } + if (v[0] == M_FST) + { + if ((((FST_valP)v)->dest_stack != -1) && (((FST_valP)v)->dest_stack != i)) + uses->fstg_use = true; + + InstrumentWorkspaceP mwork; + int stack = ((FST_valP)v)->dest_stack; + int unit = ((FST_valP)v)->dest_unit; + int slot = ((FST_valP)v)->dest_slot; + // local storage? + if (stack == -1 || stack == i) + { + stack = i; + } + else + { + uses->fstg_use = true; + } + BYTE *v2; + if (stack < MAX_INSTRUMENTS) + v2 = SynthObj.InstrumentValues[stack][unit]; + else + v2 = SynthObj.GlobalValues[unit]; + + if (v2[0] == M_ENV) + { + if (slot == 2) + uses->env_gm = true; + if (slot == 3) + uses->env_adrm = true; + if (slot == 4) + uses->env_adrm = true; + if (slot == 6) + uses->env_adrm = true; + } + if (v2[0] == M_VCO) + { + if (slot == 1) + uses->vco_tm = true; + if (slot == 2) + uses->vco_dm = true; + if (slot == 3) + uses->vco_fm = true; + if (slot == 4) + uses->vco_pm = true; + if (slot == 5) + uses->vco_cm = true; + if (slot == 6) + uses->vco_sm = true; + if (slot == 7) + uses->vco_gm = true; + } + if (v2[0] == M_VCF) + { + if (slot == 4) + uses->vcf_fm = true; + if (slot == 5) + uses->vcf_rm = true; + } + if (v2[0] == M_DST) + { + if (slot == 2) + uses->dst_dm = true; + if (slot == 3) + uses->dst_sm = true; + } + if (v2[0] == M_DLL) + { + if (slot == 0) + { + uses->dll_pm = true; + uses->dll_use_mod = true; + } + if (slot == 1) + { + uses->dll_fm = true; + uses->dll_use_mod = true; + } + if (slot == 2) + { + uses->dll_im = true; + uses->dll_use_mod = true; + } + if (slot == 3) + { + uses->dll_dm = true; + uses->dll_damp = true; + uses->dll_use_mod = true; + } + if (slot == 4) + { + uses->dll_sm = true; + uses->dll_use_mod = true; + } + if (slot == 5) + { + uses->dll_am = true; + uses->dll_use_mod = true; + } + } + if (v2[0] == M_PAN) + { + if (slot == 0) + uses->pan_pm = true; + } + if (v2[0] == M_OUT) + { + if (slot == 0) + uses->out_am = true; + if (slot == 1) + uses->out_gm = true; + } + if (v2[0] == M_FLD) + { + if (slot == 0) + uses->fld_vm = true; + } + // if (v2[0] == M_GLITCH) + // { + // if (slot == 0) + // uses->glitch_am = true; + // } + } + } + } +} + +void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, int useenotevalues, int clipoutput, int undenormalize, int objformat, int output16) +{ + std::string incfile = filename; + // extract path + std::string fpath = filename; + int sp = fpath.find_last_of("/"); + int bp = fpath.find_last_of("\\"); + if (sp < bp) + sp = bp; + std::string storePath = fpath.substr(0, sp); + + SynthUses mergeUses; + memset(&mergeUses, 0, sizeof(SynthUses)); + int mergeMaxInst = 0; + int mergeMaxPatterns = 0; + int mergeNumReducedPatterns = 0; + std::vector mergePatternIndices[MAX_INSTRUMENTS]; + std::string mergeCommandString; + std::string mergeValueString; + int mergeDelayTimes = 0; + std::vector mergeDelays; + +#ifndef _8KLANG + // init reduced patterns for primary plugin + ReducedPatterns.clear(); + NumReducedPatterns = 0; + // add NULL pattern + for (int i = 0; i < PatternSize; i++) + { + ReducedPatterns.push_back(0); + } +#else + // load merge info if available + std::string mergefile = storePath + "/8klang.merge"; + FILE *mfile = fopen(mergefile.c_str(), "rb"); + if (mfile) + { + // read unit usage info block for primary plugin + fread(&mergeUses, sizeof(SynthUses), 1, mfile); + // read number of instruments for primary plugin + fread(&mergeMaxInst, 4, 1, mfile); + // read max number of used patterns for primary plugin + fread(&mergeMaxPatterns, 4, 1, mfile); + // read and add reduced patterns from primary plugin + fread(&mergeNumReducedPatterns, 4, 1, mfile); + for (int i = 0; i < mergeNumReducedPatterns*PatternSize; i++) + { + int rpv = 0; + fread(&rpv, 4, 1, mfile); + ReducedPatterns.push_back(rpv); + } + // read pattern list for primary plugin + for (int i = 0; i < mergeMaxInst; i++) + { + for (int j = 0; j < mergeMaxPatterns; j++) + { + int pi = 0; + fread(&pi, 4, 1, mfile); + mergePatternIndices[i].push_back(pi); + } + } + char c; + // read command strings + while (true) + { + fread(&c, 1, 1, mfile); + if (c == 0) + break; + mergeCommandString += c; + }; + // read value strings + while (true) + { + fread(&c, 1, 1, mfile); + if (c == 0) + break; + mergeValueString += c; + }; + + + fread(&mergeDelayTimes, 4, 1, mfile); + for (int i = 0; i < mergeDelayTimes; i++) + { + int delaytime; + fread(&delaytime, 4, 1, mfile); + mergeDelays.push_back(delaytime); + } + + fclose(mfile); + } +#endif + + std::string pfilepath = storePath + "/patterns.dbg"; + FILE *pfile = fopen(pfilepath.c_str(), "wb"); + // now add minimal reduced instrument patterns + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + fprintf(pfile, "Instrument%d:\n", i); + PatternIndices[i].clear(); + // loop all patterns + for (int j = 0; j < MaxTicks/PatternSize; j++) + { + for (int l = 0; l < PatternSize; l++) + { + char bv = InstrumentRecord[i][j*PatternSize+l]; + if (bv >= 0) + fprintf(pfile, "%d, ", bv); + else + fprintf(pfile, "HLD, ", bv); + } + fprintf(pfile, "\n"); + + int pindex = j; + bool found = false; + // compare each tick of the current pattern to all already reduced patterns + for (int k = 0; k < ReducedPatterns.size()/PatternSize; k++) + { + bool patternMatch = true; + for (int l = 0; l < PatternSize; l++) + { + if (InstrumentRecord[i][j*PatternSize+l] != ReducedPatterns[k*PatternSize+l]) + { + patternMatch = false; + break; + } + } + if (patternMatch) + { + NumReducedPatterns++; + pindex = k; + found = true; + break; + } + } + // add new pattern if necessary + if (!found) + { + for (int k = 0; k < PatternSize; k++) + { + ReducedPatterns.push_back(InstrumentRecord[i][j*PatternSize+k]); + } + pindex = (ReducedPatterns.size()/PatternSize)-1; + } + // add new pattern index + PatternIndices[i].push_back(pindex); + } + } + fclose(pfile); + + int maxinst = 0; + FILE *file = fopen(incfile.c_str(), "w"); + if (file) + { + bool InstrumentUsed[MAX_INSTRUMENTS]; + // determine max instrument count + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + InstrumentUsed[i] = false; + for (int j = 0; j < PatternIndices[i].size(); j++) + { + if (PatternIndices[i][j]) + { + InstrumentUsed[i] = true; + break; + } + } + } + // determine max instrument count and create a mapping instrument index -> used instrument index + int InstrumentIndex[MAX_INSTRUMENTS]; + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + // dummy init + InstrumentIndex[i] = -1; + if (InstrumentUsed[i]) + { + InstrumentIndex[i] = maxinst; + maxinst++; + } + + } + std::vector delay_times; + std::vector delay_indices; + bool hasReverb = false; + bool hasNoteSync = false; +#ifdef _8KLANG + //m get delaytimes and index from primary plugin + for (int i = 0; i < mergeDelayTimes; i++) + { + delay_times.push_back(mergeDelays[i]); + if (i < 17) + delay_indices.push_back(i); + } +#else + // add notesync and reverb times + for (int i = 0; i < 17; i++) + { + DWORD times = (&go4k_delay_times)[i]; + delay_times.push_back(times); + delay_indices.push_back(i); + } + delay_times[0] = 0; +#endif + for (int i = 0; i <= MAX_INSTRUMENTS; i++) + { + for (int u = 0; u < MAX_UNITS; u++) + { + // // used instrument or global? + if (InstrumentUsed[i] || i == MAX_INSTRUMENTS) + { + DLL_valP v; + if (i < MAX_INSTRUMENTS) + v = (DLL_valP)(SynthObj.InstrumentValues[i][u]); + else + v = (DLL_valP)(SynthObj.GlobalValues[u]); + + if (v->id == M_DLL) + { + if (!v->reverb) + { + // if not notesync + if (v->synctype != 2) + { + DWORD times = (&go4k_delay_times)[delay_indices.size()]; + // check if indexed value already existed + int found = -1; + for (int j = 17; j < delay_times.size(); j++) + { + if (delay_times[j] == times) + { + found = j; + break; + } + } + if (found != -1) + { + // already in list, so let index point to that one + delay_indices.push_back(found); + } + else + { + // new value, so push it + delay_times.push_back(times); + delay_indices.push_back(delay_times.size()-1); + } + } + else + { + hasNoteSync = true; + delay_indices.push_back(0); + } + } + else + { + hasReverb = true; + } + } + if (v->id == M_GLITCH) + { + DWORD times = (&go4k_delay_times)[delay_indices.size()]; + // check if indexed value already existed + int found = -1; + for (int j = 17; j < delay_times.size(); j++) + { + if (delay_times[j] == times) + { + found = j; + break; + } + } + if (found != -1) + { + // already in list, so let index point to that one + delay_indices.push_back(found); + } + else + { + // new value, so push it + delay_times.push_back(times); + delay_indices.push_back(delay_times.size()-1); + } + } + } + // no used instrument + else + { + DLL_valP v; + v = (DLL_valP)(SynthObj.InstrumentValues[i][u]); + if (v->id == M_DLL) + { + if (!v->reverb) + { + // just push a dummy index + delay_indices.push_back(-1); + } + } + if (v->id == M_GLITCH) + { + // just push a dummy index + delay_indices.push_back(-1); + } + } + } + } +// rarely needed anyway +#if 0 + // if we dont have reverb, remove values and adjust indices + if (!hasReverb) + { + // move values + for (int i = 17; i < delay_times.size(); i++) + { + delay_times[i-16] = delay_times[i]; + } + // remove obsolete values + for (int i = 0; i < 16; i++) + { + delay_times.pop_back(); + } + // adjust indices + for (int i = 0; i < delay_indices.size(); i++) + { + if (delay_indices[i] != 0) + delay_indices[i] -= 16; + } + } + // if we dont have notesync, remove values and adjust indices + if (!hasNoteSync) + { + // move values + for (int i = 1; i < delay_times.size(); i++) + { + delay_times[i-1] = delay_times[i]; + } + // remove obsolete values + delay_times.pop_back(); + // adjust indices + for (int i = 0; i < delay_indices.size(); i++) + { + delay_indices[i] -= 1; + } + } +#endif + + SynthUses uses; +#ifndef _8KLANG + memset(&uses, 0, sizeof(SynthUses)); +#else + memcpy(&uses, &mergeUses, sizeof(SynthUses)); +#endif + GetUses(&uses, InstrumentUsed); + + // write inc file + fprintf(file, "%%macro export_func 1\n"); +// fprintf(file, " %%define %%1 _%%1\n"); + fprintf(file, " global _%%1\n"); + fprintf(file, " _%%1:\n"); + fprintf(file, "%%endmacro\n"); + +// fprintf(file, "%%macro export_dword_array 2\n"); +// fprintf(file, " %%define %%1 _%%1\n"); +// fprintf(file, " global %%1\n"); +// fprintf(file, " %%1 resd %%2\n"); +// fprintf(file, "%%endmacro\n"); + +/* if (objformat == 0) + MessageBox(0,"WINDOWS","",MB_OK); + if (objformat == 1) + MessageBox(0,"LINUX","",MB_OK); + if (objformat == 2) + MessageBox(0,"MACOSX","",MB_OK); +*/ + + if (objformat == 0) // 0:windows, 1:linux, 2:osx + { + // use sections only for windows, + // linux doesnt have any crinkler like packer to take advantage of multiple sections + // and osx export has a bug in current nasm and is not able to export custom sections + fprintf(file, "%%define USE_SECTIONS\n"); + } + + fprintf(file, "%%define SAMPLE_RATE %d\n", 44100); + fprintf(file, "%%define MAX_INSTRUMENTS %d\n", maxinst + mergeMaxInst); + fprintf(file, "%%define MAX_VOICES %d\n", SynthObj.Polyphony); + fprintf(file, "%%define HLD 1\n"); + fprintf(file, "%%define BPM %f\n", BeatsPerMinute); + fprintf(file, "%%define MAX_PATTERNS %d\n", mergeMaxPatterns > PatternIndices[0].size() ? mergeMaxPatterns : PatternIndices[0].size()); + fprintf(file, "%%define PATTERN_SIZE_SHIFT %d\n", GetShift2(PatternSize)); + fprintf(file, "%%define PATTERN_SIZE (1 << PATTERN_SIZE_SHIFT)\n"); + fprintf(file, "%%define MAX_TICKS (MAX_PATTERNS*PATTERN_SIZE)\n"); + fprintf(file, "%%define SAMPLES_PER_TICK %d\n", (int)(44100.0f*4.0f*60.0f/(BeatsPerMinute*16*TickScaler))); + fprintf(file, "%%define DEF_LFO_NORMALIZE %.10f\n", LFO_NORMALIZE); + fprintf(file, "%%define MAX_SAMPLES (SAMPLES_PER_TICK*MAX_TICKS)\n"); + fprintf(file, "%s%%define GO4K_USE_16BIT_OUTPUT\n",output16?"":";"); + fprintf(file, ";%%define GO4K_USE_GROOVE_PATTERN\n"); + fprintf(file, "%s%%define GO4K_USE_ENVELOPE_RECORDINGS\n",useenvlevels?"":";"); + fprintf(file, "%s%%define GO4K_USE_NOTE_RECORDINGS\n",useenotevalues?"":";"); + if (undenormalize) + fprintf(file, "%%define GO4K_USE_UNDENORMALIZE\n"); + if (clipoutput) + fprintf(file, "%%define GO4K_CLIP_OUTPUT\n"); + if (uses.dst_use) + fprintf(file, "%%define GO4K_USE_DST\n"); + if (uses.dll_use) + fprintf(file, "%%define GO4K_USE_DLL\n"); + if (uses.pan_use) + fprintf(file, "%%define GO4K_USE_PAN\n"); + fprintf(file, "%%define GO4K_USE_GLOBAL_DLL\n"); + if (uses.fstg_use) + fprintf(file, "%%define GO4K_USE_FSTG\n"); + if (uses.fld_use) + fprintf(file, "%%define GO4K_USE_FLD\n"); + if (uses.glitch_use) + fprintf(file, "%%define GO4K_USE_GLITCH\n"); + fprintf(file, "%%define GO4K_USE_ENV_CHECK\n"); + if (uses.env_gm) + fprintf(file, "%%define GO4K_USE_ENV_MOD_GM\n"); + if (uses.env_adrm) + fprintf(file, "%%define GO4K_USE_ENV_MOD_ADR\n"); + fprintf(file, "%%define GO4K_USE_VCO_CHECK\n"); + if (uses.vco_phaseofs) + fprintf(file, "%%define GO4K_USE_VCO_PHASE_OFFSET\n"); + if (uses.vco_shape) + fprintf(file, "%%define GO4K_USE_VCO_SHAPE\n"); + if (uses.vco_gate) + fprintf(file, "%%define GO4K_USE_VCO_GATE\n"); + if (uses.vco_fm) + fprintf(file, "%%define GO4K_USE_VCO_MOD_FM\n"); + if (uses.vco_pm) + fprintf(file, "%%define GO4K_USE_VCO_MOD_PM\n"); + if (uses.vco_tm) + fprintf(file, "%%define GO4K_USE_VCO_MOD_TM\n"); + if (uses.vco_dm) + fprintf(file, "%%define GO4K_USE_VCO_MOD_DM\n"); + if (uses.vco_cm) + fprintf(file, "%%define GO4K_USE_VCO_MOD_CM\n"); + if (uses.vco_gm) + fprintf(file, "%%define GO4K_USE_VCO_MOD_GM\n"); + if (uses.vco_sm) + fprintf(file, "%%define GO4K_USE_VCO_MOD_SM\n"); + if (uses.vco_stereo) + fprintf(file, "%%define GO4K_USE_VCO_STEREO\n"); + fprintf(file, "%%define GO4K_USE_VCF_CHECK\n"); + if (uses.vcf_fm) + fprintf(file, "%%define GO4K_USE_VCF_MOD_FM\n"); + if (uses.vcf_rm) + fprintf(file, "%%define GO4K_USE_VCF_MOD_RM\n"); + fprintf(file, "%%define GO4K_USE_VCF_HIGH\n"); + fprintf(file, "%%define GO4K_USE_VCF_BAND\n"); + fprintf(file, "%%define GO4K_USE_VCF_PEAK\n"); + if (uses.vcf_stereo) + fprintf(file, "%%define GO4K_USE_VCF_STEREO\n"); + fprintf(file, "%%define GO4K_USE_DST_CHECK\n"); + if (uses.dst_snh) + fprintf(file, "%%define GO4K_USE_DST_SH\n"); + if (uses.dst_dm) + fprintf(file, "%%define GO4K_USE_DST_MOD_DM\n"); + if (uses.dst_sm) + fprintf(file, "%%define GO4K_USE_DST_MOD_SH\n"); + if (uses.dst_stereo) + fprintf(file, "%%define GO4K_USE_DST_STEREO\n"); + if (uses.dll_notesync) + fprintf(file, "%%define GO4K_USE_DLL_NOTE_SYNC\n"); + if (uses.dll_chorus) + fprintf(file, "%%define GO4K_USE_DLL_CHORUS\n"); + fprintf(file, "%%define GO4K_USE_DLL_CHORUS_CLAMP\n"); + if (uses.dll_damp) + fprintf(file, "%%define GO4K_USE_DLL_DAMP\n"); + fprintf(file, "%%define GO4K_USE_DLL_DC_FILTER\n"); + fprintf(file, "%%define GO4K_USE_FSTG_CHECK\n"); + if (uses.pan_pm) + fprintf(file, "%%define GO4K_USE_PAN_MOD\n"); + if (uses.out_am) + fprintf(file, "%%define GO4K_USE_OUT_MOD_AM\n"); + if (uses.out_gm) + fprintf(file, "%%define GO4K_USE_OUT_MOD_GM\n"); + fprintf(file, "%%define GO4K_USE_WAVESHAPER_CLIP\n"); + if (uses.fld_vm) + fprintf(file, "%%define GO4K_USE_FLD_MOD_VM\n"); + if (uses.dll_use_mod) + fprintf(file, "%%define GO4K_USE_DLL_MOD\n"); + if (uses.dll_pm) + fprintf(file, "%%define GO4K_USE_DLL_MOD_PM\n"); + if (uses.dll_fm) + fprintf(file, "%%define GO4K_USE_DLL_MOD_FM\n"); + if (uses.dll_im) + fprintf(file, "%%define GO4K_USE_DLL_MOD_IM\n"); + if (uses.dll_dm) + fprintf(file, "%%define GO4K_USE_DLL_MOD_DM\n"); + if (uses.dll_sm) + fprintf(file, "%%define GO4K_USE_DLL_MOD_SM\n"); + if (uses.dll_am) + fprintf(file, "%%define GO4K_USE_DLL_MOD_AM\n"); + + fprintf(file, "%%define MAX_DELAY 65536\n"); + fprintf(file, "%%define MAX_UNITS 64\n"); + fprintf(file, "%%define MAX_UNIT_SLOTS 16\n"); + fprintf(file, "%%define GO4K_BEGIN_CMDDEF(def_name)\n"); + fprintf(file, "%%define GO4K_END_CMDDEF db 0\n"); + fprintf(file, "%%define GO4K_BEGIN_PARAMDEF(def_name)\n"); + fprintf(file, "%%define GO4K_END_PARAMDEF\n"); + + fprintf(file, "GO4K_ENV_ID equ 1\n"); + fprintf(file, "%%macro GO4K_ENV 5\n"); + fprintf(file, " db %%1\n"); + fprintf(file, " db %%2\n"); + fprintf(file, " db %%3\n"); + fprintf(file, " db %%4\n"); + fprintf(file, " db %%5\n"); + fprintf(file, "%%endmacro\n"); + fprintf(file, "%%define ATTAC(val) val \n"); + fprintf(file, "%%define DECAY(val) val \n"); + fprintf(file, "%%define SUSTAIN(val) val \n"); + fprintf(file, "%%define RELEASE(val) val \n"); + fprintf(file, "%%define GAIN(val) val \n"); + fprintf(file, "struc go4kENV_val\n"); + fprintf(file, " .attac resd 1\n"); + fprintf(file, " .decay resd 1\n"); + fprintf(file, " .sustain resd 1\n"); + fprintf(file, " .release resd 1\n"); + fprintf(file, " .gain resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "struc go4kENV_wrk\n"); + fprintf(file, " .state resd 1\n"); + fprintf(file, " .level resd 1\n"); + fprintf(file, " .gm resd 1\n"); + fprintf(file, " .am resd 1\n"); + fprintf(file, " .dm resd 1\n"); + fprintf(file, " .sm resd 1\n"); + fprintf(file, " .rm resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "%%define ENV_STATE_ATTAC 0\n"); + fprintf(file, "%%define ENV_STATE_DECAY 1\n"); + fprintf(file, "%%define ENV_STATE_SUSTAIN 2\n"); + fprintf(file, "%%define ENV_STATE_RELEASE 3\n"); + fprintf(file, "%%define ENV_STATE_OFF 4\n"); + + fprintf(file, "GO4K_VCO_ID equ 2\n"); + fprintf(file, "%%macro GO4K_VCO 8\n"); + fprintf(file, " db %%1\n"); + fprintf(file, " db %%2\n"); + fprintf(file, "%%ifdef GO4K_USE_VCO_PHASE_OFFSET \n"); + fprintf(file, " db %%3\n"); + fprintf(file, "%%endif \n"); + fprintf(file, "%%ifdef GO4K_USE_VCO_GATE \n"); + fprintf(file, " db %%4\n"); + fprintf(file, "%%endif \n"); + fprintf(file, " db %%5\n"); + fprintf(file, "%%ifdef GO4K_USE_VCO_SHAPE \n"); + fprintf(file, " db %%6\n"); + fprintf(file, "%%endif \n"); + fprintf(file, " db %%7\n"); + fprintf(file, " db %%8\n"); + fprintf(file, "%%endmacro\n"); + fprintf(file, "%%define TRANSPOSE(val) val \n"); + fprintf(file, "%%define DETUNE(val) val \n"); + fprintf(file, "%%define PHASE(val) val \n"); + fprintf(file, "%%define GATES(val) val \n"); + fprintf(file, "%%define COLOR(val) val \n"); + fprintf(file, "%%define SHAPE(val) val \n"); + fprintf(file, "%%define FLAGS(val) val \n"); + fprintf(file, "%%define SINE 0x01\n"); + fprintf(file, "%%define TRISAW 0x02\n"); + fprintf(file, "%%define PULSE 0x04\n"); + fprintf(file, "%%define NOISE 0x08\n"); + fprintf(file, "%%define LFO 0x10\n"); + fprintf(file, "%%define GATE 0x20\n"); + fprintf(file, "%%define VCO_STEREO 0x40\n"); + fprintf(file, "struc go4kVCO_val\n"); + fprintf(file, " .transpose resd 1\n"); + fprintf(file, " .detune resd 1\n"); + fprintf(file, "%%ifdef GO4K_USE_VCO_PHASE_OFFSET \n"); + fprintf(file, " .phaseofs resd 1\n"); + fprintf(file, "%%endif \n"); + fprintf(file, "%%ifdef GO4K_USE_VCO_GATE \n"); + fprintf(file, " .gate resd 1\n"); + fprintf(file, "%%endif \n"); + fprintf(file, " .color resd 1\n"); + fprintf(file, "%%ifdef GO4K_USE_VCO_SHAPE \n"); + fprintf(file, " .shape resd 1\n"); + fprintf(file, "%%endif \n"); + fprintf(file, " .gain resd 1\n"); + fprintf(file, " .flags resd 1 \n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "struc go4kVCO_wrk\n"); + fprintf(file, " .phase resd 1\n"); + fprintf(file, " .tm resd 1\n"); + fprintf(file, " .dm resd 1\n"); + fprintf(file, " .fm resd 1\n"); + fprintf(file, " .pm resd 1\n"); + fprintf(file, " .cm resd 1\n"); + fprintf(file, " .sm resd 1\n"); + fprintf(file, " .gm resd 1\n"); + fprintf(file, " .phase2 resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + + fprintf(file, "GO4K_VCF_ID equ 3\n"); + fprintf(file, "%%macro GO4K_VCF 3\n"); + fprintf(file, " db %%1\n"); + fprintf(file, " db %%2\n"); + fprintf(file, " db %%3\n"); + fprintf(file, "%%endmacro\n"); + fprintf(file, "%%define LOWPASS 0x1\n"); + fprintf(file, "%%define HIGHPASS 0x2\n"); + fprintf(file, "%%define BANDPASS 0x4\n"); + fprintf(file, "%%define BANDSTOP 0x3\n"); + fprintf(file, "%%define ALLPASS 0x7\n"); + fprintf(file, "%%define PEAK 0x8\n"); + fprintf(file, "%%define STEREO 0x10\n"); + fprintf(file, "%%define FREQUENCY(val) val\n"); + fprintf(file, "%%define RESONANCE(val) val\n"); + fprintf(file, "%%define VCFTYPE(val) val\n"); + fprintf(file, "struc go4kVCF_val\n"); + fprintf(file, " .freq resd 1\n"); + fprintf(file, " .res resd 1\n"); + fprintf(file, " .type resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "struc go4kVCF_wrk\n"); + fprintf(file, " .low resd 1\n"); + fprintf(file, " .high resd 1\n"); + fprintf(file, " .band resd 1\n"); + fprintf(file, " .freq resd 1\n"); + fprintf(file, " .fm resd 1\n"); + fprintf(file, " .rm resd 1\n"); + fprintf(file, " .low2 resd 1\n"); + fprintf(file, " .high2 resd 1\n"); + fprintf(file, " .band2 resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + + fprintf(file, "GO4K_DST_ID equ 4\n"); + fprintf(file, "%%macro GO4K_DST 3\n"); + fprintf(file, " db %%1\n"); + fprintf(file, "%%ifdef GO4K_USE_DST_SH\n"); + fprintf(file, " db %%2\n"); + fprintf(file, "%%ifdef GO4K_USE_DST_STEREO\n"); + fprintf(file, " db %%3\n"); + fprintf(file, "%%endif\n"); + fprintf(file, "%%else\n"); + fprintf(file, "%%ifdef GO4K_USE_DST_STEREO\n"); + fprintf(file, " db %%3\n"); + fprintf(file, "%%endif\n"); + fprintf(file, "%%endif\n"); + fprintf(file, "%%endmacro\n"); + fprintf(file, "%%define DRIVE(val) val\n"); + fprintf(file, "%%define SNHFREQ(val) val\n"); + fprintf(file, "%%define FLAGS(val) val\n"); + fprintf(file, "struc go4kDST_val\n"); + fprintf(file, " .drive resd 1\n"); + fprintf(file, "%%ifdef GO4K_USE_DST_SH \n"); + fprintf(file, " .snhfreq resd 1\n"); + fprintf(file, "%%endif \n"); + fprintf(file, " .flags resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "struc go4kDST_wrk\n"); + fprintf(file, " .out resd 1\n"); + fprintf(file, " .snhphase resd 1\n"); + fprintf(file, " .dm resd 1\n"); + fprintf(file, " .sm resd 1\n"); + fprintf(file, " .out2 resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + + fprintf(file, "GO4K_DLL_ID equ 5\n"); + fprintf(file, "%%macro GO4K_DLL 8\n"); + fprintf(file, " db %%1\n"); + fprintf(file, " db %%2\n"); + fprintf(file, " db %%3\n"); + fprintf(file, "%%ifdef GO4K_USE_DLL_DAMP \n"); + fprintf(file, " db %%4\n"); + fprintf(file, "%%endif \n"); + fprintf(file, "%%ifdef GO4K_USE_DLL_CHORUS \n"); + fprintf(file, " db %%5\n"); + fprintf(file, " db %%6\n"); + fprintf(file, "%%endif\n"); + fprintf(file, " db %%7\n"); + fprintf(file, " db %%8\n"); + fprintf(file, "%%endmacro\n"); + fprintf(file, "%%define PREGAIN(val) val\n"); + fprintf(file, "%%define DRY(val) val\n"); + fprintf(file, "%%define FEEDBACK(val) val\n"); + fprintf(file, "%%define DEPTH(val) val\n"); + fprintf(file, "%%define DAMP(val) val\n"); + fprintf(file, "%%define DELAY(val) val\n"); + fprintf(file, "%%define COUNT(val) val\n"); + fprintf(file, "struc go4kDLL_val\n"); + fprintf(file, " .pregain resd 1\n"); + fprintf(file, " .dry resd 1\n"); + fprintf(file, " .feedback resd 1\n"); + fprintf(file, "%%ifdef GO4K_USE_DLL_DAMP \n"); + fprintf(file, " .damp resd 1 \n"); + fprintf(file, "%%endif\n"); + fprintf(file, "%%ifdef GO4K_USE_DLL_CHORUS\n"); + fprintf(file, " .freq resd 1\n"); + fprintf(file, " .depth\n"); + fprintf(file, "%%endif\n"); + fprintf(file, " .delay resd 1\n"); + fprintf(file, " .count resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "struc go4kDLL_wrk\n"); + fprintf(file, " .index resd 1\n"); + fprintf(file, " .store resd 1\n"); + fprintf(file, " .dcin resd 1\n"); + fprintf(file, " .dcout resd 1\n"); + fprintf(file, "%%ifdef GO4K_USE_DLL_CHORUS\n"); + fprintf(file, " .phase resd 1\n"); + fprintf(file, "%%endif\n"); + fprintf(file, " .buffer resd MAX_DELAY\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "struc go4kDLL_wrk2\n"); + fprintf(file, " .pm resd 1\n"); + fprintf(file, " .fm resd 1\n"); + fprintf(file, " .im resd 1\n"); + fprintf(file, " .dm resd 1\n"); + fprintf(file, " .sm resd 1\n"); + fprintf(file, " .am resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + + fprintf(file, "GO4K_FOP_ID equ 6\n"); + fprintf(file, "%%macro GO4K_FOP 1\n"); + fprintf(file, " db %%1\n"); + fprintf(file, "%%endmacro\n"); + fprintf(file, "%%define OP(val) val\n"); + fprintf(file, "%%define FOP_POP 0x1\n"); + fprintf(file, "%%define FOP_ADDP 0x2\n"); + fprintf(file, "%%define FOP_MULP 0x3\n"); + fprintf(file, "%%define FOP_PUSH 0x4\n"); + fprintf(file, "%%define FOP_XCH 0x5\n"); + fprintf(file, "%%define FOP_ADD 0x6\n"); + fprintf(file, "%%define FOP_MUL 0x7\n"); + fprintf(file, "%%define FOP_ADDP2 0x8\n"); + fprintf(file, "%%define FOP_LOADNOTE 0x9\n"); + fprintf(file, "%%define FOP_MULP2 0xa\n"); + fprintf(file, "struc go4kFOP_val\n"); + fprintf(file, " .flags resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "struc go4kFOP_wrk\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + + fprintf(file, "GO4K_FST_ID equ 7\n"); + fprintf(file, "%%macro GO4K_FST 2\n"); + fprintf(file, " db %%1\n"); + fprintf(file, " dw %%2\n"); + fprintf(file, "%%endmacro\n"); + fprintf(file, "%%define AMOUNT(val) val\n"); + fprintf(file, "%%define DEST(val) val\n"); + fprintf(file, "%%define FST_SET 0x0000\n"); + fprintf(file, "%%define FST_ADD 0x4000\n"); + fprintf(file, "%%define FST_POP 0x8000\n"); + fprintf(file, "struc go4kFST_val\n"); + fprintf(file, " .amount resd 1\n"); + fprintf(file, " .op1 resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "struc go4kFST_wrk\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + + fprintf(file, "GO4K_PAN_ID equ 8\n"); + fprintf(file, "%%macro GO4K_PAN 1\n"); + fprintf(file, "%%ifdef GO4K_USE_PAN\n"); + fprintf(file, " db %%1\n"); + fprintf(file, "%%endif\n"); + fprintf(file, "%%endmacro\n"); + fprintf(file, "%%define PANNING(val) val\n"); + fprintf(file, "struc go4kPAN_val\n"); + fprintf(file, "%%ifdef GO4K_USE_PAN\n"); + fprintf(file, " .panning resd 1\n"); + fprintf(file, "%%endif\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "struc go4kPAN_wrk\n"); + fprintf(file, " .pm resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + + fprintf(file, "GO4K_OUT_ID equ 9\n"); + fprintf(file, "%%macro GO4K_OUT 2\n"); + fprintf(file, " db %%1\n"); + fprintf(file, "%%ifdef GO4K_USE_GLOBAL_DLL \n"); + fprintf(file, " db %%2\n"); + fprintf(file, "%%endif \n"); + fprintf(file, "%%endmacro\n"); + fprintf(file, "%%define AUXSEND(val) val\n"); + fprintf(file, "struc go4kOUT_val\n"); + fprintf(file, " .gain resd 1\n"); + fprintf(file, "%%ifdef GO4K_USE_GLOBAL_DLL \n"); + fprintf(file, " .auxsend resd 1\n"); + fprintf(file, "%%endif\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "struc go4kOUT_wrk\n"); + fprintf(file, " .am resd 1\n"); + fprintf(file, " .gm resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + + fprintf(file, "GO4K_ACC_ID equ 10\n"); + fprintf(file, "%%macro GO4K_ACC 1\n"); + fprintf(file, " db %%1\n"); + fprintf(file, "%%endmacro\n"); + fprintf(file, "%%define OUTPUT 0\n"); + fprintf(file, "%%define AUX 8\n"); + fprintf(file, "%%define ACCTYPE(val) val\n"); + fprintf(file, "struc go4kACC_val\n"); + fprintf(file, " .acctype resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "struc go4kACC_wrk\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + + fprintf(file, "%%ifdef GO4K_USE_FLD\n"); + fprintf(file, "GO4K_FLD_ID equ 11\n"); + fprintf(file, "%%macro GO4K_FLD 1\n"); + fprintf(file, " db %%1\n"); + fprintf(file, "%%endmacro\n"); + fprintf(file, "%%define VALUE(val) val\n"); + fprintf(file, "struc go4kFLD_val\n"); + fprintf(file, " .value resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "struc go4kFLD_wrk\n"); + fprintf(file, " .vm resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "%%endif\n"); + + fprintf(file, "%%ifdef GO4K_USE_GLITCH\n"); + fprintf(file, "GO4K_GLITCH_ID equ 12\n"); + fprintf(file, "%%macro GO4K_GLITCH 5\n"); + fprintf(file, " db %%1\n"); + fprintf(file, " db %%2\n"); + fprintf(file, " db %%3\n"); + fprintf(file, " db %%4\n"); + fprintf(file, " db %%5\n"); + fprintf(file, "%%endmacro\n"); + fprintf(file, "%%define ACTIVE(val) val\n"); + fprintf(file, "%%define SLICEFACTOR(val)val\n"); + fprintf(file, "%%define PITCHFACTOR(val)val\n"); + fprintf(file, "%%define SLICESIZE(val) val\n"); + fprintf(file, "struc go4kGLITCH_val\n"); + fprintf(file, " .active resd 1\n"); + fprintf(file, " .dry resd 1\n"); + fprintf(file, " .dsize resd 1\n"); + fprintf(file, " .dpitch resd 1\n"); + fprintf(file, " .slicesize resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "struc go4kGLITCH_wrk\n"); + fprintf(file, " .index resd 1\n"); + fprintf(file, " .store resd 1\n"); + fprintf(file, " .slizesize resd 1\n"); + fprintf(file, " .slicepitch resd 1\n"); + fprintf(file, " .unused resd 1\n"); + fprintf(file, " .buffer resd MAX_DELAY\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "struc go4kGLITCH_wrk2\n"); + fprintf(file, " .am resd 1\n"); + fprintf(file, " .dm resd 1\n"); + fprintf(file, " .sm resd 1\n"); + fprintf(file, " .pm resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "%%endif\n"); + + fprintf(file, "%%ifdef GO4K_USE_FSTG\n"); + fprintf(file, "GO4K_FSTG_ID equ 13\n"); + fprintf(file, "%%macro GO4K_FSTG 2\n"); + fprintf(file, " db %%1\n"); + fprintf(file, " dw %%2\n"); + fprintf(file, "%%endmacro\n"); + fprintf(file, "struc go4kFSTG_val\n"); + fprintf(file, " .amount resd 1\n"); + fprintf(file, " .op1 resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "struc go4kFSTG_wrk\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + fprintf(file, "%%endif\n"); + + fprintf(file, "struc go4k_instrument\n"); + fprintf(file, " .release resd 1\n"); + fprintf(file, " .note resd 1\n"); + fprintf(file, " .workspace resd MAX_UNITS*MAX_UNIT_SLOTS\n"); + fprintf(file, " .dlloutl resd 1\n"); + fprintf(file, " .dlloutr resd 1\n"); + fprintf(file, " .outl resd 1\n"); + fprintf(file, " .outr resd 1\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + + fprintf(file, "struc go4k_synth\n"); + fprintf(file, " .instruments resb go4k_instrument.size * MAX_INSTRUMENTS * MAX_VOICES\n"); + fprintf(file, " .global resb go4k_instrument.size * MAX_VOICES\n"); + fprintf(file, " .size\n"); + fprintf(file, "endstruc\n"); + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // the patterns + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + fprintf(file, "%%ifdef USE_SECTIONS\n"); + fprintf(file, "section .g4kmuc1 data align=1\n"); + fprintf(file, "%%else\n"); + fprintf(file, "section .data align=1\n"); + fprintf(file, "%%endif\n"); + fprintf(file, "go4k_patterns\n"); + for (int i = 0; i < ReducedPatterns.size()/PatternSize; i++) + { + fprintf(file, "\tdb\t"); + for (int j = 0; j < PatternSize; j++) + { + if (ReducedPatterns[i*PatternSize+j] >= 0) + fprintf(file, "%d, ", ReducedPatterns[i*PatternSize+j]); + else + fprintf(file, "HLD, "); + } + fprintf(file, "\n"); + } + fprintf(file, "go4k_patterns_end\n"); + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // the pattern indices + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + fprintf(file, "%%ifdef USE_SECTIONS\n"); + fprintf(file, "section .g4kmuc2 data align=1\n"); + fprintf(file, "%%else\n"); + fprintf(file, "section .data\n"); + fprintf(file, "%%endif\n"); + fprintf(file, "go4k_pattern_lists\n"); +#ifdef _8KLANG + // write primary plugins pattern indices + for (int i = 0; i < mergeMaxInst; i++) + { + fprintf(file, "Instrument%dList\t\tdb\t", i); + for (int j = 0; j < mergeMaxPatterns; j++) + { + fprintf(file, "%d, ", mergePatternIndices[i][j]); + } + // fill up with 0 indices when secondary plugin has more patterns + for (int j = mergeMaxPatterns; j < PatternIndices[0].size(); j++) + { + fprintf(file, "0, "); + } + fprintf(file, "\n"); + } +#endif + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + if (!InstrumentUsed[i]) continue; + fprintf(file, "Instrument%dList\t\tdb\t", i + mergeMaxInst); + for (int j = 0; j < PatternIndices[i].size(); j++) + { + fprintf(file, "%d, ", PatternIndices[i][j]); + } + // fill up with 0 indices when primary plugin had more patterns + for (int j = PatternIndices[0].size(); j < mergeMaxPatterns; j++) + { + fprintf(file, "0, "); + } + fprintf(file, "\n"); + } + + fprintf(file, "go4k_pattern_lists_end\n"); + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // the instrument commands + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + fprintf(file, "%%ifdef USE_SECTIONS\n"); + fprintf(file, "section .g4kmuc3 data align=1\n"); + fprintf(file, "%%else\n"); + fprintf(file, "section .data\n"); + fprintf(file, "%%endif\n"); + fprintf(file, "go4k_synth_instructions\n"); + char comstr[1024]; + std::string CommandString; + +#ifdef _8KLANG + // add primary plugin commands first + fprintf(file, "%s", mergeCommandString.c_str()); +#endif + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + if (!InstrumentUsed[i]) continue; + sprintf(comstr, "GO4K_BEGIN_CMDDEF(Instrument%d)\n", i + mergeMaxInst); CommandString += comstr; + for (int u = 0; u < MAX_UNITS; u++) + { + comstr[0] = 0; + + if (SynthObj.InstrumentValues[i][u][0] == M_ENV) + sprintf(comstr, "\tdb GO4K_ENV_ID\n"); + if (SynthObj.InstrumentValues[i][u][0] == M_VCO) + sprintf(comstr, "\tdb GO4K_VCO_ID\n"); + if (SynthObj.InstrumentValues[i][u][0] == M_VCF) + sprintf(comstr, "\tdb GO4K_VCF_ID\n"); + if (SynthObj.InstrumentValues[i][u][0] == M_DST) + sprintf(comstr, "\tdb GO4K_DST_ID\n"); + if (SynthObj.InstrumentValues[i][u][0] == M_DLL) + sprintf(comstr, "\tdb GO4K_DLL_ID\n"); + if (SynthObj.InstrumentValues[i][u][0] == M_FOP) + sprintf(comstr, "\tdb GO4K_FOP_ID\n"); + if (SynthObj.InstrumentValues[i][u][0] == M_FST) + { + FST_valP v = (FST_valP)(SynthObj.InstrumentValues[i][u]); + // local storage + if (v->dest_stack == -1 || v->dest_stack == i) + sprintf(comstr, "\tdb GO4K_FST_ID\n"); + // global storage + else + sprintf(comstr, "\tdb GO4K_FSTG_ID\n"); + } + if (SynthObj.InstrumentValues[i][u][0] == M_PAN) + sprintf(comstr, "\tdb GO4K_PAN_ID\n"); + if (SynthObj.InstrumentValues[i][u][0] == M_OUT) + sprintf(comstr, "\tdb GO4K_OUT_ID\n"); + if (SynthObj.InstrumentValues[i][u][0] == M_ACC) + sprintf(comstr, "\tdb GO4K_ACC_ID\n"); + if (SynthObj.InstrumentValues[i][u][0] == M_FLD) + sprintf(comstr, "\tdb GO4K_FLD_ID\n"); + if (SynthObj.InstrumentValues[i][u][0] == M_GLITCH) + sprintf(comstr, "\tdb GO4K_GLITCH_ID\n"); + + CommandString += comstr; + } + sprintf(comstr, "GO4K_END_CMDDEF\n"); CommandString += comstr; + }; + fprintf(file, "%s", CommandString.c_str()); + + fprintf(file, "GO4K_BEGIN_CMDDEF(Global)\n"); + for (int u = 0; u < MAX_UNITS; u++) + { + if (SynthObj.GlobalValues[u][0] == M_ENV) + fprintf(file, "\tdb GO4K_ENV_ID\n"); + if (SynthObj.GlobalValues[u][0] == M_VCO) + fprintf(file, "\tdb GO4K_VCO_ID\n"); + if (SynthObj.GlobalValues[u][0] == M_VCF) + fprintf(file, "\tdb GO4K_VCF_ID\n"); + if (SynthObj.GlobalValues[u][0] == M_DST) + fprintf(file, "\tdb GO4K_DST_ID\n"); + if (SynthObj.GlobalValues[u][0] == M_DLL) + fprintf(file, "\tdb GO4K_DLL_ID\n"); + if (SynthObj.GlobalValues[u][0] == M_FOP) + fprintf(file, "\tdb GO4K_FOP_ID\n"); + if (SynthObj.GlobalValues[u][0] == M_FST) + { + FST_valP v = (FST_valP)(SynthObj.GlobalValues[u]); + // local storage + if (v->dest_stack == -1 || v->dest_stack == MAX_INSTRUMENTS) + fprintf(file, "\tdb GO4K_FST_ID\n"); + // global storage + else + fprintf(file, "\tdb GO4K_FSTG_ID\n"); + } + if (SynthObj.GlobalValues[u][0] == M_PAN) + fprintf(file, "\tdb GO4K_PAN_ID\n"); + if (SynthObj.GlobalValues[u][0] == M_OUT) + fprintf(file, "\tdb GO4K_OUT_ID\n"); + if (SynthObj.GlobalValues[u][0] == M_ACC) + fprintf(file, "\tdb GO4K_ACC_ID\n"); + if (SynthObj.GlobalValues[u][0] == M_FLD) + fprintf(file, "\tdb GO4K_FLD_ID\n"); + if (SynthObj.GlobalValues[u][0] == M_GLITCH) + fprintf(file, "\tdb GO4K_GLITCH_ID\n"); + } + fprintf(file, "GO4K_END_CMDDEF\n"); + fprintf(file, "go4k_synth_instructions_end\n"); + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // the instrument data + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + fprintf(file, "%%ifdef USE_SECTIONS\n"); + fprintf(file, "section .g4kmuc4 data align=1\n"); + fprintf(file, "%%else\n"); + fprintf(file, "section .data\n"); + fprintf(file, "%%endif\n"); + fprintf(file, "go4k_synth_parameter_values\n"); + int delayindex = 0; + char valstr[1024]; + std::string ValueString; +#ifdef _8KLANG + // add primary plugin values first + fprintf(file, "%s", mergeValueString.c_str()); +#endif + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + if (!InstrumentUsed[i]) continue; + sprintf(valstr, "GO4K_BEGIN_PARAMDEF(Instrument%d)\n", i + mergeMaxInst); ValueString += valstr; + for (int u = 0; u < MAX_UNITS; u++) + { + valstr[0] = 0; + + if (SynthObj.InstrumentValues[i][u][0] == M_ENV) + { + ENV_valP v = (ENV_valP)(SynthObj.InstrumentValues[i][u]); + sprintf(valstr, "\tGO4K_ENV\tATTAC(%d),DECAY(%d),SUSTAIN(%d),RELEASE(%d),GAIN(%d)\n", v->attac, v->decay, v->sustain, v->release, v->gain); + } + if (SynthObj.InstrumentValues[i][u][0] == M_VCO) + { + VCO_valP v = (VCO_valP)(SynthObj.InstrumentValues[i][u]); + char type[16]; type[0] = 0; + char lfo[16]; lfo[0] = 0; + char stereo[16]; stereo[0] = 0; + if (v->flags & VCO_SINE) + sprintf(type, "SINE"); + if (v->flags & VCO_TRISAW) + sprintf(type, "TRISAW"); + if (v->flags & VCO_PULSE) + sprintf(type, "PULSE"); + if (v->flags & VCO_NOISE) + sprintf(type, "NOISE"); + if (v->flags & VCO_GATE) + sprintf(type, "GATE"); + if (v->flags & VCO_LFO) + sprintf(lfo, "|LFO"); + if (v->flags & VCO_STEREO) + sprintf(stereo, "|VCO_STEREO"); + sprintf(valstr, "\tGO4K_VCO\tTRANSPOSE(%d),DETUNE(%d),PHASE(%d),GATES(%d),COLOR(%d),SHAPE(%d),GAIN(%d),FLAGS(%s%s%s)\n", v->transpose, v->detune, v->phaseofs, v->gate, v->color, v->shape, v->gain, type, lfo, stereo); + } + if (SynthObj.InstrumentValues[i][u][0] == M_VCF) + { + VCF_valP v = (VCF_valP)(SynthObj.InstrumentValues[i][u]); + char type[16]; type[0] = 0; + char stereo[16]; stereo[0] = 0; + int t = v->type & ~VCF_STEREO; + if (t == VCF_LOWPASS) + sprintf(type, "LOWPASS"); + if (t == VCF_HIGHPASS) + sprintf(type, "HIGHPASS"); + if (t == VCF_BANDPASS) + sprintf(type, "BANDPASS"); + if (t == VCF_BANDSTOP) + sprintf(type, "BANDSTOP"); + if (t == VCF_ALLPASS) + sprintf(type, "ALLPASS"); + if (t == VCF_PEAK) + sprintf(type, "PEAK"); + if (v->type & VCF_STEREO) + sprintf(stereo, "|STEREO"); + sprintf(valstr, "\tGO4K_VCF\tFREQUENCY(%d),RESONANCE(%d),VCFTYPE(%s%s)\n", v->freq, v->res, type, stereo); + } + if (SynthObj.InstrumentValues[i][u][0] == M_DST) + { + DST_valP v = (DST_valP)(SynthObj.InstrumentValues[i][u]); + sprintf(valstr, "\tGO4K_DST\tDRIVE(%d), SNHFREQ(%d), FLAGS(%s)\n", v->drive, v->snhfreq, v->stereo & VCF_STEREO ? "STEREO" : "0"); + } + if (SynthObj.InstrumentValues[i][u][0] == M_DLL) + { + DLL_valP v = (DLL_valP)(SynthObj.InstrumentValues[i][u]); + if (v->delay < delay_indices.size()) + { + sprintf(valstr, "\tGO4K_DLL\tPREGAIN(%d),DRY(%d),FEEDBACK(%d),DAMP(%d),FREQUENCY(%d),DEPTH(%d),DELAY(%d),COUNT(%d)\n", + v->pregain, v->dry, v->feedback, v->damp, v->freq, v->depth, delay_indices[v->delay], v->count); + } + // error handling in case indices are fucked up + else + { + sprintf(valstr, "\tGO4K_DLL\tPREGAIN(%d),DRY(%d),FEEDBACK(%d),DAMP(%d),FREQUENCY(%d),DEPTH(%d),DELAY(%d),COUNT(%d) ; ERROR\n", + v->pregain, v->dry, v->feedback, v->damp, v->freq, v->depth, v->delay, v->count); + } + } + if (SynthObj.InstrumentValues[i][u][0] == M_FOP) + { + FOP_valP v = (FOP_valP)(SynthObj.InstrumentValues[i][u]); + char type[16]; type[0] = 0; + if (v->flags == FOP_POP) + sprintf(type, "FOP_POP"); + if (v->flags == FOP_PUSH) + sprintf(type, "FOP_PUSH"); + if (v->flags == FOP_XCH) + sprintf(type, "FOP_XCH"); + if (v->flags == FOP_ADD) + sprintf(type, "FOP_ADD"); + if (v->flags == FOP_ADDP) + sprintf(type, "FOP_ADDP"); + if (v->flags == FOP_MUL) + sprintf(type, "FOP_MUL"); + if (v->flags == FOP_MULP) + sprintf(type, "FOP_MULP"); + if (v->flags == FOP_ADDP2) + sprintf(type, "FOP_ADDP2"); + if (v->flags == FOP_LOADNOTE) + sprintf(type, "FOP_LOADNOTE"); + if (v->flags == FOP_MULP2) + sprintf(type, "FOP_MULP2"); + sprintf(valstr, "\tGO4K_FOP\tOP(%s)\n", type); + } + if (SynthObj.InstrumentValues[i][u][0] == M_FST) + { + FST_valP v = (FST_valP)(SynthObj.InstrumentValues[i][u]); + // local storage + if (v->dest_stack == -1 || v->dest_stack == i) + { + // skip empty units on the way to target + int emptySkip = 0; + for (int e = 0; e < v->dest_unit; e++) + { + if (SynthObj.InstrumentValues[i][e][0] == M_NONE) + emptySkip++; + } + std::string modes; + modes = "FST_SET"; + if (v->type & FST_ADD) + modes = "FST_ADD"; + //if (v->type & FST_MUL) + // modes = "FST_MUL"; + if (v->type & FST_POP) + modes += "+FST_POP"; + sprintf(valstr, "\tGO4K_FST\tAMOUNT(%d),DEST(%d*MAX_UNIT_SLOTS+%d+%s)\n", v->amount, v->dest_unit-emptySkip, v->dest_slot, modes.c_str() ); + } + // global storage + else + { + int storestack; + if (v->dest_stack == MAX_INSTRUMENTS) + storestack = maxinst; + else + storestack = InstrumentIndex[v->dest_stack] + mergeMaxInst; + // skip empty units on the way to target + int emptySkip = 0; + for (int e = 0; e < v->dest_unit; e++) + { + if (v->dest_stack == MAX_INSTRUMENTS) + { + if (SynthObj.GlobalValues[e][0] == M_NONE) + emptySkip++; + } + else + { + if (SynthObj.InstrumentValues[v->dest_stack][e][0] == M_NONE) + emptySkip++; + } + } + // invalid store target, possibly due non usage of the target instrument + if (storestack == -1) + { + sprintf(valstr, "\tGO4K_FSTG\tAMOUNT(0),DEST(7*4+go4k_instrument.workspace)\n"); + } + else + { + std::string modes; + modes = "FST_SET"; + if (v->type & FST_ADD) + modes = "FST_ADD"; + //if (v->type & FST_MUL) + // modes = "FST_MUL"; + if (v->type & FST_POP) + modes += "+FST_POP"; + sprintf(valstr, "\tGO4K_FSTG\tAMOUNT(%d),DEST((%d*go4k_instrument.size*MAX_VOICES/4)+(%d*MAX_UNIT_SLOTS+%d)+(go4k_instrument.workspace/4)+%s)\n", v->amount, storestack, v->dest_unit-emptySkip, v->dest_slot, modes.c_str()); + } + } + } + if (SynthObj.InstrumentValues[i][u][0] == M_PAN) + { + PAN_valP v = (PAN_valP)(SynthObj.InstrumentValues[i][u]); + sprintf(valstr, "\tGO4K_PAN\tPANNING(%d)\n", v->panning); + } + if (SynthObj.InstrumentValues[i][u][0] == M_OUT) + { + OUT_valP v = (OUT_valP)(SynthObj.InstrumentValues[i][u]); + sprintf(valstr, "\tGO4K_OUT\tGAIN(%d), AUXSEND(%d)\n", v->gain, v->auxsend); + } + if (SynthObj.InstrumentValues[i][u][0] == M_ACC) + { + ACC_valP v = (ACC_valP)(SynthObj.InstrumentValues[i][u]); + if (v->flags == ACC_OUT) + sprintf(valstr, "\tGO4K_ACC\tACCTYPE(OUTPUT)\n"); + else + sprintf(valstr, "\tGO4K_ACC\tACCTYPE(AUX)\n"); + } + if (SynthObj.InstrumentValues[i][u][0] == M_FLD) + { + FLD_valP v = (FLD_valP)(SynthObj.InstrumentValues[i][u]); + sprintf(valstr, "\tGO4K_FLD\tVALUE(%d)\n", v->value); + } + if (SynthObj.InstrumentValues[i][u][0] == M_GLITCH) + { + GLITCH_valP v = (GLITCH_valP)(SynthObj.InstrumentValues[i][u]); + if (v->delay < delay_indices.size()) + { + sprintf(valstr, "\tGO4K_GLITCH\tACTIVE(%d),DRY(%d),SLICEFACTOR(%d),PITCHFACTOR(%d),SLICESIZE(%d)\n", + v->active, v->dry, v->dsize, v->dpitch, delay_indices[v->delay]); + } + // error handling in case indices are fucked up + else + { + sprintf(valstr, "\tGO4K_GLITCH\tACTIVE(%d),DRY(%d),SLICEFACTOR(%d),PITCHFACTOR(%d),SLICESIZE(%d) ; ERROR\n", + v->active, v->dry, v->dsize, v->dpitch, v->delay); + } + } + + ValueString += valstr; + } + sprintf(valstr, "GO4K_END_PARAMDEF\n"); ValueString += valstr; + } + fprintf(file, "%s", ValueString.c_str()); + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // the global data + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + { + fprintf(file, "GO4K_BEGIN_PARAMDEF(Global)\n"); + for (int u = 0; u < MAX_UNITS; u++) + { + if (SynthObj.GlobalValues[u][0] == M_ENV) + { + ENV_valP v = (ENV_valP)(SynthObj.GlobalValues[u]); + fprintf(file, "\tGO4K_ENV\tATTAC(%d),DECAY(%d),SUSTAIN(%d),RELEASE(%d),GAIN(%d)\n", v->attac, v->decay, v->sustain, v->release, v->gain); + } + if (SynthObj.GlobalValues[u][0] == M_VCO) + { + VCO_valP v = (VCO_valP)(SynthObj.GlobalValues[u]); + char type[16]; type[0] = 0; + char lfo[16]; lfo[0] = 0; + char stereo[16]; stereo[0] = 0; + if (v->flags & VCO_SINE) + sprintf(type, "SINE"); + if (v->flags & VCO_TRISAW) + sprintf(type, "TRISAW"); + if (v->flags & VCO_PULSE) + sprintf(type, "PULSE"); + if (v->flags & VCO_NOISE) + sprintf(type, "NOISE"); + if (v->flags & VCO_GATE) + sprintf(type, "GATE"); + if (v->flags & VCO_LFO) + sprintf(lfo, "|LFO"); + if (v->flags & VCO_STEREO) + sprintf(stereo, "|VCO_STEREO"); + fprintf(file, "\tGO4K_VCO\tTRANSPOSE(%d),DETUNE(%d),PHASE(%d),GATES(%d),COLOR(%d),SHAPE(%d),GAIN(%d),FLAGS(%s%s%s)\n", v->transpose, v->detune, v->phaseofs, v->gate, v->color, v->shape, v->gain, type, lfo, stereo); + } + if (SynthObj.GlobalValues[u][0] == M_VCF) + { + VCF_valP v = (VCF_valP)(SynthObj.GlobalValues[u]); + char type[16]; type[0] = 0; + char stereo[16]; stereo[0] = 0; + int t = v->type & ~VCF_STEREO; + if (t == VCF_LOWPASS) + sprintf(type, "LOWPASS"); + if (t == VCF_HIGHPASS) + sprintf(type, "HIGHPASS"); + if (t == VCF_BANDPASS) + sprintf(type, "BANDPASS"); + if (t == VCF_BANDSTOP) + sprintf(type, "BANDSTOP"); + if (t == VCF_ALLPASS) + sprintf(type, "ALLPASS"); + if (t == VCF_PEAK) + sprintf(type, "PEAK"); + if (v->type & VCF_STEREO) + sprintf(stereo, "|STEREO"); + fprintf(file, "\tGO4K_VCF\tFREQUENCY(%d),RESONANCE(%d),VCFTYPE(%s%s)\n", v->freq, v->res, type, stereo); + } + if (SynthObj.GlobalValues[u][0] == M_DST) + { + DST_valP v = (DST_valP)(SynthObj.GlobalValues[u]); + fprintf(file, "\tGO4K_DST\tDRIVE(%d), SNHFREQ(%d), FLAGS(%s)\n", v->drive, v->snhfreq, v->stereo & VCF_STEREO ? "STEREO" : "0"); + } + if (SynthObj.GlobalValues[u][0] == M_DLL) + { + DLL_valP v = (DLL_valP)(SynthObj.GlobalValues[u]); + if (v->delay < delay_indices.size()) + { + fprintf(file, "\tGO4K_DLL\tPREGAIN(%d),DRY(%d),FEEDBACK(%d),DAMP(%d),FREQUENCY(%d),DEPTH(%d),DELAY(%d),COUNT(%d)\n", + v->pregain, v->dry, v->feedback, v->damp, v->freq, v->depth, delay_indices[v->delay], v->count); + } + // error handling in case indices are fucked up + else + { + fprintf(file, "\tGO4K_DLL\tPREGAIN(%d),DRY(%d),FEEDBACK(%d),DAMP(%d),FREQUENCY(%d),DEPTH(%d),DELAY(%d),COUNT(%d) ; ERROR\n", + v->pregain, v->dry, v->feedback, v->damp, v->freq, v->depth, v->delay, v->count); + } + } + if (SynthObj.GlobalValues[u][0] == M_FOP) + { + FOP_valP v = (FOP_valP)(SynthObj.GlobalValues[u]); + char type[16]; type[0] = 0; + if (v->flags == FOP_POP) + sprintf(type, "FOP_POP"); + if (v->flags == FOP_PUSH) + sprintf(type, "FOP_PUSH"); + if (v->flags == FOP_XCH) + sprintf(type, "FOP_XCH"); + if (v->flags == FOP_ADD) + sprintf(type, "FOP_ADD"); + if (v->flags == FOP_ADDP) + sprintf(type, "FOP_ADDP"); + if (v->flags == FOP_MUL) + sprintf(type, "FOP_MUL"); + if (v->flags == FOP_MULP) + sprintf(type, "FOP_MULP"); + if (v->flags == FOP_ADDP2) + sprintf(type, "FOP_ADDP2"); + if (v->flags == FOP_LOADNOTE) + sprintf(type, "FOP_LOADNOTE"); + if (v->flags == FOP_MULP2) + sprintf(type, "FOP_MULP2"); + fprintf(file, "\tGO4K_FOP\tOP(%s)\n", type); + } + if (SynthObj.GlobalValues[u][0] == M_FST) + { + FST_valP v = (FST_valP)(SynthObj.GlobalValues[u]); + // local storage + if (v->dest_stack == -1 || v->dest_stack == MAX_INSTRUMENTS) + { + // skip empty units on the way to target + int emptySkip = 0; + for (int e = 0; e < v->dest_unit; e++) + { + if (SynthObj.GlobalValues[e][0] == M_NONE) + emptySkip++; + } + std::string modes; + modes = "FST_SET"; + if (v->type & FST_ADD) + modes = "FST_ADD"; + //if (v->type & FST_MUL) + // modes = "FST_MUL"; + if (v->type & FST_POP) + modes += "+FST_POP"; + fprintf(file, "\tGO4K_FST\tAMOUNT(%d),DEST(%d*MAX_UNIT_SLOTS+%d+%s)\n", v->amount, v->dest_unit-emptySkip, v->dest_slot, modes.c_str()); + } + // global storage + else + { + int storestack = InstrumentIndex[v->dest_stack] + mergeMaxInst; + // skip empty units on the way to target + int emptySkip = 0; + for (int e = 0; e < v->dest_unit; e++) + { + if (SynthObj.InstrumentValues[v->dest_stack][e][0] == M_NONE) + emptySkip++; + } + // invalid store target, possibly due non usage of the target instrument + if (storestack == -1) + { + fprintf(file, "\tGO4K_FSTG\tAMOUNT(0),DEST(7*4+go4k_instrument.workspace)\n"); + } + else + { + std::string modes; + modes = "FST_SET"; + if (v->type & FST_ADD) + modes = "FST_ADD"; + //if (v->type & FST_MUL) + // modes = "FST_MUL"; + if (v->type & FST_POP) + modes += "+FST_POP"; + fprintf(file, "\tGO4K_FSTG\tAMOUNT(%d),DEST((%d*go4k_instrument.size*MAX_VOICES/4)+(%d*MAX_UNIT_SLOTS+%d)+(go4k_instrument.workspace/4)+%s)\n", v->amount, storestack, v->dest_unit-emptySkip, v->dest_slot, modes.c_str() ); + } + } + } + if (SynthObj.GlobalValues[u][0] == M_PAN) + { + PAN_valP v = (PAN_valP)(SynthObj.GlobalValues[u]); + fprintf(file, "\tGO4K_PAN\tPANNING(%d)\n", v->panning); + } + if (SynthObj.GlobalValues[u][0] == M_OUT) + { + OUT_valP v = (OUT_valP)(SynthObj.GlobalValues[u]); + fprintf(file, "\tGO4K_OUT\tGAIN(%d), AUXSEND(%d)\n", v->gain, v->auxsend); + } + if (SynthObj.GlobalValues[u][0] == M_ACC) + { + ACC_valP v = (ACC_valP)(SynthObj.GlobalValues[u]); + if (v->flags == ACC_OUT) + fprintf(file, "\tGO4K_ACC\tACCTYPE(OUTPUT)\n"); + else + fprintf(file, "\tGO4K_ACC\tACCTYPE(AUX)\n"); + } + if (SynthObj.GlobalValues[u][0] == M_FLD) + { + FLD_valP v = (FLD_valP)(SynthObj.GlobalValues[u]); + fprintf(file, "\tGO4K_FLD\tVALUE(%d)\n", v->value); + } + if (SynthObj.GlobalValues[u][0] == M_GLITCH) + { + GLITCH_valP v = (GLITCH_valP)(SynthObj.GlobalValues[u]); + if (v->delay < delay_indices.size()) + { + fprintf(file, "\tGO4K_GLITCH\tACTIVE(%d),DRY(%d),SLICEFACTOR(%d),PITCHFACTOR(%d),SLICESIZE(%d)\n", + v->active, v->dry, v->dsize, v->dpitch, delay_indices[v->delay]); + } + // error handling in case indices are fucked up + else + { + fprintf(file, "\tGO4K_GLITCH\tACTIVE(%d),DRY(%d),SLICEFACTOR(%d),PITCHFACTOR(%d),SLICESIZE(%d) ; ERROR\n", + v->active, v->dry, v->dsize, v->dpitch, v->delay); + } + } + } + fprintf(file, "GO4K_END_PARAMDEF\n"); + } + fprintf(file, "go4k_synth_parameter_values_end\n"); + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // delay line times + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // TODO: Reduction here + fprintf(file, "%%ifdef USE_SECTIONS\n"); + fprintf(file, "section .g4kmuc5 data align=1\n"); + fprintf(file, "%%else\n"); + fprintf(file, "section .data\n"); + fprintf(file, "%%endif\n"); + fprintf(file, "%%ifdef GO4K_USE_DLL\n"); + fprintf(file, "global _go4k_delay_times\n"); + fprintf(file, "_go4k_delay_times\n"); + for (int i = 0; i < delay_times.size(); i++) + { + fprintf(file, "\tdw %d\n", delay_times[i]); + } + fprintf(file, "%%endif\n"); + + fclose(file); + + + // save additional info for primary plugin so secondary can merge +#ifndef _8KLANG + std::string mergefile = storePath + "/8klang.merge"; + FILE *mfile = fopen(mergefile.c_str(), "wb"); + // write unit usage info block for primary plugin + fwrite(&uses, sizeof(SynthUses), 1, mfile); + // write number of instruments for primary plugin + fwrite(&maxinst, 4, 1, mfile); + // write max number of used patterns for primary plugin + int maxpatterns = PatternIndices[0].size(); + fwrite(&maxpatterns, 4, 1, mfile); + // write reduced patterns for primary plugin + int numreducedpatterns = ReducedPatterns.size()/PatternSize; + fwrite(&numreducedpatterns, 4, 1, mfile); + for (int i = 0; i < ReducedPatterns.size(); i++) + { + int rpv = ReducedPatterns[i]; + fwrite(&rpv, 4, 1, mfile); + } + // write pattern list for primary plugin + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + if (!InstrumentUsed[i]) continue; + for (int j = 0; j < PatternIndices[i].size(); j++) + { + int pi = PatternIndices[i][j]; + fwrite(&pi, 4, 1, mfile); + } + } + // write command strings + const char* cstr = CommandString.c_str(); + fwrite(cstr, 1, CommandString.size()+1, mfile); + // write value strings + const char* vstr = ValueString.c_str(); + fwrite(vstr, 1, ValueString.size()+1, mfile); + + // write delay times + int delaytimes = delay_times.size(); + fwrite(&delaytimes, 4, 1, mfile); + for (int i = 0; i < delay_times.size(); i++) + { + delaytimes = delay_times[i]; + fwrite(&delaytimes, 4, 1, mfile); + } + + fclose(mfile); +#endif + + } + + // write song info file + std::string infofile; + if (objformat != 0) // not windows obj + infofile = incfile.substr(0, incfile.size()-1) + "h"; + else + infofile = incfile.substr(0, incfile.size()-3) + "h"; + FILE *fnfofile = fopen(infofile.c_str(), "w"); + fprintf(fnfofile, "// some useful song defines for 4klang\n"); + fprintf(fnfofile, "#define SAMPLE_RATE %d\n", 44100); + fprintf(fnfofile, "#define BPM %f\n", BeatsPerMinute); + fprintf(fnfofile, "#define MAX_INSTRUMENTS %d\n", maxinst + mergeMaxInst); + fprintf(fnfofile, "#define MAX_PATTERNS %d\n", mergeMaxPatterns > PatternIndices[0].size() ? mergeMaxPatterns : PatternIndices[0].size()); + fprintf(fnfofile, "#define PATTERN_SIZE_SHIFT %d\n", GetShift2(PatternSize)); + fprintf(fnfofile, "#define PATTERN_SIZE (1 << PATTERN_SIZE_SHIFT)\n"); + fprintf(fnfofile, "#define MAX_TICKS (MAX_PATTERNS*PATTERN_SIZE)\n"); + fprintf(fnfofile, "#define SAMPLES_PER_TICK %d\n", ((int)(44100.0f*4.0f*60.0f/(BeatsPerMinute*16.0f*TickScaler)))); + fprintf(fnfofile, "#define MAX_SAMPLES (SAMPLES_PER_TICK*MAX_TICKS)\n"); + fprintf(fnfofile, "#define POLYPHONY %d\n", SynthObj.Polyphony); + if (output16) + { + fprintf(fnfofile, "#define INTEGER_16BIT\n"); + fprintf(fnfofile, "#define SAMPLE_TYPE short\n"); + } + else + { + fprintf(fnfofile, "#define FLOAT_32BIT\n"); + fprintf(fnfofile, "#define SAMPLE_TYPE float\n"); + } + if (objformat == 0) + { + fprintf(fnfofile, "\n#define WINDOWS_OBJECT\n\n"); + fprintf(fnfofile, "// declaration of the external synth render function, you'll always need that\n"); + fprintf(fnfofile, "extern \"C\" void __stdcall _4klang_render(void*);\n"); + fprintf(fnfofile, "// declaration of the external envelope buffer. access only if you're song was exported with that option\n"); + fprintf(fnfofile, "extern \"C\" float _4klang_envelope_buffer;\n"); + fprintf(fnfofile, "// declaration of the external note buffer. access only if you're song was exported with that option\n"); + fprintf(fnfofile, "extern \"C\" int _4klang_note_buffer;\n"); + } + if (objformat == 1) + { + fprintf(fnfofile, "\n#define LINUX_OBJECT\n\n"); + fprintf(fnfofile, "// declaration of the external synth render function, you'll always need that\n"); + fprintf(fnfofile, "extern void* __4klang_render(void*);\n"); + fprintf(fnfofile, "// declaration of the external envelope buffer. access only if you're song was exported with that option\n"); + fprintf(fnfofile, "extern float __4klang_envelope_buffer;\n"); + fprintf(fnfofile, "// declaration of the external note buffer. access only if you're song was exported with that option\n"); + fprintf(fnfofile, "extern int __4klang_note_buffer;\n"); + } + if (objformat == 2) + { + fprintf(fnfofile, "\n#define MACOSX_OBJECT\n\n"); + fprintf(fnfofile, "// declaration of the external synth render function, you'll always need that\n"); + fprintf(fnfofile, "extern void* _4klang_render(void*);\n"); + fprintf(fnfofile, "// declaration of the external envelope buffer. access only if you're song was exported with that option\n"); + fprintf(fnfofile, "extern float _4klang_envelope_buffer;\n"); + fprintf(fnfofile, "// declaration of the external note buffer. access only if you're song was exported with that option\n"); + fprintf(fnfofile, "extern int _4klang_note_buffer;\n"); + } + + fclose(fnfofile); +} + +SynthObjectP Go4kVSTi_GetSynthObject() +{ + return &SynthObj; } \ No newline at end of file diff --git a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiCore.h b/src/vsti/Go4kVSTiCore.h similarity index 95% rename from 4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiCore.h rename to src/vsti/Go4kVSTiCore.h index c1af657..7824844 100644 --- a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiCore.h +++ b/src/vsti/Go4kVSTiCore.h @@ -1,315 +1,315 @@ -#include "windows.h" - -// init synth -void Go4kVSTi_Init(); - -// clear instrument slot -void Go4kVSTi_ClearInstrumentSlot(char channel, int slot); -// clear instrument workspace -void Go4kVSTi_ClearInstrumentWorkspace(char channel); -// clear global slot -void Go4kVSTi_ClearGlobalSlot(int slot); -// clear global workspace -void Go4kVSTi_ClearGlobalWorkspace(); - -// reset instrument to default values -void Go4kVSTi_ResetInstrument(char channel); -// reset global to default values -void Go4kVSTi_ResetGlobal(); -// reset the synth to default values -void Go4kVSTi_ResetPatch(); - -// flip 2 neighbour instrument slots -void Go4kVSTi_FlipInstrumentSlots(char channel, int a, int b); -// flip 2 neighbour global slots -void Go4kVSTi_FlipGlobalSlots(int a, int b); - -// init a slot with given type with default values -void Go4kVSTi_InitSlot(BYTE* slot, int channel, int type); -// init a instrument slot -void Go4kVSTi_InitInstrumentSlot(char channel, int s, int type); -// init a global slot -void Go4kVSTi_InitGlobalSlot(int s, int type); - -// set global bpm -void Go4kVSTi_SetBPM(float bpm); -float Go4kVSTi_GetBPM(); - -// activate solo mode -void Go4kVSTi_Solo(int channel, int solo); -// stream recording activation/deactivation -void Go4kVSTi_Record(bool record, bool recordingNoise, int patternsize, float patternquant); -// panic -void Go4kVSTi_Panic(); -// update dll times (e.g. sync to current bpm) -void Go4kVSTi_UpdateDelayTimes(); -// clear delay lines -void Go4kVSTi_ClearDelayLines(); - -// one tick the whole synth pipeline. results are left and right output sample -void Go4kVSTi_Tick(float *oleft, float *oright, int samples); -// add a voice with given parameters to synth -void Go4kVSTi_AddVoice(int channel, int note); -// stop a voice with given parameters in synth -void Go4kVSTi_StopVoice(int channel, int note); - -// load binary patch data -void Go4kVSTi_LoadPatch(char *filename); -// save binary patch data -void Go4kVSTi_SavePatch(char *filename); -// load instrumen data to specified channel -void Go4kVSTi_LoadInstrument(char* filename, char channel); -// save instrument data from current channel -void Go4kVSTi_SaveInstrument(char* filename, char channel); -// load unit data into specified slot -void Go4kVSTi_LoadUnit(char* filename, BYTE* slot); -// save unit date from specified slot -void Go4kVSTi_SaveUnit(char* filename, BYTE* slot); - -void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, int useenotevalues, int clipoutput, int undenormalize, int objformat, int output16); - -#define MAX_POLYPHONY 2 -#define MAX_INSTRUMENTS 16 -#define MAX_UNITS 64 -#define MAX_UNIT_SLOTS 16 - -enum UnitID -{ - M_NONE = 0, - M_ENV, - M_VCO, - M_VCF, - M_DST, - M_DLL, - M_FOP, - M_FST, - M_PAN, - M_OUT, - M_ACC, - M_FLD, - M_GLITCH, - NUM_MODULES -}; - -///////////////////////////////////////////////////////////////////////////////////// -// value definitions -///////////////////////////////////////////////////////////////////////////////////// - - -#define ENV_STATE_ATTAC 0 -#define ENV_STATE_DECAY 1 -#define ENV_STATE_SUSTAIN 2 -#define ENV_STATE_RELEASE 3 -#define ENV_STATE_OFF 4 - -typedef struct ENV_val -{ - BYTE id; - BYTE attac; - BYTE decay; - BYTE sustain; - BYTE release; - BYTE gain; -// GUI STUFF -} *ENV_valP; - -#define VCO_SINE 0x01 -#define VCO_TRISAW 0x02 -#define VCO_PULSE 0x04 -#define VCO_NOISE 0x08 -#define VCO_LFO 0x10 -#define VCO_GATE 0x20 -#define VCO_STEREO 0x40 -typedef struct VCO_val -{ - BYTE id; - BYTE transpose; - BYTE detune; - BYTE phaseofs; - BYTE gate; - BYTE color; - BYTE shape; - BYTE gain; - BYTE flags; -// GUI STUFF -} *VCO_valP; - -typedef struct VCO11_val -{ - BYTE id; - BYTE transpose; - BYTE detune; - BYTE phaseofs; - BYTE color; - BYTE shape; - BYTE gain; - BYTE flags; -// GUI STUFF -} *VCO11_valP; - -#define VCF_LOWPASS 0x1 -#define VCF_HIGHPASS 0x2 -#define VCF_BANDPASS 0x4 -#define VCF_BANDSTOP 0x3 -#define VCF_ALLPASS 0x7 -#define VCF_PEAK 0x8 -#define VCF_STEREO 0x10 -typedef struct VCF_val -{ - BYTE id; - BYTE freq; - BYTE res; - BYTE type; -// GUI STUFF -} *VCF_valP; - -typedef struct DST_val -{ - BYTE id; - BYTE drive; - BYTE snhfreq; - BYTE stereo; -// GUI STUFF -} *DST_valP; - -typedef struct DLL_val -{ - BYTE id; - BYTE pregain; - BYTE dry; - BYTE feedback; - BYTE damp; - BYTE freq; - BYTE depth; - BYTE delay; - BYTE count; -// GUI STUFF - BYTE guidelay; - BYTE synctype; - BYTE leftreverb; - BYTE reverb; -} *DLL_valP; - -typedef struct DLL10_val -{ - BYTE id; - BYTE pregain; - BYTE dry; - BYTE feedback; - BYTE damp; - BYTE delay; - BYTE count; -// GUI STUFF - BYTE guidelay; - BYTE synctype; - BYTE leftreverb; - BYTE reverb; -} *DLL10_valP; - -#define FOP_POP 0x1 -#define FOP_ADDP 0x2 -#define FOP_MULP 0x3 -#define FOP_PUSH 0x4 -#define FOP_XCH 0x5 -#define FOP_ADD 0x6 -#define FOP_MUL 0x7 -#define FOP_ADDP2 0x8 -#define FOP_LOADNOTE 0x9 -#define FOP_MULP2 0xa -typedef struct FOP_val -{ - BYTE id; - BYTE flags; -} *FOP_valP; - -#define FST_SET 0x00 -#define FST_ADD 0x10 -#define FST_MUL 0x20 -#define FST_POP 0x40 -typedef struct FST_val -{ - BYTE id; - BYTE amount; - BYTE type; -// GUI STUFF - char dest_stack; - char dest_unit; - char dest_slot; - char dest_id; -} *FST_valP; - -typedef struct PAN_val -{ - BYTE id; - BYTE panning; -// GUI STUFF -} *PAN_valP; - -typedef struct OUT_val -{ - BYTE id; - BYTE gain; - BYTE auxsend; -// GUI STUFF -} *OUT_valP; - -#define ACC_OUT 0 -#define ACC_AUX 8 -typedef struct ACC_val -{ - BYTE id; - BYTE flags; -} *ACC_valP; - -typedef struct FLD_val -{ - BYTE id; - BYTE value; -// GUI STUFF -} *FLD_valP; - -typedef struct GLITCH_val -{ - BYTE id; - BYTE active; - BYTE dry; - BYTE dsize; - BYTE dpitch; - BYTE delay; -// GUI STUFF - BYTE guidelay; -} *GLITCH_valP; - - -///////////////////////////////////////////////////////////////////////////////////// -// workspace definitions -///////////////////////////////////////////////////////////////////////////////////// - -typedef struct InstrumentWorkspace -{ - DWORD release; - DWORD note; - float workspace[MAX_UNITS*MAX_UNIT_SLOTS]; - float dlloutl; - float dlloutr; - float outl; - float outr; -} *InstrumentWorkspaceP; - -typedef struct SynthObject -{ - DWORD Polyphony; - char InstrumentNames[MAX_INSTRUMENTS][64]; - BYTE InstrumentValues[MAX_INSTRUMENTS][MAX_UNITS][MAX_UNIT_SLOTS]; // 16 instruments a 32 slots a 32 dowrds - BYTE GlobalValues[MAX_UNITS][MAX_UNIT_SLOTS]; // 32 slots a 32 dwords - InstrumentWorkspace InstrumentWork[MAX_INSTRUMENTS*MAX_POLYPHONY]; - InstrumentWorkspace GlobalWork; - DWORD InstrumentSignalValid[MAX_INSTRUMENTS]; - DWORD GlobalSignalValid; - float SignalTrace[MAX_INSTRUMENTS]; - int ControlInstrument[MAX_INSTRUMENTS]; - int VoiceIndex[MAX_INSTRUMENTS]; - int HighestSlotIndex[17]; -} *SynthObjectP; - +#include "windows.h" + +// init synth +void Go4kVSTi_Init(); + +// clear instrument slot +void Go4kVSTi_ClearInstrumentSlot(char channel, int slot); +// clear instrument workspace +void Go4kVSTi_ClearInstrumentWorkspace(char channel); +// clear global slot +void Go4kVSTi_ClearGlobalSlot(int slot); +// clear global workspace +void Go4kVSTi_ClearGlobalWorkspace(); + +// reset instrument to default values +void Go4kVSTi_ResetInstrument(char channel); +// reset global to default values +void Go4kVSTi_ResetGlobal(); +// reset the synth to default values +void Go4kVSTi_ResetPatch(); + +// flip 2 neighbour instrument slots +void Go4kVSTi_FlipInstrumentSlots(char channel, int a, int b); +// flip 2 neighbour global slots +void Go4kVSTi_FlipGlobalSlots(int a, int b); + +// init a slot with given type with default values +void Go4kVSTi_InitSlot(BYTE* slot, int channel, int type); +// init a instrument slot +void Go4kVSTi_InitInstrumentSlot(char channel, int s, int type); +// init a global slot +void Go4kVSTi_InitGlobalSlot(int s, int type); + +// set global bpm +void Go4kVSTi_SetBPM(float bpm); +float Go4kVSTi_GetBPM(); + +// activate solo mode +void Go4kVSTi_Solo(int channel, int solo); +// stream recording activation/deactivation +void Go4kVSTi_Record(bool record, bool recordingNoise, int patternsize, float patternquant); +// panic +void Go4kVSTi_Panic(); +// update dll times (e.g. sync to current bpm) +void Go4kVSTi_UpdateDelayTimes(); +// clear delay lines +void Go4kVSTi_ClearDelayLines(); + +// one tick the whole synth pipeline. results are left and right output sample +void Go4kVSTi_Tick(float *oleft, float *oright, int samples); +// add a voice with given parameters to synth +void Go4kVSTi_AddVoice(int channel, int note); +// stop a voice with given parameters in synth +void Go4kVSTi_StopVoice(int channel, int note); + +// load binary patch data +void Go4kVSTi_LoadPatch(char *filename); +// save binary patch data +void Go4kVSTi_SavePatch(char *filename); +// load instrumen data to specified channel +void Go4kVSTi_LoadInstrument(char* filename, char channel); +// save instrument data from current channel +void Go4kVSTi_SaveInstrument(char* filename, char channel); +// load unit data into specified slot +void Go4kVSTi_LoadUnit(char* filename, BYTE* slot); +// save unit date from specified slot +void Go4kVSTi_SaveUnit(char* filename, BYTE* slot); + +void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, int useenotevalues, int clipoutput, int undenormalize, int objformat, int output16); + +#define MAX_POLYPHONY 2 +#define MAX_INSTRUMENTS 16 +#define MAX_UNITS 64 +#define MAX_UNIT_SLOTS 16 + +enum UnitID +{ + M_NONE = 0, + M_ENV, + M_VCO, + M_VCF, + M_DST, + M_DLL, + M_FOP, + M_FST, + M_PAN, + M_OUT, + M_ACC, + M_FLD, + M_GLITCH, + NUM_MODULES +}; + +///////////////////////////////////////////////////////////////////////////////////// +// value definitions +///////////////////////////////////////////////////////////////////////////////////// + + +#define ENV_STATE_ATTAC 0 +#define ENV_STATE_DECAY 1 +#define ENV_STATE_SUSTAIN 2 +#define ENV_STATE_RELEASE 3 +#define ENV_STATE_OFF 4 + +typedef struct ENV_val +{ + BYTE id; + BYTE attac; + BYTE decay; + BYTE sustain; + BYTE release; + BYTE gain; +// GUI STUFF +} *ENV_valP; + +#define VCO_SINE 0x01 +#define VCO_TRISAW 0x02 +#define VCO_PULSE 0x04 +#define VCO_NOISE 0x08 +#define VCO_LFO 0x10 +#define VCO_GATE 0x20 +#define VCO_STEREO 0x40 +typedef struct VCO_val +{ + BYTE id; + BYTE transpose; + BYTE detune; + BYTE phaseofs; + BYTE gate; + BYTE color; + BYTE shape; + BYTE gain; + BYTE flags; +// GUI STUFF +} *VCO_valP; + +typedef struct VCO11_val +{ + BYTE id; + BYTE transpose; + BYTE detune; + BYTE phaseofs; + BYTE color; + BYTE shape; + BYTE gain; + BYTE flags; +// GUI STUFF +} *VCO11_valP; + +#define VCF_LOWPASS 0x1 +#define VCF_HIGHPASS 0x2 +#define VCF_BANDPASS 0x4 +#define VCF_BANDSTOP 0x3 +#define VCF_ALLPASS 0x7 +#define VCF_PEAK 0x8 +#define VCF_STEREO 0x10 +typedef struct VCF_val +{ + BYTE id; + BYTE freq; + BYTE res; + BYTE type; +// GUI STUFF +} *VCF_valP; + +typedef struct DST_val +{ + BYTE id; + BYTE drive; + BYTE snhfreq; + BYTE stereo; +// GUI STUFF +} *DST_valP; + +typedef struct DLL_val +{ + BYTE id; + BYTE pregain; + BYTE dry; + BYTE feedback; + BYTE damp; + BYTE freq; + BYTE depth; + BYTE delay; + BYTE count; +// GUI STUFF + BYTE guidelay; + BYTE synctype; + BYTE leftreverb; + BYTE reverb; +} *DLL_valP; + +typedef struct DLL10_val +{ + BYTE id; + BYTE pregain; + BYTE dry; + BYTE feedback; + BYTE damp; + BYTE delay; + BYTE count; +// GUI STUFF + BYTE guidelay; + BYTE synctype; + BYTE leftreverb; + BYTE reverb; +} *DLL10_valP; + +#define FOP_POP 0x1 +#define FOP_ADDP 0x2 +#define FOP_MULP 0x3 +#define FOP_PUSH 0x4 +#define FOP_XCH 0x5 +#define FOP_ADD 0x6 +#define FOP_MUL 0x7 +#define FOP_ADDP2 0x8 +#define FOP_LOADNOTE 0x9 +#define FOP_MULP2 0xa +typedef struct FOP_val +{ + BYTE id; + BYTE flags; +} *FOP_valP; + +#define FST_SET 0x00 +#define FST_ADD 0x10 +#define FST_MUL 0x20 +#define FST_POP 0x40 +typedef struct FST_val +{ + BYTE id; + BYTE amount; + BYTE type; +// GUI STUFF + char dest_stack; + char dest_unit; + char dest_slot; + char dest_id; +} *FST_valP; + +typedef struct PAN_val +{ + BYTE id; + BYTE panning; +// GUI STUFF +} *PAN_valP; + +typedef struct OUT_val +{ + BYTE id; + BYTE gain; + BYTE auxsend; +// GUI STUFF +} *OUT_valP; + +#define ACC_OUT 0 +#define ACC_AUX 8 +typedef struct ACC_val +{ + BYTE id; + BYTE flags; +} *ACC_valP; + +typedef struct FLD_val +{ + BYTE id; + BYTE value; +// GUI STUFF +} *FLD_valP; + +typedef struct GLITCH_val +{ + BYTE id; + BYTE active; + BYTE dry; + BYTE dsize; + BYTE dpitch; + BYTE delay; +// GUI STUFF + BYTE guidelay; +} *GLITCH_valP; + + +///////////////////////////////////////////////////////////////////////////////////// +// workspace definitions +///////////////////////////////////////////////////////////////////////////////////// + +typedef struct InstrumentWorkspace +{ + DWORD release; + DWORD note; + float workspace[MAX_UNITS*MAX_UNIT_SLOTS]; + float dlloutl; + float dlloutr; + float outl; + float outr; +} *InstrumentWorkspaceP; + +typedef struct SynthObject +{ + DWORD Polyphony; + char InstrumentNames[MAX_INSTRUMENTS][64]; + BYTE InstrumentValues[MAX_INSTRUMENTS][MAX_UNITS][MAX_UNIT_SLOTS]; // 16 instruments a 32 slots a 32 dowrds + BYTE GlobalValues[MAX_UNITS][MAX_UNIT_SLOTS]; // 32 slots a 32 dwords + InstrumentWorkspace InstrumentWork[MAX_INSTRUMENTS*MAX_POLYPHONY]; + InstrumentWorkspace GlobalWork; + DWORD InstrumentSignalValid[MAX_INSTRUMENTS]; + DWORD GlobalSignalValid; + float SignalTrace[MAX_INSTRUMENTS]; + int ControlInstrument[MAX_INSTRUMENTS]; + int VoiceIndex[MAX_INSTRUMENTS]; + int HighestSlotIndex[17]; +} *SynthObjectP; + SynthObjectP Go4kVSTi_GetSynthObject(); \ No newline at end of file diff --git a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiGUI.cpp b/src/vsti/Go4kVSTiGUI.cpp similarity index 96% rename from 4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiGUI.cpp rename to src/vsti/Go4kVSTiGUI.cpp index 9d93fb2..5bc3279 100644 --- a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiGUI.cpp +++ b/src/vsti/Go4kVSTiGUI.cpp @@ -1,3502 +1,3502 @@ -#define _WIN32_WINNT 0x0400 -#include -#include -#include -#include "..\..\win\resource.h" -#include "Go4kVSTiGUI.h" -#include "Go4kVSTiCore.h" -#include -#include -#include -#include -#include - -#define T_INSTRUMENT 0 -#define T_GLOBAL 1 -#define NUM_TABS 2 - -static HINSTANCE hInstance; -static UINT_PTR timer = 1; -static UINT_PTR backupTimer = 2; -static UINT_PTR timerID = 0; -static UINT_PTR backupTimerID = 0; -static HWND DialogWnd = NULL; -static HWND ModuleWnd[NUM_MODULES]; -static HWND TabWnd[NUM_TABS]; -static HWND SetWnd; -static HWND ScrollWnd; -static int SelectedIUnit = 0; -static int SelectedGUnit = 0; -static int SelectedTab = T_INSTRUMENT; -static int SelectedInstrument = 0; -static int LinkToInstrument[16] = { 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 }; -static int SetUnit = -1; -static char SliderValTxt[128]; -static DWORD UnitCopyBuffer[MAX_UNIT_SLOTS]; -static int InstrumentScrollPos[MAX_INSTRUMENTS]; -static int GlobalScrollPos; -static int InitDone = false; - -static SynthObjectP SynthObjP; - -static char* UnitName[NUM_MODULES] = -{ - "-", - "Envelope", - "Oscillator", - "Filter", - "Distortion", - "DelayLine", - "Arithmetic", - "Store", - "Panning", - "Output", - "Accumulate", - "Load", - "Glitch" -}; - -// minimal signal precondition for each unit -static int UnitPreSignals[NUM_MODULES] = -{ - 0, // none - 0, // env - 0, // vco - 1, // vcf - 1, // dst - 1, // dll - 2, // fop, signal count for arithmetic depends on mode - 1, // fst - 1, // pan - 2, // out - 0, // acc - 0, // fld - 1, // glitch -}; - -// signal post condition (relative to precondition) -static int UnitPostSignals[NUM_MODULES] = -{ - 0, // none - 1, // env - 1, // vco - 0, // vcf - 0, // dst - 0, // dll - 0, // fop, signal count for arithmetic depends on mode - 0, // fst - 1, // pan - -2, // out - 2, // acc - 1, // fld - 0 // glitch -}; - -static char* UnitModulationTargetNames[][8] = -{ - { "", "", "", "", "", "", "", "" }, - { "", "", "Gain", "Attack", "Decay", "", "Release", "" }, - { "", "Transpose", "Detune", "Frequency", "Phase", "Color", "Shape", "Gain"}, - { "", "", "", "", "Cutoff Frequency", "Resonance", "", "" }, - { "", "", "Drive", "Sample&Hold Frequency", "", "", "", ""}, - { "Pregain", "Feedback", "Dry", "Damp", "LFO Frequency", "LFO Depth", "", "" }, - { "", "", "", "", "", "", "", "" }, - { "", "", "", "", "", "", "", "" }, - { "Panning", "", "", "", "", "", "", "" }, - { "AUX", "Gain", "", "", "", "", "", "" }, - { "", "", "", "", "", "", "", "" }, - { "Value", "", "", "", "", "", "", "" }, - { "Active", "Dry", "Delta Size", "Delta Pitch", "", "", "", "" }, -}; - -static char* UnitModulationTargetShortNames[][8] = -{ - { "", "", "", "", "", "", "", "" }, - { "", "", "Gain", "Attack", "Decay", "", "Release", "" }, - { "", "Transp", "Detune", "Freq", "Phase", "Color", "Shape", "Gain"}, - { "", "", "", "", "Cutoff", "Res", "", "" }, - { "", "", "Drive", "Freq", "", "", "", ""}, - { "Pregain", "Feedb", "Dry", "Damp", "LFO F", "LFO D", "", "" }, - { "", "", "", "", "", "", "", "" }, - { "", "", "", "", "", "", "", "" }, - { "Pan", "", "", "", "", "", "", "" }, - { "AUX", "Gain", "", "", "", "", "", "" }, - { "", "", "", "", "", "", "", "" }, - { "Value", "", "", "", "", "", "", "" }, - { "Active", "Dry", "DSize", "DPitch", "", "", "", "" }, -}; - -static char* delayName[33] = -{ - "1/32T", - "1/32", - "1/32D", - "1/16T", - "1/16", - "1/16D", - "1/8T", - "1/8", - "1/8D", - "1/4T", - "1/4", - "1/4D", - "1/2T", - "1/2", - "1/2D", - "1T", - "1", - "1D", - "2T", - "2", - "2D", - "3/8", - "5/8", - "7/8", - "9/8", - "11/8", - "13/8", - "15/8", - "3/4", - "5/4", - "7/4", - "3/2", - "3/2", -}; - -char* GetUnitString(BYTE* unit, char* unitname) -{ - char UnitDesc[128]; - UnitDesc[0]=0; - - if (unit[0] == M_VCO) - { - VCO_valP val = (VCO_valP)unit; - char lfo[5]; - lfo[0] = 0; - if (val->flags & VCO_LFO) - sprintf(lfo, "-LFO"); - if (val->flags & VCO_SINE) - sprintf(UnitDesc, " (%s%s)","Sine",lfo); - if (val->flags & VCO_TRISAW) - sprintf(UnitDesc, " (%s%s)","TriSaw",lfo); - if (val->flags & VCO_PULSE) - sprintf(UnitDesc, " (%s%s)","Pulse",lfo); - if (val->flags & VCO_NOISE) - sprintf(UnitDesc, " (%s%s)","Noise",lfo); - if (val->flags & VCO_GATE) - sprintf(UnitDesc, " (%s%s)","Gate",lfo); - } - if (unit[0] == M_VCF) - { - VCF_valP val = (VCF_valP)unit; - int ft = val->type & ~VCF_STEREO; - if (ft == VCF_LOWPASS) - sprintf(UnitDesc, " (%s F:%d)","Low", val->freq); - if (ft == VCF_HIGHPASS) - sprintf(UnitDesc, " (%s F:%d)","High", val->freq); - if (ft == VCF_BANDPASS) - sprintf(UnitDesc, " (%s F:%d)","Band", val->freq); - if (ft == VCF_BANDSTOP) - sprintf(UnitDesc, " (%s F:%d)","Notch", val->freq); - if (ft == VCF_PEAK) - sprintf(UnitDesc, " (%s F:%d)","Peak", val->freq); - if (ft == VCF_ALLPASS) - sprintf(UnitDesc, " (%s F:%d)","All", val->freq); - } - if (unit[0] == M_FOP) - { - FOP_valP val = (FOP_valP)unit; - if (val->flags == FOP_ADD) - sprintf(UnitDesc, " (%s)","+"); - if (val->flags == FOP_ADDP) - sprintf(UnitDesc, " (%s)","+/Pop"); - if (val->flags == FOP_MUL) - sprintf(UnitDesc, " (%s)","*"); - if (val->flags == FOP_MULP) - sprintf(UnitDesc, " (%s)","*/Pop"); - if (val->flags == FOP_POP) - sprintf(UnitDesc, " (%s)","Pop"); - if (val->flags == FOP_PUSH) - sprintf(UnitDesc, " (%s)","Push"); - if (val->flags == FOP_XCH) - sprintf(UnitDesc, " (%s)","Xch"); - if (val->flags == FOP_ADDP2) - sprintf(UnitDesc, " (%s)","2+/Pop"); - if (val->flags == FOP_LOADNOTE) - sprintf(UnitDesc, " (%s)","LoadNote"); - if (val->flags == FOP_MULP2) - sprintf(UnitDesc, " (%s)","2*/Pop"); - } - if (unit[0] == M_DLL) - { - DLL_valP val = (DLL_valP)unit; - if (val->reverb == 0) - sprintf(UnitDesc, " (%s)","Delay"); - else - sprintf(UnitDesc, " (%s)","Reverb"); - } - if (unit[0] == M_FST) - { - FST_valP val = (FST_valP)unit; - if (val->dest_unit == -1 || val->dest_slot == -1 || val->dest_id == -1) - { - sprintf(UnitDesc, " (No Target)"); - } - else - { - std::string st; - if (val->type & FST_ADD) - st = "+"; - if (val->type & FST_MUL) - st = "*"; - if (val->type & FST_POP) - st += ",Pop"; - - if ((val->dest_stack != -1) && (val->dest_stack != SelectedInstrument)) - { - if (val->dest_stack == MAX_INSTRUMENTS) - sprintf(UnitDesc, " (GU%d %s)%s", val->dest_unit+1, UnitModulationTargetShortNames[val->dest_id][val->dest_slot], st.c_str()); - else - sprintf(UnitDesc, " (%dU%d %s)%s",val->dest_stack+1, val->dest_unit+1, UnitModulationTargetShortNames[val->dest_id][val->dest_slot], st.c_str()); - } - else - { - sprintf(UnitDesc, " (U%d %s)%s", val->dest_unit+1, UnitModulationTargetShortNames[val->dest_id][val->dest_slot], st.c_str()); - } - } - } - if (unit[0] == M_DST) - { - DST_valP val = (DST_valP)unit; - sprintf(UnitDesc, " (D:%d)", val->drive-64, val->snhfreq); - } - if (unit[0] == M_PAN) - { - PAN_valP val = (PAN_valP)unit; - sprintf(UnitDesc, " (%d)", val->panning-64); - } - if (unit[0] == M_ACC) - { - ACC_valP val = (ACC_valP)unit; - if (val->flags == ACC_OUT) - sprintf(UnitDesc, " (%s)","Out"); - else - sprintf(UnitDesc, " (%s)","Aux"); - } - if (unit[0] == M_OUT) - { - OUT_valP val = (OUT_valP)unit; - sprintf(UnitDesc, " (G:%d A:%d)",val->gain, val->auxsend); - } - if (unit[0] == M_FLD) - { - FLD_valP val = (FLD_valP)unit; - sprintf(UnitDesc, " (%d)", val->value-64); - } - if (unit[0] == M_GLITCH) - { - GLITCH_valP val = (GLITCH_valP)unit; - sprintf(UnitDesc, " (%s)","Glitch"); - } - - sprintf(unitname, "%s%s", UnitName[unit[0]], UnitDesc); - return unitname; -} - -void UpdateDelayTimes(DLL_valP unit) -{ - // if reverb skip - if (unit->reverb) - return; - - Go4kVSTi_UpdateDelayTimes(); - - int delay; - char text[10]; - DLL_valP v = (DLL_valP)unit; - if (v->synctype == 2) - { - } - else - { - if (v->synctype == 1) - { - sprintf(text, "%s", delayName[v->guidelay>>2]); - } - else - { - delay = v->guidelay*16; - sprintf(text, "%.2f ms", (float)delay/44.100f); - } - sprintf(SliderValTxt, "%s", text); - SetWindowText(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), SliderValTxt); - } -} - -void UpdateDelayTimes(GLITCH_valP unit) -{ - Go4kVSTi_UpdateDelayTimes(); - - int delay; - char text[10]; - GLITCH_valP v = (GLITCH_valP)unit; - sprintf(text, "%s", delayName[v->guidelay>>2]); - sprintf(SliderValTxt, "%s", text); - SetWindowText(GetDlgItem(ModuleWnd[M_GLITCH], IDC_GLITCH_DTIME_VAL), SliderValTxt); -} - -// CB for the main DLG -BOOL CALLBACK MainDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) - { - case WM_INITDIALOG: - { - HWND tab = GetDlgItem(hwndDlg, IDC_MAINTAB); - TCITEM item; - item.mask = TCIF_TEXT; - item.pszText = "Instrument"; - SendDlgItemMessage(hwndDlg, IDC_MAINTAB, TCM_INSERTITEM, (WPARAM)0, (LPARAM)(&item)); - item.pszText = "Global"; - SendDlgItemMessage(hwndDlg, IDC_MAINTAB, TCM_INSERTITEM, (WPARAM)2, (LPARAM)(&item)); - - const char* instrument[] = {"1", "2", "3", "4", "5", "6", "7", "8", - "9", "10", "11", "12", "13", "14", "15", "16" }; - for (int i = 0; i < 16; i++) - { - SendDlgItemMessage(hwndDlg, IDC_INSTRUMENT, CB_ADDSTRING, (WPARAM)0, (LPARAM)(instrument[i])); - SendDlgItemMessage(hwndDlg, IDC_INSTRUMENTLINK, CB_ADDSTRING, (WPARAM)0, (LPARAM)(instrument[i])); - } - SendDlgItemMessage(hwndDlg, IDC_INSTRUMENTLINK, CB_ADDSTRING, (WPARAM)0, (LPARAM)("None")); - SendDlgItemMessage(hwndDlg, IDC_INSTRUMENT, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); - SendDlgItemMessage(hwndDlg, IDC_INSTRUMENT, CB_SETCURSEL, (WPARAM)16, (LPARAM)0); - - const char* patternsize[] = {"8", "16", "32", "64"}; - for (int i = 0; i < 4; i++) - SendDlgItemMessage(hwndDlg, IDC_PATTERN_SIZE, CB_ADDSTRING, (WPARAM)0, (LPARAM)(patternsize[i])); - SendDlgItemMessage(hwndDlg, IDC_PATTERN_SIZE, CB_SETCURSEL, (WPARAM)1, (LPARAM)0); - - const char* patternquant[] = {"1/4", "1/8", "1/16", "1/32", "1/64", "1/128"}; - for (int i = 0; i < 6; i++) - SendDlgItemMessage(hwndDlg, IDC_PATTERN_QUANT, CB_ADDSTRING, (WPARAM)0, (LPARAM)(patternquant[i])); - SendDlgItemMessage(hwndDlg, IDC_PATTERN_QUANT, CB_SETCURSEL, (WPARAM)2, (LPARAM)0); - - const char* objformat[] = {"Windows OBJ", "Linux ELF", "OSX MACHO"}; - for (int i = 0; i < 3; i++) - SendDlgItemMessage(hwndDlg, IDC_OBJFORMAT, CB_ADDSTRING, (WPARAM)0, (LPARAM)(objformat[i])); - SendDlgItemMessage(hwndDlg, IDC_OBJFORMAT, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); - - const char* polyphony[] = { "1xPolyphone", "2xPolyphone" }; - for (int i = 0; i < MAX_POLYPHONY; i++) - SendDlgItemMessage(hwndDlg, IDC_POLYPHONY, CB_ADDSTRING, (WPARAM)0, (LPARAM)(polyphony[i])); - SendDlgItemMessage(hwndDlg, IDC_POLYPHONY, CB_SETCURSEL, (WPARAM)1, (LPARAM)0); - - SendDlgItemMessage(hwndDlg, IDC_CLIPOUTPUT, BM_SETCHECK, 1, 0); - SendDlgItemMessage(hwndDlg, IDC_RECORDBUSYSIGNAL, BM_SETCHECK, 1, 0); - - return TRUE; - } - case WM_COMMAND: - { - // channel combo box - if (((HWND)lParam) == GetDlgItem(hwndDlg, IDC_INSTRUMENT)) - { - if (HIWORD(wParam) == CBN_SELCHANGE) - { - SelectedInstrument = SendDlgItemMessage(hwndDlg, IDC_INSTRUMENT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); - if (SendDlgItemMessage(hwndDlg, IDC_SOLO, BM_GETCHECK, 0, 0)==BST_CHECKED) - Go4kVSTi_Solo(SelectedInstrument, true); - else - Go4kVSTi_Solo(SelectedInstrument, false); - // get values from synth and set gui accordingly ... - UpdateControls(SelectedInstrument); - // reset scroll pos - int oldpos = GetScrollPos(ScrollWnd, SB_VERT); - SCROLLINFO sinfo; - sinfo.cbSize = sizeof(SCROLLINFO); - sinfo.fMask = SIF_POS; - sinfo.nPos = InstrumentScrollPos[SelectedInstrument]; - SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); - ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); - } - return TRUE; - } - // link to combo box - if (((HWND)lParam) == GetDlgItem(hwndDlg, IDC_INSTRUMENTLINK)) - { - if (HIWORD(wParam) == CBN_SELCHANGE) - { - int linkToInstrument = SendDlgItemMessage(hwndDlg, IDC_INSTRUMENTLINK, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); - if (SelectedInstrument == linkToInstrument) - { - MessageBox(DialogWnd, "Instrument cannot be linked to itself!", "Info", MB_OK); - return TRUE; - } - if (linkToInstrument < 16) - { - // compare instruments - for (int u = 0; u < MAX_UNITS; u++) - { - // special case, compare manually - if (SynthObjP->InstrumentValues[SelectedInstrument][u][0] == M_DLL) - { - DLL_valP ds = (DLL_valP)SynthObjP->InstrumentValues[SelectedInstrument][u]; - DLL_valP dl = (DLL_valP)SynthObjP->InstrumentValues[linkToInstrument][u]; - if (ds->pregain != dl->pregain || - ds->dry != dl->dry || - ds->feedback != dl->feedback || - ds->damp != dl->damp || - ds->freq != dl->freq || - ds->depth != dl->depth || - ds->guidelay != dl->guidelay || - ds->synctype != dl->synctype || - ds->leftreverb != dl->leftreverb || - ds->reverb != dl->reverb) - { - MessageBox(DialogWnd, "Instruments cannot be linked as they differ!", "Info", MB_OK); - SendDlgItemMessage(hwndDlg, IDC_INSTRUMENTLINK, CB_SETCURSEL, (WPARAM)16, (LPARAM)0); - return TRUE; - } - } - else if (SynthObjP->InstrumentValues[SelectedInstrument][u][0] == M_GLITCH) - { - GLITCH_valP ds = (GLITCH_valP)SynthObjP->InstrumentValues[SelectedInstrument][u]; - GLITCH_valP dl = (GLITCH_valP)SynthObjP->InstrumentValues[linkToInstrument][u]; - if (ds->active != dl->active || - ds->dry != dl->dry || - ds->dsize != dl->dsize || - ds->dpitch != dl->dpitch || - ds->guidelay != dl->guidelay - ) - { - MessageBox(DialogWnd, "Instruments cannot be linked as they differ!", "Info", MB_OK); - SendDlgItemMessage(hwndDlg, IDC_INSTRUMENTLINK, CB_SETCURSEL, (WPARAM)16, (LPARAM)0); - return TRUE; - } - } - else - { - if (memcmp(SynthObjP->InstrumentValues[SelectedInstrument][u], SynthObjP->InstrumentValues[linkToInstrument][u], MAX_UNIT_SLOTS)) - { - MessageBox(DialogWnd, "Instruments cannot be linked as they differ!", "Info", MB_OK); - SendDlgItemMessage(hwndDlg, IDC_INSTRUMENTLINK, CB_SETCURSEL, (WPARAM)16, (LPARAM)0); - return TRUE; - } - } - } - } - // set link - LinkToInstrument[SelectedInstrument] = linkToInstrument; - } - return TRUE; - } - // Polyphony - else if (((HWND)lParam) == GetDlgItem(hwndDlg, IDC_POLYPHONY)) - { - if (HIWORD(wParam) == CBN_SELCHANGE) - { - SynthObjP->Polyphony = 1+SendDlgItemMessage(hwndDlg, IDC_POLYPHONY, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); - // get values from synth and set gui accordingly ... - UpdateControls(SelectedInstrument); - Go4kVSTi_UpdateDelayTimes(); - Go4kVSTi_ClearDelayLines(); - } - return TRUE; - } - // solo check box - else if (((HWND)lParam) == GetDlgItem(hwndDlg, IDC_SOLO)) - { - if (SendDlgItemMessage(hwndDlg, IDC_SOLO, BM_GETCHECK, 0, 0)==BST_CHECKED) - Go4kVSTi_Solo(SelectedInstrument, true); - else - Go4kVSTi_Solo(SelectedInstrument, false); - return TRUE; - } - else if (((HWND)lParam) == GetDlgItem(hwndDlg, IDC_INSTRUMENT_NAME)) - { - if (HIWORD(wParam) == EN_CHANGE) - { - GetDlgItemText(hwndDlg, IDC_INSTRUMENT_NAME, (LPSTR)&(SynthObjP->InstrumentNames[SelectedInstrument]), 127); - int stsel = SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0); - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"Local"); - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - char instname[128]; - sprintf(instname, "%d: %s", i+1, SynthObjP->InstrumentNames[i]); - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_ADDSTRING, (WPARAM)0, (LPARAM)instname); - } - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"Global"); - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_SETCURSEL, (WPARAM)stsel, (LPARAM)0); - return TRUE; - } - } - // always on top check box - else if (((HWND)lParam) == GetDlgItem(hwndDlg, IDC_ALWAYSONTOP)) - { - if (SendDlgItemMessage(hwndDlg, IDC_ALWAYSONTOP, BM_GETCHECK, 0, 0)==BST_CHECKED) - { - SetWindowPos(hwndDlg, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); - } - else - { - SetWindowPos(hwndDlg, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); - } - return TRUE; - } - else - { - // global Buttons - switch (LOWORD(wParam)) - { - case IDC_LOAD_PATCH: - { - char lpstrFilter[256] = - {'4','k','l','a','n','g',' ','P','a','t','c','h', 0 , - '*','.','4','k','p', 0, - 0}; - char lpstrFile[4096] = "*.4kp"; - char lpstrDirectory[4096]; - GetCurrentDirectory(4096, lpstrDirectory); - - OPENFILENAME ofn = - { - sizeof(OPENFILENAME), - DialogWnd, - GetModuleHandle(NULL), - lpstrFilter, - NULL, - 0, - 1, - lpstrFile, - 256, - NULL, - 0, - lpstrDirectory, - NULL, - 0, - 0, - 0, - "4kp", - 0, - NULL, - NULL - }; - - if (GetOpenFileName(&ofn)) - { - // reset scroll pos - int oldpos = GetScrollPos(ScrollWnd, SB_VERT); - SCROLLINFO sinfo; - sinfo.cbSize = sizeof(SCROLLINFO); - sinfo.fMask = SIF_POS; - sinfo.nPos = 0; - SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); - ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); - for (int i=0; iInstrumentSignalValid[i] = 0; - } - SynthObjP->GlobalSignalValid = 0; - Go4kVSTi_LoadPatch(ofn.lpstrFile); - //instrument check - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - UpdateSignalCount(i); - LinkToInstrument[i] = 16; - // try setting up instrument links - if (i > 0) - { - for (int j = 0; j < i; j++) - { - int linkToInstrument = j; - // compare instruments - for (int u = 0; u < MAX_UNITS; u++) - { - // special case, compare manually - if (SynthObjP->InstrumentValues[i][u][0] == M_DLL) - { - DLL_valP ds = (DLL_valP)SynthObjP->InstrumentValues[i][u]; - DLL_valP dl = (DLL_valP)SynthObjP->InstrumentValues[j][u]; - if (ds->pregain != dl->pregain || - ds->dry != dl->dry || - ds->feedback != dl->feedback || - ds->damp != dl->damp || - ds->freq != dl->freq || - ds->depth != dl->depth || - ds->guidelay != dl->guidelay || - ds->synctype != dl->synctype || - ds->leftreverb != dl->leftreverb || - ds->reverb != dl->reverb) - { - linkToInstrument = 16; - break; - } - } - else if (SynthObjP->InstrumentValues[i][u][0] == M_GLITCH) - { - GLITCH_valP ds = (GLITCH_valP)SynthObjP->InstrumentValues[i][u]; - GLITCH_valP dl = (GLITCH_valP)SynthObjP->InstrumentValues[j][u]; - if (ds->active != dl->active || - ds->dry != dl->dry || - ds->dsize != dl->dsize || - ds->dpitch != dl->dpitch || - ds->guidelay != dl->guidelay - ) - { - linkToInstrument = 16; - break; - } - } - else - { - if (memcmp(SynthObjP->InstrumentValues[i][u], SynthObjP->InstrumentValues[j][u], MAX_UNIT_SLOTS)) - { - linkToInstrument = 16; - break; - } - } - } - // set link - if (linkToInstrument != 16) - { - LinkToInstrument[i] = linkToInstrument; - break; - } - } - } - } - UpdateControls(SelectedInstrument); - } - return TRUE; - } - case IDC_SAVE_PATCH: - { - char lpstrFilter[256] = - {'4','k','l','a','n','g',' ','P','a','t','c','h', 0 , - '*','.','4','k','p', 0, - 0}; - char lpstrFile[4096] = "*.4kp"; - char lpstrDirectory[4096]; - GetCurrentDirectory(4096, lpstrDirectory); - - OPENFILENAME ofn = - { - sizeof(OPENFILENAME), - DialogWnd, - GetModuleHandle(NULL), - lpstrFilter, - NULL, - 0, - 1, - lpstrFile, - 256, - NULL, - 0, - lpstrDirectory, - NULL, - OFN_OVERWRITEPROMPT, - 0, - 0, - "4kp", - 0, - NULL, - NULL - }; - - if (GetSaveFileName(&ofn)) - { - Go4kVSTi_SavePatch(ofn.lpstrFile); - } - return TRUE; - } - case IDC_RESET_PATCH: - { - if (MessageBox(0, "Do you really want to reset the patch?", "Info", MB_YESNO) == IDYES) - { - // reset scroll pos - int oldpos = GetScrollPos(ScrollWnd, SB_VERT); - SCROLLINFO sinfo; - sinfo.cbSize = sizeof(SCROLLINFO); - sinfo.fMask = SIF_POS; - sinfo.nPos = 0; - SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); - ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); - for (int i=0; iInstrumentSignalValid[i] = 0; - } - SynthObjP->GlobalSignalValid = 0; - Go4kVSTi_ResetPatch(); - UpdateControls(SelectedInstrument); - } - return TRUE; - } - case IDC_LOAD_INSTRUMENT: - { - char lpstrFilter[256] = - {'4','k','l','a','n','g',' ','I','n','s','t','r','u','m','e','n','t', 0 , - '*','.','4','k','i', 0, - 0}; - char lpstrFile[4096] = "*.4ki"; - char lpstrDirectory[4096]; - GetCurrentDirectory(4096, lpstrDirectory); - - OPENFILENAME ofn = - { - sizeof(OPENFILENAME), - DialogWnd, - GetModuleHandle(NULL), - lpstrFilter, - NULL, - 0, - 1, - lpstrFile, - 256, - NULL, - 0, - lpstrDirectory, - NULL, - 0, - 0, - 0, - "4ki", - 0, - NULL, - NULL - }; - - if (GetOpenFileName(&ofn)) - { - // reset scroll pos - int oldpos = GetScrollPos(ScrollWnd, SB_VERT); - SCROLLINFO sinfo; - sinfo.cbSize = sizeof(SCROLLINFO); - sinfo.fMask = SIF_POS; - sinfo.nPos = 0; - SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); - ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); - - UpdateControls(SelectedInstrument); - if (SelectedTab == T_INSTRUMENT) - { - InstrumentScrollPos[SelectedInstrument] = 0; - SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; - Go4kVSTi_LoadInstrument(ofn.lpstrFile, (char)SelectedInstrument); - LinkToInstrument[SelectedInstrument] = 16; - } - else - { - GlobalScrollPos = 0; - SynthObjP->GlobalSignalValid = 0; - Go4kVSTi_LoadInstrument(ofn.lpstrFile, (char)16); - LinkToInstrument[SelectedInstrument] = 16; - } - UpdateControls(SelectedInstrument); - } - return TRUE; - } - case IDC_SAVE_INSTRUMENT: - { - char lpstrFilter[256] = - {'4','k','l','a','n','g',' ','I','n','s','t','r','u','m','e','n','t', 0 , - '*','.','4','k','i', 0, - 0}; - char lpstrFile[4096] = "*.4ki"; - char lpstrDirectory[4096]; - GetCurrentDirectory(4096, lpstrDirectory); - - OPENFILENAME ofn = - { - sizeof(OPENFILENAME), - DialogWnd, - GetModuleHandle(NULL), - lpstrFilter, - NULL, - 0, - 1, - lpstrFile, - 256, - NULL, - 0, - lpstrDirectory, - NULL, - OFN_OVERWRITEPROMPT, - 0, - 0, - "4ki", - 0, - NULL, - NULL - }; - - if (GetSaveFileName(&ofn)) - { - if (SelectedTab == T_INSTRUMENT) - Go4kVSTi_SaveInstrument(ofn.lpstrFile, (char)SelectedInstrument); - else - Go4kVSTi_SaveInstrument(ofn.lpstrFile, (char)16); - } - return TRUE; - } - case IDC_RESET_INSTRUMENT: - { - if (MessageBox(0, "Do you really want to reset the instrument?", "Info", MB_YESNO) == IDYES) - { - if (SelectedTab == T_INSTRUMENT) - { - // reset scroll pos - int oldpos = GetScrollPos(ScrollWnd, SB_VERT); - SCROLLINFO sinfo; - sinfo.cbSize = sizeof(SCROLLINFO); - sinfo.fMask = SIF_POS; - sinfo.nPos = 0; - SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); - ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); - InstrumentScrollPos[SelectedInstrument] = 0; - - SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; - Go4kVSTi_ResetInstrument(SelectedInstrument); - } - else - { - // reset scroll pos - int oldpos = GetScrollPos(ScrollWnd, SB_VERT); - SCROLLINFO sinfo; - sinfo.cbSize = sizeof(SCROLLINFO); - sinfo.fMask = SIF_POS; - sinfo.nPos = 0; - SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); - ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); - GlobalScrollPos = 0; - - SynthObjP->GlobalSignalValid = 0; - Go4kVSTi_ResetGlobal(); - } - UpdateControls(SelectedInstrument); - } - return TRUE; - } - case IDC_UNIT_LOAD: - { - char lpstrFilter[256] = - {'4','k','l','a','n','g',' ','U','n','i','t', 0 , - '*','.','4','k','u', 0, - 0}; - char lpstrFile[4096] = "*.4ku"; - char lpstrDirectory[4096]; - GetCurrentDirectory(4096, lpstrDirectory); - - OPENFILENAME ofn = - { - sizeof(OPENFILENAME), - DialogWnd, - GetModuleHandle(NULL), - lpstrFilter, - NULL, - 0, - 1, - lpstrFile, - 256, - NULL, - 0, - lpstrDirectory, - NULL, - 0, - 0, - 0, - "4ku", - 0, - NULL, - NULL - }; - - if (GetOpenFileName(&ofn)) - { - BYTE* uslot; - if (SelectedTab == T_INSTRUMENT) - { - SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; - uslot = SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit]; - } - else - { - SynthObjP->GlobalSignalValid = 0; - uslot = SynthObjP->GlobalValues[SelectedGUnit]; - } - Go4kVSTi_LoadUnit(ofn.lpstrFile, uslot); - UpdateControls(SelectedInstrument); - } - return TRUE; - } - case IDC_UNIT_SAVE: - { - char lpstrFilter[256] = - {'4','k','l','a','n','g',' ','U','n','i','t', 0 , - '*','.','4','k','u', 0, - 0}; - char lpstrFile[4096] = "*.4ku"; - char lpstrDirectory[4096]; - GetCurrentDirectory(4096, lpstrDirectory); - - OPENFILENAME ofn = - { - sizeof(OPENFILENAME), - DialogWnd, - GetModuleHandle(NULL), - lpstrFilter, - NULL, - 0, - 1, - lpstrFile, - 256, - NULL, - 0, - lpstrDirectory, - NULL, - OFN_OVERWRITEPROMPT, - 0, - 0, - "4ku", - 0, - NULL, - NULL - }; - - if (GetSaveFileName(&ofn)) - { - BYTE* uslot; - if (SelectedTab == T_INSTRUMENT) - { - uslot = SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit]; - } - else - { - uslot = SynthObjP->GlobalValues[SelectedGUnit]; - } - Go4kVSTi_SaveUnit(ofn.lpstrFile, uslot); - } - return TRUE; - } - case IDC_RECORD_BUTTON: - { - EnableWindow(GetDlgItem(DialogWnd, IDC_RECORD_BUTTON), false); - EnableWindow(GetDlgItem(DialogWnd, IDC_STOP_BUTTON), true); - int patternsize = 16; - int psize = SendDlgItemMessage(hwndDlg, IDC_PATTERN_SIZE, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); - if (psize == 0) - patternsize = 8; - if (psize == 2) - patternsize = 32; - if (psize == 3) - patternsize = 64; - float patternquant = 1.0; - int pquant = SendDlgItemMessage(hwndDlg, IDC_PATTERN_QUANT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); - if (pquant == 0) - patternquant = 0.25; - if (pquant == 1) - patternquant = 0.5; - if (pquant == 3) - patternquant = 2.0; - if (pquant == 4) - patternquant = 4.0; - if (pquant == 5) - patternquant = 8.0; - - bool recordingNoise = SendDlgItemMessage(hwndDlg, IDC_RECORDBUSYSIGNAL, BM_GETCHECK, 0, 0) == BST_CHECKED; - - Go4kVSTi_Record(true, recordingNoise, patternsize, patternquant); - return TRUE; - } - case IDC_STOP_BUTTON: - { - EnableWindow(GetDlgItem(DialogWnd, IDC_RECORD_BUTTON), true); - EnableWindow(GetDlgItem(DialogWnd, IDC_STOP_BUTTON), false); - Go4kVSTi_Record(false, false, 0, 0); - return TRUE; - } - case IDC_PANIC: - { - Go4kVSTi_Panic(); - return TRUE; - } - case IDC_UNIT_RESET: - { - if (SelectedTab == T_INSTRUMENT) - Go4kVSTi_InitInstrumentSlot(SelectedInstrument, SelectedIUnit, SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit][0]); - else - Go4kVSTi_InitGlobalSlot(SelectedGUnit, SynthObjP->GlobalValues[SelectedGUnit][0]); - UpdateControls(SelectedInstrument); - return TRUE; - } - case IDC_UNIT_COPY: - { - if (SelectedTab == T_INSTRUMENT) - memcpy(UnitCopyBuffer, SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit], MAX_UNIT_SLOTS); - else - memcpy(UnitCopyBuffer, SynthObjP->GlobalValues[SelectedGUnit], MAX_UNIT_SLOTS); - return TRUE; - } - case IDC_UNIT_PASTE: - { - if (SelectedTab == T_INSTRUMENT) - memcpy(SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit], UnitCopyBuffer, MAX_UNIT_SLOTS); - else - memcpy(SynthObjP->GlobalValues[SelectedGUnit], UnitCopyBuffer, MAX_UNIT_SLOTS); - UpdateControls(SelectedInstrument); - return TRUE; - } - return FALSE; - } - return FALSE; - } - return FALSE; - } -/* case WM_MOUSEWHEEL: - { - if (InitDone) - { - int scrollw = 16*((int)((short)HIWORD(wParam)))/120; - - int oldpos = GetScrollPos(ScrollWnd, SB_VERT); - SetScrollPos(ScrollWnd, SB_VERT, oldpos-scrollw, true); - int newpos = GetScrollPos(ScrollWnd, SB_VERT); - ScrollWindow(ScrollWnd, 0, oldpos - newpos, NULL, NULL); - if (SelectedTab == T_INSTRUMENT) - { - InstrumentScrollPos[SelectedInstrument] = newpos; - } - else if (SelectedTab == T_GLOBAL) - { - GlobalScrollPos = newpos; - } - return TRUE; - } - break; - } -*/ - case WM_NOTIFY: - { - if (((LPNMHDR)lParam)->hwndFrom == GetDlgItem(hwndDlg, IDC_MAINTAB)) - { - if (((LPNMHDR)lParam)->code == TCN_SELCHANGE) - { - int i = TabCtrl_GetCurSel(GetDlgItem(hwndDlg, IDC_MAINTAB)); - TabChanged(i); - return TRUE; - } - } - break; - } - case WM_CLOSE: - { - ShowWindow( DialogWnd, SW_SHOWMINIMIZED ); - return TRUE; - } - case WM_DROPFILES: - { - char DropFileName[4096]; - DragQueryFile((HDROP)wParam, 0, DropFileName, 4096); - std::string filename = DropFileName; - int slen = filename.length(); - bool invalidFile = false; - if (slen > 4) - { - std::string extension = filename.substr(slen-4, 4); - // dropped patch? - if (!extension.compare(".4kp")) - { - // reset scroll pos - int oldpos = GetScrollPos(ScrollWnd, SB_VERT); - SCROLLINFO sinfo; - sinfo.cbSize = sizeof(SCROLLINFO); - sinfo.fMask = SIF_POS; - sinfo.nPos = 0; - SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); - ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); - for (int i=0; iInstrumentSignalValid[i] = 0; - } - SynthObjP->GlobalSignalValid = 0; - Go4kVSTi_LoadPatch(DropFileName); - //instrument check - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - UpdateSignalCount(i); - LinkToInstrument[i] = 16; - // try setting up instrument links - if (i > 0) - { - for (int j = 0; j < i; j++) - { - int linkToInstrument = j; - // compare instruments - for (int u = 0; u < MAX_UNITS; u++) - { - // special case, compare manually - if (SynthObjP->InstrumentValues[i][u][0] == M_DLL) - { - DLL_valP ds = (DLL_valP)SynthObjP->InstrumentValues[i][u]; - DLL_valP dl = (DLL_valP)SynthObjP->InstrumentValues[j][u]; - if (ds->pregain != dl->pregain || - ds->dry != dl->dry || - ds->feedback != dl->feedback || - ds->damp != dl->damp || - ds->freq != dl->freq || - ds->depth != dl->depth || - ds->guidelay != dl->guidelay || - ds->synctype != dl->synctype || - ds->leftreverb != dl->leftreverb || - ds->reverb != dl->reverb) - { - linkToInstrument = 16; - break; - } - } - else if (SynthObjP->InstrumentValues[i][u][0] == M_GLITCH) - { - GLITCH_valP ds = (GLITCH_valP)SynthObjP->InstrumentValues[i][u]; - GLITCH_valP dl = (GLITCH_valP)SynthObjP->InstrumentValues[j][u]; - if (ds->active != dl->active || - ds->dry != dl->dry || - ds->dsize != dl->dsize || - ds->dpitch != dl->dpitch || - ds->guidelay != dl->guidelay - ) - { - linkToInstrument = 16; - break; - } - } - else - { - if (memcmp(SynthObjP->InstrumentValues[i][u], SynthObjP->InstrumentValues[j][u], MAX_UNIT_SLOTS)) - { - linkToInstrument = 16; - break; - } - } - } - // set link - if (linkToInstrument != 16) - { - LinkToInstrument[i] = linkToInstrument; - break; - } - } - } - } - UpdateControls(SelectedInstrument); - } - // dropped instrument? - else if (!extension.compare(".4ki")) - { - // reset scroll pos - int oldpos = GetScrollPos(ScrollWnd, SB_VERT); - SCROLLINFO sinfo; - sinfo.cbSize = sizeof(SCROLLINFO); - sinfo.fMask = SIF_POS; - sinfo.nPos = 0; - SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); - ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); - - UpdateControls(SelectedInstrument); - if (SelectedTab == T_INSTRUMENT) - { - InstrumentScrollPos[SelectedInstrument] = 0; - SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; - Go4kVSTi_LoadInstrument(DropFileName, (char)SelectedInstrument); - LinkToInstrument[SelectedInstrument] = 16; - } - else - { - GlobalScrollPos = 0; - SynthObjP->GlobalSignalValid = 0; - Go4kVSTi_LoadInstrument(DropFileName, (char)16); - } - UpdateControls(SelectedInstrument); - } - // dropped shit! - else - { - invalidFile = true; - } - } - else - { - invalidFile = true; - } - if (invalidFile) - { - MessageBox(0,DropFileName,"Only patches(4kp) and instruments(4ki) allowed!",MB_OK); - } - return TRUE; - } - } - return FALSE; -} - -// CB for the tabs -BOOL CALLBACK ModuleSettingsDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) - { - case WM_COMMAND: - return ButtonPressed(wParam, lParam); - - case WM_HSCROLL: - return ScrollbarChanged(hwndDlg, wParam, lParam); - } - return FALSE; -} - -// CB for the tabs -BOOL CALLBACK ScrollDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) - { - case WM_VSCROLL: - { - RECT rect; - GetWindowRect(ScrollWnd, &rect); - int pagesize = 1+rect.bottom - rect.top; - int linesize = 16; - int oldpos = GetScrollPos(ScrollWnd, SB_VERT); - switch (LOWORD(wParam)) - { - - case SB_BOTTOM: // Scrolls to the lower right. - break; - case SB_ENDSCROLL: // Ends scroll. - break; - case SB_LINEDOWN: // Scrolls one line down. - SetScrollPos(ScrollWnd, SB_VERT, oldpos+linesize, true); - break; - case SB_LINEUP: // Scrolls one line up. - SetScrollPos(ScrollWnd, SB_VERT, oldpos-linesize, true); - break; - case SB_PAGEDOWN: // Scrolls one page down. - SetScrollPos(ScrollWnd, SB_VERT, oldpos+pagesize, true); - break; - case SB_PAGEUP: // Scrolls one page up. - SetScrollPos(ScrollWnd, SB_VERT, oldpos-pagesize, true); - break; - case SB_THUMBPOSITION: // The user has dragged the scroll box (thumb) and released the mouse button. The high-order word indicates the position of the scroll box at the end of the drag operation. - case SB_THUMBTRACK: // The user is dragging the scroll box. This message is sent repeatedly until the user releases the mouse button. The high-order word indicates the position that the scroll box has been dragged to. - SetScrollPos(ScrollWnd, SB_VERT, HIWORD(wParam), true); - break; - case SB_TOP: // Scrolls to the upper left. - break; - } - int newpos = GetScrollPos(ScrollWnd, SB_VERT); - ScrollWindow(ScrollWnd, 0, oldpos - newpos, NULL, NULL); - - if (SelectedTab == T_INSTRUMENT) - { - InstrumentScrollPos[SelectedInstrument] = newpos; - } - else if (SelectedTab == T_GLOBAL) - { - GlobalScrollPos = newpos; - } - return TRUE; - } -/* case WM_MOUSEWHEEL: - { - if (InitDone) - { - int scrollw = 16*((int)((short)HIWORD(wParam)))/120; - - int oldpos = GetScrollPos(ScrollWnd, SB_VERT); - SetScrollPos(ScrollWnd, SB_VERT, oldpos-scrollw, true); - int newpos = GetScrollPos(ScrollWnd, SB_VERT); - ScrollWindow(ScrollWnd, 0, oldpos - newpos, NULL, NULL); - if (SelectedTab == T_INSTRUMENT) - { - InstrumentScrollPos[SelectedInstrument] = newpos; - } - else if (SelectedTab == T_GLOBAL) - { - GlobalScrollPos = newpos; - } - return TRUE; - } - break; - } -*/ - default: - break; - } - return FALSE; -} - -// CB for the tabs -BOOL CALLBACK StackDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch (message) - { - case WM_COMMAND: - return StackButtonPressed(wParam); - } - return FALSE; -} - -// CB for the set dialog -BOOL CALLBACK SetDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) -{ - switch(message) - { - case WM_INITDIALOG: - { - for (int i = 1; i < NUM_MODULES; i++) - { - if (SelectedTab == T_INSTRUMENT && i == M_ACC) - SendDlgItemMessage(hwndDlg, IDC_SET_UNIT, CB_ADDSTRING, (WPARAM)0, (LPARAM)""); - else - SendDlgItemMessage(hwndDlg, IDC_SET_UNIT, CB_ADDSTRING, (WPARAM)0, (LPARAM)(UnitName[i])); - } - SendDlgItemMessage(hwndDlg, IDC_SET_UNIT, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); - SetUnit = 1; - return TRUE; - } - case WM_COMMAND: - { - if (((HWND)lParam) == GetDlgItem(hwndDlg, IDC_SET_UNIT)) - { - if (HIWORD(wParam) == CBN_SELCHANGE) - { - SetUnit = 1+SendDlgItemMessage(hwndDlg, IDC_SET_UNIT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); - } - return TRUE; - } - switch(LOWORD(wParam)) - { - case IDOK: - if (SelectedTab == T_INSTRUMENT && SetUnit == M_ACC) - EndDialog(hwndDlg, IDCANCEL); - else - EndDialog(hwndDlg, IDOK); - break; - case IDCANCEL: - EndDialog(hwndDlg, IDCANCEL); - break; - } - break; - } - default: - return FALSE; - } - return TRUE; -} - -VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) -{ - for (int i = 0; i < 16; i++) - UpdateVoiceDisplay(i); -} - -VOID CALLBACK BackupTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) -{ - Go4kVSTi_SavePatch("C:\\4klang.4kp"); -} - -void Go4kVSTiGUI_Create(HINSTANCE hInst) -{ - timer = 1; - backupTimer = 2; - timerID = 0; - backupTimerID = 0; - DialogWnd = NULL; - SelectedIUnit = 0; - SelectedGUnit = 0; - SelectedTab = T_INSTRUMENT; - SelectedInstrument = 0; - SetUnit = -1; - hInstance = hInst; - InitCommonControls(); - DialogWnd = CreateDialog(hInst,MAKEINTRESOURCE(IDD_GO4KVSTIDIALOG),NULL,(DLGPROC)MainDialogProc); - - // tab dialogs - HWND tmp = GetDlgItem(DialogWnd, IDC_MODULE_SETTINGS); - for (int i = 0; i < NUM_MODULES; i++) - { - ModuleWnd[M_NONE+i] = CreateDialog(hInst,MAKEINTRESOURCE(IDD_NONE+i),tmp,(DLGPROC)ModuleSettingsDialogProc); - MoveWindow(ModuleWnd[M_NONE+i], 7, 43, 450, 280, true); - ShowWindow(ModuleWnd[M_NONE+i], SW_HIDE); - } - - tmp = GetDlgItem(DialogWnd, IDC_MAINTAB); - ScrollWnd = CreateDialog(hInst,MAKEINTRESOURCE(IDD_SCROLLWINDOW),tmp,(DLGPROC)ScrollDialogProc); - MoveWindow(ScrollWnd, 3, 23, 392, 410, true); - ShowWindow(ScrollWnd, SW_SHOW); - - tmp = ScrollWnd; - RECT rect; - // instrument stack dialog - TabWnd[T_INSTRUMENT] = CreateDialogA(hInst,MAKEINTRESOURCE(IDD_INSTRUMENT_STACK),tmp,(DLGPROC)StackDialogProc); - GetWindowRect(TabWnd[T_INSTRUMENT], &rect); - int virtualsizey = rect.bottom - rect.top; - MoveWindow(TabWnd[T_INSTRUMENT], 5, 0, 365, virtualsizey, true); - ShowWindow(TabWnd[T_INSTRUMENT], SW_SHOW); - EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], IDC_ISTACK_UNIT1), false); - ShowWindow(GetDlgItem(DialogWnd, IDC_ISTACK_VALID), true); - - // global stack dialog - TabWnd[T_GLOBAL] = CreateDialog(hInst,MAKEINTRESOURCE(IDD_GLOBAL_STACK),tmp,(DLGPROC)StackDialogProc); - MoveWindow(TabWnd[T_GLOBAL], 5, 0, 365, virtualsizey, true); - ShowWindow(TabWnd[T_GLOBAL], SW_HIDE); - EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], IDC_GSTACK_UNIT1), false); - ShowWindow(GetDlgItem(DialogWnd, IDC_GSTACK_VALID), false); - - // setup scrollwindow - GetWindowRect(ScrollWnd, &rect); - int sizey = rect.bottom - rect.top; - SCROLLINFO sinfo; - sinfo.cbSize = sizeof(SCROLLINFO); - sinfo.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; - sinfo.nPos = 0; - sinfo.nPage = sizey; - sinfo.nMin = 0; - sinfo.nMax = virtualsizey+2; - SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); - - for (int i=0; iInstrumentValues[selectedInstrument][selectedIUnit][0] == M_DLL) - { - DLL_valP ds = (DLL_valP)SynthObjP->InstrumentValues[selectedInstrument][selectedIUnit]; - DLL_valP dl = (DLL_valP)SynthObjP->InstrumentValues[i][selectedIUnit]; - dl->id = ds->id; - dl->pregain = ds->pregain; - dl->dry = ds->dry; - dl->feedback = ds->feedback; - dl->damp = ds->damp; - dl->freq = ds->freq; - dl->depth = ds->depth; - dl->guidelay = ds->guidelay; - dl->synctype = ds->synctype; - dl->leftreverb = ds->leftreverb; - dl->reverb = ds->reverb; - } - else if (SynthObjP->InstrumentValues[selectedInstrument][selectedIUnit][0] == M_GLITCH) - { - GLITCH_valP ds = (GLITCH_valP)SynthObjP->InstrumentValues[selectedInstrument][selectedIUnit]; - GLITCH_valP dl = (GLITCH_valP)SynthObjP->InstrumentValues[i][selectedIUnit]; - dl->id = ds->id; - dl->active = ds->active; - dl->dry = ds->dry; - dl->dsize = ds->dsize; - dl->dpitch = ds->dpitch; - dl->guidelay = ds->guidelay; - } - else - { - memcpy(SynthObjP->InstrumentValues[i][selectedIUnit], - SynthObjP->InstrumentValues[selectedInstrument][selectedIUnit], - MAX_UNIT_SLOTS); - } - } - } - Go4kVSTi_UpdateDelayTimes(); -} - -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -// // -// Button Events // -// // -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// - -void SetButtonParams(int uid, BYTE* val, WPARAM id, LPARAM lParam) -{ - DWORD res; - if (uid == M_VCO) - { - VCO_valP v = (VCO_valP)val; - ButtonGroupChanged(IDC_VCO_SINE, IDC_VCO_GATE, LOWORD(id), M_VCO, res); - if (res) - { - v->flags = 0; - if (SendDlgItemMessage(ModuleWnd[M_VCO], IDC_VCO_LFO, BM_GETCHECK, 0, 0)==BST_CHECKED) - v->flags |= VCO_LFO; - if (SendDlgItemMessage(ModuleWnd[M_VCO], IDC_VCO_STEREO, BM_GETCHECK, 0, 0)==BST_CHECKED) - v->flags |= VCO_STEREO; - - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRANSPOSE), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRANSPOSE_VAL), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_DETUNE), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_DETUNE_VAL), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PHASE), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PHASE_VAL), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR_VAL), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SHAPE), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SHAPE_VAL), true); - EnableButtonGroup(IDC_VCO_GATE1, IDC_VCO_GATE16, M_VCO, false); - if (IDC_VCO_GATE == res) - { - v->flags |= VCO_GATE; - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR_VAL), false); - EnableButtonGroup(IDC_VCO_GATE1, IDC_VCO_GATE16, M_VCO, true); - // adjust gate bits stored in color and shape with current selection of checkboxes - WORD gatebits; - GetCheckboxGroupBitmask(IDC_VCO_GATE1, IDC_VCO_GATE16, IDC_VCO_GATE1, M_VCO, gatebits, res); - v->gate = gatebits & 0xff; - v->color = (gatebits >> 8) & 0xff; - // adjust color and shape sliders - InitSliderCenter(ModuleWnd[M_VCO], IDC_VCO_COLOR, 0, 128, v->color); - } - else - { - // set color at least to valid range - if (v->color > 128) v->color = 128; - InitSliderCenter(ModuleWnd[M_VCO], IDC_VCO_COLOR, 0, 128, v->color); - } - if (IDC_VCO_SINE == res) - { - v->flags |= VCO_SINE; - } - if (IDC_VCO_TRISAW == res) - { - v->flags |= VCO_TRISAW; - } - if (IDC_VCO_PULSE == res) - { - v->flags |= VCO_PULSE; - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SHAPE), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SHAPE_VAL), false); - } - if (IDC_VCO_NOISE == res) - { - v->flags |= VCO_NOISE; - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRANSPOSE), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRANSPOSE_VAL), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_DETUNE), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_DETUNE_VAL), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PHASE), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PHASE_VAL), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR_VAL), false); - } - } - if (LOWORD(id) == IDC_VCO_LFO) - { - if (SendDlgItemMessage(ModuleWnd[M_VCO], IDC_VCO_LFO, BM_GETCHECK, 0, 0)==BST_CHECKED) - v->flags |= VCO_LFO; - else - v->flags &= ~VCO_LFO; - } - if (LOWORD(id) == IDC_VCO_STEREO) - { - if (SendDlgItemMessage(ModuleWnd[M_VCO], IDC_VCO_STEREO, BM_GETCHECK, 0, 0)==BST_CHECKED) - v->flags |= VCO_STEREO; - else - v->flags &= ~VCO_STEREO; - } - // gate bits changed? - WORD gatebits; - GetCheckboxGroupBitmask(IDC_VCO_GATE1, IDC_VCO_GATE16, LOWORD(id), M_VCO, gatebits, res); - if (res) - { - v->gate = gatebits & 0xff; - v->color = (gatebits >> 8) & 0xff; - // adjust color slider - InitSliderCenter(ModuleWnd[M_VCO], IDC_VCO_COLOR, 0, 128, v->color); - } - // update signalcount - UpdateSignalCount(SelectedInstrument); - } - else if (uid == M_VCF) - { - VCF_valP v = (VCF_valP)val; - ButtonGroupChanged(IDC_VCF_LOW, IDC_VCF_ALL, LOWORD(id), M_VCF, res); - if (res) - { - int stereo = v->type & VCF_STEREO; - if (res == IDC_VCF_LOW) - v->type = stereo | VCF_LOWPASS; - else if (res == IDC_VCF_HIGH) - v->type = stereo | VCF_HIGHPASS; - else if (res == IDC_VCF_BAND) - v->type = stereo | VCF_BANDPASS; - else if (res == IDC_VCF_NOTCH) - v->type = stereo | VCF_BANDSTOP; - else if (res == IDC_VCF_PEAK) - v->type = stereo | VCF_PEAK; - else if (res == IDC_VCF_ALL) - v->type = stereo | VCF_ALLPASS; - } - if (LOWORD(id) == IDC_VCF_STEREO) - { - if (SendDlgItemMessage(ModuleWnd[M_VCF], IDC_VCF_STEREO, BM_GETCHECK, 0, 0)==BST_CHECKED) - v->type |= VCF_STEREO; - else - v->type &= ~VCF_STEREO; - } - // update signalcount - UpdateSignalCount(SelectedInstrument); - } - else if (uid == M_DST) - { - DST_valP v = (DST_valP)val; - if (LOWORD(id) == IDC_DST_STEREO) - { - if (SendDlgItemMessage(ModuleWnd[M_DST], IDC_DST_STEREO, BM_GETCHECK, 0, 0)==BST_CHECKED) - v->stereo = VCF_STEREO; - else - v->stereo = 0; - } - // update signalcount - UpdateSignalCount(SelectedInstrument); - } - else if (uid == M_DLL) - { - DLL_valP v = (DLL_valP)val; - ButtonGroupChanged(IDC_DLL_DELAY, IDC_DLL_REVERB, LOWORD(id), M_DLL, res); - if (res) - { - if (res == IDC_DLL_DELAY) - { - v->reverb = 0; - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_LEFTREVERB), SW_HIDE); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), SW_SHOW); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), SW_SHOW); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOSYNC), SW_SHOW); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_BPMSYNC), SW_SHOW); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOTESYNC), SW_SHOW); - } - else if (res == IDC_DLL_REVERB) - { - v->reverb = 1; - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_LEFTREVERB), SW_SHOW); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), SW_HIDE); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), SW_HIDE); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOSYNC), SW_HIDE); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_BPMSYNC), SW_HIDE); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOTESYNC), SW_HIDE); - } - } - ButtonGroupChanged(IDC_DLL_NOSYNC, IDC_DLL_NOTESYNC, LOWORD(id), M_DLL, res); - if (res) - { - if (res == IDC_DLL_NOSYNC) - { - v->synctype = 0; - EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), true); - EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), true); - } - else if (res == IDC_DLL_BPMSYNC) - { - v->synctype = 1; - EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), true); - EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), true); - } - else if (res == IDC_DLL_NOTESYNC) - { - v->synctype = 2; - EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), false); - EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), false); - } - } - if (LOWORD(id) == IDC_DLL_LEFTREVERB) - { - if (SendDlgItemMessage(ModuleWnd[M_DLL], IDC_DLL_LEFTREVERB, BM_GETCHECK, 0, 0)==BST_CHECKED) - v->leftreverb = 1; - else - v->leftreverb = 0; - } - UpdateDelayTimes(v); - } - else if (uid == M_FOP) - { - // invalidate stack first - if (SelectedTab == T_INSTRUMENT) - { - SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; - } - else - { - SynthObjP->GlobalSignalValid = 0; - } - FOP_valP v = (FOP_valP)val; - ButtonGroupChanged(IDC_FOP_POP, IDC_FOP_MULP2, LOWORD(id), M_FOP, res); - if (res) - { - v->flags = 1 + res - IDC_FOP_POP; - } - // update signalcount - UpdateSignalCount(SelectedInstrument); - } - else if (uid == M_FST) - { - FST_valP v = (FST_valP)val; - // changed instrument - if (LOWORD(id) == IDC_FST_DESTINATION_INSTRUMENT) - { - int inst = SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0) - 1; - if (v->dest_stack != inst) - { - v->dest_stack = inst; - - // fill unit combobox with current units and set to nothing - BYTE *units; - if (SelectedTab == T_INSTRUMENT) - { - if (v->dest_stack == -1) - units = SynthObjP->InstrumentValues[SelectedInstrument][0]; - else if (v->dest_stack == MAX_INSTRUMENTS) - units = SynthObjP->GlobalValues[0]; - else - units = SynthObjP->InstrumentValues[v->dest_stack][0]; - } - else - { - if (v->dest_stack == -1) - units = SynthObjP->GlobalValues[0]; - else if (v->dest_stack == MAX_INSTRUMENTS) - units = SynthObjP->GlobalValues[0]; - else - units = SynthObjP->InstrumentValues[v->dest_stack][0]; - } - - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0); - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"- Nothing Selected -"); - for (int i = 0; i < MAX_UNITS; i++) - { - char unitname[128], unitname2[128]; - sprintf(unitname, "%d: %s", i+1, GetUnitString(&units[i*MAX_UNIT_SLOTS], unitname2)); - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_ADDSTRING, (WPARAM)0, (LPARAM)unitname); - } - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); - v->dest_unit = -1; - - // set slot combobox to nothing and disable - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0); - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"- Nothing Selected -"); - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); - EnableWindow(GetDlgItem(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT), false); - v->dest_slot = -1; - v->dest_id = -1; - } - } - else if (LOWORD(id) == IDC_FST_DESTINATION_UNIT) - { - int unit = SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0) - 1; - if (v->dest_unit != unit) - { - v->dest_unit = unit; - - // fill slot combobox with current targets and set to nothing - BYTE *slots; - if (SelectedTab == T_INSTRUMENT) - { - if (v->dest_stack == -1) - slots = SynthObjP->InstrumentValues[SelectedInstrument][unit]; - else if (v->dest_stack == MAX_INSTRUMENTS) - slots = SynthObjP->GlobalValues[unit]; - else - slots = SynthObjP->InstrumentValues[v->dest_stack][unit]; - } - else - { - if (v->dest_stack == -1) - slots = SynthObjP->GlobalValues[unit]; - else if (v->dest_stack == MAX_INSTRUMENTS) - slots = SynthObjP->GlobalValues[unit]; - else - slots = SynthObjP->InstrumentValues[v->dest_stack][unit]; - } - - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0); - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"- Nothing Selected -"); - for (int i = 0; i < 8; i++) - { - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_ADDSTRING, (WPARAM)0, (LPARAM)UnitModulationTargetNames[slots[0]][i]); - } - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); - v->dest_slot = -1; - v->dest_id = -1; - - if (v->dest_unit == -1) - EnableWindow(GetDlgItem(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT), false); - else - EnableWindow(GetDlgItem(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT), true); - } - } - else if (LOWORD(id) == IDC_FST_DESTINATION_SLOT) - { - int slot = SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0) - 1; - v->dest_slot = slot; - - // fill slot combobox with current targets and set to nothing - BYTE *slots; - if (SelectedTab == T_INSTRUMENT) - { - if (v->dest_stack == -1) - slots = SynthObjP->InstrumentValues[SelectedInstrument][v->dest_unit]; - else if (v->dest_stack == MAX_INSTRUMENTS) - slots = SynthObjP->GlobalValues[v->dest_unit]; - else - slots = SynthObjP->InstrumentValues[v->dest_stack][v->dest_unit]; - } - else - { - if (v->dest_stack == -1) - slots = SynthObjP->GlobalValues[v->dest_unit]; - else if (v->dest_stack == MAX_INSTRUMENTS) - slots = SynthObjP->GlobalValues[v->dest_unit]; - else - slots = SynthObjP->InstrumentValues[v->dest_stack][v->dest_unit]; - } - - v->dest_id = slots[0]; - } - ButtonGroupChanged(IDC_FST_SET, IDC_FST_MUL, LOWORD(id), M_FST, res); - if (res) - { - int pop = v->type & FST_POP; - if (res == IDC_FST_SET) - v->type = FST_SET; - else if (res == IDC_FST_ADD) - v->type = FST_ADD; - else if (res == IDC_FST_MUL) - v->type = FST_MUL; - if (pop) - v->type |= FST_POP; - } - if (LOWORD(id) == IDC_FST_POP) - { - if (SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_POP, BM_GETCHECK, 0, 0)==BST_CHECKED) - v->type |= FST_POP; - else - v->type &= ~FST_POP; - } - // update signalcount - UpdateSignalCount(SelectedInstrument); - } - else if (uid == M_ACC) - { - ACC_valP v = (ACC_valP)val; - ButtonGroupChanged(IDC_ACC_OUT, IDC_ACC_AUX, LOWORD(id), M_ACC, res); - if (res) - { - if (res == IDC_ACC_OUT) - v->flags = ACC_OUT; - else - v->flags = ACC_AUX; - } - } -} - -bool ButtonPressed(WPARAM id, LPARAM lParam) -{ - // instrument tab is active - if (SelectedTab == T_INSTRUMENT) - { - UnitID uid = (UnitID)(SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit][0]); - SetButtonParams(uid, SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit], id, lParam); - char unitname[128]; - GetUnitString(SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit], unitname); - SetWindowText(GetDlgItem(TabWnd[T_INSTRUMENT], IDC_ISTACK_UNIT1+SelectedIUnit*6), unitname); - LinkInstrumentUnit(SelectedInstrument, SelectedIUnit); - } - else if (SelectedTab == T_GLOBAL) - { - UnitID uid = (UnitID)(SynthObjP->GlobalValues[SelectedGUnit][0]); - SetButtonParams(uid, SynthObjP->GlobalValues[SelectedGUnit], id, lParam); - char unitname[128]; - GetUnitString(SynthObjP->GlobalValues[SelectedGUnit], unitname); - SetWindowText(GetDlgItem(TabWnd[T_GLOBAL], IDC_GSTACK_UNIT1+SelectedGUnit*6), unitname); - } - return TRUE; -} - -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -// // -// Scrollbar Events // -// // -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// - -void SetSliderParams(int uid, BYTE* val, LPARAM lParam) -{ - if (uid == M_ENV) - { - ENV_valP v = (ENV_valP)val; - // attack - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_ENV_ATTACK)) - { - UpdateSliderValue(IDC_ENV_ATTACK, v->attac); - } - //decay - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_ENV_DECAY)) - { - UpdateSliderValue(IDC_ENV_DECAY, v->decay); - } - // sustain - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_ENV_SUSTAIN)) - { - UpdateSliderValue(IDC_ENV_SUSTAIN, v->sustain); - } - // release - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_ENV_RELEASE)) - { - UpdateSliderValue(IDC_ENV_RELEASE, v->release); - } - // gain - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_ENV_GAIN)) - { - UpdateSliderValue(IDC_ENV_GAIN, v->gain); - } - } - else if (uid == M_VCO) - { - VCO_valP v = (VCO_valP)val; - // transpose - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_VCO_TRANSPOSE)) - { - UpdateSliderValueCenter(IDC_VCO_TRANSPOSE, v->transpose); - } - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_VCO_DETUNE)) - { - UpdateSliderValueCenter(IDC_VCO_DETUNE, v->detune); - } - // phaseofs - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_VCO_PHASE)) - { - UpdateSliderValue(IDC_VCO_PHASE, v->phaseofs); - } - // color - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_VCO_COLOR)) - { - UpdateSliderValueCenter(IDC_VCO_COLOR, v->color); - // gate bits - WORD gatebits = ((WORD)v->color << 8) | (WORD)v->gate ; - SetCheckboxGroupBitmask(IDC_VCO_GATE1, IDC_VCO_GATE16, M_VCO, gatebits); - } - // shape - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_VCO_SHAPE)) - { - v->shape = SendMessage(GetDlgItem(ModuleWnd[uid], IDC_VCO_SHAPE), TBM_GETPOS, 0, 0); - if (v->shape == 0) - v->shape = 1; - if (v->shape == 128) - v->shape = 127; - sprintf(SliderValTxt, "%d", v->shape-64); - SetWindowText(GetDlgItem(ModuleWnd[uid], IDC_VCO_SHAPE_VAL), SliderValTxt); - } - // gain - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_VCO_GAIN)) - { - UpdateSliderValue(IDC_VCO_GAIN, v->gain); - } - } - else if (uid == M_VCF) - { - VCF_valP v = (VCF_valP)val; - // frequency - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_VCF_FREQUENCY)) - { - UpdateSliderValue(IDC_VCF_FREQUENCY, v->freq); - } - // resonance - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_VCF_RESONANCE)) - { - UpdateSliderValue(IDC_VCF_RESONANCE, v->res); - } - } - else if (uid == M_DST) - { - DST_valP v = (DST_valP)val; - // drive - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DST_DRIVE)) - { - v->drive = SendMessage(GetDlgItem(ModuleWnd[uid], IDC_DST_DRIVE), TBM_GETPOS, 0, 0); - if (v->drive == 0) - v->drive = 1; - if (v->drive == 128) - v->drive = 127; - sprintf(SliderValTxt, "%d", v->drive-64); - SetWindowText(GetDlgItem(ModuleWnd[uid], IDC_DST_DRIVE_VAL), SliderValTxt); - } - // snhfreq - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DST_SNH)) - { - UpdateSliderValue(IDC_DST_SNH, v->snhfreq); - } - } - else if (uid == M_DLL) - { - DLL_valP v = (DLL_valP)val; - // pregain - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DLL_PREGAIN)) - { - UpdateSliderValue(IDC_DLL_PREGAIN, v->pregain); - } - // dry - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DLL_DRY)) - { - UpdateSliderValue(IDC_DLL_DRY, v->dry); - } - // feedback - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DLL_FEEDBACK)) - { - UpdateSliderValue(IDC_DLL_FEEDBACK, v->feedback); - } - // frequency - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DLL_FREQUENCY)) - { - UpdateSliderValue(IDC_DLL_FREQUENCY, v->freq); - } - // depth - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DLL_DEPTH)) - { - UpdateSliderValue(IDC_DLL_DEPTH, v->depth); - } - // damp - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DLL_DAMP)) - { - UpdateSliderValue(IDC_DLL_DAMP, v->damp); - } - // delay - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DLL_DTIME)) - { - v->guidelay = SendMessage(GetDlgItem(ModuleWnd[uid], IDC_DLL_DTIME), TBM_GETPOS, 0, 0); - UpdateDelayTimes(v); - } - } - else if (uid == M_FST) - { - FST_valP v = (FST_valP)val; - // gain - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_FST_AMOUNT)) - { - UpdateSliderValueCenter2(IDC_FST_AMOUNT, v->amount); - } - } - else if (uid == M_PAN) - { - PAN_valP v = (PAN_valP)val; - // panning - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_PAN_PANNING)) - { - UpdateSliderValueCenter(IDC_PAN_PANNING, v->panning); - } - } - else if (uid == M_OUT) - { - OUT_valP v = (OUT_valP)val; - // gain - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_OUT_GAIN)) - { - UpdateSliderValue(IDC_OUT_GAIN, v->gain); - } - // auxsend - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_OUT_AUXSEND)) - { - UpdateSliderValue(IDC_OUT_AUXSEND, v->auxsend); - } - } - else if (uid == M_FLD) - { - FLD_valP v = (FLD_valP)val; - // panning - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_FLD_VALUE)) - { - UpdateSliderValueCenter(IDC_FLD_VALUE, v->value); - } - } - else if (uid == M_GLITCH) - { - GLITCH_valP v = (GLITCH_valP)val; - // active - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_GLITCH_ACTIVE)) - { - UpdateSliderValue(IDC_GLITCH_ACTIVE, v->active); - } - // dry - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_GLITCH_DRY)) - { - UpdateSliderValue(IDC_GLITCH_DRY, v->dry); - } - // delta size - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_GLITCH_DSIZE)) - { - UpdateSliderValue(IDC_GLITCH_DSIZE, v->dsize); - } - // delta pitch - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_GLITCH_DPITCH)) - { - UpdateSliderValue(IDC_GLITCH_DPITCH, v->dpitch); - } - // delay - if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_GLITCH_DTIME)) - { - v->guidelay = SendMessage(GetDlgItem(ModuleWnd[uid], IDC_GLITCH_DTIME), TBM_GETPOS, 0, 0); - UpdateDelayTimes(v); - } - } -} - -bool ScrollbarChanged(HWND hwndDlg, WPARAM wParam, LPARAM lParam) -{ - // instrument tab is active - if (SelectedTab == T_INSTRUMENT) - { - UnitID uid = (UnitID)(SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit][0]); - SetSliderParams(uid, SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit], lParam); - char unitname[128]; - GetUnitString(SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit], unitname); - SetWindowText(GetDlgItem(TabWnd[T_INSTRUMENT], IDC_ISTACK_UNIT1+SelectedIUnit*6), unitname); - LinkInstrumentUnit(SelectedInstrument, SelectedIUnit); - } - else if (SelectedTab == T_GLOBAL) - { - UnitID uid = (UnitID)(SynthObjP->GlobalValues[SelectedGUnit][0]); - SetSliderParams(uid, SynthObjP->GlobalValues[SelectedGUnit], lParam); - char unitname[128]; - GetUnitString(SynthObjP->GlobalValues[SelectedGUnit], unitname); - SetWindowText(GetDlgItem(TabWnd[T_GLOBAL], IDC_GSTACK_UNIT1+SelectedGUnit*6), unitname); - } - return TRUE; -} - -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -// // -// Stack Button Events // -// // -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// - -void CheckModulations(int unit1, int unit2 = -1) -{ - // a instrument stack changed - if (SelectedTab == T_INSTRUMENT) - { - // look in all instruments if a store unit had its target on one of the changed units - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - for (int u = 0; u < MAX_UNITS; u++) - { - if (SynthObjP->InstrumentValues[i][u][0] == M_FST) - { - FST_valP v = (FST_valP)(SynthObjP->InstrumentValues[i][u]); - // the store points to global, so skip - if (v->dest_stack == MAX_INSTRUMENTS) - continue; - - int target_inst; - if (v->dest_stack == -1) - target_inst = i; - else - target_inst = v->dest_stack; - - // if the store points to the current instrument - if (target_inst == SelectedInstrument) - { - // a up/down process - if (unit2 != -1) - { - // if the target unit was unit1 or unit2 realign target unit - if (v->dest_unit == unit1) - { - v->dest_unit = unit2; - } - else if (v->dest_unit == unit2) - { - v->dest_unit = unit1; - } - } - // a set/reset process - else - { - // if the target unit was unit1 reset store - if (v->dest_unit == unit1) - { - char text[128]; - sprintf(text, "Instrument %d had a modulation target in the changed unit\nIt's no longer valid and will be reset", i); - MessageBox(DialogWnd, text, "Info", MB_OK); - v->dest_unit = -1; - v->dest_slot = -1; - v->dest_id = -1; - } - } - } - } - } - } - // now check the global slots - for (int u = 0; u < MAX_UNITS; u++) - { - if (SynthObjP->GlobalValues[u][0] == M_FST) - { - FST_valP v = (FST_valP)(SynthObjP->GlobalValues[u]); - // the store points to global, so skip - if (v->dest_stack == -1 || v->dest_stack == MAX_INSTRUMENTS) - continue; - - // if the store points to the current instrument - if (v->dest_stack == SelectedInstrument) - { - // a up/down process - if (unit2 != -1) - { - // if the target unit was unit1 or unit2 realign target unit - if (v->dest_unit == unit1) - { - v->dest_unit = unit2; - } - else if (v->dest_unit == unit2) - { - v->dest_unit = unit1; - } - } - // a set/reset process - else - { - // if the target unit was unit1 reset store - if (v->dest_unit == unit1) - { - char text[128]; - sprintf(text, "Global had a modulation target in the changed unit\nIt's no longer valid and will be reset"); - MessageBox(DialogWnd, text, "Info", MB_OK); - v->dest_unit = -1; - v->dest_slot = -1; - v->dest_id = -1; - } - } - } - } - } - } - // the global stack changed - else - { - // look in all instruments if a store unit had its target on a global unit - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - for (int u = 0; u < MAX_UNITS; u++) - { - if (SynthObjP->InstrumentValues[i][u][0] == M_FST) - { - FST_valP v = (FST_valP)(SynthObjP->InstrumentValues[i][u]); - // the store doesnt point to global, so skip - if (v->dest_stack != MAX_INSTRUMENTS) - continue; - - // a up/down process - if (unit2 != -1) - { - // if the target unit was unit1 or unit2 realign target unit - if (v->dest_unit == unit1) - { - v->dest_unit = unit2; - } - else if (v->dest_unit == unit2) - { - v->dest_unit = unit1; - } - } - // a set/reset process - else - { - // if the target unit was unit1 reset store - if (v->dest_unit == unit1) - { - char text[128]; - sprintf(text, "Instrument %d had a modulation target in the changed unit\nIt's no longer valid and will be reset", i); - MessageBox(DialogWnd, text, "Info", MB_OK); - v->dest_unit = -1; - v->dest_slot = -1; - v->dest_id = -1; - } - } - } - } - } - // now check the global slots - for (int u = 0; u < MAX_UNITS; u++) - { - if (SynthObjP->GlobalValues[u][0] == M_FST) - { - FST_valP v = (FST_valP)(SynthObjP->GlobalValues[u]); - // the store points to global, so check - if (v->dest_stack == -1 || v->dest_stack == MAX_INSTRUMENTS) - { - // a up/down process - if (unit2 != -1) - { - // if the target unit was unit1 or unit2 realign target unit - if (v->dest_unit == unit1) - { - v->dest_unit = unit2; - } - else if (v->dest_unit == unit2) - { - v->dest_unit = unit1; - } - } - // a set/reset process - else - { - // if the target unit was unit1 reset store - if (v->dest_unit == unit1) - { - char text[128]; - sprintf(text, "Global had a modulation target in the changed unit\nIt's no longer valid and will be reset"); - MessageBox(DialogWnd, text, "Info", MB_OK); - v->dest_unit = -1; - v->dest_slot = -1; - v->dest_id = -1; - } - } - } - } - } - } -} - -bool StackButtonPressed(WPARAM id) -{ - int res; - - // Instrument Stack Buttons - if (SelectedTab == T_INSTRUMENT) - { - // check unit click - InterleavedButtonGroupChanged(IDC_ISTACK_UNIT1, MAX_UNITS, LOWORD(id), res); - if (res >= 0) - { - SelectedIUnit = res; - UpdateModuleParamWindow(T_INSTRUMENT, res); - } - - // check down click - for (int i = 0; i < MAX_UNITS; i++) - { - WORD tid = IDC_ISTACK_DOWN1+i*6; - if (LOWORD(id) == tid) - { - SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; - EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], tid), false); - Go4kVSTi_FlipInstrumentSlots(SelectedInstrument, i, i+1); - CheckModulations(i, i+1); - LinkInstrumentUnit(SelectedInstrument, i); - LinkInstrumentUnit(SelectedInstrument, i+1); - UpdateControls(SelectedInstrument); - EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], tid), true); - } - } - - // check up click - for (int i = 0; i < MAX_UNITS; i++) - { - WORD tid = IDC_ISTACK_UP1+i*6; - if (LOWORD(id) == tid) - { - SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; - EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], tid), false); - Go4kVSTi_FlipInstrumentSlots(SelectedInstrument, i, i-1); - CheckModulations(i, i-1); - LinkInstrumentUnit(SelectedInstrument, i); - LinkInstrumentUnit(SelectedInstrument, i-1); - UpdateControls(SelectedInstrument); - EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], tid), true); - } - } - - // check set click - for (int i = 0; i < MAX_UNITS; i++) - { - WORD tid = IDC_ISTACK_SET1+i*6; - if (LOWORD(id) == tid) - { - EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], tid), false); - if (IDOK == DialogBox(hInstance, MAKEINTRESOURCE(IDD_SET_DIALOG), DialogWnd, (DLGPROC)SetDialogProc)) - { - if (SetUnit != SynthObjP->InstrumentValues[SelectedInstrument][i][0]) - { - SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; - Go4kVSTi_InitInstrumentSlot(SelectedInstrument, i, SetUnit); - CheckModulations(i); - SelectedIUnit = i; - LinkInstrumentUnit(SelectedInstrument, i); - UpdateControls(SelectedInstrument); - } - } - EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], tid), true); - return TRUE; - } - } - - // check reset click - for (int i = 0; i < MAX_UNITS; i++) - { - WORD tid = IDC_ISTACK_RESET1+i*6; - if (LOWORD(id) == tid) - { - SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; - EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], tid), false); - Go4kVSTi_ClearInstrumentSlot(SelectedInstrument, i); - LinkInstrumentUnit(SelectedInstrument, i); - CheckModulations(i); - - UpdateControls(SelectedInstrument); - EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], tid), true); - } - } - } - else if (SelectedTab == T_GLOBAL) - { - // check unit click - InterleavedButtonGroupChanged(IDC_GSTACK_UNIT1, MAX_UNITS, LOWORD(id), res); - if (res >= 0) - { - SelectedGUnit = res; - UpdateModuleParamWindow(T_GLOBAL, res); - } - - // check down click - for (int i = 0; i < MAX_UNITS; i++) - { - WORD tid = IDC_GSTACK_DOWN1+i*6; - if (LOWORD(id) == tid) - { - SynthObjP->GlobalSignalValid = 0; - EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], tid), false); - Go4kVSTi_FlipGlobalSlots(i, i+1); - CheckModulations(i, i+1); - UpdateControls(SelectedInstrument); - EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], tid), true); - } - } - - // check up click - for (int i = 0; i < MAX_UNITS; i++) - { - WORD tid = IDC_GSTACK_UP1+i*6; - if (LOWORD(id) == tid) - { - SynthObjP->GlobalSignalValid = 0; - EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], tid), false); - Go4kVSTi_FlipGlobalSlots(i, i-1); - CheckModulations(i, i-1); - UpdateControls(SelectedInstrument); - EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], tid), true); - } - } - - // check set click - for (int i = 0; i < MAX_UNITS; i++) - { - WORD tid = IDC_GSTACK_SET1+i*6; - if (LOWORD(id) == tid) - { - EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], tid), false); - if (IDOK == DialogBox(hInstance, MAKEINTRESOURCE(IDD_SET_DIALOG), DialogWnd, (DLGPROC)SetDialogProc)) - { - if (SetUnit != SynthObjP->GlobalValues[i][0]) - { - SynthObjP->GlobalSignalValid = 0; - Go4kVSTi_InitGlobalSlot(i, SetUnit); - CheckModulations(i); - SelectedGUnit = i; - UpdateControls(SelectedInstrument); - } - } - EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], tid), true); - } - } - - // check reset click - for (int i = 0; i < MAX_UNITS; i++) - { - WORD tid = IDC_GSTACK_RESET1+i*6; - if (LOWORD(id) == tid) - { - SynthObjP->GlobalSignalValid = 0; - EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], tid), false); - Go4kVSTi_ClearGlobalSlot(i); - CheckModulations(i); - UpdateControls(SelectedInstrument); - EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], tid), true); - } - } - } - return TRUE; -} - -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -// // -// TabChange Event // -// // -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// - -void TabChanged(int index) -{ - for (int i = 0; i < NUM_TABS; i++) - { - if (i == index) - ShowWindow(TabWnd[i], SW_SHOW); - else - ShowWindow(TabWnd[i], SW_HIDE); - } - if (index == T_INSTRUMENT) - { - ShowWindow(GetDlgItem(DialogWnd, IDC_ISTACK_VALID), true); - ShowWindow(GetDlgItem(DialogWnd, IDC_GSTACK_VALID), false); - // reset scroll pos - int oldpos = GetScrollPos(ScrollWnd, SB_VERT); - SCROLLINFO sinfo; - sinfo.cbSize = sizeof(SCROLLINFO); - sinfo.fMask = SIF_POS; - sinfo.nPos = InstrumentScrollPos[SelectedInstrument]; - SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); - ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); - } - if (index == T_GLOBAL) - { - ShowWindow(GetDlgItem(DialogWnd, IDC_ISTACK_VALID), false); - ShowWindow(GetDlgItem(DialogWnd, IDC_GSTACK_VALID), true); - // reset scroll pos - int oldpos = GetScrollPos(ScrollWnd, SB_VERT); - SCROLLINFO sinfo; - sinfo.cbSize = sizeof(SCROLLINFO); - sinfo.fMask = SIF_POS; - sinfo.nPos = GlobalScrollPos; - SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); - ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); - } - - SelectedTab = index; - UpdateModuleParamWindow(SelectedTab, -1); -} - -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -// // -// GUI Update Events // -// // -////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// - -void UpdateSignalCount(int channel) -{ - ////////////////////////////////////////////////////////////// - // instrument - ////////////////////////////////////////////////////////////// - - // disable for safety first - SynthObjP->InstrumentSignalValid[channel] = 0; - int valid = 1; - int signalcount = 0; - // check stack validity - SynthObjP->HighestSlotIndex[channel] = 63; - int highestSlotIndex = 0; - for (int i = 0; i < MAX_UNITS; i++) - { - if (SynthObjP->InstrumentValues[channel][i][0] != 0) - { - if (i >= highestSlotIndex) - highestSlotIndex = i; - } - // check unit precondition - int precond = UnitPreSignals[SynthObjP->InstrumentValues[channel][i][0]]; - // adjust for arithmetic unit (depending on mode) - if (SynthObjP->InstrumentValues[channel][i][0] == M_FOP) - { - FOP_valP v = (FOP_valP)(SynthObjP->InstrumentValues[channel][i]); - if (v->flags == FOP_LOADNOTE) - precond = 0; - if (v->flags == FOP_POP) - precond = 1; - if (v->flags == FOP_PUSH) - precond = 1; - if (v->flags == FOP_ADDP2) - precond = 4; - if (v->flags == FOP_MULP2) - precond = 4; - } - // adjust for stereo in vcf (we need 2 signals for stereo) - if (SynthObjP->InstrumentValues[channel][i][0] == M_VCF) - { - VCF_valP v = (VCF_valP)(SynthObjP->InstrumentValues[channel][i]); - if (v->type & VCF_STEREO) - precond += 1; - } - // adjust for stereo in dst (we need 2 signals for stereo) - if (SynthObjP->InstrumentValues[channel][i][0] == M_DST) - { - DST_valP v = (DST_valP)(SynthObjP->InstrumentValues[channel][i]); - if (v->stereo & VCF_STEREO) - precond += 1; - } - if (signalcount < precond) - { - valid = 0; - Go4kVSTi_ClearInstrumentWorkspace(channel); - for (int j = i; j < MAX_UNITS; j++) - { - char txt[10]; - sprintf(txt, "%d", signalcount); - SetWindowText(GetDlgItem(TabWnd[T_INSTRUMENT], IDC_ISTACK_SIGNALCOUNT1+j*6), "inv"); - } - char err[128]; - sprintf(err, "Signal INVALID! Unit %d needs >= %d signals", i+1, precond); - SetWindowText(GetDlgItem(DialogWnd, IDC_ISTACK_VALID), err); - break; - } - // precondition ok - else - { - signalcount += UnitPostSignals[SynthObjP->InstrumentValues[channel][i][0]]; - // adjust for arithmetic unit (depending on mode) - if (SynthObjP->InstrumentValues[channel][i][0] == M_FOP) - { - FOP_valP v = (FOP_valP)(SynthObjP->InstrumentValues[channel][i]); - if (v->flags == FOP_POP) - signalcount--; - if (v->flags == FOP_PUSH) - signalcount++; - if (v->flags == FOP_ADDP) - signalcount--; - if (v->flags == FOP_MULP) - signalcount--; - if (v->flags == FOP_ADDP2) - signalcount-=2; - if (v->flags == FOP_MULP2) - signalcount-=2; - if (v->flags == FOP_LOADNOTE) - signalcount++; - } - // adjust for stereo in vco (2 signals for stereo) - if (SynthObjP->InstrumentValues[channel][i][0] == M_VCO) - { - VCO_valP v = (VCO_valP)(SynthObjP->InstrumentValues[channel][i]); - if (v->flags & VCO_STEREO) - signalcount++; - } - // adjust for pop in store - if (SynthObjP->InstrumentValues[channel][i][0] == M_FST) - { - FST_valP v = (FST_valP)(SynthObjP->InstrumentValues[channel][i]); - if (v->type & FST_POP) - signalcount--; - } - // check stack undeflow - if (signalcount < 0) - { - valid = 0; - Go4kVSTi_ClearInstrumentWorkspace(channel); - for (int j = i; j < MAX_UNITS; j++) - { - char txt[10]; - sprintf(txt, "%d", signalcount); - SetWindowText(GetDlgItem(TabWnd[T_INSTRUMENT], IDC_ISTACK_SIGNALCOUNT1+j*6), "inv"); - } - char err[128]; - sprintf(err, "Signal INVALID! Unit %d Stack Underflow %d", i+1, signalcount); - SetWindowText(GetDlgItem(DialogWnd, IDC_ISTACK_VALID), err); - break; - } - // check stack overflow - else if (signalcount > 8) - { - valid = 0; - Go4kVSTi_ClearInstrumentWorkspace(channel); - for (int j = i; j < MAX_UNITS; j++) - { - char txt[10]; - sprintf(txt, "%d", signalcount); - SetWindowText(GetDlgItem(TabWnd[T_INSTRUMENT], IDC_ISTACK_SIGNALCOUNT1+j*6), "inv"); - } - char err[128]; - sprintf(err, "Signal INVALID! Unit %d Stack Overflow %d", i+1, signalcount); - SetWindowText(GetDlgItem(DialogWnd, IDC_ISTACK_VALID), err); - break; - } - // TODO: check module internal overflow (like needing additional FP slots internally) - else - { - } - // update signal counter - char txt[10]; - sprintf(txt, "%d", signalcount); - SetWindowText(GetDlgItem(TabWnd[T_INSTRUMENT], IDC_ISTACK_SIGNALCOUNT1+i*6), txt); - } - } - if (valid) - { - if (signalcount == 0) - { - SynthObjP->InstrumentSignalValid[channel] = 1; - SetWindowText(GetDlgItem(DialogWnd, IDC_ISTACK_VALID), "Signal OK"); - } - else - { - Go4kVSTi_ClearInstrumentWorkspace(channel); - SetWindowText(GetDlgItem(DialogWnd, IDC_ISTACK_VALID), "Signal INVALID! Signal Count != 0 after last unit"); - } - } - SynthObjP->HighestSlotIndex[channel] = highestSlotIndex; - if (channel < 16) - { - if (LinkToInstrument[channel] != 16) - { - SynthObjP->InstrumentSignalValid[LinkToInstrument[channel]] = SynthObjP->InstrumentSignalValid[channel]; - SynthObjP->HighestSlotIndex[LinkToInstrument[channel]] = SynthObjP->HighestSlotIndex[channel]; - } - } - - ////////////////////////////////////////////////////////////// - // global - ////////////////////////////////////////////////////////////// - - // disable for safety first - SynthObjP->GlobalSignalValid = 0; - valid = 1; - signalcount = 0; - // check stack validity - SynthObjP->HighestSlotIndex[16] = 63; - highestSlotIndex = 0; - for (int i = 0; i < MAX_UNITS; i++) - { - if (SynthObjP->GlobalValues[i][0] != 0) - { - if (i >= highestSlotIndex) - highestSlotIndex = i; - } - // check unit precondition - int precond = UnitPreSignals[SynthObjP->GlobalValues[i][0]]; - // adjust for arithmetic unit (depending on mode) - if (SynthObjP->GlobalValues[i][0] == M_FOP) - { - FOP_valP v = (FOP_valP)(SynthObjP->GlobalValues[i]); - if (v->flags == FOP_LOADNOTE) - precond = 0; - if (v->flags == FOP_POP) - precond = 1; - if (v->flags == FOP_PUSH) - precond = 1; - if (v->flags == FOP_ADDP2) - precond = 4; - if (v->flags == FOP_MULP2) - precond = 4; - } - // adjust for stereo in vcf (we need 2 signals for stereo) - if (SynthObjP->GlobalValues[i][0] == M_VCF) - { - VCF_valP v = (VCF_valP)(SynthObjP->GlobalValues[i]); - if (v->type & VCF_STEREO) - precond += 1; - } - // adjust for stereo in dst (we need 2 signals for stereo) - if (SynthObjP->GlobalValues[i][0] == M_DST) - { - DST_valP v = (DST_valP)(SynthObjP->GlobalValues[i]); - if (v->stereo & VCF_STEREO) - precond += 1; - } - if (signalcount < precond) - { - valid = 0; - Go4kVSTi_ClearGlobalWorkspace(); - for (int j = i; j < MAX_UNITS; j++) - { - char txt[10]; - sprintf(txt, "%d", signalcount); - SetWindowText(GetDlgItem(TabWnd[T_GLOBAL], IDC_GSTACK_SIGNALCOUNT1+j*6), "inv"); - } - char err[128]; - sprintf(err, "Signal INVALID! Unit %d needs >= %d signals", i+1, precond); - SetWindowText(GetDlgItem(DialogWnd, IDC_GSTACK_VALID), err); - break; - } - // precondition ok - else - { - signalcount += UnitPostSignals[SynthObjP->GlobalValues[i][0]]; - // adjust for arithmetic unit (depending on mode) - if (SynthObjP->GlobalValues[i][0] == M_FOP) - { - FOP_valP v = (FOP_valP)(SynthObjP->GlobalValues[i]); - if (v->flags == FOP_POP) - signalcount--; - if (v->flags == FOP_PUSH) - signalcount++; - if (v->flags == FOP_ADDP) - signalcount--; - if (v->flags == FOP_MULP) - signalcount--; - if (v->flags == FOP_ADDP2) - signalcount-=2; - if (v->flags == FOP_MULP2) - signalcount-=2; - if (v->flags == FOP_LOADNOTE) - signalcount++; - } - // adjust for stereo in vco (2 signals for stereo) - if (SynthObjP->GlobalValues[i][0] == M_VCO) - { - VCO_valP v = (VCO_valP)(SynthObjP->GlobalValues[i]); - if (v->flags & VCO_STEREO) - signalcount++; - } - // adjust for pop in store - if (SynthObjP->GlobalValues[i][0] == M_FST) - { - FST_valP v = (FST_valP)(SynthObjP->GlobalValues[i]); - if (v->type & FST_POP) - signalcount--; - } - // check stack undeflow - if (signalcount < 0) - { - valid = 0; - Go4kVSTi_ClearGlobalWorkspace(); - for (int j = i; j < MAX_UNITS; j++) - { - char txt[10]; - sprintf(txt, "%d", signalcount); - SetWindowText(GetDlgItem(TabWnd[T_GLOBAL], IDC_GSTACK_SIGNALCOUNT1+j*6), "inv"); - } - char err[128]; - sprintf(err, "Signal INVALID! Unit %d Stack Underflow %d", i+1, signalcount); - SetWindowText(GetDlgItem(DialogWnd, IDC_GSTACK_VALID), err); - break; - } - // check stack overflow - else if (signalcount > 8) - { - valid = 0; - Go4kVSTi_ClearGlobalWorkspace(); - for (int j = i; j < MAX_UNITS; j++) - { - char txt[10]; - sprintf(txt, "%d", signalcount); - SetWindowText(GetDlgItem(TabWnd[T_GLOBAL], IDC_GSTACK_SIGNALCOUNT1+j*6), "inv"); - } - char err[128]; - sprintf(err, "Signal INVALID! Unit %d Stack Overflow %d", i+1, signalcount); - SetWindowText(GetDlgItem(DialogWnd, IDC_GSTACK_VALID), err); - break; - } - // TODO: check module internal overflow (like needing additional FP slots internally) - else - { - } - // update signal counter - char txt[10]; - sprintf(txt, "%d", signalcount); - SetWindowText(GetDlgItem(TabWnd[T_GLOBAL], IDC_GSTACK_SIGNALCOUNT1+i*6), txt); - } - } - if (valid) - { - if (signalcount == 0) - { - SynthObjP->GlobalSignalValid = 1; - SetWindowText(GetDlgItem(DialogWnd, IDC_GSTACK_VALID), "Signal OK"); - } - else - { - Go4kVSTi_ClearGlobalWorkspace(); - SetWindowText(GetDlgItem(DialogWnd, IDC_GSTACK_VALID), "Signal INVALID! Signal Count != 0 after last unit"); - } - } - SynthObjP->HighestSlotIndex[16] = highestSlotIndex; -} - -void UpdateControls(int channel) -{ - int res; - UpdateSignalCount(channel); - SetDlgItemText(DialogWnd, IDC_INSTRUMENT_NAME, (LPSTR)&(SynthObjP->InstrumentNames[channel])); - SendDlgItemMessage(DialogWnd, IDC_INSTRUMENTLINK, CB_SETCURSEL, (WPARAM)LinkToInstrument[SelectedInstrument], (LPARAM)0); - SendDlgItemMessage(DialogWnd, IDC_POLYPHONY, CB_SETCURSEL, (WPARAM)(SynthObjP->Polyphony-1), (LPARAM)0); - for (int i = 0; i < MAX_UNITS; i++) - { - // set unit text - char unitname[128]; - GetUnitString(SynthObjP->InstrumentValues[channel][i], unitname); - SetWindowText(GetDlgItem(TabWnd[T_INSTRUMENT], IDC_ISTACK_UNIT1+i*6), unitname); - GetUnitString(SynthObjP->GlobalValues[i], unitname); - SetWindowText(GetDlgItem(TabWnd[T_GLOBAL], IDC_GSTACK_UNIT1+i*6), unitname); - } - InterleavedButtonGroupChanged(IDC_ISTACK_UNIT1, MAX_UNITS, IDC_ISTACK_UNIT1+SelectedIUnit*6, res); - InterleavedButtonGroupChanged(IDC_GSTACK_UNIT1, MAX_UNITS, IDC_GSTACK_UNIT1+SelectedGUnit*6, res); - UpdateModuleParamWindow(SelectedTab, -1); -} - -void UpdateModule(int uid, BYTE* val) -{ - if (uid == M_ENV) - { - ENV_valP v = (ENV_valP)val; - // attack - InitSlider(ModuleWnd[uid], IDC_ENV_ATTACK, 0, 128, v->attac); - // decay - InitSlider(ModuleWnd[uid], IDC_ENV_DECAY, 0, 128, v->decay); - // sustain - InitSlider(ModuleWnd[uid], IDC_ENV_SUSTAIN, 0, 128, v->sustain); - // release - InitSlider(ModuleWnd[uid], IDC_ENV_RELEASE, 0, 128, v->release); - // gain - InitSlider(ModuleWnd[uid], IDC_ENV_GAIN, 0, 128, v->gain); - } - else if (uid == M_VCO) - { - VCO_valP v = (VCO_valP)val; - // transpose - InitSliderCenter(ModuleWnd[uid], IDC_VCO_TRANSPOSE, 0, 128, v->transpose); - // detune - InitSliderCenter(ModuleWnd[uid], IDC_VCO_DETUNE, 0, 128, v->detune); - // phaseofs - InitSlider(ModuleWnd[uid], IDC_VCO_PHASE, 0, 128, v->phaseofs); - // color - InitSliderCenter(ModuleWnd[uid], IDC_VCO_COLOR, 0, 128, v->color); - // shape - InitSliderCenter(ModuleWnd[uid], IDC_VCO_SHAPE, 0, 128, v->shape); - // gain - InitSlider(ModuleWnd[uid], IDC_VCO_GAIN, 0, 128, v->gain); - - // buttons - DisableButtonGroup(IDC_VCO_SINE, IDC_VCO_GATE, M_VCO); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRANSPOSE), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRANSPOSE_VAL), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_DETUNE), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_DETUNE_VAL), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PHASE), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PHASE_VAL), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR_VAL), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SHAPE), true); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SHAPE_VAL), true); - EnableButtonGroup(IDC_VCO_GATE1, IDC_VCO_GATE16, M_VCO, false); - if (v->flags & VCO_SINE) - { - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SINE), false); - } - else if (v->flags & VCO_TRISAW) - { - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRISAW), false); - } - else if (v->flags & VCO_PULSE) - { - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PULSE), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SHAPE), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SHAPE_VAL), false); - } - else if (v->flags & VCO_NOISE) - { - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_NOISE), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRANSPOSE), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRANSPOSE_VAL), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_DETUNE), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_DETUNE_VAL), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PHASE), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PHASE_VAL), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR_VAL), false); - } - else if (v->flags & VCO_GATE) - { - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_GATE), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR_VAL), false); - EnableButtonGroup(IDC_VCO_GATE1, IDC_VCO_GATE16, M_VCO, true); - } - - // gate bits - WORD gatebits = ((WORD)v->color << 8) | (WORD)v->gate; - SetCheckboxGroupBitmask(IDC_VCO_GATE1, IDC_VCO_GATE16, M_VCO, gatebits); - SendDlgItemMessage(ModuleWnd[M_VCO], IDC_VCO_LFO, BM_SETCHECK, v->flags & VCO_LFO, 0); - SendDlgItemMessage(ModuleWnd[M_VCO], IDC_VCO_STEREO, BM_SETCHECK, v->flags & VCO_STEREO, 0); - } - else if (uid == M_VCF) - { - VCF_valP v = (VCF_valP)val; - // frequency - InitSlider(ModuleWnd[uid], IDC_VCF_FREQUENCY, 0, 128, v->freq); - // resonance - InitSlider(ModuleWnd[uid], IDC_VCF_RESONANCE, 0, 128, v->res); - - // buttons - DisableButtonGroup(IDC_VCF_LOW, IDC_VCF_ALL, M_VCF); - - int mode = v->type & ~VCF_STEREO; - if (mode == VCF_LOWPASS) - EnableWindow(GetDlgItem(ModuleWnd[M_VCF], IDC_VCF_LOW), false); - else if (mode == VCF_HIGHPASS) - EnableWindow(GetDlgItem(ModuleWnd[M_VCF], IDC_VCF_HIGH), false); - else if (mode == VCF_BANDPASS) - EnableWindow(GetDlgItem(ModuleWnd[M_VCF], IDC_VCF_BAND), false); - else if (mode == VCF_BANDSTOP) - EnableWindow(GetDlgItem(ModuleWnd[M_VCF], IDC_VCF_NOTCH), false); - else if (mode == VCF_PEAK) - EnableWindow(GetDlgItem(ModuleWnd[M_VCF], IDC_VCF_PEAK), false); - else if (mode == VCF_ALLPASS) - EnableWindow(GetDlgItem(ModuleWnd[M_VCF], IDC_VCF_ALL), false); - - SendDlgItemMessage(ModuleWnd[M_VCF], IDC_VCF_STEREO, BM_SETCHECK, v->type & VCF_STEREO, 0); - } - else if (uid == M_DST) - { - DST_valP v = (DST_valP)val; - // drive - InitSliderCenter(ModuleWnd[uid], IDC_DST_DRIVE, 0, 128, v->drive); - // snhfreq - InitSlider(ModuleWnd[uid], IDC_DST_SNH, 0, 128, v->snhfreq); - SendDlgItemMessage(ModuleWnd[M_DST], IDC_DST_STEREO, BM_SETCHECK, v->stereo & VCF_STEREO, 0); - } - else if (uid == M_DLL) - { - DLL_valP v = (DLL_valP)val; - // pregain - InitSlider(ModuleWnd[uid], IDC_DLL_PREGAIN, 0, 128, v->pregain); - // dry - InitSlider(ModuleWnd[uid], IDC_DLL_DRY, 0, 128, v->dry); - // feedback - InitSlider(ModuleWnd[uid], IDC_DLL_FEEDBACK, 0, 128, v->feedback); - // frequency - InitSlider(ModuleWnd[uid], IDC_DLL_FREQUENCY, 0, 128, v->freq); - // depth - InitSlider(ModuleWnd[uid], IDC_DLL_DEPTH, 0, 128, v->depth); - // damp - InitSlider(ModuleWnd[uid], IDC_DLL_DAMP, 0, 128, v->damp); - // delay - InitSliderNoGUI(ModuleWnd[uid], IDC_DLL_DTIME, 0, 128, v->guidelay); - - // delay/reverb button - DisableButtonGroup(IDC_DLL_DELAY, IDC_DLL_REVERB, M_DLL); - if (v->reverb) - { - EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_REVERB), false); - // enable reverb gui elements - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_LEFTREVERB), SW_SHOW); - // disable delay gui elements - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOSYNC), SW_HIDE); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_BPMSYNC), SW_HIDE); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOTESYNC), SW_HIDE); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), SW_HIDE); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), SW_HIDE); - } - else - { - EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DELAY), false); - // disable reverb gui elements - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_LEFTREVERB), SW_HIDE); - // enable delay gui elements - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOSYNC), SW_SHOW); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_BPMSYNC), SW_SHOW); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOTESYNC), SW_SHOW); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), SW_SHOW); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), SW_SHOW); - } - DisableButtonGroup(IDC_DLL_NOSYNC, IDC_DLL_NOTESYNC, M_DLL); - if (v->synctype == 0) - { - EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), true); - EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), true); - } - else if (v->synctype == 1) - { - EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), true); - EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), true); - } - else if (v->synctype == 2) - { - EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), false); - EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), false); - } - EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOSYNC+v->synctype), false); - SendDlgItemMessage(ModuleWnd[M_DLL], IDC_DLL_LEFTREVERB, BM_SETCHECK, v->leftreverb, 0); - UpdateDelayTimes(v); - } - else if (uid == M_FOP) - { - FOP_valP v = (FOP_valP)val; - DisableButtonGroup(IDC_FOP_POP, IDC_FOP_MULP2, M_FOP); - EnableWindow(GetDlgItem(ModuleWnd[M_FOP], IDC_FOP_POP + v->flags-FOP_POP), false); - } - else if (uid == M_FST) - { - FST_valP v = (FST_valP)val; - // gain - InitSliderCenter2(ModuleWnd[uid], IDC_FST_AMOUNT, 0, 128, v->amount); - - // set instrument combobox - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0); - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"Local"); - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - char instname[128]; - sprintf(instname, "%d: %s", i+1, SynthObjP->InstrumentNames[i]); - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_ADDSTRING, (WPARAM)0, (LPARAM)instname); - } - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"Global"); - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_SETCURSEL, (WPARAM)(v->dest_stack+1), (LPARAM)0); - - // set unit combobox - BYTE *units; - if (SelectedTab == T_INSTRUMENT) - { - if (v->dest_stack == -1) - units = SynthObjP->InstrumentValues[SelectedInstrument][0]; - else if (v->dest_stack == MAX_INSTRUMENTS) - units = SynthObjP->GlobalValues[0]; - else - units = SynthObjP->InstrumentValues[v->dest_stack][0]; - } - else - { - if (v->dest_stack == -1) - units = SynthObjP->GlobalValues[0]; - else if (v->dest_stack == MAX_INSTRUMENTS) - units = SynthObjP->GlobalValues[0]; - else - units = SynthObjP->InstrumentValues[v->dest_stack][0]; - } - - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0); - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"- Nothing Selected -"); - for (int i = 0; i < MAX_UNITS; i++) - { - char unitname[128], unitname2[128]; - sprintf(unitname, "%d: %s", i+1, GetUnitString(&units[i*MAX_UNIT_SLOTS], unitname2)); - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_ADDSTRING, (WPARAM)0, (LPARAM)unitname); - } - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_SETCURSEL, (WPARAM)(v->dest_unit+1), (LPARAM)0); - - // set slot combobox - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0); - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"- Nothing Selected -"); - if (v->dest_unit == -1) - { - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); - EnableWindow(GetDlgItem(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT), false); - } - else - { - EnableWindow(GetDlgItem(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT), true); - DWORD unitid = units[v->dest_unit*MAX_UNIT_SLOTS]; - for (int i = 0; i < 8; i++) - { - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_ADDSTRING, (WPARAM)0, (LPARAM)UnitModulationTargetNames[unitid][i]); - } - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_SETCURSEL, (WPARAM)(v->dest_slot+1), (LPARAM)0); - } - // buttons - DisableButtonGroup(IDC_FST_SET, IDC_FST_MUL, M_FST); - if (v->type & FST_ADD) - EnableWindow(GetDlgItem(ModuleWnd[M_FST], IDC_FST_ADD), false); - else if (v->type & FST_MUL) - EnableWindow(GetDlgItem(ModuleWnd[M_FST], IDC_FST_MUL), false); - else - EnableWindow(GetDlgItem(ModuleWnd[M_FST], IDC_FST_SET), false); - SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_POP, BM_SETCHECK, v->type & FST_POP, 0); - } - else if (uid == M_PAN) - { - PAN_valP v = (PAN_valP)val; - // panning - InitSliderCenter(ModuleWnd[uid], IDC_PAN_PANNING, 0, 128, v->panning); - } - else if (uid == M_OUT) - { - OUT_valP v = (OUT_valP)val; - // gain - InitSlider(ModuleWnd[uid], IDC_OUT_GAIN, 0, 128, v->gain); - // auxsend - InitSlider(ModuleWnd[uid], IDC_OUT_AUXSEND, 0, 128, v->auxsend); - } - else if (uid == M_ACC) - { - ACC_valP v = (ACC_valP)val; - DisableButtonGroup(IDC_ACC_OUT, IDC_ACC_AUX, M_ACC); - if (v->flags == ACC_OUT) - EnableWindow(GetDlgItem(ModuleWnd[M_ACC], IDC_ACC_OUT), false); - else - EnableWindow(GetDlgItem(ModuleWnd[M_ACC], IDC_ACC_AUX), false); - } - else if (uid == M_FLD) - { - FLD_valP v = (FLD_valP)val; - // panning - InitSliderCenter(ModuleWnd[uid], IDC_FLD_VALUE, 0, 128, v->value); - } - else if (uid == M_GLITCH) - { - GLITCH_valP v = (GLITCH_valP)val; - // active - InitSlider(ModuleWnd[uid], IDC_GLITCH_ACTIVE, 0, 128, v->active); - // dry - InitSlider(ModuleWnd[uid], IDC_GLITCH_DRY, 0, 128, v->dry); - // delta size - InitSlider(ModuleWnd[uid], IDC_GLITCH_DSIZE, 0, 128, v->dsize); - // delta pitch - InitSlider(ModuleWnd[uid], IDC_GLITCH_DPITCH, 0, 128, v->dpitch); - // delay - InitSliderNoGUI(ModuleWnd[uid], IDC_GLITCH_DTIME, 0, 128, v->guidelay); - - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_GLITCH_DTIME), SW_SHOW); - ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_GLITCH_DTIME_VAL), SW_SHOW); - - UpdateDelayTimes(v); - } -} - -void UpdateModuleParamWindow(int tab, int unit) -{ - if (tab == T_INSTRUMENT) - { - // show unit page - if (unit == -1) - unit = SelectedIUnit; - for (int i = 0; i < NUM_MODULES; i++) - { - if (i == SynthObjP->InstrumentValues[SelectedInstrument][unit][0]) - ShowWindow(ModuleWnd[M_NONE+i], SW_SHOW); - else - ShowWindow(ModuleWnd[M_NONE+i], SW_HIDE); - } - // set unit sliders and buttons - UnitID uid = (UnitID)(SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit][0]); - UpdateModule(uid, SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit]); - } - else if (tab == T_GLOBAL) - { - // show unit page - if (unit == -1) - unit = SelectedGUnit; - for (int i = 0; i < NUM_MODULES; i++) - { - if (i == SynthObjP->GlobalValues[unit][0]) - ShowWindow(ModuleWnd[M_NONE+i], SW_SHOW); - else - ShowWindow(ModuleWnd[M_NONE+i], SW_HIDE); - } - // set unit sliders and buttons - UnitID uid = (UnitID)(SynthObjP->GlobalValues[SelectedGUnit][0]); - UpdateModule(uid, SynthObjP->GlobalValues[SelectedGUnit]); - } -} - -void UpdateVoiceDisplay(int i) -{ - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - int count = 0; - for (int p = 0; p < SynthObjP->Polyphony; p++) - { - if (SynthObjP->InstrumentWork[i*MAX_POLYPHONY+p].note != 0) - count++; - } - char text[10]; - if (SynthObjP->InstrumentSignalValid[i]) - { - sprintf(text, "%d", count); - SetWindowText(GetDlgItem(DialogWnd, IDC_VOICECOUNT1+i), text); - } - else - { - sprintf(text, "inv", count); - SetWindowText(GetDlgItem(DialogWnd, IDC_VOICECOUNT1+i), text); - } - } -} - -void GetStreamFileName() -{ -#ifdef EXPORT_OBJECT_FILE - - char lpstrFile[256] = {'4','k','l','a','n','g','.','o','b','j',0}; - char lpstrFilter[256] = {'4','k','l','a','n','g',' ','O','b','j','e','c','t', 0 ,'*','.','o','b','j', 0, 0}; - char lpstrExtension[256] = { 'o','b','j', 0 }; - char lpstrFileTitle[4096]; - char lpstrDirectory[4096]; - GetCurrentDirectory(4096, lpstrDirectory); - - // no windows object? - int objformat = SendDlgItemMessage(DialogWnd, IDC_OBJFORMAT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); - if (objformat != 0) - { - lpstrFile[8] = 0; // 4klang.o - lpstrFilter[17] = lpstrFilter[18] = 0; - lpstrExtension[1] = 0; - } - - OPENFILENAME ofn = - { - sizeof(OPENFILENAME), - DialogWnd, - GetModuleHandle(NULL), - lpstrFilter, - NULL, - 0, - 1, - lpstrFile, - 256, - NULL, - 0, - lpstrDirectory, - NULL, - OFN_OVERWRITEPROMPT, - 0, - 0, - lpstrExtension, - 0, - NULL, - NULL - }; -#else - char lpstrFilter[256] = - {'4','k','l','a','n','g',' ','I','n','c','l','u','d','e', 0 , - '*','.','i','n','c', 0, - 0}; -#ifdef _4KLANG2 - char lpstrFile[4096] = "4klang2.inc"; -#else - char lpstrFile[4096] = "4klang.inc"; -#endif - char lpstrDirectory[4096]; - GetCurrentDirectory(4096, lpstrDirectory); - - OPENFILENAME ofn = - { - sizeof(OPENFILENAME), - DialogWnd, - GetModuleHandle(NULL), - lpstrFilter, - NULL, - 0, - 1, - lpstrFile, - 256, - NULL, - 0, - lpstrDirectory, - NULL, - OFN_OVERWRITEPROMPT, - 0, - 0, - "inc", - 0, - NULL, - NULL - }; -#endif - if (GetSaveFileName(&ofn)) - { - int useenvlevels = SendDlgItemMessage(DialogWnd, IDC_ENVLEVELS, BM_GETCHECK, 0, 0); - int useenotevalues = SendDlgItemMessage(DialogWnd, IDC_NOTEVALUES, BM_GETCHECK, 0, 0); - int clipoutput = SendDlgItemMessage(DialogWnd, IDC_CLIPOUTPUT, BM_GETCHECK, 0, 0); - int undenormalize = SendDlgItemMessage(DialogWnd, IDC_UNDENORMALIZE, BM_GETCHECK, 0, 0); - int objformat = SendDlgItemMessage(DialogWnd, IDC_OBJFORMAT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); - int output16 = SendDlgItemMessage(DialogWnd, IDC_16BIT, BM_GETCHECK, 0, 0); - Go4kVSTi_SaveByteStream(hInstance, ofn.lpstrFile, useenvlevels, useenotevalues, clipoutput, undenormalize, objformat, output16); - } -} - +#define _WIN32_WINNT 0x0400 +#include +#include +#include +#include "resource.h" +#include "Go4kVSTiGUI.h" +#include "Go4kVSTiCore.h" +#include +#include +#include +#include +#include + +#define T_INSTRUMENT 0 +#define T_GLOBAL 1 +#define NUM_TABS 2 + +static HINSTANCE hInstance; +static UINT_PTR timer = 1; +static UINT_PTR backupTimer = 2; +static UINT_PTR timerID = 0; +static UINT_PTR backupTimerID = 0; +static HWND DialogWnd = NULL; +static HWND ModuleWnd[NUM_MODULES]; +static HWND TabWnd[NUM_TABS]; +static HWND SetWnd; +static HWND ScrollWnd; +static int SelectedIUnit = 0; +static int SelectedGUnit = 0; +static int SelectedTab = T_INSTRUMENT; +static int SelectedInstrument = 0; +static int LinkToInstrument[16] = { 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16 }; +static int SetUnit = -1; +static char SliderValTxt[128]; +static DWORD UnitCopyBuffer[MAX_UNIT_SLOTS]; +static int InstrumentScrollPos[MAX_INSTRUMENTS]; +static int GlobalScrollPos; +static int InitDone = false; + +static SynthObjectP SynthObjP; + +static char* UnitName[NUM_MODULES] = +{ + "-", + "Envelope", + "Oscillator", + "Filter", + "Distortion", + "DelayLine", + "Arithmetic", + "Store", + "Panning", + "Output", + "Accumulate", + "Load", + "Glitch" +}; + +// minimal signal precondition for each unit +static int UnitPreSignals[NUM_MODULES] = +{ + 0, // none + 0, // env + 0, // vco + 1, // vcf + 1, // dst + 1, // dll + 2, // fop, signal count for arithmetic depends on mode + 1, // fst + 1, // pan + 2, // out + 0, // acc + 0, // fld + 1, // glitch +}; + +// signal post condition (relative to precondition) +static int UnitPostSignals[NUM_MODULES] = +{ + 0, // none + 1, // env + 1, // vco + 0, // vcf + 0, // dst + 0, // dll + 0, // fop, signal count for arithmetic depends on mode + 0, // fst + 1, // pan + -2, // out + 2, // acc + 1, // fld + 0 // glitch +}; + +static char* UnitModulationTargetNames[][8] = +{ + { "", "", "", "", "", "", "", "" }, + { "", "", "Gain", "Attack", "Decay", "", "Release", "" }, + { "", "Transpose", "Detune", "Frequency", "Phase", "Color", "Shape", "Gain"}, + { "", "", "", "", "Cutoff Frequency", "Resonance", "", "" }, + { "", "", "Drive", "Sample&Hold Frequency", "", "", "", ""}, + { "Pregain", "Feedback", "Dry", "Damp", "LFO Frequency", "LFO Depth", "", "" }, + { "", "", "", "", "", "", "", "" }, + { "", "", "", "", "", "", "", "" }, + { "Panning", "", "", "", "", "", "", "" }, + { "AUX", "Gain", "", "", "", "", "", "" }, + { "", "", "", "", "", "", "", "" }, + { "Value", "", "", "", "", "", "", "" }, + { "Active", "Dry", "Delta Size", "Delta Pitch", "", "", "", "" }, +}; + +static char* UnitModulationTargetShortNames[][8] = +{ + { "", "", "", "", "", "", "", "" }, + { "", "", "Gain", "Attack", "Decay", "", "Release", "" }, + { "", "Transp", "Detune", "Freq", "Phase", "Color", "Shape", "Gain"}, + { "", "", "", "", "Cutoff", "Res", "", "" }, + { "", "", "Drive", "Freq", "", "", "", ""}, + { "Pregain", "Feedb", "Dry", "Damp", "LFO F", "LFO D", "", "" }, + { "", "", "", "", "", "", "", "" }, + { "", "", "", "", "", "", "", "" }, + { "Pan", "", "", "", "", "", "", "" }, + { "AUX", "Gain", "", "", "", "", "", "" }, + { "", "", "", "", "", "", "", "" }, + { "Value", "", "", "", "", "", "", "" }, + { "Active", "Dry", "DSize", "DPitch", "", "", "", "" }, +}; + +static char* delayName[33] = +{ + "1/32T", + "1/32", + "1/32D", + "1/16T", + "1/16", + "1/16D", + "1/8T", + "1/8", + "1/8D", + "1/4T", + "1/4", + "1/4D", + "1/2T", + "1/2", + "1/2D", + "1T", + "1", + "1D", + "2T", + "2", + "2D", + "3/8", + "5/8", + "7/8", + "9/8", + "11/8", + "13/8", + "15/8", + "3/4", + "5/4", + "7/4", + "3/2", + "3/2", +}; + +char* GetUnitString(BYTE* unit, char* unitname) +{ + char UnitDesc[128]; + UnitDesc[0]=0; + + if (unit[0] == M_VCO) + { + VCO_valP val = (VCO_valP)unit; + char lfo[5]; + lfo[0] = 0; + if (val->flags & VCO_LFO) + sprintf(lfo, "-LFO"); + if (val->flags & VCO_SINE) + sprintf(UnitDesc, " (%s%s)","Sine",lfo); + if (val->flags & VCO_TRISAW) + sprintf(UnitDesc, " (%s%s)","TriSaw",lfo); + if (val->flags & VCO_PULSE) + sprintf(UnitDesc, " (%s%s)","Pulse",lfo); + if (val->flags & VCO_NOISE) + sprintf(UnitDesc, " (%s%s)","Noise",lfo); + if (val->flags & VCO_GATE) + sprintf(UnitDesc, " (%s%s)","Gate",lfo); + } + if (unit[0] == M_VCF) + { + VCF_valP val = (VCF_valP)unit; + int ft = val->type & ~VCF_STEREO; + if (ft == VCF_LOWPASS) + sprintf(UnitDesc, " (%s F:%d)","Low", val->freq); + if (ft == VCF_HIGHPASS) + sprintf(UnitDesc, " (%s F:%d)","High", val->freq); + if (ft == VCF_BANDPASS) + sprintf(UnitDesc, " (%s F:%d)","Band", val->freq); + if (ft == VCF_BANDSTOP) + sprintf(UnitDesc, " (%s F:%d)","Notch", val->freq); + if (ft == VCF_PEAK) + sprintf(UnitDesc, " (%s F:%d)","Peak", val->freq); + if (ft == VCF_ALLPASS) + sprintf(UnitDesc, " (%s F:%d)","All", val->freq); + } + if (unit[0] == M_FOP) + { + FOP_valP val = (FOP_valP)unit; + if (val->flags == FOP_ADD) + sprintf(UnitDesc, " (%s)","+"); + if (val->flags == FOP_ADDP) + sprintf(UnitDesc, " (%s)","+/Pop"); + if (val->flags == FOP_MUL) + sprintf(UnitDesc, " (%s)","*"); + if (val->flags == FOP_MULP) + sprintf(UnitDesc, " (%s)","*/Pop"); + if (val->flags == FOP_POP) + sprintf(UnitDesc, " (%s)","Pop"); + if (val->flags == FOP_PUSH) + sprintf(UnitDesc, " (%s)","Push"); + if (val->flags == FOP_XCH) + sprintf(UnitDesc, " (%s)","Xch"); + if (val->flags == FOP_ADDP2) + sprintf(UnitDesc, " (%s)","2+/Pop"); + if (val->flags == FOP_LOADNOTE) + sprintf(UnitDesc, " (%s)","LoadNote"); + if (val->flags == FOP_MULP2) + sprintf(UnitDesc, " (%s)","2*/Pop"); + } + if (unit[0] == M_DLL) + { + DLL_valP val = (DLL_valP)unit; + if (val->reverb == 0) + sprintf(UnitDesc, " (%s)","Delay"); + else + sprintf(UnitDesc, " (%s)","Reverb"); + } + if (unit[0] == M_FST) + { + FST_valP val = (FST_valP)unit; + if (val->dest_unit == -1 || val->dest_slot == -1 || val->dest_id == -1) + { + sprintf(UnitDesc, " (No Target)"); + } + else + { + std::string st; + if (val->type & FST_ADD) + st = "+"; + if (val->type & FST_MUL) + st = "*"; + if (val->type & FST_POP) + st += ",Pop"; + + if ((val->dest_stack != -1) && (val->dest_stack != SelectedInstrument)) + { + if (val->dest_stack == MAX_INSTRUMENTS) + sprintf(UnitDesc, " (GU%d %s)%s", val->dest_unit+1, UnitModulationTargetShortNames[val->dest_id][val->dest_slot], st.c_str()); + else + sprintf(UnitDesc, " (%dU%d %s)%s",val->dest_stack+1, val->dest_unit+1, UnitModulationTargetShortNames[val->dest_id][val->dest_slot], st.c_str()); + } + else + { + sprintf(UnitDesc, " (U%d %s)%s", val->dest_unit+1, UnitModulationTargetShortNames[val->dest_id][val->dest_slot], st.c_str()); + } + } + } + if (unit[0] == M_DST) + { + DST_valP val = (DST_valP)unit; + sprintf(UnitDesc, " (D:%d)", val->drive-64, val->snhfreq); + } + if (unit[0] == M_PAN) + { + PAN_valP val = (PAN_valP)unit; + sprintf(UnitDesc, " (%d)", val->panning-64); + } + if (unit[0] == M_ACC) + { + ACC_valP val = (ACC_valP)unit; + if (val->flags == ACC_OUT) + sprintf(UnitDesc, " (%s)","Out"); + else + sprintf(UnitDesc, " (%s)","Aux"); + } + if (unit[0] == M_OUT) + { + OUT_valP val = (OUT_valP)unit; + sprintf(UnitDesc, " (G:%d A:%d)",val->gain, val->auxsend); + } + if (unit[0] == M_FLD) + { + FLD_valP val = (FLD_valP)unit; + sprintf(UnitDesc, " (%d)", val->value-64); + } + if (unit[0] == M_GLITCH) + { + GLITCH_valP val = (GLITCH_valP)unit; + sprintf(UnitDesc, " (%s)","Glitch"); + } + + sprintf(unitname, "%s%s", UnitName[unit[0]], UnitDesc); + return unitname; +} + +void UpdateDelayTimes(DLL_valP unit) +{ + // if reverb skip + if (unit->reverb) + return; + + Go4kVSTi_UpdateDelayTimes(); + + int delay; + char text[10]; + DLL_valP v = (DLL_valP)unit; + if (v->synctype == 2) + { + } + else + { + if (v->synctype == 1) + { + sprintf(text, "%s", delayName[v->guidelay>>2]); + } + else + { + delay = v->guidelay*16; + sprintf(text, "%.2f ms", (float)delay/44.100f); + } + sprintf(SliderValTxt, "%s", text); + SetWindowText(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), SliderValTxt); + } +} + +void UpdateDelayTimes(GLITCH_valP unit) +{ + Go4kVSTi_UpdateDelayTimes(); + + int delay; + char text[10]; + GLITCH_valP v = (GLITCH_valP)unit; + sprintf(text, "%s", delayName[v->guidelay>>2]); + sprintf(SliderValTxt, "%s", text); + SetWindowText(GetDlgItem(ModuleWnd[M_GLITCH], IDC_GLITCH_DTIME_VAL), SliderValTxt); +} + +// CB for the main DLG +BOOL CALLBACK MainDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG: + { + HWND tab = GetDlgItem(hwndDlg, IDC_MAINTAB); + TCITEM item; + item.mask = TCIF_TEXT; + item.pszText = "Instrument"; + SendDlgItemMessage(hwndDlg, IDC_MAINTAB, TCM_INSERTITEM, (WPARAM)0, (LPARAM)(&item)); + item.pszText = "Global"; + SendDlgItemMessage(hwndDlg, IDC_MAINTAB, TCM_INSERTITEM, (WPARAM)2, (LPARAM)(&item)); + + const char* instrument[] = {"1", "2", "3", "4", "5", "6", "7", "8", + "9", "10", "11", "12", "13", "14", "15", "16" }; + for (int i = 0; i < 16; i++) + { + SendDlgItemMessage(hwndDlg, IDC_INSTRUMENT, CB_ADDSTRING, (WPARAM)0, (LPARAM)(instrument[i])); + SendDlgItemMessage(hwndDlg, IDC_INSTRUMENTLINK, CB_ADDSTRING, (WPARAM)0, (LPARAM)(instrument[i])); + } + SendDlgItemMessage(hwndDlg, IDC_INSTRUMENTLINK, CB_ADDSTRING, (WPARAM)0, (LPARAM)("None")); + SendDlgItemMessage(hwndDlg, IDC_INSTRUMENT, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); + SendDlgItemMessage(hwndDlg, IDC_INSTRUMENT, CB_SETCURSEL, (WPARAM)16, (LPARAM)0); + + const char* patternsize[] = {"8", "16", "32", "64"}; + for (int i = 0; i < 4; i++) + SendDlgItemMessage(hwndDlg, IDC_PATTERN_SIZE, CB_ADDSTRING, (WPARAM)0, (LPARAM)(patternsize[i])); + SendDlgItemMessage(hwndDlg, IDC_PATTERN_SIZE, CB_SETCURSEL, (WPARAM)1, (LPARAM)0); + + const char* patternquant[] = {"1/4", "1/8", "1/16", "1/32", "1/64", "1/128"}; + for (int i = 0; i < 6; i++) + SendDlgItemMessage(hwndDlg, IDC_PATTERN_QUANT, CB_ADDSTRING, (WPARAM)0, (LPARAM)(patternquant[i])); + SendDlgItemMessage(hwndDlg, IDC_PATTERN_QUANT, CB_SETCURSEL, (WPARAM)2, (LPARAM)0); + + const char* objformat[] = {"Windows OBJ", "Linux ELF", "OSX MACHO"}; + for (int i = 0; i < 3; i++) + SendDlgItemMessage(hwndDlg, IDC_OBJFORMAT, CB_ADDSTRING, (WPARAM)0, (LPARAM)(objformat[i])); + SendDlgItemMessage(hwndDlg, IDC_OBJFORMAT, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); + + const char* polyphony[] = { "1xPolyphone", "2xPolyphone" }; + for (int i = 0; i < MAX_POLYPHONY; i++) + SendDlgItemMessage(hwndDlg, IDC_POLYPHONY, CB_ADDSTRING, (WPARAM)0, (LPARAM)(polyphony[i])); + SendDlgItemMessage(hwndDlg, IDC_POLYPHONY, CB_SETCURSEL, (WPARAM)1, (LPARAM)0); + + SendDlgItemMessage(hwndDlg, IDC_CLIPOUTPUT, BM_SETCHECK, 1, 0); + SendDlgItemMessage(hwndDlg, IDC_RECORDBUSYSIGNAL, BM_SETCHECK, 1, 0); + + return TRUE; + } + case WM_COMMAND: + { + // channel combo box + if (((HWND)lParam) == GetDlgItem(hwndDlg, IDC_INSTRUMENT)) + { + if (HIWORD(wParam) == CBN_SELCHANGE) + { + SelectedInstrument = SendDlgItemMessage(hwndDlg, IDC_INSTRUMENT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); + if (SendDlgItemMessage(hwndDlg, IDC_SOLO, BM_GETCHECK, 0, 0)==BST_CHECKED) + Go4kVSTi_Solo(SelectedInstrument, true); + else + Go4kVSTi_Solo(SelectedInstrument, false); + // get values from synth and set gui accordingly ... + UpdateControls(SelectedInstrument); + // reset scroll pos + int oldpos = GetScrollPos(ScrollWnd, SB_VERT); + SCROLLINFO sinfo; + sinfo.cbSize = sizeof(SCROLLINFO); + sinfo.fMask = SIF_POS; + sinfo.nPos = InstrumentScrollPos[SelectedInstrument]; + SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); + ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); + } + return TRUE; + } + // link to combo box + if (((HWND)lParam) == GetDlgItem(hwndDlg, IDC_INSTRUMENTLINK)) + { + if (HIWORD(wParam) == CBN_SELCHANGE) + { + int linkToInstrument = SendDlgItemMessage(hwndDlg, IDC_INSTRUMENTLINK, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); + if (SelectedInstrument == linkToInstrument) + { + MessageBox(DialogWnd, "Instrument cannot be linked to itself!", "Info", MB_OK); + return TRUE; + } + if (linkToInstrument < 16) + { + // compare instruments + for (int u = 0; u < MAX_UNITS; u++) + { + // special case, compare manually + if (SynthObjP->InstrumentValues[SelectedInstrument][u][0] == M_DLL) + { + DLL_valP ds = (DLL_valP)SynthObjP->InstrumentValues[SelectedInstrument][u]; + DLL_valP dl = (DLL_valP)SynthObjP->InstrumentValues[linkToInstrument][u]; + if (ds->pregain != dl->pregain || + ds->dry != dl->dry || + ds->feedback != dl->feedback || + ds->damp != dl->damp || + ds->freq != dl->freq || + ds->depth != dl->depth || + ds->guidelay != dl->guidelay || + ds->synctype != dl->synctype || + ds->leftreverb != dl->leftreverb || + ds->reverb != dl->reverb) + { + MessageBox(DialogWnd, "Instruments cannot be linked as they differ!", "Info", MB_OK); + SendDlgItemMessage(hwndDlg, IDC_INSTRUMENTLINK, CB_SETCURSEL, (WPARAM)16, (LPARAM)0); + return TRUE; + } + } + else if (SynthObjP->InstrumentValues[SelectedInstrument][u][0] == M_GLITCH) + { + GLITCH_valP ds = (GLITCH_valP)SynthObjP->InstrumentValues[SelectedInstrument][u]; + GLITCH_valP dl = (GLITCH_valP)SynthObjP->InstrumentValues[linkToInstrument][u]; + if (ds->active != dl->active || + ds->dry != dl->dry || + ds->dsize != dl->dsize || + ds->dpitch != dl->dpitch || + ds->guidelay != dl->guidelay + ) + { + MessageBox(DialogWnd, "Instruments cannot be linked as they differ!", "Info", MB_OK); + SendDlgItemMessage(hwndDlg, IDC_INSTRUMENTLINK, CB_SETCURSEL, (WPARAM)16, (LPARAM)0); + return TRUE; + } + } + else + { + if (memcmp(SynthObjP->InstrumentValues[SelectedInstrument][u], SynthObjP->InstrumentValues[linkToInstrument][u], MAX_UNIT_SLOTS)) + { + MessageBox(DialogWnd, "Instruments cannot be linked as they differ!", "Info", MB_OK); + SendDlgItemMessage(hwndDlg, IDC_INSTRUMENTLINK, CB_SETCURSEL, (WPARAM)16, (LPARAM)0); + return TRUE; + } + } + } + } + // set link + LinkToInstrument[SelectedInstrument] = linkToInstrument; + } + return TRUE; + } + // Polyphony + else if (((HWND)lParam) == GetDlgItem(hwndDlg, IDC_POLYPHONY)) + { + if (HIWORD(wParam) == CBN_SELCHANGE) + { + SynthObjP->Polyphony = 1+SendDlgItemMessage(hwndDlg, IDC_POLYPHONY, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); + // get values from synth and set gui accordingly ... + UpdateControls(SelectedInstrument); + Go4kVSTi_UpdateDelayTimes(); + Go4kVSTi_ClearDelayLines(); + } + return TRUE; + } + // solo check box + else if (((HWND)lParam) == GetDlgItem(hwndDlg, IDC_SOLO)) + { + if (SendDlgItemMessage(hwndDlg, IDC_SOLO, BM_GETCHECK, 0, 0)==BST_CHECKED) + Go4kVSTi_Solo(SelectedInstrument, true); + else + Go4kVSTi_Solo(SelectedInstrument, false); + return TRUE; + } + else if (((HWND)lParam) == GetDlgItem(hwndDlg, IDC_INSTRUMENT_NAME)) + { + if (HIWORD(wParam) == EN_CHANGE) + { + GetDlgItemText(hwndDlg, IDC_INSTRUMENT_NAME, (LPSTR)&(SynthObjP->InstrumentNames[SelectedInstrument]), 127); + int stsel = SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0); + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"Local"); + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + char instname[128]; + sprintf(instname, "%d: %s", i+1, SynthObjP->InstrumentNames[i]); + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_ADDSTRING, (WPARAM)0, (LPARAM)instname); + } + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"Global"); + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_SETCURSEL, (WPARAM)stsel, (LPARAM)0); + return TRUE; + } + } + // always on top check box + else if (((HWND)lParam) == GetDlgItem(hwndDlg, IDC_ALWAYSONTOP)) + { + if (SendDlgItemMessage(hwndDlg, IDC_ALWAYSONTOP, BM_GETCHECK, 0, 0)==BST_CHECKED) + { + SetWindowPos(hwndDlg, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); + } + else + { + SetWindowPos(hwndDlg, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED); + } + return TRUE; + } + else + { + // global Buttons + switch (LOWORD(wParam)) + { + case IDC_LOAD_PATCH: + { + char lpstrFilter[256] = + {'4','k','l','a','n','g',' ','P','a','t','c','h', 0 , + '*','.','4','k','p', 0, + 0}; + char lpstrFile[4096] = "*.4kp"; + char lpstrDirectory[4096]; + GetCurrentDirectory(4096, lpstrDirectory); + + OPENFILENAME ofn = + { + sizeof(OPENFILENAME), + DialogWnd, + GetModuleHandle(NULL), + lpstrFilter, + NULL, + 0, + 1, + lpstrFile, + 256, + NULL, + 0, + lpstrDirectory, + NULL, + 0, + 0, + 0, + "4kp", + 0, + NULL, + NULL + }; + + if (GetOpenFileName(&ofn)) + { + // reset scroll pos + int oldpos = GetScrollPos(ScrollWnd, SB_VERT); + SCROLLINFO sinfo; + sinfo.cbSize = sizeof(SCROLLINFO); + sinfo.fMask = SIF_POS; + sinfo.nPos = 0; + SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); + ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); + for (int i=0; iInstrumentSignalValid[i] = 0; + } + SynthObjP->GlobalSignalValid = 0; + Go4kVSTi_LoadPatch(ofn.lpstrFile); + //instrument check + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + UpdateSignalCount(i); + LinkToInstrument[i] = 16; + // try setting up instrument links + if (i > 0) + { + for (int j = 0; j < i; j++) + { + int linkToInstrument = j; + // compare instruments + for (int u = 0; u < MAX_UNITS; u++) + { + // special case, compare manually + if (SynthObjP->InstrumentValues[i][u][0] == M_DLL) + { + DLL_valP ds = (DLL_valP)SynthObjP->InstrumentValues[i][u]; + DLL_valP dl = (DLL_valP)SynthObjP->InstrumentValues[j][u]; + if (ds->pregain != dl->pregain || + ds->dry != dl->dry || + ds->feedback != dl->feedback || + ds->damp != dl->damp || + ds->freq != dl->freq || + ds->depth != dl->depth || + ds->guidelay != dl->guidelay || + ds->synctype != dl->synctype || + ds->leftreverb != dl->leftreverb || + ds->reverb != dl->reverb) + { + linkToInstrument = 16; + break; + } + } + else if (SynthObjP->InstrumentValues[i][u][0] == M_GLITCH) + { + GLITCH_valP ds = (GLITCH_valP)SynthObjP->InstrumentValues[i][u]; + GLITCH_valP dl = (GLITCH_valP)SynthObjP->InstrumentValues[j][u]; + if (ds->active != dl->active || + ds->dry != dl->dry || + ds->dsize != dl->dsize || + ds->dpitch != dl->dpitch || + ds->guidelay != dl->guidelay + ) + { + linkToInstrument = 16; + break; + } + } + else + { + if (memcmp(SynthObjP->InstrumentValues[i][u], SynthObjP->InstrumentValues[j][u], MAX_UNIT_SLOTS)) + { + linkToInstrument = 16; + break; + } + } + } + // set link + if (linkToInstrument != 16) + { + LinkToInstrument[i] = linkToInstrument; + break; + } + } + } + } + UpdateControls(SelectedInstrument); + } + return TRUE; + } + case IDC_SAVE_PATCH: + { + char lpstrFilter[256] = + {'4','k','l','a','n','g',' ','P','a','t','c','h', 0 , + '*','.','4','k','p', 0, + 0}; + char lpstrFile[4096] = "*.4kp"; + char lpstrDirectory[4096]; + GetCurrentDirectory(4096, lpstrDirectory); + + OPENFILENAME ofn = + { + sizeof(OPENFILENAME), + DialogWnd, + GetModuleHandle(NULL), + lpstrFilter, + NULL, + 0, + 1, + lpstrFile, + 256, + NULL, + 0, + lpstrDirectory, + NULL, + OFN_OVERWRITEPROMPT, + 0, + 0, + "4kp", + 0, + NULL, + NULL + }; + + if (GetSaveFileName(&ofn)) + { + Go4kVSTi_SavePatch(ofn.lpstrFile); + } + return TRUE; + } + case IDC_RESET_PATCH: + { + if (MessageBox(0, "Do you really want to reset the patch?", "Info", MB_YESNO) == IDYES) + { + // reset scroll pos + int oldpos = GetScrollPos(ScrollWnd, SB_VERT); + SCROLLINFO sinfo; + sinfo.cbSize = sizeof(SCROLLINFO); + sinfo.fMask = SIF_POS; + sinfo.nPos = 0; + SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); + ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); + for (int i=0; iInstrumentSignalValid[i] = 0; + } + SynthObjP->GlobalSignalValid = 0; + Go4kVSTi_ResetPatch(); + UpdateControls(SelectedInstrument); + } + return TRUE; + } + case IDC_LOAD_INSTRUMENT: + { + char lpstrFilter[256] = + {'4','k','l','a','n','g',' ','I','n','s','t','r','u','m','e','n','t', 0 , + '*','.','4','k','i', 0, + 0}; + char lpstrFile[4096] = "*.4ki"; + char lpstrDirectory[4096]; + GetCurrentDirectory(4096, lpstrDirectory); + + OPENFILENAME ofn = + { + sizeof(OPENFILENAME), + DialogWnd, + GetModuleHandle(NULL), + lpstrFilter, + NULL, + 0, + 1, + lpstrFile, + 256, + NULL, + 0, + lpstrDirectory, + NULL, + 0, + 0, + 0, + "4ki", + 0, + NULL, + NULL + }; + + if (GetOpenFileName(&ofn)) + { + // reset scroll pos + int oldpos = GetScrollPos(ScrollWnd, SB_VERT); + SCROLLINFO sinfo; + sinfo.cbSize = sizeof(SCROLLINFO); + sinfo.fMask = SIF_POS; + sinfo.nPos = 0; + SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); + ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); + + UpdateControls(SelectedInstrument); + if (SelectedTab == T_INSTRUMENT) + { + InstrumentScrollPos[SelectedInstrument] = 0; + SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; + Go4kVSTi_LoadInstrument(ofn.lpstrFile, (char)SelectedInstrument); + LinkToInstrument[SelectedInstrument] = 16; + } + else + { + GlobalScrollPos = 0; + SynthObjP->GlobalSignalValid = 0; + Go4kVSTi_LoadInstrument(ofn.lpstrFile, (char)16); + LinkToInstrument[SelectedInstrument] = 16; + } + UpdateControls(SelectedInstrument); + } + return TRUE; + } + case IDC_SAVE_INSTRUMENT: + { + char lpstrFilter[256] = + {'4','k','l','a','n','g',' ','I','n','s','t','r','u','m','e','n','t', 0 , + '*','.','4','k','i', 0, + 0}; + char lpstrFile[4096] = "*.4ki"; + char lpstrDirectory[4096]; + GetCurrentDirectory(4096, lpstrDirectory); + + OPENFILENAME ofn = + { + sizeof(OPENFILENAME), + DialogWnd, + GetModuleHandle(NULL), + lpstrFilter, + NULL, + 0, + 1, + lpstrFile, + 256, + NULL, + 0, + lpstrDirectory, + NULL, + OFN_OVERWRITEPROMPT, + 0, + 0, + "4ki", + 0, + NULL, + NULL + }; + + if (GetSaveFileName(&ofn)) + { + if (SelectedTab == T_INSTRUMENT) + Go4kVSTi_SaveInstrument(ofn.lpstrFile, (char)SelectedInstrument); + else + Go4kVSTi_SaveInstrument(ofn.lpstrFile, (char)16); + } + return TRUE; + } + case IDC_RESET_INSTRUMENT: + { + if (MessageBox(0, "Do you really want to reset the instrument?", "Info", MB_YESNO) == IDYES) + { + if (SelectedTab == T_INSTRUMENT) + { + // reset scroll pos + int oldpos = GetScrollPos(ScrollWnd, SB_VERT); + SCROLLINFO sinfo; + sinfo.cbSize = sizeof(SCROLLINFO); + sinfo.fMask = SIF_POS; + sinfo.nPos = 0; + SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); + ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); + InstrumentScrollPos[SelectedInstrument] = 0; + + SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; + Go4kVSTi_ResetInstrument(SelectedInstrument); + } + else + { + // reset scroll pos + int oldpos = GetScrollPos(ScrollWnd, SB_VERT); + SCROLLINFO sinfo; + sinfo.cbSize = sizeof(SCROLLINFO); + sinfo.fMask = SIF_POS; + sinfo.nPos = 0; + SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); + ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); + GlobalScrollPos = 0; + + SynthObjP->GlobalSignalValid = 0; + Go4kVSTi_ResetGlobal(); + } + UpdateControls(SelectedInstrument); + } + return TRUE; + } + case IDC_UNIT_LOAD: + { + char lpstrFilter[256] = + {'4','k','l','a','n','g',' ','U','n','i','t', 0 , + '*','.','4','k','u', 0, + 0}; + char lpstrFile[4096] = "*.4ku"; + char lpstrDirectory[4096]; + GetCurrentDirectory(4096, lpstrDirectory); + + OPENFILENAME ofn = + { + sizeof(OPENFILENAME), + DialogWnd, + GetModuleHandle(NULL), + lpstrFilter, + NULL, + 0, + 1, + lpstrFile, + 256, + NULL, + 0, + lpstrDirectory, + NULL, + 0, + 0, + 0, + "4ku", + 0, + NULL, + NULL + }; + + if (GetOpenFileName(&ofn)) + { + BYTE* uslot; + if (SelectedTab == T_INSTRUMENT) + { + SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; + uslot = SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit]; + } + else + { + SynthObjP->GlobalSignalValid = 0; + uslot = SynthObjP->GlobalValues[SelectedGUnit]; + } + Go4kVSTi_LoadUnit(ofn.lpstrFile, uslot); + UpdateControls(SelectedInstrument); + } + return TRUE; + } + case IDC_UNIT_SAVE: + { + char lpstrFilter[256] = + {'4','k','l','a','n','g',' ','U','n','i','t', 0 , + '*','.','4','k','u', 0, + 0}; + char lpstrFile[4096] = "*.4ku"; + char lpstrDirectory[4096]; + GetCurrentDirectory(4096, lpstrDirectory); + + OPENFILENAME ofn = + { + sizeof(OPENFILENAME), + DialogWnd, + GetModuleHandle(NULL), + lpstrFilter, + NULL, + 0, + 1, + lpstrFile, + 256, + NULL, + 0, + lpstrDirectory, + NULL, + OFN_OVERWRITEPROMPT, + 0, + 0, + "4ku", + 0, + NULL, + NULL + }; + + if (GetSaveFileName(&ofn)) + { + BYTE* uslot; + if (SelectedTab == T_INSTRUMENT) + { + uslot = SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit]; + } + else + { + uslot = SynthObjP->GlobalValues[SelectedGUnit]; + } + Go4kVSTi_SaveUnit(ofn.lpstrFile, uslot); + } + return TRUE; + } + case IDC_RECORD_BUTTON: + { + EnableWindow(GetDlgItem(DialogWnd, IDC_RECORD_BUTTON), false); + EnableWindow(GetDlgItem(DialogWnd, IDC_STOP_BUTTON), true); + int patternsize = 16; + int psize = SendDlgItemMessage(hwndDlg, IDC_PATTERN_SIZE, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); + if (psize == 0) + patternsize = 8; + if (psize == 2) + patternsize = 32; + if (psize == 3) + patternsize = 64; + float patternquant = 1.0; + int pquant = SendDlgItemMessage(hwndDlg, IDC_PATTERN_QUANT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); + if (pquant == 0) + patternquant = 0.25; + if (pquant == 1) + patternquant = 0.5; + if (pquant == 3) + patternquant = 2.0; + if (pquant == 4) + patternquant = 4.0; + if (pquant == 5) + patternquant = 8.0; + + bool recordingNoise = SendDlgItemMessage(hwndDlg, IDC_RECORDBUSYSIGNAL, BM_GETCHECK, 0, 0) == BST_CHECKED; + + Go4kVSTi_Record(true, recordingNoise, patternsize, patternquant); + return TRUE; + } + case IDC_STOP_BUTTON: + { + EnableWindow(GetDlgItem(DialogWnd, IDC_RECORD_BUTTON), true); + EnableWindow(GetDlgItem(DialogWnd, IDC_STOP_BUTTON), false); + Go4kVSTi_Record(false, false, 0, 0); + return TRUE; + } + case IDC_PANIC: + { + Go4kVSTi_Panic(); + return TRUE; + } + case IDC_UNIT_RESET: + { + if (SelectedTab == T_INSTRUMENT) + Go4kVSTi_InitInstrumentSlot(SelectedInstrument, SelectedIUnit, SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit][0]); + else + Go4kVSTi_InitGlobalSlot(SelectedGUnit, SynthObjP->GlobalValues[SelectedGUnit][0]); + UpdateControls(SelectedInstrument); + return TRUE; + } + case IDC_UNIT_COPY: + { + if (SelectedTab == T_INSTRUMENT) + memcpy(UnitCopyBuffer, SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit], MAX_UNIT_SLOTS); + else + memcpy(UnitCopyBuffer, SynthObjP->GlobalValues[SelectedGUnit], MAX_UNIT_SLOTS); + return TRUE; + } + case IDC_UNIT_PASTE: + { + if (SelectedTab == T_INSTRUMENT) + memcpy(SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit], UnitCopyBuffer, MAX_UNIT_SLOTS); + else + memcpy(SynthObjP->GlobalValues[SelectedGUnit], UnitCopyBuffer, MAX_UNIT_SLOTS); + UpdateControls(SelectedInstrument); + return TRUE; + } + return FALSE; + } + return FALSE; + } + return FALSE; + } +/* case WM_MOUSEWHEEL: + { + if (InitDone) + { + int scrollw = 16*((int)((short)HIWORD(wParam)))/120; + + int oldpos = GetScrollPos(ScrollWnd, SB_VERT); + SetScrollPos(ScrollWnd, SB_VERT, oldpos-scrollw, true); + int newpos = GetScrollPos(ScrollWnd, SB_VERT); + ScrollWindow(ScrollWnd, 0, oldpos - newpos, NULL, NULL); + if (SelectedTab == T_INSTRUMENT) + { + InstrumentScrollPos[SelectedInstrument] = newpos; + } + else if (SelectedTab == T_GLOBAL) + { + GlobalScrollPos = newpos; + } + return TRUE; + } + break; + } +*/ + case WM_NOTIFY: + { + if (((LPNMHDR)lParam)->hwndFrom == GetDlgItem(hwndDlg, IDC_MAINTAB)) + { + if (((LPNMHDR)lParam)->code == TCN_SELCHANGE) + { + int i = TabCtrl_GetCurSel(GetDlgItem(hwndDlg, IDC_MAINTAB)); + TabChanged(i); + return TRUE; + } + } + break; + } + case WM_CLOSE: + { + ShowWindow( DialogWnd, SW_SHOWMINIMIZED ); + return TRUE; + } + case WM_DROPFILES: + { + char DropFileName[4096]; + DragQueryFile((HDROP)wParam, 0, DropFileName, 4096); + std::string filename = DropFileName; + int slen = filename.length(); + bool invalidFile = false; + if (slen > 4) + { + std::string extension = filename.substr(slen-4, 4); + // dropped patch? + if (!extension.compare(".4kp")) + { + // reset scroll pos + int oldpos = GetScrollPos(ScrollWnd, SB_VERT); + SCROLLINFO sinfo; + sinfo.cbSize = sizeof(SCROLLINFO); + sinfo.fMask = SIF_POS; + sinfo.nPos = 0; + SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); + ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); + for (int i=0; iInstrumentSignalValid[i] = 0; + } + SynthObjP->GlobalSignalValid = 0; + Go4kVSTi_LoadPatch(DropFileName); + //instrument check + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + UpdateSignalCount(i); + LinkToInstrument[i] = 16; + // try setting up instrument links + if (i > 0) + { + for (int j = 0; j < i; j++) + { + int linkToInstrument = j; + // compare instruments + for (int u = 0; u < MAX_UNITS; u++) + { + // special case, compare manually + if (SynthObjP->InstrumentValues[i][u][0] == M_DLL) + { + DLL_valP ds = (DLL_valP)SynthObjP->InstrumentValues[i][u]; + DLL_valP dl = (DLL_valP)SynthObjP->InstrumentValues[j][u]; + if (ds->pregain != dl->pregain || + ds->dry != dl->dry || + ds->feedback != dl->feedback || + ds->damp != dl->damp || + ds->freq != dl->freq || + ds->depth != dl->depth || + ds->guidelay != dl->guidelay || + ds->synctype != dl->synctype || + ds->leftreverb != dl->leftreverb || + ds->reverb != dl->reverb) + { + linkToInstrument = 16; + break; + } + } + else if (SynthObjP->InstrumentValues[i][u][0] == M_GLITCH) + { + GLITCH_valP ds = (GLITCH_valP)SynthObjP->InstrumentValues[i][u]; + GLITCH_valP dl = (GLITCH_valP)SynthObjP->InstrumentValues[j][u]; + if (ds->active != dl->active || + ds->dry != dl->dry || + ds->dsize != dl->dsize || + ds->dpitch != dl->dpitch || + ds->guidelay != dl->guidelay + ) + { + linkToInstrument = 16; + break; + } + } + else + { + if (memcmp(SynthObjP->InstrumentValues[i][u], SynthObjP->InstrumentValues[j][u], MAX_UNIT_SLOTS)) + { + linkToInstrument = 16; + break; + } + } + } + // set link + if (linkToInstrument != 16) + { + LinkToInstrument[i] = linkToInstrument; + break; + } + } + } + } + UpdateControls(SelectedInstrument); + } + // dropped instrument? + else if (!extension.compare(".4ki")) + { + // reset scroll pos + int oldpos = GetScrollPos(ScrollWnd, SB_VERT); + SCROLLINFO sinfo; + sinfo.cbSize = sizeof(SCROLLINFO); + sinfo.fMask = SIF_POS; + sinfo.nPos = 0; + SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); + ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); + + UpdateControls(SelectedInstrument); + if (SelectedTab == T_INSTRUMENT) + { + InstrumentScrollPos[SelectedInstrument] = 0; + SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; + Go4kVSTi_LoadInstrument(DropFileName, (char)SelectedInstrument); + LinkToInstrument[SelectedInstrument] = 16; + } + else + { + GlobalScrollPos = 0; + SynthObjP->GlobalSignalValid = 0; + Go4kVSTi_LoadInstrument(DropFileName, (char)16); + } + UpdateControls(SelectedInstrument); + } + // dropped shit! + else + { + invalidFile = true; + } + } + else + { + invalidFile = true; + } + if (invalidFile) + { + MessageBox(0,DropFileName,"Only patches(4kp) and instruments(4ki) allowed!",MB_OK); + } + return TRUE; + } + } + return FALSE; +} + +// CB for the tabs +BOOL CALLBACK ModuleSettingsDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_COMMAND: + return ButtonPressed(wParam, lParam); + + case WM_HSCROLL: + return ScrollbarChanged(hwndDlg, wParam, lParam); + } + return FALSE; +} + +// CB for the tabs +BOOL CALLBACK ScrollDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_VSCROLL: + { + RECT rect; + GetWindowRect(ScrollWnd, &rect); + int pagesize = 1+rect.bottom - rect.top; + int linesize = 16; + int oldpos = GetScrollPos(ScrollWnd, SB_VERT); + switch (LOWORD(wParam)) + { + + case SB_BOTTOM: // Scrolls to the lower right. + break; + case SB_ENDSCROLL: // Ends scroll. + break; + case SB_LINEDOWN: // Scrolls one line down. + SetScrollPos(ScrollWnd, SB_VERT, oldpos+linesize, true); + break; + case SB_LINEUP: // Scrolls one line up. + SetScrollPos(ScrollWnd, SB_VERT, oldpos-linesize, true); + break; + case SB_PAGEDOWN: // Scrolls one page down. + SetScrollPos(ScrollWnd, SB_VERT, oldpos+pagesize, true); + break; + case SB_PAGEUP: // Scrolls one page up. + SetScrollPos(ScrollWnd, SB_VERT, oldpos-pagesize, true); + break; + case SB_THUMBPOSITION: // The user has dragged the scroll box (thumb) and released the mouse button. The high-order word indicates the position of the scroll box at the end of the drag operation. + case SB_THUMBTRACK: // The user is dragging the scroll box. This message is sent repeatedly until the user releases the mouse button. The high-order word indicates the position that the scroll box has been dragged to. + SetScrollPos(ScrollWnd, SB_VERT, HIWORD(wParam), true); + break; + case SB_TOP: // Scrolls to the upper left. + break; + } + int newpos = GetScrollPos(ScrollWnd, SB_VERT); + ScrollWindow(ScrollWnd, 0, oldpos - newpos, NULL, NULL); + + if (SelectedTab == T_INSTRUMENT) + { + InstrumentScrollPos[SelectedInstrument] = newpos; + } + else if (SelectedTab == T_GLOBAL) + { + GlobalScrollPos = newpos; + } + return TRUE; + } +/* case WM_MOUSEWHEEL: + { + if (InitDone) + { + int scrollw = 16*((int)((short)HIWORD(wParam)))/120; + + int oldpos = GetScrollPos(ScrollWnd, SB_VERT); + SetScrollPos(ScrollWnd, SB_VERT, oldpos-scrollw, true); + int newpos = GetScrollPos(ScrollWnd, SB_VERT); + ScrollWindow(ScrollWnd, 0, oldpos - newpos, NULL, NULL); + if (SelectedTab == T_INSTRUMENT) + { + InstrumentScrollPos[SelectedInstrument] = newpos; + } + else if (SelectedTab == T_GLOBAL) + { + GlobalScrollPos = newpos; + } + return TRUE; + } + break; + } +*/ + default: + break; + } + return FALSE; +} + +// CB for the tabs +BOOL CALLBACK StackDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_COMMAND: + return StackButtonPressed(wParam); + } + return FALSE; +} + +// CB for the set dialog +BOOL CALLBACK SetDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch(message) + { + case WM_INITDIALOG: + { + for (int i = 1; i < NUM_MODULES; i++) + { + if (SelectedTab == T_INSTRUMENT && i == M_ACC) + SendDlgItemMessage(hwndDlg, IDC_SET_UNIT, CB_ADDSTRING, (WPARAM)0, (LPARAM)""); + else + SendDlgItemMessage(hwndDlg, IDC_SET_UNIT, CB_ADDSTRING, (WPARAM)0, (LPARAM)(UnitName[i])); + } + SendDlgItemMessage(hwndDlg, IDC_SET_UNIT, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); + SetUnit = 1; + return TRUE; + } + case WM_COMMAND: + { + if (((HWND)lParam) == GetDlgItem(hwndDlg, IDC_SET_UNIT)) + { + if (HIWORD(wParam) == CBN_SELCHANGE) + { + SetUnit = 1+SendDlgItemMessage(hwndDlg, IDC_SET_UNIT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); + } + return TRUE; + } + switch(LOWORD(wParam)) + { + case IDOK: + if (SelectedTab == T_INSTRUMENT && SetUnit == M_ACC) + EndDialog(hwndDlg, IDCANCEL); + else + EndDialog(hwndDlg, IDOK); + break; + case IDCANCEL: + EndDialog(hwndDlg, IDCANCEL); + break; + } + break; + } + default: + return FALSE; + } + return TRUE; +} + +VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) +{ + for (int i = 0; i < 16; i++) + UpdateVoiceDisplay(i); +} + +VOID CALLBACK BackupTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) +{ + Go4kVSTi_SavePatch("C:\\4klang.4kp"); +} + +void Go4kVSTiGUI_Create(HINSTANCE hInst) +{ + timer = 1; + backupTimer = 2; + timerID = 0; + backupTimerID = 0; + DialogWnd = NULL; + SelectedIUnit = 0; + SelectedGUnit = 0; + SelectedTab = T_INSTRUMENT; + SelectedInstrument = 0; + SetUnit = -1; + hInstance = hInst; + InitCommonControls(); + DialogWnd = CreateDialog(hInst,MAKEINTRESOURCE(IDD_GO4KVSTIDIALOG),NULL,(DLGPROC)MainDialogProc); + + // tab dialogs + HWND tmp = GetDlgItem(DialogWnd, IDC_MODULE_SETTINGS); + for (int i = 0; i < NUM_MODULES; i++) + { + ModuleWnd[M_NONE+i] = CreateDialog(hInst,MAKEINTRESOURCE(IDD_NONE+i),tmp,(DLGPROC)ModuleSettingsDialogProc); + MoveWindow(ModuleWnd[M_NONE+i], 7, 43, 450, 280, true); + ShowWindow(ModuleWnd[M_NONE+i], SW_HIDE); + } + + tmp = GetDlgItem(DialogWnd, IDC_MAINTAB); + ScrollWnd = CreateDialog(hInst,MAKEINTRESOURCE(IDD_SCROLLWINDOW),tmp,(DLGPROC)ScrollDialogProc); + MoveWindow(ScrollWnd, 3, 23, 392, 410, true); + ShowWindow(ScrollWnd, SW_SHOW); + + tmp = ScrollWnd; + RECT rect; + // instrument stack dialog + TabWnd[T_INSTRUMENT] = CreateDialogA(hInst,MAKEINTRESOURCE(IDD_INSTRUMENT_STACK),tmp,(DLGPROC)StackDialogProc); + GetWindowRect(TabWnd[T_INSTRUMENT], &rect); + int virtualsizey = rect.bottom - rect.top; + MoveWindow(TabWnd[T_INSTRUMENT], 5, 0, 365, virtualsizey, true); + ShowWindow(TabWnd[T_INSTRUMENT], SW_SHOW); + EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], IDC_ISTACK_UNIT1), false); + ShowWindow(GetDlgItem(DialogWnd, IDC_ISTACK_VALID), true); + + // global stack dialog + TabWnd[T_GLOBAL] = CreateDialog(hInst,MAKEINTRESOURCE(IDD_GLOBAL_STACK),tmp,(DLGPROC)StackDialogProc); + MoveWindow(TabWnd[T_GLOBAL], 5, 0, 365, virtualsizey, true); + ShowWindow(TabWnd[T_GLOBAL], SW_HIDE); + EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], IDC_GSTACK_UNIT1), false); + ShowWindow(GetDlgItem(DialogWnd, IDC_GSTACK_VALID), false); + + // setup scrollwindow + GetWindowRect(ScrollWnd, &rect); + int sizey = rect.bottom - rect.top; + SCROLLINFO sinfo; + sinfo.cbSize = sizeof(SCROLLINFO); + sinfo.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; + sinfo.nPos = 0; + sinfo.nPage = sizey; + sinfo.nMin = 0; + sinfo.nMax = virtualsizey+2; + SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); + + for (int i=0; iInstrumentValues[selectedInstrument][selectedIUnit][0] == M_DLL) + { + DLL_valP ds = (DLL_valP)SynthObjP->InstrumentValues[selectedInstrument][selectedIUnit]; + DLL_valP dl = (DLL_valP)SynthObjP->InstrumentValues[i][selectedIUnit]; + dl->id = ds->id; + dl->pregain = ds->pregain; + dl->dry = ds->dry; + dl->feedback = ds->feedback; + dl->damp = ds->damp; + dl->freq = ds->freq; + dl->depth = ds->depth; + dl->guidelay = ds->guidelay; + dl->synctype = ds->synctype; + dl->leftreverb = ds->leftreverb; + dl->reverb = ds->reverb; + } + else if (SynthObjP->InstrumentValues[selectedInstrument][selectedIUnit][0] == M_GLITCH) + { + GLITCH_valP ds = (GLITCH_valP)SynthObjP->InstrumentValues[selectedInstrument][selectedIUnit]; + GLITCH_valP dl = (GLITCH_valP)SynthObjP->InstrumentValues[i][selectedIUnit]; + dl->id = ds->id; + dl->active = ds->active; + dl->dry = ds->dry; + dl->dsize = ds->dsize; + dl->dpitch = ds->dpitch; + dl->guidelay = ds->guidelay; + } + else + { + memcpy(SynthObjP->InstrumentValues[i][selectedIUnit], + SynthObjP->InstrumentValues[selectedInstrument][selectedIUnit], + MAX_UNIT_SLOTS); + } + } + } + Go4kVSTi_UpdateDelayTimes(); +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +// // +// Button Events // +// // +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +void SetButtonParams(int uid, BYTE* val, WPARAM id, LPARAM lParam) +{ + DWORD res; + if (uid == M_VCO) + { + VCO_valP v = (VCO_valP)val; + ButtonGroupChanged(IDC_VCO_SINE, IDC_VCO_GATE, LOWORD(id), M_VCO, res); + if (res) + { + v->flags = 0; + if (SendDlgItemMessage(ModuleWnd[M_VCO], IDC_VCO_LFO, BM_GETCHECK, 0, 0)==BST_CHECKED) + v->flags |= VCO_LFO; + if (SendDlgItemMessage(ModuleWnd[M_VCO], IDC_VCO_STEREO, BM_GETCHECK, 0, 0)==BST_CHECKED) + v->flags |= VCO_STEREO; + + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRANSPOSE), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRANSPOSE_VAL), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_DETUNE), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_DETUNE_VAL), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PHASE), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PHASE_VAL), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR_VAL), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SHAPE), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SHAPE_VAL), true); + EnableButtonGroup(IDC_VCO_GATE1, IDC_VCO_GATE16, M_VCO, false); + if (IDC_VCO_GATE == res) + { + v->flags |= VCO_GATE; + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR_VAL), false); + EnableButtonGroup(IDC_VCO_GATE1, IDC_VCO_GATE16, M_VCO, true); + // adjust gate bits stored in color and shape with current selection of checkboxes + WORD gatebits; + GetCheckboxGroupBitmask(IDC_VCO_GATE1, IDC_VCO_GATE16, IDC_VCO_GATE1, M_VCO, gatebits, res); + v->gate = gatebits & 0xff; + v->color = (gatebits >> 8) & 0xff; + // adjust color and shape sliders + InitSliderCenter(ModuleWnd[M_VCO], IDC_VCO_COLOR, 0, 128, v->color); + } + else + { + // set color at least to valid range + if (v->color > 128) v->color = 128; + InitSliderCenter(ModuleWnd[M_VCO], IDC_VCO_COLOR, 0, 128, v->color); + } + if (IDC_VCO_SINE == res) + { + v->flags |= VCO_SINE; + } + if (IDC_VCO_TRISAW == res) + { + v->flags |= VCO_TRISAW; + } + if (IDC_VCO_PULSE == res) + { + v->flags |= VCO_PULSE; + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SHAPE), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SHAPE_VAL), false); + } + if (IDC_VCO_NOISE == res) + { + v->flags |= VCO_NOISE; + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRANSPOSE), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRANSPOSE_VAL), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_DETUNE), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_DETUNE_VAL), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PHASE), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PHASE_VAL), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR_VAL), false); + } + } + if (LOWORD(id) == IDC_VCO_LFO) + { + if (SendDlgItemMessage(ModuleWnd[M_VCO], IDC_VCO_LFO, BM_GETCHECK, 0, 0)==BST_CHECKED) + v->flags |= VCO_LFO; + else + v->flags &= ~VCO_LFO; + } + if (LOWORD(id) == IDC_VCO_STEREO) + { + if (SendDlgItemMessage(ModuleWnd[M_VCO], IDC_VCO_STEREO, BM_GETCHECK, 0, 0)==BST_CHECKED) + v->flags |= VCO_STEREO; + else + v->flags &= ~VCO_STEREO; + } + // gate bits changed? + WORD gatebits; + GetCheckboxGroupBitmask(IDC_VCO_GATE1, IDC_VCO_GATE16, LOWORD(id), M_VCO, gatebits, res); + if (res) + { + v->gate = gatebits & 0xff; + v->color = (gatebits >> 8) & 0xff; + // adjust color slider + InitSliderCenter(ModuleWnd[M_VCO], IDC_VCO_COLOR, 0, 128, v->color); + } + // update signalcount + UpdateSignalCount(SelectedInstrument); + } + else if (uid == M_VCF) + { + VCF_valP v = (VCF_valP)val; + ButtonGroupChanged(IDC_VCF_LOW, IDC_VCF_ALL, LOWORD(id), M_VCF, res); + if (res) + { + int stereo = v->type & VCF_STEREO; + if (res == IDC_VCF_LOW) + v->type = stereo | VCF_LOWPASS; + else if (res == IDC_VCF_HIGH) + v->type = stereo | VCF_HIGHPASS; + else if (res == IDC_VCF_BAND) + v->type = stereo | VCF_BANDPASS; + else if (res == IDC_VCF_NOTCH) + v->type = stereo | VCF_BANDSTOP; + else if (res == IDC_VCF_PEAK) + v->type = stereo | VCF_PEAK; + else if (res == IDC_VCF_ALL) + v->type = stereo | VCF_ALLPASS; + } + if (LOWORD(id) == IDC_VCF_STEREO) + { + if (SendDlgItemMessage(ModuleWnd[M_VCF], IDC_VCF_STEREO, BM_GETCHECK, 0, 0)==BST_CHECKED) + v->type |= VCF_STEREO; + else + v->type &= ~VCF_STEREO; + } + // update signalcount + UpdateSignalCount(SelectedInstrument); + } + else if (uid == M_DST) + { + DST_valP v = (DST_valP)val; + if (LOWORD(id) == IDC_DST_STEREO) + { + if (SendDlgItemMessage(ModuleWnd[M_DST], IDC_DST_STEREO, BM_GETCHECK, 0, 0)==BST_CHECKED) + v->stereo = VCF_STEREO; + else + v->stereo = 0; + } + // update signalcount + UpdateSignalCount(SelectedInstrument); + } + else if (uid == M_DLL) + { + DLL_valP v = (DLL_valP)val; + ButtonGroupChanged(IDC_DLL_DELAY, IDC_DLL_REVERB, LOWORD(id), M_DLL, res); + if (res) + { + if (res == IDC_DLL_DELAY) + { + v->reverb = 0; + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_LEFTREVERB), SW_HIDE); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), SW_SHOW); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), SW_SHOW); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOSYNC), SW_SHOW); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_BPMSYNC), SW_SHOW); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOTESYNC), SW_SHOW); + } + else if (res == IDC_DLL_REVERB) + { + v->reverb = 1; + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_LEFTREVERB), SW_SHOW); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), SW_HIDE); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), SW_HIDE); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOSYNC), SW_HIDE); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_BPMSYNC), SW_HIDE); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOTESYNC), SW_HIDE); + } + } + ButtonGroupChanged(IDC_DLL_NOSYNC, IDC_DLL_NOTESYNC, LOWORD(id), M_DLL, res); + if (res) + { + if (res == IDC_DLL_NOSYNC) + { + v->synctype = 0; + EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), true); + EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), true); + } + else if (res == IDC_DLL_BPMSYNC) + { + v->synctype = 1; + EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), true); + EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), true); + } + else if (res == IDC_DLL_NOTESYNC) + { + v->synctype = 2; + EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), false); + EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), false); + } + } + if (LOWORD(id) == IDC_DLL_LEFTREVERB) + { + if (SendDlgItemMessage(ModuleWnd[M_DLL], IDC_DLL_LEFTREVERB, BM_GETCHECK, 0, 0)==BST_CHECKED) + v->leftreverb = 1; + else + v->leftreverb = 0; + } + UpdateDelayTimes(v); + } + else if (uid == M_FOP) + { + // invalidate stack first + if (SelectedTab == T_INSTRUMENT) + { + SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; + } + else + { + SynthObjP->GlobalSignalValid = 0; + } + FOP_valP v = (FOP_valP)val; + ButtonGroupChanged(IDC_FOP_POP, IDC_FOP_MULP2, LOWORD(id), M_FOP, res); + if (res) + { + v->flags = 1 + res - IDC_FOP_POP; + } + // update signalcount + UpdateSignalCount(SelectedInstrument); + } + else if (uid == M_FST) + { + FST_valP v = (FST_valP)val; + // changed instrument + if (LOWORD(id) == IDC_FST_DESTINATION_INSTRUMENT) + { + int inst = SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0) - 1; + if (v->dest_stack != inst) + { + v->dest_stack = inst; + + // fill unit combobox with current units and set to nothing + BYTE *units; + if (SelectedTab == T_INSTRUMENT) + { + if (v->dest_stack == -1) + units = SynthObjP->InstrumentValues[SelectedInstrument][0]; + else if (v->dest_stack == MAX_INSTRUMENTS) + units = SynthObjP->GlobalValues[0]; + else + units = SynthObjP->InstrumentValues[v->dest_stack][0]; + } + else + { + if (v->dest_stack == -1) + units = SynthObjP->GlobalValues[0]; + else if (v->dest_stack == MAX_INSTRUMENTS) + units = SynthObjP->GlobalValues[0]; + else + units = SynthObjP->InstrumentValues[v->dest_stack][0]; + } + + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0); + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"- Nothing Selected -"); + for (int i = 0; i < MAX_UNITS; i++) + { + char unitname[128], unitname2[128]; + sprintf(unitname, "%d: %s", i+1, GetUnitString(&units[i*MAX_UNIT_SLOTS], unitname2)); + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_ADDSTRING, (WPARAM)0, (LPARAM)unitname); + } + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); + v->dest_unit = -1; + + // set slot combobox to nothing and disable + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0); + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"- Nothing Selected -"); + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); + EnableWindow(GetDlgItem(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT), false); + v->dest_slot = -1; + v->dest_id = -1; + } + } + else if (LOWORD(id) == IDC_FST_DESTINATION_UNIT) + { + int unit = SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0) - 1; + if (v->dest_unit != unit) + { + v->dest_unit = unit; + + // fill slot combobox with current targets and set to nothing + BYTE *slots; + if (SelectedTab == T_INSTRUMENT) + { + if (v->dest_stack == -1) + slots = SynthObjP->InstrumentValues[SelectedInstrument][unit]; + else if (v->dest_stack == MAX_INSTRUMENTS) + slots = SynthObjP->GlobalValues[unit]; + else + slots = SynthObjP->InstrumentValues[v->dest_stack][unit]; + } + else + { + if (v->dest_stack == -1) + slots = SynthObjP->GlobalValues[unit]; + else if (v->dest_stack == MAX_INSTRUMENTS) + slots = SynthObjP->GlobalValues[unit]; + else + slots = SynthObjP->InstrumentValues[v->dest_stack][unit]; + } + + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0); + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"- Nothing Selected -"); + for (int i = 0; i < 8; i++) + { + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_ADDSTRING, (WPARAM)0, (LPARAM)UnitModulationTargetNames[slots[0]][i]); + } + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); + v->dest_slot = -1; + v->dest_id = -1; + + if (v->dest_unit == -1) + EnableWindow(GetDlgItem(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT), false); + else + EnableWindow(GetDlgItem(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT), true); + } + } + else if (LOWORD(id) == IDC_FST_DESTINATION_SLOT) + { + int slot = SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0) - 1; + v->dest_slot = slot; + + // fill slot combobox with current targets and set to nothing + BYTE *slots; + if (SelectedTab == T_INSTRUMENT) + { + if (v->dest_stack == -1) + slots = SynthObjP->InstrumentValues[SelectedInstrument][v->dest_unit]; + else if (v->dest_stack == MAX_INSTRUMENTS) + slots = SynthObjP->GlobalValues[v->dest_unit]; + else + slots = SynthObjP->InstrumentValues[v->dest_stack][v->dest_unit]; + } + else + { + if (v->dest_stack == -1) + slots = SynthObjP->GlobalValues[v->dest_unit]; + else if (v->dest_stack == MAX_INSTRUMENTS) + slots = SynthObjP->GlobalValues[v->dest_unit]; + else + slots = SynthObjP->InstrumentValues[v->dest_stack][v->dest_unit]; + } + + v->dest_id = slots[0]; + } + ButtonGroupChanged(IDC_FST_SET, IDC_FST_MUL, LOWORD(id), M_FST, res); + if (res) + { + int pop = v->type & FST_POP; + if (res == IDC_FST_SET) + v->type = FST_SET; + else if (res == IDC_FST_ADD) + v->type = FST_ADD; + else if (res == IDC_FST_MUL) + v->type = FST_MUL; + if (pop) + v->type |= FST_POP; + } + if (LOWORD(id) == IDC_FST_POP) + { + if (SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_POP, BM_GETCHECK, 0, 0)==BST_CHECKED) + v->type |= FST_POP; + else + v->type &= ~FST_POP; + } + // update signalcount + UpdateSignalCount(SelectedInstrument); + } + else if (uid == M_ACC) + { + ACC_valP v = (ACC_valP)val; + ButtonGroupChanged(IDC_ACC_OUT, IDC_ACC_AUX, LOWORD(id), M_ACC, res); + if (res) + { + if (res == IDC_ACC_OUT) + v->flags = ACC_OUT; + else + v->flags = ACC_AUX; + } + } +} + +bool ButtonPressed(WPARAM id, LPARAM lParam) +{ + // instrument tab is active + if (SelectedTab == T_INSTRUMENT) + { + UnitID uid = (UnitID)(SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit][0]); + SetButtonParams(uid, SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit], id, lParam); + char unitname[128]; + GetUnitString(SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit], unitname); + SetWindowText(GetDlgItem(TabWnd[T_INSTRUMENT], IDC_ISTACK_UNIT1+SelectedIUnit*6), unitname); + LinkInstrumentUnit(SelectedInstrument, SelectedIUnit); + } + else if (SelectedTab == T_GLOBAL) + { + UnitID uid = (UnitID)(SynthObjP->GlobalValues[SelectedGUnit][0]); + SetButtonParams(uid, SynthObjP->GlobalValues[SelectedGUnit], id, lParam); + char unitname[128]; + GetUnitString(SynthObjP->GlobalValues[SelectedGUnit], unitname); + SetWindowText(GetDlgItem(TabWnd[T_GLOBAL], IDC_GSTACK_UNIT1+SelectedGUnit*6), unitname); + } + return TRUE; +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +// // +// Scrollbar Events // +// // +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +void SetSliderParams(int uid, BYTE* val, LPARAM lParam) +{ + if (uid == M_ENV) + { + ENV_valP v = (ENV_valP)val; + // attack + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_ENV_ATTACK)) + { + UpdateSliderValue(IDC_ENV_ATTACK, v->attac); + } + //decay + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_ENV_DECAY)) + { + UpdateSliderValue(IDC_ENV_DECAY, v->decay); + } + // sustain + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_ENV_SUSTAIN)) + { + UpdateSliderValue(IDC_ENV_SUSTAIN, v->sustain); + } + // release + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_ENV_RELEASE)) + { + UpdateSliderValue(IDC_ENV_RELEASE, v->release); + } + // gain + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_ENV_GAIN)) + { + UpdateSliderValue(IDC_ENV_GAIN, v->gain); + } + } + else if (uid == M_VCO) + { + VCO_valP v = (VCO_valP)val; + // transpose + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_VCO_TRANSPOSE)) + { + UpdateSliderValueCenter(IDC_VCO_TRANSPOSE, v->transpose); + } + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_VCO_DETUNE)) + { + UpdateSliderValueCenter(IDC_VCO_DETUNE, v->detune); + } + // phaseofs + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_VCO_PHASE)) + { + UpdateSliderValue(IDC_VCO_PHASE, v->phaseofs); + } + // color + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_VCO_COLOR)) + { + UpdateSliderValueCenter(IDC_VCO_COLOR, v->color); + // gate bits + WORD gatebits = ((WORD)v->color << 8) | (WORD)v->gate ; + SetCheckboxGroupBitmask(IDC_VCO_GATE1, IDC_VCO_GATE16, M_VCO, gatebits); + } + // shape + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_VCO_SHAPE)) + { + v->shape = SendMessage(GetDlgItem(ModuleWnd[uid], IDC_VCO_SHAPE), TBM_GETPOS, 0, 0); + if (v->shape == 0) + v->shape = 1; + if (v->shape == 128) + v->shape = 127; + sprintf(SliderValTxt, "%d", v->shape-64); + SetWindowText(GetDlgItem(ModuleWnd[uid], IDC_VCO_SHAPE_VAL), SliderValTxt); + } + // gain + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_VCO_GAIN)) + { + UpdateSliderValue(IDC_VCO_GAIN, v->gain); + } + } + else if (uid == M_VCF) + { + VCF_valP v = (VCF_valP)val; + // frequency + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_VCF_FREQUENCY)) + { + UpdateSliderValue(IDC_VCF_FREQUENCY, v->freq); + } + // resonance + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_VCF_RESONANCE)) + { + UpdateSliderValue(IDC_VCF_RESONANCE, v->res); + } + } + else if (uid == M_DST) + { + DST_valP v = (DST_valP)val; + // drive + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DST_DRIVE)) + { + v->drive = SendMessage(GetDlgItem(ModuleWnd[uid], IDC_DST_DRIVE), TBM_GETPOS, 0, 0); + if (v->drive == 0) + v->drive = 1; + if (v->drive == 128) + v->drive = 127; + sprintf(SliderValTxt, "%d", v->drive-64); + SetWindowText(GetDlgItem(ModuleWnd[uid], IDC_DST_DRIVE_VAL), SliderValTxt); + } + // snhfreq + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DST_SNH)) + { + UpdateSliderValue(IDC_DST_SNH, v->snhfreq); + } + } + else if (uid == M_DLL) + { + DLL_valP v = (DLL_valP)val; + // pregain + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DLL_PREGAIN)) + { + UpdateSliderValue(IDC_DLL_PREGAIN, v->pregain); + } + // dry + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DLL_DRY)) + { + UpdateSliderValue(IDC_DLL_DRY, v->dry); + } + // feedback + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DLL_FEEDBACK)) + { + UpdateSliderValue(IDC_DLL_FEEDBACK, v->feedback); + } + // frequency + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DLL_FREQUENCY)) + { + UpdateSliderValue(IDC_DLL_FREQUENCY, v->freq); + } + // depth + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DLL_DEPTH)) + { + UpdateSliderValue(IDC_DLL_DEPTH, v->depth); + } + // damp + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DLL_DAMP)) + { + UpdateSliderValue(IDC_DLL_DAMP, v->damp); + } + // delay + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_DLL_DTIME)) + { + v->guidelay = SendMessage(GetDlgItem(ModuleWnd[uid], IDC_DLL_DTIME), TBM_GETPOS, 0, 0); + UpdateDelayTimes(v); + } + } + else if (uid == M_FST) + { + FST_valP v = (FST_valP)val; + // gain + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_FST_AMOUNT)) + { + UpdateSliderValueCenter2(IDC_FST_AMOUNT, v->amount); + } + } + else if (uid == M_PAN) + { + PAN_valP v = (PAN_valP)val; + // panning + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_PAN_PANNING)) + { + UpdateSliderValueCenter(IDC_PAN_PANNING, v->panning); + } + } + else if (uid == M_OUT) + { + OUT_valP v = (OUT_valP)val; + // gain + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_OUT_GAIN)) + { + UpdateSliderValue(IDC_OUT_GAIN, v->gain); + } + // auxsend + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_OUT_AUXSEND)) + { + UpdateSliderValue(IDC_OUT_AUXSEND, v->auxsend); + } + } + else if (uid == M_FLD) + { + FLD_valP v = (FLD_valP)val; + // panning + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_FLD_VALUE)) + { + UpdateSliderValueCenter(IDC_FLD_VALUE, v->value); + } + } + else if (uid == M_GLITCH) + { + GLITCH_valP v = (GLITCH_valP)val; + // active + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_GLITCH_ACTIVE)) + { + UpdateSliderValue(IDC_GLITCH_ACTIVE, v->active); + } + // dry + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_GLITCH_DRY)) + { + UpdateSliderValue(IDC_GLITCH_DRY, v->dry); + } + // delta size + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_GLITCH_DSIZE)) + { + UpdateSliderValue(IDC_GLITCH_DSIZE, v->dsize); + } + // delta pitch + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_GLITCH_DPITCH)) + { + UpdateSliderValue(IDC_GLITCH_DPITCH, v->dpitch); + } + // delay + if ((HWND)lParam == GetDlgItem(ModuleWnd[uid], IDC_GLITCH_DTIME)) + { + v->guidelay = SendMessage(GetDlgItem(ModuleWnd[uid], IDC_GLITCH_DTIME), TBM_GETPOS, 0, 0); + UpdateDelayTimes(v); + } + } +} + +bool ScrollbarChanged(HWND hwndDlg, WPARAM wParam, LPARAM lParam) +{ + // instrument tab is active + if (SelectedTab == T_INSTRUMENT) + { + UnitID uid = (UnitID)(SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit][0]); + SetSliderParams(uid, SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit], lParam); + char unitname[128]; + GetUnitString(SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit], unitname); + SetWindowText(GetDlgItem(TabWnd[T_INSTRUMENT], IDC_ISTACK_UNIT1+SelectedIUnit*6), unitname); + LinkInstrumentUnit(SelectedInstrument, SelectedIUnit); + } + else if (SelectedTab == T_GLOBAL) + { + UnitID uid = (UnitID)(SynthObjP->GlobalValues[SelectedGUnit][0]); + SetSliderParams(uid, SynthObjP->GlobalValues[SelectedGUnit], lParam); + char unitname[128]; + GetUnitString(SynthObjP->GlobalValues[SelectedGUnit], unitname); + SetWindowText(GetDlgItem(TabWnd[T_GLOBAL], IDC_GSTACK_UNIT1+SelectedGUnit*6), unitname); + } + return TRUE; +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +// // +// Stack Button Events // +// // +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +void CheckModulations(int unit1, int unit2 = -1) +{ + // a instrument stack changed + if (SelectedTab == T_INSTRUMENT) + { + // look in all instruments if a store unit had its target on one of the changed units + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + for (int u = 0; u < MAX_UNITS; u++) + { + if (SynthObjP->InstrumentValues[i][u][0] == M_FST) + { + FST_valP v = (FST_valP)(SynthObjP->InstrumentValues[i][u]); + // the store points to global, so skip + if (v->dest_stack == MAX_INSTRUMENTS) + continue; + + int target_inst; + if (v->dest_stack == -1) + target_inst = i; + else + target_inst = v->dest_stack; + + // if the store points to the current instrument + if (target_inst == SelectedInstrument) + { + // a up/down process + if (unit2 != -1) + { + // if the target unit was unit1 or unit2 realign target unit + if (v->dest_unit == unit1) + { + v->dest_unit = unit2; + } + else if (v->dest_unit == unit2) + { + v->dest_unit = unit1; + } + } + // a set/reset process + else + { + // if the target unit was unit1 reset store + if (v->dest_unit == unit1) + { + char text[128]; + sprintf(text, "Instrument %d had a modulation target in the changed unit\nIt's no longer valid and will be reset", i); + MessageBox(DialogWnd, text, "Info", MB_OK); + v->dest_unit = -1; + v->dest_slot = -1; + v->dest_id = -1; + } + } + } + } + } + } + // now check the global slots + for (int u = 0; u < MAX_UNITS; u++) + { + if (SynthObjP->GlobalValues[u][0] == M_FST) + { + FST_valP v = (FST_valP)(SynthObjP->GlobalValues[u]); + // the store points to global, so skip + if (v->dest_stack == -1 || v->dest_stack == MAX_INSTRUMENTS) + continue; + + // if the store points to the current instrument + if (v->dest_stack == SelectedInstrument) + { + // a up/down process + if (unit2 != -1) + { + // if the target unit was unit1 or unit2 realign target unit + if (v->dest_unit == unit1) + { + v->dest_unit = unit2; + } + else if (v->dest_unit == unit2) + { + v->dest_unit = unit1; + } + } + // a set/reset process + else + { + // if the target unit was unit1 reset store + if (v->dest_unit == unit1) + { + char text[128]; + sprintf(text, "Global had a modulation target in the changed unit\nIt's no longer valid and will be reset"); + MessageBox(DialogWnd, text, "Info", MB_OK); + v->dest_unit = -1; + v->dest_slot = -1; + v->dest_id = -1; + } + } + } + } + } + } + // the global stack changed + else + { + // look in all instruments if a store unit had its target on a global unit + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + for (int u = 0; u < MAX_UNITS; u++) + { + if (SynthObjP->InstrumentValues[i][u][0] == M_FST) + { + FST_valP v = (FST_valP)(SynthObjP->InstrumentValues[i][u]); + // the store doesnt point to global, so skip + if (v->dest_stack != MAX_INSTRUMENTS) + continue; + + // a up/down process + if (unit2 != -1) + { + // if the target unit was unit1 or unit2 realign target unit + if (v->dest_unit == unit1) + { + v->dest_unit = unit2; + } + else if (v->dest_unit == unit2) + { + v->dest_unit = unit1; + } + } + // a set/reset process + else + { + // if the target unit was unit1 reset store + if (v->dest_unit == unit1) + { + char text[128]; + sprintf(text, "Instrument %d had a modulation target in the changed unit\nIt's no longer valid and will be reset", i); + MessageBox(DialogWnd, text, "Info", MB_OK); + v->dest_unit = -1; + v->dest_slot = -1; + v->dest_id = -1; + } + } + } + } + } + // now check the global slots + for (int u = 0; u < MAX_UNITS; u++) + { + if (SynthObjP->GlobalValues[u][0] == M_FST) + { + FST_valP v = (FST_valP)(SynthObjP->GlobalValues[u]); + // the store points to global, so check + if (v->dest_stack == -1 || v->dest_stack == MAX_INSTRUMENTS) + { + // a up/down process + if (unit2 != -1) + { + // if the target unit was unit1 or unit2 realign target unit + if (v->dest_unit == unit1) + { + v->dest_unit = unit2; + } + else if (v->dest_unit == unit2) + { + v->dest_unit = unit1; + } + } + // a set/reset process + else + { + // if the target unit was unit1 reset store + if (v->dest_unit == unit1) + { + char text[128]; + sprintf(text, "Global had a modulation target in the changed unit\nIt's no longer valid and will be reset"); + MessageBox(DialogWnd, text, "Info", MB_OK); + v->dest_unit = -1; + v->dest_slot = -1; + v->dest_id = -1; + } + } + } + } + } + } +} + +bool StackButtonPressed(WPARAM id) +{ + int res; + + // Instrument Stack Buttons + if (SelectedTab == T_INSTRUMENT) + { + // check unit click + InterleavedButtonGroupChanged(IDC_ISTACK_UNIT1, MAX_UNITS, LOWORD(id), res); + if (res >= 0) + { + SelectedIUnit = res; + UpdateModuleParamWindow(T_INSTRUMENT, res); + } + + // check down click + for (int i = 0; i < MAX_UNITS; i++) + { + WORD tid = IDC_ISTACK_DOWN1+i*6; + if (LOWORD(id) == tid) + { + SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; + EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], tid), false); + Go4kVSTi_FlipInstrumentSlots(SelectedInstrument, i, i+1); + CheckModulations(i, i+1); + LinkInstrumentUnit(SelectedInstrument, i); + LinkInstrumentUnit(SelectedInstrument, i+1); + UpdateControls(SelectedInstrument); + EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], tid), true); + } + } + + // check up click + for (int i = 0; i < MAX_UNITS; i++) + { + WORD tid = IDC_ISTACK_UP1+i*6; + if (LOWORD(id) == tid) + { + SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; + EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], tid), false); + Go4kVSTi_FlipInstrumentSlots(SelectedInstrument, i, i-1); + CheckModulations(i, i-1); + LinkInstrumentUnit(SelectedInstrument, i); + LinkInstrumentUnit(SelectedInstrument, i-1); + UpdateControls(SelectedInstrument); + EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], tid), true); + } + } + + // check set click + for (int i = 0; i < MAX_UNITS; i++) + { + WORD tid = IDC_ISTACK_SET1+i*6; + if (LOWORD(id) == tid) + { + EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], tid), false); + if (IDOK == DialogBox(hInstance, MAKEINTRESOURCE(IDD_SET_DIALOG), DialogWnd, (DLGPROC)SetDialogProc)) + { + if (SetUnit != SynthObjP->InstrumentValues[SelectedInstrument][i][0]) + { + SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; + Go4kVSTi_InitInstrumentSlot(SelectedInstrument, i, SetUnit); + CheckModulations(i); + SelectedIUnit = i; + LinkInstrumentUnit(SelectedInstrument, i); + UpdateControls(SelectedInstrument); + } + } + EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], tid), true); + return TRUE; + } + } + + // check reset click + for (int i = 0; i < MAX_UNITS; i++) + { + WORD tid = IDC_ISTACK_RESET1+i*6; + if (LOWORD(id) == tid) + { + SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; + EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], tid), false); + Go4kVSTi_ClearInstrumentSlot(SelectedInstrument, i); + LinkInstrumentUnit(SelectedInstrument, i); + CheckModulations(i); + + UpdateControls(SelectedInstrument); + EnableWindow(GetDlgItem(TabWnd[T_INSTRUMENT], tid), true); + } + } + } + else if (SelectedTab == T_GLOBAL) + { + // check unit click + InterleavedButtonGroupChanged(IDC_GSTACK_UNIT1, MAX_UNITS, LOWORD(id), res); + if (res >= 0) + { + SelectedGUnit = res; + UpdateModuleParamWindow(T_GLOBAL, res); + } + + // check down click + for (int i = 0; i < MAX_UNITS; i++) + { + WORD tid = IDC_GSTACK_DOWN1+i*6; + if (LOWORD(id) == tid) + { + SynthObjP->GlobalSignalValid = 0; + EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], tid), false); + Go4kVSTi_FlipGlobalSlots(i, i+1); + CheckModulations(i, i+1); + UpdateControls(SelectedInstrument); + EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], tid), true); + } + } + + // check up click + for (int i = 0; i < MAX_UNITS; i++) + { + WORD tid = IDC_GSTACK_UP1+i*6; + if (LOWORD(id) == tid) + { + SynthObjP->GlobalSignalValid = 0; + EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], tid), false); + Go4kVSTi_FlipGlobalSlots(i, i-1); + CheckModulations(i, i-1); + UpdateControls(SelectedInstrument); + EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], tid), true); + } + } + + // check set click + for (int i = 0; i < MAX_UNITS; i++) + { + WORD tid = IDC_GSTACK_SET1+i*6; + if (LOWORD(id) == tid) + { + EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], tid), false); + if (IDOK == DialogBox(hInstance, MAKEINTRESOURCE(IDD_SET_DIALOG), DialogWnd, (DLGPROC)SetDialogProc)) + { + if (SetUnit != SynthObjP->GlobalValues[i][0]) + { + SynthObjP->GlobalSignalValid = 0; + Go4kVSTi_InitGlobalSlot(i, SetUnit); + CheckModulations(i); + SelectedGUnit = i; + UpdateControls(SelectedInstrument); + } + } + EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], tid), true); + } + } + + // check reset click + for (int i = 0; i < MAX_UNITS; i++) + { + WORD tid = IDC_GSTACK_RESET1+i*6; + if (LOWORD(id) == tid) + { + SynthObjP->GlobalSignalValid = 0; + EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], tid), false); + Go4kVSTi_ClearGlobalSlot(i); + CheckModulations(i); + UpdateControls(SelectedInstrument); + EnableWindow(GetDlgItem(TabWnd[T_GLOBAL], tid), true); + } + } + } + return TRUE; +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +// // +// TabChange Event // +// // +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +void TabChanged(int index) +{ + for (int i = 0; i < NUM_TABS; i++) + { + if (i == index) + ShowWindow(TabWnd[i], SW_SHOW); + else + ShowWindow(TabWnd[i], SW_HIDE); + } + if (index == T_INSTRUMENT) + { + ShowWindow(GetDlgItem(DialogWnd, IDC_ISTACK_VALID), true); + ShowWindow(GetDlgItem(DialogWnd, IDC_GSTACK_VALID), false); + // reset scroll pos + int oldpos = GetScrollPos(ScrollWnd, SB_VERT); + SCROLLINFO sinfo; + sinfo.cbSize = sizeof(SCROLLINFO); + sinfo.fMask = SIF_POS; + sinfo.nPos = InstrumentScrollPos[SelectedInstrument]; + SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); + ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); + } + if (index == T_GLOBAL) + { + ShowWindow(GetDlgItem(DialogWnd, IDC_ISTACK_VALID), false); + ShowWindow(GetDlgItem(DialogWnd, IDC_GSTACK_VALID), true); + // reset scroll pos + int oldpos = GetScrollPos(ScrollWnd, SB_VERT); + SCROLLINFO sinfo; + sinfo.cbSize = sizeof(SCROLLINFO); + sinfo.fMask = SIF_POS; + sinfo.nPos = GlobalScrollPos; + SetScrollInfo(ScrollWnd, SB_VERT, &sinfo, true); + ScrollWindow(ScrollWnd, 0, oldpos - sinfo.nPos, NULL, NULL); + } + + SelectedTab = index; + UpdateModuleParamWindow(SelectedTab, -1); +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +// // +// GUI Update Events // +// // +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +void UpdateSignalCount(int channel) +{ + ////////////////////////////////////////////////////////////// + // instrument + ////////////////////////////////////////////////////////////// + + // disable for safety first + SynthObjP->InstrumentSignalValid[channel] = 0; + int valid = 1; + int signalcount = 0; + // check stack validity + SynthObjP->HighestSlotIndex[channel] = 63; + int highestSlotIndex = 0; + for (int i = 0; i < MAX_UNITS; i++) + { + if (SynthObjP->InstrumentValues[channel][i][0] != 0) + { + if (i >= highestSlotIndex) + highestSlotIndex = i; + } + // check unit precondition + int precond = UnitPreSignals[SynthObjP->InstrumentValues[channel][i][0]]; + // adjust for arithmetic unit (depending on mode) + if (SynthObjP->InstrumentValues[channel][i][0] == M_FOP) + { + FOP_valP v = (FOP_valP)(SynthObjP->InstrumentValues[channel][i]); + if (v->flags == FOP_LOADNOTE) + precond = 0; + if (v->flags == FOP_POP) + precond = 1; + if (v->flags == FOP_PUSH) + precond = 1; + if (v->flags == FOP_ADDP2) + precond = 4; + if (v->flags == FOP_MULP2) + precond = 4; + } + // adjust for stereo in vcf (we need 2 signals for stereo) + if (SynthObjP->InstrumentValues[channel][i][0] == M_VCF) + { + VCF_valP v = (VCF_valP)(SynthObjP->InstrumentValues[channel][i]); + if (v->type & VCF_STEREO) + precond += 1; + } + // adjust for stereo in dst (we need 2 signals for stereo) + if (SynthObjP->InstrumentValues[channel][i][0] == M_DST) + { + DST_valP v = (DST_valP)(SynthObjP->InstrumentValues[channel][i]); + if (v->stereo & VCF_STEREO) + precond += 1; + } + if (signalcount < precond) + { + valid = 0; + Go4kVSTi_ClearInstrumentWorkspace(channel); + for (int j = i; j < MAX_UNITS; j++) + { + char txt[10]; + sprintf(txt, "%d", signalcount); + SetWindowText(GetDlgItem(TabWnd[T_INSTRUMENT], IDC_ISTACK_SIGNALCOUNT1+j*6), "inv"); + } + char err[128]; + sprintf(err, "Signal INVALID! Unit %d needs >= %d signals", i+1, precond); + SetWindowText(GetDlgItem(DialogWnd, IDC_ISTACK_VALID), err); + break; + } + // precondition ok + else + { + signalcount += UnitPostSignals[SynthObjP->InstrumentValues[channel][i][0]]; + // adjust for arithmetic unit (depending on mode) + if (SynthObjP->InstrumentValues[channel][i][0] == M_FOP) + { + FOP_valP v = (FOP_valP)(SynthObjP->InstrumentValues[channel][i]); + if (v->flags == FOP_POP) + signalcount--; + if (v->flags == FOP_PUSH) + signalcount++; + if (v->flags == FOP_ADDP) + signalcount--; + if (v->flags == FOP_MULP) + signalcount--; + if (v->flags == FOP_ADDP2) + signalcount-=2; + if (v->flags == FOP_MULP2) + signalcount-=2; + if (v->flags == FOP_LOADNOTE) + signalcount++; + } + // adjust for stereo in vco (2 signals for stereo) + if (SynthObjP->InstrumentValues[channel][i][0] == M_VCO) + { + VCO_valP v = (VCO_valP)(SynthObjP->InstrumentValues[channel][i]); + if (v->flags & VCO_STEREO) + signalcount++; + } + // adjust for pop in store + if (SynthObjP->InstrumentValues[channel][i][0] == M_FST) + { + FST_valP v = (FST_valP)(SynthObjP->InstrumentValues[channel][i]); + if (v->type & FST_POP) + signalcount--; + } + // check stack undeflow + if (signalcount < 0) + { + valid = 0; + Go4kVSTi_ClearInstrumentWorkspace(channel); + for (int j = i; j < MAX_UNITS; j++) + { + char txt[10]; + sprintf(txt, "%d", signalcount); + SetWindowText(GetDlgItem(TabWnd[T_INSTRUMENT], IDC_ISTACK_SIGNALCOUNT1+j*6), "inv"); + } + char err[128]; + sprintf(err, "Signal INVALID! Unit %d Stack Underflow %d", i+1, signalcount); + SetWindowText(GetDlgItem(DialogWnd, IDC_ISTACK_VALID), err); + break; + } + // check stack overflow + else if (signalcount > 8) + { + valid = 0; + Go4kVSTi_ClearInstrumentWorkspace(channel); + for (int j = i; j < MAX_UNITS; j++) + { + char txt[10]; + sprintf(txt, "%d", signalcount); + SetWindowText(GetDlgItem(TabWnd[T_INSTRUMENT], IDC_ISTACK_SIGNALCOUNT1+j*6), "inv"); + } + char err[128]; + sprintf(err, "Signal INVALID! Unit %d Stack Overflow %d", i+1, signalcount); + SetWindowText(GetDlgItem(DialogWnd, IDC_ISTACK_VALID), err); + break; + } + // TODO: check module internal overflow (like needing additional FP slots internally) + else + { + } + // update signal counter + char txt[10]; + sprintf(txt, "%d", signalcount); + SetWindowText(GetDlgItem(TabWnd[T_INSTRUMENT], IDC_ISTACK_SIGNALCOUNT1+i*6), txt); + } + } + if (valid) + { + if (signalcount == 0) + { + SynthObjP->InstrumentSignalValid[channel] = 1; + SetWindowText(GetDlgItem(DialogWnd, IDC_ISTACK_VALID), "Signal OK"); + } + else + { + Go4kVSTi_ClearInstrumentWorkspace(channel); + SetWindowText(GetDlgItem(DialogWnd, IDC_ISTACK_VALID), "Signal INVALID! Signal Count != 0 after last unit"); + } + } + SynthObjP->HighestSlotIndex[channel] = highestSlotIndex; + if (channel < 16) + { + if (LinkToInstrument[channel] != 16) + { + SynthObjP->InstrumentSignalValid[LinkToInstrument[channel]] = SynthObjP->InstrumentSignalValid[channel]; + SynthObjP->HighestSlotIndex[LinkToInstrument[channel]] = SynthObjP->HighestSlotIndex[channel]; + } + } + + ////////////////////////////////////////////////////////////// + // global + ////////////////////////////////////////////////////////////// + + // disable for safety first + SynthObjP->GlobalSignalValid = 0; + valid = 1; + signalcount = 0; + // check stack validity + SynthObjP->HighestSlotIndex[16] = 63; + highestSlotIndex = 0; + for (int i = 0; i < MAX_UNITS; i++) + { + if (SynthObjP->GlobalValues[i][0] != 0) + { + if (i >= highestSlotIndex) + highestSlotIndex = i; + } + // check unit precondition + int precond = UnitPreSignals[SynthObjP->GlobalValues[i][0]]; + // adjust for arithmetic unit (depending on mode) + if (SynthObjP->GlobalValues[i][0] == M_FOP) + { + FOP_valP v = (FOP_valP)(SynthObjP->GlobalValues[i]); + if (v->flags == FOP_LOADNOTE) + precond = 0; + if (v->flags == FOP_POP) + precond = 1; + if (v->flags == FOP_PUSH) + precond = 1; + if (v->flags == FOP_ADDP2) + precond = 4; + if (v->flags == FOP_MULP2) + precond = 4; + } + // adjust for stereo in vcf (we need 2 signals for stereo) + if (SynthObjP->GlobalValues[i][0] == M_VCF) + { + VCF_valP v = (VCF_valP)(SynthObjP->GlobalValues[i]); + if (v->type & VCF_STEREO) + precond += 1; + } + // adjust for stereo in dst (we need 2 signals for stereo) + if (SynthObjP->GlobalValues[i][0] == M_DST) + { + DST_valP v = (DST_valP)(SynthObjP->GlobalValues[i]); + if (v->stereo & VCF_STEREO) + precond += 1; + } + if (signalcount < precond) + { + valid = 0; + Go4kVSTi_ClearGlobalWorkspace(); + for (int j = i; j < MAX_UNITS; j++) + { + char txt[10]; + sprintf(txt, "%d", signalcount); + SetWindowText(GetDlgItem(TabWnd[T_GLOBAL], IDC_GSTACK_SIGNALCOUNT1+j*6), "inv"); + } + char err[128]; + sprintf(err, "Signal INVALID! Unit %d needs >= %d signals", i+1, precond); + SetWindowText(GetDlgItem(DialogWnd, IDC_GSTACK_VALID), err); + break; + } + // precondition ok + else + { + signalcount += UnitPostSignals[SynthObjP->GlobalValues[i][0]]; + // adjust for arithmetic unit (depending on mode) + if (SynthObjP->GlobalValues[i][0] == M_FOP) + { + FOP_valP v = (FOP_valP)(SynthObjP->GlobalValues[i]); + if (v->flags == FOP_POP) + signalcount--; + if (v->flags == FOP_PUSH) + signalcount++; + if (v->flags == FOP_ADDP) + signalcount--; + if (v->flags == FOP_MULP) + signalcount--; + if (v->flags == FOP_ADDP2) + signalcount-=2; + if (v->flags == FOP_MULP2) + signalcount-=2; + if (v->flags == FOP_LOADNOTE) + signalcount++; + } + // adjust for stereo in vco (2 signals for stereo) + if (SynthObjP->GlobalValues[i][0] == M_VCO) + { + VCO_valP v = (VCO_valP)(SynthObjP->GlobalValues[i]); + if (v->flags & VCO_STEREO) + signalcount++; + } + // adjust for pop in store + if (SynthObjP->GlobalValues[i][0] == M_FST) + { + FST_valP v = (FST_valP)(SynthObjP->GlobalValues[i]); + if (v->type & FST_POP) + signalcount--; + } + // check stack undeflow + if (signalcount < 0) + { + valid = 0; + Go4kVSTi_ClearGlobalWorkspace(); + for (int j = i; j < MAX_UNITS; j++) + { + char txt[10]; + sprintf(txt, "%d", signalcount); + SetWindowText(GetDlgItem(TabWnd[T_GLOBAL], IDC_GSTACK_SIGNALCOUNT1+j*6), "inv"); + } + char err[128]; + sprintf(err, "Signal INVALID! Unit %d Stack Underflow %d", i+1, signalcount); + SetWindowText(GetDlgItem(DialogWnd, IDC_GSTACK_VALID), err); + break; + } + // check stack overflow + else if (signalcount > 8) + { + valid = 0; + Go4kVSTi_ClearGlobalWorkspace(); + for (int j = i; j < MAX_UNITS; j++) + { + char txt[10]; + sprintf(txt, "%d", signalcount); + SetWindowText(GetDlgItem(TabWnd[T_GLOBAL], IDC_GSTACK_SIGNALCOUNT1+j*6), "inv"); + } + char err[128]; + sprintf(err, "Signal INVALID! Unit %d Stack Overflow %d", i+1, signalcount); + SetWindowText(GetDlgItem(DialogWnd, IDC_GSTACK_VALID), err); + break; + } + // TODO: check module internal overflow (like needing additional FP slots internally) + else + { + } + // update signal counter + char txt[10]; + sprintf(txt, "%d", signalcount); + SetWindowText(GetDlgItem(TabWnd[T_GLOBAL], IDC_GSTACK_SIGNALCOUNT1+i*6), txt); + } + } + if (valid) + { + if (signalcount == 0) + { + SynthObjP->GlobalSignalValid = 1; + SetWindowText(GetDlgItem(DialogWnd, IDC_GSTACK_VALID), "Signal OK"); + } + else + { + Go4kVSTi_ClearGlobalWorkspace(); + SetWindowText(GetDlgItem(DialogWnd, IDC_GSTACK_VALID), "Signal INVALID! Signal Count != 0 after last unit"); + } + } + SynthObjP->HighestSlotIndex[16] = highestSlotIndex; +} + +void UpdateControls(int channel) +{ + int res; + UpdateSignalCount(channel); + SetDlgItemText(DialogWnd, IDC_INSTRUMENT_NAME, (LPSTR)&(SynthObjP->InstrumentNames[channel])); + SendDlgItemMessage(DialogWnd, IDC_INSTRUMENTLINK, CB_SETCURSEL, (WPARAM)LinkToInstrument[SelectedInstrument], (LPARAM)0); + SendDlgItemMessage(DialogWnd, IDC_POLYPHONY, CB_SETCURSEL, (WPARAM)(SynthObjP->Polyphony-1), (LPARAM)0); + for (int i = 0; i < MAX_UNITS; i++) + { + // set unit text + char unitname[128]; + GetUnitString(SynthObjP->InstrumentValues[channel][i], unitname); + SetWindowText(GetDlgItem(TabWnd[T_INSTRUMENT], IDC_ISTACK_UNIT1+i*6), unitname); + GetUnitString(SynthObjP->GlobalValues[i], unitname); + SetWindowText(GetDlgItem(TabWnd[T_GLOBAL], IDC_GSTACK_UNIT1+i*6), unitname); + } + InterleavedButtonGroupChanged(IDC_ISTACK_UNIT1, MAX_UNITS, IDC_ISTACK_UNIT1+SelectedIUnit*6, res); + InterleavedButtonGroupChanged(IDC_GSTACK_UNIT1, MAX_UNITS, IDC_GSTACK_UNIT1+SelectedGUnit*6, res); + UpdateModuleParamWindow(SelectedTab, -1); +} + +void UpdateModule(int uid, BYTE* val) +{ + if (uid == M_ENV) + { + ENV_valP v = (ENV_valP)val; + // attack + InitSlider(ModuleWnd[uid], IDC_ENV_ATTACK, 0, 128, v->attac); + // decay + InitSlider(ModuleWnd[uid], IDC_ENV_DECAY, 0, 128, v->decay); + // sustain + InitSlider(ModuleWnd[uid], IDC_ENV_SUSTAIN, 0, 128, v->sustain); + // release + InitSlider(ModuleWnd[uid], IDC_ENV_RELEASE, 0, 128, v->release); + // gain + InitSlider(ModuleWnd[uid], IDC_ENV_GAIN, 0, 128, v->gain); + } + else if (uid == M_VCO) + { + VCO_valP v = (VCO_valP)val; + // transpose + InitSliderCenter(ModuleWnd[uid], IDC_VCO_TRANSPOSE, 0, 128, v->transpose); + // detune + InitSliderCenter(ModuleWnd[uid], IDC_VCO_DETUNE, 0, 128, v->detune); + // phaseofs + InitSlider(ModuleWnd[uid], IDC_VCO_PHASE, 0, 128, v->phaseofs); + // color + InitSliderCenter(ModuleWnd[uid], IDC_VCO_COLOR, 0, 128, v->color); + // shape + InitSliderCenter(ModuleWnd[uid], IDC_VCO_SHAPE, 0, 128, v->shape); + // gain + InitSlider(ModuleWnd[uid], IDC_VCO_GAIN, 0, 128, v->gain); + + // buttons + DisableButtonGroup(IDC_VCO_SINE, IDC_VCO_GATE, M_VCO); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRANSPOSE), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRANSPOSE_VAL), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_DETUNE), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_DETUNE_VAL), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PHASE), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PHASE_VAL), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR_VAL), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SHAPE), true); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SHAPE_VAL), true); + EnableButtonGroup(IDC_VCO_GATE1, IDC_VCO_GATE16, M_VCO, false); + if (v->flags & VCO_SINE) + { + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SINE), false); + } + else if (v->flags & VCO_TRISAW) + { + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRISAW), false); + } + else if (v->flags & VCO_PULSE) + { + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PULSE), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SHAPE), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SHAPE_VAL), false); + } + else if (v->flags & VCO_NOISE) + { + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_NOISE), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRANSPOSE), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_TRANSPOSE_VAL), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_DETUNE), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_DETUNE_VAL), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PHASE), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_PHASE_VAL), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR_VAL), false); + } + else if (v->flags & VCO_GATE) + { + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_GATE), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR), false); + EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR_VAL), false); + EnableButtonGroup(IDC_VCO_GATE1, IDC_VCO_GATE16, M_VCO, true); + } + + // gate bits + WORD gatebits = ((WORD)v->color << 8) | (WORD)v->gate; + SetCheckboxGroupBitmask(IDC_VCO_GATE1, IDC_VCO_GATE16, M_VCO, gatebits); + SendDlgItemMessage(ModuleWnd[M_VCO], IDC_VCO_LFO, BM_SETCHECK, v->flags & VCO_LFO, 0); + SendDlgItemMessage(ModuleWnd[M_VCO], IDC_VCO_STEREO, BM_SETCHECK, v->flags & VCO_STEREO, 0); + } + else if (uid == M_VCF) + { + VCF_valP v = (VCF_valP)val; + // frequency + InitSlider(ModuleWnd[uid], IDC_VCF_FREQUENCY, 0, 128, v->freq); + // resonance + InitSlider(ModuleWnd[uid], IDC_VCF_RESONANCE, 0, 128, v->res); + + // buttons + DisableButtonGroup(IDC_VCF_LOW, IDC_VCF_ALL, M_VCF); + + int mode = v->type & ~VCF_STEREO; + if (mode == VCF_LOWPASS) + EnableWindow(GetDlgItem(ModuleWnd[M_VCF], IDC_VCF_LOW), false); + else if (mode == VCF_HIGHPASS) + EnableWindow(GetDlgItem(ModuleWnd[M_VCF], IDC_VCF_HIGH), false); + else if (mode == VCF_BANDPASS) + EnableWindow(GetDlgItem(ModuleWnd[M_VCF], IDC_VCF_BAND), false); + else if (mode == VCF_BANDSTOP) + EnableWindow(GetDlgItem(ModuleWnd[M_VCF], IDC_VCF_NOTCH), false); + else if (mode == VCF_PEAK) + EnableWindow(GetDlgItem(ModuleWnd[M_VCF], IDC_VCF_PEAK), false); + else if (mode == VCF_ALLPASS) + EnableWindow(GetDlgItem(ModuleWnd[M_VCF], IDC_VCF_ALL), false); + + SendDlgItemMessage(ModuleWnd[M_VCF], IDC_VCF_STEREO, BM_SETCHECK, v->type & VCF_STEREO, 0); + } + else if (uid == M_DST) + { + DST_valP v = (DST_valP)val; + // drive + InitSliderCenter(ModuleWnd[uid], IDC_DST_DRIVE, 0, 128, v->drive); + // snhfreq + InitSlider(ModuleWnd[uid], IDC_DST_SNH, 0, 128, v->snhfreq); + SendDlgItemMessage(ModuleWnd[M_DST], IDC_DST_STEREO, BM_SETCHECK, v->stereo & VCF_STEREO, 0); + } + else if (uid == M_DLL) + { + DLL_valP v = (DLL_valP)val; + // pregain + InitSlider(ModuleWnd[uid], IDC_DLL_PREGAIN, 0, 128, v->pregain); + // dry + InitSlider(ModuleWnd[uid], IDC_DLL_DRY, 0, 128, v->dry); + // feedback + InitSlider(ModuleWnd[uid], IDC_DLL_FEEDBACK, 0, 128, v->feedback); + // frequency + InitSlider(ModuleWnd[uid], IDC_DLL_FREQUENCY, 0, 128, v->freq); + // depth + InitSlider(ModuleWnd[uid], IDC_DLL_DEPTH, 0, 128, v->depth); + // damp + InitSlider(ModuleWnd[uid], IDC_DLL_DAMP, 0, 128, v->damp); + // delay + InitSliderNoGUI(ModuleWnd[uid], IDC_DLL_DTIME, 0, 128, v->guidelay); + + // delay/reverb button + DisableButtonGroup(IDC_DLL_DELAY, IDC_DLL_REVERB, M_DLL); + if (v->reverb) + { + EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_REVERB), false); + // enable reverb gui elements + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_LEFTREVERB), SW_SHOW); + // disable delay gui elements + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOSYNC), SW_HIDE); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_BPMSYNC), SW_HIDE); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOTESYNC), SW_HIDE); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), SW_HIDE); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), SW_HIDE); + } + else + { + EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DELAY), false); + // disable reverb gui elements + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_LEFTREVERB), SW_HIDE); + // enable delay gui elements + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOSYNC), SW_SHOW); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_BPMSYNC), SW_SHOW); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOTESYNC), SW_SHOW); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), SW_SHOW); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), SW_SHOW); + } + DisableButtonGroup(IDC_DLL_NOSYNC, IDC_DLL_NOTESYNC, M_DLL); + if (v->synctype == 0) + { + EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), true); + EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), true); + } + else if (v->synctype == 1) + { + EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), true); + EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), true); + } + else if (v->synctype == 2) + { + EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME), false); + EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_DTIME_VAL), false); + } + EnableWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_DLL_NOSYNC+v->synctype), false); + SendDlgItemMessage(ModuleWnd[M_DLL], IDC_DLL_LEFTREVERB, BM_SETCHECK, v->leftreverb, 0); + UpdateDelayTimes(v); + } + else if (uid == M_FOP) + { + FOP_valP v = (FOP_valP)val; + DisableButtonGroup(IDC_FOP_POP, IDC_FOP_MULP2, M_FOP); + EnableWindow(GetDlgItem(ModuleWnd[M_FOP], IDC_FOP_POP + v->flags-FOP_POP), false); + } + else if (uid == M_FST) + { + FST_valP v = (FST_valP)val; + // gain + InitSliderCenter2(ModuleWnd[uid], IDC_FST_AMOUNT, 0, 128, v->amount); + + // set instrument combobox + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0); + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"Local"); + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + char instname[128]; + sprintf(instname, "%d: %s", i+1, SynthObjP->InstrumentNames[i]); + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_ADDSTRING, (WPARAM)0, (LPARAM)instname); + } + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"Global"); + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_INSTRUMENT, CB_SETCURSEL, (WPARAM)(v->dest_stack+1), (LPARAM)0); + + // set unit combobox + BYTE *units; + if (SelectedTab == T_INSTRUMENT) + { + if (v->dest_stack == -1) + units = SynthObjP->InstrumentValues[SelectedInstrument][0]; + else if (v->dest_stack == MAX_INSTRUMENTS) + units = SynthObjP->GlobalValues[0]; + else + units = SynthObjP->InstrumentValues[v->dest_stack][0]; + } + else + { + if (v->dest_stack == -1) + units = SynthObjP->GlobalValues[0]; + else if (v->dest_stack == MAX_INSTRUMENTS) + units = SynthObjP->GlobalValues[0]; + else + units = SynthObjP->InstrumentValues[v->dest_stack][0]; + } + + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0); + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"- Nothing Selected -"); + for (int i = 0; i < MAX_UNITS; i++) + { + char unitname[128], unitname2[128]; + sprintf(unitname, "%d: %s", i+1, GetUnitString(&units[i*MAX_UNIT_SLOTS], unitname2)); + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_ADDSTRING, (WPARAM)0, (LPARAM)unitname); + } + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_UNIT, CB_SETCURSEL, (WPARAM)(v->dest_unit+1), (LPARAM)0); + + // set slot combobox + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_RESETCONTENT, (WPARAM)0, (LPARAM)0); + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_ADDSTRING, (WPARAM)0, (LPARAM)"- Nothing Selected -"); + if (v->dest_unit == -1) + { + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_SETCURSEL, (WPARAM)0, (LPARAM)0); + EnableWindow(GetDlgItem(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT), false); + } + else + { + EnableWindow(GetDlgItem(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT), true); + DWORD unitid = units[v->dest_unit*MAX_UNIT_SLOTS]; + for (int i = 0; i < 8; i++) + { + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_ADDSTRING, (WPARAM)0, (LPARAM)UnitModulationTargetNames[unitid][i]); + } + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT, CB_SETCURSEL, (WPARAM)(v->dest_slot+1), (LPARAM)0); + } + // buttons + DisableButtonGroup(IDC_FST_SET, IDC_FST_MUL, M_FST); + if (v->type & FST_ADD) + EnableWindow(GetDlgItem(ModuleWnd[M_FST], IDC_FST_ADD), false); + else if (v->type & FST_MUL) + EnableWindow(GetDlgItem(ModuleWnd[M_FST], IDC_FST_MUL), false); + else + EnableWindow(GetDlgItem(ModuleWnd[M_FST], IDC_FST_SET), false); + SendDlgItemMessage(ModuleWnd[M_FST], IDC_FST_POP, BM_SETCHECK, v->type & FST_POP, 0); + } + else if (uid == M_PAN) + { + PAN_valP v = (PAN_valP)val; + // panning + InitSliderCenter(ModuleWnd[uid], IDC_PAN_PANNING, 0, 128, v->panning); + } + else if (uid == M_OUT) + { + OUT_valP v = (OUT_valP)val; + // gain + InitSlider(ModuleWnd[uid], IDC_OUT_GAIN, 0, 128, v->gain); + // auxsend + InitSlider(ModuleWnd[uid], IDC_OUT_AUXSEND, 0, 128, v->auxsend); + } + else if (uid == M_ACC) + { + ACC_valP v = (ACC_valP)val; + DisableButtonGroup(IDC_ACC_OUT, IDC_ACC_AUX, M_ACC); + if (v->flags == ACC_OUT) + EnableWindow(GetDlgItem(ModuleWnd[M_ACC], IDC_ACC_OUT), false); + else + EnableWindow(GetDlgItem(ModuleWnd[M_ACC], IDC_ACC_AUX), false); + } + else if (uid == M_FLD) + { + FLD_valP v = (FLD_valP)val; + // panning + InitSliderCenter(ModuleWnd[uid], IDC_FLD_VALUE, 0, 128, v->value); + } + else if (uid == M_GLITCH) + { + GLITCH_valP v = (GLITCH_valP)val; + // active + InitSlider(ModuleWnd[uid], IDC_GLITCH_ACTIVE, 0, 128, v->active); + // dry + InitSlider(ModuleWnd[uid], IDC_GLITCH_DRY, 0, 128, v->dry); + // delta size + InitSlider(ModuleWnd[uid], IDC_GLITCH_DSIZE, 0, 128, v->dsize); + // delta pitch + InitSlider(ModuleWnd[uid], IDC_GLITCH_DPITCH, 0, 128, v->dpitch); + // delay + InitSliderNoGUI(ModuleWnd[uid], IDC_GLITCH_DTIME, 0, 128, v->guidelay); + + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_GLITCH_DTIME), SW_SHOW); + ShowWindow(GetDlgItem(ModuleWnd[M_DLL], IDC_GLITCH_DTIME_VAL), SW_SHOW); + + UpdateDelayTimes(v); + } +} + +void UpdateModuleParamWindow(int tab, int unit) +{ + if (tab == T_INSTRUMENT) + { + // show unit page + if (unit == -1) + unit = SelectedIUnit; + for (int i = 0; i < NUM_MODULES; i++) + { + if (i == SynthObjP->InstrumentValues[SelectedInstrument][unit][0]) + ShowWindow(ModuleWnd[M_NONE+i], SW_SHOW); + else + ShowWindow(ModuleWnd[M_NONE+i], SW_HIDE); + } + // set unit sliders and buttons + UnitID uid = (UnitID)(SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit][0]); + UpdateModule(uid, SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit]); + } + else if (tab == T_GLOBAL) + { + // show unit page + if (unit == -1) + unit = SelectedGUnit; + for (int i = 0; i < NUM_MODULES; i++) + { + if (i == SynthObjP->GlobalValues[unit][0]) + ShowWindow(ModuleWnd[M_NONE+i], SW_SHOW); + else + ShowWindow(ModuleWnd[M_NONE+i], SW_HIDE); + } + // set unit sliders and buttons + UnitID uid = (UnitID)(SynthObjP->GlobalValues[SelectedGUnit][0]); + UpdateModule(uid, SynthObjP->GlobalValues[SelectedGUnit]); + } +} + +void UpdateVoiceDisplay(int i) +{ + for (int i = 0; i < MAX_INSTRUMENTS; i++) + { + int count = 0; + for (int p = 0; p < SynthObjP->Polyphony; p++) + { + if (SynthObjP->InstrumentWork[i*MAX_POLYPHONY+p].note != 0) + count++; + } + char text[10]; + if (SynthObjP->InstrumentSignalValid[i]) + { + sprintf(text, "%d", count); + SetWindowText(GetDlgItem(DialogWnd, IDC_VOICECOUNT1+i), text); + } + else + { + sprintf(text, "inv", count); + SetWindowText(GetDlgItem(DialogWnd, IDC_VOICECOUNT1+i), text); + } + } +} + +void GetStreamFileName() +{ +#ifdef EXPORT_OBJECT_FILE + + char lpstrFile[256] = {'4','k','l','a','n','g','.','o','b','j',0}; + char lpstrFilter[256] = {'4','k','l','a','n','g',' ','O','b','j','e','c','t', 0 ,'*','.','o','b','j', 0, 0}; + char lpstrExtension[256] = { 'o','b','j', 0 }; + char lpstrFileTitle[4096]; + char lpstrDirectory[4096]; + GetCurrentDirectory(4096, lpstrDirectory); + + // no windows object? + int objformat = SendDlgItemMessage(DialogWnd, IDC_OBJFORMAT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); + if (objformat != 0) + { + lpstrFile[8] = 0; // 4klang.o + lpstrFilter[17] = lpstrFilter[18] = 0; + lpstrExtension[1] = 0; + } + + OPENFILENAME ofn = + { + sizeof(OPENFILENAME), + DialogWnd, + GetModuleHandle(NULL), + lpstrFilter, + NULL, + 0, + 1, + lpstrFile, + 256, + NULL, + 0, + lpstrDirectory, + NULL, + OFN_OVERWRITEPROMPT, + 0, + 0, + lpstrExtension, + 0, + NULL, + NULL + }; +#else + char lpstrFilter[256] = + {'4','k','l','a','n','g',' ','I','n','c','l','u','d','e', 0 , + '*','.','i','n','c', 0, + 0}; +#ifdef _4KLANG2 + char lpstrFile[4096] = "4klang2.inc"; +#else + char lpstrFile[4096] = "4klang.inc"; +#endif + char lpstrDirectory[4096]; + GetCurrentDirectory(4096, lpstrDirectory); + + OPENFILENAME ofn = + { + sizeof(OPENFILENAME), + DialogWnd, + GetModuleHandle(NULL), + lpstrFilter, + NULL, + 0, + 1, + lpstrFile, + 256, + NULL, + 0, + lpstrDirectory, + NULL, + OFN_OVERWRITEPROMPT, + 0, + 0, + "inc", + 0, + NULL, + NULL + }; +#endif + if (GetSaveFileName(&ofn)) + { + int useenvlevels = SendDlgItemMessage(DialogWnd, IDC_ENVLEVELS, BM_GETCHECK, 0, 0); + int useenotevalues = SendDlgItemMessage(DialogWnd, IDC_NOTEVALUES, BM_GETCHECK, 0, 0); + int clipoutput = SendDlgItemMessage(DialogWnd, IDC_CLIPOUTPUT, BM_GETCHECK, 0, 0); + int undenormalize = SendDlgItemMessage(DialogWnd, IDC_UNDENORMALIZE, BM_GETCHECK, 0, 0); + int objformat = SendDlgItemMessage(DialogWnd, IDC_OBJFORMAT, CB_GETCURSEL, (WPARAM)0, (LPARAM)0); + int output16 = SendDlgItemMessage(DialogWnd, IDC_16BIT, BM_GETCHECK, 0, 0); + Go4kVSTi_SaveByteStream(hInstance, ofn.lpstrFile, useenvlevels, useenotevalues, clipoutput, undenormalize, objformat, output16); + } +} + diff --git a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiGUI.h b/src/vsti/Go4kVSTiGUI.h similarity index 97% rename from 4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiGUI.h rename to src/vsti/Go4kVSTiGUI.h index 71e2ac0..76d115c 100644 --- a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiGUI.h +++ b/src/vsti/Go4kVSTiGUI.h @@ -1,182 +1,182 @@ -#include - -#define ButtonGroupChanged(btn_firstid, btn_lastid, test_id, seltab, result_index) \ -{ \ - result_index = 0; \ - if (LOWORD(test_id) >= btn_firstid && \ - LOWORD(test_id) <= btn_lastid) \ - { \ - for (WORD bgci = btn_firstid; bgci <= btn_lastid; bgci++) \ - { \ - if (LOWORD(test_id) == bgci) \ - { \ - EnableWindow(GetDlgItem(ModuleWnd[seltab], bgci), false); \ - result_index = bgci; \ - } \ - else \ - { \ - EnableWindow(GetDlgItem(ModuleWnd[seltab], bgci), true); \ - } \ - } \ - } \ -} - -#define EnableButtonGroup(btn_firstid, btn_lastid, seltab, btn_show) \ -{ \ - for (WORD bgci = btn_firstid; bgci <= btn_lastid; bgci++) \ - { \ - EnableWindow(GetDlgItem(ModuleWnd[seltab], bgci), btn_show); \ - } \ -} - -#define SetCheckboxGroupBitmask(btn_firstid, btn_lastid, seltab, input_bits) \ -{ \ - WORD curbitsel = 0x0001; \ - for (WORD bgci = btn_firstid; bgci <= btn_lastid; bgci++,curbitsel*=2) \ - { \ - SendDlgItemMessage(ModuleWnd[seltab], bgci, BM_SETCHECK, input_bits & curbitsel, 0); \ - } \ -} - -#define GetCheckboxGroupBitmask(btn_firstid, btn_lastid, test_id, seltab, result_bits, result_index) \ -{ \ - result_index = 0; \ - result_bits = 0; \ - WORD curbitsel = 0x0001; \ - if (LOWORD(test_id) >= btn_firstid && \ - LOWORD(test_id) <= btn_lastid) \ - { \ - for (WORD bgci = btn_firstid; bgci <= btn_lastid; bgci++,curbitsel*=2) \ - { \ - if (LOWORD(test_id) == bgci) \ - { \ - result_index = bgci; \ - } \ - if (SendDlgItemMessage(ModuleWnd[seltab], bgci, BM_GETCHECK, 0, 0)==BST_CHECKED) \ - { \ - result_bits |= curbitsel; \ - } \ - else \ - { \ - result_bits &= ~curbitsel; \ - } \ - } \ - } \ -} - -#define InitSlider(tab_id, slider_id, slider_low, slider_hi, slider_pos) \ -{ \ - SendDlgItemMessage(tab_id, slider_id, TBM_SETRANGE, true, MAKELONG(slider_low, slider_hi)); \ - SendDlgItemMessage(tab_id, slider_id, TBM_SETPOS, true, slider_pos); \ - SendDlgItemMessage(tab_id, slider_id, TBM_SETLINESIZE, 0, 1); \ - SendDlgItemMessage(tab_id, slider_id, TBM_SETPAGESIZE, 0, 1); \ - sprintf(SliderValTxt, "%d", slider_pos); \ - SetWindowText(GetDlgItem(tab_id, slider_id ## _VAL), SliderValTxt); \ -} - -#define InitSliderCenter(tab_id, slider_id, slider_low, slider_hi, slider_pos) \ -{ \ - SendDlgItemMessage(tab_id, slider_id, TBM_SETRANGE, true, MAKELONG(slider_low, slider_hi)); \ - SendDlgItemMessage(tab_id, slider_id, TBM_SETPOS, true, slider_pos); \ - SendDlgItemMessage(tab_id, slider_id, TBM_SETLINESIZE, 0, 1); \ - SendDlgItemMessage(tab_id, slider_id, TBM_SETPAGESIZE, 0, 1); \ - sprintf(SliderValTxt, "%d", slider_pos-64); \ - SetWindowText(GetDlgItem(tab_id, slider_id ## _VAL), SliderValTxt); \ -} - -#define InitSliderCenter2(tab_id, slider_id, slider_low, slider_hi, slider_pos) \ -{ \ - SendDlgItemMessage(tab_id, slider_id, TBM_SETRANGE, true, MAKELONG(slider_low, slider_hi)); \ - SendDlgItemMessage(tab_id, slider_id, TBM_SETPOS, true, slider_pos); \ - SendDlgItemMessage(tab_id, slider_id, TBM_SETLINESIZE, 0, 1); \ - SendDlgItemMessage(tab_id, slider_id, TBM_SETPAGESIZE, 0, 1); \ - sprintf(SliderValTxt, "%d", (slider_pos-64)*2); \ - SetWindowText(GetDlgItem(tab_id, slider_id ## _VAL), SliderValTxt); \ -} - -#define InitSliderNoGUI(tab_id, slider_id, slider_low, slider_hi, slider_pos) \ -{ \ - SendDlgItemMessage(tab_id, slider_id, TBM_SETRANGE, true, MAKELONG(slider_low, slider_hi)); \ - SendDlgItemMessage(tab_id, slider_id, TBM_SETPOS, true, slider_pos); \ - SendDlgItemMessage(tab_id, slider_id, TBM_SETLINESIZE, 0, 1); \ - SendDlgItemMessage(tab_id, slider_id, TBM_SETPAGESIZE, 0, 1); \ -} - -#define DisableButtonGroup(btn_firstid, btn_lastid, seltab) \ -{ \ - for (WORD bgci = btn_firstid; bgci <= btn_lastid; bgci++) \ - { \ - EnableWindow(GetDlgItem(ModuleWnd[seltab], bgci), true); \ - } \ -} - -#define InterleavedButtonGroupChanged(btn_firstid, btn_count, test_id, result_index)\ -{ \ - result_index = -1; \ - if (((LOWORD(test_id)-btn_firstid) % 6) == 0) \ - { \ - for (WORD bgci = 0; bgci < btn_count; bgci++) \ - { \ - WORD ibtn = btn_firstid+bgci*6; \ - if (LOWORD(test_id) == ibtn) \ - { \ - EnableWindow(GetDlgItem(TabWnd[SelectedTab], ibtn), false); \ - result_index = bgci; \ - } \ - else \ - { \ - EnableWindow(GetDlgItem(TabWnd[SelectedTab], ibtn), true); \ - } \ - } \ - } \ -} - -#define DisableInterleavedButtonGroup(btn_firstid, btn_count, seltab) \ -{ \ - for (WORD bgci = 0; bgci < btn_count; bgci++) \ - { \ - EnableWindow(GetDlgItem(TabWnd[seltab], btn_firstid+bgci*6), true); \ - } \ -} - -#define UpdateSliderValue(usv_id, usv_v) \ -{ \ - usv_v = SendMessage(GetDlgItem(ModuleWnd[uid], usv_id), TBM_GETPOS, 0, 0); \ - sprintf(SliderValTxt, "%d", usv_v); \ - SetWindowText(GetDlgItem(ModuleWnd[uid], usv_id ## _VAL), SliderValTxt); \ -} - -#define UpdateSliderValueCenter(usv_id, usv_v) \ -{ \ - usv_v = SendMessage(GetDlgItem(ModuleWnd[uid], usv_id), TBM_GETPOS, 0, 0); \ - sprintf(SliderValTxt, "%d", usv_v-64); \ - SetWindowText(GetDlgItem(ModuleWnd[uid], usv_id ## _VAL), SliderValTxt); \ -} - -#define UpdateSliderValueCenter2(usv_id, usv_v) \ -{ \ - usv_v = SendMessage(GetDlgItem(ModuleWnd[uid], usv_id), TBM_GETPOS, 0, 0); \ - sprintf(SliderValTxt, "%d", (usv_v-64)*2); \ - SetWindowText(GetDlgItem(ModuleWnd[uid], usv_id ## _VAL), SliderValTxt); \ -} - -void Go4kVSTiGUI_Create(HINSTANCE hInst); -void Go4kVSTiGUI_Show(int showCommand); -void Go4kVSTiGUI_Destroy(); - -bool InitTabDlg(); - -bool ButtonPressed(WPARAM id, LPARAM lParam); -bool ScrollbarChanged(HWND hwndDlg, WPARAM wParam, LPARAM lParam); -bool StackButtonPressed(WPARAM id); -void TabChanged(int index); - -void UpdateSignalCount(int channel); -void UpdateControls(int channel); -void UpdateModuleParamWindow(int tab, int unit); -void UpdateVoiceDisplay(int i); - -void GetStreamFileName(); - - - +#include + +#define ButtonGroupChanged(btn_firstid, btn_lastid, test_id, seltab, result_index) \ +{ \ + result_index = 0; \ + if (LOWORD(test_id) >= btn_firstid && \ + LOWORD(test_id) <= btn_lastid) \ + { \ + for (WORD bgci = btn_firstid; bgci <= btn_lastid; bgci++) \ + { \ + if (LOWORD(test_id) == bgci) \ + { \ + EnableWindow(GetDlgItem(ModuleWnd[seltab], bgci), false); \ + result_index = bgci; \ + } \ + else \ + { \ + EnableWindow(GetDlgItem(ModuleWnd[seltab], bgci), true); \ + } \ + } \ + } \ +} + +#define EnableButtonGroup(btn_firstid, btn_lastid, seltab, btn_show) \ +{ \ + for (WORD bgci = btn_firstid; bgci <= btn_lastid; bgci++) \ + { \ + EnableWindow(GetDlgItem(ModuleWnd[seltab], bgci), btn_show); \ + } \ +} + +#define SetCheckboxGroupBitmask(btn_firstid, btn_lastid, seltab, input_bits) \ +{ \ + WORD curbitsel = 0x0001; \ + for (WORD bgci = btn_firstid; bgci <= btn_lastid; bgci++,curbitsel*=2) \ + { \ + SendDlgItemMessage(ModuleWnd[seltab], bgci, BM_SETCHECK, input_bits & curbitsel, 0); \ + } \ +} + +#define GetCheckboxGroupBitmask(btn_firstid, btn_lastid, test_id, seltab, result_bits, result_index) \ +{ \ + result_index = 0; \ + result_bits = 0; \ + WORD curbitsel = 0x0001; \ + if (LOWORD(test_id) >= btn_firstid && \ + LOWORD(test_id) <= btn_lastid) \ + { \ + for (WORD bgci = btn_firstid; bgci <= btn_lastid; bgci++,curbitsel*=2) \ + { \ + if (LOWORD(test_id) == bgci) \ + { \ + result_index = bgci; \ + } \ + if (SendDlgItemMessage(ModuleWnd[seltab], bgci, BM_GETCHECK, 0, 0)==BST_CHECKED) \ + { \ + result_bits |= curbitsel; \ + } \ + else \ + { \ + result_bits &= ~curbitsel; \ + } \ + } \ + } \ +} + +#define InitSlider(tab_id, slider_id, slider_low, slider_hi, slider_pos) \ +{ \ + SendDlgItemMessage(tab_id, slider_id, TBM_SETRANGE, true, MAKELONG(slider_low, slider_hi)); \ + SendDlgItemMessage(tab_id, slider_id, TBM_SETPOS, true, slider_pos); \ + SendDlgItemMessage(tab_id, slider_id, TBM_SETLINESIZE, 0, 1); \ + SendDlgItemMessage(tab_id, slider_id, TBM_SETPAGESIZE, 0, 1); \ + sprintf(SliderValTxt, "%d", slider_pos); \ + SetWindowText(GetDlgItem(tab_id, slider_id ## _VAL), SliderValTxt); \ +} + +#define InitSliderCenter(tab_id, slider_id, slider_low, slider_hi, slider_pos) \ +{ \ + SendDlgItemMessage(tab_id, slider_id, TBM_SETRANGE, true, MAKELONG(slider_low, slider_hi)); \ + SendDlgItemMessage(tab_id, slider_id, TBM_SETPOS, true, slider_pos); \ + SendDlgItemMessage(tab_id, slider_id, TBM_SETLINESIZE, 0, 1); \ + SendDlgItemMessage(tab_id, slider_id, TBM_SETPAGESIZE, 0, 1); \ + sprintf(SliderValTxt, "%d", slider_pos-64); \ + SetWindowText(GetDlgItem(tab_id, slider_id ## _VAL), SliderValTxt); \ +} + +#define InitSliderCenter2(tab_id, slider_id, slider_low, slider_hi, slider_pos) \ +{ \ + SendDlgItemMessage(tab_id, slider_id, TBM_SETRANGE, true, MAKELONG(slider_low, slider_hi)); \ + SendDlgItemMessage(tab_id, slider_id, TBM_SETPOS, true, slider_pos); \ + SendDlgItemMessage(tab_id, slider_id, TBM_SETLINESIZE, 0, 1); \ + SendDlgItemMessage(tab_id, slider_id, TBM_SETPAGESIZE, 0, 1); \ + sprintf(SliderValTxt, "%d", (slider_pos-64)*2); \ + SetWindowText(GetDlgItem(tab_id, slider_id ## _VAL), SliderValTxt); \ +} + +#define InitSliderNoGUI(tab_id, slider_id, slider_low, slider_hi, slider_pos) \ +{ \ + SendDlgItemMessage(tab_id, slider_id, TBM_SETRANGE, true, MAKELONG(slider_low, slider_hi)); \ + SendDlgItemMessage(tab_id, slider_id, TBM_SETPOS, true, slider_pos); \ + SendDlgItemMessage(tab_id, slider_id, TBM_SETLINESIZE, 0, 1); \ + SendDlgItemMessage(tab_id, slider_id, TBM_SETPAGESIZE, 0, 1); \ +} + +#define DisableButtonGroup(btn_firstid, btn_lastid, seltab) \ +{ \ + for (WORD bgci = btn_firstid; bgci <= btn_lastid; bgci++) \ + { \ + EnableWindow(GetDlgItem(ModuleWnd[seltab], bgci), true); \ + } \ +} + +#define InterleavedButtonGroupChanged(btn_firstid, btn_count, test_id, result_index)\ +{ \ + result_index = -1; \ + if (((LOWORD(test_id)-btn_firstid) % 6) == 0) \ + { \ + for (WORD bgci = 0; bgci < btn_count; bgci++) \ + { \ + WORD ibtn = btn_firstid+bgci*6; \ + if (LOWORD(test_id) == ibtn) \ + { \ + EnableWindow(GetDlgItem(TabWnd[SelectedTab], ibtn), false); \ + result_index = bgci; \ + } \ + else \ + { \ + EnableWindow(GetDlgItem(TabWnd[SelectedTab], ibtn), true); \ + } \ + } \ + } \ +} + +#define DisableInterleavedButtonGroup(btn_firstid, btn_count, seltab) \ +{ \ + for (WORD bgci = 0; bgci < btn_count; bgci++) \ + { \ + EnableWindow(GetDlgItem(TabWnd[seltab], btn_firstid+bgci*6), true); \ + } \ +} + +#define UpdateSliderValue(usv_id, usv_v) \ +{ \ + usv_v = SendMessage(GetDlgItem(ModuleWnd[uid], usv_id), TBM_GETPOS, 0, 0); \ + sprintf(SliderValTxt, "%d", usv_v); \ + SetWindowText(GetDlgItem(ModuleWnd[uid], usv_id ## _VAL), SliderValTxt); \ +} + +#define UpdateSliderValueCenter(usv_id, usv_v) \ +{ \ + usv_v = SendMessage(GetDlgItem(ModuleWnd[uid], usv_id), TBM_GETPOS, 0, 0); \ + sprintf(SliderValTxt, "%d", usv_v-64); \ + SetWindowText(GetDlgItem(ModuleWnd[uid], usv_id ## _VAL), SliderValTxt); \ +} + +#define UpdateSliderValueCenter2(usv_id, usv_v) \ +{ \ + usv_v = SendMessage(GetDlgItem(ModuleWnd[uid], usv_id), TBM_GETPOS, 0, 0); \ + sprintf(SliderValTxt, "%d", (usv_v-64)*2); \ + SetWindowText(GetDlgItem(ModuleWnd[uid], usv_id ## _VAL), SliderValTxt); \ +} + +void Go4kVSTiGUI_Create(HINSTANCE hInst); +void Go4kVSTiGUI_Show(int showCommand); +void Go4kVSTiGUI_Destroy(); + +bool InitTabDlg(); + +bool ButtonPressed(WPARAM id, LPARAM lParam); +bool ScrollbarChanged(HWND hwndDlg, WPARAM wParam, LPARAM lParam); +bool StackButtonPressed(WPARAM id); +void TabChanged(int index); + +void UpdateSignalCount(int channel); +void UpdateControls(int channel); +void UpdateModuleParamWindow(int tab, int unit); +void UpdateVoiceDisplay(int i); + +void GetStreamFileName(); + + + diff --git a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTimain.cpp b/src/vsti/Go4kVSTimain.cpp similarity index 96% rename from 4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTimain.cpp rename to src/vsti/Go4kVSTimain.cpp index e8d91d9..cf47126 100644 --- a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTimain.cpp +++ b/src/vsti/Go4kVSTimain.cpp @@ -1,60 +1,60 @@ -#include -#include -#include "Go4kVSTi.h" -#include "Go4kVSTiGUI.h" - -static AudioEffect *effect = 0; -bool oome = false; - -//------------------------------------------------------------------------ -// prototype of the export function main -int main (audioMasterCallback audioMaster); - -int main (audioMasterCallback audioMaster) -{ - // get vst version - if(!audioMaster (0, audioMasterVersion, 0, 0, 0, 0)) - return 0; // old version - - effect = new Go4kVSTi (audioMaster); - if (!effect) - return 0; - if (oome) - { - delete effect; - return 0; - } - return (int)effect->getAeffect(); -} - -void* hInstance; -BOOL WINAPI DllMain (HINSTANCE hInst, DWORD dwReason, LPVOID lpvReserved) -{ - switch (dwReason) - { - // wird aufgerufen, wenn zum ersten mal das plugin aktiviert wird - // also hier init für den synth - case DLL_PROCESS_ATTACH: - //MessageBox(NULL, "DLL_PROCESS_ATTACH", "DllMain", MB_OK); - Go4kVSTiGUI_Create(hInst); - Go4kVSTiGUI_Show(SW_SHOW); - break; - // wird aufgerufen, wenn das plugin nicht mehr verwendet wird - // entweder bei entfernen des letzten, schliessen des songs oder - // des programms. Also hier Deinit und zerstörung des Synths - case DLL_PROCESS_DETACH: - //MessageBox(NULL, "DLL_PROCESS_DETACH", "DllMain", MB_OK); - Go4kVSTiGUI_Destroy(); - effect = 0; - break; - // die beiden brauchts wohl nicht - case DLL_THREAD_ATTACH: - //MessageBox(NULL, "DLL_THREAD_ATTACH", "DllMain", MB_OK); - break; - case DLL_THREAD_DETACH: - //MessageBox(NULL, "DLL_THREAD_DETACH", "DllMain", MB_OK); - break; - } - hInstance = hInst; - return 1; -} +#include +#include +#include "Go4kVSTi.h" +#include "Go4kVSTiGUI.h" + +static AudioEffect *effect = 0; +bool oome = false; + +//------------------------------------------------------------------------ +// prototype of the export function main +int main (audioMasterCallback audioMaster); + +int main (audioMasterCallback audioMaster) +{ + // get vst version + if(!audioMaster (0, audioMasterVersion, 0, 0, 0, 0)) + return 0; // old version + + effect = new Go4kVSTi (audioMaster); + if (!effect) + return 0; + if (oome) + { + delete effect; + return 0; + } + return (int)effect->getAeffect(); +} + +void* hInstance; +BOOL WINAPI DllMain (HINSTANCE hInst, DWORD dwReason, LPVOID lpvReserved) +{ + switch (dwReason) + { + // wird aufgerufen, wenn zum ersten mal das plugin aktiviert wird + // also hier init für den synth + case DLL_PROCESS_ATTACH: + //MessageBox(NULL, "DLL_PROCESS_ATTACH", "DllMain", MB_OK); + Go4kVSTiGUI_Create(hInst); + Go4kVSTiGUI_Show(SW_SHOW); + break; + // wird aufgerufen, wenn das plugin nicht mehr verwendet wird + // entweder bei entfernen des letzten, schliessen des songs oder + // des programms. Also hier Deinit und zerstörung des Synths + case DLL_PROCESS_DETACH: + //MessageBox(NULL, "DLL_PROCESS_DETACH", "DllMain", MB_OK); + Go4kVSTiGUI_Destroy(); + effect = 0; + break; + // die beiden brauchts wohl nicht + case DLL_THREAD_ATTACH: + //MessageBox(NULL, "DLL_THREAD_ATTACH", "DllMain", MB_OK); + break; + case DLL_THREAD_DETACH: + //MessageBox(NULL, "DLL_THREAD_DETACH", "DllMain", MB_OK); + break; + } + hInstance = hInst; + return 1; +} diff --git a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiproc.cpp b/src/vsti/Go4kVSTiproc.cpp similarity index 96% rename from 4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiproc.cpp rename to src/vsti/Go4kVSTiproc.cpp index 5bb69db..daa2d0e 100644 --- a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiproc.cpp +++ b/src/vsti/Go4kVSTiproc.cpp @@ -1,158 +1,158 @@ -#ifndef __Go4kVSTi__ -#include "Go4kVSTi.h" -#include "Go4kVSTiCore.h" -#include "stdio.h" -#endif - -#include "math.h" - -//----------------------------------------------------------------------------------------- -void Go4kVSTi::setSampleRate (float sampleRate) -{ - AudioEffectX::setSampleRate (sampleRate); -} - -//----------------------------------------------------------------------------------------- -void Go4kVSTi::setBlockSize (long blockSize) -{ - AudioEffectX::setBlockSize (blockSize); - // you may need to have to do something here... -} - -//----------------------------------------------------------------------------------------- -void Go4kVSTi::suspend () -{ - m_currentEvents.clear(); -} - -//----------------------------------------------------------------------------------------- -void Go4kVSTi::resume () -{ - wantEvents (); -} - -//----------------------------------------------------------------------------------------- -void Go4kVSTi::initProcess () -{ -} - -//----------------------------------------------------------------------------------------- -void Go4kVSTi::process (float **inputs, float **outputs, long sampleFrames) -{ - processAnyhow(inputs, outputs, sampleFrames); -} - -//----------------------------------------------------------------------------------------- -void Go4kVSTi::processReplacing (float **inputs, float **outputs, long sampleFrames) -{ - processAnyhow(inputs, outputs, sampleFrames); -} - -void Go4kVSTi::processAnyhow(float **inputs, float **outputs, long sampleFrames) -{ - float* outl = outputs[0]; - float* outr = outputs[1]; - static int bpmCheck = 0; - if ( bpmCheck <= 0 ) - { - VstTimeInfo* myTime = getTimeInfo ( kVstTempoValid ); - Go4kVSTi_SetBPM(myTime->tempo); - bpmCheck = 20; // only check every 20th call of this function (bpm shouldnt change that often) - } - bpmCheck--; - - int start = 0; - // midi events will occur this frame, so render partially - if (m_currentEvents.size() > 0) - { - // for all events - for (unsigned int i = 0; i < m_currentEvents.size(); i++) - { - // process samples until next event - int todo = m_currentEvents[i]->deltaFrames - start; - Go4kVSTi_Tick(outl+start, outr+start, todo); - start = m_currentEvents[i]->deltaFrames; - // apply changes due to event - ApplyEvent(m_currentEvents[i]); - } - } - Go4kVSTi_Tick(outl+start, outr+start, sampleFrames - start); - - // clear event list (old event pointer wont be valid next frame anyway) - m_currentEvents.clear(); -} - -//----------------------------------------------------------------------------------------- -long Go4kVSTi::processEvents(VstEvents* ev) -{ - for (long i = 0; i < ev->numEvents; i++) - { - if ((ev->events[i])->type != kVstMidiType) - continue; - VstMidiEvent* event = (VstMidiEvent*)ev->events[i]; - m_currentEvents.push_back(event); - } - return 1; // want more -} - -//----------------------------------------------------------------------------------------- -void Go4kVSTi::ApplyEvent(VstMidiEvent *event) -{ - char* midiData = event->midiData; - byte status = midiData[0] & 0xf0; // status - byte channel = midiData[0] & 0x0f; // channel - - // note on/off events - if (status == 0x90 || status == 0x80) - { - byte note = midiData[1] & 0x7f; - byte velocity = midiData[2] & 0x7f; - if (status == 0x80) - velocity = 0; - // note off - if (!velocity) - { - Go4kVSTi_StopVoice(channel, note); - } - // note on - else - { - Go4kVSTi_AddVoice(channel, note); - } - } -/* // polyphonic aftertouch - else if (status == 0xA) - { - byte note = midiData[1] & 0x7f; - byte pressure = midiData[2] & 0x7f; - Go4kVSTi_PolyAftertouch(channel, note, pressure); - } - // channel aftertouch - else if (status == 0xD) - { - byte pressure = midiData[1] & 0x7f; - Go4kVSTi_ChannelAftertouch(channel, pressure); - } - // Controller Change - else if (status == 0xB0) - { - byte number = midiData[1] & 0x7f; - byte value = midiData[2] & 0x7f; -// Go4kVSTi_ControllerChange(channel, number, value, event->deltaFrames); - } - // Pitch Bend - else if (status == 0xE0) - { - byte lsb = midiData[1] & 0x7f; - byte msb = midiData[2] & 0x7f; - int value = (((int)(msb)) << 7) + lsb; -// Go4kVSTi_PitchBend(channel, value); // 0 - 16383, center 8192 - // dont use full precision for the sake of equally sized streams -// Go4kVSTi_PitchBend(channel, value >> 7, event->deltaFrames); // 0 - 127, center 64 - }*/ - // all notes off (dont seem to come anyway - else if (status == 0xb0 && midiData[1] == 0x7e) // all notes off - { - Go4kVSTi_StopVoice(channel, 0); - } -} +#ifndef __Go4kVSTi__ +#include "Go4kVSTi.h" +#include "Go4kVSTiCore.h" +#include "stdio.h" +#endif + +#include "math.h" + +//----------------------------------------------------------------------------------------- +void Go4kVSTi::setSampleRate (float sampleRate) +{ + AudioEffectX::setSampleRate (sampleRate); +} + +//----------------------------------------------------------------------------------------- +void Go4kVSTi::setBlockSize (long blockSize) +{ + AudioEffectX::setBlockSize (blockSize); + // you may need to have to do something here... +} + +//----------------------------------------------------------------------------------------- +void Go4kVSTi::suspend () +{ + m_currentEvents.clear(); +} + +//----------------------------------------------------------------------------------------- +void Go4kVSTi::resume () +{ + wantEvents (); +} + +//----------------------------------------------------------------------------------------- +void Go4kVSTi::initProcess () +{ +} + +//----------------------------------------------------------------------------------------- +void Go4kVSTi::process (float **inputs, float **outputs, long sampleFrames) +{ + processAnyhow(inputs, outputs, sampleFrames); +} + +//----------------------------------------------------------------------------------------- +void Go4kVSTi::processReplacing (float **inputs, float **outputs, long sampleFrames) +{ + processAnyhow(inputs, outputs, sampleFrames); +} + +void Go4kVSTi::processAnyhow(float **inputs, float **outputs, long sampleFrames) +{ + float* outl = outputs[0]; + float* outr = outputs[1]; + static int bpmCheck = 0; + if ( bpmCheck <= 0 ) + { + VstTimeInfo* myTime = getTimeInfo ( kVstTempoValid ); + Go4kVSTi_SetBPM(myTime->tempo); + bpmCheck = 20; // only check every 20th call of this function (bpm shouldnt change that often) + } + bpmCheck--; + + int start = 0; + // midi events will occur this frame, so render partially + if (m_currentEvents.size() > 0) + { + // for all events + for (unsigned int i = 0; i < m_currentEvents.size(); i++) + { + // process samples until next event + int todo = m_currentEvents[i]->deltaFrames - start; + Go4kVSTi_Tick(outl+start, outr+start, todo); + start = m_currentEvents[i]->deltaFrames; + // apply changes due to event + ApplyEvent(m_currentEvents[i]); + } + } + Go4kVSTi_Tick(outl+start, outr+start, sampleFrames - start); + + // clear event list (old event pointer wont be valid next frame anyway) + m_currentEvents.clear(); +} + +//----------------------------------------------------------------------------------------- +long Go4kVSTi::processEvents(VstEvents* ev) +{ + for (long i = 0; i < ev->numEvents; i++) + { + if ((ev->events[i])->type != kVstMidiType) + continue; + VstMidiEvent* event = (VstMidiEvent*)ev->events[i]; + m_currentEvents.push_back(event); + } + return 1; // want more +} + +//----------------------------------------------------------------------------------------- +void Go4kVSTi::ApplyEvent(VstMidiEvent *event) +{ + char* midiData = event->midiData; + byte status = midiData[0] & 0xf0; // status + byte channel = midiData[0] & 0x0f; // channel + + // note on/off events + if (status == 0x90 || status == 0x80) + { + byte note = midiData[1] & 0x7f; + byte velocity = midiData[2] & 0x7f; + if (status == 0x80) + velocity = 0; + // note off + if (!velocity) + { + Go4kVSTi_StopVoice(channel, note); + } + // note on + else + { + Go4kVSTi_AddVoice(channel, note); + } + } +/* // polyphonic aftertouch + else if (status == 0xA) + { + byte note = midiData[1] & 0x7f; + byte pressure = midiData[2] & 0x7f; + Go4kVSTi_PolyAftertouch(channel, note, pressure); + } + // channel aftertouch + else if (status == 0xD) + { + byte pressure = midiData[1] & 0x7f; + Go4kVSTi_ChannelAftertouch(channel, pressure); + } + // Controller Change + else if (status == 0xB0) + { + byte number = midiData[1] & 0x7f; + byte value = midiData[2] & 0x7f; +// Go4kVSTi_ControllerChange(channel, number, value, event->deltaFrames); + } + // Pitch Bend + else if (status == 0xE0) + { + byte lsb = midiData[1] & 0x7f; + byte msb = midiData[2] & 0x7f; + int value = (((int)(msb)) << 7) + lsb; +// Go4kVSTi_PitchBend(channel, value); // 0 - 16383, center 8192 + // dont use full precision for the sake of equally sized streams +// Go4kVSTi_PitchBend(channel, value >> 7, event->deltaFrames); // 0 - 127, center 64 + }*/ + // all notes off (dont seem to come anyway + else if (status == 0xb0 && midiData[1] == 0x7e) // all notes off + { + Go4kVSTi_StopVoice(channel, 0); + } +} diff --git a/4klang_source/Go4kVSTi/source/common/AEffEditor.hpp b/src/vsti/audioeffect/AEffEditor.hpp similarity index 95% rename from 4klang_source/Go4kVSTi/source/common/AEffEditor.hpp rename to src/vsti/audioeffect/AEffEditor.hpp index 16d5fa1..7bbf910 100644 --- a/4klang_source/Go4kVSTi/source/common/AEffEditor.hpp +++ b/src/vsti/audioeffect/AEffEditor.hpp @@ -1,44 +1,44 @@ -#ifndef __AEffEditor__ -#define __AEffEditor__ - -class AudioEffect; - -struct ERect -{ - short top; - short left; - short bottom; - short right; -}; - -class AEffEditor -{ -public: - AEffEditor (AudioEffect *effect) {this->effect = effect; updateFlag = 0; } - virtual ~AEffEditor() {} - - virtual long getRect(ERect **rect) {*rect = 0; return 0;} - virtual long open(void *ptr) {systemWindow = ptr; return 0;} - virtual void close() {} - virtual void idle() { if(updateFlag) {updateFlag = 0; update();} } - -#if MAC - virtual void draw(ERect *rect) {rect = rect;} - virtual long mouse(long x, long y) {x = x; y = y; return 0;} - virtual long key(long keyCode) {keyCode = keyCode; return 0;} - virtual void top() {} - virtual void sleep() {} -#endif - virtual void update() {} - virtual void postUpdate() {updateFlag = 1;} - -protected: - AEffEditor () {}; - - AudioEffect *effect; - void *systemWindow; - long updateFlag; -}; - -#endif - +#ifndef __AEffEditor__ +#define __AEffEditor__ + +class AudioEffect; + +struct ERect +{ + short top; + short left; + short bottom; + short right; +}; + +class AEffEditor +{ +public: + AEffEditor (AudioEffect *effect) {this->effect = effect; updateFlag = 0; } + virtual ~AEffEditor() {} + + virtual long getRect(ERect **rect) {*rect = 0; return 0;} + virtual long open(void *ptr) {systemWindow = ptr; return 0;} + virtual void close() {} + virtual void idle() { if(updateFlag) {updateFlag = 0; update();} } + +#if MAC + virtual void draw(ERect *rect) {rect = rect;} + virtual long mouse(long x, long y) {x = x; y = y; return 0;} + virtual long key(long keyCode) {keyCode = keyCode; return 0;} + virtual void top() {} + virtual void sleep() {} +#endif + virtual void update() {} + virtual void postUpdate() {updateFlag = 1;} + +protected: + AEffEditor () {}; + + AudioEffect *effect; + void *systemWindow; + long updateFlag; +}; + +#endif + diff --git a/4klang_source/Go4kVSTi/source/common/AEffect.h b/src/vsti/audioeffect/AEffect.h similarity index 97% rename from 4klang_source/Go4kVSTi/source/common/AEffect.h rename to src/vsti/audioeffect/AEffect.h index c6c9557..e125461 100644 --- a/4klang_source/Go4kVSTi/source/common/AEffect.h +++ b/src/vsti/audioeffect/AEffect.h @@ -1,172 +1,172 @@ -#ifndef __AEffect__ -#define __AEffect__ - -/* - to create an Audio Effect for power pc's, create a - code resource - file type: 'aPcs' - resource type: 'aEff' - ppc header: none (raw pef) - - for windows, it's a .dll - - the only symbol searched for is: - AEffect *main(float (*audioMaster)(AEffect *effect, long opcode, long index, - long value, void *ptr, float opt)); -*/ - -#if PRAGMA_ALIGN_SUPPORTED || __MWERKS__ - #pragma options align=mac68k -#elif defined CBUILDER - #pragma -a8 -#elif defined(WIN32) || defined(__FLAT__) - #pragma pack(push) - #pragma pack(8) -#endif - -#if defined(WIN32) || defined(__FLAT__) || defined CBUILDER - #define VSTCALLBACK __cdecl -#else - #define VSTCALLBACK -#endif - -//--------------------------------------------------------------------------------------------- -// misc def's -//--------------------------------------------------------------------------------------------- - -typedef struct AEffect AEffect; -typedef long (VSTCALLBACK *audioMasterCallback)(AEffect *effect, long opcode, long index, - long value, void *ptr, float opt); - -// prototype for plug-in main -// AEffect *main(audioMasterCallback audioMaster); - -#ifdef CBUILDER - #define kEffectMagic 'PtsV' -#else - #define kEffectMagic 'VstP' -#endif - -//--------------------------------------------------------------------------------------------- -//--------------------------------------------------------------------------------------------- - -struct AEffect -{ - long magic; // must be kEffectMagic ('VstP') - long (VSTCALLBACK *dispatcher)(AEffect *effect, long opCode, long index, long value, - void *ptr, float opt); - void (VSTCALLBACK *process)(AEffect *effect, float **inputs, float **outputs, long sampleframes); - void (VSTCALLBACK *setParameter)(AEffect *effect, long index, float parameter); - float (VSTCALLBACK *getParameter)(AEffect *effect, long index); - - long numPrograms; - long numParams; // all programs are assumed to have numParams parameters - long numInputs; // - long numOutputs; // - long flags; // see constants - long resvd1; // reserved, must be 0 - long resvd2; // reserved, must be 0 - long initialDelay; // for algorithms which need input in the first place - long realQualities; // number of realtime qualities (0: realtime) - long offQualities; // number of offline qualities (0: realtime only) - float ioRatio; // input samplerate to output samplerate ratio, not used yet - void *object; // for class access (see AudioEffect.hpp), MUST be 0 else! - void *user; // user access - long uniqueID; // pls choose 4 character as unique as possible. - // this is used to identify an effect for save+load - long version; // - void (VSTCALLBACK *processReplacing)(AEffect *effect, float **inputs, float **outputs, long sampleframes); - char future[60]; // pls zero -}; - - -//--------------------------------------------------------------------------------------------- -// flags bits -//--------------------------------------------------------------------------------------------- - -#define effFlagsHasEditor 1 // if set, is expected to react to editor messages -#define effFlagsHasClip 2 // return > 1. in getVu() if clipped -#define effFlagsHasVu 4 // return vu value in getVu(); > 1. means clipped -#define effFlagsCanMono 8 // if numInputs == 2, makes sense to be used for mono in -#define effFlagsCanReplacing 16 // supports in place output (processReplacing() exsists) -#define effFlagsProgramChunks 32 // program data are handled in formatless chunks - -//--------------------------------------------------------------------------------------------- -// dispatcher opCodes -//--------------------------------------------------------------------------------------------- - -enum -{ - effOpen = 0, // initialise - effClose, // exit, release all memory and other resources! - - effSetProgram, // program no in - effGetProgram, // return current program no. - effSetProgramName, // user changed program name (max 24 char + 0) to as passed in string - effGetProgramName, // stuff program name (max 24 char + 0) into string - - effGetParamLabel, // stuff parameter label (max 8 char + 0) into string - // (examples: sec, dB, type) - effGetParamDisplay, // stuff parameter textual representation into string - // (examples: 0.5, -3, PLATE) - effGetParamName, // stuff parameter label (max 8 char + 0) into string - // (examples: Time, Gain, RoomType) - effGetVu, // called if (flags & (effFlagsHasClip | effFlagsHasVu)) - - // system - - effSetSampleRate, // in opt (float) - effSetBlockSize, // in value - effMainsChanged, // the user has switched the 'power on' button to - // value (0 off, else on). This only switches audio - // processing; you should flush delay buffers etc. - // editor - - effEditGetRect, // stuff rect (top, left, bottom, right) into ptr - effEditOpen, // system dependant Window pointer in ptr - effEditClose, // no arguments - effEditDraw, // draw method, ptr points to rect - effEditMouse, // index: x, value: y - effEditKey, // system keycode in value - effEditIdle, // no arguments. Be gentle! - effEditTop, // window has topped, no arguments - effEditSleep, // window goes to background - - // new - - effIdentify, // returns 'NvEf' - effGetChunk, // host requests pointer to chunk into (void**)ptr, byteSize returned - effSetChunk, // plug-in receives saved chunk, byteSize passed - - effNumOpcodes -}; - -//--------------------------------------------------------------------------------------------- -// audioMaster opCodes -//--------------------------------------------------------------------------------------------- - -enum -{ - audioMasterAutomate = 0, // index, value, returns 0 - audioMasterVersion, // vst version, currently 2 (0 for older) - audioMasterCurrentId, // returns the unique id of a plug that's currently - // loading - audioMasterIdle, // call application idle routine (this will - // call effEditIdle for all open editors too) - audioMasterPinConnected // inquire if an input or output is beeing connected; - // index enumerates input or output counting from zero, - // value is 0 for input and != 0 otherwise. note: the - // return value is 0 for such that older versions - // will always return true. - -}; - -#if PRAGMA_ALIGN_SUPPORTED || __MWERKS__ - #pragma options align=reset -#elif defined(WIN32) || defined(__FLAT__) - #pragma pack(pop) -#elif defined CBUILDER - #pragma -a- -#endif - -#endif // __AEffect__ +#ifndef __AEffect__ +#define __AEffect__ + +/* + to create an Audio Effect for power pc's, create a + code resource + file type: 'aPcs' + resource type: 'aEff' + ppc header: none (raw pef) + + for windows, it's a .dll + + the only symbol searched for is: + AEffect *main(float (*audioMaster)(AEffect *effect, long opcode, long index, + long value, void *ptr, float opt)); +*/ + +#if PRAGMA_ALIGN_SUPPORTED || __MWERKS__ + #pragma options align=mac68k +#elif defined CBUILDER + #pragma -a8 +#elif defined(WIN32) || defined(__FLAT__) + #pragma pack(push) + #pragma pack(8) +#endif + +#if defined(WIN32) || defined(__FLAT__) || defined CBUILDER + #define VSTCALLBACK __cdecl +#else + #define VSTCALLBACK +#endif + +//--------------------------------------------------------------------------------------------- +// misc def's +//--------------------------------------------------------------------------------------------- + +typedef struct AEffect AEffect; +typedef long (VSTCALLBACK *audioMasterCallback)(AEffect *effect, long opcode, long index, + long value, void *ptr, float opt); + +// prototype for plug-in main +// AEffect *main(audioMasterCallback audioMaster); + +#ifdef CBUILDER + #define kEffectMagic 'PtsV' +#else + #define kEffectMagic 'VstP' +#endif + +//--------------------------------------------------------------------------------------------- +//--------------------------------------------------------------------------------------------- + +struct AEffect +{ + long magic; // must be kEffectMagic ('VstP') + long (VSTCALLBACK *dispatcher)(AEffect *effect, long opCode, long index, long value, + void *ptr, float opt); + void (VSTCALLBACK *process)(AEffect *effect, float **inputs, float **outputs, long sampleframes); + void (VSTCALLBACK *setParameter)(AEffect *effect, long index, float parameter); + float (VSTCALLBACK *getParameter)(AEffect *effect, long index); + + long numPrograms; + long numParams; // all programs are assumed to have numParams parameters + long numInputs; // + long numOutputs; // + long flags; // see constants + long resvd1; // reserved, must be 0 + long resvd2; // reserved, must be 0 + long initialDelay; // for algorithms which need input in the first place + long realQualities; // number of realtime qualities (0: realtime) + long offQualities; // number of offline qualities (0: realtime only) + float ioRatio; // input samplerate to output samplerate ratio, not used yet + void *object; // for class access (see AudioEffect.hpp), MUST be 0 else! + void *user; // user access + long uniqueID; // pls choose 4 character as unique as possible. + // this is used to identify an effect for save+load + long version; // + void (VSTCALLBACK *processReplacing)(AEffect *effect, float **inputs, float **outputs, long sampleframes); + char future[60]; // pls zero +}; + + +//--------------------------------------------------------------------------------------------- +// flags bits +//--------------------------------------------------------------------------------------------- + +#define effFlagsHasEditor 1 // if set, is expected to react to editor messages +#define effFlagsHasClip 2 // return > 1. in getVu() if clipped +#define effFlagsHasVu 4 // return vu value in getVu(); > 1. means clipped +#define effFlagsCanMono 8 // if numInputs == 2, makes sense to be used for mono in +#define effFlagsCanReplacing 16 // supports in place output (processReplacing() exsists) +#define effFlagsProgramChunks 32 // program data are handled in formatless chunks + +//--------------------------------------------------------------------------------------------- +// dispatcher opCodes +//--------------------------------------------------------------------------------------------- + +enum +{ + effOpen = 0, // initialise + effClose, // exit, release all memory and other resources! + + effSetProgram, // program no in + effGetProgram, // return current program no. + effSetProgramName, // user changed program name (max 24 char + 0) to as passed in string + effGetProgramName, // stuff program name (max 24 char + 0) into string + + effGetParamLabel, // stuff parameter label (max 8 char + 0) into string + // (examples: sec, dB, type) + effGetParamDisplay, // stuff parameter textual representation into string + // (examples: 0.5, -3, PLATE) + effGetParamName, // stuff parameter label (max 8 char + 0) into string + // (examples: Time, Gain, RoomType) + effGetVu, // called if (flags & (effFlagsHasClip | effFlagsHasVu)) + + // system + + effSetSampleRate, // in opt (float) + effSetBlockSize, // in value + effMainsChanged, // the user has switched the 'power on' button to + // value (0 off, else on). This only switches audio + // processing; you should flush delay buffers etc. + // editor + + effEditGetRect, // stuff rect (top, left, bottom, right) into ptr + effEditOpen, // system dependant Window pointer in ptr + effEditClose, // no arguments + effEditDraw, // draw method, ptr points to rect + effEditMouse, // index: x, value: y + effEditKey, // system keycode in value + effEditIdle, // no arguments. Be gentle! + effEditTop, // window has topped, no arguments + effEditSleep, // window goes to background + + // new + + effIdentify, // returns 'NvEf' + effGetChunk, // host requests pointer to chunk into (void**)ptr, byteSize returned + effSetChunk, // plug-in receives saved chunk, byteSize passed + + effNumOpcodes +}; + +//--------------------------------------------------------------------------------------------- +// audioMaster opCodes +//--------------------------------------------------------------------------------------------- + +enum +{ + audioMasterAutomate = 0, // index, value, returns 0 + audioMasterVersion, // vst version, currently 2 (0 for older) + audioMasterCurrentId, // returns the unique id of a plug that's currently + // loading + audioMasterIdle, // call application idle routine (this will + // call effEditIdle for all open editors too) + audioMasterPinConnected // inquire if an input or output is beeing connected; + // index enumerates input or output counting from zero, + // value is 0 for input and != 0 otherwise. note: the + // return value is 0 for such that older versions + // will always return true. + +}; + +#if PRAGMA_ALIGN_SUPPORTED || __MWERKS__ + #pragma options align=reset +#elif defined(WIN32) || defined(__FLAT__) + #pragma pack(pop) +#elif defined CBUILDER + #pragma -a- +#endif + +#endif // __AEffect__ diff --git a/4klang_source/Go4kVSTi/source/common/AudioEffect.cpp b/src/vsti/audioeffect/AudioEffect.cpp similarity index 96% rename from 4klang_source/Go4kVSTi/source/common/AudioEffect.cpp rename to src/vsti/audioeffect/AudioEffect.cpp index 81f3198..ac4524b 100644 --- a/4klang_source/Go4kVSTi/source/common/AudioEffect.cpp +++ b/src/vsti/audioeffect/AudioEffect.cpp @@ -1,382 +1,382 @@ -#include -#include -#include -#include - -#include "AudioEffect.hpp" -#include "AEffEditor.hpp" - -//----------------------------------------------------------------------------- -long dispatchEffectClass (AEffect *e, long opCode, - long index, long value, void *ptr, float opt) -{ - AudioEffect *ae = (AudioEffect *)(e->object); - - if(opCode == effClose) - { - ae->dispatcher(opCode, index, value, ptr, opt); - delete ae; - return 1; - } - - return ae->dispatcher(opCode, index, value, ptr, opt); -} - -//----------------------------------------------------------------------------- -float getParameterClass(AEffect *e, long index) -{ - AudioEffect *ae = (AudioEffect *)(e->object); - return ae->getParameter(index); -} - -//----------------------------------------------------------------------------- -void setParameterClass(AEffect *e, long index, float value) -{ - AudioEffect *ae = (AudioEffect *)(e->object); - ae->setParameter(index, value); -} - -//----------------------------------------------------------------------------- -void processClass(AEffect *e, float **inputs, float **outputs, long sampleFrames) -{ - AudioEffect *ae = (AudioEffect *)(e->object); - ae->process(inputs, outputs, sampleFrames); -} - -//----------------------------------------------------------------------------- -void processClassReplacing(AEffect *e, float **inputs, float **outputs, long sampleFrames) -{ - AudioEffect *ae = (AudioEffect *)(e->object); - ae->processReplacing(inputs, outputs, sampleFrames); -} - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- - -AudioEffect::AudioEffect(audioMasterCallback audioMaster, long numPrograms, long numParams) -{ - this->audioMaster = audioMaster; - editor = 0; - this->numPrograms = numPrograms; - this->numParams = numParams; - curProgram = 0; - - memset(&cEffect, 0, sizeof(cEffect)); - cEffect.magic = kEffectMagic; - cEffect.dispatcher = dispatchEffectClass; - cEffect.process = processClass; - cEffect.setParameter = setParameterClass; - cEffect.getParameter = getParameterClass; - cEffect.numPrograms = numPrograms; - cEffect.numParams = numParams; - cEffect.numInputs = 1; - cEffect.numOutputs = 2; - cEffect.flags = 0; - cEffect.resvd1 = 0; - cEffect.resvd2 = 0; - cEffect.initialDelay = 0; - cEffect.realQualities = 0; - cEffect.offQualities = 0; - cEffect.ioRatio = 1.f; - cEffect.object = this; - cEffect.user = 0; - cEffect.uniqueID = 'NoEf'; // you must set this! - cEffect.version = 1; - cEffect.processReplacing = processClassReplacing; - - sampleRate = 44100.f; - blockSize = 1024L; -} - -//----------------------------------------------------------------------------- -AudioEffect::~AudioEffect() -{ - if(editor) - delete editor; -} - -//----------------------------------------------------------------------------- -long AudioEffect::dispatcher(long opCode, long index, long value, void *ptr, float opt) -{ - long v = 0; - - switch(opCode) - { - case effOpen: open(); break; - case effClose: close(); break; - case effSetProgram: if(value < numPrograms) setProgram(value); break; - case effGetProgram: v = getProgram(); break; - case effSetProgramName: setProgramName((char *)ptr); break; - case effGetProgramName: getProgramName((char *)ptr); break; - case effGetParamLabel: getParameterLabel(index, (char *)ptr); break; - case effGetParamDisplay: getParameterDisplay(index, (char *)ptr); break; - case effGetParamName: getParameterName(index, (char *)ptr); break; - - case effSetSampleRate: setSampleRate(opt); break; - case effSetBlockSize: setBlockSize(value); break; - case effMainsChanged: if(!value) suspend(); else resume(); break; - case effGetVu: v = (long)(getVu() * 32767.); break; - - // editor - - case effEditGetRect: if(editor) v = editor->getRect((ERect **)ptr); break; - case effEditOpen: if(editor) v = editor->open(ptr); break; - case effEditClose: if(editor) editor->close(); break; - case effEditIdle: if(editor) editor->idle(); break; - - #if MAC - case effEditDraw: if(editor) editor->draw((ERect *)ptr); break; - case effEditMouse: if(editor) v = editor->mouse(index, value); break; - case effEditKey: if(editor) v = editor->key(value); break; - case effEditTop: if(editor) editor->top(); break; - case effEditSleep: if(editor) editor->sleep(); break; - #endif - - // new - - case effIdentify: v = 'NvEf'; break; - case effGetChunk: v = getChunk((void**)ptr, index ? true : false); break; - case effSetChunk: v = setChunk(ptr, value, index ? true : false); break; - } - return v; -} - -//----------------------------------------------------------------------------- -long AudioEffect::getMasterVersion() -{ - long version = 1; - if(audioMaster) - { - version = audioMaster(&cEffect, audioMasterVersion, 0, 0, 0, 0); - if(!version) // old - version = 1; - } - return version; -} - -//----------------------------------------------------------------------------- -long AudioEffect::getCurrentUniqueId() -{ - long id = 0; - if(audioMaster) - id = audioMaster(&cEffect, audioMasterCurrentId, 0, 0, 0, 0); - return id; -} - -//----------------------------------------------------------------------------- -void AudioEffect::masterIdle() -{ - if(audioMaster) - audioMaster(&cEffect, audioMasterIdle, 0, 0, 0, 0); -} - -//----------------------------------------------------------------------------- -bool AudioEffect::isInputConnected(long input) -{ - long ret = 0; - if(audioMaster) - ret = audioMaster(&cEffect, audioMasterPinConnected, input, 0, 0, 0); - return ret ? false : true; // return value is 0 for true -} - -//----------------------------------------------------------------------------- -bool AudioEffect::isOutputConnected(long output) -{ - long ret = 0; - if(audioMaster) - ret = audioMaster(&cEffect, audioMasterPinConnected, output, 1, 0, 0); - return ret ? false : true; // return value is 0 for true -} - -//----------------------------------------------------------------------------- -// flags - -//----------------------------------------------------------------------------- -void AudioEffect::hasVu(bool state) -{ - if(state) - cEffect.flags |= effFlagsHasVu; - else - cEffect.flags &= ~effFlagsHasVu; -} - -//----------------------------------------------------------------------------- -void AudioEffect::hasClip(bool state) -{ - if(state) - cEffect.flags |= effFlagsHasClip; - else - cEffect.flags &= ~effFlagsHasClip; -} - -//----------------------------------------------------------------------------- -void AudioEffect::canMono(bool state) -{ - if(state) - cEffect.flags |= effFlagsCanMono; - else - cEffect.flags &= ~effFlagsCanMono; -} - -//----------------------------------------------------------------------------- -void AudioEffect::canProcessReplacing(bool state) -{ - if(state) - cEffect.flags |= effFlagsCanReplacing; - else - cEffect.flags &= ~effFlagsCanReplacing; -} - -//----------------------------------------------------------------------------- -void AudioEffect::programsAreChunks(bool state) -{ - if(state) - cEffect.flags |= effFlagsProgramChunks; - else - cEffect.flags &= ~effFlagsProgramChunks; -} - -//----------------------------------------------------------------------------- -void AudioEffect::setRealtimeQualities(long qualities) -{ - cEffect.realQualities = qualities; -} - -//----------------------------------------------------------------------------- -void AudioEffect::setOfflineQualities(long qualities) -{ - cEffect.offQualities = qualities; -} - -//----------------------------------------------------------------------------- -void AudioEffect::setInitialDelay(long delay) -{ - cEffect.initialDelay = delay; -} - -//----------------------------------------------------------------------------- -// string - -//----------------------------------------------------------------------------- -void AudioEffect::dB2string(float value, char *text) -{ - if(value <= 0) -#if MAC - strcpy(text, " -° "); -#else - strcpy(text, " -oo "); -#endif - else - float2string((float)(20. * log10(value)), text); -} - -//----------------------------------------------------------------------------- -void AudioEffect::Hz2string(float samples, char *text) -{ - float sampleRate = getSampleRate(); - if(!samples) - float2string(0, text); - else - float2string(sampleRate / samples, text); -} - -//----------------------------------------------------------------------------- -void AudioEffect::ms2string(float samples, char *text) -{ - float2string((float)(samples * 1000. / getSampleRate()), text); -} - -//----------------------------------------------------------------------------- -void AudioEffect::float2string(float value, char *text) -{ - long c = 0, neg = 0; - char string[32]; - char *s; - double v, integ, i10, mantissa, m10, ten = 10.; - - v = (double)value; - if(v < 0) - { - neg = 1; - value = -value; - v = -v; - c++; - if(v > 9999999.) - { - strcpy(string, " Huge! "); - return; - } - } - else if(v > 99999999.) - { - strcpy(string, " Huge! "); - return; - } - - s = string + 31; - *s-- = 0; - *s-- = '.'; - c++; - - integ = floor(v); - i10 = fmod(integ, ten); - *s-- = (long)i10 + '0'; - integ /= ten; - c++; - while(integ >= 1. && c < 8) - { - i10 = fmod(integ, ten); - *s-- = (long)i10 + '0'; - integ /= ten; - c++; - } - if(neg) - *s-- = '-'; - strcpy(text, s + 1); - if(c >= 8) - return; - - s = string + 31; - *s-- = 0; - mantissa = fmod(v, 1.); - mantissa *= pow(ten, (double)(8 - c)); - while(c < 8) - { - if(mantissa <= 0) - *s-- = '0'; - else - { - m10 = fmod(mantissa, ten); - *s-- = (long)m10 + '0'; - mantissa /= 10.; - } - c++; - } - strcat(text, s + 1); -} - -//----------------------------------------------------------------------------- -void AudioEffect::long2string(long value, char *text) -{ - char string[32]; - - if(value >= 100000000) - { - strcpy(text, " Huge! "); - return; - } - sprintf(string, "%7d", value); - string[8] = 0; - strcpy(text, (char *)string); -} - - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -void AudioEffect::setParameterAutomated(long index, float value) -{ - setParameter(index, value); - if(audioMaster) - audioMaster(&cEffect, audioMasterAutomate, index, 0, 0, value); // value is in opt -} - +#include +#include +#include +#include + +#include "AudioEffect.hpp" +#include "AEffEditor.hpp" + +//----------------------------------------------------------------------------- +long dispatchEffectClass (AEffect *e, long opCode, + long index, long value, void *ptr, float opt) +{ + AudioEffect *ae = (AudioEffect *)(e->object); + + if(opCode == effClose) + { + ae->dispatcher(opCode, index, value, ptr, opt); + delete ae; + return 1; + } + + return ae->dispatcher(opCode, index, value, ptr, opt); +} + +//----------------------------------------------------------------------------- +float getParameterClass(AEffect *e, long index) +{ + AudioEffect *ae = (AudioEffect *)(e->object); + return ae->getParameter(index); +} + +//----------------------------------------------------------------------------- +void setParameterClass(AEffect *e, long index, float value) +{ + AudioEffect *ae = (AudioEffect *)(e->object); + ae->setParameter(index, value); +} + +//----------------------------------------------------------------------------- +void processClass(AEffect *e, float **inputs, float **outputs, long sampleFrames) +{ + AudioEffect *ae = (AudioEffect *)(e->object); + ae->process(inputs, outputs, sampleFrames); +} + +//----------------------------------------------------------------------------- +void processClassReplacing(AEffect *e, float **inputs, float **outputs, long sampleFrames) +{ + AudioEffect *ae = (AudioEffect *)(e->object); + ae->processReplacing(inputs, outputs, sampleFrames); +} + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- + +AudioEffect::AudioEffect(audioMasterCallback audioMaster, long numPrograms, long numParams) +{ + this->audioMaster = audioMaster; + editor = 0; + this->numPrograms = numPrograms; + this->numParams = numParams; + curProgram = 0; + + memset(&cEffect, 0, sizeof(cEffect)); + cEffect.magic = kEffectMagic; + cEffect.dispatcher = dispatchEffectClass; + cEffect.process = processClass; + cEffect.setParameter = setParameterClass; + cEffect.getParameter = getParameterClass; + cEffect.numPrograms = numPrograms; + cEffect.numParams = numParams; + cEffect.numInputs = 1; + cEffect.numOutputs = 2; + cEffect.flags = 0; + cEffect.resvd1 = 0; + cEffect.resvd2 = 0; + cEffect.initialDelay = 0; + cEffect.realQualities = 0; + cEffect.offQualities = 0; + cEffect.ioRatio = 1.f; + cEffect.object = this; + cEffect.user = 0; + cEffect.uniqueID = 'NoEf'; // you must set this! + cEffect.version = 1; + cEffect.processReplacing = processClassReplacing; + + sampleRate = 44100.f; + blockSize = 1024L; +} + +//----------------------------------------------------------------------------- +AudioEffect::~AudioEffect() +{ + if(editor) + delete editor; +} + +//----------------------------------------------------------------------------- +long AudioEffect::dispatcher(long opCode, long index, long value, void *ptr, float opt) +{ + long v = 0; + + switch(opCode) + { + case effOpen: open(); break; + case effClose: close(); break; + case effSetProgram: if(value < numPrograms) setProgram(value); break; + case effGetProgram: v = getProgram(); break; + case effSetProgramName: setProgramName((char *)ptr); break; + case effGetProgramName: getProgramName((char *)ptr); break; + case effGetParamLabel: getParameterLabel(index, (char *)ptr); break; + case effGetParamDisplay: getParameterDisplay(index, (char *)ptr); break; + case effGetParamName: getParameterName(index, (char *)ptr); break; + + case effSetSampleRate: setSampleRate(opt); break; + case effSetBlockSize: setBlockSize(value); break; + case effMainsChanged: if(!value) suspend(); else resume(); break; + case effGetVu: v = (long)(getVu() * 32767.); break; + + // editor + + case effEditGetRect: if(editor) v = editor->getRect((ERect **)ptr); break; + case effEditOpen: if(editor) v = editor->open(ptr); break; + case effEditClose: if(editor) editor->close(); break; + case effEditIdle: if(editor) editor->idle(); break; + + #if MAC + case effEditDraw: if(editor) editor->draw((ERect *)ptr); break; + case effEditMouse: if(editor) v = editor->mouse(index, value); break; + case effEditKey: if(editor) v = editor->key(value); break; + case effEditTop: if(editor) editor->top(); break; + case effEditSleep: if(editor) editor->sleep(); break; + #endif + + // new + + case effIdentify: v = 'NvEf'; break; + case effGetChunk: v = getChunk((void**)ptr, index ? true : false); break; + case effSetChunk: v = setChunk(ptr, value, index ? true : false); break; + } + return v; +} + +//----------------------------------------------------------------------------- +long AudioEffect::getMasterVersion() +{ + long version = 1; + if(audioMaster) + { + version = audioMaster(&cEffect, audioMasterVersion, 0, 0, 0, 0); + if(!version) // old + version = 1; + } + return version; +} + +//----------------------------------------------------------------------------- +long AudioEffect::getCurrentUniqueId() +{ + long id = 0; + if(audioMaster) + id = audioMaster(&cEffect, audioMasterCurrentId, 0, 0, 0, 0); + return id; +} + +//----------------------------------------------------------------------------- +void AudioEffect::masterIdle() +{ + if(audioMaster) + audioMaster(&cEffect, audioMasterIdle, 0, 0, 0, 0); +} + +//----------------------------------------------------------------------------- +bool AudioEffect::isInputConnected(long input) +{ + long ret = 0; + if(audioMaster) + ret = audioMaster(&cEffect, audioMasterPinConnected, input, 0, 0, 0); + return ret ? false : true; // return value is 0 for true +} + +//----------------------------------------------------------------------------- +bool AudioEffect::isOutputConnected(long output) +{ + long ret = 0; + if(audioMaster) + ret = audioMaster(&cEffect, audioMasterPinConnected, output, 1, 0, 0); + return ret ? false : true; // return value is 0 for true +} + +//----------------------------------------------------------------------------- +// flags + +//----------------------------------------------------------------------------- +void AudioEffect::hasVu(bool state) +{ + if(state) + cEffect.flags |= effFlagsHasVu; + else + cEffect.flags &= ~effFlagsHasVu; +} + +//----------------------------------------------------------------------------- +void AudioEffect::hasClip(bool state) +{ + if(state) + cEffect.flags |= effFlagsHasClip; + else + cEffect.flags &= ~effFlagsHasClip; +} + +//----------------------------------------------------------------------------- +void AudioEffect::canMono(bool state) +{ + if(state) + cEffect.flags |= effFlagsCanMono; + else + cEffect.flags &= ~effFlagsCanMono; +} + +//----------------------------------------------------------------------------- +void AudioEffect::canProcessReplacing(bool state) +{ + if(state) + cEffect.flags |= effFlagsCanReplacing; + else + cEffect.flags &= ~effFlagsCanReplacing; +} + +//----------------------------------------------------------------------------- +void AudioEffect::programsAreChunks(bool state) +{ + if(state) + cEffect.flags |= effFlagsProgramChunks; + else + cEffect.flags &= ~effFlagsProgramChunks; +} + +//----------------------------------------------------------------------------- +void AudioEffect::setRealtimeQualities(long qualities) +{ + cEffect.realQualities = qualities; +} + +//----------------------------------------------------------------------------- +void AudioEffect::setOfflineQualities(long qualities) +{ + cEffect.offQualities = qualities; +} + +//----------------------------------------------------------------------------- +void AudioEffect::setInitialDelay(long delay) +{ + cEffect.initialDelay = delay; +} + +//----------------------------------------------------------------------------- +// string + +//----------------------------------------------------------------------------- +void AudioEffect::dB2string(float value, char *text) +{ + if(value <= 0) +#if MAC + strcpy(text, " -° "); +#else + strcpy(text, " -oo "); +#endif + else + float2string((float)(20. * log10(value)), text); +} + +//----------------------------------------------------------------------------- +void AudioEffect::Hz2string(float samples, char *text) +{ + float sampleRate = getSampleRate(); + if(!samples) + float2string(0, text); + else + float2string(sampleRate / samples, text); +} + +//----------------------------------------------------------------------------- +void AudioEffect::ms2string(float samples, char *text) +{ + float2string((float)(samples * 1000. / getSampleRate()), text); +} + +//----------------------------------------------------------------------------- +void AudioEffect::float2string(float value, char *text) +{ + long c = 0, neg = 0; + char string[32]; + char *s; + double v, integ, i10, mantissa, m10, ten = 10.; + + v = (double)value; + if(v < 0) + { + neg = 1; + value = -value; + v = -v; + c++; + if(v > 9999999.) + { + strcpy(string, " Huge! "); + return; + } + } + else if(v > 99999999.) + { + strcpy(string, " Huge! "); + return; + } + + s = string + 31; + *s-- = 0; + *s-- = '.'; + c++; + + integ = floor(v); + i10 = fmod(integ, ten); + *s-- = (long)i10 + '0'; + integ /= ten; + c++; + while(integ >= 1. && c < 8) + { + i10 = fmod(integ, ten); + *s-- = (long)i10 + '0'; + integ /= ten; + c++; + } + if(neg) + *s-- = '-'; + strcpy(text, s + 1); + if(c >= 8) + return; + + s = string + 31; + *s-- = 0; + mantissa = fmod(v, 1.); + mantissa *= pow(ten, (double)(8 - c)); + while(c < 8) + { + if(mantissa <= 0) + *s-- = '0'; + else + { + m10 = fmod(mantissa, ten); + *s-- = (long)m10 + '0'; + mantissa /= 10.; + } + c++; + } + strcat(text, s + 1); +} + +//----------------------------------------------------------------------------- +void AudioEffect::long2string(long value, char *text) +{ + char string[32]; + + if(value >= 100000000) + { + strcpy(text, " Huge! "); + return; + } + sprintf(string, "%7d", value); + string[8] = 0; + strcpy(text, (char *)string); +} + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +void AudioEffect::setParameterAutomated(long index, float value) +{ + setParameter(index, value); + if(audioMaster) + audioMaster(&cEffect, audioMasterAutomate, index, 0, 0, value); // value is in opt +} + diff --git a/4klang_source/Go4kVSTi/source/common/AudioEffect.hpp b/src/vsti/audioeffect/AudioEffect.hpp similarity index 97% rename from 4klang_source/Go4kVSTi/source/common/AudioEffect.hpp rename to src/vsti/audioeffect/AudioEffect.hpp index 08eb6d1..ce127ad 100644 --- a/4klang_source/Go4kVSTi/source/common/AudioEffect.hpp +++ b/src/vsti/audioeffect/AudioEffect.hpp @@ -1,109 +1,109 @@ -#ifndef __AudioEffect__ -#define __AudioEffect__ - -#include "AEffect.h" // "c" interface -#include - -class AEffEditor; -class AudioEffect; - -// Needs to be defined by the audio effect and is -// called to create the audio effect object instance. -AudioEffect* createEffectInstance (audioMasterCallback audioMaster); - -long dispatchEffectClass(AEffect *e, - long opCode, long index, long value, void *ptr, float opt); -float getParameterClass(long index); -void setParameterClass(long index, float value); -void processClass(AEffect *e, float **inputs, float **outputs, long sampleFrames); -void processClassReplacing(AEffect *e, float **inputs, float **outputs, long sampleFrames); - -class AudioEffect -{ -friend class AEffEditor; -friend long dispatchEffectClass(AEffect *e, long opCode, long index, long value, void *ptr, float opt); -friend float getParameterClass(AEffect *e, long index); -friend void setParameterClass(AEffect *e, long index, float value); -friend void processClass(AEffect *e, float **inputs, float **outputs, long sampleFrames); -friend void processClassReplacing(AEffect *e, float **inputs, float **outputs, long sampleFrames); - -public: - AudioEffect(audioMasterCallback audioMaster, long numPrograms, long numParams); - virtual ~AudioEffect(); - - virtual void setParameter(long index, float value) {index = index; value = value;} - virtual float getParameter(long index) {index = index; return 0;} - virtual void setParameterAutomated(long index, float value); - - AEffect *getAeffect() {return &cEffect;} - void setEditor(AEffEditor *editor) - { this->editor = editor; - if(editor) cEffect.flags |= effFlagsHasEditor; - else cEffect.flags &= ~effFlagsHasEditor;} - - // called from audio master - virtual void process(float **inputs, float **outputs, long sampleFrames) = 0; - virtual void processReplacing(float **inputs, float **outputs, long sampleFrames) - {inputs = inputs; outputs = outputs; sampleFrames = sampleFrames;} - virtual long dispatcher(long opCode, long index, long value, void *ptr, float opt); - virtual void open() {} - virtual void close() {} - virtual long getProgram() {return curProgram;} - virtual void setProgram(long program) {curProgram = program;} // don't forget to set curProgram - virtual void setProgramName(char *name) {*name = 0;} // all following refer to curProgram - virtual void getProgramName(char *name) {*name = 0;} - virtual void getParameterLabel(long index, char *label) {index = index; *label = 0;} - virtual void getParameterDisplay(long index, char *text) {index = index; *text = 0;} - virtual void getParameterName(long index, char *text) {index = index; *text = 0;} - virtual float getVu() {return 0;} - virtual long getChunk(void** data, bool isPreset = false) {return 0;} // returns byteSize - virtual long setChunk(void* data, long byteSize, bool isPreset = false) {return 0;} - virtual void setSampleRate(float sampleRate) {this->sampleRate = sampleRate;} - virtual void setBlockSize(long blockSize) {this->blockSize = blockSize;} - virtual void suspend() {} - virtual void resume() {} - - // setup - virtual void setUniqueID(long iD) {cEffect.uniqueID = iD;} // must call this! - virtual void setNumInputs(long inputs) {cEffect.numInputs = inputs;} - virtual void setNumOutputs(long outputs) {cEffect.numOutputs = outputs;} - virtual void hasVu(bool state = true); - virtual void hasClip(bool state = true); - virtual void canMono(bool state = true); - virtual void canProcessReplacing(bool state = true); - virtual void programsAreChunks(bool state = true); - virtual void setRealtimeQualities(long qualities); - virtual void setOfflineQualities(long qualities); - virtual void setInitialDelay(long delay); - - // inquiry - virtual float getSampleRate() {return sampleRate;} - virtual long getBlockSize() {return blockSize;} - - // host communication - virtual long getMasterVersion(); - virtual long getCurrentUniqueId(); - virtual void masterIdle(); - virtual bool isInputConnected(long input); - virtual bool isOutputConnected(long output); - - // tools - virtual void dB2string(float value, char *text); - virtual void Hz2string(float samples, char *text); - virtual void ms2string(float samples, char *text); - virtual void float2string(float value, char *string); - virtual void long2string(long value, char *text); - -protected: - // members - float sampleRate; - AEffEditor *editor; - audioMasterCallback audioMaster; - long numPrograms; - long numParams; - long curProgram; - long blockSize; - AEffect cEffect; -}; - -#endif +#ifndef __AudioEffect__ +#define __AudioEffect__ + +#include "AEffect.h" // "c" interface +#include + +class AEffEditor; +class AudioEffect; + +// Needs to be defined by the audio effect and is +// called to create the audio effect object instance. +AudioEffect* createEffectInstance (audioMasterCallback audioMaster); + +long dispatchEffectClass(AEffect *e, + long opCode, long index, long value, void *ptr, float opt); +float getParameterClass(long index); +void setParameterClass(long index, float value); +void processClass(AEffect *e, float **inputs, float **outputs, long sampleFrames); +void processClassReplacing(AEffect *e, float **inputs, float **outputs, long sampleFrames); + +class AudioEffect +{ +friend class AEffEditor; +friend long dispatchEffectClass(AEffect *e, long opCode, long index, long value, void *ptr, float opt); +friend float getParameterClass(AEffect *e, long index); +friend void setParameterClass(AEffect *e, long index, float value); +friend void processClass(AEffect *e, float **inputs, float **outputs, long sampleFrames); +friend void processClassReplacing(AEffect *e, float **inputs, float **outputs, long sampleFrames); + +public: + AudioEffect(audioMasterCallback audioMaster, long numPrograms, long numParams); + virtual ~AudioEffect(); + + virtual void setParameter(long index, float value) {index = index; value = value;} + virtual float getParameter(long index) {index = index; return 0;} + virtual void setParameterAutomated(long index, float value); + + AEffect *getAeffect() {return &cEffect;} + void setEditor(AEffEditor *editor) + { this->editor = editor; + if(editor) cEffect.flags |= effFlagsHasEditor; + else cEffect.flags &= ~effFlagsHasEditor;} + + // called from audio master + virtual void process(float **inputs, float **outputs, long sampleFrames) = 0; + virtual void processReplacing(float **inputs, float **outputs, long sampleFrames) + {inputs = inputs; outputs = outputs; sampleFrames = sampleFrames;} + virtual long dispatcher(long opCode, long index, long value, void *ptr, float opt); + virtual void open() {} + virtual void close() {} + virtual long getProgram() {return curProgram;} + virtual void setProgram(long program) {curProgram = program;} // don't forget to set curProgram + virtual void setProgramName(char *name) {*name = 0;} // all following refer to curProgram + virtual void getProgramName(char *name) {*name = 0;} + virtual void getParameterLabel(long index, char *label) {index = index; *label = 0;} + virtual void getParameterDisplay(long index, char *text) {index = index; *text = 0;} + virtual void getParameterName(long index, char *text) {index = index; *text = 0;} + virtual float getVu() {return 0;} + virtual long getChunk(void** data, bool isPreset = false) {return 0;} // returns byteSize + virtual long setChunk(void* data, long byteSize, bool isPreset = false) {return 0;} + virtual void setSampleRate(float sampleRate) {this->sampleRate = sampleRate;} + virtual void setBlockSize(long blockSize) {this->blockSize = blockSize;} + virtual void suspend() {} + virtual void resume() {} + + // setup + virtual void setUniqueID(long iD) {cEffect.uniqueID = iD;} // must call this! + virtual void setNumInputs(long inputs) {cEffect.numInputs = inputs;} + virtual void setNumOutputs(long outputs) {cEffect.numOutputs = outputs;} + virtual void hasVu(bool state = true); + virtual void hasClip(bool state = true); + virtual void canMono(bool state = true); + virtual void canProcessReplacing(bool state = true); + virtual void programsAreChunks(bool state = true); + virtual void setRealtimeQualities(long qualities); + virtual void setOfflineQualities(long qualities); + virtual void setInitialDelay(long delay); + + // inquiry + virtual float getSampleRate() {return sampleRate;} + virtual long getBlockSize() {return blockSize;} + + // host communication + virtual long getMasterVersion(); + virtual long getCurrentUniqueId(); + virtual void masterIdle(); + virtual bool isInputConnected(long input); + virtual bool isOutputConnected(long output); + + // tools + virtual void dB2string(float value, char *text); + virtual void Hz2string(float samples, char *text); + virtual void ms2string(float samples, char *text); + virtual void float2string(float value, char *string); + virtual void long2string(long value, char *text); + +protected: + // members + float sampleRate; + AEffEditor *editor; + audioMasterCallback audioMaster; + long numPrograms; + long numParams; + long curProgram; + long blockSize; + AEffect cEffect; +}; + +#endif diff --git a/4klang_source/Go4kVSTi/source/common/aeffectx.h b/src/vsti/audioeffect/aeffectx.h similarity index 97% rename from 4klang_source/Go4kVSTi/source/common/aeffectx.h rename to src/vsti/audioeffect/aeffectx.h index 7dfefbd..e694c1e 100644 --- a/4klang_source/Go4kVSTi/source/common/aeffectx.h +++ b/src/vsti/audioeffect/aeffectx.h @@ -1,534 +1,534 @@ -#ifndef __aeffectx__ -#define __aeffectx__ - -#ifndef __AEffect__ -#include "AEffect.h" -#endif - -//------------------------------------------------------------------------------------------------------- -// VST Plug-Ins SDK -// version 2.0 extension -// (c)1999 Steinberg Soft+Hardware GmbH -//------------------------------------------------------------------------------------------------------- - -//------------------------------------------------------------------------------------------------------- -// VstEvent -//------------------------------------------------------------------------------------------------------- - -typedef struct VstEvent VstEvent; -typedef struct VstMidiEvent VstMidiEvent; -typedef struct VstEvents VstEvents; - -struct VstEvent // a generic timestamped event -{ - long type; // see enum below - long byteSize; // of this event, excl. type and byteSize - long deltaFrames; // sample frames related to the current block start sample position - long flags; // generic flags, none defined yet (0) - - char data[16]; // size may vary but is usually 16 -}; - -enum // VstEvent types -{ - kVstMidiType = 1, // midi event, can be cast as VstMidiEvent (see below) - kVstAudioType, // audio - kVstVideoType, // video - kVstParameterType, // parameter - kVstTriggerType // trigger - // ...etc -}; - -struct VstMidiEvent // to be casted from a VstEvent -{ - long type; // kVstMidiType - long byteSize; // 24 - long deltaFrames; // sample frames related to the current block start sample position - long flags; // none defined yet - - long noteLength; // (in sample frames) of entire note, if available, else 0 - long noteOffset; // offset into note from note start if available, else 0 - - char midiData[4]; // 1 thru 3 midi bytes; midiData[3] is reserved (zero) - char detune; // -64 to +63 cents; for scales other than 'well-tempered' ('microtuning') - char noteOffVelocity; - char reserved1; // zero - char reserved2; // zero -}; - -struct VstEvents // a block of events for the current audio block -{ - long numEvents; - long reserved; // zero - VstEvent* events[2]; // variable -}; - -//------------------------------------------------------------------------------------------------------- -// VstTimeInfo -//------------------------------------------------------------------------------------------------------- - -typedef struct VstTimeInfo VstTimeInfo; - -// VstTimeInfo as requested via audioMasterGetTime (getTimeInfo()) -// refers to the current time slice. note the new slice is -// already started when processEvents() is called - -struct VstTimeInfo -{ - double samplePos; // current location - double sampleRate; - double nanoSeconds; // system time - double ppqPos; // 1 ppq - double tempo; // in bpm - double barStartPos; // last bar start, in 1 ppq - double cycleStartPos; // 1 ppq - double cycleEndPos; // 1 ppq - long timeSigNumerator; // time signature - long timeSigDenominator; - long smpteOffset; - long smpteFrameRate; // 0:24, 1:25, 2:29.97, 3:30, 4:29.97 df, 5:30 df - long samplesToNextClock; // midi clock resolution (24 ppq), can be negative - long flags; // see below -}; - -enum -{ - kVstTransportChanged = 1, - kVstTransportPlaying = 1 << 1, - kVstTransportCycleActive = 1 << 2, - - kVstAutomationWriting = 1 << 6, - kVstAutomationReading = 1 << 7, - - // flags which indicate which of the fields in this VstTimeInfo - // are valid; samplePos and sampleRate are always valid - kVstNanosValid = 1 << 8, - kVstPpqPosValid = 1 << 9, - kVstTempoValid = 1 << 10, - kVstBarsValid = 1 << 11, - kVstCyclePosValid = 1 << 12, // start and end - kVstTimeSigValid = 1 << 13, - kVstSmpteValid = 1 << 14, - kVstClockValid = 1 << 15 -}; - -//------------------------------------------------------------------------------------------------------- -// VarIo -//------------------------------------------------------------------------------------------------------- - -typedef struct VstVariableIo VstVariableIo; - -struct VstVariableIo -{ - float **inputs; - float **outputs; - long numSamplesInput; - long numSamplesOutput; - long *numSamplesInputProcessed; - long *numSamplesOutputProcessed; -}; - -//--------------------------------------------------------------------------------------------- -// new audioMaster opCodes -//--------------------------------------------------------------------------------------------- - -enum -{ - // VstEvents + VstTimeInfo - audioMasterWantMidi = audioMasterPinConnected + 2, // is a filter which is currently ignored - audioMasterGetTime, // returns const VstTimeInfo* (or 0 if not supported) - // should contain a mask indicating which fields are required - // (see valid masks above), as some items may require extensive - // conversions - audioMasterProcessEvents, // VstEvents* in - audioMasterSetTime, // VstTimenfo* in , filter in , not supported - audioMasterTempoAt, // returns tempo (in bpm * 10000) at sample frame location passed in - - // parameters - audioMasterGetNumAutomatableParameters, - audioMasterGetParameterQuantization, // returns the integer value for +1.0 representation, - // or 1 if full single float precision is maintained - // in automation. parameter index in (-1: all, any) - // connections, configuration - audioMasterIOChanged, // numInputs and/or numOutputs has changed - audioMasterNeedIdle, // plug needs idle calls (outside its editor window) - audioMasterSizeWindow, // index: width, value: height - audioMasterGetSampleRate, - audioMasterGetBlockSize, - audioMasterGetInputLatency, - audioMasterGetOutputLatency, - audioMasterGetPreviousPlug, // input pin in (-1: first to come), returns cEffect* - audioMasterGetNextPlug, // output pin in (-1: first to come), returns cEffect* - - // realtime info - audioMasterWillReplaceOrAccumulate, // returns: 0: not supported, 1: replace, 2: accumulate - audioMasterGetCurrentProcessLevel, // returns: 0: not supported, - // 1: currently in user thread (gui) - // 2: currently in audio thread (where process is called) - // 3: currently in 'sequencer' thread (midi, timer etc) - // 4: currently offline processing and thus in user thread - // other: not defined, but probably pre-empting user thread. - audioMasterGetAutomationState, // returns 0: not supported, 1: off, 2:read, 3:write, 4:read/write - - // offline - audioMasterOfflineStart, - audioMasterOfflineRead, // ptr points to offline structure, see below. return 0: error, 1 ok - audioMasterOfflineWrite, // same as read - audioMasterOfflineGetCurrentPass, - audioMasterOfflineGetCurrentMetaPass, - - // other - audioMasterSetOutputSampleRate, // for variable i/o, sample rate in - audioMasterGetSpeakerArrangement, // (long)input in , output in - audioMasterGetVendorString, // fills with a string identifying the vendor (max 64 char) - audioMasterGetProductString, // fills with a string with product name (max 64 char) - audioMasterGetVendorVersion, // returns vendor-specific version - audioMasterVendorSpecific, // no definition, vendor specific handling - audioMasterSetIcon, // void* in , format not defined yet - audioMasterCanDo, // string in ptr, see below - audioMasterGetLanguage, // see enum - audioMasterOpenWindow, // returns platform specific ptr - audioMasterCloseWindow, // close window, platform specific handle in - audioMasterGetDirectory, // get plug directory, FSSpec on MAC, else char* - audioMasterUpdateDisplay // something has changed, update 'multi-fx' display -}; - -enum VstHostLanguage -{ - kVstLangEnglish = 1, - kVstLangGerman, - kVstLangFrench, - kVstLangItalian, - kVstLangSpanish, - kVstLangJapanese -}; - -//--------------------------------------------------------------------------------------------- -// dispatcher opCodes -//--------------------------------------------------------------------------------------------- - -enum -{ - // VstEvents - effProcessEvents = effSetChunk + 1, // VstEvents* in - - // parameters and programs - effCanBeAutomated, // parameter index in - effString2Parameter, // parameter index in , string in - effGetNumProgramCategories, // no arguments. this is for dividing programs into groups (like GM) - effGetProgramNameIndexed, // get program name of category , program into . - // category (that is, ) may be -1, in which case program indices - // are enumerated linearily (as usual); otherwise, each category starts - // over with index 0. - effCopyProgram, // copy current program to destination - // note: implies setParameter - // connections, configuration - effConnectInput, // input at has been (dis-)connected; - // == 0: disconnected, else connected - effConnectOutput, // same as input - effGetInputProperties, // , VstPinProperties* in ptr, return != 0 => true - effGetOutputProperties, // dto - effGetPlugCategory, // no parameter, return value is category - - // realtime - effGetCurrentPosition, // for external dsp, see flag bits below - effGetDestinationBuffer, // for external dsp, see flag bits below. returns float* - - // offline - effOfflineNotify, // ptr = VstAudioFile array, value = count, index = start flag - effOfflinePrepare, // ptr = VstOfflineTask array, value = count - effOfflineRun, // dto - - // other - effProcessVarIo, // VstVariableIo* in - effSetSpeakerArrangement, // VstSpeakerArrangement* pluginInput in - // VstSpeakerArrangement* pluginOutput in - effSetBlockSizeAndSampleRate, // block size in , sampleRate in - effSetBypass, // onOff in (0 = off) - effGetEffectName, // char* name (max 32 bytes) in - effGetErrorText, // char* text (max 256 bytes) in - effGetVendorString, // fills with a string identifying the vendor (max 64 char) - effGetProductString, // fills with a string with product name (max 64 char) - effGetVendorVersion, // returns vendor-specific version - effVendorSpecific, // no definition, vendor specific handling - effCanDo, // - effGetTailSize, // returns tail size; 0 is default (return 1 for 'no tail') - effIdle, // idle call in response to audioMasterneedIdle. must - // return 1 to keep idle calls beeing issued - - // gui - effGetIcon, // void* in , not yet defined - effSetViewPosition, // set view position (in window) to x y - - // and... - effGetParameterProperties, // of param , VstParameterProperties* in - effKeysRequired, // returns 0: needs keys (default for 1.0 plugs), 1: don't need - effGetVstVersion, // returns 2; older versions return 0 - - effNumV2Opcodes - // note that effNumOpcodes doesn't apply anymore -}; - -typedef struct VstParameterProperties VstParameterProperties; -typedef struct VstPinProperties VstPinProperties; - -struct VstParameterProperties -{ - float stepFloat; - float smallStepFloat; - float largeStepFloat; - char label[64]; - long flags; - long minInteger; - long maxInteger; - long stepInteger; - long largeStepInteger; - char shortLabel[8]; // recommended: 6 + delimiter - char future[48]; -}; - -// parameter properties flags -enum -{ - kVstParameterIsSwitch = 1 << 0, - kVstParameterUsesIntegerMinMax = 1 << 1, - kVstParameterUsesFloatStep = 1 << 2, - kVstParameterUsesIntStep = 1 << 3 -}; - -struct VstPinProperties -{ - char label[64]; - long flags; - long reserved; - char shortLabel[8]; // recommended: 6 + delimiter - char future[48]; -}; - -// pin properties flags -enum -{ - kVstPinIsActive = 1 << 0, - kVstPinIsStereo = 1 << 1 -}; - -// category -enum VstPlugCategory -{ - kPlugCategUnknown = 0, - kPlugCategEffect, - kPlugCategSynth, - kPlugCategAnalysis, - kPlugCategMastering, - kPlugCategSpacializer, // 'panners' - kPlugCategRoomFx, // delays and reverbs - kPlugSurroundFx // dedicated surround processor -}; - -//--------------------------------------------------------------------------------------------- -// flags bits -//--------------------------------------------------------------------------------------------- - -enum -{ - effFlagsIsSynth = 1 << 8, // host may assign mixer channels for its outputs - effFlagsNoSoundInStop = 1 << 9, // does not produce sound when input is all silence - effFlagsExtIsAsync = 1 << 10, // for external dsp; plug returns immedeately from process() - // host polls plug position (current block) via effGetCurrentPosition - effFlagsExtHasBuffer = 1 << 11 // external dsp, may have their own output buffe (32 bit float) - // host then requests this via effGetDestinationBuffer -}; - -//--------------------------------------------------------------------------------------------- -// surround setup -//--------------------------------------------------------------------------------------------- - -typedef struct VstSpeakerProperties VstSpeakerProperties; -typedef struct VstSpeakerArrangement VstSpeakerArrangement; - -struct VstSpeakerProperties -{ // units: range: except: - float azimuth; // rad -PI...PI 10.f for LFE channel - float elevation; // rad -PI/2...PI/2 10.f for LFE channel - float radius; // meter 0.f for LFE channel - float reserved; // 0. - char name[64]; // for new setups, new names should be given (L/R/C... won't do) - char future[32]; -}; - -// note: the origin for azimuth is right (as by math conventions dealing with radians); -// the elevation origin is also right, visualizing a rotation of a circle across the -// -pi/pi axis of the horizontal circle. thus, an elevation of -pi/2 corresponds -// to bottom, and a speaker standing on the left, and 'beaming' upwards would have -// an azimuth of -pi, and an elevation of pi/2. -// for user interface representation, grads are more likely to be used, and the -// origins will obviously 'shift' accordingly. - -struct VstSpeakerArrangement -{ - float lfeGain; // LFE channel gain is adjusted [dB] higher than other channels - long numChannels; // number of channels in this speaker arrangement - VstSpeakerProperties speakers[8]; // variable -}; - -//--------------------------------------------------------------------------------------------- -// offline -//--------------------------------------------------------------------------------------------- - -typedef struct VstOfflineTask VstOfflineTask; -typedef struct VstAudioFile VstAudioFile; -typedef struct VstAudioFileMarker VstAudioFileMarker; - -struct VstOfflineTask -{ - char processName[96]; // set by plug - - // audio access - double readPosition; // set by plug/host - double writePosition; // set by plug/host - long readCount; // set by plug/host - long writeCount; // set by plug - long sizeInputBuffer; // set by host - long sizeOutputBuffer; // set by host - void* inputBuffer; // set by host - void* outputBuffer; // set by host - double positionToProcessFrom; // set by host - double numFramesToProcess; // set by host - double maxFramesToWrite; // set by plug - - // other data access - void* extraBuffer; // set by plug - long value; // set by host or plug - long index; // set by host or plug - - // file attributes - double numFramesInSourceFile; // set by host - double sourceSampleRate; // set by host or plug - double destinationSampleRate; // set by host or plug - long numSourceChannels; // set by host or plug - long numDestinationChannels; // set by host or plug - long sourceFormat; // set by host - long destinationFormat; // set by plug - char outputText[512]; // set by plug or host - - // progress notification - double progress; // set by plug - long progressMode; // reserved for future - char progressText[100]; // set by plug - - long flags; // set by host and plug; see VstOfflineTaskFlags - long returnValue; // reserved for future - void* hostOwned; // set by host - void* plugOwned; // set by plug - - char future[1024]; -}; - -enum VstOfflineTaskFlags -{ - // set by host - kVstOfflineUnvalidParameter = 1 << 0, - kVstOfflineNewFile = 1 << 1, - - // set by plug - kVstOfflinePlugError = 1 << 10, - kVstOfflineInterleavedAudio = 1 << 11, - kVstOfflineTempOutputFile = 1 << 12, - kVstOfflineFloatOutputFile = 1 << 13, - kVstOfflineRandomWrite = 1 << 14, - kVstOfflineStretch = 1 << 15, - kVstOfflineNoThread = 1 << 16 -}; - -// option passed to offlineRead/offlineWrite - -enum VstOfflineOption -{ - kVstOfflineAudio, // reading/writing audio samples - kVstOfflinePeaks, // reading graphic representation - kVstOfflineParameter, // reading/writing parameters - kVstOfflineMarker, // reading/writing marker - kVstOfflineCursor, // reading/moving edit cursor - kVstOfflineSelection, // reading/changing selection - kVstOfflineQueryFiles // to request the host to call asynchronously offlineNotify -}; - -// structure passed to offlineNotify and offlineStart - -struct VstAudioFile -{ - long flags; // see enum VstAudioFileFlags - void* hostOwned; // any data private to host - void* plugOwned; // any data private to plugin - char name[100]; // file title - long uniqueId; // uniquely identify a file during a session - double sampleRate; // file sample rate - long numChannels; // number of channels (1 for mono, 2 for stereo...) - double numFrames; // number of frames in the audio file - long format; // reserved for future - double editCursorPosition; // -1 if no such cursor - double selectionStart; // frame index of first selected frame, or -1 - double selectionSize; // number of frames in selection, or 0 - long selectedChannelsMask; // 1 bit per channel - long numMarkers; // number of markers in the file - long timeRulerUnit; // see doc for possible values - double timeRulerOffset; // offset in time ruler (positive or negative) - double tempo; // as bpm - long timeSigNumerator; // time signature numerator - long timeSigDenominator; // time signature denominator - long ticksPerBlackNote; // resolution - long smpteFrameRate; // smpte rate (set as in VstTimeInfo) - - char future[64]; -}; - -enum VstAudioFileFlags -{ - // set by host (in call offlineNotify) - kVstOfflineReadOnly = 1 << 0, - kVstOfflineNoRateConversion = 1 << 1, - kVstOfflineNoChannelChange = 1 << 2, - - // Set by plug (in function offlineStart) - kVstOfflineCanProcessSelection = 1 << 10, - kVstOfflineNoCrossfade = 1 << 11, - kVstOfflineWantRead = 1 << 12, - kVstOfflineWantWrite = 1 << 13, - kVstOfflineWantWriteMarker = 1 << 14, - kVstOfflineWantMoveCursor = 1 << 15, - kVstOfflineWantSelect = 1 << 16 -}; - -struct VstAudioFileMarker -{ - double position; - char name[32]; - long type; - long id; - long reserved; -}; - -//--------------------------------------------------------------------------------------------- -// others -//--------------------------------------------------------------------------------------------- - -// structure passed to openWindow and closeWindow - -struct VstWindow -{ - char title[128]; // title - short xPos; // position and size - short yPos; - short width; - short height; - long style; // 0: with title, 1: without title - - void *parent; // parent of this window - void *userHandle; // reserved - void *winHandle; // reserved - - char future[104]; -}; - -#endif - +#ifndef __aeffectx__ +#define __aeffectx__ + +#ifndef __AEffect__ +#include "AEffect.h" +#endif + +//------------------------------------------------------------------------------------------------------- +// VST Plug-Ins SDK +// version 2.0 extension +// (c)1999 Steinberg Soft+Hardware GmbH +//------------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------------- +// VstEvent +//------------------------------------------------------------------------------------------------------- + +typedef struct VstEvent VstEvent; +typedef struct VstMidiEvent VstMidiEvent; +typedef struct VstEvents VstEvents; + +struct VstEvent // a generic timestamped event +{ + long type; // see enum below + long byteSize; // of this event, excl. type and byteSize + long deltaFrames; // sample frames related to the current block start sample position + long flags; // generic flags, none defined yet (0) + + char data[16]; // size may vary but is usually 16 +}; + +enum // VstEvent types +{ + kVstMidiType = 1, // midi event, can be cast as VstMidiEvent (see below) + kVstAudioType, // audio + kVstVideoType, // video + kVstParameterType, // parameter + kVstTriggerType // trigger + // ...etc +}; + +struct VstMidiEvent // to be casted from a VstEvent +{ + long type; // kVstMidiType + long byteSize; // 24 + long deltaFrames; // sample frames related to the current block start sample position + long flags; // none defined yet + + long noteLength; // (in sample frames) of entire note, if available, else 0 + long noteOffset; // offset into note from note start if available, else 0 + + char midiData[4]; // 1 thru 3 midi bytes; midiData[3] is reserved (zero) + char detune; // -64 to +63 cents; for scales other than 'well-tempered' ('microtuning') + char noteOffVelocity; + char reserved1; // zero + char reserved2; // zero +}; + +struct VstEvents // a block of events for the current audio block +{ + long numEvents; + long reserved; // zero + VstEvent* events[2]; // variable +}; + +//------------------------------------------------------------------------------------------------------- +// VstTimeInfo +//------------------------------------------------------------------------------------------------------- + +typedef struct VstTimeInfo VstTimeInfo; + +// VstTimeInfo as requested via audioMasterGetTime (getTimeInfo()) +// refers to the current time slice. note the new slice is +// already started when processEvents() is called + +struct VstTimeInfo +{ + double samplePos; // current location + double sampleRate; + double nanoSeconds; // system time + double ppqPos; // 1 ppq + double tempo; // in bpm + double barStartPos; // last bar start, in 1 ppq + double cycleStartPos; // 1 ppq + double cycleEndPos; // 1 ppq + long timeSigNumerator; // time signature + long timeSigDenominator; + long smpteOffset; + long smpteFrameRate; // 0:24, 1:25, 2:29.97, 3:30, 4:29.97 df, 5:30 df + long samplesToNextClock; // midi clock resolution (24 ppq), can be negative + long flags; // see below +}; + +enum +{ + kVstTransportChanged = 1, + kVstTransportPlaying = 1 << 1, + kVstTransportCycleActive = 1 << 2, + + kVstAutomationWriting = 1 << 6, + kVstAutomationReading = 1 << 7, + + // flags which indicate which of the fields in this VstTimeInfo + // are valid; samplePos and sampleRate are always valid + kVstNanosValid = 1 << 8, + kVstPpqPosValid = 1 << 9, + kVstTempoValid = 1 << 10, + kVstBarsValid = 1 << 11, + kVstCyclePosValid = 1 << 12, // start and end + kVstTimeSigValid = 1 << 13, + kVstSmpteValid = 1 << 14, + kVstClockValid = 1 << 15 +}; + +//------------------------------------------------------------------------------------------------------- +// VarIo +//------------------------------------------------------------------------------------------------------- + +typedef struct VstVariableIo VstVariableIo; + +struct VstVariableIo +{ + float **inputs; + float **outputs; + long numSamplesInput; + long numSamplesOutput; + long *numSamplesInputProcessed; + long *numSamplesOutputProcessed; +}; + +//--------------------------------------------------------------------------------------------- +// new audioMaster opCodes +//--------------------------------------------------------------------------------------------- + +enum +{ + // VstEvents + VstTimeInfo + audioMasterWantMidi = audioMasterPinConnected + 2, // is a filter which is currently ignored + audioMasterGetTime, // returns const VstTimeInfo* (or 0 if not supported) + // should contain a mask indicating which fields are required + // (see valid masks above), as some items may require extensive + // conversions + audioMasterProcessEvents, // VstEvents* in + audioMasterSetTime, // VstTimenfo* in , filter in , not supported + audioMasterTempoAt, // returns tempo (in bpm * 10000) at sample frame location passed in + + // parameters + audioMasterGetNumAutomatableParameters, + audioMasterGetParameterQuantization, // returns the integer value for +1.0 representation, + // or 1 if full single float precision is maintained + // in automation. parameter index in (-1: all, any) + // connections, configuration + audioMasterIOChanged, // numInputs and/or numOutputs has changed + audioMasterNeedIdle, // plug needs idle calls (outside its editor window) + audioMasterSizeWindow, // index: width, value: height + audioMasterGetSampleRate, + audioMasterGetBlockSize, + audioMasterGetInputLatency, + audioMasterGetOutputLatency, + audioMasterGetPreviousPlug, // input pin in (-1: first to come), returns cEffect* + audioMasterGetNextPlug, // output pin in (-1: first to come), returns cEffect* + + // realtime info + audioMasterWillReplaceOrAccumulate, // returns: 0: not supported, 1: replace, 2: accumulate + audioMasterGetCurrentProcessLevel, // returns: 0: not supported, + // 1: currently in user thread (gui) + // 2: currently in audio thread (where process is called) + // 3: currently in 'sequencer' thread (midi, timer etc) + // 4: currently offline processing and thus in user thread + // other: not defined, but probably pre-empting user thread. + audioMasterGetAutomationState, // returns 0: not supported, 1: off, 2:read, 3:write, 4:read/write + + // offline + audioMasterOfflineStart, + audioMasterOfflineRead, // ptr points to offline structure, see below. return 0: error, 1 ok + audioMasterOfflineWrite, // same as read + audioMasterOfflineGetCurrentPass, + audioMasterOfflineGetCurrentMetaPass, + + // other + audioMasterSetOutputSampleRate, // for variable i/o, sample rate in + audioMasterGetSpeakerArrangement, // (long)input in , output in + audioMasterGetVendorString, // fills with a string identifying the vendor (max 64 char) + audioMasterGetProductString, // fills with a string with product name (max 64 char) + audioMasterGetVendorVersion, // returns vendor-specific version + audioMasterVendorSpecific, // no definition, vendor specific handling + audioMasterSetIcon, // void* in , format not defined yet + audioMasterCanDo, // string in ptr, see below + audioMasterGetLanguage, // see enum + audioMasterOpenWindow, // returns platform specific ptr + audioMasterCloseWindow, // close window, platform specific handle in + audioMasterGetDirectory, // get plug directory, FSSpec on MAC, else char* + audioMasterUpdateDisplay // something has changed, update 'multi-fx' display +}; + +enum VstHostLanguage +{ + kVstLangEnglish = 1, + kVstLangGerman, + kVstLangFrench, + kVstLangItalian, + kVstLangSpanish, + kVstLangJapanese +}; + +//--------------------------------------------------------------------------------------------- +// dispatcher opCodes +//--------------------------------------------------------------------------------------------- + +enum +{ + // VstEvents + effProcessEvents = effSetChunk + 1, // VstEvents* in + + // parameters and programs + effCanBeAutomated, // parameter index in + effString2Parameter, // parameter index in , string in + effGetNumProgramCategories, // no arguments. this is for dividing programs into groups (like GM) + effGetProgramNameIndexed, // get program name of category , program into . + // category (that is, ) may be -1, in which case program indices + // are enumerated linearily (as usual); otherwise, each category starts + // over with index 0. + effCopyProgram, // copy current program to destination + // note: implies setParameter + // connections, configuration + effConnectInput, // input at has been (dis-)connected; + // == 0: disconnected, else connected + effConnectOutput, // same as input + effGetInputProperties, // , VstPinProperties* in ptr, return != 0 => true + effGetOutputProperties, // dto + effGetPlugCategory, // no parameter, return value is category + + // realtime + effGetCurrentPosition, // for external dsp, see flag bits below + effGetDestinationBuffer, // for external dsp, see flag bits below. returns float* + + // offline + effOfflineNotify, // ptr = VstAudioFile array, value = count, index = start flag + effOfflinePrepare, // ptr = VstOfflineTask array, value = count + effOfflineRun, // dto + + // other + effProcessVarIo, // VstVariableIo* in + effSetSpeakerArrangement, // VstSpeakerArrangement* pluginInput in + // VstSpeakerArrangement* pluginOutput in + effSetBlockSizeAndSampleRate, // block size in , sampleRate in + effSetBypass, // onOff in (0 = off) + effGetEffectName, // char* name (max 32 bytes) in + effGetErrorText, // char* text (max 256 bytes) in + effGetVendorString, // fills with a string identifying the vendor (max 64 char) + effGetProductString, // fills with a string with product name (max 64 char) + effGetVendorVersion, // returns vendor-specific version + effVendorSpecific, // no definition, vendor specific handling + effCanDo, // + effGetTailSize, // returns tail size; 0 is default (return 1 for 'no tail') + effIdle, // idle call in response to audioMasterneedIdle. must + // return 1 to keep idle calls beeing issued + + // gui + effGetIcon, // void* in , not yet defined + effSetViewPosition, // set view position (in window) to x y + + // and... + effGetParameterProperties, // of param , VstParameterProperties* in + effKeysRequired, // returns 0: needs keys (default for 1.0 plugs), 1: don't need + effGetVstVersion, // returns 2; older versions return 0 + + effNumV2Opcodes + // note that effNumOpcodes doesn't apply anymore +}; + +typedef struct VstParameterProperties VstParameterProperties; +typedef struct VstPinProperties VstPinProperties; + +struct VstParameterProperties +{ + float stepFloat; + float smallStepFloat; + float largeStepFloat; + char label[64]; + long flags; + long minInteger; + long maxInteger; + long stepInteger; + long largeStepInteger; + char shortLabel[8]; // recommended: 6 + delimiter + char future[48]; +}; + +// parameter properties flags +enum +{ + kVstParameterIsSwitch = 1 << 0, + kVstParameterUsesIntegerMinMax = 1 << 1, + kVstParameterUsesFloatStep = 1 << 2, + kVstParameterUsesIntStep = 1 << 3 +}; + +struct VstPinProperties +{ + char label[64]; + long flags; + long reserved; + char shortLabel[8]; // recommended: 6 + delimiter + char future[48]; +}; + +// pin properties flags +enum +{ + kVstPinIsActive = 1 << 0, + kVstPinIsStereo = 1 << 1 +}; + +// category +enum VstPlugCategory +{ + kPlugCategUnknown = 0, + kPlugCategEffect, + kPlugCategSynth, + kPlugCategAnalysis, + kPlugCategMastering, + kPlugCategSpacializer, // 'panners' + kPlugCategRoomFx, // delays and reverbs + kPlugSurroundFx // dedicated surround processor +}; + +//--------------------------------------------------------------------------------------------- +// flags bits +//--------------------------------------------------------------------------------------------- + +enum +{ + effFlagsIsSynth = 1 << 8, // host may assign mixer channels for its outputs + effFlagsNoSoundInStop = 1 << 9, // does not produce sound when input is all silence + effFlagsExtIsAsync = 1 << 10, // for external dsp; plug returns immedeately from process() + // host polls plug position (current block) via effGetCurrentPosition + effFlagsExtHasBuffer = 1 << 11 // external dsp, may have their own output buffe (32 bit float) + // host then requests this via effGetDestinationBuffer +}; + +//--------------------------------------------------------------------------------------------- +// surround setup +//--------------------------------------------------------------------------------------------- + +typedef struct VstSpeakerProperties VstSpeakerProperties; +typedef struct VstSpeakerArrangement VstSpeakerArrangement; + +struct VstSpeakerProperties +{ // units: range: except: + float azimuth; // rad -PI...PI 10.f for LFE channel + float elevation; // rad -PI/2...PI/2 10.f for LFE channel + float radius; // meter 0.f for LFE channel + float reserved; // 0. + char name[64]; // for new setups, new names should be given (L/R/C... won't do) + char future[32]; +}; + +// note: the origin for azimuth is right (as by math conventions dealing with radians); +// the elevation origin is also right, visualizing a rotation of a circle across the +// -pi/pi axis of the horizontal circle. thus, an elevation of -pi/2 corresponds +// to bottom, and a speaker standing on the left, and 'beaming' upwards would have +// an azimuth of -pi, and an elevation of pi/2. +// for user interface representation, grads are more likely to be used, and the +// origins will obviously 'shift' accordingly. + +struct VstSpeakerArrangement +{ + float lfeGain; // LFE channel gain is adjusted [dB] higher than other channels + long numChannels; // number of channels in this speaker arrangement + VstSpeakerProperties speakers[8]; // variable +}; + +//--------------------------------------------------------------------------------------------- +// offline +//--------------------------------------------------------------------------------------------- + +typedef struct VstOfflineTask VstOfflineTask; +typedef struct VstAudioFile VstAudioFile; +typedef struct VstAudioFileMarker VstAudioFileMarker; + +struct VstOfflineTask +{ + char processName[96]; // set by plug + + // audio access + double readPosition; // set by plug/host + double writePosition; // set by plug/host + long readCount; // set by plug/host + long writeCount; // set by plug + long sizeInputBuffer; // set by host + long sizeOutputBuffer; // set by host + void* inputBuffer; // set by host + void* outputBuffer; // set by host + double positionToProcessFrom; // set by host + double numFramesToProcess; // set by host + double maxFramesToWrite; // set by plug + + // other data access + void* extraBuffer; // set by plug + long value; // set by host or plug + long index; // set by host or plug + + // file attributes + double numFramesInSourceFile; // set by host + double sourceSampleRate; // set by host or plug + double destinationSampleRate; // set by host or plug + long numSourceChannels; // set by host or plug + long numDestinationChannels; // set by host or plug + long sourceFormat; // set by host + long destinationFormat; // set by plug + char outputText[512]; // set by plug or host + + // progress notification + double progress; // set by plug + long progressMode; // reserved for future + char progressText[100]; // set by plug + + long flags; // set by host and plug; see VstOfflineTaskFlags + long returnValue; // reserved for future + void* hostOwned; // set by host + void* plugOwned; // set by plug + + char future[1024]; +}; + +enum VstOfflineTaskFlags +{ + // set by host + kVstOfflineUnvalidParameter = 1 << 0, + kVstOfflineNewFile = 1 << 1, + + // set by plug + kVstOfflinePlugError = 1 << 10, + kVstOfflineInterleavedAudio = 1 << 11, + kVstOfflineTempOutputFile = 1 << 12, + kVstOfflineFloatOutputFile = 1 << 13, + kVstOfflineRandomWrite = 1 << 14, + kVstOfflineStretch = 1 << 15, + kVstOfflineNoThread = 1 << 16 +}; + +// option passed to offlineRead/offlineWrite + +enum VstOfflineOption +{ + kVstOfflineAudio, // reading/writing audio samples + kVstOfflinePeaks, // reading graphic representation + kVstOfflineParameter, // reading/writing parameters + kVstOfflineMarker, // reading/writing marker + kVstOfflineCursor, // reading/moving edit cursor + kVstOfflineSelection, // reading/changing selection + kVstOfflineQueryFiles // to request the host to call asynchronously offlineNotify +}; + +// structure passed to offlineNotify and offlineStart + +struct VstAudioFile +{ + long flags; // see enum VstAudioFileFlags + void* hostOwned; // any data private to host + void* plugOwned; // any data private to plugin + char name[100]; // file title + long uniqueId; // uniquely identify a file during a session + double sampleRate; // file sample rate + long numChannels; // number of channels (1 for mono, 2 for stereo...) + double numFrames; // number of frames in the audio file + long format; // reserved for future + double editCursorPosition; // -1 if no such cursor + double selectionStart; // frame index of first selected frame, or -1 + double selectionSize; // number of frames in selection, or 0 + long selectedChannelsMask; // 1 bit per channel + long numMarkers; // number of markers in the file + long timeRulerUnit; // see doc for possible values + double timeRulerOffset; // offset in time ruler (positive or negative) + double tempo; // as bpm + long timeSigNumerator; // time signature numerator + long timeSigDenominator; // time signature denominator + long ticksPerBlackNote; // resolution + long smpteFrameRate; // smpte rate (set as in VstTimeInfo) + + char future[64]; +}; + +enum VstAudioFileFlags +{ + // set by host (in call offlineNotify) + kVstOfflineReadOnly = 1 << 0, + kVstOfflineNoRateConversion = 1 << 1, + kVstOfflineNoChannelChange = 1 << 2, + + // Set by plug (in function offlineStart) + kVstOfflineCanProcessSelection = 1 << 10, + kVstOfflineNoCrossfade = 1 << 11, + kVstOfflineWantRead = 1 << 12, + kVstOfflineWantWrite = 1 << 13, + kVstOfflineWantWriteMarker = 1 << 14, + kVstOfflineWantMoveCursor = 1 << 15, + kVstOfflineWantSelect = 1 << 16 +}; + +struct VstAudioFileMarker +{ + double position; + char name[32]; + long type; + long id; + long reserved; +}; + +//--------------------------------------------------------------------------------------------- +// others +//--------------------------------------------------------------------------------------------- + +// structure passed to openWindow and closeWindow + +struct VstWindow +{ + char title[128]; // title + short xPos; // position and size + short yPos; + short width; + short height; + long style; // 0: with title, 1: without title + + void *parent; // parent of this window + void *userHandle; // reserved + void *winHandle; // reserved + + char future[104]; +}; + +#endif + diff --git a/4klang_source/Go4kVSTi/source/common/audioeffectx.cpp b/src/vsti/audioeffect/audioeffectx.cpp similarity index 97% rename from 4klang_source/Go4kVSTi/source/common/audioeffectx.cpp rename to src/vsti/audioeffect/audioeffectx.cpp index 8e9f918..84db550 100644 --- a/4klang_source/Go4kVSTi/source/common/audioeffectx.cpp +++ b/src/vsti/audioeffect/audioeffectx.cpp @@ -1,558 +1,558 @@ -#ifndef __audioeffectx__ -#include "audioeffectx.h" -#endif - -// *** steinberg developers: this is a public file, *do not edit!* - -//------------------------------------------------------------------------------------------------------- -// VST Plug-Ins SDK -// version 2.0 extension -// (c)1999 Steinberg Soft+Hardware GmbH -// -// you should not have to edit this file -// use override methods instead, as suggested in the class declaration (audioeffectx.h) -//------------------------------------------------------------------------------------------------------- - -//--------------------------------------------------------------------------------------------- -// 'canDo' strings. note other 'canDos' can be evaluated by calling the according -// function, for instance if getSampleRate returns 0, you -// will certainly want to assume that this selector is not supported. -//--------------------------------------------------------------------------------------------- - -const char* hostCanDos [] = -{ - "sendVstEvents", - "sendVstMidiEvent", - "sendVstTimeInfo", - "receiveVstEvents", - "receiveVstMidiEvent", - "receiveVstTimeInfo", - - "reportConnectionChanges", - "acceptIOChanges", - "sizeWindow", - - "asyncProcessing", - "offline", - "supplyIdle", - "supportShell" // 'shell' handling via uniqueID as suggested by Waves -}; - -const char* plugCanDos [] = -{ - "sendVstEvents", - "sendVstMidiEvent", - "sendVstTimeInfo", - "receiveVstEvents", - "receiveVstMidiEvent", - "receiveVstTimeInfo", - "offline", - "plugAsChannelInsert", - "plugAsSend", - "mixDryWet", - "noRealTime", - "multipass", - "metapass", - "1in1out", - "1in2out", - "2in1out", - "2in2out", - "2in4out", - "4in2out", - "4in4out", - "4in8out", // 4:2 matrix to surround bus - "8in4out", // surround bus to 4:2 matrix - "8in8out" -}; - -//------------------------------------------------------------------------------------------------------- -//------------------------------------------------------------------------------------------------------- -// AudioEffectX extends AudioEffect with the new features. so you should derive -// your plug from AudioEffectX -//------------------------------------------------------------------------------------------------------- -//------------------------------------------------------------------------------------------------------- - -//------------------------------------------------------------------------------------------------------- -// VstEvents + VstTimeInfo -//------------------------------------------------------------------------------------------------------- - -//------------------------------------------------------------------------------------------------------- -AudioEffectX::AudioEffectX (audioMasterCallback audioMaster, long numPrograms, long numParams) - : AudioEffect (audioMaster, numPrograms, numParams) -{ -} - -//------------------------------------------------------------------------------------------------------- -AudioEffectX::~AudioEffectX () -{ -} - -//------------------------------------------------------------------------------------------------------- -long AudioEffectX::dispatcher (long opCode, long index, long value, void *ptr, float opt) -{ - long v = 0; - switch(opCode) - { - // VstEvents - case effProcessEvents: - v = processEvents ((VstEvents*)ptr); - break; - - // parameters and programs - case effCanBeAutomated: - v = canParameterBeAutomated (index) ? 1 : 0; - break; - case effString2Parameter: - v = string2parameter (index, (char*)ptr) ? 1 : 0; - break; - - case effGetNumProgramCategories: - v = getNumCategories (); - break; - case effGetProgramNameIndexed: - v = getProgramNameIndexed (value, index, (char*)ptr) ? 1 : 0; - break; - case effCopyProgram: - v = copyProgram (index) ? 1 : 0; - break; - - // connections, configuration - case effConnectInput: - inputConnected (index, value ? true : false); - v = 1; - break; - case effConnectOutput: - outputConnected (index, value ? true : false); - v = 1; - break; - case effGetInputProperties: - v = getInputProperties (index, (VstPinProperties*)ptr) ? 1 : 0; - break; - case effGetOutputProperties: - v = getOutputProperties (index, (VstPinProperties*)ptr) ? 1 : 0; - break; - case effGetPlugCategory: - v = (long)getPlugCategory (); - break; - - // realtime - case effGetCurrentPosition: - v = reportCurrentPosition (); - break; - - case effGetDestinationBuffer: - v = (long)reportDestinationBuffer (); - break; - - // offline - case effOfflineNotify: - v = offlineNotify ((VstAudioFile*)ptr, value, index != 0); - break; - case effOfflinePrepare: - v = offlinePrepare ((VstOfflineTask*)ptr, value); - break; - case effOfflineRun: - v = offlineRun ((VstOfflineTask*)ptr, value); - break; - - // other - case effSetSpeakerArrangement: - v = setSpeakerArrangement ((VstSpeakerArrangement*)value, (VstSpeakerArrangement*)ptr) ? 1 : 0; - break; - case effProcessVarIo: - v = processVariableIo ((VstVariableIo*)ptr) ? 1 : 0; - break; - case effSetBlockSizeAndSampleRate: - setBlockSizeAndSampleRate (value, opt); - v = 1; - break; - case effSetBypass: - v = setBypass (value ? true : false) ? 1 : 0; - break; - case effGetEffectName: - v = getEffectName ((char *)ptr) ? 1 : 0; - break; - case effGetErrorText: - v = getErrorText ((char *)ptr) ? 1 : 0; - break; - case effGetVendorString: - v = getVendorString ((char *)ptr) ? 1 : 0; - break; - case effGetProductString: - v = getProductString ((char *)ptr) ? 1 : 0; - break; - case effGetVendorVersion: - v = getVendorVersion (); - break; - case effVendorSpecific: - v = vendorSpecific (index, value, ptr, opt); - break; - case effCanDo: - v = canDo ((char*)ptr); - break; - case effGetIcon: - v = (long)getIcon (); - break; - case effSetViewPosition: - v = setViewPosition (index, value) ? 1 : 0; - break; - case effGetTailSize: - v = getGetTailSize (); - break; - case effIdle: - v = fxIdle (); - break; - - case effGetParameterProperties: - v = getParameterProperties (index, (VstParameterProperties*)ptr) ? 1 : 0; - break; - - case effKeysRequired: - v = (keysRequired () ? 0 : 1); // reversed to keep v1 compatibility - break; - case effGetVstVersion: - v = getVstVersion (); - break; - - // version 1.0 or unknown - default: - v = AudioEffect::dispatcher (opCode, index, value, ptr, opt); - } - return v; -} - -//------------------------------------------------------------------------------------------------------- -void AudioEffectX::wantEvents (long filter) -{ - if (audioMaster) - audioMaster (&cEffect, audioMasterWantMidi, 0, filter, 0, 0); - -} - -//------------------------------------------------------------------------------------------------------- -VstTimeInfo* AudioEffectX::getTimeInfo (long filter) -{ - if (audioMaster) - return (VstTimeInfo*) audioMaster (&cEffect, audioMasterGetTime, 0, filter, 0, 0); - return 0; -} - -//------------------------------------------------------------------------------------------------------- -long AudioEffectX::tempoAt (long pos) -{ - if (audioMaster) - return audioMaster (&cEffect, audioMasterTempoAt, 0, pos, 0, 0); - return 0; -} - -//------------------------------------------------------------------------------------------------------- -bool AudioEffectX::sendVstEventsToHost (VstEvents* events) -{ - if (audioMaster) - return audioMaster (&cEffect, audioMasterProcessEvents, 0, 0, events, 0) == 1; - return 0; -} - -//------------------------------------------------------------------------------------------------------- -// parameters -//------------------------------------------------------------------------------------------------------- - -//------------------------------------------------------------------------------------------------------- -long AudioEffectX::getNumAutomatableParameters () -{ - if (audioMaster) - return audioMaster (&cEffect, audioMasterGetNumAutomatableParameters, 0, 0, 0, 0); - return 0; -} - -//------------------------------------------------------------------------------------------------------- -long AudioEffectX::getParameterQuantization () -{ - if (audioMaster) - return audioMaster (&cEffect, audioMasterGetParameterQuantization, 0, 0, 0, 0); - return 0; -} - -//------------------------------------------------------------------------------------------------------- -// configuration -//------------------------------------------------------------------------------------------------------- - -//------------------------------------------------------------------------------------------------------- -bool AudioEffectX::ioChanged () -{ - if (audioMaster) - return (audioMaster (&cEffect, audioMasterIOChanged, 0, 0, 0, 0) != 0); - return false; -} - -//------------------------------------------------------------------------------------------------------- -bool AudioEffectX::needIdle () -{ - if (audioMaster) - return (audioMaster (&cEffect, audioMasterNeedIdle, 0, 0, 0, 0) != 0); - return false; -} - -//------------------------------------------------------------------------------------------------------- -bool AudioEffectX::sizeWindow (long width, long height) -{ - if (audioMaster) - return (audioMaster (&cEffect, audioMasterSizeWindow, width, height, 0, 0) != 0); - return false; -} - -//------------------------------------------------------------------------------------------------------- -double AudioEffectX::updateSampleRate () -{ - if (audioMaster) - audioMaster (&cEffect, audioMasterGetSampleRate, 0, 0, 0, 0); // calls setSampleRate if implemented - return sampleRate; -} - -//------------------------------------------------------------------------------------------------------- -long AudioEffectX::updateBlockSize () -{ - if (audioMaster) - audioMaster (&cEffect, audioMasterGetBlockSize, 0, 0, 0, 0); // calls setBlockSize if implemented - return blockSize; -} - -//------------------------------------------------------------------------------------------------------- -long AudioEffectX::getInputLatency () -{ - if (audioMaster) - return audioMaster (&cEffect, audioMasterGetInputLatency, 0, 0, 0, 0); - return 0; -} - -//------------------------------------------------------------------------------------------------------- -long AudioEffectX::getOutputLatency () -{ - if (audioMaster) - return audioMaster (&cEffect, audioMasterGetOutputLatency, 0, 0, 0, 0); - return 0; -} - -//------------------------------------------------------------------------------------------------------- -AEffect* AudioEffectX::getPreviousPlug (long input) -{ - if (audioMaster) - return (AEffect*) audioMaster (&cEffect, audioMasterGetPreviousPlug, 0, 0, 0, 0); - return 0; -} - -//------------------------------------------------------------------------------------------------------- -AEffect* AudioEffectX::getNextPlug (long output) -{ - if (audioMaster) - return (AEffect*) audioMaster (&cEffect, audioMasterGetNextPlug, 0, 0, 0, 0); - return 0; -} - -//------------------------------------------------------------------------------------------------------- -// configuration -//------------------------------------------------------------------------------------------------------- - -//------------------------------------------------------------------------------------------------------- -long AudioEffectX::willProcessReplacing () -{ - if (audioMaster) - return audioMaster (&cEffect, audioMasterWillReplaceOrAccumulate, 0, 0, 0, 0); - return 0; -} - -//------------------------------------------------------------------------------------------------------- -long AudioEffectX::getCurrentProcessLevel () -{ - if (audioMaster) - return audioMaster (&cEffect, audioMasterGetCurrentProcessLevel, 0, 0, 0, 0); - return 0; -} - -//------------------------------------------------------------------------------------------------------- -long AudioEffectX::getAutomationState () -{ - if (audioMaster) - return audioMaster (&cEffect, audioMasterGetAutomationState, 0, 0, 0, 0); - return 0; -} - -//------------------------------------------------------------------------------------------------------- -void AudioEffectX::wantAsyncOperation (bool state) -{ - if (state) - cEffect.flags |= effFlagsExtIsAsync; - else - cEffect.flags &= ~effFlagsExtIsAsync; -} - -//------------------------------------------------------------------------------------------------------- -void AudioEffectX::hasExternalBuffer (bool state) -{ - if (state) - cEffect.flags |= effFlagsExtHasBuffer; - else - cEffect.flags &= ~effFlagsExtHasBuffer; -} - -//------------------------------------------------------------------------------------------------------- -// offline -//------------------------------------------------------------------------------------------------------- - -//------------------------------------------------------------------------------------------------------- -bool AudioEffectX::offlineRead (VstOfflineTask* offline, VstOfflineOption option, bool readSource) -{ - if (audioMaster) - return (audioMaster (&cEffect, audioMasterOfflineRead, readSource, option, offline, 0) != 0); - return false; -} - -//------------------------------------------------------------------------------------------------------- -bool AudioEffectX::offlineWrite (VstOfflineTask* offline, VstOfflineOption option) -{ - if (audioMaster) - return (audioMaster (&cEffect, audioMasterOfflineWrite, 0, option, offline, 0) != 0); - return false; -} - -//------------------------------------------------------------------------------------------------------- -bool AudioEffectX::offlineStart (VstAudioFile* audioFiles, long numAudioFiles, long numNewAudioFiles) -{ - if (audioMaster) - return (audioMaster (&cEffect, audioMasterOfflineStart, numNewAudioFiles, numAudioFiles, audioFiles, 0) != 0); - return false; -} - -//------------------------------------------------------------------------------------------------------- -long AudioEffectX::offlineGetCurrentPass () -{ - if (audioMaster) - return (audioMaster (&cEffect, audioMasterOfflineGetCurrentPass, 0, 0, 0, 0) != 0); - return false; -} - -//------------------------------------------------------------------------------------------------------- -long AudioEffectX::offlineGetCurrentMetaPass () -{ - if (audioMaster) - return (audioMaster (&cEffect, audioMasterOfflineGetCurrentMetaPass, 0, 0, 0, 0) != 0); - return false; -} - -//------------------------------------------------------------------------------------------------------- -// other -//------------------------------------------------------------------------------------------------------- - - -//------------------------------------------------------------------------------------------------------- -void AudioEffectX::setOutputSamplerate (float sampleRate) -{ - if (audioMaster) - audioMaster (&cEffect, audioMasterSetOutputSampleRate, 0, 0, 0, sampleRate); -} - -//------------------------------------------------------------------------------------------------------- -bool AudioEffectX::getSpeakerArrangement (VstSpeakerArrangement* pluginInput, VstSpeakerArrangement* pluginOutput) -{ - if (audioMaster) - return (audioMaster (&cEffect, audioMasterGetSpeakerArrangement, 0, (long)pluginInput, pluginOutput, 0) != 0); - return false; -} - -//------------------------------------------------------------------------------------------------------- -bool AudioEffectX::getHostVendorString (char* text) -{ - if (audioMaster) - return (audioMaster (&cEffect, audioMasterGetVendorString, 0, 0, text, 0) != 0); - return false; -} - -//------------------------------------------------------------------------------------------------------- -bool AudioEffectX::getHostProductString (char* text) -{ - if (audioMaster) - return (audioMaster (&cEffect, audioMasterGetProductString, 0, 0, text, 0) != 0); - return false; -} - -//------------------------------------------------------------------------------------------------------- -long AudioEffectX::getHostVendorVersion () -{ - if (audioMaster) - return audioMaster (&cEffect, audioMasterGetVendorVersion, 0, 0, 0, 0); - return 0; -} - -//------------------------------------------------------------------------------------------------------- -long AudioEffectX::hostVendorSpecific (long lArg1, long lArg2, void* ptrArg, float floatArg) -{ - if (audioMaster) - return audioMaster (&cEffect, audioMasterVendorSpecific, lArg1, lArg2, ptrArg, floatArg); - return 0; -} - -//------------------------------------------------------------------------------------------------------- -long AudioEffectX::canHostDo (char* text) -{ - if (audioMaster) - return (audioMaster (&cEffect, audioMasterCanDo, 0, 0, text, 0) != 0); - return 0; -} - -//------------------------------------------------------------------------------------------------------- -void AudioEffectX::isSynth (bool state) -{ - if (state) - cEffect.flags |= effFlagsIsSynth; - else - cEffect.flags &= ~effFlagsIsSynth; -} - -//------------------------------------------------------------------------------------------------------- -void AudioEffectX::noTail (bool state) -{ - if (state) - cEffect.flags |= effFlagsNoSoundInStop; - else - cEffect.flags &= ~effFlagsNoSoundInStop; -} - -//------------------------------------------------------------------------------------------------------- -long AudioEffectX::getHostLanguage () -{ - if (audioMaster) - return audioMaster (&cEffect, audioMasterGetLanguage, 0, 0, 0, 0); - return 0; -} - -//------------------------------------------------------------------------------------------------------- -void* AudioEffectX::openWindow (VstWindow* window) -{ - if (audioMaster) - return (void*)audioMaster (&cEffect, audioMasterOpenWindow, 0, 0, window, 0); - return 0; -} - -//------------------------------------------------------------------------------------------------------- -bool AudioEffectX::closeWindow (VstWindow* window) -{ - if (audioMaster) - return (audioMaster (&cEffect, audioMasterCloseWindow, 0, 0, window, 0) != 0); - return false; -} - -//------------------------------------------------------------------------------------------------------- -void* AudioEffectX::getDirectory () -{ - if (audioMaster) - return (void*)(audioMaster (&cEffect, audioMasterGetDirectory, 0, 0, 0, 0)); - return 0; -} - -//------------------------------------------------------------------------------------------------------- -bool AudioEffectX::updateDisplay() -{ - if (audioMaster) - return (audioMaster (&cEffect, audioMasterUpdateDisplay, 0, 0, 0, 0)) ? true : false; - return 0; -} +#ifndef __audioeffectx__ +#include "audioeffectx.h" +#endif + +// *** steinberg developers: this is a public file, *do not edit!* + +//------------------------------------------------------------------------------------------------------- +// VST Plug-Ins SDK +// version 2.0 extension +// (c)1999 Steinberg Soft+Hardware GmbH +// +// you should not have to edit this file +// use override methods instead, as suggested in the class declaration (audioeffectx.h) +//------------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------- +// 'canDo' strings. note other 'canDos' can be evaluated by calling the according +// function, for instance if getSampleRate returns 0, you +// will certainly want to assume that this selector is not supported. +//--------------------------------------------------------------------------------------------- + +const char* hostCanDos [] = +{ + "sendVstEvents", + "sendVstMidiEvent", + "sendVstTimeInfo", + "receiveVstEvents", + "receiveVstMidiEvent", + "receiveVstTimeInfo", + + "reportConnectionChanges", + "acceptIOChanges", + "sizeWindow", + + "asyncProcessing", + "offline", + "supplyIdle", + "supportShell" // 'shell' handling via uniqueID as suggested by Waves +}; + +const char* plugCanDos [] = +{ + "sendVstEvents", + "sendVstMidiEvent", + "sendVstTimeInfo", + "receiveVstEvents", + "receiveVstMidiEvent", + "receiveVstTimeInfo", + "offline", + "plugAsChannelInsert", + "plugAsSend", + "mixDryWet", + "noRealTime", + "multipass", + "metapass", + "1in1out", + "1in2out", + "2in1out", + "2in2out", + "2in4out", + "4in2out", + "4in4out", + "4in8out", // 4:2 matrix to surround bus + "8in4out", // surround bus to 4:2 matrix + "8in8out" +}; + +//------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------- +// AudioEffectX extends AudioEffect with the new features. so you should derive +// your plug from AudioEffectX +//------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------------- +// VstEvents + VstTimeInfo +//------------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------------- +AudioEffectX::AudioEffectX (audioMasterCallback audioMaster, long numPrograms, long numParams) + : AudioEffect (audioMaster, numPrograms, numParams) +{ +} + +//------------------------------------------------------------------------------------------------------- +AudioEffectX::~AudioEffectX () +{ +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::dispatcher (long opCode, long index, long value, void *ptr, float opt) +{ + long v = 0; + switch(opCode) + { + // VstEvents + case effProcessEvents: + v = processEvents ((VstEvents*)ptr); + break; + + // parameters and programs + case effCanBeAutomated: + v = canParameterBeAutomated (index) ? 1 : 0; + break; + case effString2Parameter: + v = string2parameter (index, (char*)ptr) ? 1 : 0; + break; + + case effGetNumProgramCategories: + v = getNumCategories (); + break; + case effGetProgramNameIndexed: + v = getProgramNameIndexed (value, index, (char*)ptr) ? 1 : 0; + break; + case effCopyProgram: + v = copyProgram (index) ? 1 : 0; + break; + + // connections, configuration + case effConnectInput: + inputConnected (index, value ? true : false); + v = 1; + break; + case effConnectOutput: + outputConnected (index, value ? true : false); + v = 1; + break; + case effGetInputProperties: + v = getInputProperties (index, (VstPinProperties*)ptr) ? 1 : 0; + break; + case effGetOutputProperties: + v = getOutputProperties (index, (VstPinProperties*)ptr) ? 1 : 0; + break; + case effGetPlugCategory: + v = (long)getPlugCategory (); + break; + + // realtime + case effGetCurrentPosition: + v = reportCurrentPosition (); + break; + + case effGetDestinationBuffer: + v = (long)reportDestinationBuffer (); + break; + + // offline + case effOfflineNotify: + v = offlineNotify ((VstAudioFile*)ptr, value, index != 0); + break; + case effOfflinePrepare: + v = offlinePrepare ((VstOfflineTask*)ptr, value); + break; + case effOfflineRun: + v = offlineRun ((VstOfflineTask*)ptr, value); + break; + + // other + case effSetSpeakerArrangement: + v = setSpeakerArrangement ((VstSpeakerArrangement*)value, (VstSpeakerArrangement*)ptr) ? 1 : 0; + break; + case effProcessVarIo: + v = processVariableIo ((VstVariableIo*)ptr) ? 1 : 0; + break; + case effSetBlockSizeAndSampleRate: + setBlockSizeAndSampleRate (value, opt); + v = 1; + break; + case effSetBypass: + v = setBypass (value ? true : false) ? 1 : 0; + break; + case effGetEffectName: + v = getEffectName ((char *)ptr) ? 1 : 0; + break; + case effGetErrorText: + v = getErrorText ((char *)ptr) ? 1 : 0; + break; + case effGetVendorString: + v = getVendorString ((char *)ptr) ? 1 : 0; + break; + case effGetProductString: + v = getProductString ((char *)ptr) ? 1 : 0; + break; + case effGetVendorVersion: + v = getVendorVersion (); + break; + case effVendorSpecific: + v = vendorSpecific (index, value, ptr, opt); + break; + case effCanDo: + v = canDo ((char*)ptr); + break; + case effGetIcon: + v = (long)getIcon (); + break; + case effSetViewPosition: + v = setViewPosition (index, value) ? 1 : 0; + break; + case effGetTailSize: + v = getGetTailSize (); + break; + case effIdle: + v = fxIdle (); + break; + + case effGetParameterProperties: + v = getParameterProperties (index, (VstParameterProperties*)ptr) ? 1 : 0; + break; + + case effKeysRequired: + v = (keysRequired () ? 0 : 1); // reversed to keep v1 compatibility + break; + case effGetVstVersion: + v = getVstVersion (); + break; + + // version 1.0 or unknown + default: + v = AudioEffect::dispatcher (opCode, index, value, ptr, opt); + } + return v; +} + +//------------------------------------------------------------------------------------------------------- +void AudioEffectX::wantEvents (long filter) +{ + if (audioMaster) + audioMaster (&cEffect, audioMasterWantMidi, 0, filter, 0, 0); + +} + +//------------------------------------------------------------------------------------------------------- +VstTimeInfo* AudioEffectX::getTimeInfo (long filter) +{ + if (audioMaster) + return (VstTimeInfo*) audioMaster (&cEffect, audioMasterGetTime, 0, filter, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::tempoAt (long pos) +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterTempoAt, 0, pos, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::sendVstEventsToHost (VstEvents* events) +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterProcessEvents, 0, 0, events, 0) == 1; + return 0; +} + +//------------------------------------------------------------------------------------------------------- +// parameters +//------------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::getNumAutomatableParameters () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterGetNumAutomatableParameters, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::getParameterQuantization () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterGetParameterQuantization, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +// configuration +//------------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::ioChanged () +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterIOChanged, 0, 0, 0, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::needIdle () +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterNeedIdle, 0, 0, 0, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::sizeWindow (long width, long height) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterSizeWindow, width, height, 0, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +double AudioEffectX::updateSampleRate () +{ + if (audioMaster) + audioMaster (&cEffect, audioMasterGetSampleRate, 0, 0, 0, 0); // calls setSampleRate if implemented + return sampleRate; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::updateBlockSize () +{ + if (audioMaster) + audioMaster (&cEffect, audioMasterGetBlockSize, 0, 0, 0, 0); // calls setBlockSize if implemented + return blockSize; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::getInputLatency () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterGetInputLatency, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::getOutputLatency () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterGetOutputLatency, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +AEffect* AudioEffectX::getPreviousPlug (long input) +{ + if (audioMaster) + return (AEffect*) audioMaster (&cEffect, audioMasterGetPreviousPlug, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +AEffect* AudioEffectX::getNextPlug (long output) +{ + if (audioMaster) + return (AEffect*) audioMaster (&cEffect, audioMasterGetNextPlug, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +// configuration +//------------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::willProcessReplacing () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterWillReplaceOrAccumulate, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::getCurrentProcessLevel () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterGetCurrentProcessLevel, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::getAutomationState () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterGetAutomationState, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +void AudioEffectX::wantAsyncOperation (bool state) +{ + if (state) + cEffect.flags |= effFlagsExtIsAsync; + else + cEffect.flags &= ~effFlagsExtIsAsync; +} + +//------------------------------------------------------------------------------------------------------- +void AudioEffectX::hasExternalBuffer (bool state) +{ + if (state) + cEffect.flags |= effFlagsExtHasBuffer; + else + cEffect.flags &= ~effFlagsExtHasBuffer; +} + +//------------------------------------------------------------------------------------------------------- +// offline +//------------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::offlineRead (VstOfflineTask* offline, VstOfflineOption option, bool readSource) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterOfflineRead, readSource, option, offline, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::offlineWrite (VstOfflineTask* offline, VstOfflineOption option) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterOfflineWrite, 0, option, offline, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::offlineStart (VstAudioFile* audioFiles, long numAudioFiles, long numNewAudioFiles) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterOfflineStart, numNewAudioFiles, numAudioFiles, audioFiles, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::offlineGetCurrentPass () +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterOfflineGetCurrentPass, 0, 0, 0, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::offlineGetCurrentMetaPass () +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterOfflineGetCurrentMetaPass, 0, 0, 0, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +// other +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +void AudioEffectX::setOutputSamplerate (float sampleRate) +{ + if (audioMaster) + audioMaster (&cEffect, audioMasterSetOutputSampleRate, 0, 0, 0, sampleRate); +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::getSpeakerArrangement (VstSpeakerArrangement* pluginInput, VstSpeakerArrangement* pluginOutput) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterGetSpeakerArrangement, 0, (long)pluginInput, pluginOutput, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::getHostVendorString (char* text) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterGetVendorString, 0, 0, text, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::getHostProductString (char* text) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterGetProductString, 0, 0, text, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::getHostVendorVersion () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterGetVendorVersion, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::hostVendorSpecific (long lArg1, long lArg2, void* ptrArg, float floatArg) +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterVendorSpecific, lArg1, lArg2, ptrArg, floatArg); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::canHostDo (char* text) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterCanDo, 0, 0, text, 0) != 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +void AudioEffectX::isSynth (bool state) +{ + if (state) + cEffect.flags |= effFlagsIsSynth; + else + cEffect.flags &= ~effFlagsIsSynth; +} + +//------------------------------------------------------------------------------------------------------- +void AudioEffectX::noTail (bool state) +{ + if (state) + cEffect.flags |= effFlagsNoSoundInStop; + else + cEffect.flags &= ~effFlagsNoSoundInStop; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::getHostLanguage () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterGetLanguage, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +void* AudioEffectX::openWindow (VstWindow* window) +{ + if (audioMaster) + return (void*)audioMaster (&cEffect, audioMasterOpenWindow, 0, 0, window, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::closeWindow (VstWindow* window) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterCloseWindow, 0, 0, window, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +void* AudioEffectX::getDirectory () +{ + if (audioMaster) + return (void*)(audioMaster (&cEffect, audioMasterGetDirectory, 0, 0, 0, 0)); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::updateDisplay() +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterUpdateDisplay, 0, 0, 0, 0)) ? true : false; + return 0; +} diff --git a/4klang_source/Go4kVSTi/source/common/audioeffectx.h b/src/vsti/audioeffect/audioeffectx.h similarity index 98% rename from 4klang_source/Go4kVSTi/source/common/audioeffectx.h rename to src/vsti/audioeffect/audioeffectx.h index 435a63e..11a9cb8 100644 --- a/4klang_source/Go4kVSTi/source/common/audioeffectx.h +++ b/src/vsti/audioeffect/audioeffectx.h @@ -1,185 +1,185 @@ -#ifndef __audioeffectx__ -#define __audioeffectx__ - -//---------------------------------------------------------------------------------------------------------------------------- -// VST Plug-Ins SDK -// version 2.0 extension -// (c)1999 Steinberg Soft+Hardware GmbH -//---------------------------------------------------------------------------------------------------------------------------- - -#ifndef __AudioEffect__ -#include "AudioEffect.hpp" // version 1.0 base class AudioEffect -#endif - -#ifndef __aeffectx__ -#include "aeffectx.h" // version 2.0 'C' extensions and structures -#endif - -//---------------------------------------------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------------------------------------------- -// AudioEffectX extends AudioEffect with the new features. so you should derive -// your plug from AudioEffectX -//---------------------------------------------------------------------------------------------------------------------------- -//---------------------------------------------------------------------------------------------------------------------------- - -class AudioEffectX : public AudioEffect -{ -public: - AudioEffectX (audioMasterCallback audioMaster, long numPrograms, long numParams); - virtual ~AudioEffectX (); - - virtual long dispatcher (long opCode, long index, long value, void *ptr, float opt); - - // 'host' are methods which go from plug to host, and are usually not overridden - // 'plug' are methods which you may override to implement the according functionality (to host) - -//---------------------------------------------------------------------------------------------------------------------------- -// events + time -//---------------------------------------------------------------------------------------------------------------------------- - - // host - virtual void wantEvents (long filter = 1); // filter is currently ignored, midi channel data only (default) - virtual VstTimeInfo* getTimeInfo (long filter); - // returns const VstTimeInfo* (or 0 if not supported) - // filter should contain a mask indicating which fields are requested - // (see valid masks in aeffectx.h), as some items may require extensive - // conversions - virtual long tempoAt (long pos); // returns tempo (in bpm * 10000) at sample frame location - bool sendVstEventsToHost (VstEvents* events); // true:success - - // plug - virtual long processEvents (VstEvents* events) {return 0;} // wants no more...else return 1! - // VstEvents and VstMidiEvents are declared in aeffectx.h - -//---------------------------------------------------------------------------------------------------------------------------- -// parameters and programs -//---------------------------------------------------------------------------------------------------------------------------- - - // host - virtual long getNumAutomatableParameters (); - virtual long getParameterQuantization (); // returns the integer value for +1.0 representation, - // or 1 if full single float precision is maintained - // in automation. parameter index in (-1: all, any) - // plug - virtual bool canParameterBeAutomated (long index) { return true; } - virtual bool string2parameter (long index, char* text) {return false;} // note: implies setParameter. text==0 is to be - // expected to check the capability (returns true). - virtual float getChannelParameter (long channel, long index) {return 0;} - virtual long getNumCategories () {return 1L;} - virtual bool getProgramNameIndexed (long category, long index, char* text) {return false;} - virtual bool copyProgram (long destination) {return false;} - -//---------------------------------------------------------------------------------------------------------------------------- -// connections, configuration -//---------------------------------------------------------------------------------------------------------------------------- - - // host - virtual bool ioChanged (); // tell host numInputs and/or numOutputs and/or numParameters has changed - virtual bool needIdle (); // plug needs idle calls (outside its editor window) - virtual bool sizeWindow (long width, long height); - virtual double updateSampleRate (); // gets and returns sample rate from host (may issue setSampleRate() ) - virtual long updateBlockSize (); // same for block size - virtual long getInputLatency (); - virtual long getOutputLatency (); - virtual AEffect* getPreviousPlug (long input); // input can be -1 in which case the first found is returned - virtual AEffect* getNextPlug (long output); // output can be -1 in which case the first found is returned - - // plug - virtual void inputConnected (long index, bool state) {} // input at has been (dis-)connected, - virtual void outputConnected (long index, bool state) {} // same as input; state == true: connected - virtual bool getInputProperties (long index, VstPinProperties* properties) {return false;} - virtual bool getOutputProperties (long index, VstPinProperties* properties) {return false;} - virtual VstPlugCategory getPlugCategory() - { if (cEffect.flags & effFlagsIsSynth) return kPlugCategSynth; return kPlugCategUnknown; } - -//---------------------------------------------------------------------------------------------------------------------------- -// realtime -//---------------------------------------------------------------------------------------------------------------------------- - - // host - virtual long willProcessReplacing (); // returns 0: not implemented, 1: replacing, 2: accumulating - virtual long getCurrentProcessLevel (); // returns: 0: not supported, - // 1: currently in user thread (gui) - // 2: currently in audio thread or irq (where process is called) - // 3: currently in 'sequencer' thread or irq (midi, timer etc) - // 4: currently offline processing and thus in user thread - // other: not defined, but probably pre-empting user thread. - virtual long getAutomationState (); // returns 0: not supported, 1: off, 2:read, 3:write, 4:read/write - virtual void wantAsyncOperation (bool state = true); // notify host that we want to operate asynchronously. - // process() will return immedeately; host will poll getCurrentPosition - // to see if data are available in time. - virtual void hasExternalBuffer (bool state = true); // external dsp, may have their own output buffe (32 bit float) - // host then requests this via effGetDestinationBuffer - - // plug - virtual long reportCurrentPosition () {return 0;} // for external dsp, see wantAsyncOperation () - virtual float* reportDestinationBuffer () {return 0;} // for external dsp (dma option) - -//---------------------------------------------------------------------------------------------------------------------------- -// offline -//---------------------------------------------------------------------------------------------------------------------------- - - // host - virtual bool offlineRead (VstOfflineTask* offline, VstOfflineOption option, bool readSource = true); - virtual bool offlineWrite (VstOfflineTask* offline, VstOfflineOption option); - virtual bool offlineStart (VstAudioFile* ptr, long numAudioFiles, long numNewAudioFiles); - virtual long offlineGetCurrentPass (); - virtual long offlineGetCurrentMetaPass (); - - // plug - virtual bool offlineNotify (VstAudioFile* ptr, long numAudioFiles, bool start) { return false; } - virtual bool offlinePrepare (VstOfflineTask* offline, long count) {return false;} - virtual bool offlineRun (VstOfflineTask* offline, long count) {return false;} - - virtual long offlineGetNumPasses () {return 0;} - virtual long offlineGetNumMetaPasses () {return 0;} - -//---------------------------------------------------------------------------------------------------------------------------- -// other -//---------------------------------------------------------------------------------------------------------------------------- - - // host - virtual void setOutputSamplerate (float samplerate); - virtual bool getSpeakerArrangement (VstSpeakerArrangement* pluginInput, VstSpeakerArrangement* pluginOutput); - virtual bool getHostVendorString (char* text); // fills with a string identifying the vendor (max 64 char) - virtual bool getHostProductString (char* text); // fills with a string with product name (max 64 char) - virtual long getHostVendorVersion (); // returns vendor-specific version - virtual long hostVendorSpecific (long lArg1, long lArg2, void* ptrArg, float floatArg); // no definition - virtual long canHostDo (char* text); // see 'hostCanDos' in audioeffectx.cpp - // returns 0: don't know (default), 1: yes, -1: no - virtual void isSynth (bool state = true); // will call wantEvents if true - virtual void noTail (bool state = true); // true: tells host we produce no output when silence comes in - // enables host to omit process() when no data are present - // on any one input. - virtual long getHostLanguage (); // returns VstHostLanguage - virtual void* openWindow (VstWindow*); // create new window - virtual bool closeWindow (VstWindow*); // close a newly created window - virtual void* getDirectory (); // get the plug's directory, FSSpec on mac, else char* - virtual bool updateDisplay(); // something has changed, update 'multi-fx' display - // returns true if supported - - // plug - virtual bool processVariableIo (VstVariableIo* varIo) {return false;} - virtual bool setSpeakerArrangement (VstSpeakerArrangement* pluginInput, VstSpeakerArrangement* pluginOutput) {return false;} - virtual void setBlockSizeAndSampleRate (long blockSize, float sampleRate) - {this->blockSize = blockSize; this->sampleRate = sampleRate;} - virtual bool setBypass(bool onOff) {return false;} // for 'soft-bypass; process() still called - virtual bool getEffectName (char* name) {return false;} // name max 32 char - virtual bool getErrorText (char* text) {return false;} // max 256 char - virtual bool getVendorString (char* text) {return false;} // fill text with a string identifying the vendor (max 64 char) - virtual bool getProductString (char* text) {return false;} // fill text with a string identifying the product name (max 64 char) // fills with a string with product name (max 64 char) - virtual long getVendorVersion () {return 0;} // return vendor-specific version - virtual long vendorSpecific (long lArg, long lArg2, void* ptrArg, float floatArg) {return 0;} - // no definition, vendor specific handling - virtual long canDo (char* text) {return 0;} // see 'plugCanDos' in audioeffectx.cpp. return values: - // 0: don't know (default), 1: yes, -1: no - virtual void* getIcon () {return 0;} // not yet defined - virtual bool setViewPosition (long x, long y) {return false;} - virtual long getGetTailSize () {return 0; } - virtual long fxIdle () {return 0;} - virtual bool getParameterProperties (long index, VstParameterProperties* p) {return false;} - virtual bool keysRequired () {return false;} // version 1 plugs will return true - virtual long getVstVersion () {return 2;} -}; - -#endif +#ifndef __audioeffectx__ +#define __audioeffectx__ + +//---------------------------------------------------------------------------------------------------------------------------- +// VST Plug-Ins SDK +// version 2.0 extension +// (c)1999 Steinberg Soft+Hardware GmbH +//---------------------------------------------------------------------------------------------------------------------------- + +#ifndef __AudioEffect__ +#include "AudioEffect.hpp" // version 1.0 base class AudioEffect +#endif + +#ifndef __aeffectx__ +#include "aeffectx.h" // version 2.0 'C' extensions and structures +#endif + +//---------------------------------------------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------------------------------------------- +// AudioEffectX extends AudioEffect with the new features. so you should derive +// your plug from AudioEffectX +//---------------------------------------------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------------------------------------------- + +class AudioEffectX : public AudioEffect +{ +public: + AudioEffectX (audioMasterCallback audioMaster, long numPrograms, long numParams); + virtual ~AudioEffectX (); + + virtual long dispatcher (long opCode, long index, long value, void *ptr, float opt); + + // 'host' are methods which go from plug to host, and are usually not overridden + // 'plug' are methods which you may override to implement the according functionality (to host) + +//---------------------------------------------------------------------------------------------------------------------------- +// events + time +//---------------------------------------------------------------------------------------------------------------------------- + + // host + virtual void wantEvents (long filter = 1); // filter is currently ignored, midi channel data only (default) + virtual VstTimeInfo* getTimeInfo (long filter); + // returns const VstTimeInfo* (or 0 if not supported) + // filter should contain a mask indicating which fields are requested + // (see valid masks in aeffectx.h), as some items may require extensive + // conversions + virtual long tempoAt (long pos); // returns tempo (in bpm * 10000) at sample frame location + bool sendVstEventsToHost (VstEvents* events); // true:success + + // plug + virtual long processEvents (VstEvents* events) {return 0;} // wants no more...else return 1! + // VstEvents and VstMidiEvents are declared in aeffectx.h + +//---------------------------------------------------------------------------------------------------------------------------- +// parameters and programs +//---------------------------------------------------------------------------------------------------------------------------- + + // host + virtual long getNumAutomatableParameters (); + virtual long getParameterQuantization (); // returns the integer value for +1.0 representation, + // or 1 if full single float precision is maintained + // in automation. parameter index in (-1: all, any) + // plug + virtual bool canParameterBeAutomated (long index) { return true; } + virtual bool string2parameter (long index, char* text) {return false;} // note: implies setParameter. text==0 is to be + // expected to check the capability (returns true). + virtual float getChannelParameter (long channel, long index) {return 0;} + virtual long getNumCategories () {return 1L;} + virtual bool getProgramNameIndexed (long category, long index, char* text) {return false;} + virtual bool copyProgram (long destination) {return false;} + +//---------------------------------------------------------------------------------------------------------------------------- +// connections, configuration +//---------------------------------------------------------------------------------------------------------------------------- + + // host + virtual bool ioChanged (); // tell host numInputs and/or numOutputs and/or numParameters has changed + virtual bool needIdle (); // plug needs idle calls (outside its editor window) + virtual bool sizeWindow (long width, long height); + virtual double updateSampleRate (); // gets and returns sample rate from host (may issue setSampleRate() ) + virtual long updateBlockSize (); // same for block size + virtual long getInputLatency (); + virtual long getOutputLatency (); + virtual AEffect* getPreviousPlug (long input); // input can be -1 in which case the first found is returned + virtual AEffect* getNextPlug (long output); // output can be -1 in which case the first found is returned + + // plug + virtual void inputConnected (long index, bool state) {} // input at has been (dis-)connected, + virtual void outputConnected (long index, bool state) {} // same as input; state == true: connected + virtual bool getInputProperties (long index, VstPinProperties* properties) {return false;} + virtual bool getOutputProperties (long index, VstPinProperties* properties) {return false;} + virtual VstPlugCategory getPlugCategory() + { if (cEffect.flags & effFlagsIsSynth) return kPlugCategSynth; return kPlugCategUnknown; } + +//---------------------------------------------------------------------------------------------------------------------------- +// realtime +//---------------------------------------------------------------------------------------------------------------------------- + + // host + virtual long willProcessReplacing (); // returns 0: not implemented, 1: replacing, 2: accumulating + virtual long getCurrentProcessLevel (); // returns: 0: not supported, + // 1: currently in user thread (gui) + // 2: currently in audio thread or irq (where process is called) + // 3: currently in 'sequencer' thread or irq (midi, timer etc) + // 4: currently offline processing and thus in user thread + // other: not defined, but probably pre-empting user thread. + virtual long getAutomationState (); // returns 0: not supported, 1: off, 2:read, 3:write, 4:read/write + virtual void wantAsyncOperation (bool state = true); // notify host that we want to operate asynchronously. + // process() will return immedeately; host will poll getCurrentPosition + // to see if data are available in time. + virtual void hasExternalBuffer (bool state = true); // external dsp, may have their own output buffe (32 bit float) + // host then requests this via effGetDestinationBuffer + + // plug + virtual long reportCurrentPosition () {return 0;} // for external dsp, see wantAsyncOperation () + virtual float* reportDestinationBuffer () {return 0;} // for external dsp (dma option) + +//---------------------------------------------------------------------------------------------------------------------------- +// offline +//---------------------------------------------------------------------------------------------------------------------------- + + // host + virtual bool offlineRead (VstOfflineTask* offline, VstOfflineOption option, bool readSource = true); + virtual bool offlineWrite (VstOfflineTask* offline, VstOfflineOption option); + virtual bool offlineStart (VstAudioFile* ptr, long numAudioFiles, long numNewAudioFiles); + virtual long offlineGetCurrentPass (); + virtual long offlineGetCurrentMetaPass (); + + // plug + virtual bool offlineNotify (VstAudioFile* ptr, long numAudioFiles, bool start) { return false; } + virtual bool offlinePrepare (VstOfflineTask* offline, long count) {return false;} + virtual bool offlineRun (VstOfflineTask* offline, long count) {return false;} + + virtual long offlineGetNumPasses () {return 0;} + virtual long offlineGetNumMetaPasses () {return 0;} + +//---------------------------------------------------------------------------------------------------------------------------- +// other +//---------------------------------------------------------------------------------------------------------------------------- + + // host + virtual void setOutputSamplerate (float samplerate); + virtual bool getSpeakerArrangement (VstSpeakerArrangement* pluginInput, VstSpeakerArrangement* pluginOutput); + virtual bool getHostVendorString (char* text); // fills with a string identifying the vendor (max 64 char) + virtual bool getHostProductString (char* text); // fills with a string with product name (max 64 char) + virtual long getHostVendorVersion (); // returns vendor-specific version + virtual long hostVendorSpecific (long lArg1, long lArg2, void* ptrArg, float floatArg); // no definition + virtual long canHostDo (char* text); // see 'hostCanDos' in audioeffectx.cpp + // returns 0: don't know (default), 1: yes, -1: no + virtual void isSynth (bool state = true); // will call wantEvents if true + virtual void noTail (bool state = true); // true: tells host we produce no output when silence comes in + // enables host to omit process() when no data are present + // on any one input. + virtual long getHostLanguage (); // returns VstHostLanguage + virtual void* openWindow (VstWindow*); // create new window + virtual bool closeWindow (VstWindow*); // close a newly created window + virtual void* getDirectory (); // get the plug's directory, FSSpec on mac, else char* + virtual bool updateDisplay(); // something has changed, update 'multi-fx' display + // returns true if supported + + // plug + virtual bool processVariableIo (VstVariableIo* varIo) {return false;} + virtual bool setSpeakerArrangement (VstSpeakerArrangement* pluginInput, VstSpeakerArrangement* pluginOutput) {return false;} + virtual void setBlockSizeAndSampleRate (long blockSize, float sampleRate) + {this->blockSize = blockSize; this->sampleRate = sampleRate;} + virtual bool setBypass(bool onOff) {return false;} // for 'soft-bypass; process() still called + virtual bool getEffectName (char* name) {return false;} // name max 32 char + virtual bool getErrorText (char* text) {return false;} // max 256 char + virtual bool getVendorString (char* text) {return false;} // fill text with a string identifying the vendor (max 64 char) + virtual bool getProductString (char* text) {return false;} // fill text with a string identifying the product name (max 64 char) // fills with a string with product name (max 64 char) + virtual long getVendorVersion () {return 0;} // return vendor-specific version + virtual long vendorSpecific (long lArg, long lArg2, void* ptrArg, float floatArg) {return 0;} + // no definition, vendor specific handling + virtual long canDo (char* text) {return 0;} // see 'plugCanDos' in audioeffectx.cpp. return values: + // 0: don't know (default), 1: yes, -1: no + virtual void* getIcon () {return 0;} // not yet defined + virtual bool setViewPosition (long x, long y) {return false;} + virtual long getGetTailSize () {return 0; } + virtual long fxIdle () {return 0;} + virtual bool getParameterProperties (long index, VstParameterProperties* p) {return false;} + virtual bool keysRequired () {return false;} // version 1 plugs will return true + virtual long getVstVersion () {return 2;} +}; + +#endif diff --git a/4klang_source/Go4kVSTi/source/common/vstcontrols.h b/src/vsti/audioeffect/vstcontrols.h similarity index 96% rename from 4klang_source/Go4kVSTi/source/common/vstcontrols.h rename to src/vsti/audioeffect/vstcontrols.h index e7db316..e56e7f5 100644 --- a/4klang_source/Go4kVSTi/source/common/vstcontrols.h +++ b/src/vsti/audioeffect/vstcontrols.h @@ -1,628 +1,628 @@ -//----------------------------------------------------------------------------- -// VST Plug-Ins SDK -// Simple user interface framework for VST plugins -// Standard control objects -// -// Version 1.0 -// -// First version : Wolfgang Kundrus -// Added new objects : Michael Schmidt 08.97 -// Added new objects : Yvan Grabit 01.98 -// -// (c)1999 Steinberg Soft+Hardware GmbH -//----------------------------------------------------------------------------- - -#ifndef __vstcontrols__ -#define __vstcontrols__ - -#ifndef __vstgui__ -#include "vstgui.h" -#endif - -//------------------ -// defines -//------------------ -#ifndef kPI -#define kPI 3.14159265358979323846 -#endif - -#ifndef k2PI -#define k2PI 6.28318530717958647692 -#endif - -#ifndef kPI_2 -#define kPI_2 1.57079632679489661923f -#endif -#ifndef kPI_4 -#define kPI_4 0.78539816339744830962 -#endif - -#ifndef kE -#define kE 2.7182818284590452354 -#endif - -#ifndef kLN2 -#define kLN2 0.69314718055994530942 -#endif - - -//------------------ -// CControlEnum type -//------------------ -enum CControlEnum -{ - kHorizontal = 1 << 0, - kVertical = 1 << 1, - kShadowText = 1 << 2, - kLeft = 1 << 3, - kRight = 1 << 4, - kTop = 1 << 5, - kBottom = 1 << 6, - k3DIn = 1 << 7, - k3DOut = 1 << 8, - kPopupStyle = 1 << 9, - kCheckStyle = 1 << 10 -}; - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -class CControlListener -{ -public: - virtual void valueChanged (CDrawContext *context, CControl *control) = 0; -}; - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -class CControl : public CView -{ -public: - CControl (CRect &size, CControlListener *listener, int tag); - virtual ~CControl (); - - virtual void draw (CDrawContext *context) = 0; - virtual void update (CDrawContext *context); - virtual void doIdleStuff () { if (parent) parent->doIdleStuff (); } - - virtual void setValue (float val) { value = val; } - virtual float getValue () { return value; }; - - virtual void setMin (float val) { vmin = val; } - virtual float getMin () { return vmin; } - virtual void setMax (float val) { vmax = val; } - virtual float getMax () { return vmax; } - - virtual void setOldValue (float val) { oldValue = val; } - virtual float getOldValue (void) { return oldValue; } - virtual void setDefaultValue (float val) { defaultValue = val; } - virtual float getDefaultValue (void) { return defaultValue; } - - inline int getTag () { return tag; } - - virtual void setMouseEnabled (bool bEnable = true) { bMouseEnabled = bEnable; } - virtual bool getMouseEnabled () { return bMouseEnabled; } - -protected: - CControlListener *listener; - long tag; - bool dirty; - bool bMouseEnabled; - float oldValue; - float defaultValue; - float value; - float vmin; - float vmax; - float step; -}; - - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -class COnOffButton : public CControl -{ -public: - COnOffButton (CRect &size, CControlListener *listener, int tag, - CBitmap *handle); - virtual ~COnOffButton (); - - virtual void draw (CDrawContext*); - virtual void mouse (CDrawContext *context, CPoint &where); - -protected: - CBitmap *handle; -}; - - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -class CParamDisplay : public CControl -{ -public: - CParamDisplay (CRect &size, CBitmap *background = 0, int style = 0); - virtual ~CParamDisplay (); - - virtual void setFont (CFont fontID); - virtual void setFontColor (CColor color); - virtual void setBackColor (CColor color); - virtual void setFrameColor (CColor color); - virtual void setShadowColor (CColor color); - - virtual void setHoriAlign (CHoriTxtAlign hAlign); - virtual void setBackOffset (CPoint &offset); - virtual void setStringConvert (void (*stringConvert) (float value, char *string)); - - virtual void draw (CDrawContext *context); - -protected: - void drawText (CDrawContext *context, char *string, CBitmap *newBack = 0); - - CHoriTxtAlign horiTxtAlign; - int style; - - CFont fontID; - CColor fontColor; - CColor backColor; - CColor frameColor; - CColor shadowColor; - CPoint offset; - - CBitmap *background; - -private: - void (*stringConvert) (float value, char *string); -}; - - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -class CTextEdit : public CParamDisplay -{ -public: - CTextEdit (CRect &size, CControlListener *listener, int tag, const char *txt = 0, - CBitmap *background = 0, - int style = 0); - ~CTextEdit (); - - virtual void setText (char *txt); - virtual void getText (char *txt); - - virtual void draw (CDrawContext *context); - virtual void mouse (CDrawContext *context, CPoint &where); - - virtual void setTextEditConvert (void (*stringConvert) (char *input, char *string)); - - virtual void takeFocus (); - virtual void looseFocus (); - -protected: - void *platformControl; - void *platformFont; - char text[256]; - -private: - void (*stringConvert) (char *input, char *string); -}; - - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -#define MAX_ENTRY 128 - class COptionMenu : public CParamDisplay -{ -public: - COptionMenu (CRect &size, CControlListener *listener, int tag, - CBitmap *background = 0, CBitmap *bgWhenClick = 0, - int style = 0); - ~COptionMenu (); - - virtual bool addEntry (char *txt, int index = -1); - virtual int getCurrent (char *txt = 0); - virtual bool setCurrent (int index); - virtual bool getEntry (int index, char *txt); - virtual bool removeEntry (int index); - virtual bool removeAllEntry (); - virtual int getNbEntries () { return nbEntries; } - - virtual void draw (CDrawContext *context); - virtual void mouse (CDrawContext *context, CPoint &where); - - virtual void takeFocus (); - virtual void looseFocus (); - -#if MOTIF - void setCurrentSelected (void *itemSelected); -#endif - -protected: - void *platformControl; - char *entry[MAX_ENTRY]; - -#if MOTIF - void *itemWidget[MAX_ENTRY]; -#endif - - int nbEntries; - int currentIndex; - CBitmap *bgWhenClick; -}; - - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -class CKnob : public CControl -{ -public: - CKnob (CRect &size, CControlListener *listener, int tag, - CBitmap *background, - CBitmap *handle, CPoint &offset); - virtual ~CKnob (); - - virtual void draw (CDrawContext*); - virtual void mouse (CDrawContext *context, CPoint &where); - - virtual void valueToPoint (CPoint &point); - virtual float valueFromPoint (CPoint &point); - - virtual void setBackground (CBitmap* background); - virtual CBitmap *getBackground () { return background; } - -protected: - int inset; - CBitmap *background; - CBitmap *handle; - CPoint offset; -}; - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -class CAnimKnob : public CKnob -{ -public: - CAnimKnob (CRect &size, CControlListener *listener, int tag, - int subPixmaps, // number of subPixmaps - int heightOfOneImage, // pixel - CBitmap *handle, CPoint &offset); - virtual ~CAnimKnob (); - - virtual void draw (CDrawContext*); - -protected: - int subPixmaps; // number of subPixmaps - int heightOfOneImage; -}; - - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -class CVerticalSwitch : public CControl -{ -public: - CVerticalSwitch (CRect &size, CControlListener *listener, int tag, - int subPixmaps, // number of subPixmaps - int heightOfOneImage, // pixel - int iMaxPositions, - CBitmap *handle, CPoint &offset); - virtual ~CVerticalSwitch (); - - virtual void draw (CDrawContext*); - virtual void mouse (CDrawContext *context, CPoint &where); - -protected: - CBitmap *handle; - CPoint offset; - int subPixmaps; // number of subPixmaps - int heightOfOneImage; - int iMaxPositions; -}; - - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -class CHorizontalSwitch : public CControl -{ -public: - CHorizontalSwitch (CRect &size, CControlListener *listener, int tag, - int subPixmaps, // number of subPixmaps - int heightOfOneImage, // pixel - int iMaxPositions, - CBitmap *handle, - CPoint &offset); - virtual ~CHorizontalSwitch (); - - virtual void draw (CDrawContext*); - virtual void mouse (CDrawContext *context, CPoint &where); - -protected: - CBitmap *handle; - CPoint offset; - int subPixmaps; // number of subPixmaps - int heightOfOneImage; - int iMaxPositions; -}; - - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -class CRockerSwitch : public CControl -{ -public: - CRockerSwitch (CRect &size, CControlListener *listener, int tag, - int heightOfOneImage, // pixel - CBitmap *handle, CPoint &offset); - virtual ~CRockerSwitch (); - - virtual void draw (CDrawContext*); - virtual void mouse (CDrawContext *context, CPoint &where); - -protected: - CBitmap *handle; - CPoint offset; - int heightOfOneImage; -}; - - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -class CMovieBitmap : public CControl -{ -public: - CMovieBitmap (CRect &size, CControlListener *listener, int tag, - int subPixmaps, // number of subPixmaps - int heightOfOneImage, // pixel - CBitmap *handle, CPoint &offset); - virtual ~CMovieBitmap (); - - virtual void draw (CDrawContext*); - -protected: - CBitmap *handle; - CPoint offset; - int subPixmaps; // number of subPixmaps - int heightOfOneImage; -}; - - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -class CMovieButton : public CControl -{ -public: - CMovieButton (CRect &size, CControlListener *listener, int tag, - int heightOfOneImage, // pixel - CBitmap *handle, CPoint &offset); - virtual ~CMovieButton (); - - virtual void draw (CDrawContext*); - virtual void mouse (CDrawContext *context, CPoint &where); - -protected: - CBitmap *handle; - CPoint offset; - int heightOfOneImage; - float buttonState; -}; - - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -// displays bitmaps within a (child-) window -class CAutoAnimation : public CControl -{ -public: - CAutoAnimation (CRect &size, CControlListener *listener, int tag, - int subPixmaps, // number of subPixmaps... - int heightOfOneImage, // pixel - CBitmap *handle, CPoint &offset); - virtual ~CAutoAnimation (); - - virtual void draw (CDrawContext*); - virtual void mouse (CDrawContext *context, CPoint &where); - - virtual void openWindow (void); - virtual void closeWindow (void); - - virtual void nextPixmap (void); - virtual void previousPixmap (void); - - bool isWindowOpened () { return windowOpened; } - -protected: - CBitmap *handle; - CPoint offset; - - int subPixmaps; - int heightOfOneImage; - - bool windowOpened; - int totalHeightOfBitmap; -}; - - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -// Vertical Slider -class CVerticalSlider : public CControl -{ -public: - CVerticalSlider (CRect &size, CControlListener *listener, int tag, - int iMinYPos, // min Y position in pixel - int iMaxYPos, // max Y position in pixel - CBitmap *handle, // bitmap slider - CBitmap *background, // bitmap background - CPoint &offset, - int style = kBottom); // style (kBottom, kTop)) - - virtual ~CVerticalSlider (); - - virtual void draw (CDrawContext*); - virtual void mouse (CDrawContext *context, CPoint &where); - - virtual void setDrawTransparentHandle (bool val) { drawTransparentEnabled = val; } - virtual void setOffsetHandle (CPoint &val) { offsetHandle = val; } - -protected: - CBitmap *handle; - CBitmap *background; - - int widthOfSlider; // size of the handle-slider - int heightOfSlider; - - CPoint offset; - CPoint offsetHandle; - - int iMinYPos; // min Y position in pixel - int iMaxYPos; // max Y position in pixel - int style; - - int actualYPos; - bool drawTransparentEnabled; - - int minTmp; - int maxTmp; - int widthControl; - int heightControl; -}; - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -// Horizontal Slider -class CHorizontalSlider : public CControl -{ -public: - CHorizontalSlider (CRect &size, CControlListener *listener, int tag, - int iMinXPos, // min X position in pixel - int iMaxXPos, // max X position in pixel - CBitmap *handle, // bitmap slider - CBitmap *background, // bitmap background - CPoint &offset, - int style = kRight); // style (kRight, kLeft)); - - virtual ~CHorizontalSlider (); - - virtual void draw (CDrawContext*); - virtual void mouse (CDrawContext *context, CPoint &where); - - virtual void setDrawTransparentHandle (bool val) { drawTransparentEnabled = val; } - virtual void setOffsetHandle (CPoint &val) { offsetHandle = val; } - -protected: - CBitmap *handle; - CBitmap *background; - - int widthOfSlider; // size of the handle-slider - int heightOfSlider; - - CPoint offset; - CPoint offsetHandle; - - int iMinXPos; // min X position in pixel - int iMaxXPos; // max X position in pixel - int style; - - int actualXPos; - bool drawTransparentEnabled; - - int minTmp; - int maxTmp; - int widthControl; - int heightControl; -}; - - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -// special display with custom numbers (0...9) -class CSpecialDigit : public CControl -{ -public: - CSpecialDigit (CRect &size, CControlListener *listener, int tag, // tag identifier - long dwPos, // actual value - int iNumbers, // amount of numbers (max 7) - int *xpos, // array of all XPOS - int *ypos, // array of all YPOS - int width, // width of ONE number - int height, // height of ONE number - CBitmap *handle); // bitmap numbers - virtual ~CSpecialDigit (); - - virtual void draw (CDrawContext*); - - virtual float getNormValue (void); - -protected: - CBitmap *handle; - int iNumbers; // amount of numbers - int xpos[7]; // array of all XPOS, max 7 possible - int ypos[7]; // array of all YPOS, max 7 possible - int width; // width of ONE number - int height; // height of ONE number -}; - - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -class CKickButton : public CControl -{ -public: - CKickButton (CRect &size, CControlListener *listener, int tag, - int heightOfOneImage, // pixel - CBitmap *handle, CPoint &offset); - virtual ~CKickButton (); - - virtual void draw (CDrawContext*); - virtual void mouse (CDrawContext *context, CPoint &where); - -protected: - CBitmap *handle; - CPoint offset; - int heightOfOneImage; -}; - - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -class CSplashScreen : public CControl -{ -public: - CSplashScreen (CRect &size, CControlListener *listener, int tag, - CBitmap *handle, - CRect &toDisplay, - CPoint &offset); - virtual ~CSplashScreen (); - - virtual void draw (CDrawContext*); - virtual void mouse (CDrawContext *context, CPoint &where); - -protected: - CRect toDisplay; - CRect keepSize; - CBitmap *handle; - CPoint offset; -}; - - -//----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- -class CVuMeter : public CControl -{ -public: - CVuMeter (CRect& size, CBitmap *onBitmap, CBitmap *offBitmap, - int nbLed, const int style = kVertical); - virtual ~CVuMeter (); - - virtual void setDecreaseStepValue (float value) { decreaseValue = value; } - - virtual void draw (CDrawContext *context); - -protected: - CBitmap *onBitmap; - CBitmap *offBitmap; - int nbLed; - int style; - float decreaseValue; - - CRect rectOn; - CRect rectOff; -}; - -#endif +//----------------------------------------------------------------------------- +// VST Plug-Ins SDK +// Simple user interface framework for VST plugins +// Standard control objects +// +// Version 1.0 +// +// First version : Wolfgang Kundrus +// Added new objects : Michael Schmidt 08.97 +// Added new objects : Yvan Grabit 01.98 +// +// (c)1999 Steinberg Soft+Hardware GmbH +//----------------------------------------------------------------------------- + +#ifndef __vstcontrols__ +#define __vstcontrols__ + +#ifndef __vstgui__ +#include "vstgui.h" +#endif + +//------------------ +// defines +//------------------ +#ifndef kPI +#define kPI 3.14159265358979323846 +#endif + +#ifndef k2PI +#define k2PI 6.28318530717958647692 +#endif + +#ifndef kPI_2 +#define kPI_2 1.57079632679489661923f +#endif +#ifndef kPI_4 +#define kPI_4 0.78539816339744830962 +#endif + +#ifndef kE +#define kE 2.7182818284590452354 +#endif + +#ifndef kLN2 +#define kLN2 0.69314718055994530942 +#endif + + +//------------------ +// CControlEnum type +//------------------ +enum CControlEnum +{ + kHorizontal = 1 << 0, + kVertical = 1 << 1, + kShadowText = 1 << 2, + kLeft = 1 << 3, + kRight = 1 << 4, + kTop = 1 << 5, + kBottom = 1 << 6, + k3DIn = 1 << 7, + k3DOut = 1 << 8, + kPopupStyle = 1 << 9, + kCheckStyle = 1 << 10 +}; + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +class CControlListener +{ +public: + virtual void valueChanged (CDrawContext *context, CControl *control) = 0; +}; + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +class CControl : public CView +{ +public: + CControl (CRect &size, CControlListener *listener, int tag); + virtual ~CControl (); + + virtual void draw (CDrawContext *context) = 0; + virtual void update (CDrawContext *context); + virtual void doIdleStuff () { if (parent) parent->doIdleStuff (); } + + virtual void setValue (float val) { value = val; } + virtual float getValue () { return value; }; + + virtual void setMin (float val) { vmin = val; } + virtual float getMin () { return vmin; } + virtual void setMax (float val) { vmax = val; } + virtual float getMax () { return vmax; } + + virtual void setOldValue (float val) { oldValue = val; } + virtual float getOldValue (void) { return oldValue; } + virtual void setDefaultValue (float val) { defaultValue = val; } + virtual float getDefaultValue (void) { return defaultValue; } + + inline int getTag () { return tag; } + + virtual void setMouseEnabled (bool bEnable = true) { bMouseEnabled = bEnable; } + virtual bool getMouseEnabled () { return bMouseEnabled; } + +protected: + CControlListener *listener; + long tag; + bool dirty; + bool bMouseEnabled; + float oldValue; + float defaultValue; + float value; + float vmin; + float vmax; + float step; +}; + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +class COnOffButton : public CControl +{ +public: + COnOffButton (CRect &size, CControlListener *listener, int tag, + CBitmap *handle); + virtual ~COnOffButton (); + + virtual void draw (CDrawContext*); + virtual void mouse (CDrawContext *context, CPoint &where); + +protected: + CBitmap *handle; +}; + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +class CParamDisplay : public CControl +{ +public: + CParamDisplay (CRect &size, CBitmap *background = 0, int style = 0); + virtual ~CParamDisplay (); + + virtual void setFont (CFont fontID); + virtual void setFontColor (CColor color); + virtual void setBackColor (CColor color); + virtual void setFrameColor (CColor color); + virtual void setShadowColor (CColor color); + + virtual void setHoriAlign (CHoriTxtAlign hAlign); + virtual void setBackOffset (CPoint &offset); + virtual void setStringConvert (void (*stringConvert) (float value, char *string)); + + virtual void draw (CDrawContext *context); + +protected: + void drawText (CDrawContext *context, char *string, CBitmap *newBack = 0); + + CHoriTxtAlign horiTxtAlign; + int style; + + CFont fontID; + CColor fontColor; + CColor backColor; + CColor frameColor; + CColor shadowColor; + CPoint offset; + + CBitmap *background; + +private: + void (*stringConvert) (float value, char *string); +}; + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +class CTextEdit : public CParamDisplay +{ +public: + CTextEdit (CRect &size, CControlListener *listener, int tag, const char *txt = 0, + CBitmap *background = 0, + int style = 0); + ~CTextEdit (); + + virtual void setText (char *txt); + virtual void getText (char *txt); + + virtual void draw (CDrawContext *context); + virtual void mouse (CDrawContext *context, CPoint &where); + + virtual void setTextEditConvert (void (*stringConvert) (char *input, char *string)); + + virtual void takeFocus (); + virtual void looseFocus (); + +protected: + void *platformControl; + void *platformFont; + char text[256]; + +private: + void (*stringConvert) (char *input, char *string); +}; + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#define MAX_ENTRY 128 + class COptionMenu : public CParamDisplay +{ +public: + COptionMenu (CRect &size, CControlListener *listener, int tag, + CBitmap *background = 0, CBitmap *bgWhenClick = 0, + int style = 0); + ~COptionMenu (); + + virtual bool addEntry (char *txt, int index = -1); + virtual int getCurrent (char *txt = 0); + virtual bool setCurrent (int index); + virtual bool getEntry (int index, char *txt); + virtual bool removeEntry (int index); + virtual bool removeAllEntry (); + virtual int getNbEntries () { return nbEntries; } + + virtual void draw (CDrawContext *context); + virtual void mouse (CDrawContext *context, CPoint &where); + + virtual void takeFocus (); + virtual void looseFocus (); + +#if MOTIF + void setCurrentSelected (void *itemSelected); +#endif + +protected: + void *platformControl; + char *entry[MAX_ENTRY]; + +#if MOTIF + void *itemWidget[MAX_ENTRY]; +#endif + + int nbEntries; + int currentIndex; + CBitmap *bgWhenClick; +}; + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +class CKnob : public CControl +{ +public: + CKnob (CRect &size, CControlListener *listener, int tag, + CBitmap *background, + CBitmap *handle, CPoint &offset); + virtual ~CKnob (); + + virtual void draw (CDrawContext*); + virtual void mouse (CDrawContext *context, CPoint &where); + + virtual void valueToPoint (CPoint &point); + virtual float valueFromPoint (CPoint &point); + + virtual void setBackground (CBitmap* background); + virtual CBitmap *getBackground () { return background; } + +protected: + int inset; + CBitmap *background; + CBitmap *handle; + CPoint offset; +}; + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +class CAnimKnob : public CKnob +{ +public: + CAnimKnob (CRect &size, CControlListener *listener, int tag, + int subPixmaps, // number of subPixmaps + int heightOfOneImage, // pixel + CBitmap *handle, CPoint &offset); + virtual ~CAnimKnob (); + + virtual void draw (CDrawContext*); + +protected: + int subPixmaps; // number of subPixmaps + int heightOfOneImage; +}; + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +class CVerticalSwitch : public CControl +{ +public: + CVerticalSwitch (CRect &size, CControlListener *listener, int tag, + int subPixmaps, // number of subPixmaps + int heightOfOneImage, // pixel + int iMaxPositions, + CBitmap *handle, CPoint &offset); + virtual ~CVerticalSwitch (); + + virtual void draw (CDrawContext*); + virtual void mouse (CDrawContext *context, CPoint &where); + +protected: + CBitmap *handle; + CPoint offset; + int subPixmaps; // number of subPixmaps + int heightOfOneImage; + int iMaxPositions; +}; + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +class CHorizontalSwitch : public CControl +{ +public: + CHorizontalSwitch (CRect &size, CControlListener *listener, int tag, + int subPixmaps, // number of subPixmaps + int heightOfOneImage, // pixel + int iMaxPositions, + CBitmap *handle, + CPoint &offset); + virtual ~CHorizontalSwitch (); + + virtual void draw (CDrawContext*); + virtual void mouse (CDrawContext *context, CPoint &where); + +protected: + CBitmap *handle; + CPoint offset; + int subPixmaps; // number of subPixmaps + int heightOfOneImage; + int iMaxPositions; +}; + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +class CRockerSwitch : public CControl +{ +public: + CRockerSwitch (CRect &size, CControlListener *listener, int tag, + int heightOfOneImage, // pixel + CBitmap *handle, CPoint &offset); + virtual ~CRockerSwitch (); + + virtual void draw (CDrawContext*); + virtual void mouse (CDrawContext *context, CPoint &where); + +protected: + CBitmap *handle; + CPoint offset; + int heightOfOneImage; +}; + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +class CMovieBitmap : public CControl +{ +public: + CMovieBitmap (CRect &size, CControlListener *listener, int tag, + int subPixmaps, // number of subPixmaps + int heightOfOneImage, // pixel + CBitmap *handle, CPoint &offset); + virtual ~CMovieBitmap (); + + virtual void draw (CDrawContext*); + +protected: + CBitmap *handle; + CPoint offset; + int subPixmaps; // number of subPixmaps + int heightOfOneImage; +}; + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +class CMovieButton : public CControl +{ +public: + CMovieButton (CRect &size, CControlListener *listener, int tag, + int heightOfOneImage, // pixel + CBitmap *handle, CPoint &offset); + virtual ~CMovieButton (); + + virtual void draw (CDrawContext*); + virtual void mouse (CDrawContext *context, CPoint &where); + +protected: + CBitmap *handle; + CPoint offset; + int heightOfOneImage; + float buttonState; +}; + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// displays bitmaps within a (child-) window +class CAutoAnimation : public CControl +{ +public: + CAutoAnimation (CRect &size, CControlListener *listener, int tag, + int subPixmaps, // number of subPixmaps... + int heightOfOneImage, // pixel + CBitmap *handle, CPoint &offset); + virtual ~CAutoAnimation (); + + virtual void draw (CDrawContext*); + virtual void mouse (CDrawContext *context, CPoint &where); + + virtual void openWindow (void); + virtual void closeWindow (void); + + virtual void nextPixmap (void); + virtual void previousPixmap (void); + + bool isWindowOpened () { return windowOpened; } + +protected: + CBitmap *handle; + CPoint offset; + + int subPixmaps; + int heightOfOneImage; + + bool windowOpened; + int totalHeightOfBitmap; +}; + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Vertical Slider +class CVerticalSlider : public CControl +{ +public: + CVerticalSlider (CRect &size, CControlListener *listener, int tag, + int iMinYPos, // min Y position in pixel + int iMaxYPos, // max Y position in pixel + CBitmap *handle, // bitmap slider + CBitmap *background, // bitmap background + CPoint &offset, + int style = kBottom); // style (kBottom, kTop)) + + virtual ~CVerticalSlider (); + + virtual void draw (CDrawContext*); + virtual void mouse (CDrawContext *context, CPoint &where); + + virtual void setDrawTransparentHandle (bool val) { drawTransparentEnabled = val; } + virtual void setOffsetHandle (CPoint &val) { offsetHandle = val; } + +protected: + CBitmap *handle; + CBitmap *background; + + int widthOfSlider; // size of the handle-slider + int heightOfSlider; + + CPoint offset; + CPoint offsetHandle; + + int iMinYPos; // min Y position in pixel + int iMaxYPos; // max Y position in pixel + int style; + + int actualYPos; + bool drawTransparentEnabled; + + int minTmp; + int maxTmp; + int widthControl; + int heightControl; +}; + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// Horizontal Slider +class CHorizontalSlider : public CControl +{ +public: + CHorizontalSlider (CRect &size, CControlListener *listener, int tag, + int iMinXPos, // min X position in pixel + int iMaxXPos, // max X position in pixel + CBitmap *handle, // bitmap slider + CBitmap *background, // bitmap background + CPoint &offset, + int style = kRight); // style (kRight, kLeft)); + + virtual ~CHorizontalSlider (); + + virtual void draw (CDrawContext*); + virtual void mouse (CDrawContext *context, CPoint &where); + + virtual void setDrawTransparentHandle (bool val) { drawTransparentEnabled = val; } + virtual void setOffsetHandle (CPoint &val) { offsetHandle = val; } + +protected: + CBitmap *handle; + CBitmap *background; + + int widthOfSlider; // size of the handle-slider + int heightOfSlider; + + CPoint offset; + CPoint offsetHandle; + + int iMinXPos; // min X position in pixel + int iMaxXPos; // max X position in pixel + int style; + + int actualXPos; + bool drawTransparentEnabled; + + int minTmp; + int maxTmp; + int widthControl; + int heightControl; +}; + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// special display with custom numbers (0...9) +class CSpecialDigit : public CControl +{ +public: + CSpecialDigit (CRect &size, CControlListener *listener, int tag, // tag identifier + long dwPos, // actual value + int iNumbers, // amount of numbers (max 7) + int *xpos, // array of all XPOS + int *ypos, // array of all YPOS + int width, // width of ONE number + int height, // height of ONE number + CBitmap *handle); // bitmap numbers + virtual ~CSpecialDigit (); + + virtual void draw (CDrawContext*); + + virtual float getNormValue (void); + +protected: + CBitmap *handle; + int iNumbers; // amount of numbers + int xpos[7]; // array of all XPOS, max 7 possible + int ypos[7]; // array of all YPOS, max 7 possible + int width; // width of ONE number + int height; // height of ONE number +}; + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +class CKickButton : public CControl +{ +public: + CKickButton (CRect &size, CControlListener *listener, int tag, + int heightOfOneImage, // pixel + CBitmap *handle, CPoint &offset); + virtual ~CKickButton (); + + virtual void draw (CDrawContext*); + virtual void mouse (CDrawContext *context, CPoint &where); + +protected: + CBitmap *handle; + CPoint offset; + int heightOfOneImage; +}; + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +class CSplashScreen : public CControl +{ +public: + CSplashScreen (CRect &size, CControlListener *listener, int tag, + CBitmap *handle, + CRect &toDisplay, + CPoint &offset); + virtual ~CSplashScreen (); + + virtual void draw (CDrawContext*); + virtual void mouse (CDrawContext *context, CPoint &where); + +protected: + CRect toDisplay; + CRect keepSize; + CBitmap *handle; + CPoint offset; +}; + + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +class CVuMeter : public CControl +{ +public: + CVuMeter (CRect& size, CBitmap *onBitmap, CBitmap *offBitmap, + int nbLed, const int style = kVertical); + virtual ~CVuMeter (); + + virtual void setDecreaseStepValue (float value) { decreaseValue = value; } + + virtual void draw (CDrawContext *context); + +protected: + CBitmap *onBitmap; + CBitmap *offBitmap; + int nbLed; + int style; + float decreaseValue; + + CRect rectOn; + CRect rectOff; +}; + +#endif diff --git a/4klang_source/Go4kVSTi/source/common/vstgui.h b/src/vsti/audioeffect/vstgui.h similarity index 95% rename from 4klang_source/Go4kVSTi/source/common/vstgui.h rename to src/vsti/audioeffect/vstgui.h index aa17458..818a37d 100644 --- a/4klang_source/Go4kVSTi/source/common/vstgui.h +++ b/src/vsti/audioeffect/vstgui.h @@ -1,621 +1,621 @@ -//----------------------------------------------------------------------------- -// VST Plug-Ins SDK -// User interface framework for VST plugins -// -// Version 1.0 -// -// First version : Wolfgang Kundrus -// Added Motif/Windows version : Yvan Grabit 01.98 -// Added Mac version : Charlie Steinberg 02.98 -// Added BeOS version : Georges-Edouard Berenger 05.99 -// -// (c)1999 Steinberg Soft+Hardware GmbH -//----------------------------------------------------------------------------- - -#ifndef __vstgui__ -#define __vstgui__ - -// define global defines -#if WIN32 - #define WINDOWS 1 -#elif SGI | SUN - #define MOTIF 1 -#elif __MWERKS__ - #define MAC 1 -#endif - -#ifndef __AEffEditor__ -#include "AEffEditor.hpp" -#endif - -//---------------------------------------------------- -#if WINDOWS - #include - -//---------------------------------------------------- -#elif MOTIF - #include - #include - #ifdef NOBOOL - #ifndef bool - typedef short bool; - #endif - #ifndef false - static const bool false = 0; - #endif - #ifndef true - static const bool true = 1; - #endif - #endif - -// definition of struct for XPixmap resources - struct CResTableEntry { - int id; - char **xpm; - }; - - typedef CResTableEntry CResTable[]; - extern CResTable xpmResources; - -//---------------------------------------------------- -#elif MAC - #include - class CCashedPict; - -//---------------------------------------------------- -#elif BEOS - #include - class PlugView; - class BBitmap; - class BResources; - -#endif - -//---------------------------------------------------- -//---------------------------------------------------- -class CFrame; -class CDrawContext; -class COffscreenContext; -class CControl; -class CBitmap; - - -//----------------------------------------------------------------------------- -// AEffGUIEditor Declaration -//----------------------------------------------------------------------------- -class AEffGUIEditor : public AEffEditor -{ -public : - - AEffGUIEditor (AudioEffect *effect); - - virtual ~AEffGUIEditor (); - - virtual void setParameter (long index, float value) { postUpdate (); } - virtual long getRect (ERect **rect); - virtual long open (void *ptr); - virtual void idle (); - virtual void draw (ERect *rect); -#if MAC - virtual long mouse (long x, long y); -#endif - - // get the current time (in ms) - long getTicks (); - - // feedback to appli. - void doIdleStuff (); - - // get the effect attached to this editor - AudioEffect *getEffect () { return effect; } - -//--------------------------------------- -protected: - ERect rect; - CFrame *frame; - - unsigned long lLastTicks; - -private: - short sInControlLoop; -}; - - -//----------------------------------------------------------------------------- -// Structure CRect -//----------------------------------------------------------------------------- -struct CRect -{ - CRect (long left = 0, long top = 0, long right = 0, long bottom = 0) - : left (left), top (top), right (right), bottom (bottom) {} - CRect (const CRect& r) - : left (r.left), top (r.top), right (r.right), bottom (r.bottom) {} - CRect& operator () (long left, long top, long right, long bottom) - { - if (left < right) - this->left = left, this->right = right; - else - this->left = right, this->right = left; - if (top < bottom) - this->top = top, this->bottom = bottom; - else - this->top = bottom, this->bottom = top; - return *this; - } - - long left; - long top; - long right; - long bottom; - inline long width () { return right - left; } - inline long height () { return bottom - top; } - - void offset (long x, long y) { left += x; right += x; - top += y; bottom += y; } -}; - -//----------------------------------------------------------------------------- -// Structure CPoint -//----------------------------------------------------------------------------- -struct CPoint -{ - CPoint (long h = 0, long v = 0) : h (h), v (v) {} - CPoint& operator () (long h, long v) - { this->h = h; this->v = v; - return *this; } - - bool isInside (CRect& r) - { return h >= r.left && h <= r.right && v >= r.top && v <= r.bottom; } - - long h; - long v; -}; - -//----------------------------------------------------------------------------- -// Structure CColor -//----------------------------------------------------------------------------- -struct CColor -{ - CColor& operator () (unsigned char red, - unsigned char green, - unsigned char blue, - unsigned char unused) - { - this->red = red; - this->green = green; - this->blue = blue; - this->unused = unused; - return *this; - } - - CColor& operator = (CColor newColor) - { - red = newColor.red; - green = newColor.green; - blue = newColor.blue; - unused = newColor.unused; - return *this; - } - - bool operator != (CColor newColor) - { - return (red != newColor.red || - green != newColor.green || - blue != newColor.blue); - } - - bool operator == (CColor newColor) - { - return (red == newColor.red && - green == newColor.green && - blue == newColor.blue); - } - - unsigned char red; - unsigned char green; - unsigned char blue; - unsigned char unused; -}; - -// define some basic colors -static CColor kTransparentCColor = {255, 255, 255, 0}; -static CColor kBlackCColor = {0, 0, 0, 0}; -static CColor kWhiteCColor = {255, 255, 255, 0}; -static CColor kGreyCColor = {127, 127, 127, 0}; -static CColor kRedCColor = {255, 0, 0, 0}; -static CColor kGreenCColor = {0 , 255, 0, 0}; -static CColor kBlueCColor = {0 , 0, 255, 0}; -static CColor kYellowCColor = {255, 255, 0, 0}; -static CColor kCyanCColor = {255, 0, 255, 0}; -static CColor kMagentaCColor= {0 , 255, 255, 0}; - -//----------------------------------------------------------------------------- -//----------- -// Font type -//----------- -enum CFont -{ - kSystemFont = 0, - kNormalFontVeryBig, - kNormalFontBig, - kNormalFont, - kNormalFontSmall, - kNormalFontVerySmall, - kSymbolFont, - - kNumStandardFonts -}; - -//----------- -// Line style -//----------- -enum CLineStyle -{ - kLineSolid = 0, - kLineOnOffDash -}; - -//---------------------------- -// Text alignment (Horizontal) -//---------------------------- -enum CHoriTxtAlign -{ - kLeftText = 0, - kCenterText, - kRightText -}; - -//---------------------------- -// Buttons Type (+modifiers) -//---------------------------- -enum CButton -{ - kLButton = 1, - kMButton = 2, - kRButton = 4, - kShift = 8, - kControl = 16, - kAlt = 32, - kApple = 64 -}; - -//----------------------------------------------------------------------------- -// CDrawContext Declaration -//----------------------------------------------------------------------------- -class CDrawContext -{ -public: - CDrawContext (CFrame *frame, void *systemContext, void *window = 0); - virtual ~CDrawContext (); - - void moveTo (CPoint &point); - void lineTo (CPoint &point); - - void polyLine (CPoint *point, int numberOfPoints); - void fillPolygon (CPoint *point, int numberOfPoints); - - void drawRect (CRect &rect); - void fillRect (CRect &rect); - - void drawArc (CRect &rect, CPoint &point1, CPoint &point2); - void fillArc (CRect &rect, CPoint &point1, CPoint &point2); - - void drawEllipse (CRect &rect); - void fillEllipse (CRect &rect); - - void drawPoint (CPoint &point, CColor color); - - void setLineStyle (CLineStyle style); - CLineStyle getLineStyle () { return lineStyle; } - - void setLineWidth (int width); - int getLineWidth () { return frameWidth; } - - void setFillColor (CColor color); - CColor getFillColor () { return fillColor; } - - void setFrameColor (CColor color); - CColor getFrameColor () { return frameColor; } - - void setFontColor (CColor color); - CColor getFontColor () { return fontColor; } - void setFont (CFont fontID, const int size = 0); - - void drawString (const char *string, CRect &rect, const short opaque = false, - const CHoriTxtAlign hAlign = kCenterText); - - int getMouseButtons (); - void getMouseLocation (CPoint &point); - -#if MOTIF - int getIndexColor (CColor color); - Colormap getColormap (); - Visual *getVisual (); - unsigned int getDepth (); - - static int nbNewColor; -#endif - - void *getWindow () { return window; } - void setWindow (void *ptr) { window = ptr; } - void getLoc (CPoint &where) { where = penLoc; } - - //------------------------------------------- -protected: - - friend class CBitmap; - friend class COffscreenContext; - - void *getSystemContext () { return systemContext; } - - void *systemContext; - void *window; - CFrame *frame; - - int fontSize; - CColor fontColor; - CPoint penLoc; - - int frameWidth; - CColor frameColor; - CColor fillColor; - CLineStyle lineStyle; - -#if WINDOWS - void *brush; - void *pen; - void *font; - void *oldbrush; - void *oldpen; - void *oldfont; - int iPenStyle; - -#elif MAC - FontInfo fontInfoStruct; - Pattern fillPattern; - -#elif MOTIF - Display *display; - - XFontStruct *fontInfoStruct; - CFont fontInfoId; - -#elif BEOS - BView* plugView; - BFont font; - void lineFromTo (CPoint& cstart, CPoint& cend); - -#endif -}; - -//----------------------------------------------------------------------------- -// COffscreenContext Declaration -//----------------------------------------------------------------------------- -class COffscreenContext : public CDrawContext -{ -public: - COffscreenContext (CDrawContext *context, CBitmap *bitmap); - COffscreenContext (CFrame *frame, long width, long height, const CColor backgroundColor = kBlackCColor); - - virtual ~COffscreenContext (); - - void transfert (CDrawContext *context, CRect destRect, CPoint srcOffset = CPoint (0, 0)); - inline int getWidth () { return width; } - inline int getHeight () { return height; } - - //------------------------------------------- -protected: - bool destroyPixmap; - CBitmap *bitmap; - - long height; - long width; - - CColor backgroundColor; - -#if MOTIF - Display *xdisplay; - -#elif BEOS - BBitmap *offscreenBitmap; -#endif -}; - - -//----------------------------------------------------------------------------- -// CBitmap Declaration -//----------------------------------------------------------------------------- -class CBitmap -{ -public: - CBitmap (int resourceID); - CBitmap (CFrame &frame, int width, int height); - ~CBitmap (); - - void draw (CDrawContext*, CRect &rect, const CPoint &offset = CPoint (0, 0)); - void drawTransparent (CDrawContext *context, CRect &rect, const CPoint &offset = CPoint (0, 0)); - - inline int getWidth () { return width; } - inline int getHeight () { return height; } - - void forget (); - void remember (); - - void *getHandle () { return handle; } - -#if BEOS - static void closeResource (); -#endif - - //------------------------------------------- -protected: - int resourceID; - void *handle; - void *mask; - int width; - int height; - - int nbReference; - -#if MOTIF - void *createPixmapFromXpm (CDrawContext *context); - - char **dataXpm; - Display *xdisplay; - -#elif MAC - CCashedPict *pPict; - -#elif BEOS - static BResources *resourceFile; - BBitmap *bbitmap; - bool transparencySet; -#endif -}; - -//----------------------------------------------------------------------------- -// CView Declaration -//----------------------------------------------------------------------------- -class CView -{ -public: - CView (CRect &size); - virtual ~CView (); - - void redraw (); - virtual void draw (CDrawContext *context); - virtual void mouse (CDrawContext *context, CPoint &where); - virtual void update (CDrawContext *context); - - virtual void looseFocus (); - virtual void takeFocus (); - - virtual void setTempOffscreen (COffscreenContext *tempOffscr); - - int getHeight () { return size.height (); } - int getWidth () { return size.width (); } - - CFrame *getParent () { return parent; } - - //------------------------------------------- -protected: - friend class CControl; - friend class CFrame; - CRect size; - CFrame *parent; - COffscreenContext *tempOffscreen; -}; - -//----------------------------------------------------------------------------- -// CFrame Declaration -//----------------------------------------------------------------------------- -class CFrame : public CView -{ -public: - CFrame (CRect &size, void *systemWindow, AEffGUIEditor *editor); - CFrame (CRect &size, char *title, AEffGUIEditor *editor, const int style = 0); - - ~CFrame (); - - bool open (CPoint *point = 0); - bool close (); - bool isOpen () { return openFlag; } - - void draw (CDrawContext *context); - void draw (CView *view = 0); - void mouse (CDrawContext *context, CPoint &where); - - void update (CDrawContext *context); - void idle (); - void doIdleStuff () { if (editor) editor->doIdleStuff (); } - - bool getPosition (int &x, int &y); - bool setSize (int width, int height); - bool getSize (CRect *size); - - void setBackground (CBitmap *background); - CBitmap *getBackground () { return background; } - - virtual bool addView (CView *view); - virtual bool removeView (CView *view); - - int setModalView (CView *view); - -#if WINDOWS - void *getSystemWindow () { return hwnd;} -#elif BEOS - void *getSystemWindow () { return plugView;} -#else - void *getSystemWindow () { return systemWindow;} -#endif - - AEffGUIEditor *getEditor () { return editor; } - - void setEditView (CView *view) { editView = view; } - CView *getEditView () { return editView; } - -#if MOTIF - Colormap getColormap () { return colormap; } - Visual *getVisual () { return visual; } - unsigned int getDepth () { return depth; } - Display *getDisplay () { return display; } - Window getWindow () { return window; } - void freeGc (); - - Region region; - - GC gc; - GC getGC () { return gc; } -#else - void *getGC () { return 0; } -#endif - - //------------------------------------------- -protected: - bool initFrame (void *systemWin); - - AEffGUIEditor *editor; - - void *systemWindow; - CBitmap *background; - int viewCount; - int maxViews; - CView **views; - CView *modalView; - CView *editView; - - bool firstDraw; - bool openFlag; - -#if WINDOWS - void *hwnd; - friend LONG WINAPI WindowProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); - -#elif MOTIF - Colormap colormap; - Display *display; - Visual *visual; - Window window; - unsigned int depth; - - friend void _destroyCallback (Widget, XtPointer, XtPointer); - -#elif BEOS - PlugView *plugView; -#endif - - //------------------------------------------- -private: - bool addedWindow; - void *vstWindow; -}; - - -// include the control object -#ifndef __vstcontrols__ -#include "vstcontrols.h" -#endif - - -//-End-------------------------------------- -#endif +//----------------------------------------------------------------------------- +// VST Plug-Ins SDK +// User interface framework for VST plugins +// +// Version 1.0 +// +// First version : Wolfgang Kundrus +// Added Motif/Windows version : Yvan Grabit 01.98 +// Added Mac version : Charlie Steinberg 02.98 +// Added BeOS version : Georges-Edouard Berenger 05.99 +// +// (c)1999 Steinberg Soft+Hardware GmbH +//----------------------------------------------------------------------------- + +#ifndef __vstgui__ +#define __vstgui__ + +// define global defines +#if WIN32 + #define WINDOWS 1 +#elif SGI | SUN + #define MOTIF 1 +#elif __MWERKS__ + #define MAC 1 +#endif + +#ifndef __AEffEditor__ +#include "AEffEditor.hpp" +#endif + +//---------------------------------------------------- +#if WINDOWS + #include + +//---------------------------------------------------- +#elif MOTIF + #include + #include + #ifdef NOBOOL + #ifndef bool + typedef short bool; + #endif + #ifndef false + static const bool false = 0; + #endif + #ifndef true + static const bool true = 1; + #endif + #endif + +// definition of struct for XPixmap resources + struct CResTableEntry { + int id; + char **xpm; + }; + + typedef CResTableEntry CResTable[]; + extern CResTable xpmResources; + +//---------------------------------------------------- +#elif MAC + #include + class CCashedPict; + +//---------------------------------------------------- +#elif BEOS + #include + class PlugView; + class BBitmap; + class BResources; + +#endif + +//---------------------------------------------------- +//---------------------------------------------------- +class CFrame; +class CDrawContext; +class COffscreenContext; +class CControl; +class CBitmap; + + +//----------------------------------------------------------------------------- +// AEffGUIEditor Declaration +//----------------------------------------------------------------------------- +class AEffGUIEditor : public AEffEditor +{ +public : + + AEffGUIEditor (AudioEffect *effect); + + virtual ~AEffGUIEditor (); + + virtual void setParameter (long index, float value) { postUpdate (); } + virtual long getRect (ERect **rect); + virtual long open (void *ptr); + virtual void idle (); + virtual void draw (ERect *rect); +#if MAC + virtual long mouse (long x, long y); +#endif + + // get the current time (in ms) + long getTicks (); + + // feedback to appli. + void doIdleStuff (); + + // get the effect attached to this editor + AudioEffect *getEffect () { return effect; } + +//--------------------------------------- +protected: + ERect rect; + CFrame *frame; + + unsigned long lLastTicks; + +private: + short sInControlLoop; +}; + + +//----------------------------------------------------------------------------- +// Structure CRect +//----------------------------------------------------------------------------- +struct CRect +{ + CRect (long left = 0, long top = 0, long right = 0, long bottom = 0) + : left (left), top (top), right (right), bottom (bottom) {} + CRect (const CRect& r) + : left (r.left), top (r.top), right (r.right), bottom (r.bottom) {} + CRect& operator () (long left, long top, long right, long bottom) + { + if (left < right) + this->left = left, this->right = right; + else + this->left = right, this->right = left; + if (top < bottom) + this->top = top, this->bottom = bottom; + else + this->top = bottom, this->bottom = top; + return *this; + } + + long left; + long top; + long right; + long bottom; + inline long width () { return right - left; } + inline long height () { return bottom - top; } + + void offset (long x, long y) { left += x; right += x; + top += y; bottom += y; } +}; + +//----------------------------------------------------------------------------- +// Structure CPoint +//----------------------------------------------------------------------------- +struct CPoint +{ + CPoint (long h = 0, long v = 0) : h (h), v (v) {} + CPoint& operator () (long h, long v) + { this->h = h; this->v = v; + return *this; } + + bool isInside (CRect& r) + { return h >= r.left && h <= r.right && v >= r.top && v <= r.bottom; } + + long h; + long v; +}; + +//----------------------------------------------------------------------------- +// Structure CColor +//----------------------------------------------------------------------------- +struct CColor +{ + CColor& operator () (unsigned char red, + unsigned char green, + unsigned char blue, + unsigned char unused) + { + this->red = red; + this->green = green; + this->blue = blue; + this->unused = unused; + return *this; + } + + CColor& operator = (CColor newColor) + { + red = newColor.red; + green = newColor.green; + blue = newColor.blue; + unused = newColor.unused; + return *this; + } + + bool operator != (CColor newColor) + { + return (red != newColor.red || + green != newColor.green || + blue != newColor.blue); + } + + bool operator == (CColor newColor) + { + return (red == newColor.red && + green == newColor.green && + blue == newColor.blue); + } + + unsigned char red; + unsigned char green; + unsigned char blue; + unsigned char unused; +}; + +// define some basic colors +static CColor kTransparentCColor = {255, 255, 255, 0}; +static CColor kBlackCColor = {0, 0, 0, 0}; +static CColor kWhiteCColor = {255, 255, 255, 0}; +static CColor kGreyCColor = {127, 127, 127, 0}; +static CColor kRedCColor = {255, 0, 0, 0}; +static CColor kGreenCColor = {0 , 255, 0, 0}; +static CColor kBlueCColor = {0 , 0, 255, 0}; +static CColor kYellowCColor = {255, 255, 0, 0}; +static CColor kCyanCColor = {255, 0, 255, 0}; +static CColor kMagentaCColor= {0 , 255, 255, 0}; + +//----------------------------------------------------------------------------- +//----------- +// Font type +//----------- +enum CFont +{ + kSystemFont = 0, + kNormalFontVeryBig, + kNormalFontBig, + kNormalFont, + kNormalFontSmall, + kNormalFontVerySmall, + kSymbolFont, + + kNumStandardFonts +}; + +//----------- +// Line style +//----------- +enum CLineStyle +{ + kLineSolid = 0, + kLineOnOffDash +}; + +//---------------------------- +// Text alignment (Horizontal) +//---------------------------- +enum CHoriTxtAlign +{ + kLeftText = 0, + kCenterText, + kRightText +}; + +//---------------------------- +// Buttons Type (+modifiers) +//---------------------------- +enum CButton +{ + kLButton = 1, + kMButton = 2, + kRButton = 4, + kShift = 8, + kControl = 16, + kAlt = 32, + kApple = 64 +}; + +//----------------------------------------------------------------------------- +// CDrawContext Declaration +//----------------------------------------------------------------------------- +class CDrawContext +{ +public: + CDrawContext (CFrame *frame, void *systemContext, void *window = 0); + virtual ~CDrawContext (); + + void moveTo (CPoint &point); + void lineTo (CPoint &point); + + void polyLine (CPoint *point, int numberOfPoints); + void fillPolygon (CPoint *point, int numberOfPoints); + + void drawRect (CRect &rect); + void fillRect (CRect &rect); + + void drawArc (CRect &rect, CPoint &point1, CPoint &point2); + void fillArc (CRect &rect, CPoint &point1, CPoint &point2); + + void drawEllipse (CRect &rect); + void fillEllipse (CRect &rect); + + void drawPoint (CPoint &point, CColor color); + + void setLineStyle (CLineStyle style); + CLineStyle getLineStyle () { return lineStyle; } + + void setLineWidth (int width); + int getLineWidth () { return frameWidth; } + + void setFillColor (CColor color); + CColor getFillColor () { return fillColor; } + + void setFrameColor (CColor color); + CColor getFrameColor () { return frameColor; } + + void setFontColor (CColor color); + CColor getFontColor () { return fontColor; } + void setFont (CFont fontID, const int size = 0); + + void drawString (const char *string, CRect &rect, const short opaque = false, + const CHoriTxtAlign hAlign = kCenterText); + + int getMouseButtons (); + void getMouseLocation (CPoint &point); + +#if MOTIF + int getIndexColor (CColor color); + Colormap getColormap (); + Visual *getVisual (); + unsigned int getDepth (); + + static int nbNewColor; +#endif + + void *getWindow () { return window; } + void setWindow (void *ptr) { window = ptr; } + void getLoc (CPoint &where) { where = penLoc; } + + //------------------------------------------- +protected: + + friend class CBitmap; + friend class COffscreenContext; + + void *getSystemContext () { return systemContext; } + + void *systemContext; + void *window; + CFrame *frame; + + int fontSize; + CColor fontColor; + CPoint penLoc; + + int frameWidth; + CColor frameColor; + CColor fillColor; + CLineStyle lineStyle; + +#if WINDOWS + void *brush; + void *pen; + void *font; + void *oldbrush; + void *oldpen; + void *oldfont; + int iPenStyle; + +#elif MAC + FontInfo fontInfoStruct; + Pattern fillPattern; + +#elif MOTIF + Display *display; + + XFontStruct *fontInfoStruct; + CFont fontInfoId; + +#elif BEOS + BView* plugView; + BFont font; + void lineFromTo (CPoint& cstart, CPoint& cend); + +#endif +}; + +//----------------------------------------------------------------------------- +// COffscreenContext Declaration +//----------------------------------------------------------------------------- +class COffscreenContext : public CDrawContext +{ +public: + COffscreenContext (CDrawContext *context, CBitmap *bitmap); + COffscreenContext (CFrame *frame, long width, long height, const CColor backgroundColor = kBlackCColor); + + virtual ~COffscreenContext (); + + void transfert (CDrawContext *context, CRect destRect, CPoint srcOffset = CPoint (0, 0)); + inline int getWidth () { return width; } + inline int getHeight () { return height; } + + //------------------------------------------- +protected: + bool destroyPixmap; + CBitmap *bitmap; + + long height; + long width; + + CColor backgroundColor; + +#if MOTIF + Display *xdisplay; + +#elif BEOS + BBitmap *offscreenBitmap; +#endif +}; + + +//----------------------------------------------------------------------------- +// CBitmap Declaration +//----------------------------------------------------------------------------- +class CBitmap +{ +public: + CBitmap (int resourceID); + CBitmap (CFrame &frame, int width, int height); + ~CBitmap (); + + void draw (CDrawContext*, CRect &rect, const CPoint &offset = CPoint (0, 0)); + void drawTransparent (CDrawContext *context, CRect &rect, const CPoint &offset = CPoint (0, 0)); + + inline int getWidth () { return width; } + inline int getHeight () { return height; } + + void forget (); + void remember (); + + void *getHandle () { return handle; } + +#if BEOS + static void closeResource (); +#endif + + //------------------------------------------- +protected: + int resourceID; + void *handle; + void *mask; + int width; + int height; + + int nbReference; + +#if MOTIF + void *createPixmapFromXpm (CDrawContext *context); + + char **dataXpm; + Display *xdisplay; + +#elif MAC + CCashedPict *pPict; + +#elif BEOS + static BResources *resourceFile; + BBitmap *bbitmap; + bool transparencySet; +#endif +}; + +//----------------------------------------------------------------------------- +// CView Declaration +//----------------------------------------------------------------------------- +class CView +{ +public: + CView (CRect &size); + virtual ~CView (); + + void redraw (); + virtual void draw (CDrawContext *context); + virtual void mouse (CDrawContext *context, CPoint &where); + virtual void update (CDrawContext *context); + + virtual void looseFocus (); + virtual void takeFocus (); + + virtual void setTempOffscreen (COffscreenContext *tempOffscr); + + int getHeight () { return size.height (); } + int getWidth () { return size.width (); } + + CFrame *getParent () { return parent; } + + //------------------------------------------- +protected: + friend class CControl; + friend class CFrame; + CRect size; + CFrame *parent; + COffscreenContext *tempOffscreen; +}; + +//----------------------------------------------------------------------------- +// CFrame Declaration +//----------------------------------------------------------------------------- +class CFrame : public CView +{ +public: + CFrame (CRect &size, void *systemWindow, AEffGUIEditor *editor); + CFrame (CRect &size, char *title, AEffGUIEditor *editor, const int style = 0); + + ~CFrame (); + + bool open (CPoint *point = 0); + bool close (); + bool isOpen () { return openFlag; } + + void draw (CDrawContext *context); + void draw (CView *view = 0); + void mouse (CDrawContext *context, CPoint &where); + + void update (CDrawContext *context); + void idle (); + void doIdleStuff () { if (editor) editor->doIdleStuff (); } + + bool getPosition (int &x, int &y); + bool setSize (int width, int height); + bool getSize (CRect *size); + + void setBackground (CBitmap *background); + CBitmap *getBackground () { return background; } + + virtual bool addView (CView *view); + virtual bool removeView (CView *view); + + int setModalView (CView *view); + +#if WINDOWS + void *getSystemWindow () { return hwnd;} +#elif BEOS + void *getSystemWindow () { return plugView;} +#else + void *getSystemWindow () { return systemWindow;} +#endif + + AEffGUIEditor *getEditor () { return editor; } + + void setEditView (CView *view) { editView = view; } + CView *getEditView () { return editView; } + +#if MOTIF + Colormap getColormap () { return colormap; } + Visual *getVisual () { return visual; } + unsigned int getDepth () { return depth; } + Display *getDisplay () { return display; } + Window getWindow () { return window; } + void freeGc (); + + Region region; + + GC gc; + GC getGC () { return gc; } +#else + void *getGC () { return 0; } +#endif + + //------------------------------------------- +protected: + bool initFrame (void *systemWin); + + AEffGUIEditor *editor; + + void *systemWindow; + CBitmap *background; + int viewCount; + int maxViews; + CView **views; + CView *modalView; + CView *editView; + + bool firstDraw; + bool openFlag; + +#if WINDOWS + void *hwnd; + friend LONG WINAPI WindowProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); + +#elif MOTIF + Colormap colormap; + Display *display; + Visual *visual; + Window window; + unsigned int depth; + + friend void _destroyCallback (Widget, XtPointer, XtPointer); + +#elif BEOS + PlugView *plugView; +#endif + + //------------------------------------------- +private: + bool addedWindow; + void *vstWindow; +}; + + +// include the control object +#ifndef __vstcontrols__ +#include "vstcontrols.h" +#endif + + +//-End-------------------------------------- +#endif diff --git a/4klang_source/Go4kVSTi/win/nasmw.bin b/src/vsti/nasmw.bin similarity index 100% rename from 4klang_source/Go4kVSTi/win/nasmw.bin rename to src/vsti/nasmw.bin diff --git a/4klang_source/Go4kVSTi/win/resource.h b/src/vsti/resource.h similarity index 97% rename from 4klang_source/Go4kVSTi/win/resource.h rename to src/vsti/resource.h index 4d4083d..90ea70d 100644 --- a/4klang_source/Go4kVSTi/win/resource.h +++ b/src/vsti/resource.h @@ -1,1000 +1,1000 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by Go4kVSTi.rc -// -#define IDD_NONE 100 -#define IDD_ENV 101 -#define IDD_VCO 102 -#define IDD_VCF 103 -#define IDD_DST 104 -#define IDD_DLL 105 -#define IDD_FOP 106 -#define IDD_FST 107 -#define IDD_PAN 108 -#define IDD_OUT 109 -#define IDD_ACC 110 -#define IDD_FLD 111 -#define IDD_GLITCH 112 -#define IDD_GO4KVSTIDIALOG 115 -#define IDD_INSTRUMENT_STACK 120 -#define IDD_GLOBAL_STACK 121 -#define IDD_SET_DIALOG 122 -#define IDD_SCROLLWINDOW 123 -#define IDR_COMP_RES 130 -#define IDR_ASM_RES 131 -#define IDC_SET_UNIT 1000 -#define IDC_MAINTAB 1001 -#define IDC_LOAD_PATCH 1002 -#define IDC_SAVE_PATCH 1003 -#define IDC_RESET_PATCH 1004 -#define IDC_LOAD_INSTRUMENT 1005 -#define IDC_SAVE_INSTRUMENT 1006 -#define IDC_RESET_INSTRUMENT 1007 -#define IDC_INSTRUMENT_NAME 1008 -#define IDC_INSTRUMENT 1009 -#define IDC_SOLO 1010 -#define IDC_RECORD_BUTTON 1011 -#define IDC_STOP_BUTTON 1012 -#define IDC_PATTERN_SIZE 1013 -#define IDC_PANIC 1014 -#define IDC_MODULE_SETTINGS 1015 -#define IDC_POLYPHONY 1016 -#define IDC_ENVLEVELS 1017 -#define IDC_NOTEVALUES 1018 -#define IDC_OBJFORMAT 1019 -#define IDC_VOICECOUNT1 1020 -#define IDC_VOICECOUNT2 1021 -#define IDC_VOICECOUNT3 1022 -#define IDC_VOICECOUNT4 1023 -#define IDC_VOICECOUNT5 1024 -#define IDC_VOICECOUNT6 1025 -#define IDC_VOICECOUNT7 1026 -#define IDC_VOICECOUNT8 1027 -#define IDC_VOICECOUNT9 1028 -#define IDC_VOICECOUNT10 1029 -#define IDC_VOICECOUNT11 1030 -#define IDC_VOICECOUNT12 1031 -#define IDC_VOICECOUNT13 1032 -#define IDC_VOICECOUNT14 1033 -#define IDC_VOICECOUNT15 1034 -#define IDC_VOICECOUNT16 1035 -#define IDC_UNDENORMALIZE 1036 -#define IDC_CLIPOUTPUT 1037 -#define IDC_16BIT 1038 -#define IDC_ALWAYSONTOP 1039 -#define IDC_ISTACK_VALID 1040 -#define IDC_GSTACK_VALID 1041 -#define IDC_PATTERN_QUANT 1042 -#define IDC_INSTRUMENTLINK 1043 -#define IDC_RECORDBUSYSIGNAL 1044 -#define IDC_UNIT_RESET 1050 -#define IDC_UNIT_COPY 1051 -#define IDC_UNIT_PASTE 1052 -#define IDC_UNIT_LOAD 1053 -#define IDC_UNIT_SAVE 1054 -#define IDC_ENV_ATTACK 1100 -#define IDC_ENV_ATTACK_VAL 1101 -#define IDC_ENV_ATTACK_QUANT 1102 -#define IDC_ENV_DECAY 1103 -#define IDC_ENV_DECAY_VAL 1104 -#define IDC_ENV_DECAY_QUANT 1105 -#define IDC_ENV_SUSTAIN 1106 -#define IDC_ENV_SUSTAIN_VAL 1107 -#define IDC_ENV_SUSTAIN_QUANT 1108 -#define IDC_ENV_RELEASE_VAL 1110 -#define IDC_ENV_RELEASE_QUANT 1111 -#define IDC_ENV_GAIN 1112 -#define IDC_ENV_GAIN_VAL 1113 -#define IDC_ENV_GAIN_QUANT 1114 -#define IDC_ENV_RELEASE 1119 -#define IDC_VCO_SINE 1150 -#define IDC_VCO_TRISAW 1151 -#define IDC_VCO_PULSE 1152 -#define IDC_VCO_NOISE 1153 -#define IDC_VCO_GATE 1154 -#define IDC_VCO_STEREO 1155 -#define IDC_VCO_TRANSPOSE 1160 -#define IDC_VCO_TRANSPOSE_VAL 1161 -#define IDC_VCO_TRANSPOSE_QUANT 1162 -#define IDC_VCO_DETUNE 1163 -#define IDC_VCO_DETUNE_VAL 1164 -#define IDC_VCO_DETUNE_QUANT 1165 -#define IDC_VCO_PHASE 1166 -#define IDC_VCO_PHASE_VAL 1167 -#define IDC_VCO_PHASE_QUANT 1168 -#define IDC_VCO_COLOR 1169 -#define IDC_VCO_COLOR_VAL 1170 -#define IDC_VCO_COLOR_QUANT 1171 -#define IDC_VCO_SHAPE 1172 -#define IDC_VCO_SHAPE_VAL 1173 -#define IDC_VCO_GAIN_VAL 1174 -#define IDC_VCO_GAIN_QUANT 1175 -#define IDC_VCO_LFO 1176 -#define IDC_VCO_SHAPE_QUANT 1177 -#define IDC_VCO_GAIN 1178 -#define IDC_VCO_GATE1 1180 -#define IDC_VCO_GATE2 1181 -#define IDC_VCO_GATE3 1182 -#define IDC_VCO_GATE4 1183 -#define IDC_VCO_GATE5 1184 -#define IDC_VCO_GATE6 1185 -#define IDC_VCO_GATE7 1186 -#define IDC_VCO_GATE8 1187 -#define IDC_VCO_GATE9 1188 -#define IDC_VCO_GATE10 1189 -#define IDC_VCO_GATE11 1190 -#define IDC_VCO_GATE12 1191 -#define IDC_VCO_GATE13 1192 -#define IDC_VCO_GATE14 1193 -#define IDC_VCO_GATE15 1194 -#define IDC_VCO_GATE16 1195 -#define IDC_VCF_OFF 1200 -#define IDC_VCF_LOW 1201 -#define IDC_VCF_HIGH 1202 -#define IDC_VCF_BAND 1203 -#define IDC_VCF_NOTCH 1204 -#define IDC_VCF_PEAK 1205 -#define IDC_VCF_ALL 1206 -#define IDC_VCF_FREQUENCY 1207 -#define IDC_VCF_FREQUENCY_VAL 1208 -#define IDC_VCF_FREQUENCY_QUANT 1209 -#define IDC_VCF_RESONANCE 1210 -#define IDC_VCF_RESONANCE_VAL 1211 -#define IDC_VCF_RESONANCE_QUANT 1212 -#define IDC_VCF_STEREO 1213 -#define IDC_DST_DRIVE 1250 -#define IDC_DST_DRIVE_VAL 1251 -#define IDC_DST_DRIVE_QUANT 1252 -#define IDC_DST_SNH 1253 -#define IDC_DST_SNH_VAL 1254 -#define IDC_DST_SNH_QUANT 1255 -#define IDC_DLL_OFF 1300 -#define IDC_DLL_DELAY 1301 -#define IDC_DLL_REVERB 1302 -#define IDC_DLL_PREGAIN 1303 -#define IDC_DLL_PREGAIN_VAL 1304 -#define IDC_DLL_PREGAIN_QUANT 1305 -#define IDC_DLL_FEEDBACK 1306 -#define IDC_DLL_FEEDBACK_VAL 1307 -#define IDC_DLL_FEEDBACK_QUANT 1308 -#define IDC_DLL_DRY 1309 -#define IDC_DLL_DRY_VAL 1310 -#define IDC_DLL_DRY_QUANT 1311 -#define IDC_DLL_DAMP 1312 -#define IDC_DLL_DAMP_VAL 1313 -#define IDC_DLL_DAMP_QUANT 1314 -#define IDC_DLL_DTIME 1315 -#define IDC_DLL_DTIME_VAL 1316 -#define IDC_DLL_NOSYNC 1317 -#define IDC_DLL_BPMSYNC 1318 -#define IDC_DLL_NOTESYNC 1319 -#define IDC_DLL_LEFTREVERB 1320 -#define IDC_DLL_FREQUENCY 1321 -#define IDC_DLL_FREQUENCY_VAL 1322 -#define IDC_DLL_DEPTH 1323 -#define IDC_DLL_DEPTH_VAL 1324 -#define IDC_FOP_POP 1351 -#define IDC_FOP_ADDP 1352 -#define IDC_FOP_MULP 1353 -#define IDC_FOP_PUSH 1354 -#define IDC_FOP_XCH 1355 -#define IDC_FOP_ADD 1356 -#define IDC_FOP_MUL 1357 -#define IDC_FOP_ADDP2 1358 -#define IDC_FOP_LOADNOTE 1359 -#define IDC_FOP_MULP2 1360 -#define IDC_FST_AMOUNT 1400 -#define IDC_FST_AMOUNT_VAL 1401 -#define IDC_FST_AMOUNT_QUANT 1402 -#define IDC_FST_DESTINATION_INSTRUMENT 1403 -#define IDC_FST_DESTINATION_UNIT 1404 -#define IDC_FST_DESTINATION_SLOT 1405 -#define IDC_FST_SET 1410 -#define IDC_FST_ADD 1411 -#define IDC_FST_MUL 1412 -#define IDC_FST_POP 1413 -#define IDC_PAN_PANNING 1450 -#define IDC_PAN_PANNING_VAL 1451 -#define IDC_PAN_PANNING_QUANT 1452 -#define IDC_OUT_GAIN 1500 -#define IDC_OUT_GAIN_VAL 1501 -#define IDC_OUT_GAIN_QUANT 1502 -#define IDC_OUT_AUXSEND 1503 -#define IDC_OUT_AUXSEND_QUANT 1504 -#define IDC_OUT_AUXSEND_VAL 1505 -#define IDC_ACC_OUT 1550 -#define IDC_ACC_AUX 1551 -#define IDC_FLD_VALUE 1552 -#define IDC_FLD_VALUE_VAL 1553 -#define IDC_FLD_VALUE_QUANT 1554 -#define IDC_ISTACK_UNIT1 1600 -#define IDC_ISTACK_UP1 1601 -#define IDC_ISTACK_DOWN1 1602 -#define IDC_ISTACK_SIGNALCOUNT1 1603 -#define IDC_ISTACK_SET1 1604 -#define IDC_ISTACK_RESET1 1605 -#define IDC_ISTACK_UNIT2 1606 -#define IDC_ISTACK_UP2 1607 -#define IDC_ISTACK_DOWN2 1608 -#define IDC_ISTACK_SIGNALCOUNT2 1609 -#define IDC_ISTACK_SET2 1610 -#define IDC_ISTACK_RESET2 1611 -#define IDC_ISTACK_UNIT3 1612 -#define IDC_ISTACK_UP3 1613 -#define IDC_ISTACK_DOWN3 1614 -#define IDC_ISTACK_SIGNALCOUNT3 1615 -#define IDC_ISTACK_SET3 1616 -#define IDC_ISTACK_RESET3 1617 -#define IDC_ISTACK_UNIT4 1618 -#define IDC_ISTACK_UP4 1619 -#define IDC_ISTACK_DOWN4 1620 -#define IDC_ISTACK_SIGNALCOUNT4 1621 -#define IDC_ISTACK_SET4 1622 -#define IDC_ISTACK_RESET4 1623 -#define IDC_ISTACK_UNIT5 1624 -#define IDC_ISTACK_UP5 1625 -#define IDC_ISTACK_DOWN5 1626 -#define IDC_ISTACK_SIGNALCOUNT5 1627 -#define IDC_ISTACK_SET5 1628 -#define IDC_ISTACK_RESET5 1629 -#define IDC_ISTACK_UNIT6 1630 -#define IDC_ISTACK_UP6 1631 -#define IDC_ISTACK_DOWN6 1632 -#define IDC_ISTACK_SIGNALCOUNT6 1633 -#define IDC_ISTACK_SET6 1634 -#define IDC_ISTACK_RESET6 1635 -#define IDC_ISTACK_UNIT7 1636 -#define IDC_ISTACK_UP7 1637 -#define IDC_ISTACK_DOWN7 1638 -#define IDC_ISTACK_SIGNALCOUNT7 1639 -#define IDC_ISTACK_SET7 1640 -#define IDC_ISTACK_RESET7 1641 -#define IDC_ISTACK_UNIT8 1642 -#define IDC_ISTACK_UP8 1643 -#define IDC_ISTACK_DOWN8 1644 -#define IDC_ISTACK_SIGNALCOUNT8 1645 -#define IDC_ISTACK_SET8 1646 -#define IDC_ISTACK_RESET8 1647 -#define IDC_ISTACK_UNIT9 1648 -#define IDC_ISTACK_UP9 1649 -#define IDC_ISTACK_DOWN9 1650 -#define IDC_ISTACK_SIGNALCOUNT9 1651 -#define IDC_ISTACK_SET9 1652 -#define IDC_ISTACK_RESET9 1653 -#define IDC_ISTACK_UNIT10 1654 -#define IDC_ISTACK_UP10 1655 -#define IDC_ISTACK_DOWN10 1656 -#define IDC_ISTACK_SIGNALCOUNT10 1657 -#define IDC_ISTACK_SET10 1658 -#define IDC_ISTACK_RESET10 1659 -#define IDC_ISTACK_UNIT11 1660 -#define IDC_ISTACK_UP11 1661 -#define IDC_ISTACK_DOWN11 1662 -#define IDC_ISTACK_SIGNALCOUNT11 1663 -#define IDC_ISTACK_SET11 1664 -#define IDC_ISTACK_RESET11 1665 -#define IDC_ISTACK_UNIT12 1666 -#define IDC_ISTACK_UP12 1667 -#define IDC_ISTACK_DOWN12 1668 -#define IDC_ISTACK_SIGNALCOUNT12 1669 -#define IDC_ISTACK_SET12 1670 -#define IDC_ISTACK_RESET12 1671 -#define IDC_ISTACK_UNIT13 1672 -#define IDC_ISTACK_UP13 1673 -#define IDC_ISTACK_DOWN13 1674 -#define IDC_ISTACK_SIGNALCOUNT13 1675 -#define IDC_ISTACK_SET13 1676 -#define IDC_ISTACK_RESET13 1677 -#define IDC_ISTACK_UNIT14 1678 -#define IDC_ISTACK_UP14 1679 -#define IDC_ISTACK_DOWN14 1680 -#define IDC_ISTACK_SIGNALCOUNT14 1681 -#define IDC_ISTACK_SET14 1682 -#define IDC_ISTACK_RESET14 1683 -#define IDC_ISTACK_UNIT15 1684 -#define IDC_ISTACK_UP15 1685 -#define IDC_ISTACK_DOWN15 1686 -#define IDC_ISTACK_SIGNALCOUNT15 1687 -#define IDC_ISTACK_SET15 1688 -#define IDC_ISTACK_RESET15 1689 -#define IDC_ISTACK_UNIT16 1690 -#define IDC_ISTACK_UP16 1691 -#define IDC_ISTACK_DOWN16 1692 -#define IDC_ISTACK_SIGNALCOUNT16 1693 -#define IDC_ISTACK_SET16 1694 -#define IDC_ISTACK_RESET16 1695 -#define IDC_ISTACK_UNIT17 1696 -#define IDC_ISTACK_UP17 1697 -#define IDC_ISTACK_DOWN17 1698 -#define IDC_ISTACK_SIGNALCOUNT17 1699 -#define IDC_ISTACK_SET17 1700 -#define IDC_ISTACK_RESET17 1701 -#define IDC_ISTACK_UNIT18 1702 -#define IDC_ISTACK_UP18 1703 -#define IDC_ISTACK_DOWN18 1704 -#define IDC_ISTACK_SIGNALCOUNT18 1705 -#define IDC_ISTACK_SET18 1706 -#define IDC_ISTACK_RESET18 1707 -#define IDC_ISTACK_UNIT19 1708 -#define IDC_ISTACK_UP19 1709 -#define IDC_ISTACK_DOWN19 1710 -#define IDC_ISTACK_SIGNALCOUNT19 1711 -#define IDC_ISTACK_SET19 1712 -#define IDC_ISTACK_RESET19 1713 -#define IDC_ISTACK_UNIT20 1714 -#define IDC_ISTACK_UP20 1715 -#define IDC_ISTACK_DOWN20 1716 -#define IDC_ISTACK_SIGNALCOUNT20 1717 -#define IDC_ISTACK_SET20 1718 -#define IDC_ISTACK_RESET20 1719 -#define IDC_ISTACK_UNIT21 1720 -#define IDC_ISTACK_UP21 1721 -#define IDC_ISTACK_DOWN21 1722 -#define IDC_ISTACK_SIGNALCOUNT21 1723 -#define IDC_ISTACK_SET21 1724 -#define IDC_ISTACK_RESET21 1725 -#define IDC_ISTACK_UNIT22 1726 -#define IDC_ISTACK_UP22 1727 -#define IDC_ISTACK_DOWN22 1728 -#define IDC_ISTACK_SIGNALCOUNT22 1729 -#define IDC_ISTACK_SET22 1730 -#define IDC_ISTACK_RESET22 1731 -#define IDC_ISTACK_UNIT23 1732 -#define IDC_ISTACK_UP23 1733 -#define IDC_ISTACK_DOWN23 1734 -#define IDC_ISTACK_SIGNALCOUNT23 1735 -#define IDC_ISTACK_SET23 1736 -#define IDC_ISTACK_RESET23 1737 -#define IDC_ISTACK_UNIT24 1738 -#define IDC_ISTACK_UP24 1739 -#define IDC_ISTACK_DOWN24 1740 -#define IDC_ISTACK_SIGNALCOUNT24 1741 -#define IDC_ISTACK_SET24 1742 -#define IDC_ISTACK_RESET24 1743 -#define IDC_ISTACK_UNIT25 1744 -#define IDC_ISTACK_UP25 1745 -#define IDC_ISTACK_DOWN25 1746 -#define IDC_ISTACK_SIGNALCOUNT25 1747 -#define IDC_ISTACK_SET25 1748 -#define IDC_ISTACK_RESET25 1749 -#define IDC_ISTACK_UNIT26 1750 -#define IDC_ISTACK_UP26 1751 -#define IDC_ISTACK_DOWN26 1752 -#define IDC_ISTACK_SIGNALCOUNT26 1753 -#define IDC_ISTACK_SET26 1754 -#define IDC_ISTACK_RESET26 1755 -#define IDC_ISTACK_UNIT27 1756 -#define IDC_ISTACK_UP27 1757 -#define IDC_ISTACK_DOWN27 1758 -#define IDC_ISTACK_SIGNALCOUNT27 1759 -#define IDC_ISTACK_SET27 1760 -#define IDC_ISTACK_RESET27 1761 -#define IDC_ISTACK_UNIT28 1762 -#define IDC_ISTACK_UP28 1763 -#define IDC_ISTACK_DOWN28 1764 -#define IDC_ISTACK_SIGNALCOUNT28 1765 -#define IDC_ISTACK_SET28 1766 -#define IDC_ISTACK_RESET28 1767 -#define IDC_ISTACK_UNIT29 1768 -#define IDC_ISTACK_UP29 1769 -#define IDC_ISTACK_DOWN29 1770 -#define IDC_ISTACK_SIGNALCOUNT29 1771 -#define IDC_ISTACK_SET29 1772 -#define IDC_ISTACK_RESET29 1773 -#define IDC_ISTACK_UNIT30 1774 -#define IDC_ISTACK_UP30 1775 -#define IDC_ISTACK_DOWN30 1776 -#define IDC_ISTACK_SIGNALCOUNT30 1777 -#define IDC_ISTACK_SET30 1778 -#define IDC_ISTACK_RESET30 1779 -#define IDC_ISTACK_UNIT31 1780 -#define IDC_ISTACK_UP31 1781 -#define IDC_ISTACK_DOWN31 1782 -#define IDC_ISTACK_SIGNALCOUNT31 1783 -#define IDC_ISTACK_SET31 1784 -#define IDC_ISTACK_RESET31 1785 -#define IDC_ISTACK_UNIT32 1786 -#define IDC_ISTACK_UP32 1787 -#define IDC_ISTACK_DOWN32 1788 -#define IDC_ISTACK_SIGNALCOUNT32 1789 -#define IDC_ISTACK_SET32 1790 -#define IDC_ISTACK_RESET32 1791 -#define IDC_ISTACK__UNIT1 1792 -#define IDC_ISTACK__UP1 1793 -#define IDC_ISTACK__DOWN1 1794 -#define IDC_ISTACK__SIGNALCOUNT1 1795 -#define IDC_ISTACK__SET1 1796 -#define IDC_ISTACK__RESET1 1797 -#define IDC_ISTACK__UNIT2 1798 -#define IDC_ISTACK__UP2 1799 -#define IDC_ISTACK__DOWN2 1800 -#define IDC_ISTACK__SIGNALCOUNT2 1801 -#define IDC_ISTACK__SET2 1802 -#define IDC_ISTACK__RESET2 1803 -#define IDC_ISTACK__UNIT3 1804 -#define IDC_ISTACK__UP3 1805 -#define IDC_ISTACK__DOWN3 1806 -#define IDC_ISTACK__SIGNALCOUNT3 1807 -#define IDC_ISTACK__SET3 1808 -#define IDC_ISTACK__RESET3 1809 -#define IDC_ISTACK__UNIT4 1810 -#define IDC_ISTACK__UP4 1811 -#define IDC_ISTACK__DOWN4 1812 -#define IDC_ISTACK__SIGNALCOUNT4 1813 -#define IDC_ISTACK__SET4 1814 -#define IDC_ISTACK__RESET4 1815 -#define IDC_ISTACK__UNIT5 1816 -#define IDC_ISTACK__UP5 1817 -#define IDC_ISTACK__DOWN5 1818 -#define IDC_ISTACK__SIGNALCOUNT5 1819 -#define IDC_ISTACK__SET5 1820 -#define IDC_ISTACK__RESET5 1821 -#define IDC_ISTACK__UNIT6 1822 -#define IDC_ISTACK__UP6 1823 -#define IDC_ISTACK__DOWN6 1824 -#define IDC_ISTACK__SIGNALCOUNT6 1825 -#define IDC_ISTACK__SET6 1826 -#define IDC_ISTACK__RESET6 1827 -#define IDC_ISTACK__UNIT7 1828 -#define IDC_ISTACK__UP7 1829 -#define IDC_ISTACK__DOWN7 1830 -#define IDC_ISTACK__SIGNALCOUNT7 1831 -#define IDC_ISTACK__SET7 1832 -#define IDC_ISTACK__RESET7 1833 -#define IDC_ISTACK__UNIT8 1834 -#define IDC_ISTACK__UP8 1835 -#define IDC_ISTACK__DOWN8 1836 -#define IDC_ISTACK__SIGNALCOUNT8 1837 -#define IDC_ISTACK__SET8 1838 -#define IDC_ISTACK__RESET8 1839 -#define IDC_ISTACK__UNIT9 1840 -#define IDC_ISTACK__UP9 1841 -#define IDC_ISTACK__DOWN9 1842 -#define IDC_ISTACK__SIGNALCOUNT9 1843 -#define IDC_ISTACK__SET9 1844 -#define IDC_ISTACK__RESET9 1845 -#define IDC_ISTACK__UNIT10 1846 -#define IDC_ISTACK__UP10 1847 -#define IDC_ISTACK__DOWN10 1848 -#define IDC_ISTACK__SIGNALCOUNT10 1849 -#define IDC_ISTACK__SET10 1850 -#define IDC_ISTACK__RESET10 1851 -#define IDC_ISTACK__UNIT11 1852 -#define IDC_ISTACK__UP11 1853 -#define IDC_ISTACK__DOWN11 1854 -#define IDC_ISTACK__SIGNALCOUNT11 1855 -#define IDC_ISTACK__SET11 1856 -#define IDC_ISTACK__RESET11 1857 -#define IDC_ISTACK__UNIT12 1858 -#define IDC_ISTACK__UP12 1859 -#define IDC_ISTACK__DOWN12 1860 -#define IDC_ISTACK__SIGNALCOUNT12 1861 -#define IDC_ISTACK__SET12 1862 -#define IDC_ISTACK__RESET12 1863 -#define IDC_ISTACK__UNIT13 1864 -#define IDC_ISTACK__UP13 1865 -#define IDC_ISTACK__DOWN13 1866 -#define IDC_ISTACK__SIGNALCOUNT13 1867 -#define IDC_ISTACK__SET13 1868 -#define IDC_ISTACK__RESET13 1869 -#define IDC_ISTACK__UNIT14 1870 -#define IDC_ISTACK__UP14 1871 -#define IDC_ISTACK__DOWN14 1872 -#define IDC_ISTACK__SIGNALCOUNT14 1873 -#define IDC_ISTACK__SET14 1874 -#define IDC_ISTACK__RESET14 1875 -#define IDC_ISTACK__UNIT15 1876 -#define IDC_ISTACK__UP15 1877 -#define IDC_ISTACK__DOWN15 1878 -#define IDC_ISTACK__SIGNALCOUNT15 1879 -#define IDC_ISTACK__SET15 1880 -#define IDC_ISTACK__RESET15 1881 -#define IDC_ISTACK__UNIT16 1882 -#define IDC_ISTACK__UP16 1883 -#define IDC_ISTACK__DOWN16 1884 -#define IDC_ISTACK__SIGNALCOUNT16 1885 -#define IDC_ISTACK__SET16 1886 -#define IDC_ISTACK__RESET16 1887 -#define IDC_ISTACK__UNIT17 1888 -#define IDC_ISTACK__UP17 1889 -#define IDC_ISTACK__DOWN17 1890 -#define IDC_ISTACK__SIGNALCOUNT17 1891 -#define IDC_ISTACK__SET17 1892 -#define IDC_ISTACK__RESET17 1893 -#define IDC_ISTACK__UNIT18 1894 -#define IDC_ISTACK__UP18 1895 -#define IDC_ISTACK__DOWN18 1896 -#define IDC_ISTACK__SIGNALCOUNT18 1897 -#define IDC_ISTACK__SET18 1898 -#define IDC_ISTACK__RESET18 1899 -#define IDC_ISTACK__UNIT19 1900 -#define IDC_ISTACK__UP19 1901 -#define IDC_ISTACK__DOWN19 1902 -#define IDC_ISTACK__SIGNALCOUNT19 1903 -#define IDC_ISTACK__SET19 1904 -#define IDC_ISTACK__RESET19 1905 -#define IDC_ISTACK__UNIT20 1906 -#define IDC_ISTACK__UP20 1907 -#define IDC_ISTACK__DOWN20 1908 -#define IDC_ISTACK__SIGNALCOUNT20 1909 -#define IDC_ISTACK__SET20 1910 -#define IDC_ISTACK__RESET20 1911 -#define IDC_ISTACK__UNIT21 1912 -#define IDC_ISTACK__UP21 1913 -#define IDC_ISTACK__DOWN21 1914 -#define IDC_ISTACK__SIGNALCOUNT21 1915 -#define IDC_ISTACK__SET21 1916 -#define IDC_ISTACK__RESET21 1917 -#define IDC_ISTACK__UNIT22 1918 -#define IDC_ISTACK__UP22 1919 -#define IDC_ISTACK__DOWN22 1920 -#define IDC_ISTACK__SIGNALCOUNT22 1921 -#define IDC_ISTACK__SET22 1922 -#define IDC_ISTACK__RESET22 1923 -#define IDC_ISTACK__UNIT23 1924 -#define IDC_ISTACK__UP23 1925 -#define IDC_ISTACK__DOWN23 1926 -#define IDC_ISTACK__SIGNALCOUNT23 1927 -#define IDC_ISTACK__SET23 1928 -#define IDC_ISTACK__RESET23 1929 -#define IDC_ISTACK__UNIT24 1930 -#define IDC_ISTACK__UP24 1931 -#define IDC_ISTACK__DOWN24 1932 -#define IDC_ISTACK__SIGNALCOUNT24 1933 -#define IDC_ISTACK__SET24 1934 -#define IDC_ISTACK__RESET24 1935 -#define IDC_ISTACK__UNIT25 1936 -#define IDC_ISTACK__UP25 1937 -#define IDC_ISTACK__DOWN25 1938 -#define IDC_ISTACK__SIGNALCOUNT25 1939 -#define IDC_ISTACK__SET25 1940 -#define IDC_ISTACK__RESET25 1941 -#define IDC_ISTACK__UNIT26 1942 -#define IDC_ISTACK__UP26 1943 -#define IDC_ISTACK__DOWN26 1944 -#define IDC_ISTACK__SIGNALCOUNT26 1945 -#define IDC_ISTACK__SET26 1946 -#define IDC_ISTACK__RESET26 1947 -#define IDC_ISTACK__UNIT27 1948 -#define IDC_ISTACK__UP27 1949 -#define IDC_ISTACK__DOWN27 1950 -#define IDC_ISTACK__SIGNALCOUNT27 1951 -#define IDC_ISTACK__SET27 1952 -#define IDC_ISTACK__RESET27 1953 -#define IDC_ISTACK__UNIT28 1954 -#define IDC_ISTACK__UP28 1955 -#define IDC_ISTACK__DOWN28 1956 -#define IDC_ISTACK__SIGNALCOUNT28 1957 -#define IDC_ISTACK__SET28 1958 -#define IDC_ISTACK__RESET28 1959 -#define IDC_ISTACK__UNIT29 1960 -#define IDC_ISTACK__UP29 1961 -#define IDC_ISTACK__DOWN29 1962 -#define IDC_ISTACK__SIGNALCOUNT29 1963 -#define IDC_ISTACK__SET29 1964 -#define IDC_ISTACK__RESET29 1965 -#define IDC_ISTACK__UNIT30 1966 -#define IDC_ISTACK__UP30 1967 -#define IDC_ISTACK__DOWN30 1968 -#define IDC_ISTACK__SIGNALCOUNT30 1969 -#define IDC_ISTACK__SET30 1970 -#define IDC_ISTACK__RESET30 1971 -#define IDC_ISTACK__UNIT31 1972 -#define IDC_ISTACK__UP31 1973 -#define IDC_ISTACK__DOWN31 1974 -#define IDC_ISTACK__SIGNALCOUNT31 1975 -#define IDC_ISTACK__SET31 1976 -#define IDC_ISTACK__RESET31 1977 -#define IDC_ISTACK__UNIT32 1978 -#define IDC_ISTACK__UP32 1979 -#define IDC_ISTACK__DOWN32 1980 -#define IDC_ISTACK__SIGNALCOUNT32 1981 -#define IDC_ISTACK__SET32 1982 -#define IDC_ISTACK__RESET32 1983 -#define IDC_GSTACK_UNIT1 3600 -#define IDC_GSTACK_UP1 3601 -#define IDC_GSTACK_DOWN1 3602 -#define IDC_GSTACK_SIGNALCOUNT1 3603 -#define IDC_GSTACK_SET1 3604 -#define IDC_GSTACK_RESET1 3605 -#define IDC_GSTACK_UNIT2 3606 -#define IDC_GSTACK_UP2 3607 -#define IDC_GSTACK_DOWN2 3608 -#define IDC_GSTACK_SIGNALCOUNT2 3609 -#define IDC_GSTACK_SET2 3610 -#define IDC_GSTACK_RESET2 3611 -#define IDC_GSTACK_UNIT3 3612 -#define IDC_GSTACK_UP3 3613 -#define IDC_GSTACK_DOWN3 3614 -#define IDC_GSTACK_SIGNALCOUNT3 3615 -#define IDC_GSTACK_SET3 3616 -#define IDC_GSTACK_RESET3 3617 -#define IDC_GSTACK_UNIT4 3618 -#define IDC_GSTACK_UP4 3619 -#define IDC_GSTACK_DOWN4 3620 -#define IDC_GSTACK_SIGNALCOUNT4 3621 -#define IDC_GSTACK_SET4 3622 -#define IDC_GSTACK_RESET4 3623 -#define IDC_GSTACK_UNIT5 3624 -#define IDC_GSTACK_UP5 3625 -#define IDC_GSTACK_DOWN5 3626 -#define IDC_GSTACK_SIGNALCOUNT5 3627 -#define IDC_GSTACK_SET5 3628 -#define IDC_GSTACK_RESET5 3629 -#define IDC_GSTACK_UNIT6 3630 -#define IDC_GSTACK_UP6 3631 -#define IDC_GSTACK_DOWN6 3632 -#define IDC_GSTACK_SIGNALCOUNT6 3633 -#define IDC_GSTACK_SET6 3634 -#define IDC_GSTACK_RESET6 3635 -#define IDC_GSTACK_UNIT7 3636 -#define IDC_GSTACK_UP7 3637 -#define IDC_GSTACK_DOWN7 3638 -#define IDC_GSTACK_SIGNALCOUNT7 3639 -#define IDC_GSTACK_SET7 3640 -#define IDC_GSTACK_RESET7 3641 -#define IDC_GSTACK_UNIT8 3642 -#define IDC_GSTACK_UP8 3643 -#define IDC_GSTACK_DOWN8 3644 -#define IDC_GSTACK_SIGNALCOUNT8 3645 -#define IDC_GSTACK_SET8 3646 -#define IDC_GSTACK_RESET8 3647 -#define IDC_GSTACK_UNIT9 3648 -#define IDC_GSTACK_UP9 3649 -#define IDC_GSTACK_DOWN9 3650 -#define IDC_GSTACK_SIGNALCOUNT9 3651 -#define IDC_GSTACK_SET9 3652 -#define IDC_GSTACK_RESET9 3653 -#define IDC_GSTACK_UNIT10 3654 -#define IDC_GSTACK_UP10 3655 -#define IDC_GSTACK_DOWN10 3656 -#define IDC_GSTACK_SIGNALCOUNT10 3657 -#define IDC_GSTACK_SET10 3658 -#define IDC_GSTACK_RESET10 3659 -#define IDC_GSTACK_UNIT11 3660 -#define IDC_GSTACK_UP11 3661 -#define IDC_GSTACK_DOWN11 3662 -#define IDC_GSTACK_SIGNALCOUNT11 3663 -#define IDC_GSTACK_SET11 3664 -#define IDC_GSTACK_RESET11 3665 -#define IDC_GSTACK_UNIT12 3666 -#define IDC_GSTACK_UP12 3667 -#define IDC_GSTACK_DOWN12 3668 -#define IDC_GSTACK_SIGNALCOUNT12 3669 -#define IDC_GSTACK_SET12 3670 -#define IDC_GSTACK_RESET12 3671 -#define IDC_GSTACK_UNIT13 3672 -#define IDC_GSTACK_UP13 3673 -#define IDC_GSTACK_DOWN13 3674 -#define IDC_GSTACK_SIGNALCOUNT13 3675 -#define IDC_GSTACK_SET13 3676 -#define IDC_GSTACK_RESET13 3677 -#define IDC_GSTACK_UNIT14 3678 -#define IDC_GSTACK_UP14 3679 -#define IDC_GSTACK_DOWN14 3680 -#define IDC_GSTACK_SIGNALCOUNT14 3681 -#define IDC_GSTACK_SET14 3682 -#define IDC_GSTACK_RESET14 3683 -#define IDC_GSTACK_UNIT15 3684 -#define IDC_GSTACK_UP15 3685 -#define IDC_GSTACK_DOWN15 3686 -#define IDC_GSTACK_SIGNALCOUNT15 3687 -#define IDC_GSTACK_SET15 3688 -#define IDC_GSTACK_RESET15 3689 -#define IDC_GSTACK_UNIT16 3690 -#define IDC_GSTACK_UP16 3691 -#define IDC_GSTACK_DOWN16 3692 -#define IDC_GSTACK_SIGNALCOUNT16 3693 -#define IDC_GSTACK_SET16 3694 -#define IDC_GSTACK_RESET16 3695 -#define IDC_GSTACK_UNIT17 3696 -#define IDC_GSTACK_UP17 3697 -#define IDC_GSTACK_DOWN17 3698 -#define IDC_GSTACK_SIGNALCOUNT17 3699 -#define IDC_GSTACK_SET17 3700 -#define IDC_GSTACK_RESET17 3701 -#define IDC_GSTACK_UNIT18 3702 -#define IDC_GSTACK_UP18 3703 -#define IDC_GSTACK_DOWN18 3704 -#define IDC_GSTACK_SIGNALCOUNT18 3705 -#define IDC_GSTACK_SET18 3706 -#define IDC_GSTACK_RESET18 3707 -#define IDC_GSTACK_UNIT19 3708 -#define IDC_GSTACK_UP19 3709 -#define IDC_GSTACK_DOWN19 3710 -#define IDC_GSTACK_SIGNALCOUNT19 3711 -#define IDC_GSTACK_SET19 3712 -#define IDC_GSTACK_RESET19 3713 -#define IDC_GSTACK_UNIT20 3714 -#define IDC_GSTACK_UP20 3715 -#define IDC_GSTACK_DOWN20 3716 -#define IDC_GSTACK_SIGNALCOUNT20 3717 -#define IDC_GSTACK_SET20 3718 -#define IDC_GSTACK_RESET20 3719 -#define IDC_GSTACK_UNIT21 3720 -#define IDC_GSTACK_UP21 3721 -#define IDC_GSTACK_DOWN21 3722 -#define IDC_GSTACK_SIGNALCOUNT21 3723 -#define IDC_GSTACK_SET21 3724 -#define IDC_GSTACK_RESET21 3725 -#define IDC_GSTACK_UNIT22 3726 -#define IDC_GSTACK_UP22 3727 -#define IDC_GSTACK_DOWN22 3728 -#define IDC_GSTACK_SIGNALCOUNT22 3729 -#define IDC_GSTACK_SET22 3730 -#define IDC_GSTACK_RESET22 3731 -#define IDC_GSTACK_UNIT23 3732 -#define IDC_GSTACK_UP23 3733 -#define IDC_GSTACK_DOWN23 3734 -#define IDC_GSTACK_SIGNALCOUNT23 3735 -#define IDC_GSTACK_SET23 3736 -#define IDC_GSTACK_RESET23 3737 -#define IDC_GSTACK_UNIT24 3738 -#define IDC_GSTACK_UP24 3739 -#define IDC_GSTACK_DOWN24 3740 -#define IDC_GSTACK_SIGNALCOUNT24 3741 -#define IDC_GSTACK_SET24 3742 -#define IDC_GSTACK_RESET24 3743 -#define IDC_GSTACK_UNIT25 3744 -#define IDC_GSTACK_UP25 3745 -#define IDC_GSTACK_DOWN25 3746 -#define IDC_GSTACK_SIGNALCOUNT25 3747 -#define IDC_GSTACK_SET25 3748 -#define IDC_GSTACK_RESET25 3749 -#define IDC_GSTACK_UNIT26 3750 -#define IDC_GSTACK_UP26 3751 -#define IDC_GSTACK_DOWN26 3752 -#define IDC_GSTACK_SIGNALCOUNT26 3753 -#define IDC_GSTACK_SET26 3754 -#define IDC_GSTACK_RESET26 3755 -#define IDC_GSTACK_UNIT27 3756 -#define IDC_GSTACK_UP27 3757 -#define IDC_GSTACK_DOWN27 3758 -#define IDC_GSTACK_SIGNALCOUNT27 3759 -#define IDC_GSTACK_SET27 3760 -#define IDC_GSTACK_RESET27 3761 -#define IDC_GSTACK_UNIT28 3762 -#define IDC_GSTACK_UP28 3763 -#define IDC_GSTACK_DOWN28 3764 -#define IDC_GSTACK_SIGNALCOUNT28 3765 -#define IDC_GSTACK_SET28 3766 -#define IDC_GSTACK_RESET28 3767 -#define IDC_GSTACK_UNIT29 3768 -#define IDC_GSTACK_UP29 3769 -#define IDC_GSTACK_DOWN29 3770 -#define IDC_GSTACK_SIGNALCOUNT29 3771 -#define IDC_GSTACK_SET29 3772 -#define IDC_GSTACK_RESET29 3773 -#define IDC_GSTACK_UNIT30 3774 -#define IDC_GSTACK_UP30 3775 -#define IDC_GSTACK_DOWN30 3776 -#define IDC_GSTACK_SIGNALCOUNT30 3777 -#define IDC_GSTACK_SET30 3778 -#define IDC_GSTACK_RESET30 3779 -#define IDC_GSTACK_UNIT31 3780 -#define IDC_GSTACK_UP31 3781 -#define IDC_GSTACK_DOWN31 3782 -#define IDC_GSTACK_SIGNALCOUNT31 3783 -#define IDC_GSTACK_SET31 3784 -#define IDC_GSTACK_RESET31 3785 -#define IDC_GSTACK_UNIT32 3786 -#define IDC_GSTACK_UP32 3787 -#define IDC_GSTACK_DOWN32 3788 -#define IDC_GSTACK_SIGNALCOUNT32 3789 -#define IDC_GSTACK_SET32 3790 -#define IDC_GSTACK_RESET32 3791 -#define IDC_GSTACK__UNIT1 3792 -#define IDC_GSTACK__UP1 3793 -#define IDC_GSTACK__DOWN1 3794 -#define IDC_GSTACK__SIGNALCOUNT1 3795 -#define IDC_GSTACK__SET1 3796 -#define IDC_GSTACK__RESET1 3797 -#define IDC_GSTACK__UNIT2 3798 -#define IDC_GSTACK__UP2 3799 -#define IDC_GSTACK__DOWN2 3800 -#define IDC_GSTACK__SIGNALCOUNT2 3801 -#define IDC_GSTACK__SET2 3802 -#define IDC_GSTACK__RESET2 3803 -#define IDC_GSTACK__UNIT3 3804 -#define IDC_GSTACK__UP3 3805 -#define IDC_GSTACK__DOWN3 3806 -#define IDC_GSTACK__SIGNALCOUNT3 3807 -#define IDC_GSTACK__SET3 3808 -#define IDC_GSTACK__RESET3 3809 -#define IDC_GSTACK__UNIT4 3810 -#define IDC_GSTACK__UP4 3811 -#define IDC_GSTACK__DOWN4 3812 -#define IDC_GSTACK__SIGNALCOUNT4 3813 -#define IDC_GSTACK__SET4 3814 -#define IDC_GSTACK__RESET4 3815 -#define IDC_GSTACK__UNIT5 3816 -#define IDC_GSTACK__UP5 3817 -#define IDC_GSTACK__DOWN5 3818 -#define IDC_GSTACK__SIGNALCOUNT5 3819 -#define IDC_GSTACK__SET5 3820 -#define IDC_GSTACK__RESET5 3821 -#define IDC_GSTACK__UNIT6 3822 -#define IDC_GSTACK__UP6 3823 -#define IDC_GSTACK__DOWN6 3824 -#define IDC_GSTACK__SIGNALCOUNT6 3825 -#define IDC_GSTACK__SET6 3826 -#define IDC_GSTACK__RESET6 3827 -#define IDC_GSTACK__UNIT7 3828 -#define IDC_GSTACK__UP7 3829 -#define IDC_GSTACK__DOWN7 3830 -#define IDC_GSTACK__SIGNALCOUNT7 3831 -#define IDC_GSTACK__SET7 3832 -#define IDC_GSTACK__RESET7 3833 -#define IDC_GSTACK__UNIT8 3834 -#define IDC_GSTACK__UP8 3835 -#define IDC_GSTACK__DOWN8 3836 -#define IDC_GSTACK__SIGNALCOUNT8 3837 -#define IDC_GSTACK__SET8 3838 -#define IDC_GSTACK__RESET8 3839 -#define IDC_GSTACK__UNIT9 3840 -#define IDC_GSTACK__UP9 3841 -#define IDC_GSTACK__DOWN9 3842 -#define IDC_GSTACK__SIGNALCOUNT9 3843 -#define IDC_GSTACK__SET9 3844 -#define IDC_GSTACK__RESET9 3845 -#define IDC_GSTACK__UNIT10 3846 -#define IDC_GSTACK__UP10 3847 -#define IDC_GSTACK__DOWN10 3848 -#define IDC_GSTACK__SIGNALCOUNT10 3849 -#define IDC_GSTACK__SET10 3850 -#define IDC_GSTACK__RESET10 3851 -#define IDC_GSTACK__UNIT11 3852 -#define IDC_GSTACK__UP11 3853 -#define IDC_GSTACK__DOWN11 3854 -#define IDC_GSTACK__SIGNALCOUNT11 3855 -#define IDC_GSTACK__SET11 3856 -#define IDC_GSTACK__RESET11 3857 -#define IDC_GSTACK__UNIT12 3858 -#define IDC_GSTACK__UP12 3859 -#define IDC_GSTACK__DOWN12 3860 -#define IDC_GSTACK__SIGNALCOUNT12 3861 -#define IDC_GSTACK__SET12 3862 -#define IDC_GSTACK__RESET12 3863 -#define IDC_GSTACK__UNIT13 3864 -#define IDC_GSTACK__UP13 3865 -#define IDC_GSTACK__DOWN13 3866 -#define IDC_GSTACK__SIGNALCOUNT13 3867 -#define IDC_GSTACK__SET13 3868 -#define IDC_GSTACK__RESET13 3869 -#define IDC_GSTACK__UNIT14 3870 -#define IDC_GSTACK__UP14 3871 -#define IDC_GSTACK__DOWN14 3872 -#define IDC_GSTACK__SIGNALCOUNT14 3873 -#define IDC_GSTACK__SET14 3874 -#define IDC_GSTACK__RESET14 3875 -#define IDC_GSTACK__UNIT15 3876 -#define IDC_GSTACK__UP15 3877 -#define IDC_GSTACK__DOWN15 3878 -#define IDC_GSTACK__SIGNALCOUNT15 3879 -#define IDC_GSTACK__SET15 3880 -#define IDC_GSTACK__RESET15 3881 -#define IDC_GSTACK__UNIT16 3882 -#define IDC_GSTACK__UP16 3883 -#define IDC_GSTACK__DOWN16 3884 -#define IDC_GSTACK__SIGNALCOUNT16 3885 -#define IDC_GSTACK__SET16 3886 -#define IDC_GSTACK__RESET16 3887 -#define IDC_GSTACK__UNIT17 3888 -#define IDC_GSTACK__UP17 3889 -#define IDC_GSTACK__DOWN17 3890 -#define IDC_GSTACK__SIGNALCOUNT17 3891 -#define IDC_GSTACK__SET17 3892 -#define IDC_GSTACK__RESET17 3893 -#define IDC_GSTACK__UNIT18 3894 -#define IDC_GSTACK__UP18 3895 -#define IDC_GSTACK__DOWN18 3896 -#define IDC_GSTACK__SIGNALCOUNT18 3897 -#define IDC_GSTACK__SET18 3898 -#define IDC_GSTACK__RESET18 3899 -#define IDC_GSTACK__UNIT19 3900 -#define IDC_GSTACK__UP19 3901 -#define IDC_GSTACK__DOWN19 3902 -#define IDC_GSTACK__SIGNALCOUNT19 3903 -#define IDC_GSTACK__SET19 3904 -#define IDC_GSTACK__RESET19 3905 -#define IDC_GSTACK__UNIT20 3906 -#define IDC_GSTACK__UP20 3907 -#define IDC_GSTACK__DOWN20 3908 -#define IDC_GSTACK__SIGNALCOUNT20 3909 -#define IDC_GSTACK__SET20 3910 -#define IDC_GSTACK__RESET20 3911 -#define IDC_GSTACK__UNIT21 3912 -#define IDC_GSTACK__UP21 3913 -#define IDC_GSTACK__DOWN21 3914 -#define IDC_GSTACK__SIGNALCOUNT21 3915 -#define IDC_GSTACK__SET21 3916 -#define IDC_GSTACK__RESET21 3917 -#define IDC_GSTACK__UNIT22 3918 -#define IDC_GSTACK__UP22 3919 -#define IDC_GSTACK__DOWN22 3920 -#define IDC_GSTACK__SIGNALCOUNT22 3921 -#define IDC_GSTACK__SET22 3922 -#define IDC_GSTACK__RESET22 3923 -#define IDC_GSTACK__UNIT23 3924 -#define IDC_GSTACK__UP23 3925 -#define IDC_GSTACK__DOWN23 3926 -#define IDC_GSTACK__SIGNALCOUNT23 3927 -#define IDC_GSTACK__SET23 3928 -#define IDC_GSTACK__RESET23 3929 -#define IDC_GSTACK__UNIT24 3930 -#define IDC_GSTACK__UP24 3931 -#define IDC_GSTACK__DOWN24 3932 -#define IDC_GSTACK__SIGNALCOUNT24 3933 -#define IDC_GSTACK__SET24 3934 -#define IDC_GSTACK__RESET24 3935 -#define IDC_GSTACK__UNIT25 3936 -#define IDC_GSTACK__UP25 3937 -#define IDC_GSTACK__DOWN25 3938 -#define IDC_GSTACK__SIGNALCOUNT25 3939 -#define IDC_GSTACK__SET25 3940 -#define IDC_GSTACK__RESET25 3941 -#define IDC_GSTACK__UNIT26 3942 -#define IDC_GSTACK__UP26 3943 -#define IDC_GSTACK__DOWN26 3944 -#define IDC_GSTACK__SIGNALCOUNT26 3945 -#define IDC_GSTACK__SET26 3946 -#define IDC_GSTACK__RESET26 3947 -#define IDC_GSTACK__UNIT27 3948 -#define IDC_GSTACK__UP27 3949 -#define IDC_GSTACK__DOWN27 3950 -#define IDC_GSTACK__SIGNALCOUNT27 3951 -#define IDC_GSTACK__SET27 3952 -#define IDC_GSTACK__RESET27 3953 -#define IDC_GSTACK__UNIT28 3954 -#define IDC_GSTACK__UP28 3955 -#define IDC_GSTACK__DOWN28 3956 -#define IDC_GSTACK__SIGNALCOUNT28 3957 -#define IDC_GSTACK__SET28 3958 -#define IDC_GSTACK__RESET28 3959 -#define IDC_GSTACK__UNIT29 3960 -#define IDC_GSTACK__UP29 3961 -#define IDC_GSTACK__DOWN29 3962 -#define IDC_GSTACK__SIGNALCOUNT29 3963 -#define IDC_GSTACK__SET29 3964 -#define IDC_GSTACK__RESET29 3965 -#define IDC_GSTACK__UNIT30 3966 -#define IDC_GSTACK__UP30 3967 -#define IDC_GSTACK__DOWN30 3968 -#define IDC_GSTACK__SIGNALCOUNT30 3969 -#define IDC_GSTACK__SET30 3970 -#define IDC_GSTACK__RESET30 3971 -#define IDC_GSTACK__UNIT31 3972 -#define IDC_GSTACK__UP31 3973 -#define IDC_GSTACK__DOWN31 3974 -#define IDC_GSTACK__SIGNALCOUNT31 3975 -#define IDC_GSTACK__SET31 3976 -#define IDC_GSTACK__RESET31 3977 -#define IDC_GSTACK__UNIT32 3978 -#define IDC_GSTACK__UP32 3979 -#define IDC_GSTACK__DOWN32 3980 -#define IDC_GSTACK__SIGNALCOUNT32 3981 -#define IDC_GSTACK__SET32 3982 -#define IDC_GSTACK__RESET32 3983 -#define IDC_DST_STEREO 5004 -#define IDC_GLITCH_ACTIVE 5050 -#define IDC_GLITCH_ACTIVE_VAL 5051 -#define IDC_GLITCH_DRY 5052 -#define IDC_GLITCH_DRY_VAL 5053 -#define IDC_GLITCH_DSIZE 5054 -#define IDC_GLITCH_DSIZE_VAL 5055 -#define IDC_GLITCH_DPITCH 5056 -#define IDC_GLITCH_DPITCH_VAL 5057 -#define IDC_GLITCH_DTIME 5058 -#define IDC_GLITCH_DTIME_VAL 5059 - - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 125 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 5015 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Go4kVSTi.rc +// +#define IDD_NONE 100 +#define IDD_ENV 101 +#define IDD_VCO 102 +#define IDD_VCF 103 +#define IDD_DST 104 +#define IDD_DLL 105 +#define IDD_FOP 106 +#define IDD_FST 107 +#define IDD_PAN 108 +#define IDD_OUT 109 +#define IDD_ACC 110 +#define IDD_FLD 111 +#define IDD_GLITCH 112 +#define IDD_GO4KVSTIDIALOG 115 +#define IDD_INSTRUMENT_STACK 120 +#define IDD_GLOBAL_STACK 121 +#define IDD_SET_DIALOG 122 +#define IDD_SCROLLWINDOW 123 +#define IDR_COMP_RES 130 +#define IDR_ASM_RES 131 +#define IDC_SET_UNIT 1000 +#define IDC_MAINTAB 1001 +#define IDC_LOAD_PATCH 1002 +#define IDC_SAVE_PATCH 1003 +#define IDC_RESET_PATCH 1004 +#define IDC_LOAD_INSTRUMENT 1005 +#define IDC_SAVE_INSTRUMENT 1006 +#define IDC_RESET_INSTRUMENT 1007 +#define IDC_INSTRUMENT_NAME 1008 +#define IDC_INSTRUMENT 1009 +#define IDC_SOLO 1010 +#define IDC_RECORD_BUTTON 1011 +#define IDC_STOP_BUTTON 1012 +#define IDC_PATTERN_SIZE 1013 +#define IDC_PANIC 1014 +#define IDC_MODULE_SETTINGS 1015 +#define IDC_POLYPHONY 1016 +#define IDC_ENVLEVELS 1017 +#define IDC_NOTEVALUES 1018 +#define IDC_OBJFORMAT 1019 +#define IDC_VOICECOUNT1 1020 +#define IDC_VOICECOUNT2 1021 +#define IDC_VOICECOUNT3 1022 +#define IDC_VOICECOUNT4 1023 +#define IDC_VOICECOUNT5 1024 +#define IDC_VOICECOUNT6 1025 +#define IDC_VOICECOUNT7 1026 +#define IDC_VOICECOUNT8 1027 +#define IDC_VOICECOUNT9 1028 +#define IDC_VOICECOUNT10 1029 +#define IDC_VOICECOUNT11 1030 +#define IDC_VOICECOUNT12 1031 +#define IDC_VOICECOUNT13 1032 +#define IDC_VOICECOUNT14 1033 +#define IDC_VOICECOUNT15 1034 +#define IDC_VOICECOUNT16 1035 +#define IDC_UNDENORMALIZE 1036 +#define IDC_CLIPOUTPUT 1037 +#define IDC_16BIT 1038 +#define IDC_ALWAYSONTOP 1039 +#define IDC_ISTACK_VALID 1040 +#define IDC_GSTACK_VALID 1041 +#define IDC_PATTERN_QUANT 1042 +#define IDC_INSTRUMENTLINK 1043 +#define IDC_RECORDBUSYSIGNAL 1044 +#define IDC_UNIT_RESET 1050 +#define IDC_UNIT_COPY 1051 +#define IDC_UNIT_PASTE 1052 +#define IDC_UNIT_LOAD 1053 +#define IDC_UNIT_SAVE 1054 +#define IDC_ENV_ATTACK 1100 +#define IDC_ENV_ATTACK_VAL 1101 +#define IDC_ENV_ATTACK_QUANT 1102 +#define IDC_ENV_DECAY 1103 +#define IDC_ENV_DECAY_VAL 1104 +#define IDC_ENV_DECAY_QUANT 1105 +#define IDC_ENV_SUSTAIN 1106 +#define IDC_ENV_SUSTAIN_VAL 1107 +#define IDC_ENV_SUSTAIN_QUANT 1108 +#define IDC_ENV_RELEASE_VAL 1110 +#define IDC_ENV_RELEASE_QUANT 1111 +#define IDC_ENV_GAIN 1112 +#define IDC_ENV_GAIN_VAL 1113 +#define IDC_ENV_GAIN_QUANT 1114 +#define IDC_ENV_RELEASE 1119 +#define IDC_VCO_SINE 1150 +#define IDC_VCO_TRISAW 1151 +#define IDC_VCO_PULSE 1152 +#define IDC_VCO_NOISE 1153 +#define IDC_VCO_GATE 1154 +#define IDC_VCO_STEREO 1155 +#define IDC_VCO_TRANSPOSE 1160 +#define IDC_VCO_TRANSPOSE_VAL 1161 +#define IDC_VCO_TRANSPOSE_QUANT 1162 +#define IDC_VCO_DETUNE 1163 +#define IDC_VCO_DETUNE_VAL 1164 +#define IDC_VCO_DETUNE_QUANT 1165 +#define IDC_VCO_PHASE 1166 +#define IDC_VCO_PHASE_VAL 1167 +#define IDC_VCO_PHASE_QUANT 1168 +#define IDC_VCO_COLOR 1169 +#define IDC_VCO_COLOR_VAL 1170 +#define IDC_VCO_COLOR_QUANT 1171 +#define IDC_VCO_SHAPE 1172 +#define IDC_VCO_SHAPE_VAL 1173 +#define IDC_VCO_GAIN_VAL 1174 +#define IDC_VCO_GAIN_QUANT 1175 +#define IDC_VCO_LFO 1176 +#define IDC_VCO_SHAPE_QUANT 1177 +#define IDC_VCO_GAIN 1178 +#define IDC_VCO_GATE1 1180 +#define IDC_VCO_GATE2 1181 +#define IDC_VCO_GATE3 1182 +#define IDC_VCO_GATE4 1183 +#define IDC_VCO_GATE5 1184 +#define IDC_VCO_GATE6 1185 +#define IDC_VCO_GATE7 1186 +#define IDC_VCO_GATE8 1187 +#define IDC_VCO_GATE9 1188 +#define IDC_VCO_GATE10 1189 +#define IDC_VCO_GATE11 1190 +#define IDC_VCO_GATE12 1191 +#define IDC_VCO_GATE13 1192 +#define IDC_VCO_GATE14 1193 +#define IDC_VCO_GATE15 1194 +#define IDC_VCO_GATE16 1195 +#define IDC_VCF_OFF 1200 +#define IDC_VCF_LOW 1201 +#define IDC_VCF_HIGH 1202 +#define IDC_VCF_BAND 1203 +#define IDC_VCF_NOTCH 1204 +#define IDC_VCF_PEAK 1205 +#define IDC_VCF_ALL 1206 +#define IDC_VCF_FREQUENCY 1207 +#define IDC_VCF_FREQUENCY_VAL 1208 +#define IDC_VCF_FREQUENCY_QUANT 1209 +#define IDC_VCF_RESONANCE 1210 +#define IDC_VCF_RESONANCE_VAL 1211 +#define IDC_VCF_RESONANCE_QUANT 1212 +#define IDC_VCF_STEREO 1213 +#define IDC_DST_DRIVE 1250 +#define IDC_DST_DRIVE_VAL 1251 +#define IDC_DST_DRIVE_QUANT 1252 +#define IDC_DST_SNH 1253 +#define IDC_DST_SNH_VAL 1254 +#define IDC_DST_SNH_QUANT 1255 +#define IDC_DLL_OFF 1300 +#define IDC_DLL_DELAY 1301 +#define IDC_DLL_REVERB 1302 +#define IDC_DLL_PREGAIN 1303 +#define IDC_DLL_PREGAIN_VAL 1304 +#define IDC_DLL_PREGAIN_QUANT 1305 +#define IDC_DLL_FEEDBACK 1306 +#define IDC_DLL_FEEDBACK_VAL 1307 +#define IDC_DLL_FEEDBACK_QUANT 1308 +#define IDC_DLL_DRY 1309 +#define IDC_DLL_DRY_VAL 1310 +#define IDC_DLL_DRY_QUANT 1311 +#define IDC_DLL_DAMP 1312 +#define IDC_DLL_DAMP_VAL 1313 +#define IDC_DLL_DAMP_QUANT 1314 +#define IDC_DLL_DTIME 1315 +#define IDC_DLL_DTIME_VAL 1316 +#define IDC_DLL_NOSYNC 1317 +#define IDC_DLL_BPMSYNC 1318 +#define IDC_DLL_NOTESYNC 1319 +#define IDC_DLL_LEFTREVERB 1320 +#define IDC_DLL_FREQUENCY 1321 +#define IDC_DLL_FREQUENCY_VAL 1322 +#define IDC_DLL_DEPTH 1323 +#define IDC_DLL_DEPTH_VAL 1324 +#define IDC_FOP_POP 1351 +#define IDC_FOP_ADDP 1352 +#define IDC_FOP_MULP 1353 +#define IDC_FOP_PUSH 1354 +#define IDC_FOP_XCH 1355 +#define IDC_FOP_ADD 1356 +#define IDC_FOP_MUL 1357 +#define IDC_FOP_ADDP2 1358 +#define IDC_FOP_LOADNOTE 1359 +#define IDC_FOP_MULP2 1360 +#define IDC_FST_AMOUNT 1400 +#define IDC_FST_AMOUNT_VAL 1401 +#define IDC_FST_AMOUNT_QUANT 1402 +#define IDC_FST_DESTINATION_INSTRUMENT 1403 +#define IDC_FST_DESTINATION_UNIT 1404 +#define IDC_FST_DESTINATION_SLOT 1405 +#define IDC_FST_SET 1410 +#define IDC_FST_ADD 1411 +#define IDC_FST_MUL 1412 +#define IDC_FST_POP 1413 +#define IDC_PAN_PANNING 1450 +#define IDC_PAN_PANNING_VAL 1451 +#define IDC_PAN_PANNING_QUANT 1452 +#define IDC_OUT_GAIN 1500 +#define IDC_OUT_GAIN_VAL 1501 +#define IDC_OUT_GAIN_QUANT 1502 +#define IDC_OUT_AUXSEND 1503 +#define IDC_OUT_AUXSEND_QUANT 1504 +#define IDC_OUT_AUXSEND_VAL 1505 +#define IDC_ACC_OUT 1550 +#define IDC_ACC_AUX 1551 +#define IDC_FLD_VALUE 1552 +#define IDC_FLD_VALUE_VAL 1553 +#define IDC_FLD_VALUE_QUANT 1554 +#define IDC_ISTACK_UNIT1 1600 +#define IDC_ISTACK_UP1 1601 +#define IDC_ISTACK_DOWN1 1602 +#define IDC_ISTACK_SIGNALCOUNT1 1603 +#define IDC_ISTACK_SET1 1604 +#define IDC_ISTACK_RESET1 1605 +#define IDC_ISTACK_UNIT2 1606 +#define IDC_ISTACK_UP2 1607 +#define IDC_ISTACK_DOWN2 1608 +#define IDC_ISTACK_SIGNALCOUNT2 1609 +#define IDC_ISTACK_SET2 1610 +#define IDC_ISTACK_RESET2 1611 +#define IDC_ISTACK_UNIT3 1612 +#define IDC_ISTACK_UP3 1613 +#define IDC_ISTACK_DOWN3 1614 +#define IDC_ISTACK_SIGNALCOUNT3 1615 +#define IDC_ISTACK_SET3 1616 +#define IDC_ISTACK_RESET3 1617 +#define IDC_ISTACK_UNIT4 1618 +#define IDC_ISTACK_UP4 1619 +#define IDC_ISTACK_DOWN4 1620 +#define IDC_ISTACK_SIGNALCOUNT4 1621 +#define IDC_ISTACK_SET4 1622 +#define IDC_ISTACK_RESET4 1623 +#define IDC_ISTACK_UNIT5 1624 +#define IDC_ISTACK_UP5 1625 +#define IDC_ISTACK_DOWN5 1626 +#define IDC_ISTACK_SIGNALCOUNT5 1627 +#define IDC_ISTACK_SET5 1628 +#define IDC_ISTACK_RESET5 1629 +#define IDC_ISTACK_UNIT6 1630 +#define IDC_ISTACK_UP6 1631 +#define IDC_ISTACK_DOWN6 1632 +#define IDC_ISTACK_SIGNALCOUNT6 1633 +#define IDC_ISTACK_SET6 1634 +#define IDC_ISTACK_RESET6 1635 +#define IDC_ISTACK_UNIT7 1636 +#define IDC_ISTACK_UP7 1637 +#define IDC_ISTACK_DOWN7 1638 +#define IDC_ISTACK_SIGNALCOUNT7 1639 +#define IDC_ISTACK_SET7 1640 +#define IDC_ISTACK_RESET7 1641 +#define IDC_ISTACK_UNIT8 1642 +#define IDC_ISTACK_UP8 1643 +#define IDC_ISTACK_DOWN8 1644 +#define IDC_ISTACK_SIGNALCOUNT8 1645 +#define IDC_ISTACK_SET8 1646 +#define IDC_ISTACK_RESET8 1647 +#define IDC_ISTACK_UNIT9 1648 +#define IDC_ISTACK_UP9 1649 +#define IDC_ISTACK_DOWN9 1650 +#define IDC_ISTACK_SIGNALCOUNT9 1651 +#define IDC_ISTACK_SET9 1652 +#define IDC_ISTACK_RESET9 1653 +#define IDC_ISTACK_UNIT10 1654 +#define IDC_ISTACK_UP10 1655 +#define IDC_ISTACK_DOWN10 1656 +#define IDC_ISTACK_SIGNALCOUNT10 1657 +#define IDC_ISTACK_SET10 1658 +#define IDC_ISTACK_RESET10 1659 +#define IDC_ISTACK_UNIT11 1660 +#define IDC_ISTACK_UP11 1661 +#define IDC_ISTACK_DOWN11 1662 +#define IDC_ISTACK_SIGNALCOUNT11 1663 +#define IDC_ISTACK_SET11 1664 +#define IDC_ISTACK_RESET11 1665 +#define IDC_ISTACK_UNIT12 1666 +#define IDC_ISTACK_UP12 1667 +#define IDC_ISTACK_DOWN12 1668 +#define IDC_ISTACK_SIGNALCOUNT12 1669 +#define IDC_ISTACK_SET12 1670 +#define IDC_ISTACK_RESET12 1671 +#define IDC_ISTACK_UNIT13 1672 +#define IDC_ISTACK_UP13 1673 +#define IDC_ISTACK_DOWN13 1674 +#define IDC_ISTACK_SIGNALCOUNT13 1675 +#define IDC_ISTACK_SET13 1676 +#define IDC_ISTACK_RESET13 1677 +#define IDC_ISTACK_UNIT14 1678 +#define IDC_ISTACK_UP14 1679 +#define IDC_ISTACK_DOWN14 1680 +#define IDC_ISTACK_SIGNALCOUNT14 1681 +#define IDC_ISTACK_SET14 1682 +#define IDC_ISTACK_RESET14 1683 +#define IDC_ISTACK_UNIT15 1684 +#define IDC_ISTACK_UP15 1685 +#define IDC_ISTACK_DOWN15 1686 +#define IDC_ISTACK_SIGNALCOUNT15 1687 +#define IDC_ISTACK_SET15 1688 +#define IDC_ISTACK_RESET15 1689 +#define IDC_ISTACK_UNIT16 1690 +#define IDC_ISTACK_UP16 1691 +#define IDC_ISTACK_DOWN16 1692 +#define IDC_ISTACK_SIGNALCOUNT16 1693 +#define IDC_ISTACK_SET16 1694 +#define IDC_ISTACK_RESET16 1695 +#define IDC_ISTACK_UNIT17 1696 +#define IDC_ISTACK_UP17 1697 +#define IDC_ISTACK_DOWN17 1698 +#define IDC_ISTACK_SIGNALCOUNT17 1699 +#define IDC_ISTACK_SET17 1700 +#define IDC_ISTACK_RESET17 1701 +#define IDC_ISTACK_UNIT18 1702 +#define IDC_ISTACK_UP18 1703 +#define IDC_ISTACK_DOWN18 1704 +#define IDC_ISTACK_SIGNALCOUNT18 1705 +#define IDC_ISTACK_SET18 1706 +#define IDC_ISTACK_RESET18 1707 +#define IDC_ISTACK_UNIT19 1708 +#define IDC_ISTACK_UP19 1709 +#define IDC_ISTACK_DOWN19 1710 +#define IDC_ISTACK_SIGNALCOUNT19 1711 +#define IDC_ISTACK_SET19 1712 +#define IDC_ISTACK_RESET19 1713 +#define IDC_ISTACK_UNIT20 1714 +#define IDC_ISTACK_UP20 1715 +#define IDC_ISTACK_DOWN20 1716 +#define IDC_ISTACK_SIGNALCOUNT20 1717 +#define IDC_ISTACK_SET20 1718 +#define IDC_ISTACK_RESET20 1719 +#define IDC_ISTACK_UNIT21 1720 +#define IDC_ISTACK_UP21 1721 +#define IDC_ISTACK_DOWN21 1722 +#define IDC_ISTACK_SIGNALCOUNT21 1723 +#define IDC_ISTACK_SET21 1724 +#define IDC_ISTACK_RESET21 1725 +#define IDC_ISTACK_UNIT22 1726 +#define IDC_ISTACK_UP22 1727 +#define IDC_ISTACK_DOWN22 1728 +#define IDC_ISTACK_SIGNALCOUNT22 1729 +#define IDC_ISTACK_SET22 1730 +#define IDC_ISTACK_RESET22 1731 +#define IDC_ISTACK_UNIT23 1732 +#define IDC_ISTACK_UP23 1733 +#define IDC_ISTACK_DOWN23 1734 +#define IDC_ISTACK_SIGNALCOUNT23 1735 +#define IDC_ISTACK_SET23 1736 +#define IDC_ISTACK_RESET23 1737 +#define IDC_ISTACK_UNIT24 1738 +#define IDC_ISTACK_UP24 1739 +#define IDC_ISTACK_DOWN24 1740 +#define IDC_ISTACK_SIGNALCOUNT24 1741 +#define IDC_ISTACK_SET24 1742 +#define IDC_ISTACK_RESET24 1743 +#define IDC_ISTACK_UNIT25 1744 +#define IDC_ISTACK_UP25 1745 +#define IDC_ISTACK_DOWN25 1746 +#define IDC_ISTACK_SIGNALCOUNT25 1747 +#define IDC_ISTACK_SET25 1748 +#define IDC_ISTACK_RESET25 1749 +#define IDC_ISTACK_UNIT26 1750 +#define IDC_ISTACK_UP26 1751 +#define IDC_ISTACK_DOWN26 1752 +#define IDC_ISTACK_SIGNALCOUNT26 1753 +#define IDC_ISTACK_SET26 1754 +#define IDC_ISTACK_RESET26 1755 +#define IDC_ISTACK_UNIT27 1756 +#define IDC_ISTACK_UP27 1757 +#define IDC_ISTACK_DOWN27 1758 +#define IDC_ISTACK_SIGNALCOUNT27 1759 +#define IDC_ISTACK_SET27 1760 +#define IDC_ISTACK_RESET27 1761 +#define IDC_ISTACK_UNIT28 1762 +#define IDC_ISTACK_UP28 1763 +#define IDC_ISTACK_DOWN28 1764 +#define IDC_ISTACK_SIGNALCOUNT28 1765 +#define IDC_ISTACK_SET28 1766 +#define IDC_ISTACK_RESET28 1767 +#define IDC_ISTACK_UNIT29 1768 +#define IDC_ISTACK_UP29 1769 +#define IDC_ISTACK_DOWN29 1770 +#define IDC_ISTACK_SIGNALCOUNT29 1771 +#define IDC_ISTACK_SET29 1772 +#define IDC_ISTACK_RESET29 1773 +#define IDC_ISTACK_UNIT30 1774 +#define IDC_ISTACK_UP30 1775 +#define IDC_ISTACK_DOWN30 1776 +#define IDC_ISTACK_SIGNALCOUNT30 1777 +#define IDC_ISTACK_SET30 1778 +#define IDC_ISTACK_RESET30 1779 +#define IDC_ISTACK_UNIT31 1780 +#define IDC_ISTACK_UP31 1781 +#define IDC_ISTACK_DOWN31 1782 +#define IDC_ISTACK_SIGNALCOUNT31 1783 +#define IDC_ISTACK_SET31 1784 +#define IDC_ISTACK_RESET31 1785 +#define IDC_ISTACK_UNIT32 1786 +#define IDC_ISTACK_UP32 1787 +#define IDC_ISTACK_DOWN32 1788 +#define IDC_ISTACK_SIGNALCOUNT32 1789 +#define IDC_ISTACK_SET32 1790 +#define IDC_ISTACK_RESET32 1791 +#define IDC_ISTACK__UNIT1 1792 +#define IDC_ISTACK__UP1 1793 +#define IDC_ISTACK__DOWN1 1794 +#define IDC_ISTACK__SIGNALCOUNT1 1795 +#define IDC_ISTACK__SET1 1796 +#define IDC_ISTACK__RESET1 1797 +#define IDC_ISTACK__UNIT2 1798 +#define IDC_ISTACK__UP2 1799 +#define IDC_ISTACK__DOWN2 1800 +#define IDC_ISTACK__SIGNALCOUNT2 1801 +#define IDC_ISTACK__SET2 1802 +#define IDC_ISTACK__RESET2 1803 +#define IDC_ISTACK__UNIT3 1804 +#define IDC_ISTACK__UP3 1805 +#define IDC_ISTACK__DOWN3 1806 +#define IDC_ISTACK__SIGNALCOUNT3 1807 +#define IDC_ISTACK__SET3 1808 +#define IDC_ISTACK__RESET3 1809 +#define IDC_ISTACK__UNIT4 1810 +#define IDC_ISTACK__UP4 1811 +#define IDC_ISTACK__DOWN4 1812 +#define IDC_ISTACK__SIGNALCOUNT4 1813 +#define IDC_ISTACK__SET4 1814 +#define IDC_ISTACK__RESET4 1815 +#define IDC_ISTACK__UNIT5 1816 +#define IDC_ISTACK__UP5 1817 +#define IDC_ISTACK__DOWN5 1818 +#define IDC_ISTACK__SIGNALCOUNT5 1819 +#define IDC_ISTACK__SET5 1820 +#define IDC_ISTACK__RESET5 1821 +#define IDC_ISTACK__UNIT6 1822 +#define IDC_ISTACK__UP6 1823 +#define IDC_ISTACK__DOWN6 1824 +#define IDC_ISTACK__SIGNALCOUNT6 1825 +#define IDC_ISTACK__SET6 1826 +#define IDC_ISTACK__RESET6 1827 +#define IDC_ISTACK__UNIT7 1828 +#define IDC_ISTACK__UP7 1829 +#define IDC_ISTACK__DOWN7 1830 +#define IDC_ISTACK__SIGNALCOUNT7 1831 +#define IDC_ISTACK__SET7 1832 +#define IDC_ISTACK__RESET7 1833 +#define IDC_ISTACK__UNIT8 1834 +#define IDC_ISTACK__UP8 1835 +#define IDC_ISTACK__DOWN8 1836 +#define IDC_ISTACK__SIGNALCOUNT8 1837 +#define IDC_ISTACK__SET8 1838 +#define IDC_ISTACK__RESET8 1839 +#define IDC_ISTACK__UNIT9 1840 +#define IDC_ISTACK__UP9 1841 +#define IDC_ISTACK__DOWN9 1842 +#define IDC_ISTACK__SIGNALCOUNT9 1843 +#define IDC_ISTACK__SET9 1844 +#define IDC_ISTACK__RESET9 1845 +#define IDC_ISTACK__UNIT10 1846 +#define IDC_ISTACK__UP10 1847 +#define IDC_ISTACK__DOWN10 1848 +#define IDC_ISTACK__SIGNALCOUNT10 1849 +#define IDC_ISTACK__SET10 1850 +#define IDC_ISTACK__RESET10 1851 +#define IDC_ISTACK__UNIT11 1852 +#define IDC_ISTACK__UP11 1853 +#define IDC_ISTACK__DOWN11 1854 +#define IDC_ISTACK__SIGNALCOUNT11 1855 +#define IDC_ISTACK__SET11 1856 +#define IDC_ISTACK__RESET11 1857 +#define IDC_ISTACK__UNIT12 1858 +#define IDC_ISTACK__UP12 1859 +#define IDC_ISTACK__DOWN12 1860 +#define IDC_ISTACK__SIGNALCOUNT12 1861 +#define IDC_ISTACK__SET12 1862 +#define IDC_ISTACK__RESET12 1863 +#define IDC_ISTACK__UNIT13 1864 +#define IDC_ISTACK__UP13 1865 +#define IDC_ISTACK__DOWN13 1866 +#define IDC_ISTACK__SIGNALCOUNT13 1867 +#define IDC_ISTACK__SET13 1868 +#define IDC_ISTACK__RESET13 1869 +#define IDC_ISTACK__UNIT14 1870 +#define IDC_ISTACK__UP14 1871 +#define IDC_ISTACK__DOWN14 1872 +#define IDC_ISTACK__SIGNALCOUNT14 1873 +#define IDC_ISTACK__SET14 1874 +#define IDC_ISTACK__RESET14 1875 +#define IDC_ISTACK__UNIT15 1876 +#define IDC_ISTACK__UP15 1877 +#define IDC_ISTACK__DOWN15 1878 +#define IDC_ISTACK__SIGNALCOUNT15 1879 +#define IDC_ISTACK__SET15 1880 +#define IDC_ISTACK__RESET15 1881 +#define IDC_ISTACK__UNIT16 1882 +#define IDC_ISTACK__UP16 1883 +#define IDC_ISTACK__DOWN16 1884 +#define IDC_ISTACK__SIGNALCOUNT16 1885 +#define IDC_ISTACK__SET16 1886 +#define IDC_ISTACK__RESET16 1887 +#define IDC_ISTACK__UNIT17 1888 +#define IDC_ISTACK__UP17 1889 +#define IDC_ISTACK__DOWN17 1890 +#define IDC_ISTACK__SIGNALCOUNT17 1891 +#define IDC_ISTACK__SET17 1892 +#define IDC_ISTACK__RESET17 1893 +#define IDC_ISTACK__UNIT18 1894 +#define IDC_ISTACK__UP18 1895 +#define IDC_ISTACK__DOWN18 1896 +#define IDC_ISTACK__SIGNALCOUNT18 1897 +#define IDC_ISTACK__SET18 1898 +#define IDC_ISTACK__RESET18 1899 +#define IDC_ISTACK__UNIT19 1900 +#define IDC_ISTACK__UP19 1901 +#define IDC_ISTACK__DOWN19 1902 +#define IDC_ISTACK__SIGNALCOUNT19 1903 +#define IDC_ISTACK__SET19 1904 +#define IDC_ISTACK__RESET19 1905 +#define IDC_ISTACK__UNIT20 1906 +#define IDC_ISTACK__UP20 1907 +#define IDC_ISTACK__DOWN20 1908 +#define IDC_ISTACK__SIGNALCOUNT20 1909 +#define IDC_ISTACK__SET20 1910 +#define IDC_ISTACK__RESET20 1911 +#define IDC_ISTACK__UNIT21 1912 +#define IDC_ISTACK__UP21 1913 +#define IDC_ISTACK__DOWN21 1914 +#define IDC_ISTACK__SIGNALCOUNT21 1915 +#define IDC_ISTACK__SET21 1916 +#define IDC_ISTACK__RESET21 1917 +#define IDC_ISTACK__UNIT22 1918 +#define IDC_ISTACK__UP22 1919 +#define IDC_ISTACK__DOWN22 1920 +#define IDC_ISTACK__SIGNALCOUNT22 1921 +#define IDC_ISTACK__SET22 1922 +#define IDC_ISTACK__RESET22 1923 +#define IDC_ISTACK__UNIT23 1924 +#define IDC_ISTACK__UP23 1925 +#define IDC_ISTACK__DOWN23 1926 +#define IDC_ISTACK__SIGNALCOUNT23 1927 +#define IDC_ISTACK__SET23 1928 +#define IDC_ISTACK__RESET23 1929 +#define IDC_ISTACK__UNIT24 1930 +#define IDC_ISTACK__UP24 1931 +#define IDC_ISTACK__DOWN24 1932 +#define IDC_ISTACK__SIGNALCOUNT24 1933 +#define IDC_ISTACK__SET24 1934 +#define IDC_ISTACK__RESET24 1935 +#define IDC_ISTACK__UNIT25 1936 +#define IDC_ISTACK__UP25 1937 +#define IDC_ISTACK__DOWN25 1938 +#define IDC_ISTACK__SIGNALCOUNT25 1939 +#define IDC_ISTACK__SET25 1940 +#define IDC_ISTACK__RESET25 1941 +#define IDC_ISTACK__UNIT26 1942 +#define IDC_ISTACK__UP26 1943 +#define IDC_ISTACK__DOWN26 1944 +#define IDC_ISTACK__SIGNALCOUNT26 1945 +#define IDC_ISTACK__SET26 1946 +#define IDC_ISTACK__RESET26 1947 +#define IDC_ISTACK__UNIT27 1948 +#define IDC_ISTACK__UP27 1949 +#define IDC_ISTACK__DOWN27 1950 +#define IDC_ISTACK__SIGNALCOUNT27 1951 +#define IDC_ISTACK__SET27 1952 +#define IDC_ISTACK__RESET27 1953 +#define IDC_ISTACK__UNIT28 1954 +#define IDC_ISTACK__UP28 1955 +#define IDC_ISTACK__DOWN28 1956 +#define IDC_ISTACK__SIGNALCOUNT28 1957 +#define IDC_ISTACK__SET28 1958 +#define IDC_ISTACK__RESET28 1959 +#define IDC_ISTACK__UNIT29 1960 +#define IDC_ISTACK__UP29 1961 +#define IDC_ISTACK__DOWN29 1962 +#define IDC_ISTACK__SIGNALCOUNT29 1963 +#define IDC_ISTACK__SET29 1964 +#define IDC_ISTACK__RESET29 1965 +#define IDC_ISTACK__UNIT30 1966 +#define IDC_ISTACK__UP30 1967 +#define IDC_ISTACK__DOWN30 1968 +#define IDC_ISTACK__SIGNALCOUNT30 1969 +#define IDC_ISTACK__SET30 1970 +#define IDC_ISTACK__RESET30 1971 +#define IDC_ISTACK__UNIT31 1972 +#define IDC_ISTACK__UP31 1973 +#define IDC_ISTACK__DOWN31 1974 +#define IDC_ISTACK__SIGNALCOUNT31 1975 +#define IDC_ISTACK__SET31 1976 +#define IDC_ISTACK__RESET31 1977 +#define IDC_ISTACK__UNIT32 1978 +#define IDC_ISTACK__UP32 1979 +#define IDC_ISTACK__DOWN32 1980 +#define IDC_ISTACK__SIGNALCOUNT32 1981 +#define IDC_ISTACK__SET32 1982 +#define IDC_ISTACK__RESET32 1983 +#define IDC_GSTACK_UNIT1 3600 +#define IDC_GSTACK_UP1 3601 +#define IDC_GSTACK_DOWN1 3602 +#define IDC_GSTACK_SIGNALCOUNT1 3603 +#define IDC_GSTACK_SET1 3604 +#define IDC_GSTACK_RESET1 3605 +#define IDC_GSTACK_UNIT2 3606 +#define IDC_GSTACK_UP2 3607 +#define IDC_GSTACK_DOWN2 3608 +#define IDC_GSTACK_SIGNALCOUNT2 3609 +#define IDC_GSTACK_SET2 3610 +#define IDC_GSTACK_RESET2 3611 +#define IDC_GSTACK_UNIT3 3612 +#define IDC_GSTACK_UP3 3613 +#define IDC_GSTACK_DOWN3 3614 +#define IDC_GSTACK_SIGNALCOUNT3 3615 +#define IDC_GSTACK_SET3 3616 +#define IDC_GSTACK_RESET3 3617 +#define IDC_GSTACK_UNIT4 3618 +#define IDC_GSTACK_UP4 3619 +#define IDC_GSTACK_DOWN4 3620 +#define IDC_GSTACK_SIGNALCOUNT4 3621 +#define IDC_GSTACK_SET4 3622 +#define IDC_GSTACK_RESET4 3623 +#define IDC_GSTACK_UNIT5 3624 +#define IDC_GSTACK_UP5 3625 +#define IDC_GSTACK_DOWN5 3626 +#define IDC_GSTACK_SIGNALCOUNT5 3627 +#define IDC_GSTACK_SET5 3628 +#define IDC_GSTACK_RESET5 3629 +#define IDC_GSTACK_UNIT6 3630 +#define IDC_GSTACK_UP6 3631 +#define IDC_GSTACK_DOWN6 3632 +#define IDC_GSTACK_SIGNALCOUNT6 3633 +#define IDC_GSTACK_SET6 3634 +#define IDC_GSTACK_RESET6 3635 +#define IDC_GSTACK_UNIT7 3636 +#define IDC_GSTACK_UP7 3637 +#define IDC_GSTACK_DOWN7 3638 +#define IDC_GSTACK_SIGNALCOUNT7 3639 +#define IDC_GSTACK_SET7 3640 +#define IDC_GSTACK_RESET7 3641 +#define IDC_GSTACK_UNIT8 3642 +#define IDC_GSTACK_UP8 3643 +#define IDC_GSTACK_DOWN8 3644 +#define IDC_GSTACK_SIGNALCOUNT8 3645 +#define IDC_GSTACK_SET8 3646 +#define IDC_GSTACK_RESET8 3647 +#define IDC_GSTACK_UNIT9 3648 +#define IDC_GSTACK_UP9 3649 +#define IDC_GSTACK_DOWN9 3650 +#define IDC_GSTACK_SIGNALCOUNT9 3651 +#define IDC_GSTACK_SET9 3652 +#define IDC_GSTACK_RESET9 3653 +#define IDC_GSTACK_UNIT10 3654 +#define IDC_GSTACK_UP10 3655 +#define IDC_GSTACK_DOWN10 3656 +#define IDC_GSTACK_SIGNALCOUNT10 3657 +#define IDC_GSTACK_SET10 3658 +#define IDC_GSTACK_RESET10 3659 +#define IDC_GSTACK_UNIT11 3660 +#define IDC_GSTACK_UP11 3661 +#define IDC_GSTACK_DOWN11 3662 +#define IDC_GSTACK_SIGNALCOUNT11 3663 +#define IDC_GSTACK_SET11 3664 +#define IDC_GSTACK_RESET11 3665 +#define IDC_GSTACK_UNIT12 3666 +#define IDC_GSTACK_UP12 3667 +#define IDC_GSTACK_DOWN12 3668 +#define IDC_GSTACK_SIGNALCOUNT12 3669 +#define IDC_GSTACK_SET12 3670 +#define IDC_GSTACK_RESET12 3671 +#define IDC_GSTACK_UNIT13 3672 +#define IDC_GSTACK_UP13 3673 +#define IDC_GSTACK_DOWN13 3674 +#define IDC_GSTACK_SIGNALCOUNT13 3675 +#define IDC_GSTACK_SET13 3676 +#define IDC_GSTACK_RESET13 3677 +#define IDC_GSTACK_UNIT14 3678 +#define IDC_GSTACK_UP14 3679 +#define IDC_GSTACK_DOWN14 3680 +#define IDC_GSTACK_SIGNALCOUNT14 3681 +#define IDC_GSTACK_SET14 3682 +#define IDC_GSTACK_RESET14 3683 +#define IDC_GSTACK_UNIT15 3684 +#define IDC_GSTACK_UP15 3685 +#define IDC_GSTACK_DOWN15 3686 +#define IDC_GSTACK_SIGNALCOUNT15 3687 +#define IDC_GSTACK_SET15 3688 +#define IDC_GSTACK_RESET15 3689 +#define IDC_GSTACK_UNIT16 3690 +#define IDC_GSTACK_UP16 3691 +#define IDC_GSTACK_DOWN16 3692 +#define IDC_GSTACK_SIGNALCOUNT16 3693 +#define IDC_GSTACK_SET16 3694 +#define IDC_GSTACK_RESET16 3695 +#define IDC_GSTACK_UNIT17 3696 +#define IDC_GSTACK_UP17 3697 +#define IDC_GSTACK_DOWN17 3698 +#define IDC_GSTACK_SIGNALCOUNT17 3699 +#define IDC_GSTACK_SET17 3700 +#define IDC_GSTACK_RESET17 3701 +#define IDC_GSTACK_UNIT18 3702 +#define IDC_GSTACK_UP18 3703 +#define IDC_GSTACK_DOWN18 3704 +#define IDC_GSTACK_SIGNALCOUNT18 3705 +#define IDC_GSTACK_SET18 3706 +#define IDC_GSTACK_RESET18 3707 +#define IDC_GSTACK_UNIT19 3708 +#define IDC_GSTACK_UP19 3709 +#define IDC_GSTACK_DOWN19 3710 +#define IDC_GSTACK_SIGNALCOUNT19 3711 +#define IDC_GSTACK_SET19 3712 +#define IDC_GSTACK_RESET19 3713 +#define IDC_GSTACK_UNIT20 3714 +#define IDC_GSTACK_UP20 3715 +#define IDC_GSTACK_DOWN20 3716 +#define IDC_GSTACK_SIGNALCOUNT20 3717 +#define IDC_GSTACK_SET20 3718 +#define IDC_GSTACK_RESET20 3719 +#define IDC_GSTACK_UNIT21 3720 +#define IDC_GSTACK_UP21 3721 +#define IDC_GSTACK_DOWN21 3722 +#define IDC_GSTACK_SIGNALCOUNT21 3723 +#define IDC_GSTACK_SET21 3724 +#define IDC_GSTACK_RESET21 3725 +#define IDC_GSTACK_UNIT22 3726 +#define IDC_GSTACK_UP22 3727 +#define IDC_GSTACK_DOWN22 3728 +#define IDC_GSTACK_SIGNALCOUNT22 3729 +#define IDC_GSTACK_SET22 3730 +#define IDC_GSTACK_RESET22 3731 +#define IDC_GSTACK_UNIT23 3732 +#define IDC_GSTACK_UP23 3733 +#define IDC_GSTACK_DOWN23 3734 +#define IDC_GSTACK_SIGNALCOUNT23 3735 +#define IDC_GSTACK_SET23 3736 +#define IDC_GSTACK_RESET23 3737 +#define IDC_GSTACK_UNIT24 3738 +#define IDC_GSTACK_UP24 3739 +#define IDC_GSTACK_DOWN24 3740 +#define IDC_GSTACK_SIGNALCOUNT24 3741 +#define IDC_GSTACK_SET24 3742 +#define IDC_GSTACK_RESET24 3743 +#define IDC_GSTACK_UNIT25 3744 +#define IDC_GSTACK_UP25 3745 +#define IDC_GSTACK_DOWN25 3746 +#define IDC_GSTACK_SIGNALCOUNT25 3747 +#define IDC_GSTACK_SET25 3748 +#define IDC_GSTACK_RESET25 3749 +#define IDC_GSTACK_UNIT26 3750 +#define IDC_GSTACK_UP26 3751 +#define IDC_GSTACK_DOWN26 3752 +#define IDC_GSTACK_SIGNALCOUNT26 3753 +#define IDC_GSTACK_SET26 3754 +#define IDC_GSTACK_RESET26 3755 +#define IDC_GSTACK_UNIT27 3756 +#define IDC_GSTACK_UP27 3757 +#define IDC_GSTACK_DOWN27 3758 +#define IDC_GSTACK_SIGNALCOUNT27 3759 +#define IDC_GSTACK_SET27 3760 +#define IDC_GSTACK_RESET27 3761 +#define IDC_GSTACK_UNIT28 3762 +#define IDC_GSTACK_UP28 3763 +#define IDC_GSTACK_DOWN28 3764 +#define IDC_GSTACK_SIGNALCOUNT28 3765 +#define IDC_GSTACK_SET28 3766 +#define IDC_GSTACK_RESET28 3767 +#define IDC_GSTACK_UNIT29 3768 +#define IDC_GSTACK_UP29 3769 +#define IDC_GSTACK_DOWN29 3770 +#define IDC_GSTACK_SIGNALCOUNT29 3771 +#define IDC_GSTACK_SET29 3772 +#define IDC_GSTACK_RESET29 3773 +#define IDC_GSTACK_UNIT30 3774 +#define IDC_GSTACK_UP30 3775 +#define IDC_GSTACK_DOWN30 3776 +#define IDC_GSTACK_SIGNALCOUNT30 3777 +#define IDC_GSTACK_SET30 3778 +#define IDC_GSTACK_RESET30 3779 +#define IDC_GSTACK_UNIT31 3780 +#define IDC_GSTACK_UP31 3781 +#define IDC_GSTACK_DOWN31 3782 +#define IDC_GSTACK_SIGNALCOUNT31 3783 +#define IDC_GSTACK_SET31 3784 +#define IDC_GSTACK_RESET31 3785 +#define IDC_GSTACK_UNIT32 3786 +#define IDC_GSTACK_UP32 3787 +#define IDC_GSTACK_DOWN32 3788 +#define IDC_GSTACK_SIGNALCOUNT32 3789 +#define IDC_GSTACK_SET32 3790 +#define IDC_GSTACK_RESET32 3791 +#define IDC_GSTACK__UNIT1 3792 +#define IDC_GSTACK__UP1 3793 +#define IDC_GSTACK__DOWN1 3794 +#define IDC_GSTACK__SIGNALCOUNT1 3795 +#define IDC_GSTACK__SET1 3796 +#define IDC_GSTACK__RESET1 3797 +#define IDC_GSTACK__UNIT2 3798 +#define IDC_GSTACK__UP2 3799 +#define IDC_GSTACK__DOWN2 3800 +#define IDC_GSTACK__SIGNALCOUNT2 3801 +#define IDC_GSTACK__SET2 3802 +#define IDC_GSTACK__RESET2 3803 +#define IDC_GSTACK__UNIT3 3804 +#define IDC_GSTACK__UP3 3805 +#define IDC_GSTACK__DOWN3 3806 +#define IDC_GSTACK__SIGNALCOUNT3 3807 +#define IDC_GSTACK__SET3 3808 +#define IDC_GSTACK__RESET3 3809 +#define IDC_GSTACK__UNIT4 3810 +#define IDC_GSTACK__UP4 3811 +#define IDC_GSTACK__DOWN4 3812 +#define IDC_GSTACK__SIGNALCOUNT4 3813 +#define IDC_GSTACK__SET4 3814 +#define IDC_GSTACK__RESET4 3815 +#define IDC_GSTACK__UNIT5 3816 +#define IDC_GSTACK__UP5 3817 +#define IDC_GSTACK__DOWN5 3818 +#define IDC_GSTACK__SIGNALCOUNT5 3819 +#define IDC_GSTACK__SET5 3820 +#define IDC_GSTACK__RESET5 3821 +#define IDC_GSTACK__UNIT6 3822 +#define IDC_GSTACK__UP6 3823 +#define IDC_GSTACK__DOWN6 3824 +#define IDC_GSTACK__SIGNALCOUNT6 3825 +#define IDC_GSTACK__SET6 3826 +#define IDC_GSTACK__RESET6 3827 +#define IDC_GSTACK__UNIT7 3828 +#define IDC_GSTACK__UP7 3829 +#define IDC_GSTACK__DOWN7 3830 +#define IDC_GSTACK__SIGNALCOUNT7 3831 +#define IDC_GSTACK__SET7 3832 +#define IDC_GSTACK__RESET7 3833 +#define IDC_GSTACK__UNIT8 3834 +#define IDC_GSTACK__UP8 3835 +#define IDC_GSTACK__DOWN8 3836 +#define IDC_GSTACK__SIGNALCOUNT8 3837 +#define IDC_GSTACK__SET8 3838 +#define IDC_GSTACK__RESET8 3839 +#define IDC_GSTACK__UNIT9 3840 +#define IDC_GSTACK__UP9 3841 +#define IDC_GSTACK__DOWN9 3842 +#define IDC_GSTACK__SIGNALCOUNT9 3843 +#define IDC_GSTACK__SET9 3844 +#define IDC_GSTACK__RESET9 3845 +#define IDC_GSTACK__UNIT10 3846 +#define IDC_GSTACK__UP10 3847 +#define IDC_GSTACK__DOWN10 3848 +#define IDC_GSTACK__SIGNALCOUNT10 3849 +#define IDC_GSTACK__SET10 3850 +#define IDC_GSTACK__RESET10 3851 +#define IDC_GSTACK__UNIT11 3852 +#define IDC_GSTACK__UP11 3853 +#define IDC_GSTACK__DOWN11 3854 +#define IDC_GSTACK__SIGNALCOUNT11 3855 +#define IDC_GSTACK__SET11 3856 +#define IDC_GSTACK__RESET11 3857 +#define IDC_GSTACK__UNIT12 3858 +#define IDC_GSTACK__UP12 3859 +#define IDC_GSTACK__DOWN12 3860 +#define IDC_GSTACK__SIGNALCOUNT12 3861 +#define IDC_GSTACK__SET12 3862 +#define IDC_GSTACK__RESET12 3863 +#define IDC_GSTACK__UNIT13 3864 +#define IDC_GSTACK__UP13 3865 +#define IDC_GSTACK__DOWN13 3866 +#define IDC_GSTACK__SIGNALCOUNT13 3867 +#define IDC_GSTACK__SET13 3868 +#define IDC_GSTACK__RESET13 3869 +#define IDC_GSTACK__UNIT14 3870 +#define IDC_GSTACK__UP14 3871 +#define IDC_GSTACK__DOWN14 3872 +#define IDC_GSTACK__SIGNALCOUNT14 3873 +#define IDC_GSTACK__SET14 3874 +#define IDC_GSTACK__RESET14 3875 +#define IDC_GSTACK__UNIT15 3876 +#define IDC_GSTACK__UP15 3877 +#define IDC_GSTACK__DOWN15 3878 +#define IDC_GSTACK__SIGNALCOUNT15 3879 +#define IDC_GSTACK__SET15 3880 +#define IDC_GSTACK__RESET15 3881 +#define IDC_GSTACK__UNIT16 3882 +#define IDC_GSTACK__UP16 3883 +#define IDC_GSTACK__DOWN16 3884 +#define IDC_GSTACK__SIGNALCOUNT16 3885 +#define IDC_GSTACK__SET16 3886 +#define IDC_GSTACK__RESET16 3887 +#define IDC_GSTACK__UNIT17 3888 +#define IDC_GSTACK__UP17 3889 +#define IDC_GSTACK__DOWN17 3890 +#define IDC_GSTACK__SIGNALCOUNT17 3891 +#define IDC_GSTACK__SET17 3892 +#define IDC_GSTACK__RESET17 3893 +#define IDC_GSTACK__UNIT18 3894 +#define IDC_GSTACK__UP18 3895 +#define IDC_GSTACK__DOWN18 3896 +#define IDC_GSTACK__SIGNALCOUNT18 3897 +#define IDC_GSTACK__SET18 3898 +#define IDC_GSTACK__RESET18 3899 +#define IDC_GSTACK__UNIT19 3900 +#define IDC_GSTACK__UP19 3901 +#define IDC_GSTACK__DOWN19 3902 +#define IDC_GSTACK__SIGNALCOUNT19 3903 +#define IDC_GSTACK__SET19 3904 +#define IDC_GSTACK__RESET19 3905 +#define IDC_GSTACK__UNIT20 3906 +#define IDC_GSTACK__UP20 3907 +#define IDC_GSTACK__DOWN20 3908 +#define IDC_GSTACK__SIGNALCOUNT20 3909 +#define IDC_GSTACK__SET20 3910 +#define IDC_GSTACK__RESET20 3911 +#define IDC_GSTACK__UNIT21 3912 +#define IDC_GSTACK__UP21 3913 +#define IDC_GSTACK__DOWN21 3914 +#define IDC_GSTACK__SIGNALCOUNT21 3915 +#define IDC_GSTACK__SET21 3916 +#define IDC_GSTACK__RESET21 3917 +#define IDC_GSTACK__UNIT22 3918 +#define IDC_GSTACK__UP22 3919 +#define IDC_GSTACK__DOWN22 3920 +#define IDC_GSTACK__SIGNALCOUNT22 3921 +#define IDC_GSTACK__SET22 3922 +#define IDC_GSTACK__RESET22 3923 +#define IDC_GSTACK__UNIT23 3924 +#define IDC_GSTACK__UP23 3925 +#define IDC_GSTACK__DOWN23 3926 +#define IDC_GSTACK__SIGNALCOUNT23 3927 +#define IDC_GSTACK__SET23 3928 +#define IDC_GSTACK__RESET23 3929 +#define IDC_GSTACK__UNIT24 3930 +#define IDC_GSTACK__UP24 3931 +#define IDC_GSTACK__DOWN24 3932 +#define IDC_GSTACK__SIGNALCOUNT24 3933 +#define IDC_GSTACK__SET24 3934 +#define IDC_GSTACK__RESET24 3935 +#define IDC_GSTACK__UNIT25 3936 +#define IDC_GSTACK__UP25 3937 +#define IDC_GSTACK__DOWN25 3938 +#define IDC_GSTACK__SIGNALCOUNT25 3939 +#define IDC_GSTACK__SET25 3940 +#define IDC_GSTACK__RESET25 3941 +#define IDC_GSTACK__UNIT26 3942 +#define IDC_GSTACK__UP26 3943 +#define IDC_GSTACK__DOWN26 3944 +#define IDC_GSTACK__SIGNALCOUNT26 3945 +#define IDC_GSTACK__SET26 3946 +#define IDC_GSTACK__RESET26 3947 +#define IDC_GSTACK__UNIT27 3948 +#define IDC_GSTACK__UP27 3949 +#define IDC_GSTACK__DOWN27 3950 +#define IDC_GSTACK__SIGNALCOUNT27 3951 +#define IDC_GSTACK__SET27 3952 +#define IDC_GSTACK__RESET27 3953 +#define IDC_GSTACK__UNIT28 3954 +#define IDC_GSTACK__UP28 3955 +#define IDC_GSTACK__DOWN28 3956 +#define IDC_GSTACK__SIGNALCOUNT28 3957 +#define IDC_GSTACK__SET28 3958 +#define IDC_GSTACK__RESET28 3959 +#define IDC_GSTACK__UNIT29 3960 +#define IDC_GSTACK__UP29 3961 +#define IDC_GSTACK__DOWN29 3962 +#define IDC_GSTACK__SIGNALCOUNT29 3963 +#define IDC_GSTACK__SET29 3964 +#define IDC_GSTACK__RESET29 3965 +#define IDC_GSTACK__UNIT30 3966 +#define IDC_GSTACK__UP30 3967 +#define IDC_GSTACK__DOWN30 3968 +#define IDC_GSTACK__SIGNALCOUNT30 3969 +#define IDC_GSTACK__SET30 3970 +#define IDC_GSTACK__RESET30 3971 +#define IDC_GSTACK__UNIT31 3972 +#define IDC_GSTACK__UP31 3973 +#define IDC_GSTACK__DOWN31 3974 +#define IDC_GSTACK__SIGNALCOUNT31 3975 +#define IDC_GSTACK__SET31 3976 +#define IDC_GSTACK__RESET31 3977 +#define IDC_GSTACK__UNIT32 3978 +#define IDC_GSTACK__UP32 3979 +#define IDC_GSTACK__DOWN32 3980 +#define IDC_GSTACK__SIGNALCOUNT32 3981 +#define IDC_GSTACK__SET32 3982 +#define IDC_GSTACK__RESET32 3983 +#define IDC_DST_STEREO 5004 +#define IDC_GLITCH_ACTIVE 5050 +#define IDC_GLITCH_ACTIVE_VAL 5051 +#define IDC_GLITCH_DRY 5052 +#define IDC_GLITCH_DRY_VAL 5053 +#define IDC_GLITCH_DSIZE 5054 +#define IDC_GLITCH_DSIZE_VAL 5055 +#define IDC_GLITCH_DPITCH 5056 +#define IDC_GLITCH_DPITCH_VAL 5057 +#define IDC_GLITCH_DTIME 5058 +#define IDC_GLITCH_DTIME_VAL 5059 + + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 125 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 5015 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif