GSoC 2019: Chord Symbol Playback - Week 9

Posted 4 years ago

In the final quarter!

So Far

This week has been a bit of an interesting week for me. I spent the first half of the week working on the stuff mentioned in last weeks blog before having to scrap all of it (for now at least) in favor of getting this project ready to be merged (so that everyone can use it sooner :)). I spent a couple days looking at TODOs and FIXMEs that I left behind and resolved as much of those as I could before moving on to the more difficult ones.

At that time I spent time running through the code and running through MuseScore to see how the feature stacks up with other parts of the program and making sure that everything looks good. I found a good amount of stuff left to to fully integrate the feature, and started on that, but was halted by the health issues of someone close to me. Still, while I didn't push much code this week, I still got a lot of information that will help me much more quickly finish my final essential tasks.

This Week

This week I will hopefully almost fully prepare the essentials of the feature for merging. There are a few important things left to add and that's what I hope to do.

First is the mixer and midi channels. Right now, chord symbols are played on the same channel and instrument as the staff it is attached to. This works, but it would be nice to at least have the chords played on a separate channel so that their volume and pan can be changed and so they can be muted and such. If we gave them their own instrument, that would also allow for chord symbols to be played with a different instrument than the solo instrument on top. In both cases, a separate channel will help with midi export so that a user can filter between generated harmony and the actual written notes when exporting a score.

Next is the quality of life. The user interaction with the feature is still not perfect and I'd like to handle that. For example there's no way to set the default voicing except by using the style button in the inspector. There's also stuff such as a global option for chord symbol playback, play on click, etc.

Finally is special chords. I will not delve too deep into these chords yet, but I'd like to make sure special chords like 6/9 chords and alt chords are properly played back. There are other chords that are recognized by the parser such as Tristan chords, but they will often require looking at more information than currently happens.

I hope to accomplish all of these things and I think that's possible considering that many of the quality of life items should be really quick to add. I'm really excited to bring this project sprinting across the finish line!

See you next week!


Concratulation for your discipline (and wisdom!) not to work further on even more sophiticated stuff, but instead ensuring that a basic set of features get's merged. Great!

I'm sure you'il do a great job.

This feature will allow many beginners to use MuseScore. And they will all be grateful to you.

When Merge is in, please report it here and we will test the nightly and make sure there are no errors or bugs.
So you'il have time for the final fix.

I guess you mean, currently the playback uses the instrument of the staff they are attached to? Off the top of my head, what may makes the most sense is to keep using that "part" but add a new channel, much like there are mute/open for brass and arco/pizz channels for strings. And the channel would get created dynamically when chord symbols are added (bonus for removing the channel when the last chord symbol is removed, but, meh).

For special chords, maybe quick solution is to use the HChord for them?

Meanwhile, I'm wrapping up my implementation of Roman numeral analysis and a first cut at Nashville number system. These will be ordinary Harmony objects but they won't have a valid "rootTpc" or "baseTpc", instead they will have a "function" that is a string representation relative to the key (eg, "1", "b3", or "#iv"). For Roman numerals, I don't parse them so no playback is possible, but for Nashville, all else should, I think, work the same. All you should need is a function to convert the function to a tpc relative to the key, I think. As we get closer we'll look to see what other adjustments might be needed.