From: pin Date: Tue, 23 Mar 2010 09:48:59 +0000 (+0000) Subject: Ajout description midi des instruments et sélection au niveau de fluidsynth. X-Git-Url: https://scm.cri.mines-paristech.fr/git/minwii.git/commitdiff_plain/892497bedb6699cdb0b5c2669ace09ec741f0383?ds=inline;hp=25459b1a617cb907d4bebad3a35f308b87fa795a Ajout description midi des instruments et sélection au niveau de fluidsynth. git-svn-id: https://svn.cri.ensmp.fr/svn/minwii/trunk@109 fe552daf-6dbe-4428-90eb-1537e0879342 --- diff --git a/src/app/config.py b/src/app/config.py index 34a5f7f..00d0b89 100755 --- a/src/app/config.py +++ b/src/app/config.py @@ -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('/') diff --git a/src/app/minwii.py b/src/app/minwii.py index 6f277a7..7901c9c 100755 --- a/src/app/minwii.py +++ b/src/app/minwii.py @@ -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() diff --git a/src/app/widgets/home.py b/src/app/widgets/home.py index e1e09f1..6d9d7d5 100755 --- a/src/app/widgets/home.py +++ b/src/app/widgets/home.py @@ -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): diff --git a/src/app/widgets/instrumentselector.py b/src/app/widgets/instrumentselector.py index 9bafbc3..fc0f966 100755 --- a/src/app/widgets/instrumentselector.py +++ b/src/app/widgets/instrumentselector.py @@ -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()