form caption("XY Pad") size(400, 520), guiMode("queue"), colour(58, 110, 182), pluginId("def1")
image bounds(10, 10, 380, 380), corners(10), colour(34, 34, 34) channel("xypad")
keyboard bounds(10, 420, 381, 80) channel("keyboard10000"), keypressBaseOctave(5)
-n -d -+rtmidi=NULL -M0 -m0d --midi-key=4
; Initialize the global variables.
ksmps = 32
nchnls = 2
0dbfs = 1
opcode TrailFade, 0, kkkki
kX, kY, kFade, kBallSize, iId xin
iDelayTime = .6
cabbageSet metro(20), sprintf("trailBall1%d", iId), "bounds", delayk(kX-kBallSize/2, iDelayTime*.0), delayk(kY-kBallSize/2, iDelayTime*.0), kBallSize, kBallSize
cabbageSet metro(20), sprintf("trailBall2%d", iId), "bounds", delayk(kX-kBallSize/2, iDelayTime*.1), delayk(kY-kBallSize/2, iDelayTime*.1), kBallSize*.9, kBallSize*.9
cabbageSet metro(20), sprintf("trailBall3%d", iId), "bounds", delayk(kX-kBallSize/2, iDelayTime*.2), delayk(kY-kBallSize/2, iDelayTime*.2), kBallSize*.8, kBallSize*.8
cabbageSet metro(20), sprintf("trailBall4%d", iId), "bounds", delayk(kX-kBallSize/2, iDelayTime*.3), delayk(kY-kBallSize/2, iDelayTime*.3), kBallSize*.7, kBallSize*.7
cabbageSet metro(20), sprintf("trailBall5%d", iId), "bounds", delayk(kX-kBallSize/2, iDelayTime*.4), delayk(kY-kBallSize/2, iDelayTime*.4), kBallSize*.6, kBallSize*.6
cabbageSet metro(20), sprintf("trailBall6%d", iId), "bounds", delayk(kX-kBallSize/2, iDelayTime*.5), delayk(kY-kBallSize/2, iDelayTime*.5), kBallSize*.5, kBallSize*.5
cabbageSet metro(20), sprintf("trailBall7%d", iId), "bounds", delayk(kX-kBallSize/2, iDelayTime*.6), delayk(kY-kBallSize/2, iDelayTime*.6), kBallSize*.4, kBallSize*.4
cabbageSet metro(20), sprintf("trailBall8%d", iId), "bounds", delayk(kX-kBallSize/2, iDelayTime*.7), delayk(kY-kBallSize/2, iDelayTime*.7), kBallSize*.3, kBallSize*.3
cabbageSet metro(20), sprintf("trailBall9%d", iId), "bounds", delayk(kX-kBallSize/2, iDelayTime*.8), delayk(kY-kBallSize/2, iDelayTime*.8), kBallSize*.2, kBallSize*.2
cabbageSet metro(20), sprintf("trailBall10%d", iId), "bounds", delayk(kX-kBallSize/2,iDelayTime*.9), delayk(kY-kBallSize/2, iDelayTime*.9), kBallSize*.1, kBallSize*.1
endop
opcode XYPad, kk, i[]i
iXYPadBounds[], iId xin
kXValue init 0
kYValue init 0
iPadLeft = iXYPadBounds[0]
iPadTop = iXYPadBounds[1]
iPadWidth = iXYPadBounds[2]
iPadHeight = iXYPadBounds[3]
iPadCentreX = iPadLeft + iPadWidth/2
iPadCentreY = iPadTop + iPadHeight/2
iBallSize = 30
iBallBounds[] fillarray iPadWidth/2-iBallSize/2, iPadHeight/2-iBallSize/2, 30, 30
;create inner components based on main xypad size
ShAxis sprintf "bounds(%d, %d, %d, 1), channel(\"hAxis%d\"), colour(200, 200, 200)", iPadLeft, iBallBounds[1]+iBallSize/2, iPadWidth, iId
SvAxis sprintf "bounds(%d, %d, 1, %d), channel(\"vAxis%d\"), colour(200, 200, 200)", iBallBounds[0]+iBallSize/2, iPadTop, iPadWidth, iId
cabbageCreate "image", ShAxis
cabbageCreate "image", SvAxis
;create ball
SBall sprintf "bounds(%d, %d, %d, %d), channel(\"ball%d\"), colour(147, 210, 0), shape(\"ellipse\")", iBallBounds[0], iBallBounds[1], iBallBounds[2], iBallBounds[3], iId
cabbageCreate "image", SBall
kBallSize init iBallSize
iBallCount = 1
while iBallCount < 10 do
SBall sprintf "bounds(%d, %d, %d, %d), channel(\"trailBall%d%d\"), colour(147, 210, 0, %d), shape(\"ellipse\")", iBallBounds[0]+iBallCount, iBallBounds[1]+iBallCount, iBallBounds[2], iBallBounds[3], iBallCount, iId, 10-iBallCount*(255/10)
cabbageCreate "image", SBall
iBallCount += 1
od
SXLabel sprintf "bounds(%d, %d, 60, 22) channel(\"x%d\") colour(34, 34, 34), corners(5), range(0, 1, 0, 1, 0.01)", iPadLeft, iPadTop+iPadHeight+4, iId
SYLabel sprintf "bounds(%d, %d, 60, 22) channel(\"y%d\") colour(34, 34, 34), corners(5), range(0, 1, 0, 1, 0.01)", iPadLeft + 70, iPadTop+iPadHeight+4, iId
cabbageCreate "nslider", SXLabel
cabbageCreate "nslider", SYLabel
;overlay image to make slider readonly
cabbageCreate "image", sprintf("bounds(%d, %d, 130, 22), channel(\"overlay%d\"), colour(255,0,0, 0)", iPadLeft, iPadHeight+iPadTop+4, iId)
kXDown, kYDown, kXUp, kYUp init 0
kIncrY, kIncrX init 0
kXPos chnget "MOUSE_X"
kYPos chnget "MOUSE_Y"
kMouseLeftDown chnget "MOUSE_DOWN_LEFT"
kMouseRightDown chnget "MOUSE_DOWN_RIGHT"
kAutomation init 0
iSensitivity = 0.01
kDistanceFromCentre init 0
kCurrentX, kCurrentY init 0
if kMouseLeftDown==1 || kMouseRightDown == 1 && kXPos > iPadLeft && kXPos < iPadLeft + iPadWidth && kYPos > iPadTop && kYPos < iPadHeight + iPadTop then
kBallX limit kXPos, iPadLeft+kBallSize/2, iPadLeft+iXYPadBounds[2]-kBallSize/2
kBallY limit kYPos, iPadTop+kBallSize/2, iPadTop+iPadHeight-kBallSize/2
kCurrentX = kBallX
kCurrentY = kBallY
cabbageSet 1, sprintf("ball%d", iId), "bounds", kBallX-kBallSize/2, kBallY-kBallSize/2, kBallSize, kBallSize
cabbageSet 1, sprintf("vAxis%d", iId), "bounds", kBallX, iPadTop, 1, iPadHeight
cabbageSet 1, sprintf("hAxis%d", iId), "bounds", iPadLeft, kBallY, iPadWidth, 1
kDistanceFromCentre = 1 - (sqrt(pow:k(iPadCentreX-kBallX, 2)+pow:k(iPadCentreY-kBallY, 2)))/(iPadWidth/2)
kFadeColour limit kDistanceFromCentre*255, 100, 255
cabbageSet 1, sprintf("hAxis%d", iId), "colour", kFadeColour, kFadeColour, kFadeColour
cabbageSet 1, sprintf("vAxis%d", iId), "colour", kFadeColour, kFadeColour, kFadeColour
kAutomation = 0
kTrailTime = 1
endif
if changed(kMouseRightDown) == 1 then
if kMouseRightDown == 1 then
kXDown = kXPos
kYDown = kYPos
else
kVel = sqrt(pow:k(kXDown-kXPos, 2)+pow:k(kYDown-kYPos, 2))/iPadWidth
kAutomation = 1
;printks "Velocty:%f\n", 0, kVel
;printks "XDiff:%f\n", 0, (kXPos-kXDown)
;printks "YDiff:%f\n", 0, (kYPos-kYDown)
kIncrX = (kXPos-kXDown)*kVel*iSensitivity
kIncrY = (kYPos-kYDown)*kVel*iSensitivity
kXUp = kXPos-iBallSize/2
kYUp = kYPos-iBallSize/2
endif
endif
if kAutomation == 1 then
kYUp += (kIncrY)
kXUp += (kIncrX)
cabbageSet 1, sprintf("ball%d", iId), "bounds", kXUp+kIncrX, kYUp+kIncrY, kBallSize, kBallSize
cabbageSet 1, sprintf("vAxis%d", iId), "bounds", kXUp+kIncrX+kBallSize/2, iPadTop, 2, iPadHeight
cabbageSet 1, sprintf("hAxis%d", iId), "bounds", iPadLeft, kYUp+kIncrY+kBallSize/2, iPadWidth, 2
kCurrentX = kXUp+kIncrX+kBallSize/2
kCurrentY = kYUp+kIncrY+kBallSize/2
kDistanceFromCentre = 1 - (sqrt(pow:k(iPadCentreX-(kXUp+kIncrX), 2)+pow:k(iPadCentreY-(kYUp+kIncrY), 2)))/(iPadWidth/2)
kFadeColour limit kDistanceFromCentre*255, 100, 255
cabbageSet 1, sprintf("hAxis%d", iId), "colour", kFadeColour, kFadeColour, kFadeColour
cabbageSet 1, sprintf("vAxis%d", iId), "colour", kFadeColour, kFadeColour, kFadeColour
kRight trigger kXUp, iPadLeft+iPadWidth-kBallSize, 0
kLeft trigger kXUp, iPadLeft, 1
kBottom trigger kYUp, iPadTop+iPadHeight-kBallSize, 0
kTop trigger kYUp, iPadTop, 1
if kRight == 1 || kLeft == 1 then
kIncrX *= -1
endif
if kTop == 1 || kBottom == 1 then
kIncrY *= -1
endif
kTrailTime = 1
endif
if kTrailTime > 0 then
TrailFade kCurrentX, kCurrentY, kTrailTime, kBallSize, iId
kTrailTime = kTrailTime > 0 ? kTrailTime*.99 : 0
endif
kOutX = (kCurrentX-iPadLeft-iBallSize/2)/(iPadWidth-iBallSize)
kOutY = (kCurrentY-iPadTop-iBallSize/2)/(iPadHeight-iBallSize)
xout tonek(kOutX, 10), tonek(kOutY, 10)
cabbageSetValue sprintf("x%d", iId), kOutX
cabbageSetValue sprintf("y%d", iId), kOutY
endop
instr 1
kEnv madsr .01, .4, .2, .5
a1 vco2 .4*kEnv, p4+cabbageGetValue("x1")*.1
a2 vco2 .4*kEnv, p4+cabbageGetValue("y1")*.1
outs a2+a1, a2+a1
chnset a2+a1, "synthSig"
endin
instr 1000
iId = 1
iXYPadBounds[] cabbageGet "xypad", "bounds"
kXVal, kYVal XYPad iXYPadBounds, iId
endin
instr 1001
aIn chnget "synthSig"
a1, a2 pan2 aIn, abs(jitter:k(1, .1, .3))
aL, aR reverbsc a1, a2, .95, 5000
outs aL, aR
chnclear "synthSig"
endin
f1 0 4096 10 1 .7 .2 .1
i1000 0 z
i1001 0 z
;causes Csound to run for about 7000 years...
f0 z
;starts instrument 1 and runs it for a week