; ********************************************************* ; * ; * DRUM routine ; * ; * EDI = target buffer ; * ECX = length ; * ; * mix == 0.0 -> hihat ; * mix == 1.0 -> kick ; * ; ********************************************************* section .text bits 32 global _KZG_drum@0 _KZG_drum@0: fldz xor ebx,ebx %ifdef DEBUG mov ebp,_KZG_drum_kickfreq %endif mov eax,ecx _KZG_drum_onesample: ; kick sample fld st0 fsin fmul dword [ebp+8] ; _KZG_drum_mix ; noise (hihat) call near _KZG_frand@0 fld1 fsub dword [ebp+8] ; _KZG_drum_mix fmulp st1,st0 ; mix faddp st1 ; volumeenv push ecx fild dword [esp] pop edx push eax fild dword [esp] pop edx fdivp st1 fmulp st1 ; store fstp dword [edi] ; decay push eax fild dword [esp] pop edx push ebx fild dword [esp] pop edx fmul dword [ebp+4] ; _KZG_drum_kickdecay fld1 faddp st1 fdivp st1 fmul dword [ebp] ; _KZG_drum_kickfreq faddp st1 inc ebx add edi, byte 4 loop _KZG_drum_onesample fstp st0 ret %ifdef DEBUG section .data global _KZG_drum_kickfreq _KZG_drum_kickfreq dd 0.001 global _KZG_drum_kickdecay _KZG_drum_kickdecay dd 1.0 global _KZG_drum_mix _KZG_drum_mix dd 0.6 %endif ;global _KZG_drum_kickfreq ;_KZG_drum_kickfreq dd 0.00 ;global _KZG_drum_kickdecay ;_KZG_drum_kickdecay dd 0.0 ;global _KZG_drum_mix ;_KZG_drum_mix dd 0.0 ;%endif