SetXMLAttribute

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

SetXMLAttribute

Message par blendman »

salut

j'utilise LMMS (linux multimédia studio, permet de créer de la musique, en dessinant sur un piano roll) et on peut sauvegarder en .mmp, qui est un fichier xml.
J'essaie de créer un petit outil open-source qui permettrait de modifier les notes créées dans lmms, pour leur donner un peu de "vie" (donc que ça soit moins parfait), avec des léger random() sur certains attributs.

j'arrive à loader le fichier (grâce à l'exemple de pb), et donc je récupère bien les notes et leurs attributs (je les mets dans un tableaux), puis, je peux modifier certains attributs (longueur, position, volume, note, pan).

Mais ensuite, comment puis-je faire pour sauvegarder le résultat dans un fichier xml qui soit donc le même que le fichier original loadé, mais avec mes changements ?

Si vous avez une idée, ça m'intéresse grandement :)

merci beaucoup :)
Bmld76
Messages : 116
Inscription : dim. 09/janv./2022 12:47

Re: SetXMLAttribute

Message par Bmld76 »

Bonjour,

Je travaille sur un programme dont les fichiers d'échange sont en XML. Selon la doc, il y a des commandes pour insérer des noeud . Actuellement je réécris entièrement le fichier en XML avec les modifications.

J'utilise effectivement

item = CreateXMLNode(itemMatch, "xxxx")
SetXMLAttribute(item, "REF", "XXX")

J'ai du partir d'un exemple. je me appelle avoir utiliser FormatXML(xml, #PB_XML_ReFormat). pour obtenir un fichier organisé.

Je n'ai pas fini cette parti, Je vais continuer à creuser.

Cordialement
_____________________________________________________________
IMAC 21.5 2012 Core I5 - 2.70 Ghz. 16 GB NVIDIA GeForce GT 640M 512 Mo. MacOs OCPL Sonoma 14.3
MacBook Air M1 - 8Go - Sonoma 14.5

PureBasic 6.11 MacOS
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: SetXMLAttribute

Message par blendman »

salut

merci beaucoup pour ta réponse.
Alors, en fait, je cherche effectivement soit à insérer des noeuds, soit à modifier des noeuds existants.

Donc, si tu avances sur les modifications de fichiers xml, cela m'intéresse ;).

Merci, A+
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: SetXMLAttribute

Message par blendman »

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+
Répondre