Now I have built a new version that can connect to other applications via MIDI - and of course I had Cantabile in mind when I built this! Now, you can:
remote control Cantabile via LivePrompter: automatically load a song from a setlist when loading the corresponding lyrics/chords in LivePrompter
remote control LivePrompter via Cantabile: automatically load and display lyrics and chords in LivePrompter when you load a song in Cantabile
remote control LivePrompter’s keys from your MIDI masterkeyboard or Cantabile by sending MIDI notes or controllers.
Using loopback MIDI tools like LoopBe, you can now synchronize Cantabile and LivePrompter on one machine - or you can go further with rtpMIDI and connect two machines via a wireless connection.
Currently, I have LivePrompter running on a small tablet sitting on my master keyboard and Cantabile on a powerful laptop somewhere behind me on stage, controlled via MIDI from my master keyboard. I have networked both machines via wifi and built an rtpMIDI connection between them. Now I simply select a song on my tablet, display the lyrics and chords, and - presto! - Cantabile is ready to play the song!
You will find an updated manual with a new chapter for MIDI, as well as a dedicated document “LivePrompter and Cantabile” that illustrates in detail how to connect both programs.
In future I hope to add a network server to Cantabile - that’d make this even easier to setup as you wouldn’t need bindings in Cantabile - LivePrompter would be able to control Cantabile directly.
TBH, I think for what I’m doing here, I wouldn’t need any network capabilities in Cantabile. All I’m doing is sending program changes back and forth - that’s what MIDI is good at (and what is at the core of Cantabile)! And the one binding (Program change (banked) --> load song (instant)) is easy enough to implement in the global (background) rack. So setting things up for remote-controlling Cantabile from LivePrompter is pretty easy Cantabile-side. And essentially, this is what MIDI is made for - sending short commands. With tools like LoopBe or rtpMIDI, it is also pretty easy to send MIDI back and forth between devices.
It gets more difficult when controlling LivePrompter from Cantabile - since there isn’t a fitting trigger in Cantabile that can reference the current song number or program change. This means that you have to implement the program change in every song.
If you had a trigger on “Song Start” that could send a program change that corresponds with the (setlist) program change with the current song, this could also be easy to realize in the global rack, but that’s a pretty convoluted trigger for a niche application…
I guess a network server could come handy for two areas
Android / iOS: if I were to build LivePrompter for Android (toyed with it for a while), a network server could come in handy. Haven’t seen a solid solution for MIDI over wifi for Android yet
Applications that need richer communication than simple program changes. Something that comes to mind would be a “Cantabile Remote” that runs on smartphones and presents something like the Live View. For this, we would need a solid network server in Cantabile that provides the right docking point for such a rich interface.
I’ve built it essentially for my own use in my projects, since there wasn’t anything on the market that met my needs. I’m happy if it is also useful to other musicians out there; it would be cool to come to a concert and see someone use LivePrompter on stage
So if anyone is using it live: send me a picture of yourself performing with LivePrompter - or post it here! Consider that sufficient license payment for the moment
Torsten, I know this post is a little old, but this sounds really interesting! I read through your manual… will this work with C2 Solo? Just by looking at the screenshots it seems as if it’s only for C3…? Thanks!
Hmm - TBH, I can’t say in detail- haven’t tried it with C2. It really depends what you want to do with it:
If you want to slave LivePrompter to Cantabile, then all you need to to is send a defined Program Change when loading a specific song/session - Use a Session Load trigger to send the right program change from Cantabile to your virtual midi port that controls LivePrompter. Now LivePrompter will load the corresponding song lyrics with every Cantabile session (provided you get the mapping in the MidiReceive.txt file right).
If you want to also remote-control LivePrompter’s buttons (play, pause, next) from your MIDI controller (typically the “universal key”), you’ll need to create a connection in the Routing Table from your MIDI controller to the virtual MIDI port - and filter out any events that might confuse LivePrompter. Then set your preferences in LivePrompter.ini accordingly (so that LivePrompter reacts to the correct control messages or notes)
The other direction (slaving Cantabile to LivePrompter) should work using Session Lists: you can create a Session List with all your session files (I believe Cantabile Solo doesn’t allow Sub-Sessions), assign program changes to each session file and enter these program changes in LivePrompter’s MidiSend.txt file. You’ll need to create a MIDI controller assignment to make Cantabile react to these program changes - not sure how that’s done exactly, TBH. Once you’ve loaded this Session List, Cantabile should load the correct song when LivePrompter changes songs (provided you’ve assigned your MIDI ports correctly in both programs.
But the real fun starts with pre-loaded setlists - almost instant Cantabile song switching whenever you change songs in LivePrompter! And for that you’ll need Cantabile 3 - it’s worth the upgrade, trust me!
Hello Torsten. Thank you for the work you’ve put into this. I’ve been experimenting with it, and it seems to work well so far.
A question for you on the MidiSend.txt file. Can I define 2 MIDI messages to send? One would go to Cantabile, and one to Ableton Live.
For example, in Cantabile I might only have 3 or 4 “songs” set up which are instrument based. So 1 might be piano, 2 might be organ.
My MidiSend.txt may look like this
0.1,Song 1 with piano
0.1,Song 2 with piano
0.2,Song 3 with organ
0.1,Song 4 with piano
This works fine.
However, if I have backing tracks in Ableton, then I’d like to send a 2nd different MIDI message that Live could pick up. Configured like this perhaps?
0.1:1.1,Song 1 with piano
0.1:1.2,Song 2 with piano
0.2:1.3,Song 3 with organ
0.1:1.4,Song 4 with piano
I am assuming Live could pick up the 2nd message - I have not played with it much yet.
unfortunately, LivePrompter currently only works with one program change per song; not sure if I want to complicate things by adding a second message; I try to keep the MIDI connection sweet and simple…
How about simply adding the same Cantabile song multiple times into your Cantabile set list?
Piano
Piano
Organ
Piano
Then you can send the same program change both to Cantabile and Ableton Live; you just need to be sure your lists stay in sync.
Or add a binding triggered on song load that sends a secondary program change out from Cantabile to Ableton (you’d need some kind of virtual MIDI port like loopMIDI I guess).
If you wanted to keep a single “program change table” instead of putting bindings in each song, you could put an instance of pizMIDI’s midiProgramChange or midiMultiProgramChange into your background rack, translating all your incoming program changes into secondary changes for Ableton.
Thanks for the replies. Yes I’m using Bome and can split the song changes in there.
My next problem is that although I can map an Ableton scene to a midi event, it “launches” that scene immediately. That means that as soon as I open a song in LivePrompter, it sends the midi event to Ableton and the backing track starts playing. I need some way of starting the track with a “play” button.
Could I create a button in Cantabile to send a midi message which includes the Song Program Number? I can then capture that in Ableton and map it to the scene.
I was trying to avoid setting up all the songs in Cantabile, but if this works then I’m ok with it.
Yes, add a custom button to the Controller Bar with “MIDI Program Change” as the action. This sends the program change via the on-screen keyboard MIDI port. If you just wanted to send a fixed, specific program change, you could just add a route on a suitable channel from that out to the MIDI port for Ableton, and maybe put that route in your background rack so it’s always there. But if you want to send a program change based on your song number, the thing to do would probably be to add a binding to your song instead, that picks up the program change from your button, and sends out the song-specific program change in response. A bit fiddly, but it should work.
If you’re only using Ableton for backing tracks, you might be better off playing them from within Cantabile. It’ll do the job with less hassle, and it might be more robust than a network of program changes, bindings etc.
I use LivePrompter to send a program change for each song to BOME MIDI mutilator starting at 0 and ending at around 30.
BOME stores that program change number in a global variable and also sends it on to Cantabile,
Cantabile processes the change and selects the correct song as I change song in LivePrompter
I map the Play/Pause button in LivePrompter to another midi message
BOME sees the play/pause midi message which triggers a note on message to Ableton Live for the note corresponding to the song number from the global variable eg C1, D1, E1.
I map the notes to scenes in Live, so the correct scene is launched when I press the play button in LivePrompter.
Live fits what I want to do with backing tracks much better than Cantabile.
Hi Torsten, I’ve been trying the MidiIn to change songs and press the buttons.
The incoming ProgramChange works fine - I use Cantabile to send the setlist program change out on channel 6 and it changes the song in LP.
However, I can’t get the Keys to work. I try sending the CC 50 or note 10 at value 127 from Cantabile on Channel 6, and nothing happens in LP. MidiInKeys is set to “yes”.