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