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
53 self
.playingScreen
= None
55 def initWiimotes(self
) :
56 if self
.wiimoteSupport
:
58 from pywiiuse
import PyWiiUse
as wiiuse
59 global pygame_wiimouse
60 from pywiiuse
import pygame_wiimouse
61 from minwii
.config
import IR_POSITION
62 pygame_wiimouse
.init(5, 5, self
.screenResolution
, IR_POSITION
) # look for 5, wait 5 seconds
63 self
.nwiimotes
= nwiimotes
= pygame_wiimouse
.get_count()
64 console
.debug('wiimotes found : %d', nwiimotes
)
65 self
.WT
= WT
= pygame_wiimouse
.WT
66 WT
.setEventCallBack(self
._wiimotesEventCallBack
)
71 def _wiimotesEventCallBack(self
, wt
, id, wmp
) :
72 if self
.screen
== SCREEN_PLAY
:
73 pygame_wiimouse
._default
_event
_cb
(wt
, id, wmp
)
76 if id == self
.nwiimotes
- 1 :
77 # le bouton Home de la télécommande permet de sortir
78 # (envoi d'un événement clavier « q »)
79 if wiiuse
.is_just_pressed(wm
, wiiuse
.button
['Home']) :
80 event
= pygame
.event
.Event(pygame
.KEYDOWN
,
83 pygame
.event
.post(event
)
84 elif wiiuse
.is_just_pressed(wm
, wiiuse
.button
['+']) :
86 elif wiiuse
.is_just_pressed(wm
, wiiuse
.button
['-']) :
88 elif wiiuse
.is_just_pressed(wm
, wiiuse
.button
['1']) and self
.playingScreen
:
89 self
.playingScreen
.tempoTrimUp()
90 elif wiiuse
.is_just_pressed(wm
, wiiuse
.button
['2']) and self
.playingScreen
:
91 self
.playingScreen
.tempoTrimDown()
93 elif self
.screen
in (SCREEN_HOME
, SCREEN_INSTRUMENTS
) :
94 pygame_wiimouse
._full
_mouse
_event
_cb
(wt
, id, wmp
)
97 "séquençage de l'affichage des écrans"
100 displayFlags
= displayFlags | pygame
.FULLSCREEN
101 pygame
.display
.set_mode(self
.screenResolution
, displayFlags
)
102 pygame
.display
.set_caption('MINWii')
105 songFile
, playMode
, wiimoteIndex
= '', 'NORMAL', 0
109 WT
.selectWiimote(self
.nwiimotes
- 1) # la télécommande est la souris
110 self
.screen
= SCREEN_HOME
111 exit
, songFile
, playMode
, wiimoteIndex
= \
112 self
.selectSongAndOptions(songFile
, playMode
, wiimoteIndex
)
116 self
.screen
= SCREEN_INSTRUMENTS
117 instrumentDescription
= self
.selectInstrument()
118 if not instrumentDescription
:
121 self
.screen
= SCREEN_PLAY
122 WT
.selectWiimote(wiimoteIndex
)
123 self
.runPlayingScreen(songFile
, playMode
, instrumentDescription
)
127 def selectSongAndOptions(self
, songFile
, playMode
, wiimoteIndex
) :
128 """ lance l'écran de paramétrage et retourne un tuple comportant :
129 - drapeau de sortie de l'application (booléen)
130 - chemin du fichier de la chanson
132 - wiimote sélectionnée (entier)
134 home
= Home(songPath
=SONG_FILE_PATH
,
137 wiimoteIndex
=wiimoteIndex
,
138 nwiimotes
=self
.nwiimotes
)
140 home
.connect(QUIT
, app
.quit
)
146 console
.debug("sortie de l'application")
148 actual_wiimotes
= self
.WT
.get_count()
150 self
.firstSong
= False
152 envLogger
.info('NEW_LOG_FILE')
153 console
.info('chanson : %s', home
.songFile
)
154 console
.info('mode : %s', home
.modeSelect
.value
)
155 if actual_wiimotes
is None :
156 console
.info('HID : souris')
157 elif actual_wiimotes
== 0 :
158 console
.info('HID : souris (pas de wiimote trouvée)')
160 console
.info('HID : wiimote %d', home
.selectedWiimote
.value
+ 1)
163 return (home
.exitApp
,
165 home
.selectedPlayMode
,
166 home
.selectedWiimoteIndex
)
168 def selectInstrument(self
) :
169 """ lance l'écran de sélection de l'instrument et retourne
170 un dictionnaire comportant la description de l'instrument
172 selector
= InstrumentSelector()
176 EventDispatcher
.reset()
177 instru
= selector
.selectedInstrument
179 console
.info('instrument : %s', instru
['name'])
180 console
.info('preset : %d', instru
['preset'])
181 console
.info('bank : %d', instru
['bank'])
182 console
.info('ajustement octave : %d', instru
['octave'])
185 def runPlayingScreen(self
, songFile
, playMode
, instrumentDescription
) :
186 """ Lance l'écran de jeu principal avec la chanson 'songFile' dans le mode 'playMode'
187 avec l'instrument midi 'instrumentDescription'.
189 playMode
= PLAYING_MODES_DICT
[playMode
]
190 bank
, preset
= instrumentDescription
['bank'], instrumentDescription
['preset']
191 octave
= instrumentDescription
['octave']
192 self
.synth
.adjust_octave(0, octave
)
193 self
.synth
.program_select(0, bank
, preset
)
194 if playMode
== PLAYING_MODES_DICT
['IMPRO'] :
195 playingScreen
= PlayingScreen(self
.synth
)
197 song
= musicXml2Song(songFile
)
198 self
.playingScreen
= playingScreen
= SongPlayingScreen(self
.synth
, song
, mode
=playMode
)
201 EventDispatcher
.reset()
202 self
.playingScreen
= None
206 """ Classe utilitaire pour singer l'api
207 de pygame_wiimouse en cas d'abscence de wiimote.
209 selectWimoteIndex
= 0
214 def selectWiimote(self
, i
):
216 def get_count(self
) :