;@ map OSCsem OSCprt
;@ map OSCcnt

;@ ins k k k k
;@ outs a
opcode OscPM, 0, kkkkkkkkkkkkk
; kModLev - 0...1
; kMod - blue - -64..+64
kCoarse,kFine,kKBT,kTuneMode,kPM,kON,kPitchM,kWave, kModIn,kSyncIn,kPMIn,kPitchIn,kOut xin

kMod zkr kModIn
aPM zar kPMIn
async zar kSyncIn

; PM Ind Calc - SAME as OscC or OscB
kPM *= 100 ; NEEDS CHANGING CLA000 to CLA-REAL..
kIndx = 0.000039*kPM*kPM*kPM - 0.00049*kPM*kPM + 0.016*kPM - 0.033 ; SHOULD BE BETTER APPR
kIndx limit kIndx, 0, 80
; Out PM Calc

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
    endif
endif
Out:

aout oscilikts 1, kFreq + aPM*kIndx*cpsmidinn(kNote), kWave+1, async, 0

zaw aout*kON, kOut
endop

;@ ins a a a a
;@ outs a
opcode OscPM, 0, kkkkkkkkkkkkk
; kModLev - 0...1
; kMod - blue - -64..+64
kCoarse,kFine,kKBT,kTuneMode,kPM,kON,kPitchM,kWave, kModIn,kSyncIn,kPMIn,kPitchIn,kOut xin

kMod zkr kModIn
aPM zar kPMIn
async zar kSyncIn

; PM Ind Calc - SAME as OscC or OscB
kPM *= 100 ; NEEDS CHANGING CLA000 to CLA-REAL..
kIndx = 0.000039*kPM*kPM*kPM - 0.00049*kPM*kPM + 0.016*kPM - 0.033 ; SHOULD BE BETTER APPR
kIndx limit kIndx, 0, 80
; Out PM Calc

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
    endif
endif
Out:

aout oscilikts 1, kFreq + aPM*kIndx*cpsmidinn(kNote), kWave+1, async, 0

zaw aout*kON, kOut
endop
