Music score reader and player / Flutter plugin in C++/Juce

Hello,

As title says (please forgive my naivety I am not a c++ coder), I need to build a multiplatform app whose main function is to show notes while midi playing a music score.
I have been around a few topics on the net and it seems almost necessary to code this in c++, as it needs accuracy for note display control and audio sync.

So I wonder if some of you had already worked on this type of project and if you would have a raw workload estimation (targeted to ios, android, windows) and specific hints to provide as per the framework to consider (juce, qt…) or existing libraries (musescore, lilypond…)
Or creating a Flutter plugin is worth an option to consider?

Anyway if you have experience to share for this kind of component I would be grateful.

Thanks,
GM

i started learning juce last december and i already finished one plugin. considerably smaller than your idea though. however you can make it somehow but beware you’ll never actually make music again xD

1 Like

Lol so true. I am slowly getting back into actually making music now after 5 years of audio programming :slight_smile:

1 Like

You might look at MuseScore https://musescore.org/en and all the devs that contribute to it on github. it’s open source.

my own app ChordieApp took a while to develop the notation renderer for it (a few months to really perfect). Notation renderers are not trivial, and there are TONS of notation rules you need to take into account when drawing stacks of noteheads and accidentals. Especially if you’re lining them up vertically across multiple staves. I built it in JUCE. it’s used in lots of youtube videos and skype lessons to teach theory and piano.

If you’re trying to build something like NoteFlight (https://www.noteflight.com/developers), you might just hit them up to license their system. it’s probably cheaper to do that than to build something from scratch, you know?

1 Like

Thanks guys for your kind feedback. It confirms my assumption that it’s hard. I will certainly not try to code that on my own.
Thanks matkat for the suggestions I will dig that direction.

Some more:
There is Guido (after Guido di Arezzo):
https://guido.grame.fr/

Then there is lilipond, which you mentioned. Problem is it is GPL and a one way street, only displaying. Also it means running a render process, which adds a delay until it becomes available.
Plus side it is very decent looking.

A python editor based on lilypond exists, which is Frescobaldi:
https://frescobaldi.org/

If you write in python, this might be for you. It allows to interact with the glyphs and get callbacks.

I started my own, because I wanted it seamless in JUCE and interactive for some research project. It is hard, a couple of months already went into the project and it is nowhere near from finished, luckily I don’t depend on a release date.

As @matkatmusic said rightly, it is a potentially infinite hard task with all extra rules, additional symbols and styles, slurs, beaming, and many more layout problems.

If you want to see, what is necessary, the musicXML is a great resource and interface, defining all in a structured way: https://www.musicxml.com/

Good to know is also the SMuFL, which defines some json metadata file, where you find the anchor points for staves, beams, bounding boxes, and engraving defaults: https://www.smufl.org/

These metadata.json files are shipped with many music fonts, like Bravura and Petaluma

Thanks daniel for complementary info !

Definitely check out the Verovio library (verovio.org). ‘Engravings’ it produces are really great. There is a qt/qml binding provided, that draws the score directly to a qml scene graph. And once you keep track of all nodes there, the sky is the limit! I’m working on a sight reading app that utilizes all kinds of crazy animations (disappearing notes, visual hints…) and it works like charm. Let me know if you need more info.

1 Like

Wow, this could be the catch of the year, thank you so much @rayg!

You can’t believe how often I typed musicxml and C++ in the leading search engine, and this never popped up. I’ll definitely check it out!