Baldur's Gate III has consumed an inordinate amount of my leisure time in the recent weeks, not least because I could finally implement my go-to 5E character build (my "main", if you will) in a digital engine for the first time. One massive issue for me, however, was that a big part of my main's character concept is the ability to perform music, despite being an Arcane Trickster Urchin. In tabletop, this can be achieved thanks to the often overlooked rule that if you get the same tool proficiency from your background and your class, you can replace the extra copy with any other tool or, indeed, a musical instrument. BG3's digitalized ruleset does not support this rule, however, so I had to find another way.

Now, as the BG3 wiki helpfully points out, the game supports three "legal" methods to gain a musical proficiency:

  • Taking a level in the Bard class was tempting and was, indeed, what I had done for my build back in Pathfinder 1E days, but mutliclassing in 5E is not nearly as appealing as it was in 3E, and so I decided to go Rogue all the way.
  • Taking the Entertainer feat at level 4 did not appeal to me, either, because the trade-off of weakening the character in combat was no worth the role-play for me. (For the record, I find it weird that the Entertainer background in BG3 does not give you a musical proficiency at all.)
  • Finally, completing Alfira the Tiefling Bard's mini-quest in Act 1 with two Performance checks was a wonderful idea... if not for the fact, that by the time I have learned that doing so granted the proficiency I wanted, I had already completed said mini-quest using Persuasion checks 5 hours ago (and loved every second of it, btw).

Now, after I have realized that, I have spend a good chunk of the next weekend attempting to hack my saved game using Norbyte's awesome lslib modding tools. After decompiling the event codes, I have been able to narrow down what I wanted to achieve to a single line of code: internally, the proficiency Alfira grants if you complete her quest the right way is a hidden permanent status effect internally referenced as "DEN_ALFIRA_PROFICIENCY". Unfortunately, no matter what I did, I have not found a way to successfully inject it into my saved game without corrupting it to the point where the game refused to load it. After two days, I gave up and bit the bullet by loading an old save before Alfira's quest and retracing my steps from there.

It has since turned out, however, that I was using the wrong tool for the job. Or rather, I was only using one tool, when I should have also checked out Norbyte's equally awesome BG3 script extender. Rather than trying to manipulate the saved games and trying to trick the game into accepting them as legit, what I actually needed to do was to apply the status effect in-memory and let the game save it for me! So, in the spirit of information wanting to be free, here is how you can replicate what I did:

  1. Download the latest BG3SE release. Make sure to pick the file with the "-wConsole" in its name!
  2. Unpack the two files from the downloaded archive into your <steamapps\common\Baldurs Gate 3\bin> folder. They don't overwrite anything.
  3. Launch the game. The Larian launcher will complain about detecting a "data mismatch", but don't worry, it will go away after you uninstall the BG3SE.
  4. Load your saved game.
  5. When you had launched the game, a console window should have opened with it. Alt-Tab to that window now.
  6. In the console window, press Enter once to enable command input.
  7. Copy-paste following into the console to display the internal UUIDs of all your current party members:
    _D(Osi.DB_Players:Get(nil))
    The output in the console should look something like this:
    [
        [
            "Humans_Male_Player_Dev_5c9ba5ca-ef5d-b348-d65e-75b2b778db83"
        ],
        [
            "S_Player_Gale_ad9af97d-75da-406a-ae13-7071c563f604"
        ],
        [
            "S_Player_Karlach_2c76687d-93a2-477b-8b18-8a14b549304c"
        ],
        [
            "S_Player_ShadowHeart_3ed74f06-3c60-42dc-83f6-f034cb47c679"
        ]
    ]
  8. Copy the first UUID in the list (in the example above: "Humans_Male_Player_Dev_5c9ba5ca-ef5d-b348-d65e-75b2b778db83"). This one is your main player character (avatar).
  9. Replace "Avatar-UUID" in the following line with your UUID from the previous step and paste it into the console:
    Osi.ApplyStatus("Avatar-UUID", "DEN_ALFIRA_PROFICIENCY", -1, 1, "S_DEN_Bard_4a405fba-3000-4c63-97e5-a8001ebb883c")
  10. Alt-Tab back into the game and confirm that your avatar can now play any instrument (either by going to Detailed View tab, or by just playing something).
  11. Save and exit the game.
  12. Delete the two BG3SE files from <steamapps\common\Baldurs Gate 3\bin> to make the launcher error message go away.
  13. Load the newest save and celebrate your newfound musical proficiency with a song!

Note that while it is impossible for Alfira to grant a musical proficiency to more than one party member in the regular gameplay, since it is implemented as a hidden status effect, it is possible to grant it to every party member, turning your murder hobo squad into a traveling rock band. As far as I can tell, the game (as of Patch 1) does not monitor whether the status effect DEN_ALFIRA_PROFICIENCY applies on more than one character, so it has no objections to loading saved games thus manipulated. While I in no way condone irresponsible save manipulation or wanton rock bands, here are the UUIDs of the six origin companions, in case you want to give musical proficiency to someone other than your avatar:

S_Player_Astarion_c7c13742-bacd-460a-8f65-f864fe41f255
S_Player_Gale_ad9af97d-75da-406a-ae13-7071c563f604
S_Player_Karlach_2c76687d-93a2-477b-8b18-8a14b549304c
S_Player_Laezel_58a69333-40bf-8358-1d17-fff240d7fb12
S_Player_ShadowHeart_3ed74f06-3c60-42dc-83f6-f034cb47c679
S_Player_Wyll_c774d764-4a17-48dc-b470-32ace9ce447d

Special thanks to the Reddit user u/DimakSerpg for getting me started on BG3SE hacking. Rogues gotta rogue, man.