1 # -*- coding: utf-8 -*-
10 from pgu
.gui
import Theme
11 from pgu
.gui
import Desktop
12 from pgu
.gui
import QUIT
13 from minwii
.widgets
.launch
import LaunchScreen
14 from minwii
.widgets
.home
import Home
15 from minwii
.widgets
.playingscreen
import SongPlayingScreen
, PlayingScreen
16 from minwii
.widgets
.instrumentselector
import InstrumentSelector
17 from minwii
.synth
import Synth
18 from minwii
.eventutils
import EventDispatcher
19 from minwii
.musicxml
import musicXml2Song
20 from minwii
.config
import SONG_FILE_PATH
21 from minwii
.config
import SCREEN_RESOLUTION
22 from minwii
.globals import PLAYING_MODES_DICT
23 from minwii
.log
import console
, LOG_FORMAT_VERSION
, envLogger
27 pygame_wiimouse
= None
30 SCREEN_INSTRUMENTS
= 1
37 def __init__(self
, wiimoteSupport
=True, fullscreen
=False) :
38 envLogger
.info('winwii log format version : %s', LOG_FORMAT_VERSION
)
39 self
.wiimoteSupport
= wiimoteSupport
40 self
.fullscreen
= fullscreen
42 themedir
= __file__
.split(os
.path
.sep
)[:-1] + ['widgets', 'data', 'minwii_theme']
43 themedir
= os
.path
.sep
.join(themedir
)
44 theme
= Theme(themedir
)
45 self
.app
= Desktop(theme
=theme
)
47 self
.screenResolution
= SCREEN_RESOLUTION
48 envLogger
.info('résolution écran : %s', self
.screenResolution
)
52 self
.screen
= SCREEN_HOME
54 def initWiimotes(self
) :
55 if self
.wiimoteSupport
:
57 from pywiiuse
import PyWiiUse
as wiiuse
58 global pygame_wiimouse
59 from pywiiuse
import pygame_wiimouse
60 from minwii
.config
import IR_POSITION
61 pygame_wiimouse
.init(2, 5, self
.screenResolution
, IR_POSITION
) # look for 4, wait 5 seconds
62 self
.nwiimotes
= nwiimotes
= pygame_wiimouse
.get_count()
63 console
.debug('wiimotes found : %d', nwiimotes
)
64 self
.WT
= WT
= pygame_wiimouse
.WT
65 WT
.setEventCallBack(self
._wiimotesEventCallBack
)
70 def _wiimotesEventCallBack(self
, wt
, id, wmp
) :
71 if self
.screen
== SCREEN_PLAY
:
72 pygame_wiimouse
._default
_event
_cb
(wt
, id, wmp
)
74 # le bouton Home de la télécommande permet de sortir
75 # (envoi d'un événement clavier « q »)
77 if id == self
.nwiimotes
- 1 and \
78 wiiuse
.is_just_pressed(wm
, wiiuse
.button
['Home']) :
79 event
= pygame
.event
.Event(pygame
.KEYDOWN
,
82 pygame
.event
.post(event
)
84 elif self
.screen
in (SCREEN_HOME
, SCREEN_INSTRUMENTS
) :
85 pygame_wiimouse
._full
_mouse
_event
_cb
(wt
, id, wmp
)
88 "séquençage de l'affichage des écrans"
91 displayFlags
= displayFlags | pygame
.FULLSCREEN
92 pygame
.display
.set_mode(self
.screenResolution
, displayFlags
)
93 pygame
.display
.set_caption('MINWii')
96 songFile
, playMode
, wiimoteIndex
= '', 'NORMAL', 0
100 WT
.selectWiimote(self
.nwiimotes
- 1) # la télécommande est la souris
101 self
.screen
= SCREEN_HOME
102 exit
, songFile
, playMode
, wiimoteIndex
= \
103 self
.selectSongAndOptions(songFile
, playMode
, wiimoteIndex
)
107 self
.screen
= SCREEN_INSTRUMENTS
108 instrumentDescription
= self
.selectInstrument()
109 if not instrumentDescription
:
112 self
.screen
= SCREEN_PLAY
113 WT
.selectWiimote(wiimoteIndex
)
114 self
.runPlayingScreen(songFile
, playMode
, instrumentDescription
)
118 def selectSongAndOptions(self
, songFile
, playMode
, wiimoteIndex
) :
119 """ lance l'écran de paramétrage et retourne un tuple comportant :
120 - drapeau de sortie de l'application (booléen)
121 - chemin du fichier de la chanson
123 - wiimote sélectionnée (entier)
125 home
= Home(songPath
=SONG_FILE_PATH
,
128 wiimoteIndex
=wiimoteIndex
,
129 nwiimotes
=self
.nwiimotes
)
131 home
.connect(QUIT
, app
.quit
)
137 console
.debug("sortie de l'application")
139 actual_wiimotes
= self
.WT
.get_count()
141 self
.firstSong
= False
143 envLogger
.info('NEW_LOG_FILE')
144 console
.info('chanson : %s', home
.songFile
)
145 console
.info('mode : %s', home
.modeSelect
.value
)
146 if actual_wiimotes
is None :
147 console
.info('HID : souris')
148 elif actual_wiimotes
== 0 :
149 console
.info('HID : souris (pas de wiimote trouvée)')
151 console
.info('HID : wiimote %d', home
.selectedWiimote
.value
+ 1)
154 return (home
.exitApp
,
156 home
.selectedPlayMode
,
157 home
.selectedWiimoteIndex
)
159 def selectInstrument(self
) :
160 """ lance l'écran de sélection de l'instrument et retourne
161 un dictionnaire comportant la description de l'instrument
163 selector
= InstrumentSelector()
167 EventDispatcher
.reset()
168 instru
= selector
.selectedInstrument
170 console
.info('instrument : %s', instru
['name'])
171 console
.info('preset : %d', instru
['preset'])
172 console
.info('bank : %d', instru
['bank'])
173 console
.info('ajustement octave : %d', instru
['octave'])
176 def runPlayingScreen(self
, songFile
, playMode
, instrumentDescription
) :
177 """ Lance l'écran de jeu principal avec la chanson 'songFile' dans le mode 'playMode'
178 avec l'instrument midi 'instrumentDescription'.
180 playMode
= PLAYING_MODES_DICT
[playMode
]
181 bank
, preset
= instrumentDescription
['bank'], instrumentDescription
['preset']
182 octave
= instrumentDescription
['octave']
183 self
.synth
.adjust_octave(0, octave
)
184 self
.synth
.program_select(0, bank
, preset
)
185 if playMode
== PLAYING_MODES_DICT
['IMPRO'] :
186 playingScreen
= PlayingScreen(self
.synth
)
188 song
= musicXml2Song(songFile
)
189 playingScreen
= SongPlayingScreen(self
.synth
, song
, mode
=playMode
)
192 EventDispatcher
.reset()
196 """ Classe utilitaire pour singer l'api
197 de pygame_wiimouse en cas d'abscence de wiimote.
199 selectWimoteIndex
= 0
204 def selectWiimote(self
, i
):
206 def get_count(self
) :