From 7fbbd806c6ac54a95e0f85781750c59b6620c445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6rkem?= Date: Sun, 22 Nov 2020 13:08:46 +0300 Subject: [PATCH] Add files via upload --- supercollider/starsound.scd | 118 ++++++++++++++++++++++ test.py | 189 ++++++++++++++++++++++++++++++++++++ testimage.jpg | Bin 0 -> 30356 bytes 3 files changed, 307 insertions(+) create mode 100644 supercollider/starsound.scd create mode 100644 test.py create mode 100644 testimage.jpg diff --git a/supercollider/starsound.scd b/supercollider/starsound.scd new file mode 100644 index 0000000..edba693 --- /dev/null +++ b/supercollider/starsound.scd @@ -0,0 +1,118 @@ +( +( +f = { |msg, time, addr| + if(msg[0] != '/status.reply') { + "time: % sender: %\nmessage: %\n".postf(time, addr, msg); + } +}; +thisProcess.addOSCRecvFunc(f); +); + +( +OSCdef(\note_C, + { + // a simple function that triggers an envelope + x = {COsc.ar(261.63)!2 * EnvGen.ar(Env.perc,doneAction:2)}; + {FreeVerb.ar(x,0.3,0.7,0.1)}.play +}, '/note_C') +); + +( +OSCdef(\note_Db, + { + // a simple function that triggers an envelope + {SinOsc.ar(277.18)!2 * EnvGen.ar(Env.perc,doneAction:2)}.play; + //{FreeVerb.ar(x, 0.7, 0.8, 0.25)}.play; +}, '/note_Db') +); + +( +OSCdef(\note_D, + { + // a simple function that triggers an envelope + {SinOsc.ar(293.66)!2 * EnvGen.ar(Env.perc,doneAction:2)}.play; + //{FreeVerb.ar(x, 0.7, 0.8, 0.25)}.play; +}, '/note_D') +); + +( +OSCdef(\note_Eb, + { + // a simple function that triggers an envelope + {SinOsc.ar(311.13)!2 * EnvGen.ar(Env.perc,doneAction:2)}.play; + //{FreeVerb.ar(x, 0.7, 0.8, 0.25)}.play; +}, '/note_Eb') +); + +( +OSCdef(\note_E, + { + // a simple function that triggers an envelope + {SinOsc.ar(329.63)!2 * EnvGen.ar(Env.perc,doneAction:2)}.play; + //{FreeVerb.ar(x, 0.7, 0.8, 0.25)}.play; +}, '/note_E') +); + +( +OSCdef(\note_F, + { + // a simple function that triggers an envelope + {SinOsc.ar(349.23)!2 * EnvGen.ar(Env.perc,doneAction:2)}.play; + //{FreeVerb.ar(x, 0.7, 0.8, 0.25)}.play; +}, '/note_F') +); + +( +OSCdef(\note_Gb, + { + // a simple function that triggers an envelope + {SinOsc.ar(369.99)!2 * EnvGen.ar(Env.perc,doneAction:2)}.play; + //{FreeVerb.ar(x, 0.7, 0.8, 0.25)}.play; +}, '/note_Gb') +); + +( +OSCdef(\note_G, + { + // a simple function that triggers an envelope + {SinOsc.ar(392.00)!2 * EnvGen.ar(Env.perc,doneAction:2)}.play; + //{FreeVerb.ar(x, 0.7, 0.8, 0.25)}.play; +}, '/note_G') +); + +( +OSCdef(\note_Ab, + { + // a simple function that triggers an envelope + {SinOsc.ar(415.30)!2 * EnvGen.ar(Env.perc,doneAction:2)}.play; + //{FreeVerb.ar(x, 0.7, 0.8, 0.25)}.play; +}, '/note_Ab') +); + +( +OSCdef(\note_A, + { + // a simple function that triggers an envelope + {SinOsc.ar(440.00)!2 * EnvGen.ar(Env.perc,doneAction:2)}.play; + //{FreeVerb.ar(x, 0.7, 0.8, 0.25)}.play; +}, '/note_A') +); + +( +OSCdef(\note_Bb, + { + // a simple function that triggers an envelope + {SinOsc.ar(466.16)!2 * EnvGen.ar(Env.perc,doneAction:2)}.play; + //{FreeVerb.ar(x, 0.7, 0.8, 0.25)}.play; +}, '/note_Bb') +); + +( +OSCdef(\note_B, + { + // a simple function that triggers an envelope + {SinOsc.ar(493.88)!2 * EnvGen.ar(Env.perc,doneAction:2)}.play; + //{FreeVerb.ar(x, 0.7, 0.8, 0.25)}.play; +}, '/note_B') +); +) diff --git a/test.py b/test.py new file mode 100644 index 0000000..85b8e53 --- /dev/null +++ b/test.py @@ -0,0 +1,189 @@ +import cv2 +import numpy +from numpy import asarray +from numpy import savetxt +from osc4py3.as_eventloop import * +from osc4py3 import oscbuildparse + +osc_startup() +osc_udp_client("127.0.0.1", 57120, "local") +note_C = oscbuildparse.OSCMessage("/note_C", None, ["text"]) +note_Db = oscbuildparse.OSCMessage("/note_Db", None, ["text"]) +note_D = oscbuildparse.OSCMessage("/note_D", None, ["text"]) +note_Eb = oscbuildparse.OSCMessage("/note_Eb", None, ["text"]) +note_E = oscbuildparse.OSCMessage("/note_E", None, ["text"]) +note_F = oscbuildparse.OSCMessage("/note_F", None, ["text"]) +note_Gb = oscbuildparse.OSCMessage("/note_Gb", None, ["text"]) +note_G = oscbuildparse.OSCMessage("/note_G", None, ["text"]) +note_Ab = oscbuildparse.OSCMessage("/note_Ab", None, ["text"]) +note_A = oscbuildparse.OSCMessage("/note_A", None, ["text"]) +note_Bb = oscbuildparse.OSCMessage("/note_Bb", None, ["text"]) +note_B = oscbuildparse.OSCMessage("/note_B", None, ["text"]) + +#import imutilsss +CONNECTIVITY = 4 +DRAW_CIRCLE_RADIUS = 5 +imageorg = cv2.imread('testimage.jpg') +imageorginal = cv2.imread('testimage.jpg') +gray = cv2.cvtColor(imageorg, cv2.COLOR_BGR2GRAY) +thresh = cv2.threshold(gray, 80, 255, cv2.THRESH_BINARY)[1] +height, width, channels = imageorg.shape + +# perform a series of erosions and dilations to remove +# any small blobs of noise from the thresholded image +# thresh = cv2.erode(thresh, None, iterations=2) +# thresh = cv2.dilate(thresh, None, iterations=4) +components = cv2.connectedComponentsWithStats(thresh, CONNECTIVITY, cv2.CV_32S) +centers = components[3] +savetxt('data.csv', centers, delimiter=',') + +def calculateDistance(x1,y1,x2,y2): + dist = numpy.sqrt((x2 - x1)**2 + (y2 - y1)**2) + return dist +#print calculateDistance(x1, y1, x2, y2) + +print(centers) +print(height) +print(width) +centerDistance = numpy.zeros((int(centers.shape[0]),4)) +#print(centers.shape[0]) +print(centerDistance) + + +count=0 +for center in centers: + cv2.circle(imageorg, (int(center[0]), int(center[1])), DRAW_CIRCLE_RADIUS, (255), thickness=1) + #numpy.append(centers[0], calculateDistance(int(width / 2), int(height / 2),int(center[0]), int(center[1]))) + numpy.put(centerDistance[count], [0,1, 2], [center[0],center[1], calculateDistance(int(width / 2), int(height / 2),int(center[0]), int(center[1]))]) + count+=1 +print(centers) +print(centerDistance) + +line_thickness = 1 +cv2.line(imageorg, (int(width / 2), 0), (int(width / 2), int(height)), (0, 0, 255), thickness=line_thickness) +cv2.line(imageorg, (int(width / 2 - height / 2), int(height / 2)), (int(width/2 + height / 2), int(height / 2)), (0, 0, 255), thickness=line_thickness) +cv2.line(imageorg, (int((width / 2) - numpy.sqrt(3)*int(height / 2)/2), int(height / 2 - int(height / 2) / 2)), (int((width / 2) + numpy.sqrt(3)*int(height / 2)/2), int(height / 2 + int(height / 2) / 2)), (0, 0, 255), thickness=line_thickness) +cv2.line(imageorg, (int((width / 2) - int(height / 2) / 2), int(height / 2 - numpy.sqrt(3)*int(height / 2)/2)), (int((width / 2) + int(height / 2) / 2), int(height / 2 + numpy.sqrt(3)*int(height / 2)/2)), (0, 0, 255), thickness=line_thickness) +cv2.line(imageorg, (int((width / 2) - numpy.sqrt(3)*int(height / 2)/2), int(height / 2 + int(height / 2) / 2)), (int((width / 2) + numpy.sqrt(3)*int(height / 2)/2), int(height / 2 - int(height / 2) / 2)), (0, 0, 255), thickness=line_thickness) +cv2.line(imageorg, (int((width / 2) - int(height / 2) / 2), int(height / 2 + numpy.sqrt(3)*int(height / 2)/2)), (int((width / 2) + int(height / 2) / 2), int(height / 2 - numpy.sqrt(3)*int(height / 2)/2)), (0, 0, 255), thickness=line_thickness) + +radiusCount=0 +# for x in centerDistance: +# drawingImage = imageorg.copy() +# cv2.circle(drawingImage, (int(width / 2), int(height / 2)), radiusCount, (0, 255, 0), thickness=2) +# cv2.imshow('Overlay',drawingImage) +# cv2.waitKey(20) +# radiusCount+=1 +# print(count) + +def inArea(xp,yp,x1,y1,x2,y2,x3,y3): + # d1 = (px1-x2)*(y1-y2) - (x1-x2)*(py1-y2) + # d2 = (px1-x3)*(y2-y3) - (x2-x3)*(py1-y3) + # d3 = (px1-x3)*(y3-y1) - (x3-x1)*(py1-y1) + c1 = (x2-x1)*(yp-y1)-(y2-y1)*(xp-x1) + c2 = (x3-x2)*(yp-y2)-(y3-y2)*(xp-x2) + c3 = (x1-x3)*(yp-y3)-(y1-y3)*(xp-x3) + + if (c1<0 and c2<0 and c3<0) or (c1>0 and c2>0 and c3>0): + print("The star (" + str(xp) + "," + str(yp) + ") is in the region," + "(" + str(x1) + "," + str(y1) + ")" + "(" + str(x2) + "," + str(y2) + ")" + "(" + str(x3) + "," + str(y3) + ")") + return True + else: + #print("The point is outside the triangle.") + return False + +testCount = 0; +for x in range(int(height / 2)): + drawingImage = imageorg.copy() + cv2.circle(drawingImage, (int(width / 2), int(height / 2)), x, (0, 255, 0), thickness=1) + for distance in centerDistance: + if (distance[3]==0) and (distance[2] <= x) and inArea(int(distance[0]),int(distance[1]),int(width/2),int(height/2),int(width/2),0,int((width / 2) + int(height / 2) / 2), int(height / 2 - numpy.sqrt(3)*int(height / 2)/2)): + cv2.circle(imageorg, (int(distance[0]),int(distance[1])), DRAW_CIRCLE_RADIUS, (0, 255, 0), thickness=1) + testCount+=1 + osc_send(note_C, "local") + osc_process() + #print(testCount) + distance[3] = 1 + # elif (distance[3]==0) and (distance[2] <= x) and inArea(int(distance[0]),int(distance[1]),int(width/2),int(height/2),int((width / 2) + int(height / 2) / 2), int(height / 2 - numpy.sqrt(3)*int(height / 2)/2),int((width / 2) + numpy.sqrt(3)*int(height / 2)/2), int(height / 2 - int(height / 2) / 2)): + # cv2.circle(imageorg, (int(distance[0]),int(distance[1])), DRAW_CIRCLE_RADIUS, (200, 120, 200), thickness=1) + # osc_send(note_Db, "local") + # osc_process() + # distance[3] = 1 + elif (distance[3]==0) and (distance[2] <= x) and inArea(int(distance[0]),int(distance[1]),int(width/2),int(height/2),int((width / 2) + numpy.sqrt(3)*int(height / 2)/2), int(height / 2 - int(height / 2) / 2),int(width/2 + height / 2), int(height / 2)): + cv2.circle(imageorg, (int(distance[0]),int(distance[1])), DRAW_CIRCLE_RADIUS, (50, 150, 20), thickness=1) + osc_send(note_D, "local") + osc_process() + distance[3] = 1 + # elif (distance[3]==0) and (distance[2] <= x) and inArea(int(distance[0]),int(distance[1]),int(width/2),int(height/2),int(width/2 + height / 2), int(height / 2),int((width / 2) + numpy.sqrt(3)*int(height / 2)/2), int(height / 2 + int(height / 2) / 2)): + # cv2.circle(imageorg, (int(distance[0]),int(distance[1])), DRAW_CIRCLE_RADIUS, (200, 100, 50), thickness=1) + # osc_send(note_Eb, "local") + # osc_process() + # distance[3] = 1 + elif (distance[3]==0) and (distance[2] <= x) and inArea(int(distance[0]),int(distance[1]),int(width/2),int(height/2),int((width / 2) + numpy.sqrt(3)*int(height / 2)/2), int(height / 2 + int(height / 2) / 2),int((width / 2) + int(height / 2) / 2), int(height / 2 + numpy.sqrt(3)*int(height / 2)/2)): + cv2.circle(imageorg, (int(distance[0]),int(distance[1])), DRAW_CIRCLE_RADIUS, (200, 200, 50), thickness=1) + osc_send(note_E, "local") + osc_process() + distance[3] = 1 + elif (distance[3]==0) and (distance[2] <= x) and inArea(int(distance[0]),int(distance[1]),int(width/2),int(height/2),int((width / 2) + int(height / 2) / 2), int(height / 2 + numpy.sqrt(3)*int(height / 2)/2),int(width / 2),int(height)): + cv2.circle(imageorg, (int(distance[0]),int(distance[1])), DRAW_CIRCLE_RADIUS, (200, 200, 200), thickness=1) + osc_send(note_F, "local") + osc_process() + distance[3] = 1 + # elif (distance[3]==0) and (distance[2] <= x) and inArea(int(distance[0]),int(distance[1]),int(width/2),int(height/2),int(width / 2),int(height),int((width / 2) - int(height / 2) / 2), int(height / 2 + numpy.sqrt(3)*int(height / 2)/2)): + # cv2.circle(imageorg, (int(distance[0]),int(distance[1])), DRAW_CIRCLE_RADIUS, (0, 200, 200), thickness=1) + # osc_send(note_Gb, "local") + # osc_process() + # distance[3] = 1 + elif (distance[3]==0) and (distance[2] <= x) and inArea(int(distance[0]),int(distance[1]),int(width/2),int(height/2),int((width / 2) - int(height / 2) / 2), int(height / 2 + numpy.sqrt(3)*int(height / 2)/2),int((width / 2) - numpy.sqrt(3)*int(height / 2)/2), int(height / 2 + int(height / 2) / 2)): + cv2.circle(imageorg, (int(distance[0]),int(distance[1])), DRAW_CIRCLE_RADIUS, (0, 250, 200), thickness=1) + osc_send(note_G, "local") + osc_process() + distance[3] = 1 + # elif (distance[3]==0) and (distance[2] <= x) and inArea(int(distance[0]),int(distance[1]),int(width/2),int(height/2),int((width / 2) - numpy.sqrt(3)*int(height / 2)/2), int(height / 2 + int(height / 2) / 2),int((width / 2) - (height / 2)),int(height / 2) ): + # cv2.circle(imageorg, (int(distance[0]),int(distance[1])), DRAW_CIRCLE_RADIUS, (0,50, 250), thickness=1) + # osc_send(note_Ab, "local") + # osc_process() + # distance[3] = 1 + elif (distance[3]==0) and (distance[2] <= x) and inArea(int(distance[0]),int(distance[1]),int(width/2),int(height/2),int((width / 2) - (height / 2)),int(height / 2),int((width / 2) - numpy.sqrt(3)*int(height / 2)/2), int(height / 2 - int(height / 2) / 2) ): + cv2.circle(imageorg, (int(distance[0]),int(distance[1])), DRAW_CIRCLE_RADIUS, (0,150, 250), thickness=1) + osc_send(note_A, "local") + osc_process() + distance[3] = 1 + # elif (distance[3]==0) and (distance[2] <= x) and inArea(int(distance[0]),int(distance[1]),int(width/2),int(height/2),int((width / 2) - numpy.sqrt(3)*int(height / 2)/2), int(height / 2 - int(height / 2) / 2),int((width / 2) - int(height / 2) / 2), int(height / 2 - numpy.sqrt(3)*int(height / 2)/2) ): + # cv2.circle(imageorg, (int(distance[0]),int(distance[1])), DRAW_CIRCLE_RADIUS, (0,200, 250), thickness=1) + # osc_send(note_Bb, "local") + # osc_process() + # distance[3] = 1 + elif (distance[3]==0) and (distance[2] <= x) and inArea(int(distance[0]),int(distance[1]),int(width/2),int(height/2),int((width / 2) - int(height / 2) / 2), int(height / 2 - numpy.sqrt(3)*int(height / 2)/2),int(width / 2),0 ): + cv2.circle(imageorg, (int(distance[0]),int(distance[1])), DRAW_CIRCLE_RADIUS, (50,250, 250), thickness=1) + osc_send(note_B, "local") + osc_process() + distance[3] = 1 + #cv2.circle(imageorg, (389,33), DRAW_CIRCLE_RADIUS, (0, 255, 0), thickness=1) + + cv2.imshow('Overlay',drawingImage) + cv2.waitKey(100) + +#returns true if point is in triangle ABC +#input is (point,A,B,C) + + + + +# line_thickness = 1 +# cv2.line(imageorg, (int(width / 2), 0), (int(width / 2), int(height)), (0, 0, 255), thickness=line_thickness) +# cv2.line(imageorg, (int(width / 2 - height / 2), int(height / 2)), (int(width/2 + height / 2), int(height / 2)), (0, 0, 255), thickness=line_thickness) +# cv2.line(imageorg, (int((width / 2) - numpy.sqrt(3)*int(height / 2)/2), int(height / 2 - int(height / 2) / 2)), (int((width / 2) + numpy.sqrt(3)*int(height / 2)/2), int(height / 2 + int(height / 2) / 2)), (0, 0, 255), thickness=line_thickness) +# cv2.line(imageorg, (int((width / 2) - int(height / 2) / 2), int(height / 2 - numpy.sqrt(3)*int(height / 2)/2)), (int((width / 2) + int(height / 2) / 2), int(height / 2 + numpy.sqrt(3)*int(height / 2)/2)), (0, 0, 255), thickness=line_thickness) +# cv2.line(imageorg, (int((width / 2) - numpy.sqrt(3)*int(height / 2)/2), int(height / 2 + int(height / 2) / 2)), (int((width / 2) + numpy.sqrt(3)*int(height / 2)/2), int(height / 2 - int(height / 2) / 2)), (0, 0, 255), thickness=line_thickness) +# cv2.line(imageorg, (int((width / 2) - int(height / 2) / 2), int(height / 2 + numpy.sqrt(3)*int(height / 2)/2)), (int((width / 2) + int(height / 2) / 2), int(height / 2 - numpy.sqrt(3)*int(height / 2)/2)), (0, 0, 255), thickness=line_thickness) +#cv2.line(imageorg, (0, int(height)), (int(width), 0), (0, 0, 255), thickness=line_thickness) +#cv2.line(imageorg, (0, 225), (700, 225), (0, 0, 255), thickness=line_thickness) + + +#cv2.imshow('Original image',imageorginal) +#cv2.imshow('Overlay',imageorg) +#cv2.imshow('Gray image', thresh) + +cv2.waitKey(0) +cv2.destroyAllWindows() +osc_terminate() diff --git a/testimage.jpg b/testimage.jpg new file mode 100644 index 0000000000000000000000000000000000000000..99a9baf5e001f3cbade75e412e4168fa5544096e GIT binary patch literal 30356 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