Salut
Bon, finalement, j'ai réussi à trouver une bidouille pour créer le fichier xml en modifiant les attributs :
- j'ouvre le fichier xml et je sauvegarde toutes les données (comme sur l'exemple loadxml de la doc, avec le treegadget), dans une variable globale avec une structure qui est exactement comme la hierarchie du fichier xml. Le xml que j'ouvre, c'est un .mmp, un fichier de linux multimedia Studio (lmms))
- comme j'ai toutes les données du xml, je peux facilement les modifier
- ensuite, pour sauvegarde, c'est une bidouille, mais bon : j'ai repris la hierarchie du fichier xml (chaque noeud, et son indentation) et je fais un simple createfile(), en sauvegardant chaque noeud avec writestringN().
Voici ma fonction de sauvegarde (ça donne un fichier .mmp, que LMMS peut donc ouvrir), ce n'est pas terminé, mais il y a les noeuds principaux (mais pas les tracks ni les notes pour le moment) :
Code : Tout sélectionner
; les structures pour obtenir les données du fichier .mmp original
;{ ***************** structures *******************
Structure sOptions
Savefilename$
PathSave$
PathOpen$
Array PathVST$(0)
EndStructure
Global Option.sOptions
Structure sNote ; les notes de chaque pattern
len.i
pos.i
vol.a
key.u
pan.f
EndStructure
Global Dim note.sNote(0)
Global Dim noteChanged.sNote(0)
Global Nbnote=-1, countnote
; to create a random song or in changing the parameters
Structure sAccord
EndStructure
Structure sSongPart
Name$
bpm.c
timesig_denominator.a
timesig_numerator.a
Array accord.sAccord(0)
EndStructure
; For lmms properties
Structure sTrackcontainer
x.w
y.w
width.w
height.w
minimized.a
maximized.a
type$
visible.a
EndStructure
Structure sControllerRackView Extends sTrackcontainer
EndStructure
Structure sProjectnotes Extends sTrackcontainer
; text of the note
text$
EndStructure
Structure sTimeline
lpstate.c
lp1pos.i
lp0pos.i
EndStructure
Structure sPattern
Array Note.sNote(0)
NbNotes.i
pos.i
muted.a
steps.c
type.a
name$
width.c
EndStructure
Structure sTrack
; the part is for this tool (lmms_songcreator), to create a song (with verse and chorus for example)
Array part.sSongPart(0)
; bpm.c
; timesig_denominator.a
; timesig_numerator.a
; The pattern are from lmms (and its properties)
Array Pattern.sPattern(0)
NbPattern.i ; start at -1, needed because array can't be negative in purebasic
name$ ; name of the track
muted.a
solo.a
type.a ; type of track (see lmms .mmp export)
EndStructure
Structure sSong
; properties of the song
name$
bpm.c
mastervol.c
masterpitch.c
timesig_denominator.a
timesig_numerator.a
; The tracks of the song
Array Tracks.sTrack(0)
trackcontainer.strackcontainer
nbtracks.w
; The other window for the song
Timeline.stimeline
ControllerRackView.sControllerRackView
pianoroll.sTrackcontainer
automationeditor.sTrackcontainer
projectnotes.sProjectnotes
EndStructure
Global Song.sSong
Global Nbtracks = -1
;}
; la procedure pour sauvegarder le fichier .mmp
Procedure SaveDoc(saveas=0)
If saveas = 1 Or option\savefilename$ =""
FileName$ = SaveFileRequester(lang("Save LMMS file..."), option\PathSave$, "LMMS files (*.mmp)|*.mmp", 0)
EndIf
If FileName$ <> ""
ext$ = GetExtensionPart(FileName$)
If ext$ <> "mmp" And ext$ <> "xml"
FileName$ + ".mmp"
EndIf
; set the new pathsave$
option\PathSave$ = GetPathPart(FileName$)
option\savefilename$ = FileName$
; then save the file
ind$ = " "
If CreateFile(0,FileName$)
info$ = "<?xml version="+Chr(34)+"1.0"+Chr(34)+"?>"+Chr(10)
info$ +"<!DOCTYPE lmms-project>"+Chr(10)
info$+ "<lmms-project creatorversion="+Chr(34)+"1.2.2"+Chr(34)+
" creator="+Chr(34)+"LMMS"+Chr(34)+" type="+Chr(34)+"song"+Chr(34)+" version="+Chr(34)+"1.0"+Chr(34)+">"+Chr(10)
info$+ind$+"<head timesig_numerator="+Chr(34)+Str(song\timesig_numerator)+Chr(34)+
" bpm="+Chr(34)+Str(song\bpm)+Chr(34)+
" mastervol="+Chr(34)+Str(song\mastervol)+Chr(34)+
" timesig_denominator="+Chr(34)+Str(song\timesig_denominator)+Chr(34)+
" masterpitch="+Chr(34)+Str(song\masterpitch)+Chr(34)+"/>"+Chr(10)
info$+ind$+"<song>"+Chr(10)
; Trackcontainer
With song\trackcontainer
info$+ind$+ind$+"<trackcontainer y="+Chr(34)+Str(\y)+Chr(34)+
" width="+Chr(34)+Str(\width)+Chr(34)+
" minimized="+Chr(34)+Str(\minimized)+Chr(34)+
" x="+Chr(34)+Str(\x)+Chr(34)+
" maximized="+Chr(34)+Str(\maximized)+Chr(34)+
" type="+Chr(34)+"song"+Chr(34)+
" visible="+Chr(34)+Str(\visible)+Chr(34)+
" height="+Chr(34)+Str(\height)+Chr(34)+">"+Chr(10)
EndWith
; The tracks of our song (are in the trackcontainer)
; end of trakcontainer
info$+ind$+ind$+"</trackcontainer>"+Chr(10)
;{ The other windows : ControllerRackView, pianoroll, automationeditor, noteeditor...
; <ControllerRackView y="310" width="350" minimized="0" x="680" maximized="0" visible="0" height="200"/>
With song\ControllerRackView
info$+ind$+ind$+"<ControllerRackView y="+Chr(34)+Str(\y)+Chr(34)+
" width="+Chr(34)+Str(\width)+Chr(34)+
" minimized="+Chr(34)+Str(\minimized)+Chr(34)+
" x="+Chr(34)+Str(\x)+Chr(34)+
" maximized="+Chr(34)+Str(\maximized)+Chr(34)+
" type="+Chr(34)+"song"+Chr(34)+
" visible="+Chr(34)+Str(\visible)+Chr(34)+
" height="+Chr(34)+Str(\height)+Chr(34)+"/>"+Chr(10)
EndWith
; <pianoroll y="5" width="860" minimized="0" x="5" maximized="0" visible="0" height="480"/>
With song\pianoroll
info$+ind$+ind$+"<pianoroll y="+Chr(34)+Str(\y)+Chr(34)+
" width="+Chr(34)+Str(\width)+Chr(34)+
" minimized="+Chr(34)+Str(\minimized)+Chr(34)+
" x="+Chr(34)+Str(\x)+Chr(34)+
" maximized="+Chr(34)+Str(\maximized)+Chr(34)+
" type="+Chr(34)+"song"+Chr(34)+
" visible="+Chr(34)+Str(\visible)+Chr(34)+
" height="+Chr(34)+Str(\height)+Chr(34)+"/>"+Chr(10)
EndWith
; <automationeditor y="1" width="860" minimized="0" x="1" maximized="0" visible="0" height="400"/>
With song\automationeditor
info$+ind$+ind$+"<automationeditor y="+Chr(34)+Str(\y)+Chr(34)+
" width="+Chr(34)+Str(\width)+Chr(34)+
" minimized="+Chr(34)+Str(\minimized)+Chr(34)+
" x="+Chr(34)+Str(\x)+Chr(34)+
" maximized="+Chr(34)+Str(\maximized)+Chr(34)+
" type="+Chr(34)+"song"+Chr(34)+
" visible="+Chr(34)+Str(\visible)+Chr(34)+
" height="+Chr(34)+Str(\height)+Chr(34)+"/>"+Chr(10)
EndWith
; <projectnotes y="1" width="860" minimized="0" x="1" maximized="0" visible="0" height="400"/></projectnotes>
With song\projectnotes
info$+ind$+ind$+"<projectnotes y="+Chr(34)+Str(\y)+Chr(34)+
" width="+Chr(34)+Str(\width)+Chr(34)+
" minimized="+Chr(34)+Str(\minimized)+Chr(34)+
" x="+Chr(34)+Str(\x)+Chr(34)+
" maximized="+Chr(34)+Str(\maximized)+Chr(34)+
" type="+Chr(34)+"song"+Chr(34)+
" visible="+Chr(34)+Str(\visible)+Chr(34)+
" height="+Chr(34)+Str(\height)+Chr(34)+">"+
"<![CDATA["+\text$+"]]>"+
"</projectnotes>"+Chr(10)
EndWith
; timeline
With song\Timeline
info$+ind$+ind$+"<timeline lpstate="+Chr(34)+Str(\lpstate)+Chr(34)+
" lp1pos="+Chr(34)+Str(\lp1pos)+Chr(34)+
" lp0pos="+Chr(34)+Str(\lp0pos)+Chr(34)+"/>"+Chr(10)
EndWith
;}
; end of controller
info$+ind$+ind$+"<controllers/>"+Chr(10)
info$+ind$+"</song>"+Chr(10)
info$+"</lmms-project>"+Chr(10)
WriteStringN(0,info$)
CloseFile(0)
EndIf
EndIf
EndProcedure
Ca m'a semblé plus simple comme ça, mais il y a peut être une solution pour sauvegarder directement en xml avec les données que j'ai, mais je ne sais pas comment faire, donc, pour le moment, je reste avec cette solution-ci

.
Je pense que ce serait pas mal qu'on ait avec la doc (ou sur le forum) un exemple qui ferait ceci:
- loadxml, et mettre les données dans une variable avec une structure spécifique (ça c'est ok avec mon exemple et l'exemple de la doc)
- modifier certaines données (ça c'est ok)
- sauvegarder le résultat avec savexml (ça, c'est pas ok ^^)
A+