;@ map OSCsem OSCprt
;@ map OSCcnt

;@ ins k k
;@ outs a
opcode OscA, 0, kkkkkkkkkk
; kModLev - 0...1
; kMod - blue - -64..+64
kcoarse,kFine,kKBT,kModLev,kWave,kON,kTuneMode,kPitchIn,kModIn,kOut xin

kMod zkr kModIn

if kKBT != 1 goto NoKBT
  kNote = gkNote
  goto KBT
NoKBT:
  kNote = 64
KBT:

kPitch init 64
if kPitchIn == 0 goto Run
kPitch zkr kPitchIn
Run:
if kTuneMode!=3 then
  kCoarse table kcoarse, giOSCsem
  kFine table kFine, giOSCcnt
  kM_ = kPitch+kModLev*kMod+kNote+kFine*0.01
  kFreq = cpsmidinn(kM_+kCoarse)
else
    if kcoarse <= 32 then
      kFreq table kcoarse, giOSCprt
      kFine table kFine, giOSCcnt
      kFreq *= cent(kFine)
    else
      kPart table kcoarse, giOSCprt
      kFine table kFine, giOSCcnt
      kM_ = kPitch+kModLev*kMod+kNote+kFine*0.01
      kFreq = cpsmidinn(kM_)*kPart
      ;kFreq = 1000
    endif
endif
Out:
aout oscilikt 1, kFreq, kWave+1
zaw aout*kON, kOut
endop

;@ ins a a
;@ outs a
opcode OscA, 0, kkkkkkkkkk
; kModLev - 0...1
; kMod - blue - -64..+64
kcoarse,kFine,kKBT,kModLev,kWave,kON,kTuneMode,kPitchIn,kModIn,kOut xin

aMod zar kModIn
kMod = k(aMod)

if kKBT != 1 goto NoKBT
  kNote = gkNote
  goto KBT
NoKBT:
  kNote = 64
KBT:

kPitch init 64
if kPitchIn == 0 goto Run
aPitch zar kPitchIn
kPitch = k(aPitch)
Run:
if kTuneMode!=3 then
  kCoarse table kcoarse, giOSCsem
  kFine table kFine, giOSCcnt
  kM_ = kPitch+kModLev*kMod+kNote+kFine*0.01
  kFreq = cpsmidinn(kM_+kCoarse)
else
    if kcoarse <= 32 then
      kFreq table kcoarse, giOSCprt
      kFine table kFine, giOSCcnt
      kFreq *= cent(kFine)
    else
      kPart table kcoarse, giOSCprt
      kFine table kFine, giOSCcnt
      kM_ = kPitch+kModLev*kMod+kNote+kFine*0.01
      kFreq = cpsmidinn(kM_)*kPart
      ;kFreq = 1000
    endif
endif
Out:
aout oscilikt 1, kFreq, kWave+1
zaw aout*kON, kOut
endop
