Using Musescore for choir practice at home

TL;DR Get Musescore. Manually enter all the parts, each on a separate staff (unless maybe someone else in your choir already did). Then play it back. Use the Mixer to emphasize your own part at first, then blend it increasingly with the rest to make sure you still know it without getting confused.

When I first started singing in the choir Triangelos, I suddenly had to learn a, to me, impossible number of songs in just a few weeks before our first performance. Everyone else more or less knew them already, and I’m not the bravest at speaking up and demanding stuff to be repeated just for my benefit, so I found myself in kind of a bind.

The solution, of course, was to practice at home, but as I didn’t have any sort of musical instruments and couldn’t really read sheet music anyways… what was a computer geek like me supposed to do? I went online hunting for digital help of course…


The quest led me to the free sheet music program Musescore. Not only is it free, but it’s also open-source and available to both Windows, Mac OS and Linux. There’s even an app for your Android or iOS devices.

But, musescore is of course of no use on its own. You need digital sheet music. We get ours on paper.

Looked into OCR stuff, but seemed expensive and/or messy, so I’ve ended up doing it manually. Went slowly at first… a lot of line counting and alphabet walking from the only two notes I really knew where was, the G and the F… trips through Wikipedia and the Musescore manual when weird symbols and lines sometimes pops up, to figure out what they mean and how to enter them in Musescore… Anyways, through perseverance and curiosity it went quicker and quicker, and although I’m definitely no professional, I can now do it fast enough to definitely feel worth it. Especially since I also share the finished product with the rest of my choir in case they also want to use them to practice.

A note about staffs and the mixer

The most important feature to me in Musescore (other than the regular playback of course) is the Mixer. This allows me to, among other things, mute and control the volume of different staffs. More about that later, but the important thing to note is that if you enter multiple voices on the same staff, you won’t be able to control them separately.

Often you only have two staffs, one for soprano and alto, and one for tenor and bass. Compact and nice on paper, but if you enter it this way in Musescore, you won’t be able to for example listen to only the alto voice.

So, when entering the score into Musescore, I make sure to give each voice its own separate staff. If there for example is a lot of 1st and 2nd soprano variation as well, I like to split those up too. If there’s only one note difference between the 1st and 2nd bass, I maybe keep them as one staff… but either way, it all boils down to whether you want/need to emphasize a certain note when playing it back or not. If yes, you need them in separate staffs. And if yes, copy, paste and adjust can save you a lot of time. 😉

A note about dynamics

I mostly use Musescore to learn what notes to sing and when to sing them, so I tend to not bother entering all the various dynamics and such. Crescendos and decrescendos, mf, pp, fff, etc. Saves a lot of time, and in my experience it might not even be right anyways because the conductor sometimes has their own small variations and such. So, better to spend time at home learning the part and then paying proper attention to the conductor for the dynamics during practice. 🙂

Sharing is caring

I mainly do all this for my own benefit, but as part of a choir it’s good to share, and since I’m very against repeating things unnecessary, I keep all the Musescore-files I produce in a OneDrive folder I share with the others in my choir. Just them though, because copyrights and such… But yeah, I’ve found doing this has helped others as well. Who are maybe not prepared to spend some hours manually entering a score (or know how to), but would very much like to get some help with that tricky part in that certain song. More practice, better choir, more fun for me as well 😀

How I use this for practicing

This thing turned into a bit more than what I had first planned. A simple, hopefully helpful, guide to how you can use Musescore for practicing singing in a choir, when you already have that digital sheet music, maybe sent to you from a helpful nerd in your choir 😛

So, that’ll go in a separate post to hopefully make it as tidy and to the point as possible…

Limit OneDrive and Windows Update bandwidth hogging

Have a really horrible internet connection currently, and whenever Windows Update and OneDrive starts downloading stuff, I can basically not do anything else because they’re hogging all my bandwidth.


  1. Open Local Group Policy Editor.
  2. Go to Computer Configuration / Administrative Templates / Network / Background Intelligent Transfer Service (BITS).
  3. Enable Limit the maximum network bandwidth for BITS background transfers, and optionally adjust the rate and hours.
  4. Reboot, possibly?


QoS Policy

  1. Open Local Group Policy Editor.
  2. Go to User Configuration / Windows Settings / Policy-based QoS.
  3. Right-click and hit Create new policy.
  4. Set DSCP Value to 1 and/or Outbound Throttle Rate to something appropriate.
  5. Set QoS policy to apply to applications with executable name onedrive.exe (or skydrive.exe, check your process list).
  6. Reboot, possibly?

Source: Don’t remember…

How to reset enemies in Factorio

Playing Factorio and loving it! But I’m playing rather slowly, so even though I like that the enemies are aggressive (didn’t select the peaceful option), they have evolved much further than I’m comfortable with compared to my ability to deal with them at the moment…

Found some console commands for resetting the evolution factor (what gradually increases and makes the enemies more and more nasty), and for nuking already spawned enemies.

Check your keyboard settings for how to toggle the console.

/c game.evolution_factor = 0
/c game.forces["enemy"].kill_all_units()

To see the current evolution factor:

/c game.local_player.print(game.evolution_factor)

Excel: Function for nslookup in worksheet

Just a copy of a function I found in a blog post for doing nslookup calls in a worksheet, in case I need it again in the future. I’ve changed the return value for failing lookups to a blank string, “”, rather than “NotFound”, but otherwise it’s unchanged.

Usage, given an IP in cell A1, to get the hostname: =NSLookup(A1; 2)

Public Function NSLookup(lookupVal As String, Optional addressOpt As Integer) As String
   Const NAME_LOOKUP = 2
   Const AUTO_DETECT = 0
   'Skip everything if the field is blank
  If lookupVal <> "" Then
        Dim oFSO As Object, oShell As Object, oTempFile As Object
        Dim sLine As String, sFilename As String
        Dim intFound As Integer
        Set oFSO = CreateObject("Scripting.FileSystemObject")
        Set oShell = CreateObject("Wscript.Shell")
        'Handle the addresOpt operand
       'Regular Expressions are used to complete a substring match for an IP Address
       'If an IP Address is found, a DNS Name Lookup will be forced
       If addressOpt = AUTO_DETECT Then
            ipLookup = FindIP(lookupVal)
            If ipLookup = "" Then
                addressOpt = ADDRESS_LOOKUP
                addressOpt = NAME_LOOKUP
                lookupVal = ipLookup
            End If
        'Do a regular expression substring match for an IP Address
       ElseIf addressOpt = NAME_LOOKUP Then
            lookupVal = FindIP(lookupVal)
        End If
        'Run the nslookup command
       sFilename = oFSO.GetTempName
        oShell.Run "cmd /c nslookup " & lookupVal & " > " & sFilename, 0, True
        Set oTempFile = oFSO.OpenTextFile(sFilename, 1)
        Do While oTempFile.AtEndOfStream <> True
            sLine = oTempFile.Readline
            cmdStr = cmdStr & Trim(sLine) & vbCrLf
        oFSO.DeleteFile (sFilename)
        'Process the result
       intFound = InStr(1, cmdStr, "Name:", vbTextCompare)
        If intFound = 0 Then
            NSLookup = ""
            Exit Function
        ElseIf intFound > 0 Then
            'TODO: Cleanup with RegEx
           If addressOpt = ADDRESS_LOOKUP Then
                loc1 = InStr(intFound, cmdStr, "Address:", vbTextCompare) + InStr(intFound, cmdStr, "Addresses:", vbTextCompare)
                loc2 = InStr(loc1, cmdStr, vbCrLf, vbTextCompare)
                nameStr = Trim(Mid(cmdStr, loc1 + 8, loc2 - loc1 - 8))
            ElseIf addressOpt = NAME_LOOKUP Then
                loc1 = InStr(intFound, cmdStr, "Name:", vbTextCompare)
                loc2 = InStr(loc1, cmdStr, vbCrLf, vbTextCompare)
                nameStr = Trim(Mid(cmdStr, loc1 + 5, loc2 - loc1 - 5))
            End If
        End If
        NSLookup = nameStr
        NSLookup = "N/A"
    End If
End Function

Function FindIP(strTest As String) As String
    Dim RegEx As Object
    Dim valid As Boolean
    Dim Matches As Object
    Dim i As Integer
    Set RegEx = CreateObject("VBScript.RegExp")
    RegEx.Pattern = "\b(?:\d{1,3}\.){3}\d{1,3}\b"
    valid = RegEx.test(strTest)
    If valid Then
        Set Matches = RegEx.Execute(strTest)
        FindIP = Matches(0)
        FindIP = ""
    End If
End Function


PHP: Stream a file line-by-line using a generator

This function will “stream” a file line-by-line, as a Generator.

Can be very useful if for example you need to process a big file, don’t want to read the whole thing into memory, but only process each line by itself.

function read($file)
    $fp = fopen($file, 'rb');

    while(($line = fgets($fp)) !== false)
        yield rtrim($line, "\r\n");


// Usage
foreach(read('') as $line)

CSS: Super simple design guides

Needed to see if I had lined some stuff up correctly on a website I’m making. Came up with this simple CSS to add two guides to the page that I can move around freely in the browser developer console (just nudge their position around to where I need them).

It’s really simple, but for some reason didn’t think of it until now…

html::after {
    content: "";
    height: 1px;
    width: 100%;
    background: red;
    position: fixed;
    left: 0;
    bottom: 5px; /* Change this to move the guide horizontally */
html::before {
    content: "";
    height: 100%;
    width: 1px;
    background: red;
    position: fixed;
    top: 0;
    right: 5px; /* Change this to move the guide vertically */

With a hint of Social Ineptitude