Subject: outil de génération

From: "P.E. Brame" <[email-masked]>
Date: Tue, 14 Nov 2006 19:03:38 +0100

Bonjour,

Le 5 novembre dernier j'avais envoyé ce message, dont les pièces jointes 
avaient été refusées. J'ai appris que le serveur était malade... Est-il 
guéri maintenant ?

Note : le wiki refuse toujours les "uploads" (cf lien de John)
Je les ai envoyé à Gauvain, ([email-masked]) pour le diffuser 
sur son blog sur lilypond, adresse dans le thread de la liste

Merci de votre accueil

P.E. Brame

*********************************************************************************

Bonjour,

Je reprends clavier et écran.

Ci-joint les scripts refusés ? par l'outil de gestion des messages de la 
liste.
Le fichier score_lily.py contient le point d'entrée (main)

Bonne journée

P.E. Brame

[email-masked] a écrit :
> Envoyez vos messages pour la liste lilypond-user-fr à
> 	[email-masked]
>
> Pour vous (dés)abonner par le web, consultez
> 	http://lists.gnu.org/mailman/listinfo/lilypond-user-fr
>
> ou, par email, envoyez un message avec 'help' dans le corps ou dans le
> sujet à
> 	[email-masked]
>
> Vous pouvez contacter l'administrateur de la liste à l'adresse
> 	[email-masked]
>
> Si vous répondez, n'oubliez pas de changer l'objet du message afin
> qu'il soit plus spécifique que "Re: Contenu du digest de
> lilypond-user-fr..."
>
>
> Thèmes du jour :
>
>    1. Re: outil de génération (John Mandereau)
>    2. Re: outil de génération (André Hetzel)
>    3. Re: outil de génération (Pierre Couderc)
>    4. Re: outil de génération (P.E. Brame)
>
>
> ----------------------------------------------------------------------
>
> Message: 1
> Date: Sat, 04 Nov 2006 22:14:21 +0100
> From: John Mandereau <[email-masked]>
> Subject: Re: outil de génération
> To: [email-masked]
> Cc: [email-masked]
> Message-ID: <[email-masked]>
> Content-Type: text/plain; charset=utf-8
>
> Le samedi 04 novembre 2006 Ã  11:30 +0100, P.E. Brame a Ã©crit :
>   
>> Bonjour Ã  tous,
>>
>> Je suis en phase de finalisation d'un gÃ©nÃ©rateur de fichier .ly,, Ã©crit 
>> en python 2.4.3 / wxwidgets 2.7, principalement Ã  l'attention des 
>> dÃ©fricheurs de Lilypond rÃ©fractaires Ã  une lecture assidue de la 
>> documentation en anglais.
>>     
>
> Ce projet est une bonne idÃ©e, qui ressemble au plugin LilyPondTool pour
> JEdit, mais sans doute avec l'avantage d'Ã©viter la lourdeur de Java et
> par consÃ©quent de JEdit. Si ce projet mÃ»rit suffisament, il pourra
> peut-Ãªtre Ãªtre distribuÃ© avec LilyPond :-)
>
> ÃEUR propos, sur la liste lilyond-user est apparu rÃ©cemment un fil sur
> l'utilitÃ© d'une interface graphique pour Ã©diter des fichiers ly. Je
> partage l'idÃ©e de certains selon laquelle une solution efficace serait
> un Ã©diteur de texte avancÃ© (coloration syntaxique, compilation et
> visualisation depuis l'Ã©diteur, ...), avec des plugins Ã  interface
> graphique qui aident Ã  rÃ©aliser certaines tÃ¢ches.
>
> En effet, le format ly est un format texte, donc un Ã©diteur de texte est
> naturellement efficace pour le traiter. Les inconvÃ©nients d'une
> interface graphique excluant le code source sont la perte de vue des
> concepts de sÃ©paration du contenu musical et de ses options de
> formatage. On pourrait Ã©galement imaginer une solution hybride, comme
> certains Ã©diteurs HTML graphiques qui proposent un onglet pour l'Ã©dition
> visuelle, un onglet pour l'Ã©dition du texte source, et un onglet pour la
> prÃ©visualisation.
>
> VoilÃ  une trÃ¨s rapide prÃ©sentation de la question. Qu'en pensez-vous ?
>
>
>   
>> Je joint Ã  ce mail un fichier compressÃ© contenant les scripts et une 
>> documentation
>>     
>
> En tant qu'administrateur, je rappelle que les messages de plus de 64 Ko
> ne sont pas autorisÃ©s sur la liste.
>
> Pour nous faire profiter de ton travail, donne-nous un lien vers un site
> oÃ¹ on peut le tÃ©lÃ©charger. Si tu n'as pas d'espace Web pour Ã§a, il est
> tout Ã  fait possible de l'hÃ©berger sur
> http://lilypondwiki.tuxfamily.org . N'hÃ©site pas Ã  me contacter pour
> plus de prÃ©cisions.
>
> Cordialement
>   
#!/usr/bin/python
# -*- coding: utf8 -*-
import wx
##########################################################
##
##  		traitement des score
##
##########################################################
class fen_score(wx.Frame):
	def __init__ ( self, titre):
		self. d_score = {}		# contient les infos du bloc score
		self.l_port = []			# liste des dicos du bloc Staff
		self.l_score = []			# liste des dicos score à retourner
		x = 0	# placement des cellules sur la grille
		y = 0
		wx.Frame.__init__(self, None, wx.ID_ANY, title = titre, pos = (300,300) )		# création 
		grille = wx.GridBagSizer()		# création de la grille type tableur : accès direct aux cellules
		self.t_nom = wx.TextCtrl(self, wx.ID_ANY, 'score' )		# champ de saisie
		e_nom = wx.StaticText(self, wx.ID_ANY, "nom " )	# etiquette associée
		self.t_type = wx.TextCtrl(self, wx.ID_ANY, "ChoirStaff")
		e_type = wx.StaticText(self, wx.ID_ANY, "type : " )
		self.t_tempo = wx.TextCtrl(self, wx.ID_ANY, '4/4' )
		e_tempo = wx.StaticText(self, wx.ID_ANY, "tempo" )	# etiquette associée
		self.t_armature = wx.TextCtrl(self, wx.ID_ANY, "do")
		e_armature = wx.StaticText(self, wx.ID_ANY, "tonalité (majeur) : " )
		self.t_vitesse = wx.TextCtrl(self, wx.ID_ANY, '4 = 80' )
		e_vitesse = wx.StaticText(self, wx.ID_ANY, "vitesse" )	# etiquette associée

		b_score_ok = wx.Button(self, wx.ID_ANY , "OK")
		b_portee = wx.Button(self, wx.ID_ANY , "Ajout Portée")
		b_fermer = wx.Button(self, wx.ID_ANY , "Fermer")
		self.Bind( wx.EVT_BUTTON, self.b_score_ok_clic, b_score_ok)
		self.Bind( wx.EVT_BUTTON, self.b_portee_clic, b_portee)
		self.Bind( wx.EVT_BUTTON, self.b_fermer_clic, b_fermer)
	
		grille.Add(e_nom, (x,y), (1,1), wx.EXPAND )
		grille.Add (self.t_nom, (x,y+1) , (1,1) , wx.EXPAND )	# ajout des champs  : objet, où (L, C), extension (nb L, nb C), formatage
		x += 1
		grille.Add(e_type, (x,y), (1,1), wx.EXPAND )
		grille.Add(self.t_type, (x,y+1), (1,1), wx.EXPAND )
		x += 1
		grille.Add(e_tempo, (x,y), (1,1), wx.EXPAND )
		grille.Add(self.t_tempo, (x,y+1), (1,1), wx.EXPAND )
		x += 1
		grille.Add(e_vitesse, (x,y), (1,1), wx.EXPAND )
		grille.Add(self.t_vitesse, (x,y+1), (1,1), wx.EXPAND )
		x += 1
		grille.Add(e_armature, (x,y), (1,1), wx.EXPAND )
		grille.Add(self.t_armature, (x,y+1), (1,1), wx.EXPAND )
		x += 2
		grille.Add(b_portee, (x, 0), (1, 1))
		grille.Add(b_fermer, (x, 1), (1, 1))
		grille.Add(b_score_ok, (x, 2), (1, 1))
		grille.AddGrowableCol(1)	
		self.SetSizerAndFit(grille)		# mise en place finale
		self.Show(True)					# et affichage
		
	def b_score_ok_clic(self, ev_b_score_ok):		# fin de l'ajout d'un nouveau bloc score
		self.d_score ['nom'] = self.t_nom.GetValue()
		self.d_score ['type'] = self.t_type.GetValue()
		self.d_score ['armature'] = self.t_armature.GetValue()
		self.d_score ['tempo'] = self.t_tempo.GetValue()
		self.d_score ['vitesse'] = self.t_vitesse.GetValue()
		self.d_score ['liste_dp'] = self.l_port		# #################################" 
		self.Destroy()
##		return self.l_score
#		return True
		
	def b_portee_clic(self, ev_b_portee):
		self.fenetre_portee = fen_portee("Portée")
		self.l_port.append ( self.fenetre_portee.lit_portee() )
		return True
		
	def b_fermer_clic(self, ev_b_fermer):
		self.Destroy()
		
	def lit_part(self ):		# réellement ici ou dans le b_score_ok ?
		return self.d_score
		
##########################################################
##
##  		traitement des portées (Staff)
##
##########################################################
		
class fen_portee(wx.Frame):
	def __init__ ( self, titre):
		self. d_port = {}
		self.l_port = []		# liste des portées à retourner
		self.l_voix = []		# liste des voix associées à la portée
		x = 0	# placement des cellules sur la grille
		y = 0
		wx.Frame.__init__(self, None, wx.ID_ANY, title = titre, pos = ( 250, 250 ) )		# création 
		grille = wx.GridBagSizer()		# création de la grille type tableur : accès direct aux cellules
		self.t_portee = wx.TextCtrl(self, wx.ID_ANY, 'Portée', size=(150, 30) )		# champ de saisie
		e_portee = wx.StaticText(self, wx.ID_ANY, "nom " )	# etiquette associée
		self.t_clef = wx.TextCtrl(self, wx.ID_ANY, "violin")
		e_clef = wx.StaticText(self, wx.ID_ANY, "Clef" )
		self.t_instrum = wx.TextCtrl(self, wx.ID_ANY, "violon" )
		e_instrum = wx.StaticText(self, wx.ID_ANY, "Instrument : " )
		self.t_instr = wx.TextCtrl(self, wx.ID_ANY, "S")
		e_instr = wx.StaticText(self, wx.ID_ANY, "Instr : " )
		self.t_instr_midi = wx.TextCtrl(self, wx.ID_ANY, "midi")
		e_instr_midi = wx.StaticText(self, wx.ID_ANY, "Instr midi : " )
		b_portee_ok = wx.Button(self, wx.ID_ANY , "OK")
		b_voix = wx.Button(self, wx.ID_ANY , "Ajout voix")
		b_fermer = wx.Button(self, wx.ID_ANY , "Fermer")
		self.Bind( wx.EVT_BUTTON, self.b_portee_ok_clic, b_portee_ok)
		self.Bind( wx.EVT_BUTTON, self.b_voix_clic, b_voix)
		self.Bind( wx.EVT_BUTTON, self.b_fermer_clic, b_fermer)
	
		grille.Add(e_portee, (x,y), (1,1), wx.EXPAND )
		grille.Add (self.t_portee, (x,y+1) , (1,1) , wx.EXPAND )	# ajout des champs  : objet, où (L, C), extension (nb L, nb C), formatage
		x += 1
		grille.Add(e_clef, (x,y), (1,1), wx.EXPAND )
		grille.Add(self.t_clef, (x,y+1), (1,1), wx.EXPAND )
		x += 1
		grille.Add(e_instrum, (x,y), (1,1), wx.EXPAND )
		grille.Add ( self.t_instrum, (x, y+1), (1, 1), wx.EXPAND )
		x += 1
		grille.Add(e_instr, (x,y), (1,1), wx.EXPAND )
		grille.Add(self.t_instr, (x,y+1), (1,1), wx.EXPAND )
		x += 1
		grille.Add(e_instr_midi, (x,y), (1,1), wx.EXPAND )
		grille.Add(self.t_instr_midi, (x,y+1), (1,1), wx.EXPAND )
		x += 2
		grille.Add(b_voix, (x, 0), (1, 1))
		grille.Add(b_fermer, (x, 1), (1, 1))
		grille.Add(b_portee_ok, (x, 2), (1, 1))

		grille.AddGrowableCol(0)	
		self.SetSizerAndFit(grille)		# mise en place finale
		self.Show(True)					# et affichage
		
	def b_portee_ok_clic(self, ev_b_portee_ok):		# fin de l'ajout d'un nouveau bloc staff
		self.d_port['portee'] = self.t_portee.GetValue()
		self.d_port['clef'] = self.t_clef.GetValue()
		self.d_port['instrument'] = self.t_instrum.GetValue()
		self.d_port['instr'] = self.t_instr.GetValue()
		self.d_port['instr_midi'] = self.t_instr_midi.GetValue()
		self.d_port['liste_dv'] = self.l_voix	# # ############################################
		self.Destroy()
		
	def b_voix_clic(self, ev_b_portee):
		self.fenetre_voix = fen_voix("Voix")
		self.l_voix.append( self.fenetre_voix.lit_voix()	)		# ajout d'une liste de dictionnaire(s)de  voix dans la liste
		
	def b_fermer_clic(self, ev_b_fermer):
		self.Destroy()
		
	def lit_portee(self):
		return self.d_port
##########################################################
##
##  		traitement des Voix
##
##########################################################
		
class fen_voix(wx.Frame):
	def __init__ ( self, titre):
		self. d_voix = {}
		self.l_voix = []
		x = 0	# placement des cellules sur la grille
		y = 0
		wx.Frame.__init__(self, None, wx.ID_ANY, title = titre, pos = ( 300, 300 ) )		# création 
		grille = wx.GridBagSizer()		# création de la grille type tableur : accès direct aux cellules
		self.t_voix = wx.TextCtrl(self, wx.ID_ANY, 'Voix' )		# champ de saisie
		e_voix = wx.StaticText(self, wx.ID_ANY, "nom :" )	# etiquette associée
		self.t_paroles = wx.TextCtrl(self, wx.ID_ANY, "")
		e_paroles = wx.StaticText(self, wx.ID_ANY, "Paroles associées" )
		self.t_notes = wx.TextCtrl(self, wx.ID_ANY, "N" )
		e_notes = wx.StaticText(self, wx.ID_ANY, "Nom mélodie : " )
		self.t_transpose = wx.TextCtrl(self, wx.ID_ANY, "")
		e_transpose = wx.StaticText(self, wx.ID_ANY, "transposer vers : " )
		b_voix_ok = wx.Button(self, wx.ID_ANY , "OK")
		b_fermer = wx.Button(self, wx.ID_ANY , "Fermer")

		self.Bind( wx.EVT_BUTTON, self.b_voix_ok_clic, b_voix_ok)
		self.Bind( wx.EVT_BUTTON, self.b_fermer_clic, b_fermer)
		grille.Add(e_voix, (x,y), (1,1), wx.EXPAND )
		grille.Add (self.t_voix, (x,y+1) , (1,1) , wx.EXPAND )	# ajout des champs  : objet, où (L, C), extension (nb L, nb C), formatage
		x += 1
		grille.Add(e_paroles, (x,y), (1,1), wx.EXPAND )
		grille.Add(self.t_paroles, (x,y+1), (1,1), wx.EXPAND )
		x += 1
		grille.Add(e_voix, (x,y), (1,1), wx.EXPAND )
		grille.Add(self.t_voix, (x,y+1), (1,1), wx.EXPAND )
		x += 1
		grille.Add(e_notes, (x,y), (1,1), wx.EXPAND )
		grille.Add ( self.t_notes, (x, y+1), (1, 1), wx.EXPAND )
		x += 1
		grille.Add(e_transpose, (x,y), (1,1), wx.EXPAND )
		grille.Add(self.t_transpose, (x,y+1), (1,1), wx.EXPAND )
		x += 2
		grille.Add(b_voix_ok, (x, 0), (1, 1))
		grille.Add(b_fermer, (x, 2), (1, 1))

		grille.AddGrowableCol(0)	
		self.SetSizerAndFit(grille)		# mise en place finale
		self.Show(True)					# et affichage
		
	def b_voix_ok_clic(self, ev_b_portee_ok):		# fin de l'ajout d'un nouveau bloc voix
		self.d_voix['voix'] = self.t_voix.GetValue()
		self.d_voix['paroles'] = self.t_paroles.GetValue()
		self.d_voix['notes'] = self.t_notes.GetValue()
		self.d_voix['transpose'] = self.t_transpose.GetValue()
		self.Destroy()
		
	def b_fermer_clic(self, ev_b_fermer):
		self.Destroy()
		
	def lit_voix(self):
		return self.d_voix

#!/usr/bin/python
# -*- coding: utf8 -*-
# projet pour génération automatique de scores

import wx
import os
import score

class fen(wx.Frame):
	def __init__(self, titre):
		self. d_part = {}
		self.l_score = []		# liste de d_score crées dans la fenetre score
		self.rep = "" 			# répertoire de travail
		wx.Frame.__init__(self, None, wx.ID_ANY, title = titre , pos = (200,200) )		# création de la fenetre de premier niveau
		self.grille = wx.GridBagSizer()		# création de la grille type tableur : accès direct aux cellules
		self.t_fic = wx.TextCtrl(self, wx.ID_ANY, 'lily.ly' )		# champ de saisie, size=(150, 30)
		e_fic = wx.StaticText(self, wx.ID_ANY, "fichier à générer" )	# etiquette associée
		self.t_version = wx.TextCtrl(self, wx.ID_ANY, "2.8.6")
		e_version = wx.StaticText(self, wx.ID_ANY, "version : " )
		self.t_part = wx.TextCtrl(self, wx.ID_ANY, 'Titre')		# champ de saisie, size=(150, 30) 
		e_part = wx.StaticText(self, wx.ID_ANY, "Titre partition" )	# etiquette associée
		self.t_inclusion = wx.TextCtrl(self, wx.ID_ANY, "italiano.ly\n", style = wx.TE_MULTILINE)
		e_inclusion = wx.StaticText(self, wx.ID_ANY, "Inclusions : " )

		b_ok = wx.Button(self, wx.ID_ANY , "OK")
		b_score = wx.Button(self, wx.ID_ANY , "Ajout Score")
		b_fermer = wx.Button(self, wx.ID_ANY , "Fermer")
		b_rep = wx.Button(self, wx.ID_ANY , "Naviguer")
		self.Bind( wx.EVT_BUTTON, self.b_ok_clic, b_ok)
		self.Bind( wx.EVT_BUTTON, self.b_score_clic, b_score)
		self.Bind( wx.EVT_BUTTON, self.b_fermer_clic, b_fermer)
		self.Bind( wx.EVT_BUTTON, self.b_rep_clic, b_rep )
		x = 0
		self.grille.Add (self.t_fic, (x,1) , (1,1) , wx.EXPAND )	# ajout des champs  : objet, où (L, C), extension (nb L, nb C), formatage
		self.grille.Add(e_fic, (x,0), (1,1), wx.EXPAND )
		self.grille.Add(b_rep, (x,2) , ( 1,1 ) , wx.EXPAND )		# dialogue de changement de répertoire
		x +=1
		self.grille.Add(e_version, (x,0), (1,1), wx.EXPAND )
		self.grille.Add(self.t_version, (x,1), (1,1), wx.EXPAND )
		x+=1
		self.grille.Add(e_part, (x,0), (1,1), wx.EXPAND )
		self.grille.Add(self.t_part, (x,1), (1,1), wx.EXPAND )
		x +=1
		self.grille.Add ( e_inclusion, (x,0) , (1,1) , wx.EXPAND )
		self.grille.Add(self.t_inclusion, (x,1), (1,1), wx.EXPAND )
		x +=2
		self.grille.Add(b_score, (x, 0), (1, 1))
		self.grille.Add(b_fermer, (x, 1), (1, 1))
		self.grille.Add(b_ok, (x, 2), (1, 1))
#		self.grille.AddGrowableCol(0)		# redimension des champs possible
		self.grille.AddGrowableCol(1)		
#		self.grille.AddGrowableCol(2)
#		self.SetSizeHints(-1,self.GetSize().y,-1,2*(self.GetSize().y) );	# blocage en Y à sa taille actuelle, en X -1 => illimité
#																									# min X, min Y, max X, max Y
		self.SetSizerAndFit(self.grille)		# mise en place finale
		self.Show(True)					# et affichage
		
	def b_rep_clic (self, ev_b_rep):
		fen_rep = wx.DirDialog(self, "Répertoire", style=wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON)
		if fen_rep.ShowModal() == wx.ID_OK:
			self.SetStatusText( fen_rep.GetPath() )
			self.rep = fen_rep.GetPath()
			self.t_fic.SetValue( self.rep +"/lily.ly")
			self.SetSizerAndFit(self.grille)		# redimensionne la fenetre
		fen_rep.Destroy()
		
	def fichier (self, ev_fic):
		fen_fic = wx.FileDialog(self, "Fichier :", os.getcwd(), "", "*.*", wx.OPEN)
		if fen_fic.ShowModal() == wx.ID_OK:
			chemin = fen_fic.GetPath()
			chemin_base = os.path.basename( chemin )
			self.SetStatusText("chemin courant : %s" % chemin_base )
		fen_fic.Destroy()
		
	def b_ok_clic(self, ev_b_ok):		# fin de l'acquisition des données
		self.d_part ['fic']= self.t_fic.GetValue()
		self.d_part ['part'] = self.t_part.GetValue()
		self.d_part ['version'] = self.t_version.GetValue()
		self.d_part ['liste_ds'] = self.l_score
##########################################################
##
##  		Création du fichier
##
##########################################################

		fic_sort = open ( self.d_part ['fic'], 'w')
#		fic_sort.write ('%  Essai de génération automatique \n')
		fic_sort.write('\\version "'+ self.d_part['version'] +'"\n' )
		fic_sort.write('\\header { title = "' +   self.d_part ['part'] + '" }\n\n')
		fic_sort.write ( '% Inclusions \n' )
		for n_inclus in range ( self.t_inclusion.GetNumberOfLines() ) :
			if ( self.t_inclusion.GetLineLength (n_inclus ) > 0 ) :
				fic_sort.write ( '\include "%s"\n' % self.t_inclusion.GetLineText( n_inclus) )
		liste =  self.d_part['liste_ds']
		
		for n_score in range ( len ( liste ) ) : # balayage des blocs scores disponibles et écriture dans le fichier
			dico_score = liste[ n_score ]
			nom_score = dico_score['nom']		# dans bloc header
			tempo_score = dico_score['tempo']
			type_score = dico_score['type']
			armature_score = dico_score['armature']
			vitesse_score = dico_score['vitesse']
			liste_dp_score = dico_score['liste_dp']
			fic_sort.write('\score {\n \t\context %s \n' % type_score )
			fic_sort.write('\t<<\n')

			for  n_port in range ( len( liste_dp_score )  ) :#création des blocs Staff
				dico_portee = liste_dp_score[ n_port ]
				clef = dico_portee ['clef']
				instrument = dico_portee ['instrument']
				instr = dico_portee ['instr']
				instr_midi =  dico_portee ['instr_midi']
				nom_port = dico_portee ['portee']
				liste_dv_portee = dico_portee ['liste_dv']
				if ( len ( str ( nom_port ) ) > 0 ) :
					nom_port = " = " + nom_port
				fic_sort.write('\t\t\context Staff %s \n\t\t<<\n'  % ( nom_port ) ) 
				fic_sort.write ('\t\t\t\set Staff.instrument = \markup { \column { %s } }\n' % instrument )
				fic_sort.write('\t\t\t\set Staff.midiInstrument = "%s"\n' % instr_midi )
				fic_sort.write('\t\t\t\clef %s \n' % clef )
				fic_sort.write('\t\t\t\key %s \major\n' % armature_score )
				fic_sort.write('\t\t\t\\time %s\n'% tempo_score )
				
				for n_voix in range ( len ( liste_dv_portee ) ) :		# ajout des voix à la portée
					dico_voix = liste_dv_portee [ n_voix ]
					nom_notes = dico_voix ['notes' ]
					nom_paroles = dico_voix ['paroles' ]
					ton_transpose = dico_voix['transpose']
					nom_voix = dico_voix ['voix' ]
					fic_sort.write ( '\t\t\t\context Voice = %s { \%s }\n' % (nom_voix, nom_notes ) )
					if ( ton_transpose != "" ) :		# au niveau de la defifnition des notes ?
						fic_sort.write ( '\t\t\t\\transpose do %s \n' % (ton_transpose )  )
					if ( nom_paroles != "") :
						fic_sort.write ( '\t\t\t\lyricsto "%s" \context Lyrics \%s \n' % (nom_voix, nom_paroles ) )
			fic_sort.write ( '\t\t>>\n' ) 	# fin d'un bloc Staff
		fic_sort.write ( '\t>>\n' ) 	# fin d'un bloc type
		if ( vitesse_score != "" ) :
			fic_sort.write ('\t\midi { \t\t\\tempo %s \n\t}\n' % vitesse_score )
			fic_sort.write ('\t\layout { }\n' )
			
		fic_sort.write ('\t\header { piece = "%s" }\n'  % nom_score ) 
		fic_sort.write ( "}\n" ) 	# fin d'un bloc score ajouter au dessus les blocs header
#self.d_score['liste_dp']['type']
		fic_sort.close()
#		return self.d_part		# retourne à qui ?
		
	def b_score_clic(self, ev_b_score):		# acquisistion d'un nouveau bloc score
		self.fenetre_score = score.fen_score("Score")
		self.l_score.append ( self.fenetre_score.lit_part() )
		return True
		
	def b_fermer_clic ( self, ev_b_fermer):
		self.Destroy()

class fen_principale(wx.App):
	def OnInit(self):
		self.fenetre = fen('essai.py')
		self.fenetre.Show(True)
		self.SetTopWindow(self.fenetre)
		return True
	
if __name__ == "__main__" :
	d_score = {}
	appli = fen_principale()
	appli.MainLoop()
#fic_sor =