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
)
75 if id == self
.nwiimotes
- 1 :
76 # le bouton Home de la télécommande permet de sortir
77 # (envoi d'un événement clavier « q »)
78 if wiiuse
.is_just_pressed(wm
, wiiuse
.button
['Home']) :
79 event
= pygame
.event
.Event(pygame
.KEYDOWN
,
82 pygame
.event
.post(event
)
83 elif wiiuse
.is_just_pressed(wm
, wiiuse
.button
['+']) :
85 elif wiiuse
.is_just_pressed(wm
, wiiuse
.button
['-']) :
88 elif self
.screen
in (SCREEN_HOME
, SCREEN_INSTRUMENTS
) :
89 pygame_wiimouse
._full
_mouse
_event
_cb
(wt
, id, wmp
)
92 "séquençage de l'affichage des écrans"
95 displayFlags
= displayFlags | pygame
.FULLSCREEN
96 pygame
.display
.set_mode(self
.screenResolution
, displayFlags
)
97 pygame
.display
.set_caption('MINWii')
100 songFile
, playMode
, wiimoteIndex
= '', 'NORMAL', 0
104 WT
.selectWiimote(self
.nwiimotes
- 1) # la télécommande est la souris
105 self
.screen
= SCREEN_HOME
106 exit
, songFile
, playMode
, wiimoteIndex
= \
107 self
.selectSongAndOptions(songFile
, playMode
, wiimoteIndex
)
111 self
.screen
= SCREEN_INSTRUMENTS
112 instrumentDescription
= self
.selectInstrument()
113 if not instrumentDescription
:
116 self
.screen
= SCREEN_PLAY
117 WT
.selectWiimote(wiimoteIndex
)
118 self
.runPlayingScreen(songFile
, playMode
, instrumentDescription
)
122 def selectSongAndOptions(self
, songFile
, playMode
, wiimoteIndex
) :
123 """ lance l'écran de paramétrage et retourne un tuple comportant :
124 - drapeau de sortie de l'application (booléen)
125 - chemin du fichier de la chanson
127 - wiimote sélectionnée (entier)
129 home
= Home(songPath
=SONG_FILE_PATH
,
132 wiimoteIndex
=wiimoteIndex
,
133 nwiimotes
=self
.nwiimotes
)
135 home
.connect(QUIT
, app
.quit
)
141 console
.debug("sortie de l'application")
143 actual_wiimotes
= self
.WT
.get_count()
145 self
.firstSong
= False
147 envLogger
.info('NEW_LOG_FILE')
148 console
.info('chanson : %s', home
.songFile
)
149 console
.info('mode : %s', home
.modeSelect
.value
)
150 if actual_wiimotes
is None :
151 console
.info('HID : souris')
152 elif actual_wiimotes
== 0 :
153 console
.info('HID : souris (pas de wiimote trouvée)')
155 console
.info('HID : wiimote %d', home
.selectedWiimote
.value
+ 1)
158 return (home
.exitApp
,
160 home
.selectedPlayMode
,
161 home
.selectedWiimoteIndex
)
163 def selectInstrument(self
) :
164 """ lance l'écran de sélection de l'instrument et retourne
165 un dictionnaire comportant la description de l'instrument
167 selector
= InstrumentSelector()
171 EventDispatcher
.reset()
172 instru
= selector
.selectedInstrument
174 console
.info('instrument : %s', instru
['name'])
175 console
.info('preset : %d', instru
['preset'])
176 console
.info('bank : %d', instru
['bank'])
177 console
.info('ajustement octave : %d', instru
['octave'])
180 def runPlayingScreen(self
, songFile
, playMode
, instrumentDescription
) :
181 """ Lance l'écran de jeu principal avec la chanson 'songFile' dans le mode 'playMode'
182 avec l'instrument midi 'instrumentDescription'.
184 playMode
= PLAYING_MODES_DICT
[playMode
]
185 bank
, preset
= instrumentDescription
['bank'], instrumentDescription
['preset']
186 octave
= instrumentDescription
['octave']
187 self
.synth
.adjust_octave(0, octave
)
188 self
.synth
.program_select(0, bank
, preset
)
189 if playMode
== PLAYING_MODES_DICT
['IMPRO'] :
190 playingScreen
= PlayingScreen(self
.synth
)
192 song
= musicXml2Song(songFile
)
193 playingScreen
= SongPlayingScreen(self
.synth
, song
, mode
=playMode
)
196 EventDispatcher
.reset()
200 """ Classe utilitaire pour singer l'api
201 de pygame_wiimouse en cas d'abscence de wiimote.
203 selectWimoteIndex
= 0
208 def selectWiimote(self
, i
):
210 def get_count(self
) :