MuseScore + Soundflow Workflow Experiments
Hello Soundflow community,
My name is Jake.
Lately, I’ve been preparing for an upcoming gig by charting 23 songs for an artist I work with, which has meant spending a lot of time in MuseScore.
I’m wondering if anyone in the community has explored integrations that make working in MuseScore a bit more fluid. The interface—particularly the palettes and submenus—can feel pretty clunky, and I’ve found that Soundflow has already started to help streamline some of that friction.
Functions I’ve Attempted to Script (Roughly):
- Color-coding specific elements (e.g. chord symbols, accidentals, coda signs)
- Inserting repeat starts
- Inserting repeat ends
I’d also like to create shortcuts for adding D.C. al Coda, Segno symbols, and similar navigation markers to eliminate the need for digging through MuseScore’s submenu system every time. The goal is to build a faster, more intuitive charting workflow.
Repeat Marking Limitation
Ideally, the repeat start and end commands would be consolidated into a single function triggered by selecting a range of bars—rather than setting each point manually. However, I’m not sure it’s possible to identify individual bars from a selection within Soundflow. I’ve tried to parse it, but all I’m getting back is this clunky chain of UI references:
sf.ui.app("org.musescore.MuseScore").mainWindow.groups.whoseTitle.is("Page, selected, Range selection starts Bar 8 Beat 1 ends Bar 8 Beat 1").first.groups.whoseTitle.is("System, selected, Range selection starts Bar 8 Beat 1 ends Bar 8 Beat 1").first.groups.whoseTitle.is("Bar 9, Bar 9, selected, Range selection starts Bar 8 Beat 1 ends Bar 8 Beat 1").first.groups.whoseTitle.is("Segment, Bar 9 Beat 1, selected, Range selection starts Bar 8 Beat 1 ends Bar 8 Beat 1").first.groups.whoseTitle.is("Rest Bar, Bar 9 Beat 1, selected, Range selection starts Bar 8 Beat 1 ends Bar 8 Beat 1").first.mouseClickElement({
relativePosition: {"x":174,"y":45},
});
If anyone knows how to resolve bar selection more elegantly, I’m all ears.
Color-Coding Workaround
One method I’ve been experimenting with involves color-coding score elements to improve the legibility of chord symbols, highlight important accidentals, and make coda symbols easier to spot when jumping around the chart—among other things. It’s still a rough implementation, but it’s already made rehearsal prep a lot smoother and saves me from having to bring a highlighter and print out charts.
Would love to hear from others—whether you’ve built your own tools for MuseScore or Sibelius, or are working on similar solutions. Looking forward to any insights.
— Jake
Colour Code element
(colour is based on "mouse click relative to UI element" co-ordinates)
//Calling command "If Menu Item Is Enabled" from package "Basics" (installed from user/pkg/version "srAasovvDiQacRZ2mcId4RrOA8R2/ckuxffxq80000u010m7g02u3l/cm4hvs5xb0000an10t8batwfo")
sf.soundflow.runCommand({
commandId: 'user:ckuxffxq80000u010m7g02u3l:ckuxfj0cn0003u010jcnoh0dg',
props: {
application: sf.ui.app('org.musescore.MuseScore'),
menuPath: ["View","Properties"],
}
});
sf.ui.app("org.musescore.MuseScore").mainWindow.children.whoseRole.is("AXList").whoseTitle.is("List").allItems[2].elementWaitFor();
sf.ui.app("org.soundflow.sfsx").mainWindow.mouseClickElement({
relativePosition: {"x":222,"y":268},
});
/* sf.ui.app("org.musescore.MuseScore").mainWindow.buttons.whoseTitle.is("Appearance").first.elementClick(); */
sf.wait({
intervalMs: 200,
});
sf.ui.app("org.musescore.MuseScore").mainWindow.mouseClickElement({
relativePosition: {"x":168,"y":772},
});
sf.ui.app("org.musescore.MuseScore").windows.whoseTitle.is("Colours").first.elementWaitFor();
sf.wait({
intervalMs: 100,
});
sf.ui.app("org.musescore.MuseScore").windows.whoseTitle.is("Colours").first.mouseClickElement({
relativePosition: {"x":90,"y":287},
});
sf.wait({
intervalMs: 100,
});
sf.ui.app("org.musescore.MuseScore").windows.whoseTitle.is("Colours").first.getElement("AXDefaultButton").elementClick();
Add repeat start:
sf.ui.app('org.musescore.MuseScore').menuClick({
menuPath: ["View","Master palette"],
});
/* //Calling command "If Menu Item Is Enabled" from package "Basics" (installed from user/pkg/version "srAasovvDiQacRZ2mcId4RrOA8R2/ckuxffxq80000u010m7g02u3l/cm4hvs5xb0000an10t8batwfo")
sf.soundflow.runCommand({
commandId: 'user:ckuxffxq80000u010m7g02u3l:ckuxfj0cn0003u010jcnoh0dg',
props: {
application: sf.ui.app('org.musescore.MuseScore'),
menuPath: ["View","Master palette"],
}
}); */
/* sf.ui.app("org.musescore.MuseScore").windows.whoseTitle.is("Master palette").first.elementWaitFor(); */
sf.ui.app("org.musescore.MuseScore").windows.whoseTitle.is("Master palette").first.mouseClickElement({
relativePosition: {"x":134,"y":410},
});
sf.ui.app("org.musescore.MuseScore").windows.whoseTitle.is("Master palette").first.mouseClickElement({
relativePosition: {"x":805,"y":165},
});
sf.ui.app('org.musescore.MuseScore').menuClick({
menuPath: ["View","Master palette"],
});