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, audioDriver
=None) :
38 envLogger
.info('winwii log format version : %s', LOG_FORMAT_VERSION
)
39 self
.wiimoteSupport
= wiimoteSupport
40 self
.fullscreen
= fullscreen
42 themedir
= os
.path
.join(os
.path
.dirname(__file__
), 'widgets', 'data', 'minwii_theme')
43 theme
= Theme(themedir
)
44 self
.app
= Desktop(theme
=theme
)
45 self
.synth
= Synth(driver
=audioDriver
)
46 self
.screenResolution
= SCREEN_RESOLUTION
47 envLogger
.info('résolution écran : %s', self
.screenResolution
)
51 self
.screen
= SCREEN_HOME
52 self
.playingScreen
= None
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(5, 5, self
.screenResolution
, IR_POSITION
) # look for 5, 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
['-']) :
87 elif wiiuse
.is_just_pressed(wm
, wiiuse
.button
['1']) and self
.playingScreen
:
88 self
.playingScreen
.tempoTrimUp()
89 elif wiiuse
.is_just_pressed(wm
, wiiuse
.button
['2']) and self
.playingScreen
:
90 self
.playingScreen
.tempoTrimDown()
92 elif self
.screen
in (SCREEN_HOME
, SCREEN_INSTRUMENTS
) :
93 pygame_wiimouse
._full
_mouse
_event
_cb
(wt
, id, wmp
)
96 "séquençage de l'affichage des écrans"
99 displayFlags
= displayFlags | pygame
.FULLSCREEN
100 pygame
.display
.set_mode(self
.screenResolution
, displayFlags
)
101 pygame
.display
.set_caption('MINDs')
104 # valeurs par défaut des options
105 songFile
, playMode
, displayNotes
, wiimoteIndex
= '', 'NORMAL', False, 0
109 WT
.selectWiimote(self
.nwiimotes
- 1) # la télécommande est la souris
110 self
.screen
= SCREEN_HOME
111 exit
, songFile
, playMode
, displayNotes
, wiimoteIndex
= \
112 self
.selectSongAndOptions(songFile
, playMode
, displayNotes
, wiimoteIndex
)
118 self
.screen
= SCREEN_INSTRUMENTS
119 instrumentDescription
= self
.selectInstrument()
120 if not instrumentDescription
:
123 self
.screen
= SCREEN_PLAY
124 WT
.selectWiimote(wiimoteIndex
)
125 self
.runPlayingScreen(songFile
, playMode
, displayNotes
, instrumentDescription
)
129 def selectSongAndOptions(self
, songFile
, playMode
, displayNotes
, wiimoteIndex
) :
130 """ lance l'écran de paramétrage et retourne un tuple comportant :
131 - drapeau de sortie de l'application (booléen)
132 - chemin du fichier de la chanson
134 - affichage des notes (booléen)
135 - wiimote sélectionnée (entier)
137 home
= Home(songPath
=SONG_FILE_PATH
,
140 displayNotes
=displayNotes
,
141 wiimoteIndex
=wiimoteIndex
,
142 nwiimotes
=self
.nwiimotes
)
144 home
.connect(QUIT
, app
.quit
)
150 console
.debug("sortie de l'application")
152 actual_wiimotes
= self
.WT
.get_count()
154 self
.firstSong
= False
156 envLogger
.info('NEW_LOG_FILE')
157 console
.info('chanson : %s', home
.songFile
)
158 console
.info('mode : %s', home
.modeSelect
.value
)
159 if actual_wiimotes
is None :
160 console
.info('HID : souris')
161 elif actual_wiimotes
== 0 :
162 console
.info('HID : souris (pas de wiimote trouvée)')
164 console
.info('HID : wiimote %d', home
.selectedWiimote
.value
+ 1)
167 return (home
.exitApp
,
169 home
.selectedPlayMode
,
171 home
.selectedWiimoteIndex
)
173 def selectInstrument(self
) :
174 """ lance l'écran de sélection de l'instrument et retourne
175 un dictionnaire comportant la description de l'instrument
177 selector
= InstrumentSelector()
181 EventDispatcher
.reset()
182 instru
= selector
.selectedInstrument
184 console
.info('instrument : %s', instru
['name'])
185 console
.info('preset : %d', instru
['preset'])
186 console
.info('bank : %d', instru
['bank'])
187 console
.info('ajustement octave : %d', instru
['octave'])
190 def runPlayingScreen(self
, songFile
, playMode
, displayNotes
, instrumentDescription
) :
191 """ Lance l'écran de jeu principal avec la chanson 'songFile' dans le mode 'playMode'
192 avec l'instrument midi 'instrumentDescription'.
194 playMode
= PLAYING_MODES_DICT
[playMode
]
195 bank
, preset
= instrumentDescription
['bank'], instrumentDescription
['preset']
196 octave
= instrumentDescription
['octave']
197 self
.synth
.adjust_octave(0, octave
)
198 self
.synth
.program_select(0, bank
, preset
)
199 if playMode
== PLAYING_MODES_DICT
['IMPRO'] :
200 playingScreen
= PlayingScreen(self
.synth
, displayNotes
=displayNotes
)
202 song
= musicXml2Song(songFile
)
203 self
.playingScreen
= playingScreen
= SongPlayingScreen(self
.synth
, song
, mode
=playMode
, displayNotes
=displayNotes
)
206 EventDispatcher
.reset()
207 self
.playingScreen
= None
211 """ Classe utilitaire pour singer l'api
212 de pygame_wiimouse en cas d'abscence de wiimote.
214 selectWimoteIndex
= 0
219 def selectWiimote(self
, i
):
221 def get_count(self
) :