diff --git a/4klang_VSTi/4klang.dll b/4klang_VSTi/4klang.dll index 7e08e8e..79e1064 100644 Binary files a/4klang_VSTi/4klang.dll and b/4klang_VSTi/4klang.dll differ diff --git a/4klang_VSTi/8klang.dll b/4klang_VSTi/8klang.dll new file mode 100644 index 0000000..d9ec26d Binary files /dev/null and b/4klang_VSTi/8klang.dll differ diff --git a/4klang_VSTi/virgill - 4klang basics.4kp b/4klang_VSTi/virgill - 4klang basics.4kp new file mode 100644 index 0000000..2f02041 Binary files /dev/null and b/4klang_VSTi/virgill - 4klang basics.4kp differ diff --git a/4klang_source/4klang.asm b/4klang_source/4klang.asm index ff2dd77..a1a93bf 100644 --- a/4klang_source/4klang.asm +++ b/4klang_source/4klang.asm @@ -47,7 +47,12 @@ 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 117*go4kDLL_wrk.size +_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 @@ -130,10 +135,12 @@ 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 ; //======================================================================================== @@ -279,8 +286,7 @@ go4kENV_func_do: mov eax, dword [ecx-8] ; // is the instrument in release mode (note off)? test eax, eax je go4kENV_func_process - mov al, ENV_STATE_RELEASE - mov dword [WRK+go4kENV_wrk.state], eax + 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 - @@ -384,8 +390,13 @@ section .g4kcods code align=1 section .text %endif go4kVCO_sine: - fxch ; // p c - fstp st1 ; // p + 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 @@ -462,11 +473,28 @@ export_func go4kVCO_func@0 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 @@ -476,6 +504,12 @@ go4kVCO_func_do: 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] @@ -562,6 +596,18 @@ go4kVCO_func_end: 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 @@ -590,16 +636,31 @@ export_func go4kVCF_func@0 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 - fld dword [edx+go4kVCF_val.freq] ; // f r in +%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 - fst dword [WRK+go4kVCF_wrk.freq] ; // f r in + 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 @@ -607,7 +668,7 @@ go4kVCF_func_do: fmul dword [WRK+go4kVCF_wrk.band] ; // r*b in-l' fsubp st1, st0 ; // h' fst dword [WRK+go4kVCF_wrk.high] ; // h' - fmul dword [WRK+go4kVCF_wrk.freq] ; // h'*f + fmul dword [esp-4] ; // h'*f fadd dword [WRK+go4kVCF_wrk.band] ; // b' fstp dword [WRK+go4kVCF_wrk.band] fldz @@ -630,15 +691,21 @@ go4kVCF_func_band: go4kVCF_func_peak: %ifdef GO4K_USE_VCF_PEAK test al, byte PEAK - jz short go4kVCF_func_end + 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 - - - - -%ifdef GO4K_USE_UNDENORMALIZE - fadd dword [c_0_5] ; add and sub small offset to prevent denormalization - fsub dword [c_0_5] -%endif ret %ifdef USE_SECTIONS @@ -658,10 +725,18 @@ section .text export_func go4kDST_func@0 %ifdef GO4K_USE_DST %ifdef GO4K_USE_DST_SH - push 2 -%else - push 1 -%endif + %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 @@ -671,6 +746,7 @@ export_func go4kDST_func@0 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 %ifdef GO4K_USE_DST_MOD_SH @@ -688,6 +764,21 @@ go4kDST_func_do: fstp dword [WRK+go4kDST_wrk.snhphase]; // in %endif ; // calc pregain and postgain +%ifdef GO4K_USE_DST_STEREO + test al, byte STEREO ; // outr inl + 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 %ifdef GO4K_USE_DST_MOD_DM fadd dword [WRK+go4kDST_wrk.dm] @@ -701,6 +792,12 @@ go4kDST_func_do: go4kDST_func_hold: fstp st0 ; // in fstp st0 +%ifdef GO4K_USE_DST_STEREO + test al, byte STEREO ; // outr inl + jz short go4kDST_func_monohold + fld dword [WRK+go4kDST_wrk.out2] ; // out2 +go4kDST_func_monohold: +%endif fld dword [WRK+go4kDST_wrk.out] ; // out ret %endif @@ -953,26 +1050,22 @@ go4kFOP_func_mul: jnz go4kFOP_func_addp2 fmul st1 ret -%ifdef GO4K_USE_FOP_LOADNOTE go4kFOP_func_addp2: dec eax jnz go4kFOP_func_loadnote faddp st2, st0 faddp st2, st0 ret -go4kFOP_func_loadnote: +go4kFOP_func_loadnote: + dec eax + jnz go4kFOP_func_mulp2 fild dword [ecx-4] fmul dword [c_i128] ret -%else -go4kFOP_func_addp2: - dec eax - jnz go4kFOP_func_dummy+1 ; // now this is no valid jump address (just to please the packer) but if we run in that case we're fucked up anyway - faddp st2, st0 -go4kFOP_func_dummy: - faddp st2, st0 - ret -%endif +go4kFOP_func_mulp2: + fmulp st2, st0 + fmulp st2, st0 + ret %ifdef USE_SECTIONS section .g4kcodh code align=1 @@ -989,13 +1082,23 @@ section .text ; // DIRTY : ; //---------------------------------------------------------------------------------------- export_func go4kFST_func@0 - push 2 + push 1 call go4kTransformValues fld dword [edx+go4kFST_val.amount] fsub dword [c_0_5] fadd st0 fmul st1 - fstp dword [ecx+eax*4] ; // eax already contains the destination from the go4kTransformValues call + 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 @@ -1041,30 +1144,39 @@ section .text ; // DIRTY : ; //---------------------------------------------------------------------------------------- export_func go4kFSTG_func@0 - push 5 + 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 - ret + lodsw + jmp go4kFSTG_func_testpop go4kFSTG_func_do: %endif fld dword [edx+go4kFST_val.amount] fsub dword [c_0_5] fadd st0 - fmul st1 - mov eax, dword [VAL-4] + 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] - fstp dword [go4k_synth_wrk+eax+go4k_instrument.size] + fst dword [go4k_synth_wrk+eax*4] + fstp dword [go4k_synth_wrk+eax*4+go4k_instrument.size] %else - fstp dword [go4k_synth_wrk+eax] -%endif - - ret - + 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 @@ -1117,7 +1229,7 @@ export_func go4kOUT_func@0 ;// l r push 2 call go4kTransformValues pushad - lea edi, [ecx+256*4] + 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 @@ -1158,13 +1270,13 @@ export_func go4kOUT_func@0 ;// l r fadd dword [WRK+go4kOUT_wrk.gm] ;// gm l r %endif fmulp st1, st0 ;// l' r - fstp dword [ecx+256*4+0] ;// 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+256*4+4] ;// - + fstp dword [ecx+MAX_UNITS*MAX_UNIT_SLOTS*4+4] ;// - %endif ret @@ -1248,7 +1360,7 @@ go4kUpdateInstrument_newNote: %endif pushad xor eax, eax - mov ecx, (8+256*4)/4 ; // clear only relase, note and workspace + 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 @@ -1476,6 +1588,9 @@ go4k_render_nogroove: 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 @@ -1507,7 +1622,7 @@ go4k_VM_process_loop: test eax, eax je go4k_VM_process_done ; // command byte = 0? so done call dword [eax*4+go4k_synth_commands] - add WRK, MAX_WORKSPACE_SLOTS*4 ; // go to next workspace slot + 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 diff --git a/4klang_source/4klang.inc b/4klang_source/4klang.inc index e3703b6..0e1e355 100644 --- a/4klang_source/4klang.inc +++ b/4klang_source/4klang.inc @@ -7,7 +7,7 @@ global _%1 _%1: %endmacro -%define USE_SECTIONS +;%define USE_SECTIONS ; //---------------------------------------------------------------------------------------- ; // basic defines for the song/synth ; //---------------------------------------------------------------------------------------- @@ -52,22 +52,24 @@ %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_FOP_LOADNOTE ; // removing this will skip load note 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 @@ -86,11 +88,12 @@ ; // synth defines ; //---------------------------------------------------------------------------------------- %define MAX_DELAY 65536 -%define MAX_WORKSPACE_SLOTS 8 -%define GO4K_BEGIN_CMDDEF(def_name) -%define GO4K_END_CMDDEF db 0 -%define GO4K_BEGIN_PARAMDEF(def_name) -%define GO4K_END_PARAMDEF +%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 ; //---------------------------------------------------------------------------------------- @@ -168,6 +171,7 @@ GO4K_VCO_ID equ 2 %define NOISE 0x08 %define LFO 0x10 %define GATE 0x20 +%define VCO_STEREO 0x40 struc go4kVCO_val ;// unit paramters .transpose resd 1 @@ -197,6 +201,8 @@ struc go4kVCO_wrk .cm resd 1 .sm resd 1 .gm resd 1 +;// stero variables + .phase2 resd 1 .size endstruc ; //---------------------------------------------------------------------------------------- @@ -214,6 +220,7 @@ GO4K_VCF_ID equ 3 %define BANDSTOP 0x3 %define ALLPASS 0x7 %define PEAK 0x8 +%define STEREO 0x10 %define FREQUENCY(val) val %define RESONANCE(val) val %define VCFTYPE(val) val @@ -229,38 +236,54 @@ struc go4kVCF_wrk .low resd 1 .high resd 1 .band resd 1 - .freq resd 1 + .freq resd 1 ;// unused but kept so modulation target offsets stay same ;// modulation targets .fm resd 1 - .rm 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 2 +%macro GO4K_DST 3 db %1 %ifdef GO4K_USE_DST_SH db %2 -%endif + %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 ; //---------------------------------------------------------------------------------------- @@ -342,6 +365,7 @@ GO4K_FOP_ID equ 6 %define FOP_MUL 0x7 %define FOP_ADDP2 0x8 %define FOP_LOADNOTE 0x9 +%define FOP_MULP2 0xa struc go4kFOP_val .flags resd 1 .size @@ -355,10 +379,13 @@ endstruc GO4K_FST_ID equ 7 %macro GO4K_FST 2 db %1 - db %2 + 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 @@ -455,7 +482,7 @@ endstruc GO4K_FSTG_ID equ 12 %macro GO4K_FSTG 2 db %1 - dd %2 + dw %2 %endmacro struc go4kFSTG_val .amount resd 1 @@ -472,7 +499,7 @@ endstruc struc go4k_instrument .release resd 1 .note resd 1 - .workspace resd 256 + .workspace resd MAX_UNITS*MAX_UNIT_SLOTS .dlloutl resd 1 .dlloutr resd 1 .outl resd 1 @@ -723,18 +750,18 @@ section .data 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_WORKSPACE_SLOTS+2) + 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_WORKSPACE_SLOTS+2) - GO4K_FST AMOUNT(61),DEST(3*MAX_WORKSPACE_SLOTS+2) + 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) + 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) @@ -744,18 +771,18 @@ GO4K_BEGIN_PARAMDEF(Instrument0) 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_WORKSPACE_SLOTS+2) + 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_WORKSPACE_SLOTS+2) - GO4K_FST AMOUNT(60),DEST(3*MAX_WORKSPACE_SLOTS+2) + 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) + 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) @@ -765,18 +792,18 @@ GO4K_BEGIN_PARAMDEF(Instrument1) 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_WORKSPACE_SLOTS+2) + 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_WORKSPACE_SLOTS+2) - GO4K_FST AMOUNT(60),DEST(3*MAX_WORKSPACE_SLOTS+2) + 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) + 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) @@ -786,7 +813,7 @@ GO4K_BEGIN_PARAMDEF(Instrument2) 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_WORKSPACE_SLOTS+2) + 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) @@ -795,10 +822,10 @@ GO4K_BEGIN_PARAMDEF(Instrument3) 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_WORKSPACE_SLOTS+2) + 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) - GO4K_FST AMOUNT(80),DEST(6*MAX_WORKSPACE_SLOTS+1) + 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) @@ -819,10 +846,10 @@ GO4K_BEGIN_PARAMDEF(Instrument5) 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_WORKSPACE_SLOTS+2) + 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_WORKSPACE_SLOTS+1) - GO4K_FST AMOUNT(72),DEST(7*MAX_WORKSPACE_SLOTS+1) + 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) @@ -850,8 +877,8 @@ 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_WORKSPACE_SLOTS*4+4*4+go4k_instrument.workspace) - GO4K_FSTG AMOUNT(66),DEST(1*go4k_instrument.size*MAX_VOICES+10*MAX_WORKSPACE_SLOTS*4+4*4+go4k_instrument.workspace) + 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 diff --git a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTi.cpp b/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTi.cpp index 0e0b360..a4a1c73 100644 --- a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTi.cpp +++ b/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTi.cpp @@ -19,7 +19,11 @@ Go4kVSTi::Go4kVSTi (audioMasterCallback audioMaster) : AudioEffectX (audioMaster hasVu (false); hasClip (false); isSynth (); +#ifdef _8KLANG + setUniqueID ('8klg'); +#else setUniqueID ('4klg'); +#endif } initProcess (); suspend (); @@ -99,7 +103,11 @@ bool Go4kVSTi::copyProgram (long destination) //----------------------------------------------------------------------------------------- bool Go4kVSTi::getEffectName (char* name) { +#ifdef _8KLANG + strcpy (name, "8klang"); +#else strcpy (name, "4klang"); +#endif return true; } @@ -113,7 +121,11 @@ bool Go4kVSTi::getVendorString (char* text) //----------------------------------------------------------------------------------------- bool Go4kVSTi::getProductString (char* text) { +#ifdef _8KLANG + strcpy (text, "8klang"); +#else strcpy (text, "4klang"); +#endif return true; } diff --git a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiCore.cpp b/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiCore.cpp index 4404c3d..eb79dd2 100644 --- a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiCore.cpp +++ b/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiCore.cpp @@ -14,7 +14,8 @@ DWORD versiontag10 = 0x30316b34; // 4k10 DWORD versiontag11 = 0x31316b34; // 4k11 DWORD versiontag12 = 0x32316b34; // 4k12 -DWORD versiontag = 0x33316b34; // 4k13 +DWORD versiontag13 = 0x33316b34; // 4k13 +DWORD versiontag = 0x34316b34; // 4k14 static SynthObject SynthObj; @@ -96,11 +97,11 @@ void Go4kVSTi_Init() void Go4kVSTi_ClearInstrumentSlot(char channel, int slot) { - memset(SynthObj.InstrumentValues[channel][slot], 0, MAX_SLOT_VALUES); + 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*8]); - memset(w, 0, 8*4); + float* w = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+i].workspace[slot*MAX_UNIT_SLOTS]); + memset(w, 0, MAX_UNIT_SLOTS*4); } } @@ -119,7 +120,7 @@ void Go4kVSTi_ResetInstrument(char channel) // clear values BYTE* v = SynthObj.InstrumentValues[channel][0]; - memset(v, 0, MAX_SLOTS*MAX_SLOT_VALUES); + memset(v, 0, MAX_UNITS*MAX_UNIT_SLOTS); // clear workspace InstrumentWorkspace* w = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY]); @@ -129,23 +130,25 @@ void Go4kVSTi_ResetInstrument(char channel) 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][22], channel, M_DLL); - Go4kVSTi_InitSlot(SynthObj.InstrumentValues[channel][23], channel, M_PAN); - Go4kVSTi_InitSlot(SynthObj.InstrumentValues[channel][24], channel, M_OUT); + 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_SLOT_VALUES); - float* w = &(SynthObj.GlobalWork.workspace[slot*8]); - memset(w, 0, 8*4); + 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() @@ -157,7 +160,7 @@ void Go4kVSTi_ClearGlobalWorkspace() void Go4kVSTi_ResetGlobal() { // clear values - memset(SynthObj.GlobalValues, 0, MAX_SLOTS*MAX_SLOT_VALUES); + memset(SynthObj.GlobalValues, 0, MAX_UNITS*MAX_UNIT_SLOTS); // clear workspace memset(&(SynthObj.GlobalWork), 0, sizeof(InstrumentWorkspace)); @@ -178,9 +181,10 @@ void Go4kVSTi_ResetGlobal() 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[24], 16, M_OUT); - - SynthObj.GlobalSignalValid = 1; + Go4kVSTi_InitSlot(SynthObj.GlobalValues[7], 16, M_OUT); + + SynthObj.HighestSlotIndex[16] = 7; + SynthObj.GlobalSignalValid = 1; PatternSize = 16; @@ -202,50 +206,62 @@ void Go4kVSTi_ResetPatch() void Go4kVSTi_FlipInstrumentSlots(char channel, int a, int b) { - DWORD temp[MAX_SLOT_VALUES]; + 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_SLOT_VALUES); - memcpy(v2, v1, MAX_SLOT_VALUES); - memcpy(v1, temp, MAX_SLOT_VALUES); + 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*8]); - float* w2 = &(SynthObj.InstrumentWork[channel*MAX_POLYPHONY+i].workspace[b*8]); - memcpy(temp, w2, 8*4); - memcpy(w2, w1, 8*4); - memcpy(w1, temp, 8*4); + 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 && v2[0] == M_DLL) { Go4kVSTi_ClearDelayLines(); Go4kVSTi_UpdateDelayTimes(); - } + } } void Go4kVSTi_FlipGlobalSlots(int a, int b) { - DWORD temp[MAX_SLOT_VALUES]; + 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_SLOT_VALUES); - memcpy(v2, v1, MAX_SLOT_VALUES); - memcpy(v1, temp, MAX_SLOT_VALUES); + 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*8]); - float* w2 = &(SynthObj.GlobalWork.workspace[b*8]); - memcpy(temp, w2, 8*4); - memcpy(w2, w1, 8*4); - memcpy(w1, temp, 8*4); + 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 && v2[0] == M_DLL) { Go4kVSTi_ClearDelayLines(); Go4kVSTi_UpdateDelayTimes(); - } + } } // init a unit slot @@ -286,6 +302,7 @@ void Go4kVSTi_InitSlot(BYTE* slot, int channel, int type) DST_valP v = (DST_valP)slot; v->drive = 64; v->snhfreq = 128; + v->stereo = 0; } if (type == M_DLL) { @@ -312,6 +329,7 @@ void Go4kVSTi_InitSlot(BYTE* slot, int channel, int type) { 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; @@ -343,6 +361,8 @@ void Go4kVSTi_InitSlot(BYTE* slot, int channel, int type) // 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 @@ -351,12 +371,14 @@ void Go4kVSTi_InitInstrumentSlot(char channel, int s, int type) { 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 @@ -365,7 +387,7 @@ void Go4kVSTi_InitGlobalSlot(int s, int type) { Go4kVSTi_ClearDelayLines(); Go4kVSTi_UpdateDelayTimes(); - } + } } // panic @@ -425,7 +447,7 @@ void Go4kVSTi_UpdateDelayTimes() int delayindex = 17; for (int i = 0; i <= MAX_INSTRUMENTS; i++) { - for (int u = 0; u < MAX_SLOTS; u++) + for (int u = 0; u < MAX_UNITS; u++) { DLL_valP v; if (i < MAX_INSTRUMENTS) @@ -486,7 +508,7 @@ void Go4kVSTi_UpdateDelayTimes() // clear delay lines void Go4kVSTi_ClearDelayLines() { - memset((&go4k_delay_buffer), 0, 80*((65536+4)*4)); + memset((&go4k_delay_buffer), 0, 16*16*((65536+5)*4)); } // set global bpm @@ -521,277 +543,330 @@ void Go4kVSTi_Solo(int channel, int solo) void Go4kVSTi_Tick(float *oleft, float *oright, int samples) { - // 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_SLOTS; s++) - { - BYTE* val = SynthObj.InstrumentValues[i][s]; - if (val[0] == M_DLL) - 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 < MAX_SLOTS; s++) - { - BYTE* val = SynthObj.InstrumentValues[i][s]; - float *wrk = &(iwork->workspace[s*8]); - if (val[0] == M_FST && iwork->note) - { - 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*8 + v->dest_slot]); - float amount = (2.0f*v->amount - 128.0f)*0.0078125f; - for (int stc = 0; stc < polyphonicStore; stc++) - { - __asm - { - push eax - fld amount - fmul st(0), st(1) - mov eax, mdest - fstp dword ptr [eax] - pop eax - } - mdest += sizeof(InstrumentWorkspace)/4; - } - } - } - 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_SLOTS; s++) - { - BYTE* val = SynthObj.InstrumentValues[i][s]; - if (val[0] == M_DLL) - 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 < MAX_SLOTS; s++) - { - BYTE* val = SynthObj.GlobalValues[s]; - float *wrk = &(lwrk[s*8]); - // 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 && gwork->note) - { - 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*8 + v->dest_slot]); - float amount = (2.0f*v->amount - 128.0f)*0.0078125f;; - for (int stc = 0; stc < polyphonicStore; stc++) - { - __asm - { - push eax - fld amount - fmul st(0), st(1) - mov eax, mdest - fstp dword ptr [eax] - pop eax - } - mdest += sizeof(InstrumentWorkspace)/4; - } - } - } - // 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 - if (Recording) { samplesProcessed += samples; + // send a stayalive signal to the host + for (int i = 0; i < samples; i++) + { + float signal = 0.0625*((float)(i&63)/32.0f - 1.0f); + *oleft++ = signal; + *oright++ = signal; + } + } + else + { + // 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) + 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) + 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 } } @@ -844,57 +919,6 @@ void Go4kVSTi_Record(bool record, int patternsize, float patternquant) InstrumentRecord[i][j] = InstrumentRecord[i][(int)(j/TickScaler)]; } } - // init reduced patterns - ReducedPatterns.clear(); - NumReducedPatterns = 0; - // add NULL pattern - for (int i = 0; i < PatternSize; i++) - { - ReducedPatterns.push_back(0); - } - // now add minimal reduced instrument patterns - for (int i = 0; i < MAX_INSTRUMENTS; i++) - { - PatternIndices[i].clear(); - // loop all patterns - for (int j = 0; j < MaxTicks/PatternSize; j++) - { - 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); - } - } - // open file dialog and save if desired ... // the save function called from this one is GoSynth_SaveByteStream GetStreamFileName(); @@ -904,32 +928,6 @@ void Go4kVSTi_Record(bool record, int patternsize, float patternquant) // add a voice with given parameters to synth void Go4kVSTi_AddVoice(int channel, int note) { - 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, 256*4+8); - 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_SLOTS; i++) - { - if (SynthObj.InstrumentValues[channel][i][0] == M_OUT) - { - SynthObj.ControlInstrument[channel] = 0; - break; - } - } - // record song if (Recording) { @@ -960,17 +958,39 @@ void Go4kVSTi_AddVoice(int channel, int note) InstrumentOn[channel] = CurrentTick; } } + else + { + 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) -{ - 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; +{ // record song if (Recording) { @@ -986,6 +1006,15 @@ void Go4kVSTi_StopVoice(int channel, int note) // if (!InstrumentRecord[channel][CurrentTick]) InstrumentOn[channel] = -1; } + else + { + 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; + } } //---------------------------------------------------------------------------------------------------- @@ -1002,11 +1031,11 @@ void FlipSlotModulations(int stack, int unit1, int unit2) values = SynthObj.InstrumentValues[i][0]; else values = SynthObj.GlobalValues[0]; - for (int u = 0; u < MAX_SLOTS; u++) + for (int u = 0; u < MAX_UNITS; u++) { - if (values[u*MAX_SLOTS+0] == M_FST) + if (values[u*MAX_UNIT_SLOTS+0] == M_FST) { - FST_valP v = (FST_valP)(&values[u*MAX_SLOTS+0]); + FST_valP v = (FST_valP)(&values[u*MAX_UNIT_SLOTS+0]); int target_inst; if (v->dest_stack == -1) @@ -1047,13 +1076,13 @@ bool Autoconvert10(int stack) values = SynthObj.GlobalValues[0]; // replace the delay with the new one - for (int u = 0; u < MAX_SLOTS; u++) + for (int u = 0; u < MAX_UNITS; u++) { - if (values[u*MAX_SLOTS+0] == M_DLL) + if (values[u*MAX_UNIT_SLOTS+0] == M_DLL) { DLL10_val ov; - memcpy(&ov, &values[u*MAX_SLOTS+0], sizeof(DLL10_val)); - DLL_valP nv = (DLL_valP)(&values[u*MAX_SLOTS+0]); + 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; @@ -1081,13 +1110,13 @@ bool Autoconvert11(int stack) values = SynthObj.GlobalValues[0]; // replace the osc with the new one - for (int u = 0; u < MAX_SLOTS; u++) + for (int u = 0; u < MAX_UNITS; u++) { - if (values[u*MAX_SLOTS+0] == M_VCO) + if (values[u*MAX_UNIT_SLOTS+0] == M_VCO) { VCO11_val ov; - memcpy(&ov, &values[u*MAX_SLOTS+0], sizeof(VCO11_val)); - VCO_valP nv = (VCO_valP)(&values[u*MAX_SLOTS+0]); + 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; @@ -1102,6 +1131,31 @@ bool Autoconvert11(int stack) 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) { @@ -1113,15 +1167,24 @@ void Go4kVSTi_LoadPatch(char *filename) 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 - if (version == versiontag12) + 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) @@ -1129,6 +1192,7 @@ void Go4kVSTi_LoadPatch(char *filename) 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) @@ -1137,6 +1201,7 @@ void Go4kVSTi_LoadPatch(char *filename) version10 = true; version11 = true; version12 = true; + version13 = true; } // newer format than supported else @@ -1147,15 +1212,34 @@ void Go4kVSTi_LoadPatch(char *filename) } } - int slots=MAX_SLOTS; // read data fread(&(SynthObj.Polyphony), 1, 4, file); fread(SynthObj.InstrumentNames, 1, MAX_INSTRUMENTS*64, file); for (int i=0; ivco_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) { @@ -1494,11 +1663,6 @@ void GetUses(SynthUses *uses, bool InstrumentUsed[]) if (((PAN_valP)v)->panning != 64) uses->pan_use = true; } - if (v[0] == M_FOP) - { - if (((FOP_valP)v)->flags == FOP_LOADNOTE) - uses->fop_loadnote = true; - } if (v[0] == M_FLD) { uses->fld_use = true; @@ -1625,30 +1789,155 @@ void GetUses(SynthUses *uses, bool InstrumentUsed[]) } } -#ifdef EXPORT_OBJECT_FILE -int randiSeed = 23; -int randi() +void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, int useenotevalues, int clipoutput, int undenormalize, int objformat, int output16) { - return( ((randiSeed = randiSeed * 214013L + 2531011L) >> 16) & 0x7fff ); -} + 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 -void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, int useenotevalues, int clipoutput, int undenormalize, int objformat, int output16) -{ - std::string fpath = filename; -#ifdef EXPORT_OBJECT_FILE - unsigned char* CryptTable = (unsigned char*)malloc(1024*1024); - randiSeed = 23; - for (int i = 0; i < 1024*1024; i++) - CryptTable[i] = randi() & 0xff; - char temppath[1024]; - GetTempPath(1024, temppath); - std::string path = temppath; - // construct temp strings - std::string incfile = path + "4klang.inc"; -#else - std::string incfile = filename; -#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) @@ -1684,6 +1973,15 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, 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++) { @@ -1692,9 +1990,10 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, delay_indices.push_back(i); } delay_times[0] = 0; +#endif for (int i = 0; i <= MAX_INSTRUMENTS; i++) { - for (int u = 0; u < MAX_SLOTS; u++) + for (int u = 0; u < MAX_UNITS; u++) { // // used instrument or global? if (InstrumentUsed[i] || i == MAX_INSTRUMENTS) @@ -1767,6 +2066,8 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, } } } +// rarely needed anyway +#if 0 // if we dont have reverb, remove values and adjust indices if (!hasReverb) { @@ -1803,9 +2104,14 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, 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 @@ -1838,11 +2144,11 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, } fprintf(file, "%%define SAMPLE_RATE %d\n", 44100); - fprintf(file, "%%define MAX_INSTRUMENTS %d\n", maxinst); + 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", PatternIndices[0].size()); + 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"); @@ -1894,6 +2200,8 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, 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"); @@ -1902,6 +2210,8 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, 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"); @@ -1909,6 +2219,8 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, 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) @@ -1917,8 +2229,6 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, if (uses.dll_damp) fprintf(file, "%%define GO4K_USE_DLL_DAMP\n"); fprintf(file, "%%define GO4K_USE_DLL_DC_FILTER\n"); - if (uses.fop_loadnote) - fprintf(file, "%%define GO4K_USE_FOP_LOADNOTE\n"); fprintf(file, "%%define GO4K_USE_FSTG_CHECK\n"); if (uses.pan_pm) fprintf(file, "%%define GO4K_USE_PAN_MOD\n"); @@ -1945,7 +2255,8 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, fprintf(file, "%%define GO4K_USE_DLL_MOD_AM\n"); fprintf(file, "%%define MAX_DELAY 65536\n"); - fprintf(file, "%%define MAX_WORKSPACE_SLOTS 8\n"); + fprintf(file, "%%define MAX_UNITS 48\n"); + fprintf(file, "%%define MAX_UNIT_SLOTS 9\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"); @@ -2018,6 +2329,7 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, 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"); @@ -2044,6 +2356,7 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, 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"); @@ -2059,6 +2372,7 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, 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"); @@ -2072,35 +2386,46 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, 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, " .freq resd 1\n"); fprintf(file, " .fm resd 1\n"); - fprintf(file, " .rm 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 2\n"); + fprintf(file, "%%macro GO4K_DST 3\n"); fprintf(file, " db %%1\n"); - fprintf(file, "%%ifdef GO4K_USE_DST_SH \n"); + fprintf(file, "%%ifdef GO4K_USE_DST_SH\n"); fprintf(file, " db %%2\n"); - fprintf(file, "%%endif \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, "%%ifdef GO4K_USE_DST_SH \n"); fprintf(file, " .out resd 1\n"); fprintf(file, " .snhphase resd 1\n"); - fprintf(file, "%%endif \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"); @@ -2176,6 +2501,7 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, 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"); @@ -2187,10 +2513,13 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, fprintf(file, "GO4K_FST_ID equ 7\n"); fprintf(file, "%%macro GO4K_FST 2\n"); fprintf(file, " db %%1\n"); - fprintf(file, " db %%2\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"); @@ -2257,7 +2586,7 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, 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, " db %%1\n"); fprintf(file, "%%endmacro\n"); fprintf(file, "%%define VALUE(val) val\n"); fprintf(file, "struc go4kFLD_val\n"); @@ -2274,7 +2603,7 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, fprintf(file, "GO4K_FSTG_ID equ 12\n"); fprintf(file, "%%macro GO4K_FSTG 2\n"); fprintf(file, " db %%1\n"); - fprintf(file, " dd %%2\n"); + fprintf(file, " dw %%2\n"); fprintf(file, "%%endmacro\n"); fprintf(file, "struc go4kFSTG_val\n"); fprintf(file, " .amount resd 1\n"); @@ -2289,7 +2618,7 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, fprintf(file, "struc go4k_instrument\n"); fprintf(file, " .release resd 1\n"); fprintf(file, " .note resd 1\n"); - fprintf(file, " .workspace resd 256\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"); @@ -2302,53 +2631,7 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, fprintf(file, " .global resb go4k_instrument.size * MAX_VOICES\n"); fprintf(file, " .size\n"); fprintf(file, "endstruc\n"); -#define INDEXED_PATTERN_VALUES__ -#ifdef INDEXED_PATTERN_VALUES - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // the pattern values - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - fprintf(file, "; //----------------------------------------------------------------------------------------\n"); - fprintf(file, "; // Pattern Values, sorted by quantity\n"); - fprintf(file, "; //----------------------------------------------------------------------------------------\n"); - fprintf(file, "%%ifdef USE_SECTIONS\n"); - fprintf(file, "section .g4kmuc0 data align=1\n"); - fprintf(file, "%%else\n"); - fprintf(file, "section .data\n"); - fprintf(file, "%%endif\n"); - fprintf(file, "go4k_pattern_values\n"); - std::map noteCountMap; - for (int i = 0; i < ReducedPatterns.size()/PatternSize; i++) - { - for (int j = 0; j < PatternSize; j++) - { - int note = ReducedPatterns[i*PatternSize+j]; - if (note == -1) - note = 1; - if (noteCountMap.find(note) != noteCountMap.end()) - { - noteCountMap[note] = noteCountMap[note] + 1; - } - else - { - noteCountMap[note] = 1; - } - } - } - std::list > noteIndexList; - std::map::iterator it; - for (it = noteCountMap.begin(); it != noteCountMap.end(); it++) - { - std::pair sval(it->second, it->first); - noteIndexList.push_back(sval); - } - noteIndexList.sort(); - std::list >::reverse_iterator rit; - fprintf(file, "\tdb\t"); - for (rit = noteIndexList.rbegin(); rit != noteIndexList.rend(); rit++) - { - fprintf(file, "%d, ", (*rit).second); - } -#endif + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // the patterns ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -2363,21 +2646,10 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, fprintf(file, "\tdb\t"); for (int j = 0; j < PatternSize; j++) { -#ifdef INDEXED_PATTERN_VALUES - int noteindex = 0; - for (rit = noteIndexList.rbegin(); rit != noteIndexList.rend(); rit++) - { - // TODO: check for hold - if (ReducedPatterns[i*PatternSize+j] == (*rit).second) - fprintf(file, "%d, ", noteindex); - noteindex++; - } -#else if (ReducedPatterns[i*PatternSize+j] >= 0) fprintf(file, "%d, ", ReducedPatterns[i*PatternSize+j]); else fprintf(file, "HLD, "); -#endif } fprintf(file, "\n"); } @@ -2391,16 +2663,39 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, fprintf(file, "section .data\n"); fprintf(file, "%%endif\n"); fprintf(file, "go4k_pattern_lists\n"); - for (int i = 0; i < MAX_INSTRUMENTS; i++) +#ifdef _8KLANG + // write primary plugins pattern indices + for (int i = 0; i < mergeMaxInst; i++) { - if (!InstrumentUsed[i]) continue; fprintf(file, "Instrument%dList\t\tdb\t", i); - for (int j = 0; j < PatternIndices[i].size(); j++) + for (int j = 0; j < mergeMaxPatterns; j++) { - fprintf(file, "%d, ", PatternIndices[i][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 @@ -2411,47 +2706,60 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, 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; - fprintf(file, "GO4K_BEGIN_CMDDEF(Instrument%d)\n", i); - for (int u = 0; u < MAX_SLOTS; u++) + 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) - fprintf(file, "\tdb GO4K_ENV_ID\n"); + sprintf(comstr, "\tdb GO4K_ENV_ID\n"); if (SynthObj.InstrumentValues[i][u][0] == M_VCO) - fprintf(file, "\tdb GO4K_VCO_ID\n"); + sprintf(comstr, "\tdb GO4K_VCO_ID\n"); if (SynthObj.InstrumentValues[i][u][0] == M_VCF) - fprintf(file, "\tdb GO4K_VCF_ID\n"); + sprintf(comstr, "\tdb GO4K_VCF_ID\n"); if (SynthObj.InstrumentValues[i][u][0] == M_DST) - fprintf(file, "\tdb GO4K_DST_ID\n"); + sprintf(comstr, "\tdb GO4K_DST_ID\n"); if (SynthObj.InstrumentValues[i][u][0] == M_DLL) - fprintf(file, "\tdb GO4K_DLL_ID\n"); + sprintf(comstr, "\tdb GO4K_DLL_ID\n"); if (SynthObj.InstrumentValues[i][u][0] == M_FOP) - fprintf(file, "\tdb GO4K_FOP_ID\n"); + 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) - fprintf(file, "\tdb GO4K_FST_ID\n"); + sprintf(comstr, "\tdb GO4K_FST_ID\n"); // global storage else - fprintf(file, "\tdb GO4K_FSTG_ID\n"); + sprintf(comstr, "\tdb GO4K_FSTG_ID\n"); } if (SynthObj.InstrumentValues[i][u][0] == M_PAN) - fprintf(file, "\tdb GO4K_PAN_ID\n"); + sprintf(comstr, "\tdb GO4K_PAN_ID\n"); if (SynthObj.InstrumentValues[i][u][0] == M_OUT) - fprintf(file, "\tdb GO4K_OUT_ID\n"); + sprintf(comstr, "\tdb GO4K_OUT_ID\n"); if (SynthObj.InstrumentValues[i][u][0] == M_ACC) - fprintf(file, "\tdb GO4K_ACC_ID\n"); + sprintf(comstr, "\tdb GO4K_ACC_ID\n"); if (SynthObj.InstrumentValues[i][u][0] == M_FLD) - fprintf(file, "\tdb GO4K_FLD_ID\n"); - } - fprintf(file, "GO4K_END_CMDDEF\n"); + sprintf(comstr, "\tdb GO4K_FLD_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_SLOTS; u++) + for (int u = 0; u < MAX_UNITS; u++) { if (SynthObj.GlobalValues[u][0] == M_ENV) fprintf(file, "\tdb GO4K_ENV_ID\n"); @@ -2496,22 +2804,31 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, 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; - fprintf(file, "GO4K_BEGIN_PARAMDEF(Instrument%d)\n", i); - for (int u = 0; u < MAX_SLOTS; u++) + 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]); - 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); + 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[10]; type[0] = 0; - char lfo[10]; lfo[0] = 0; + 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) @@ -2524,43 +2841,49 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, sprintf(type, "GATE"); if (v->flags & VCO_LFO) sprintf(lfo, "|LFO"); - fprintf(file, "\tGO4K_VCO\tTRANSPOSE(%d),DETUNE(%d),PHASE(%d),GATES(%d),COLOR(%d),SHAPE(%d),GAIN(%d),FLAGS(%s%s)\n", v->transpose, v->detune, v->phaseofs, v->gate, v->color, v->shape, v->gain, type, 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[10]; type[0] = 0; - if (v->type == VCF_LOWPASS) + 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 (v->type == VCF_HIGHPASS) + if (t == VCF_HIGHPASS) sprintf(type, "HIGHPASS"); - if (v->type == VCF_BANDPASS) + if (t == VCF_BANDPASS) sprintf(type, "BANDPASS"); - if (v->type == VCF_BANDSTOP) + if (t == VCF_BANDSTOP) sprintf(type, "BANDSTOP"); - if (v->type == VCF_ALLPASS) + if (t == VCF_ALLPASS) sprintf(type, "ALLPASS"); - if (v->type == VCF_PEAK) + if (t == VCF_PEAK) sprintf(type, "PEAK"); - fprintf(file, "\tGO4K_VCF\tFREQUENCY(%d),RESONANCE(%d),VCFTYPE(%s)\n", v->freq, v->res, type); + 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]); - fprintf(file, "\tGO4K_DST\tDRIVE(%d), SNHFREQ(%d)\n", v->drive, v->snhfreq); + 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()) { - fprintf(file, "\tGO4K_DLL\tPREGAIN(%d),DRY(%d),FEEDBACK(%d),DAMP(%d),FREQUENCY(%d),DEPTH(%d),DELAY(%d),COUNT(%d)\n", + 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 { - fprintf(file, "\tGO4K_DLL\tPREGAIN(%d),DRY(%d),FEEDBACK(%d),DAMP(%d),FREQUENCY(%d),DEPTH(%d),DELAY(%d),COUNT(%d) ; ERROR\n", + 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); } } @@ -2586,7 +2909,9 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, sprintf(type, "FOP_ADDP2"); if (v->flags == FOP_LOADNOTE) sprintf(type, "FOP_LOADNOTE"); - fprintf(file, "\tGO4K_FOP\tOP(%s)\n", type); + 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) { @@ -2601,7 +2926,15 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, if (SynthObj.InstrumentValues[i][e][0] == M_NONE) emptySkip++; } - fprintf(file, "\tGO4K_FST\tAMOUNT(%d),DEST(%d*MAX_WORKSPACE_SLOTS+%d)\n", v->amount, v->dest_unit-emptySkip, v->dest_slot ); + 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 @@ -2610,7 +2943,7 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, if (v->dest_stack == MAX_INSTRUMENTS) storestack = maxinst; else - storestack = InstrumentIndex[v->dest_stack]; + 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++) @@ -2629,46 +2962,57 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, // 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"); + sprintf(valstr, "\tGO4K_FSTG\tAMOUNT(0),DEST(7*4+go4k_instrument.workspace)\n"); } else { - fprintf(file, "\tGO4K_FSTG\tAMOUNT(%d),DEST(%d*go4k_instrument.size*MAX_VOICES+%d*MAX_WORKSPACE_SLOTS*4+%d*4+go4k_instrument.workspace)\n", v->amount, storestack, v->dest_unit-emptySkip, v->dest_slot); + 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]); - fprintf(file, "\tGO4K_PAN\tPANNING(%d)\n", v->panning); + 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]); - fprintf(file, "\tGO4K_OUT\tGAIN(%d), AUXSEND(%d)\n", v->gain, v->auxsend); + 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) - fprintf(file, "\tGO4K_ACC\tACCTYPE(OUTPUT)\n"); + sprintf(valstr, "\tGO4K_ACC\tACCTYPE(OUTPUT)\n"); else - fprintf(file, "\tGO4K_ACC\tACCTYPE(AUX)\n"); + sprintf(valstr, "\tGO4K_ACC\tACCTYPE(AUX)\n"); } if (SynthObj.InstrumentValues[i][u][0] == M_FLD) { FLD_valP v = (FLD_valP)(SynthObj.InstrumentValues[i][u]); - fprintf(file, "\tGO4K_FLD\tVALUE(%d)\n", v->value); + sprintf(valstr, "\tGO4K_FLD\tVALUE(%d)\n", v->value); } + + ValueString += valstr; } - fprintf(file, "GO4K_END_PARAMDEF\n"); + 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_SLOTS; u++) + for (int u = 0; u < MAX_UNITS; u++) { if (SynthObj.GlobalValues[u][0] == M_ENV) { @@ -2678,8 +3022,9 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, if (SynthObj.GlobalValues[u][0] == M_VCO) { VCO_valP v = (VCO_valP)(SynthObj.GlobalValues[u]); - char type[10]; type[0] = 0; - char lfo[10]; lfo[0] = 0; + 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) @@ -2692,30 +3037,36 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, sprintf(type, "GATE"); if (v->flags & VCO_LFO) sprintf(lfo, "|LFO"); - fprintf(file, "\tGO4K_VCO\tTRANSPOSE(%d),DETUNE(%d),PHASE(%d),GATES(%d),COLOR(%d),SHAPE(%d),GAIN(%d),FLAGS(%s%s)\n", v->transpose, v->detune, v->phaseofs, v->gate, v->color, v->shape, v->gain, type, 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[10]; type[0] = 0; - if (v->type == VCF_LOWPASS) + 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 (v->type == VCF_HIGHPASS) + if (t == VCF_HIGHPASS) sprintf(type, "HIGHPASS"); - if (v->type == VCF_BANDPASS) + if (t == VCF_BANDPASS) sprintf(type, "BANDPASS"); - if (v->type == VCF_BANDSTOP) + if (t == VCF_BANDSTOP) sprintf(type, "BANDSTOP"); - if (v->type == VCF_ALLPASS) + if (t == VCF_ALLPASS) sprintf(type, "ALLPASS"); - if (v->type == VCF_PEAK) + if (t == VCF_PEAK) sprintf(type, "PEAK"); - fprintf(file, "\tGO4K_VCF\tFREQUENCY(%d),RESONANCE(%d),VCFTYPE(%s)\n", v->freq, v->res, type); + 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)\n", v->drive, v->snhfreq); + 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) { @@ -2754,6 +3105,8 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, 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) @@ -2769,12 +3122,20 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, if (SynthObj.GlobalValues[e][0] == M_NONE) emptySkip++; } - fprintf(file, "\tGO4K_FST\tAMOUNT(%d),DEST(%d*MAX_WORKSPACE_SLOTS+%d)\n", v->amount, v->dest_unit-emptySkip, v->dest_slot ); + 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 ); } // global storage else { - int storestack = InstrumentIndex[v->dest_stack]; + 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++) @@ -2789,7 +3150,15 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, } else { - fprintf(file, "\tGO4K_FSTG\tAMOUNT(%d),DEST(%d*go4k_instrument.size*MAX_VOICES+%d*MAX_WORKSPACE_SLOTS*4+%d*4+go4k_instrument.workspace)\n", v->amount, storestack, v->dest_unit-emptySkip, v->dest_slot ); + 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() ); } } } @@ -2839,124 +3208,74 @@ void Go4kVSTi_SaveByteStream(HINSTANCE hInst, char* filename, int useenvlevels, fprintf(file, "%%endif\n"); fclose(file); - } -#ifdef EXPORT_OBJECT_FILE - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // extract resources and compile song - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - std::string compfile = path + "c4klang.exe"; - std::string asmfile = path + "4klang.asm"; - // First find and load the nasm compiler resource - HRSRC hResource = FindResource(hInst, MAKEINTRESOURCE(IDR_COMP_RES), "BINARY"); - HGLOBAL hFileResource = LoadResource(hInst, hResource); - // Now open and map this to a disk file - unsigned char *pcompres = (unsigned char *)LockResource(hFileResource); - DWORD dwSize = SizeofResource(hInst, hResource); - // write content - FILE *fcompfile = fopen(compfile.c_str(), "wb"); - int tindex = 0; - while (dwSize--) - { - unsigned char r = *pcompres++; - r -= CryptTable[tindex++]; - fwrite(&r, 1, 1, fcompfile); - } - fclose(fcompfile); - - // First find and load the asm resource - hResource = FindResource(hInst, MAKEINTRESOURCE(IDR_ASM_RES), "BINARY"); - hFileResource = LoadResource(hInst, hResource); - // Now open and map this to a disk file - unsigned char *pasmres = (unsigned char *)LockResource(hFileResource); - dwSize = SizeofResource(hInst, hResource); - // write content - FILE *fasmfile = fopen(asmfile.c_str(), "wb"); - tindex = 0; - while (dwSize--) - { - unsigned char r = *pasmres++; - r -= CryptTable[tindex++]; - fwrite(&r, 1, 1, fasmfile); - } - fclose(fasmfile); - - // compile object - char olddir[1024]; - GetCurrentDirectory(1024, olddir); - SetCurrentDirectory(path.c_str()); - - std::string comparg; - if (objformat == 0) // windows obj - { - comparg = "c4klang.exe 4klang.asm -fwin32 -o\"" + fpath + "\""; - } - if (objformat == 1) // linux obj - { - comparg = "c4klang.exe 4klang.asm -felf32 -o\"" + fpath + "\""; - } - if (objformat == 2) // macosx obj - { - comparg = "c4klang.exe 4klang.asm -fmacho32 -o\"" + fpath + "\""; - } - STARTUPINFO si; - PROCESS_INFORMATION pi; - ZeroMemory( &si, sizeof(si) ); - si.cb = sizeof(si); - ZeroMemory( &pi, sizeof(pi) ); - si.dwFlags = STARTF_USESHOWWINDOW; - si.wShowWindow = SW_HIDE; - // Start the child process. - if( !CreateProcess( NULL, // No module name (use command line). - (LPSTR)comparg.c_str(), // Command line. - NULL, // Process handle not inheritable. - NULL, // Thread handle not inheritable. - FALSE, // Set handle inheritance to FALSE. - 0, // No creation flags. - NULL, // Use parent's environment block. - NULL, // Use parent's starting directory. - &si, // Pointer to STARTUPINFO structure. - &pi ) // Pointer to PROCESS_INFORMATION structure. - ) - { - // delete temp files - DeleteFile(compfile.c_str()); - DeleteFile(asmfile.c_str()); - DeleteFile(incfile.c_str()); - SetCurrentDirectory(olddir); - free(CryptTable); - MessageBox( 0, "Compile failed", "Uuuups", MB_OK | MB_SETFOREGROUND); - return; - } - // Wait until child process exits. - WaitForSingleObject( pi.hProcess, INFINITE ); - // Close process and thread handles. - CloseHandle( pi.hProcess ); - CloseHandle( pi.hThread ); - // delete temp files - DeleteFile(compfile.c_str()); - DeleteFile(asmfile.c_str()); - DeleteFile(incfile.c_str()); - // restore old directory - SetCurrentDirectory(olddir); - free(CryptTable); + + // 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 = fpath.substr(0, fpath.size()-1) + "h"; + infofile = incfile.substr(0, incfile.size()-1) + "h"; else - infofile = fpath.substr(0, fpath.size()-3) + "h"; + 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); - fprintf(fnfofile, "#define MAX_PATTERNS %d\n", PatternIndices[0].size()); + 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)))); + 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) diff --git a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiCore.h b/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiCore.h index 57cc652..4d2f4df 100644 --- a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiCore.h +++ b/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiCore.h @@ -66,14 +66,12 @@ void Go4kVSTi_LoadUnit(char* filename, BYTE* slot); // save unit date from specified slot void Go4kVSTi_SaveUnit(char* filename, BYTE* slot); -#define EXPORT_OBJECT_FILE_ 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_SLOT_VALUES 32 - -#define MAX_SLOTS 32 +#define MAX_UNITS 64 +#define MAX_UNIT_SLOTS 16 enum UnitID { @@ -120,6 +118,7 @@ typedef struct ENV_val #define VCO_NOISE 0x08 #define VCO_LFO 0x10 #define VCO_GATE 0x20 +#define VCO_STEREO 0x40 typedef struct VCO_val { BYTE id; @@ -153,6 +152,7 @@ typedef struct VCO11_val #define VCF_BANDSTOP 0x3 #define VCF_ALLPASS 0x7 #define VCF_PEAK 0x8 +#define VCF_STEREO 0x10 typedef struct VCF_val { BYTE id; @@ -167,6 +167,7 @@ typedef struct DST_val BYTE id; BYTE drive; BYTE snhfreq; + BYTE stereo; // GUI STUFF } *DST_valP; @@ -213,17 +214,22 @@ typedef struct DLL10_val #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 dest; + BYTE type; // GUI STUFF char dest_stack; char dest_unit; @@ -269,7 +275,7 @@ typedef struct InstrumentWorkspace { DWORD release; DWORD note; - float workspace[256]; + float workspace[MAX_UNITS*MAX_UNIT_SLOTS]; float dlloutl; float dlloutr; float outl; @@ -280,8 +286,8 @@ typedef struct SynthObject { DWORD Polyphony; char InstrumentNames[MAX_INSTRUMENTS][64]; - BYTE InstrumentValues[MAX_INSTRUMENTS][MAX_SLOTS][MAX_SLOT_VALUES]; // 16 instruments a 32 slots a 32 dowrds - BYTE GlobalValues[MAX_SLOTS][MAX_SLOT_VALUES]; // 32 slots a 32 dwords + 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]; @@ -289,6 +295,7 @@ typedef struct SynthObject 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/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiGUI.cpp index 41d5da6..5157922 100644 --- a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiGUI.cpp +++ b/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiGUI.cpp @@ -29,9 +29,10 @@ 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_SLOT_VALUES]; +static DWORD UnitCopyBuffer[MAX_UNIT_SLOTS]; static int InstrumentScrollPos[MAX_INSTRUMENTS]; static int GlobalScrollPos; static int InitDone = false; @@ -183,17 +184,18 @@ char* GetUnitString(BYTE* unit, char* unitname) if (unit[0] == M_VCF) { VCF_valP val = (VCF_valP)unit; - if (val->type == VCF_LOWPASS) + int ft = val->type & ~VCF_STEREO; + if (ft == VCF_LOWPASS) sprintf(UnitDesc, " (%s F:%d)","Low", val->freq); - if (val->type == VCF_HIGHPASS) + if (ft == VCF_HIGHPASS) sprintf(UnitDesc, " (%s F:%d)","High", val->freq); - if (val->type == VCF_BANDPASS) + if (ft == VCF_BANDPASS) sprintf(UnitDesc, " (%s F:%d)","Band", val->freq); - if (val->type == VCF_BANDSTOP) + if (ft == VCF_BANDSTOP) sprintf(UnitDesc, " (%s F:%d)","Notch", val->freq); - if (val->type == VCF_PEAK) + if (ft == VCF_PEAK) sprintf(UnitDesc, " (%s F:%d)","Peak", val->freq); - if (val->type == VCF_ALLPASS) + if (ft == VCF_ALLPASS) sprintf(UnitDesc, " (%s F:%d)","All", val->freq); } if (unit[0] == M_FOP) @@ -217,6 +219,8 @@ char* GetUnitString(BYTE* unit, char* unitname) 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) { @@ -235,16 +239,24 @@ char* GetUnitString(BYTE* unit, char* unitname) } 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)", val->dest_unit+1, UnitModulationTargetShortNames[val->dest_id][val->dest_slot]); + 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)",val->dest_stack+1, val->dest_unit+1, UnitModulationTargetShortNames[val->dest_id][val->dest_slot]); + 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)", val->dest_unit+1, UnitModulationTargetShortNames[val->dest_id][val->dest_slot]); + sprintf(UnitDesc, " (U%d %s)%s", val->dest_unit+1, UnitModulationTargetShortNames[val->dest_id][val->dest_slot], st.c_str()); } } } @@ -329,8 +341,13 @@ BOOL CALLBACK MainDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM l 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++) @@ -381,6 +398,59 @@ BOOL CALLBACK MainDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM l } 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 (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)) { @@ -498,6 +568,7 @@ BOOL CALLBACK MainDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM l for (int i = 0; i < MAX_INSTRUMENTS; i++) { UpdateSignalCount(i); + LinkToInstrument[i] = 16; } UpdateControls(SelectedInstrument); } @@ -620,12 +691,14 @@ BOOL CALLBACK MainDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM l 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); } @@ -864,17 +937,17 @@ BOOL CALLBACK MainDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM l case IDC_UNIT_COPY: { if (SelectedTab == T_INSTRUMENT) - memcpy(UnitCopyBuffer, SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit], MAX_SLOT_VALUES); + memcpy(UnitCopyBuffer, SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit], MAX_UNIT_SLOTS); else - memcpy(UnitCopyBuffer, SynthObjP->GlobalValues[SelectedGUnit], MAX_SLOT_VALUES); + 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_SLOT_VALUES); + memcpy(SynthObjP->InstrumentValues[SelectedInstrument][SelectedIUnit], UnitCopyBuffer, MAX_UNIT_SLOTS); else - memcpy(SynthObjP->GlobalValues[SelectedGUnit], UnitCopyBuffer, MAX_SLOT_VALUES); + memcpy(SynthObjP->GlobalValues[SelectedGUnit], UnitCopyBuffer, MAX_UNIT_SLOTS); UpdateControls(SelectedInstrument); return TRUE; } @@ -960,6 +1033,7 @@ BOOL CALLBACK MainDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM l for (int i = 0; i < MAX_INSTRUMENTS; i++) { UpdateSignalCount(i); + LinkToInstrument[i] = 16; } UpdateControls(SelectedInstrument); } @@ -981,6 +1055,7 @@ BOOL CALLBACK MainDialogProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM l InstrumentScrollPos[SelectedInstrument] = 0; SynthObjP->InstrumentSignalValid[SelectedInstrument] = 0; Go4kVSTi_LoadInstrument(DropFileName, (char)SelectedInstrument); + LinkToInstrument[SelectedInstrument] = 16; } else { @@ -1245,7 +1320,7 @@ void Go4kVSTiGUI_Create(HINSTANCE hInst) timerID = SetTimer(DialogWnd, timer, 200, TimerProc); backupTimerID = SetTimer(DialogWnd, backupTimer, 60*1000, BackupTimerProc); - memset(UnitCopyBuffer, 0, MAX_SLOT_VALUES); + memset(UnitCopyBuffer, 0, MAX_UNIT_SLOTS); // set fst instrument elements const char* idest[] = {"Local", "Instrument 1", "Instrument 2", "Instrument 3", "Instrument 4", "Instrument 5", "Instrument 6", "Instrument 7", "Instrument 8", @@ -1313,6 +1388,38 @@ void Go4kVSTiGUI_Destroy() DestroyWindow(DialogWnd); } +void LinkInstrumentUnit(int selectedInstrument, int selectedIUnit) +{ + for (int i = 0; i < 16; i++) + { + if (LinkToInstrument[i] == selectedInstrument) + { + if (SynthObjP->InstrumentValues[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 + { + memcpy(SynthObjP->InstrumentValues[i][selectedIUnit], + SynthObjP->InstrumentValues[selectedInstrument][selectedIUnit], + MAX_UNIT_SLOTS); + } + } + } + Go4kVSTi_UpdateDelayTimes(); +} ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// @@ -1331,10 +1438,11 @@ void SetButtonParams(int uid, BYTE* val, WPARAM id, LPARAM lParam) 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; - else - v->flags = 0; + 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); @@ -1370,8 +1478,6 @@ void SetButtonParams(int uid, BYTE* val, WPARAM id, LPARAM lParam) if (IDC_VCO_SINE == res) { v->flags |= VCO_SINE; - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR), false); - EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_COLOR_VAL), false); } if (IDC_VCO_TRISAW == res) { @@ -1403,6 +1509,13 @@ void SetButtonParams(int uid, BYTE* val, WPARAM id, LPARAM lParam) 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); @@ -1413,6 +1526,8 @@ void SetButtonParams(int uid, BYTE* val, WPARAM id, LPARAM lParam) // adjust color slider InitSliderCenter(ModuleWnd[M_VCO], IDC_VCO_COLOR, 0, 128, v->color); } + // update signalcount + UpdateSignalCount(SelectedInstrument); } else if (uid == M_VCF) { @@ -1420,19 +1535,42 @@ void SetButtonParams(int uid, BYTE* val, WPARAM id, LPARAM lParam) 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 = VCF_LOWPASS; + v->type = stereo | VCF_LOWPASS; else if (res == IDC_VCF_HIGH) - v->type = VCF_HIGHPASS; + v->type = stereo | VCF_HIGHPASS; else if (res == IDC_VCF_BAND) - v->type = VCF_BANDPASS; + v->type = stereo | VCF_BANDPASS; else if (res == IDC_VCF_NOTCH) - v->type = VCF_BANDSTOP; + v->type = stereo | VCF_BANDSTOP; else if (res == IDC_VCF_PEAK) - v->type = VCF_PEAK; + v->type = stereo | VCF_PEAK; else if (res == IDC_VCF_ALL) - v->type = VCF_ALLPASS; + 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) { @@ -1504,7 +1642,7 @@ void SetButtonParams(int uid, BYTE* val, WPARAM id, LPARAM lParam) SynthObjP->GlobalSignalValid = 0; } FOP_valP v = (FOP_valP)val; - ButtonGroupChanged(IDC_FOP_POP, IDC_FOP_LOADNOTE, LOWORD(id), M_FOP, res); + ButtonGroupChanged(IDC_FOP_POP, IDC_FOP_MULP2, LOWORD(id), M_FOP, res); if (res) { v->flags = 1 + res - IDC_FOP_POP; @@ -1546,10 +1684,10 @@ void SetButtonParams(int uid, BYTE* val, WPARAM id, LPARAM lParam) 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_SLOTS; i++) + for (int i = 0; i < MAX_UNITS; i++) { char unitname[128], unitname2[128]; - sprintf(unitname, "%d: %s", i+1, GetUnitString(&units[i*MAX_SLOT_VALUES], unitname2)); + 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); @@ -1636,6 +1774,28 @@ void SetButtonParams(int uid, BYTE* val, WPARAM id, LPARAM lParam) 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) { @@ -1661,6 +1821,7 @@ bool ButtonPressed(WPARAM id, LPARAM 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) { @@ -1881,6 +2042,7 @@ bool ScrollbarChanged(HWND hwndDlg, WPARAM wParam, LPARAM 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) { @@ -1909,7 +2071,7 @@ void CheckModulations(int unit1, int unit2 = -1) // 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_SLOTS; u++) + for (int u = 0; u < MAX_UNITS; u++) { if (SynthObjP->InstrumentValues[i][u][0] == M_FST) { @@ -1959,7 +2121,7 @@ void CheckModulations(int unit1, int unit2 = -1) } } // now check the global slots - for (int u = 0; u < MAX_SLOTS; u++) + for (int u = 0; u < MAX_UNITS; u++) { if (SynthObjP->GlobalValues[u][0] == M_FST) { @@ -2008,7 +2170,7 @@ void CheckModulations(int unit1, int unit2 = -1) // 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_SLOTS; u++) + for (int u = 0; u < MAX_UNITS; u++) { if (SynthObjP->InstrumentValues[i][u][0] == M_FST) { @@ -2048,7 +2210,7 @@ void CheckModulations(int unit1, int unit2 = -1) } } // now check the global slots - for (int u = 0; u < MAX_SLOTS; u++) + for (int u = 0; u < MAX_UNITS; u++) { if (SynthObjP->GlobalValues[u][0] == M_FST) { @@ -2097,7 +2259,7 @@ bool StackButtonPressed(WPARAM id) if (SelectedTab == T_INSTRUMENT) { // check unit click - InterleavedButtonGroupChanged(IDC_ISTACK_UNIT1, MAX_SLOTS, LOWORD(id), res); + InterleavedButtonGroupChanged(IDC_ISTACK_UNIT1, MAX_UNITS, LOWORD(id), res); if (res >= 0) { SelectedIUnit = res; @@ -2105,7 +2267,7 @@ bool StackButtonPressed(WPARAM id) } // check down click - for (int i = 0; i < MAX_SLOTS; i++) + for (int i = 0; i < MAX_UNITS; i++) { WORD tid = IDC_ISTACK_DOWN1+i*6; if (LOWORD(id) == tid) @@ -2114,13 +2276,15 @@ bool StackButtonPressed(WPARAM id) 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_SLOTS; i++) + for (int i = 0; i < MAX_UNITS; i++) { WORD tid = IDC_ISTACK_UP1+i*6; if (LOWORD(id) == tid) @@ -2129,13 +2293,15 @@ bool StackButtonPressed(WPARAM id) 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_SLOTS; i++) + for (int i = 0; i < MAX_UNITS; i++) { WORD tid = IDC_ISTACK_SET1+i*6; if (LOWORD(id) == tid) @@ -2149,6 +2315,7 @@ bool StackButtonPressed(WPARAM id) Go4kVSTi_InitInstrumentSlot(SelectedInstrument, i, SetUnit); CheckModulations(i); SelectedIUnit = i; + LinkInstrumentUnit(SelectedInstrument, i); UpdateControls(SelectedInstrument); } } @@ -2158,7 +2325,7 @@ bool StackButtonPressed(WPARAM id) } // check reset click - for (int i = 0; i < MAX_SLOTS; i++) + for (int i = 0; i < MAX_UNITS; i++) { WORD tid = IDC_ISTACK_RESET1+i*6; if (LOWORD(id) == tid) @@ -2166,7 +2333,9 @@ bool StackButtonPressed(WPARAM id) 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); } @@ -2175,7 +2344,7 @@ bool StackButtonPressed(WPARAM id) else if (SelectedTab == T_GLOBAL) { // check unit click - InterleavedButtonGroupChanged(IDC_GSTACK_UNIT1, MAX_SLOTS, LOWORD(id), res); + InterleavedButtonGroupChanged(IDC_GSTACK_UNIT1, MAX_UNITS, LOWORD(id), res); if (res >= 0) { SelectedGUnit = res; @@ -2183,7 +2352,7 @@ bool StackButtonPressed(WPARAM id) } // check down click - for (int i = 0; i < MAX_SLOTS; i++) + for (int i = 0; i < MAX_UNITS; i++) { WORD tid = IDC_GSTACK_DOWN1+i*6; if (LOWORD(id) == tid) @@ -2198,7 +2367,7 @@ bool StackButtonPressed(WPARAM id) } // check up click - for (int i = 0; i < MAX_SLOTS; i++) + for (int i = 0; i < MAX_UNITS; i++) { WORD tid = IDC_GSTACK_UP1+i*6; if (LOWORD(id) == tid) @@ -2213,7 +2382,7 @@ bool StackButtonPressed(WPARAM id) } // check set click - for (int i = 0; i < MAX_SLOTS; i++) + for (int i = 0; i < MAX_UNITS; i++) { WORD tid = IDC_GSTACK_SET1+i*6; if (LOWORD(id) == tid) @@ -2235,7 +2404,7 @@ bool StackButtonPressed(WPARAM id) } // check reset click - for (int i = 0; i < MAX_SLOTS; i++) + for (int i = 0; i < MAX_UNITS; i++) { WORD tid = IDC_GSTACK_RESET1+i*6; if (LOWORD(id) == tid) @@ -2319,8 +2488,15 @@ void UpdateSignalCount(int channel) int valid = 1; int signalcount = 0; // check stack validity - for (int i = 0; i < MAX_SLOTS; i++) + 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) @@ -2335,12 +2511,28 @@ void UpdateSignalCount(int channel) 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_SLOTS; j++) + for (int j = i; j < MAX_UNITS; j++) { char txt[10]; sprintf(txt, "%d", signalcount); @@ -2369,15 +2561,31 @@ void UpdateSignalCount(int channel) 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_SLOTS; j++) + for (int j = i; j < MAX_UNITS; j++) { char txt[10]; sprintf(txt, "%d", signalcount); @@ -2393,7 +2601,7 @@ void UpdateSignalCount(int channel) { valid = 0; Go4kVSTi_ClearInstrumentWorkspace(channel); - for (int j = i; j < MAX_SLOTS; j++) + for (int j = i; j < MAX_UNITS; j++) { char txt[10]; sprintf(txt, "%d", signalcount); @@ -2427,6 +2635,15 @@ void UpdateSignalCount(int 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 @@ -2437,8 +2654,15 @@ void UpdateSignalCount(int channel) valid = 1; signalcount = 0; // check stack validity - for (int i = 0; i < MAX_SLOTS; i++) + 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) @@ -2453,12 +2677,28 @@ void UpdateSignalCount(int channel) 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_SLOTS; j++) + for (int j = i; j < MAX_UNITS; j++) { char txt[10]; sprintf(txt, "%d", signalcount); @@ -2487,15 +2727,31 @@ void UpdateSignalCount(int channel) 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_SLOTS; j++) + for (int j = i; j < MAX_UNITS; j++) { char txt[10]; sprintf(txt, "%d", signalcount); @@ -2511,7 +2767,7 @@ void UpdateSignalCount(int channel) { valid = 0; Go4kVSTi_ClearGlobalWorkspace(); - for (int j = i; j < MAX_SLOTS; j++) + for (int j = i; j < MAX_UNITS; j++) { char txt[10]; sprintf(txt, "%d", signalcount); @@ -2545,6 +2801,7 @@ void UpdateSignalCount(int channel) SetWindowText(GetDlgItem(DialogWnd, IDC_GSTACK_VALID), "Signal INVALID! Signal Count != 0 after last unit"); } } + SynthObjP->HighestSlotIndex[16] = highestSlotIndex; } void UpdateControls(int channel) @@ -2552,8 +2809,9 @@ 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_SLOTS; i++) + for (int i = 0; i < MAX_UNITS; i++) { // set unit text char unitname[128]; @@ -2562,8 +2820,8 @@ void UpdateControls(int channel) GetUnitString(SynthObjP->GlobalValues[i], unitname); SetWindowText(GetDlgItem(TabWnd[T_GLOBAL], IDC_GSTACK_UNIT1+i*6), unitname); } - InterleavedButtonGroupChanged(IDC_ISTACK_UNIT1, MAX_SLOTS, IDC_ISTACK_UNIT1+SelectedIUnit*6, res); - InterleavedButtonGroupChanged(IDC_GSTACK_UNIT1, MAX_SLOTS, IDC_GSTACK_UNIT1+SelectedGUnit*6, res); + 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); } @@ -2615,8 +2873,6 @@ void UpdateModule(int uid, BYTE* val) if (v->flags & VCO_SINE) { EnableWindow(GetDlgItem(ModuleWnd[M_VCO], IDC_VCO_SINE), 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_TRISAW) { @@ -2652,6 +2908,7 @@ void UpdateModule(int uid, BYTE* val) 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) { @@ -2663,18 +2920,22 @@ void UpdateModule(int uid, BYTE* val) // buttons DisableButtonGroup(IDC_VCF_LOW, IDC_VCF_ALL, M_VCF); - if (v->type == VCF_LOWPASS) + + int mode = v->type & ~VCF_STEREO; + if (mode == VCF_LOWPASS) EnableWindow(GetDlgItem(ModuleWnd[M_VCF], IDC_VCF_LOW), false); - else if (v->type == VCF_HIGHPASS) + else if (mode == VCF_HIGHPASS) EnableWindow(GetDlgItem(ModuleWnd[M_VCF], IDC_VCF_HIGH), false); - else if (v->type == VCF_BANDPASS) + else if (mode == VCF_BANDPASS) EnableWindow(GetDlgItem(ModuleWnd[M_VCF], IDC_VCF_BAND), false); - else if (v->type == VCF_BANDSTOP) + else if (mode == VCF_BANDSTOP) EnableWindow(GetDlgItem(ModuleWnd[M_VCF], IDC_VCF_NOTCH), false); - else if (v->type == VCF_PEAK) + else if (mode == VCF_PEAK) EnableWindow(GetDlgItem(ModuleWnd[M_VCF], IDC_VCF_PEAK), false); - else if (v->type == VCF_ALLPASS) + 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) { @@ -2683,6 +2944,7 @@ void UpdateModule(int uid, BYTE* val) 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) { @@ -2751,7 +3013,7 @@ void UpdateModule(int uid, BYTE* val) else if (uid == M_FOP) { FOP_valP v = (FOP_valP)val; - DisableButtonGroup(IDC_FOP_POP, IDC_FOP_LOADNOTE, M_FOP); + 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) @@ -2795,10 +3057,10 @@ void UpdateModule(int uid, BYTE* val) 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_SLOTS; i++) + for (int i = 0; i < MAX_UNITS; i++) { char unitname[128], unitname2[128]; - sprintf(unitname, "%d: %s", i+1, GetUnitString(&units[i*MAX_SLOT_VALUES], unitname2)); + 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); @@ -2814,13 +3076,22 @@ void UpdateModule(int uid, BYTE* val) else { EnableWindow(GetDlgItem(ModuleWnd[M_FST], IDC_FST_DESTINATION_SLOT), true); - DWORD unitid = units[v->dest_unit*MAX_SLOT_VALUES]; + 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) { @@ -2961,7 +3232,11 @@ void GetStreamFileName() {'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); diff --git a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiproc.cpp b/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiproc.cpp index e094917..5bb69db 100644 --- a/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiproc.cpp +++ b/4klang_source/Go4kVSTi/source/GoSynth/Go4kVSTiproc.cpp @@ -58,7 +58,7 @@ void Go4kVSTi::processAnyhow(float **inputs, float **outputs, long sampleFrames) 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; @@ -66,7 +66,7 @@ void Go4kVSTi::processAnyhow(float **inputs, float **outputs, long sampleFrames) if (m_currentEvents.size() > 0) { // for all events - for (unsigned int i = 0; i < m_currentEvents.size(); i++) + for (unsigned int i = 0; i < m_currentEvents.size(); i++) { // process samples until next event int todo = m_currentEvents[i]->deltaFrames - start; diff --git a/4klang_source/Go4kVSTi/win/4klang.asm b/4klang_source/Go4kVSTi/win/4klang.asm index ff2dd77..a1a93bf 100644 --- a/4klang_source/Go4kVSTi/win/4klang.asm +++ b/4klang_source/Go4kVSTi/win/4klang.asm @@ -47,7 +47,12 @@ 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 117*go4kDLL_wrk.size +_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 @@ -130,10 +135,12 @@ 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 ; //======================================================================================== @@ -279,8 +286,7 @@ go4kENV_func_do: mov eax, dword [ecx-8] ; // is the instrument in release mode (note off)? test eax, eax je go4kENV_func_process - mov al, ENV_STATE_RELEASE - mov dword [WRK+go4kENV_wrk.state], eax + 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 - @@ -384,8 +390,13 @@ section .g4kcods code align=1 section .text %endif go4kVCO_sine: - fxch ; // p c - fstp st1 ; // p + 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 @@ -462,11 +473,28 @@ export_func go4kVCO_func@0 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 @@ -476,6 +504,12 @@ go4kVCO_func_do: 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] @@ -562,6 +596,18 @@ go4kVCO_func_end: 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 @@ -590,16 +636,31 @@ export_func go4kVCF_func@0 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 - fld dword [edx+go4kVCF_val.freq] ; // f r in +%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 - fst dword [WRK+go4kVCF_wrk.freq] ; // f r in + 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 @@ -607,7 +668,7 @@ go4kVCF_func_do: fmul dword [WRK+go4kVCF_wrk.band] ; // r*b in-l' fsubp st1, st0 ; // h' fst dword [WRK+go4kVCF_wrk.high] ; // h' - fmul dword [WRK+go4kVCF_wrk.freq] ; // h'*f + fmul dword [esp-4] ; // h'*f fadd dword [WRK+go4kVCF_wrk.band] ; // b' fstp dword [WRK+go4kVCF_wrk.band] fldz @@ -630,15 +691,21 @@ go4kVCF_func_band: go4kVCF_func_peak: %ifdef GO4K_USE_VCF_PEAK test al, byte PEAK - jz short go4kVCF_func_end + 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 - - - - -%ifdef GO4K_USE_UNDENORMALIZE - fadd dword [c_0_5] ; add and sub small offset to prevent denormalization - fsub dword [c_0_5] -%endif ret %ifdef USE_SECTIONS @@ -658,10 +725,18 @@ section .text export_func go4kDST_func@0 %ifdef GO4K_USE_DST %ifdef GO4K_USE_DST_SH - push 2 -%else - push 1 -%endif + %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 @@ -671,6 +746,7 @@ export_func go4kDST_func@0 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 %ifdef GO4K_USE_DST_MOD_SH @@ -688,6 +764,21 @@ go4kDST_func_do: fstp dword [WRK+go4kDST_wrk.snhphase]; // in %endif ; // calc pregain and postgain +%ifdef GO4K_USE_DST_STEREO + test al, byte STEREO ; // outr inl + 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 %ifdef GO4K_USE_DST_MOD_DM fadd dword [WRK+go4kDST_wrk.dm] @@ -701,6 +792,12 @@ go4kDST_func_do: go4kDST_func_hold: fstp st0 ; // in fstp st0 +%ifdef GO4K_USE_DST_STEREO + test al, byte STEREO ; // outr inl + jz short go4kDST_func_monohold + fld dword [WRK+go4kDST_wrk.out2] ; // out2 +go4kDST_func_monohold: +%endif fld dword [WRK+go4kDST_wrk.out] ; // out ret %endif @@ -953,26 +1050,22 @@ go4kFOP_func_mul: jnz go4kFOP_func_addp2 fmul st1 ret -%ifdef GO4K_USE_FOP_LOADNOTE go4kFOP_func_addp2: dec eax jnz go4kFOP_func_loadnote faddp st2, st0 faddp st2, st0 ret -go4kFOP_func_loadnote: +go4kFOP_func_loadnote: + dec eax + jnz go4kFOP_func_mulp2 fild dword [ecx-4] fmul dword [c_i128] ret -%else -go4kFOP_func_addp2: - dec eax - jnz go4kFOP_func_dummy+1 ; // now this is no valid jump address (just to please the packer) but if we run in that case we're fucked up anyway - faddp st2, st0 -go4kFOP_func_dummy: - faddp st2, st0 - ret -%endif +go4kFOP_func_mulp2: + fmulp st2, st0 + fmulp st2, st0 + ret %ifdef USE_SECTIONS section .g4kcodh code align=1 @@ -989,13 +1082,23 @@ section .text ; // DIRTY : ; //---------------------------------------------------------------------------------------- export_func go4kFST_func@0 - push 2 + push 1 call go4kTransformValues fld dword [edx+go4kFST_val.amount] fsub dword [c_0_5] fadd st0 fmul st1 - fstp dword [ecx+eax*4] ; // eax already contains the destination from the go4kTransformValues call + 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 @@ -1041,30 +1144,39 @@ section .text ; // DIRTY : ; //---------------------------------------------------------------------------------------- export_func go4kFSTG_func@0 - push 5 + 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 - ret + lodsw + jmp go4kFSTG_func_testpop go4kFSTG_func_do: %endif fld dword [edx+go4kFST_val.amount] fsub dword [c_0_5] fadd st0 - fmul st1 - mov eax, dword [VAL-4] + 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] - fstp dword [go4k_synth_wrk+eax+go4k_instrument.size] + fst dword [go4k_synth_wrk+eax*4] + fstp dword [go4k_synth_wrk+eax*4+go4k_instrument.size] %else - fstp dword [go4k_synth_wrk+eax] -%endif - - ret - + 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 @@ -1117,7 +1229,7 @@ export_func go4kOUT_func@0 ;// l r push 2 call go4kTransformValues pushad - lea edi, [ecx+256*4] + 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 @@ -1158,13 +1270,13 @@ export_func go4kOUT_func@0 ;// l r fadd dword [WRK+go4kOUT_wrk.gm] ;// gm l r %endif fmulp st1, st0 ;// l' r - fstp dword [ecx+256*4+0] ;// 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+256*4+4] ;// - + fstp dword [ecx+MAX_UNITS*MAX_UNIT_SLOTS*4+4] ;// - %endif ret @@ -1248,7 +1360,7 @@ go4kUpdateInstrument_newNote: %endif pushad xor eax, eax - mov ecx, (8+256*4)/4 ; // clear only relase, note and workspace + 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 @@ -1476,6 +1588,9 @@ go4k_render_nogroove: 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 @@ -1507,7 +1622,7 @@ go4k_VM_process_loop: test eax, eax je go4k_VM_process_done ; // command byte = 0? so done call dword [eax*4+go4k_synth_commands] - add WRK, MAX_WORKSPACE_SLOTS*4 ; // go to next workspace slot + 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 diff --git a/4klang_source/Go4kVSTi/win/4klang.bin b/4klang_source/Go4kVSTi/win/4klang.bin index e016aa4..d5ba738 100644 Binary files a/4klang_source/Go4kVSTi/win/4klang.bin and b/4klang_source/Go4kVSTi/win/4klang.bin differ diff --git a/4klang_source/Go4kVSTi/win/4klang.inc b/4klang_source/Go4kVSTi/win/4klang.inc index 75b5461..0e1e355 100644 --- a/4klang_source/Go4kVSTi/win/4klang.inc +++ b/4klang_source/Go4kVSTi/win/4klang.inc @@ -52,22 +52,24 @@ %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_FOP_LOADNOTE ; // removing this will skip load note 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 @@ -86,11 +88,12 @@ ; // synth defines ; //---------------------------------------------------------------------------------------- %define MAX_DELAY 65536 -%define MAX_WORKSPACE_SLOTS 8 -%define GO4K_BEGIN_CMDDEF(def_name) -%define GO4K_END_CMDDEF db 0 -%define GO4K_BEGIN_PARAMDEF(def_name) -%define GO4K_END_PARAMDEF +%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 ; //---------------------------------------------------------------------------------------- @@ -168,6 +171,7 @@ GO4K_VCO_ID equ 2 %define NOISE 0x08 %define LFO 0x10 %define GATE 0x20 +%define VCO_STEREO 0x40 struc go4kVCO_val ;// unit paramters .transpose resd 1 @@ -197,6 +201,8 @@ struc go4kVCO_wrk .cm resd 1 .sm resd 1 .gm resd 1 +;// stero variables + .phase2 resd 1 .size endstruc ; //---------------------------------------------------------------------------------------- @@ -214,6 +220,7 @@ GO4K_VCF_ID equ 3 %define BANDSTOP 0x3 %define ALLPASS 0x7 %define PEAK 0x8 +%define STEREO 0x10 %define FREQUENCY(val) val %define RESONANCE(val) val %define VCFTYPE(val) val @@ -229,38 +236,54 @@ struc go4kVCF_wrk .low resd 1 .high resd 1 .band resd 1 - .freq resd 1 + .freq resd 1 ;// unused but kept so modulation target offsets stay same ;// modulation targets .fm resd 1 - .rm 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 2 +%macro GO4K_DST 3 db %1 %ifdef GO4K_USE_DST_SH db %2 -%endif + %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 ; //---------------------------------------------------------------------------------------- @@ -342,6 +365,7 @@ GO4K_FOP_ID equ 6 %define FOP_MUL 0x7 %define FOP_ADDP2 0x8 %define FOP_LOADNOTE 0x9 +%define FOP_MULP2 0xa struc go4kFOP_val .flags resd 1 .size @@ -355,10 +379,13 @@ endstruc GO4K_FST_ID equ 7 %macro GO4K_FST 2 db %1 - db %2 + 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 @@ -455,7 +482,7 @@ endstruc GO4K_FSTG_ID equ 12 %macro GO4K_FSTG 2 db %1 - dd %2 + dw %2 %endmacro struc go4kFSTG_val .amount resd 1 @@ -472,7 +499,7 @@ endstruc struc go4k_instrument .release resd 1 .note resd 1 - .workspace resd 256 + .workspace resd MAX_UNITS*MAX_UNIT_SLOTS .dlloutl resd 1 .dlloutr resd 1 .outl resd 1 @@ -723,18 +750,18 @@ section .data 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_WORKSPACE_SLOTS+2) + 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_WORKSPACE_SLOTS+2) - GO4K_FST AMOUNT(61),DEST(3*MAX_WORKSPACE_SLOTS+2) + 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) + 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) @@ -744,18 +771,18 @@ GO4K_BEGIN_PARAMDEF(Instrument0) 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_WORKSPACE_SLOTS+2) + 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_WORKSPACE_SLOTS+2) - GO4K_FST AMOUNT(60),DEST(3*MAX_WORKSPACE_SLOTS+2) + 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) + 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) @@ -765,18 +792,18 @@ GO4K_BEGIN_PARAMDEF(Instrument1) 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_WORKSPACE_SLOTS+2) + 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_WORKSPACE_SLOTS+2) - GO4K_FST AMOUNT(60),DEST(3*MAX_WORKSPACE_SLOTS+2) + 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) + 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) @@ -786,7 +813,7 @@ GO4K_BEGIN_PARAMDEF(Instrument2) 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_WORKSPACE_SLOTS+2) + 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) @@ -795,10 +822,10 @@ GO4K_BEGIN_PARAMDEF(Instrument3) 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_WORKSPACE_SLOTS+2) + 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) - GO4K_FST AMOUNT(80),DEST(6*MAX_WORKSPACE_SLOTS+1) + 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) @@ -819,10 +846,10 @@ GO4K_BEGIN_PARAMDEF(Instrument5) 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_WORKSPACE_SLOTS+2) + 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_WORKSPACE_SLOTS+1) - GO4K_FST AMOUNT(72),DEST(7*MAX_WORKSPACE_SLOTS+1) + 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) @@ -850,8 +877,8 @@ 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_WORKSPACE_SLOTS*4+4*4+go4k_instrument.workspace) - GO4K_FSTG AMOUNT(66),DEST(1*go4k_instrument.size*MAX_VOICES+10*MAX_WORKSPACE_SLOTS*4+4*4+go4k_instrument.workspace) + 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 diff --git a/4klang_source/Go4kVSTi/win/Go4kVSTi.rc b/4klang_source/Go4kVSTi/win/Go4kVSTi.rc index 7f83793..46834d3 100644 --- a/4klang_source/Go4kVSTi/win/Go4kVSTi.rc +++ b/4klang_source/Go4kVSTi/win/Go4kVSTi.rc @@ -16,10 +16,8 @@ // German (Germany) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_DEU) -#ifdef _WIN32 LANGUAGE LANG_GERMAN, SUBLANG_GERMAN #pragma code_page(1252) -#endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // @@ -37,7 +35,7 @@ IDR_ASM_RES BINARY "4klang.bin" 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.0.1" +CAPTION "Alcatraz - 4klang Synth Plugin - Version 3.11" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN PUSHBUTTON "Load Patch Data",IDC_LOAD_PATCH,13,13,70,14 @@ -46,9 +44,9 @@ BEGIN 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,33,56,8 + LTEXT "Instrument Name",IDC_STATIC,242,31,56,8 LTEXT "Instrument",IDC_STATIC,242,17,36,8 - EDITTEXT IDC_INSTRUMENT_NAME,301,30,84,14,ES_AUTOHSCROLL + 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 @@ -76,7 +74,7 @@ BEGIN 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,47 + 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 @@ -96,6 +94,8 @@ BEGIN 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 END IDD_VCO DIALOGEX 0, 0, 300, 170 @@ -126,6 +126,7 @@ BEGIN 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 @@ -151,12 +152,13 @@ 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,24,59,42,14,WS_DISABLED - PUSHBUTTON "High",IDC_VCF_HIGH,66,59,41,14 - PUSHBUTTON "Band",IDC_VCF_BAND,108,59,41,14 - PUSHBUTTON "Notch",IDC_VCF_NOTCH,150,59,41,14 - PUSHBUTTON "Peak",IDC_VCF_PEAK,192,59,41,14 - PUSHBUTTON "All",IDC_VCF_ALL,234,59,41,14 + 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 @@ -232,9 +234,10 @@ BEGIN 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, 320 +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 @@ -364,8 +367,136 @@ BEGIN 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,NOT WS_VISIBLE + 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 @@ -430,6 +561,70 @@ BEGIN 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 @@ -462,6 +657,38 @@ BEGIN 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 @@ -469,30 +696,31 @@ 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 "POP",IDC_FOP_POP,3,50,42,14 - PUSHBUTTON "PUSH",IDC_FOP_PUSH,3,33,42,14 - PUSHBUTTON "XCH",IDC_FOP_XCH,3,67,42,14 - PUSHBUTTON "+",IDC_FOP_ADD,3,84,42,14 - PUSHBUTTON "+/POP",IDC_FOP_ADDP,3,101,42,14 - PUSHBUTTON "*",IDC_FOP_MUL,3,118,42,14 - PUSHBUTTON "*/POP",IDC_FOP_MULP,3,135,42,14 - LTEXT "IN: a b c d -> OUT: a a b c d",IDC_STATIC,50,35,232,8 - LTEXT "IN: a b c d -> OUT: b c d",IDC_STATIC,50,52,196,8 - LTEXT "IN: a b c d -> OUT: b a c d",IDC_STATIC,50,69,214,8 - LTEXT "IN: a b c d -> OUT: a+b b c d",IDC_STATIC,50,86,216,8 - LTEXT "IN: a b c d -> OUT: a+b c d",IDC_STATIC,50,103,198,8 - LTEXT "IN: a b c d -> OUT: a*b b c d",IDC_STATIC,50,120,216,8 - LTEXT "IN: a b c d -> OUT: a*b c d",IDC_STATIC,50,137,198,8 - PUSHBUTTON "2+/POP",IDC_FOP_ADDP2,3,152,42,14 - LTEXT "IN: a b c d -> OUT: a+c b+d",IDC_STATIC,50,155,193,8 - GROUPBOX "",IDC_STATIC,0,27,299,22 - GROUPBOX "",IDC_STATIC,0,61,299,22 - GROUPBOX "",IDC_STATIC,0,95,299,22 - GROUPBOX "",IDC_STATIC,0,129,299,23 - GROUPBOX "",IDC_STATIC,0,147,299,21 - PUSHBUTTON "Load Note",IDC_FOP_LOADNOTE,3,16,42,14 - LTEXT "IN: a b c d -> OUT: note a b c d",IDC_STATIC,50,18,233,8 - GROUPBOX "",IDC_STATIC,0,10,299,22 + 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 @@ -509,6 +737,10 @@ BEGIN 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 @@ -532,7 +764,7 @@ BEGIN CTEXT " ",IDC_OUT_AUXSEND_VAL,242,86,48,12,SS_SUNKEN END -IDD_GLOBAL_STACK DIALOGEX 0, 0, 247, 320 +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 @@ -662,8 +894,136 @@ BEGIN 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,NOT WS_VISIBLE + 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 @@ -728,6 +1088,70 @@ BEGIN 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 @@ -760,6 +1184,38 @@ BEGIN 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 @@ -816,7 +1272,7 @@ END // #ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO +GUIDELINES DESIGNINFO BEGIN IDD_GO4KVSTIDIALOG, DIALOG BEGIN @@ -826,6 +1282,22 @@ BEGIN BOTTOMMARGIN, 334 END + IDD_VCO, DIALOG + BEGIN + END + + IDD_VCF, DIALOG + BEGIN + END + + IDD_DST, DIALOG + BEGIN + END + + IDD_FST, DIALOG + BEGIN + END + IDD_SET_DIALOG, DIALOG BEGIN LEFTMARGIN, 7 @@ -868,13 +1340,11 @@ END ///////////////////////////////////////////////////////////////////////////// -// English (U.S.) resources +// English (United States) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -#ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) -#endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// @@ -901,7 +1371,7 @@ END #endif // APSTUDIO_INVOKED -#endif // English (U.S.) resources +#endif // English (United States) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/4klang_source/Go4kVSTi/win/Go4kVSTi.sln b/4klang_source/Go4kVSTi/win/Go4kVSTi.sln index a905aad..07b77f6 100644 --- a/4klang_source/Go4kVSTi/win/Go4kVSTi.sln +++ b/4klang_source/Go4kVSTi/win/Go4kVSTi.sln @@ -1,6 +1,8 @@ -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "4klang", "Go4kVSTi.vcproj", "{107757EA-2FE1-4C5E-964F-DE7E482E253F}" +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +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 @@ -12,6 +14,10 @@ Global {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 diff --git a/4klang_source/Go4kVSTi/win/Go4kVSTi.vcxproj b/4klang_source/Go4kVSTi/win/Go4kVSTi.vcxproj new file mode 100644 index 0000000..6fe69f6 --- /dev/null +++ b/4klang_source/Go4kVSTi/win/Go4kVSTi.vcxproj @@ -0,0 +1,197 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + 4klang + {107757EA-2FE1-4C5E-964F-DE7E482E253F} + Go4kVSTi + + + + DynamicLibrary + false + false + + + DynamicLibrary + false + + + + + + + + + + + + + + + + <_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 new file mode 100644 index 0000000..41cc7d4 --- /dev/null +++ b/4klang_source/Go4kVSTi/win/Go4kVSTi.vcxproj.filters @@ -0,0 +1,78 @@ + + + + + {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.def b/4klang_source/Go4kVSTi/win/Go4kVSTi2.def new file mode 100644 index 0000000..44e6f21 --- /dev/null +++ b/4klang_source/Go4kVSTi/win/Go4kVSTi2.def @@ -0,0 +1,2 @@ +LIBRARY 8klang +EXPORTS main diff --git a/4klang_source/Go4kVSTi/win/Go4kVSTi2.rc b/4klang_source/Go4kVSTi/win/Go4kVSTi2.rc new file mode 100644 index 0000000..e8ba6da --- /dev/null +++ b/4klang_source/Go4kVSTi/win/Go4kVSTi2.rc @@ -0,0 +1,1388 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#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.11" +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 +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 + + +///////////////////////////////////////////////////////////////////////////// +// +// 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_DST, DIALOG + BEGIN + END + + IDD_FST, DIALOG + BEGIN + END + + IDD_SET_DIALOG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 179 + TOPMARGIN, 7 + BOTTOMMARGIN, 35 + 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 + +#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 new file mode 100644 index 0000000..2b1a784 --- /dev/null +++ b/4klang_source/Go4kVSTi/win/Go4kVSTi2.vcxproj @@ -0,0 +1,197 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + 8klang + {FA790F08-0B8E-43D9-A4B4-519AB01B820C} + Go4kVSTi2 + + + + DynamicLibrary + false + false + + + DynamicLibrary + false + + + + + + + + + + + + + + + + <_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 new file mode 100644 index 0000000..3f1018f --- /dev/null +++ b/4klang_source/Go4kVSTi/win/Go4kVSTi2.vcxproj.filters @@ -0,0 +1,78 @@ + + + + + {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/resource.h b/4klang_source/Go4kVSTi/win/resource.h index 7d92273..2791050 100644 --- a/4klang_source/Go4kVSTi/win/resource.h +++ b/4klang_source/Go4kVSTi/win/resource.h @@ -64,6 +64,7 @@ #define IDC_ISTACK_VALID 1040 #define IDC_GSTACK_VALID 1041 #define IDC_PATTERN_QUANT 1042 +#define IDC_INSTRUMENTLINK 1043 #define IDC_UNIT_RESET 1050 #define IDC_UNIT_COPY 1051 #define IDC_UNIT_PASTE 1052 @@ -89,6 +90,7 @@ #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 @@ -137,6 +139,7 @@ #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 @@ -177,12 +180,17 @@ #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 @@ -195,8 +203,8 @@ #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_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 @@ -389,6 +397,198 @@ #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 @@ -581,6 +781,199 @@ #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 // Next default values for new objects // @@ -588,7 +981,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 124 #define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 5000 +#define _APS_NEXT_CONTROL_VALUE 5005 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/readme.txt b/readme.txt index fc31fcf..39d0b29 100644 --- a/readme.txt +++ b/readme.txt @@ -86,7 +86,27 @@ same with the patch and song data. the more repetitive parameter values and the apart from that, try understanding what each unit effectively does before doing really fancy stuff with ist :) start simple and get more complex over time (especially when doing cross modulations from one instrument to another). +----------------------------- +Info for version 3.11 +----------------------------- +this is a more or less experimental version mainly for use in 8k context. + +version 3.11 also introduces a new file format to enable the new features. autoconvert again should happen automagically + +biggest change is the existence of a second plugin called 8klang. it basically is a second 4klang plugin just that ich can be used to have additional 16 instruments. +you can only have modulations across channels within each plugin (so not across the plugins). +when you record a song with both plugins active, be sure to stop recording on the 4klang plugin first, then on the 8klang plugin. +the 8klang plugin will then try to merge things (thats the experimental part, it did work for us in 8ks so far, but you never know :)) + +also a couple of new features are available: +- extension to 64 slots for each instrument. +- stereo flags for some nodes where possible (oscillator, filter, distortion) +- some additions to the arithmetic unit +- instrument link option, so when you have the same instrument loaded in several channels for e.g. playing chords you can now change one instrument and the others will apply the same changes. + +a nice tutorial for some of those features and sound design in general can be found here (thank you wayfinder): +https://www.youtube.com/watch?v=wP__g_9FT4M for questions, bug reports, rants ... mail to: atz4klangATuntergrundDOTnet or catch us on IRC (#atz on IRCNet)