]> git.immae.eu Git - perso/Immae/Projets/Python/MusicSampler.git/commitdiff
Add some actions
authorIsmaël Bouya <ismael.bouya@normalesup.org>
Sat, 18 Jun 2016 21:45:19 +0000 (23:45 +0200)
committerIsmaël Bouya <ismael.bouya@normalesup.org>
Sat, 18 Jun 2016 21:45:19 +0000 (23:45 +0200)
config.yml
helpers/action.py
helpers/music_file.py

index 11251b21bda8ccec380e62b5a754b0eef217147a..ae87de5be8f8d890fb6e9d11afd545e3c978002c 100644 (file)
@@ -18,11 +18,23 @@ keys:
         duration: 3
     - play:
         include: acros
+        fade_in: 4
+        start_at: 40
     - wait:
         duration: 10
+    - volume:
+        include: acros
+        value:  50
     - stop:
         include: acros
         fade_out: 10
+  'e':
+    - play:
+        include: acros
+        restart_if_running: true
+  'r':
+    - play:
+        include: acros
   'ESC':
     - stop: ~
     - stop_all_actions: ~
index a68de90e5f1348934804d08c2a194fac14133eb1..8a69fae3a967f4dd020f7d037e89415a7de072e3 100644 (file)
@@ -43,23 +43,37 @@ class Action:
     def play(self, music = None, fade_in = 0, start_at = 0,
             restart_if_running = False, volume = 100, **kwargs):
         if music is not None:
-            music.play()
+            if restart_if_running:
+                if music.is_playing():
+                    music.stop()
+                music.play(volume = volume, fade_in = fade_in, start_at = start_at)
+            else:
+                if not music.is_playing():
+                    music.play(volume = volume, fade_in = fade_in, start_at = start_at)
         else:
             pygame.mixer.unpause()
 
     def stop(self, music = None, fade_out = 0, **kwargs):
         if music is not None:
-            music.stop()
+            music.stop(fade_out = fade_out)
         else:
-            pygame.mixer.stop()
+            if fade_out > 0:
+                pygame.fadeout(fade_out * 1000)
+            else:
+                pygame.mixer.stop()
 
     def stop_all_actions(self, **kwargs):
         self.key.mapping.stop_all_running()
 
     def volume(self, music = None, value = 100, **kwargs):
-        pass
+        if music is not None:
+            music.set_volume(value)
+        else:
+            pass
 
     def wait(self, duration = 0, **kwargs):
+        # FIXME: Make it stoppable
+        # http://stackoverflow.com/questions/29082268/python-time-sleep-vs-event-wait
         time.sleep(duration)
 
     def command_print(self, command = "", **kwargs):
@@ -104,10 +118,10 @@ class Action:
             else:
                 return "stopping all musics with {}s fadeout".format(fade_out)
 
-    def stop_all_actions_print(self):
+    def stop_all_actions_print(self, **kwargs):
         return "stopping all actions"
 
-    def volume_print(self, music = None, value = 100, *kwargs):
+    def volume_print(self, music = None, value = 100, **kwargs):
         if music is not None:
             return "setting volume of {} to {}%".format(music.filename, value)
         else:
index 39b0566ccd5c68ae925af87d93c45cb630f2dc78..36a7dd9ee913bc350058ae24de4079c17a4eb749 100644 (file)
@@ -21,15 +21,38 @@ class MusicFile:
         self.loaded = True
         lock.release()
 
-    def play(self):
-        self.channel = self.sound.play()
+    def is_playing(self):
+        return self.channel is not None and self.channel.get_busy()
+
+    def play(self, fade_in = 0, volume = 100, start_at = 0):
+        self.set_volume(volume)
+
+        if start_at > 0:
+            song_duration = self.sound.get_length()
+            raw_data_length = len(self.raw_data)
+            start_offset = int((raw_data_length / song_duration) * start_at)
+            start_offset = start_offset - (start_offset % 2)
+            self.sound = pygame.mixer.Sound(self.raw_data[start_offset:])
+        else:
+            self.sound = pygame.mixer.Sound(self.raw_data)
+
+        self.channel = self.sound.play(fade_ms = fade_in * 1000)
 
     def pause(self):
         if self.channel is not None:
             self.channel.pause()
 
-    def stop(self):
+    def stop(self, fade_out = 0):
         self.channel = None
-        self.sound.stop()
-
+        if fade_out > 0:
+            self.sound.fadeout(fade_out * 1000)
+        else:
+            self.sound.stop()
+
+    def set_volume(self, value):
+        if value < 0:
+            value = 0
+        if value > 100:
+            value = 100
+        self.sound.set_volume(value / 100)