For the last 100 days, I have been practicing the piano! Well, not quite: For the last 107 days, I have been practicing the piano, and I missed seven days due to sickness or sheer exhaustion. But that’s a good opportunity to reflect!

I grew up playing a few instruments very badly, including the recorder (very briefly in elementary school), the piano (I never practiced and did not enjoy any part of it, and I was predictably not very good), and finally the alto-saxophone to which I developed a relationship so neurotic that towards the end I would take the instrument to my lessons, then chat to the teacher for 30 minutes, and not play a single note. I never got beyond the basics and did not enjoy any of it. Needless to say, traditional lessons formats have not worked out well for me.

Later, I picked up the guitar because I still enjoyed the thought of ‘participating’ in music; I enjoy classical ballroom dancing, singing, and rhythm games of all sorts so it’s a logical extension of that. It’s just a joy to be not just a by-stander to music but someone that is a little bit more actively involved. What got me to play the guitar was the video game Rocksmith 2014. You connect your guitar to you computer using a custom cable and it will give you some instructions for how to play it. Later on I got a bass guitar as well (mostly because Rocksmith supports it). Then I tried various other apps and stuck with Yousician. I bought a Ukulele and a MIDI-keyboard because they are supported instruments in Yousician.

While I did enjoy my time with all of these instruments since picking up the guitar, I never got to a point where I could actually play a song without any software. For the piano in particular I could never get beyond the absolute basics: two hands doing different things or hands changing positions was always too much. Strumming instruments have the advantage that your two hands are somewhat in sync, so I got a little bit further with them, but not massively. (I also made the mistake of trying to take guitar lessons, and the damage of seeing a teacher once was enough to not play for 3 months. Not the teachers fault, it is just not my thing.)

This summer I gave the piano another shot because I realized I needed to do something more meaningful with my life, ideally something with music, and the piano is just very versatile (…and quiet enough to not ). This time, however, I decided to write my own software for learning to play the piano, and now after five paragraphs of introduction we have finally reached the topic that I actually want to talk about: music learning software. I should probably prefix this by saying that I have loved my time with both Yousician and Rocksmith: I am a fan of both products.

So, what did I learn by writing my own piano playing software and practicing for 100 days? In no particular order, here are some music making and software making thoughts:

  • I decided to write the software with Raylib and Dear ImGui. I had just spent the last years of my life working at Unity (and had started writing a similar piano practice thing in Unity) and when I quit that job I needed some distance. This was such a good decision. I had not realized how much of a burden the reality of using a large engine had become. I had started to move many of my hobby projects to C/C++ with DearImGui some time earlier, and it is so freeing to not have to think in someone else’s mental model. What I found to be the biggest time-saver is that in C/C++ I can just dump everything into a single source file and call it a day. No classes, no constructors, no instance variables, no decisions on where to put code, no functions I have to mark static, just nothing. No scenes, no objects, no packages. (Yes, I could put everything into a single static class in C# but that’s not what it wants you to do.) Not having to leave the code to build some GUI is also just nice: This setup encourages trying dumb things quickly and moving on when they inevitably don’t work. It is so good.
  • Initially, I was looking for a library to help me with reading MIDI input. I did not find anything - because I quickly stopped searching. I got so used to looking for the “cross-platform library” with the perfect interface that I did not even check the Windows API to begin with, and it takes less than 50 lines of C/C++ to start receiving MIDI inputs. In a similar vein, I started by putting some configuration into external files requiring custom parsing before realizing that nobody else is going to use this software and I might as well just recompile it every day anyway, so let’s stop doing all the non-sense and just change a constant in code instead of writing a new parsing library.
  • Existing music learning software assumes that your main problem is motivation. I do not think that is necessarily the case, at least for adult learners. Isn’t it weird that the main approach is always for these apps to teach you songs? I get it, everybody wants to play their favorite songs (me too!) but that’s sort of the point: Everybody already wants to do that, and they will do that on their own anyway. What most people don’t do is practice playing all major scales, or playing the same rhythm practice every day. it is probably a tougher sell, quite literally: there probably is a commercial reason for focusing on songs. But why is there no software that makes it easy to do the thing that is actually hard?
    • What has helped me most in my guitar playing is practicing chord changes with a timer and noting down results (thanks, JustinGuitar!) and playing String Skip Saloon in Rocksmith 2014, a minigame in which you have to pluck strings in pre-defined patterns. The other “technique” minigames in Rocksmith are just not very good because they introduce long delays or are just frustratingly inaccurate (hello, “Return to Castle Chordead”). Yousician’s practice levels similarly leave a lot to be desired because they seemingly can’t escape the “everything is a song” format.
    • What I found with my own software is that it is way more effective to have a tool that actively tells you “practice this scale 15 times” or “here are the next 4 chords, I’m going to show them to you 100 times every day until you have learned them.” You can debate the merit of these exercises in the long run, but it is almost universally accepted that beginners benefit from learning to play scales, chords, and arpeggios. The thing that makes practicing them easier for me in my experience is not even “gamification” (maybe that helps a bit?) but structure: The biggest enabler is that I don’t have to think about what I am practicing today. You do not even need software for that. The software is just good for letting me know whether I can now successfully identify a chord > 95% of the time so I can move on to the next one, or counting the number of times I played a scale, or counting the number of mistakes I made, or counting the number of chord changes I did etc.
    • FREE IDEA: Put an incremental/clicker game on top of your music practice software. We already know how to make people addicted to things, so why not use it for good.
  • You learn what you practice. I have two examples here:
    • One of the things I implemented early on was the classic “falling notes” interface as in e.g. Synthesia. Rocksmith and Yousician have the same, except the notes move on a different axis. I scrapped this because it was terribly ineffective compared to my other methods. What falling notes teach you is to see what is falling your way and then react to it quickly. If you are lucky, you have instructions on what finger to put where, but you are spending the entirety of your energy in the moment. Maybe it is good practice for sight-reading, but learning sight-reading when you can’t even play yet seems like a terribly ineffective thing to do. I think this is where I got stuck with Yousician and Rocksmith. I have learnt so much more by looking at a score, thinking about finger placement, and then learning to play it by heart as much as possible – to the point that I can now actually sit down at a piano and just play something. None of these other tools ever taught me that. Maybe they even have an incentive to not teach me that so I spent more time and money on them!
    • I struggle with note-reading. That’s not particularly uncommon. I implemented a game that shows you a note and then you need to press that key on the MIDI keyboard. It did not help me. I then changed it so you have to press the corresponding letter on the keyboard (without accidentals). This did not help me. I then finally changed it to show a list of buttons for you to click on to identify the name of the note. This helped, a lot. What I practiced with the MIDI keyboard was to move the right fingers. It did not help me connect the note “E” to its visual presentation on the staff. Using the letters on my computer keyboard did not help either because 25 years of typing have made that process so automatic that it is entirely unconscious. Moving the mouse and identifying the visually presented name of the note seems to excite the right neural pathways for me to actually learn things.
  • Finally, practice is incredibly effective. I did not expect to get to 100 days, and right now I don’t see a reason to stop. I have already achieved more than I have ever thought I would and am playing pieces that I did not expect to ever have a chance at playing. It’s nothing majorly difficult, but it is an achievement for me, and I am enjoying it. The process of going from “this is impossible” to “this is actually doable” within a span of 3-4 days of practice over and over again does not get old.

I believe that (ironically) this whole journey of writing my own software taught me enough about practicing that I would now be more successful at learning with the likes of Rocksmith or Yousician… but for now I am happy with my software and sheet music.