]> git.immae.eu Git - perso/Immae/Projets/Python/MusicSampler.git/blobdiff - music_sampler.py
documentation fr: new features
[perso/Immae/Projets/Python/MusicSampler.git] / music_sampler.py
index d4fc2a726ee6923772bfd36d782ca5ff0014fc9f..c10b6349701210a2ce583bb88543559a6fb0dd4f 100644 (file)
@@ -1,64 +1,89 @@
-import sys
-import pygame
 import helpers
-import threading
 
-pygame.mixer.pre_init(frequency = 44100)
-pygame.init()
+helpers.parse_args()
 
-size = width, height = 1024, 600
-screen = pygame.display.set_mode(size)
-screen.fill((250, 250, 250))
+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
 
-draw_lock = helpers.Lock("draw")
+class KeyList(RelativeLayout):
+    keylist = ListProperty([])
+    first_key = StringProperty("")
+    second_key = StringProperty("")
+    third_key = StringProperty("")
 
-mapping = helpers.Mapping(screen, draw_lock)
-helpers.parse_config(mapping)
+    def append(self, value):
+        self.keylist.insert(0, value)
 
-mapping.draw()
+    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]
 
-draw_lock.acquire()
-pygame.display.flip()
-draw_lock.release()
+class PlayList(RelativeLayout):
+    playlist = ListProperty([])
 
-contexts = [
-    'normal'
-]
+    def __init__(self, **kwargs):
+        super(PlayList, self).__init__(**kwargs)
+        Clock.schedule_interval(self.update_playlist, 0.5)
 
-context = 'normal'
+    def update_playlist(self, dt):
+        if self.parent is None or 'Mapping' not in self.parent.ids:
+            return True
 
-#### Normal workflow ####
-while 1:
-    event = pygame.event.wait()
-
-    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":
+        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
-            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:
-                threading.Thread(name = "MSKeyAction", target=key.do_actions).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()
-    pygame.display.flip()
-    draw_lock.release()
-
-#### In Ipython ####
-# for thread in threading.enumerate():
-#     if thread.getName()[0:2] != "MS":
-#         continue
-#     thread.join()
+
+            text = "{}/{}".format(
+                    helpers.duration_to_min_sec(music_file.sound_position),
+                    helpers.duration_to_min_sec(music_file.sound_duration))
+
+            if music_file.is_loaded_paused():
+                self.playlist.append(["⏸", music_file.name, text, False])
+            else:
+                self.playlist.append(["⏵", music_file.name, text, True])
+
+
+class ActionList(RelativeLayout):
+    action_title = StringProperty("")
+    action_list = ListProperty([])
+
+    def update_list(self, key, action_descriptions):
+        self.action_title = "actions linked to key {}:".format(key.key_sym)
+        self.action_list = []
+
+        for [action, status] in action_descriptions:
+            if status == "done":
+                icon = "✓"
+            elif status == "current":
+                icon = "✅"
+            else:
+                icon = " "
+            self.action_list.append([icon, action])
+
+class Screen(FloatLayout):
+    pass
+
+class MusicSamplerApp(App):
+    def build(self):
+        Window.size = (913, 563)
+
+        return Screen()
+
+if __name__ == '__main__':
+    Builder.load_file(helpers.path() + "/music_sampler.kv")
+    MusicSamplerApp().run()