Ajout description midi des instruments et sélection au niveau de fluidsynth.
authorpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Tue, 23 Mar 2010 09:48:59 +0000 (09:48 +0000)
committerpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Tue, 23 Mar 2010 09:48:59 +0000 (09:48 +0000)
git-svn-id: https://svn.cri.ensmp.fr/svn/minwii/trunk@109 fe552daf-6dbe-4428-90eb-1537e0879342

src/app/config.py
src/app/minwii.py
src/app/widgets/home.py
src/app/widgets/instrumentselector.py

index 34a5f7f..00d0b89 100755 (executable)
@@ -28,6 +28,45 @@ DEFAULT_MIDI_VELOCITY = 96
 
 SONG_FILE_PATH = '../../chansons'
 
+INSTRUMENTS = (
+    {'name'   : 'accordeon',
+     'bank'   : 0,
+     'preset' : 23
+    },
+    {'name' : 'celesta',
+     'bank'   : 0,
+     'preset' : 8
+    },
+    {'name' : 'flute',
+     'bank'   : 0,
+     'preset' : 74
+    },
+    {'name' : 'guitare',
+     'bank'   : 0,
+     'preset' : 24
+    },
+    {'name' : 'orgue',
+     'bank'   : 0,
+     'preset' : 19
+    },
+    {'name' : 'piano',
+     'bank'   : 0,
+     'preset' : 0
+    },
+    {'name' : 'tuba',
+     'bank'   : 0,
+     'preset' : 58
+    },
+    {'name' : 'violon',
+     'bank'   : 0,
+     'preset' : 40
+    },
+    {'name' : 'violoncelle',
+     'bank'   : 0,
+     'preset' : 42
+    },
+)
+
 # cuisine : ne pas modifier
 _here = os.path.abspath(__file__).split(os.path.sep)[:-1]
 SONG_FILE_PATH = SONG_FILE_PATH.split('/')
index 6f277a7..7901c9c 100755 (executable)
@@ -28,15 +28,20 @@ class MinWii(object):
             home.connect(QUIT, app.quit)
             app.run(home)
             app.close(home)
+            returnValue = home.returnValue
+            if not returnValue :
+                break
             
             selector = InstrumentSelector()
             selector.run()
             selector.stop()
             pygame.event.clear()
             EventDispatcher.reset()
+            instrumentDescription = selector.selectedInstrument
             
             song = musicXml2Song(home.songFile, printNotes=True)
-            synth.program_select(0, 0, 0)
+            bank, preset = instrumentDescription['bank'], instrumentDescription['preset']
+            synth.program_select(0, bank, preset)
             playingScreen = SongPlayingScreen(synth, song)
             playingScreen.run()
             pygame.event.clear()
index e1e09f1..6d9d7d5 100755 (executable)
@@ -88,9 +88,15 @@ class Home(Table) :
     
     def _initLocalListeners(self) :
         self.browseButton.connect(CLICK, self.open_file_browser)
-        self.quitButton.connect(CLICK, self._exitHome)
+        self.quitButton.connect(CLICK, self._exitApp)
+        self.playButton.connect(CLICK, self._exitHome)
+    
+    def _exitApp(self, data=None) :
+        self.returnValue = False
+        self.send(QUIT)
     
     def _exitHome(self, data=None) :
+        self.returnValue = True
         self.send(QUIT)
     
     def createLabel(self,text,font = None):
index 9bafbc3..fc0f966 100755 (executable)
@@ -10,6 +10,7 @@ import pygame
 from eventutils import event_handler, EventDispatcher, EventHandlerMixin
 from cursors import WarpingCursor
 from config import FRAMERATE
+from config import  INSTRUMENTS
 from globals import BACKGROUND_LAYER
 from globals import FOREGROUND_LAYER
 from globals import CURSOR_LAYER
@@ -20,7 +21,7 @@ class InstrumentSelector(pygame.sprite.LayeredDirty, EventHandlerMixin) :
     
     rows = 3
     cols = 3
-    instruments = ['accordeon', 'celesta', 'flute', 'guitare', 'orgue', 'piano', 'tuba', 'violon', 'violoncelle']
+    instruments = INSTRUMENTS
 
     def __init__(self) :
         super(InstrumentSelector, self).__init__()
@@ -35,11 +36,14 @@ class InstrumentSelector(pygame.sprite.LayeredDirty, EventHandlerMixin) :
         tileHeight = int(round(float(screen.get_height()) / self.rows))
 
         self.tiles = []
-        instrus = self.instruments[:]
+        instrus = list(self.instruments[:])
         for y in range(self.cols) :
             for x in range(self.rows) :
                 upperLeftCorner = (x * tileWidth, y * tileHeight)
                 rect = pygame.Rect(upperLeftCorner, (tileWidth, tileHeight))
+                # !!! s'il y avait plus de 3x3 tuiles !!!, il faudrait alors
+                # changer le tuple (x,y) qui concerne le point d'application de l'homotétie.
+                # Cf. InstrumentTile.inflate
                 tile = InstrumentTile(instrus.pop(0), self, rect, (x,y))
                 self.add(tile, layer=BACKGROUND_LAYER)
                 self.tiles.append(tile)
@@ -71,7 +75,6 @@ class InstrumentSelector(pygame.sprite.LayeredDirty, EventHandlerMixin) :
             self.stop()
 
     @event_handler(pygame.MOUSEMOTION)
-    #@event_handler(pygame.MOUSEBUTTONDOWN)
     def onMouseMove(self, event) :
         for tile in reversed(self.sprites()[:-1]) :
             if tile.rect.collidepoint(*event.pos) :
@@ -93,7 +96,7 @@ class InstrumentSelector(pygame.sprite.LayeredDirty, EventHandlerMixin) :
     def selectInstrument(self, event) :
         for tile in reversed(self.sprites()[:-1]) :
             if tile.rect.collidepoint(*event.pos) :
-                self.selectedInstrument = tile
+                self.selectedInstrument = tile.instrumentDescription
                 self.stop()
                 break
 
@@ -112,14 +115,14 @@ class InstrumentTile(pygame.sprite.DirtySprite) :
     BORDER = 10
     INFLATE_ZOOM = 0.4
 
-    def __init__(self, name, group, rect, coords) :
+    def __init__(self, instrumentDescription, group, rect, coords) :
         pygame.sprite.DirtySprite.__init__(self, group)
         self.inflated = False
-        self.name = name
+        self.instrumentDescription = instrumentDescription
         self.rect = rect
         self._baseRect = rect.copy()
         self.coords = coords
-        imagePath = InstrumentTile._get_instrument_image(name)
+        imagePath = InstrumentTile._get_instrument_image(instrumentDescription['name'])
         self._img = pygame.image.load(imagePath)
         self.update()