from pyglet.gl import *
from math import *
class secteur(object):
def __init__(self, radius, inner_radius, angle, points):
self.radius = radius
self.inner_radius = inner_radius
self.angle = angle
self.points = points
self.vertex = []
self.color = []
for i in range(points):
angle=self.angle/points*i
x=cos(angle)*radius
y=sin(angle)*radius
z=0
self.vertex.extend([x,y,z])
self.color.extend([255,0,0])
for i in range(points):
angle=self.angle-self.angle/points*i
x=cos(angle)*inner_radius
y=sin(angle)*inner_radius
z=0
self.vertex.extend([x,y,z])
self.color.extend([0,255,0])
self.vertices = pyglet.graphics.vertex_list(2*points,('v3f', self.vertex),('c3B',self.color))
class myWindow(pyglet.window.Window):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.set_minimum_size(300,300)
glClearColor(0.2,0.2,0.21,1)
self.secteur = secteur(0.5,0.3,pi/2,11)
def on_draw(self):
self.clear()
self.secteur.vertices.draw(GL_POLYGON)
def on_resize(self,width,height):
glViewport(0,0,width,height)
if __name__ == "__main__":
windows = myWindow(800,800,"midi_visualizer",resizable=True)
pyglet.app.run()
from math import *
from pyglet.gl import *
class Segment:
def __init__(self, vlist):
self.vlist = vlist
# self.outline = outline_vlist
# def draw(self): # for example
# self.vlist.draw(GL_TRIANGLES)
# self.outline.draw(GL_LINES)
def create_segment(radius, inner_radius, angle_out, angle_in, points=360):
vertex = []
color = []
indices = []
for i in range(points):
angle = angle_out * (i / (points - 1)) + angle_in
x = cos(angle) * radius
y = sin(angle) * radius
z = 0
vertex.extend([x, y, z])
color.extend([255, 0, 0])
for i in range(points):
angle = angle_out - angle_out * (i / (points - 1)) + angle_in
x = cos(angle) * inner_radius
y = sin(angle) * inner_radius
z = 0
vertex.extend([x, y, z])
color.extend([0, 255, 0])
for i in range(points - 1):
n = 2 * points - 1
indices.extend([i, i + 1, n - i])
indices.extend([n - i, n - 1 - i, i + 1])
return Segment(vlist=pyglet.graphics.vertex_list_indexed(2 * points, indices,
('v3f', vertex),
('c3B', color)))
class MyWindow(pyglet.window.Window):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.set_minimum_size(300, 300)
glClearColor(0.2, 0.2, 0.21, 1)
self.sectors = [create_segment(0.5, 0.3, pi / 8, n * pi / 6) for n in range(12)]
self.draw_list = []
def on_draw(self):
self.clear()
for sector in self.draw_list:
sector.vlist.draw(GL_TRIANGLES)
def on_resize(self, width, height):
glViewport(0, 0, width, height)
def on_key_press(self, key, modifier):
# replicate default behavior:
if key == pyglet.window.key.ESCAPE:
pyglet.app.exit()
# Some examples of mapping key presses
if key == pyglet.window.key._1:
self.draw_list.append(self.sectors[0])
elif key == pyglet.window.key._3:
self.draw_list.extend(self.sectors[0:3])
elif key == pyglet.window.key._4:
self.draw_list.extend(self.sectors[0:4])
elif key == pyglet.window.key.SPACE:
self.draw_list.extend(self.sectors[0:12])
def on_key_release(self, key, modifier):
self.draw_list.clear()
if __name__ == "__main__":
windows = MyWindow(800, 800, "midi_visualizer", resizable=True)
pyglet.app.run()
from pyglet.gl import *
from math import *
class secteur(object):
def __init__(self, radius, inner_radius, angle, angle_in,points):
self.radius = radius
self.inner_radius = inner_radius
self.angle = angle
self.angle_in = angle_in
self.points = points
self.vertex = []
self.color = []
self.indices = []
for i in range(points):
angle=self.angle*(i/(points-1))+angle_in
x=cos(angle)*radius
y=sin(angle)*radius
z=0
self.vertex.extend([x,y,z])
self.color.extend([255,0,0])
for i in range(points):
angle=self.angle-self.angle*(i/(points-1))+angle_in
x=cos(angle)*inner_radius
y=sin(angle)*inner_radius
z=0
self.vertex.extend([x,y,z])
self.color.extend([0,255,0])
for i in range(points-1):
n = 2*points-1
self.indices.extend([i,i+1,n-i])
self.indices.extend([n-i,n-1-i,i+1])
self.vertices = pyglet.graphics.vertex_list_indexed(2*points,self.indices,('v3f', self.vertex),('c3B',self.color))
class myWindow(pyglet.window.Window):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.set_minimum_size(300,300)
glClearColor(0.2,0.2,0.21,1)
self.secteur = secteur(0.5,0.3,pi/12,2*pi/12,360)
self.secteur2 = secteur(0.5,0.3,pi/12,4*pi/12,360)
def on_draw(self):
self.clear()
self.secteur.vertices.draw(GL_TRIANGLES)
self.secteur2.vertices.draw(GL_TRIANGLES)from pyglet.gl import *
from math import *
from pyglet.window import key
class sector(object):
def __init__(self, radius, inner_radius, angle, angle_in,points):
self.radius = radius
self.inner_radius = inner_radius
self.angle = angle
self.angle_in = angle_in
self.points = points
self.vertex = []
self.color = []
self.indices = []
for i in range(points):
angle=self.angle*(i/(points-1))+angle_in
x=cos(angle)*radius
y=sin(angle)*radius
z=0
self.vertex.extend([x,y,z])
self.color.extend([255,800,45])
for i in range(points):
angle=self.angle-self.angle*(i/(points-1))+angle_in
x=cos(angle)*inner_radius
y=sin(angle)*inner_radius
z=0
self.vertex.extend([x,y,z])
self.color.extend([255,120,12])
for i in range(points-1):
n = 2*points-1
self.indices.extend([i,i+1,n-i])
self.indices.extend([n-i,n-1-i,i+1])
def render(self):
self.vertices = pyglet.graphics.draw_indexed(2*self.points,GL_TRIANGLES,self.indices,('v3f', self.vertex),('c3B',self.color))
def played(self):
self.color = []
for i in range(2*self.points):
self.color.extend([0,0,255])
self.vertices = pyglet.graphics.draw_indexed(2*self.points,GL_TRIANGLES,self.indices,('v3f', self.vertex),('c3B',self.color))
class ring(object):
def __init__(self):
self.notes = {
'c' : None,
'c#': None,
'd' : None,
'd#': None,
'e' : None,
'f' : None,
'f#': None,
'g' : None,
'g#': None,
'a' : None,
'a#': None,
'b' : None
}
i=0
for note in self.notes:
self.notes[note] = sector(0.7,0.6,pi/6.4,2*i*pi/12,360)
i+=1
def render(self):
for note in self.notes:
self.notes[note].render()
The second thing I'm stuck on is the glowing effect. Here, I writed a function named played in the sector's class who draw from scratch a blue sector over the other. What I want, is a function who use the ancient sector and tweak it with openGl and make something nicer.
Thank you one more time. I hope you can share the knowledge you own.
Eelke
import time
import rtmidi
midi_in = rtmidi.MidiIn()
available_ports = midi_in.get_ports()
print(available_ports)
# I have a USB midi keyboard, and device #2 is the input:
port = midi_in.open_port(2)
def printer(message, data):
# Actually update something here
print(message, data)
port.set_callback(printer, data=None)
while True:
# Dumb event loop
time.sleep(1)
key_map = { 0: "c",
1: "c#",
2: "d#",
3: "d#",
4: "e",
5: "f",
6: "f#",
7: "g",
8: "g#",
9: "a",
10: "a#",
11: "b"
}
# Midi configuration
midi_in = rtmidi.MidiIn()
available_ports = midi_in.get_ports()
port = midi_in.open_port(1)
def hit_a_key(message, data):
m = message[0][1]%12
self.ring.notes[key_map[m]].played()
def release_a_key(message, data):
m = message[0][1]%12
self.ring.notes[key_map[m]].idle()
port.set_callback(hit_a_key, data=self)
port.set_callback(release_a_key, data=self)