ON_COLUMN_ALPHA = 1
FONT = pygame.font.Font(None, 80)
FONT_COLOR = (0,0,0)
ON_COLUMN_ALPHA = 1
FONT = pygame.font.Font(None, 80)
FONT_COLOR = (0,0,0)
+DEFAULT_MIDI_VELOCITY = 96
\ No newline at end of file
from pgu.gui import Desktop
from pgu.gui import QUIT
from widgets.home import Home
from pgu.gui import Desktop
from pgu.gui import QUIT
from widgets.home import Home
-from widgets.playingscreen import SongPlayingScreen
+from widgets.playingscreen import SongPlayingScreen, PlayingScreen
from synth import Synth
from eventutils import EventDispatcher
from musicxml import musicXml2Song
from synth import Synth
from eventutils import EventDispatcher
from musicxml import musicXml2Song
synth = Synth()
synth.program_select(0, 0, 0)
synth = Synth()
synth.program_select(0, 0, 0)
#home = Home()
#home.connect(QUIT, app.quit)
#app.run(home)
#home = Home()
#home.connect(QUIT, app.quit)
#app.run(home)
song = musicXml2Song('/Users/pinbe/dev/minwii/src/songs/chansons/bon_tabac.xml')
playingScreen = SongPlayingScreen(synth, song)
song = musicXml2Song('/Users/pinbe/dev/minwii/src/songs/chansons/bon_tabac.xml')
playingScreen = SongPlayingScreen(synth, song)
+ #playingScreen = PlayingScreen(synth)
playingScreen.run()
EventDispatcher.reset()
playingScreen.run()
EventDispatcher.reset()
+++ /dev/null
-# -*- coding: utf-8 -*-
-"""
-Lecteur de chanson
-
-$Id$
-$URL$
-"""
from math import floor
import types
from musicxml import Tone
from math import floor
import types
from musicxml import Tone
from config import FRAMERATE
from config import BORDER
from config import FRAMERATE
from config import BORDER
from config import ON_COLUMN_ALPHA
from config import FONT
from config import FONT_COLOR
from config import ON_COLUMN_ALPHA
from config import FONT
from config import FONT_COLOR
+from config import DEFAULT_MIDI_VELOCITY
BACKGROUND_LAYER = 0
FOREGROUND_LAYER = 1
CURSOR_LAYER = 2
BACKGROUND_LAYER = 0
FOREGROUND_LAYER = 1
CURSOR_LAYER = 2
+PLAYING_MODES = {'EASY':0
+ ,'NORMAL':1
+ ,'ADVANCED':2
+ ,'EXPERT':3}
class _PlayingScreenBase(pygame.sprite.LayeredDirty, EventHandlerMixin) :
class _PlayingScreenBase(pygame.sprite.LayeredDirty, EventHandlerMixin) :
self.keyboardRects = []
self.cursor = None
self._initRects()
self.keyboardRects = []
self.cursor = None
self._initRects()
self._initColumns()
self._running = False
self.draw(pygame.display.get_surface())
self._initColumns()
self._running = False
self.draw(pygame.display.get_surface())
tone = self.distinctNotes[i]
c = Column(self, hue, rect, tone)
self.add(c, layer=BACKGROUND_LAYER)
tone = self.distinctNotes[i]
c = Column(self, hue, rect, tone)
self.add(c, layer=BACKGROUND_LAYER)
+ self.columns[tone.midi] = c
+
def _initCursor(self) :
self.cursor = WarpingCursor(blinkMode=True)
def _initCursor(self) :
self.cursor = WarpingCursor(blinkMode=True)
class PlayingScreen(_PlayingScreenBase) :
"fenêtre de jeu pour improvisation"
class PlayingScreen(_PlayingScreenBase) :
"fenêtre de jeu pour improvisation"
scale = [55, 57, 59, 60, 62, 64, 65, 67, 69, 71, 72]
def __init__(self, synth) :
scale = [55, 57, 59, 60, 62, 64, 65, 67, 69, 71, 72]
def __init__(self, synth) :
@event_handler(events.NOTEON)
def noteon(self, evt) :
tone = evt.tone
@event_handler(events.NOTEON)
def noteon(self, evt) :
tone = evt.tone
- self.synth.noteon(0, tone.midi, 64)
+ self.synth.noteon(0, tone.midi, DEFAULT_MIDI_VELOCITY)
@event_handler(events.NOTEOFF)
def noteoff(self, evt) :
@event_handler(events.NOTEOFF)
def noteoff(self, evt) :
class SongPlayingScreen(_PlayingScreenBase) :
class SongPlayingScreen(_PlayingScreenBase) :
- def __init__(self, synth, song) :
+ def __init__(self, synth, song, mode=PLAYING_MODES['NORMAL']) :
super(SongPlayingScreen, self).__init__(synth, song.distinctNotes)
self.song = song
super(SongPlayingScreen, self).__init__(synth, song.distinctNotes)
self.song = song
+ self.noteIterator = self.song.iterNotes()
+ self.play()
+
+ def play(self) :
+ note, verseIndex = self.noteIterator.next()
+ syllabus = note.lyrics[verseIndex].syllabus()
+ column = self.columns[note.midi]
+ column.update(True, syllabus)
+
@event_handler(events.NOTEON)
def noteon(self, evt) :
tone = evt.tone
@event_handler(events.NOTEON)
def noteon(self, evt) :
tone = evt.tone
- self.synth.noteon(0, tone.midi, 64)
+ self.synth.noteon(0, tone.midi, DEFAULT_MIDI_VELOCITY)
@event_handler(events.NOTEOFF)
def noteoff(self, evt) :
@event_handler(events.NOTEOFF)
def noteoff(self, evt) :
def __init__(self, group, hue, rect, tone) :
pygame.sprite.DirtySprite.__init__(self, group)
def __init__(self, group, hue, rect, tone) :
pygame.sprite.DirtySprite.__init__(self, group)
+ self.state = False
+
+ # nom de l'intonation
- toneName = FONT.render(tone.nom, True, (0,0,0))
+ toneName = FONT.render(tone.nom, True, (0,0,0))
+
+ # état off : surface unie et nom de l'intonation
sur = pygame.surface.Surface(rect.size)
rgba = hls_to_rgba_8bits(hue, OFF_LUMINANCE, OFF_SATURATION)
sur.fill(rgba)
sur = pygame.surface.Surface(rect.size)
rgba = hls_to_rgba_8bits(hue, OFF_LUMINANCE, OFF_SATURATION)
sur.fill(rgba)
tw, th, = toneName.get_size()
toneRect = pygame.Rect(((w - tw) / 2, h - th), (tw, th))
sur.blit(toneName, toneRect)
tw, th, = toneName.get_size()
toneRect = pygame.Rect(((w - tw) / 2, h - th), (tw, th))
sur.blit(toneName, toneRect)
+
+ # état on : surface dégradée avec nom de la note avec largeur agrandie
topRgba = hls_to_rgba_8bits(hue, ON_TOP_LUMINANCE, ON_SATURATION, ON_COLUMN_ALPHA)
bottomRgba = hls_to_rgba_8bits(hue, ON_BOTTOM_LUMINANCE, ON_SATURATION, ON_COLUMN_ALPHA)
onWidth = rect.width * ON_COLUMN_OVERSIZING
onLeft = rect.centerx - onWidth / 2
rectOn = pygame.Rect((onLeft, 0),
(onWidth, rect.height))
topRgba = hls_to_rgba_8bits(hue, ON_TOP_LUMINANCE, ON_SATURATION, ON_COLUMN_ALPHA)
bottomRgba = hls_to_rgba_8bits(hue, ON_BOTTOM_LUMINANCE, ON_SATURATION, ON_COLUMN_ALPHA)
onWidth = rect.width * ON_COLUMN_OVERSIZING
onLeft = rect.centerx - onWidth / 2
rectOn = pygame.Rect((onLeft, 0),
(onWidth, rect.height))
- self.stateOn = gradients.vertical(rectOn.size, topRgba, bottomRgba)
+ self.surOn = gradients.vertical(rectOn.size, topRgba, bottomRgba)
w, h = rectOn.w, rectOn.h
toneRect = pygame.Rect(((w - tw) / 2, h - th), (tw, th))
w, h = rectOn.w, rectOn.h
toneRect = pygame.Rect(((w - tw) / 2, h - th), (tw, th))
- self.stateOn.blit(toneName, toneRect)
+ self.surOn.blit(toneName, toneRect)
- self.image = self.stateOff
+ self.image = self.surOff
+ #EventDispatcher.addEventListener(pygame.MOUSEBUTTONDOWN, self.onMouseDown)
+ #EventDispatcher.addEventListener(pygame.MOUSEBUTTONUP, self.onMouseUp)
- def update(self, state) :
+ def update(self, state, syllabus='') :
+ if state == self.state :
+ # no changes
+ return
if state :
group.change_layer(self, FOREGROUND_LAYER)
if state :
group.change_layer(self, FOREGROUND_LAYER)
- self.image = self.stateOn
+ sur = self.surOn
+ if syllabus :
+ sur = sur.copy()
+ renderedSyl = FONT.render(syllabus, True, (0,0,0))
+ sw, sh, = renderedSyl.get_size()
+ w, h = self.rectOn.w, self.rectOn.h
+ sylRect = pygame.Rect(((w - sw) / 2, (h - sh) / 2), (sw, sh))
+ sur.blit(renderedSyl, sylRect)
+
+ self.image = sur
self.rect = self.rectOn
else :
group.change_layer(self, BACKGROUND_LAYER)
self.rect = self.rectOn
else :
group.change_layer(self, BACKGROUND_LAYER)
- self.image = self.stateOff
+ self.image = self.surOff
+ self.state = state
+ self.dirty = 1
@event_handler(pygame.MOUSEBUTTONDOWN)
def onMouseDown(self, event) :
@event_handler(pygame.MOUSEBUTTONDOWN)
def onMouseDown(self, event) :