X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FProjets%2FPython%2FMusicSampler.git;a=blobdiff_plain;f=music_sampler.py;h=c10b6349701210a2ce583bb88543559a6fb0dd4f;hp=c17f7bff98d1764704ee542ef9a1004aa1151f8b;hb=6226efcadfe8c3a932c7a948032b433afb0d981d;hpb=fba0caf0417cbb4e5b370e16e4b0c855c74094c1 diff --git a/music_sampler.py b/music_sampler.py index c17f7bf..c10b634 100644 --- a/music_sampler.py +++ b/music_sampler.py @@ -1,86 +1,89 @@ -import sys -import pygame import helpers -import threading -pygame.mixer.pre_init(frequency = 44100) -pygame.init() +helpers.parse_args() + +import kivy +kivy.require("1.9.1") +from kivy.app import App +from kivy.uix.floatlayout import FloatLayout +from kivy.uix.relativelayout import RelativeLayout +from kivy.properties import ListProperty, StringProperty +from kivy.clock import Clock +from kivy.core.window import Window +from kivy.lang import Builder +from helpers.key import Key +from helpers.mapping import Mapping + +class KeyList(RelativeLayout): + keylist = ListProperty([]) + first_key = StringProperty("") + second_key = StringProperty("") + third_key = StringProperty("") + + def append(self, value): + self.keylist.insert(0, value) + + def on_keylist(self, instance, new_key_list): + if len(self.keylist) > 0: + self.first_key = self.keylist[0] + if len(self.keylist) > 1: + self.second_key = self.keylist[1] + if len(self.keylist) > 2: + self.third_key = self.keylist[2] + +class PlayList(RelativeLayout): + playlist = ListProperty([]) + + def __init__(self, **kwargs): + super(PlayList, self).__init__(**kwargs) + Clock.schedule_interval(self.update_playlist, 0.5) + + def update_playlist(self, dt): + if self.parent is None or 'Mapping' not in self.parent.ids: + return True + + open_files = self.parent.ids['Mapping'].open_files + self.playlist = [] + for music_file in open_files.values(): + if not music_file.is_in_use(): + continue + + text = "{}/{}".format( + helpers.duration_to_min_sec(music_file.sound_position), + helpers.duration_to_min_sec(music_file.sound_duration)) -size = width, height = 913, 563 -screen = pygame.display.set_mode(size) -screen.fill((229, 228, 226)) + if music_file.is_loaded_paused(): + self.playlist.append(["⏸", music_file.name, text, False]) + else: + self.playlist.append(["⏵", music_file.name, text, True]) -draw_lock = helpers.Lock("draw") -mapping = helpers.Mapping(screen, draw_lock) -channel_number, open_files = helpers.parse_config(mapping) -pygame.mixer.set_num_channels(channel_number) +class ActionList(RelativeLayout): + action_title = StringProperty("") + action_list = ListProperty([]) -mapping.draw() + def update_list(self, key, action_descriptions): + self.action_title = "actions linked to key {}:".format(key.key_sym) + self.action_list = [] -draw_lock.acquire() -pygame.display.flip() -draw_lock.release() + for [action, status] in action_descriptions: + if status == "done": + icon = "✓" + elif status == "current": + icon = "✅" + else: + icon = " " + self.action_list.append([icon, action]) -contexts = [ - 'normal' -] +class Screen(FloatLayout): + pass -context = 'normal' +class MusicSamplerApp(App): + def build(self): + Window.size = (913, 563) -#### Normal workflow #### -while 1: - event = pygame.event.wait() + return Screen() - if event.type == pygame.QUIT or ( - event.type == pygame.KEYDOWN and - event.mod == 4160 and - event.key == pygame.K_c): - for thread in threading.enumerate(): - if thread.getName()[0:2] != "MS": - continue - thread.join() - - pygame.quit() - sys.exit() - - if context == 'normal': - if event.type == pygame.KEYDOWN: - key = mapping.find_by_key_num(event.key) - if key is not None and not key.disabled: - threading.Thread(name = "MSKeyAction", target=key.do_actions).start() - threading.Thread(name = "MSClic", target=key.list_actions, args = [screen]).start() - elif event.type == pygame.MOUSEBUTTONUP: - key = mapping.find_by_collidepoint(pygame.mouse.get_pos()) - if key is not None: - threading.Thread(name = "MSClic", target=key.list_actions, args = [screen]).start() - - draw_lock.acquire() - police = helpers.font(14) - icon_police = helpers.font(14, font = "Symbola") - - surface = pygame.Surface((208, 250)).convert() - surface.fill((250, 250, 250)) - offset = 0 - for music_file in open_files.values(): - police.set_bold(False) - if music_file.is_playing(): - if music_file.is_paused(): - icon = icon_police.render("⏸", True, (0,0,0)) - else: - icon = icon_police.render("⏵", True, (0,0,0)) - police.set_bold(True) - text = police.render(music_file.name, True, (0,0,0)) - surface.blit(icon, (0, offset)) - surface.blit(text, (20, offset)) - offset += police.get_linesize() - screen.blit(surface, (700, 308)) - - pygame.display.flip() - draw_lock.release() - -#### In Ipython #### -# for thread in threading.enumerate(): -# if thread.getName()[0:2] != "MS": -# continue -# thread.join() +if __name__ == '__main__': + Builder.load_file(helpers.path() + "/music_sampler.kv") + MusicSamplerApp().run()