2 questions about Program Changes to songs

so after about a week or so of tweaking, I think I have most of my setups and songs the way I want them - at least the song names and sections. My ultimate goal is to have Bandhelper on my iPad send program changes to GP to queue up the right song. I tested that and it works great. Now I just need to do it with 60 or so songs. So here are my questions -

  1. Is there a bulk way to sequentially apply Program/Bank values to all Songs and sections on the song page?

  2. Is there a way to export this data out to a text file or spreadsheet? I use Bandhelper’s web portal to bulk edit all of my midi program changes and having it all in a single file would be really helpful.

Try this:

awesome, thanks! I thought there was a way to do that (EnjoyRC mentioned it), but I couldn’t find it.

Any chance that something exists for the second item? if not, I’ll probably post it in the feature request. Hell, I’d be happy with an xml file or something that I could write a script to parse.

1 Like

A gig file is actually a xml file
So in theory you could edit it.

BUT (!!!)
Don’t event think about to ask support when something is not working anymore when you manually change such a gig file !!!

Ha - well I don’t have any intention of editing the file itself - just writing a script to parsing thru the xml inside of it to extract the data that I need to something else.

I am curious to know what you would like to extract from a gig file that GP won’t transmit for you via OSC ?

@David-san - well I’m not sure - if I can use the above method to bulk assign PC values to all of the songs, I would like to be able extract a list that I can then use to programmatically set Bandhelper (on my iPad) to change to the proper song when I cue it up there. So ideally it would be song name, part name, and then the Program/bank number. Bandhelper doesn’t support OSC

I don’t know well band helper, but I guess you would then have a touchable list of song/parts which sends the appropriate PC messages to GP ? So you are interested in a kind of « export setlist » option.

With an XSL-Transformation is should be possible to get such a list.

Here is an XSL-Tranformation example:
SONGLIST.xsl (685 Bytes)

For example use this link:
https://www.freeformatter.com/xsl-transformer.html

…and follow the instructions and you will get an HTML-File with
3 informations in it:
Song, Song Part, PC Message sent

@David-san - yea something like that. Basically something that can help me out when inputting all the PC numbers into BandHelper. I like Bandhelper because I can share setlists with the whole band and load everything from any PC with internet access and have it automagically sync with the iPad(s). I keep all my song notes in there as well. And because it’s on an iPad, it’s built for touch and really easy to make setlist changes on the fly. I used it to drive my Kronos based rig for a while and it became indispensable.

Hmmm, that’s cute. I just wrapped your xlst into a Python file and ran it locally, works great.

When I have some time, I’ll see if I can throw up a page on to our website that will suck in a gigfile and produce this output. Unfortunately that freeformatter page is limited to 2M so it couldn’t load my gig file

import lxml.etree as ET

xslTransformation = str.encode('''<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th>Song</th>
        <th>Song Part</th>
        <th>PC</th>
      </tr>
      <xsl:for-each select="/GIGRACK/SETLISTS/SONG">
      <xsl:for-each select="SONG_PART">
      <tr>
        <td><xsl:value-of select="../@songName"/></td>
        <td><xsl:value-of select="@songPartName"/></td>
        <td><xsl:value-of select="@partPC"/></td>
      </tr>
      </xsl:for-each>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>



''')

#replace with path to your gig file
xml_filename = '/Volumes/HD2/Nextcloud/NAMM2019/ReelingWithSetList.gig'

dom = ET.parse(xml_filename)
xslt = ET.XML(xslTransformation)
transform = ET.XSLT(xslt)
newdom = transform(dom)
print(ET.tostring(newdom, pretty_print=True))