;@ map kShape  d BUT004
;@ map kAtt    d ENVtim
;@ map kHold   d ENVtim
;@ map kReset  d BUT002
;@ map kDecay  d ENVtim
;@ map kOutTyp d BUT004
;@ map kKBT    d BUT002

;@ ins k:kTrigI k:kAMI a:InI
;@ outs k:kEnvO a:OutO
opcode EnvAHD, 0, kiikikkkkkkk
  kShape,iAtt,iHold,kReset,iDec,kSW,kKBT, kTrigI,kAMI,kInI, kEnvO, kOutO xin
; NOT FORGET ABOUT KEYBOARD KB
  aIn zar kInI 
  kAM zkr kAMI
  kTrig zkr kTrigI
  
  ;                0    1     2   3 
  k1[] fillarray   1,  -1,    1,  -1
  k2[] fillarray   0,   1,    1,   1
  k3[] fillarray   1,   1,   -1,  -1

  kEnv, kCount, kOn init 0
  iAtt = iAtt/1000
  iHold = iHold/1000
  iDec = iDec/1000
  iTotal = iAtt+iHold+iDec
  if kTrig > .5 && kOn==0 then
    kOn = 1
  endif
env:
  if kOn == 1 then
     ;kEnv linseg 0, 1, 0.9, .5, 0.9, 1, 0
     if kShape==0 then 	; LogExp
	kEnv transeg 0, iAtt, -2, 0.9, iHold, 0, 0.9, iDec, -2, 0
     elseif kShape==1 then 	; LinExp
	kEnv transeg 0, iAtt, 0, 0.9, iHold, 0, 0.9, iDec, -2, 0
     elseif kShape==2 then 	; ExpExp
	kEnv transeg 0, iAtt, 2, 0.9, iHold, 0, 0.9, iDec, -2, 0
     elseif kShape==3 then	; linen
	kEnv linseg 0, iAtt, 0.9, iHold, 0.9, iDec, 0
     endif
     kCount += 1
  endif
  if kCount>=kr*(k(iTotal)) && kEnv==0 then    ; basically waits till the end of the env,
    kOn = 0                        ; when kEnv has become 0 again
    kCount = 0
    reinit env
  endif
  kEnvH = k1[kSW]*kEnv*(1-kAM)+k2[kSW]*k3[kSW]
  zkw kEnv, kEnvO
  zaw aIn*kEnvH, kOutO
endop

;@ ins k:kTrigI k:kAMI k:InI
;@ outs k:kEnvO k:OutO
opcode EnvAHD, 0, kiikikkkkkkk
  kShape,iAtt,iHold,kReset,iDec,kSW,kKBT, kTrigI,kAMI,kInI, kEnvO, kOutO xin
; NOT FORGET ABOUT KEYBOARD KB
  kIn zkr kInI 
  kAM zkr kAMI
  kTrig zkr kTrigI
  
  ;                0    1     2   3 
  k1[] fillarray   1,  -1,    1,  -1
  k2[] fillarray   0,   1,    1,   1
  k3[] fillarray   1,   1,   -1,  -1

  kEnv, kCount, kOn init 0
  iAtt = iAtt/1000
  iHold = iHold/1000
  iDec = iDec/1000
  iTotal = iAtt+iHold+iDec
  if kTrig > .5 && kOn==0 then
    kOn = 1
  endif
env:
  if kOn == 1 then
     ;kEnv linseg 0, 1, 0.9, .5, 0.9, 1, 0
     if kShape==0 then 	; LogExp
	kEnv transeg 0, iAtt, -2, 0.9, iHold, 0, 0.9, iDec, -2, 0
     elseif kShape==1 then 	; LinExp
	kEnv transeg 0, iAtt, 0, 0.9, iHold, 0, 0.9, iDec, -2, 0
     elseif kShape==2 then 	; ExpExp
	kEnv transeg 0, iAtt, 2, 0.9, iHold, 0, 0.9, iDec, -2, 0
     elseif kShape==3 then	; linen
	kEnv linseg 0, iAtt, 0.9, iHold, 0.9, iDec, 0
     endif
     kCount += 1
  endif
  if kCount>=kr*(k(iTotal)) && kEnv==0 then    ; basically waits till the end of the env,
    kOn = 0                        ; when kEnv has become 0 again
    kCount = 0
    reinit env
  endif

  kEnvH = k1[kSW]*kEnv*(1-kAM)+k2[kSW]*k3[kSW]
  zkw kEnv, kEnvO
  zkw kIn*kEnvH, kOutO
endop
