Sibelius Ultimate – All I wanted was a Pepsi

Sibelius Ultimate – All I wanted was a Pepsi

Sibelius Ultimate is a powerful music notation software widely used in educational settings to teach composition, orchestration, and music theory. For schools, colleges, and universities, it offers a comprehensive platform where students can create, edit, and playback complex scores with professional-quality sound. Its intuitive interface and robust feature set make it suitable for both beginners and advanced users, allowing educators to tailor lessons to different skill levels.

It supports collaborative learning through cloud-based sharing and review tools, enabling teachers to provide feedback directly on student compositions. It also integrates with learning management systems and supports MusicXML and MIDI formats, making it compatible with other music software used in classrooms. Institutions often deploy it in lab environments or via site licenses, and it’s particularly valued in programs focused on music education, performance, and digital media production.

Our organization needed just one thing: a single subscription to “Sibelius Ultimate.” That’s it. One clean, enterprise-friendly, user-friendly application—easy to update, uninstall, and manage. Simple, right?

But as I delved into the deployment process, it quickly turned into a maze of quirks, custom installer choices, scripts, missing fonts, and cleanup challenges. It reminded me of that classic Suicidal Tendencies line: All I wanted was a Pepsi.” I wasn’t asking for a full orchestral suite of complications—I just wanted Sibelius to work, cleanly and predictably, across our fleet.

This post is my way of sharing what I learned, so others don’t have to scream into the void when all they wanted was a straightforward distribution & install. From the pitfalls to deployment strategies & scripts that actually work, here’s how to avoid turning a simple request into a punk-rock meltdown.

ChoiceChangesXML to Customize Installation


The method for obtaining the options needed for a custom Sibelius installation using ChoiceChangesXML involves generating a template XML file directly from the Sibelius installer package using the macOS installer command-line tool.

The Command to Generate the Template

A template choiceChanges file, which lists the available install options, can be generated using the installer tool with the -showChoiceChangesXML flag, The command syntax is:

Ouput Installer ChoiceChanges

installer -showChoiceChangesXML -pkg /path/to/your/package.pkg

In the context of installing Sibelius, you would use the path to the Sibelius metapackage (PKG) Running this command will print the XML structure of the installation choices to standard output (stdout).

For example, the installer ChoiceChanges options with Sibelius Ultimate:

installer -showChoiceChangesXML -pkg "/Volumes/Sibelius/Install Sibelius.pkg"                                                                                    
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.app</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <false/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.app</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>1</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.app</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.tmp.AvidLink.pkg</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <false/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.tmp.AvidLink.pkg</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>1</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.tmp.AvidLink.pkg</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <false/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius71.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius71.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>0</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius71.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <false/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius75.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius75.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>0</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius75.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <false/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius8.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius8.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>0</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius8.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <false/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibeliusultimate.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibeliusultimate.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>0</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibeliusultimate.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <false/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius71.save_userdata</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius71.save_userdata</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>0</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius71.save_userdata</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <false/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius75.save_userdata</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius75.save_userdata</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>0</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius75.save_userdata</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <false/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius71first.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius71first.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>0</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius71first.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <false/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius71first.save_userdata</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius71first.save_userdata</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>0</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius71first.save_userdata</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <false/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius8first.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius8first.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>0</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius8first.uninstall</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <false/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.rewire</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.rewire</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>1</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.rewire</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <false/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.2018.fonts</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.2018.fonts</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>1</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.2018.fonts</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.scores</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.scores</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>-1</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.scores</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.englishscores</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.englishscores</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>1</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.englishscores</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_fr</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_fr</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>0</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_fr</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_de</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_de</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>0</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_de</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_it</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_it</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>0</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_it</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_jp</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_jp</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>0</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_jp</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_zh</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_zh</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>0</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_zh</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_es</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_es</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>0</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_es</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_ru</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_ru</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>0</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_ru</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>visible</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_pt</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <true/>
        <key>choiceAttribute</key>
        <string>enabled</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_pt</string>
    </dict>
    <dict>
        <key>attributeSetting</key>
        <integer>0</integer>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_pt</string>
    </dict>
</array>
</plist>

Understanding and Modifying the XML Output

The output produced by the -showChoiceChangesXML command is a template, often referred to as a “choiceChanges” file. This file is a property list containing an array of dictionaries,

To customize the installation, you must capture this output and then edit it. Each dictionary in the XML array defines a modification for a component using three main keys:

  • choiceIdentifier
    The string identifier for the package component you want to modify.

  • choiceAttribute
    The specific attribute to change (e.g., selected, enabled, visible).

  • attributeSetting
    The value for the attribute. For components that are optional, the selected attribute is often used with a value of 1 to select the choice or 0 to deselect it.


Common Sibelius Customization Use Case

When deploying Sibelius in an organizational setting, administrators often use ChoiceChangesXML to exclude specific components.

A common component that administrators frequently choose to omit is the Avid Application Manager (AAM). This component is often excluded because network users may not need to sign in or update the software, and previous versions of the Avid App Manager have caused issues, such as poor or choppy AirPlay streams.

If deploying Sibelius via a tool like Munki, the administrator would add an installer_choices_xml array to the pkginfo file, referencing the package IDs they wish to install or exclude. The package ID for the Avid Application Manager is com.avid.tmp.AppMan.pkg.

Once the XML template is generated and edited, the modified choices can be applied during deployment using the installer command with the -applyChoiceChangesXML pathToXMLFile flag. If you want to confirm the effect of your changes before installation, you can use the -showChoicesAfterApplyingChangesXML pathToXMLFile flag.

For our environment, we are using the following installer_choices_xml array.

Here’s what it does:

✅ Components it INSTALLS (attributeSetting = 1):

Core Requirements:

  • com.avid.pkg.sibelius.app – The main Sibelius application
  • com.avid.pkg.sibelius.2018.fonts – All Sibelius music notation fonts (Helsinki, Inkpen2, Opus, Reprise, Quicksand)
  • com.avid.pkg.sibelius.rewire – ReWire support for audio software integration
  • com.avid.pkg.sibelius.englishscores – English example scores and templates

❌ Components it EXCLUDES (attributeSetting = 0):

The Critical Exclusion:

  • com.avid.tmp.AvidLink.pkg – Avid Application Manager/AvidLink
    • This is the most important exclusion
    • Prevents font installation issues
    • Avoids AirPlay performance problems
    • Eliminates unwanted update prompts

Language Score Packages (Disk Space Savings):

  • com.avid.pkg.scores_fr – French scores
  • com.avid.pkg.scores_de – German scores
  • com.avid.pkg.scores_it – Italian scores
  • com.avid.pkg.scores_jp – Japanese scores
  • com.avid.pkg.scores_zh – Chinese scores
  • com.avid.pkg.scores_es – Spanish scores
  • com.avid.pkg.scores_ru – Russian scores
  • com.avid.pkg.scores_pt – Portuguese scores

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <!-- Install core Sibelius application (required) -->
    <dict>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.app</string>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>attributeSetting</key>
        <integer>1</integer>
    </dict>
    
    <!-- Install Sibelius fonts (required for proper notation display) -->
    <dict>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.2018.fonts</string>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>attributeSetting</key>
        <integer>1</integer>
    </dict>
    
    <!-- Install ReWire support (for audio software integration) -->
    <dict>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.rewire</string>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>attributeSetting</key>
        <integer>1</integer>
    </dict>
    
    <!-- Install English example scores only -->
    <dict>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.sibelius.englishscores</string>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>attributeSetting</key>
        <integer>1</integer>
    </dict>
    
    <!-- CRITICAL: EXCLUDE AvidLink/Avid Application Manager -->
    <!-- This is the most important exclusion - AvidLink is selected by default -->
    <dict>
        <key>choiceIdentifier</key>
        <string>com.avid.tmp.AvidLink.pkg</string>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>attributeSetting</key>
        <integer>0</integer>
    </dict>
    
    <!-- EXCLUDE all non-English score packages -->
    <!-- French scores -->
    <dict>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_fr</string>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>attributeSetting</key>
        <integer>0</integer>
    </dict>
    
    <!-- German scores -->
    <dict>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_de</string>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>attributeSetting</key>
        <integer>0</integer>
    </dict>
    
    <!-- Italian scores -->
    <dict>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_it</string>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>attributeSetting</key>
        <integer>0</integer>
    </dict>
    
    <!-- Japanese scores -->
    <dict>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_jp</string>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>attributeSetting</key>
        <integer>0</integer>
    </dict>
    
    <!-- Simplified Chinese scores -->
    <dict>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_zh</string>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>attributeSetting</key>
        <integer>0</integer>
    </dict>
    
    <!-- Spanish scores -->
    <dict>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_es</string>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>attributeSetting</key>
        <integer>0</integer>
    </dict>
    
    <!-- Russian scores -->
    <dict>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_ru</string>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>attributeSetting</key>
        <integer>0</integer>
    </dict>
    
    <!-- Brazilian Portuguese scores -->
    <dict>
        <key>choiceIdentifier</key>
        <string>com.avid.pkg.scores_pt</string>
        <key>choiceAttribute</key>
        <string>selected</string>
        <key>attributeSetting</key>
        <integer>0</integer>
    </dict>
</array>
</plist>

 

 

Munkipkg Wrapper for Sibelius Installation


munkipkg is a simple, self-contained tool for building macOS packages in a consistent and repeatable manner from source files and scripts stored in a project directory. It uses Apple’s pkgbuild and productbuild tools to create flat packages from a package project directory that typically contains a “payload” folder with the files to be installed. The tool uses JSON for build settings instead of Makefile syntax or XML plists, has no external dependencies, doesn’t require a system daemon, and can build and sign distribution-style packages.

The process of using munkipkg to create a customized wrapper installer for Sibelius Ultimate involves packaging the original Sibelius installer, the custom ChoiceChanges XML file, and a shell script that executes the installation from a temporary location like /tmp.
This approach allows for deployment and customized installations by excluding unwanted components like the Avid Application Manager (AvidLink) and non-English scores for our environment or can me modified for your own organizational needs.

munkipkg is a tool is used to build flat Apple installer packages (.pkg) in a consistent and repeatable manner from source files and scripts. Your resulting munkipkg package will be a simple wrapper containing the necessary installation components and the control script.

  • ChoiceChangesXML

    This is a snippet of XML that modifies the choices available within an Apple Installer metapackage. It allows you to select or deselect specific optional components before deployment. The customization is applied using the installer command-line tool with the -applyChoiceChangesXML flag.

  • Setting Up the Project

    You will create a munkipkg project directory, for example, SibeliusWrapper. The directory structure must include the files to be installed (payload/) and the execution script (scripts/).

  • Create the Project Directory

    You can use the –create option, although manual setup is also straightforward

    munkipkg --create SibeliusWrapper
    
    
  • Define the Payload (Files to )

    The goal is to stage the original Sibelius installer package (Install Sibelius.pkg) and your custom choices file (sibelius_choices.xml) inside a temporary directory on the target machine, which is typically /tmp/sibelius.=The munkipkg payload directory should mirror the target disk path starting from the root (/) is a root-level path, your structure would be:

    SibeliusWrapper/
    ├── build-info.plist
    ├── payload/
    │ └── tmp/
    │ └── sibelius/
    │ ├── Install Sibelius.pkg (The original Avid installer)
    │ └── sibelius_choices.xml (Your XML file)
    └── scripts/
    └── postinstall
    
    
  • Configure

    In the build-info.plist (or .json / .yaml), you should confirm the default settings are appropriate. Crucially, the install_location defaults to /, which is necessary since your payload starts at /tmp.

  • Creating the Script

    The postinstall script (located in SibeliusWrapper/scripts/postinstall) executes the actual installation of Sibelius using the files placed in /tmp/sibelius.

    The script must perform three main functions:

    – Define variables pointing to the temporary location (/tmp/sibelius).
    – Execute the installer command with the ChoiceChanges XML applied.
    – Clean up the temporary files after installation.

    The critical command used in the script is:

    /usr/sbin/installer -pkg "/tmp/sibelius/Install Sibelius.pkg" -target / -applyChoiceChangesXML "/tmp/sibelius/sibelius_choices.xml" -verbose
  • Building the Final Wrapper Package

    Once the payload, scripts (containing the postinstall), and build-info.plist are configured in your SibeliusWrapper directory, you execute the munkipkg command to build the distributable package:

    munkipkg SibeliusWrapper

    The resulting customized Sibelius installer package will be found in the build/ directory inside your project. This package is a standard Apple installer package, usable anywhere standard packages are deployed

 

Missing Fonts


The installation was successful, but continually received a prompt about “missing fonts” when testing Sibelius Ultimate, but it would work manually running the installer on a local test Mac system.

The “missing font issue” that arises when deploying Sibelius using management tools like Jamf Pro, Munki, or other command-line methods, instead of running the installer directly through the GUI, is fundamentally caused by a disruption in the standard font activation process that requires a logged-in user session.

Here is an explanation of the problem and the mechanism that causes it:

The Problem: Activation Happens as Root, Not the User

When Sibelius is installed via a script or deployment tool (such as Jamf Pro), the installation typically occurs using the installer command-line tool, often running as the root user. This type of installation is distinguished by the presence of the COMMAND_LINE_INSTALL environment variable.

AvidLink PostInstall Script Reveals the Issue

# From AvidLink postinstall:
LOGGEDUSERS=`who | grep console | awk '{ print $1 }'`
for CURRUSER in $LOGGEDUSERS; do
    LOGIN_PID=$(ps -axj | awk "/^$CURRUSER / {print \$2;exit}")
    if [ "$LOGIN_PID" == "" ]; then
        echo "Skipping $CURRUSER: no login session"
    else
        # Font activation happens in USER CONTEXT
        sudo -u $CURRUSER $OPEN -a "$AvidLinkDIR$file"
    fi
done

Local Installation (Works):

  • ✅ User logged in at console
  • ✅ Font activation in user context
  • ✅ User-space font caches initialized
  • ✅ Applications see fonts

Jamf Installation (Fails):

  • ❌ No console user during installation
  • ❌ Font activation only as root
  • ❌ User-space font caches not initialized
  • ❌ Applications can’t see fonts

The core issue is:

  • Missing User Context
    When the installation takes place through a management tool, it often happens when no user is logged in at the console (for example, if the machine is at the login window), or even if a user is logged in, the install script may not run in that user’s specific context.
  • Font Installation vs. Activation
    Sibelius fonts are installed correctly into the system-wide location (/Library/Fonts). However, font activation (registering the fonts and updating user-space font caches) relies on an installer script that attempts to run elements, like the Avid Link postinstall script, within the context of the logged-in user.
  • Failure to Activate
    Since no console user is detected during the remote installation, the font activation routines designed to initialize user-space font caches are not properly executed. The activation runs only as root, which is insufficient for the application to properly register and see the fonts when a non-root user launches Sibelius.

This results in the application (Sibelius) launching but failing to see its necessary proprietary fonts, leading to a “missing fonts error”.

The Mechanism Behind the Failure

The installer attempts to identify and run processes for logged-in users, but fails in a command-line environment:

  • Script Logic
    The installation script checks for logged-in users using the who | grep console command to determine the LOGGEDUSERS.
  • GUI Install (Success)
    If the installer is run locally (a “GUI Install Detected”), there is a logged-in user, and font activation happens successfully in that user’s context.
  • Command-Line Install (Failure)
    When COMMAND_LINE_INSTALL is detected (during a remote deployment), the system either finds no console user logged in or fails to properly execute the necessary application launch in the correct user context. The script logic often results in the message: “Skipping $CURRUSER: no login session” if no console user is detected.

This mirrors deployment challenges seen in other complex applications (like Microsoft Office), where components that require GUI access or user context (such as licensing activation or registering daemons) fail when installed at the login window via command-line tools.

The Solution (The Critical Fix)

To resolve the missing font issue during remote deployment, administrators must ensure that font activation happens for active users after the package installation is complete.

The critical fix involves running a subsequent script (often as a post-install step or using a tool like Outset) to:

  • Identify Console Users
    Determine which user is actively logged into the console.
  • Clear Caches
    Run commands as that specific user (sudo -u “$CURRUSER”) to clear user-specific font caches, such as those found in /Users/$CURRUSER/Library/Caches/com.apple.FontRegistry and /Users/$CURRUSER/Library/FontCollections.
  • Restart Services
    Restart user font services (e.g., using launchctl kickstart gui/$LOGIN_PID/com.apple.FontWorker).
  • Force Refresh
    Optionally, force Font Book to refresh (by telling the application to activate and quit) as the user.

If no console users are logged in, the system notes that fonts were activated only for the system, and users may still need to log out and log back in for the fonts to be fully available.

// ...existing code...

echo "Activating fonts for logged-in users..."
LOGGEDUSERS=$(who | grep console | awk '{ print $1 }')

if [ -n "$LOGGEDUSERS" ]; then
    for CURRUSER in $LOGGEDUSERS; do
        LOGIN_PID=$(ps -axj | awk "/^$CURRUSER / {print \$2;exit}")
        if [ "$LOGIN_PID" != "" ]; then
            echo "  Activating fonts for user: $CURRUSER"
            
            # Clear user-specific font caches
            sudo -u "$CURRUSER" rm -rf "/Users/$CURRUSER/Library/Caches/com.apple.FontRegistry"* 2>/dev/null || true
            sudo -u "$CURRUSER" rm -rf "/Users/$CURRUSER/Library/FontCollections"* 2>/dev/null || true
            
            # Restart user font services
            sudo -u "$CURRUSER" launchctl kickstart gui/$LOGIN_PID/com.apple.FontWorker 2>/dev/null || true
            
            # Force Font Book to refresh as the user
            sudo -u "$CURRUSER" osascript -e 'tell application "Font Book" to activate' 2>/dev/null || true
            sleep 2
            sudo -u "$CURRUSER" osascript -e 'tell application "Font Book" to quit' 2>/dev/null || true
            
            echo "    ✓ Font activation completed for $CURRUSER"
        else
            echo "  Skipping $CURRUSER: no active login session"
        fi
    done
else
    echo "  No console users logged in - fonts activated for system only"
    echo "  Users may need to log out/in for fonts to be available"
fi

// ...existing code continues...

License Locations


Here are the notable license paths:

Single-User License Location

For a single-user license, the activation information is managed by Avid Link and stored in a hidden folder on the system.

Location of Activation Data (Licenses Folder)
/Library/Application Support/Avid/Licenses/

If activation issues arise, Avid recommends deleting the Licenses folder located at this path. Administrators should also delete the binding.dat file found in the /Avid/Common folder to force a re-activation through Avid Link.

Multi-Seat Network License Locations

For network installations using a Sibelius Licence Server, two main locations are relevant: one for the server software and one for the client configuration file.

Client Configuration File Path

Client computers use a specific file to locate the license server on the network. This file is referred to as the LicenceServerInfo file (note the “c” spelling, which matters in this context).

Client File Location (LicenceServerInfo)
/Library/Application Support/Avid/Sibelius/_manuscript/LicenceServerInfo

This file contains the server’s IP address or hostname on a single line. Sibelius looks for this file upon launch; if it is found, the application will attempt to communicate with the license server to check out a license. The file should have permissions set to 755 with an owner and group of root:admin.

For example, here is how you can script the creation of the file (substitute [YOUR_SERVER_ADDRESS] with your server’s IP or hostname):

#!/bin/bash

# --- VARIABLES ---
SERVER_ADDRESS="[YOUR_SERVER_ADDRESS]"
LICENSE_PATH="/Library/Application Support/Avid/Sibelius/_manuscript"
LICENSE_FILE="$LICENSE_PATH/LicenceServerInfo"
PERMISSIONS=755
OWNER_GROUP="root:admin"

# Create the necessary directory structure (if it doesn't exist)
echo "Creating directory: $LICENSE_PATH"
/bin/mkdir -p "$LICENSE_PATH"

# Write the server information (single line) to the file
echo "Writing server address ($SERVER_ADDRESS) to $LICENSE_FILE"
/bin/echo "$SERVER_ADDRESS" > "$LICENSE_FILE"

# Set required permissions and ownership
echo "Setting permissions and ownership for the file and directory"
/usr/sbin/chown "$OWNER_GROUP" "$LICENSE_PATH"
/bin/chmod "$PERMISSIONS" "$LICENSE_PATH"

/usr/sbin/chown "$OWNER_GROUP" "$LICENSE_FILE"
/bin/chmod "$PERMISSIONS" "$LICENSE_FILE"

echo "Sibelius LicenceServerInfo deployed successfully."

exit 0
No Comments

Leave a Reply