import pygame from .colors import * from .fonts import * from .knob import * import random class Knobs: def __init__(self, gui): self.gui = gui self.knobs_surface = pygame.Surface((gui.screenW, gui.screenH), pygame.SRCALPHA) self.opacity = 0 self.fade_speed = 5 self.fade_in = False self.fade_out = False knob_names = [ 'Delay Time', 'Delay Vol', 'Reverb Wet', 'Reverb Size', 'Filter Freq', 'Distortion', 'Detune', 'Gain' ] # Create and position the knobs self.knobs_radius = self.gui.screenW / 25 knobs_spacing = self.knobs_radius * 2 knobs_x = (self.gui.screenW - (self.knobs_radius + knobs_spacing) * 2) / 2 x = knobs_x knobs_y = (self.gui.screenH - (self.knobs_radius + knobs_spacing) * 3) / 2 y = knobs_y self.knobs = [] for i in range(len(knob_names)): self.knobs.append(Knob(self, knob_names[i], self.knobs_radius, (x, y), 0)) y += self.knobs_radius + knobs_spacing if i == 3 or i == 6: x += self.knobs_radius + knobs_spacing y = knobs_y self.label_vanish_parameter = 0 self.label_border_height = 0 def display_label(self, knob): if not knob.vanish_label_path: self.label_vanish_parameter = 0 if len(knob.label_path) == 2: if self.label_vanish_parameter > 0: self.label_vanish_parameter -= 1 elif knob.vanish_label_path: self.label_vanish_parameter = 5 label_fx_name = font_helvetica.render(knob.name, False, color_primary_light) label_fx_value = font_helvetica.render('[ ' + str(int(round(knob.value * 100, 0))) + '% ]', False, color_primary_light) min_x = self.knobs[5].get_position()[0] + self.knobs_radius * 1.5 label_x = min_x + (self.gui.screenW - min_x - label_fx_name.get_width()) / 2 label_y = (self.gui.screenH - label_fx_name.get_height() - label_fx_value.get_height()) / 2 if self.label_vanish_parameter == 0: self.gui.label_surface.blit(label_fx_name, (label_x, label_y)) self.gui.label_surface.blit(label_fx_value, (label_x, self.gui.screenH / 2)) if knob.vanish_label_path: if self.label_border_height < self.gui.screenH / 2: self.label_border_height += 2 else: self.label_border_height = self.gui.screenH / 2 else: self.label_border_height = label_y pygame.draw.line( self.gui.label_surface, color_primary_dark, (label_x - 10, self.label_border_height), (label_x - 10, self.gui.screenH - self.label_border_height), 2 ) self.calculate_label_path(knob, label_x) for i in range(len(knob.label_path)-1): pygame.draw.line( self.gui.label_surface, color_primary_dark, knob.label_path[i], knob.label_path[i+1], 2 ) def calculate_label_path(self, knob, label_x): if len(knob.label_path) == 0: knob.label_path.append(knob.get_position()) if (knob == self.knobs[0] or knob == self.knobs[1] or knob == self.knobs[4] or knob == self.knobs[5]): x = knob.get_position()[0] + self.knobs_radius * 1.5 y = knob.get_position()[1] + self.knobs_radius * 1.5 knob.label_path.append((x, y)) elif (knob == self.knobs[2] or knob == self.knobs[3] or knob == self.knobs[6]): x = knob.get_position()[0] + self.knobs_radius * 1.5 y = knob.get_position()[1] - self.knobs_radius * 1.5 knob.label_path.append((x, y)) elif (knob == self.knobs[7]): x = knob.get_position()[0] - self.knobs_radius * 1.5 y = knob.get_position()[1] + self.knobs_radius * 1.5 knob.label_path.append((x, y)) if (knob == self.knobs[0] or knob == self.knobs[3]): knob.label_path.append((self.knobs[0].get_position()[0] + self.knobs_radius * 1.5, self.gui.screenH/2)) elif (knob == self.knobs[4] or knob == self.knobs[6] or knob == self.knobs[7]): knob.label_path.append((self.knobs[4].get_position()[0] + self.knobs_radius * 1.5, self.gui.screenH/2)) knob.label_path.append((label_x - 10, self.gui.screenH/2)) elif knob.vanish_label_path: if len(knob.label_path) > 1: p1 = list(knob.label_path[0]) p2 = list(knob.label_path[1]) if abs(p1[0] - p2[0]) <= 10 and abs(p1[1] - p2[1]) <= 10: knob.label_path.remove(tuple(p1)) else: if p1[0] > p2[0]: p1[0] -= 10 elif p1[0] < p2[0]: p1[0] += 10 if p1[1] > p2[1]: p1[1] -= 10 elif p1[1] < p2[1]: p1[1] += 10 knob.label_path[0] = tuple(p1) else: knob.vanish_label_path = False knob.label_path = [] def set_focused(self, knob): for k in self.knobs: k.set_focused(k == knob) if knob is None: k.vanish_label_path = False def set_value(self, index, value): self.set_focused(self.knobs[index]) self.knobs[index].set_value(value) def display(self): if self.fade_in and self.opacity < 255: self.opacity += self.fade_speed if self.fade_out and self.opacity > 0: self.opacity -= self.fade_speed self.knobs_surface = pygame.Surface((self.gui.screenW, self.gui.screenH), pygame.SRCALPHA) for knob in self.knobs: if knob.focused or knob.vanish_label_path: self.display_label(knob) knob.display(self.knobs_surface) self.gui.screen.blit(self.knobs_surface, (0,0))