envoi pan et velocity en fonction de la position du pointeur.
authorpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Wed, 21 Apr 2010 14:34:51 +0000 (14:34 +0000)
committerpin <pin@fe552daf-6dbe-4428-90eb-1537e0879342>
Wed, 21 Apr 2010 14:34:51 +0000 (14:34 +0000)
git-svn-id: https://svn.cri.ensmp.fr/svn/minwii/trunk@159 fe552daf-6dbe-4428-90eb-1537e0879342

src/app/config.py
src/app/widgets/playingscreen.py

index 1c2b9bd..d8bdd6c 100755 (executable)
@@ -22,7 +22,6 @@ pygame.font.init()
 
 # playingscreen
 FRAMERATE = 100
-BORDER = 0 # 5px
 FIRST_HUE = 0.6
 OFF_LUMINANCE = 0.2
 OFF_SATURATION = 1
@@ -35,7 +34,8 @@ font_file = _computePath('fonts/Arial Unicode.ttf')
 NOTES_FONT = pygame.font.Font(font_file, 50)
 LYRICS_FONT = pygame.font.Font(None, 80)
 FONT_COLOR = (0,0,0)
-DEFAULT_MIDI_VELOCITY = 96
+MIDI_VELOCITY_RANGE = (64, 127)
+MIDI_PAN_RANGE = (32, 96)
 
 SONG_FILE_PATH = _computePath('../../chansons')
 
index 1e7323c..736dd06 100755 (executable)
@@ -15,9 +15,9 @@ import types
 from musicxml import Tone
 
 from config import FRAMERATE
-from config import BORDER
 from config import FIRST_HUE
-from config import DEFAULT_MIDI_VELOCITY
+from config import MIDI_VELOCITY_RANGE
+from config import MIDI_PAN_RANGE
 
 from globals import BACKGROUND_LAYER
 from globals import CURSOR_LAYER
@@ -57,14 +57,14 @@ class _PlayingScreenBase(pygame.sprite.LayeredDirty, EventHandlerMixin) :
         screen = pygame.display.get_surface()
 
         # taille de la zone d'affichage utile (bordure autour)
-        self.dispWidth  = dispWidth = screen.get_width() - 2 * BORDER
-        self.dispHeight = dispHeight = screen.get_height() - 2 * BORDER
+        self.dispWidth  = dispWidth = screen.get_width()
+        self.dispHeight = dispHeight = screen.get_height()
         
         columnWidth = int(round(float(dispWidth) / self.keyboardLength))
 
         rects = []
         for i in range(self.keyboardLength) :
-            upperLeftCorner = (i*columnWidth + BORDER, BORDER)
+            upperLeftCorner = (i*columnWidth, 0)
             rect = pygame.Rect(upperLeftCorner, (columnWidth, dispHeight))
             rects.append(rect)
         
@@ -141,6 +141,16 @@ class _PlayingScreenBase(pygame.sprite.LayeredDirty, EventHandlerMixin) :
     def raiseColOver(self, col, pos) :
         evt = pygame.event.Event(events.COLOVER, column=col, pos=pos)
         pygame.event.post(evt)
+    
+    def getVelocity(self, pos) :
+        vel = (float(self.dispWidth) - pos[1]) / self.dispWidth
+        vel = int(vel * (MIDI_VELOCITY_RANGE[1] - MIDI_VELOCITY_RANGE[0])) + MIDI_VELOCITY_RANGE[0]
+        return vel
+        
+    def getPan(self, index) :
+        pan = float(index) / (self.keyboardLength -1)
+        pan = int(pan * (MIDI_PAN_RANGE[1] - MIDI_PAN_RANGE[0])) + MIDI_PAN_RANGE[0]
+        return pan
 
         
 class PlayingScreen(_PlayingScreenBase) :
@@ -159,7 +169,7 @@ class PlayingScreen(_PlayingScreenBase) :
     @event_handler(events.NOTEON)
     def noteon(self, evt) :
         tone = evt.tone
-        self.synth.noteon(0, tone.midi, DEFAULT_MIDI_VELOCITY)
+        self.synth.noteon(0, tone.midi, 96)
 
     @event_handler(events.NOTEOFF)
     def noteoff(self, evt) :
@@ -197,7 +207,10 @@ class SongPlayingScreen(_PlayingScreenBase) :
     def handleColumnDown(self, event) :
         col = event.column
         if col.state:
-            self.synth.noteon(0, col.tone.midi, DEFAULT_MIDI_VELOCITY)
+            pan = self.getPan(col.index)
+            self.synth.cc(0, 10, pan)
+            vel = self.getVelocity(event.pos)
+            self.synth.noteon(0, col.tone.midi, vel)
             self.currentNotePlayed = True
     
     def handleColumnUp(self, event) :
@@ -208,7 +221,10 @@ class SongPlayingScreen(_PlayingScreenBase) :
     def handleColumnOver(self, event) :
         col = event.column
         if col.state and not self.currentNotePlayed :
-            self.synth.noteon(0, col.tone.midi, DEFAULT_MIDI_VELOCITY)
+            pan = self.getPan(col.index)
+            self.synth.cc(0, 10, pan)
+            vel = self.getVelocity(event.pos)
+            self.synth.noteon(0, col.tone.midi, vel)
             SongPlayingScreen.setNoteTimeout(
                         int(self.currentNote.duration * \
                             self.quarterNoteDuration)