﻿;@ map d BUT004
;@ map d ENVtim
;@ map d ENVtim
;@ map d OSCunD
;@ map d ENVtim
;@ map d BUT006
;@ map d BUT002
;@ map d BUT002

;@ args kkkkkkkk,kkk,kk
opcode EnvADSR, 0, kkkkkkkkkkkkk
kShape,kA,kD,kS,kR,kOutType,kKB,kReset, kin,kGatei,kAMi,kEnvo,kOut xin
; currently only lin Shape

k1[] fillarray 1,-1, 1,-1, 2,-2
k2[] fillarray 0, 1,-1, 0,-1, 1


kIn zkr kin
kGate zkr kGatei

if kKB != 1 goto Next2
	kGate += gkGate
	kGate limit kGate, -1, 1
Next2:


kAM init 64
kEnv init 0
kState init 0

kA /= 1000
kD /= 1000
kR /= 1000
kS /= 64


if kAMi == 1 goto Main
	kAM zkr kAMi

Main:
kTrig trigger kGate,0.00001 , 1
if kTrig == 1 then
	kState = 4
endif

if kGate <= 0 goto Halt
	if kState==4 then
		if kReset==0 goto Next
			kEnv=0
	endif
Next:
if kState = 2 goto Decay
if kState = 3 goto ESust
kState = 1
Attack:
kEnv += 1/(kA*kr)
kEnv limit kEnv, 0, 1
if kEnv != 1 goto Over
kState = 2

Decay:
kEnv -= (1-kS)/(kD*kr)
kEnv limit kEnv, kS, 1
if kEnv != kS goto Over
kState = 3
ESust:
kEnv = kS
goto Over


Halt:
if kState == 0 goto Over

kEnv -= kS/(kR*kr)
kEnv limit kEnv,0,1
if kEnv > 0 goto Over
kState = 0

Over:
kEnv *= kAM/64
kEnv1 = kEnv*k1[kOutType]+k2[kOutType]
zkw kEnv1, kEnvo
zaw kEnv1*kIn, kOut
endop


;@ args kkkkkkkk,akk,ka
opcode EnvADSR, 0, kkkkkkkkkkkkk
kShape,kA,kD,kS,kR,kOutType,kKB,kReset, kin,kGatei,kAMi,kEnvo,kOut xin
; currently only lin Shape

k1[] fillarray 1,-1, 1,-1, 2,-2
k2[] fillarray 0, 1,-1, 0,-1, 1


aIn zar kin
kGate zkr kGatei

if kKB != 1 goto Next2
	kGate += gkGate
	kGate limit kGate, -1, 1
Next2:


kAM init 64
kEnv init 0
kState init 0

kA /= 1000
kD /= 1000
kR /= 1000
kS /= 64


if kAMi == 1 goto Main
	kAM zkr kAMi

Main:
kTrig trigger kGate,0.00001 , 1
if kTrig == 1 then
	kState = 4
endif

if kGate <= 0 goto Halt
	if kState==4 then
		if kReset==0 goto Next
			kEnv=0
	endif
Next:
if kState = 2 goto Decay
if kState = 3 goto ESust
kState = 1
Attack:
kEnv += 1/(kA*kr)
kEnv limit kEnv, 0, 1
if kEnv != 1 goto Over
kState = 2

Decay:
kEnv -= (1-kS)/(kD*kr)
kEnv limit kEnv, kS, 1
if kEnv != kS goto Over
kState = 3
ESust:
kEnv = kS
goto Over


Halt:
if kState == 0 goto Over

kEnv -= kS/(kR*kr)
kEnv limit kEnv,0,1
if kEnv > 0 goto Over
kState = 0

Over:
kEnv *= kAM/64
kEnv1 = kEnv*k1[kOutType]+k2[kOutType]
zkw kEnv1, kEnvo
zaw kEnv1*aIn, kOut
endop
