|
From: | P.E. Brame |
Subject: | Re: outil de génération |
Date: | Sun, 05 Nov 2006 14:37:51 +0100 |
User-agent: | Thunderbird 1.5.0.7 (X11/20060922) |
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 address@hidden a écrit : Envoyez vos messages pour la liste lilypond-user-fr à address@hidden 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 à address@hidden Vous pouvez contacter l'administrateur de la liste à l'adresse address@hidden 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 <address@hidden> Subject: Re: outil de génération To: address@hidden Cc: address@hidden Message-ID: <address@hidden> 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 :-) À 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 documentationEn 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
score.pyc
Description: application/python-code
#!/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 =
[Prev in Thread] | Current Thread | [Next in Thread] |