;@ map d RNDbpm
;@ map d MID000
;@ map d MID000
;@ map d MID000
;@ map d CLA000
;TODO Completed. Needs checking & optimization 
;@ args kkkkk,k,kkkk
opcode ClkGen,0, kkkkkkkkkk
kBPM,kOn,kSource,kSync,kSwing, kRsti,k96o,k16o,kClkAo,kSynco xin

kRst zkr kRsti
kSync = 2^kSync
if kSource == 0 goto InterS;internal
	kBPM = gkBPM
InterS:

kClkFr = kBPM * 96 / 60

kRst trigger kRst,0.00001,0
kOnT trigger kOn,0.5,0
kST trigger kSource,0.5,0

if (kRst == 1) || (kOnT == 1) || (kST == 1) then 
	reinit Run
endif
Run:
kClk metro kClkFr,0

kCount1 init 0
if kClk != 1 goto nextOut
	kCount1 += 1
if kCount1 != 15 goto next2
	kCount1 = 0
next2:
k16 trigger kCount1, 0.5, 0

kCount2 init 0
kCount2 += 1
if kCount2 != (15 * kSync) goto next3
	kCount2 = 0
next3:
kSy trigger kCount2, 0.5, 0
nextOut:

kSwap init 1
if kSwap == 1 goto next


k16 vdel_k k16, 60/kBPM/16*kSwing*2*0.75, 0.76*60/24/16, 0
next:
if k16 == 1 then
	kSwap *= -1
endif
skip:

;outs a(k16)*kOn*0.9,a(k16)*kOn*0.9
	zkw kOn, kClkAo
	zkw kClk * kOn, k96o
	zkw k16 * kOn, k16o
	zkw kSy * kOn, kSynco
	
k16 = 0
kSy = 0
endop
