Ajout des soundfonts
authorpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Fri, 5 Mar 2010 14:46:01 +0000 (14:46 +0000)
committerpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Fri, 5 Mar 2010 14:46:01 +0000 (14:46 +0000)
implémentation du synthé dans un module externe.
initialisation du synthé au début.
ajout d'une méthode reste pour le dispatcher d'événements.

git-svn-id: https://svn.cri.ensmp.fr/svn/minwii/trunk@69 fe552daf-6dbe-4428-90eb-1537e0879342

src/app/eventutils.py
src/app/minwii.py
src/app/soundfonts/FluidR3_GM.sf2 [new file with mode: 0644]
src/app/soundfonts/FluidR3_GS.sf2 [new file with mode: 0644]
src/app/synth.py [new file with mode: 0755]
src/app/widgets/playingscreen.py

index c115c28..fda8154 100755 (executable)
@@ -29,6 +29,7 @@ $URL$
 import types
 import pygame
 from StringIO import StringIO
 import types
 import pygame
 from StringIO import StringIO
+from events import NOTEON
 
 class _EventDispatcher :
     def __init__(self) :
 
 class _EventDispatcher :
     def __init__(self) :
@@ -44,8 +45,12 @@ class _EventDispatcher :
         events = pygame.event.get()
         for event in events :
             listeners = self.registry.get(event.type, [])
         events = pygame.event.get()
         for event in events :
             listeners = self.registry.get(event.type, [])
+            if event.type == NOTEON :
+                print len(listeners)
             for listener in listeners :
                 listener(event)
             for listener in listeners :
                 listener(event)
+    def reset(self) :
+        self.registry = {}
     
     def __repr__(self) :
         out = StringIO()
     
     def __repr__(self) :
         out = StringIO()
index 26e2a5e..c4fdc23 100755 (executable)
@@ -10,17 +10,22 @@ from pgu.gui import Desktop
 from pgu.gui import QUIT
 from widgets.home import Home
 from widgets.playingscreen import PlayingScreen
 from pgu.gui import QUIT
 from widgets.home import Home
 from widgets.playingscreen import PlayingScreen
+from synth import Synth
+from eventutils import EventDispatcher
 
 class MinWii(object):
     
     def __init__(self) :
         app = Desktop()
 
 class MinWii(object):
     
     def __init__(self) :
         app = Desktop()
-        
+        synth = Synth()
+        synth.program_select(0, 0, 0)
+
         while True :
             home = Home()
             home.connect(QUIT, app.quit)
             app.run(home)
             app.close(home)
             
         while True :
             home = Home()
             home.connect(QUIT, app.quit)
             app.run(home)
             app.close(home)
             
-            playingScreen = PlayingScreen()
+            playingScreen = PlayingScreen(synth)
             playingScreen.run()
             playingScreen.run()
+            EventDispatcher.reset()
diff --git a/src/app/soundfonts/FluidR3_GM.sf2 b/src/app/soundfonts/FluidR3_GM.sf2
new file mode 100644 (file)
index 0000000..443d42b
Binary files /dev/null and b/src/app/soundfonts/FluidR3_GM.sf2 differ
diff --git a/src/app/soundfonts/FluidR3_GS.sf2 b/src/app/soundfonts/FluidR3_GS.sf2
new file mode 100644 (file)
index 0000000..c1646f9
Binary files /dev/null and b/src/app/soundfonts/FluidR3_GS.sf2 differ
diff --git a/src/app/synth.py b/src/app/synth.py
new file mode 100755 (executable)
index 0000000..a2a0244
--- /dev/null
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+"""
+module de wrapping du synthétiseur
+
+$Id$
+$URL$
+"""
+from os.path import realpath, sep, exists
+from  fluidsynth import Synth as FSynth
+
+class Synth(FSynth) :
+    
+    def __init__(self, gain=0.2, samplerate=44100) :
+        FSynth.__init__(self, gain=gain, samplerate=samplerate)
+        
+        sfPath = realpath(__file__).split(sep)
+        sfPath = sfPath[:-1]
+        sfPath.append('soundfonts')
+
+        sfPath.append('FluidR3_GM.sf2')
+        sfPath = sep.join(sfPath)
+        assert exists(sfPath)
+
+        self.start()
+        self.fsid = self.sfload(sfPath)
+    
+    def sfunload(self, update_midi_preset=0):
+        FSynth.sfunload(self, self.fsid, update_midi_preset=update_midi_preset)
+    
+    def program_select(self, chan, bank, preset):
+        FSynth.program_select(self, chan, self.fsid, bank, preset)
+
+    def sfont_select(self, chan):
+        FSynth.sfont_select(self, chan, self.fsid)
+
+        
+
+
+if __name__ == '__main__' :
+    initsynth()
\ No newline at end of file
index 223f4e5..f699a56 100755 (executable)
@@ -32,12 +32,13 @@ from config import FONT_COLOR
 
 class _PlayingScreenBase(pygame.sprite.LayeredDirty, EventHandlerMixin) :
 
 
 class _PlayingScreenBase(pygame.sprite.LayeredDirty, EventHandlerMixin) :
 
-    def __init__(self, distinctNotes=[]) :
+    def __init__(self, synth, distinctNotes=[]) :
         """
         distinctNotes : notes disctinctes présentes dans la chanson
         triées du plus grave au plus aigu.
         """
         super(_PlayingScreenBase, self).__init__()
         """
         distinctNotes : notes disctinctes présentes dans la chanson
         triées du plus grave au plus aigu.
         """
         super(_PlayingScreenBase, self).__init__()
+        self.synth = synth
         self.distinctNotes = distinctNotes
         self.keyboardLength = 0
         self.keyboardRects = []
         self.distinctNotes = distinctNotes
         self.keyboardLength = 0
         self.keyboardRects = []
@@ -85,19 +86,21 @@ class _PlayingScreenBase(pygame.sprite.LayeredDirty, EventHandlerMixin) :
             self.add(c, layer=0)
     
     def _initCursor(self) :
             self.add(c, layer=0)
     
     def _initCursor(self) :
-        self.cursor = WarpingCursor(blinkMode=True)
+        self.cursor = WarpingCursor(blinkMode=False)
         self.add(self.cursor, layer=2)
         
     def run(self):
         self._running = True
         clock = pygame.time.Clock()
         pygame.display.flip()
         self.add(self.cursor, layer=2)
         
     def run(self):
         self._running = True
         clock = pygame.time.Clock()
         pygame.display.flip()
+        pygame.mouse.set_visible(False)
         while self._running :
             EventDispatcher.dispatchEvents()
             dirty = self.draw(pygame.display.get_surface())
             pygame.display.update(dirty)
             clock.tick(FRAMERATE)
         while self._running :
             EventDispatcher.dispatchEvents()
             dirty = self.draw(pygame.display.get_surface())
             pygame.display.update(dirty)
             clock.tick(FRAMERATE)
-        
+
+        pygame.mouse.set_visible(True)
         self.cursor._stopBlink()
 
     @event_handler(pygame.KEYDOWN)       
         self.cursor._stopBlink()
 
     @event_handler(pygame.KEYDOWN)       
@@ -115,38 +118,24 @@ class PlayingScreen(_PlayingScreenBase) :
     "fenêtre de jeu pour improvisation"
     scale = [55, 57, 59, 60, 62, 64, 65, 67, 69, 71, 72]
 
     "fenêtre de jeu pour improvisation"
     scale = [55, 57, 59, 60, 62, 64, 65, 67, 69, 71, 72]
 
-    def __init__(self) :
+    def __init__(self, synth) :
         distinctNotes = []
         for midi in self.scale :
             tone = Tone(midi)
             distinctNotes.append(tone)
         
         distinctNotes = []
         for midi in self.scale :
             tone = Tone(midi)
             distinctNotes.append(tone)
         
-        super(PlayingScreen, self).__init__(distinctNotes)
-        
-        #cracra code
-        soundFont = '/Users/pinbe/dev/minwii/fluid-soundfont-3.1/FluidR3_GM.sf2'
-        bank = preset = 0
-
-        self.fs = fs = fluidsynth.Synth()
-        fs.start()
-        self.fsid = fsid = fs.sfload(soundFont)
-        fs.program_select(0, fsid, bank, preset)
-
-    def __del__(self) :
-        print 'PlayingScreen.__del__'
-        self.fs.delete()
-    
+        super(PlayingScreen, self).__init__(synth, distinctNotes)
+            
     @event_handler(events.NOTEON)
     def noteon(self, evt) :
         tone = evt.tone
     @event_handler(events.NOTEON)
     def noteon(self, evt) :
         tone = evt.tone
-        self.fs.noteon(0, tone.midi, 64)
+        self.synth.noteon(0, tone.midi, 64)
 
     @event_handler(events.NOTEOFF)
     def noteoff(self, evt) :
         tone = evt.tone
 
     @event_handler(events.NOTEOFF)
     def noteoff(self, evt) :
         tone = evt.tone
-        self.fs.noteoff(0, tone.midi)
+        self.synth.noteoff(0, tone.midi)
 
 
-        
 
 class SongPlayingScreen(_PlayingScreenBase) :
     
 
 class SongPlayingScreen(_PlayingScreenBase) :