Would it be possible to add a sort of a band ready button on the performance view? Sometimes we stand quite far apart on the stage and it’s difficult to notice if one of my bandmates has to tune quickly or has an issue before I start the song. The ready button would work simply so that each band member can tap on it on their performance view and a green little icon would light up on everyone’s performance view. When all of the icons, four in my case, would be lit up I’d know everyone is ready and I can start the next song.
Hey @yukata, welcome to the forum!
You can build exactly this in Canvas (AbleSet Pro) using Shared Variables. Shared Variables are synced across all devices, so when one band member taps their button on their tablet, everyone else’s screen updates instantly.
To avoid anyone accidentally tapping someone else’s button, the trick is to make one Canvas per band member. Each Canvas has:
- One Button — that person’s own ready toggle.
- Three Labels — read-only indicators for the other three. Labels aren’t tappable, so there’s nothing to hit by mistake.
- One Label that lights up BAND READY when all four are green.
All four Canvases read and write the same Shared Variables (ready1 … ready4), so they stay in sync automatically. Each person just opens their own Canvas on their device.
1. Your own button
Add a Button, set Button Type to Script, and enter this as Script on Press:
// toggles this member's ready state
setShared("ready1", !shared("ready1", false));
Then enable Dynamic on the Background Color and use:
${shared("ready1") ? "green-500" : "gray-800"}
On Member 2’s Canvas this button uses ready2, on Member 3’s ready3, and so on — in both the script and the color template.
2. The other members’ indicators
Add a Label for each of the other three. Set its text to their name and enable Dynamic on the Background Color:
${shared("ready2") ? "green-500" : "gray-800"}
Same template, just pointing at a different variable for each one.
3. The “Band Ready” label
One more Label, with this as its text:
${[shared("ready1"), shared("ready2"), shared("ready3"), shared("ready4")].filter(Boolean).length === 4 ? "BAND READY" : "WAITING"}
And this as its Background Color (Dynamic):
${[shared("ready1"), shared("ready2"), shared("ready3"), shared("ready4")].filter(Boolean).length === 4 ? "green-600" : "gray-900"}
This counts how many of the four are set and compares it to 4. It’s written this way on purpose — a version using && can break when pasted into the field, so it’s safer to avoid it here.
4. Clearing the states between songs
Shared Variables keep their value until something changes them, so you’ll want them to reset for the next song. The cleanest way is to do it automatically — add this to your Project Script (Settings → MIDI Mapping, OSC & Scripting):
onOscChange("/setlist/activeSongName", () => {
for (let i = 1; i <= 4; i++) {
setShared("ready" + i, false);
}
});
That way every jump to a new song wipes the board and nobody has to remember to press anything.
Optional: a full-screen notification
If a green indicator isn’t enough to catch your eye from across the stage, you can also fire a full-screen message on every device the moment the last person taps in. Extend the button script:
const me = "ready1"; // change per Canvas
setShared(me, !shared(me, false));
const readyCount = [
shared("ready1"),
shared("ready2"),
shared("ready3"),
shared("ready4"),
].filter(Boolean).length;
// if everyone is ready now, flash a message on all devices
if (readyCount === 4) {
sendOsc("/notify/big", "all", "BAND READY", 2000, "green");
}
Ready-made elements
Here’s a complete Canvas for Member 1 — own button, three indicators, and the status label. Copy this and paste it directly into a Canvas in edit mode:
[{"type":"button","buttonType":"script","label":"I'm Ready","textColor":{"type":"preset","color":"white"},"backgroundColor":{"type":"dynamic","template":"${shared(\"ready1\") ? \"green-500\" : \"gray-800\"}"},"font":{"size":60},"width":400,"height":300,"x":50,"y":70,"zIndex":11,"scriptOnPress":"setShared(\"ready1\", !shared(\"ready1\", false));","meta":{"visibility":true,"textColor":"var(--color-white-500)","backgroundColor":"var(--color-gray-800)","label":"I'm Ready"}},{"type":"label","label":"Member 2","textColor":{"type":"preset","color":"white"},"backgroundColor":{"type":"dynamic","template":"${shared(\"ready2\") ? \"green-500\" : \"gray-800\"}"},"font":{"size":40},"width":240,"height":90,"x":490,"y":70,"zIndex":21,"meta":{"visibility":true,"textColor":"var(--color-white-500)","backgroundColor":"var(--color-gray-800)","label":"Member 2"}},{"type":"label","label":"Member 3","textColor":{"type":"preset","color":"white"},"backgroundColor":{"type":"dynamic","template":"${shared(\"ready3\") ? \"green-500\" : \"gray-800\"}"},"font":{"size":40},"width":240,"height":90,"x":490,"y":175,"zIndex":22,"meta":{"visibility":true,"textColor":"var(--color-white-500)","backgroundColor":"var(--color-gray-800)","label":"Member 3"}},{"type":"label","label":"Member 4","textColor":{"type":"preset","color":"white"},"backgroundColor":{"type":"dynamic","template":"${shared(\"ready4\") ? \"green-500\" : \"gray-800\"}"},"font":{"size":40},"width":240,"height":90,"x":490,"y":280,"zIndex":23,"meta":{"visibility":true,"textColor":"var(--color-white-500)","backgroundColor":"var(--color-gray-800)","label":"Member 4"}},{"type":"label","label":"${[shared(\"ready1\"), shared(\"ready2\"), shared(\"ready3\"), shared(\"ready4\")].filter(Boolean).length === 4 ? \"BAND READY\" : \"WAITING\"}","textColor":{"type":"preset","color":"white"},"backgroundColor":{"type":"dynamic","template":"${[shared(\"ready1\"), shared(\"ready2\"), shared(\"ready3\"), shared(\"ready4\")].filter(Boolean).length === 4 ? \"green-600\" : \"gray-900\"}"},"font":{"size":80},"width":680,"height":140,"x":50,"y":400,"zIndex":31,"meta":{"visibility":true,"textColor":"var(--color-white-500)","backgroundColor":"var(--color-gray-900)","label":"WAITING"}}]
To build the other three, duplicate the Canvas and swap which variable the button writes to and which three are shown as Labels. Rename the labels to your bandmates’ names and adjust the layout to your liking.
Would that work for your use case?
Sure would! Thank you for the detailed answer, I’m a bit new to the canvas thing but I feel like with these instructions I can get it to work!