ad2e38226bd0479e560ae3d0ae26c0ef978b682b
[minwii.git] / src / minwii / app.py
1 # -*- coding: utf-8 -*-
2 """
3 l'application winwii
4
5 $Id$
6 $URL$
7 """
8
9 import pygame
10 from pgu.gui import Desktop
11 from pgu.gui import QUIT
12 from minwii.widgets.launch import LaunchScreen
13 from minwii.widgets.home import Home
14 from minwii.widgets.playingscreen import SongPlayingScreen, PlayingScreen
15 from minwii.widgets.instrumentselector import InstrumentSelector
16 from minwii.synth import Synth
17 from minwii.eventutils import EventDispatcher
18 from minwii.musicxml import musicXml2Song
19 from minwii.config import SONG_FILE_PATH
20 from minwii.globals import PLAYING_MODES_DICT
21 from minwii.log import console, LOG_FORMAT_VERSION, envLogger
22
23
24 class MinWii(object):
25
26 def __init__(self, wiimoteSupport=True, fullscreen=False) :
27 envLogger.info('winwii log format version : %s', LOG_FORMAT_VERSION)
28 self.wiimoteSupport = wiimoteSupport
29 self.fullscreen = fullscreen
30 LaunchScreen()
31 self.app = Desktop()
32 self.synth = Synth()
33 self.screenResolution = (1024,768)
34 envLogger.info('résolution écran : %s', self.screenResolution)
35 self.nwiimotes = 0
36 self.initWiimotes()
37 self.firstSong = True
38
39 def initWiimotes(self) :
40 if self.wiimoteSupport :
41 from pywiiuse import pygame_wiimouse
42 from minwii.config import IR_POSITION
43 pygame_wiimouse.init(4, 5, self.screenResolution, IR_POSITION) # look for 4, wait 5 seconds
44 self.nwiimotes = nwiimotes = pygame_wiimouse.get_count()
45 console.debug('wiimotes found : %d', nwiimotes)
46 self.WT = WT = pygame_wiimouse.WT
47 WT.pause()
48 else :
49 self.WT = _WTFacade()
50
51 def run(self) :
52 "séquençage de l'affichage des écrans"
53 displayFlags = 0
54 if self.fullscreen :
55 displayFlags = displayFlags | pygame.FULLSCREEN
56 pygame.display.set_mode(self.screenResolution, displayFlags)
57 pygame.display.set_caption('MINWii')
58 WT = self.WT
59
60 while True :
61
62 exit, songFile, playMode, selectedWiimoteIndex = self.selectSongAndOptions()
63 if exit : break
64
65 WT.selectWiimote(selectedWiimoteIndex)
66 WT.resume()
67
68 instrumentDescription = self.selectInstrument()
69 if not instrumentDescription :
70 WT.pause()
71 continue
72
73 self.runPlayingScreen(songFile, playMode, instrumentDescription)
74
75 WT.pause()
76
77
78 def selectSongAndOptions(self) :
79 """ lance l'écran de paramétrage et retourne un tuple comportant :
80 - drapeau de sortie de l'application (booléen)
81 - chemin du fichier de la chanson
82 - mode (entier)
83 - wiimote sélectionnée (entier)
84 """
85 home = Home(songPath=SONG_FILE_PATH,
86 nwiimotes=self.nwiimotes)
87 app = self.app
88 home.connect(QUIT, app.quit)
89 app.run(home)
90 app.close(home)
91
92 #logging
93 if home.exitApp :
94 console.debug("sortie de l'application")
95 else :
96 actual_wiimotes = self.WT.get_count()
97 if self.firstSong :
98 self.firstSong = False
99 else :
100 envLogger.info('NEW_LOG_FILE')
101 console.info('chanson : %s', home.songFile)
102 console.info('mode : %s', home.modeSelect.value)
103 if actual_wiimotes is None :
104 console.info('HID : souris')
105 elif actual_wiimotes == 0 :
106 console.info('HID : souris (pas de wiimote trouvée)')
107 else :
108 console.info('HID : wiimote %d', home.selectedWiimote.value + 1)
109 #---
110
111 return (home.exitApp,
112 home.songFile,
113 home.modeSelect.value,
114 home.selectedWiimote.value)
115
116 def selectInstrument(self) :
117 """ lance l'écran de sélection de l'instrument et retourne
118 un dictionnaire comportant la description de l'instrument
119 """
120 selector = InstrumentSelector()
121 selector.run()
122 selector.stop()
123 pygame.event.clear()
124 EventDispatcher.reset()
125 instru = selector.selectedInstrument
126 if instru :
127 console.info('instrument : %s', instru['name'])
128 console.info('preset : %d', instru['preset'])
129 console.info('bank : %d', instru['bank'])
130 console.info('ajustement octave : %d', instru['octave'])
131 return instru
132
133 def runPlayingScreen(self, songFile, playMode, instrumentDescription) :
134 """ Lance l'écran de jeu principal avec la chanson 'songFile' dans le mode 'playMode'
135 avec l'instrument midi 'instrumentDescription'.
136 """
137 playMode = PLAYING_MODES_DICT[playMode]
138 song = musicXml2Song(songFile)
139 bank, preset = instrumentDescription['bank'], instrumentDescription['preset']
140 octave = instrumentDescription['octave']
141 self.synth.adjust_octave(0, octave)
142 self.synth.program_select(0, bank, preset)
143 playingScreen = SongPlayingScreen(self.synth, song, mode=playMode)
144 playingScreen.run()
145 pygame.event.clear()
146 EventDispatcher.reset()
147
148
149 class _WTFacade :
150 """ Classe utilitaire pour singer l'api
151 de pygame_wiimouse en cas d'abscence de wiimote.
152 """
153 selectWimoteIndex = 0
154 def pause(self):
155 pass
156 def resume(self):
157 pass
158 def selectWiimote(self, i):
159 pass
160 def get_count(self) :
161 return None