From: pin Date: Fri, 5 Mar 2010 14:46:01 +0000 (+0000) Subject: Ajout des soundfonts X-Git-Url: https://scm.cri.mines-paristech.fr/git/minwii.git/commitdiff_plain/0bb53427dd76e9e9863362dd3c9b2d205b4f8043?ds=sidebyside;hp=21025650d4d91bd0e1848bf1a78208301180e604 Ajout des soundfonts 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 --- diff --git a/src/app/eventutils.py b/src/app/eventutils.py index c115c28..fda8154 100755 --- a/src/app/eventutils.py +++ b/src/app/eventutils.py @@ -29,6 +29,7 @@ $URL$ import types import pygame from StringIO import StringIO +from events import NOTEON 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, []) + if event.type == NOTEON : + print len(listeners) for listener in listeners : listener(event) + def reset(self) : + self.registry = {} def __repr__(self) : out = StringIO() diff --git a/src/app/minwii.py b/src/app/minwii.py index 26e2a5e..c4fdc23 100755 --- a/src/app/minwii.py +++ b/src/app/minwii.py @@ -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 synth import Synth +from eventutils import EventDispatcher 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) - playingScreen = PlayingScreen() + playingScreen = PlayingScreen(synth) playingScreen.run() + EventDispatcher.reset() diff --git a/src/app/soundfonts/FluidR3_GM.sf2 b/src/app/soundfonts/FluidR3_GM.sf2 new file mode 100644 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 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 index 0000000..a2a0244 --- /dev/null +++ b/src/app/synth.py @@ -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 diff --git a/src/app/widgets/playingscreen.py b/src/app/widgets/playingscreen.py index 223f4e5..f699a56 100755 --- a/src/app/widgets/playingscreen.py +++ b/src/app/widgets/playingscreen.py @@ -32,12 +32,13 @@ from config import FONT_COLOR 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__() + self.synth = synth 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.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() + pygame.mouse.set_visible(False) 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) @@ -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] - def __init__(self) : + def __init__(self, synth) : 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 - 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 - self.fs.noteoff(0, tone.midi) + self.synth.noteoff(0, tone.midi) - class SongPlayingScreen(_PlayingScreenBase) :