f8e87982e66015e69c4c76847e62e660a68fecfd
[minwii.git] / src / minwii / synth.py
1 # -*- coding: utf-8 -*-
2 """
3 module de wrapping du synthétiseur
4
5 $Id$
6 $URL$
7 """
8 from os.path import realpath, sep, exists
9 from fluidsynth import Synth as FSynth
10 from log import console, envLogger, eventLogger
11 import pygame
12 import events
13 from config import SOUND_FONT
14
15 class Synth(FSynth) :
16 """
17 Interface fluidsynth avec les adaptations suivantes :
18 - la soundfont FluidR3_GM.sf2 est chargée par défaut
19 - le constructeur démarre le synthé
20 - octaviation
21 """
22
23 def __init__(self, gain=0.2, samplerate=44100, sfPath='') :
24 FSynth.__init__(self, gain=gain, samplerate=samplerate)
25
26 if not sfPath :
27 sfPath = SOUND_FONT
28 assert exists(sfPath)
29
30 self.start()
31 self.fsid = self.sfload(sfPath)
32 self._octaveAjusts = {}
33 console.debug('démarrage du synthétiseur')
34 envLogger.info('soundfont : %s', sfPath)
35
36 def __del__(self) :
37 console.debug('arrêt du synthétiseur')
38 self.delete()
39
40 def adjust_octave(self, chan, octave) :
41 '''
42 Abaisse ou élève les notes de n octave
43 '''
44 self._octaveAjusts[chan] = octave
45
46 def sfunload(self, update_midi_preset=0):
47 FSynth.sfunload(self, self.fsid, update_midi_preset=update_midi_preset)
48
49 def program_select(self, chan, bank, preset):
50 FSynth.program_select(self, chan, self.fsid, bank, preset)
51
52 def sfont_select(self, chan):
53 FSynth.sfont_select(self, chan, self.fsid)
54
55
56 # on loggue les noteon / noteoff en utilisant les événements pygame
57 # mais ils ne sont pas postés -> on fait ça pour que le log de l'événement
58 # et l'exécution du noteon/off soit effectué au sein de la même itération
59 # de la boucle principale.
60
61 def noteon(self, chan, key, vel):
62 key = key + self._octaveAjusts.get(chan, 0) * 12
63 FSynth.noteon(self, chan, key, vel)
64 evt = pygame.event.Event(events.NOTEON, chan=chan, key=key, vel=vel)
65 eventLogger.info(evt)
66 #pygame.event.post(evt)
67
68 def noteoff(self, chan, key) :
69 key = key + self._octaveAjusts.get(chan, 0) * 12
70 FSynth.noteoff(self, chan, key)
71 evt = pygame.event.Event(events.NOTEOFF, chan=chan, key=key)
72 eventLogger.info(evt)
73 #pygame.event.post(evt)