;@ ins k k
;@ outs k
opcode Pulse, 0, kkkkkkk
  kTime,kMod,kRange,kMode,kin,kmodi,kout xin
  kIn zkr kin
  kModIn zkr kmodi
  kOut init 0
  KCurrent init 0

  kTimer table kTime+kMod*kModIn, giLOGsub
  ; TODO only first range by now

  if kMode != 0 goto AltMode
    kTrig trigger kIn,0.5,0
    goto Next
AltMode:
    kTrig trigger kIn,0.5,1
Next:
  if kTrig != 1 goto Over
      kCurrent = kTimer
Over:
  KCurrent -= 1/kr
  kCurrent limit kTimer, 0, 100*kr
  kOut = (KCurrent > 0 ? 1:0)
  zkw kOut, kout
endop

;@ ins a a
;@ outs a
opcode Pulse, 0, kkkkkkk
  kTime,kMod,kRange,kMode,kin,kmodi,kout xin
  setksmps 1
  aIn zar kin
  aModIn zar kmodi
  kIn = k(aIn)
  kModIn = k(aModIn)
  kOut init 0
  KCurrent init 0

  kTimer table kTime+kMod*kModIn, giLOGsub
  ; TODO only first range by now

  if kMode != 0 goto AltMode
    kTrig trigger kIn,0.5,0
    goto Next
AltMode:
    kTrig trigger kIn,0.5,1
Next:
  if kTrig != 1 goto Over
      kCurrent = kTimer
Over:
  KCurrent -= 1/kr
  kCurrent limit kTimer, 0, 100*kr
  kOut = (KCurrent > 0 ? 1:0)
  zaw a(kOut), kout
endop
