From 342f91c6cab68802f8aa05aaae745af00a9b4a9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petri=20J=C3=A4rvisalo?= Date: Tue, 4 Jun 2024 21:06:35 +0300 Subject: [PATCH] tranaa!! --- 4kdemo.compofiller | 2 +- 4klang.asm | 199 ++++++++++++++++++--------- 4klang.h | 6 +- 4klang.inc | 6 +- 4klang.yml | 320 ++++++++++++++++++++++++++++++------------- base.config | 8 +- music/4k_house.xrns | Bin 9927 -> 10765 bytes music/4k_trance.xrns | Bin 0 -> 22110 bytes music/DiscoTom.yml | 25 ++++ music/SuperSaw.yml | 60 ++++++++ shader_minified.h | 188 ++++++++++++------------- 11 files changed, 547 insertions(+), 267 deletions(-) create mode 100644 music/4k_trance.xrns create mode 100644 music/DiscoTom.yml create mode 100644 music/SuperSaw.yml diff --git a/4kdemo.compofiller b/4kdemo.compofiller index a1db361..baa5bd0 100644 --- a/4kdemo.compofiller +++ b/4kdemo.compofiller @@ -6,7 +6,7 @@ PROJECT_INFO_FILE=prod.nfo PROJECT_SCREENSHOT= # Currently active config file name -ACTIVE_CONFIG=base.config +ACTIVE_CONFIG=minified.config # ------- GUI options/preferences -------- # Automatically rebuild DLLs when things have changed? diff --git a/4klang.asm b/4klang.asm index c5bd449..219a58d 100644 --- a/4klang.asm +++ b/4klang.asm @@ -1,6 +1,6 @@ -%define SU_LENGTH_IN_SAMPLES 1550944 +%define SU_LENGTH_IN_SAMPLES 2703680 %define SU_SAMPLE_RATE 44100 -%define SU_BPM 116. +%define SU_BPM 137. ;------------------------------------------------------------------------------- ; unit struct @@ -61,7 +61,7 @@ endstruc section .synth_object bss align=256 su_synth_obj: resb su_synthworkspace.size - resb 20*su_delayline_wrk.size + resb 40*su_delayline_wrk.size ;------------------------------------------------------------------------------- @@ -76,7 +76,7 @@ global _su_render_song@4 _su_render_song@4: pushad ; Stack: edi, esi, ebp, esp, ebx, edx, ecx, eax, retaddr_su_render_song, OutputBufPtr xor eax, eax - push 16 ; Stack: VoiceTrackBitmask, edi, esi, ebp, esp, ebx, edx, ecx, eax, retaddr_su_render_song, OutputBufPtr + push 20752 ; Stack: VoiceTrackBitmask, edi, esi, ebp, esp, ebx, edx, ecx, eax, retaddr_su_render_song, OutputBufPtr push 1 ; Stack: RandSeed, VoiceTrackBitmask, edi, esi, ebp, esp, ebx, edx, ecx, eax, retaddr_su_render_song, OutputBufPtr push eax ; Stack: GlobalTick, RandSeed, VoiceTrackBitmask, edi, esi, ebp, esp, ebx, edx, ecx, eax, retaddr_su_render_song, OutputBufPtr su_render_rowloop: ; loop through every row in the song @@ -85,8 +85,8 @@ su_render_rowloop: ; loop through every row in the song xor eax, eax ; ecx is the current sample within row su_render_sampleloop: ; loop through every sample in the row push eax ; Stack: Sample, Row, GlobalTick, RandSeed, VoiceTrackBitmask, edi, esi, ebp, esp, ebx, edx, ecx, eax, retaddr_su_render_song, OutputBufPtr - push 8 ; Stack: PolyphonyBitmask, Sample, Row, GlobalTick, RandSeed, VoiceTrackBitmask, edi, esi, ebp, esp, ebx, edx, ecx, eax, retaddr_su_render_song, OutputBufPtr ; does the next voice reuse the current opcodes? - push 8 ; Stack: VoicesRemain, PolyphonyBitmask, Sample, Row, GlobalTick, RandSeed, VoiceTrackBitmask, edi, esi, ebp, esp, ebx, edx, ecx, eax, retaddr_su_render_song, OutputBufPtr + push 4572 ; Stack: PolyphonyBitmask, Sample, Row, GlobalTick, RandSeed, VoiceTrackBitmask, edi, esi, ebp, esp, ebx, edx, ecx, eax, retaddr_su_render_song, OutputBufPtr ; does the next voice reuse the current opcodes? + push 17 ; Stack: VoicesRemain, PolyphonyBitmask, Sample, Row, GlobalTick, RandSeed, VoiceTrackBitmask, edi, esi, ebp, esp, ebx, edx, ecx, eax, retaddr_su_render_song, OutputBufPtr mov edx, dword su_synth_obj ; edx points to the synth object mov ebx, dword su_patch_opcodes ; COM points to vm code mov esi, dword su_patch_operands ; VAL points to unit params @@ -114,11 +114,11 @@ su_render_sampleloop: ; loop through every sample in the row pop eax ; eax = Sample, Stack: Row, GlobalTick, RandSeed, VoiceTrackBitmask, edi, esi, ebp, esp, ebx, edx, ecx, eax, retaddr_su_render_song, OutputBufPtr inc dword [esp + 4] ; increment global time, used by delays inc eax - cmp eax, 5702 + cmp eax, 4828 jl su_render_sampleloop pop eax ; eax = Row, Stack: GlobalTick, RandSeed, VoiceTrackBitmask, edi, esi, ebp, esp, ebx, edx, ecx, eax, retaddr_su_render_song, OutputBufPtr ; Stack: pushad ptr inc eax - cmp eax, 272 + cmp eax, 560 jl su_render_rowloop ; rewind the stack the entropy of multiple pop eax is probably lower than add pop eax ; eax = GlobalTick, Stack: RandSeed, VoiceTrackBitmask, edi, esi, ebp, esp, ebx, edx, ecx, eax, retaddr_su_render_song, OutputBufPtr @@ -183,9 +183,9 @@ su_update_voices_skipreset: su_update_voices_nexttrack: pop ebx ; ebx=first voice of next instrument, Stack: ptrnrow pop edx ; edx=patrnrow - add esi, 17 + add esi, 35 inc ebp - cmp ebp,su_synth_obj + 6 + cmp ebp,su_synth_obj + 12 jl su_update_voices_trackloop ret @@ -254,6 +254,16 @@ su_op_advance_finish: popad ; Popped: eax, ecx = DelayWorkSpace, edx = Synth, ebx = OpcodeStream, esp, ebp = Voice, esi = OperandStream, edi. Stack: retaddr_su_run_vm, VoicesRemain, PolyphonyBitmask, Sample, Row, GlobalTick, RandSeed, VoiceTrackBitmask, edi, esi, ebp, esp, ebx, edx, ecx, eax, retaddr_su_render_song, OutputBufPtr ret ;------------------------------------------------------------------------------- +; ADD opcode: add the two top most signals on the stack +;------------------------------------------------------------------------------- +; Mono: a b -> a+b b +;------------------------------------------------------------------------------- +section .su_op_add code align=1 +su_op_add: + fadd st1 + ret + +;------------------------------------------------------------------------------- ; ADDP opcode: add the two top most signals on the stack and pop ;------------------------------------------------------------------------------- ; Mono: a b -> a+b @@ -264,6 +274,22 @@ su_op_addp: faddp st1, st0 ret +;------------------------------------------------------------------------------- +; LOADNOTE opcode: load the current note, scaled to [-1,1] +;------------------------------------------------------------------------------- +; Mono: (empty) -> n, where n is the note + +;------------------------------------------------------------------------------- +section .su_op_loadnote code align=1 +su_op_loadnote: + fild dword [edx-su_voice.inputs+su_voice.note] + + fmul dword [FCONST_0_00781250] ; s=n/128.0 + + fsub dword [FCONST_0_500000] ; s-.5 + fadd st0, st0 ; 2*s-1 + ret + ;------------------------------------------------------------------------------- ; MULP opcode: multiply the two top most signals on the stack and pop ;------------------------------------------------------------------------------- @@ -425,47 +451,6 @@ su_op_delay_loop: fst dword [ecx+su_delayline_wrk.dcout] ; o'=s+c*o-i ret -;------------------------------------------------------------------------------- -; COMPRES opcode: push compressor gain to stack -;------------------------------------------------------------------------------- -; Mono: push g on stack, where g is a suitable gain for the signal -; you can either MULP to compress the signal or SEND it to a GAIN -; somewhere else for compressor side-chaining. -; Stereo: push g g on stack, where g is calculated using l^2 + r^2 -;------------------------------------------------------------------------------- -section .su_op_compressor code align=1 -su_op_compressor: - fld st0 ; x x - fmul st0, st0 ; x^2 x - fld dword [ebp] ; l x^2 x - fucomi st0, st1 - setnb al ; if (st0 >= st1) al = 1; else al = 0; - fsubp st1, st0 ; x^2-l x - call su_nonlinear_map ; c x^2-l x, c is either attack or release parameter mapped in a nonlinear way - fmulp st1, st0 ; c*(x^2-l) x - fadd dword [ebp] ; l+c*(x^2-l) x // we could've kept level in the stack and save a few bytes, but su_env_map uses 3 stack (c + 2 temp), so the stack was getting quite big. - ; TODO: make this denormalization optional, if the user wants to save some space - fadd dword [FCONST_0_500000] ; add and sub small offset to prevent denormalization. WARNING: this is highly important, as the damp filters might denormalize and give 100x CPU penalty - fsub dword [FCONST_0_500000] ; See for example: https://stackoverflow.com/questions/36781881/why-denormalized-floats-are-so-much-slower-than-other-floats-from-hardware-arch - fst dword [ebp] ; l'=l+c*(x^2-l), l' x - fld dword [edx + 12] ; t l' x - fmul st0, st0 ; t*t l' x - fxch ; l' t*t x - fucomi st0, st1 ; if l' < t*t - fcmovb st0, st1 ; l'=t*t - fdivp st1, st0 ; t*t/l' x - fld dword [edx + 16] ; r t*t/l' x - - fmul dword [FCONST_0_500000] ; p=r/2 t*t/l' x - fxch ; t*t/l' p x - fyl2x ; p*log2(t*t/l') x - call su_power ; 2^(p*log2(t*t/l')) x - ; Equal to: - ; (t*t/l')^p x - ; if ratio is at minimum => p=0 => 1 x - ; if ratio is at maximum => p=0.5 => t/x => t/x*x=t - fdiv dword [edx + 8]; this used to be pregain but that ran into problems with getting back up to 0 dB so postgain should be better at that - ret ;------------------------------------------------------------------------------- @@ -665,6 +650,7 @@ su_op_oscillat_normalized: test al, byte 0x80 jz short su_op_oscillat_not_sample fst dword [ebp] ; for samples, we store the phase without mod(p,1) + fadd dword [edx + 8] call su_oscillat_sample jmp su_op_oscillat_shaping ; skip the rest to avoid color phase normalization and colorloading su_op_oscillat_not_sample: @@ -674,6 +660,12 @@ su_op_oscillat_not_sample: fprem ; we actually computed mod(p+1,1) instead of mod(p,1) as the fprem takes mod fstp st1 ; towards zero fst dword [ebp] ; store back the updated phase + fadd dword [edx + 8] + fld1 ; this is a bit stupid, but we need to take mod(x,1) again after phase modulations + fadd st1, st0 ; as the actual oscillator functions expect x in [0,1] + fxch + fprem + fstp st1 fld dword [edx + 12] ; // c p ; every oscillator test included if needed test al, byte 0x40 @@ -921,7 +913,8 @@ su_vm_jumptable: dd su_op_send dd su_op_distort dd su_op_delay - dd su_op_compressor + dd su_op_add + dd su_op_loadnote dd su_op_in dd su_op_out @@ -941,7 +934,8 @@ su_vm_transformcounts: db 1 db 1 db 4 - db 5 + db 0 + db 0 db 0 db 1 @@ -956,25 +950,90 @@ su_patterns: db 48,1,1,1,48,1,1,1,48,1,1,1,48,1,48,1 db 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 db 1,1,1,1,58,1,1,1,1,1,1,1,58,1,1,1 + db 0,0,0,0,72,1,1,1,1,1,1,1,72,1,1,1 db 1,1,1,1,72,1,1,1,1,1,1,1,72,1,1,1 - db 74,1,0,0,74,1,77,70,1,0,70,1,0,70,1,0 - db 74,1,0,0,74,1,77,70,1,0,70,1,0,0,72,1 - db 74,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - db 60,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 - db 1,1,53,1,1,1,53,1,1,1,53,1,1,1,53,1 + db 0,38,50,38,0,38,50,38,0,38,50,38,0,38,50,50 + db 0,46,58,46,0,46,58,46,0,46,58,46,0,46,58,58 + db 0,48,60,48,0,48,60,48,0,48,60,48,0,48,60,60 + db 0,41,53,41,0,41,53,41,0,41,53,41,0,41,53,53 + db 0,48,60,48,0,48,60,48,0,48,60,55,0,53,52,53 + db 59,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0 + db 0,0,53,1,1,1,53,1,1,1,53,1,1,1,53,53 db 1,1,53,1,1,1,53,1,1,1,53,1,1,1,53,53 + db 1,1,53,1,1,1,53,1,1,1,53,1,1,1,53,1 + db 1,1,53,1,1,1,53,1,1,1,53,1,1,1,53,52 + db 0,0,0,0,0,0,0,0,57,57,57,57,54,54,54,54 + db 0,0,0,0,0,0,0,0,0,0,57,57,1,52,52,1 + db 50,0,0,50,0,50,50,1,50,1,0,50,0,50,0,50 + db 0,0,0,50,0,50,50,1,50,1,0,50,0,50,50,50 + db 0,46,46,46,0,46,46,1,46,1,0,46,0,46,46,46 + db 0,0,46,46,0,46,46,1,46,1,0,46,0,46,46,46 + db 0,0,0,48,0,48,48,1,48,1,0,48,0,48,48,48 + db 41,1,0,41,0,41,41,1,41,1,0,41,0,41,41,41 + db 0,46,74,74,0,46,72,1,74,1,0,74,0,74,74,74 + db 76,76,76,76,0,48,70,1,76,1,0,48,0,48,48,79 + db 0,0,50,50,0,50,50,1,50,1,0,50,0,50,50,50 + db 48,1,0,48,0,48,48,1,48,1,0,48,0,48,48,48 + db 74,0,0,74,0,74,72,1,74,1,0,74,0,74,0,72 + db 0,0,0,74,0,74,72,1,74,1,0,74,0,74,74,72 + db 0,74,74,74,0,74,72,1,74,1,0,74,0,74,74,72 + db 0,0,74,74,0,74,72,1,74,1,0,74,0,74,74,76 + db 0,0,0,76,0,76,76,1,76,1,0,76,0,76,76,76 + db 77,1,0,77,0,77,77,1,77,1,0,77,0,77,77,67 + db 0,74,70,46,0,74,69,1,70,1,0,70,0,70,70,70 + db 72,72,72,48,0,72,74,1,72,1,0,76,0,76,74,48 + db 0,0,74,74,0,74,72,1,74,1,0,74,0,74,74,72 + db 76,1,0,76,0,76,76,1,76,1,0,76,0,76,76,76 + db 77,0,0,77,0,77,76,1,77,1,0,77,0,77,0,76 + db 0,0,0,77,0,77,76,1,77,1,0,77,0,77,77,76 + db 0,77,77,77,0,77,76,1,77,1,0,77,0,77,77,76 + db 0,0,77,77,0,77,76,1,77,1,0,77,0,77,77,79 + db 0,0,0,79,0,79,79,1,79,1,0,79,0,79,79,79 + db 81,1,0,81,0,81,81,1,81,1,0,81,0,81,81,72 + db 0,70,46,70,0,70,46,1,46,1,0,46,0,46,46,46 + db 48,48,48,72,0,76,48,1,48,1,0,72,0,72,77,76 + db 0,0,77,77,0,77,76,1,77,1,0,77,0,77,77,76 + db 79,1,0,79,0,79,79,1,79,1,0,79,0,79,79,79 + db 0,0,0,0,0,0,0,0,77,0,0,0,64,0,0,0 + db 62,0,0,0,0,0,69,0,0,0,0,0,0,0,0,0 + db 0,0,0,0,0,0,0,0,69,0,0,0,0,0,0,0 + db 62,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0 + db 0,0,0,0,0,0,0,0,64,0,0,0,65,0,0,0 + db 79,0,0,0,0,0,0,0,0,0,0,0,0,0,81,0 + db 0,0,0,0,0,0,0,0,0,0,60,0,0,0,0,0 + db 74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + db 65,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 + db 79,1,1,1,1,1,1,1,0,0,0,0,0,0,84,0 + db 0,0,0,0,0,0,0,0,70,0,0,0,69,0,0,0 + db 74,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0 + db 0,0,0,0,0,0,0,0,65,0,0,0,76,0,0,0 + db 74,0,0,0,0,0,81,0,0,0,0,0,0,0,0,0 + db 0,0,0,0,0,0,0,0,81,0,0,0,0,0,0,0 + db 0,0,0,0,0,0,0,0,76,0,0,0,77,0,0,0 + db 67,0,0,0,0,0,0,0,0,0,0,0,0,0,69,0 + db 0,0,0,0,0,0,0,0,0,0,72,0,0,0,0,0 + db 62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + db 77,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0 + db 67,1,1,1,1,1,1,1,0,0,0,0,0,0,72,0 + db 0,0,0,0,0,0,0,0,82,0,0,0,81,0,0,0 ;------------------------------------------------------------------------------- ; Tracks ;------------------------------------------------------------------------------- section .su_tracks data align=1 su_tracks: - db 0,0,0,0,1,2,1,2,1,2,1,2,1,2,1,2,3 - db 0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,3 - db 0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,3 - db 6,7,6,7,6,7,6,7,6,7,6,7,6,7,6,7,8 - db 0,0,0,0,9,3,3,3,9,3,3,3,3,3,3,3,3 - db 0,0,0,0,10,11,10,10,10,10,10,10,10,10,10,10,3 + db 0,0,0,0,0,0,0,0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,3,3,3 + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3 + db 5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,3,3,3 + db 0,0,0,0,0,0,0,0,7,7,8,8,9,10,8,9,7,7,8,8,9,10,8,11,7,7,8,8,9,10,8,9,0,0,0 + db 0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0 + db 13,14,14,14,14,14,14,14,14,14,14,15,15,14,15,15,16,15,15,15,16,15,15,15,16,15,15,15,16,15,15,15,3,3,3 + db 0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + db 19,20,21,22,23,24,25,26,19,27,21,22,28,24,25,26,19,27,21,22,28,24,25,26,19,27,21,22,28,24,25,26,0,0,0 + db 29,30,31,32,33,34,35,36,29,37,31,32,38,34,35,36,29,37,31,32,38,34,35,36,29,37,31,32,38,34,35,36,0,0,0 + db 39,40,41,42,43,44,45,46,39,47,41,42,48,44,45,46,39,47,41,42,48,44,45,46,39,47,41,42,48,44,45,46,0,0,0 + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,50,51,52,53,54,55,56,49,50,51,57,53,58,59,60,0,0,0,0 + db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,61,62,63,60,64,65,66,67,61,62,63,68,64,69,70,52,0,0,0,0 ;------------------------------------------------------------------------------- ; Sample offsets ;------------------------------------------------------------------------------- @@ -992,13 +1051,19 @@ su_sample_offsets: dd 367477 dw 1343 dw 1 + dd 1543725 + dw 831 + dw 104 + dd 557335 + dw 2374 + dw 821 ;------------------------------------------------------------------------------- ; Delay times ;------------------------------------------------------------------------------- section .su_delay_times data align=1 su_delay_times: - dw 1395,350,1744,1744,1116,1188,1276,1356,1422,1492,1556,1618,1140,1212,1300,1380,1446,1516,1580,1642 + dw 1395,350,1744,1744,69,12550,24402,21265,32419,1116,1188,1276,1356,1422,1492,1556,1618,1140,1212,1300,1380,1446,1516,1580,1642 ;------------------------------------------------------------------------------- @@ -1006,14 +1071,14 @@ su_delay_times: ;------------------------------------------------------------------------------- section .su_patch_opcodes data align=1 su_patch_opcodes: - db 2,4,6,2,8,10,10,6,12,10,10,10,10,14,17,2,2,6,18,0,2,4,20,6,2,8,6,10,10,12,14,17,2,18,2,18,0,2,22,8,6,2,22,8,6,12,2,4,6,12,10,20,14,17,0,2,4,4,12,6,10,10,20,2,8,6,10,12,24,6,20,14,17,2,18,0,3,3,7,5,7,15,17,0,3,5,7,11,11,15,17,0,27,23,29,0 + db 2,4,6,2,8,10,10,6,12,10,10,14,17,2,18,0,2,4,20,6,2,8,6,10,10,12,14,17,2,18,2,18,0,2,22,8,6,2,22,8,6,12,2,4,6,12,10,20,14,17,0,2,18,18,2,4,4,6,4,12,6,10,10,14,17,0,3,3,7,5,7,15,17,0,3,5,7,11,11,15,17,0,2,4,6,14,17,2,18,0,2,4,4,12,8,12,6,2,4,4,12,8,12,6,22,15,11,11,17,0,2,2,6,4,24,4,12,4,12,6,10,10,14,23,17,26,18,0,29,23,31,0 ;------------------------------------------------------------------------------- ; The parameters / inputs to each opcode ;------------------------------------------------------------------------------- section .su_patch_operands data align=1 su_patch_operands: - db 18,65,0,0,60,94,57,0,128,63,79,66,0,43,0,0,128,67,81,87,35,68,100,62,64,9,75,68,53,128,80,10,85,16,10,49,16,64,57,0,62,128,0,0,128,39,61,34,0,128,0,40,0,0,76,0,0,96,86,116,0,0,114,37,130,95,0,68,0,0,83,3,107,57,67,68,128,78,64,71,84,10,47,54,0,0,128,19,136,0,54,68,70,0,128,26,255,255,0,53,0,0,128,64,128,0,0,0,3,97,0,0,54,0,0,128,64,6,0,0,2,3,79,128,0,62,0,0,42,64,64,0,1,64,125,128,39,76,68,114,70,50,12,46,74,36,39,77,40,48,0,84,50,128,35,71,64,0,64,64,64,16,3,128,64,94,128,64,83,32,53,0,0,64,52,59,91,102,72,37,65,87,47,102,59,64,98,23,0,72,47,45,76,128,104,0,8,90,0,0,128,21,78,0,85,64,77,64,0,2,64,111,128,73,49,78,50,60,0,0,128,82,64,0,3,64,127,128,78,128,76,109,128,64,57,84,0,2,40,128,120,42,4,15,128 + db 0,70,0,0,76,88,69,0,128,63,79,66,0,43,0,0,128,43,79,84,82,68,100,62,64,12,69,68,12,48,16,64,50,0,62,76,0,0,128,46,40,0,0,76,0,0,96,86,116,0,0,114,37,130,95,0,68,0,0,83,3,107,57,67,68,128,78,64,64,42,26,47,54,0,0,128,19,136,0,54,68,70,0,128,26,255,255,0,53,0,0,128,64,128,0,0,0,3,97,0,0,54,0,0,128,64,6,0,0,2,3,79,128,0,62,0,0,42,64,64,0,1,64,125,128,39,76,68,114,60,39,19,39,73,62,74,128,94,176,0,47,91,0,42,65,86,71,83,88,66,91,49,100,89,34,64,74,64,42,70,17,17,64,78,13,128,88,128,66,22,46,68,10,116,16,64,40,0,8,90,0,0,128,21,78,0,85,64,77,54,0,2,87,111,128,64,128,97,50,60,0,0,128,82,64,0,3,64,127,128,78,128,76,109,128,64,67,128,11,1,74,0,0,64,64,67,0,4,64,99,129,64,89,43,1,78,36,74,64,83,40,0,40,0,63,51,54,64,94,0,128,64,128,35,76,28,52,128,64,102,35,114,67,20,0,48,64,64,64,46,78,128,64,128,35,76,99,54,128,64,128,35,128,80,128,0,0,0,4,1,65,122,128,72,103,128,64,20,6,40,102,47,78,68,0,84,25,84,127,76,52,128,91,48,128,67,88,73,0,57,37,56,35,55,64,0,5,58,128,129,30,128,80,53,128,24,61,69,103,84,12,5,3,27,14,82,200,0,2,61,113,122,97,9,15,128 ;------------------------------------------------------------------------------- ; Constants diff --git a/4klang.h b/4klang.h index a766528..addc96f 100644 --- a/4klang.h +++ b/4klang.h @@ -3,14 +3,14 @@ #define SU_RENDER_H #define SU_CHANNEL_COUNT 2 -#define SU_LENGTH_IN_SAMPLES 1550944 +#define SU_LENGTH_IN_SAMPLES 2703680 #define SU_BUFFER_LENGTH (SU_LENGTH_IN_SAMPLES*SU_CHANNEL_COUNT) #define SU_SAMPLE_RATE 44100 -#define SU_BPM 116 +#define SU_BPM 137 #define SU_ROWS_PER_BEAT 4 #define SU_ROWS_PER_PATTERN 16 -#define SU_LENGTH_IN_PATTERNS 17 +#define SU_LENGTH_IN_PATTERNS 35 #define SU_LENGTH_IN_ROWS (SU_LENGTH_IN_PATTERNS*SU_PATTERN_SIZE) #define SU_SAMPLES_PER_ROW (SU_SAMPLE_RATE*60/(SU_BPM*SU_ROWS_PER_BEAT)) diff --git a/4klang.inc b/4klang.inc index 26ab3d0..6214eb5 100644 --- a/4klang.inc +++ b/4klang.inc @@ -3,14 +3,14 @@ %define PLAYER_INC %define SU_CHANNEL_COUNT 2 -%define SU_LENGTH_IN_SAMPLES 1550944 +%define SU_LENGTH_IN_SAMPLES 2703680 %define SU_BUFFER_LENGTH (SU_LENGTH_IN_SAMPLES*SU_CHANNEL_COUNT) %define SU_SAMPLE_RATE 44100 -%define SU_BPM 116 +%define SU_BPM 137 %define SU_ROWS_PER_BEAT 4 %define SU_ROWS_PER_PATTERN 16 -%define SU_LENGTH_IN_PATTERNS 17 +%define SU_LENGTH_IN_PATTERNS 35 %define SU_LENGTH_IN_ROWS (SU_LENGTH_IN_PATTERNS*SU_PATTERN_SIZE) %define SU_SAMPLES_PER_ROW (SU_SAMPLE_RATE*60/(SU_BPM*SU_ROWS_PER_BEAT)) %define SU_SAMPLE_SIZE 2 diff --git a/4klang.yml b/4klang.yml index ccedb85..96a5d29 100644 --- a/4klang.yml +++ b/4klang.yml @@ -1,27 +1,45 @@ -bpm: 116 +bpm: 137 rowsperbeat: 4 score: tracks: - numvoices: 1 - order: [-1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, -1] + order: [-1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, -1, -1, -1] patterns: [[48, 1, 1, 1, 48, 1, 1, 1, 48, 1, 1, 1, 48, 1, 1, 1], [48, 1, 1, 1, 48, 1, 1, 1, 48, 1, 1, 1, 48, 1, 48, 1]] - numvoices: 1 - order: [-1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1] + order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1] patterns: [[1, 1, 1, 1, 58, 1, 1, 1, 1, 1, 1, 1, 58, 1, 1, 1]] - numvoices: 1 - order: [-1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1] + order: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1] patterns: [[1, 1, 1, 1, 72, 1, 1, 1, 1, 1, 1, 1, 72, 1, 1, 1]] - numvoices: 1 - order: [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2] - patterns: [[74, 1, 0, 1, 74, 1, 77, 70, 1, 0, 70, 1, 0, 70, 1, 0], [74, 1, 0, 1, 74, 1, 77, 70, 1, 0, 70, 1, 0, 1, 72, 1], [74, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]] + order: [-1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 2, 3, 4, 2, 3, 1, 1, 2, 2, 3, 4, 2, 5, 1, 1, 2, 2, 3, 4, 2, 3, 6, -1, -1] + patterns: [[1, 38, 50, 38, 0, 38, 50, 38, 0, 38, 50, 38, 0, 38, 50, 50], [0, 38, 50, 38, 0, 38, 50, 38, 0, 38, 50, 38, 0, 38, 50, 50], [0, 46, 58, 46, 0, 46, 58, 46, 0, 46, 58, 46, 0, 46, 58, 58], [0, 48, 60, 48, 0, 48, 60, 48, 0, 48, 60, 48, 0, 48, 60, 60], [0, 41, 53, 41, 0, 41, 53, 41, 0, 41, 53, 41, 0, 41, 53, 53], [0, 48, 60, 48, 0, 48, 60, 48, 0, 48, 60, 55, 0, 53, 52, 53], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]] - numvoices: 2 - order: [-1, -1, -1, -1, 0, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1] - patterns: [[60, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]] + order: [-1, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1] + patterns: [[59, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1]] - numvoices: 1 - order: [-1, -1, -1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1] - patterns: [[1, 1, 53, 1, 1, 1, 53, 1, 1, 1, 53, 1, 1, 1, 53, 1], [1, 1, 53, 1, 1, 1, 53, 1, 1, 1, 53, 1, 1, 1, 53, 53]] + order: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, -1, -1, -1] + patterns: [[1, 1, 53, 1, 1, 1, 53, 1, 1, 1, 53, 1, 1, 1, 53, 53], [1, 1, 53, 1, 1, 1, 53, 1, 1, 1, 53, 1, 1, 1, 53, 1], [1, 1, 53, 1, 1, 1, 53, 1, 1, 1, 53, 1, 1, 1, 53, 52]] + - numvoices: 1 + order: [-1, -1, -1, -1, -1, -1, -1, 0, 1, -1, -1, -1, -1, -1, -1, 2, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1] + patterns: [[1, 1, 1, 1, 1, 1, 1, 1, 57, 57, 57, 57, 54, 54, 54, 54], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 57, 57, 1, 52, 52, 1]] + - numvoices: 2 + order: [0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 2, 3, 9, 5, 6, 7, 0, 8, 2, 3, 9, 5, 6, 7, 0, 8, 2, 3, 9, 5, 6, 7, 10, -1, -1] + patterns: [[50, 0, 1, 50, 0, 50, 50, 1, 50, 1, 0, 50, 0, 50, 0, 50], [0, 1, 1, 50, 0, 50, 50, 1, 50, 1, 0, 50, 0, 50, 50, 50], [0, 46, 46, 46, 0, 46, 46, 1, 46, 1, 0, 46, 0, 46, 46, 46], [0, 1, 46, 46, 0, 46, 46, 1, 46, 1, 0, 46, 0, 46, 46, 46], [0, 1, 1, 48, 0, 48, 48, 1, 48, 1, 0, 48, 0, 48, 48, 48], [41, 1, 0, 41, 0, 41, 41, 1, 41, 1, 0, 41, 0, 41, 41, 41], [0, 46, 74, 74, 0, 46, 72, 1, 74, 1, 0, 74, 0, 74, 74, 74], [76, 76, 76, 76, 0, 48, 70, 1, 76, 1, 0, 48, 0, 48, 48, 79], [0, 1, 50, 50, 0, 50, 50, 1, 50, 1, 0, 50, 0, 50, 50, 50], [48, 1, 0, 48, 0, 48, 48, 1, 48, 1, 0, 48, 0, 48, 48, 48], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]] + - numvoices: 1 + order: [0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 2, 3, 9, 5, 6, 7, 0, 8, 2, 3, 9, 5, 6, 7, 0, 8, 2, 3, 9, 5, 6, 7, 10, -1, -1] + patterns: [[74, 0, 1, 74, 0, 74, 72, 1, 74, 1, 0, 74, 0, 74, 0, 72], [0, 1, 1, 74, 0, 74, 72, 1, 74, 1, 0, 74, 0, 74, 74, 72], [0, 74, 74, 74, 0, 74, 72, 1, 74, 1, 0, 74, 0, 74, 74, 72], [0, 1, 74, 74, 0, 74, 72, 1, 74, 1, 0, 74, 0, 74, 74, 76], [0, 1, 1, 76, 0, 76, 76, 1, 76, 1, 0, 76, 0, 76, 76, 76], [77, 1, 0, 77, 0, 77, 77, 1, 77, 1, 0, 77, 0, 77, 77, 67], [0, 74, 70, 46, 0, 74, 69, 1, 70, 1, 0, 70, 0, 70, 70, 70], [72, 72, 72, 48, 0, 72, 74, 1, 72, 1, 0, 76, 0, 76, 74, 48], [0, 1, 74, 74, 0, 74, 72, 1, 74, 1, 0, 74, 0, 74, 74, 72], [76, 1, 0, 76, 0, 76, 76, 1, 76, 1, 0, 76, 0, 76, 76, 76], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]] + - numvoices: 1 + order: [0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 2, 3, 9, 5, 6, 7, 0, 8, 2, 3, 9, 5, 6, 7, 0, 8, 2, 3, 9, 5, 6, 7, 10, -1, -1] + patterns: [[77, 0, 1, 77, 0, 77, 76, 1, 77, 1, 0, 77, 0, 77, 0, 76], [0, 1, 1, 77, 0, 77, 76, 1, 77, 1, 0, 77, 0, 77, 77, 76], [0, 77, 77, 77, 0, 77, 76, 1, 77, 1, 0, 77, 0, 77, 77, 76], [0, 1, 77, 77, 0, 77, 76, 1, 77, 1, 0, 77, 0, 77, 77, 79], [0, 1, 1, 79, 0, 79, 79, 1, 79, 1, 0, 79, 0, 79, 79, 79], [81, 1, 0, 81, 0, 81, 81, 1, 81, 1, 0, 81, 0, 81, 81, 72], [0, 70, 46, 70, 0, 70, 46, 1, 46, 1, 0, 46, 0, 46, 46, 46], [48, 48, 48, 72, 0, 76, 48, 1, 48, 1, 0, 72, 0, 72, 77, 76], [0, 1, 77, 77, 0, 77, 76, 1, 77, 1, 0, 77, 0, 77, 77, 76], [79, 1, 0, 79, 0, 79, 79, 1, 79, 1, 0, 79, 0, 79, 79, 79], [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]] + - numvoices: 2 + order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 8, 4, 9, 10, 11, -1, -1, -1, -1] + patterns: [[1, 1, 1, 1, 1, 1, 1, 1, 77, 0, 1, 1, 64, 0, 1, 1], [62, 0, 1, 1, 1, 1, 69, 0, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 69, 0, 1, 1, 1, 1, 1, 1], [62, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 64, 0, 1, 1, 65, 0, 1, 1], [79, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 81, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 60, 0, 1, 1, 1, 1], [74, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [65, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [79, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 84, 0], [1, 1, 1, 1, 1, 1, 1, 1, 70, 0, 1, 1, 69, 0, 1, 1], [74, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1]] + - numvoices: 2 + order: [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 8, 4, 9, 10, 11, -1, -1, -1, -1] + patterns: [[1, 1, 1, 1, 1, 1, 1, 1, 65, 0, 1, 1, 76, 0, 1, 1], [74, 0, 1, 1, 1, 1, 81, 0, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 81, 0, 1, 1, 1, 1, 1, 1], [74, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 76, 0, 1, 1, 77, 0, 1, 1], [67, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 69, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 72, 0, 1, 1, 1, 1], [62, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [77, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [67, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 72, 0], [1, 1, 1, 1, 1, 1, 1, 1, 82, 0, 1, 1, 81, 0, 1, 1], [62, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1]] rowsperpattern: 16 - length: 17 + length: 35 patch: - name: kick edm 2 comment: Suggested note to play G-2 to C-3 @@ -29,10 +47,10 @@ patch: units: - type: envelope id: 105 - parameters: {attack: 18, channel: 2, decay: 65, gain: 60, release: 0, stereo: 0, sustain: 0} + parameters: {attack: 0, channel: 2, decay: 70, gain: 76, release: 0, stereo: 0, sustain: 0} - type: oscillator id: 106 - parameters: {color: 128, detune: 57, gain: 79, lfo: 0, phase: 0, shape: 63, stereo: 0, transpose: 94, type: 0, unison: 2} + parameters: {color: 128, detune: 69, gain: 79, lfo: 0, phase: 0, shape: 63, stereo: 0, transpose: 88, type: 0, unison: 2} - type: mulp id: 126 parameters: {stereo: 0} @@ -41,10 +59,10 @@ patch: parameters: {attack: 0, decay: 43, gain: 128, release: 0, stereo: 0, sustain: 0} - type: noise id: 111 - parameters: {gain: 81, shape: 67, stereo: 0} + parameters: {gain: 79, shape: 43, stereo: 0} - type: filter id: 112 - parameters: {bandpass: 0, frequency: 87, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 1, resonance: 35, stereo: 0} + parameters: {bandpass: 0, frequency: 84, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 1, resonance: 82, stereo: 0} - type: filter id: 113 parameters: {bandpass: 0, frequency: 100, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 0, resonance: 62, stereo: 0} @@ -56,34 +74,22 @@ patch: parameters: {stereo: 0} - type: filter id: 12 - parameters: {bandpass: 0, frequency: 9, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 1, resonance: 75, stereo: 0} - - type: filter - id: 13 - parameters: {bandpass: 0, frequency: 53, highpass: 1, lowpass: 1, negbandpass: 0, neghighpass: 0, resonance: 128, stereo: 0} + parameters: {bandpass: 0, frequency: 12, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 1, resonance: 69, stereo: 0} - type: filter id: 14 - parameters: {bandpass: 0, frequency: 10, highpass: 1, lowpass: 0, negbandpass: 0, neghighpass: 0, resonance: 85, stereo: 0} - - type: filter - id: 15 - parameters: {bandpass: 0, frequency: 10, highpass: 1, lowpass: 0, negbandpass: 0, neghighpass: 0, resonance: 49, stereo: 0} + parameters: {bandpass: 0, frequency: 12, highpass: 1, lowpass: 0, negbandpass: 0, neghighpass: 0, resonance: 48, stereo: 0} - type: pan id: 114 parameters: {panning: 64, stereo: 0} - type: outaux id: 118 - parameters: {auxgain: 0, outgain: 57, stereo: 1} + parameters: {auxgain: 0, outgain: 50, stereo: 1} - type: envelope id: 119 - parameters: {attack: 62, decay: 128, gain: 128, release: 0, stereo: 0, sustain: 0} - - type: envelope - id: 120 - parameters: {attack: 39, decay: 61, gain: 128, release: 0, stereo: 0, sustain: 34} - - type: mulp - id: 121 - parameters: {stereo: 0} + parameters: {attack: 62, decay: 76, gain: 128, release: 0, stereo: 0, sustain: 0} - type: send id: 122 - parameters: {amount: 0, port: 0, sendpop: 1, target: 106} + parameters: {amount: 46, port: 0, sendpop: 1, target: 106} - name: snare edm 2 (sample) comment: 'Suggested range: E-2 to C-3' numvoices: 1 @@ -111,9 +117,9 @@ patch: - type: addp parameters: {stereo: 0} - type: pan - parameters: {panning: 71, stereo: 0} + parameters: {panning: 64, stereo: 0} - type: outaux - parameters: {auxgain: 10, outgain: 84, stereo: 1} + parameters: {auxgain: 26, outgain: 42, stereo: 1} - type: envelope parameters: {attack: 47, decay: 54, gain: 128, release: 0, stereo: 0, sustain: 0} - type: send @@ -173,73 +179,53 @@ patch: parameters: {drive: 114, stereo: 0} - type: pan id: 174 - parameters: {panning: 70, stereo: 0} + parameters: {panning: 60, stereo: 0} - type: outaux id: 161 - parameters: {auxgain: 12, outgain: 50, stereo: 1} - - name: House Bass Organ + parameters: {auxgain: 19, outgain: 39, stereo: 1} + - name: basss v3 numvoices: 1 units: - type: envelope - id: 207 - parameters: {attack: 46, decay: 74, gain: 77, release: 39, stereo: 0, sustain: 36} - - type: oscillator - id: 208 - parameters: {color: 84, detune: 48, gain: 128, phase: 0, shape: 50, stereo: 0, transpose: 40, type: 1, unison: 3} - - type: oscillator - id: 213 - parameters: {color: 64, detune: 64, gain: 64, phase: 0, shape: 64, stereo: 0, transpose: 71, type: 2, unison: 0} - - type: addp - id: 214 - parameters: {stereo: 0} - - type: mulp - id: 209 - parameters: {stereo: 0} - - type: filter - id: 218 - parameters: {bandpass: 0, frequency: 3, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 0, resonance: 128, stereo: 0} - - type: filter - id: 219 - parameters: {bandpass: 0, frequency: 94, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 0, resonance: 128, stereo: 0} - - type: distort - id: 215 - parameters: {drive: 83, stereo: 0} + id: 1 + parameters: {attack: 39, decay: 73, gain: 128, release: 74, stereo: 0, sustain: 62} + - type: send + id: 200 + parameters: {amount: 94, port: 0, sendpop: 0, target: 170} + - type: send + id: 30 + parameters: {amount: 47, port: 3, sendpop: 1, target: 400, voice: 0} - type: envelope - id: 221 - parameters: {attack: 32, decay: 53, gain: 64, release: 0, stereo: 0, sustain: 0} - - type: noise - id: 222 - parameters: {gain: 59, shape: 52, stereo: 0} + id: 21 + parameters: {attack: 42, decay: 65, gain: 83, release: 71, stereo: 0, sustain: 86} + - type: oscillator + id: 400 + parameters: {color: 49, detune: 66, gain: 89, lfo: 0, phase: 91, shape: 100, stereo: 0, transpose: 88, type: 1, unison: 2} + - type: oscillator + id: 6 + parameters: {color: 42, detune: 74, gain: 17, lfo: 0, phase: 64, shape: 70, stereo: 0, transpose: 64, type: 2, unison: 1} - type: mulp - id: 223 + parameters: {stereo: 0} + - type: oscillator + id: 401 + parameters: {color: 128, detune: 78, gain: 128, phase: 13, shape: 88, stereo: 0, transpose: 64, type: 0, unison: 2} + - type: addp + id: 20 + parameters: {stereo: 0} + - type: mulp + id: 22 parameters: {stereo: 0} - type: filter - id: 225 - parameters: {bandpass: 0, frequency: 91, highpass: 0, lowpass: 1, negbandpass: 1, neghighpass: 0, resonance: 102, stereo: 0} - - type: addp - id: 224 - parameters: {stereo: 0} - - type: compressor - id: 229 - parameters: {attack: 37, invgain: 87, ratio: 102, release: 65, stereo: 0, threshold: 47} - - type: mulp - id: 230 - parameters: {stereo: 0} - - type: distort - id: 228 - parameters: {drive: 59, stereo: 0} + id: 170 + parameters: {bandpass: 0, frequency: 22, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 1, resonance: 46, stereo: 0} + - type: filter + parameters: {bandpass: 0, frequency: 10, highpass: 1, lowpass: 0, negbandpass: 0, neghighpass: 0, resonance: 116, stereo: 0} - type: pan - id: 211 + id: 18 parameters: {panning: 64, stereo: 0} - type: outaux - id: 212 - parameters: {auxgain: 23, outgain: 98, stereo: 1} - - type: envelope - id: 220 - parameters: {attack: 0, decay: 72, gain: 76, release: 45, stereo: 0, sustain: 47} - - type: send - id: 217 - parameters: {amount: 128, port: 0, sendpop: 1, stereo: 0, target: 218, unit: 0, voice: 0} + id: 19 + parameters: {auxgain: 0, outgain: 40, stereo: 1} - name: Crash909 numvoices: 2 units: @@ -254,16 +240,16 @@ patch: parameters: {stereo: 1} - type: oscillator id: 2 - parameters: {color: 64, detune: 64, gain: 111, looplength: 5676, loopstart: 2615, phase: 0, samplestart: 433554, shape: 64, stereo: 1, transpose: 77, type: 4, unison: 0} + parameters: {color: 64, detune: 54, gain: 111, looplength: 5676, loopstart: 2615, phase: 0, samplestart: 433554, shape: 87, stereo: 1, transpose: 77, type: 4, unison: 0} - type: mulp id: 3 parameters: {stereo: 1} - type: pan id: 5 - parameters: {damp: 0, dry: 128, feedback: 96, notetracking: 2, panning: 73, pregain: 40, stereo: 1} + parameters: {damp: 0, dry: 128, feedback: 96, notetracking: 2, panning: 64, pregain: 40, stereo: 1} - type: outaux id: 6 - parameters: {auxgain: 78, outgain: 49, panning: 64, stereo: 1} + parameters: {auxgain: 97, outgain: 128, panning: 64, stereo: 1} - name: hihat numvoices: 1 units: @@ -282,10 +268,154 @@ patch: parameters: {bandpass: 0, frequency: 109, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 0, resonance: 128, stereo: 1} - type: pan id: 7 - parameters: {panning: 57, stereo: 1} + parameters: {panning: 67, stereo: 1} - type: outaux id: 11 - parameters: {auxgain: 0, outgain: 84, stereo: 1} + parameters: {auxgain: 11, outgain: 128, stereo: 1} + - name: DiscoTom + numvoices: 1 + units: + - type: envelope + id: 900 + parameters: {attack: 1, decay: 74, gain: 64, release: 0, stereo: 0, sustain: 0} + - type: oscillator + id: 1001 + parameters: {color: 66, detune: 67, gain: 99, looplength: 104, loopstart: 831, phase: 0, samplestart: 1543725, shape: 64, stereo: 0, transpose: 64, type: 4, unison: 1} + - type: mulp + id: 3 + parameters: {stereo: 0} + - type: pan + id: 5 + parameters: {damp: 0, dry: 128, feedback: 96, notetracking: 2, panning: 64, pregain: 40, stereo: 0} + - type: outaux + id: 6 + parameters: {auxgain: 43, outgain: 89, panning: 64, stereo: 1} + - type: envelope + id: 7 + parameters: {attack: 1, decay: 78, gain: 64, release: 74, stereo: 0, sustain: 36} + - type: send + id: 8 + parameters: {amount: 83, port: 0, sendpop: 1, stereo: 0, target: 1001, unit: 0, voice: 0} + - name: Super Pluck + numvoices: 4 + units: + - type: envelope + id: 1 + parameters: {attack: 40, decay: 0, gain: 54, release: 51, stereo: 0, sustain: 63} + - type: oscillator + id: 2 + parameters: {color: 128, detune: 94, gain: 128, phase: 0, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3} + - type: oscillator + id: 10 + parameters: {color: 128, detune: 28, gain: 102, lfo: 0, phase: 52, shape: 64, stereo: 0, transpose: 76, type: 1, unison: 3} + - type: addp + id: 11 + parameters: {stereo: 0} + - type: noise + id: 23 + parameters: {gain: 67, shape: 114, stereo: 0} + - type: addp + id: 24 + parameters: {stereo: 0} + - type: mulp + id: 17 + parameters: {stereo: 0} + - id: 18 + parameters: {} + - type: envelope + id: 12 + parameters: {attack: 20, decay: 0, gain: 64, release: 64, stereo: 0, sustain: 48} + - type: oscillator + id: 13 + parameters: {color: 128, detune: 46, gain: 128, phase: 78, shape: 64, stereo: 0, transpose: 64, type: 1, unison: 3} + - type: oscillator + id: 14 + parameters: {color: 128, detune: 99, gain: 128, lfo: 0, phase: 54, shape: 64, stereo: 0, transpose: 76, type: 1, unison: 3} + - type: addp + id: 28 + parameters: {stereo: 0} + - type: noise + id: 27 + parameters: {gain: 80, shape: 128, stereo: 0} + - type: addp + id: 15 + parameters: {stereo: 0} + - type: mulp + id: 26 + parameters: {stereo: 0} + - type: delay + parameters: {damp: 0, dry: 0, feedback: 0, notetracking: 0, pregain: 128, stereo: 0} + varargs: [69] + - type: pan + parameters: {panning: 65, stereo: 1} + - type: filter + id: 19 + parameters: {bandpass: 0, frequency: 122, highpass: 0, lowpass: 1, negbandpass: 1, neghighpass: 0, resonance: 128, stereo: 1} + - type: filter + parameters: {bandpass: 0, frequency: 103, highpass: 0, lowpass: 1, negbandpass: 0, neghighpass: 0, resonance: 128, stereo: 1} + - type: outaux + id: 6 + parameters: {auxgain: 6, outgain: 20, stereo: 1} + - name: Happy lead + comment: |- + Generic pluck generator + Use oscillator type, color and shape to alter the sound properties + numvoices: 4 + units: + - type: envelope + id: 163 + parameters: {attack: 40, decay: 102, gain: 68, release: 78, stereo: 0, sustain: 47} + - type: envelope + id: 215 + parameters: {attack: 0, decay: 84, gain: 127, release: 84, stereo: 0, sustain: 25} + - type: mulp + id: 216 + parameters: {stereo: 0} + - type: oscillator + id: 164 + parameters: {color: 91, detune: 52, gain: 128, lfo: 0, phase: 128, shape: 48, stereo: 0, transpose: 76, type: 0, unison: 3} + - type: add + id: 214 + parameters: {stereo: 0} + - type: oscillator + id: 165 + parameters: {color: 57, detune: 73, gain: 56, lfo: 0, phase: 0, shape: 37, stereo: 0, transpose: 88, type: 1, unison: 3} + - type: addp + id: 166 + parameters: {stereo: 0} + - type: oscillator + id: 1002 + parameters: {color: 61, detune: 64, gain: 128, looplength: 821, loopstart: 2374, phase: 0, samplestart: 557335, shape: 58, stereo: 0, transpose: 55, type: 4, unison: 1} + - parameters: {} + disabled: true + - type: addp + id: 1003 + parameters: {stereo: 0} + - type: mulp + id: 167 + parameters: {stereo: 0} + - type: filter + id: 217 + parameters: {bandpass: 0, frequency: 30, highpass: 1, lowpass: 1, negbandpass: 0, neghighpass: 0, resonance: 128, stereo: 0} + - type: filter + id: 218 + parameters: {bandpass: 0, frequency: 53, highpass: 1, lowpass: 0, negbandpass: 1, neghighpass: 0, resonance: 128, stereo: 0} + - type: pan + id: 168 + parameters: {panning: 61, stereo: 0} + - type: delay + id: 169 + parameters: {damp: 12, dry: 103, feedback: 84, notetracking: 0, pregain: 69, stereo: 1} + varargs: [12550, 24402, 21265, 32419] + - type: outaux + id: 172 + parameters: {auxgain: 14, outgain: 27, stereo: 1} + - type: loadnote + id: 219 + parameters: {stereo: 0} + - type: send + id: 220 + parameters: {amount: 82, port: 0, sendpop: 1, stereo: 0, target: 218, unit: 0, voice: 0} - name: Global numvoices: 1 units: @@ -294,7 +424,7 @@ patch: parameters: {channel: 2, stereo: 1} - type: delay id: 8 - parameters: {damp: 42, dry: 128, feedback: 120, notetracking: 0, pregain: 40, stereo: 1} + parameters: {damp: 97, dry: 113, feedback: 122, notetracking: 0, pregain: 61, stereo: 1} varargs: [1116, 1188, 1276, 1356, 1422, 1492, 1556, 1618, 1140, 1212, 1300, 1380, 1446, 1516, 1580, 1642] - type: out id: 9 diff --git a/base.config b/base.config index 6292e35..d783fbc 100644 --- a/base.config +++ b/base.config @@ -43,11 +43,11 @@ USE_WIDECHAR_TEXTS=1 ########### Time base ########### USE_TIME_DIVIDER_IN_X86_CODE=1 -TIME_DIVIDER=91241.383 +TIME_DIVIDER=77255.477 TIME_BASE=bars AUDIO_DELAY=2048 -PROD_END_TIME=1552992 +PROD_END_TIME=2705728 ########### Final product ########### @@ -61,9 +61,9 @@ QUOTE=\" CRINKLER_ORDERTRIES=4000 -AUDIO_BUFFER_ALLOCATED_LENGTH=1552992 +AUDIO_BUFFER_ALLOCATED_LENGTH=2705728 AUDIO_SAMPLING_RATE=44100 LOOP_END=5.0 LOOP_START=3.0 LOOP_ENABLED=0 -TIME_DIVIDER_INT=91241 +TIME_DIVIDER_INT=77255 diff --git a/music/4k_house.xrns b/music/4k_house.xrns index c4fbeec7bddfe1b092f1e66241dfaf4d6c6a7d30..fbb37be562dcaa01740d858deeb5099b18830c11 100644 GIT binary patch literal 10765 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 literal 9927 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.)" "break;" "if(n.x80.)" "r=-1.;" - "return vec3(r,m,y);" + "return vec3(r,i,y);" "}" - "vec3 x(vec3 v,vec3 f,vec3 i)" + "vec3 t(vec3 v,vec3 f,vec3 x)" "{" - "float r=0.,m=0.,y=0.;" - "for(int e=0;e<50;e++)" + "float r=0.,i=0.,y=0.;" + "for(int m=0;m<50;m++)" "{" - "i=v+f*r;" - "vec2 n=x(i);" + "x=v+f*r;" + "vec2 n=t(x);" "r+=n.x;" - "m=n.y;" + "i=n.y;" "if(r>40.)" "break;" "if(n.x40.)" "r=-1.;" - "return vec3(r,m,y);" + "return vec3(r,i,y);" "}" - "float e(vec3 v,vec3 f)" + "float x(vec3 v,vec3 x)" "{" - "float r=1.,m=.01;" + "float r=1.,f=.01;" "for(int i=0;i<40;i++)" "{" - "if(m>30.)" + "if(f>30.)" "break;" - "float y=x(v+m*f).x;" - "r=min(r,y/(18.*m));" - "m+=clamp(y,.005,.5);" - "if(r<-1.||m>30.)" + "float m=t(v+f*x).x;" + "r=min(r,m/(18.*f));" + "f+=clamp(m,.005,.5);" + "if(r<-1.||f>30.)" "break;" "}" "r=max(r,-1.);" "return.25*(1.+r)*(1.+r)*(2.-r);" "}" - "vec3 e(vec3 v)" + "vec3 x(vec3 v)" "{" "vec2 f=vec2(.001,0);" - "vec3 r=vec3(x(v+f.xyy).x-x(v-f.xyy).x,x(v+f.yxy).x-x(v-f.yxy).x,x(v+f.yyx).x-x(v-f.yyx).x);" + "vec3 r=vec3(t(v+f.xyy).x-t(v-f.xyy).x,t(v+f.yxy).x-t(v-f.yxy).x,t(v+f.yyx).x-t(v-f.yyx).x);" "return normalize(r);" "}" - "vec3 p(vec3 v,vec3 f)" + "vec3 e(vec3 v,vec3 f)" "{" - "vec3 r=vec3(.5454);" - "return r+(1.-r)*pow(clamp(1.-dot(v,f),0.,1.),5.);" + "vec3 x=vec3(.5454);" + "return x+(1.-x)*pow(clamp(1.-dot(v,f),0.,1.),5.);" "}" - "vec3 e(vec3 v,vec3 f,float r,vec3 i,vec3 x,vec3 y,float m)" + "vec3 e(vec3 v,vec3 f,float r,vec3 m,vec3 i,vec3 y,float k)" "{" - "vec3 n=normalize(i),d=vec3(max(0.,dot(n,reflect(x,y)))),s=p(normalize(n-x),n)*m;" - "float k=e(i+y*.01,v);" - "d=pow(d,vec3(r))*m;" - "return f*mix(vec3(1)*vec3(max(0.,dot(n,y))),d,s)*k;" + "vec3 n=normalize(m),c=vec3(max(0.,dot(n,reflect(i,y)))),d=e(normalize(n-i),n)*k;" + "float s=x(m+y*.01,v);" + "c=pow(c,vec3(r))*k;" + "return f*mix(vec3(1)*vec3(max(0.,dot(n,y))),c,d)*s;" "}" - "float r(vec3 v,vec3 f)" + "float p(vec3 v,vec3 f)" "{" - "float r=0.,m=1.;" - "for(int i=0;i<8;i++)" + "float r=0.,i=1.;" + "for(int x=0;x<8;x++)" "{" - "float y=.01+.02*float(i*i),d=x(v+f*y).x;" - "r+=(y-d)*m;" - "m*=.85;" + "float m=.01+.02*float(x*x),y=t(v+f*m).x;" + "r+=(m-y)*i;" + "i*=.85;" "}" "return 1.-clamp(.6*r,0.,1.);" "}" - "vec3 e(vec3 v,vec3 f,vec3 m,float i)" + "vec3 e(vec3 v,vec3 f,vec3 r,float m)" "{" - "float y=1.,x=r(v,f);" + "float i=1.,y=p(v,f);" "vec3 n=vec3(.1529);" - "if(i==0.)" - "n=vec3(.2863,.1059,.2431),y=1.5;" - "else if(i==1.)" - "n=vec3(.3294,.0941,.6),y=.6;" - "else if(i==2.)" - "n=vec3(.5804,.9647,1),y=1.;" - "else if(i==3.)" - "n=vec3(0),y=1e2;" - "else if(i==4.)" - "n=vec3(.9961,1,.9922),y=.3;" - "vec3 d=vec3(0);" - "d+=e(vec3(0,-40,-1),vec3(.56,.44,.18)*2.,y,v,m,f,x);" - "d+=e(vec3(-20,4,10),vec3(.04,.2,.71)*2.,y,v,m,f,x);" - "vec3 s=vec3(0,4,2);" - "float c=e(v+f*.01,s);" - "d+=vec3(.6627,.7098,.8863)*clamp(dot(f,s),0.,1.)*c*x;" - "d+=vec3(.1333,.1333,.1216)*clamp(dot(f,normalize(s*vec3(-1,0,-1))),0.,1.)*x;" - "return n*max(vec3(0),d);" + "if(m==0.)" + "n=vec3(.2863,.1059,.2431),i=1.5;" + "else if(m==1.)" + "n=vec3(.3294,.0941,.6),i=.6;" + "else if(m==2.)" + "n=vec3(.5804,.9647,1),i=1.;" + "else if(m==3.)" + "n=vec3(0),i=1e2;" + "else if(m==4.)" + "n=vec3(.9961,1,.9922),i=.3;" + "vec3 c=vec3(0);" + "c+=e(vec3(0,-40,-1),vec3(.56,.44,.18)*2.,i,v,r,f,y);" + "c+=e(vec3(-20,4,10),vec3(.04,.2,.71)*2.,i,v,r,f,y);" + "vec3 d=vec3(0,4,2);" + "float s=x(v+f*.01,d);" + "c+=vec3(.6627,.7098,.8863)*clamp(dot(f,d),0.,1.)*s*y;" + "c+=vec3(.1333,.1333,.1216)*clamp(dot(f,normalize(d*vec3(-1,0,-1))),0.,1.)*y;" + "return n*max(vec3(0),c);" "}" - "vec3 p(vec3 f)" + "vec3 e(vec3 f)" "{" "vec2 r=gl_FragCoord.xy/v.xy;" "f=mix(f,f*smoothstep(.8,.4,length(r-vec2(.5))),.9);" @@ -180,48 +186,42 @@ const char *__temp_cleaned_shader_glsl = "f*=vec3(1);" "return pow(f,vec3(1./2.2));" "}" - "vec3 e(vec2 f,vec3 v,vec3 i)" + "vec3 e(vec2 f,vec3 v,vec3 x)" "{" - "vec3 r=normalize(i-v),y=cross(vec3(0,1,0),r);" + "vec3 r=normalize(x-v),y=cross(vec3(0,1,0),r);" "return normalize(v+r+f.x*y+f.y*cross(r,y)-v);" "}" - "vec3 p(vec2 v,vec3 f,vec3 i)" + "vec3 p(vec2 v,vec3 f,vec3 x)" "{" - "vec3 r=normalize(i-f),y=normalize(cross(vec3(0,1,0),r)),m=normalize(cross(r,y));" - "vec2 n=vec2(t(gl_FragCoord.xy,.13),t(gl_FragCoord.xy,.4));" - "return normalize(v.x*y+v.y*m+1.7*r+sqrt(n.x)*(y*sin(n.y*6.283)+m*cos(n.y*6.283))*.25*1.7/150.2);" + "vec3 r=normalize(x-f),y=normalize(cross(vec3(0,1,0),r)),i=normalize(cross(r,y));" + "vec2 m=vec2(t(gl_FragCoord.xy,.13),t(gl_FragCoord.xy,.4));" + "return normalize(v.x*y+v.y*i+1.7*r+sqrt(m.x)*(y*sin(m.y*6.283)+i*cos(m.y*6.283))*.25*1.7/150.2);" "}" - "vec3 r(vec2 v)" + "vec3 p(vec2 v)" "{" "bool r=!true;" - "vec3 f=vec3(0,5,-3),y=vec3(0),m;" - "m=r?" + "vec3 f=vec3(0,5,-3),y=vec3(0),i;" + "i=r?" "p(v,f,y):" "e(v,f,y);" - "vec3 i=vec3(.051,.0667,.1529),n=vec3(0),d=t(f,m,n),s=m;" + "vec3 m=vec3(.051,.0667,.1529),n=vec3(0),d=s(f,i,n),c=i;" "if(d.z>0.)" "{" - "vec3 k=e(n);" - "i=e(n,k,m,d.y);" - "i=i*exp(-d.x*.04)+mix(i,mix(vec3(.3686,.2431,.4392),vec3(.4,.7294,.9216),pow(max(dot(s,vec3(0,.3,-1)),0.),8.)),1.-exp(-d.x*.04))*(1.-exp(-d.x*.04));" - "m=normalize(reflect(m,k));" - "vec3 c=n+m*.01,g=x(c,m,n);" - "if(g.z>0.)" - "n=c+m*g.x,k=e(n),i+=.1*e(n,k,m,g.y);" + "vec3 k=x(n);" + "m=e(n,k,i,d.y);" + "m=m*exp(-d.x*.04)+mix(m,mix(vec3(.3686,.2431,.4392),vec3(.4,.7294,.9216),pow(max(dot(c,vec3(0,.3,-1)),0.),8.)),1.-exp(-d.x*.04))*(1.-exp(-d.x*.04));" + "i=normalize(reflect(i,k));" + "vec3 g=n+i*.01,a=t(g,i,n);" + "if(a.z>0.)" + "n=g+i*a.x,k=x(n),m+=.1*e(n,k,i,a.y);" "}" - "return i;" - "}" - "vec2 e()" - "{" - "vec2 r=2.*((gl_FragCoord.xy+vec2(0)*.5)/v.xy-.5);" - "r.x*=v.x/v.y;" - "return r;" + "return m;" "}" "void main()" "{" "vec3 v=vec3(0);" - "v+=r(e());" - "v=p(v);" + "v+=p(s());" + "v=e(v);" "gl_FragColor=vec4(v,1);" "}";