Load song by...name?

So I’m reworking my live setlist while we’ve got some quarantine-induced down-time. One thing that drives me crazy is that I really like keeping the numbers of my setlist in order - so if we add a new tune or something, and I “Reassign Program Numbers,” then all my bindings that load songs break because the numbers don’t line up anymore. It’s not a huge deal to go fix them, but I’ve put off cleaning up my setlists before because it’s a time sink.

Seems like the better solution would be to map the bindings to the song save name somehow, and then they would load regardless of what setlist number was assigned to that song, but I can’t find a way to do that?

Also, I do not grok the difference between Load by Program, Load by Index and Load WITH Program and Load WITH Index. I couldn’t find it elucidated in the manual.

Any help would be appreciated.

1 Like

Hi scheater5,

I see your dilemma, a possible fix would be to have the index numbers independently sortable from the program numbers. Then you could have list orders that were different from your program number dependent bindings. As far as the difference between the Program by and Program With binding choices the Program by allows continuous controller absolute values if you use a MIDI input type of that sort

or if it is set to a no edge input it can pick an explicit program number.

The Program with binding assumes it is a momentary no edge input and defaults to that when you select it and provides a sandwich menu with the current set-list program numbers and the song they are associated with for your selection.

Maybe @brad will consider this discussion and see a helpful fix or method to help you out. I would vote for it!

Dave

Hi @scheater5,

First, to explain the difference between the bindings:

  1. Load By Program - loads the song whose program number matching the value passed from the MIDI event (eg: a program change number, or controller value)
  2. Load By Index - loads the song at the index specified by the MIDI event. eg: a program change 2 will load the second song in the set list regardless of its program number.
  3. Load With Program - same as Load By Program but the program number is specified explicitly in the binding rather than coming from the MIDI event
  4. Load With Index - same as Load By Index but the index numbers is specified explicitly in the binding rather than coming from the MIDI event.

In short there are two ways to reference a song in the set list:

  • By Program - the program number set on the song entry
  • By Index - the position of the song in the list (regardless of program number)

and there are two ways of binding:

  • “By” where the program number/index comes from the incoming MIDI event (or other binding source)
  • “With” where the program number is specified in the binding itself.

As for binding by song name, that might require some refactoring of the binding framework so might not be trivial. I’d have to look into that.

In the meantime, I think the solution is to simply not reassign the program numbers in your set list. The whole idea of the program numbers here is that they’re a unique id for a particular song. Assign the song a program number, use it in the binding and then don’t change it. Is there a reason you need to reassign them?

Brad

1 Like

Hmm…I suppose I don’t have to.

I use a very large setlist (mostly consisting of a small number of linked racks, configured in various ways) because my band doesn’t have a “set list” exactly live - the bandleader calls tunes on the fly based on the crowd. So I just have my setlist in alphabetical order and…I guess it just seemed weird to have the songs not also in numerical order. But yeah, I guess I can just not reorder them, and the numbers will just reflect when the song was added.

And thank you very much for the bindings explanation - I hadn’t even considered that someone might want to call songs by position in setlist regardless of number, but it makes a lot of sense for bands that decide the order of tunes before a show (which…is probably most bands, just not what I’m used to).

I have a similar request to @scheater5, but perhaps I’m missing some existing functionality.

Often we get a request for a song that’s not in the current set list. In these cases I usually click ‘Add Song’ and search for the song in the Songs folder. This adds the song to the end of the set list. Then I need to remember not to save the set list when I exit C4.

  1. Is there a way to dynamically load a song without modifying the existing set list?

  2. @brad, related to the above, would it be possible to add functionality to the javascript api to:

  • load a song not in the current setlist?
  • load a different setlist?

Thank you - David

1 Like

Hi @dbrendon,

Yes: File → Open.

Also, don’t forget you can now also add songs to the set list but exclude them from preload - so you could also create a group at the end of your set list with all your other songs, mark them as exclude from pre-load and then they’ll be available like any other song, without the memory over head of loading them until used.

I’ve been reluctant to add these because I don’t want API dependant on local file system paths. What I could do is add is the ability load by filename, but where the files must reside in the songs and/or set lists folder as specified in options. I’ve logged this here.

2 Likes

Interesting idea, but I would have to add many songs to each set list. I will try File->Open.

Having an API method for “Load by filename” might work for me. Would it possible to have a method to return all the songs in the Songs folder (as specified in Options)? And similarly all the sets in the configured SetList folder?

I also noticed that this item is already in the suggestions list:

Ability to switch set lists via the web ui/api

Thank you!

The way i handle this (your needs may differ) is rather than make a list of just the songs to be played at a show, i make a copy of my master set list and just move all the songs for the current show to the top in order (followed by an Add Break note “End of set”). That way all the songs are available if needed, without having to open or add from another set list.

Just an idea you might consider.
– Jimbo

1 Like

Exactly the way I do it, except the songs not in the play list are selected not to load with the play list, and I arrange those extra songs on the bottom in alphabetical order. Makes it very easy when needing a song not on the playlist, which is sometimes in the hundreds. Color coding the songs can also help you get there faster. I use this method frequently.

Hi @brad,

I tried File -> Open and that works quite well for my needs. However, the only visual indication of the newly loaded song name is in the Window Title Bar (which is small and not a place I typically look). There is no indication of the currently loaded song name in the Control Bar or Status Bar or on the Stream Deck. Would it possible to to display the currently loaded song somewhere more visible?

Thank you - David

Did you try right clicking on the status bar? It gives you several options. I have mine as song title - song state.

  • Paul
1 Like

You can use the variable $(SongTitle) to display the currently loaded song name anywhere a variable can be used: in show notes, in the controller bar, status panel, stream deck button etc…

1 Like

I always have my “master setlist” pre-loaded, so I have all my songs on direct access. With systematic use of shared racks, this isn’t too strenuous on CPU or RAM - works nicely for a setlist of > 100 songs for me.

My preferred way of working is to stick with the same setlist for one band/project, and then change songs via MIDI program change from LivePrompter, so LivePrompter is my leading system I manage setlists on, with Cantabile slaved.

But for Cantabile as the lead system, I would also suggest going with @Corky’s approach of keeping all songs in the setlist, just moving the ones for the current gig to the top. Then using the setlist grid view to quickly search through the tail of the set list will let you find songs outside the sequence pretty quickly.

Generally, I use the Show Notes page for that - I always have the current song and current state displayed there (using variables, as @brad suggested) in bright and friendly type, so I know exactly where I am. You can use any type size you want, so you can make it reeeeeealllly visible :wink:

Cheers,

Torsten

2 Likes

+1 for Grid View. I have a keyboard controller button for that. Also on touchscreen video monitor.

Hi Brad

Blockquote
Where can I get hold of this program number? There doesn’t seem to be a variable for it.
The variable $(SongProgram) returns the index, i.e. the position of the song in the list.
I am trying to add a binding in the background rack which will set the state of the Vocals Rack to that corresponding to the song loaded, i.e. 72 in my example below.

Baz

I was trying to refer to this quote.
Baz

Yeah, i get confused by these:

$(SongProgram) returns the ID number assigned to the song (i’ve found the easy way to assign these is to highlight the song in the setlist, then just type the number and Enter).

$(SongNumber) returns the position in the list. (@Brad — need to add this to variables list in the guides).

– Jimbo

No, $(SongProgram) is the program number as entered on the song entry.
$(SongNumber) is the one-based index

Done.

Hi Guys

Thanks for the quick responses.
I interpreted the meaning of $(SongProgram) incorrectly. Also I didn’t know about $(SongNumber) because it wasn’t in the list of variables in the guide.

I was trying to say that $(SongProgram) is NOT unique to a song and @scheater5 highlighted that its value changes with the number of the “slot” the song is in.

It would solve my problem if a new variable, say $(SongID), was defined as an additional property of a song that NEVER changed unless redefined by the user.
In the short term, I’m guessing that only the properties page needs to be changed as the user would be responsible for its use as for other Cantabile variables.

New set lists could be built with a smaller number of songs from an existing library and this new variable could be used instead of $(SongProgram) for use in bindings, etc.

What do the Cantabile Gurus think?
Thanks
Baz

$SongProgram is the value you enter for the Program number for a song within a setlist - it is saved with the setlist, and not with the song file:

If that number is unique to a song or not is entirely up to you - as long as you assign a number to only one song in a setlist, it will remain unique. If you assign the same number to multiple songs, it will not be unique…

And as long as you don’t change the program numbers within that setlist, the value will also not “change with the number of the ‘slot’” (that information is plain wrong, pardon my French) - the number is assigned to the song within the setlist and will not change when you move a song around. You can re-order your setlist as many times as you want without hurting the program numbers; just don’t use “reassign program numbers” (which will change the program numbers) after that.

I would recommend you keep one “master setlist” with all your songs in it - each with its unique program number (which you are responsible for assigning :wink: ). Ideally make this master setlist alphabetical, so it’s easy to find your song. When you create a new setlist for a gig, just move the songs you want to the top of the setlist in the correct order, and save the setlist with a new name.

You can make your own decision if you want to remove all the songs that aren’t in the setlist for the gig or if you want to keep them “just in case” - that’s a matter of your machine being able to load the whole setlist into RAM .

Having a “Song ID” as part of the song file would just create a parallel problem of having to maintain unique song IDs across song files - doesn’t really help.

I’m completely fine with my “master setlist” and identifying songs by their program number - remember, you can have “banked” program numbers, so you’re not limited to 128 songs in your master setlist.

Cheers,

Torsten

2 Likes