bits 32 ; //---------------------------------------------------------------------------------------- ; // useful macros ; //---------------------------------------------------------------------------------------- ; // export function (make it accessable from main.cpp) ; //---------------------------------------------------------------------------------------- %macro export_func 1 global _%1 _%1: %endmacro %define USE_SECTIONS ; //---------------------------------------------------------------------------------------- ; // basic defines for the song/synth ; //---------------------------------------------------------------------------------------- ;%define AUTHORING ; Use to export the current tick being rendered ;%define SINGLE_TICK_RENDERING ; Use to render single tick on _4klang_render invocation ( requires AUTHORING enabled ) %define SAMPLE_RATE 44100 %define MAX_INSTRUMENTS 1 %define MAX_VOICES 1 %define HLD 1 ; // can be adjusted to give crinkler some other possibilities %define BPM 100 %define MAX_PATTERNS 1 %define PATTERN_SIZE_SHIFT 4 %define PATTERN_SIZE (1 << PATTERN_SIZE_SHIFT) %define MAX_TICKS (MAX_PATTERNS*PATTERN_SIZE) %define SAMPLES_PER_TICK (SAMPLE_RATE*4*60/(BPM*16)) %define DEF_LFO_NORMALIZE 0.000038 %define MAX_SAMPLES (SAMPLES_PER_TICK*MAX_TICKS) ; //---------------------------------------------------------------------------------------- ; // some defines for unit usage, which reduce synth code size ; //---------------------------------------------------------------------------------------- ;%define GO4K_USE_16BIT_OUTPUT ; // removing this will output to 32bit floating point buffer ;%define GO4K_USE_GROOVE_PATTERN ; // removing this skips groove pattern code ;%define GO4K_USE_ENVELOPE_RECORDINGS ; // removing this skips envelope recording code ;%define GO4K_USE_NOTE_RECORDINGS ; // removing this skips note recording code %define GO4K_USE_UNDENORMALIZE ; // removing this skips denormalization code in the units %define GO4K_CLIP_OUTPUT ; // removing this skips clipping code for the final output %define GO4K_USE_DST ; // removing this will skip DST unit %define GO4K_USE_DLL ; // removing this will skip DLL unit %define GO4K_USE_PAN ; // removing this will skip PAN unit %define GO4K_USE_GLOBAL_DLL ; // removing this will skip global dll processing %define GO4K_USE_FSTG ; // removing this will skip global store unit %define GO4K_USE_FLD ; // removing this will skip float load unit %define GO4K_USE_GLITCH ; // removing this will skip GLITCH unit %define GO4K_USE_ENV_CHECK ; // removing this skips checks if processing is needed %define GO4K_USE_ENV_MOD_GM ; // removing this will skip env gain modulation code %define GO4K_USE_ENV_MOD_ADR ; // removing this will skip env attack/decay/release modulation code %define GO4K_USE_VCO_CHECK ; // removing this skips checks if processing is needed %define GO4K_USE_VCO_PHASE_OFFSET ; // removing this will skip initial phase offset code %define GO4K_USE_VCO_SHAPE ; // removing this skips waveshaping code %define GO4K_USE_VCO_GATE ; // removing this skips gate code %define GO4K_USE_VCO_MOD_FM ; // removing this skips frequency modulation code %define GO4K_USE_VCO_MOD_PM ; // removing this skips phase modulation code %define GO4K_USE_VCO_MOD_TM ; // removing this skips transpose modulation code %define GO4K_USE_VCO_MOD_DM ; // removing this skips detune modulation code %define GO4K_USE_VCO_MOD_CM ; // removing this skips color modulation code %define GO4K_USE_VCO_MOD_GM ; // removing this skips gain modulation code %define GO4K_USE_VCO_MOD_SM ; // removing this skips shaping modulation code %define GO4K_USE_VCO_STEREO ; // removing this skips stereo code %define GO4K_USE_VCF_CHECK ; // removing this skips checks if processing is needed %define GO4K_USE_VCF_MOD_FM ; // removing this skips frequency modulation code %define GO4K_USE_VCF_MOD_RM ; // removing this skips resonance modulation code %define GO4K_USE_VCF_HIGH ; // removing this skips code for high output %define GO4K_USE_VCF_BAND ; // removing this skips code for band output %define GO4K_USE_VCF_PEAK ; // removing this skips code for peak output %define GO4K_USE_VCF_STEREO ; // removing this skips code for stereo filter output %define GO4K_USE_DST_CHECK ; // removing this skips checks if processing is needed %define GO4K_USE_DST_SH ; // removing this skips sample and hold code %define GO4K_USE_DST_MOD_DM ; // removing this skips distortion modulation code %define GO4K_USE_DST_MOD_SH ; // removing this skips sample and hold modulation code %define GO4K_USE_DST_STEREO ; // removing this skips stereo processing %define GO4K_USE_DLL_NOTE_SYNC ; // removing this will skip delay length adjusting code (karplus strong) %define GO4K_USE_DLL_CHORUS ; // removing this will skip delay chorus/flanger code %define GO4K_USE_DLL_CHORUS_CLAMP ; // removing this will skip chorus lfo phase clamping %define GO4K_USE_DLL_DAMP ; // removing this will skip dll damping code %define GO4K_USE_DLL_DC_FILTER ; // removing this will skip dll dc offset removal code %define GO4K_USE_FSTG_CHECK ; // removing this skips checks if processing is needed %define GO4K_USE_PAN_MOD ; // removing this will skip panning modulation code %define GO4K_USE_OUT_MOD_AM ; // removing this skips output aux send modulation code %define GO4K_USE_OUT_MOD_GM ; // removing this skips output gain modulation code %define GO4K_USE_WAVESHAPER_CLIP ; // removing this will skip clipping code %define GO4K_USE_FLD_MOD_VM ; // removing this will skip float load modulation code %define GO4K_USE_DLL_MOD ; // define this to enable modulations for delay line %define GO4K_USE_DLL_MOD_PM ; // define this to enable pregain modulation for delay line %define GO4K_USE_DLL_MOD_FM ; // define this to enable feebback modulation for delay line %define GO4K_USE_DLL_MOD_IM ; // define this to enable dry modulation for delay line %define GO4K_USE_DLL_MOD_DM ; // define this to enable damping modulation for delay line %define GO4K_USE_DLL_MOD_SM ; // define this to enable lfo freq modulation for delay line %define GO4K_USE_DLL_MOD_AM ; // define this to enable lfo depth modulation for delay line ; //---------------------------------------------------------------------------------------- ; // synth defines ; //---------------------------------------------------------------------------------------- %define MAX_DELAY 65536 %define MAX_UNITS 64 %define MAX_UNIT_SLOTS 16 %define GO4K_BEGIN_CMDDEF(def_name) %define GO4K_END_CMDDEF db 0 %define GO4K_BEGIN_PARAMDEF(def_name) %define GO4K_END_PARAMDEF ; //---------------------------------------------------------------------------------------- ; // ENV structs ; //---------------------------------------------------------------------------------------- GO4K_ENV_ID equ 1 %macro GO4K_ENV 5 db %1 db %2 db %3 db %4 db %5 %endmacro %define ATTAC(val) val %define DECAY(val) val %define SUSTAIN(val) val %define RELEASE(val) val %define GAIN(val) val struc go4kENV_val ;// unit paramters .attac resd 1 .decay resd 1 .sustain resd 1 .release resd 1 .gain resd 1 .size endstruc struc go4kENV_wrk ;// work variables .state resd 1 .level resd 1 ;// modulation targets .gm resd 1 .am resd 1 .dm resd 1 .sm resd 1 .rm resd 1 .size endstruc %define ENV_STATE_ATTAC 0 %define ENV_STATE_DECAY 1 %define ENV_STATE_SUSTAIN 2 %define ENV_STATE_RELEASE 3 %define ENV_STATE_OFF 4 ; //---------------------------------------------------------------------------------------- ; // VCO structs ; //---------------------------------------------------------------------------------------- GO4K_VCO_ID equ 2 %macro GO4K_VCO 8 db %1 db %2 %ifdef GO4K_USE_VCO_PHASE_OFFSET db %3 %endif %ifdef GO4K_USE_VCO_GATE db %4 %endif db %5 %ifdef GO4K_USE_VCO_SHAPE db %6 %else %endif db %7 db %8 %endmacro %define TRANSPOSE(val) val %define DETUNE(val) val %define PHASE(val) val %define GATES(val) val %define COLOR(val) val %define SHAPE(val) val %define FLAGS(val) val %define SINE 0x01 %define TRISAW 0x02 %define PULSE 0x04 %define NOISE 0x08 %define LFO 0x10 %define GATE 0x20 %define VCO_STEREO 0x40 struc go4kVCO_val ;// unit paramters .transpose resd 1 .detune resd 1 %ifdef GO4K_USE_VCO_PHASE_OFFSET .phaseofs resd 1 %endif %ifdef GO4K_USE_VCO_GATE .gate resd 1 %endif .color resd 1 %ifdef GO4K_USE_VCO_SHAPE .shape resd 1 %endif .gain resd 1 .flags resd 1 .size endstruc struc go4kVCO_wrk ;// work variables .phase resd 1 ;// modulation targets .tm resd 1 .dm resd 1 .fm resd 1 .pm resd 1 .cm resd 1 .sm resd 1 .gm resd 1 ;// stero variables .phase2 resd 1 .size endstruc ; //---------------------------------------------------------------------------------------- ; // VCF structs ; //---------------------------------------------------------------------------------------- GO4K_VCF_ID equ 3 %macro GO4K_VCF 3 db %1 db %2 db %3 %endmacro %define LOWPASS 0x1 %define HIGHPASS 0x2 %define BANDPASS 0x4 %define BANDSTOP 0x3 %define ALLPASS 0x7 %define PEAK 0x8 %define STEREO 0x10 %define FREQUENCY(val) val %define RESONANCE(val) val %define VCFTYPE(val) val struc go4kVCF_val ;// unit paramters .freq resd 1 .res resd 1 .type resd 1 .size endstruc struc go4kVCF_wrk ;// work variables .low resd 1 .high resd 1 .band resd 1 .freq resd 1 ;// unused but kept so modulation target offsets stay same ;// modulation targets .fm resd 1 .rm resd 1 ;// stereo variables .low2 resd 1 .high2 resd 1 .band2 resd 1 .size endstruc ; //---------------------------------------------------------------------------------------- ; // DST structs ; //---------------------------------------------------------------------------------------- GO4K_DST_ID equ 4 %macro GO4K_DST 3 db %1 %ifdef GO4K_USE_DST_SH db %2 %ifdef GO4K_USE_DST_STEREO db %3 %endif %else %ifdef GO4K_USE_DST_STEREO db %3 %endif %endif %endmacro %define DRIVE(val) val %define SNHFREQ(val) val %define FLAGS(val) val struc go4kDST_val ;// unit paramters .drive resd 1 %ifdef GO4K_USE_DST_SH .snhfreq resd 1 %endif .flags resd 1 .size endstruc struc go4kDST_wrk ;// work variables .out resd 1 .snhphase resd 1 ;// modulation targets .dm resd 1 .sm resd 1 ;// stereo variables .out2 resd 1 .size endstruc ; //---------------------------------------------------------------------------------------- ; // DLL structs ; //---------------------------------------------------------------------------------------- GO4K_DLL_ID equ 5 %macro GO4K_DLL 8 db %1 db %2 db %3 %ifdef GO4K_USE_DLL_DAMP db %4 %endif %ifdef GO4K_USE_DLL_CHORUS db %5 db %6 %endif db %7 db %8 %endmacro %define PREGAIN(val) val %define DRY(val) val %define FEEDBACK(val) val %define DEPTH(val) val %define DAMP(val) val %define DELAY(val) val %define COUNT(val) val struc go4kDLL_val ;// unit paramters .pregain resd 1 .dry resd 1 .feedback resd 1 %ifdef GO4K_USE_DLL_DAMP .damp resd 1 %endif %ifdef GO4K_USE_DLL_CHORUS .freq resd 1 .depth %endif .delay resd 1 .count resd 1 .size endstruc struc go4kDLL_wrk ;// work variables .index resd 1 .store resd 1 .dcin resd 1 .dcout resd 1 .phase resd 1 ;// the delay buffer .buffer resd MAX_DELAY .size endstruc struc go4kDLL_wrk2 ;// modulation targets .pm resd 1 .fm resd 1 .im resd 1 .dm resd 1 .sm resd 1 .am resd 1 .size endstruc ; //---------------------------------------------------------------------------------------- ; // FOP structs ; //---------------------------------------------------------------------------------------- GO4K_FOP_ID equ 6 %macro GO4K_FOP 1 db %1 %endmacro %define OP(val) val %define FOP_POP 0x1 %define FOP_ADDP 0x2 %define FOP_MULP 0x3 %define FOP_PUSH 0x4 %define FOP_XCH 0x5 %define FOP_ADD 0x6 %define FOP_MUL 0x7 %define FOP_ADDP2 0x8 %define FOP_LOADNOTE 0x9 %define FOP_MULP2 0xa struc go4kFOP_val .flags resd 1 .size endstruc struc go4kFOP_wrk .size endstruc ; //---------------------------------------------------------------------------------------- ; // FST structs ; //---------------------------------------------------------------------------------------- GO4K_FST_ID equ 7 %macro GO4K_FST 2 db %1 dw %2 %endmacro %define AMOUNT(val) val %define DEST(val) val %define FST_SET 0x0000 %define FST_ADD 0x4000 %define FST_POP 0x8000 struc go4kFST_val .amount resd 1 .op1 resd 1 .size endstruc struc go4kFST_wrk .size endstruc ; //---------------------------------------------------------------------------------------- ; // PAN structs ; //---------------------------------------------------------------------------------------- GO4K_PAN_ID equ 8 %macro GO4K_PAN 1 %ifdef GO4K_USE_PAN db %1 %endif %endmacro %define PANNING(val) val struc go4kPAN_val %ifdef GO4K_USE_PAN .panning resd 1 %endif .size endstruc struc go4kPAN_wrk ;// modulation targets .pm resd 1 .size endstruc ; //---------------------------------------------------------------------------------------- ; // OUT structs ; //---------------------------------------------------------------------------------------- GO4K_OUT_ID equ 9 %macro GO4K_OUT 2 db %1 %ifdef GO4K_USE_GLOBAL_DLL db %2 %endif %endmacro %define AUXSEND(val) val struc go4kOUT_val .gain resd 1 %ifdef GO4K_USE_GLOBAL_DLL .auxsend resd 1 %endif .size endstruc struc go4kOUT_wrk ;// modulation targets .am resd 1 .gm resd 1 .size endstruc ; //---------------------------------------------------------------------------------------- ; // ACC structs (this is for the synth def only) ; //---------------------------------------------------------------------------------------- GO4K_ACC_ID equ 10 %macro GO4K_ACC 1 db %1 %endmacro %define OUTPUT 0 %define AUX 8 %define ACCTYPE(val) val struc go4kACC_val .acctype resd 1 .size endstruc struc go4kACC_wrk .size endstruc %ifdef GO4K_USE_FLD ; //---------------------------------------------------------------------------------------- ; // FLD structs ; //---------------------------------------------------------------------------------------- GO4K_FLD_ID equ 11 %macro GO4K_FLD 1 db %1 %endmacro %define VALUE(val) val struc go4kFLD_val .value resd 1 .size endstruc struc go4kFLD_wrk ;// modulation targets .vm resd 1 .size endstruc %endif %ifdef GO4K_USE_GLITCH ; //---------------------------------------------------------------------------------------- ; // GLITCH structs ; //---------------------------------------------------------------------------------------- GO4K_GLITCH_ID equ 12 %macro GO4K_GLITCH 5 db %1 db %2 db %3 db %4 db %5 %endmacro %define ACTIVE(val) val %define SLICEFACTOR(val)val %define PITCHFACTOR(val)val %define SLICESIZE(val) val struc go4kGLITCH_val ;// unit paramters .active resd 1 .dry resd 1 .dsize resd 1 .dpitch resd 1 .slicesize resd 1 .size endstruc struc go4kGLITCH_wrk ;// work variables .index resd 1 .store resd 1 .slizesize resd 1 .slicepitch resd 1 .unused resd 1 ;// the delay buffer .buffer resd MAX_DELAY .size endstruc struc go4kGLITCH_wrk2 ;// modulation targets .am resd 1 .dm resd 1 .sm resd 1 .pm resd 1 .size endstruc %endif %ifdef GO4K_USE_FSTG ; //---------------------------------------------------------------------------------------- ; // FSTG structs ; //---------------------------------------------------------------------------------------- GO4K_FSTG_ID equ 13 %macro GO4K_FSTG 2 db %1 dw %2 %endmacro struc go4kFSTG_val .amount resd 1 .op1 resd 1 .size endstruc struc go4kFSTG_wrk .size endstruc %endif ; //---------------------------------------------------------------------------------------- ; // Voice struct ; //---------------------------------------------------------------------------------------- struc go4k_instrument .release resd 1 .note resd 1 .workspace resd MAX_UNITS*MAX_UNIT_SLOTS .dlloutl resd 1 .dlloutr resd 1 .outl resd 1 .outr resd 1 .size endstruc ; //---------------------------------------------------------------------------------------- ; // Synth struct ; //---------------------------------------------------------------------------------------- struc go4k_synth .instruments resb go4k_instrument.size * MAX_INSTRUMENTS * MAX_VOICES .global resb go4k_instrument.size * MAX_VOICES .size endstruc ; //---------------------------------------------------------------------------------------- ; // Pattern Data, reduced by 967 patterns ; //---------------------------------------------------------------------------------------- %ifdef USE_SECTIONS section .g4kmuc1 data align=1 %else section .data align=1 %endif go4k_patterns db 64, HLD, HLD, HLD, HLD, HLD, HLD, HLD, 0, 0, 0, 0, 0, 0, 0, 0, go4k_patterns_end ; //---------------------------------------------------------------------------------------- ; // Pattern Index List ; //---------------------------------------------------------------------------------------- %ifdef USE_SECTIONS section .g4kmuc2 data align=1 %else section .data %endif go4k_pattern_lists Instrument0List db 0, go4k_pattern_lists_end ; //---------------------------------------------------------------------------------------- ; // Instrument Commands ; //---------------------------------------------------------------------------------------- %ifdef USE_SECTIONS section .g4kmuc3 data align=1 %else section .data %endif go4k_synth_instructions GO4K_BEGIN_CMDDEF(Instrument0) db GO4K_FLD_ID db GO4K_FLD_ID db GO4K_FLD_ID db GO4K_FOP_ID db GO4K_OUT_ID GO4K_END_CMDDEF ;// global commands GO4K_BEGIN_CMDDEF(Global) db GO4K_ACC_ID db GO4K_OUT_ID GO4K_END_CMDDEF go4k_synth_instructions_end ; //---------------------------------------------------------------------------------------- ; // Intrument Data ; //---------------------------------------------------------------------------------------- %ifdef USE_SECTIONS section .g4kmuc4 data align=1 %else section .data %endif go4k_synth_parameter_values GO4K_BEGIN_PARAMDEF(Instrument0) GO4K_FLD VALUE(32) GO4K_FLD VALUE(96) GO4K_FLD VALUE(0) GO4K_FOP OP(FOP_POP) GO4K_OUT GAIN(128), AUXSEND(0) GO4K_END_PARAMDEF ;// global parameters GO4K_BEGIN_PARAMDEF(Global) GO4K_ACC ACCTYPE(OUTPUT) GO4K_OUT GAIN(128), AUXSEND(0) GO4K_END_PARAMDEF go4k_synth_parameter_values_end ; //---------------------------------------------------------------------------------------- ; // Delay/Reverb Times ; //---------------------------------------------------------------------------------------- %ifdef USE_SECTIONS section .g4kmuc5 data align=1 %else section .data %endif %ifdef GO4K_USE_DLL global _go4k_delay_times _go4k_delay_times dw 0 %endif section .data global _test_max_samples _test_max_samples dd MAX_SAMPLES %include "../src/4klang.inc"