Use the TOC above. Don't mind the broken Outline on the right (if you see one), musescore.org is old and admin is too busy so it is not maintained anymore.
Feel free to adjust any content or add child pages. For more information about how to add pages etc., see the Administrative guidelines.
Developers of main app use the wiki on github.com now. The main section below still contains useful info.
Developers of plugins use the plugin section below
Developers of MuseScore 3.x compatible soundfont use the soundfont section below
Compile instructions (All Platforms)
Archive
Google Summer of Code (GSoC) is a global program that aims to encourage new contributors of open source code. Every year, thousands of GSoC contributors are paid a stipend by Google to complete coding projects with roughly 200 open source organisations like MuseScore. Please see the official Google Summer of Code website for more details, including:
If you want to take part in GSoC with MuseScore then you should familiarise yourself with the information on those pages as well as with our own requirements at MuseScore, which you can read about on the pages listed below.
As per Google's announcement, this year for the first time:
Information on the following pages is specific to MuseScore.
A lot of information is already available in the GSoC Contributor Guide. Do read it!
If you like to participate to Google Summer of Code with MuseScore, these are the steps you need to follow to apply:
Help us get to know you.
If you aren't communicating with us before the application is due, your application will not be accepted.
Find something that interests you.
It's critical that you find a project that excites you. You'll be spending most of the summer working on it (we expect you to treat the SoC as a full-time job).
Don't just tell us how interested you are, show us that you're willing and able to contribute to MuseScore. You can do that by fixing a bug or submitting a pull request well before the deadline, in addition to regularly interacting with MuseScore developers and users on the forum and Discord Server. Our experience shows us that successful GSoC students demonstrate their interest early and often.
Prepare your proposal with us.
By working with us to prepare your proposal, you'll be getting to know us and showing us how you approach problems. The best place for this is in the Discord Server.
Complete your application.
Fill out our application template.
Only the organization admin and the possible mentors will see this data. You can still edit it after submitting until the deadline!
MuseScore is mostly written in C++ and use the Qt SDK. In addition to being familiar with C++, successful applicants will be familiar with or able to quickly learn about MuseScore's infrastructure. You can't spend the whole summer learning how to build MuseScore or prepare a changeset and still successfully complete your project.
The build system. CMake is used to build MuseScore.
While you generally don't need to understand too much unless you actually want to change how MuseScore is built, you should be able to understand enough to get a general idea of how to build MuseScore. You must demonstrate that you are able to build the development version of MuseScore from sources before the application deadline. Steps to compile MuseScore are available in the developer handbook.
The version control system. We use git and GitHub.
Git is the distributed version control system (DVCS) we use for managing our source code. You should have some basic understanding of how a DVCS works.
The procedure for contributing changes.
You will be expected to follow the same procedures as other contributors. You will be helping current and future MuseScore developers by using our standard style for changes, commit messages, and so on.
The Developer Group Chat.
https://musescore.org/en/handbook/developers-handbook/references/develo…
It's very helpful for new contributors (you) to get immediate feedback on ideas and code.
Unless your primary mentor has a strong preference for some other method of communication, the Developer Group Chat will likely be your primary means of communicating with your mentor and MuseScore developers.
Progress blog.
If you're selected for the program, you'll be expected to write up progress reports on your own musescore blog. Request activation in the Developer Group Chat. Once activated, you can add a new blog post using https://musescore.org/en/node/add/blog .
Related skills.
In addition, you probably should know some things about music and music notation and be able to read simple music. It's not mandatory and we already had successful students who couldn't but MuseScore is a tool for musicians, most of the developers are musicians too. Also music notation has a specific vocabulary that you should know or learn quickly (staff, stem, chord, beam, slur etc...)
These might vary somewhat depending on the mentors and coordinators for a particular Google Summer of Code, but typically the main factors considered would be:
Applicant has demonstrated an ability to make substantial modifications to MuseScore.
The most important thing is that you've contributed some interesting code samples to judge you by.
Applicant shows understanding of topic.
Your application should make it clear that you're reasonably well versed in the subject area and that you researched it before your application and won't need all summer just to read up on it.
Applicant shows understanding of and interest in MuseScore development.
The best evidence for this is previous contributions and interactions.
Well thought out, adequately detailed, realistic project plan.
"I'm good at this, so trust me" isn't enough. You should describe which steps you'll take to implement the feature and how you'll integrate with existing MuseScore code. You should also prepare a full timeline and goals for the midterm and final evaluations.
Please read the "Writing a proposal" chapter from the GSoC Contributor Guide. The full guide is a must read if you want to apply.
If you would like to get feedback before the deadline:
Remember that the draft proposal link does not count as a final submission. You must download the Google Doc as a PDF and upload it to the GSoC Dashboard before the deadline. Google allows you to delete the submitted PDF and upload a new one right up to the deadline, so you should submit something early even if you plan to come back and amend it later.
Please provide your full name and email address.
If you frequent our Discord Server please let us know what your nick is. If you don't, then you'd better connect and introduce yourself!
Please include links to these profiles. To save us time, you should also include a link to your GitHub pull requests for MuseScore. For example:
MuseScore.org profile: https://musescore.org/en/user/57401 (shoogle)
GitHub profile: https://github.com/shoogle
MuseScore PRs: https://github.com/musescore/MuseScore/pulls/shoogle
Please note that your musescore.ORG profile has a different URL to your musescore.COM profile. We need the .ORG profile link. You can find this by visiting https://musescore.org/user and copying the URL this redirects to (if you are logged in).
If you have any web pages you'd like us to know about, please include links to them. These could be:
Don't worry if you feel you have nothing to show here. The main things we are looking for is at least one non-trivial pull request on MuseScore's repository and some activity in the Discord Server.
Remember, to be eligible to participate you must be a student or a beginner. If you're not a student, and you already make non-trivial open source contributions on a regular basis, this would make you ineligible to participate as a GSoC contributor.
Tell us a bit about you, such as:
A short description of the project.
Do you consider the project to be medium (~175 hours) or large (~350 hours) in size? We may ask you to change this if we disagree. Please note that the project size cannot be changed after the proposal submission deadline. We will not select your project if we feel the requested size is inaccurate.
Do you expect to complete the project within the standard 12 week period or do you anticipate needing extra time? Google allows projects to be extended by up to 10 weeks (i.e. total length of 22 weeks). The extension can be granted during the project if necessary, but we want to know in advance wherever possible. Please state your reason(s) briefly here (e.g. time off for vacation, work, classes, coursework, etc.) and then elaborate on this in the Schedule section if required.
Describe how your project will benefit MuseScore. How will it benefit musicians using MuseScore to create scores? Will it be an aid for future MuseScore development?
Provide a user-level summary of the final output or results of your project. What does it look like? How do users interact with it? How does it cooperate with the rest of MuseScore's features?
There might not be time for everything so try to identify what is essential and what could be left for optional stretch goals at the end of the project. What would the MVP (minimum viable product) look like? Would it be ready for end users straight away, or is it just the beginnings of a system that would require further development beyond the end of your project?
How long will the project take? When can you begin work? Include an estimated timeline of the project with mini-milestones. Please number the weeks during the coding period and give each Monday's date as the week beginning:
Week 1 - 13th June
Do research. Get familiar with code.
Week 2 - 20th June
Start implementing feature X.
Week 3 - 27th June
Unavailable (vacation).
Week 4 - 4th July
Continue implementing feature X.
The schedule is just an estimate so don't worry if you're not exactly sure how long things will take or what order you will tackle them in. Where possible, try to break the project down into stages that can be merged in separate PRs throughout the project rather than in one big PR at the end.
The aim is to have your MVP (minimum viable product) ready at the earliest possible stage. If the project turns out to be harder than expected, the MVP might be all you manage to get done, but it should serve as a starting point for future development by the community or internal team (or by you if you stick around!). For this reason, it's a good idea to spend a bit of time tidying and commenting the code as you go along, and writing documentation at the end of the project to aid future development.
Make sure you note any vacation time or other commitments (e.g. work, classes, coursework, etc.) you expect to have during the project period. Such things may provide valid reasons for requesting an extension in advance. With the exception of fixed dates like the first evaluations, we can allow for some flexibility during the project. However, we will fail GSoC contributors who do not give advance notice of prior commitments or extended periods when they will be unavailable during the coding period.
For bonus points, tell us any details you can about how you would actually implement the project in the code. You could:
This really is a bonus section so make sure you have completed everything else first and sought feedback from us before doing any work on this section.
Why is this the right project for MuseScore and why are you the right person for this project?
GSoC applicants should discuss potential ideas with the team in MuseScore's Discord Server before adding them to this page. Introduce yourself in the #gsoc channel and please post your questions there whenever possible, but you may send a direct message to a mentor, or to our community ambassador Peter Jonas, if there is something you want to keep private from other contributors.
You don't have to do one of the ideas listed on this page; you can suggest your own. Always speak to a team member first to check that it would be manageable before you begin writing a proposal.
In order to meet Google's requirements, only experienced developers who are familiar with MuseScore's code are eligible to mentor projects for GSoC. Please speak to us if you are interested.
Everybody is welcome to suggest ideas to the team. Once the projects have started you can follow the progress of the students and offer constructive feedback.
If your application is successful, the first step will be to have an initial meeting with one of the internal designers as well as your mentor (who will make contact with you). The designer and mentor will provide an initial specification that will outline all aspects of the desired functionality (core feature, accessibility, associated shortcuts, etc.). This specification will then be discussed and potentially revised to ensure that the scope of the project is not too large. Throughout the process of development, you will be encouraged to share updates with relevant team members to ensure that your work receives testing, development advice and design support.
The palettes section in MuseScore 4 has been improved a lot in recent years but still needs a lot of additional refinement. In particular, there are some very obvious UX and UI improvements that would benefit the vast majority of users. See this quick explainer video to get an idea.
Here are a few improvements that would be ideal to solve as part of this project. Please note the exact UX interactions will be specified by a designer in advance.
Apart from developer mentoring, this project will involve close collaboration with our design team, who will provide designs and testing support.
Possible extensions: spell-checking, automatic hyphenation, verse extraction.
A small widget that would contain all options found currently in the Properties panel, which hovers above selected text on the score. Very much inspired by similar widgets used in word processing applications.
Please note the exact UI/UX will be specified by a designer in advance. Apart from developer mentoring, this project will involve close collaboration with our design team and testing support.
Possible extensions: spell-checking, automatic hyphenation, verse extraction.
This project would implement keyboard access in certain parts of the app that currently lack it, and improve it in areas where the current implementation is unintuitive.
To provide some background, MuseScore 4 has a new 'hierarchical' system of keyboard navigation:
This is different to the conventional 'linear' navigation system used in MuseScore 3 and other applications, where the tab key was used to access every individual control in the entire interface.
The new system is faster since it requires fewer keypresses to get to where you want to go. However, the new system can be disrupted by text fields and other controls that "swallow" arrow key events, meaning that the tab key, rather than the arrow keys, must be used to navigate away from those fields. Furthermore, the new system impedes discoverability because it is no longer possible to access all the controls simply by pressing the tab button alone.
This GSoC project would adopt a hybrid approach to navigation. The hierarchical system would be used in places where it makes the most sense, such as on the Score tab, where there are many controls and navigation speed is the priority. Meanwhile the traditional "tab to everything" approach would be used in places where discoverability is crucial, such as dialogs.
A stretch goal for this project would be to implement mnemonic accesses keys for dialog buttons (e.g. Alt+N for Next). Access keys have been implemented in the menus, but not yet in the dialogs.
Important: The internal team is still considering whether this is viable as a GSoC project. You are allowed to submit multiple proposals, so if you apply for this project idea, we recommend applying for something else too.
While piano and guitar have easy to notate fingerings using only numbers, most wind instruments still use drawings to represent fingerings. There is currently various plugins that implement in a not-so-user-friendly manner that ability for very few instruments. Some free fonts, like the fiati font (source here, demo here, include glyphs for a lot of instruments. These could be used as a basis (exporting the base diagrams as svg and using them as base). This new fingering element would work very similarly to the existing fretboard diagrams, which means keys could be toggled pressed or not pressed with a click. Apart from developer mentoring, this project will involve close collaboration with our design team, who will provide designs and testing support.
There currently exists a MuseScore plugin to reveal an interactive guitar fretboard diagram, which can be used as an extra means of entering notes into the score:
We wish to incorporate this concept as a native feature within MuseScore 4, perhaps using this plugin as a starting point, or alternatively working from scratch. We intend to design some feature improvements, including better note input interaction from the fretboard, as well as transposition features that connect with guitar-specific things like alternate string tunings and capo settings. There will also be the opportunity to work on a new UI styling for the fretboard visualisation itself. Apart from developer mentoring, this project will involve close collaboration with our design team, who will provide designs and testing support.
This is a UI system that represents all parameters in a given VST using native controls. This provide a backup when the VST interface fails. More importantly, it provides an accessible version of the interface controls. This job requires that all controls in the native VST interface can be accessed via keyboard navigation and is providing the appropriate output the screen readers.
MuseScore's AppImage has command line options to update
and install
itself, but there is no way to do these things via the GUI. This project would create an update solution for Linux along the lines of the Sparkle and WinSparkle frameworks that MuseScore uses for automatic updates on macOS and Windows respectively. The project would include an install wizard that would offer to integrate the AppImage with the desktop environment (GNOME, KDE, etc.) so that it appears in system menus. While the project would be built primarily for MuseScore, the code would be written and licenced in such a way that other Qt-based AppImage projects could use it too.
Check MuseScore 3 features not (yet) implemented in MuseScore 4
To all students: please discuss potential ideas with the team in MuseScore's Discord Server before adding them to this page. Introduce yourself in the #gsoc channel and please post your questions there whenever possible, but you may send a direct message to a mentor, or to our community ambassador Peter Jonas, if there is something you want to keep private from other contributors.
You don't have to do one of the ideas listed on this page; you can suggest your own. Always speak to a team member first to check that it would be manageable before you begin writing a proposal.
In order to meet Google's requirements, only experienced developers who are familiar with MuseScore's code are eligible to mentor projects for GSoC. Please speak to us if you are interested.
Everybody is welcome to suggest ideas to the team. Once the projects have started you can follow the progress of the students and offer constructive feedback.
If your application is successful, the first step will be to have an initial meeting with one of the internal designers as well as your mentor (who will make contact with you). The designer and mentor will provide an initial specification that will outline all aspects of the desired functionality (core feature, accessibility, associated shortcuts, etc.). This specification will then be discussed and potentially revised to ensure that the scope of the project is not too large. Throughout the process of development, you will be encouraged to share updates with relevant team members to ensure that your work receives testing, development advice and design support.
Currently our shortcut system allows users to assign key combinations to a set number of existing functionalities. We want to expand this capability to enable users to select any item in the interface and assign a shortcut to it immediately.
As a stretch goal, we would also like to create large shortcut 'sets' to help accommodate new users. For example, if a user is coming from Sibelius or Finale, they should be able to select a set that matches the workflow they are accustomed to.
We have designed the interface and UX to support this feature already.
Apart from developer mentoring, this project will involve close collaboration with our design team, who will provide designs and testing support.
MuseScore's AppImage has command line options to update
and install
itself, but there is no way to do these things via the GUI. This project would create an update solution for Linux along the lines of the Sparkle and WinSparkle frameworks that MuseScore uses for automatic updates on macOS and Windows respectively. The project would include an install wizard that would offer to integrate the AppImage with the desktop environment (GNOME, KDE, etc.) so that it appears in system menus. While the project would be built primarily for MuseScore, the code would be written and licenced in such a way that other Qt-based AppImage projects could use it too.
As described here, the Lyrics Editor would display all lyrics from the score as plaintext in an editable multiline text field. The contents of the text field would be doubly linked with the score, meaning that a change to lyrics in either the score or the Lyrics Editor would be reflected in the other. Users would be able to search for lyrics online and paste them into the lyrics editor, or copy lyrics from the editor to produce lyric booklets for choirs and church services.
The lyrics editor was partially implemented in PR #2326, but this was using the old Qt Widgets (C++) interface for MuseScore 3 and the design was far from optimal. The student would work with the in-house design team to come up with an improved design, and then implement it in the new Qt Quick (QML / JavaScript) interface for MuseScore 4.
Apart from developer mentoring, this project will involve close collaboration with our design team, who will provide designs and testing support.
Possible extensions: spell-checking, automatic hyphenation, verse extraction.
Important: The internal team is still considering whether this is viable as a GSoC project. You are allowed to submit multiple proposals, so if you apply for this project idea, we recommend applying for something else too.
While piano and guitar have easy to notate fingerings using only numbers, most wind instruments still use drawings to represent fingerings. There is currently various plugins that implement in a not-so-user-friendly manner that ability for very few instruments. Some free fonts, like the fiati font (source here, demo here, include glyphs for a lot of instruments. These could be used as a basis (exporting the base diagrams as svg and using them as base). This new fingering element would work very similarly to the existing fretboard diagrams, which means keys could be toggled pressed or not pressed with a click. Apart from developer mentoring, this project will involve close collaboration with our design team, who will provide designs and testing support.
There currently exists a MuseScore plugin to reveal an interactive guitar fretboard diagram, which can be used as an extra means of entering notes into the score:
We wish to incorporate this concept as a native feature within MuseScore 4, perhaps using this plugin as a starting point, or alternatively working from scratch. We intend to design some feature improvements, including better note input interaction from the fretboard, as well as transposition features that connect with guitar-specific things like alternate string tunings and capo settings. There will also be the opportunity to work on a new UI styling for the fretboard visualisation itself. Apart from developer mentoring, this project will involve close collaboration with our design team, who will provide designs and testing support.
There currently exists a MuseScore plugin to reveal an interactive harp pedaling interface, which places pedal diagrams on the score:
We wish to incorporate this concept as a native feature within MuseScore 4. The widget will also allow users to enter the text for pedaling as well as diagrams. This project would involve some work on refining the appearance of the diagrams (and text), as they appear on the score. In addition, work should be done to ensure that notes that are currently unplayable are displayed in red. Apart from developer mentoring, this project will involve close collaboration with our design team, who will provide designs and testing support.
Click the 3 dots button at the top right and "Edit". Copy a project idea from below and update the text with your new idea. Don't forget to remove the mentor's name (unless it's you).
Everybody is welcome to ideas to the page, but newcomers are encouraged to discuss their idea with developers in MuseScore's Telegram group first. Also have a look at ideas from previous years.
Currently our shortcut system allows users to assign key combinations to a set number of existing functionalities. We want to expand this capability to enable users to select any item in the interface and assign a shortcut to it immediately.
As a stretch goal, we would also like to create large shortcut 'sets' to help accommodate new users. For example, if a user is coming from Sibelius or Finale, they should be able to select a set that matches the workflow they are accustomed to.
We have designed the interface and UX to support this feature already.
Hairpins are among the most important features in MuseScore. In MuseScore 3, the experience of adding, lengthening and copying/pasting has been improved but the overall task of finessing them remains unfinished.
This task involved multiple small UX improvements to dragging and snapping behaviour, as well as stretch goals to develop a system where multiple hairpins can be edited at once, and an even stretchier goal where they can be grouped too. The designs for the expected behaviours have been created for this already by our in-house design team. This is a highly collaborative project that will involve iteration based on user-testing conducted by the design team.
It is estimated that one in six adults over age 45 has low vision; one in four adults over age 75 has low vision. For this reason, MuseScore 4 was built with a new UI system that allows for very flexible colour themes. In part, this was done to make way for a highly configurable 'High Contrast' theme which allows users to specify the colours and intensity of the MuseScore interface. This would be largely based on the flexibility of the High Contrast capability seen on Windows 10 devices.
With any remaining time, this task should include a magnification system that allows the user to scale up the size of the MuseScore interface as well as the ability to invert the colours of the score page itself.
MuseScore 3 has a Tours facility, which is basically a series of dialogs that point out different parts of the program and teach people how to use them. However, these dialogs can distract users and get in the way of a normal workflow.
For MuseScore 4, we'd like to improve the Tours feature to make it more helpful and less annoying. This could mean using tooltip-style popups rather than dialogs, integrating tutorials directly into the interface, or another idea suggested by the student. The student would work with their mentor and the internal design team to come up with the best design, implement it, and update it based on testing and user feedback.
MuseScore's AppImage has command line options to update
and install
itself, but there is no way to do these things via the GUI. This project would create an update solution for Linux along the lines of the Sparkle and WinSparkle frameworks that MuseScore uses for automatic updates on macOS and Windows respectively. The project would include an install wizard that would offer to integrate the AppImage with the desktop environment (GNOME, KDE, etc.) so that it appears in system menus. While the project would be built primarily for MuseScore, the code would be written and licenced in such a way that other Qt-based AppImage projects could use it too.
MuseScore allows users to insert images in SVG, PNG and JPEG formats, which can be useful for adding complex notation that is not natively supported. However, there is no convenient way to make changes to these images after they have been inserted in MuseScore. Instead, users must edit the image in an external program, ideally using the original source file (e.g. Inkscape or Adobe Illustrator project file) rather than the image itself.
We don't want to add complex image editing features in MuseScore, but it would be great to have the option to right-click on an image and choose "Edit with Program X". MuseScore should allow project files for Program X to be embedded directly in the score along with the corresponding SVG, PNG, or JPEG image. When the user chooses to edit the image, Program X would be launched with the project file open in a temporary folder. MuseScore would monitor the project file for changes, and when it is saved, MuseScore would call Program X on the command line to generate a new SVG, PNG or JPEG image to replace the one currently displayed. The new image would be stored in the MSCZ score file along with the newly updated source file for Program X.
In the future, this process could be generalised to allow embedding third party audio, video, and rich text documents, as well as images. Advanced users might also like to specify their own custom script as both the embedded project file and as the "Program X" used to launch it. We would need to consider security implications very carefully before enabling that particular use case.
As described here, the Lyrics Editor would display all lyrics from the score as plaintext in an editable multiline text field. The contents of the text field would be doubly linked with the score, meaning that a change to lyrics in either the score or the Lyrics Editor would be reflected in the other. Users would be able to search for lyrics online and paste them into the lyrics editor, or copy lyrics from the editor to produce lyric booklets for choirs and church services.
The lyrics editor was partially implemented in PR #2326, but this was using the old Qt Widgets (C++) interface for MuseScore 3 and the design was far from optimal. The student would work with the in-house design team to come up with a improved design, and then implement it in the new Qt Quick (QML / JavaScript) interface for MuseScore 4.
Possible extensions: spell-checking, automatic hyphenation, verse extraction.
One of the most long-standing feature requests is to improve copy/paste to allow key and time signature changes, tempo texts, repeats, and other "system" elements to be copied. This would be optional, as sometimes you don't want those things copied. The actual implementation of this is not necessarily all that difficult, but the project would also involve determining a good design for presenting this to the user. This might involve the selection filter, but this too is in some need of redesign work, perhaps finding a way to combine it with the "Select" right-click menu, integrating the ideas of range and list selections, etc.
MuseScore allows you to select from several different options for the display of chord symbols, with some of the details controlled by an XML file. While custom XML files are supported, the process is cumbersome and not documented and really not an option for the average user. We could really use a WYSIWYG chord symbol style editor to allow a user to specify for herself how various chord symbols should be displayed. One was partially implemented many years ago but never incorporated into the program. It was limited in that you needed to specify each and every chord symbol separately - so C7 and C9 needed different customizations, as did C7b9 and C7b5, etc. A good style editor should be more rule-based, building on the semantic structure of a chord symbol and allowing a user to quickly specify rules to be followed by default but also individual overrides for specific chords. Probably at least some of the previous code could be reused.
While piano and guitar have easy to notate fingerings using only numbers, most wind instruments still use drawings to represent fingerings. There is currently various plugins that implement in a not-so-user-friendly manner that ability for very few instruments. Some free fonts, like the fiati font (source here, demo here, include glyphs for a lot of instruments. These could be used as a basis (exporting the base diagrams as svg and using them as base). This new fingering element would work very similarly to the existing fretboard diagrams, which means keys could be toggled pressed or not pressed with a click.
There have been user requests dating back some time (https://musescore.org/en/node/154666) to add a feature that allows users to export audio with the metronome sound included. The current workaround is to insert some sort of percussion part (ie. wood block) and use it to make a click track. I'm working on a plugin to automate this process for the 3.6.x versions of MuseScore; however, I think there could be an "Export with metronome sound" checkable option implemented in MuseScore 4 when users go to export a score as mp3, ogg, etc.
A tempo element is made up of text and/or a metronome marking. Examples:
In MuseScore 3, the entire tempo element is editable text, including the metronome marking, which makes it very easy to create a corrupt tempo that doesn't work during playback. In addition, the "BPM" field in the Inspector always sets the tempo in terms of quarter-notes-per-minute regardless of time signature, rather than using the natural beat unit (e.g. dotted-quarter in 6/8). When a score is saved in MuseScore's MSCX format, the tempo is converted to quarter-notes-per-second for no apparent reason.
In MuseScore 4, we would like to make the metronome marking separate from the text part of the tempo. In the example above, users would be able to edit the "Allegro" text by double-clicking on it in the score, but the "(♩. = 120)" metronome marking would have to be edited via the Inspector or a special pop-up that would appear when the user single-clicks on a tempo marking in the score. There would be an option to hide the metronome marking to create a purely textual tempo, but the metronome marking would still be used internally for playback purposes.
The metronome marking would be saved in the MSCX file in the form of an equation, such as:
<Tempo> <equationVisible>1</equationVisible> <bracket>auto</bracket> <text>Allegro <equation>[4.]=120</equation></text> </Tempo>
An advanced implementation would give users the option to edit the equation directly within MuseScore. This could provide a means to enter more exotic tempo markings, such as ones with tuplets in the metronome marking, or multiple notes tied together. This advanced equation syntax could be implemented as an extension if time is available at the end of the project.
Additional consideration to perhaps support markings as ♩. = ca 100
There have been user requests dating back 10 years for playback of accelerandode and ritardando (#9383: Rubato: ritardando and accelerando).
There's currently a plugin for this, https://musescore.org/en/project/tempochanges.
But this should really be a builtin function, similar to crescendo/diminuando.
Hello. A while ago, I created a series of descriptions and illustrations suggesting interesting features that could be implemented into Musescore 4's mixer design; the links to those posts are listed below. Since I am not part of the development of Musescore 4, I want to emphasize some assumption that I made when creating these concepts. These assumption includes that MS4 will eventually allow Audio / Midi recordings, importations, and automations; and it will allow 3rd party plugins such as EQs and Compressors.
*My apologies for writing this post as first person (if not appropriate for this feed); I couldn't come up a different method to authentically address this.
Comment Links:
1. Initial Post - https://musescore.org/en/node/305002#comment-1033813
2. Grouping - https://musescore.org/en/node/305002#comment-1033860
3. Mini Mixer and Other Tabs - https://musescore.org/en/node/305002#comment-1034079
4. FX Control - https://musescore.org/en/node/305002#comment-1034352
Important: The internal team is still considering whether this is viable as a GSoC project. You are allowed to submit multiple proposals, so if you apply for this project idea, we recommend applying for something else too.
MuseScore 3 has a Piano Roll Editor (PRE) that can be accessed by right-clicking on any staff in the score. A piano roll is a simple graph of pitch against time, which is familiar to users of sequencer-type programs. MuseScore's PRE also includes a graph of velocity against time, which is useful for adjusting dynamics. The PRE allows for detailed control of playback without affecting the appearance of notation in the score. The PRE needs to be reimplemented from scratch in QML before it can be ported to MuseScore 4, where it would become the starting-point for a full sequencer implementation sometime in the future.
The current Piano Roll Editor is poorly designed and overloaded with functionality that is not strictly necessary. The internal team will assist the student in coming up with a new design for MuseScore 4. At a minimum, the new PRE will simply provide viewing of pitch and velocity graphs against time, but no editing capabilities. Ideally, the student would implement editing at least for velocity. Full editing for note duration and pitch would be enabled only if sufficient time is available at the end of the project.
Click the 3 dots button at the top right and "Edit", then copy and paste an idea below and change the text with your new idea for GSoC 2020. Don't forget to remove the mentor's name (unless it's you).
Anybody is welcome to add an idea to the page, but newcomers are encouraged to discuss their idea on the MuseScore developers Telegram channel or via the developer mailing list first. Also check ideas from previous years.
If you are a student keen to take part in GSoC, we strongly believe that the best project for you is the one you are most interested in and therefore most willing to do. It doesn't have to be one of the ones listed on this page; you can suggest your own.
Whichever idea you choose, you should speak to us first to check that it would be manageable before you go to the effort of writing a proposal. This is particularly important if you want to suggest your own project, as we would have to find a suitable mentor.
Check out the steps toward successful application.
If you would like to be a mentor for GSoC then feel free to put your name down next to any projects you are interested in and that you think you are qualified to mentor. In order to meet Google's requirements for mentors, only experienced developers with a high level of familiarity with MuseScore's code are eligible. However, non-developers, and developers new to MuseScore, may be able to assist in an advisory role if they have specialist knowledge relevant to the project in question.
Everybody is free to contribute ideas. You are also welcome to follow the progress of the students and offer constructive feedback once the projects are underway.
One feature that MuseScore currently lacks is the ability to jot down and attach notes (annotations) to scores. Having the ability to attach little annotations of musical ideas to different parts of the main score may be beneficial for composers and musicians, as they can keep track of their thought process and come back to old ideas at their leisure. Perhaps the composer has some ideas for a section of music that might work in the context of the entire piece, but the composer hasn't gotten around to fleshing out the new ideas yet or likes another idea better at the moment.
Having the ability to attach little notes at different points in the score is a good way to brainstorm. Also, it could help organize things better than having a new project altogether or keeping a separate music notebook and writing down notes there. The post-its could be color coded, broken down into different sections, etc. Instead of creating scores for performance, musicians could create scores just for brainstorming, and gradually transform the score into a final score when they have enough ideas. The post-its could have the ability to contain text and to test different combinations of chord progressions, voice leading, and instrumentation. There could be bullet points for different musical ideas, color coded as the user desires. With "create post-it" mode enabled, the user could click on a particular point in the score and create a post-it there, and from there the user could write some notes in the little pop-up. The user could then close out and reopen the notes by clicking an icon that been created of a little post-it.
Difficulty: Medium
Skills: C++/Qt
Possible mentor: Marc Sabatella (@MarcSabatella)
A simplified pop/rock input method for making lyrics & chord symbol (and/or chord tab) only scores, without worrying about a staff, melody or rhythm initially, but which would still could be easily updated to include notated melody with rhythm. Maybe using a minimal slimmed-down interface. And if could import basic ascii charts of lyrics chord symbols.
Difficulty: Medium
Skills: C++/Qt
Possible mentor: @ericfont
One of the most common requests that is nearly impossible to implement in current versions of MuseScore is diatonic instruments such as the Shamisen and Appalachian Dulcimer. These instruments have a limited number of notes that can be played on a string due to their fret definitions. Current tablature does allow for the limited notes permitted to be played on a string.
I would suggest the instrument definitions be expanded to allow for detailed frets that can be applied to a given string. The definition should limit the actual note that can be played by the instrument and indicate an error similar to the current method if an illegal note is entered on both the standard and tablature clefs.
A possible way to do this is to create an interface that allows for defining new instruments to include string and fret definitions as well as individual notes for instruments such as diatonic harmonicas and accordions among others.
I am not qualified to be a mentor, but I would be more than willing to be a consultant on this project (@mike320), with programming mentoring from @TheOtherJThistle.
Difficulty: Hard
Skills: C++/Qt
Possible mentor: mike320 + James Thistlewood (JThistle/TheOtherJThistle)
A common request if for proper playback of ornaments, such as turns and trills with accidentals. There needs to be a framework created to allow the user to define an ornament and have it play back properly in MuseScore. One thing you cannot currently do is apply an accidental to an ornament.
The interface would allow the user to define the ornament, or line in the case of a trill line or prall line, based upon the key of C on a C note. The actual notes played when the ornament is encountered would be a transposition of these notes. So if the user defined a trill with a sharp above it to be played as D#-C-D#-C... (as was done in the baroque era), a trill on an G in a key with 4 or fewer sharps would result in the trill being played as A#-G-A#-G... The user would also be able to define the duration of each note played, allowing in the case of a trill for the notes played to be defined as a set duration such as 16th or 32nd notes according to the requirements of the music. Turns, pralls and so forth should also allow for accidentals to be added under the ornament to allow for defining proper playback of all ornaments used in western music.
I am not qualified to be a mentor, but I would be more than willing to be a consultant on this project (@mike320), with programming mentoring from @TheOtherJThistle.
Difficulty: Hard
Skills: C++/Qt
Possible mentor: mike320 + James Thistlewood (JThistle/TheOtherJThistle)
Author: @anatoly-os
I wish we could use keyboard (not MIDI-keyboard) for convenient real time note input. The focus of the project is composers who create music from scratch.
I will add the video which show the idea later.
When creating music, we usually have some melody in mind and want to express it with simple combination of notes and its duration. Real time input starts with the default tempo and fills the rests with notes specified by user. It is not necessary to hold letters (A-G) to enter the duration, the input mode fills the beats with the previously added note until rest or following note key will be pressed.
You still need to use letters to specify a pitch, but duration is set depending on how long you hold the button. It is like you are playing piano, but playing "keyboard" instead. So, there is a metronome, which counts the rythm. And you press and hold buttons to create a melody.
Difficulty: Medium
Skills: C++/Qt
Possible mentor: anatoly-os
As described here and partially implemented here, the Lyrics Editor would display all lyrics from the score as plaintext in an editable multiline text field. The contents of the text field would be doubly linked with the score, meaning that a change to lyrics in either the score or the Lyrics Editor would be reflected in the other. Users would be able to search for lyrics online and paste them into the lyrics editor, or copy lyrics from the editor to produce lyric booklets for choirs and church services. A more advanced implementation would use a tree view where each lyrics verse is represented by a branch in the tree.
Possible extensions: spell-checking, automatic hyphenation, verse extraction.
Another way to improve palette accessibility (and general usability for all users) is to allow the user to define keyboard shortcuts for individual palette elements. For example, the user might want to press Alt+D to enter a key signature of D major, or Ctrl+T to add a trill, etc. There could be an option to set shortcuts in the context menu that appears when you right-click on a palette. If the user tries to set a shortcut that has already be defined for another palette element then a warning should be displayed. An improved implementation would also check for conflicts with the shortcuts set in the main Preferences dialog. An ideal implementation would allow shortcuts defined anywhere in the program to be dynamically registered with the central list of shortcuts displayed in the main Preferences dialog, so that all shortcuts could be set and unset in one place, and to guarantee that conflicts are avoided (c.f. the Plugin Manager allows the user to define shortcuts to run plugins, but there is no collision detection with shortcuts defined elsewhere).
In some engraving situations, it is useful to apply several commands to a single object. One case like this is if you want to add a end/begin repeat barline. You want to add an end repeat and a start repeat to the same barline. It could be useful to create a framework to allow users to create their own macros stringing more than one command together. A macro can then be applied with a single click or keyboard shortcut.
MuseScore supports the entry of chord symbols like Gm7, C7b9, etc. It has a pretty flexible system for entering the chords, where you can type pretty much a human musician might understand and MuseScore will do its best to understand it as well. However, there are only limited controls for actually displaying the chord symbol. MuseScore provides two preset options - Standard and Jazz - and does not allow you to customize, for instance, how large the "G" should be relative to the "m" or the "7" in Gm7, or how much subscripting should be applied to the "b9" in C7b9. There was some preliminary work done on an editor years ago that could be leveraged in producing a more complete facility. There are also some improvement that could be considered in how chord symbols are handled with respect to transposition, linked parts, fretboard diagrams, capo, Nashville notation, MIDI import, MusicXML, etc.
Text in frames and elsewhere currently allows for some basic formatting options, but lacks many capabilities one would want in order to do any serious text editing, like to create educational materials with significant text between the musical examples. While we would likely not ever compete with word processors, merely implementing word wrap, justification, and a few other controls could go a long ways toward allowing users to create documents completely within MuseScore.
MuseScore provides a number of global controls over page layout - you can set the page size and margins, staff size, control distance between staves, hide empty staves, etc. There are certain overrides possible like staff spacers to change the distance between two staves, and the staff type change element to change certain properties for individual staves mid-score. However, sometimes there is still a need to for more control - override global settings for individual pages, or particular systems. You cannot have the overall staff size or default staff distance slightly smaller on one page than another, or change between percussion and pitched on a single staff, or designate certain systems to not hide empty staves, not fill to the right margin, etc. Also, we provide measure spacing controls per-measure, but no easy way to say "fit the following measures on one system".
This project would involve an investigation of how we might best expose controls like this to the user and then to design and implement the facility.
MuseScore can do cross-staff notation by selecting a note/rest and pressing Ctrl+Shift+Up/Down. However, there're a few limitations.
A complete list of issues related to cross-staff notation can be seen in #285233: [EPIC] Cross-staff notation issues. While working on them, it's necessary to keep backward file compatibility in mind.
The two-measure repeat sign with working playback has been one of the most-requested features ever, as is evident by the number of forum requests and length of this issue #10220: Add a two and four measure (multi-measure) repeat sign with playback at 164 replies and going back 8 years. This project would involve coding various multi-measure and related features, like
Automatic counting of repeated measures
Difficulty: Medium
This project would add Braille music notation to the list of formats available via File > Export. Prior knowledge of Braille music notation is not required as the basic rules are fairly straightforward and can be picked up in the early stages of the project. As with everything, the specifics of Braille music notation do get quite complicated and can even vary from country to country, so the student would not be expected to implement more than basic export functionality. However, the project would seek to identify the main hurdles that a full implementation would have to overcome, and potentially begin to explore solutions to these problems in the code. A secondary objective is to raise accessibility awareness in the developer community, and to leave behind a clear roadmap for future Braille development that would build on the foundations laid in this project.
Having completed single-note dynamics, I've been thinking about ways we can improve playback.
One thing we could do is to allow the playback of rit. and accel. markings. These would have to be user customisable, for example what tempo to change to and how to interpolate between tempi.
This isn't just limited to these tempo markings, or even just to tempo markings. If you have any other playback improvement ideas, please let me know. I'm sure we can work to implement them as well.
I've worked a lot with playback, so I feel like I could mentor this fairly well :)
As a composer who would like to use the sounds of MuseScore’s native instruments in the final product, I find it underwhelming that some instruments when transposed become indistinguishable or how multiple percussion instruments share the same sound. Improving and diversifying the sound options of these instrument as well as giving users more freedom to playback with their own sounds would expand music styles used.
This can be achieved by a small UI window which can read in sound and give the user controls for previewing the sound when it is modulated.
The one significant feature that MuseScore 2 had and MuseScore 3 lacks are albums. This feature allowed you to build a larger work from multiple smaller ones. It could be used to build a complete sonata, symphony, or suite from several movements, or a songbook from dozens or even hundreds of individual songs. One reason the feature was eliminated is that it was quite limited - for instance, all component scores needed to have the same instrumentation, and the combined score would have only one global style. It was also pretty buggy.
It's past time to reintroduce this feature into MuseScore 3, and to hopefully improve upon the original implementation.
Difficulty: Medium
Skills: C++/Qt
Possible mentor: Marc Sabatella (@MarcSabatella)
Items in a tree model can have any number of child items, but they always have exactly one parent item (except the root item, which has no parent item by definition). Musical scores follow this model closely: a note's parent is the measure it belongs to, the measure's parent is its staff, and the staff's parent is the score itself. However, the model breaks down for "spanner" elements like ties. Is the tie's parent the note at the start of the tie or the note at the end? This can be resolved by thinking of the tie as two separate elements: a startTie and an endTie, both of which exist in the model, and a link between them that exists outside the model. Sometimes code can ignore the special cases, while at other times it is necessary to check whether an item is a tie before deciding how to handle it.
Decendants of the "scoreElement" class in libmscore follow the tree model to a certain extent. Every element has a parent element, but there is no generic way to access child elements. For example, you can do element->parent()
to get its parent, but you cannot do element->child(n)
to get the n-th child. Instead you have to already know what the element and the child are (e.g. chord->stem()
). The structure of the score is also different to that described in the previous paragraph. In libmscore, the parent of a measure is the score, not the staff, which limits MuseScore's ability to represent polymeter music (a complex workaround is required). Finally, spanner elements like ties are not treated as described previously, and so fall outside the model. If these issues are corrected then it will massively simplify operations like drawing elements, saving to MSCX (i.e. writing to XML), and handling of polymeter scores. It would also enable us to make use of Qt's item view classes, which provide improved accessibility over the current ScoreView implementation.
Student: songchao → Blog
MuseScore functionality can be extended by plugins. Discovering the compatible plugins and installing them however is currently a manual job. The goal is to create an App Store-like Plugin Manager from which it is possible to discover, (un-)install, (auto-)update plugins in an easy manner. The Resource Manager currently used to handle language packs could be extended for this purpose, and indeed already has some bare-bones code for plugins.
Since many (a little of 40%) of the current 2.x plugins are available on GitHub; we should consider using their releases-API for those plugins. At the same time, locally installed plugins must still be listed and integrated as well.
Another matter to address is how to know if a plugin is compatible with the current MuseScore version.
Student: Peter Hieu Vu → Blog
Playback of chord symbols is a huge can of worms, and MuseScore does not need to be in the business of trying to match the results of iReal Pro or other programs that specialize in generating realistic accompaniment. Still, some basic ability to hear chord symbols would be nice. There has been debate about whether this should actually generate notes on a staff that can be edited or just work in the background, also on what kind of rhythms to use, what kind of voicings, etc. A successful GSoC project would need to be very proactive in getting user input, coming up with a a good design, and then implementing the algorithm.
The main goal of this project is to streamline the process of adding instrument changes. Currently, most of the functionality does exist in MuseScore, but you have to do every step manually. By the end of the summer, I would like the process changing an instrument to simply be to add an instrument change object, and use the instrument change dialog to select the new instrument.
The end goal is to handle textual hints, transposition and staff type changes automatically based of the chosen instrument.
Student: AnandHemachandran → Blog
MuseScore's palettes are not accessible to keyboard controls except via the palette search box. This is problematic for users who rely on a screen reader to tell them what is happening on the screen, such as people who are blind or partially sighted. A relatively straightforward solution is to replace each palette with a QListWidget in icon mode, and then enable tab access. However, since each palette is a separate widget, this means a lot of tabbing to get through all of them and back to the searchbox again. A better solution would be to use a QTreeWidget (i.e. a tree view), where the branches are palettes and the leaves are palette elements. However, there is no "icon mode" for tree views in Qt, so there would only be a single column of elements (or a fixed number of columns), which is visually not very efficient. The ideal implementation would make use of Qt's model-view classes, and extend QAbstractItemView to create a "category list view" (i.e. a tree view with an icon mode) where the number of columns is able to change dynamically as the user adjusts the size of the view.
Click the 3 dots button at the top right and "Edit", then copy and paste an idea below and change the text with your new idea for GSoC 2019. Don't forget to remove the mentor's name (unless it's you).
Anybody is welcome to add an idea to the page, but newcomers are encouraged to discuss their idea on the MuseScore developers Telegram channel or via the developer mailing list first. Also check ideas from previous years.
If you are a student keen to take part in GSoC, we strongly believe that the best project for you is the one you are most interested in and therefore most willing to do. It doesn't have to be one of the ones listed on this page; you can suggest your own.
Whichever idea you choose, you should speak to us first to check that it would be manageable before you go to the effort of writing a proposal. This is particularly important if you want to suggest your own project, as we would have to find a suitable mentor.
Check out the steps toward successful application.
If you would like to be a mentor for GSoC then feel free to put your name down next to any projects you are interested in and that you think you are qualified to mentor. In order to meet Google's requirements for mentors, only experienced developers with a high level of familiarity with MuseScore's code are eligible. However, non-developers, and developers new to MuseScore, may be able to assist in an advisory role if they have specialist knowledge relevant to the project in question.
Everybody is free to contribute ideas. You are also welcome to follow the progress of the students and offer constructive feedback once the projects are underway.
One feature that MuseScore currently lacks is the ability to jot down and attach notes (annotations) to scores. Having the ability to attach little annotations of musical ideas to different parts of the main score may be beneficial for composers and musicians, as they can keep track of their thought process and come back to old ideas at their leisure. Perhaps the composer has some ideas for a section of music that might work in the context of the entire piece, but the composer hasn't gotten around to fleshing out the new ideas yet or likes another idea better at the moment.
Having the ability to attach little notes at different points in the score is a good way to brainstorm. Also, it could help organize things better than having a new project altogether or keeping a separate music notebook and writing down notes there. The post-its could be color coded, broken down into different sections, etc. Instead of creating scores for performance, musicians could create scores just for brainstorming, and gradually transform the score into a final score when they have enough ideas. The post-its could have the ability to contain text and to test different combinations of chord progressions, voice leading, and instrumentation. There could be bullet points for different musical ideas, color coded as the user desires. With "create post-it" mode enabled, the user could click on a particular point in the score and create a post-it there, and from there the user could write some notes in the little pop-up. The user could then close out and reopen the notes by clicking an icon that been created of a little post-it.
Difficulty: Medium
Skills: C++/Qt
Possible mentor: Marc Sabatella (@MarcSabatella)
A simplified pop/rock input method for making lyrics & chord symbol (and/or chord tab) only scores, without worrying about a staff, melody or rhythm initially, but which would still could be easily updated to include notated melody with rhythm. Maybe using a minimal slimmed-down interface. And if could import basic ascii charts of lyrics chord symbols.
Difficulty: Medium
Skills: C++/Qt
Possible mentor: @ericfont
One of the most common requests that is nearly impossible to implement in current versions of MuseScore is diatonic instruments such as the Shamisen and Appalachian Dulcimer. These instruments have a limited number of notes that can be played on a string due to their fret definitions. Current tablature does allow for the limited notes permitted to be played on a string.
I would suggest the instrument definitions be expanded to allow for detailed frets that can be applied to a given string. The definition should limit the actual note that can be played by the instrument and indicate an error similar to the current method if an illegal note is entered on both the standard and tablature clefs.
A possible way to do this is to create an interface that allows for defining new instruments to include string and fret definitions as well as individual notes for instruments such as diatonic harmonicas and accordions among others.
I am not qualified to be a mentor, but I would be more than willing to be a consultant on this project (@mike320), with programming mentoring from @TheOtherJThistle.
Difficulty: Hard
Skills: C++/Qt
Possible mentor: mike320 + James Thistlewood (JThistle/TheOtherJThistle)
A common request if for proper playback of ornaments, such as turns and trills with accidentals. There needs to be a framework created to allow the user to define an ornament and have it play back properly in MuseScore. One thing you cannot currently do is apply an accidental to an ornament.
The interface would allow the user to define the ornament, or line in the case of a trill line or prall line, based upon the key of C on a C note. The actual notes played when the ornament is encountered would be a transposition of these notes. So if the user defined a trill with a sharp above it to be played as D#-C-D#-C... (as was done in the baroque era), a trill on an G in a key with 4 or fewer sharps would result in the trill being played as A#-G-A#-G... The user would also be able to define the duration of each note played, allowing in the case of a trill for the notes played to be defined as a set duration such as 16th or 32nd notes according to the requirements of the music. Turns, pralls and so forth should also allow for accidentals to be added under the ornament to allow for defining proper playback of all ornaments used in western music.
I am not qualified to be a mentor, but I would be more than willing to be a consultant on this project (@mike320), with programming mentoring from @TheOtherJThistle.
Difficulty: Hard
Skills: C++/Qt
Possible mentor: mike320 + James Thistlewood (JThistle/TheOtherJThistle)
Author: @anatoly-os
I wish we could use keyboard (not MIDI-keyboard) for convenient real time note input. The focus of the project is composers who create music from scratch.
I will add the video which show the idea later.
When creating music, we usually have some melody in mind and want to express it with simple combination of notes and its duration. Real time input starts with the default tempo and fills the rests with notes specified by user. It is not necessary to hold letters (A-G) to enter the duration, the input mode fills the beats with the previously added note until rest or following note key will be pressed.
You still need to use letters to specify a pitch, but duration is set depending on how long you hold the button. It is like you are playing piano, but playing "keyboard" instead. So, there is a metronome, which counts the rythm. And you press and hold buttons to create a melody.
Difficulty: Hard
Skills: C++/Qt
Possible mentor: anatoly-os
As described here and partially implemented here, the Lyrics Editor would display all lyrics from the score as plaintext in an editable multiline text field. The contents of the text field would be doubly linked with the score, meaning that a change to lyrics in either the score or the Lyrics Editor would be reflected in the other. Users would be able to search for lyrics online and paste them into the lyrics editor, or copy lyrics from the editor to produce lyric booklets for choirs and church services. A more advanced implementation would use a tree view where each lyrics verse is represented by a branch in the tree.
Possible extensions: spell-checking, automatic hyphenation, verse extraction.
Another way to improve palette accessibility (and general usability for all users) is to allow the user to define keyboard shortcuts for individual palette elements. For example, the user might want to press Alt+D to enter a key signature of D major, or Ctrl+T to add a trill, etc. There could be an option to set shortcuts in the context menu that appears when you right-click on a palette. If the user tries to set a shortcut that has already be defined for another palette element then a warning should be displayed. An improved implementation would also check for conflicts with the shortcuts set in the main Preferences dialog. An ideal implementation would allow shortcuts defined anywhere in the program to be dynamically registered with the central list of shortcuts displayed in the main Preferences dialog, so that all shortcuts could be set and unset in one place, and to guarantee that conflicts are avoided (c.f. the Plugin Manager allows the user to define shortcuts to run plugins, but there is no collision detection with shortcuts defined elsewhere).
In some engraving situations, it is useful to apply several commands to a single object. One case like this is if you want to add a end/begin repeat barline. You want to add an end repeat and a start repeat to the same barline. It could be useful to create a framework to allow users to create their own macros stringing more than one command together. A macro can then be applied with a single click or keyboard shortcut.
MuseScore supports the entry of chord symbols like Gm7, C7b9, etc. It has a pretty flexible system for entering the chords, where you can type pretty much a human musician might understand and MuseScore will do its best to understand it as well. However, there are only limited controls for actually displaying the chord symbol. MuseScore provides two preset options - Standard and Jazz - and does not allow you to customize, for instance, how large the "G" should be relative to the "m" or the "7" in Gm7, or how much subscripting should be applied to the "b9" in C7b9. There was some preliminary work done on an editor years ago that could be leveraged in producing a more complete facility. There are also some improvement that could be considered in how chord symbols are handled with respect to transposition, linked parts, fretboard diagrams, capo, Nashville notation, MIDI import, MusicXML, etc.
Text in frames and elsewhere currently allows for some basic formatting options, but lacks many capabilities one would want in order to do any serious text editing, like to create educational materials with significant text between the musical examples. While we would likely not ever compete with word processors, merely implementing word wrap, justification, and a few other controls could go a long ways toward allowing users to create documents completely within MuseScore.
MuseScore provides a number of global controls over page layout - you can set the page size and margins, staff size, control distance between staves, hide empty staves, etc. There are certain overrides possible like staff spacers to change the distance between two staves, and the staff type change element to change certain properties for individual staves mid-score. However, sometimes there is still a need to for more control - override global settings for individual pages, or particular systems. You cannot have the overall staff size or default staff distance slightly smaller on one page than another, or change between percussion and pitched on a single staff, or designate certain systems to not hide empty staves, not fill to the right margin, etc. Also, we provide measure spacing controls per-measure, but no easy way to say "fit the following measures on one system".
This project would involve an investigation of how we might best expose controls like this to the user and then to design and implement the facility.
The two-measure repeat sign with working playback has been one of the most-requested features ever, as is evident by the number of forum requests and length of this issue #10220: Add a two and four measure (multi-measure) repeat sign with playback at 164 replies and going back 8 years. This project would involve coding various multi-measure and related features, like
automatic counting of repeated measures
This project would add Braille music notation to the list of formats available via File > Export. Prior knowledge of Braille music notation is not required as the basic rules are fairly straightforward and can be picked up in the early stages of the project. As with everything, the specifics of Braille music notation do get quite complicated and can even vary from country to country, so the student would not be expected to implement more than basic export functionality. However, the project would seek to identify the main hurdles that a full implementation would have to overcome, and potentially begin to explore solutions to these problems in the code. A secondary objective is to raise accessibility awareness in the developer community, and to leave behind a clear roadmap for future Braille development that would build on the foundations laid in this project.
Having completed single-note dynamics (coming in 3.1, hopefully), I've been thinking about ways we can improve playback.
One thing we could do is to allow the playback of rit. and accel. markings. These would have to be user customisable, for example what tempo to change to and how to interpolate between tempi.
This isn't just limited to these tempo markings, or even just to tempo markings. If you have any other playback improvement ideas, please let me know. I'm sure we can work to implement them as well.
I've worked a lot with playback, so I feel like I could mentor this fairly well :)
The idea is simple. We want to improve guitar players experience, so we want to show guitar griff with 6 strings and visualise the frets on it. See an example in GuitarPro or TuxGuitar: https://www.youtube.com/watch?v=NU_FRFmJ3D4.
As a composer who would like to use the sounds of MuseScore’s native instruments in the final product, I find it underwhelming that some instruments when transposed become indistinguishable or how multiple percussion instruments share the same sound. Improving and diversifying the sound options of these instrument as well as giving users more freedom to playback with their own sounds would expand music styles used.
This can be achieved by a small UI window which can read in sound and give the user controls for previewing the sound when it is modulated.
MuseScore is part of Google Summer of Code (GSoC) 2018! If you are a student and you have aspirations to help improve the open source MuseScore notation software during the summertime, this is a unique opportunity to work together with the MuseScore developers and get paid for it. Learn how GSoC works and read through the student manual
If you are considering applying, we have a list of ideas you can choose from. We'd love if you apply with your own idea. Don’t hesitate to contact the potential mentors from the ideas list via MuseScore's Join GSoC 2018 forum page, via the developer mailing list, or by chatting on IRC (#musescore on freenode.net, but be aware that mentors aren't awake at all hours of the day). We also have a document listing the Steps Toward a Successful Application, make sure to read it!
Don't let yourself be scared off by the knowledge prerequisites; you don’t need to be an expert in all domains, and there is some time for learning within the GSoC period. However, familiarity with Qt/C++ and interest in music and music notation will be helpful. If you still have doubts, read Am I good Enough?
Resources:
We strongly believe that the best proposal for you is the one you'll do. If you have any suggestions, come onto the IRC channel #musescore on freenode.net, or contact us on the developer mailing list. Also check ideas from previous years.
Click the 3 dots button at the top right and "Edit", then copy and paste an idea below and change the text with your new idea for GSoC 2018
MuseScore functionality can be extended by plugins. Discovering the compatible plugins and installing them however is currently a manual job. The goal is to create an App Store-like Plugin Manager from which it is possible to discover, (un-)install, (auto-)update plugins in an easy manner. The Resource Manager currently used to handle language packs could be extended for this purpose, and indeed already has some bare-bones code for plugins.
Since many (a little of 40%) of the current 2.x plugins are available on GitHub; we should consider using their releases-API for those plugins. At the same time, locally installed plugins must still be listed and integrated as well.
Another matter to address is how to know if a plugin is compatible with the current MuseScore version.
MuseScore supports the entry of chord symbols like Gm7, C7b9, etc. It has a pretty flexible system for entering the chords, where you can type pretty much a human musician might understand and MuseScore will do its best to understand it as well. However, there are only limited controls for actually displaying the chord symbol. MuseScore provides two preset options - Standard and Jazz - and does not allow you to customize, for instance, how large the "G" should be relative to the "m" or the "7" in Gm7, or how much subscripting should be applied to the "b9" in C7b9. There was some preliminary work done on an editor years ago that could be leveraged in producing a more complete facility. There are also some improvement that could be considered in how chord symbols are handled with respect to transposition, linked parts, fretboard diagrams, capo, Nashville notation, MIDI import, MusicXML, etc.
MuseScore provides a number of global controls over page layout - you can set the page size and margins, staff size, control distance between staves, hide empty staves, etc. There are certain overrides possible like staff spacers to change the distance between two staves. However, sometimes there is still a need to for more control - override global settings for individual pages, or particular systems. You cannot have the overall staff size or default staff distance slightly smaller on one page than another, or designate certain systems to not hide empty staves, not fill to the right margin, etc. Also we provide measure spacing controls per-measure, but no easy way to say "fit the following measures on one system".
This project would involve an investigation of how we might best expose controls like this to the user and then to design and implement the facility.
Update: Independently of GSoC, a student has build an improved Lyrics Editor implementation which allows 2 way editing. Therefore, the GSoC project would be to take this student's implementation, fix any bugs, and add the missing features, such as spell-checking and hyphen-checking. One idea would be to build an updatable hyphenation dictionary which can be shared between MuseScore's users, much like MuseScore's translations are shared now.
Original description: As described here and partially implemented here, the Lyrics Editor would display all lyrics from the score as plaintext in an editable multiline text field. The contents of the text field would be doubly linked with the score, meaning that a change to lyrics in either the score or the Lyrics Editor would be reflected in the other. Users would be able to search for lyrics online and paste them into the lyrics editor, or copy lyrics from the editor to produce lyric booklets for choirs and church services.
Possible extensions: spell-checking, automatic hyphenation, verse extraction.
This idea is bit open-ended, but the general desire is to facilitate musical transcription from audio with musescore. Considering that there is already a lot of prior knowledge on Automatic music transcription, it might make sense to focus on integrating with external tools rather than reinvent the wheel. Sonic Visualizer is a particularly powerful open source desktop application which has all sorts of methods to visualize the waveform. In particular it has a Peak Frequency Spectogram view mode, which is useful for visually identiying notes and creating them on the midi layer. Sonic Visualizer also can interface with "Vamp plugins" to do all sorts of analysis, in particlar there are a few which can help convert the audio into midi. It would be useful to interface Vamp plugins or Sonic Visualizer into musescore, so could see notation along with the analyzed midi and spectogram. And there is a standalone command line tool aubio that can detect note onset and interface with jack. But probably would need manual assistance for converting the messy analyzed midi into something that looks nice in musescore...might need to identifying things like time signatures and tempo changes and isolating instruments & voices. In addition to dealing with an entire file of pre-recorded music, it would be nice to be able to sing or play on a non-midi instrument in the middle of score writing and have an easy way to input that analyzed midi into the score, synced to the time sig and beat.
And rather than complete auto-transcribe, another approach is just an transcribe assistant, similar to the proprietary program Transcribe! but something that can interace or be incorporated maybe as a plugin into MuseScore. Would be useful would be to display the Constant-Q Transform of audio as the background for the piano-roll editor, that way can visually verify if notes in musescore match frequencies in the audio.
Aside: there is also a proprietary program AnthemScore which converts audio into MusicXML via a Convolutional Neural Networks described here which operates on entire file at a time, but since it is not open source it would be probably be hard to integrate into musescore. It also takes several minutes on a Quad-core machine to analyse, and it doesn't seem to handle tempo and time sig changes well (although pitch detection is almost spot on), and puts all note onto a single grandstaff.
Anyway maybe another approach is to simply focus on making musescore midi file input be much more smarter to be able to identify time sig changes, tempo changes, breaths/pauses, rubato, etc.
Sorry this is a bit rambling, but maybe there is a specific project description along any of these lines.
Additional note for 2018: the ability to interface musescore with other MIDI and audio programs by sharing data somehow in realtime might actually be an entire project in itself. Might require integrating or creating a standard API specfically for that, which other program could easily incorporate. Be aware, such an interface is more involved than what I can describe here, primarily because notation is a separate animal to MIDI and audio, but I'm suggesting this here incase some people have good ideas. If done smartly it could allow things like the ability to record MIDI into an DAW (or even record audio into a SonicVisualizer or a transcribe assitant) and then see a simplified notational representation in MuseScore while preserving the link between MuseScore's notational elements and the other program's MIDI or audio regions such that subsequent edits in either program would be reflected somehow in the linked program.
MuseScore is very powerful software, but having so many features, the user interface is pretty overwhelming. This is particularly true for younger users - MuseScore is often used in schools with students as young as 5-10 years old.
We already provide some facilities that could be leveraged to produce more beginner-friendly "skins" on the UI - customizable palettes, icon size settings, etc. This project would involve adding some more UI customization facilities and then implementing one or more presets (akin to the current Basic and Advanced workspaces for palettes) to make the interface more beginner-friendly.
Other aspects of this project could include adding more on-screen help - remember "Mr Clippy" from earlier versions of Microsoft Word?
Often in the forums we hear people express the desire for a "scratch pad" mode, where a section of music could be edited in a way you to change note durations and have some number of subsequent notes automatically move to compensate. This would allow deleting a note to fix a mistake that was not noticed until other notes were entered, also it would allow one to enter notes first as pitches only then go back and figure out the rhythms. It could also be used to set up a meterless score.
This project would involve designing and implementing such a facility. One idea is to allow the user to select a region (default might be cursor position to end of measure, or end of score), hit a key/button, and have that section loaded into a separate scratch pad (maybe displayed as a dialog) that you could then play around with as desired. When done, you hit another key/button and the music is copied back to the score, replacing what was there originally. Lots of details to work out here, but there does seem to be some good general buy-in on that type of model.
Last year, MuseScore started a collaboration with Audiveris, one of the very few full featured open source OMR software, to create a dataset of musical elements including some "real life" context around them. See https://github.com/Audiveris/omr-dataset-tools for more information about the format required. The work started in a branch based on MuseScore 2.1: https://github.com/musescore/MuseScore/tree/imeta
Completing this task and porting it to the master will enable the creation of a huge dataset of annotated music symbols in context. It would be used by Audiveris but also by other OMR academical projects.
A frequent request is for a way to compare two versions of a score side-by-side, with the differences highlighted to make it easy to see what has changed. Such tools are common for text-based formats, but are difficult to achieve for sheet music due to the visual nature of music notation. However, MuseScore's MSCX files are text-based representations of sheet music, which people can (and do) use with textual diff tools and version control systems like git. Unfortunately, the MSCX format is not optimised for use with these tools, so minor changes to a score (such as deleting a single tie) can result in a large diff being generated. The situation with textual diffs can be improved significantly by making a few simple changes to the MSCX format. The diff information can then be presented in a user-friendly way within MuseScore in the form of a list of elements that have been added, removed, or modified. It is likely improving the situation with textual diffs will make the task of building a visual diff system significantly easier, and the project could begin to explore this area if time allows.
Make significant improvements by implementing a few common feature requests and tackling some relatively low-hanging fruit on the issue tracker. A few suggestions:
Implementing these would improve playback, notation, layout, and import/export with other programs. These changes would be highly visible and benefit all of MuseScore's users.
What to do if you have been accepted as a student for Google Summer of Code 2018?
Suggested sections for the status report are:
Weekly status reports are obligatory, if you fail to provide them, it can be a reason for not passing evaluation for Google.
All your technical questions should go through the forum or IRC. If you need user feedback, or have questions related to MuseScore usage, use the forum or IRC.
We're an open community so unless you have a good reason, all communication should be public. Ask on IRC or on the mailing list unless you have a good reason to ask directly your mentor. If you are going to use IRC, stick around until you get an answer -- your mentor (or anyone else) may be sleeping, working, or away when you first ask but may respond when they return.
All new functionality you create should be documented and tested. The documentation and tests should be done as you code—do not wait until the last moment.
Hopefully, your involvement with MuseScore will continue after GSoC!
This page is licensed under GNU GPLv2 and largely inspired by PhpMyAdmin's one
Update: Google Summer of Code 2017 is over. Read about an intermediate state of GSoC 2017 (a final report hasn't been written).
MuseScore is part of Google Summer of Code (GSoC) 2017! If you are a student and you have aspirations to help improve the open source MuseScore notation software during the summertime, this is a unique opportunity to work together with the MuseScore developers and get paid for it. Learn how GSoC works and read through the student manual
If you are considering applying, we have a list of ideas you can choose from. We'd love if you apply with your own idea. Don’t hesitate to contact the potential mentors from the ideas list or contact us via IRC (#musescore on freenode.net), via the developer mailing list. We also have a document listing the Steps Toward a Successful Application, make sure to read it!
Don't let yourself be scared off by the knowledge prerequisites; you don’t need to be an expert in all domains, and there is some time for learning within the GSoC period. However, familiarity with Qt/C++ and interest in music and music notation will be helpful. If you still have doubts, read Am I good Enough?
Resources:
What to do if you have been accepted as a student for Google Summer of Code 2017?
Suggested sections for the status report are:
Weekly status reports are obligatory, if you fail to provide them, it can be a reason for not passing evaluation for Google.
All your technical questions should go through this mailing list or IRC. If you need user feedback, or have questions related to MuseScore usage, use the forum or IRC.
We're an open community so unless you have a good reason, all communication should be public. Ask on IRC or on the mailing list unless you have a good reason to ask directly your mentor. If you are going to use IRC, stick around until you get an answer -- your mentor (or anyone else) may be sleeping, working, or away when you first ask but may respond when they return.
All new functionality you create should be documented and tested. The documentation and tests should be done as you code—do not wait until the last moment.
Hopefully, your involvement with MuseScore will continue after GSoC!
This page is licensed under GNU GPLv2 and largely inspired by PhpMyAdmin's one
We strongly believe that the best proposal for you is the one you'll do. If you have any suggestions, come onto the IRC channel #musescore on freenode.net, or contact us on the developer mailing list. Also check ideas from previous years.
Click "Edit" above, then copy and paste an idea below and change the text with your new idea for GSoC 2017
MuseScore currently doesn't have any crash reporting facility. It would make the job of developers a lot easier if we could gather crash logs in a web interface. The first target would be Windows but the crash reporting system should be cross platform. MuseScore's development infrastructure would need to be updated accordingly.
We could use the Google Breakpad project as a basis, also check Crashpad since breakpad has problem on OSX (Chromium uses crashpad).
Breakpad is only part of a crash reporting system, and it doesn't offer a reporting mechanism or a client UI (only has manual tools for decoding crash dumps on Linux). For a server, see Mozilla's Socorro (Python) or Atom's mini breakpad server (Nodejs).
Other interesting resources:
Difficulty: Medium to high
When a score is growing, it's sometimes hard to know where you are located in the score, which part you worked on already etc... The idea would be to create a new panel, potentially to replace the navigator, which gives an abstract view of the score, showing squares for each measure on each instrument, with a different color if the measure is empty or not. Potentially, having one row for rehearsal mark, for tempo markings, time signatures, key signatures etc...
Many shortcuts in MuseScore do have conflicts due to different international keyboard layouts. Example of such a conflict can be found with the French keyboard. To solve this problem, MuseScore needs a system which can detect the client keyboard layout and auto select the appropriate shortcut list. The developer challenge is to make this work for all international keyboard and if needed create for each of them a custom shortcut list. Additional challenges are the differences between Mac OS X and Windows/Linux. See #47361: [Mac OS X] Insert measure keyboard shortcut doesn't exist More related issue: * http://musescore.org/en/node/48846
MuseScore functionality can be extended by plugins. Discovering the compatible plugins and installing them however is currently a manual job. The goal is to create an App Store-like Plugin Manager from which it is possible to discover, (un-)install, (auto-)update plugins in an easy manner. The Resource Manager currently used to handle language packs could be extended for this purpose, and indeed already has some bare-bones code for plugins.
Since many (a little of 40%) of the current 2.x plugins are available on GitHub; we should consider using their releases-API for those plugins. At the same time, locally installed plugins must still be listed and integrated as well.
Another matter to address is how to know if a plugin is compatible with the current MuseScore version.
MuseScore supports the entry of chord symbols like Gm7, C7b9, etc. It has a pretty flexible system for entering the chords, where you can type pretty much a human musician might understand and MuseScore will do its best to understand it as well. However, there are only limited controls for actually displaying the chord symbol. MuseScore provides two preset options - Standard and Jazz - and does not allow you to customize, for instance, how large the "G" should be relative to the "m" or the "7" in Gm7, or how much subscripting should be applied to the "b9" in C7b9. There was some preliminary work done on an editor years ago that could be leveraged in producing a more complete facility. There are also some improvement that could be considered in how chord symbols are handled with respect to transposition, linked parts, fretboard diagrams, capo, Nashville notation, MIDI import, MusicXML, etc.
MuseScore provides a number of global controls over page layout - you can set the page size and margins, staff size, control distance between staves, hide empty staves, etc. There are certain overrides possible like staff spacers to change the distance between two staves. However, sometimes there is still a need to for more control - override global settings for individual pages, or particular systems. You cannot have the overall staff size or default staff distance slightly smaller on one page than another, or designate certain systems to not hide empty staves, etc. This project would involve an investigation of how we might best expose controls like this to the user and then to design and implement the facility.
Largely as a result of work done in a previous GSoC, MuseScore can be used to some extent by blind users via keyboard control and screenreader feedback. See https://musescore.org/en/node/37476 for more information on what is currently possible. Mostly, one can navigate existing scores; most of the editing facilities still require use of a mouse which is not an option for blind users. There is still a lot of work that needs to be done before blind users can take full advantage of MuseScore. These include making the palettes fully keyboard accessible, also making it possible to access all score elements (including text, articulations, and other markings) via keyboard only. These enhancements will also benefit sighted users who prefer the keyboard for efficiency.
As described here and partially implemented here, the Lyrics Editor would display all lyrics from the score as plaintext in an editable multiline text field. The contents of the text field would be doubly linked with the score, meaning that a change to lyrics in either the score or the Lyrics Editor would be reflected in the other. Users would be able to search for lyrics online and paste them into the lyrics editor, or copy lyrics from the editor to produce lyric booklets for choirs and church services.
Possible extensions: spell-checking, automatic hyphenation, verse extraction.
This idea is bit open-ended, but the general desire is to facilitate musical transcription from audio with musescore. Considering that there is already a lot of prior knowledge on Automatic music transcription, it might make sense to focus on integrating with external tools rather than reinvent the wheel. Sonic Visualizer is a particularly powerful open source desktop application which has all sorts of methods to visualize the waveform. In particular it has a Peak Frequency Spectogram view mode, which is useful for visually identiying notes and creating them on the midi layer. Sonic Visualizer also can interface with "Vamp plugins" to do all sorts of analysis, in particlar there are a few which can help convert the audio into midi. It would be useful to interface Vamp plugins or Sonic Visualizer into musescore, so could see notation along with the analyzed midi and spectogram. And there is a standalone command line tool aubio that can detect note onset and interface with jack. But probably would need manual assistance for converting the messy analyzed midi into something that looks nice in musescore...might need to identifying things like time signatures and tempo changes and isolating instruments & voices. In addition to dealing with an entire file of pre-recorded music, it would be nice to be able to sing or play on a non-midi instrument in the middle of score writing and have an easy way to input that analyzed midi into the score, synced to the time sig and beat.
And rather than complete auto-transcribe, another approach is just an transcribe assistant, similar to the proprietary program Transcribe! but something that can interace or be incorporated maybe as a plugin into MuseScore. Would be useful would be to display the Constant-Q Transform of audio as the background for the piano-roll editor, that way can visually verify if notes in musescore match frequencies in the audio.
Aside: there is also a proprietary program AnthemScore which converts audio into MusicXML via a Convolutional Neural Networks described here which operates on entire file at a time, but since it is not open source it would be probably be hard to integrate into musescore. It also takes several minutes on a Quad-core machine to analyse, and it doesn't seem to handle tempo and time sig changes well (although pitch detection is almost spot on), and puts all note onto a single grandstaff.
Anyway maybe another approach is to simply focus on making musescore midi file input be much more smarter to be able to identify time sig changes, tempo changes, breaths/pauses, rubato, etc.
Sorry this is a bit rambling, but maybe there is a specific project description along any of these lines.
The timeline was developed as part of the Google Summer of Code 2017. It was developed to be implemented in the next major release which is expected to be called MuseScore 3.0.
The timeline is a navigation tool that displays an abstraction of the score to the order of measure numbers and instrument names. There are four parts to the timeline:
This is found in the top left corner of the timeline. These are the names of the meta rows.
This is found in the bottom left corner of the timeline. These are the names of the rows in the main grid.
This is found in the top right corner of the timeline. These hold the meta values of the score.
This is found in the bottom right corner of the timeline. This holds multiple 'cells' (a specific measure and staff in the score represented as a square)
Meta are elements found on the score that are not notes, but are still important to the score (key signature, time signature, tempo, rehearsal marks, bar lines, and jumps and markers).
To select a measure in the timeline, press the mouse button on the cell. A blue box will appear around the selected cell and the respective measure in the score will be selected. The score view will place the selected measure in view.
Holding [Shift] and holding the left mouse button and dragging the mouse over the main grid will create a selection box. Upon releasing the mouse button, all the cells underneath the selection box will be selected, as well as all the measures in the score.
If a cell is already selected, holding [shift] and selecting another cell in the timeline will stretch the selection to that new cell, similar to how the score does
If no cells are currently selected, holding [Ctrl] and selecting a cell will select the entire measure
To clear selection, holding [Ctrl] and clicking anywhere on the grid or the meta rows will clear any current selection.
Selecting the meta values on the timeline will attempt to select the respective meta values in the score.
Scrolling the mouse wheel up or down will move the grid and instrument labels down or up respectively. The meta labels and rows do not move.
Holding [Shift] and scrolling the mouse wheel up or down will move the grid and meta rows left or right respectively. The meta labels and instrument labels do not move.
Holding [Alt] and scrolling the mouse wheel up or down will move the grid and meta rows left or right respectively, faster than [Shift] scrolling. The meta labels and instrument labels do not move.
To drag the contents of the timeline, hold the left mouse button and move it around.
All meta labels besides the measures meta may be rearranged in any way. By moving the mouse cursor onto one of the meta labels, small up and down arrows will appear. Click the left mouse button on the up arrow to swap the meta label with the one above it. Click the left mouse button on the down arrow to swap the meta label with the one below it.
In order to hide all the meta labels while keeping all the meta information on the timeline, there is an arrow that appears on the measures meta when the mouse is over it. Click the left mouse button on the large up arrow to collapse all the currently visible meta rows into one row, where the meta values are staggered in that row. Click the left mouse button on the large down arrow to expand the meta rows again.
All instruments--hidden or not--will be displayed on the timeline. To start this interaction, the mouse cursor is moved over an instrument label. A small eye will appear on the right side of the label that is open if the instrument is visible on the score, and closed if the instrument is hidden. Click the left mouse button on the eye to toggle between the two options.
To zoom in or out of the score, hold [Ctrl] and scroll the mouse wheel up or down respectively.
To bring up a context menu, right click on the timeline. There are three context menus found in these locations: meta labels, instrument labels, and meta rows.
Upon clicking the right mouse button on the meta labels, a context menu appears that displays all possible meta labels as well as two options: "Hide all" and "Show all." Next to each meta label in the menu, there is a check box that shows if the meta label is currently being shown on the timeline. To show or hide one of the meta labels, select the box of the meta label in the context menu. Selecting "Hide all" will hide all meta labels except for the measures meta. Selecting "Show all" will display all meta labels.
Clicking the right mouse button on the meta rows will display the same context menu as the meta labels.
Clicking the right mouse button on the instrument labels will display a context menu with the option to "Edit Instruments." Selecting this will bring you to the same dialog as Edit->Instruments... or pressing 'I' for the shortcut.
Attachment | Size |
---|---|
handbooktimeline.PNG | 16.26 KB |
collapsedmetahandbook.PNG | 4.61 KB |
hiddeninstrumenthandbook.PNG | 12.82 KB |
Update: Google Summer of Code 2016 is over. Read all about the results of GSoC 2016.
MuseScore is part of Google Summer of Code (GSoC) 2016!
Applications are now over and Google announced the selected students. MuseScore has 4 students.
Johannes Wegener (hpfmn) will improve the default playback of MuseScore by updating our SF2 synthesizer (Fluidsynth) and improving our new SFZ synthesizer (Zerberus). Goals are updating fluidsynth to include features and fixes that went into upstream since the fork, adding legato support to fluidsynth (likely via Midi CC68), adding midi CC11 support to midi rendering (for rendering single note/chord (de)crescendo) and overall add a lot more opcodes to zerberus (mainly looping support and ADSR). Johannes will be mentored by Werner Schweer (wschweer).
Johannes' fork of MuseScore on GitHub: https://github.com/hpfmn/MuseScore
Johannes' blog for GSoC 2016: https://musescore.org/en/user/527826/blog/
Peter Jonas (shoogle) will implement a new method of entering notes into MuseScore via computer/MIDI keyboard that is more natural to musicians than the existing “step-time” method. The new method will allow the user to play the piece into the computer as though they were giving a live performance, with additional steps taken to ensure the accuracy of the resulting notation. This should make the process of entering notes significantly faster. Peter will be mentored by Nicolas Froment (lasconic).
Peter's fork of MuseScore on GitHub: https://github.com/shoogle/MuseScore
Peter's blog for GSoC 2016: https://musescore.org/en/user/57401/blog
Ruchit Agrawal (shredpub) will add tools to enable annotations within a score in MuseScore. These annotations could be textual or graphical, and would be very helpful in music education settings as well as for practice purposes. His will be mentored by Marc Sabatella.
Ruchit's fork of MuseScore on GitHub: https://github.com/shredpub/MuseScore
Ruchit's blog for GSoC 2016: https://musescore.org/en/user/61850/blog
Felix Brauchle (fbrauchle) will extend the existing tools for implode/explode and add the ability to create parts for voices. He will be mentored by Joachim ‘Jojo’ Schmitz (Jojo-Schmitz).
Felix's fork of MuseScore on GitHub: https://github.com/Rockettwo/MuseScore
Felix's blog for GSoC 2016: https://musescore.org/en/user/124871/blog/
Resources:
* GSoC 2016 official website
* GSoC Student Guide
* MuseScore developer handbook
* IRC (#musescore on freenode.net)
* developer mailing list
We strongly believe that the best proposal for you is the one you'll do. If you have any suggestions, come onto the IRC channel #musescore on freenode.net, or contact us on the developer mailing list. Also check ideas from previous years.
Copy paste an idea below and change the text with your new idea for GSoC 2016
MuseScore currently doesn't have any crash reporting facility. It would make the job of developers a lot easier if we could gather crash logs in a web interface. The first target would be Windows but the crash reporting system should be cross platform. MuseScore's development infrastructure would need to be updated accordingly.
We could use the Google Breakpad project as a basis. Breakpad is only part of a crash reporting system, and it doesn't offer a reporting mechanism or a client UI. For a server, see Mozilla's Socorro (Python) or Atom's mini breakpad server (Nodejs).
Other interesting resources
* Qt and breakpad dev notes
* libcrashreporter-qt as used by Tomahawk player.
*
When a score is growing, it's sometimes hard to know where you are located in the score, which part you worked on already etc... The idea would be to create a new panel, potentially to replace the navigator, which gives an abstract view of the score, showing squares for each measure on each instrument, with a different color if the measure is empty or not. Potentially, having one row for rehearsal mark, for tempo markings, time signatures, key signatures etc...
Several users have requested a virtual singer in MuseScore. This feature would make MuseScore sing the lyrics in a score. It's useful for singers in choirs who like to rehearse with actual synthesized lyrics. There are several specialized (open source) software projects and libraries which do "sing synthesis".
An external tool that could process a MIDI, or MusicXML file created by MuseScore and make an audio file would be good for singers to practise along.
MuseScore 2.0 now saves a thumbnail of the first page in the MSCZ file. A plugin for the different OS file explorer (Windows, Mac OS X, others) could display this thumbnail, and maybe other metadata. See https://musescore.org/en/node/57886#comment-419951 for discussion.
Many users use MuseScore to transcribe scores from paper. This project would be about aiding this use case by providing a side-by-side view of the digital score and a scanned score. A very limited implementation of this project (see screencast) has already been coded (see github) but much more work is needed to make it ready for general usage.
Many shortcuts in MuseScore do have conflicts due to different international keyboard layouts. Example of such a conflict can be found with the French keyboard. To solve this problem, MuseScore needs a system which can detect the client keyboard layout and auto select the appropriate shortcut list. The developer challenge is to make this work for all international keyboard and if needed create for each of them a custom shortcut list. Additional challenges are the differences between Mac OS X and Windows/Linux. See #47361: [Mac OS X] Insert measure keyboard shortcut doesn't exist More related issue: * http://musescore.org/en/node/48846
It's currently possible to add chord symbols on top of a staff in MuseScore. These symbols are ignored on playback. It's a frequent feature request to be able to realize these chord symbols as notes in a staff or to optionally "play" the symbols while listening the score. A simple implementation would just play the chord for the whole duration of the measure or until the next chord symbols.
In an orchestral arrangement, it's common to save to save space in the score by combining multiple parts onto one staff. When it comes time to extract the parts, we would like to be able to extract separate parts for first and second horn as a courtesy to the players, as the separate lines get a little tangled on a single staff. See https://musescore.org/en/node/89736.
Finale uses a complex system in the part extraction process to support this. We could take that route, or might achieve it just as well by improving layout when voices are made invisible (https://musescore.org/en/node/89736#comment-396896).
Thanks in large part to work done as part of GSoC 2014, we have made significant progress in making the MuseScore interface usable by blind musicians as well as those with limited mobility. There is still much work to be done, however. Currently, a user can browse a score and hear the screenreader recite the names of the various score elements (notes, rest, barlines, etc), but actually editing the score still requires one to be able to see the score and use a mouse in order to click elements and operate the palettes. Having a freely available notation program that is fully keyboard accessible could be life changing for blind musicians. There is also the possibility of creating Braille music output, probably through integration with existing tools that can convert from MusicXML to Braille music.
This is kind of linked to Accessibility. The MuseScore palette has grown in the past versions. It would be very useful to be able to filter elements in the palettes or to search and hightlight them. If the search/filter capability is well designed, it could make it easier to add some elements to the score with the keyboard.
A possible design:
* Add a filter text field in the palette
* Add a shortcut to focus on this text field when a note is selected
* Enter "Fermata", the palette is filtered and only a couple of fermatas are displayed
* Use tab (or another shortcut) to go through the fermata
* Use Return (or another shortcut to enter the fermata)
* Use Esc (or another shortcut) to unfilter the palette and give the focus back to the score.
Educators and others often like the add markings to a score such as comments or grades. They may also wish to highlight or circle specific passages of music. We could add one or more new element types to MuseScore to create text or shapes that can be attached to individual notes or to score ranges, and a user interface to create these elements. We would also want a way to easily show or hide annotations, possibly by integrating with an existing experimental Layers facility.
See https://musescore.org/en/node/88986 for further discussion.
MuseScore currently doesn't provide any way to change the duration of many notes at once. It would be great to have a way to double or half all the durations in a selection. Depending on the student's skills, we could also implement the ability to change all half notes to quarter notes in a selection and provide more options. This might seem like a simple task but in MuseScore, measures have to be full, and MuseScore supports nested tuplets...
See https://musescore.org/en/node/72801 for further discussion.
What to do if you have been accepted as a student for Google Summer of Code 2016?
Suggested sections for the status report are:
Weekly status reports are obligatory, if you fail to provide them, it can be a reason for not passing evaluation for Google.
All your technical questions should go through this mailing list or IRC. If you need user feedback, or have questions related to MuseScore usage, use the forum or IRC.
We're an open community so unless you have a good reason, all communication should be public. Ask on IRC or on the mailing list unless you have a good reason to ask directly your mentor. If you are going to use IRC, stick around until you get an answer -- your mentor (or anyone else) may be sleeping, working, or away when you first ask but may respond when they return.
All new functionality you create should be documented and tested. The documentation and tests should be done as you code, do not keep it on last moment.
Hopefully, your involvement with MuseScore will continue after GSoC!
This page is licensed under GNU GPLv2 and largely inspired by PhpMyAdmin's one
Update March 2nd: Unfortunately MuseScore was not accepted for the 2015 edition of GSoC. We'll try again next year!
We strongly believe that the best proposal for you is the one you'll do. If you have any suggestions, come onto the IRC channel #musescore on freenode.net, or contact us on the developer mailing list.
Also check ideas from previous years
Copy paste an idea below and change the text with your new idea for GSoC 2015
Several users have requested a virtual singer in MuseScore. This feature would make MuseScore sing the lyrics in a score. It's useful for singers in choirs who like to rehearse with actual synthesized lyrics.
There are several specialized (open source) software projects and libraries which do "sing synthesis".
An external tool that could process a MIDI, or MusicXML file created by MuseScore and make an audio file would be good for singers to practise along.
MuseScore 2.0 now saves a thumbnail of the first page in the MSCZ file. A plugin for the different OS file explorer (Windows, Mac OS X, others) could use this thumbnail and maybe other metadata to make the display of scores better looking.
Learning how to use MuseScore can be pretty challenging. A way to lower the barrier is by adding a context-sensitive help system which works in two ways. One way is to directly obtain explanatory information about any widget you come across in the UI. The other way is to perform a keyword search which directly jumps you straight where you need to be in the UI. Mac OS offers a Spotlight For Help search field,, but not only does this need to work for all platforms and it also needs to work for the menu, toolbars, popup and docked windows and the palette.
Many users use MuseScore to transcribe scores from paper. This project would be about aiding this use case by providing a side-by-side view of the digital score and a scanned score. A very limited implementation of this project (see screencast) has already been coded (see github) but much more work is needed to make it ready for general usage.
When a score is growing, it's sometimes hard to know where you are located in the score, which part you worked on already etc... The idea would be to create a new panel, potentially to replace the navigator, which gives an abstract view of the score, showing squares for each measure on each instrument, with a different color if the measure is empty or not. Potentially, having one row for rehearsal mark, for tempo markings, time signatures, key signatures etc...
Many shortcuts in MuseScore do have conflicts due to different international keyboard layouts. Example of such a conflict can be found with the French keyboard. To solve this problem, MuseScore needs a system which can detect the client keyboard layout and auto select the appropriate shortcut list. The developer challenge is to make this work for all international keyboard and if needed create for each of them a custom shortcut list. Additional challenges are the differences between Mac OS X and Windows/Linux. See #47361: [Mac OS X] Insert measure keyboard shortcut doesn't exist
More related issue:
* http://musescore.org/en/node/48846
It's currently possible to add chord symbols on top of a staff in MuseScore. These symbols are ignored on playback. It's a frequent feature request to be able to realize these chord symbols as notes in a staff or to optionally "play" the symbols while listening the score. A simple implementation would just play the chord for the whole duration of the measure or until the next chord symbols.
MuseScore has been selected for Google Summer of Code 2014 and has been allocated five students to work on
Read all about the results of GSoC 2014.
We strongly believe that the best proposal for you is the one you'll do. If you have any suggestions, come on IRC channel #musescore on freenode.net, or contact us on the developer mailing list.
Also check ideas from previous years: http://musescore.org/en/developers-handbook/google-summer-code
Blind musicians wishing to create scores in standard notation currently have very few options, since most notation software is not designed with accessibility in mind. It can also be difficult for blind or visually impaired musicians to obtain scores in Braille or other "accessible" formats (large print editions, electronic formats that read scores aloud, etc). MuseScore could be a revolutionary tool in the community of blind musicians if it were enhanced to address these concerns.
Some of the areas that need work:
Some of these are relatively easy, others much more difficult. The whole job is very big, but implementing even portions of this could change the lives of many blind musicians.
For more on this topic, see the Accessible Music Notation Project site, and the MuseScore Accessibility document in particular.
Difficulty: Easy to Hard
Skills: C++/Qt
Possible mentor: Marc Sabatella
Guitar Pro is a very popular software to create tablature. There are a lot of Guitar Pro files on the web. MuseScore 2.0 will be able to create tablature and has minimal support for Guitar Pro 3, 4 and 5 files. There is no support for Guitar Pro 6 format.
Importing these file formats will make available hundreds of thousands arrangements to MuseScore users. They would be able to play and edit them. No other free and open source tool support the 4 formats.
Some of the areas that need work:
Difficulty: Easy to Medium
Skills: C++/Qt
Possible mentor: Nicolas Froment (@lasconic) / Maurizio A. Gavioli (@Miwarre)
Several users requested a virtual singer in MuseScore. This feature would make MuseScore sing the lyrics in a score. It's useful for singers in choir who likes to rehearse with actual synthesized lyrics.
There are several specialized (open source) software projects and libraries which do "sing synthesis".
An external tool that could process a MIDI or MusicXML file created by MuseScore and make an audio file would be good for singers to practise along.
Difficulty: Hard
Skills: C++/Qt
Possible mentor: Nicolas Froment (@lasconic)
Hyphenation is really simple in Spanish (and might be a good starting point), but it is really hyphenation checking in English that is the most valuable (since very few English speakers know how to hyphenate in English).
Hyphenation for lyrics (in English) isn't straight forward. There are plenty of hyphenation algorithms used in desktop publishing and LaTeX but they don't work for lyrics since they disallow one-letter syllables (which is the right choice for end-of-line hyphens but not correct for lyric hyphens, which divide every syllable regardless of letter length). A solution could be to to look up the hyphenation of every word in an English dictionary.
Spell checking lyrics also takes some work beyond simply hooking up a spellchecker. For example "ed-i-tor-in-chief" should pass spellcheck as "editor-in-chief". You have to preserve some hyphens and drop others before the spellchecker recognizes the word.
Ideally these proofing tools would mark up the score directly (with zig-zag underlines, etc.)
Difficulty: Medium
Skills: C++/Qt
Possible mentor: David Bolton
MuseScore currently allows you to select regions and then copy, cut, paste, or delete the contents of that selection. However, the user has no control over which elements within the region are affected. So you cannot choose to copy only the notes but not the lyrics, or only the dynamics, hairpins, and breath markings but not the notes, etc. Other programs provide dialog boxes that allow you to control which element types are affected by operations on that selection. MuseScore could be extended to do this as well.
Difficulty: Easy
Skills: C++/Qt
Possible mentor: Marc Sabatella
MuseScore currently provides a plugin to convert an existing passage into slash notation, but this approach is limited in a number of ways. MuseScore also allows you to specific the transposition for a staff, or to make a staff invisible, or specify the number of staff lines, but these properties are global for the staff throughout the score.
What is desired is to be able to select a region and then specify an alternate notation style for that region - slash notation, a different transposition, different number of staff lines, etc. This involves both defining a UI and mechanism for specifying what you want, as well as actually implementing native support for slash notation and perhaps other notation styles.
Difficulty: Easy to Medium
Skills: C++/Qt
Possible mentor: Marc Sabatella
What to do if you have been accepted as a student for Google Summer of Code 2014?
Suggested sections for the status report are:
Weekly status reports are obligatory, if you fail to provide them, it can be a reason for not passing evaluation for Google.
All your technical questions should go through this mailing list or IRC. If you need user feedback, or have questions related to MuseScore usage, use the forum or IRC.
We're an open community so unless you have a good reason, all communication should be public.
Ask on IRC or on the mailing list unless you have a good reason to ask directly your mentor.
If you are going to use IRC, stick around until you get an answer -- your mentor (or anyone else) may be sleeping, working, or away when you first ask but may respond when they return.
All new functionality you create should be documented and tested.
The documentation and tests should be done as you code, do not keep it on last moment.
Hopefully, your involvement with MuseScore will continue after GSoC!
This page is licensed under GNU GPLv2 and largely inspired by PhpMyAdmin's one
When we talk about music score editors, one of the most notable aspects is the fact that very few of them are designed with accessibility in mind, or scarcely do they provide support for it. If they indeed meet this need, most of them are quite expensive. This leaves blind or visually impaired musicians who wish to create scores in standard notation with very few options.
This project aims to add the necessary support for assistive technologies that visually impaired musicians use in order to create a mental picture of the interface. Also, I will make all the menus, buttons and paletts accessible by keyboard, from which will benefit not only blind musicians, but also the average or "power" users who want to use MuseScore efficiently.
Andrei Tuicu
Full Proposal: https://www.dropbox.com/s/c4ndm842u201j9w/AndreiTuicu_Proposal_MuseScor…
My Blog: http://andreituicu.wordpress.com/
GitHub: https://github.com/andreituicu/MuseScore
JACK Audio Connection Kit is a professional sound server daemon that provides real-time, low latency connections for both audio and MIDI data between applications that implement its API.
This is a great feature that gives an ability to connect with lots of synthesizers and Digital Audio Workstations. It is possible now to route MIDI and Audio signals, to do a real-time sound effects processing and a lot of other cool things.
Here is a list of features I've implemented while participating the GSoC 2014:
Also, there were a lot of bug fixes, related and not related to JACK, improvements of UI, code optimisations and other things.
Maxim Grishin (igevorse)
My blog: http://igevorse.lited.net/
Github page: https://github.com/Igevorse/MuseScore
MuseScore 1.3 has minimal support for Swing Playback. However, MuseScore 2.0 has no such feature. The user can only hear his score in straight. Improvements we would like to implement are:
Ability to set the swing ratio, adding swing texts specifying the swing for different parts of the score, and saving the score in swing.
This way, we would like to enable full fledged Swing Playback support for MuseScore 2.0 as part of this project. This will be a great delight for all those jazz musicians using MuseScore looking for an option to listen to their score in swing.
My blog: https://shredpub.wordpress.com
Github page: https://github.com/shredpub/MuseScore
Cheers.
Ruchit Agrawal (shredpub)
MuseScore was selected for Google Summer of Code 2013 and was allocated two students to work on:
Read all about the results of GSoC 2013.
We strongly believe that the best proposal for you is the one you'll do. If you have any suggestions, come on IRC channel #musescore, or contact us on the developer mailing list. To officially apply your summer project idea, follow this link.
Also check ideas from previous years: http://musescore.org/en/developers-handbook/google-summer-code
Port a part of MuseScore to Native Client (NaCl). There are already some experiment with Qt and NaCl. It would mean the ability to display, play, transpose sheet music in the browser without any plugin.
Difficulty: Hard
Skills: C++/Qt/QML/NaCl/Chromium
Possible mentor: lasconic
Student: Apply here
Port a part of MuseScore to Javascript using a language translation tool such as Emscripten. The goal could be to display and transpose a MSCZ file in the browser. Emscripten-Qt is a good start.
Difficulty: Hard
Skills: C++/Qt/Emscripten/LLVM/Javascript
Possible mentor: lasconic
Student: Apply here
MuseScore is highly customizable. Users can change soundfonts, add plugins, define workspaces, templates, palettes, languages etc... What if there would be an easy way to share all these resources in the cloud and a one click way to install/uninstall them in MuseScore.
Some resources to check OCS, Attica client library, KDE Bodega...
Difficulty: Medium
Skills: PHP/C++/Qt
Possible mentor: lasconic
Student: Apply here
Jianpu notation/Numbered musical notation is widely used in China. A large amount of Chinese music is recorded in Jianpu and most Chinese people are more familiar with Jianpu than standard staff scores. But there are relatively limited software for editing Jianpu and they have obvious disadvantages. In sum, there's a need for high quality Jianpu notation software. For more information: Here.
Difficulty: Hard
Skills: C++/Qt
Student: Eli Yang
Possible mentor: lasconic, Rui Fan (aka Vanferry)
MuseScore currently imports MIDI files quite badly. There are many areas in which MIDI import could be improved and most of them require smart algorithms. This project would target several key problems.
Difficulty: Medium
Skills: C++/Qt, AI
Possible mentor: werner
Attachment | Size |
---|---|
shot_130418_125502.png | 19.34 KB |
=== The project goal is to improve MIDI import functionality ===
--------------------------------------------------------------------------------------
Current work
More "smooth" clef changes (for single notes, ...)
--------------------------------------------------------------------------------------
Plans
- Use Simon Dixon's algorithm (C++) for automatic beat recognition.
- Ask user to adjust, if necessary, the start and the end points of the first bar on piano roll or specify the time scale difference between MIDI events and the ideal grid.
--------------------------------------------------------------------------------------
Implemented features
Selectable lyric import option
Combo boxes in Lyrics column of MIDI import panel gives an opportunity to select the track to assign lyric to.
Example of karaoke file with one lyric track:
Another, manually created example shows multiple lyrics support (2 lyric tracks):
Here is a MIDI import of drums:
Also there is an option of a drum staff splitting (thanks to chenlung for his idea):
Split without staff bracket:
Here are some examples of swing detection results.
Triplet swing (2:1)
Shuffle (3:1)
Larger piece
Clef changes option is checked in the MIDI import panel by default.
Below are some examples of automatic MIDI import.
Manual adjustments/highlights are made in a couple of cases to show that program correctly handles multiple voices.
MIDI file:
Result of the import:
Triplet
Triplet when time sig = 3/4
Triplet when time sig = 5/4 (reply to Tuplet rhythms in MIDI import)
Duplet (time sig = 6/8)
Qaudruplet (time sig = 6/8)
Triplet and other shorter notes
Mixed triplets, including triplet with rest
Septuplet
Nonuplet (time sig = 3/4), requires 1/64 quantization
Nonuplet (time sig = 4/4), requires 1/64 quantization
2 voices - triplet and regular notes
2 quintuplets (rest is inside one of them) and manually space-adjusted case
2 voices - triplet and quintuplet.
Need to manually set quantization value to 1/32
3 voices - triplet, quintuplet and septuplet simultaneously
and manually space-adjusted case + highlighted case
Larger piece example (reply to Can't open a MIDI file with triplets)
"The Oxman Returneth" by Marc Sabatella - various triplets + pickup measure
-- Recognition of first and last tuplet tied notes --
First tied note:
Last tied note:
Tied tuplets:
For example, left piano track goes above right track that is incorrect, so we can move right track to the top.
Notes, rests + dots and ties are created according to strong/weak bar divisions.
=> Here are some examples of automatic MIDI import:
Half note at the center of 4/4 bar
Half rest at the center of 4/4 bar
Rests and chords near beats
Half rest at the start or at the end of 3/4 bar - divided into quarter rests
Example of larger piece of music
Last quarter rest in compound meters like 6/8 - splitted into 2 8th
12/8 compound bar
Rests of mixed duration
In addition to fixed-pitch split there is an option to take into account the average hand width of the pianist.
Example
Apply operations on MIDI tracks and get the immediate result (see screenshots above).
Almost all MIDI import files begin with the “importmidi
” prefix and are located in mscore/
directory.
Internally, MIDI import in MuseScore consists of two main stages:
All of the import is controlled by values of the MIDI import operations (default or user-defined). Those operations are stored in the MidiImportOperations
class and may be different for each track. This class also contains MidiData
class which is responsible for the storage of contents of the MIDI file (necessary because the user can switch between multiple open MIDI files). The object of MidiImportOperations
class is stored in MuseScore Preferences class, which can be found in mscore/preferences.h
.
The opening of a MIDI file is followed by a range of internal program actions, the main ones are:
setMidiFile
that is located in importmidi_panel.cpp
extractMidiTracksMeta
) in importmidi.cpp
importMidi
function in importmidi.cpp
is called, which performs all necessary calculations and adds the music information from the MIDI file to the new scoreIf the user changes the operations and clicks the Apply button, the doMidiImport
function (from importmidi_panel.cpp
) obtains the values of operations from the GUI model and saves it in the preferences.midiImportOperations
object. After, the usual importMidi
function is called. Immediately after the import function performs its job, the preferences.midiImportOperations
object is cleared.
The MIDI “music” import stage reads the MIDI file information previously stored in preferences.midiImportOperations.midiData
object and calls convertMidi
function from the importmidi.cpp
file. After, all operations and algorithmic manipulations are applied to the MIDI file content:
MidiChord
classremoveOverlappingNotes
function, importmidi.cpp
)importmidi_tuplet.cpp
); multiple voices are also taken into accountimportmidi_quant.cpp
); tuplets and non-tuplet notes are quantized by different gridsremoveOverlappingNotes
is called once againimportmidi_lrhand.cpp
splitUnequalChords
function in importmidi.cpp
)importmidi_drum.cpp
)importmidi_meter.cpp
)MTrack::tuplets multimap
importmidi_swing.cpp
importmidi_clef.cpp
)importmidi_lyrics.cpp
(lyric can be a title, composer or text next to notes - like song words)The score is then rendered by the MuseScore graphics engine.
***
Currently to add a new operation one should add some pieces of code to several places (maybe it will be possible to bring all this pieces into one place in the future):
impotmidi_operation.h
- MidiOperation::Type
TrackOperations
struct in importmidi_operations.h
and set the default value in C++11 mannerimportmidi_opmodel.cpp
that will be shown in the MIDI import panel; connect to the controller if necessary; controller hides/shows the nodes according to some defined rules (for example, “Allow clef change…” is a hidden node for drum tracks)setNodeOperations
function in importmidi_opmodel.cpp
setTrackOperation
function in importmidi_trmodel.cpp
trackOperations
function in the same fileThe operation then becomes available for the MIDI import algorithms.
***
MIDI import tests are located in mtest/importmidi/tst_importmidi.cpp
To test functions that have only definition in cpp
file, the auxiliary file mtest/importmidi/inner_func_decl.h
header is used where the headers of such tested functions should be put.
Google-Melange public project page: project page
Original Proposal: proposal
Git Repos:
Documentation (how to set up libmscore with emscripten): here
Progress Log (archive): log
You can find documentation on how to set-up your environment to begin using libmscore in Javascript here .
All of the work of getting emscripten to compile the libmscore code itself is completed and documented, even if all of that code isn't fully usable yet. This means that others should be able to reproduce the process of compiling libmscore to Javascript. If anyone attempts this process, I welcome all feedback so that I might improve it.
It is important to note that porting future versions of libmscore to emscripten (that is, versions of libmscore which now use qt5), will require additional work of first porting qt5 to Javascript. As of the time of writing, I'm not aware of any initiatives looking to complete this task. Qt5 was only fully "released" just over a year ago, and MuseScore itself did not make the complete switch over until just the past summer, so I think with time this task will be realized. From there, the process of porting over libmscore would follow a process very similar to the one I outlined for versions of libmscore using Qt4.8.
While I did not complete all of the goals outlined in my original proposal, libmscore is at a point where it is possible to load a simple score into the browser and verify some of the metadata. From here, it's a matter of debugging the remaining issues and exposing more libmscore functionality to Javascript. My hope is that outside of GSoC I can continue working on this project so that I can accomplish the goals outlined in the original proposal. I feel I am very close to those goals. I hope that someone more experienced with Qt5 will take up the task of porting Qt5 to emscripten, or perhaps maybe I could take up the task myself down the road. With Qt5 ported to emscripten, I still see many benefits of getting newer versions of libmscore to work in the browser. I would like to see that become a reality.
This was removed from the main page. It basically contains a log of the progress I made on the project over the summer.
Hopefully I can find a way to automate as much of this process as possible to make future patches simpler.
From llvm.org, "the LLVM Project is a collection of modular and reusable compiler and toolchain technologies." It is used for the optimization of programs written in arbitrary programming languages. Clang is a C/C++ front-end for LLVM. Emscripten uses these technologies to convert C++ code into Javascript. Emscripten-qt adds support for Qt in Emscripten.
This guide will go through the process of setting up these tools, designed for a Linux environment, although many of the links have instructions for other operating systems as well.
Versions of software used:
To get LLVM set-up, simply follow the steps provided on LLVM: Getting Started. Be sure that you meet all of the requirements listed on the requirements section, and then follow the steps outlined on getting started a summary.
After llvm/clang are finished compiling, add the directory where the binaries are to your path. Should be something like "/home/user/somewhereInHome/llvm/Release+Asserts/bin" then try these examples to make sure everything is working:
(the parts in [] are notes, don't type them)
clang --help clang file.c -fsyntax-only [check for correctness] clang file.c -S -emit-llvm -o - [print out unoptimized llvm code] clang file.c -S -emit-llvm -o - -O3 clang file.c -S -O3 -o - [output native machine code]
if everything ran successfully, then clang and LLVM are configured correctly and you can move on to the next step.
For emscripten and emscripten-qt, just follow the instructions on the emscripten-qt wiki the section "how do I use it." The instructions are fairly detailed, and I will summarize them here:
Create a directory (probably somewhere in your home directory) for emscripten and emscripten-qt. For the sake of this guide, that directory will be referred to as "/home/user/emscriptenqt/", make sure to replace all instances of that directory with what your's actually is.
Enter the following commands, replacing /home/user/emscriptenqt
mkdir build-emscripten-qt cd build-emscripten-qt export EMSCRIPTEN_ROOT_PATH=/home/user/emscriptenqt/emscripten/ ../emscripten-qt/configure -xplatform qws/emscripten-clang -embedded emscripten -static -opensource -debug -no-qt3support -no-opengl -no-openssl -system-zlib -no-gif -qt-zlib -qt-libpng -no-libmng -no-libtiff -qt-libjpeg -no-accessibility -dbus -script -no-fpu -no-mmx -no-3dnow -no-sse -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-icu -no-rpath -confirm-license -no-webkit -no-phonon -no-freetype -nomake demos -nomake examples -little-endian -no-feature-socket -no-feature-codecs -no-feature-textcodecplugin -no-feature-systemlocale -no-feature-qws_multiprocess -no-feature-sound -no-feature-printpreviewwidget -no-feature-printpreviewdialog -no-feature-systemsemaphore -no-feature-sharedmemory -no-feature-localeventloop -feature-qws_clientblit -feature-qws_cursor -depths 32 -make tools --prefix=$(pwd)/install make sub-tools-bootstrap && make install_qmake sub-moc-install_subtargets sub-uic-install_subtargets sub-rcc-install_subtargets && make sub-corelib-install_subtargets sub-gui-install_subtargets install_mkspecs
Now you should have emscripten and emscripten-qt. You may wish to add /home/user/emscriptenqt/emscripten to your PATH, but it is not necessary. Next, we will run an example Qt app to make sure that everything is working correctly.
cd .. mkdir qtdemos cd qtdemos export PATH=/home/user/emscriptenqt/build-emscripten-qt/install/bin/:$PATH export QMAKESPEC=/home/user/emscriptenqt/build-emscripten-qt/install/mkspecs/qws/emscripten-clang cp -R ../emscripten-qt/demos/chip . cd chip patch main.cpp < ../../emscripten-qt/emscripten-stuff/chip-emscripten-qt-patch.patch cd .. mkdir build cd build qmake ../chip/chip.pro make mkdir -p qt-fonts && cp ../../build-emscripten-qt/install/lib/fonts/helvetica_*.qpf ../../build-emscripten-qt/install/lib/fonts/fixed_*.qpf qt-fonts/ cp ../../build-emscripten-qt/install/lib/QtGui.a QtGui.so cp ../../build-emscripten-qt/install/lib/QtCore.a QtCore.so ../../emscripten/emcc \ chip.bc \ QtGui.so QtCore.so \ -O2 \ --closure 0 \ --jcache \ --pre-js ../../emscripten-qt/emscripten-stuff/pre-qt.js \ --js-library ../../emscripten-qt/emscripten-stuff/pre-qt-library.js \ --embed-file qt-fonts \ -s EXPORTED_FUNCTIONS="['_main', '_EMSCRIPTENQT_resetTimerCallback', '_EMSCRIPTENQT_timerCallback', '_EMSCRIPTENQT_timerCallback_springboard', '_EMSCRIPTEN_canvas_width_pixels', '_EMSCRIPTEN_canvas_height_pixels', '_EMSCRIPTENQT_mouseCanvasPosChanged', '_EMSCRIPTENQT_mouseCanvasButtonChanged']" \ -s TOTAL_MEMORY=67108864 \ -s INLINING_LIMIT=50 \ -o chip.html
The emscripten-qt wiki goes into more detail about what all of the parameters and commands mean.
If all completes as it should, you should now have a chip.html file in that directory. Open it with a supported browser, and the chip's demo page will load. If so, then emscripten-qt is working as it should, and you're finished!
NOTE: you might notice that the generated canvas isn't large enough to display all of the chip's demo. Apparently emscripten-qt does not yet support dynamically resizing of the canvas, and the canvas must be set manually to the correct size. On about line 23 of the generated html file, you should find:
<canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()"></canvas>
change it to something like:
<canvas width="800px" height="600px" class="emscripten" id="canvas" oncontextmenu="event.preventDefault()"></canvas>
Setting up Libmscore emscripten development[a]
First, follow all of the steps outlined here for how to set up LLVM/clang, emscripten, and emscriptenqt
Next, you can either clone a version of libmscore already set up for emscripten here or you can try to clone a pre-qt5 version of libmscore and follow the notes in appendix A of the necessary changes to use emscripten/qt.
As of the time of writing, emscriptenqt will not work with the latest version of LLVM/clang, however, using the compatible version will generate build errors because of unsupported atomic calls. Since everything done in emscripten is basically synchronous, this is not really an issue, and these atomic methods can be stubbed out. I have already created a file called “atomic_fixed
” Move and rename this file (remove the “_fixed” suffix) to “emscripten/system/include/libcxx/atomic
” where “emscripten
” is the folder which contains your emscripten directory.
Once you have the libmscore code and emscripten and emscriptenqt set up, open up the “build.sh
” file (or obtain one here
), and edit the “EMSCRIPTEN_FOLDER
” to point to your folder which contains the emscripten and emscripten-qt folders.
When the build.sh file is set up correctly, you can simply run “./build.sh
” and that will generate a “libmscore.js
” file which contains libmscore code converted to javascript. Make sure that you have the valid EXPORTs from the emscripten setup process:
export PATH=/path/to/emscriptenqt/build-emscripten-qt/install/bin/:$PATH export QMAKESPEC=/path/to/emscriptenqt/build-emscripten-qt/install/mkspecs/qws/emscripten-clang export PATH=/path/to/emscriptenqt/emscripten/:$PATH
You will need these exports everytime before you build. Replace “path/to/emscriptenqt
” with the path to your emscriptenqt folder.I recommend creating a simple shell script containing those lines, which you can simply run before the build.
Once libmscore.js has been generated successfully, there are still more steps to expose libmscore methods to Javascript. Any desired methods must be exported during the compile step (part of build.sh), and they must be added to Module in Javascript. Also, it’s usually useful to wrap C++ methods in an extern “C” {}
section and stick to C-style calls, as these are easier to export.
For my purposes, I found it easiest to put all my wrapped functions into “embinds/classScore.cpp” : classScore.cpp . There you can see how I wrap C++ class methods and such, and the basic naming convention that I followed. This was mostly to prevent conflicts with existing libmscore code and for ease of use of exporting to javascript.
Next, add this method to the “-s EXPORTED_FUNCTIONS
” array in the build.sh file: this line
. Note, you do have to add a “_” before the function name when listing it in this array, even though that method doesn’t have a “_” in the source.
Finally, you call “Module.cwrap” from Javascript, before calling your method. This is explained in better detail here . Following my examples in test.html should be fairly straightforward: test.html. I put all my cwraps into one large “Libmscore” object.
It’s important to note that “Module.cwrap
”, the emscripten functionality that allows calling these methods, only understands basic types: number, boolean, and String (for char*). Any pointers to objects are just treated as a number as an index to the emscripten’s heap object. So it’s perfectly fine to pass that number in and out of wrapped methods, but you can’t expect to do anything with that pointer in regular javascript, because to JS it will just be a number. With Strings, emscripten works some magic that copies a passed in string to its internal memory structure, and then passes that created pointer to the C++ method.
After you have successfully exported the method and cwrap’d it, you can call from normal javascript, like in test.html.
Foreward: this is a collection of my notes detailing the steps I took to convert a normal clone of MuseScore into the codebase I used for compiling with emscripten/qt. I don’t imagine these exact steps will work with any other version of MuseScore except for the specific one I used, but the process should be similar. It is therefore my hope that these notes may be useful for any interested party to replicate the process for a different version of MuseScore.
First I cloned MuseScore from this sha . I then copied the entirety of the “libmscore” folder out of that directory and into a different one. I then created a new repository in that directory. This allowed me to keep most of what I was doing separate from the rest of MuseScore, while pulling in only the pieces I needed.
I created a libmscore.pro qmake project file more or less following a template similar to mscoreserver's project file
. I removed things which were not necessary for the emscripten port. The current .pro file I’m using (at the time of writing) looks like this
. Of particular interest will be the cxxflags, sources and includes, the “QT += svg declarative
”, and the precompiled header. I added “-std=gnu++11” and “-stdlib=libc++” lines, and removed “-fno-rtti.”
I also copied over the “all.h” precompiled header from the MuseScore repo into the new repo. This file could probably be generated during the build process, but for my purposes I did not pursue this route. There were some files I needed to remove from “all.h
”, these included:QWebView, QWebFrame, QtXml, QAbstractMessageHandler, QXmlSchema, QXmlSchemaValidator, QXmlStreamReader, QNetworkAccessManager, QNetworkReply, QNetworkCookieJar, QHostAddress, QUdpSocket, QHttpPart, QHttpMultiPart, QDeclarativeEngine, QDeclarativeComponent, QDeclarativeItem,
and QDeclarativeView
. “all.h
” should end up looking something like this
.
I copied over “config.h.in
” from the MuseScore repo into the new repo, and renamed it “config.h
” I had to mess around with some of the defines, such as USE_ALSA
and other audio flags, resulting in this
.
I had to add some missing includes to all.h ( and ).
Lots of methods which had to deal with midi events and synthesizer stuff had to be stubbed and commented out. Mostly inside of “instrument.h”, “undo.h”, “undo.cpp”, “instrtemplate.h”, “instrtemplate.cpp”, “instrument_p.h”, “instrument.cpp”, “keyfinder.cpp”, “layout.cpp”, “pitchspelling.cpp”, and “rendermidi.cpp”
Edited the synthesizer source files to remove and reference to “effects/effect.h” stuff, then removed that include from those files.
I had to rename “QZipReader”, “QZipWriter”, and “CentralFileHeader” because of conflicts with emscriptenqt classes. I simply added an “M” onto the end of all these classes.
I commented out the chord list loading stuff in “style.cpp”
I commented out a lot of the fonts in mscore.cpp so that I could test loading one font at a time to see which were giving issues.
After these steps I was able to get a very basic score file to load (this score ) and was able to verify some of the meta tags associated with it.
We strongly believe that the best proposal for you is the one you'll do. If you have any suggestions, come on IRC channel #musescore, or contact us on the developer mailing list
Difficulty: Easy to Medium
Skills: C++ / Qt. No detailed knowledge of MuseScore internals is required, except for the InstrumentTemplate class usage. The code is mostly independent of MuseScore core development.
Estimated LOC required is 4000.
Possible mentor: lasconic
A UI to edit the rules of beam groups and a way to assign the rules to measure, staff etc... similar to time signature (measure based, different by staff)
Difficulty: Moderate
Skills: C++ / Qt. A bit of knowledge of MuseScore internals.
Possible mentor: lasconic
Create an editor for MuseScore specific graphical symbols which are in SVG format.
A specialized (simplified) variant of this project is to create an editor for note heads.
Difficulty: Moderate to Hard
Skills: C++ / Qt. Requires some knowledge of MuseScore internals.
What is BreakPad
"Breakpad is a library and tool suite that allows you to distribute an application to users with compiler-provided debugging information removed, record crashes in compact "minidump" files, send them back to your server, and produce C and C++ stack traces from these minidumps. Breakpad can also write minidumps on request for programs that have not crashed. Breakpad is currently used by Google Chrome, Firefox, Google Picasa, Camino, Google Earth, and other projects."
Difficulty: Moderate to Hard
Skills: C++ / Qt
Possible mentor: lasconic
We strongly believe that the best proposal for you is the one you'll do. If you have any suggestion pass by the IRC channel #musescore or contact us on the developer mailing list
See plugin manager
Difficulty: Moderate to Hard
Skills: C++ / Qt
Possible mentor: lasconic
MuseScore software is translated in more than 20 languages thanks to the drupal based site at http://translate.musescore.org The languague files are provided as qm file on this website, but fur a lot of users it would be more convenient to download an auto installable language file.
Difficulty: Moderate
Skills: Depending on your proposition C++ / CMake / NSIS
Possible mentor: lasconic
MuseScore being an interactive software, it needs UI testing to improve his stability. MuseScore community has setup a wiki page to gather information about this topic. Your role will be to choose the right tool, write testing scenarii etc...
Difficulty: Moderate to hard
Skills: Depending on your proposal
Possible mentor: david
Improvements in this area could include:
Difficulty: Hard
Skills: AI, C++, Music
Possible mentor: werner
Additional information: Current state of MIDI import by Kevin Hylee.
The Audio Widget Library contains the controls for Volume, Mixer etc... Users will benefit a more usable and good looking set of controls.
Difficulty: Easy
Skills: C++, Qt, ergonomy
Possible mentor: lasconic
We strongly believe that the best proposal for you is the one you'll do. If you have any suggestion pass by the IRC channel #musescore or contact us on the developer mailing list
Difficulty: Hard
Skills: C++ / Qt graphics, guitar theory
Possible mentor: Werner
Status: Fretboards partially implemented in development builds for MuseScore. See http://musescore.org/en/node/5262#comment-17026 Implemented
The plugin framework is still very young but there are already some plugins. Plugin developers have a lot of ideas to bring more features to MuseScore.
Difficulty: Moderate
Skills: C++ / Qt
Possible mentor: lasconic
Status: Implemented
See plugin manager
Difficulty: Moderate to Hard
Skills: C++ / Qt
Possible mentor: lasconic
Status: Implemented
MuseScore software is translated in more than 20 languages thanks to the drupal based site at http://translate.musescore.org The languague files are provided as qm file on this website but a lot of users it would be more convenient to download an auto installable language file.
Difficulty: Moderate
Skills: Depending on your proposition C++ / CMake / NSIS
Possible mentor: lasconic
In MuseScore 0.9.6, a automated check for upgrade has been added. For next version, users would be able to check for update, download the upgrade package, install it and restart MuseScore
Difficulty: Moderate to hard
Skills: C++
Possible mentor: thomas_
Status: Implemented
MuseScore being an interactive software, it needs UI testing to improve his stability. MuseScore community has setup a wiki page to gather information about this topic. Your role will be to choose the right tool, write testing scenarii etc...
Difficulty: Moderate to hard
Skills: Depending on your proposal
Possible mentor: david
Improvements in this area could include:
Difficulty: Hard
Skills: AI, C++, Music
Possible mentor: werner
The Audio Widget Library contains the controls for Volume, Mixer etc... Users will benefit a more usable and good looking set of controls.
Difficulty: Easy
Skills: C++, Qt, ergonomy
Possible mentor: lasconic
Currently MuseScore plays dynamic and tempo changes but can't deal with ritardando or crescendo
Difficulty: Easy to Hard depending on the proposal
Skills: C++, Qt
Possible mentor: lasconic
Status: Partly implemented (crescendo but not ritardando)
Music Hack Day is a regular gathering for music and tech enthusiasts. During this event, programmers, designers, thinkers from all over the world meet up and try to create music-related software or hardware hacks during a 24-hour coding marathon. The core team of MuseScore contributors, namely Werner Schweer, Thomas Bonte and Nicolas Froment are regular attendees of the Music Hack Days. They promote MuseScore and MuseScore.com, and empower other coders to create something with one of the following resources:
All upcoming hackdays listed at http://musichackday.org
Below is the list of Music Hack Days where MuseScore was represented, as well as the resulting hacks.
http://classicalmusichackday.org
Attending: Lasconic - Thomas - Werner
http://classicalmusichackday.org
Attending: Lasconic - Thomas - Joachim Ganseman
https://www.hackerleague.org/hackathons/music-hack-day-london-2014
Attending: Nicolas - Thomas - Chen Lung
http://new.musichackday.org/2014/barcelona/
Attending: Nicolas - Thomas
http://london.musichackday.org/2013
Attending: Thomas - Nicolas - ChenLung - Manuel Bärenz
http://bologna.musichackday.org/index.php?page=Main+page
Attending: Miwarre - Thomas - Nicolas - Werner
http://hackday.peachnote.com/
Attending: Thomas Bonte - Paul Sebastien - Florian Weiss - Nicolas (remote)
http://denver.musichackday.org/index.php?page=Main+page
Attending: Marc Sabatella
Attending: Thomas - Nicolas - Werner - Paul Sebastien
Attending: Thomas - Nicolas - Werner
Site: http://classicalmusichackday.org
Attending: Nicolas
Site: http://cannes.musichackday.org/2013
Nicolas - Thomas - Kaspar - Quim Llimona & Sara Gozalo
Blog post: Hello from Barcelona
Thomas - Mathieu Barthet
Thomas - Nicolas - Joachim Ganseman - Richard Lewis - Keith Moon - Andrew Robertson
Thomas - Nicolas - Matthias Röder - Vladimir Viro - Hervé Bitteur
Thomas - Nicolas - Bram de Jong
Thomas - Nicolas - Lucas Gonze - Pieter-Jan Vaernewijck
Thomas - Nicolas - Matt Prokup
Thomas - Nicolas - Joachim Ganseman
Thomas - Nicolas - Joachim Ganseman
This page refers to music Braille features that were currently planned or under development. With the release of MuseScore 4.2, complete documentation about Braille can now be found in the main Handbook: Braille
The in-progress icon set can be found here.
https://github.com/musescore/MuseScore/tree/master/mscore/data/icons
* All icons must be vector-based.
* All toolbar icons must be monochrome with a transparent background.
* Toolbar icons should be 24x24 px with 1px margins.
* If the symbol is narrow, rotate it 45° left or right to fill the focal space.
* All icons must be international and untranslatable. Don't use the "B" symbol for "Bold" or "I" for "Italics", but simply use lowercase "a" with the appropriate formatting applied.
* Keep elements aligned to a square pixel grid for sharpness.
If in doubt, refer to the Gnome icon design guidelines .
* Icons should be submitted in the SVG format.
* Use a single layer only.
Sound configuration is now done via the Mixer and via Preferences. Certain advanced features have yet to be replicated in MuseScore 4, such as the ability to change the tuning standard used for the entire score away from the default A4 = 440Hz.
It's always been possible to choose individual sounds from VSTs and Muse Sounds in MuseScore 4, but as of MuseScore 4.2 this will be possible with SF2 and SF3 SoundFonts as well, so users of MS Basic and other SoundFonts won't be stuck using the default sound for each instrument.
Playback for capo markings returned in MuseScore 4.1 along with a new floating widget to adjust capo properties.
The capo marking lives in the Guitar palette. It's usage is demonstrated in this video: https://www.youtube.com/watch?v=MWEtevLeAmM&t=61s.
These are features that were either removed prior to MuseScore 3, or implemented afterwards but never part of any official release, that are worth noting here.
A GSoC project never merged.
See https://github.com/musescore/MuseScore/labels/regression_ms3 (but not all regressions are marked as such)
Summary: MuseScore 4.0 will not run on 32-bit Windows and macOS 10.13. I have confirmed this with Tantacrul as per [MU4 Issue] nightly does not run on macOS 10.13 #8858
The MuseScore developer community uses a development environment Qt 5 to develop MuseScore 4.0. Qt 5 supports Windows 7, 8.1 and 10 (32-bit), and macOS 10.13. Unfortunately, Qt 5 is no longer supported by its vendor. We are planning a near-term transition to Qt 6, which desupports the above operating systems. To be compatible with what is (and is not) supported on Qt 6, MuseScore 4.0 has the following limitations:
The following operating systems are the minimum required versions to run MuseScore 4.0 (nightly/development builds), first private Alpha and any subsequent versions)
According to Macs and maximum macOS versions, the Apple Mac computers that will not be able to run MuseScore 4.0 are 10+ years old.
We would have liked to support MuseScore on Windows 10 (32-bit) for the foreseeable future since Windows 10 is still supported until at least 2025. Unfortunately, this is just not possible. The nature of the IT industry makes software and hardware upgrades a "constant". A software project like MuseScore desupporting certain operating systems from time to time becomes inevitable.
We did not take the decision to remove support for the above-mentioned operating systems lightly. We also considered continuing support for these operating system versions on MuseScore 4.0 and only removing them once we switch to Qt 6. However, we decided against it, since users who had upgraded from 3.6.2 to 4.0 (and came to rely on it) would not be able to upgrade to 4.1 (for example) but would be stranded on 4.0 when 4.1 may have critical bug fixes or features that existed in 3.6.2 but were not implemented on 4.0.
Users are encouraged to upgrade their operating systems where possible, and if not, upgrade or replace their hardware.
For users who cannot upgrade to meet the above minimum requirements, MuseScore 3.6.2 will remain usable, and users on MuseScore 4.0 that need to exchange scores with others using MuseScore 3.6.2 and older can interoperate (Save as.. and open) files using MusicXML.
See GitHub pull request Update to Qt 6 #10108 to track the progress of compiling MuseScore 4 on Qt 6.
See also: Command line options
So, you want to help develop and improve MuseScore?
Welcome to a passionate and dedicated team of volunteers from around the world.
This is how it generally works:
If you see an area that could benefit from improvement, then jump right in!
Note: This page is from 2010 and out of date. Nightly builds can be downloaded from https://musescore.org/en/download#Nightly-versions. If want to run in "debug" mode, execute MuseScore from a terminal with " -d" as a command line option . However, this doesn't print out all the qDebug messages. If you want that, you will have to self compile MuseScore: https://musescore.org/en/developers-handbook/compilation.
A special "debug" version of MuseScore displays messages about each step that is happening inside the software. It can be useful for finding the source of bugs or problems with the software. The instructions below show how to use a debug version that is pre-built.
Important: the debug version is not a stable release and is only intended for testing a specific problem. Please use other versions of MuseScore for creating or editing normal scores.
Download the "debug" version of MuseScore.
http://prereleases.musescore.org/windows/nightly/mscore-debug.7z
After you download the file, you will need to decompress the file using 7-Zip (as explained on the Windows nightly builds page ).
When the "debug" version is running it displays detailed information in a separate window called a "command prompt". The "command prompt" usually appears as a small window with white text on black background.
The command prompt should remain open after you close the main MuseScore window. It is sometimes helpful to share the contents of the command prompt text when discussing a bug. However, the text is often lengthy so it is probably best to only share it if requested or if you notice something important. Copying text from the command prompt is different from any other program in Windows so the remaining steps describe this procedure.
This page is a duplicate of Command line options in the MuseScore 2 Handbook (actually the other way round), which is outdated and wrong. A more complete and correct version is in Command line options of the MuseScore 3 handbook
You can launch MuseScore from the command line by typing
mscore <options> <filename>
<options>
and <filename>
are optional.
The following options are available
-v
-d
-D
-s
-m
-n
-L
-I
-O
-o <filename>
<filename>
. The file type depends on the filename extension. This option switches to the "converter" mode and avoids any graphical interface. You can also add a filename before the -o
if you want to import and export files from the command line. For example mscore "My Score.mscz" -o "My Score.pdf"
-r <dpi>
-S <style>
-o
option-p <name>
-F
-e
-i
-w
-c <pathname>
-t
-a <driver>
-style = style
-style style
-stylesheet = ss
-stylesheet ss
Welcome to MuseScore development news and digest blog
FYI, processing scores on server was broken with 3.4 update. We had to create separate branch with the hotfix from pr #5639 (thanks to Howard!). Now, we are preparing hotfix update 3.4.1 and going to roll out it later today to prevent further bug reports asap
We decided to revert the changes to the MuseScore_General soundfont due to the regressions.
Current soundfont version is 0.1.6.
To collect artifacts from AppVeyor, add "collect_artifacts" to the commit message title. Read more
AppVeyor updated Windows images. We are now able to build Windows packages of MuseScore 3 with Qt 5.12.
Thanks to @shoogle's PR, we now have both 32 and 64-bit nightly builds of MuseScore 3 based on Qt 5.12.
We do have known issues with our CDN provider, so we temporarily switched all links to GitHub URLs. If you are not able to download the update or the package is incorrect, please download the packages directly from GitHub:
We again exceeded maximum allowed artifact storage size on AppVeyor. Sent the request to AppVeyor's support.
This is the reason of failed AppVeyor checks.
FIXED at UTC 12:22
Alpha 2 is very close to its release state.
We applied new categories in the issue tracker (see https://musescore.org/en/node/277397).
GSoC 2018 Project "Score Diff Tool" was merged to master. Welcome testing!
A lot of pending PRs were merged yesterday including GSoC 2018 Project "Tours"
[FIXED] There is a known issue that Tour widget appears before closing Start Center window. We are working on the fix.
As you probably know, we changed the file format to make Diff Tool work.
The last available builds which can open the old files from development version are:
If you are testing issues in the tracker or you need to update your own files:
After saving, the file can be opened in recent development builds as well as in all further alpha/beta/release versions.
More than 1000 new users tried 3.0 alpha! Welcome aboard, brave people. :)
We changed the MuseScore file format a month ago to facilitate the introduction of a new tool: a scores comparator which shows the diff between two scores. From now on, you cannot open files created in early 3.0 development versions, so to use your files, open them in 3.0 alpha build and select "Save As... new file".
We updated the authorization engine on the website which may affect different user scenarios related to personal settings.
Should you find something is broken, please let us know.
MuseScore 3.0 alpha announced!
Highlight of the day:
We again exceeded maximum allowed artifact storage size on AppVeyor. Sent the request to AppVeyor's support.
UPD: AppVeyor increased the limit for us.
Created new 3.0alpha branch based on the current master.
If you already did a checkout of the previous 3.0alpha branch, please force a new checkout with the recent changes.
Reviewed all existing pull requests.
Closed outdated and already fixed ones.
Added new label "Priority" to define PRs which are aligned with the current most requested features.
We made good progress and will keep working on the following issues organized in epics which are mostly about positioning elements and text:
We mostly finished solving issues related to continuous view and text editing:
3.0alpha branch has been created.
We are preparing a MuseScore 3.0 public alpha release. Links to the packages are going to be put on the download page. This release is supposed to show the current state and the significant progress in 3.0 development as well as attract more users to test the editor.
All pull requests must be created against master as usual.
Warning: This guide may be outdated. See the wiki on GitHub for up-to-date compilation instructions.
Compile instructions (All Platforms) - read this first and then see the pages below for instructions specific to your platform.
Most instructions for Linux and BSD are the same regardless of which distribution you use, but you'll need to read the distribution-specific instructions below for any aspects that are unique to your distribution (usually only the method of installing dependencies). If no page exists for your distribution then feel free to create one - use the closest matching distribution as a starting point. If the instructions for one distribution work for a different one (or only require a few minor changes) then just add a note to the top of that page rather than creating a new one.
This generic guide covers the steps to build MuseScore that are the same on all platforms. See the platform-specific guides for details that only apply to your platform.
Note to editors: Please do not duplicate information on this page in the specific guides. Where information is already given in multiple guides consider moving it to this page instead.
Install Git and follow the steps in Git Workflow to get MuseScore's code repository on your machine.
Install CMake, Qt, and the other depedencies (or you can try to compile without them and then install them as needed based on error messages you see in the terminal).
All programs must be installed to a location mentioned in your PATH
environment variable.
Once you have MuseScore's code and dependencies on your machine, the steps to compile are the same as for any CMake project. The following commands work on all platforms (Windows, macOS, Linux) and in all shells (Bash, PowerShell, CMD, etc.). Subsequent sections of this guide go into more detail about what the commands actually do.
mkdir my_build_dir # 1. Create build directory cd my_build_dir cmake .. -DCMAKE_INSTALL_PREFIX=my_install_dir # 2. Configure (Mac: add `-GXCode`) cmake --build . # 3. Build cmake --build . --target install # 4. Install (optional)
These commands are likely to fail the first time you try. Pay attention to error messages displayed in the terminal output as they give clues about how to proceed.
Note to developers: Please ensure that error messages include information about what the problem is and also how to fix it. This reduces the need for people to rely on a written tutorial.
mkdir my_build_dir cd my_build_dir
The build directory is where compiled code will go. You can name the build directory whatever you like.
Tip: You can create multiple build directories for different configurations of the project (e.g. different platforms, compilers, git branches, or build types such as Release and Debug). This saves having to do a clean build every time you switch configuration.
cmake .. -G[generator] -D[option]=[value] # configure
During the configure step, CMake reads build rules from the top-level CMakeLists.txt and uses them to generate a native build system. This is just a new set of build rules that will work with whichever operating system, processor architecture, compiler toolchains, and IDE you happen to be using.
Note: Build rules are also taken from other CMakeLists.txt
and *.cmake
files in subdirectories mentioned in the top-level file.
By default, CMake tries to guess which native tool you want to build with. If you want it to generate code for a different tool then you can tell it to do so using the -G[generator]
option at the configure stage. On macOS, only the XCode generator is currently supported, so you must use it as follows:
cmake .. -GXCode -D[option]=[value] # configure for XCode (only on macOS)
On other platforms you can use any available generator, or you can leave out the -G
option to make CMake use the default one.
The CMake manual has a list of all generators and cmake --help
will show the ones that are available on your system.
You can pass options and variables to the configure step using the -D[variable]=[value]
syntax. For example:
cmake .. -DCMAKE_INSTALL_PREFIX=my_install_dir # configure with variable
This sets the CMake variable CMAKE_INSTALL_PREFIX to the value my_install_dir
, which means that during the install step the compiled binary and accompanying resources (fonts, translations, templates, etc.) will be copied to a directory called my_install_dir
inside your build directory.
Built-in variables
CMake's online documentation has a complete list of built-in variables. Here are some of the key ones:
/usr/local
on UNIX and C:/Program Files/${PROJECT_NAME}
on Windows, but it's a good idea to use a relative path instead as this avoids the need for root/admin privileges during the install step.Debug
because Release
discards symbols necessary for debugging. Windows users might prefer RelWithDebug
as this enables optimisations that increase performance while still retaining debug symbols.PATH
).
mingw32-make.exe
.Project variables
MuseScore defines it's own options and variables mostly in the top-level CMakeLists.txt. Examples:
BUILD_64
- Enable 64 bit builds.
MSCORE_INSTALL_SUFFIX
- string to append to the name of the mscore
binary to prevent conflicts.
MSCORE_INSTALL_SUFFIX=foo
would give mscorefoo
.""
(i.e. the empty string) so binary is just called mscore
.-portable
to enable AppImage builds on Linux.Project variables are set on the command line with the -D
option in the same way as other CMake variables:
cmake .. -DBUILD_64=OFF # configure with option
If you need to call CMake with lots of options then you could create a shell script or batch file to make it easy to run the same commands again in the future. You may notice that there are some scripts in repository root folder that do this already (see the Makefiles and msvc_build.bat). These are provided as a convenience, but it is better to avoid them and write your own if you can. CMake's purpose is to abstract the build process so that it is the same on all platforms. Providing a separate script for each platform undermines this purpose and discourages developers from learning how to use CMake properly.
cmake --build . -j[CPUs]
During the build step, CMake runs the native build tool on the generated build system. This compiles the C++ code and creates the mscore
binary.
Note: You could run the native tool yourself by calling make
, xcodebuild
or MSBuild.exe
directly, but then you'd have to learn how to use that tool and all the options it takes. Fortunately, CMake provides the handy --build option that calls the native tool for you with all the right options.
CMake 3.12 and later versions have a -j[number]
option to set the number of build jobs to launch in parallel. For the shortest build time, set the number equal to the number of CPU cores available on your machine. Alternatively, you can set the environment variable CMAKE_BUILD_PARALLEL_LEVEL.
cmake --build . --target install
During the install step, CMake again run the native build tool on the generated build system, but this time it specifically tells the tool to build the install
target. The install
target copies the compiled binaries and accompanying resources to the install directory specified in the configure step.
If you attempt to install to a system folder such as /usr/local
or C:\Program Files
then you will need to run the install command as root/admin privileges. This means using sudo
on Unix or running from an Administrator prompt on Windows.
Note: CMake 3.15 and later versions have a dedicated --install
option that does the same thing, but you can still use the old syntax if you prefer.
cmake --install . # install with CMake 3.15 or later
Installing the project is optional. You can run the compiled mscore
binary without installing it first but you won't be able to load the soundfont or templates untill you install.
You'd need to recompile the project whenever the code changes, but you don't have to go through all the steps from the beginning. You can usually get away with just running the build and install steps on subsequent builds. This applies even if you edit one of the CMakeLists.txt
or *.cmake
files; the build system will detect this during the build step and then rerun the configure step automatically.
The build system CMake generates is clever enough to only recompile code files that have actually changed. This is known as an incremental build.
Occasionally it may be necessary to start again from scratch. This is known as a clean build. You have to do this if you want to use a different compiler, and you might find that it fixes other problems too.
You can use either of the following commands from within the build directory to clean it:
cmake --build . --target clean # clean (i.e. delete compiled binaries) cmake --build . --clean-first # clean and then build
Alternatively, you can simply create a new build directory and run the configure step from inside it. Make sure you delete any old build directories that you no longer need because they take up quite a lot of space.
Note: These instructions are for building MuseScore using the Microsoft Visual Studio 2019 (VS) integrated development environment with the Microsoft Visual C++ (MSVC) compiler. If you are familiar with the QtCreator IDE or want a better experience editing .ui
files, see the instructions for Qt Creator and MSVC instead.
Maintainers: This guide is currently valid for Visual Studio 2019. Please update it for future VS versions rather than creating a new one.
You will need the MuseScore source code, as well as several programs and libraries, to be able to build MuseScore with Visual Studio.
CMakeSettings.json
and replace all occurrences of Visual Studio 16 2019
with Visual Studio 15 2017
. Make sure not to commit these changes to any pull requests.These instructions are for building MuseScore with VS2019. Any edition of this version of Visual Studio should work, including the Community edition, which is full-featured and free to use for open-source projects.
Whether or not you already have Visual Studio installed, please read these instructions carefully, as you might need to install some additional components.
CMake is used for generating the Visual Studio solution and project files needed for building MuseScore.
If you're building a standard build, Visual Studio will automatically use its own internal copy of CMake, so you don't need to download it separately.
If you're building an advanced build, you will need to download and install CMake.
(For information on the difference between standard and advanced builds, see building.)
bin
subfolder to the Path
environment variable; typically, this will be %ProgramFiles%\CMake\bin
.You will need the Qt libraries, minimum version 5.15.2, to be able to build MuseScore. For the 3.x branch Qt 5.9 is sufficient (but the others work too, but as of 583c71c
, 01Dec2020, the builds don't run when build with Qt 5.15, they crash on start or when opening a pre-3.6 score... no longer the case fortunately since at least 3.6RC), for the master branch as of 484f8dc (09Oct2020) you'd need 5.15. Go for 5.15.2, the latest and last publicly available Qt 5 release (MuseScore isn't yet ready for Qt 6, or the other way round).
bin
subfolder (e.g., C:\Qt\5.12.9\msvc2019_64\bin
) to the PATH
environment variable.bin
subfolder has not been correctly added to the PATH
environment variable.C:\Qt\5.*\mingw*\bin
folder from the PATH
environment variable, if present.NOTE: as of 1220175, 04Dec2020, JACK is no longer needed nor supported in the master branch, however it is needed if you wish to build 3.6.2 or earlier.
You will need a utility that handles .7z
compressed files. 7-Zip is open-source, free, and quite powerful, but there are alternatives that will work as well.
There are several additional dependencies:
All of these are open-source projects. Although it is possible to download them individually and build them yourself to create the required libraries, it is much easier to use prebuilt libraries and include files.
dependencies.7z
.dependencies.7z
into the MuseScore checkout folder. (This will create a new dependencies
subfolder within.)NOTE: as of 1220175, 04Dec2020, LAME and PortAudio are no longer needed nor supported in the master (4.0) branch. They are still needed if you wish to build 3.6.2 or earlier versions.
Before you can build MuseScore, you need to download and install all of the prerequisites.
MuseScore can be built in three different configurations:
Release
: Runs fast with all performance optimizations enabled, but very difficult to debug.Debug
: Very easy to debug, but runs very slow because all performance optimizations have been disabled.RelWithDebInfo
: A compromise between Release
and Debug
. Runs faster than Debug
but is more difficult to debug; conversely, easier to debug than Release
but runs somewhat slower.For each of these three configurations, MuseScore can be built for either 32-bit or 64-bit Windows.
A standard build of MuseScore uses the RelWithDebInfo
configuration for 64-bit Windows. To build this, follow the procedure for a standard build.
To build MuseScore in other configurations, or for 32-bit Windows, follow the instructions for advanced builds.
Go to File > Open > Folder… and open the MuseScore checkout folder.
Visual Studio will automatically begin to generate a CMake cache, which will include the Visual Studio solution and project files.
In Visual Studio, a solution is a collection of projects, grouped together, and sharing some basic characteristics. A project corresponds to a specific output being generated (such as an executable or a library). A project can exist by itself or within a solution, and a solution can contain one or more projects. CMake creates a single solution, with a different project for each logical component of MuseScore. The MuseScore solution contains over two dozen projects.
CMake cache generation will take a while. Watch the Output window and wait for the completion message to appear: CMake generation finished.
If everything has worked as it should, Visual Studio will have created a Visual Studio solution file called mscore.sln
inside the msvc.build_x64
subfolder of the MuseScore checkout folder, along with a collection of Visual Studio project files (*.vcxproj
).
The recommended process for running/building is:
msvc.build_x64
folder and open the mscore.sln
Visual Studio solution file.The Solution Explorer window should look like this:
Note the small red “minus sign” icons to the left of each project. Those icons mean that the project files are being excluded from the Git repository. Any directories or files with this icon are excluded and will not be included in any commits that you make.
In the Solution Explorer window, select the mscore project, then go to Build > Build mscore. (Alternatively, right-click the mscore project and choose Build from the popup menu.)
Building will take a while. Visual Studio will automatically build all of the other projects that mscore depends on. Watch the Output window and wait for the completion message to appear:
========== Build: 25 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
In the Solution Explorer window, select the INSTALL project, then go to Build > Build INSTALL. (Alternatively, right-click the INSTALL project and choose Build from the popup menu.)
Watch the Output window and wait for the completion message to appear:
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
Note: Make sure MuseScore4.exe is not running when building INSTALL.
To generate an advanced build, use the msvc_build.bat
batch file at a Command Prompt instead of building from within Visual Studio.
msvc.build_x64
or msvc.build_x86
and msvc.install_x64
or msvc.install_x86
subfolders of the MuseScore checkout folder or run msvc_build.bat clean
bin
subfolder has been added to the PATH
environment variable.bin
subfolder of an appropriate build of Qt (e.g., 32-bit for a 32-bit build) is the one that has been added to the Path
environment variable.msvc_build.bat
batch file in a text editor (such as Notepad) to read the instructions in the comments at the beginning of the file.msvc_build.bat
batch with the options you thing to need, e.g. msvc_build.bat RelWithDebInfo 32
.Before you can run MuseScore, you must build it.
Run MuseScore4.exe
from inside the msvc.install_x64\bin
or msvc.install_x86\bin
subfolder of the MuseScore checkout folder. (Do not run the copy of MuseScore4.exe
inside the msvc.build_x64\main\RelWithDebInfo
or msvc.build_x86\main\RelWithDebInfo
subfolder of the MuseScore checkout folder.)
Before you can debug MuseScore, you must build it.
mscore.sln
solution file.From revision 5b7c72a
onwards, committed 5th January 2018, the development version of MuseScore (master) on Windows requires Qt 5.9 or newer and a C++11 capable toolchain.
From revision 0128daf
onwards, committed 1st November 2018, the development version of MuseScore (master) on Windows also builds with Qt 5.12 (and therefor in 64bit mode, since Qt 5.12.2 32bit is also possible). To build with Qt 5.9 or anything prior to Qt 5.12 (and therefore in 32bit mode only), or using MinGW 32-bit inQt 5.12.2 and later, the BUILD_64 setting needs to get switched off manually, this doesn't get detected automatically
As of 484f8dc
, 09Oct2020, Qt 5.15 (and a C++17 capable toolchain) is required for the master branch. The 3.x builds don't run when build with Qt 5.15, as of 583c71c
, 01Dec2020, it crashes on start or when opening a pre-3.6 score... Apparently and fortunately this seems to no longer happen, since at least 3.6RC, so it is again possible to build 3.x with Qt 5.15(.2).
The 2.x branches require Qt 5.4 however, as QtWebKit is needed, and that had been removed in post 5.4 versions of Qt for Windows.
To prevent any compatibility issues, it is essential to compile MuseScore with the same type and version of compiler as was used to build Qt.
N.B. The instructions on this page are only applicable to MuseScore from the above revision onwards. If you are compiling MuseScore 1.3, or an older revision of the git repo, you need to follow the older version of these instructions, as it may require different versions of Qt and GCC.
The following tools need to get installed on your computer.
Some of the files to be downloaded are compressed using 7-Zip compression. If necessary, download and install 7-Zip.
Fresh install:
Download the Qt Online Installer for Windows.
NB There are a number of Windows installers on this page - make sure it is the Online Installer you are downloading.
Run the installer and install Qt in C:\Qt
. You just need the Qt libraries for MinGW 5.3.0 and the MinGW 5.3.0 toolchain (or those for MinGW 7.3.0 resp. MinGW 8.1.0)
(optional) Add the following directories to your %PATH%
C:\Qt\Tools\mingw530_32\bin
C:\Qt\Tools\mingw530_32\lib
C:\Qt\5.9.9\mingw53_32\bin
C:\Qt\Tools\QtCreator\bin
Update to Qt 5.9.9
Launch the Qt Maintenance Tool (C:\Qt\MaintenanceTool.exe).
First this tool will need to update itself, so select the Update components option. Once you've gone through all the steps, press the Restart button.
For this 2nd pass, select the Add or remove components option. In the select components screen, your currently installed components are preselected. Make sure to add ticks for the Qt libraries for MinGW 5.3.0 and that toolchain (see image from fresh install above).
Download the latest version of windows binaries for CMake. Choose the Windows (Win32 Installer) version. You need at least version 3.0. Versions up to 3.11.3 are known to work too (3.11 may emit some warnings reg. decrecated policies though). 3.5.1 is known to cause issues if not last in PATH.
As of 29. October 2020 the master branch requires Cmake 3.4 or later, but see below and use the one the Qt Installer provides, which is quite a lot newer.
Install in the default location (probably C:\Program Files\CMake
or C:\Program Files (x86)\CMake
) and optionally put the bin
subdirectory into your PATH.
For 3.5 and later make sure it is in PATH after the 3 Qt mingw directories (see above).
The Qt Installer (see above) meanwhile does offer CMake too, and also auto-updates it at times, so might be the better choice.
Get the source code from GitHub. If you need a Git client, you can try Git for Windows or the GitHub windows client.
git clone git://github.com/musescore/MuseScore.git
If you plan to contribute to MuseScore, you can setup your own fork on GitHub and clone it instead. See the Git workflow page.
Note: Directory names with spaces in them cause the build to fail; so avoid spaces in the name of your clone directory.
(optional but recommended) In your clone directory, copy the file build/git/hooks/post-checkout
to the directory .git/hooks
in order for mscore/revision.h
to be maintained automatically by git. See build/git/hooks/README
for details. Note that the .git directory is hidden.
You must have the following in your %PATH%:
C:\Qt\Tools\mingw530_32\bin
(or wherever MinGW is installed for you)C:\Qt\Tools\mingw530_32\lib
(or wherever MinGW is installed for you)C:\Qt\5.9.9\mingw53_32\bin
(or wherever Qt is installed for you)C:\Program Files\CMake\bin
(or wherever you installed CMake)C:\Qt\Tools\QtCreator\bin
If you want to launch QtCreator from the command lineNOTE: You can add path elements to cmd shells via Computer / System Properties / Advanced System Settings / Environment Variables. However, the make process can be sensitive to the rest of the contents of your %PATH% as well. If you encounter issues like mingw32-make immediately terminating with error code 0xc00000fd, then try stripping your path down to only the above elements, plus perhaps C:\Windows
and C:\Windows\System32
. You might consider running the build from a batch file that temporarily sets your %PATH%
to just the required elements.
A good approach to doing so is to create the following batch file in the "C:\Qt" folder:
C:\Qt\qt.bat
@echo off
echo Setting up a MinGW/Qt only environment...
echo -- Set QTDIR to C:\Qt\5.9.9\mingw53_32
set QTDIR=C:\Qt\5.9.9\mingw53_32
echo -- Set PATH to %QTDIR%\bin
set PATH=%QTDIR%\bin
echo -- Adding C:\Qt\Tools\mingw530_32\bin;C:\Qt\Tools\mingw530_32\lib to PATH
set PATH=%PATH%;C:\Qt\Tools\mingw530_32\bin;C:\Qt\Tools\mingw530_32\lib
echo -- Adding %ProgramFiles%\CMake\bin
set PATH=%PATH%;%ProgramFiles%\CMake\bin
echo -- Adding to C:\Qt\Tools\QtCreator\bin
set PATH=%PATH%;C:\Qt\Tools\QtCreator\bin
echo -- Adding %SystemRoot%\System32 to PATH
set PATH=%PATH%;%SystemRoot%\System32
echo -- QMAKESPEC set to win32-g++
set QMAKESPEC=win32-g++
cd %USERPROFILE%
echo -- Set MAKEFLAGS to -j %NUMBER_OF_PRCESSORS%
set MAKEFLAGS=-j %NUMBER_OF_PROCESSORS%
rem un-rem the last line to start Qt Creator immediately
rem using /low makes sure you can still work with the PC
rem -lastsession gets you back where you left
rem start "" /low qtcreator -lastsession
Then create a shortcut to this batch file somewhere in the Programs menu. If starting QtCreator immediately, the shortcut can be set to "Start minimized".
(Note: if you don't want to launch qtcreator from a bat file, you can still set MAKEFLAGS to a hardcoded value directly inside of qtcreator by going to Projects->Build->"Build Environment" and adding a variable MAKEFLAGS with value "-j 4" for 4 or any number of compile threads.)
In addition to Qt, MuseScore depends on:
NOTE: as of 1220175, 04Dec2020, PortAudio and LAME are no longer needed nor supported in the master branch.
One way is to put most of these dependencies directly in the MinGW include path. This may be ugly, but is pretty convenient. Either follow the below instructions or take this archive, unpack lib
and i686-w64-mingw32
to C:\Qt\Tools\mingw730_32\
resp.C:\Qt\Tools\mingw530_32\
(C:\Qt\Tools\mingw491_32\
for 2.x branches) and Jack
to C:\Program Files (x86)\
(these files are used for the development builds) or install just Jack and for the rest take Qt-additions.zip and unpack it into C:\
.
As of 5d889d7 (27Apr2019) there is another and cleaner way (and one that also works for 64bit builds): use the same method as for the MSVS/VC builds, see https://musescore.org/en/handbook/developers-handbook/compilation/compi…, i.e. grab this dependencies.7z and extract the contents into the base dir. (This will create a new dependencies folder in that base dir.)
The latest source also requires libraries for Vorbis and Ogg.
1. Get the library files for libVorbis and libOgg from: http://www.xiph.org/downloads
2. Copy the directories: include\vorbis
and include\ogg
into C:\Qt\Tools\mingw530_32\i686-w64-mingw32\include
(Copy the entire directory so that you end up with C:\Qt\Tools\mingw530_32\i686-w64-mingw32\include\vorbis
and C:\Qt\Tools\mingw530_32\i686-w64-mingw32\include\ogg
)
3. Get the Vorbis Tools and copy libogg.dll
, libvorbis.dll
and libvorbisfile.dll
into C:\Qt\Tools\mingw530_32\lib
(You need to decompress the .7z file using 7 Zip)
portaudio.dll
from a previous MuseScore install (bin
directory) and copy to C:\Qt\Tools\mingw530_32\lib
portaudio.h
from the current version at http://www.portaudio.com/download.html and copy to C:\Qt\Tools\mingw530_32\i686-w64-mingw32\include
. You need to decompress the .tar.gz file using 7 Zip, as before.NOTE: as of 1220175, 04Dec2020, PortAudio is no longer needed nor supported in the master branch.
Jack
in your program files directory. The name of the program files directory can vary depending on the version and language of Windows. The environment variable %ProgramFiles%
or %ProgramFiles(x86)%
is used to find the directory. On an English version of Windows this will result in looking in C:\Program Files\Jack
or in C:\Program Files (x86)\Jack
on a Windows 64-bitinclude\sndfile.h
into C:\Qt\Tools\mingw530_32\i686-w64-mingw32\include
bin/libsndfile-1.dll
into C:\Qt\Tools\mingw530_32\lib
C:\Qt\Tools\mingw530_32\i686-w64-mingw32\include
directory called lame
include\lame.h
into C:\Qt\Tools\mingw530_32\i686-w64-mingw32\include\lame
C:\Qt\Tools\mingw530_32\lib
NOTE: as of 1220175, 04Dec2020, LAME is no longer needed nor supported in the master branch.
If you wish to use the QtCreator IDE, follow the instructions in section "Qt Creator IDE", below.
Open a command line, possibly using a batch file such as qt.bat
given above.
Browse to the directory where you checked out musescore
Enter
mingw32-make -f Makefile.mingw release
or
mingw32-make -f Makefile.mingw debug
Note that the two options internally set different flags for the compiler. In debug mode the QT_DEBUG
flag is used, so conditional code controlled by #ifdef QT_DEBUG
is compiled. In release mode NDEBUG
is set. Unless you are building a release, it is suggested that you use the "debug" option, like in the section on the Qt Creator IDE (below).
Be patient ... On my Vista laptop (Intel T7550) it takes more than one hour to build. Build times on Windows can be more than twice as long as build times on Ubuntu (using the same computer). Once the compilation finishes, the MuseScore executable can be found in build.release/mscore/MuseScore.exe
or build.debug/mscore/MuseScore.exe
. So long as C:\Qt\Tools\mingw48_32\lib
is in the PATH, it should not be necessary to copy any DLLs. However, it has been found necessary to copy the complete directories iconengines
and imageformats
from %QTDIR%\plugins
to the build.release/mscore
or build.debug/mscore
directory (resulting in, for example, build.debug/mscore/iconengines
. This should be sufficient for most development work.
Note: You may need to go into the preferences, and fix the paths to have Windows-style slash characters (backslash), or you may see error messages about not being able to open files. [Is this a bug?]
If you need the language files, instrument list, templates, and the normal directory structure of a installed version of MuseScore then type:
mingw32-make -f Makefile.mingw install
or, for a debug build:
mingw32-make -f Makefile.mingw installdebug
Once install has finished look in the current directory for win32install/bin/MuseScore.exe. In this case there is no need to copy DLLs or the plugins directories, as they are already copied during the make process.
Note: These instruction are know to work up to QtCreator 3.6.1. For instructions for QtCreator 4.x see Qt Creator 4.x compile instructions instead.
Once you setup everything above, you can open Qt Creator, either by typing start qtcreator
from within a command prompt started as above, or by creating a separate batch file with start qtcreator
as the last command.
Go to File ⇒ Open File or Project....
Choose CmakeLists.txt file type and open the file CmakeLists.txt
from your source directory.
Now it will take you through a pathwizard:
MuseScore-build
, if MuseScore
is your checkout directory. Change this to choose a build directory of MuseScore/build.qtc
instead.C:\Program Files (x86)\CMake\bin
)-DCMAKE_BUILD_TYPE=DEBUG -DCMAKE_TOOLCHAIN_FILE=build/mingw32.mingw.cmake -DCMAKE_INSTALL_PREFIX=../win32install
Note: the -DCMAKE_TOOLCHAIN_FILE=build/mingw32.mingw.cmake
is needed the first time, but leads to a warning about being unused on subsequent times...
Note: as of 9caf157 (for the master branch) this file build/mingw32.mingw.cmake
no longer exists and so the -DCMAKE_TOOLCHAIN_FILE=build/mingw32.mingw.cmake
needs to get removed from the config.
As for the manual build, the supplementary DLLs should be found via C:\Qt\Tools\mingw530_32\lib
in the PATH, so no further setting of environment variables should be required.
Before your first build or debug session, you will need to configure the Build, Deploy, and Run steps. Click Projects at left, then Build toward the top of the screen. Under Build Steps, expand the Details button and add a checkmark next to the lrelease
target.
Then go back to the top of the screen and click Run. On this screen, you will first need to click Add Deploy Step. Select Make, then select install
under Targets. Finally, you will need to click the Add button under Run Configuration to add a custom executable, and set it to %{sourceDir}\win32install\bin\MuseScore.exe
.
To compile the debug build and start debugging go to Debug ⇒ Start debugging ⇒ Start debugging or simply click the debug icon. You have access to Qt help, completion, and debugging features!
Note that there is a bug in the Qt Creator debugger. In some cases it will crash when a QPrinter object is instantiated (http://bugreports.qt-project.org/browse/QTBUG-14048). This happens when you print (of course!).
Attachment | Size |
---|---|
Qt-additions.zip | 3.58 MB |
This page is a walkthrough for setting up MuseScore debugging with Qt Creator 4.x. It assumes you have completed all steps from Compile instructions (Windows - MinGW) - Git before starting.
start qtcreator
from within a command prompt started as above, or by creating a separate batch file with start qtcreator
as the last command.CMakeLists.txt
from your source directory. This will lead to a screen to start configuring the project.Make sure to change the build directory to be build.qtc
directly under the directory of your git clone. Please make sure the name of the build directory does not contain spaces.
In the screenshot, the project was cloned into MuseScore_git
, so this results in the following setting:
Click on Configure Project to continue.
Navigate to Projects ⇒ Build & Run ⇒ Build to adjust the following CMake settings:
../win32install
(use ..\win64install
for 64-bit builds, possible with Qt 5.12). Seems for master branch it is now one lever higher, so drop the ../
.DEBUG
(Prior to cd19c84 for master and cba1df2 for 2.2 mind the uppercasing!, later builds are fine using the default value of Debug
)Additional changes for older versions before 9caf157 (5th January 2018)
Click on Apply Configuration Changes
CMake will automatically run. You'll see a spinner over the CMake settings while it does.
Note: You might get a warning from CMake about QT_QMAKE_EXECUTABLE not being used.
Scroll a bit down to the Build Steps area. Expand the Details of that area and select the lrelease
target.
Use the button just below this list to add another Build step:
And set it to the install
target:
In the left column of the screen, click on Run to switch to the Run Settings. Where the Run configuration is set, choose to Add a Custom Executable
.
Finally, set the Executable value to %{sourceDir}\win32install\bin\MuseScore3.exe
(use win64install
for 64-bit builds and MuseScore3.exe
when building MuseScore 3, and MuseScore4.exe
when building MuseScore 4)
These are some of the problems that you may or may not face while completing the next section.
The compile time for debug build will vary from 10 minutes (8 core system) to 1 hour (single core) depending on the number of cores that your system has.
One should disable the ClangCodeModel in the top bar under Help > Plugins > C++ otherwise you may get many C++ errors/issues. These don't prevent a build but may result in missing important warnings and real errors.
After step 2, if you get an error stating that libgcc_s_seh-1.dll not found under your mingw root directory's bin, then you're most probably building a 32-bit version, then you have to disable BUILD_64 from your building process. To do so go to Projects in the left hand side. Under Build & Run, click on Build. Where you previously set CMAKE_EXECUTABLE_PATH, there will also be a checkbox for BUILD_64. Disable that and then follow the instructions in the next section.
Most likely you will be able to compile successfully.
To compile the debug build and start debugging you can do either one of the following:
If you have a multi-core/threading processor, compilation can be sped up significantly by allow Qt Creator to launch multiple parallel build processes. To achieve this, you can set -j%NUMBER_OF_PROCESSORS%
in the Tool arguments for both the Build Steps as the Deployment Steps.
On a quad-core hyperthreading processor you could go up to -j8
to maximize the processor load. It might be wise to set the number to be one lower than your maximal number of processes, allowing you to perform another program while the build is running.
If you are facing errors which mention resfile.o in description like here (see https://musescore.org/en/node/151481), the following command line hack should help you.
The issue relates to incorrectly initialized windres tool and its path. To correctly initialize the related cmake data, please do the following:
mingw32-make.exe -f Makefile.mingw debug
mingw32-make.exe -f Makefile.mingw installdebug
On that same tab, go to Manage Kits…. Select the default kit and click the Change… button for the CMake Configuration setting. In the edit popup window, add CMAKE_TOOLCHAIN_FILE:STRING=build/mingw32.mingw.cmake
or CMAKE_TOOLCHAIN_FILE:FILEPATH=build/mingw32.mingw.cmake
as a new line and OK out of both popup windows.
Note: as of 9caf157 (for the master branch) this CMAKE_TOOLCHAIN_FILE:FILEPATH=build/mingw32.mingw.cmake
is no longer valid and needs to get removed from the config.
This page is instructions for how to use the MSVC compiler inside the Qt Creator IDE. This is useful to take advantage of Qt-specific features, like visual editing of UI files in Qt Creator's Design mode.
If you don't mind having multiple IDEs, the easiet way to get what you need to to follow the Prerequisites section of the guide for Visual Studio and then return here when done.
Microsoft makes their build tools available separately to the Visual Studio IDE, so if you are using Qt Creator as your IDE then in theory it should be possible to compile MuseScore without also installing Visual Studio. Unfortunately this doesn't seem to be working at the moment, so the best thing to do is to follow the instructructions above to install with Visual Studio.
If you really want to try without Visual Studio (e.g. if short on disk space) then you can try installing just the C++ build tools. This has worked in the past, but fails with linker errors when last tried (November 2020). It's possible this could be fixed by using the right combination of include statements in MuseScore's header files, or by choosing the right combination of options in Microsoft's build tools installation wizard.
To install only the C++ build tools:
Run the installer you downloaded, and when you get the the Workloads screen, ensure the C++ build tools option is checked. That's the only thing you need.
You can optionally look under the Individual components tab, where you should see the following items checked:
It's possible that you don't need all of those components, but installing them does no harm (assuming you have enough space on your drive).
The Windows 10 SDK offered with the Build Tools installer does not include debugging tools by default. To get the CDB debugger for Windows, you need to modify the SDK installation to include it.
Select Change and click Next. You should see this screen:
Select the Debugging Tools for Windows option and click Change.
If you already have Qt installed then you can simply run the Maintenance Tool that came with it (the tool is in C:\Qt or wherever you installed Qt). If you don't have Qt already installed, you need to download the Qt Online Installer for Windows and run that instead.
Ensure the following components are checked within the Maintenance Tool / Online Installer:
If you want to be able to debug within Qt Creator (recommended), also check:
Click Next to install these components.
Download dependencies.7z and extract the contents into the base directory. (This will create a new dependencies folder in that base directory.)
Also install Jack.
It's a good idea to make sure you can compile from the command line before you try to set up an IDE.
The following batch script has the commands need to set up the build environment and compile MuseScore. Modify the paths as neccesary for your machine, then save the file as msvc_build.bat
inside your MuseScore code repostory.
REM Add Qt to PATH
SET "PATH=C:\Qt\5.12.9\msvc2017_64\bin;%PATH%"
REM Set up build environment (next line optional, but uncomment it if compiler is not found)
REM CALL "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Auxiliary\Build\vcvars64.bat"
REM Tell MSVC to use all processor cores
SET "CFLAGS= /MP%NUMBER_OF_PROCESSORS%"
SET "CXXFLAGS= /MP%NUMBER_OF_PROCESSORS%"
REM Create build directory
IF not exist "my_build_dir\" MKDIR "my_build_dir"
CD my_build_dir
REM Configure, build and install MuseScore
cmake .. -DCMAKE_BUILD_TYPE=RELWITHDEBINFO -DCMAKE_INSTALL_PREFIX=my_install_dir
cmake --build . -j %NUMBER_OF_PROCESSORS%
cmake --build . --target install
ECHO "Executable location: my_build_dir\my_install_dir\bin\MuseScore4.exe"
Add the script's filename to .git/info/exclude
to prevent it from being checked-in to the repository.
To run the script:
cd
(change directory) followed by a space and the path to your MuseScore code repository
cd C:\Users\[username]\MuseScore
cd
commandmsvc_build.bat
and press Enter to run it.The following shortcuts make command prompt much easier to use:
Clicking the CMD icon in the top left corner of the window brings up a menu with useful options, including Edit and Properties. You might want to go into Properties and enable "Use Ctrl+Shift+C/V as Copy/Paste". These are the standard copy and paste shortcuts available in most Command Prompt / Terminal applications on Windows and Linux.
Note: there are two other primary build modes, debug
and release
. Debug
is not currently supported for MSVC due to linking errors.
IDEs are convenient for experienced users, but they introduce another layer of complexity. If something goes wrong then you might not know whether the issue is with the IDE or the compiler.
To retain control over the compile process, you could choose to ignore Qt Creator's IDE features and just use it as a text editor for MuseScore's .cpp, .h and .ui files. Simply keep your Command Prompt open in a separate window, and press Up and Enter every time you want to recompile.
To set up a basic project where Qt Creator is only used as a text editor:
*.ui
to the list of types shown*
to the list of types hidden (hides everything else)libmscore
, mscore
and mtest
You can debug inside Qt Creator even if the program wasn't built in Qt Creator.
To set this up within your Qt Creator project:
Now when you want to debug, go to the Debug menu > Start debugging > Start debugging without deployment.
If you try to debug and see the message "Unable to create a debugging engine", make sure that you installed the Debugging Tools inside the Windows SDK and installed CDB Debugger Support in Qt Creator as explained earlier. If it still doesn't work then go to the Projects tab in the left panel, click "Manage Kits" and make sure the correct debugger is selected for you chosen kit.
To avoid having to open CMD, you can tell Qt Creator to run your mybuild.bat
script for you every time you press a compile button with Qt Creator itself. This gives you the best of both worlds: you get the convenience of an IDE but still have the flexibility and reliability of a separate build script.
To get Qt Creator to use your build script:
Now when you want to build, simply press the big green triangle with the bug in the bottom left of the screen. When you want to delete the build files and start again, go to the Build menu and choose "Clean Project".
MuseScore uses the CMake build system. The "proper" way to set up a CMake project in Qt Creator is as follows:
Qt Creator will spend a few minutes "configuring" the project, but once that's done everything is set up all ready for you to click "build". There's no need to go messing around with build and debug configurations, as Qt Creator does this automatically. At least, that's the theory...
In practice, the automatic method is vulnerable to changes in the CMake files, and it tends to break fairly often without reason. This forces you to run the configuration again, which takes a few minutes in Qt Creator (and other IDEs) but only takes a couple of seconds on the command line.
Ultimately, the most reliable way to compile is to copy whatever is done inside the build scripts used for MuseScore's CI tests. Build scripts will always use a command line method rather than an IDE.
This guide is for compiling MuseScore from the source code for testing and/or contributing purposes. If you just want to test (and not contribute code changes) then you may find using a pre-compiled Development Build easier than compiling.
You shouldn't use this method to install MuseScore for everyday score editing. Instead, get the latest official release from the Downloads page. (Of course, if there's no package for your distribution then you have no choice but to compile.)
MuseScore uses Git for version control. Use these commands to get MuseScore's source code for building and testing purposes. (If you want to make changes to the code then substitute the clone URL for the URL of your own fork of MuseScore on Github, and also read Git Workflow.)
git clone git://github.com/musescore/MuseScore.git cd MuseScore
Note: the "git clone" command will put the code in a new folder called "MuseScore", so we use "cd" to enter the MuseScore directory. All subsequent commands in this guide should be run from the "MuseScore" directory.
# Fetch only the files required by (for example) the v2.0.2 tag: # Note: Simply remove "--depth 1" if your git doesn't have that argument. git clone --depth 1 git://github.com/musescore/MuseScore.git --branch v2.0.2 cd MuseScore
This is useful if you were forced to compile MuseScore because no package was available for your distribution, or if you are building a package. Tags are more stable than development branches so their use is recommended in this situation.
Please refer to the README.md in the git repository to get relevant information!
Firstly, you should update the revision number that will be displayed in MuseScore's Help → About dialog. This is useful for tracking issues so this step should be done by everyone, including package maintainers. Simply do:
make revision
If you don't already have a copy of MuseScore installed on your machine then you can compile the usual way:
# This causes conflicts if multiple versions are present and therefore is NOT RECOMMENDED make sudo make install
This creates an executable file /usr/local/bin/mscore
which can be run by typing mscore
in the terminal.
However, if you do have (or plan to have) another version of MuseScore installed (e.g. via your distribution's package manager) then you'll probably want to be able to distinguish between them, so do this instead:
# Use SUFFIX and LABEL if multiple versions are installed to distinguish between them make SUFFIX="-self" LABEL="Self Build" sudo make SUFFIX="-self" LABEL="Self Build" install
NOTE:make install
is required, even for development. Because when runtime, built executable (CMAKE_BINARY_DIR/mscore/mscore
) needs some installed files, for example, soundfonts, which is located at `/usr/local/share/mscore-VERSION/sound/`. Running the built executable withoutmake install
will cause crash.
This creates an executable file /usr/local/bin/mscore-self
which can be run by typing mscore-self
in the terminal. Alternatively, you can click on the relevant icon from your desktop launcher:
The label "Self Build" allows you to distinguish your compiled version from any other versions you might have installed (e.g. official releases or nightly builds). You can set SUFFIX and LABEL to anything you want (but no spaces in SUFFIX).
You can stop reading here if you want. The following section is not required. However, it may give you some tips about custom installation or optional post-installation tasks.
Note: it is no longer necessary to use PREFIX to avoid $PATH
conflicts when installing multiple versions (you can use SUFFIX and LABEL instead). Of course, you might have other reasons for using PREFIX.
If you want to install MuseScore elsewhere (not in the default location /usr/local
), you can specify the path as follows:
make revision make PREFIX=$HOME/software make PREFIX=$HOME/software install
In this example, a local installation (only for the current user; no root privileges needed) is done. The resulting executable file is bin/mscore
, located in the folder specified during build. For the above example, this gives $HOME/software/bin/mscore
.
Note: for more info about the development process with git
, see Git Workflow
.
The source code previously downloaded with git
can be updated locally. Only new commits will be retrieved:
cd MuseScore git pull
Note about the first command: the folder MuseScore
is the one created by git
and where you performed the compilation.
After updating you will need to compile again using:
# Remember to change SUFFIX and LABEL here if you set them to something else previously make revision make SUFFIX="-self" LABEL="Self Build" sudo make SUFFIX="-self" LABEL="Self Build" install
'make' is clever and it will only get the compiler to compile the new files; unchanged files and files where no dependency has changed will not be recompiled, so it should be much faster than the initial compile. However, sometimes errors occur during compilation and it will be necessary to start again from scratch. To do this you must delete all of the intermediate object files (of which there are many!) that are created in the source code folder during compilation. Fortunately, there is a simple command to do this for you:
make clean
The next time you try to compile the code, it will start anew.
Note: before using make clean
you should read the notes for "Uninstalling MuseScore" (immediately below).
There is a Makefile target to uninstall, so removing MuseScore is effortless:
sudo make uninstall
Obviously you must run this from within the MuseScore
source code folder (created by git
) where you performed the compilation.
Note:
make uninstall
before you run make clean
because it is not possible to do so afterwards.make uninstall
or make clean
it is not necessary to specify any variables (PREFIX, SUFFIX, etc.) even if you specified them during compilation.make uninstall
was unavailable or broken on the latest development branch. In such cases, your last resort is to use a more arbitrary and dirty way to uninstall:xargs rm < install_manifest.txt
MuseScore is a sophisticated program made up of millions of lines of code split among thousands of files. Although it is possible to edit the code in any text editor and build from the command line, there are specialised tools to make the challenge of coding and spotting errors in such a huge project much easier to manage:
These are some of the problems that you may or may not face while completing the next section.
1. The compile time for debug build will vary from 10 minutes (8 core system) to 1 hour (single core) depending on the number of cores that your system has.
2. One should disable the ClangCodeModel in the top bar under Help > Plugins > C++ otherwise you may get many C++ errors/issues. These don't prevent a build but may result in missing important warnings and real errors.
If you have a multi-core/threading processor, compilation can be sped up significantly by allow Qt Creator to launch multiple parallel build processes. To achieve this, you can set -j$(shell getconf _NPROCESSORS_ONLN 2>/dev/null || getconf NPROCESSORS_ONLN 2>/dev/null || echo 1) in the Tool arguments for both the Build Steps as the Deployment Steps. You can also manually set the number of threads, e.g. -j8.
On a quad-core hyperthreading processor you could go up to `-j8` to maximize the processor load. It might be wise to set the number to be one lower than your maximal number of processes, allowing you to perform another program while the build is running.
This is the normal way (but not necessarily the best way) to configure Qt Creator for a CMake project. The advantage of this method is that Qt Creator does most of the setup and configuration for you. The disadvantage is that the CMake configuration can break from time-to-time when MuseScore's CMakeLists.txt are changed. This method also makes it more difficult to compile MuseScore from the Terminal should you need to do so.
To install MuseScore so all features will be available (e.g. SoundFonts and templates) do the following:
In "Build settings" set the Cmake setting CMAKE_INSTALL_PREFIX to install. Remember to click "Apply Configuration Changes".
In "Run settings" add a deploy step where target is install (cmake --build . --target install). Then add a "Custom Executable" run configuration with executable set to %{buildDir}/install/bin/mscore (if that does not work, try %{sourceDir}/install/bin/mscore).
This method bypasses Qt Creator's built-in handling of CMake and simply specifies some Terminal commands to build and run MuseScore. This makes it easier to build MuseScore outside of Qt Creator and ensures that you always use an up-to-date CMake configuration.
*.ui
to the list of file types to be shown, and *
to the list of types to be hidden (hides everything else) and then apply the filter.libmscore
, mscore
and mtest
and then click "Next".Build directory: ~/src/MuseScore (or wherever the code is located) Build steps: make revision make installdebug PREFIX=install SUFFIX=-qt LABEL="Qt Creator Build" UPDATE_CACHE=FALSE Clean steps: make uninstalldebug make clean Build environment: Use System Environment
Executable: build.debug/install/bin/mscore-qt (this file won't exist until you run the build for the first time) Working directory: %{buildDir}
Using the Makefile means that you always use the same build configuration as Travis. If the CMake options are changed by a PR then your configuration is updated automatically when you fetch and merge the changes from upstream.
mkdir musescore_build
cd musescore_build
cmake -G"Eclipse CDT4 - Unix Makefiles" -D CMAKE_BUILD_TYPE=Debug ../MuseScore
More information: http://www.cmake.org/Wiki/Eclipse_CDT4_Generator
This page contains only the compilation instructions that are specific to Ubuntu 12.04 LTS.
Tested working on: Ubuntu 12.04 LTS Desktop and Server editions.
GCC 4.8 or higher is needed. On Ubuntu 12.10 and higher, it's the default compiler. On Ubuntu 12.04, you will need to install it.
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test sudo apt-get update sudo apt-get install g++-4.8 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.8
Download and install Qt 5.3 from http://qt-project.org/downloads
Add Qt bin directory in your $PATH.
For 32-bit:
echo "PATH=~/Qt5.3.2/5.3.2/gcc/bin:$PATH" >> ~/.bashrc source ~/.bashrc
or for 64-bit:
echo "PATH=~/Qt5.3.2/5.3.2/gcc_64/bin:$PATH" >> ~/.bashrc source ~/.bashrc
sudo apt-get install git cmake sudo apt-get install alsa libsndfile1 sudo apt-get install libasound2-dev portaudio19-dev libsndfile1-dev zlib1g-dev libfreetype6-dev sudo apt-get install lame libmp3lame-dev sudo apt-get install libssl-dev
In Ubuntu 13.04 you need to install these additional libraries:
sudo apt-get install libdrm-dev libgl1-mesa-dev
Note: In some cases, libgl1-mesa-dev(and/or libegl1-mesa-dev) needs to be installed in Ubuntu 12.04 desktop edition too. Install this library if you get the following error while making:
Failed to find "GL" in "".
sudo apt-get install libpulse-dev sudo apt-get install doxygen
Now follow the generic instructions for compiling on Linux.
This page is deprecated and kept for reference. The current development of MuseScore is done on Git and the SVN repo is abandoned. You can find instructions to build the most up to date version in the developer handbook
The following steps explains how to build and install MuseScore trunk on Ubuntu 9.10 Karmic Koala.
These instructions have been tested on a clean Ubuntu server distrib.
Qt 4.7 PPA: deb http://ppa.launchpad.net/kubuntu-ppa/backports/ubuntu lucid main
sudo apt-get update
sudo apt-get install subversion
mkdir musescore
cd musescore
svn co https://mscore.svn.sourceforge.net/svnroot/mscore/trunk .
cd ..
wget http://get.qt.nokia.com/qtsdk/qt-sdk-linux-x86-opensource-2010.05.1.bin
chmod a+x qt-sdk-linux-x86-opensource-2010.05.1.bin
wget http://get.qt.nokia.com/qtsdk/qt-sdk-linux-x86_64-opensource-2010.05.1.bin
chmod a+x qt-sdk-linux-x86_64-opensource-2010.05.1.bin
./qt-sdk-linux-x86-opensource-2010.05.1.bin
./qt-sdk-linux-x86_64-opensource-2010.05.1.bin
if [ -d ~/qtsdk-2010.05/qt/bin ] ; then
PATH=~/qtsdk-2010.05/qt/bin:"${PATH}"
fi
source .bashrc
sudo apt-get install libglib2.0-dev libSM-dev libxrender-dev libfontconfig1-dev libxext-dev
sudo apt-get build-dep musescore
If this magic command doesn't work, try to install the following dependencies manually:
sudo apt-get install alsa
sudo apt-get install libasound2-dev
sudo apt-get install libsndfile1
sudo apt-get install libsndfile1-dev
sudo apt-get install portaudio19-dev
Type the following to compile and install MuseScore. It will take quite some time to compile. On a 1.7Ghz CPU, it takes more than an hour.cd musescore
make revision
make release
sudo make install
Are easier... Use the update subcommand of svn and don't forget make revision
to have the right revision number in the about box.
If the build environment didn't change (Qt version etc...), type the following
svn update
make revision
sudo make install
If you want to build from scratch : cd musescore
svn update
make clean
make revision
make release
sudo make install
mkdir musescore_build
cd musescore_build
cmake -G"Eclipse CDT4 - Unix Makefiles" -D CMAKE_BUILD_TYPE=Debug ../musescore
More information: http://www.cmake.org/Wiki/Eclipse_CDT4_Generator
Hier zijn de vereiste stappen voor het compileren van 0.9.3 op Ubuntu 8.04 Hardy:
Installeer eerst de vereiste afhankelijkheden (als u die reeds hebt)
sudo apt-get build-dep mscore
Download de .tar.bz source from Sourceforge, uncompress, compileer en install :
bunzip2 mscore-0.9.3.tar.bz2
tar xf mscore-0.9.3.tar
cd mscore-0.9.3
[De "make revision" stap hieronder is optioneel, Het revisienummer kunt u vinden in het scherm >>>Help>>> Over Musescore]
make revision
make
[ga een kopje koffie drinken tot hij klaar is...]
sudo make install
This page contains only the compilation instructions that are specific to Ubuntu and related Debian-based distributions.
Tested working on: Ubuntu 16.04 LTS, 18.04 LTS, and 20.04 LTS
It should also work with the various Ubuntu flavours, including Ubuntu MATE, Ubuntu Studio, Kubuntu and Xubuntu, etc.
It should work on derivatives such as Linux Mint, and it may also work on the corresponding Debian and Debian-derived distributions like Raspian.
Recent distributions have up-to-date versions of most of the necessary packages in the default repositories.
sudo apt-get install git cmake g++
sudo apt-get install libasound2-dev portaudio19-dev libmp3lame-dev libsndfile1-dev libportmidi-dev
sudo apt-get install libssl-dev libpulse-dev libfreetype6-dev libfreetype6
If you get an error message like this while compiling:
Failed to find "GL" in "".
Then try installing these additional libraries:
sudo apt-get install libdrm-dev libgl1-mesa-dev libegl1-mesa-dev
MuseScore uses Qt to achieve a consistent look and feel across different platforms (Mac, Windows & Linux). Qt is updated more frequently than any other dependency. Having an out-of-date version of Qt is the most common cause of problems as far reaching as strange window behavior, keyboard shortcuts not working, or the code failing to compile outright.
If your repository has Qt version 5.15 (or 5.9 for 3.x), or later, you can get Qt from your repository:
sudo apt-get install qtbase5-dev qttools5-dev qttools5-dev-tools qtwebengine5-dev \
qtscript5-dev libqt5xmlpatterns5-dev libqt5svg5-dev libqt5webkit5-dev \
qtbase5-private-dev libqt5x11extras5-dev qtdeclarative5-dev qtquickcontrols2-5-dev
Might need these too:
sudo apt-get install qml-module-qtquick-controls2 qml-module-qtquick-window2 qml-module-qtquick2 qml-module-qtgraphicaleffects qml-module-qtqml-models2 libqt5quicktemplates2-dev qtquickcontrols2-5-dev libqt5x11extras5 libqt5x11extras5-dev libqt5networkauth5 libqt5networkauth5-dev qtbase5-private-dev
If musescore compiles but you get a warning message while compiling about QuickTemplates2, you may get an empty Palette in Musescore. If so, check to see if "/usr/lib/x86_64-linux-gnu/cmake/Qt5QuickTemplates2" exists. If not, try copying:
/usr/lib/x86_64-linux-gnu/cmake/Qt5QuickControls2/Qt5QuickControls2Config.cmake
/usr/lib/x86_64-linux-gnu/cmake/Qt5QuickControls2/Qt5QuickControls2ConfigVersion.cmake
to
/usr/lib/x86_64-linux-gnu/cmake/Qt5QuickTemplates2/Qt5QuickTemplates2Config.cmake
/usr/lib/x86_64-linux-gnu/cmake/Qt5QuickTemplates2/Qt5QuickTemplates2ConfigVersion.cmake
And replace all mentions of "QuickControls2" with "QuickTemplates2".
If your repository does not have 5.15 (5.9), or later then follow these steps to install it:
(Note that having two different versions of Qt installed can cause difficulties. If you installed using "apt-get install" above, then you may want to remove that before following these steps.)
sudo chmod +x qt-unified-linux-x64-2.0.3-online.run
sudo ./qt-unified-linux-x64-2.0.3-online.run
echo 'export PATH=/opt/Qt/5.8/gcc_64/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
You can check the Qt installation and version by typing "qmake -version
" in a terminal.
If you experience any problems with MuseScore, first check you have the latest copy of the MuseScore source code, and then check you have the latest copy of Qt. Only once you have confirmed this (and done the same for the other dependencies) should you consider creating a bug report in the issue tracker.
Now follow the Compile instructions (Linux & BSD) - Git.
The remaining steps on this page are optional. Read them if you experience problems or wish to completely uninstall MuseScore and it's dependencies.
Remember all the packages installed previously in order to compile MuseScore? Actually, even more were installed because each installed package has its own dependencies. If you don't want them anymore, here's how to remove them.
When you proceed with the installation, apt-get
outputs in the terminal the complete list of packages that are to be installed. If you copy this list, the packages can be easily removed later with this command:
sudo apt-get remove --purge LIST
If you did not copy this output and still want to remove all the packages, it's a little more complicated but still feasible. For each command entered, for example:
sudo apt-get install git cmake g++
an entry is added in the following log file: /var/log/apt/history.log
. Open it with a text editor and find the relevant entry. Example:
Start-Date: START DATE OF INSTALLATION
Commandline: apt-get install git cmake g++
Install: libstdc++-4.9-dev:amd64 (4.9.1-15ubuntu1, automatic), libc-dev-bin:amd64 (2.19-10ubuntu1, automatic), g++:amd64 (4.9.1-4ubuntu2), g++-4.9:amd64 (4.9.1-15ubuntu1, automatic), liberror-perl:amd64 (0.17-1.1, automatic), git-man:amd64 (2.1.0-1, automatic), git:amd64 (2.1.0-1), cmake:amd64 (2.8.12.2-0ubuntu5), cmake-data:amd64 (2.8.12.2-0ubuntu5, automatic), linux-libc-dev:amd64 (3.16.0-16.22, automatic), libc6-dev:amd64 (2.19-10ubuntu1, automatic)
Upgrade: MAY BE THERE BUT IT'S NOT RELEVANT
End-Date: END DATE OF INSTALLATION
Text that must be copied follows the key Install:
libstdc++-4.9-dev:amd64 (4.9.1-15ubuntu1, automatic), libc-dev-bin:amd64 (2.19-10ubuntu1, automatic), g++:amd64 (4.9.1-4ubuntu2), g++-4.9:amd64 (4.9.1-15ubuntu1, automatic), liberror-perl:amd64 (0.17-1.1, automatic), git-man:amd64 (2.1.0-1, automatic), git:amd64 (2.1.0-1), cmake:amd64 (2.8.12.2-0ubuntu5), cmake-data:amd64 (2.8.12.2-0ubuntu5, automatic), linux-libc-dev:amd64 (3.16.0-16.22, automatic), libc6-dev:amd64 (2.19-10ubuntu1, automatic)
To remove these packages:
sudo apt-get remove --purge $(echo "TEXT COPIED ABOVE" | sed -r 's/\s\([^\)]+\),?//g')
IMPORTANT: by doing so, you may remove some Qt packages needed to run MuseScore. The following command should ensure that you have all that is required:
sudo apt-get install libqt5core5a libqt5gui5 libqt5network5 libqt5xml5 libqt5xmlpatterns5 \
libqt5svg5 libqt5printsupport5 libqt5webkit5
lrelease
When we invoke make
, a call to the executable lrelease
is done during the process. However, it's not the command /usr/bin/lrelease
from the package qtchooser
but the one from qttools5-dev-tools
. That's why the package qttools5-dev-tools
is added in the list of dependencies to install. If it was not installed, the following error would occur during the make
invocation:
make[4]: Entering directory '/path/to/MuseScore/build.release'
/bin/sh: 1: /usr/lib/x86_64-linux-gnu/qt5/bin/lrelease: not found
CMakeFiles/lrelease.dir/build.make:49: recipe for target 'CMakeFiles/lrelease' failed
make[4]: *** [CMakeFiles/lrelease] Error 127
make[4]: Leaving directory '/path/to/MuseScore/build.release'
and the following during the make install
invocation:
CMake Error at share/locale/cmake_install.cmake:36 (FILE):
file INSTALL cannot find
"/path/to/MuseScore/share/locale/mscore_af.qm".
Call Stack (most recent call first):
share/cmake_install.cmake:43 (INCLUDE)
cmake_install.cmake:45 (INCLUDE)
Makefile:62: recipe for target 'install' failed
make[1]: *** [install] Error 1
make[1]: Leaving directory '/path/to/MuseScore/build.release'
Makefile:92: recipe for target 'install' failed
make: *** [install] Error 2
This page contains only the compilation instructions that are specific to openSUSE distributions.
sudo zypper install -y git gcc7 gcc-c++ make cmake
sudo zypper install -y alsa-devel libpulse-devel libjack-devel portaudio-devel libQt5Core-devel \
libQt5Gui-devel libQt5Network-devel libQt5Test-devel libQt5QuickControls2-devel \
libQt5Xml-devel libqt5-qtsvg-devel libQt5Sql-devel libQt5Widgets-devel \
libQt5PrintSupport-devel libQt5Concurrent-devel libQt5OpenGL-devel libqt5-linguist-devel \
libQt5Help5 libqt5-qttools-devel libqt5-qtwebengine-devel libmp3lame-devel \
libsndfile-devel portmidi-devel libvorbis-devel
qmake
On openSUSE, the tool qmake
is refering to the Qt4 version of this tool. However, since MuseScore is using Qt5, the tool qmake-qt5
should be used!
This can be done by editing the file build/FindQt5.cmake
and change line 38
find_program(QT_QMAKE_EXECUTABLE qmake)
into
find_program(QT_QMAKE_EXECUTABLE qmake-qt5)
An alternative is to create a script qmake
in you path with the contents:
#!/bin/bash --noprofile exec qmake-qt5 ${*}
Now follow the generic instructions for compiling on Linux.
These instructions are tested on
* openSUSE 15.1
* openSUSE Tumbleweed as per September 9th, 2019
Please note openSUSE Tumbleweed is a rolling release with the most recent release of the used packages. At this moment (September 12th, 2019) the installed version of Qt5 is Qt5 5.13.1. This version causes several compile warnings but the resulting executable runs.
To use the recommended version of Qt5, installed the required Qt packages from another source, e.g. the openSUSE download site.
This page contains only the compilation instructions that are specific to Fedora and related RPM-based distributions.
Tested working on: Fedora 21 and 22
Install dependencies:
# Note: Use "yum" instead of "dnf" on older systems. sudo dnf install -y gcc gcc-c++ qt-devel pulseaudio-libs-devel alsa-lib-devel jack-audio-connection-kit-devel qt5-qtbase-devel qt5-qttools-libs-designercomponents qt5-qttools-devel portaudio-devel poppler-qt5-devel qt5-qtdeclarative-devel qt5-qtscript-devel qtermwidget-qt5-devel qt5-qtwebkit-devel qt5-qtxmlpatterns-devel qt5-qtquick1-devel qt5-qtsvg-devel qt5-qttools-devel qt5-qttools-static lame-devel libsndfile-devel freetype-devel texlive-scheme-basic qt5-qtwebengine qt5-qtwebengine-devel libvorbis-devel
Tested working on Fedora 28 :
sudo dnf install -y gcc gcc-c++ qt-devel pulseaudio-libs-devel alsa-lib-devel jack-audio-connection-kit-devel qt5-qtbase-devel qt5-qttools-libs-designercomponents qt5-qttools-devel portaudio-devel poppler-qt5-devel qt5-qtdeclarative-devel qt5-qtscript-devel qtermwidget-qt5-devel qt5-qtwebkit-devel qt5-qtxmlpatterns-devel qt5-qtsvg-devel qt5-qttools-devel qt5-qttools-static lame-devel libsndfile-devel freetype-devel texlive-scheme-basic qt5-qtwebengine qt5-qtwebengine-devel libvorbis-devel portmidi-devel qt5-qtnetworkauth qt5-qtnetworkauth-devel qt5-qtquickcontrols2 qt5-qtquickcontrols2-devel qt5-qtx11extras qt5-qtx11extras-devel qt5-qtbase-private-devel
Now follow the generic instructions for compiling on Linux.
Fedora 20 is deprecated and this page kept for reference only. You can find instructions to build the most up to date version in the developer handbook
Add the rpmfusion.org nonfree repository to yum, then:
sudo yum install qt5-qtwebkit-devel.x86_64 qt5-qtxmlpatterns-devel.x86_64 qt5-qtsvg-devel.x86_64 alsa-lib-devel.x86_64 jack-audio-connection-kit-devel.x86_64 portaudio-devel.x86_64 pulseaudio-libs-devel.x86_64 libsndfile-devel.x86_64 libvorbis-devel.x86_64 qt5-qttools-devel.x86_64 cmake.x86_64 cmake-gui lame-devel.x86_64
Or build lame from source and remove lame-devel from the yum install.
Change to the extracted or git cloned source directory, then:
Run:
sudo pacman -S --needed alsa-lib freetype2 libpulse libsndfile libvorbisfile.so portaudio portmidi qt5-base qt5-declarative qt5-quickcontrols qt5-quickcontrols2 qt5-graphicaleffects qt5-networkauth qt5-svg qt5-tools qt5-webengine qt5-xmlpatterns zlib lame cmake doxygen git qt5-script texlive-core make gcc jack pkgconfig
By now, you have the packages you need. You'll be able to continue for Linux/BSD compiling process at Compile instructions (Linux and BSD) - Git
(Tested on Manjaro Linux 21.1.3 (x86_64), with kernel labeled as "5.13.15-1-MANJARO". September 19, 2021)
Use these instructions to compile MuseScore master branch with QtCreator and Qt 5.15 (the minimum supported Qt version) on macOS 10.13+.
See the Versions Reference page for which macOS versions are supported by Qt 5.15.
Install Xcode developer tools
xcode-select --install
Download and install Qt for open source with Qt online installer
Select at least two modules: macOS and QtWebEngine
Install the dependencies. If you are new to macOS development or do not have a preference, we suggest Homebrew,
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" $ brew install libogg libsndfile libvorbis pkg-config portaudio jack lame cmake git
If you prefer MacPorts, choose the DMG of your OS and install MacPorts.
Open a terminal and enter the following (in your home):
$ sudo port install git libsndfile pkgconfig lame portaudio jack cmake
Clone the project from GitHub
git clone <your_fork_url>
Open the QtCreator and select File -> Open File or Project then choose file CMakeLists.txt
Configure project
switch to Projects mode and change CMake configuration:
Run CMake
Use these instructions to compile MuseScore master branch with Xcode and Qt 5.12 on macOS 10.12+. See the Versions Reference page for which macOS versions are supported by Qt 5.12.
As of 484f8dc
, 09Oct2020, Qt 5.15 (and a C++17 capable toolchain) is required for the master branch. This excludes macOS 10.12 (and lower). The 3.x branch will stay in Qt 5.9 though.
Install the latest version of Xcode from the Mac App Store.
Launch Xcode and accept the licence.
In Xcode, go to Preferences -> Download and install the Command line Tools. With Xcode 5, you might need to run xcode-select --install
instead.
Install the dependencies. If you are new to macOS development or do not have a preference, we suggest Homebrew,
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" $ brew install libogg libsndfile libvorbis pkg-config portaudio jack lame cmake git uncrustify
If you prefer MacPorts, choose the DMG of your OS and install MacPorts.
Open a terminal and enter the following (in your home):
$ sudo port install git libsndfile pkgconfig lame portaudio jack cmake qt513
Install Qt. It's possible to do this via Homebrew or MacPorts, but the recommened way is to use the Qt Online Installer (open source version, not commercial), which is available from the link at the bottom of this page. Open the DMG and double-click the installer (no need to drag to your Applications folder). You'll have to sign-in / create a Qt account and agree to terms (probably as "an individual not working for any company" unless a company is paying you to work on MuseScore). When asked, do a Custom Installation. Under Qt 5.15.2 (i.e. the latest non-Qt 6 version), make sure the components labelled macOS and Qt WebEngine are selected. Also, at the bottom of the window, under Developer and Designer Tools, make sure that CMake and Ninja are selected.
Add Qt's binary folder to your PATH environment variable. To do this, open the hidden text file ~/.bash_profile
(if that file exists), or alternatively use ~/.profile
. If neither file exists then create ~/.profile
. Append the following line to the file you just opened:
export PATH="${PATH}:${HOME}/Qt/<QT_VERSION>/clang_64/bin"
Make sure you substitute <QT_VERSION>
for the actual version you installed. E.g. for Qt 5.15.2:
export PATH="${PATH}:${HOME}/Qt/5.15.2/clang_64/bin"
You must update the version number in this file every time you update Qt itself via the MaintainanceTool.
$ cd ~ $ git clone git://github.com/musescore/MuseScore.git
If you plan to contribute to MuseScore, you can setup your own fork on GitHub and clone it instead. See the Git Workflow page.
$ cd MuseScore
$ make -f Makefile.osx revision
$ make -f Makefile.osx release
$ make -f Makefile.osx install
$ make -f Makefile.osx package
If you are a developer, look at the xcode
target in the makefile. It generates a xcodeproj file. You can open this xcodeproj file and use the Apple IDE for tasks such as modifying, debugging and compiling MuseScore code.
Run
$ make -f Makefile.osx xcode
Then open the xcodeproj bundle in Xcode
$ open build.xcode/mscore.xcodeproj
In Xcode, run the ALL_BUILD
scheme. It will compile all the files. Then run the install
scheme. It will install the required files (fonts, images etc...) for runtime. Debug by running the mscore
scheme.
You may get this error message on the Xcode Console when you try to run the mscore
scheme:
This application failed to start because it could not find or load the Qt platform plugin "cocoa".
This mean MuseScore can't find the Qt plugins. You need to edit the mscore
scheme to set the environment variable QT_PLUGIN_PATH to point to your Qt plugins directory. The default value for Qt 5.12 is:
QT_PLUGIN_PATH=~/Qt/5.12.9/clang_64/plugins
The actual value you need to set depends on your Qt version (which you can find with qmake -v
) and where you installed it earlier on. You may also need to expand the tilde (~) to it's full value /Users/<username>
to point to your home directory.
If MuseScore doesn't start for any other reason then try reverting to factory settings, but make sure you revert the compiled mscore
debug build rather than the official version if you have it installed.
In Xcode 5+, you might need to uncheck “Allow debugging when using document Versions Browser” in Product-->Edit Scheme .. -->Run mscore.app. Otherwise --NSDocumentRevisionsDebugMode YES gets passed to MuseScore, and it doesn't know how to handle it.
In Xcode > 5, you'll find the menu item elsewhere. Product-->Scheme->Edit Scheme..
Select Run (on the left hand side), and select Options along the top of the form.
Then you'll find "Allow debugging when using document Versions Browser" in the form. Uncheck the checkbox.
The preferred way to contribute is via a Pull Request on GitHub. Patches are also welcome on the Developer Mailing List, or on the Issue Tracker.
# may no longer be relevant as this is for 10.7. Please review and remove this comment or the paragraph
Dependencies built with Homebrew will not run on older versions of macOS. Here is a zip file with the dependencies as "bottles" built on Mac OS X 10.7. They can be installed with
brew install {file}.tar.¹
Here are the steps to create an universal binary from MuseScore SVN trunk.
Please note that some steps might not be required but I document them because it works on my system by following them.
These instructions have been tested on Mac Intel with Mac OS X 10.5.8.
The whole build process takes 1 hour and 30 minutes on a Macbook 2GHz. Downloading and installing all the tools and dependencies can take one hour more but it's just a one time process.
The result of the build process is a DMG file ready to be distribute and suitable for PPC and Intel on Mac OS X Tiger and Leopard.
mkdir musescore cd musescore svn co https://mscore.svn.sourceforge.net/svnroot/mscore/trunk mscore
universal_target 10.4 universal_sysroot /Developer/SDKs/MacOSX10.4u.sdk
sudo port install pkgconfig sudo port install portaudio sudo port install libsndfile +universal sudo port install lame
sudo cp /usr/local/lib/pkgconfig/jack.pc /opt/local/lib/pkgconfig/
cd ~/musescore/mscore
make revision
make -f MakeFile.osx release
if you are a developer, take a look to the release target in the makefile. You'll see that it generates a xcodeproj file and calls xcodebuilder to build it as a command line. Of course, you can open this xcodeproj file and enjoy the Apple IDE to modify MuseScore code, correct bugs, compile, debug etc... Patches are welcome on the dev mailing list.
make -f MakeFile.osx install
make -f MakeFile.osx package
Happy building!
Use these instructions to compile MuseScore master branch on MacOS 10.10+ (see http://doc.qt.io/qt-5/supported-platforms.html).
For macOS 10.12+, please go to Compile Instructions for Xcode and Qt 5.12 on macOS 10.12+.
From revision 5b7c72a
onwards, committed 9 March 2017, the development version of MuseScore (master) requires Qt 5.9 or newer and a C++11 capable toolchain.
As of 484f8dc
, 09Oct2020, Qt 5.15 (and a C++17 capable toolchain) is required for the master branch, this does exclude macOS 10.10, 10.11 and 10.12.
the 3.x branch though stays on Qt 5.9, see above.
The 2.x branches require Qt 5.4 however.
Although MuseScore 3.x can be built with Qt 5.12, and is, on other platforms, it is currently (November 2019) a business requirement that it support MacOS 10.10 and 10.11 (which were still called OS X at that time). Qt 5.12 does not support these earlier releases, and, thus, MuseScore 3.x for MacOS is released with Qt 5.9; therefore, you should build and test with that Qt release as long as this business requirement persists. Code intentionally or unintentionally depending on Qt features and even fixes since 5.9 will not work in the release.
xcode-select --install
instead.$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" $ brew install libogg libsndfile libvorbis pkg-config portaudio jack lame cmake git
$ sudo port install git libsndfile pkgconfig lame portaudio jack cmake
~/.profile
(or alternatively ~/.bash_profile
if you already have it)export PATH=$PATH:~/Qt/5.9.8/clang_64/bin
source ~/.profile
git clone git://github.com/musescore/MuseScore.git
If you plan to contribute to MuseScore, you can setup your own fork on GitHub and clone it instead. See the Git Workflow page.
cd MuseScore
make -f Makefile.osx revision
make -f Makefile.osx release
make -f Makefile.osx install
make -f Makefile.osx package
If you are a developer, look at the xcode
target in the makefile. It generates a xcodeproj file. You can open this xcodeproj file and use the Apple IDE for tasks such as modifying, debugging and compiling MuseScore code.
Runmake -f Makefile.osx xcode
Then open the xcodeproj bundle in Xcodeopen build.xcode/mscore.xcodeproj
In Xcode, run the ALL_BUILD
scheme. It will compile all the files. Then run the install
scheme. It will install the required files (fonts, images etc...) for runtime. Debug by running the mscore
scheme.
You may get this error message on the Xcode Console when you try to run the mscore
scheme:
This application failed to start because it could not find or load the Qt platform plugin "cocoa".
This mean MuseScore can't find the Qt plugins. You need to edit the mscore
scheme to set the environment variable QT_PLUGIN_PATH to point to your Qt plugins directory. The default value for Qt 5.9 is:
QT_PLUGIN_PATH=
~/Qt/5.9/clang_64/plugins
The actual value you need to set depends on your Qt version and where you installed it earlier on. You may also need to expand the tilde (~) to it's full value /Users/<username>
to point to your home directory.
If MuseScore doesn't start for any other reason then try reverting to factory settings, but make sure you revert the compiled mscore
debug build rather than the official version if you have it installed.
In Xcode 5+, you might need to uncheck “Allow debugging when using document Versions Browser” in Product > Edit Scheme... > Run mscore.app. Otherwise --NSDocumentRevisionsDebugMode YES
gets passed to MuseScore, and it doesn't know how to handle it.
In Xcode > 5, you'll find the menu item elsewhere: Product > Scheme > Edit Scheme...
Select Run (on the left hand side), and select Options along the top of the form.
Then you'll find "Allow debugging when using document Versions Browser" in the form. Uncheck the checkbox.
The preferred way to contribute is via a Pull Request on GitHub. Patches are also taken on the Issue Tracker.
Dependencies built with Homebrew will not run on older versions of macOS. Here is a zip file with the dependencies as "bottles" built on Mac OS X 10.7 (since February 2020 bottles built on MacOS 10.10 are used as binaries built on systems older than MacOS 10.9 don't pass Apple's notarization). They can be installed with brew install {file}.tar.gz
Attachment | Size |
---|---|
bottles_MuseScore-2.0.zip | 2.79 MB |
bottles-MuseScore-3.0.zip | 2.91 MB |
bottles-MuseScore-3.0-yosemite.zip | 2.94 MB |
Use these instructions to compile MuseScore master branch on macOS 10.10+ (see http://doc.qt.io/qt-5/supported-platforms.html).
From revision 5b7c72a
onwards, committed 9 March 2017, the development version of MuseScore (master) requires Qt 5.9 or newer and a C++11 capable toolchain.
The 2.x branches require Qt 5.4 however.
Although MuseScore 3.x can be built with Qt 5.12, it is currently (November 2019) a business requirement that it supports macOS 10.10 and 10.11. Qt 5.12 does not support these earlier releases, and, thus, MuseScore 3.x for macOS is released with Qt 5.9; therefore, you should build and test with that Qt release as long as this business requirement persists. Code intentionally or unintentionally depending on Qt features and even fixes since 5.9 will not work in the release.
xcode-select --install
instead.
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install libogg libsndfile libvorbis pkg-config portaudio jack lame cmake git
sudo port install git libsndfile pkgconfig lame portaudio jack cmake
~/.profile
(or alternatively ~/.bash_profile
if you already have it)export PATH=$PATH:~/Qt/5.9.9/clang_64/bin
source ~/.profile
source ~/.bash_profile
git clone git://github.com/musescore/MuseScore.git
git remote add mattmcclinch https://github.com/mattmcclinch/MuseScore.git
git fetch mattmcclinch xcode8
git cherry-pick mattmcclinch/xcode8
If you plan to contribute to MuseScore, you can setup your own fork on GitHub and clone it instead. See the Git Workflow page.
cd MuseScore
make -f Makefile.osx revision
make -f Makefile.osx release
make -f Makefile.osx install
make -f Makefile.osx package
If you are a developer, look at the xcode
target in the makefile. It generates a xcodeproj file. You can open this xcodeproj file and use the Apple IDE for tasks such as modifying, debugging and compiling MuseScore code. Run
make -f Makefile.osx xcode
Then open the xcodeproj bundle in Xcode
open build.xcode/mscore.xcodeproj
In Xcode, run the ALL_BUILD
scheme. It will compile all the files. Then run the install
scheme. It will install the required files (fonts, images etc...) for runtime. Debug by running the mscore
scheme.
You may get this error message on the Xcode Console when you try to run the mscore
scheme:
This application failed to start because it could not find or load the Qt platform plugin "cocoa".
This mean MuseScore can't find the Qt plugins. You need to edit the mscore
scheme to set the environment variable QT_PLUGIN_PATH to point to your Qt plugins directory. The default value for Qt 5.9 is:
QT_PLUGIN_PATH=~/Qt/5.9.9/clang_64/plugins
The actual value you need to set depends on your Qt version and where you installed it earlier on. You may also need to expand the tilde (~) to it's full value /Users/
to point to your home directory. If MuseScore doesn't start for any other reason then try reverting to factory settings, but make sure you revert the compiled mscore
debug build rather than the official version if you have it installed.
In Xcode 5+, you might need to uncheck “Allow debugging when using document Versions Browser” in Product→Edit Scheme...→Run mscore.app. Otherwise --NSDocumentRevisionsDebugMode YES gets passed to MuseScore, and it doesn't know how to handle it. In Xcode > 5, you'll find the menu item elsewhere. Product→Scheme→Edit Scheme... Select Run (on the left hand side), and select Options along the top of the form. Then you'll find "Allow debugging when using document Versions Browser" in the form. Uncheck the checkbox.
The preferred way to contribute is via a Pull Request on GitHub. Patches are also welcome on on the Issue Tracker.
Dependencies built with Homebrew will not run on older versions of macOS. Here is a zip file with the dependencies as "bottles" built on Mac OS X 10.7. They can be installed with brew install {file}.tar.gz
Starting from the 3.0.3 version, MuseScore has a built-in crash reporter based on Google Breakpad and libcrashreporter-qt that is able to handle crashes and gives a possibility for a user to send crash reports to the pre-defined URL. Below are the instructions on how to use or disable this crash reporting facility.
By default, the crash reporter facility is disabled on master
branch and is enabled for release branches on Windows. If you would like to change it, it can be done by changing BUILD_CRASH_REPORTER
CMake variable. The following options are available for this:
1) If you use CMake directly, just add -DBUILD_CRASH_REPORTER=ON
(or OFF
) option:
cmake -DBUILD_CRASH_REPORTER=ON ..
2) If you use the supplied Makefile or msvc_build.bat script, add that option to that script to the cmake
command invocations.
3) You can also edit CMakeCache.txt in the build.debug or build.release directory and change the BUILD_CRASH_REPORTER
value, either manually or with cmake-gui. After editing it the following builds should use the value defined in CMakeCache.txt.
libcrashreporter-qt
is stored in the MuseScore git repository as a submodule. If you cloned the source code from the repository you may need to pull that submodule. Use the following command to do it:
git submodule update --init --recursive
By default, the crash reporter sends crash reports to http://127.0.0.1:1127/post
which may be useful while debugging it with a local copy of something like mini-breakpad-server. In order to change it edit the CRASH_REPORT_URL
CMake variable as described above.
In order for crash reports to be more useful you should extract debugging symbols for the binaries using dump_syms
tool from Breakpad. Please refer to the Breakpad documentation for more details on how to do it. In brief, the process is approximately as follows:
1) Ensure that your compiler generates debugging information (e.g. add the appropriate compiler flags or use the appropriate build types like Debug or RelWithDebInfo).
2) Run dump_syms on the compiled binary (or on the separate debugging symbols file if available):
dump_syms build.release/mscore/mscore > mscore.sym
or
dump_syms.exe mscore\RelWithDebInfo\MuseScore3.pdb > MuseScore3.sym
3) Upload it to a server that is supposed to collect the reports.
This is a work-in-progress page that attempts to describe how to set up MuseScore development with different IDEs. Do you use an IDE that doesn't have any info here? Please, help others out and add the info for your IDE!
Qt Creator is the official IDE for Qt projects. It has many Qt-specific features that other IDEs don't have, or don't have as soon as Qt Creator has them.
The only reason not to use Qt Creator would be if you already have a strong preference for a different IDE.
.ui
(user iterface) files, such as MuseScore's playpanel.ui
.Download the file qt2-musescore.xml and import into Qt Creator via Projects > Code Style > Import... to have MuseScore's coding rules enforced automatically by the IDE.
A choice selection:
file.h
) and source (file.cpp
) files.See the full list of keyboard shortcuts and how to define your own.
There should be some config files already in .vscode
.
A popup will appear asking if you want to install the 'recommended extensions'. Install all the extensions that are recommended. For reference, these are:
You may need to restart your editor at this point. If CMake tools complains about not being able to access files, try chown
ing the entire directory - you may have accidentally run a command as su. If you still get errors, try running the command CMake: configure
or restarting your editor again.
IntelliSense and other features (jump to definition, syntax highlighting, error checking) should now work. If you're encountering problems, message @jthistle on Telegram via the development chat.
One disadvantage is that editing UI files is not easy with just VSCode. You may want to consider simultaneously installing QtCreator in order to make changes to the UI.
You can debug MuseScore through VSCode. You do first need to build manually however, so run make installdebug
or similar to create a debug build. The default debug configuration runs from a debug build, so if you only build release, debugging will not work.
If you have a Mac, XCode is the recommended IDE
This is a short overview. For a more technical explanation, see the mtest README.
Before any pull request is merged, it is required that it pass all of the automated tests which are set up in the mtest
folder. The tests automatically perform actions which would be performed by a user, and create a new score, which is compared against the expected output.
There are two places you can find mtests: in the mtest
directory (a subdirectory of the musescore root directory), or in the build.*/mtest
directory.
Tests are arranged into different directories. For example, copy and paste tests are in mtest/libmscore/copypaste
. Each test has a .mscx file without a -ref
, which is the score that tests are performed on, and a counterpart .mscx file with a -ref
. The -ref
file is the reference file: once the non-ref file has had the tests performed on it, it's compared with the reference file. If the files are exactly the same, the tests pass. But you can't run tests in the root mtest
directory.
Here, you can run tests, once you've built release, debug etc.
Before you run any tests, make sure that your default style in MuseScore is the same as the MuseScore Default. As of version 3.1 there is a Reset to MuseScore Default button in the Format menu Style... dialog. Click that button prior to running ctest or mtest or any specific test executable. If you have your own styles you wish to preserve, save them in a style file that you can restore later.
To run the entire suite of tests, first make
the tests in the build.*/mtest
directory. To run them all, run the mtest
executable file that is created, or just run ctest
.
To run just a single suite of tests, enter the relevant directory, e.g. build.*/mtest/libmscore/copypaste/
. Then, make
the tests, and run the relevant executable file that is created, e.g. tst_copypaste
.
After running tests, depending on which tests you ran, loads of [testname].mscx
files will be created. These are the files that are compared against the reference files in the root mtest directory. If there is a difference between them, the mtest will fail.
If you have made a change that makes the output of a test different, you need to update the reference file(s). You can do this by running updateReference
in the root mtest directory for whichever test you want to update, although this sometimes may not work. Or, you can manually copy accross the changed file(s), for example:
cp build.debug/mtest/libmscore/copypaste/copypaste23.mscx mtest/libmscore/copypaste/copypaste23-ref.mscx
To add a new test, edit the relevant tst_*.cpp
file in the root mtest directory. It should be easy to figure out how these work.
If you add a new test that diffs files, please create an updateReference script to copy the reference files when any future changes are made.
If you have added a new file to an existing test, and it uses a " -ref" reference file for diff, please update the updateReference script in the test directory, to assist with future maintenance.
After you have downloaded a Nightly Build or made you own version, you are ready to explore data structures and code. In a score right click on a note or any other item and select "Object Debugger" from the right-click menu. This will give you an opportunity to explore the data structures. Also, there is "Edit → Debugger", that lets you explore the data in a score. Note: that debugger nowadays is only enabled when running MuseScore in 'experimental' mode, i.e. using the -e option, see also Command line options
MuseScore's main()
function is in main/main.cpp
. As with any C or C++ application, the main()
function is the first thing that runs when the program is started. In MuseScore's case, the main()
function hands over to another function called runApplication()
in mscore/musescore.cpp. This function sets up the QApplication and then calls qApp->exec()
to launch the Event Loop.
The Event Loop continuously checks for events, including user input events such as mouse clicks and button presses, and then passes execution to the relevant event handler (e.g. QWidget::keyPressEvent()
). Event handlers are just ordinary C++ member functions that happen to get called when an event happens. Event handlers can be installed on any widget (buttons, menus, dialogs, windows, etc.) and can be used to create or destroy other widgets as well as ordinary C++ objects. This is how execution is passed around the program.
Most of the important code lives in the mscore and libmscore directories. The MuseScore class and its functions are declared in the header file mscore/musescore.h and defined in the companion source file mscore/musescore.cpp.
Note: The MuseScore class is a subclass of QMainWindow, so in addition to its own functions (those declared in mscore/musescore.h and defined in the corresponding .cpp file), it has also access to all of the functions that belong to QMainWindow and its ancestor classes all the way back to QWidget, and eventually QObject.
Commands are processed in MuseScore::cmd(). Most commands that modify the score are passed off to ScoreView::cmd in scoreview.cpp. If you put a breakpoint in ScoreView::cmd, you can find and then step into the function that processes a specific command. Commands like cut, copy, paste are posted as a new event right at the start of ScoreView::cmd. These events are then processed in ScoreView::normalCut, ScoreView::normalCopy, ScoreView::normalPaste. The paste execution ends up in mscore/libmscore/cmd.cpp Score::cmdPaste. Note that copy and paste put content onto the clipboard through the interface provided by Qt (in ScoreView::normalCopy()). Quite a few commands, like changing the duration of a note, are handled right at the end of this function where _score->cmd() is called. In mscore/libmscore you find the source for the various classes and the layout algorithm. If you sort the directory by file size, you'll easily spot where most processing is done: measure.cpp, score.cpp, cmd.cpp, undo.cpp., layout.cpp. edit.cpp and chord.cpp.
Crashes are annoying to users and don't shed a good light on the software. Generally, all crashes are classified as "critical" bugs in the issue tracker.
Crashes can be divided into two categories. Program errors where the operating system stops the further execution of a program, because the program has attempted to perform an illegal operation (for example a reference through a null pointer, accessing an non-allocated address or even a divide by zero). The other category is where the program logic tries to detect invalid conditions. That can either be in the MuseScore application code, or in the underlying Qt runtime. Qt provides a macro Q_ASSERT (). If during program execution the condition isn't met, a message is printed to the console (with qFatal) and the execution is aborted with abort(). The Qt runtime internally uses Q_ASSERT; MuseScore application code uses both Q_ASSERT and abort(), typically after printing a debug message to the console with (qDebug or qFatal). In Windows, that looks like this:
The crashes in the first category are usually easy to find. The debugger will just stop and show you the location of where the exception occurred in the call stack. You then inspect the program logic. If no apparent solution springs to mind, you report your analysis in the issue tracker.
Crashes in the second category are harder to find. Since MuseScore application code uses abort() in various places, you need to look at the debug message, and then search through the source to locate the abort(). This bug calls for the removal of direct use of abort () to facilitate the use of the next option. This option is to place a breakpoint in the message handler (see below). To catch an abort caused by Q_ASSERT, trapping the message handler can be the only way to breakpoint before the crash, since the Q_ASSERT can come from within the Qt runtime and it may not be possible to use a breakpoint.
On Windows in more recent Qt versions, the Qt runtime abort () no longer activates the debugger, so the program just aborts without giving the developer the opportunity to inspect the call stack. Regarding this, we read in a Qt forum: If somewhere in the code a Q_ASSERT() evaluates false, the application is stopped with an info, where the Q_ASSERT() is and what expression evaluates false. If the application was run with a debugger, debugger is also stopped. If the developer wants to inspect a call stack, he must call qInstallMsgHandler() with a new MsgHandler, set a breakpoint in it and reproduce the bug.
Such a message handler already exists - it is located just before the main() function in mscore/mscore/musescore.cpp. Set your breakpoint where indicated in the code. The message handler is also useful, if you see debug output (printed via qDebug) and want to find out where it originates.
Note: you may have to set environment variable QT_LOGGING_TO_CONSOLE=1 to get qDebug messages to appear on QtCreator's Application Output window (noted by ericfont on Qt 5.12 on arch linux).
The development of MuseScore uses GitHub to host the code and manage the collaboration of developers. GitHub is based on git, a popular SCM, initially designed and developed by Linus Torvalds for Linux kernel development. If you're a developer who wants to work on the MuseScore source code and submit your changes to be merged into the main code, here's how. Thanks to Diaspora for their developer guide, which inspired this one.
If you don't have an account on GitHub, create one for free first. Also make sure you set up git on your computer. It's recommended to use SSH to access your own git fork. This workflow is a command line workflow. If you prefer using a UI, GitHub also provides a UI tool for Mac and Windows that can automate some of the following operations.
$ git clone git@github.com:you/MuseScore.git
)$ cd MuseScore/
)$ git remote add upstream https://github.com/musescore/MuseScore.git
)$ git checkout -b 404-new-feature
)$ git add . ; git commit -m 'commit message'
)$ git fetch upstream master
)$ git checkout master; git merge upstream/master
)$ git checkout 404-new-feature; git rebase master
)$ git push origin 404-new-feature
)After having made a Pull Request don't pull/merge anymore, it'll mess up the commit history. If you (have to) rebase, use 'push --force' ($ git push --force
) to send it up to your GitHub repository, this will update the PR too. Be careful not to do this while the core team is working on merging in your PR. Note (to non-UNIX users): the "$ " of the commands mentioned throughout this page is (meant to be) the shell prompt and as such not to be typed in, your actual shell prompt may look different.
This will create a copy of MuseScore repository to your own account. To fork, press the fork button in the top right corner on MuseScore GitHub page.
It is also a good idea to disable GitHub Action for your clone since normally you don't need them. See here how to switch of these actions.
Run a clone command against your GitHub fork. It will look something like this, except that it will use your GitHub account name, instead of "[you]":
$ git clone git@github.com:[you]/MuseScore.git
$ cd MuseScore
This command downloads your copy of MuseScore to a git repository on your development machine. The next command changes directory into the newly created MuseScore directory.
optional: you can choose to clone just a single specific branch instead of all of them by using the command
$ git clone -b specific-branch-name git@github.com:[you]/MuseScore.git
(optional but recommended) In your clone directory, copy the file build/git/hooks/post-checkout
to the directory .git/hooks
in order for mscore/revision.h
to be maintained automatically by git. See build/git/hooks/README
for details. Note that the .git directory is hidden. Note: as of cbd5126 (Oct 30, 2020) in the master branch and db7daf6 (Nov 3, 2020) in the 3.x branch this isn't needed anymore and can even harm.
To build MuseScore, you will need to install dependencies, and run the build process. Check the instructions for your platform in the developer handbook. Note that the git clone command is using SSH in this case. You need to have SSH set up on your machine. A git:// URL would not work for your local fork, you will not be able to push on it. Alternatively you can use the HTTPS URL. If you already cloned MuseScore main repository with
$ git clone git://github.com/musescore/MuseScore.git
You can change the remote url of the origin to your fork with
$ git remote set-url origin git@github.com:[you]/MuseScore.git
If you don't have a feature in mind, check out the issue tracker, or come ask in IRC (#musescore on freenode.net).
Before you start working on a new feature or bug fix, create a new branch in your local repository that's dedicated to that change. Name it by issue number (if applicable) and description. For example, if you're working on issue #78359, a slur layout problem, create a new branch called 78359-slurlayout, like this:
$ git checkout -b 78359-slurlayout
We are able to offer much help here :). If you can, provide some tests. See the mtest
directory. When you have got something working, commit the changes to your branch on your local Git repo. First, add the files you want to commit, and then commit. Don't forget to provide a meaningful message (see this example) and make sure it adheres to these simple rules). Use git status
and git diff
to see which files can be added and committed.
$ git status
$ git status [filename]
$ git add [filename]
$ git commit -m 'Fix #78359: Some kind of descriptive message'
If your commit message starts with Fix #xxxxx
, with xxxx the issue number in the issue tracker, the issue will be marked as fixed automatically when your commit is pushed in the main repository.
In order to get the latest updates from the main repository, do a one-time setup to establish it as a remote by entering:
$ git remote add upstream git@github.com:musescore/MuseScore.git
The main repo will be now known as upstream. Your fork is known as origin. The origin remote is automatically created after cloning your GitHub fork to your computer. To verify that you have two remotes, you can type:
$ git remote
To keep your development branch up to date, rebase your changes on top of the current state of the upstream master.
# get the changes from upstream
$ git fetch upstream master
# switch to your local master branch
$ git checkout master
$ git rebase upstream/master
# switch to your topical branch
$ git checkout 78359-slurlayout
# make sure all is committed as necessary in branch before rebasing
$ git rebase master
Rebase will put all your commits in the branch on hold, get the last changes, and apply your commits on top of it. You might need to resolve conflicts if you changed a file that has been changed in the main repo. To do so, edit the files, then:
$ git add [filename]
$ git rebase --continue
Another (and shorter) way to update your development branch is $ git pull --rebase upstream master
. Should you have changes that are not yet commited to your branch, use $ git stash
before the rebase and $ git stash pop
after.
When you are ready to send your modified code to MuseScore, push your branch in your origin remote.
$ git push origin 78359-slurlayout
Then do a pull request to MuseScore on GitHub. Go to your GitHub page, select the branch on the left, and press the Pull Request button at the top. Choose your branch, add a comment and submit your pull request.
If you are fixing an issue from the tracker, set the issue's status to "PR created" with a link to your pull request on GitHub. One of the developers with push rights on the main repo will merge your request ASAP, or leave a comment to say why it hasn't been merged and what needed to be done to get it merged.
Important: If you haven't signed the MuseScore CLA yet, do this first as it's a requirement for your pull request to be accepted.
You can continue to push new commits to the branch on GitHub until the pull request is merged. If you amend or squash existing commits, or edit history in any way, then you need to do a force push ($ git push --force
) to get the changes to appear online, but be aware that the whole point of requiring a force push is to make it difficult to overwrite commits accidentally.
Once the pull request is merged the code becomes part of the main repository and you will no longer be able to edit it (except by creating a new PR). Your changes will be available for other people to test in the next nightly build.
$ git commit -a
This will perform git add
for all unstaged files and commit (equivalent to "$ git add . ; git commit
"). You probably don't want to do that. It's better to use git status
and add files individually before committing.
$ git fetch upstream # this will fetch all upsteam branches
$ git fetch upstream master # this will fetch only the master branch
Most work of your work will be done on top of upstream's master branch, so fetching commits from other upstream branches is a waste of time, bandwidth, and disk space. On the rare occassion that you need to work on top of a different upstream branch, simply specify its name instead of master (or specify both at once!).
Note: your fork on GitHub will contain code from all upstream branches in the state they were in when you pressed the "fork" button. You should delete any branches that you don't need.
To delete a local branch:
# will first check if the branch has been merged
$ git branch -d [branch-name]
# will delete the branch authoritatively
$ git branch -D [branch-name]
To delete a remote branch:
$ git push origin --delete [branch-name]
Use $ git cherry-pick [commit-SHA]
to copy a commit from any branch and apply it on the current branch. If there are merge conflicts then you will be prompted to resolve them. Once this is done, add the files ($ git add [files]
) and continue ($ git cherry-pick --continue
). You can use $ git cherry-pick --abort
to abandon an in-progress cherry-pick and return the repository to the state it was in before.
If you want to change the commit message for the last commit, you can do so with $ git commit --amend
. If you made a mistake in the actual code, or if you forgot to add something, simply edit the code files to fix the mistake and then do:
$ git add [files]
$ git commit --amend
While this updates the code and the commit message, it keeps the original commit author and timestamp and adds a new "committed-by: [you] [date+time]" field to the log. Consider passing these additional options to "$ git commit --amend
":
--no-edit
" - update the code but use the old commit message--reset-author
" - don't write a "committer" to the log, instead update the commit author and set the timestamp to the current timeAmending a commit counts as editing history, so think twice before doing this if you have already shared you commit with other people (editing a PR is ok as long as the PR has not been merged).
Once you made a pull request, you might be asked to squash your commits together. For example, you might have created several commits to fix a single issue or to develop a single feature and it doesn't make sense to keep all these commits in the MuseScore repository history. Instead, you need to combine these multiple small commits into one or more larger commits.
The easy way to squash commits is via a "soft reset and recommit". For example, to squash the last 2 commits into a single commit:
git reset --soft HEAD~2
git commit -m "useful commit message"
This removes the last two commits from the history, but keeps the code changes from those commits in the staging area so that they are immediately applied again in the new commit. You can edit the files before committing them (or afterwards with "$ commit --amend
"), but you will need to add the files again using "$ git add
" first.
You can increase the number after "HEAD~
" to squash more commits. If you've made lots of commits and you can't be bothered to count them, you can replace "HEAD~2" with the SHA of the last commit that you don't want to be squashed (use git log
to view the commit SHAs).
For the new commit message, you might want to include the old commit messages as a bullet list under a main summary message. You can use a simple "$ git commit
" without "-m
" to open a text editor to write a multi-line commit message, and you can even pre-populate the editor with the old commit messages by doing "git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"
"
If you need to do something more complicated than combining multiple commits into one then you need to perform an "interactive rebase". See editing history immediately below.
Amending a commit counts as editing history, so think twice before doing this if you have already shared you commit with other people (editing a PR is ok as long as the PR has not been merged).
Editing history is discouraged on the main repository because it creates problems for other developers when they try to merge in the changes. However, this doesn't apply to your fork (assuming it is only used by you) so you are welcome to edit your past commits as much as you like until they are merged into the main repository.
Simple edits are best performed with "$ git commit --amend
" (see amend the last commit) and "$ git reset --soft
" (see squash your commits). Those methods allow you to edit a commit, and to combine multiple commits into one big commit (i.e. many-to-one) respectively, but they can only operate on the most recent commit(s). For anything else, you need to perform an interactive rebase.
An interactive rebase allows you to do many things to past commits, even when there are later commits that you don't want to change, such as:
To perform an interactive rebase, do:
$ git rebase -i [commit-SHA]
This will open an editor that displays a list of all the commits after the one specified (i.e. not including that one) and allows you to choose what you would like to do with each one. The most useful options are:
pick
- keep this commit unchangededit
- edit the commit (or insert new commits after it)drop
- delete this commit and all its code changessquash
- combine with previous "picked", edited or inserted commitWhen you save and close the editor, git rebase
will following your "recipe" and replay the commits, skipping any marked "drop", pausing on any marked as "edit" to allow you to change them and/or add new commits, and prompting you to set a new message for any marked "squash". If any merge conflicts arise (e.g. due to your edits) then git rebase
will pause on those commits too so that you can fix the conflicts. You can use $ git rebase --continue
to resume after a pause, or $ git rebase --abort
at any time to return the repository to the state it was in before you began the rebase.
See this article to find out about two more handy options to git rebase
: --fixup
and --autosquash
.
Rebasing is a powerful tool, but it can be quite difficult to understand. When editing history, you might prefer to use the following workflow instead:
$ git branch duplicate # create a copy of the current branch, but stay on current branch
$ git reset --hard # delete all commits on current branch after the one specified
Now you have moved "back in time" and are able to use the usual tools ($ git commit
, $ git commit --amend
, $ git reset --soft
, etc) on older commits. Once done with the old commits you can cherry-pick the later commits (not necessarily in the same order as they were in before) from the duplicate branch.
Of course, this is essentially doing manually what an interactive rebase would do for you automatically, but it can be easier to manage because you can decide what to do as you go along; you are not forced to come up with a complete plan at the outside as you are with an interactive rebase.
It's better to contribute with a pull request than a patch but if you need to make a patch for any reason here is how. You have created a local branch with the following command, made some changes and commit locally one or more times.
$ git checkout -b 404-new-feature
To create a patch against the master branch, run
$ git format-patch master --stdout > 404-new-feature.patch
To apply the resulting patch,
# get stats about the patch without applying it
$ git apply --stat 404-new-feature.patch
# check if the patch can be applied without problem
$ git apply --check 404-new-feature.patch
# apply the patch
$ git am --signoff < 404-new-feature.patch
$ git checkout -b [new-branchname] master
$ git pull git@github.com:[someoneelse]/MuseScore.git [branchname]
Or:
$ git fetch https://github.com/[someoneelse]/MuseScore.git [branchname]:[new-branchname]
If you test this person's code often you could add their repository as a remote:
$ git remote add [other-person] https://github.com/[other-person]/MuseScore.git
Now you can get their code like this:
$ git fetch [other-person] [their-branch-name]
$ git checkout [other-person]/[their-branch-name] # will go into "detached HEAD" state
"Detached HEAD" simply means you are not on a branch. This is OK as long as you don't plan to make any changes to the other person's code.
Don't do this unless you have to. It's usually best to wait for the other person's PR to get merged into MuseScore's master branch before you try to build anything on top of it.
If you do have to do this, follow the steps test their code (above) until you reach the detached HEAD state. Now do this:
$ git checkout -b [your-branch-name] # create local branch
# now make a change to the code
$ git commit -m "really useful message" # commit the change
# make more changes and commit them...
Let's say you have added 3 commits on top of their code, but now they have made changes to their code and you want to update your code with their changes.
$ git checkout [your-branch-name]
$ git fetch [other-person] [their-branch-name]
$ git rebase --onto [other-person]/[their-branch-name] HEAD~3
This takes the last 3 commits in your branch and replays them on top of their branch. We have to give the number of commits in case the other person has edited history (used rebase
, commit --amend
or similar), otherwise git won't be able to tell where their code ends and your code begins (because their commit checksums will have changed).
If add this string to your MuseScore/.git/config under section [remote "upstream"]:
fetch = +refs/pull/*/head:refs/remotes/upstream/pr/*
Then whenever you fetch upstream, git will fetch all PRs submitted to musescore. Then you can easily checkout by PR number ####:
$ git checkout upstream/pr/####
If a commit fixes multiple issues, then include each issue number in the commit message, e.g.:
"Fix #xxxxx, fix #yyyyy, fix #zzzz: message"
so that the issue tracker will update each issue and set their status to fixed.
If you want someone to test the changes you made in the PR with the compiled package, you need to enable keeping artifacts on AppVeyor resp. generate them on Github (for Mac and Linux AppImage).
AppVeyor won't keep the artifacts from every PR. It is done to optimise the storage usage AppVeyor granted us as an open source project.
To keep/generate the packages in your PR, add "collect_artifacts" to the commit message title (not a commit message body).
Note: as of lately this is no longer needed for the master branch (it still is for the 3.x branch), there now these artifacts are build always, and on GitHub rather than Travis CI and/or AppVeyor. That does mean though that you need to have a GitHub account to be able to download those artifacts.
Example:
Fix #222222: Crash on doing something | collect_artifacts
Updated data structures as they were missing a lot of the good stuff.
Optimized the code in only apparently mysterious ways, thus i am writing
this awesome note that clarifyies what i did, so the next developer looking
at it can easily make sense of - and maybe even learn from - my changes.
You may have noticed at first glance that this commit message is just slightly longer than 50 characters, which against best practice. This is the exception to the rule, but anyhow you will still want to aim for 50 chars maximum._
The MuseScore development infrastructure uses Travis Continuous Integration to run tests on every commit and PR submitted the upstream MuseScore repository, but now you can utilize Travis infrastructure for your own person GitHub branches.
Click the gear button (or go to https://travis-ci.org/username/MuseScore/settings) to configure following settings for this repo
Enable Travis setting for "build pushes"
Now whenever you push to your GitHub, it will trigger the .travis.yml script, and you can see the the status of the build at https://travis-ci.org/repositories. At this point, will just run tests, but if you would like to also produce a Linux AppImage, follow these next instructions to utilize Bintray:
The above steps to run Travis builds actually also create a portable AppImage so you can test out your commits on (almost) any Linux machine. But are a few more things you need to configure in order for Travis to be able to upload the AppImages to Bintray.
Go to https://travis-ci.org/username/MuseScore/settings and add following environment variables:
BINTRAY_API_KEY with value you paste from your clipboard
Now try adding a commit to one of the branches you listed in APPIMAGE_UPLOAD_BRANCHES, and wait ~20 minutes. If an AppImage isn't uploaded, look at the bottom of the logs your most recent Travis-ci build jobs for bintray.sh upload sub-jobs. These AppImages will be useful to share with anyone who you want to test our your new feature or bug fix! Please post the link as a comment to your PR, so other devs can easily try it out and provide feedback!
Note: This document is not valid anymore for the master branch (it still is for the 3.x branch though).
For the master branch coding style see https://github.com/musescore/MuseScore/wiki/CodeGuidelines
The coding rules aim to guide MuseScore developers in writing understandable and maintainable code, whilst minimizing confusion and surprise.
As usual, rules are not set in stone. If you have a good reason for breaking one, firstly, make sure that at least some other developers agree with you, especially if they are working on the same part of the codebase.
To submit code to MuseScore main repository, you need to sign the Contributor License Agreement. Your contribution can be a patch, or pull request, and should obey the following rules.
QString
"s though.See Text style guide
For historical reasons, MuseScore uses a special indenting scheme close to the Banner style. Take a closer look of the examples above to become familiar with it - particularly, the use of braces.
If you are using QtCreator, you can download and then import qt2-musescore.xml either locally for the mscore project via Projects > Code Style > Import... or globally via Tools > Settings > C++ > Code style to automate many of the behaviors described below.
For pointers or references, always use a single space after an asterisk (*) or an ampersand (&), but never before. Avoid C-style casts when possible:
char* blockOfMemory = reinterpret_cast<char*>(malloc(data.size())); -NOT- char *blockOfMemory = (char *) malloc(data.size());
Of course, in this particular case, using new
is the better choice. Avoid C++ functional style casts too:
return static_cast<int>(i); -NOT- return int(i);
Yes, these require more typing and yes they may look ugly, but that way they do stick out, are easier searchable and the compiler can detect errors in their use better. But see also below.
Use C++'s "nullptr
" rather than "0
":
return nullptr; -NOT- return 0;
Do not use spaces between operator names and function names. The equation marks (==
) are a part of the function name, and therefore, spaces make the declaration look like an expression:
operator==(type) -NOT- operator == (type)
Use a space before and after every binary operator, except no spaces around "->", and only a space after ",":
for (int i = 0; i < firstScore->excerpts().count(); i++) -NOT- for (int i=0; i<firstScore->excerpts().count(); i++)
Do not put a space after opening parenthesis. Do not put a space before closing parenthesis:
(expression) -NOT- ( expression )
Do not use spaces between function names and parentheses:
void mangle() -NOT- void mangle ()
Always use a single space after a keyword, and before a curly brace:
if (foo) { } -NOT- if(foo){ }
As a base rule, place the left curly brace on the same line as the start of the statement and indent the closing one. This is know as Banner style indentation.
if (codec) { } -NOT- if (codec) { }
Exception: Function implementations always have the left brace on a new line and indented. Class declarations don't.
static void foo(int g) { qDebug("foo: %i", g); }
class Moo { };
Use curly braces when the body of a conditional statement contains more than one line, and also if a single line statement is somewhat complex. Otherwise, omit them:
if (address.isEmpty()) return false; for (int i = 0; i < 10; ++i) qDebug("%i", i); -NOT- if (address.isEmpty()) { return false; } for (int i = 0; i < 10; ++i) { qDebug("%i", i); }
Exception 1: Use braces also if the parent statement covers several lines or if it wraps:
if (address.isEmpty() || !isValid() || !codec) { return false; }
Exception 2: Use braces also in if-then-else blocks where either the if-code or the else-code covers several lines:
if (address.isEmpty()) { --it; } else { qDebug("%s", qPrintable(address)); ++it; } -NOT- if (address.isEmpty()) --it; else { qDebug("%s", qPrintable(address)); ++it; }
if (a) { if (b) ... else ... } -NOT- if (a) if (b) ... else ...
Use curly braces when the body of a conditional statement is empty:
while (a) {} -NOT- while (a);
Use parentheses to group expressions:
if ((a && b) || c) -NOT- if (a && b || c)
(a + b) & c -NOT- a + b & c
All class scopes should be indented 3 spaces. This includes "slots" and "signals."
class Foo { public: Foo(); private: void bar(); } -NOT- class Foo { public: Foo(); private: void bar(); }
Naming conventions are similar to Qt.
Names are of "camel" type, instead of "mops_klops
" write "mopsKlops
".
User defined types are capitalized. Start the names of non-type entities with lowercase. Preprocessor defines are all uppercase.
Do not encode type information in a name.
The prefix "r" like in Staff::rstaff()
means "relative" - in this example the returned staff index is relative to the part.
(Introduced in MuseScore 3)
Use safer type conversion:
Chord* chord = toChord(e); -NOT- Chord* chord = static_cast<Chord*>(e);
When possible, static_cast
is preferred over reinterpret_cast
:
Measure* m = static_cast<Measure*>(measureBase); -NOT- Measure* m = reinterpret_cast<Measure*>(measureBase);
(Introduced in MuseScore 3)
Shorter and easier to read:
if (e->isChord()) -NOT- if (e->type() == Element::Type::Chord)
Use "unsigned" for unsigned ints:
unsigned i; -NOT- unsigned int i;
Use "int" for signed ints:
int i; -NOT- signed i;
Make sure to use signed char
or unsigned char
every time it matters whether it should be able to hold negative values or values greater than 127, respectively, do NOT use just plain char
in those cases. Whether an unqualified char is signed or unsigned is implementation defined and varies between the platforms MuseScore gets build for/on.
Use C++11's "for
" instead of Qt's "foreach
":
for (Element* e : m->el()) { -NOT- foreach (Element* e, m->el()) {
If you happen to be fixing some code and see a "foreach
", please change that loop into a "for
".
Use "/"
as the path separator, not QDir::separator()
, see #273963: QDir::separator() vs. "/"
MuseScore 3 programming style changes may be found here:
https://github.com/musescore/MuseScore/blob/master/mscore3.txt
Q_ASSERT(bool test)
should be used for errors for which musescore can still continue on. Q_ASSERT
does nothing when built in release mode, but will halt execution with a diagnostic being printed when built in debug mode.
To avoid compiler warnings due to unused parameters, use Q_UNUSED(var)
rather than commenting out the variable name in the method definition. This also allows for conditional compiles, i.e. variables that are used in some setups but not others.
Attachment | Size |
---|---|
qt2-musescore.xml | 1.93 KB |
Feel free to edit this page to add proposals or add new information to existing proposals. Any discussion should take place in the forums or Telegram chat. Links to the relevant discussions can be placed under each proposal.
You can also add yourself as a supporter or opponent of each proposal, with an optional clarifying statement. You can also stay neutral.
Support
- @user1
- @user2, providing that we...
Neutral
- @user3
Oppose
- @user4
The poll exists to give an indication of the level of support: it does not guarantee that a particular proposal will be adopted/rejected.
The formats currently in use:
*.cpp
, *.h
), with or without Qt extensions, and the few pure C (*.c
) filesCMakeLists.txt
, *.cmake
)*.js
), including Qt QML (*.qml
)*.py
)*.sh
), including Bash and other Unix shells. Excludes Windows CMD and Powershell.*.bat
, *.cmd
)*.xml
), including MSCX (*.mscx
), Qt UI (*.ui
), SVG (*.svg
)*.json
)*.yml
, *.yaml
)You can use the following command to print a list of the different file extensions used in the repository, along with the number of files with that extension:
git ls-files | sed -E -e 's|.*/||' -e 's|.*\.|.|' | sort | uniq -c | sort -k1,1r -k2,2df | less
Sample output (annotated and abbreviated):
1679 .h
1607 .mscx
851 .cpp
550 .xml
28 .in # includes '.h.in', '.xml.in' and similar (CMake configured files)
16 .mscz
16 README # file has no extension
12 .bat
12 LICENSE
4 Makefile
Use the following command to fold .*.in
configuration files into the parent extension while keeping pure .in
files separate:
git ls-files | sed -E -e 's|.*/||' -e 's|.*(\..+)\.in$|\1|' -e 's|.*\.|.|' | sort | uniq -c | sort -k1,1r -k2,2df | less
Now file names ending .h.in
will be included in the count for .h
, etc., while the count for .in
will only include files that have no other extension.
The following proposals affect more than one type of file.
Where possible, code rules should be enforced by passing code through a formatting tool as part MuseScore's continuous integration tests. The test should fail if the code is not formatted correctly.
If a style is strictly enforced then developers can pass code through Git's smudge and clean filters to cause it to be formatted in their preferred style during checkout, and back to the standard style during checkin, as demonstrated here. It doesn't matter which style is used in the repository as long as it is enforced properly.
Primarily affects C++ files, but could potentially include other formats too.
Update: MuseScore's coding style is now supported by Uncrustify. Autoformatting to other styles is demonstrated here.
PROS
- Code would be formatted consistently
- Easier to read and maintain, etc.
- Fewer nitpicking comments during pull request reviews
CONS
- Loss of flexibility (formatting tools are extremely pedantic)
Support
- @shoogle
- @igor.korsukov
- @Jojo-Schmitz, might be difficult to impossible for third-party code though. Also this would need to allow for occasional exceptions.
- @Spire42
Neutral
- @dmitrio95, I am not sure that any formal coding style would be the best choice in all situations.
- @marcsabatella, if it's proven flexible enough to be viable I'd support
Oppose
- @mirabilos
- @Howard-C, it can sometimes expect very ugly results
MuseScore currently uses 6 space banner-style indentation. While this may not be what most programmers are used to, the cost of changing it now far outweights the benefits.
Developers who don't like this style can pass code through Git's smudge and clean filters to cause it to be formatted in their preferred style during checkout, and back to MuseScore style during checkin, as demonstrated here.
void myFunc(bool b) { if (b) { // do something // ... } else { // do a different thing // ... } }
Note that support for this proposal does not imply opposition to smaller changes to coding style, or to better enforcement of the current style.
Update: MuseScore's coding style is now supported by Uncrustify. Autoformatting to other styles is demonstrated here.
PROS
- Nothing to do!
- No need to rebase hundreds of pull requests
- Preserve Git history and blame
- Works with autoformatting tools like Uncrustify
CONS
- Not what programmers are used to
- IDEs not setup to use this style by default
Support
- @Jojo-Schmitz, can I have more than one vote please? ;-). There are other code styles that may look better, but none is worth the effort and pain that comes with changing to it. I don't particularly love the current style, but it has its benefits and I got used to it eventually )and it didn't take too long). Everyone else should be able to get used to it too...
- @mattmcclinch, I actually like this coding style, believe it or not. It was not what I was used to, but I became accustomed to it very quickly, and changing it now would actually decrease my productivity.
- @mirabilos (first choice), I hate the current style but keep it anyway, changing is error-prone and makes merging back and forth very problematic
- @marcsabatella, this is my vote. Independently of what my own personal preference would be, I see far more downside than upside to any change. FWIW, I was not familiar with this style at first and while I don't love the six space indents, I have come to actually prefer the brace style over other alternatives. Still, my personal preferences aren't the point. Soapbox: there are many different aspects of coding style that we as developers need to adapt to - OO versus procedural paradigms, interpreted vs compiled, syntax differences between compiled OO languges or even versions of a single language, actual use of multiple inheritance, accessor methods & pointers & references & and other language features, different UI frameworks, differences between Qt lists vs C++ vectors, iterators vs traditional loop structures, etc. Adapting to different paradigms, languages, versions, usages, frameworks, and so forth is part of being a successful developer, particularly in a team environment. And really, the skills needed to keep track of these sorts of details (and here I included indent and brace style) are not so different from the skills needed to keep track of what the code is actually doing and why, the sorts of skills needed to make sure you understand how your changes will affect other code, etc I have faith that any developer who has the skills needed to actually understand, maintain, and improve the code itself can adjust to different indent and brace styles as surely as they can handle the other aspects of coding style that are different from project to project.
- @Howard-C
Neutral
- @shoogle, while I prefer K&R, consistency matters more, and other (less disruptive) proposals are more important to me than indentation style.
Oppose
- @dmitrio95, as the current style has certain practical disadvantages which make the code less convenient to work with. Most prominently, 6-space indents make code lines be too long to fit to the "comfortable" size limit of 80-100 characters. Also certain practical consequences seem to be shown in the relevant studies: in McConnel's "Code Complete" book refers to studies of a dependency of code readability on indentation size. According to the conclusions presented in the book, there is no real difference between 2- and 4-space indents in this regard, but 6-space indents showed worse performance for the ability of programmers to understand the code. I could try to find the references from the book and put it here.
- @ypoissant2, I know I'm very late in this poll and decisions have already been taken, but I wanted to add my comment. I'm learning MuseScore internals by following the code, mainly in rendermidi and related classes, And one thing I observe, is the prominent use of the "continue" and "break" statements. Not using "continue" would force indentations to go too far off to the right in many situations because of the 6 space indents. However, the usage of continue and break obfuscates the function logic and make it hard to understand, at least for me. My conclusion is 6 spaces is a too wide indent and prevents proper logical formatting.
We should switch to a more popular coding style, with one of the most popular styles being 4 space indentation with K&R-style braces.
void myFunc(bool b) { if (b) { // do something // ... } else { // do a different thing // ... } }
Primarily affects C++ files, but could potentially include other formats too.
PROS
- Used by many projects, including Qt
- More familiar to most developers, especially those new to MuseScore
- Supported by IDEs (often the default!)
CONS
- Big change increases repository size
- Spoils git blame (certainly on GitHub, possible workaround for offline git)
Support
- @shoogle
- @igorkorsukov
- @dmitrio95, but the caution should be taken to check how changing braces style works with --ignore-rev
option of Git. Unlike whitespaces changes, changing braces style will change a number of lines, so it might be needed to do braces style change in a separate commit for --ignore-rev
/--ingore-revs-file
solution to work correctly.
- @mirabilos, second choice
Neutral
- @Spire42, This is better than banner style, but I strongly prefer Allman style instead.
Oppose
- @Jojo-Schmitz, 4 spaces are fine by me, brace style is not. Although my opposing isn't really strong, I could certainly adjust and get used to it. If (and only if!) it can get done without screwing up git blame
etc. And without needing to rebase some 250 open PRs!
- @marcsabatella, I oppose change for the sake of change. Until someone proves there is a real benefit to offset the VERY real and enormous cost - or can demonstrate a proven method to negate the cost - any such proposal is DOA to me. And in any case, if that were to happen, this would not be my choice of what to change to.
- @Howard-C, don't like putting the right brace and else
on the same line.
Another popular style is 4 space indentation with Allman-style braces.
void myFunc(bool b) { if (b) { // do something // ... } else { // do a different thing // ... } }
Primarily affects C++ files, but could potentially include other formats too.
PROS
- Used by many projects
- More familiar to most developers, especially those new to MuseScore
- Supported by IDEs
CONS
- Big change increases repository size
- Spoils git blame (certainly on GitHub, possible workaround for offline git)
Support
- @Spire42
Neutral
- @shoogle, better than banner style, but I prefer K&R style above.
- @igor.korsukov better than banner style, but I prefer K&R style above, because in K&R style there is a begin, a body, an end, and in Allman style there are as if two begins
- @Howard-C
Oppose
- @Jojo-Schmitz, 4 spaces are fine by me, brace style is better than K&R and the one I used in a past life. Here too my opposing isn't really strong, I could certainly adjust and get used to it. If (and only if!) it can get done without screwing up git blame
etc. And without needing to rebase some 250 open PRs!
- @marcsabatella, I oppose change for the sake of change. Until someone proves there is a real benefit to offset the VERY real and enormous cost - or can demonstrate a proven method to negate the cost - any such proposal is DOA to me. But, that said, if it were somehow proven that there was a benefit to changing that was greater than the enormous cost, this is what I'd vote for as what to change to.
- @mirabilos, strongly oppose, ugly brace style
- @dmitrio95, for the brace style unnecessarily taking a lot of vertical space.
This provides all the benefits of the familiar K&R-style braces with none of the drawbacks of changing indentation level. Implementing this proposal would result in a tiny change to braces at the end of functions and statements, but there would be no changes to any lines of actual code so tools like git blame
would continue to work as expected.
void myFunc(bool b) { if (b) { // do something // ... } else { // do a different thing // ... } }
Primarily affects C++ files, but could potentially include other formats too.
PROS
- Similar to what is used by other projects, including Qt
- More familiar to most developers, especially those new to MuseScore
- Supported by IDEs (close to the default!)
- Works with auto-formatting tools like Uncrustify
- Enables developers to use their preferred style via Git's smudge and clean filters
- Doesn't affect git blame
- Some people prefer 6 space indentation (more indentation makes levels easier to see, but 8 is too many)
CONS
- 4 spaces is more popular (but MuseScore already uses 6)
- Some work rebasing PRs that make changes near ends of functions / statements
Support
- @shoogle
Neutral
- @marcsabatella, I'm still not seeing the point of putting so much effort into the idea of change, but I will say, if we have to change to something and wish to minimize the damage, this is clever. But I do have to laughingly agree with the assessment I saw on Telegram of this being the "worst of both worlds", at least when considered on its own merits. I dislike K&R braces, and I dislike 6 space tabs, but somehow the combination comes closest to what we have now among any of the proposals that anyone might see as an improvement.
- @Jojo-Schmitz, but I am still not convinced about any need for a coding style change
Oppose
- @Howard-C, don't like putting the right brace and else
on the same line.
- @dmitrio95, as I mentioned above, 6-space indents are the more important issue than braces style.
This provides all the benefits of the familiar Allman-style braces with almost none of the drawbacks of changing indentation level. Unlike K&R-style above, Allman style would require a small change to braces at the beginning of statements as well as at the end, but no other lines of code would change.
void myFunc(bool b) { if (b) { // do something // ... } else { // do a different thing // ... } }
Primarily affects C++ files, but could potentially include other formats too.
PROS
- Similar to what is used by many projects
- More familiar to most developers, especially those new to MuseScore
- Supported by IDEs
- Works with auto-formatting tools like Uncrustify
- Enables developers to use their preferred style via Git's smudge and clean filters
- Some people prefer 6 space indentation (more indentation makes levels easier to see, but 8 is too many)
CONS
- 4 spaces is more popular (but MuseScore already uses 6)
- Some work rebasing PRs that make changes near ends of functions / statements (a bit more work than for K&R)
- Affects git blame (but not very much)
Support
Neutral
- @shoogle, I prefer K&R
- @marcsabatella, although I personally prefer Allman over K&R when writing code in the privacy of my own bedroom, the "K&R+6" proposal would destroy the git history by only half as much I guess, so there is that. Still, I could be OK with this more than most of the others. If it were up to a vote, I'd still pick "no change" in a heartbeat, but if it becomes clear that change is coming anyhow, and no one comes up with a really brilliant solution to allow 4 space tabs (which I do personally prefer, but not at the cost of adversely affecting git history), I will side with whichever 6-space proposal seems more likely to defeat any coalition of 4-space supporters. Just putting that out there :-)
- @Howard-C
Oppose
- @dmitrio95, as I mentioned above, 6-space indents are the more important issue than braces style.
- @Jojo-Schmitz, that 'combining the worse of both worlds" was me, regardless that this style (except for using Tabs instead of spaces) was the style I used prior to MuseScore. It does affect all block starts in `git blame, which is bad and doesn't help with the number of spaces.
Why stop with indentation and braces? Let's adopt all of the style recommendations made by the Qt Project.
PROS
- Tried and tested rules
- Consistency with Qt
CONS
- Big change to current style
- Spoils history, git blame, etc.
- Arguably bool* ptr;
is better than bool *ptr;
because ptr
is not a bool
, it is a pointer to a bool
.
Support
- @shoogle
- @mirabilos, third choice (though there’s not much difference to K&R AFAICT?)
- @igor.korsukov Absolutely yes. The point is not in the Qt, but in having a source of truth and a reference. Instead of Qt, for example, we can to accept Google C++ Style Guide, which also explains why so, and not otherwise.
Neutral
- @dmitrio95, although I don't see a reason to adopt references and pointers declaration style from Qt.
Oppose
- @marcsabatella, I oppose change for the sake of change. Until someone proves there is a real benefit to offset the VERY real and enormous cost - or can demonstrate a proven method to negate the cost - any such proposal is DOA to me. If we have to change, I strongly encourage keeping the changes as minimal as possible in order to still receive the alleged benefit. Change to the pointer declaration in particular seems even more gratuitous than changes to indent or brace style.
- @Howard-C, I don't think it's necessary to adapt to a specific coding style just because we use a gui framework that uses it. For example, I don't like the idea of changing pointer declaration to T *x
at all.
- @Jojo-Schmitz, esp. that pointer type thing
When defining a list or similar structure that contains (or may eventually contain) more than 2 items, write each item on a separate line. Items should be ordered alphabetically unless a different ordering makes more sense for the given situation (e.g. chronological, size-order, grouped by meaning, etc).
Applies to all file formats. Example in CMake:
# Do this add_files( file1.h file2.h ... ) # Not this add_files(file2.h file1.h ...)
For a real-life example of where this rule would make a difference, see this list in icon.h which is supposed to correspond 1 to 1 with the list in icon.cpp. See also the mess that is mscore/CMakeLists.txt.
PROS
- Less sideways scrolling
- Items aligned vertically
- Diffs are smaller and easier to read
- Merge conflicts are easier to resolve
CONS
- More vertical scrolling
- Larger file size (though smaller changes)
Support
- @shoogle
Neutral
- @marcsabatella, doesn't affect as much code as the other changes so I'm less worried about the cost. I might still think short lists are fine to put on line, though, at least sometimes. So I'd prefer we be flexible on this.
- @mirabilos
- @Howard-C
Oppose
- @igor.korsukov (I am for adding to the column, but not alphabetically, but grouping by meaning (and for сmake need to do a restructuring in order to group files by folder structure and use file (GLOB ...) )
- @Jojo-Schmitz
The following proposals only affect C++ files (*.cpp
and *.h
) and the few pure C (*.c
) files in the repository.
These don't provide any information that is not available in the function definition.
//-------------------------------------- // MyClass::myFunc //--------------------------------------
Note that documentation-style comments are useful and should be kept, but there is no need to include the function name in such comments.
PROS
- Save writing the same thing twice
- No opportunity for comment to get out-of-sync with code
- Nobody else does it
CONS
- Slightly harder to see where functions begin and end
Support
- @shoogle
- @igor.korsukov
- @mirabilos
Neutral
- @Jojo-Schmitz
- @dmitrio95, these comments have a lot of information which would be useful to be collected by Doxygen into an auto-generated documentation to the code. The current structure of these comments makes it easy to convert them to Doxygen-style docstrings (by starting the comment lines with ///
instead of //
), but moving such documentation comments to header files should be fine as well. Apart from documentation purposes, I see no reason to preserve these comments.
- @marcsabatella, I am not crazy about the way these comments are formatted, but I do like the visual separation when browsing the code; still, if we're to spend time making changes, I'd rather see something really constructive, like actually adding meaningful comments to each function
Oppose
- @Howard-C, the border lines help me a lot when browsing through code. As for the duplicated names themselves, I think I don't have much feelings about them, so it's OK to remove them. But OK doesn't necessarily mean we should remove. Even if I directly look at the function names the majority of time, I sometimes still look at the comments to search for function names. They're useful and helpful, that's all for me. Don't know why we have to change this.
Where appropriate, functions should be preceded by a comment that explains what the function does and how to use it (i.e. a 'docstring').
/// Draws the element so that it fills as much of the given QRect /// as possible without changing the elements's aspect ratio. void Element::paint(QPainter& p, QRect& r) { // code }
Notice the use of three slashes (///
) to expose the docstring to Doxygen.
There is no need for the docstring comment to include the name of the function or a special border (think //--------
, etc.). If such things are included then they should be on a line with two slashes (//
) to avoid them being exposed to Doxygen.
PROS
- Makes functions easier to understand and use
- Makes it easy to see where one function ends and the next begins, which could be important if the function name comments are removed as proposed above.
CONS
- More work in writing and maintaining comments.
Support
- @shoogle
- @dmitrio95, another options which could be considered are using another style of comments (/** comment */) and moving documentation comments to header files. Any of the options (including three-slashes comments listed here) would be fine for me.
Neutral
Oppose
- @Howard-C, if we add explanatory comments to all classes/functions then it's all right. But if not, this proposal suggests those who don't have explanatory comment won't have border lines and name comment as well, which I oppose. Border lines are very helpful to me as I've said above, I don't see why they're considered useless.
The following proposals only affect CMake build files, i.e. CMakeLists.txt
and *.cmake
.
Do this:
if (CONDITION) # do something endif()
rather than:
if (CONDITION) # do something endif(CONDITION)
Both are valid syntax that will not result in errors or warnings when you run CMake. Warnings occur if you try to specify a closing condition that doesn't match the opening condition, but an empty closing condition is fine and is recommended by many style guides, including KDE's guide.
PROS
- Less work to read, write & maintain
- Like every other language!
Support
- @shoogle
Neutral
- @Howard-C
- @igor.korsukov
- @Jojo-Schmitz
- @mirabilos, keeping them sometimes helps in better overview, but we don’t do it in C++ either, so no biggie
- @marcsabatella, cmake is still a foreign language to me, as is virtually everything about the build process, so I defer to others
Oppose
- @dmitrio95, with large blocks of code this syntax provides a natural way to show which exactly conditional block ends on this line. It might be a better choice not to write such block in the first place, but I would suggest not adding any rule on that to coding style recommendations and allowing to choose the endif()
statement format depending on a particular context.
Many Linux and BSD distributions place strict (and often contradictory) requirements on software intended for that system. These requirements can be technical, legal or moral in nature, and meeting them can be a challenging task. Traditionally, this job is left to each system's package maintainer who applies patches to the MuseScore code "downstream" to meet the requirements. As the "upstream" MuseScore code changes the patches can stop working and so they must be updated each time a new version of MuseScore is released. For this reason, Linux and BSD releases of MuseScore are often available much later than the Windows or Mac OS versions.
To make life easier for the package maintainers long-term, and to make new MuseScore versions available sooner on Linux and BSD, all packaging tasks should be performed upstream (where possible). Ideally, package maintainers should not have any downstream patches. Anything that has previously been implemented via a patch should be sent upstream. Where necessary, suitable IF statements, Makefile variables and CMake options should be used to ensure that changes only affect the relevant distributions.
Please edit these lists wiki-style to keep them up-to-date. Anyone is welcome to attempt to implement the missing features via pull requests to the MuseScore:master branch on Github.
Missing packaging-related features, packaging bugs or anything that maintainers currently have to provide downstream (e.g. through patches). Please state which distributions are affected.
$ man mscore
) up-to-date with Command line options (Linux & BSD)Move items from the wishlist to here when they get implemented in the MuseScore:master branch on Github.
.desktop
file (sets icon and declares mimetypes): #16275: .desktop needs workUser Experience Design is about much more than just making an application look pretty! You have to think about how the different controls (buttons, widgets and menus) work together to allow the user to accomplish the task at hand, and how these controls may be presented differently on a range of platforms and devices, and in different languages or regional variations. You also have to think about how the controls are to be made accessible to users who are blind or partially sighted, or otherwise have difficulty using traditional input devices like the mouse or keyboard.
IMPORTANT:
If you want to make changes to the look and feel of the application then it is vitally important that you:
You should do these things BEFORE you put any serious effort into realizing your design in the code!
Design is a hot topic. Many users and developers have strong feelings about design, so it is important that the community is given the opportunity to comment on future changes before they are made. People deeply experienced with MuseScore may lack perspective on how things appear to those starting afresh or transitioning from a competing commercial product.
Musescore the desktop software is a free and open source product (wikipedia) developed and supported by non paid volunteers and managed by Muse Group subsidiary empolyees, source. Open source is not democracy, see discussion, and the product is fully owned by (through subsidiary) Muse Group. All users that use the forum on musescore.org are not necessary the real decision makers, unless otherwise proclaimed. Please do not feel it is unfair if your elaborated proposal is rejected: you are free to fork the open source repo, or write a plugin.
Dig into Github Wiki and .org Developers' Handbook listed on development overview for specifications and design principles.
github repo /share/icons (Musescore 4)
github repo /share/themes (colors hex, Musescore 4)
Branding (Graphics in Dev Handbook, editable by any log-in user, no Musescore 4 yet)
Logos and Graphics (Graphics on .org, no Musescore 4 yet)
MuseScore on Wikidata.org
site:musescore.org your topic
, eg site:musescore.org sight reading trainer (source1, source2 )If you want to chat and exchange ideas, use a relevant forum.
If you want to propose a change to MuseScore's design then you should make a post in the Development and Technology Preview Forum. Your post should include:
IMPORTANT: Chat with developers and gain concensus before you start coding to save yourself from having to make significant changes later on. It has happened that finished projects were wasted not getting pull or rebase.
If you want to make changes to MuseScore's design then you need to think about:
The above factors do not necessarily apply in all cases. For example, if you want to change MuseScore's icons then this should have very little impact on accessibility or localisation. However, if you want to rearrange where the buttons that use those icons will appear on the screen then this would affect accessibility, and if you want to display text next to those icons then the text needs to be translatable.
Accessibility is often treated as an afterthought: something that can be added later once the visual design has been finalised. This is wrong. Prioritising the visual aspect of design often leads to a bad design that is difficult to fix without tearing everything up and starting all over again. If your design process starts with a picture then you will never see the alternatives.
If you focus on delivering accessibility first, then you will get most of the other factors "for free". See this example of a proposal to redesign MuseScore's Mixer to see how prioritising accessibility leads to a better design for all users, not just those with accessibility needs.
This page lists external reviews of MuseScore's design and how we have addressed, or plan to address, the points raised in the review.
Note to editors: Create a new child page for each external review and it will be listed below automatically. You may want to use an existing page as a template, which you can do by clicking edit on the existing page and copying the markdown code into the new page. Don't forget to update or delete anything that refers to the old page.
YouTube video:
MJS: Marc Sabatella
@Isaac Weiss - Regardless of the fate of the turquoise, getting rid of the red and black TT (TrueType?) icon next to every font in the list should solve the problem of the "ghastly" red+black+turquoise combination. See #288879: Remove "TT" icons from font dropdown.
@Isaac Weiss - Regression from MuseScore 2. See #288881: Better color for pressed buttons.
MJS - Mostly the complaints seem to be about the file icons, maybe we could consider just replacing those?
tinman - The main complaint was that the icons don't seem consistent, with varying sizes and no clear grid system. The thing is, though, that all of the icons Tantacrul mentions were taken from the same icon set — the Material icon set, though an older version of it that was still licensed CC BY-SA (the newer version's license is incompatible with GPLv2). The icons are here, on the Icons page: https://www.figma.com/file/d4PsbNZ8UNB8wIYGqmuApoLv/MuseScore?node-id=1… . Feel free to duplicate the file and try to make the icons fit the grid better.
tinman - I added filled variants of the open and new file icons. There's also a new upload to cloud icon, from the Material design set. That still doesn't fix the inconsistency in grid size or in fill with e.g. clipboard icons, but that all comes from the original set.
Blue and similar colors are used to mean different things in different parts of the interface:
Some colors don't work well in combination:
MJS - these colors were actually changed in response to this. I have insight into whether the issue "solved", but it's worth another look.
More or less addressed in PR #4559.
Addressed in PR #3269.
MJS - Not sure the wisdom of menus with toggles, but making better use of "Nothing select" Inspector is fine by me. Also right-click menu with nothing selected.
MJS - Disable when only one score is possible, but also consider showing File / Open in that case.
lasconic: It's useful with a single long score though. You can see the start and the end of the same score in the same screen...
tinman - I think the bigger problem here was with it being unclear what the "X" does. When the same document is open in two panes, closing one of the panes should keep the document open in the other pane. There should be no potential data loss.
MJS - This is one of the few elements that still requires right-click menu. Would love to see this incorporated into Inspector. Also section break, what else? As for changing clef, not necessarily always wanted.
@RobFog - Name change addressed by Marc Sabatella in PR #4958. Also see #88861: Option for editing abbreviated staff names in instrument changes.
@Isaac Weiss - even if the whole dialog can't be put in the Inspector, at the very least, a button to launch it is a must. See #289006: Expose "Select Instrument" in Inspector for Instrument Change text. Addressed in PR #5010.
MJS - Yes, it's a clumsy dialog for sure. Note: the button label is no longer "New All" :-)
MJS - Not so sure about the "eye" - if you don't actually pop something up, most people won't notice it's there. But sure, the mechanism used to show tours could be improved further.
MJS - In general, a potentially good idea on several fronts to leave something selected after deleting something - good to keep keyboard navigation active. Do need to be careful though as sometimes this is unexpected - hitting Delete twice in a row would then delete the newly selected element.
@dmitrio95: added #287141: No element is selected after deleting slur or other marking to track this.
MJS - we've actually caught almost all cases at this point. And for the few cases where an action does result in loss of selection (measure join/split?), Alt+Left/Right now remembers the previous selection and continues navigation from there. So, a pretty big improvement on this front.
MJS - Right now we can copy lines using the "clone" facility used for custom palettes, but no one knows this, and it's not as convenient as what people would reasonably expect.
@dmitrio95: addressed in PR #4831
MJS - Nice idea, not sure how that would work if they don't start out aligned?
MJS - See #45361: copy/paste and "R" do not delete slurs or lines in target measures
MJS - Direct dragging as a way of adjusting measure width or other spacing is achievable, in principle. Although for the record, I like having the possibility of more precise settings too.
@dmitrio95 - see https://github.com/musescore/MuseScore/pull/4930 for the patch on dragging notes.
MJS - after a couple of back-and-forths on this, I think it's good now.
MJS - Would be easy enough to shorten multiple notes, not clear what should happen for lengthen, are we talking about lengthening the passage as well (eg, half-time/double-time)? Like requested in #278980: Augmentation/Diminution features?
MJS - This is implemented now,. but only for list selections. I wonder if there is a reason not to allow it for range?
MJS - See #286360: Enter note entry mode when a note pad button is clicked. Not at all obvious this is really such an improvement - which measure do we start note input in? Or should it only be viable for input by click?
MJS - This is a reasonably common request. I could imagine not wanting the act of selection to change how playback works, but a special command like Shift+space to just play the selection could make sense.
@dmitrio95: a possible implementation: https://github.com/musescore/MuseScore/pull/4933
MJS - This was meregd and then backed out because too many people did not like the change, but I'd still love to see this via a separate command (e.g., Shift+Space).
MJS - Already implemented in 3.0.5, via #283946: Play whole chord when iterating over notes with Left-Right arrows, nice job Anatoly!
( ⇒ In Musescore press Ctrl+Shift+P, then F1 to bring it up. )
Plugins allow you to extend MuseScore beyond its built-in features using JavaScript. MuseScore provides a minimal API with access to a subset of MuseScore-specific objects and the Qt API .
Existing plugins can be found in the plugin directory . To discuss plugin development, announce your own plugin, or discuss the plugin API, you can join the dedicated forum .
MuseScore plugins are written in the language JavaScript 1.5 (ECMA-262) using the QtScript engine. If you are familiar with JavaScript from web development you are in good shape, but its important to note that web browsers add specific extensions like DOM and some other functions that are not available to MuseScore plugins.
Qt is the C++ GUI toolkit and library used by MuseScore. Using the Qt Script Generator , MuseScore provides JavaScript bindings to most of the Qt API. This allows you to create widgets and windows, use advanced XML parsing methods, browse the web, open a TCP port and much more.
Currently there is no reference of the Qt methods accessible through Javascript in MuseScore. Basically, the majority of the objects and functions from QtCore, QtGui, QtUiTools, QtNetwork and QtXml modules should be available. The C documentation and tutorials can also be used. Usually when developing a MuseScore Plugin, you can refer to the Qt Project C++ documentation. However, differences between the nature of C++ and JavaScript mean that the JavaScript docs may differ slightly. This might happen when:
If you are writing a MuseScore plugin, there is a good chance you mainly want to manipulate and query MuseScore objects. Some objects are available to the plugin framework. The latest API is documented in other pages of this handbook. The README.scripts (1.1 version) is also available.
MuseScore is bundled with a plugin debugger. You can activate it from the Help menu. The plugin debugger enables step-by-step debugging and displays "print" results in the Debug output tab. It also includes a "command line" or Console tab where you can evaluate one line of Javascript code at a time.
If you want to test a snippet of Javascript code, you can install the Plugin Console plugin.
If you use the Qt Bindings, it seems you are legally obligated to release your script under the GPL v2 or v3 license, under the terms of Qt 4.6's Open Source licensing .
This documentation is based on the Amarok Scripting How to . Amarok is using the same technology to provide scripting of the music player
To be recognized as a plugin by MuseScore, a file must:
plugins
folder. A plugin with many files should use a sub-folder within the plugins folder to avoid cluttering the main plugin directory and to simplify uninstallation.
$install-path$/museScore/plugins
(system-wide) and ~/.local/share/data/MusE/MuseScore/plugins
(personal).<install-path>\MuseScore\plugins
(system-wide) and in %LOCALAPPDATA%\MusE\MuseScore\plugins
on Vista and Seven or C:\Documents and Settings\USERNAME\Local Settings\Application Data\MusE\MuseScore\plugins
(personal, adjusted to your language version) on XP./Applications/MuseScore.app/Contents/Resources/plugins
or ~/Library/Application Support/MusE/MuseScore/plugins
The plugin file is re-read on every execution, so during plugin development you do not need to restart MuseScore after every edit in the plugin file.
The JavaScript source code of a MuseScore plugin has to contain at least three members:
init()
.run()
.close()
.This is an example of a "no-operation" but complete plugin:
function init() {}; function run() {}; function close() {}; var mscorePlugin = { majorVersion: 1, minorVersion: 1, menu: 'Plugins.test', init: init, run: run, onClose: close }; mscorePlugin;
( ⇒ In Musescore press Ctrl+Shift+P, then F1 to bring it up. )
Represents a constituent of a voice and is made of notes (opposed to Rest
, which is silent): voices are made of chords and staves are made of voices. A Chord
may contain one or more Note
s; all the Note
s of a Chord
start and end at the same time.
A new Chord
can be created with: chord = new Chord();
or chord = new Chord(score);
where score is a Score Object
.
The Chord
existing at a given time of a given voice of a given staff of a score can be obtained by moving a Cursor
to the needed staff / voice / time and using:
if ( cursor.isChord() ) chord = cursor.chord();
Cursor Object , Harmony Object , Note Object , Rest Object , Score Object .
Name | Type | Description |
---|---|---|
noStem | boolean | whether the chord has a stem or not. The chord needs to be retrieved from a cursor first |
notes | integer | number of notes in the chord (read-only) |
tickLen | integer | length of the notes in the chord (all notes of a chord have the same length); expressed in conventional units (see Tick Length values ). |
type | integer | type of note(s) (read-only): 0: normal 1: acciaccatura 2: appoggiatura 3: grace 1/4 4: grace1/16 5: grace 1/32 |
Add the Harmony harmony to the chord.
Add Note note to the chord.
Return Note at index index.
Remove from chord the index-th Note.
Return topmost Note of chord (Note at index notes - 1).
( ⇒ In Musescore press Ctrl+Shift+P, then F1 to bring it up. )
Cursors allows navigation in an open score and allows access to its elements. A cursor exists purely within the plugin which creates it and has no relationship to the 'blue cursor' visible in the MuseScore GUI. A cursor can access only the Score Object
for which it is initially created.
A new Cursor
can be created with: cursor = new Cursor(score);
or cursor = new Cursor(score, expandRepeat);
where:
Score Object
which the cursor will be able to browse;bool
value: if true
the cursor will obey score repetitions and voltas.After the cursor is created, it should be rewind()
-ed.
Chord Object , Measure Object , Rest Object , Score Object , Text Object
Name | Type | Description |
---|---|---|
pageNumber | integer | contains the score page the cursor currently is in (read-only). |
staff | integer | contains the staff the cursor is browsing; staves are numbered from top to bottom, starting with 0; the number of staves of a score can be obtained with score.staves . Can be set to access a different staff. |
voice | integer | contains the voice (within the current staff) the cursor is currently browsing; voices are numbered from top to bottom, from 0 to 3. Can be set to access a different voice of the current staff. |
Adds the Chord chord at the current cursor position (replacing what is currently there).
Moves the cursor to the next Chord/Rest of the current voice of the current staff.
Adds the Rest rest at the current cursor position (replacing what is currently there).
Moves the cursor to the next Chord/Rest of the current voice of the current staff.
Returns the Chord at the current cursor position, if any. Care should be taken to ensure the cursor is currently pointing at a chord, for instance by using the method isChord()
.
Returns true
if the cursor is currently at end of the current voice/staff of the score.
Positions the cursor at the chord or rest at the beginning of the selection, voice
will be 0 and staff
will be set to the first staff in the selection. If you want something different, you need to set them after the goTo. If no selection exists in that score, the cursor will be positioned at the end of score, i.e. cursor.eos()
would return true
.
Note: a single 'blue' note or rest is not considered a selection; only extended selections ('blue rectangles') are taken into account.
Positions the cursor immediately after the last chord or rest at the end of selection, voice
will be 0 and staff
will be set to the next staff after the selection (even if that doesn't exist). If you want something different, you need to set them after the goTo. If no selection exists in that score, the cursor will be positioned at the end of score, i.e. cursor.eos()
would return true
.
Note: a single 'blue' note or rest is not considered a selection; only extended selections ('blue rectangles') are taken into account.
Returns true
if the cursor points to a Chord.
Returns true
if the cursor points to a Rest.
Returns the Measure at the current position.
Moves the cursor to the next Chord/Rest of the current voice of the current staff.
Moves the cursor to the first Chord/Rest of the next Measure
Returns the x,y position (in pixels) of current element in the page.
Adds the Text text as staff text at the cursor position. text shall be created previously.
Returns the Rest at the current cursor position, if any. Care should be taken to ensure the cursor is currently pointing at a rest, for instance by using the method isRest()
.
Positions the cursor at the beginning of the set staff / voice. After setting the staff
and/or voice
properties, the actual cursor position is undetermined until this method is called.
Returns the tick of the current position (in internal units, see Tick Length values ).
Returns the time of the current position in milliseconds.
( ⇒ In Musescore press Ctrl+Shift+P, then F1 to bring it up. )
Represents a type of chord.
A new Harmony
can be created with: harmony = new Harmony();
or harmony = new Harmony(curScore);
.
Once created and set, a Harmony
can be attached to a Chord
or to a Rest
with the Chord.addHarmony(harmony)
or with the Rest.addHarmony(harmony)
methods respectively.
Name | Type | Description |
---|---|---|
base | integer | Tonal Pitch Class enum of the chord base |
id | integer | the chord id, as in styles/chords.xml |
root | integer | Tonal Pitch Class enum of the chord root. |
None.
( ⇒ In Musescore press Ctrl+Shift+P, then F1 to bring it up. )
Allows access to some info about a single measure of a score.
A new Measure
can be created with: measure = new Measure();
but it is probably more common to obtain a Measure
object through a Cursor
: measure = myCursor.measure();
Name | Type | Description |
---|---|---|
lineBreak | bool | if true , break the system after this measure |
pageNumber | integer | the number of the page where this measure is drawn (read-only). |
The bounding box of this measure (in pixels).
The position in the page of this measure (in pixels).
( ⇒ In Musescore press Ctrl+Shift+P, then F1 to bring it up. )
Represents a single note. Notes belong to Chord Object
objects.
A new Note
can be created with: note = new Note();
or note = new Note(score);
where score is a Score Object
object.
Note
s belonging to a given Chord
can be accessed with the Chord.note(index)
and Chord.topNote()
methods of the Chord
object.
Name | Type | Description |
---|---|---|
boundingRect | rect | the bounding rectangle of the note relative to ???; in raster units (read-only). |
color | QColor | the colour of the note head. |
name | string | the name of the note as a string (read-only). |
noteHead | integer | the note head group (see table below). |
pitch | integer | the MIDI pitch of the note (in the range 0-127). |
pos | pos | the position of the note relative to the page; in raster unit (read-only). |
tied | integer | 0: not tied 1: tied to next note 2: tied to previous note 3: tied to both previous and next note. |
tpc | integer | the Tonal Pitch Class enum of the note. |
tuning | integer | the tuning adjustment of the note, in +/-cent with respect to default tuning. |
visible | bool | whether the note is visible or not. |
userAccidental | integer | the user-added accidental (see table below), if any; only affected by accidentals which do not change the MIDI pitch, like courtesy accidentals or micro-interval accidentals; if a note only has an accidental which can be deducted from the tpc property, returns 0. |
velocity | integer | the MIDI velocity (loudness) of the note (in the range 0-127). |
None.
These are the values returned by the userAccidental property.
none | 0 | ||||||
# | 1 | mirrored-flat-slash | 10 | flat arrow up | 19 | ||
b | 2 | flat-flat-slash | 11 | flat arrow down | 20 | ||
## | 3 | sharp-slash | 12 | flat arrow both | 21 | ||
bb | 4 | sharp-slash2 | 13 | natural arrow up | 22 | ||
natural | 5 | sharp-slash3 | 14 | natural arrow down | 23 | ||
flat-slash | 6 | sharp-slash4 | 15 | natural arrow both | 24 | ||
flat-slash2 | 7 | sharp arrow up | 16 | sori | 25 | ||
mirrored-flat2 | 8 | sharp arrow down | 17 | koron | 26 | ||
mirrored-flat | 9 | sharp arrow both | 18 |
These are the values used when reading from or writing to the noteHead property.
0 | normal | 7 | do |
1 | cross | 8 | re |
2 | diamond | 9 | fa |
3 | triangle | 10 | la |
4 | mi | 11 | ti |
5 | slash | 12 | sol |
6 | X-circle | 13 | alt. brevis |
( ⇒ In Musescore press Ctrl+Shift+P, then F1 to bring it up. )
Represents the format of pages in a Score Object .
The PageFormat
object describing the page format of a score can be obtained with: var fmt = score.pageFormat;
where score is a Score Object
object.
(Formally, a new PageFormat
could be created with: var fmt = new PageFormat();
but such an object would be useless.)
Name | Type | Description |
---|---|---|
width | double | page width in mm (read-only). |
height | double | page height in mm (read-only). |
landscape | bool | true if the score has a landscape orientation (read-only). |
twosided | bool | true if the score is two-sided (read-only). |
None.
( ⇒ In Musescore press Ctrl+Shift+P, then F1 to bring it up. )
Represents a part of a score, either instrumental or vocal, and allows access to some of its properties.
To retrieve the n-th part of a score, the Score.part(n)
method of a Score Object
can be used.
New parts cannot be created as such; to add a new part to a score, use the Score.appendPart(partName)
method instead.
Name | Type | Description |
---|---|---|
longName | string | long name of the part, for instance "Pianoforte" (read-only). |
shortName | string | short name of the part, for instance "Pf." (read-only). |
midiChannel | integer | MIDI channel of the part (read-only). |
midiProgram | integer | MIDI program of the part (read-only). |
staves | integer | Number of staves in the part (read-only). |
None.
( ⇒ In Musescore press Ctrl+Shift+P, then F1 to bring it up. )
Represents a rest, i.e. a silent constituent of a voice (opposed to Chord
, which is made of notes).
A new Rest
can be created with: rest = new Rest();
or rest = new Rest(score);
where score is a Score Object
.
The Rest
existing at a given time of a given voice of a given staff of a score can be obtained by moving a Cursor
to the needed staff / voice / time and using:
if ( cursor.isRest() ) rest = cursor.rest();
Cursor Object , Harmony Object , Score Object .
Name | Type | Description |
---|---|---|
tickLen | integer | length of the rest; expressed in conventional units (see Tick Length values ). |
Add the Harmony harmony to the staff point corresponding to the rest.
( ⇒ In Musescore press Ctrl+Shift+P, then F1 to bring it up. )
Represents a complete score.
A new score can be created with:var a = new Score();
The new score is appended to MuseScore's list of scores.
The current score can be obtained with:var b = curScore;
Name | Type | Description |
---|---|---|
composer | string | name of the composer |
duration | integer | total score duration in seconds (read-only) |
fileName | string | the name of the file without the path, "Untitled" for unsaved scores (read-only). (MuseScore 2.0+ as of r5033 ) |
fileVersion | string | the version of the version information (MuseScore 1.2+) |
hasHarmonies | bool | true if a valid chordname is found |
hasLyrics | bool | true if a lyric element is found in the score |
keysig | integer | Key signature at the beginning: -7 (= 7 flats) to 7 (= 7 sharps) or undefined for custom signature |
measures | integer | Number of actual measures (read only) |
pageFormat | PageFormat Object | the format of pages in the score (currently disabled) |
pages | integer | Number of pages (read only) |
parts | integer | Number of parts (read only) |
path | string | the path of the score without the filename, an empty string if the file is not saved (read-only). (MuseScore 2.0+ as of r5033 ) |
poet | string | name of the poet/lyricist |
staves | integer | number of staves (read-only) |
subtitle | string | subtitle of the score |
title | string | title of the score |
timesig | TimeSig Object | the time signature of the score (MuseScore 1.1+) |
version | string | the version of MuseScore that the score was last saved with (MuseScore 1.2+) |
Append n measures to the score.
Append a new part to the score.
partname refers to an instrument name in the file instruments.xml.
The part will be initialized from the named instrument in this file.
If partname is empty, a default part will be appended.
Close score. (MuseScore 1.2+)
End undoable operations.
Load the score file located at path. Can be any format supported by MuseScore, the extension is used to find out the type of file.
Sets metatag tag to tag. (Version 2.0+)
Sets metatag tag to value. (Version 2.0+)
Part object at index i.
Write score into file path. The file extension type determines the type of file:
"mscz", "mscx", "xml", "mxl", "mid", "pdf","ps", "png", "svg", "ly", "wav", "flac", "ogg".
Not all types may be available.
For soundfile output (type being one of "wav", "flac", "ogg"), the soundfont to be used can be specified as an additional parameter. (Not available anymore in MuseScore 2.x as of r5011 ).
When saving into a PNG file, additional parameters can be specified.
Turns on or off the repetitions of ritornellos.
Set the style element with name key to the given value. Known to work for the given keys:
Starts undoable operations.
( ⇒ In Musescore press Ctrl+Shift+P, then F1 to bring it up. )
Represents a textual element of a score.
A new Text
belonging to a score can be created with: text = new Text(score);
where score is a Score Object
.
Currently, only 'staff text' elements can be added to a score (by moving a Cursor Object
to the required point and using the Cursor.putStaffText(text)
method).
Cursor Object , Score Object .
Name | Type | Description |
---|---|---|
color | QColor | the text foreground colour. |
defaultFont | QFont | the font used to display the text. Hint: this may be set to 10 point Times with var font = new QFont("Times", 10); text.defaultFont = font; . |
text | string | the text to display. |
xOffset | double | the horizontal offset (in spaces*) from the default position of the text (positive: to the right, negative: to the left). |
yOffset | double | the vertical offset (in spaces*) from the default position of the text (positive: down, negative: up). |
* Note: "Spaces" is a relative measurement unique to music notation. One space unit is the vertical distance between two lines of a staff.
* Note: Due to a bug in the plugin framework, xOffset and yOffset are parsed as integers.
None.
( ⇒ In Musescore press Ctrl+Shift+P, then F1 to bring it up. )
Available in MuseScore 1.1+ only
The TimeSig object represents the time signature of a score.
A new TimeSig object is created with either:var ts = new TimeSig()
orvar ts = new TimeSig(numerator, denominator)
In the former case an "empty" TimeSig object is created. Before it is used, it needs to be initialized by one of the methods below. In the latter case, the TimeSig object is initialized with the time signature numerator / denominator.
The time signature of the current score can be obtained with curScore.timesig, and you can, for instance, change it with the change method (e.g. curScore.timesig.change(3,4)
)
Name | Type | Description |
---|---|---|
type | int | an internal value describing the time signature the only usage of this property is to copy the time signature from one TimeSig object to another (e.g. newsig.type = oldsig.type |
Change the time signature to numerator / denominator.
Change the time signature to Alla Breve.
Change the time signature to Common Time
( ⇒ In Musescore press Ctrl+Shift+P, then F1 to bring it up. )
To translate a plugin, you need to use qsTr()
for all your "quoted strings" in the .js files. qsTr() has 2 arguments, the 1st is the to be translated string, the 2nd is a comment to the translator (and later visible in Qt Linguist) and optional.
It can work with placeholders, e.g. qsTr("Pages: %1") .arg(NumberOfPages)
If the string is outside a function, use QT_TR_NOOP()
. For example, for the [[nodetitle:Plugin File Structure|menu item]]
, use QT_TR_NOOP("Plugins.MyMenuItem")
(although, as per this forum thread
the term 'Plugins' should not get translated, not yet at least)
Not extra steps needed for .ui files.
Next the plugin needs a directory on its own, do not conflict with other plugins' translations
Then create a directory translations
into the plugins' directory. You need to put locale_XX.qm
files in it. How to obtain a .qm file for your plugin?
Run
replace XX by the targetted language (eg.: "de" for German) and include .js and .ui fileslupdate translations/locale_XX.ts
This extracts all the to be translated strings from ther .js and .ui files into that .ts file.
Repeat for other languages, if need be.
Use Qt Linguist to put the translation into locale_XX.ts
. Once done use File → Release in Qt Linguist or run the following:lrelease translations/locale_XX.ts
That will create/update a locale_XX.qm
file.
Now, run MuseScore in your language and your plugin should be translated!
More information on QtScript website.
If you want to look at working examples, check the batch export plugin and/or the MuseScore 1.2+ version of the musescore.com plugin ("Save online").
( ⇒ In Musescore press Ctrl+Shift+P, then F1 to bring it up. )
The following variables are directly available to any plugin.
Name | Type | Description |
---|---|---|
curScore | Score Object | the score currently active in MuseScore, if any, see also below (read-only). |
division | integer | number of MIDI ticks for 1/4 note (read-only). |
localeName | ? | ? (currently disabled) |
mscore | ? | ? |
mscoreDPI | integer | ? |
mscoreMajorVersion | integer | the first part of the MuseScore version (read-only). |
mscoreMinorVersion | integer | the second part of the MuseScore version (read-only). |
mscoreUpdateVersion | integer | the third part of the MuseScore version (read-only). |
mscoreVersion | integer | the complete version number of MuseScore in the form: MMmmuu (Major / minor / update; read-only). |
pluginPath | string | the complete path of the running plugin, without file name (read-only). |
in MuseScore 1.2+ you can (and should, before accessing curScore in any other form or shape!) test, if at least one score is open with the following code.
if (typeof curScore === 'undefined') //no score
Note pitches are internally expressed with their respective MIDI pitch values. This corresponds to the absolute height of the note, regardless of the way it is actually written (enharmony; to retrieve the actual enharmony employed for a note, uses its Tonal Pitch Class enum
instead).
The pitch is used by the following property: Note Object
.pitch
Note \ Octave | -1 | 0 | 1 | 2 | 3 | ||
C | 0 | 12 | 24 | 36 | 48 | ||
C# | 1 | 13 | 25 | 37 | 49 | ||
D | 2 | 14 | 26 | 38 | 50 | ||
D# | 3 | 15 | 27 | 39 | 51 | ||
E | 4 | 16 | 28 | 40 | 52 | ||
F | 5 | 17 | 29 | 41 | 53 | ||
F# | 6 | 18 | 30 | 42 | 54 | ||
G | 7 | 19 | 31 | 43 | 55 | ||
G# | 8 | 20 | 32 | 44 | 56 | ||
A | 9 | 21 | 33 | 45 | 57 | ||
A# | 10 | 22 | 34 | 46 | 58 | ||
B | 11 | 23 | 35 | 47 | 59 |
Note \ Octave | 4 | 5 | 6 | 7 | 8 | 9 |
C | 60 (middle C) | 72 | 84 | 96 | 108 | 120 |
C# | 61 | 73 | 85 | 97 | 109 | 121 |
D | 62 | 74 | 86 | 98 | 110 | 122 |
D# | 63 | 75 | 87 | 99 | 111 | 123 |
E | 64 | 76 | 88 | 100 | 112 | 124 |
F | 65 | 77 | 89 | 101 | 113 | 125 |
F# | 66 | 78 | 90 | 102 | 114 | 126 |
G | 67 | 79 | 91 | 103 | 115 | 127 |
G# | 68 | 80 | 92 | 104 | 116 | -- |
A | 69 | 81 | 93 | 105 | 117 | -- |
A# | 70 | 82 | 94 | 106 | 118 | -- |
B | 71 | 83 | 95 | 107 | 119 | -- |
Note and rest values are expressed in an internal unit, to express their mutual relationships and to make them independent from actual tempo. This unit is used by the following object properties:
Chord Object
.tickLen
Rest Object
.tickLen
whole note (semibreve) | 1920 |
double-dotted half note | 1680 |
dotted half note | 1440 |
triplet whole note (1/3 of breve) | 1280 |
half note (minim) | 960 |
double-dotted crochet | 840 |
dotted crochet | 720 |
triplet half note (1/3 of semibreve) | 640 |
1/4 note (crochet) | 480 |
double-dotted quaver | 420 |
dotted quaver | 360 |
triplet crochet (1/3 of minim) | 320 |
1/8 note (quaver) | 240 |
double-dotted semiquaver | 210 |
dotted semiquaver | 180 |
triplet quaver (1/3 of crochet) | 160 |
1/16 note (semiquaver) | 120 |
double-dotted demi-semiquaver | 105 |
dotted demi-semiquaver | 90 |
triplet semiquaver (1/3 of quaver) | 80 |
1/32 note (demi-semiquaver) | 60 |
dotted hemi-demi-semiquaver | 45 |
triplet demi-semiquaver (1/3 of semiquaver) | 40 |
1/64 note (hemi-demi-semiquaver) | 30 |
The Tonal Pitch Class (tpc) is used to differentiate among notes with the same MIDI pitch but with different representation (also covering enharmony). The tpc is used by several objects properties: Harmony Object
.base
Harmony Object
.root
Note Object
.tpc
-1 | Fbb | 6 | Fb | 13 | F | 20 | F# | 27 | F## | ||||
0 | Cbb | 7 | Cb | 14 | C | 21 | C# | 28 | C## | ||||
1 | Gbb | 8 | Gb | 15 | G | 22 | G# | 29 | G## | ||||
2 | Dbb | 9 | Db | 16 | D | 23 | D# | 30 | D## | ||||
3 | Abb | 10 | Ab | 17 | A | 24 | A# | 31 | A## | ||||
4 | Ebb | 11 | Eb | 18 | E | 25 | E# | 32 | E## | ||||
5 | Bbb | 12 | Bb | 19 | B | 26 | B# | 33 | B## |
11 | 31 | A## | 19 | B | 7 | Cb | |||
10 | 24 | A# | 12 | Bb | 0 | Cbb | |||
9 | 29 | G## | 17 | A | 5 | Bbb | |||
8 | 22 | G# | 10 | Ab | |||||
7 | 27 | F## | 15 | G | 3 | Abb | |||
6 | 32 | E## | 20 | F# | 8 | Gb | |||
5 | 25 | E# | 13 | F | 1 | Gbb | |||
4 | 30 | D## | 18 | E | 6 | Fb | |||
3 | 23 | D# | 11 | Eb | -1 | Fbb | |||
2 | 28 | C## | 16 | D | 4 | Ebb | |||
1 | 33 | B## | 21 | C# | 9 | Db | |||
0 | 26 | B# | 14 | C | 2 | Dbb |
( ⇒ In Musescore press Ctrl+Shift+P, then F1 to bring it up. )
A list of useful snippets for plugin creation.
Lilypond is called in this example. A plugin could also save as MusicXML, manipulate the MusicXML file and open it again via Score.load()
You can access almost any class of the Qt Framework from the plugin framework
The easiest way to make a dialog or UI is to use Qt Creator. Qt Creator is installed with your version of Qt.
my.ui
Most of the documentation for Plugins 2.x is accessed from the Help screen in Plugin Creator in MuseScore.
( ⇒ In Musescore press Ctrl+Shift+P, then F1 to bring it up. )
However, here is a quick guide to get you started.
The main class is MuseScore.
Use 'New' to create a skeleton plugin, which creates a simple "Hello World" to the console.
Plugins are coded in QML
The best place to look for how to do things are the sample plugins provided.
These are stored in the plugins folder where musescore is installed, e.g. for 64-bit Windows: C:\Program Files (x86)\MuseScore 2\plugins, see also the handbook for Installation of Plugins.
For some more details about those check the handbook for Plugins installed by default
Note that in the current version of MuseScore 2.1 plugins loaded by Plugin Manager require you to restart MuseScore to pick up any changes. You can however use Plugin Creator's Run button to test them.
Not to be confused with Musescore 4's VST and VSTi feature
This chapter is for MuseScore 3 plugin developers. For other versions, visit Plugin development. To fork the main program, visit the main sections in Developers' handbook.
For info on what plugins are, how to install and use them, visit Musescore 3 handbook plugin section.
This chapter aims to provide knowledge, code snippets and work-arounds for better understanding and programming of MuseScore plugin system. Anyone working on plugins are welcomed to document their learnings and experiences. To add your input, register a musescore.org account and login, click the ⠇ to the right of the title, choose Edit. For discussion about this chapter itself visit this forum thread.
The desktop program MuseScore is mostly written in C++ utilizing Qt framework 5.9.9, developers expose a minimal collection of frequently used functions and data as API to allow plugin development beyond MuseScore's built-in features.
Web devs might not need to learn QML (Windows only), use this boilerplate plus html, css and js code to create your plugin. demo plugin
Plugins use the QML language of Qt framework, which is a declarative language that provide visual user interfaces, along with the Qt JavaScript host environment it allows interaction programming with a restricted version of javascript
Plugin creation does not require C++ knowledge
Dev also often utilize the poorly documented non-API cmd().
MuseScore Plugin writing is not rocket science, you may be suprised how easily things are done. You do not need to install anything additional, just open Musescore:
Try out Makeshift REPL plugin function tester plugin.
QML files are plaintext. You can use any external text editor, eg Sublime Text, Notepad++ etc, to edit a .qml file. After you modified and saved, you need to either:
NOTE: Script running from plugin menu has its version freezed at the moment of Musescore startup.
Hot reloading (auto build) and auto-complete are absent in Plugin Creator. The developers of Musescore 4 are aware of its flaws and plan to replace it in later releases. While waiting for upgrades, to edit in external editor and reload and test in Plugin Creator:
The best options for auto complete (QML syntax only, not auto reference or API auto complete)
This section gathers reusable code snippets and boilerplates to help beginners get things done without a hassle. To alleviate QML frustration see QML boilerplates. Copy and paste to your plugin, tweak it to your liking. Also check out specific use cases and notes. Feel free to add your clever codes.
MuseScore 3.6.2 Backend mainly under /libmscore
API 3.5 (for Musescore 3.6) under /mscore/plugin/api
* An online code search enabled clone of MuseScore 3.6.2 src (Online code search on the official repo always returns results based on current master src ie MuseScore 4 up-to-date version)
* An essential collection is also shown on the doxygen website.
Latest MuseScore 4 code:
MuseScore 4 Backend is rewritten and separated into two layers, under /src/engraving/libmscore and various /*/internal
API (3.5, not yet updated for MuseScore4, as of Nov2022) under /src/plugins/api
* Official src
Also try log type enum string snippet and Makeshift REPL plugin function tester plugin for enum and keyword autocompletion.
Namespace/enum list
Base Class/Component
All elements has a .name
property to provide understandable info of its type.
To match and compare reliably, use .type
property. It is Enum, it uses a integer number internally. These enums can be referenced from various properties of the Base Class/Component
eg Accidental.FLAT
eg how-to Element.NOTE
find NOTE
under ElementType in the Namespace/enum list,
use Element
because Base Class/Component says Element Contains Ms::ElementType enumeration values.
The Plugin API Documentation is automatically generated (in Doxygen format) whenever MuseScore developers build the main program. It is normal for beginners to be startled by its complexity.Use the search on the top right, instead of menu navigation.
Notes on API written by fellow musescore.org users, feel free to pitch in
List of all API object types
Also see QML boilerplates
Note: doc.qt.io search sometimes returns an unexpected outdated page, eg QtQuick 1 Button instead of current QtQuick 2 Button.
Qt Quick Controls, the anchors and Qt Quick Layouts may suffice. Using Qt Widgets from QML may be overkill not worth your time.
List of all QML components for Qt 5.9
Customizing Qt Quick Controls 2 Please note that style are unsupported though.
Anchors enum
Keys enum list eg Qt.Key_Space
Mouse button enum list eg Qt.LeftButton, more on mouse see this notes
QtQuick Type properties for disabled, qmlssed, checked, checkable, focused, highlighted, flat, mirrored, hovered etc.
Settings{ } for persistence (save to OS, eg registry in windows)
Get the theme status with SystemPalette { }
Musescore.org users' notes on QML and snippets
and/or
Windows only, see QML notes
Use the two boilerplates, which utilize a hybrid view built with html, css and standard javascript thru a 100% width and height WebEngine.
Standard set of javascript is used, for tech compatibility check on caniuse.com (find Chrome v56), eg css display:grid is unsupported. This js set should not be confused with the other restricted set in QML functions, more info in Caution section
The following javascript inside WebEngine works:
The following css works:
The following css will not work:
Visit WebEngine community notes
Technical info on WebEngineView, WebChannel, WebView:
WebEngineView fetches url, search data on html and runs javascript from QML side only, its version in MuseScore 3 (Qt 5.9) is based on Chromium version 56.0.2924.122.
To communicate bidirectionally between QML and webpage use it with WebChannel.
WebView 1.1 is an older component and use a different engine which does not offer simple WebChannel support, try WebSocket.
A list of every qrc:/// built-in musescore.qrc (src ref)
Icons, symbols and fonts (not soundfont) see this snippet
MuseScore dev team designs and uses its own two sets of styles, their details are not exposed as API yet, find them in github repo (then plz share link here).
Musescore 3.6.2 use Qt 5.9.9, for latest version of common modules use:
import MuseScore 3.0
import QtQuick 2.9
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.2
import QtQuick.Dialogs 1.2
import Qt.labs.settings 1.0
import FileIO 3.0
import QtWebEngine 1.5 // web modules are Windows only
import QtWebChannel 1.0 // web modules are Windows only
Developers of MuseScore do not have resource to maintain and expose every function and data as API, some functionalities of Musescore the main program are yet to be available as plugin API.
Try out cmd() to run program sequence that you've seen in musescore and think may exist as coroutine. Actions that can be assigned to keyboard shortcuts are possible cmd(). These commands are poorly documented, and often cause prog crash (save your qml before Run). Study main C++ repo to understand more.
Beginners into programming may get confused with API Class Inheritance Hierarchy and Musescore runtime internal score structure hierarchy, read up on inheritance object oriented programming, also try out the debugger
A different non-QML javascript API was used in MuseScore 1.x. While one can still learn a lot reading those files, they use the old API and will not work with current one. One way to spot the old API is presence of new Cursor(curScore)
. The current QML system use curScore.newCursor()
The QML functions use a restricted version of javascript, the following will not work:
To write modular codes, QML has import .js
Inside QML WebEngine, a different, standard version of javascript runs on outdated Chromium v56 engine, more info in UI section
You cannot edit class/object as you would with .prototype in javascript, see component creation if it suits your need.
Object.assign() (and spread function) also does not work, as opposed to stated on Qt webpage. This probably happens when Qt company add dynamically typed javascript scripting to the strong typed C++ based env. Instead create your own shallow copy with a for loop and then some spaghetti code.
QML property declaration:
A list can only store QML objects:
Item { property list aList: [ ] aList2: [ ] //shorthand of above }
A list is an object: typeof list == 'object'
An array is a variant:
Item { property var anArray: [ ] }
_
inside QML functions:
same syntax as in standard javascript
Item { function a(){ var anArray=[ ] } }
Qt Quick Controls style eg import QtQuick.Controls.Material unsupported, see reasons
MuseScore dev team designs and uses its own two sets of styles, get the theme status with QML SystemPalette
, see source post. Their color and metric details are not exposed as API yet, find them in github repo (then plz share link here).
Above concerns UI component styles, not engraving style
cursor.rewindToTick(x) will only work correctly if there is a segment at x. Otherwise it will put the cursor at the next available segment (in the current track) after x, see https://musescore.org/en/node/345409#comment-1206211
If you are having difficulty, try
Use google and the musescore.org forum search before posting new questions.
Ask politely in the plugins forum, provide a Minimal, Reproducible Example if possible, the community is usually more than happy to help.
<qml>
and </qml>
to get better layout and to avoid musescore.org auto escaping eg to show & instead of &
see Internationalization
one solution to folder structure
Plugin could be posted as a project on musescore.org without any github knowledge. Chat with other dev at the plugin forum.
Fill out the API compatibility 3.x or else your plugin with remain hidden to most users.
Following is not written by a lawyer, consult a real one if you are concerned with licensing.
You do not need Qt licensing, as it does not affect QML scripts solely on the basis that they are written in the QML language per se, more info consult Qt dual licensing.
You do not need to follow MuseScore's GPL licensing as long as your plugin does not use MuseScore code base. MuseScore 3 use GPL which is copyleft, derivative work using MuseScore code base, once conveyed, must follow. This matter is debatable.
API 3.5 thanks to
dmitrio95,
and many others
import API FileIO module version
import module version at Qt
import module version at wikipedia
import WebChannel module version
To help beginners kickstart their plugin project, this section gathers boilerplates ,tiny reusable code snippets or parts which are too trivial to be used as an individual plugin, along with several specific use cases and notes that demonstrate how to achieve particular tasks in plugin code.
This place centralizes clever code bits which would otherwise be left hidden under waves of forum posts. Anyone can edit. Feel free to rearrange, correct or add anything, provide a source if possible. Only share code that is taken from other's plugin after you make sure you have permission. Musicians who wish to learn to create plugins usually visit here first, it'd be counter-productive to fragmentize MuseScore resource on the web, plus sharing here saves you the trouble of learning git commands and signing up for github. Codebase large or functional enough to be used as an individual plugin could be posted as a project on musescore.org without github knowledge. Tips on QML are also put in here and as subpage, notes on API write in community notes on API
Wong. Spot a typo? Found codes need fixing? Want to share yours? Please go ahead. Click the ⠇ to the right of the title, choose "Edit".
Not a musescore.org member yet? Register an account, it's free. Start editing right away, you really do not need to report and wait for permission. In fact, paid employee from MuseScore BVBA tends to concentrate on improving the main program and providing forum support, it is up to fellow passionate musicians like yourself to share findings and correct errors in the plugin section. Discussion about this page itself visit this forum thread.
Marked Default are copied from plugins bundled with MuseScore 3 installation, open them to learn more.
Contains auto layout templates.
also try the buildin debugger
Object Explorer plugin exhaustively print out element info
see also: use case: Element Explorer
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug20" onScoreStateChanged: { if (state.selectionChanged && curScore){ var es=curScore.selection.elements for (var i = 0; i < es.length; i++) { console.log('\n'+es[i].name) for(var p in es[i]){ console.log(es[i].name+"."+p+" : "+es[i][p]) } } } } }
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug2" id:pluginscope property var c onRun: { pluginscope.c=curScore.newCursor() pluginscope.c.inputStateMode=Cursor.INPUT_STATE_SYNC_WITH_SCORE } onScoreStateChanged: { if (state.selectionChanged && curScore) console.log( pluginscope.c.tick ) } }
Note: selectRange() parameter endTick and endStaff are excluded from selection
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug3" onRun: { curScore.startCmd() curScore.selection.selectRange(0,curScore.lastSegment.tick + 1,0,curScore.nstaves); //cmd("select-all") curScore.endCmd() var es=curScore.selection.elements for (var i = 0; i < es.length; i++) { if(es[i].type==Element.NOTE) console.log(es[i].pitch) } } }
more info: move cursor to start or end of your current selection ,or tick
see also Default walk.qml
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug5" onRun: { var c= curScore.newCursor(); c.voice = 0; c.staffIdx = 0; c.rewind(Cursor.SCORE_START); console.log(c.tick) } }
import MuseScore 3.0 MuseScore { menuPath: "Plugins.debug55" property var reverseEnumElement:(function(){ var x={}; for(var i in Element){ if(typeof Element[i]!=='function') x[Element[i]]=i }; return x })() onRun:{ console.log(reverseEnumElement[curScore.selection.elements[0].type]) } }
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug4" onRun: { var e=curScore.selection.elements[0] if(e.type==Element.NOTE){ console.log( "This pitch "+e.pitch ) var track=e.track var seg=e.parent while(seg&&seg.type!=Element.SEGMENT){ seg=seg.parent } if(seg) var tick=seg.tick var c=curScore.newCursor() c.track=track //set track first, setting track will reset tick c.rewindToTick(tick) var segnext=c.segment.next if(segnext &&segnext.elementAt(track).type==Element.CHORD // 1 or more notes &&segnext.elementAt(track).notes ) console.log("Next pitch "+ segnext.elementAt(track).notes[0].pitch ) //0=first entered note } } }
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug41" onRun: { var e=curScore.selection.elements[0] var track=e.track var seg=e.parent while(seg&&seg.type!=Element.SEGMENT){ seg=seg.parent } if(seg) var tick=seg.tick var c=curScore.newCursor() c.track=track //set track first, setting track will reset tick c.rewindToTick(tick) if(c.segment.elementAt(track).type==Element.CHORD){ var notesarray=c.segment.elementAt(track).notes if(notesarray&¬esarray.length>0){ for (var i = 0; i < notesarray.length; i++){ console.log('note # '+i+' pitch '+notesarray[i].pitch) } } } } }
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug7" onRun:{ var c=curScore.newCursor() c.inputStateMode=Cursor.INPUT_STATE_SYNC_WITH_SCORE curScore.startCmd() c.addNote(60) // c.addNote(60,true) to create double stops or chord, or insert note into one //addNote( ) advances the cursor curScore.endCmd() } }
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug8gpl" // // create and return a new Note element with given pitch, tpc function createNote(pitch, tpc){ var note = newElement(Element.NOTE); note.pitch = pitch; note.tpc = tpc; note.tpc1 = tpc; note.tpc2 = tpc; return note; }// end CreateNote // Use cursor.rewindToTick(cur_time) instead function setCursorToTime(cursor, time){ cursor.rewind(0); while (cursor.segment) { var current_time = cursor.tick; if(current_time>=time) return true cursor.next(); } cursor.rewind(0); return false; }// end setcursor To Time //adds chord at current position. chord_notes is an array with pitch of notes. function addChord(cursor, chord_notes, duration){ if(chord_notes.length==0) return -1; var cur_time=cursor.tick; cursor.setDuration(duration, 1920); cursor.addNote(chord_notes[0]); //add 1st note //addNote( ) advances the cursor var next_time=cursor.tick; setCursorToTime(cursor, cur_time); //rewind to this note var note = cursor.element.notes[0]; note.tpc = chord_notes[4]; var chord = cursor.element; //get the chord created when 1st note was inserted for(var i=1; i<4; i++){ var note = createNote(chord_notes[i], chord_notes[i+4]); note.tpc = chord_notes[i+4]; chord.add(note); //add notes to the chord //add( ) does not advance the cursor chord.notes[i].tpc = chord_notes[i+4]; } setCursorToTime(cursor, next_time); return 0; }//end AddChord onRun: { var cursor = curScore.newCursor(), startStaff, endStaff, endTick, fullScore = false; cursor.rewind(1); if (!cursor.segment) { // no selection fullScore = true; startStaff = 0; // start with 1st staff endStaff = curScore.nstaves - 1; // and end with last } else { startStaff = cursor.staffIdx; cursor.rewind(2); if (cursor.tick === 0) { // this happens when the selection includes the last measure of the score. endTick = curScore.lastSegment.tick + 1; } else { endTick = cursor.tick; } endStaff = cursor.staffIdx; } cursor.rewind(1); // beginning of selection if (fullScore) { // no selection cursor.rewind(0); // beginning of score } cursor.voice = 0; cursor.staffIdx = 1; // chords[0]: name // chords[1]: pitches lo-hi & tpc lo-hi // chords[2]: occurences of this voicing // chords[3]: instances of this chord name var chords= [ ["C7b13",[48,52,56,58,14,18,10,12],1,1], //c,e,ab,bb ["C7b13",[52,56,58,62,18,10,12,16],1,1], //e,ab,bb,d ]; for (var c = 0; c < chords.length; c++){ cursor.staffIdx = 0; var harmony = newElement(Element.HARMONY); harmony.text = chords[c][0]; cursor.add(harmony); cursor.staffIdx = 1; var chord = chords[c][1]; var cur_time=cursor.tick; addChord(cursor, chord, 1920); // 480 OK for quarter note trips; 240 for eight notes etc } } }
Changing note's accidentalType
changes pitch and tpc automatically.
Creating a new Element.ACCIDENTAL
with accidentalType
and then adding it to a note does not always work as expected.
For cosmetic purpose accidental without pitch change, and microtonal symbols, use Element.SYMBOL
instead, see dmitrio95's post, also see Tuning systems, microtonal notation system, and playback.
Source: dmitrio95's post and XiaoMigros's post.
For possible accidentals, see the AccidentalType enum
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug71" onRun:{ var note=curScore.selection.elements[0] curScore.startCmd() note.accidentalType = Accidental.SHARP2 // the 'x' double sharp curScore.endCmd() curScore.startCmd() note.accidental.color = "red" curScore.endCmd() } }
see also the create note snippet above
see also use case: Changing an Existing Note's Pitch
Two scenarios
* in Fretted eg guitar TAB: must set 5 values: .pitch, .string, .fret, .tpc1, .tpc2
* in Fretless eg piano: must set 3 values: .pitch, .tpc1, .tpc2
source notes
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug8" //WIP }
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug9" onRun: { var e=curScore.selection.elements[0] var seg=e.parent while(seg&&seg.type!=Element.SEGMENT){ seg=seg.parent } if(seg) var tick=seg.tick var c=curScore.newCursor() c.rewindToTick(tick) c.track=e.track var lyr = newElement(Element.LYRICS) lyr.text = "muse" lyr.verse = 0 curScore.startCmd() c.add(lyr) curScore.endCmd() var lyricsarray=['score','is','awesome'] c.next() while(c&&c.element&&lyricsarray.length>0){ if( c.element.type==Element.CHORD // 1 or more notes // &&c.element.type!=Element.REST //redundant ){ var lyr = newElement(Element.LYRICS) lyr.text = lyricsarray[0] lyr.verse = 0 curScore.startCmd() c.add(lyr) curScore.endCmd() lyricsarray.shift() } c.next() } } }
see notes on which methods seem not working
Note: Musescore 3 interpret key signature's shape and flat symbols to provide tonality logic, it does not understand tonality really. The following code returns the key signature shown on screen, it does not always mean the real key in musical sense . Caution when using an open/atonal keysig and/or on transposing instruments; transposing instruments' return value also varies with user's current "Concert Pitch" display status.
key signature enum are not exposed as API yet, use this hardcoded schema, ref:
Num of Sharps = positive number
No symbols = 0
Num of Flats = negative number
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug29" onRun:{ var c=curScore.newCursor() c.inputStateMode=Cursor.INPUT_STATE_SYNC_WITH_SCORE console.log(c.keySignature) } }
Did you find a way get to its existing content text eg read title, composer text string ? src ref
also see metatag snippet which contains score properties set as data field only , which may not be the current visual text
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug12" onRun: { var c=curScore.newCursor() c.rewind(Cursor.SCORE_START) curScore.selection.select(c) //tackle weird range select problem cmd('prev-element') while( curScore.selection.elements[0].type!=Element.VBOX ){ cmd('prev-element') } var e=curScore.selection.elements[0] console.log(e.name) } }
Alternative to modifying existing text: Delete the existing frame, use the addText function:
curScore.addText("title", "The Park, Op. 44")
some values won't work, always check actual timesig : right click > measure prop see handbook
See Time Signature Enforcer for a plugin that uses the cmd interface to manipulate the timesigActual of a measure.
see notes for methods currently not working
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug28" onRun: { var c=curScore.newCursor() c.inputStateMode=Cursor.INPUT_STATE_SYNC_WITH_SCORE // var m=c.measure.timesigActual //replace with timesigNominal for displayed symbol console.log("timesigActual : "+m.numerator) console.log("timesigActual : "+m.denominator) // var ts=newElement(Element.TIMESIG) ts.timesig=fraction(12,8) //some values won't work, always check timesigActual curScore.startCmd() c.add(ts) curScore.endCmd() } }
'name' of default score properties
import MuseScore 3.0 MuseScore { menuPath: "Plugins.debug31" onRun:{ console.log(curScore.metaTag("workTitle")) //https://github.com/fp22june/MuseScoreTag362/blob/master/share/templates/My_First_Score.mscx#L19-L29 } }
see also TempoChanges Plugin
sym, SymId enum: see Master palatte > symbols or lookup
MS3 fontfamily
lookup codepoints
everything in musescore.qrc
only icon image
source post
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug30" pluginType:"dock" onRun: { var c=curScore.newCursor() c.inputStateMode=Cursor.INPUT_STATE_SYNC_WITH_SCORE // var s = newElement(Element.ARTICULATION); s.symbol = "articAccentAbove" // see SymId enumeration values curScore.startCmd() c.add(s) curScore.endCmd() // var sym = newElement(Element.SYMBOL); sym.symbol = "miscEyeglasses" curScore.startCmd() c.add(t) curScore.endCmd() // var t = newElement(Element.STAFF_TEXT); t.fontSize= 20 t.text = "<sym>miscEyeglasses</sym>" curScore.startCmd() c.add(t) curScore.endCmd() } Column{ Text{ font.family: 'MScore Text' //also Bravura Leland //https://github.com/musescore/MuseScore/tree/master/fonts font.pointSize: 20 text:"\uE4E5" //https://github.com/w3c/smufl/blob/gh-pages/metadata/glyphnames.json } Image{ source:"qrc:///data/icons/note-longa.svg" //https://github.com/musescore/MuseScore/blob/3.x/mscore/icons.cpp#L40 } } }
The following snippet saves a string as tag property in a score, to save object use JSON.stringify() and parse()
Also:
Save data to a time position: add invisible Staff Text, more info study the MuseScore Navigation plugin
Save data across sessions, use Settings { }, study the Daily Log plugin
import MuseScore 3.0 import QtQuick 2.9 import QtQuick.Controls 2.2 MuseScore { menuPath: "Plugins.debug24" pluginType: "dock" anchors.fill: parent onRun:{ curScore.setMetaTag('customdataname', 'initemptyvalue') } Column{ Button{ text:"load" onClicked: console.log( curScore.metaTag('customdataname') ) } Button{ text:"save" onClicked: curScore.setMetaTag('customdataname', 'customdatavalue') } } }
Following limits cpu-heavy, blocking synchronous code to last plugin instance (because every onScoreStateChanged continues to run even after its invocation plugin window closed)
Remember to use unique string in metaTag('PluginLastInstance')
To test, comment out the comparison line then reopen plugin few times
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug43" property string instanceStamp:Date.now() Component.onCompleted: curScore.setMetaTag('PluginLastInstance', instanceStamp) //save to score, overwritten by latest plugin function blockingSynchronousCode(){ var x=0 for(var i=0;i<1e7;i++) x+=i //edit 1e7 according to cpu } onScoreStateChanged:{ if(curScore.metaTag('PluginLastInstance')==instanceStamp){ //filter out old instances blockingSynchronousCode() } } }
Using the gate method above, if the plugin window stays open, switching to another score will invalidate onScoreStateChanged because instanceStamp doesn't exist or doesn't equal to plugin's stored value. Click button to reapply stamp so that plugin is affected by current score's onScoreStateChanged
Remember to use unique string in metaTag('PluginLastInstance')
import MuseScore 3.0 import QtQuick 2.9 import QtQuick.Controls 2.2 MuseScore { menuPath: "Plugins.debug44" pluginType: "dock" anchors.fill:parent property string instanceStamp:Date.now() function maincode(){ txt.text=instanceStamp+' score called '+Date.now() } function ownInstance(){ instanceStamp=Date.now() curScore.setMetaTag('PluginLastInstance', instanceStamp) maincode() } Component.onCompleted: ownInstance() onScoreStateChanged:{ if(curScore.metaTag('PluginLastInstance')==instanceStamp){ maincode() } } Column{ Button{ text:"relink to current score" onClicked:ownInstance() } Text{ id: txt anchors.fill:parent } } }
import MuseScore 3.0 import QtQuick 2.9 import QtQuick.Controls 2.2 MuseScore { menuPath: "Plugins.debug22" pluginType: "dock" anchors.fill: parent id:pluginscope property var db:[ { nm : "name1" , btn : true } , { nm : "name2" , btn : false } , { nm : "name3" , btn : false } , { nm : "name4" , btn : true } ] function gen(payload){ if(payload && payload.deletenm){ for (var i=0; i<pluginscope.db.length; i++){ if(pluginscope.db[i].nm==payload.deletenm){ pluginscope.db[i].removed=true } } } if(payload && payload.renewall){ pluginscope.db=pluginscope.db.map(function _(r){ return ({ nm: r.nm, btn: r.btn, removed: false}) }) } md1.clear() pluginscope.db.map(function _(r){ if(!r.removed) md1.append(r) }) console.log("gen") } Item{ anchors.fill: parent ListModel { id: md1 } //ref from delegate use getview1.ListView.view.model ListView { anchors.fill: parent id: listview1 //ref from delegate use getview1.ListView.view model: md1 delegate: Component { Row{ id: getview1 width: parent.width Text{ clip:true text: nm } Button { text: btn ? "logmynm" : "deleteme" onClicked:{ if(btn){ console.log(nm) } else { gen({ deletenm : nm }) } } } } } } } Button { anchors.bottom: parent.bottom text: "renewall" onClicked: gen({ renewall : true }) } }
more info see this QML notes
Keys enum list
focus:true may not mean want you think
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug10" pluginType: "dock" Item { focus:true Keys.onPressed: { console.log("event.key: "+event.key) if (event.key == Qt.Key_Space) cmd("play") } } }
import MuseScore 3.0 import QtQuick 2.9 import QtQuick.Controls 2.2 MuseScore { menuPath: "Plugins.debug50" pluginType: "dock" anchors.fill: parent Column{ anchors.fill: parent id:btnscontainer } Component { id: btntemplate Button { width: parent.width } } Component.onCompleted:{ btntemplate.createObject(btnscontainer,{text:'log1'}) .clicked.connect(function(){console.log('logged1')}) btntemplate.createObject(btnscontainer,{text:'log2'}) .clicked.connect(function(){console.log('logged2')}) } }
import MuseScore 3.0 import QtQuick 2.9 import QtQuick.Controls 2.2 MuseScore { menuPath: "Plugins.debug54" pluginType: "dock" anchors.fill: parent implicitHeight: 9999 Column{ id:maincontainer anchors.fill:parent ; padding:5; Row{ id:rowtoftext } } Component { id: texttemplate Text{ color:'green' topPadding:5 property var fs // to dynamically overwrite font.pointSize font.pointSize: fs||this.font.pointSize font.weight:Font.Medium } } Text{ id:normaltext } //reference Component.onCompleted:{ texttemplate.createObject(rowtoftext,{ text:'Extend' ,rightPadding:10 ,leftPadding:Qt.binding(function(){return parent.width*.3 }) // use Qt.binding for non-static var , otherwise assigned at createObject( ) invocation }) texttemplate.createObject(rowtoftext,{ text:'Musescore' ,color:'blue' ,topPadding:0 ,fs: normaltext.font.pointSize*1.5 }) } }
import MuseScore 3.0 import QtQuick 2.9 import QtQuick.Controls 2.2 import QtQuick.Dialogs 1.1 MuseScore { menuPath: "Plugins.debug51" pluginType: "dock" id: pluginscope anchors.fill: parent // Component { id: msg ; MessageDialog { title: "Confirm"; standardButtons: StandardButton.Ok; onAccepted: console.log("ok") } } function confirm(t){ msg.createObject(pluginscope,{ text:t, visible: true}) } // Button { width: parent.width text:"MuseScore" onClicked: confirm('Rocks') } }
more prop like disabled, qmlssed, checked, checkable, focused, highlighted, flat, mirrored, hovered etc
for more mouse control like detect button, QML use MouseArea , see this QML notes
import MuseScore 3.0 import QtQuick 2.9 import QtQuick.Controls 2.2 MuseScore { menuPath: "Plugins.debug6" pluginType: "dock" anchors.fill: parent Button{ text:"clickme" onClicked: onbtn1() background: Rectangle { color: parent.hovered ? "#aaa": "#ddd" } } function onbtn1(){ console.log("clicked") } }
Mouse button enum list
also see this QML notes
for complex mouse handler logic, you may want to use standard js mouseevent as in the WebEngine snippet, instead of QML mouseevent shown here
import MuseScore 3.0 import QtQuick 2.9 import QtQuick.Controls 2.2 MuseScore { menuPath: "Plugins.debug90" pluginType: "dock" anchors.fill: parent Row{ Rectangle { width: 50; height: 50; color: "red" MouseArea{ id:ma anchors.fill: parent acceptedButtons: Qt.LeftButton | Qt.RightButton onPressed: { console.log('MouseArea.pressedButtons: '+ pressedButtons) //pressedButtons is also available ma.pressedButtons console.log('mouse.button: '+mouse.button) //mouse is mouseEvent exist inside onPressed(){} } } } Rectangle { width: 50; height: 50; color: "blue" MouseArea{ anchors.fill: parent acceptedButtons: Qt.LeftButton z:2 onPressed:{ mouse.accepted=false console.log('pressed') } } MouseArea{ anchors.fill: parent acceptedButtons: Qt.LeftButton z:-1 onReleased:{ console.log('released') } } } } }
import MuseScore 3.0 import QtQuick 2.9 import QtQuick.Controls 2.2 MuseScore { menuPath: "Plugins.debug52" pluginType: "dock" id: pluginscope anchors.fill: parent // property var timeout Component { id: setTimeout ; Timer { } } // Button { width: parent.width text:"Delayed" onClicked:{ console.log('promise') setTimeout.createObject(pluginscope,{ interval:1000 ,running:true }) .triggered.connect(function(){ console.log('delivered') }) } } }
import MuseScore 3.0 import QtQuick 2.9 import QtQuick.Controls 2.2 MuseScore { menuPath: "Plugins.debug53" pluginType: "dock" id: pluginscope anchors.fill: parent // property var timeout Component { id: setTimeout ; Timer { } } function debounced(curryt,curryf){ return function(obj){ if(timeout) timeout.stop() timeout=setTimeout.createObject(pluginscope,{ interval:curryt //,onTriggered:function(){ curryf(obj) } //?cannot curry? ,running:true }) timeout.triggered.connect(function(){ curryf(obj) }) } } // property int heavycount:0 function heavy(){console.log('heavy'+(heavycount++))} property var heavydebounced:debounced(500,heavy) // property int easycount:0 Button { width: parent.width text:"Smash" onClicked:{ console.log('easy'+(easycount++)) heavydebounced() } } }
Windows only, see QML notes
save the following two snippet in the same directory, name the html debug21.html
also see the other advanced boilerplate below
import MuseScore 3.0 import QtQuick 2.9 import QtQuick.Controls 2.2 import QtWebEngine 1.5 MuseScore { menuPath: "Plugins.debug21" pluginType: "dock" anchors.fill: parent Column{ anchors.fill: parent Button{ id:b height:30 text:"clickme" onClicked:{ v2.runJavaScript('approot.style.background="red"') v3.loadHtml('<div style="background:green;width:100%;height:100%"></div>') } } WebEngineView { width: parent.width height: (parent.height-b.height)/3 url: "https://example.com" } WebEngineView { id:v2 width: parent.width height: (parent.height-b.height)/3 url: "debug21.html" } WebEngineView { id:v3 width: parent.width height: (parent.height-b.height)/3 } } }
debug21.html
<div id="approot" style="width:100%;height:100%"></div>
Windows only, see QML notes
save the following two snippet in the same directory, name the html debug19.html
advice: if large project, avoid direct mutations will help prevent nightmare
also see the other simpler boilerplate above
import MuseScore 3.0 import QtQuick 2.9 import QtQuick.Controls 2.2 import QtWebEngine 1.5 import QtWebChannel 1.0 MuseScore{ menuPath: "Plugins.debug19" pluginType: "dock" anchors.fill: parent QtObject { id: backendobj WebChannel.id: "backendid" property string backp: "nothing" signal post(string payload) function backf(payload){ backconsole.text = "From front f: " + payload +'\n'+ backconsole.text return (payload+110) } } Column{ anchors.top: wv.bottom spacing: 6 Button { height: 12 text: "Cast signal backendobj.post" onClicked: { backendobj.post(201319) } } Button { height: 12 text: "Direct javascript" onClicked:{wv.runJavaScript("" + " var t=document.querySelector('textarea').value; " + " document.querySelector('textarea').value = 'Direct javascript: 394' +'\\n'+ t; " )} } Button { height: 12 text: "Read backendobj.backp" onClicked: { backconsole.text = backendobj.backp +'\n'+ backconsole.text } } Text { id: backconsole text: "BackConsole" //onTextChanged: backendobj.post("BackConsoleCB") } } WebChannel { id: channel registeredObjects: [backendobj] } WebEngineView { id: wv width: parent.width height: parent.height/2 url: "debug19.html" webChannel: channel onJavaScriptConsoleMessage: function(w,s,l,i){ console.log('Web console line '+l+' : '+s) } //pipe console } }
debug19.html
<button onclick="frontf()">Front f</button> <button onclick="backendobjread()">Direct backendobj.back read</button> <button onclick="backendobjwrite()">Direct backendobj.back write</button> <textarea id="debug" style="width:100%;height:60%"></textarea> <script src="qrc:///qtwebchannel/qwebchannel.js"></script> <script> var backend window.onload = function _(){ new QWebChannel(qt.webChannelTransport, channel=>{ backend = channel.objects.backendid; backend.post.connect(payload=>{ debug.value = ("Signal from backendobj.post: "+payload) +'\n'+ debug.value }) }) } // async backend.func and callback var frontf = _=>{ backend.backf( 721 , r=>{ debug.value = ("Back f CB: "+r) +'\n'+ debug.value }) } // direct read/write backend.prop var backendobjread = _=> debug.value = backend.backp +'\n'+ debug.value var backendobjwrite = _=> backend.backp = new Date() </script>
see also this note
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug64" function iterCh(cb){ var parts = curScore.parts for (var i = 0; i < parts.length; i++) { var instrs = parts[i].instruments for (var j = 0; j < instrs.length; j++) { var channels = instrs[j].channels for (var k = 0; k < channels.length; k++) { cb(parts[i],instrs[j],channels[k], i,j,k) } } } } onRun:{ iterCh(function _(p,i,c, n,m,k){ c.mute=true }) } }
see the BandInMuseScore plugin and receiving / passing MuseScore command line parameter.
TIPS: use Score's path, see api and Batch Convert
import MuseScore 3.0 import QtQuick 2.9 MuseScore { anchors.fill: parent menuPath: "Plugins.debug42" QProcess { id: proc } onRun:{ console.log('os: '+Qt.platform.os) var c switch (Qt.platform.os){ case "windows": c = 'cmd /c calc' break; default: c = '/bin/sh -c calc' } proc.start(c) var val=proc.waitForFinished(5000) // DEBUG try { var out=proc.readAllStandardOutput() console.log("-- Command output: "+out) if (val) { console.log('terminated correctly.') } else { console.log('failure') } } catch (err) { console.log("--" + err.message); } } }
This can be achieved by comparing the .tpc1
and .tpc2
value of a note of a transposing instrument.
The note.tpc1
is the Concert pitch representation of a note.
The note.tpc2
is the Score pitch representation of a note.
The note.tpc
is the representation of the note in the current mode.
For a transposing instrument tpc1
and tpc2
are different. So they can be compared to tpc
and the current mode deduced.
For a non transposing instrument tpc1
and tpc2
are equal. So the current mode cannot be deduced.
import QtQuick 2.0 import MuseScore 3.0 MuseScore { menuPath: "Plugins.pluginName" description: "Description goes here" version: "1.0" onRun: { // assuming a note of a transpoing instrument is selected var note=curScore.selection.elements[0]; console.log((note.tpc===note.tpc1)?"Concert Pitch":"Score pitch"); } }
This can be achieved by comparing the .tpc
and .tpc1
value of a note of a transposing instrument.
The note.tpc1
is the Concert pitch representation of a note.
The note.tpc2
is the Score pitch representation of a note.
import QtQuick 2.0 import MuseScore 3.0 MuseScore { menuPath: "Plugins.pluginName" description: "Description goes here" version: "1.0" onRun: { var note=curScore.selection.elements[0]; // assuming a note is selected console.log("Instrument's transposition: %1 semtitones".arg(deltaTpcToPitch(note.tpc1,note.tpc2))); } function deltaTpcToPitch(tpc1, tpc2) { var d = ((tpc2 - tpc1) * 5) % 12; //if (d < 0) d += 12; return d; } }
Better use Plugin Manager's "Define Shortcut" instead, because running the following code more than once will bug out that key until restart.
Source post.
Workaround forum post by matt28.
import MuseScore 3.0 import QtQuick 2.6 import QtQuick.Window 2.2 MuseScore { id: plugin pluginType: "dock" readonly property var window: Window.window Item { id: someItem focus:true } Shortcut { sequence: "Ctrl+D" context: Qt.ApplicationShortcut onActivated: { plugin.window.requestActivate(); someItem.forceActiveFocus(); } } }
Element Analyser plugin which aims to provide a reusable library
License info are for legal purpose of this webpage only.
These are copied from default plugins and MuseScore files. Some contributor info are missing, please add credits wherever due.
abc_import.qml
Based on ABC Import by Nicolas Froment (lasconic)
Copyright (2013) Stephane Groleau (vgstef)
colornotes.qml
Copyright (C) 2012 Werner Schweer
Copyright (C) 2013-2017 Nicolas Froment, Joachim Schmitz
Copyright (C) 2014 Jörn Eichler
notenames-interactive.qml
Copyright (C) 2012 Werner Schweer
Copyright (C) 2013 - 2019 Joachim Schmitz
Copyright (C) 2014 Jörn Eichler
Copyright (C) 2020 MuseScore BVBA
notenames.qml
Copyright (C) 2012 Werner Schweer
Copyright (C) 2013 - 2020 Joachim Schmitz
Copyright (C) 2014 Jörn Eichler
Copyright (C) 2020 Johan Temmerman
Copyright (C) 2023 Laurent van Roy (parkingb)
Copyright (C) 2012 Werner Schweer and others
walk.qml
jeetee
Copyright (C) 2012-2017 Werner Schweer
MuseScore
Music Composition & Notation
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
These are for the WebEngine WebChannel boilerplate:
msfp
decovar Declaration of VAR
source
GPLv3
text: mscoreMajorVersion > 3 ? qsTranslate("project", "Title") + ":" : qsTranslate("NewWizard", "Title") + ":"
automatic execution of code (such as settings management) when the window is closed.
Demo version 20230227A
Column{ Flow{ Item{} Item{}...}}
(need to set a wrap width)TODO
mainWindow.parent.Window.window.close();
Download: musescore_qmllearning_20230301A.zip
Overview version 20230227A:
View Raw:
import MuseScore 3.0 import QtQuick 2.9 import QtQuick.Controls 2.2 import QtQuick.Layouts 1.2 import QtQuick.Dialogs 1.2 import QtQuick.Window 2.2 MuseScore { menuPath: "Plugins.QMLlearning_Dialog" version: "20230301A" id: pluginscope property real wrapperwidth: 600 // use Screen if you need ratio based ui property bool fixsize:false property int pagemargintb:10; property int pagemarginlr:20 // use Screen if you need ratio based ui property real customwidth: Screen.desktopAvailableWidth*.2 property real customheight: Screen.desktopAvailableHeight*.2 onRun:{ if(fixsize){ plugindialog.width =Math.min(customwidth ,Screen.desktopAvailableWidth) plugindialog.height=Math.min(customheight ,Screen.desktopAvailableWidth) }else{ // plugindialog doesn't auto expand by contentItem : qml bug ? plugindialog.width =Math.min( Math.max(wrapperwidth, plugincontent.width) ,Screen.desktopAvailableWidth) // height is tricky setTimeout.createObject(pluginscope,{ interval:1 ,running:true }).triggered.connect(function(){ plugindialog.height=Math.min( grid.height+plugincontent.header.height+plugincontent.footer.height ,Screen.desktopAvailableHeight) }) } } Component { id: setTimeout ; Timer { } } Dialog { id:plugindialog title: "PluginDialog" visible:true contentItem:Page{ id:plugincontent header: ToolBar { // ToolBar, TabBar, or DialogButtonBox background: Rectangle { color: "skyblue"} RowLayout{ anchors.fill: parent Label{ horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter Layout.fillWidth: true text: "header" color: "navy" } ToolButton { text: 'btn1' onClicked: console.log('btn1') } ToolButton { text: 'btn2' onClicked: { console.log('btn2') } } ToolButton { text: 'btn3' onClicked: function(){ console.log('btn3') } } } } contentItem:Rectangle{ id:pagecontent color: "beige" Flickable{ anchors.fill:parent; contentWidth: grid.width; contentHeight: grid.height GridLayout{ id:grid columns: 1 Column{ id:allcontent Layout.preferredWidth: pagecontent.width-Layout.leftMargin-Layout.rightMargin Layout.leftMargin : pagemarginlr; Layout.rightMargin :pagemarginlr Layout.topMargin : pagemargintb; Layout.bottomMargin :pagemargintb Column{ id:innercontent width: parent.width // // Contents here Rectangle{ color: "red" ;height: 20 ;width:parent.width } Rectangle{ color: "green" ;height: 20 ;width:parent.width /2 } Rectangle{ color: "blue" ;height: 20 ;width:parent.width /2 } Flow{ width: parent.width Rectangle{ color: "cyan" ;height:50 ;width:50 } //dont' assign width with Flow's width, it will cause infinite loop Rectangle{ color: "yellow" ;height:50 ;width:50 } Rectangle{ color: "magenta" ;height:50 ;width:50 } Rectangle{ color: "black" ;height:50 ;width:50 } Rectangle{ color: "cyan" ;height:50 ;width:50 } Rectangle{ color: "yellow" ;height:50 ;width:50 } Rectangle{ color: "magenta" ;height:50 ;width:50 } Rectangle{ color: "black" ;height:50 ;width:50 } Rectangle{ color: "cyan" ;height:20 ;width:20 } Rectangle{ color: "yellow" ;height:20 ;width:20 } Rectangle{ color: "magenta" ;height:20 ;width:20 } Rectangle{ color: "black" ;height:20 ;width:20 } Rectangle{ color: "cyan" ;height:20 ;width:20 } Rectangle{ color: "yellow" ;height:20 ;width:20 } Rectangle{ color: "magenta" ;height:20 ;width:20 } Rectangle{ color: "black" ;height:20 ;width:20 } Rectangle{ color: "purple" height:50; width:parent.parent.width/2 //safe to assign width with id=allcontent's width Text { anchors.fill:parent verticalAlignment: Qt.AlignVCenter text: 'VCenter' } } Rectangle{ color: "pink" height:50; width:parent.parent.width/4 Text { anchors.centerIn:parent text: 'Centered' } } Button { text: 'btnC' onClicked: function(){ console.log('btnC') } } Text { width:parent.parent.width wrapMode: Text.WordWrap text: " Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Arcu cursus euismod quis viverra nibh cras. Vulputate enim nulla aliquet porttitor lacus. Sed cras ornare arcu dui. Dui vivamus arcu felis bibendum. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Amet porttitor eget dolor morbi. Leo a diam sollicitudin tempor id eu. Vitae semper quis lectus nulla at. Quam adipiscing vitae proin sagittis nisl rhoncus. A erat nam at lectus. Pretium vulputate sapien nec sagittis aliquam malesuada. Rhoncus dolor purus non enim praesent elementum facilisis leo vel. Vestibulum sed arcu non odio euismod lacinia at quis risus. Turpis cursus in hac habitasse platea. Ut consequat semper viverra nam libero justo laoreet sit amet.\n Hendrerit gravida rutrum quisque non tellus orci ac auctor. Scelerisque purus semper eget duis at tellus at. Suspendisse potenti nullam ac tortor. Adipiscing elit ut aliquam purus sit amet luctus. Massa sed elementum tempus egestas sed sed risus pretium. Risus quis varius quam quisque id. Ut sem nulla pharetra diam sit amet. Fames ac turpis egestas sed tempus. Elit eget gravida cum sociis. Adipiscing at in tellus integer feugiat. Lectus mauris ultrices eros in cursus turpis. Vel fringilla est ullamcorper eget nulla facilisi. At varius vel pharetra vel. Erat velit scelerisque in dictum non consectetur a. Lorem sed risus ultricies tristique nulla aliquet enim tortor at." } } Rectangle{ color: "red" ;height: 20 ;width:parent.width } Rectangle{ color: "green" ;height: 20 ;width:parent.width /2 } Rectangle{ color: "blue" ;height: 20 ;width:parent.width /2 } } } } } } footer: DialogButtonBox { // ToolBar, TabBar, or DialogButtonBox // ms3 Page footer is not bugged background: Rectangle { color: "darkgrey"} Button { text: 'OK' DialogButtonBox.buttonRole: DialogButtonBox.AcceptRole } Button { text: 'Cancel' DialogButtonBox.buttonRole: DialogButtonBox.RejectRole } onAccepted: { console.log("ok") } onRejected: { console.log("cancel"); plugindialog.visible=false } } } // footer: Item{} // ms3 Dialog bug : Cannot assign to non-existent property "footer" } }
Old versions:
qmllearning_20230227A.qml Add show all content, set fix size, scrollable contentarea
qmllearning_20230226A.qml
qmllearning_20230226B.qml : Add show all content (edit: revert back to A, B does not work in ms4)
qmllearning_20230226C.qml : Add optional set init size (edit: revert back to A, C does not work in ms4)
Same as the above dialog variant but use pluginType: "dock"
pluginscope.height not working
Download: musescore_qmllearning_20230301A.zip
View Raw:
import MuseScore 3.0 import QtQuick 2.9 import QtQuick.Controls 2.2 import QtQuick.Layouts 1.2 import QtQuick.Dialogs 1.2 import QtQuick.Window 2.2 MuseScore { menuPath: "Plugins.QMLlearning_Dockable" version: "20230301A" id: pluginscope pluginType: "dock" property real wrapperwidth: 600 // use Screen if you need ratio based ui property int pagemargintb:10; property int pagemarginlr:20 // use Screen if you need ratio based ui property real customwidth: Screen.desktopAvailableWidth*.2 property real customheight: Screen.desktopAvailableHeight*.2 onRun:{ pluginscope.height=Math.min(customheight ,Screen.desktopAvailableWidth) } Page{ id:plugincontent anchors.fill: parent header: ToolBar { // ToolBar, TabBar, or DialogButtonBox background: Rectangle { color: "skyblue"} RowLayout{ anchors.fill: parent Label{ horizontalAlignment: Qt.AlignHCenter verticalAlignment: Qt.AlignVCenter Layout.fillWidth: true text: "header" color: "navy" } ToolButton { text: 'btn1' onClicked: console.log('btn1') } ToolButton { text: 'btn2' onClicked: { console.log('btn2') } } ToolButton { text: 'btn3' onClicked: function(){ console.log('btn3') } } } } contentItem:Rectangle{ id:pagecontent color: "beige" Flickable{ anchors.fill:parent; contentWidth: grid.width; contentHeight: grid.height GridLayout{ id:grid columns: 1 Column{ id:allcontent Layout.preferredWidth: pagecontent.width-Layout.leftMargin-Layout.rightMargin Layout.leftMargin : pagemarginlr; Layout.rightMargin :pagemarginlr Layout.topMargin : pagemargintb; Layout.bottomMargin :pagemargintb Column{ id:innercontent width: parent.width // // Contents here Rectangle{ color: "red" ;height: 20 ;width:parent.width } Rectangle{ color: "green" ;height: 20 ;width:parent.width /2 } Rectangle{ color: "blue" ;height: 20 ;width:parent.width /2 } Flow{ width: parent.width Rectangle{ color: "cyan" ;height:50 ;width:50 } //dont' assign width with Flow's width, it will cause infinite loop Rectangle{ color: "yellow" ;height:50 ;width:50 } Rectangle{ color: "magenta" ;height:50 ;width:50 } Rectangle{ color: "black" ;height:50 ;width:50 } Rectangle{ color: "cyan" ;height:50 ;width:50 } Rectangle{ color: "yellow" ;height:50 ;width:50 } Rectangle{ color: "magenta" ;height:50 ;width:50 } Rectangle{ color: "black" ;height:50 ;width:50 } Rectangle{ color: "cyan" ;height:20 ;width:20 } Rectangle{ color: "yellow" ;height:20 ;width:20 } Rectangle{ color: "magenta" ;height:20 ;width:20 } Rectangle{ color: "black" ;height:20 ;width:20 } Rectangle{ color: "cyan" ;height:20 ;width:20 } Rectangle{ color: "yellow" ;height:20 ;width:20 } Rectangle{ color: "magenta" ;height:20 ;width:20 } Rectangle{ color: "black" ;height:20 ;width:20 } Rectangle{ color: "purple" height:50; width:parent.parent.width/2 //safe to assign width with id=allcontent's width Text { anchors.fill:parent verticalAlignment: Qt.AlignVCenter text: 'VCenter' } } Rectangle{ color: "pink" height:50; width:parent.parent.width/4 Text { anchors.centerIn:parent text: 'Centered' } } Button { text: 'btnC' onClicked: function(){ console.log('btnC') } } Text { width:parent.parent.width wrapMode: Text.WordWrap text: " Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Arcu cursus euismod quis viverra nibh cras. Vulputate enim nulla aliquet porttitor lacus. Sed cras ornare arcu dui. Dui vivamus arcu felis bibendum. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Amet porttitor eget dolor morbi. Leo a diam sollicitudin tempor id eu. Vitae semper quis lectus nulla at. Quam adipiscing vitae proin sagittis nisl rhoncus. A erat nam at lectus. Pretium vulputate sapien nec sagittis aliquam malesuada. Rhoncus dolor purus non enim praesent elementum facilisis leo vel. Vestibulum sed arcu non odio euismod lacinia at quis risus. Turpis cursus in hac habitasse platea. Ut consequat semper viverra nam libero justo laoreet sit amet.\n Hendrerit gravida rutrum quisque non tellus orci ac auctor. Scelerisque purus semper eget duis at tellus at. Suspendisse potenti nullam ac tortor. Adipiscing elit ut aliquam purus sit amet luctus. Massa sed elementum tempus egestas sed sed risus pretium. Risus quis varius quam quisque id. Ut sem nulla pharetra diam sit amet. Fames ac turpis egestas sed tempus. Elit eget gravida cum sociis. Adipiscing at in tellus integer feugiat. Lectus mauris ultrices eros in cursus turpis. Vel fringilla est ullamcorper eget nulla facilisi. At varius vel pharetra vel. Erat velit scelerisque in dictum non consectetur a. Lorem sed risus ultricies tristique nulla aliquet enim tortor at." } } Rectangle{ color: "red" ;height: 20 ;width:parent.width } Rectangle{ color: "green" ;height: 20 ;width:parent.width /2 } Rectangle{ color: "blue" ;height: 20 ;width:parent.width /2 } } } } } } footer: DialogButtonBox { // ToolBar, TabBar, or DialogButtonBox // ms3 Page footer is not bugged background: Rectangle { color: "darkgrey"} Button { text: 'OK' DialogButtonBox.buttonRole: DialogButtonBox.AcceptRole } Button { text: 'Cancel' DialogButtonBox.buttonRole: DialogButtonBox.RejectRole } onAccepted: { console.log("ok") } onRejected: { console.log("cancel") } } } }
WebEngineView { onContextMenuRequested: request.accepted = true //add codes here for DIY menu }
DOM bubbling exist unexpectedly in these events, also event.target==currenttarget unexpectedly in bubbling
It seems WebEngineView always simulate a pen tip drag when mouse movement happens, ie the mouse is always pressed in the following event ( mouseevent.button==0 )
To drag move an overflowed component, also try wrapping it inside a Flickable { }. If you need to set disable mouse in Flickable later , set interactive:false
Button emits the signal clicked() canceled(), doubleClicked(), pressed(), released() and pressAndHold(), ref
For more control
.pressed .pressedButtons
properties of MouseAreamouse.button
of MouseEvent inside some listeners function (not all has MouseEvent) eg onPressed:{ if(mouse.button==ENUM) } preventdefault , event.stopPropagation(), return false
in javascript:
Keys enum list
QML .focus:true may not mean what you think. see Item.focus and read up on FocusScope { }
Quick compare .focus, .activeFocus, forceActiveFocus(), FocusScope { }, see this stackoverflow
example snippet
I have needed to add fingering text to individual notes. For me this is because when I reformat/resize the staff "Staff Text" doesn't stay associated to, and aligned with, the specific notes I need the text to be next to. But fingering text is specifically associated to individual notes and so, when reformatting a staff, that text does tend to stay in alignment with the notes.
Because fingering text elements are child elements of individual notes, adding them is a bit different than adding Staff Text, or other elements that you just add at the current cursor location.
You add fingering as a new element that you add to a specific note object. It is quite simple, as long as you can obtain the desired note object in your code. Below is the procedure:
//Assume user has selected a single note in the score var oNote = curScore.selection.elements[0]; var finger = newElement(Element.FINGERING); finger.text = "FG"; finger.color = "#aa0000"; curScore.selection.elements[0].add(finger); //Here's an odd thing - you have to set the x,y offset //properties **after** you have added the fingering object //to the note. If you set them prior to adding, like I did //for the color above, they don't seem to have any effect. //I personally cannot explain this difference in behavior. finger.offsetX = 2.00; finger.offsetY = -0.44;
When you run the above code on a score where you have selected a single note you will see the (red) text 'FG' appear next to the note.
For a complete plugin example, and a test score to use with it, see:
Add fingering text plugin
Score: Test - Add Fingering Text
What follows are my own learnings while coding a plugin that transforms an existing TAB staff to the TAB numbering convention used by Mountain Dulcimer players. This convention is semi-diatonic, meaning that the fret numbering is not chromatically sequential. For example, chromatically fret #2 would be two half-steps above the open string tuning. On a Mountain Dulcimer fret #2 is 4 half-steps above the open tuning. So to transform the chormatic TAB to Mtn Dulcimer TAB I walk the TAB staff and reduce the pitch of each note so that Musescore, internally, assigns the note to the corresponding Mtn Dulcimer fret number.
One might think that there are only 2-degrees of freedom in assigning a fret# - that is, given a pitch and a string there can be only one possible fret# that can be assigned. However, it turns out that you must specify all of the following parameters to successfully change the displayed note. Further - if you do specify all the parameters except for the .tpc1 and .tpc2 values then upon your plugin's completion the modified score may look fine; however, after saving the score and reopening it you will likely find that the changes your plugin made were not saved (the reopened score will show a mix of reverted notes along with random errors). So you must set each of the below parameters:
note.pitch note.fret note.string note.tpc1 note.tpc2
In your code define a two-dimensional array that contains Musescore's tpc mapping. The 2D array is set up as rows, which represents each note's pitch-class, i.e., C, C#, D, D#, E, F, F#, G, G#, A, A#, B, B#. Then each row has three columns which represent each of the three possible variations on how a given note could be represented. E.g., a C could be represented as a B# (tpc value 26), a C (tpc value 14), or a Dbb (tpc value 2). Note that there is a null value in the middle column of pitch class 8, where G# and Ab are the same note; but in this one case there is no 3rd alternative representation. In your array fill this entry with the value ‘NaN.’ See: Tonal Pitch Class Mapping.
Given a TAB note to convert, step-1 is to find which row of your tpc mapping array the existing note’s tpc value matches up to. In my plugin code this is done via brute force, using two nested for loops to search row/column-wise through the tpc array for a value that matches the existing note’s note.tpc value.
You are going to change the note's pitch by some number of steps from the original pitch. Call this amount the "offset" amount. So in my example I want existing fret# 2 to become fret# 1, so I will reduce the note's pitch by 1. So my offset is 1.
Given the tpc array row number, the offset value is then used to move backwards in the tpc array that many rows. To do this you have to think of the array as a closed circle. So when falling off the array into negative index values you have to force a loop-back to the bottom of the array. Likewise, when falling off the end of the array into index values greater than the length of the array you have to loop-back to the start of the array. When you have performed this operation you now have the new pitch class (i.e., the row index) that matches up to your new MIDI pitch value for the note.
Now that you have the offset row you can determine which column is appropriate for your re-pitched note. In my case, for TAB notes, I simply use the original tpc array column since, for TAB, we aren’t actually making any use of the tpc pitch-spelling so we don’t have to worry about that. EXCEPT for one condition - that ‘NA’ condition for G#. We could be moving back to the G#/Ab row, and be set on column 1, which is ‘NA’ - invalid. So we have to sense for this, and if detected, just set the tpc to the G# (that is, value 22).
Finally, the .tpc value you get could represents either the note you want to see on your score ore the note you want to hear when playing. For non transposing instruments, both notes are the same. For transposing instruments those notes are different. E.g. for a saxophone, an "C" on the staff actually sounds as "Bb". This is the difference between "Score pitch" and "Concert pitch". Those are represented at the note level by .tpc1 and .tpc2.
And you will have to push your .tpc value either to .tpc1 or .tpc2, depending on whether your pitch is the heard pitch or displayed pitch. And then adapt the other .tpc1|2 value accordingly.
At this stage, one must observe that the .tpc you computed is based on a pitch. So that .tpc is actually representing the heard pitch, i.e. the "Concert pitch". If your intention was to have the displayed pitch, that pitch will have to be corrected before being pushed to the note (see below).
So 2 cases:
You can push .tpc to both note.tpc1 and note.tpc2, and your pitch to note.pitch
note.pitch=pitch;
note.tpc1=tpc;
note.tpc2=tpc;
var dtpc = note.tpc2 - note.tpc1;
note.pitch=pitch;
note.tpc1=tpc;
note.tpc2=tpc+dtpc;
If your pitch is the Score Pitch:
var dpitch=deltaTpcToPitch(note.tpc1, note.tpc2) ; // as the the "note.pitch" is the concert pitch, your pitch (which the score pitch) must be adapted.
note.pitch=pitch+dpitch;
note.tpc1=tpc-dtpc;
note.tpc2=tpc;
// compute the transposition of an instrument based on its .tpc1 and .tpc2
function deltaTpcToPitch(tpc1, tpc2) {
var d = ((tpc2 - tpc1) * 5) % 12;
if (d < 0)
d += 12;
return d;
}
MtnDulcimer-TransCromoTABtoDiatonic_ver0.3.qml
I have found it helpful to be able to click on some item in a score and examine all of it's properties. For example, what are the available properties, and their actual values, for that rest in measure 2? Or what can my plugin obtain from the time signature element?, etc. So I created a plugin that let's me see the key -> value pairs for any element I have selected on a score.
Make sure you run the plugin from Musescore's 'Plugin Creator...' as the results are provided using console.log
statements.
With the plugin loaded into the plugin creator's window, single-click on any item in the score (you can actually use the ctrl key to select several items at once if you wish).
From the plugin creator, run the plugin. You will get a list of all the available properties, and their current values, for each of the selected items. Note that this plugin is not crawling embedded objects. So, for example, on a note element you'd see the staff property, and it will look something like this: 'staff : Ms::PluginAPI::Staff(0xab55410)'. That is telling you that in your code you would be able to access that object and it's properties and methods. Of course, you should also be able to see this from the formal Doxygen Documentation as well.
Obtain plugin from Musescore-Plugin-Docs
There is also a version that will crawl up the examined object's parent tree: REFcode_ExamineElement-andParents.qml
Here is the plugin's code:
//============================================================================= // MuseScore Plugin // // This plugin will list to the console window the key -> value pairs for // individual items (elements) selected on a score. E.g., open a score, // select an individual note, then run this plugin from the Plugin Creator // window to see that note's properties list in the console output. // // IF you intend to examine more than a few elements at once you might want // to modify this to have it write the results out to a text file rather // than the console window. // // I use this to examine what properties are available to my plugin for a // given element (e.g., what can I learn about a 'note,' or a // 'time signature')? // //============================================================================= //------------------------------------------------------------------------------ // 1.0: 04/24/2021 | First created //------------------------------------------------------------------------------ // Am assuming QtQuick version 5.9 for Musescore 3.x plugins. import QtQuick 2.0 import QtQuick.Dialogs 1.1 import MuseScore 3.0 MuseScore { version: "1.0" description: "Examine an Element" menuPath: "Plugins.DEV.Examine an Element" function showObject(mscoreElement) { // PURPOSE: Lists all key -> value pairs of the passed in //element to the console. // NOTE: To reduce clutter I am filtering out any //'undefined' properties. (The MuseScore 'element' object //is very flat - it will show many, many properties for any //given element type; but for any given element many, if not //most, of these properties will return 'undefined' as they //are not all valid for all element types. If you want to see //this comment out the filter.) if (Object.keys(mscoreElement).length >0) { Object.keys(mscoreElement) .filter(function(key) { return mscoreElement[key] != null; }) .forEach(function eachKey(key) { console.log("---- ---- ", key, " : <", mscoreElement[key], ">"); }); } } //==== PLUGIN RUN-TIME ENTRY POINT ============================================= onRun: { console.log("********** RUNNING **********\n"); var oCursor = curScore.newCursor() //Make sure something is selected. if (curScore.selection.elements.length==0) { console.log("**** NOTHING SELECTED"); console.log("**** Select an element on the score and try again"); console.log("****"); } //We have a selection, now explode it... else { var oElementsList = curScore.selection.elements; console.log(""); console.log("---- | Number of Selected Elements to Examine: [", oElementsList.length, "]"); console.log(""); for (var i=0; i<oElementsList.length; i++) { console.log("------------------------------------------------------------------------"); console.log("---- Element# [", i, "] is a || ", oElementsList[i].name, " ||"); console.log(""); showObject(oElementsList[i]); console.log("\n"); console.log("---- END Element# [", i, "]"); console.log("------------------------------------------------------------------------"); console.log(""); } } console.log("********** QUITTING **********\n"); Qt.quit(); } //END OnRun } // END Musescore
This section allows any musescore.org user to provide notes on top of the official API documentation, feel free to add your learnings. GitHub account or Doxygen knowledge are not required.
Working:
creation example snippet
See Time Signature Enforcer for a plugin that uses the cmd
interface to manipulate the timesigActual
of a measure.
Seems not working:
the setFraction() function, cannot set measure's "timesigNominal","timesigActual","timesig","timesigGlobal","timesigStretch"
import MuseScore 3.0 import QtQuick 2.9 MuseScore { menuPath: "Plugins.debug" onRun: { var c=curScore.newCursor() c.inputStateMode=Cursor.INPUT_STATE_SYNC_WITH_SCORE ;["timesigNominal" ,"timesigActual" ,"timesig" ,"timesigGlobal" ,"timesigStretch" ].map(function _(n){ console.log('___'+n) var p=c.measure[n] //eg c.measure.timesigNominal for (var x in p) console.log(x,": ",p[x]) curScore.startCmd() c.measure[n].setFraction( fraction(2,2) ) curScore.endCmd() for (var x in p) console.log(x,": ",p[x]) }) }
Changing an existing barline's .barlineType
will work as expected, except START_REPEAT
Applying START_REPEAT changes the next barline instead, see parkingb's comment. The reason: to allow changing END_REPEAT , see source code, workaround: apply START_REPEAT to the previous barline will change current barline.
Enum not exposed, workaround see jeetee's comment
This section contains additional information related to the Cursor object.
In addition to what is described in the Doxygen documentation, please note the following:
Each call to cursor.addNote()
or cursor.addRest()
advances the cursor, by the amount set by cursor.setDuration()
, except when the cursor is already at the final beat of the last measure in the score. CAUTION: They do not return falsy value, using cursor advancement logic as loop conditional statement may leads to infinite loop error.
(Assumption: my guess is that this behaviour occurs because the plugin API is using the underlying C++ code that implements the user-interface for adding notes; and in the context of a human at the keyboard this makes perfect sense. In that case there is no longer any room left for the cursor to advance to. This would generally be true inside a plugin as well; however, if you are walking a staff in a plugin, adding notes, you'd be doing that inside a while-loop and testing for the end of the staff. In this situation failure to trap the final note's non-cursor-advancement may cause an infinite-loop condition.)
Working:
cursor.keySignature, see snippet
Seems not working:
* curScore.keysig only returns the first key signature at first measure of first staff
* the functions to get key signature info from a KeySig segment are currently not working
* creation of new KEYSIG element contains bug
Horn in F | parts[0] | .longName |
+Horn in F | p.instruments[0] | .longName |
++open | p.i.channel[0] | .name, .mute, .volume etc |
++mute | p.i.channel[1] | |
Piano | parts[1] | |
+Piano | p.instruments[0] | |
++normal | p.i.channel[0] | |
Violin | parts[2] | |
+Violin | p.instruments[0] | |
++Vln. arco | p.i.channel[0] | |
++Vln. pizzicato | p.i.channel[1] | |
++Vln. tremolo | p.i.channel[2] |
element(eg Note/Chord/Segment) .staff.part
curScore.parts
score.excerpts[].parts see this post
To mute an instrument without affecting others, use the instrument.channel.mute
TLDR
Musescore 3 use one IAC port in MIDI Output. Not to be confused with the Port in Mixer, that Port works internally. See this post
part.midichannel refers to one of 16 MIDI Output channels, these channels are not exclusive to one sound patch, different MIDI patches may be used in same channel using MIDI BANK SELECT internally when using >16 sounds. if you know src plz add link
instrument.channel refers to internal channel and one sound, same as defined in instruments.xml, eg buildin violin has 3 channels: arco, pizz, tremolo.
if you know how to set longName or why disabled plz add
This section contains additional information related to the Note object.
In addition to what is described in the Doxygen documentation, please note the following:
The Tonal Pitch Class (tpc) parameters of the Note object are used to specify which of the possible enharmonic note spelling variations to display in the score. Based on context, a given note's pitch class may be shown in two or three different ways. For example, a C-natural could be shown, enharmonically, as a B#. To specify which note spelling to use the note object makes use of the three parameters: tpc, tpc1 and tpc2. These parameters store an integer value that maps to a note spelling. See reference below for the mapping table. For example, if middle-C is to be shown as a B# it's Note.pitch value would be 60, and the tpc value would be 26.
I honestly don't have the expertise to be able to answer this with complete confidence. It would appear that tpc1 ('concert pitch') and tpc2 ('transposing pitch') are used to specify potentially different values for different display/print contexts. If the score property 'Display in concert pitch' is checked, then tpc1 is used. Otherwise tpc2 is used. As to tpc (unnumbered) I would guess that it gets dynamically updated internally by Musescore as the Display in concert pitch option is turned on/off so that it represents the current context tpc to use at the moment. However, the formal plugin documentation says this parameter is writable, which makes no sense to me if my guess about this is correct.
One reason, obviously, is that you may need to obtain the intended note spelling within your plugin.
Another, perhaps more important, reason is that if you are modifying note pitches in a score you must also set values for tpc1 and tpc2. If you fail to set those values the modified score may look fine upon plugin completion. However, after saving the score and reopening it you will likely find that the note pitch changes your plugin made were not saved (the reopened score will show a mix of reverted notes along with random errors). Also note that if you are changing a note's pitch on a TAB staff you must set all of .ptich, .string, .fret, .tpc1, and .tpc2. From my experience it appears that you do not need to explicitly set the (unumbered) .tpc value.
Use Case: Changing an Existing Note's Pitch
More Good Info & Example Plugin
This section contains additional information related to the Score object.
In addition to what is described in the Doxygen documentation, please note the following:
In some cases you need to wrap your score modifications with calls to score.startCmd() and score.endCmd(). As explained in a reply to the below referenced forum post: "If you don't, then the Plugin API is not obliged to fully process that command before continuing onwards. So whenever you need to rely on the result of a score-changing action to start a different kind of action (or ask information about the result) make sure to wrap said action(s) between a start/endCmd call." One example of when you need to do this is when you call score.appendMeasures() - per the below referenced post.
Almost all of the needed changes can also be made automatically with this converter script (Python is needed to run it).
A detailed set of porting instructions can be found at html/plugin2to3.html
This chapter is for MuseScore 4 plugin developers. To fork the main program, visit the main sections in Developers' handbook.
For info on what plugins are, how to install and use them, visit Musescore 4 handbook plugin chapter.
Plugin system change coming up in 4.x, see github issue and graffesmusic's comment .
Some plugins have been ported to or created for Mu4:
Some plugins have been ported to or created for Mu4.4 (Qt6):
rob@birdwellmusic.com
https://musescore.org/en/node/367573Volatile: prone to become outdated as the plugin API changes
Last updated: 31st Aug 2024
Have your plugin and all its dependencies (if any) in its own subfolder (example)
In the plugin file itself, add the new MuseScore 4 Properties conditionally, for MuseScore 4.0-4.3 and these comments, for MuseScore 4.4, like this, to have the plugin work for MuseScore 3.x, 4.0-4.3 and 4.4:
//4.4 title: "Some Title" //4.4 thumbnailName: "some_thumbnail.png" //4.4 categoryCode: "some_category" Component.onCompleted: { if (mscoreMajorVersion >= 4 && mscoreMinorVersion <= 3) { title: "Some Title"; thumbnailName = "some_thumbnail.png"; categoryCode = "some_category"; } }
If you need it for MuseScore 4 only, use:
title: "Some Title" thumbnailName: "some_thumbnail.png" categoryCode: "some_category"
title
is displayed in the Plugin Manager window (Home/Plugins), and makes the plugin easy to find.thumbnailName
is the file path to any Plugin logo, also displayed in the Plugin Manager.categoryCode
assigns the plugin to a specific sub-menu in the plugins tab (Currently available are: "composing-arranging-tools", "color-notes", "playback" and "lyrics").Place your translations files (if any) in a "translations" folder placed the plugin subfolder.
Remove all occurences of Qt.quit()
, else the plugin will crash MuseScore 4!
Qt.quit()
with quit()
.(typeof(quit) === 'undefined' ? Qt.quit : quit)()
return
, which should work in all MuseScore versions.The APIs readScore()
and writeScore()
are not functional in Mu4 (yet).
If your plugin modifies a score, those modifications need to be enclosed by
curScore.startCmd(); ... curScore.endCmd();
This should be done for Mu3 too, but there is optional, for Mu4 it is mandatory though.
pluginType: "dock"
is not working. Changing it to pluginType: "dialog"
might work. Even using the methods from step 2 should work, only for Mu4, while keeping "dock" for Mu3
The filePath
property isn't working. You could use Qt.resolvedUrl(".").replace("file://", "")
instead.
Many of the enums have elements relocated, most notably Sid
(style settings, the new Mu4 settings aren't yet exposed), SymId
(there are new symbols, and old ones have different locations) and chordRest.beamMode
(values have new locations)
The first call to SymID can take upto 5 seconds!! (some compilation going on?)
see: https://musescore.org/en/node/364096?page=1#comment-1247486
TextField component from QtQuick.Controls 1.0, must be replaced with the TextEdit component from QtQuick.Controls 2.15 (or from QtQuick.Controls 2.2 if you require compatibility with MuseScore 3). See github issue #19326 for details, source https://musescore.org/en/node/357135
In MU4.4, Qt.labs.settings
has been integrated in the Musescore module. The explicit import Qt.labs.settings 1.0
must be removed (it leads to an "Module "Qt.labs.settings" is not installed" error) and is not required for the Settings module to work.
REMARKS:
See and maintain the post at MuseScore 3 features not (yet) implemented in MuseScore 4. The following is a short summary (ms4.2) that may be outdated:
This page offers Musescore 3 playback related info, instructions on how to use your own sound files inside Musescore, and instruments.xml syntax and definitions. Requires basic understanding of soundfonts
To setup a new soundfont in Musescore, visit SoundFonts and SFZ files
To setup instruments in a score, eg add a new violin staff, visit Change Instrument Setup
A collection of ready to use new soundfonts for download
SoundFonts forum on musescore.org
Also try the tutorials by Freepats project on its github wiki
Benefit of SF2/SF3 over SFZ : one SF2/SF3 can contain multiple sounds, which makes setting up in MuseScore synthesizer and sharing with other musicians way easier. Convert between SFZ and SF2/SF3 in Polyphone.
Dynamics symbol => MIDI velocity conversion is hardcoded in Musescore. You can also edit any Dynamics Velocity property inside Musescore. Note that this kind of conversion is a matter of program coders' preference ref1 ref2
MIDI velocity => sound level converion is defined in soundfont file: the default soundfont is edited with the following dB level aim in mind approximately based on this doc calculated as L(dB) = 40 log (MIDIVelocity/127).
For soundfont creators wishing to match with default sound level, it'd be wise to export samples instead of monitoring musescore audio output. Musescore 3.6.2 by default adds a 10% headroom to instrument, so that it's 90% volume of sound sample at the default 100/127 in the Mixer. Full volume sound sample would be ~111/127 in Mixer.
MIDI velocity is a parameter on the synthesizer, relating to soundfont. musescore Mixer value is final post process output volume. The max 127 in Mixer is an arbitrary number, it is not related to MIDI velocity.
this table may not be displayed properly in mobile browsers
Velocity | full volume sample dB | Musescore 3 Dynamics |
---|---|---|
127 | 0.0dB | ffff, fffff, ffffff |
126 | fff | |
112 | -2,2dB | ff |
96 | - 4.8dB | f |
80 | - 8.0dB | mf |
64 | -11.9dB | mp |
48 | -16,9dB | p |
32 | -23.9dB | pp |
16 | -36.0dB | ppp |
10 | pppp | |
8 | -48,0dB | |
5 | ppppp | |
4 | -60,0dB | |
2 | -72,1dB | |
1 | -84.15dB | pppppp |
0 | -Infinity |
What users can do in a score with soundfont and instrument definition in instruments.xml:
What users can do with soundfont alone:
Changing settings inside Musescore will not update instruments.xml automatically.
An instrument (jump to xml) in Musescore is a concept including the following:
it provides a easy way to mix and reuse sound and notation setup. Instruments are defined in instruments.xml
Not to be confused with MIDI Output Port and Channel.
Channel (jump to xml) is a concept that represent one specific type of sound produced by a single instrument, alike the articulation/sound sample concept in commercial libraries.
To simulate different articulation or playing technique of same instrument, you must use a multi-channel instrument. You can only add and remove channel under an instrument by creating a custom instruments.xml, you cannot add or remove channel inside Musescore. Multiple channels of the same instrument can be seen in a folder like manner in the Mixer. eg expand a default violin to see 3 channels: arco, tremolo and pizzicato.
Total number of channel is unlimited, it is unrelated to number of voices. Each staff (that can contain a clef symbol) has four voices, like a four tracks group concept in DAW. You can assign channel to each voice separately.
Not to be confused with 'Change Instrument' Text, or other actions, jump to understanding instrument concept for more info
If your instrument has multiple channels, you can simulate change of performance articulation or playing technique, such as switching between detache and legato for different note:
If you xml has the instrument with Channel name="pizzicato", you'll see inside Musescore:
Staff text: staff does not means one staff on a score paper in real world sense, it represents the whole instrument. ie. piano have two staffs, Staff text affect the whole piano.
Musescore use MIDI Bank number in a way that seems different from other app and mainstream MIDI keyboards. TIPS: Use an editor that show Bank number directly.
Two types of sound any instrument channel can point to:
Pitched
<channel>
points to the correct sound.Default soundfont's Bank 0 Preset 0 = Piano normal
Default soundfont's Bank 0 Preset 12 = Marimba normal
Default soundfont's Bank 0 Preset 24 = Guitar open
Default soundfont's Bank 0 Preset 41 = Violin arco non expressive (no response to CC)
Default soundfont's Bank 17 Preset 41 = Violin arco expressive (response to CC 2)
Unpitched
<drumset>1</drumset>
is equal to Ticking the Drumset checkbox in Mixer<Drum pitch=n>
defines the sound sample to be represented by that pitch/note, its staff appearance eg position on staff, notehead etc, and its input keyboard shortcut.<channel>
points to the correct sound and <drumset>1</drumset>
.Default soundfont's Bank128 Preset 0 = Standard Kit
Default soundfont's Bank128 Preset 16 = Power Kit
Default soundfont's Bank128 Preset 48 = Orchestra Kit
Pitch 36=Bass Drum 1
Pitch 38=Acoustic Snare
Single Note Dynamics (SND) has several different meanings
Musescore's 'Single Note Dynamics' audio creation mechanism provides:
It depends on:
Understand SND first.
Attenuation response to MIDI velocity and MIDI CC in sounds is a matter of preference of soundfont creators.
Musescore default soundfont has sounds that response to CC 2, devs call them expressive sounds.
Musescore synthesizer is set to communicate in CC 2 by default, it is a global setting.
To allow users to use SND features to compose scores that contains sounds from both default soundfont and custom soundfont, you should make your SF2/SF3 response to CC 2:
Edit Instrument modulator and/or Preset modulator:
study the polyphone screenshot example below, more info visit Polyphone manual, also open and study the modulator in default MuseScore_General.sf3 soundfont.
In Polyphone's param table, the attenuation use dB values, the meaningful range for 24bit sample is 0 to 144; 16bit: 0to 96; 8bit: 0 to 48 etc, see thread on polyphone forum. The attenuation modulators however use centibel, a 1200 cents based unit, see spec
Setup Musescore synthesizer to allow SND feature with soundfont that has no MIDI CC response How to setup Musescore 3.x for correct playback for all dynamics and hairpins (not tested yet, please add info)
Change sound sample by using Staff Text, Musescore is shipped with 5 default: pizz., arco, tremolo, mute, open
They affect playback by sending instructions, which can be viewed by opening any saved .mscx file or exported palette item in plaintext, the name properties refers to an instrument's channel name (jump to xml):
<StaffText> <channelSwitch voice="0" name="pizzicato"/> <channelSwitch voice="1" name="pizzicato"/> <channelSwitch voice="2" name="pizzicato"/> <channelSwitch voice="3" name="pizzicato"/> <text>pizz.</text> </StaffText> <StaffText> <channelSwitch voice="0" name="arco"/> <channelSwitch voice="1" name="arco"/> <channelSwitch voice="2" name="arco"/> <channelSwitch voice="3" name="arco"/> <text>arco</text> </StaffText> <StaffText> <channelSwitch voice="0" name="tremolo"/> <channelSwitch voice="1" name="tremolo"/> <channelSwitch voice="2" name="tremolo"/> <channelSwitch voice="3" name="tremolo"/> <style>Expression</style> <text>tremolo</text> </StaffText> <StaffText> <channelSwitch voice="0" name="mute"/> <channelSwitch voice="1" name="mute"/> <channelSwitch voice="2" name="mute"/> <channelSwitch voice="3" name="mute"/> <text>mute</text> </StaffText> <StaffText> <channelSwitch voice="0" name="open"/> <channelSwitch voice="1" name="open"/> <channelSwitch voice="2" name="open"/> <channelSwitch voice="3" name="open"/> <text>open</text> </StaffText>
For example, to switch to Bank 6 Preset 41 sound upon default pizz. text:
<Channel name="customchannel"> ... </Channel> <Channel name="pizzicato"> <controller ctrl="0" value="1"/><!-- soundfont order - 1 --> <controller ctrl="32" value="7"/><!-- soundfont order - 1 + bank number --> <program value="41"/><!-- preset number--> </Channel> <Channel name="customchannel2"> ... </Channel>
If you want alternative soundfont ordering in Synthesizer, you need to modify the value properties accordingly, jump to polyphone demo to learn more.
You can also create custom staff text save as custom palette item, palette items can be exported and imported.
There are two types of sound an instrument channel can point to, see Musescore's usage of MIDI Bank and Preset number
Modifying instruments.xml will not update score automatically, you must restart musescore, then add the updated version of instrument as new staff, or update a existing staff.
Windows: C:\Program Files\MuseScore 3\instruments
Copy and paste method:
Instrument's notation setting edited and sound assigned in Mixer inside Musescore are not automatically save back to instruments.xml, but they are saved in the score file. Open it as plaintext to copy and paste to create your custom instruments.xml.
How-to:
Important:
Do not
as these may affect what sound your instruments.xml point to. Instead, add new soundfonts by putting them after existing ones.
Element names are case sensitive.
The museScore element is the container for all of the definitions for all of the instruments.
museScore element - Genre (optional, multiple)
museScore element - Articulation (optional, multiple)
museScore element - InstrumentGroup (optional, multiple)
Genre attribute - id (required)
The id should be unique. Each instrument element defines the Genre or Genres in which the instrument is used.
Genre element - name (required)
Text of item inside dropdown selection menu in instrument setup eg Common.
As in notation, not referring to sound samples.
An articulation modifies the velocity (loudness) and or gateTime (length) of a note.
<Articulation name="marcatoStaccato"> <velocity>120</velocity> <gateTime>50</gateTime> </Articulation>
Articulation attribute - name (required)
The name of the Articulation (e.g. staccato). Articulations defined for an Instrument take precedence over Articulations defined in the museScore element for all Instruments*.
The name should correspond to an entry in the articulations palette:
staccato, staccatissimo, portato, tenuto, marcato, sforzato (the accent symbol, not the "sfz" dynamics symbol), sforzatoStaccato, marcatoStaccato, marcatoTenuto
Articulation element - velocity (optional)
The content is the velocity (loudness) multiplier in percent: 100% leaves the velocity unchanged. The % is optional.
Articulation element - gateTime (optional)
The content is the gate time (note length) multiplier in percent: 100% leaves the note length unchanged. The % is optional.
Articulation element - descr (inactive)
Currently not used. The description may be helpful for people editing the instruments.xml file in the future.
Defines a type of instrument, e.g, Woodwinds, Brass, etc. An Instrument can only be defined in one InstrumentGroup, but it can be included in several InstrumentGroups by cross referencing using the ref element.
<InstrumentGroup id="woodwinds"> <name>Woodwinds</name> <Instrument id="flute"> .... </Instrument> .... </InstrumentGroup>
InstrumentGroup attribute - id (required)
The InstrumentGroup id need not be unique within the instruments.xml files. If the id has already been used, then a new InstrumentGroup is not created but the Instruments defined in this element will be added to the previously defined InstrumentGroup.
InstrumentGroup element - name (required)
Text of collapsable in instrument setup eg Percussion - Pitched.
InstrumentGroup element - ref (optional, multiple)
As of MuseScore 3.6.2, referencing and re-using / re-positioning of instrument is not working.
The content is the id of an Instrument previously defined. The Instrument will be added to this InstrumentGroup and will appear in both groups. ref can be used in an InstrumentGroup in the instruments.xml file 2 to refer to an instrument in file 1.
InstrumentGroup element - Instrument (optional, multiple)
Understanding the instrument concept in Musescore
MuseScore offers three types of notation (with many variants): standard vocal and instrumental staves, tablatures and unpitched percussion staves. MuseScore interprets two types of sound in soundfont file.
Instrument attribute - id (required)
The Instrument id must be unique. It is not only used internally but also for identifying the Instrument for the init element in another Instrument and for the ref element in another InstrumentGroup.
As of MuseScore 3.6.2, referencing and re-using / re-positioning of instrument is not working.
Instrument element - init (optional)
The content is the id of an Instrument previously defined. init copies most elements from the referenced Instrument into this Instrument.
New elements can be added to the instrument and most existing elements can be redefined.
init does not copy the genres: these should be redefined.
Redefining staves, bracket, bracketSpans and barlineSpans can have unfortunate effects.
Instrument element - longName (1 or more)
Instrument element - shortName (1 or more)
Used to define staff labels.
longName / shortName attribute - pos (optional)
Where where an Instrument has multiple staves pos is used to position the label. The value is 1 for the first staff, 2 between staff 1 and staff 2 etc. Even numbers are always between staves.
The content is the label identifying the staves on the score. Usually there is only one longName and one shortName. The longName is used on the first system in the score and the shortName for all other systems. The longName is also used to display the Instrument in the instrument list if the trackName is not defined.
Instrument element - trackName (optional)
The content is the trackName used to display the Instrument in the instrument list and as the part name. If trackName is not defined, the first longName is used.
Instrument element - description (inactive)
Currently not used. The description may be helpful for people editing the instruments.xml file in the future. It should describe the instruments and give helpful information that cannot be found in the other elements.
Instrument element - genre (optional, multiple)
The content is a Genre id defined in the main museScore element. One or more genre (small letter g) elements are used to assign the Instrument to Genres. If an Instrument doesn’t have any genre elements, it will only appear in the Instrument list if the “All instruments” category is selected.
Instrument element - musicXMLid (optional)
The content is the MusicXML sound id for this Instrument. Not yet implemented, but MuseScore will use this id to import and export MusicXML files with the MusicXML id.
Instrument element - staves (optional)
The content is the number of staves for this Instrument, defaults to one.
Instrument element - bracket (optional - only for multiple staves)
The content is the type of bracket to use for joining staves. The value should be 0 for a normal bracket, 1 for a grand staff brace, 2 for a thin square bracket and 3 for a simple line.
Instrument element - bracketSpan (optional - only for multiple staves)
bracketSpan attribute - staff (optional)
The first staff to bracket, numbered from 1, defaulting to 1.
The content is the number of staves that are spanned by the bracket.
The staff number plus the span should be no more that the number of staves + 1, otherwise the bracket will span to the next instrument.
Instrument element - barlineSpan (optional - only for multiple staves)
barlineSpan attribute - staff (optional)
The first staff to for the spanning barline, numbered from 1, defaulting to 1.
The content is the number of staves that are spanned by the barline.
The staff number plus the span should be no more that the number of staves + 1, otherwise the barline will span to the next instrument.
Instrument element - clef (optional)
Instrument element - concertClef (optional)
Instrument element - transposingClef (optional)
Sets the clef to be used for a given staff for the Instrument. The clef element sets the clef for both concert pitch and transposed scores and parts; the concertClef element sets the clef for concert pitch only and the transposingClef element sets the clef for transposed scores and parts only.
...Clef attribute - staff
The target staff for the Clef, numbered from 1, defaulting to 1.
The content must be one of the following clef IDs.
The definition for a piano, grand staff, would be
<staves>2</staves> <bracket>1</bracket> <!-- Grand staff brace --> <bracketSpan>2</bracketSpan> <barlineSpan >2</barlineSpan> <clef>G</clef> <clef staff="2">F</clef>
Instrument element - stafftype (optional)
stafftype presets the number of lines in the staff, the type of notation and the clef. If the clef is also defined by a clef element, then the clef element takes precedence.
stafftype attribute - staffTypePreset (required)
This should be one of
stdNormal,
-- if the stafftype element content is standard;
perc1Line, perc3Line, perc5Line,
-- if the stafftype element content is percussion;
tabBalajka,
tab4StrSimple, tab4StrCommon, tab4StrFull, tabUkulele,
tab5StrSimple, tab5StrCommon, tab5StrFull
tab6StrSimple, tab6StrCommon, tab6StrFull, tab6StrItalian, tab6StrFrench,
tab7StrCommon,
tab8StrCommon
-- if the stafftype element content is tablature.
See Tablature for an explanation of Simple, Common, etc.
For example, for a guitar
<stafftype staffTypePreset="tab6StrCommon">tablature</stafftype>
Instrument element - singleNoteDynamics (optional) .
Enables and disables SND notation interpretation, see meanings of SND
When correcly setup mod in soundfont, Synthesizer, instrument (.xml here provides default setting, users can adjust inside Musescore with 'Use single note dynamics' property in Staff / Part properties), provides a loudness variation effect for use by special Dynamics symbols and Hairpins.
Default enabled (>0). To disable eg for plucked and percussion instruments set it to 0
Instrument element - aPitchRange (optional)
Instrument element - pPitchRange (optional)
The amateur and professional ranges of the instrument, eg 50-89 for a clarinet. Important for woodwinds and voices. Notes outside the amateur range are highlighted in yellow; notes outside professional range are highlighted in red.
Instrument element - transposeChromatic (optional)
Instrument element - transposeDiatonic (required if transposeChromatic is defined)
If negative, the part sounds lower than written.
transposeChromatic is used for transposing instruments to define the transposition interval between a transposed part and concert pitch.
transposeDiatonic should be set to the diatonic equivalent of transposeChromatic. For instruments (Bb and Eb) where there is no direct equivalent, a near equivalent should be used, -15, -8, -1, 6 ... for Bb and -12, -5, 2, 9 ... for Eb.
Instrument element - Articulation (optional, multiple)
An articulation defined for an Instrument takes precedence over the same articulation in the museScore element, see above.
Instrument element - Channel (required, multiple) .
A Channel defines a set of playback parameters including sound.
Channel attribute - name (optional) .
required if more than one Channel is defined. Musescore's sound changing Staff Texts use this to refer to the channel. Any string will work if you setup a custom Staff Text properly. Use one of the following 5 to support the 5 default Staff Texts: "pizzicato", "arco", "tremolo", "mute", "open".
Channel element - Controller (optional, multiple)
controller attribute - ctrl : the MIDI continuous controller number
controller attribute - value : the the value to be set.
Use values of ctrl="0" and ctrl="32" (refered below as ctrl_0, ctrl_32) to select MIDI Bank
Understanding Bank and Preset in Musescore 3
See screenshot: jump to polyphone example
To switch sound sample in score: jump to Change sound/articulation sample
<controller ctrl="0" value="0" /> <controller ctrl="32" value="17" />
When using multiple soundfonts:
The sound selection logic becomes horribly messy, try the copy and paste method , you may not need to bother with the following details.
Details of MuseScore 3.6.2's messy sound selection logic:
Soundfont definition allows 129 Banks (#0-#128), but ctrl_32 has 128 distinct values only (0-127). As of MuseScore 3.6.2, what ctrl_0 and ctrl_32 refer to varies with
A workaround to handle the problem is to make sure ordering in synthesizer stay the same, hint: Set as default, and edit your soundfonts so they all have the number 128 bank occupied, then
1st soundfont Bank 0-127 => ctrl_0_value=0, ctrl_32_value=0,1,2...127
1st soundfont Bank 128 => ctrl_0_value=1, ctrl_32_value=0
2nd soundfont Bank 0-126 => ctrl_0_value=1, ctrl_32_value=1,2,3...127
2nd soundfont Bank 127 => ctrl_0_value=2, ctrl_32_value=0
2nd soundfont Bank 128 => ctrl_0_value=2, ctrl_32_value=1
3rd soundfont Bank 0... => ctrl_0_value=2, ctrl_32_value=2,3,4....
the n-th soundfont's (smaller number banks only) Bank m will be ctrl_0_value= n-1 , ctrl_32_value= n-1+m
eg
To use Bank 0 of the 1st soundfont
<controller ctrl="0" value="0" /> <controller ctrl="32" value="0" />
To use Bank 0 of the 2nd soundfont
<controller ctrl="0" value="1" /> <controller ctrl="32" value="1" />
For audio output, Musescore use Fluid Synthesizer's MIDI Continuous Controller / Control Change (MIDI CC) Messages, see a list of MIDI CC. To select sound(Bank) thru Staff Text, CC 0 MSB and CC 32 LSB are used. For Hairpins and SNDs such as sfz , CC 2 is used by default (can be disabled or switched to use CC 11 instead in the synthesizer ). To use other MIDI CC, you must declare MIDI Actions for each channel first, study this github project.
For MIDI out, the reverb and chorus are available in Mixer
<controller ctrl="0" value="0" /> <!-- 0x128 (MSB) --> <controller ctrl="32" value="17" /> <!-- 17 (LSB) -->
Channel element - program (optional)
program attribute - value
Selects MIDI preset/program, counts from zero. It is the Preset number as shown in Polyphone. Note the counting difference in the official General MIDI documentation table, GM's preset/program counts from one.
Understanding Bank and Preset in Musescore 3
See screenshot: jump to polyphone example
To switch sound sample in score: jump to Change sound/articulation sample
Example soundfont created using Polyphone
This soundfond MuseScore_GumGum.sf3 is created using Polyphone
Consider this Bank 6 Preset 41 sound, to refer to this sound:
If you want to use musescore's default sounds, load the custom soundfont as the 2nd soundfont in synthesizer
<Channel name="cres1"> <controller ctrl="0" value="1"/><!-- soundfont order - 1 --> <controller ctrl="32" value="7"/><!-- soundfont order - 1 + bank number --> <program value="41"/><!-- preset number--> </Channel>
the n-th soundfont's (smaller number banks only) Bank m will be ctrl_0_value= n-1 , ctrl_32_value= n-1+m because preceding soundfont's Bank 128 is occupied, see the messy logic in controller definition
If your sound requires drumset layout, Bank must be 128, the above formula will not work. For example, to refer to Bank 128 Preset 20 sound, use:
<Channel name="cres1"> <controller ctrl="0" value="2"/><!-- higher bank like 128 is tricky, see logic --> <controller ctrl="32" value="1"/><!-- higher bank like 128 is tricky, see logic --> <program value="20"/><!-- preset number--> </Channel>
These ctrl_0_value, ctrl_32_value are correct only if custom soundfont is 2nd ordered in the synthesizer, and the preceding soundfont's Bank 128 is occupied, for more info about logic see controller definition
Alternatively,
You can load soundfont as the 1st soundfont in synthesizer, but musescore's default instruments will not create correct sound ,
refer to Bank 6 Preset 41 sound:
<Channel name="cres1"> <controller ctrl="0" value="0"/> <controller ctrl="32" value="6"/> <program value="41"/> </Channel>
Bank 128 Preset 20 sound:
<Channel name="cres1"> <controller ctrl="0" value="1"/> <controller ctrl="32" value="0"/> <program value="20"/> </Channel>
Channel element - synti (optional, Channel only)
Selects the synthesizer. The default MuseScore synthesizer is Fluid which uses SF2/SF3 soundfonts. MuseScore also includes the Zerberus synthesizer which uses SFZ<synti>Zerberus</synti>
. The Aeolus synthesizer is not currently supported.
Channel element - MidiAction (optional, multiple)
An optional action (set midi controller and/or set program) that can be selected for the channel when the channel is activated in the stave text properties dialog box.
To use other custom MIDI CC, you must declare MIDI Actions for each channel first, study this github project.
Channel element - descr (inactive)
Currently not used. The description may be helpful for people editing the instruments.xml file in the future.
Channel element - mute (deprecated)
Channel element - solo (deprecated)
Instrument element - StringData (required for tablatures) .
Defines the number of frets and the tuning for each string.
Althrough the string data is required for a tabulature, it can also be defined for a standard notation Instrument. This Instrument can then be displayed on a standard staff or displayed as a tablature by setting the appropriate tablature style in the edit instruments menu.
StringData element - frets (required)
Number of frets for the instrument.
StringData element - string (required, multiple)
Tuning of a string as a MIDI pitch number. Uppermost string first.
For a 5 string banjo:
<StringData> <frets>19</frets> <string>67</string> <string>50</string> <string>55</string> <string>59</string> <string>62</string> </StringData>
Try the .mscx copy and paste method
Also try .drm copy and paste method: Use Edit Drumset GUI to set up sounds, save it as .drm file, open as plaintext, copy from them to create your custom instruments.xml.
Instrument element - drumset (required) .
The value should be true (>0) for an unpitched percussion instrument. Note that a "drumset" may include non-percussive, unpitched instruments such a whistle.
Instrument element - Drum (multiple)
Defines the sound, the staff line and the noteheads for each sound in the drumset such as snare, snare crossstick, snare rimshot ...
Drum attribute - pitch (required)
The content is the MIDI note number (pitch) for the sound.
Drum element - head (recommended unless noteheads is specified)
The content is the notehead group to use for this sound. Specifying the notehead group number is deprecated: the notehead group name is required. The default and the fallback if the name is not recognized is normal.
Each notehead group defines a set of four noteheads for "black" notes (quarter notes / crotchets and shorter), half notes (minims), whole notes (semibreves) and double whole notes (breves).
The notehead group may be one of the standard groups for percussion
normal, cross, plus, xcircle | withx, triangle-up, triangle-down, slash
slashed1, slashed2, diamond, diamond-old | circled, circled-large
or one of the oddities
large-arrow, do, re, mi | fa, (no so), la, ti
Drum element - noteheads (optional)
Sets the the noteheads for "black" notes (quarter notes / crotchets and shorter), half notes (minims), whole notes (semibreves) and double whole notes (breves) individually using internationally recognized names. noteheads takes precedence over head.
noteheads has four, optional, elements defining the noteheads for each length note: quarter for "black" notes, half for half notes /minims, whole for whole notes / semibreves and breve for double whole notes / breves.
The noteheads equivalent of the notehead group slashed2 is
<noteheads> <quarter>noteheadSlashedBlack2</quarter> <half>noteheadSlashedHalf2</half> <whole>noteheadSlashedWhole2</whole> <breve>noteheadSlashedDoubleWhole2</breve> </noteheads>
Any noteheads from the SMuFL ranges Noteheads, Slash noteheads, Round and square noteheads and Shape note noteheads can be used.
For unpitched percussion instruments, you may only ever need black noteheads. If the notehead definition for any note length is omitted, the notehead defaults to normal.
Drum element - line (recommended)
The content is the staff line to use for this sound. 0 is the top line, 1 the top interline and so on. The default is -1. This is not guaranteed.
Drum element - voice (recommended)
The content is the preset voice to use for this sound: a number between 0 and 3, corresponding to staff voices 1 to 4. The default is 0 (staff voice 1). This is not guaranteed.
Drum element - name (required)
The content is the name of the sound. This is the tip text for the sound in the drum palette and name of the sound in the Edit drumset dialog box.
Drum element - stem (recommended)
The content is the preset stem direction: 0 for automatic. 1 for up and 2 for down. Defaults to up for voice 0 or 3 (staff voice 1 or 4) and defaults to down for voice 1 or 2 (staff voice 2 or 3).
Drum element - shortcut (optional)
The content is the shortcut for this sound which should be a letter between A and G.
Pódese ligar a ficheiros enviados co nodo actual empregando etiquetas especiais. As etiquetas serán substituídas polos ficheiros correspondentes. Por exemplo: Supoñamos que enviamos tres ficheiros (nesta orde):
NOT FOUND: 1 ou NOT FOUND: imaxe1.png será substituído por <img src=imaxe1.png alt=test>
NOT FOUND: 1 ou NOT FOUND: imaxe1.png será substituído por <a href=imaxe1.png>test</a>
NOT FOUND: 2 ou NOT FOUND: file1.pdf será substituído por <a href=ficheiro1.pdf.png>test</a>
O filtro de ligazóns libres examina o corpo das páxinas de libro procurando palabras ou frases incluídas entre corchetes [[nodetitle:como aquí]] . Pódense premer estas palabras e ir así á páxina de libro que ten esas palabras como título. De non existir, a ligazón tentará crear a páxina de libro e mostrar o formulario de creación da páxina, co título xa posto. Se o usuario non ten permiso para crear unha páxina de libro, a ligazón envía a unha páxina cos resultados dunha procura que coincida coas palabras.
Para alén destes estilos simples de ligazón, o filtro de ligazóns libres tamén permite unha sintaxe expandida mediante o método dos corchetes duplos. As ligazóns libres que conteñan unha barra (a tubería, "|") ligan cun texto diferente. Por exemplo, [[nodetitle:isto é o que se mostra|este é o destino]] liga o texto "isto é o que se mostra" cun contido titulado "este é o destino" ou, se non existe, creará a páxina de contido con "este é o destino" como título.
As ligazóns libres con corchetes duplos poden conter tamén URL que comecen por http://. Polo tanto, son aceptábeis as ligazóns como esta:
Freelinking: Unknown plugin indicator
, así como esta: //www.drupal.org
, que mostra e liga co URL no corpo.
There are only a few documents regarding MuseScore internals, except of course the code and its comments.
Click on the image to download as PDF
Click on the image to download as PDF.
A score is represented by a Score
object in memory. A Score
object can have a parent Score
if the score is an Excerpt
. An Excerpt
object is used to represent a part in part extraction. A Score also maintain a list of Excerpt
s if it has parts.
In a Score
, notes are stored in a list of Measure objects. Measure inherits from MeasureBase together with the frames. A Measure represents a measure across all the staves of a system, it's a "vertical column" of music. The Score
also stores the tempo change list (TempoMap
) and the time signature change list TimeSigMap
. A Score
object is complex, and has several states variables for layout, audio rendering. It also stores score metadata, style etc...
Layer
s in a Score
object are a way to hide or show some Element
according to the selected layer. A Score
stores a list of Layer
s.
The screen position of a visible element is computed from three values:
AP |
Anchor position of element. This is usually the position of the parent element. |
LO |
Layout Offset, computed in the layout engine. MuseScore calculates it as the normal position of the element |
UO |
User Offset, created by dragging an element by the user |
The display position is computed as:Display Position = AP + LO + UO
The saved position in a MuseScore file is computed as:Saved Position = LO + UO
On read the saved position is written to the UserOffset (UO
). The LayoutOffset (LO
) is set to zero. On the first call of layout()
the values for UO
and LO
are reconstructed. The condition LO==0
is used to determine the first call to layout()
.
After first Layout the values are computed as (RP
= read position from file)
void Element::adjustReadPos() { if (RP != 0) { UO = RP – newLO; RP = 0; } }
As a consequence, if you are writing an import filter and want to override the automatic placement of elements on import, set Element->_readPos. After layout MuseScore will compute a proper userOffset out of it.
Older MuseScore versions (<= 0.9.6) do only save the UO value. If loaded with a different MuseScore version than created, the position of certain elements may differ, as the layout algorithm (and the LO
value) may have changed. This is avoided with the above scheme.
Caveats: adjustReadPos()
has to be applied after the first complete layout of an element. This also means that a second layout()
call should not change any element position. The layout has to be done in one pass.
msynth is a wrapper for Fluid and Zerberus.
Fluid is a SF2/SF3 soundfont synthesizer. The SF3 format is not a standard and use by MuseScore only. It's exactly like SF2 except the samples are encoded in OGG instead of WAV.
Zerberus is a SFZ synthesizer. It's mainly tested with the salamander piano SFZ. Any work to add support for more opcode is welcome.
This document gives an overview of how a score is represented in MuseScore. If you find it long on generalities and short on details, consider that a good thing, as details tend to change rapidly. So by keeping this fairly general, it is less likely to be out of date. This description was originally created shortly before the release of MuseScore 2.0.
All of the source files referenced in this document are found in the “libmscore” subfolder of the main repository unless otherwise noted.
A Score is the main top-level object. You can view score.h to see its definition. There are members here to store the style settings and other options associated with the score, and there are all sorts of other members to keep track of other things that seldom matter to most of the code. The main thing that usually matters is the list of measures – that’s where almost everything about the content of the score (even things like the title frame) are to be found. There is also a list of staves – one staff for each instrument in your score, normally, except for instruments like piano that may have two.
Aside from the lists of measures and staves, the next most interesting thing in a score are the various “maps” that MuseScore builds to keep track of things that might change over the course of the score – the time signatures, key signatures, tempo markings, etc. These allow code to quickly ascertain the current time signature (or whatever) at any given point in the score. There is also a map for elements called spanners – these are thing like slurs or crescendo markings that don’t just live in one place in the score but instead span from one place to another.
The Score object also contains a list of the pages for the score and the systems that make up those pages, but actually, these are not normally needed for most work. These data structures are created and managed by the layout engine.
In general, MuseScore is WYSIWYG, and if you see something on the page, there is probably an object for it. Element is the base class for all such objects. Elements are organized in a tree-like structure, where a Score contains Pages, each Page contains Systems, each System contains Measures, each Measure contains Segments, each Segment contains Chords, each Chord contains Notes, etc. Each element contains a pointer to its parent.
Elements generally have a layout() method to determine position and other charateristics; this is often a significant part of the implementation of any given element. Some elements are more abstract, like Staff, which defines the attributes of any given staff (number of lines, instrument to use, etc) but are not actually drawn directly.
As mentioned, the most important thing in a Score is the list of Measures. Actually, it’s a list of MeasureBases – this is the base class for both measures and frames. But for many purposes, you can ignore the frames. And even though measures are children of systems which are children of pages, you normally access the measure list for a score directly.
A Measure object (measure.h) contains a bunch of members you are unlikely to care about. But just as the most important member of the score is the list of measures, the most important member of a measure is a list of segments. See below
The Segment object (segment.h) is perhaps the most important data structure to understand in MuseScore. A segment represents a moment in time – which, by the way, is represented in MuseScore in units called “ticks” (480 of them per quarter note). A segment contains a list of elements that occur at that time position across all staves. So if your score has four instruments, two of which play a note at a particular moment in time, there will be elements for those two notes in the segment. Each element in a segment contains an indication of what staff it lives on, also what voice within the staff. Actually, these two pieces of information are combined into the notion of of “track”. Tracks 0-3 are the four voices for the first staff, tracks 4-7 are the four voices for the second staff, etc.
A segment contains an element for a given track only if something actually happens at the tick for the segment. So for instance, if one staff has a whole note while another has two half notes, there will be two segments total. The first segment, representing beat one (tick 0 within the measure) will contain the whole note for the first staff and the first half note for the second staff. The second segment, representing beat three (tick 960 within the measure), will contain the second half note for the second staff but will contain nothing for the first staff.
A segment can also contain annotations – markings like staff text, chord symbols, dynamics, etc. They also have a track to record what staff and voice they are associated with.
So far, I have been talking about one kind of segment only - the type that contains chords and rests (or more generally, chordrests, the parent class of both chords and rests). There are also separate segments for the clefs, time signatures, key signatures, and barlines. Much of the code in MuseScore ignores these and focuses only on the chordrest segments.
MuseScore makes a distinction between a chord and note that isn’t what you might expect. A Chord (chord.h) is a collection of one or more notes on a given track (staff/voice) at a given tick (moment in time). Basically, even single notes are chords to MuseScore. A chord has a list of the notes that make up the chord, so that list will just contain a single element for single notes. By definition, all notes of a chord share the same basic duration. Notes that occur at the same tick but have different durations must be entered into different voices – that’s how MuseScore and most other notation programs organize things both internally and in the user interface.
A chord has a duration and list of notes. It also has info about the stem, ledger lines, grace notes to apply to the chord, articulations, arpeggio, tremolo, glissando, etc. Two chords tied together are represented in MuseScore as two separate chords (each with its own duration) and a separate tie object, just as it looks.
As mentioned, a chord has one or more notes. The Note object (note.h) is where you find information about pitch, staff line, accidentals, playback information – anything that potentially differentiates one note within a chord from another.
The Rest object (rest.h) is a sibling of chord – they share the same parent, chordrest. A rest has a duration and that’s about it. Full measure rests are represented with a special duration value, so they can fill a measure of any time signature.
Anatoly Osokin (Anatoly-os); formerly: Nicolas Froment (lasconic)
Anatoly Osokin (Anatoly-os); formerly: Nicolas Froment (lasconic)
PortableApps.com in-house team; formerly: Bart.S
Anatoly Osokin (Anatoly-os); formerly: Nicolas Froment (lasconic), Stefan de Konink (skinkie)
Anatoly Osokin (Anatoly-os)
Peter Jonas (shoogle)
Eric Fontaine (ericfontainejazz)
Ubuntu (PPA): Thorsten Glaser (mirabilos); formerly: Peter Jonas (shoogle), Toby Smithe
Debian: Thorsten Glaser (mirabilos); formerly: Tiago Vaz (tiagovaz), Toby Smithe
Fedora: Seve, Orcan Ogetbil
openSUSE: Ganglia
PCLinuxOS: Galen Seaman
Mandriva:
Arch Linux: haawda
Frugalware Linux: Slown
Snappy:
Flatpak:
This page is extremely old and out of date.
MuseScore allows for customization to manually fix most of the basic notation problems listed below. However, the following problems occur so often that better defaults would save significant amounts of time.
The previous version of MuseScore made significant strides towards preparing MuseScore for use on ensemble scores such as orchestra or band. Below are some remaining hurdles.
The following hurdles make MuseScore impractical or difficult for creating professional-quality scores with lyrics.
Release date and revision number for each stable version of MuseScore. The list matches the file version with the MuseScore version number used in the Help→About dialog.
Release dates link to release announcements/notes.
Mac only ↩︎
Warning: this page is very outdated.
As feature changes are made to MuseScore, they may be listed here. This will help developers in tracking work, help testers in using the nightly builds to try out new features and perhaps provide feedback, and perhaps most importantly, it will also help serve as a checklist of features needing documentation as MuseScore approaches a new release. The distinction between new feature and bug fix is sometimes blurry, but if a change will require documentation, it should probably be listed here.
Users should understand that features listed here may still be experimental and subject to further change or even removal.
Developers: Feel free to list new features here whether completely implemented or not. You may indicate any known limitations or bugs if you like, as well as any further enhancements you are considering. You may also wish to indicate whether users may provide feedback on the feature, and if so, whether you would prefer they do so via the issue tracker, the forums, the developers list, private email, or by other means. Provide as much or as little detail as you like. Even just listing a feature name with no additional information would be useful for the purpose of making sure it does not fall through the cracks when it comes time to create documentation.
Note: This page itself is experimental and subject to change in form and direction. A template for feature changes/additions is provided as a starting point, but if a different format is deemed more appropriate, feel free to use one and even to update the template if you feel this would make sense for others.
Notes: See http://musescore.org/en/node/9346
Rev. 4080 implements more flexible clef changes. Example is a piano score where the top staff starts with a G clef and switches immediately to an F clef.
Elements on the score view can be used like palette elements. For this press Shift+Ctrl and drag an element with left mouse button.
This also allows to drop elements from the score view to a palette. (First you have to make the palette changable; see palette context menu).
If you press Shift+Ctrl and drag an element from the palette, the operation does not end on drop. You can can continue to drop to other locations. This is currently not implemented for all kind of elements. Tested with articulations.
Clef layout spacing was changed in revision 4101. In previous versions clefs looked like:
or
This is the new spacing:
and
The changes may have side effects and need testing.
Time signatures can be different for different staves. An example here is Bach's 26. Goldberg Variation:
MuseScore has the concept of a global time signature and an actual (local) time signature. You change the global time signature by dragging and dropping a palette object to a staff. The global time signature is used to count beats (as shown in the status line) and is the reference for tempo markings. The global time signature is the same for all staves and normally identical to the actual time signature.
The actual time signature is set in the time signature property dialog and can deviate from the global time signature for every staff (left hand 18/16 in the example)
The text of the time signature can be set independent of the actual values.
A local time signature is set by dropping a time signature symbol with the Ctrl key pressed. The local time signature is set only for one staff. A global time signature is replicated for all staves.
The album manager allows to prepare a list of scores. The list can then be saved as an album file ("*.album").
The first implemented action for an album is "Print". The album scores are printed in order with the correct page numbers set overriding the page number offset values in "Page Style". The album is printed in one print job so double sided printing (duplex printing) also works as expected.
For the Open-Goldberg project I want to be able to create different versions of the score. One version is the "Urtext", a score which is close to the original version of Bach. A second version could be a Czerny variation, which in addition to the Urtext contains fingerings.
The layer feature allows to create different versions out of one score file. If you want to add fingerings you have to create a layer and tag the fingering elements with the layer name.
First create layers:
Second create a score variant:
Add the visible layer to the score variant. Then select all fingerings and tag them with the name of the score variant:
Default layer:
Czerny layer:
Notes and Rests at the same time position are vertically aligned by default. Sometimes this is not desired.
A new feature allows to relayout beamed notes and rests without considering notes/rests in other staves.
Before setting relayout flag:
Checking relayout flag:
After setting relayout flag
Other examples: http://musescore.org/en/node/18826#comment-68687
is rendered as
Notes: this is how a variety of different chord symbols will render in the "Jazz" style:
Notes:
Notes:
MuseScore comes in three different types: stable releases, beta releases, and nightly builds. If you have not been closely involved with a software project before, then these terms may be unfamiliar. Don't let that stop you from getting involved. The quality of a stable version depends on testing and reporting by the wider community using the beta and nightly builds.
The stable versions (also called final releases) come about every nine months and are intended for normal, everyday use. Stable versions have received extensive testing from the community prior to release. In the lead up to an official release, code development slows down to focus on fixing bugs found by the testing community and to avoid introducing new problems. If any critical bugs are found at the last minute, then they may delay the official release. To obtain the latest stable version, click on the blue download button on the home page of the MuseScore website.
Beta versions come in the months leading up to a major new version to offer an early preview of the stable release. Bugs are expected in beta releases, and they are intended for testers and advanced users, in order to make sure that the final release is as bug-free as possible.
Release Candidates come out in the months leading up to a major new version.
If there is a beta version or release candidate currently available, it can be found on the download page.
Development builds from MuseScore's master branch are intended for testers only, and should not be used otherwise. They may come several times a day, but may be more or less frequent, depending on how often there are changes to the code. Development builds are created automatically, so you may be the first human to test a particular build. Occasionally, even basic functionality may be broken.
To obtain the latest development build, see: Development builds
At times there also development builds of a non-master branches, like recently for the 2.3 branch. These are supposed to be previews of what will or may become the next minor release. You get them from the places mentioned above, just make sure not to take those with "master" in their name.
Frequency | Purpose | Prior testing and stability | |
---|---|---|---|
Official release | About every 9 months | Normal use | Fairly stable |
Beta version / Release Candidate | Months/weeks leading up to a stable release | Early preview for testers and advanced users | Some instability expected |
Development build (from master branch) | Every time the code changes, could be multiple per day | For testing only | Untested, except for some automated regression tests in the build server |
Development build (from non-master branches) | Every time the code changes, could be multiple per day | For testing / normal use, advanced users | Fairly stable |
Preview | Vector file | 100x22 bitmap | 150x32 bitmap | 250x54 bitmap | 450x97 bitmap | 600x130 bitmap | 2000x433 bitmap |
SVG | PNG | PNG | PNG | PNG | PNG | PNG | |
SVG | PNG | PNG | PNG | PNG | PNG | PNG | |
SVG | PNG | PNG | PNG | PNG | PNG | PNG |
Preview | Vector file | 100x100 bitmap | 150x150 bitmap | 250x250 bitmap | 450x450 bitmap | 600x600 bitmap |
SVG | PNG | PNG | PNG | PNG | PNG | |
SVG | PNG | PNG | PNG | PNG | PNG | |
SVG | PNG | PNG | PNG | PNG | PNG |
The font recommended for use in materials and on the website is Raleway by Matt McInerney.
Try to keep content (data) separate from its presentation (how it is displayed). This enables either the content changed later without having to change the presentation, and vice versa. In web design this is achieved by using HTML files for content and CSS files for presentation.
In GUI desktop programs this is achieved by following the Model/View paradigm. Qt provides Model/View classes that make this relatively straightforward: define your model class, then use it in a view class! It is best to avoid Qt classes in libmscore
, so you may need to define a model in mscore
that simply takes data from libmscore
. This model is then provided to a view in mscore
.
The easiest way to satisfy as many design principles as possible is to always use Qt's own widgets (QLineEdit, QPushButton, QTreeView, etc.) rather than creating your own. The look and behaviour of Qt's widgets is highly customisable and should be able to satisfy most requirements. Widgets can be added graphically to .ui
files via QtCreator's Design mode (a.k.a Qt Designer), and manipulated dynamically in the code (.h
and .cpp
files).
If you need to customise a widget, consider subclassing one of Qt's widgets and applying your customisations to the subclass. This means the custom widget can be reused elsewhere in the code, and it is even possible to insert custom widgets in .ui
files using the promoted widgets mechanism.
Sometimes it can be useful to create a new widget that is made up of multiple Qt widgets. MuseScore's Instrument Widget (mscore/instrwidget.h, .cpp, .h) is a good example of this. The Instrument Widget is used in the Instrument Dialog (mscore/instrdialog.ui).
If you do need to create your own widgets, try to base yours on one of the abstract widget classes (e.g. QAbstractButton, QAbstractItemView, etc.) rather than creating one from scratch. Don't subclass QWidget if you can subclass something else!
Accessibility is about making the interface usable for people with disabilities and special needs. Around 1 in 5 people have some form of disability.
It's tempting to think of accessibility as something optional that can be left until after the main design has been completed, but this is wrong and will create more work in the long term. If you get accessibility right from the beginning, it will actually make your job easier, not harder!
Tips for accessibility:
Once the interface works for users with accessibility needs, then (and only then) you can go and make it look pretty!
Doing this will help users with accessibility needs, and it will also encourage you to think about how the widgets are related to each other, which often leads to a better design for all users.
Sometimes you can do everything right in your code, but find that accessibility is still sub-optimal due to a bug in the UI framework (in this case Qt) or (more rarely) a bug in the screen reader. Try to use common sense to work out where the issue lies. If it's a Qt problem the consider submitting a bug report to Qt and then move on to doing something else while waiting for it to get fixed; don't waste time writing custom hacks in MuseScore's code in an attempt to "fix" Qt problems.
Remember, Qt is supposed to give us accessibility "for free", by default for all the basic widgets (buttons, dropdowns, radiobuttons, treeviews, etc), without any effort on our part other than setting the accessible name and description. If a basic feature is not working there's a good chance it is a bug in Qt and not your code.
All designs for MuseScore should be checked against these principles.
These principles are currently mostly copies of those set out by Mozilla.
This is the most important requirement, for the the simple reason that if you get accessibility right you get most of the other requirements for free! Accessibility is also a legal requirement in many jurisdictions.
The control interface must be accessible to users with disabilities and special needs. This includes:
Remember, disability is extremely common! Around 1 in 5 people have some form of disability.
Taking the time to get accessibility right encourages better design in general, which benefits everyone. Even if you don't use accessibility features, you might benefit if your keyboard/mouse/speakers/monitor stops working one day and you really need to access a score!
Users should be able to discover functionality and information by visually exploring the interface; they should not be forced to recall information from memory. [Source: Nielsen]
Controls should visually express how the user should interact with them. [Source: Norman]
Controls should be placed in the correct location relative to the effect that they will have. [Source: Norman]
Controls that are more important or more commonly used should leverage visual variables such as size and contrast so that they have more dominance and weight relative to other controls.
Interfaces should be as simple as possible, both visually and interactively. Interfaces should avoid redundancy. [Source: Minimalism]
Interfaces should provide feedback about their current status. Users should never wonder what state the system is in. [Source: Nielsen]
All else being equal, software should be internally consistent with itself, and externally consistent with similar interfaces to leverage the user's existing knowledge. [Source: Nielsen]
Interfaces should be as efficient as possible, minimizing the complexity of actions and the overall time to complete a task. [Source: Nielsen]
The software should not automate tasks contrary to the user's intents.
Interfaces should not interrupt the user. Interfaces should never ask the user a question that they are not prepared to answer simply for a false sense of control. In general, software should only speak when spoken to.
Interfaces should proactively try to prevent errors from happening. [Source: Nielsen]
Actions should support undo so that users remain in control.
Users should not encounter errors because the interface is in a different state than they expected it to be.
Interfaces should proactively help users recover from both user errors and technology errors. (A preferable case is to address through ux-error-prevention so that the error does not occur). [Source: Nielsen]
Interfaces should not be organized around the underlying implementation and technology in ways that are illogical, or require the user to have access to additional information that is not found in the interface itself. [Source: Nielsen, Cooper]
Users should not be required to understand any form of implementation-level terminology. (This principle is a special case of ux-implementation-level). [Source: Nielsen]
Interfaces should not blame the user, or communicate in a way that is overly negative or dramatic.
MuseScore's Discord Server: https://discord.gg/HwHhXEbJ4r
Join the Discord server to get in touch with the developers or hang out with the contributor community!
If clicking the above link doesn't work as expected, try adding the invite manually within Discord.
You don't have to be a developer or contributor to join the Discord server: users are welcome to join too!
However, if you are having difficulty using MuseScore's software we would prefer you to ask for help in the Support Forum, where content is easily searchable—but you are welcome to share a link to your forum post in the Discord server's #support channel so people can find it quickly.
The Discord server has multiple channels for text and voice chat. You can join a channel by selecting it in the channel list on the left of the screen. The description at the top of each channel page will tell you what that channel is used for.
CHAT
#general
#support
#notation
#playback
#announcements
DEV
#design
#development
#translation
#gsoc (Google Summer of Code)
🔈 Ensemble
You can pause notifications for a particular channel via the bell icon (🔔) in the top right of the channel page, or for the server as a whole by clicking on the server name "MuseScore" and choosing "Notification Settings". We recommend setting it to "Only @mentions" so that you will still be notified when somebody mentions you with @username.
When a channel has unread messages, its name will be highlighted in the channel list. You can disable this highlight for channels you don't care about by using the Mute Channel option, also available via the notifications bell icon (🔔), or by muting the server as a whole in "MuseScore" > "Notification Settings".
Please wear headphones to avoid creating an echo for other users, or mute your microphone when you are not speaking. Ideally, do both!
You can also enable video in the voice chat or start screen sharing. During video calls, you will probably want to disable the option "Show non-video participants", which is available via a three dots menu in the top right.
The Grid / Focus button to the left of the three-dots menu is also useful.
The following are no longer in regular use for MuseScore development. They have been replaced by the Discord Server. Links to these groups have been removed to discourage people from joining.
This chat was used for on-topic discussion of MuseScore development, and anything directly related to it.
This chat was used for off-topic 'water-cooler' discussion about anything and everything (save for MuseScore development discussions).
Was used to discuss the translation and localization of MuseScore.
Was used to discuss changes to MuseScore's UI and notation rules.
MuseScore used to use the #musescore channel on freenode.net, but we left in 2019 due to excessive spam. After the events of May 2021, Freenode has since been abandoned by many major open source projects that were previously using it.
If you have op rights:
Get channel info
/msg chanserv INFO #musescore
Get temporary op
/msg chanserv OP #musescore
Give op rights to username
/msg chanserv ACCESS #musescore add username +o
Ban username with bad connection (it will redirect him to #fix_your_connection a special channel with instructions how to fix it)
/mode #musescore +b username!@$##fix_your_connection
Remove chanop status from username (do this for yourself when done)
/mode #musescore -o username
List ops
/msg chanserv ACCESS #musescore list
Display current topic
/topic #musescore
Change channel topic
/topic #musescore [new content here]
Change channel entry message
/msg ChanServ SET #musescore ENTRYMSG [message]
MuseScore source code is hosted on GitHub.
Each pull request code is built on GitHub Actions for all platforms (Windows, Linux, and macOS), this way we make sure that the build is not broken.
It also checks the style of the code and runs various tests.
You can see these builds on the pull request page.
If you are logged in to GitHub, you can download the built builds (artifacts) for testing.
The artifact archive also contains various service data that was generated during the build.
Build workflows are located in the .github/workflows
directory
The builds scripts are in build/ci
directory.
We used to call them "nightly builds" but they aren't so much "nightly" anymore.
GitHub Actions is used to create development builds for all platforms (Windows, Linux, and MacOS) for the active branches. The packages are uploaded via FTP on https://ftp.osuosl.org/pub/musescore-nightlies/. Only the last 40 "nightlies" are kept there.
The MuseScore binaries for stable are hosted by GitHub releases
https://github.com/musescore/MuseScore/releases
And nightly builds are hosted by Oregon State University Open Source Lab (OSUOSL). We have two shares there, https://ftp.osuosl.org/pub/musescore-nightlies/ and https://ftp.osuosl.org/pub/musescore/.
For some other resources, MuseScore also has an Amazon Web Services (AWS) account and uses their Simple Storage Service (S3). The MuseScore Connect HTML page is hosted on S3, also MuseScore translations, as available in the resource manager, are hosted on S3. We also use S3 to host libraries (Qt and other dependencies) or tools (wkhtml2pdf) used to build MuseScore, generate PDF handbook etc...
GitHub can send a POST HTTP request to any URL. MuseScore.org uses this feature to receive notification of every new commit on the branches of the Git repository. If the commit message (not the PR title) starts with "fix #xxxxx", with xxxxx the issue number in the issue tracker, the issue will be marked as fixed automatically (and as closed 14 days after the last update to it).
We're now using GitHub Actions to run a tx2s3 job periodically (every 15 minutes). The process takes TS files from Transifex converts them to QM files, bundles thjose into ZIP archives, one per language, and uploads those to S3. The Resource Manager in MuseScore connects to S3 to get the latest language updates.
Here is the process to switch translations from one release to another release: https://docs.google.com/document/d/1KdhLVp8mFlFfxBsIiXHRd_lQMlFH7j3ol1X…
The MuseScore handbook is written and translated on musescore.org. We also offer it as a PDF. The PDFs are hosted by OSUOSL and created daily by Travis-CI's cron
capabilities (starting at 16:30 GMT, finishing some 20 minutes later) , using https://github.com/musescore/handbook2PDF
Drumset files (.drm) are used by the Edit Drumset dialog box for saving and re-loading drumset definitions.
The definitions in a .drm file are XML and identical to the drumset definitions in an instruments.xml file.
The museScore element is the container for all of the drum elements.
museScore attribute - version (required)
The version is the version of the file format, not the version of MuseScore. This documentation applies to version 3.01.
museScore element - Drum (multiple)
Defines a sound for an unpitched Instrument
Drum attribute - pitch (required)
The content is the MIDI note number (pitch) for the sound.
Drum element - head (recommended unless noteheads is specified)
The content is the notehead group to use for this sound. Specifying the notehead group number is deprecated: the notehead group name is required. The default and the fallback if the name is not recognized is normal.
Each notehead group defines a set of four noteheads for "black" notes (quarter notes / crotchets and shorter), half notes (minims), whole notes (semibreves) and double whole notes (breves).
The notehead group may be one of the standard groups for percussion
normal, cross, plus, xcircle | withx, triangle-up, triangle-down, slash
slashed1, slashed2, diamond, diamond-old | circled, circled-large
or one of the oddities
large-arrow, do, re, mi | fa, (no so), la, ti
Drum element - noteheads (optional)
Sets the the noteheads for "black" notes (quarter notes / crotchets and shorter), half notes (minims), whole notes (semibreves) and double whole notes (breves) individually using internationally recognized names. noteheads takes precedence over head.
noteheads has four, optional, elements defining the noteheads for each length note: quarter for "black" notes, half for half notes /minims, whole for whole notes / semibreves and breve for double whole notes / breves.
The noteheads equivalent of the notehead group slashed2 is
<noteheads> <quarter>noteheadSlashedBlack2</quarter> <half>noteheadSlashedHalf2</half> <whole>noteheadSlashedWhole2</whole> <breve>noteheadSlashedDoubleWhole2</breve> </noteheads>
Any noteheads from the SMuFL ranges Noteheads, Slash noteheads, Round and square noteheads and Shape note noteheads can be used.
For unpitched percussion instruments, you may only ever need black noteheads. If the notehead definition for any note length is omitted, the notehead defaults to normal.
Drum element - line (recommended)
The content is the staff line to use for this sound. 0 is the top line, 1 the top interline and so on. The default is -1. This is not guaranteed.
Drum element - voice (recommended)
The content is the preset voice to use for this sound: a number between 0 and 3, corresponding to staff voices 1 to 4. The default is 0 (staff voice 1). This is not guaranteed.
Drum element - name (required)
The content is the name of the sound. This is the tip text for the sound in the drum palette and name of the sound in the Edit drumset dialog box.
Drum element - stem (recommended)
The content is the preset stem direction: 0 for automatic. 1 for up and 2 for down. Defaults to up for voice 0 or 3 (staff voice 1 or 4) and defaults to down for voice 1 or 2 (staff voice 2 or 3).
Drum element - shortcut (optional)
The content is the shortcut for this sound which should be a letter between A and G.
(If they don't cause regressions or if we can document them well enough)
View release notes draft here.
Follow commits to 2.1 here.
music, notation, software, free, open source, composition, composing, arranging, making, sheet music, lead sheet, leadsheet, score, full score, scorewriter, sibelius, finale, capella, midi, musicxml, print, playback
Create, play, and print sheet music for free
Create, play back, and print sheet music with free open source notation software
Create, play back, and print sheet music for free. MuseScore is cross-platform, multi-lingual, open source music notation software. It features an easy to use WYSIWYG editor with audio score playback for results that look and sound beautiful.
Create, play back, and print sheet music for free. MuseScore is cross-platform, multi-lingual, open source music notation software. It features an easy to use WYSIWYG editor with audio score playback for results that look and sound beautiful. It supports unlimited staves with up to four voices each, dynamics, articulations, lyrics, chords, lead sheet notation, import/export of MIDI and MusicXML, export to PDF and WAV, plus online score sharing.
Create, play back, and print sheet music for free. MuseScore is open source music notation software that runs on Windows, MacOS, and Linux, and is available in over fourty different languages. It features an easy to use WYSIWYG editor with audio score playback for results that look and sound beautiful, rivaling commercial offerings like Finale and Sibelius.
Features supported by MuseScore include:
Unlimited score length
Unlimited number of staves per system
Up to four independent voices per staff
Score creation wizard and templates
Automatic part extraction and transposition
Repeats, including segnos, codas, and measure repeats
Dynamics, articulations, and other expression markings, with playback support for most
Custom text markings
Lyrics
Chord symbols
Jazz notation, including lead sheets, slash notation and a “handwritten” font for text
Swing and shuffle playback
Mixer for instrument levels and effects
Percussion notation
Early music notation
Cross-staff beaming
Import of graphics
Custom key signatures
Additive time signatures
User-defined score styles
Most elements in MuseScore are laid out automatically but can also be positioned manually. The capabilities of MuseScore can be extended via plugins, and the growing repository on musescore.org contains many plugins submitted by users.
MuseScore includes a set of sounds that reproduce common instruments (as defined by General MIDI) without taking up a lot of disk space or memory, but you can also substitute any SoundFont you prefer for a wider variety of sounds or for more realism.
MuseScore can import and export MIDI and MusicXML files, and it can also import from Capella and several other programs. MuseScore can export to PDF, PNG, and other graphic formats, to WAV and other audio formats, or to Lilypond for an alternative layout and print option.
MuseScore can upload scores directly to the score sharing site musescore.com. Program support is provided on musescore.org.
3.6.2 released.
We expect a few patch releases providing bugfixes to the 3.x branch whilst MS4 development is ongoing.
There is no intention to create a 3.7 release. New features must be developed against MS4
Main goals:
* UX improvements
* modularisation of code
Basically, normal improvements are expected to libmscore
and import/export
modules. All other modules are subject to architectural refactoring.
Patch releases are usually jump straight from nightly to final release. Minor and major releases follow the stadia listed below:
Automatic builds per commit/PR. Anything goes and anything may break (but shouldn't of course ;-) )
Tech-preview release. Stability is not guaranteed. Allows testing of new features by a broader audience.
A minor release may have an alpha release if it packs big new features.
A major release can have multiple alpha releases to tease ongoing development progress
Test release. Should be fairly stable. At this point some "must have/fix" issues have been identified and most should be included in this release.
From now on, only bugfixes and low-risk features will be eligible for inclusion. Bugfixes that don't address a "must fix" issue should also be quite low-risk; otherwise they will be pushed out to the next (patch) release
Meant for broad testing.
Only required if changes have been made since Beta. Expected to be stable. At this point only critical bugfixes are still allowed
RC + eventual critical bugfixes
the Qt state machine abstraction was removed in 3.x. The original goal to more abstract and simplify the code could not be achieved. The qt solution was replaced by an "in line" implementation which is simpler and easier to maintain.
During the transition some code was commented out resulting in some state transitions currently not working. For example some drag/drop operations may not work right in some states.
Tablature needs testing, has likely regressions.
Implementation of scripting interface is incomplete. The current regression tests reflect the status of implementation.
Due to many problems with QTextDocument, the class was replaced by an own implementation. The current implementation is incomplete. Only simple text editing works. Undo/Redo does work only for simple operations.
More style values need to be added to several elements. A style value may also have an corresponding element property. The inspector dialog and the style dialog needs to be updated along.
Import of 2.x and other formats needs to be tested. For this probably more regression tests are needed to get a better test coverage. 2.x scores will look different when loaded with 3.x. Especially the placement of manually moved elements will be different.
Remove the ability to define a Symbol as a list of Symbols. This was implemented to be able to compose a symbol out of other symbols. Its not necessary anymore as smufl (and bravura) now define all necessary combined symbols. MuseScore symbol names for this combined symbols should be replaced by smufl names.
Album feature is only implemented 10%. Old album features are removed.
Finishing this is a bigger task. Maybe this can be postponed after 3.0 release.
Autoplacement: the current status looks good to me but test coverage is hard to number. I expect lots of bug reports when users try to enter real scores.
Collision detection: the code is yet not optimized. The algorithmic behaviour of collision detection is quadratic. This means that if the number of elements double we need four times the time to detect a collision. This is ok for small numbers of elements but there is a risk this will not scale well for more complicated scores.
In 3.x text styles were removed because they do not fit well in the new scheme of property and style values. Somehow they are reintroduced as sets of style values. The current implementations hardcode some style sets as user1 user2 etc. to enable some of the previous text style functionality. This could be extended to allow arbitrary user-defined style sets. For this a gui similar to the old text styles would be needed.
Program Documentation: Better document the element interface to property and style values.
Code cleanups: check for consistent use of the documented interface.
Testing: Coverage of our regression tests and also the visual tests is low and should be enhanced. We have currently no way to test regressions during user interaction. Implementing a way to record and playback user interaction (events) would be helpful. Any attempt to implement something like this has failed so far.
*Inspector: It's not yet defined how the inspector should handle multiple selections. We should distinguish homogeneous (selection of same element types) and inhomogeneous (selection of mixed types).
Debugger: the internal debugger is not very up to date. I believe it is a useful tool and deserves some love.
Notation symbols: add more symbols from the smufl font to palettes.
Properties, Styles: add more properties and style values. Check the program for hardcoded values and replace them by style values. Especially style values to change the autoplace behaviour may be incomplete.
Profiling: the new layout engine together with collisions detection and autoplacement needs profiling to locate hot spots. It's important for a good user experience to make layout fast as possible.
MuseScore 2.0 had "MuseScore connect" a browser window in the start center where we could display scores, information, ads for "Mastering MuseScore", tutorials. It relied on Qt Webkit which doesn't exist anymore in Qt 5.9. It has been replaced by QtWebEngine which doesn't work on Mingw Windows. In order to solve that, we need to re-implement "MuseScore Connect" with another technology (QML/QtQuick?Widget?) or compile MuseScore with Visual Studio to make use of QtWebEngine, or try something else (Qt WebView ?)
chord-layout-14
The augmentation dot distance for small notes seem to be to large.
This seems to be a bug for me. (Also present in 2.x)
harmony-1
Collisions between harmony elements
The goal is to produce release packages for the following platforms and advertise the new release
Prepare announcement, like e.g. https://musescore.org/en/2.2
Update translations: manually get translations from transifex and push them to github in the relevant branch
mscore --templatemode -j share/templates/convert.json
CPACK_WIX_PRODUCT_GUID
is different from previous versions in build/Packaging.cmake
CmakeLists.txt
and Makefiles and commit, like e.g. 9c73a21Tag the release on GitHub
Travis should create AppImages and DMG file.
Verify that the DMG uses the right MuseScore.com keys
On Windows, AppVeyor should create the MSI package and store it to mscore-nightlies FTP
For Windows store
BUILD_FOR_WINSTORE = ON
For the source package, it's created by the test job on Appveyor and uploaded to mscore-nightlies FTP (src directory) It should contains the right version in revision.h and the correct soundfont.
Test packages on Virtual machines, especially the windows one.
Packages should all be on mscore-nightlies FTP share for example and have them tests by the close community as much as possible. Stuff to test:
When all packages are done, tested. Compute SHA 256 for each package. It will be used on download page to verify integrity
Upload to
Upgrade our services
Announce new release on MuseScore Connect
Mail to package managers : http://musescore.org/en/developers-handbook/distribution-maintainers
Make blog post for musescore front page
Translate and call for translators for post on musescore front page
Update http://musescore.org/en/download and translations
MuseScore Newsletter
Update the pad.xml file
Whitelist request to antivirus companies
Update some of these product page, or verify they use the pad.xml file https://del.icio.us/musescore/productpage. In particular
Contact blogs and newspapers
This document attempts to clarify the various language and stylistic decisions of the English version of the MuseScore user interface. It is initially focused on the MuseScore strings maintained in Transifex, but should be applicable to documentation.
is when all words are capitalized except for certain words. Capitalize all words except the following if they are not the first word of the sentence:
Sentence style capitalization is when the first letter of the sentence, statement, phrase, or label is capitalized and all other words are lower case. The only exception to this is proper nouns which are always capitalized.
Control | Capitalization |
---|---|
Accessibility information | Sentence |
Button label | Title |
Checkbox label | Sentence |
Combo box item | Title |
Combo box label | Sentence |
Group box title | Title |
Menu item | Title |
Page names | Sentence |
Tooltips | Sentence |
The musescore.org website offers a printable friendly version of the handbook for each language. For english, it's here https://musescore.org/en/print/book/export/html/36546?pdf
It also provide a cover page https://musescore.org/en/handbook-cover
The project https://github.com/musescore/handbook2PDF runs every day on Travis-CI, downloads handbook and cover page for each language and uses https://wkhtmltopdf.org/ to create a PDF. The PDF is then uploaded to the musescore-nightlies share of the OSUOSL FTP.
The TOC for the PDF is generated with this XSL file https://github.com/musescore/handbook2PDF/blob/master/custom.xslt
The whole generation process is open source, feel free to contribute improvements.
If it is a table and relates to versions, and which X is supported by Y, it can go here (or for existing pages, link from here). Also allows us to track the edge cases where we are de-supporting a particular OS (permanently or potentially only temporarily) and what the reason for the de-support is.
MuseScore version | Qt Version | OS | Note |
---|---|---|---|
4.4.3 | 6.2.9 | Windows 10 or higher 64-bit only | macOS/Linux will switch to Qt 6.2.9 with the MuseScore 4.5 release |
4.4 | 6.2.4 | Windows 10 or higher 64-bit only, macOS 10.14 or higher, Linux | See MuseScore is switching to Qt 6 |
4.0 - 4.3 | 5.15 | Windows 10 or higher 64-bit only, macOS 10.14 or higher, Linux | The ability to run MuseScore on 32-bit Windows and macOS 10.13 has been removed due to planned future upgrade of MuseScore post 4.0 to Qt 6.x. Qt 6.x drops support for these operating systems. See Github [MU4 Issue] nightly does not run on macOS 10.13 #8858. Windows 8 64-bit is not supported by Qt 5.15 (but should work). Windows 7, 8.1 64-bit are not supported by Qt 6. Report required whether or not they are working. Windows 11 not mentioned (but should work). |
3.x | 5.9 | Windows 7 or higher, macOS 10.10 or higher, Linux | Windows 8 is not supported (but should work), Windows 11 not mentioned (but should work) |
2.x | 5.4 | Windows 7 or higher, macOS 10.7 or higher, Linux | Last MuseScore version known to work with Windows XP and Vista, albeit unsupported |
1.x | 4.8 | Windows XP or higher, macOS 10.4, 10.6 or higher, Linux |
OS | Last supported MuseScore version | First unsupported MuseScore version | Qt Version | Note |
---|---|---|---|---|
Windows 7, 8.1, 10, 11 32-bit | 3.6.2 | 4.0 | 5.9/5.15 | Windows versions not supported by Qt 6.x |
macOS 10.10 - 10.13 | 3.6.2 | 4.0 | 5.9/5.15 | macOS versions not supported by Qt 6.x |
Windows XP, Vista | 2.3.2 | 3.0.0 | 5.4 | Windows versions not supported by Qt 5.9/5.12 |
macOS 10.7 - 10.9 | 2.3.2 | 3.0.0 | 5.4 | macOS versions not supported by Qt 5.9/5.12, no future plans to support. |
Linux (32-bit) | 2.3.2 | 3.0.0 | 5.4 | 32-bit Linux not supported by Qt 5.9/5.12. |
Note: QtT 6.0 is not planned for use in development in the near future (as of December 2020) but listing its versions supported (and by implication dropped) is still useful. It is not an LTS version either, 6.2 will be though.
Qt version | OS | Versions | Architectures | Note |
---|---|---|---|---|
6.7 | macOS | 11+ | x86_64, x86_64h, and arm64 | drops 10.15 |
6.4 | macOS | 10.15+ | x86_64, x86_64h, and arm64 | drops 10.14, MuseScore Studio 4.4 is based on this |
6.2 | Windows | 10 | x86_64, arm64 | no 32-bit |
6.2 | macOS | 10.14, 10.15, 11.0 | x86_64, x86_64h, arm64 | Support for Mac M1 chip |
6.2 | Generic Linux | Compiler: GCC 9 | x86_64 | |
6.0 & 6.1 | Windows | 10 | x86_64 | no 32--bit |
6.0 & 6.1 | macOS | 10.14, 10.15, 11.0 | x86_64 and x86_64h | |
6.0 & 6.1 | Generic Linux | Compiler: GCC 9 | x86_64 | |
5.15 | Windows | 7, 8.1, 10 | x86 and x86_64 | |
5.15 | macOS | 10.13, 10.14, 10.15 | x86_64 and x86_64h | |
5.15 | Generic Linux | Compiler: GCC 5 or later, ICC 18.x | x86_64 | |
5.12 | Windows | 7, 8.1, 10 | x86 and x86_64 | Qt version supported until Dec 6, 2021 |
5.12 | macOS | 10.12, 10.13, 10.14 | x86_64 and x86_64h | |
5.12 | Generic Linux | Compiler: GCC 4.8, GCC 4.9, GCC 5, GCC 6, GCC 7 | x86_64 | |
5.9 | Windows | 7, 8.1, 10 | x86 and x86_64 | Qt version supported until May 31, 2020 |
5.9 | macOS | 10.10, 10.11, 10.12 | x86_64 and x86_64h | |
5.9 | Generic Linux | Compiler: GCC 4.8, GCC 4.9, GCC 5.3 | x86_64 | 64-bit only |
5.8 | Windows | 7, 8.1, 10 | x86 and x86_64 | |
5.4 | Windows | XP | ||
5.4 | Windows | Vista, 7, 8 | 32-bit and 64-bit | MuseScore 32-bit only (but an unsupported 64-bit version is available) |
5.4 | macOS | 10.7, 10.8, 10.9, 10.10 | x86_64 | |
4.8 | Windows | XP, Vista | 32-bit | |
4.8 | macOS | 10.6, 10.7 | x86_64 |
Year released | Type | Maximum macOS version | Maximum MuseScore version |
---|---|---|---|
2016+ | MacBook | 12 | 4.x |
2015+ | iMac | 12 | 4.x |
2015+ | MacBook Air, MacBookPro | 12 | 4.x |
2015 | MacBook | 10.11 | 3.6.2 |
2014 | iMac | 11 | 4.x |
2013 | iMac | 10.15 | 4.x |
2013 | MacBook Air, MacBookPro | 11.6 | 4.x |
2012 | MacBook Air, MacBookPro, iMac | 10.15 | 4.x |
2011 | MacBook, MacBook Air, Macbook Pro, iMac | 10.13 | 3.6.2 |
2010 | MacBook, MacBookPro, iMac | 10.13 | 3.6.2 |
2009 | MacBook, MacBookPro, iMac | 10.11 | 3.6.2 |
2008 | MacBookPro, iMac | 10.11 | 3.6.2 |
2008 | MacBook | 10.7 | 2.3.2 |
2007 | MacBookPro, iMac | 10.11 | 3.6.2 |
2007 | MacBook | 10.7 | 2.3.2 |
2006 | MacBook, MacBookPro, iMac | 10.7 | 2.3.2 |
Year released | Windows version | OS vendor supported | Supported until | Maximum MuseScore version |
---|---|---|---|---|
2021 | 11 64-bit | Yes | not announced | 4.x |
2015 | 10 64-bit | Yes | 2025-10-14 | 4.x |
2015 | 10 32-bit | Yes | 2025-10-14 | 3.6.2 |
2013 | 8.1 | Yes | 2023-01-10 | 3.6.2 |
2012 | 8 | No | 2016-01-13 | 3.6.2 |
2009 | 7 | No | 2020-01-14 | 3.6.2 |
2007 | Vista. | No | 2017-04-17 | 2.3.2 |
2001 | XP | No | 2014-04-08 | 2.3.2 |
Since MuseScore 2.0, MuseScore includes 2 synthesizers: One for SF2/SF3 named Fluid and one for SFZ named Zerberus.
Zerberus was first implemented by Werner Schweer in 2013/2014 for MuseScore 2.0 and it was only supposed to play the Salamander Piano SFZ back then. Zerberus has been greatly improved by hpfmn during Google Summer of Code 2016. He documented the supported opcodes, added support for more opcodes, tested it with several free SFZ and even experimented with Disk Streaming
The SFZ format is a plain text format first documented in "Cakewalk Synthesizers: From Presets to Power User" by Simon Cann (Chapter 13). The LinuxSampler project started an open documentation but it's far from complete. Also sfzformat.com has the beginning of the documentation.
An important note : several popular SFZ players added more non documented opcodes. In particular, the Aria Engine (see below) implements several custom opcodes that are popular among SFZ creators.
The original SFZ by RCG audio and SFZ+
Aria Engine is a popular SFZ player engine. It's used in particular in Sforzando a free as in beer player available standalone and as VSTi/AU/RTAS/AAX . The Garritan Orchestra, now owned by MakeMusic, is also powered by the Aria Engine.
Kontakt by Native Instrument can import SFZ files but my (lasconic) understanding is that they are converted to Kontakt proprietary format in order to be played.
Le seguenti pagine riassumono le funzionalità della prossima, imminente, versione di MuseScore. Queste funzioni sono disponibili solo per i test nelle ultime nightly builds .
Premendo con il tasto sinistro del puntatore , e tenendo premuto, sul nome di una tavolozza si apre la sua finestra di dialogo. Sono disponibili diverse opzioni:
Cliccando con il tasto destro del mouse sotto l'elenco delle tavolozze si apre il menu contestuale delle tavolozze. Il menu consente di modificare le loro caratteristiche o riportarle alle impostazioni predefinite.
Nuove funzionalità di MuseScore 2.0 [[nodetitle: Nuove funzionalità di MuseScore 2.0 – Notazione del basso continuo|succ.]]
Attachment | Size |
---|---|
paletteCreate.png | 6.59 KB |
MuseScore would never become the incredible software without the invaluable efforts and insights of our contributors. While many of you know some of our contributors only by nickname, we would like to introduce them so you may know them more personally.
The "founding trio" retired from MuseScore in 2019 and are no longer actively involved in the project.
Former Lead Developer and BDFL
Former CEO and Webmaster
Former CTO and Community Manager
Need to contact the in-house team? If so then you should join MuseScore's Discord Server. Alternatively, you can send a message to our Community Ambassador Peter Jonas (shoogle) via his contact page and he will reply via email.
Product Owner and Lead Designer, since March 2019
Lead Developer, since November 2019
Community Ambassador, developer, designer and accessibility specialist, since February 2021
Product Strategy, since August 2017
Software Architect and CI Engineer, since March 2020
Engraving Expert, since June 2020
UI Designer, since June 2020
UX/UI Designer, since May 2021
UI Developer, since July 2020
UI Developer, since July 2020
Developer, since February 2022
Percussion Specialist & MuseScore Drumline, since September 2019
Product Tester, since October 2020
(Above you see the usual punishment for making really stupid coding mistakes 😉)
What about MuseScore causes you to get engaged?
Joined a choir in November 2009, that choir, founded 1972 as a youth choir (meanwhile the average age is 50), had a pretty large repertoire of songs (mainly modern church music, gospels, Taizé, etc.), quite many as copies of copies of copies... of a bad handwriting or blurred foto, the 'old' members knew them mostly by heart and needed them only to have something to hold on to, or for the odd word in the lyrics, while I needed legible notes and texts. So I started looking for free score writing software on the internet, detected lilypond, found it to complicated, got hold of an illegal copy of a commercial software, found it too complicated and also not right, then found MuseScore, 0.9.5 at the time, immediately became addicted and transcribed my first song with it in February 2010. First and foremost just for myself, but soon it became apparent that it would be useful for other choir members too. Meanwhile I've transcribed far more than 500 scores, plus an entire songbook of some 400 scores.
I came for the software and stayed for the community,
My involvement with MuseScore as a contributor began with answering questions in the forums, translating the software and the handbook and eventually led to code contributions.
What do you like most about MuseScore?
What is your favorite feature of MuseScore 3?
The ability to be able to place lyrics above staff and also to be able to extract voices from a closed score SATB, along with the option to have channels for the voices for rehearsal.
What would you like to see happen with MuseScore in the coming year?
What about MuseScore causes you to get engaged?
Working on MuseScore integrates several different aspects of who I am and what I do - my interests and skills in music, and education, and software. For all my adult life, I have worked in one or more these areas, but never in a way that involves them all so completely.
What do you like most about MuseScore?
The open source nature of MuseScore is what got me involved, and I probably wouldn't have switched over to it from what I was using before otherwise. The sense of community that results is also very gratifying. But in day-to-day use of the application, it's the combination of simplicity and power that I appreciate most.
What is your favorite feature of MuseScore 3?
Automatic placement for sure. I have to admit I was skeptical at first and figured there would be many cases where I disagreed with its decisions and that it would make it more difficult to get the results I wanted. The reality is, it's usually doing something very sensible, and it's easy to override it when I want. I know that this feature will save me much time on everything from initial entry of music to editing parts to creating transposed lead sheets.
What would you like to see happen with MuseScore in the coming year?
I want to see us make a major outreach to schools. We know students are already choosing MuseScore for their own work, and now their teachers are beginning to see the value in supporting their students in this. I also want to see us do everything we can to improve our accessibility story and finally become a viable choice for blind musicians.
What about MuseScore causes you to get engaged?
After years of playing in lots of bands around Atlanta, I'd get frustrated with bandleaders not providing good charts (and if they did have charts they'd be unlegible handwritten charts, or might not be transposed to my saxophone key). Their excuses for not making a chart were that they couldn't afford notation software, or that the existing software was too complicated. I personally didn't like wasting time in rehearsal dealing with reading bad charts or trying to remember the songs from memory, so I'd often become the scribe who notated the charts for them. I've been using MuseScore since ~2010 for this, which I chose because I'm a Linux user (and even though version 0.9.6 was limited, it was better than any other notation editor on Linux). I started fixing MuseScore bugs in 2015 to help contribute back to the open-source community, and because I want more people around the world to be able to more easily make music. Every time I hear or play with other musicians who wrote their scores in musescore, I feel happy that I indirectly helped them, even if it was as minor as them not experiencing a trivial glitch.
What do you like most about MuseScore?
ericfont: It's open-source, cross-platform, multi-lingual, free, and relatively easy to use. That allows anyone around the world with any amount of money to make any score, big or small, on any computer, and easily share their scores online.
What is your favorite feature of MuseScore 3?
ericfont: The faster rendering engine speed which facilitates writing larger scores. Previously in MuseScore 2, when I'd write a very large score (many-instrument, multiple movements), I'd have to wait a noticable delay after every input was visible on the screen. That was because MuseScore had to re-render the entire score for every minor edit. But with MuseScore 3, the rendering engine is smart to know that it only has to re-render measures affected by each individual edit.
What would you like to see happen with MuseScore in the coming year?
ericfont: I'd like to be able to use real instruments as input, such as by incorporating a real-time audio-to-midi tool. And to input by playing in free-form (including with both hands on a piano), and have the raw unquantized midi be displayed in realtime on a piano roll alongside MuseScore's real-time notation guess (with barlines synced up), along with ways to help to notation translation interpret the input. Also a way to link MuseScore with external DAW programs (like Ardour) so I can record real audio tracks that are lined up and linked to their notation. Also an integrated assistant for transcribing recorded audio.
What about MuseScore causes you to get engaged?
My engagement level spikes every time there's some vigorous debate about a development decision. 😉 In all seriousness, the ability for users to directly communicate with the core developers, and have their thoughts seriously taken into account, is what first hooked me in back during the 2.0 Beta period. (I wrote a blog post about this a couple of years ago). Every polished release comes out of people's sweat and tears behind the scenes, and I get to be a part of it—how cool is that?
What do you like most about MuseScore?
Its kindness. It makes music creation possible for everyone, with no strings attached. When Ultimate Guitar took over development, I feared the commercial web platform would be more forcefully integrated into the libre and gratis desktop software, poisoning MuseScore's beauty. Thankfully, though, the new team simply pushed the kindness forward by giving users even more even faster.
What is your favorite feature of MuseScore 3?
There are two that go hand in hand. First, Automatic Placement (I wish it was still called Smart Layout, but you can't win 'em all)—it's still got plenty of limitations, but it will save me so much time with new projects, and I trust that the layout will continue to get smarter (or, I guess, the placement will continue to get more automatic?). Nearly as important is the Sparkle integration—that means there can be more improvements one after another as never before, because with a built-in updater there can be frequent releases without users having to continually install new versions.
What would you like to see happen with MuseScore in the coming year?
Smarter layout, as I mentioned—collision avoidance, alignment, default placement of various elements. The new Dorico program is already the gold standard for beautiful scores without adjustments needed; we certainly have what it takes to match that, if we put our minds to it. For myself, I want to finally study the Qt framework so I can undertake some design improvements, while continuing to work on my C++ skills, and hopefully come up with a Google Summer of Code project in a few months.
What about MuseScore caused you to get engaged?
I briefly crossed paths with MuseScore (0.9.6) during my college days but hadn't used it for more than a piece or two after which I'd reverted to my usual program back then.
It wasn't until version 2.0.2 that I picked it up again; then as a tool to generate practice mp3s for the choir I took part in. This brought me, as a developer, to dive into the plugin framework to improve an already existing UltraStar plugin. Shortly after I'd gotten a strong itch to easier work with ritenuto's, leading to my very first own plugin: TempoChanges.
During the development of that plugin I got cornered by the limitations and some bugs in the plugin framework. Carefully attempting to address this with the developers on irc (I've had my share of irc-experiences in Open Source before) I was met with much understanding and friendly guidance on how to fix or work around my issues. It is the open and positive attitude in there that made me stick around, answer forum posts and perform the occasional pull request.
What do you like most about MuseScore?
Hmm… That's a hard question. In a single word: passion
Passion from lots of people in the community; be it about music itself, or making this the best possible notation program.
A close second word would be openness
Not only is the software Open Source and gratis, lowering the bar for many musicians into digitizing their scores. Just as much the welcoming open mind of the community and the developers.
What is your favorite feature of MuseScore 3?
The questions aren't getting any easier :)
I think I'll have to pick "tours" then. It's a seemingly small addition, but I have a feeling it'll be instrumental in easing in new users into the MuseScore workflow.
What would you like to see happen with MuseScore in the coming year?
* Plugin Framework
* Playback only on a given repeat (2nd time only f.e.)
* More bugs fixed than introduced :)
* FOSDEM meet-up
What about MuseScore causes you to get engaged?
I've been interested in being able to compose music for some time. After using a few DAWs, I came across MuseScore and was impressed by its ability to express notes using standard staff notation, which I find much easier to read. When I discovered it was open source, that gave me the incentive to begin tweaking things to improve my workflow. Luckily the core devs have agreed with most of my changes.
What do you like most about MuseScore?
I love that it allows you to see your music in standard notation as well as automatically play it back so you can hear the audio. The free price tag and the ability to tinker with the code base are also a huge win.
What is your favorite feature of MuseScore 3?
I have to admit I'm biased toward the new mixer and piano roll editor (two components which I worked on).
What would you like to see happen with MuseScore in the coming year?
Personally, I'd like to see features added that makes it easier to compose within MuseScore and also to improve the audio produced during playback.
What about MuseScore causes you to get engaged?
I feel like I am an important part of something big and exciting with MuseScore. I consider it a privilege to be able to use my time and talent to help the community and to make MuseScore a better and more stable product.
What do you like most about MuseScore?
I like that MuseScore is free, and I really do find it easy to use, given an understanding of the way things work.
What is your favorite feature of MuseScore 3?
I am really excited about Autoupdate and the regularity with which updates will be made available. This has made it possible for MuseScore 3 to be released even while undergoing constant development.
What would you like to see happen with MuseScore in the coming year?
I would like to see MuseScore do more in terms of offering assistance when it comes to fixing corruption that it may find when loading a score. Now that there are no measure numbers in the saved file, it is much harder to edit it manually.
What about MuseScore causes you to get engaged?
After completing 2 GSoC programs, I continued to be engaged by them, trying to improve them for the users and developers (e.g. Timeline Refactoring, tour fixes, workspace fixes). If I ever "finish" them, I'd probably move onto another larger feature and see where that takes me.
What do you like most about MuseScore?
I really like the community. The strong collaborative nature of everyone, as well as the lightheartedness to make jokes keeps me around.
What is your favorite feature of MuseScore 3?
After transcribing some orchestral music on it, I have a strong appreciation for auto placement. It makes creating scores that look decent easy to do without much extra effort.
What would you like to see happen with MuseScore in the coming year?
I'd really like to see the backburner GSoC projects happen. Such as, the scratch pad, completion of auto crash reporting (I believe it was never finished?) and others. While I don't want to bloat the software, these features were asked for multiple times. Hopefully these can roll out in time! 😊
My real name is Jiayi Zheng and I come from China. I joined the MuseScore community after 3.0 was released, so I'm not precisely following the template here :)
I like MuseScore because its powerful tools completely satisfy my needs for music creating & sharing, while being free and having a vibrant and supportive community. I'm especially pleased to see MuseScore being continuously developed till this day, and I'm excited of being among the first people to know of and contribute to upcoming updates. One of my favourite features of MuseScore 4 is the redesigned inspector, to which I contributed and tested. I've devoted much of my time to improving the variety and layout of tremolos, and I'm also looking forward to future engraving improvements, from which I think all of us can benefit.
MuseScore has been my companion for years and the witness of my personal growth, from the major I'm pursuing to the advancement of my musical abilities. I want to thank the in-house team and the community for producing and promoting this wonderful app.
What about MuseScore caused you to get engaged?
When I was playing Clarinet in a baroque orchestra, I had to play any part which was leftover. I ended up in playing mainly Violin II and Viola parts.
After playing a transposing instrument, and especially the alien clefs that the Viola used, I was looking for a music notation program.
As a Linux user for decades, there wasn't much choice, so running an MS-Windows based application using WINE, was doable for a while.
In the meantime, I began writing some small transcriptions/arrangements for another ensemble and thus part generation became more important. Running a Windows-based program was causing more and more problems.
Then I can across MuseScore. It was already running on Linux, so no more MS-Windows! This was at the beginning of MuseScore. Linked parts weren't available yet, and there were other problems but it worked very well for printing. So at this time I usedRoseGarden for making the score and MuseScore
for printing the parts! Then MuseScore became better and better and even linked parts were introduced. That was the moment that I switch over to MuseScore completely and dropped the other programs.
At this time I was also taking early retirement and wanted something to keep me busy. My two strongest interests (apart from partner of course) are music and programming, so I decided to see whether I could contribute to MuseScore. With the help of other contributors, I found my way and started looking at some of the open issues.
My involvement began with solving some minor issues and moved onto larger features, such as automatic score ordering and the vertical adjustment of staves, both introduced in MuseScore 3.6.
What do you like most about MuseScore?
* That it’s OpenSource and runs on all major platforms.
* That it works well for making scores for orchestras and small ensembles.
* Its linked parts are important for my daily use and work well.
* It’s a nice, open and friendly community which is always willing to help!
What is your favorite feature of MuseScore 3?
In fact there are 2 features which are very important for my daily use. These are the automatic placement of elements and the new vertical adjustment of staves. These 2 features result in excellent parts which
require remarkably little fine tuning to make them ready of publish. This is a real time saver for me.
What would you like to see happen with MuseScore in the coming year?
As a matter of fact, I'm quite happy with MuseScore as it is. But there are always bugs to solve. I feel the Voice-to-Part feature could be improved. This makes it is easy to create separate parts from a condensed score. It does work, but is still quite rough around the edges and it still results in some bleeding hands.
What about MuseScore causes you to get engaged?
My job, first. I am a guitar teacher in France, and after failed attempts with the Finale program, I discovered the version 1.3, five and a half years ago. Quickly, I managed to enter some teaching scores. I then knew that I had found "my" notation program, the one where I feel like a fish in the water!
What do I like most about MuseScore?
It is a program that probably corresponds to what I consider my own intuivity. I have never really been blocked by this or that thing. I like its flexibility, its ability to customize its use through the custom workspaces. And when you know the program well, we realize that it has almost no limit.
And finally I discovered an amazing community passionate about music and the program.
What is your favorite feature of MuseScore 3?
I am interested by everything about the repertoire of the guitar , mainly . And so it goes from the Renaissance period (lute and renaissance guitar), through the Baroque period, until classical and contemporary periods. Every day, I use tablature functions for early music, to make guitar transcriptions.
What would you like to see happen with MuseScore in the coming year?
First wish him the best for the year and the years to come ! Personally, I would like to see implement functions that I use a lot, also daily, but which are for the moment in the state of plugins (I think Double Time / Half Time), or by workarounds extremely time consuming, mainly fingering (a Fingering mode is highly necessary in my opinion), and tablatures/scores for diatonic instruments.
What about MuseScore causes you to get engaged?
Everyone in the forums are great! I do answer my fair share of questions, but I became attached to MuseScore when I saw how kind and helpful other were. I have a love for classical music and a desire to put a few notes to paper I can hear myself. When I discovered version 2.0.3 I realized MuseScore was the answer to this.
What do you like most about MuseScore?
The best thing is that it's free and you get much more than what you pay for. It is a quality program despite my occasional rants. Every user also has potential to have input into the final product. If you program you can write code, if you don't then those who do write code listen and attempt to improve the program and satisfy requests from users.
What is your favorite feature of MuseScore 3?
The best feature is the auto avoidance introduced today (Christmas eve 2018) in version 3.0. This makes creating a score many times easier than it was in version 2, and I was quite happy with that version.
What would you like to see happen with MuseScore in the coming year?
I want to see version 3 be capable of annotating standard western music as well as a few of the items that have been discussed at length in the forums. The ideas behind version 3 features are great and I want them to be fully available and functioning properly.
No real release notes, just announcements
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.6.2.548020600, Windows 7+ (x86/64/Portable): 3.6.2.548021803, AppImage: 3.6.2.548021370 (revision: 3224f34) | 2021-02-08 | https://musescore.org/en/3.6.2 |
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.6.1.515739048, Windows 7+ (x86/64/Portable): 3.6.1.515740707, AppImage: 3.6.1.515740129 (revision: d0fc8e9) | 2021-01-27 | https://musescore.org/en/3.6.1 |
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.6.0.487915347, Windows 7+ (x86/64/Portable): 3.6.0.487915773, AppImage: 3.6.0.487916429 (revision: 1977cb3) | 2021-01-15 | https://musescore.org/en/3.6 |
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.6.0.451381598, Windows 7+ (x86/64/Portable): 3.6.0.451380634, AppImage: 3.6.0.451381076 (revision: 10dee08) | 2020-12-29 | https://musescore.org/en/3.6rc |
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.6.0.423677068, Windows 7+ (x86/64/Portable): 3.6.0.423676596, AppImage: 3.6.0.423675897 (revision: 2cbee43) | 2020-12-15 | https://musescore.org/en/3.6beta |
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.5.2.312126096, Windows 7+ (x86/64/Portable): 3.5.2.311459983, AppImage: 3.5.2.312125617 (revision: 465e7b6) | 2020-10-16 | https://musescore.org/en/3.5.2 |
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.5.1.297078174, Windows 7+ (x86/64/Portable): 3.5.1.297079288, AppImage: 3.5.1.297078767 (revision: 186bf15) | 2020-10-09 | https://musescore.org/en/3.5.1 |
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.5.0.28537, Windows 7+ (32 and 64-bit): 3.5.0.13199, Linux AppImage: 3.5.0 (revision: 43c5553) | 2020-08-06 | https://musescore.org/en/3.5 |
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.5.0.28145, Windows 7+ (32 and 64-bit): 3.5.0.12799, Linux AppImage: 3.5.0 (revision: fb3c202c) | 2020-07-16 | https://musescore.org/en/3.5rc |
Here is a complete list of all the other issues resolved and improvements made in this update:
smoothPan
ignores repeatsBuild number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.5.0.27580, Windows 7+ (32 and 64-bit): 3.5.0.12237, Linux AppImage: 3.5.0 (revision: b5add95) | 2020-06-10 | https://musescore.org/en/3.5beta |
Here is a complete list of all the other issues resolved and improvements made in this update:
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.5.0.26969, Windows 7+ (32 and 64-bit): 3.5.0.11614, Linux AppImage: 3.5.0 (revision: 1ee2fe3) | 2020-05-06 | https://musescore.org/en/3.5alpha |
Here is a complete list of all the other issues resolved and improvements made in this update:
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.4.2.25137, Windows 7+ (32 and 64-bit): 3.4.2.9788, AppImage: 3.4.2 (revision: 148e43f) | 2020-02-07 | https://musescore.org/en/3.4.2 |
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.4.1.25011, Windows 7+ (32 and 64-bit): 3.4.1.9660, AppImage: 3.4.1 (revision: 20414b2) | 2020-01-25 | https://musescore.org/en/3.4.1 |
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.4.0.24982, Windows 7+ (32 and 64-bit): 3.4.0.9632, AppImage: 3.4.0 (revision: 8effb8d) | 2020-01-24 | https://musescore.org/en/3.4 |
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.4.0.24912, Windows 7+ (32 and 64-bit): 3.4.0.9562, AppImage: 3.4.0 (revision: 716655c) | 2020-01-18 | https://musescore.org/en/3.4rc |
Here is a complete list of the issues resolved and improvements made in this update:
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.4.0.24698, Windows 7+ (32 and 64-bit): 3.4.0.9337, AppImage: 3.4.0. (revision: 684f74e6) | 2019-12-26 | https://musescore.org/en/3.4beta |
Here is a complete list of the issues resolved and improvements implemented in this update:
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.3.4.24412, Windows 7+ (32 and 64-bit): 3.3.4.9066, AppImage: 3.3.4. (revision: 7684abe) | 2019-12-04 | https://musescore.org/en/3.3.4 |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.3.3.24345, Windows 7+ (32 and 64-bit): 3.3.3.8992, AppImage: 3.3.3. (revision: 57d770e) | 2019-11-26 | https://musescore.org/en/3.3.3 |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.3.2.24203, Windows 7+ (32 and 64-bit): 3.3.2.8849, AppImage: 3.3.2. (revision: 492d7ef) | 2019-11-14 | https://musescore.org/en/3.3.2 |
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.3.0.24090, Windows 7+ (32 and 64-bit): 3.3.0.8737, AppImage: 3.3.0. (revision: 4761df6) | 2019-10-31 | https://musescore.org/en/3.3 |
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.3.0.24030, Windows 7+ (32 and 64-bit): 3.3.0.8677, AppImage: 3.3.0. (revision: cf84ff0) | 2019-10-26 | https://musescore.org/en/3.3rc3 |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.3.0.23993, Windows 7+ (32 and 64-bit): 3.3.0.8640, AppImage: 3.3.0. (revision: 399151f) | 2019-10-22 | https://musescore.org/en/3.3rc2 |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.3.0.23833, Windows 7+ (32 and 64-bit): 3.3.0.8479, AppImage: 3.3.0. (revision: d3bff12) | 2019-10-02 | https://musescore.org/en/3.3rc |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.3.0.23686, Windows 7+ (32 and 64-bit): 3.3.0.8331, AppImage: 3.3.0. (revision: b45221c) | 2019-09-17 | https://musescore.org/en/3.3beta2 |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.3.0.23559, Windows 7+ (32 and 64-bit): 3.3.0.8205, AppImage: 3.3.0. (revision: f94c2734) | 2019-08-31 | https://musescore.org/en/3.3beta |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
macOS 10.10+: 3.2.3.22971, Windows 7+ (32 and 64-bit): 3.2.3.7635, AppImage: 3.2.3. (revision: d2d863f) | 2019-07-08 | https://musescore.org/en/3.2.3 |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
macOS 10.12+: 3.2.2.22888, Windows 7+ 64-bit: 3.2.2.7534, Windows 7+ 32-bit: 3.2.2.7534, AppImage: 3.2.2. (revision: c893c61) | 2019-06-30 | https://musescore.org/en/3.2.2 |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
macOS 10.12+: 3.2.1.22851, macOS 10.10/11: 3.2.1.22851, Windows 7+ 64-bit: 3.2.1.7498, Windows 7+ 32-bit: 3.2.1.7498, AppImage: 3.2.1. (revision: 59a887d) | 2019-06-28 | https://musescore.org/en/3.2.1 |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
macOS 10.12+: 3.2.0.22758, Windows 7+ 64-bit: 3.2.0.7410, Windows 7+ 32-bit: 3.2.0.7410, AppImage: 3.2.0. (revision: 8594c8c3) | 2019-06-25 | https://musescore.org/en/3.2 |
Here is a complete list of the issues resolved in this update:
scores
array (not available) and curScore.name
always delivers "Score"Build number | Date | Announcement |
---|---|---|
macOS 10.12+: 3.1.0.22425, Windows 7+ 64-bit: 3.1.0.7078, Windows 7+ 32-bit: 3.1.0.7078, AppImage: 3.1.0. (revision: e26f7c46) | 2019-05-28 | https://musescore.org/en/3.1 |
Complete list of the fixed issues is available in the Beta, Beta Update and Release Candidate release notes:
Plus these:
Fixes for Regressions in 3.1 pre-release versions (as collected in #289565: [Epic] 3.1-RC Regressions that must be fixed):
Build number | Date | Announcement |
---|---|---|
macOS 10.12+: 3.1.0.22357, Windows 7+ 64-bit: 3.1.0.7011, Windows 7+ 32-bit: 3.1.0.7011, AppImage: 3.1.0. (revision: 8b1a7dc4) | 2019-05-23 | https://musescore.org/en/3.1rc |
The scope of the changes in MuseScore 3.1 Release Candidate includes changes mentioned in MuseScore 3.1 Beta and MuseScore 3.1 Beta Update except the following ones:
These will be revisited for a later release.
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
macOS 10.12+: 3.1.0.22068, Windows 7+ 64-bit: 3.1.0.6721, Windows 7+ 32-bit: 3.1.0.6721, AppImage: 3.1.0. (revision: 1982daf6) | 2019-05-05 | https://musescore.org/en/3.1beta |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
macOS 10.12+: 3.1.0.21781, Windows 7+ 64-bit: 3.1.0.6437, Windows 7+ 32-bit: 3.1.0.6437, AppImage: 3.1.0. (revision: 06f0dddf) | 2019-04-12 | https://musescore.org/en/3.1beta |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
MacOS 10.12+: 3.0.5.21343, Windows 64-bit: 3.0.5.5992, Windows 32-bit: 3.0.5.5992, AppImage: 3.0.5. (revision: 58dd23d) | 2019-03-12 | https://musescore.org/en/3.0.5 |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
MacOS 10.12+: 3.0.4.21117, Windows 64-bit: 3.0.4.5763, Windows 32-bit: 3.0.4.5763, AppImage: 3.0.4. (revision: cda40803) | 2019-02-28 | https://musescore.org/en/3.0.4 |
Build number | Date | Announcement |
---|---|---|
MacOS 10.12+: 3.0.3.21090, Windows 64-bit: 3.0.3.5734, Windows 32-bit: 3.0.3.5734, AppImage: 3.0.3. (revision 5a0be2ac) | 2019-02-26 | https://musescore.org/en/3.0.3 |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
MacOS 10.12+: 3.0.2.20666, Windows 64-bit: 3.0.2.5312, AppImage: 3.0.2. (revision: 8ca4d2c) | 29.01.2019 | https://musescore.org/en/3.0.2 |
Windows 64-bit: 3.0.2.5315 (HotFix for #283046: Changing preferences or workspace leads to error) (revision: a8b90a8) | 30.01.2019 | |
Windows 32-bit package: 3.0.2.XXXX (revision: 8ca4d2c) | XX.XX.2019 | https://musescore.org/en/3.0.2 |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
MacOS 10.12+: 3.0.1.20439, Windows 64-bit: 3.0.1.5087, AppImage: 3.0.1 (revision: 06a66a2) | 15.01.2019 | https://musescore.org/en/3.0.1 |
Windows 32-bit package: 3.0.1.5088 (revision: 06a66a2) | 20.01.2019 | https://musescore.org/en/3.0.1 |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
MacOS 10.12+: 3.0.0.20137, Windows: 3.0.0.4785, AppImage: 3.0.0 (revision: c1a5e4c) | 24.12.2018 | https://musescore.org/en/3.0 |
MuseScore 3.0 was released December 24, 2018.
MuseScore 3.0 is packed full of new features and improvements.
Build number | Date | Announcement |
---|---|---|
MacOS 10.12+: 3.0.0.20100, Windows: 3.0.0.4747, AppImage: 3.0.0 (revision: 96c1f7b) | 22.12.2018 | https://musescore.org/en/3.0rc |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
MacOS 10.12+: 3.0.0.19874, Windows: 3.0.0.4516, AppImage: 3.0.0 (revision: 59a11cd) | 14.12.2018 | https://musescore.org/en/3.0beta3 |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
MacOS 10.10+: 3.0.0.19782 (revision: 1f7a1f8) | 11.12.2018 |
The recent version of Qt doesn't support MacOS versions lower than 10.12. We built the package with the previous LTS version of the Qt and made MuseScore 3 available for MacOS 10.10+ versions, too. Btw, this package worked incorrectly and crashed all the time. This update fixes the reason of the crash:
Build number | Date | Announcement |
---|---|---|
MacOS 10.12+: 3.0.0.19686, Windows: 3.0.0.4328, AppImage: 3.0.0 (revision: 2b25396) | 07.12.2018 | https://musescore.org/en/3.0beta2 |
MacOS 10.7-10.11: 3.0.0.19704 (revision: e96bb91) | 08.12.2018 | https://musescore.org/en/3.0beta2 |
Here is a complete list of the issues resolved in this update:
Build number | Date | Announcement |
---|---|---|
MacOS: 3.0.0.19499, Windows: 3.0.0.4133, AppImage: 3.0.0 (revision: 0526317) | 03.12.2018 |
Build number | Date | Announcement |
---|---|---|
MacOS: 3.0.0.19385, Windows: 3.0.0.4020, AppImage: 3.0.0 (revision: 7694abc) | 28.11.2018 | https://musescore.org/en/3.0beta |
As a major new release, MuseScore 3 contains some very significant and exciting new features and improvements over MuseScore 2.3.2 and older versions:
A brand new autoupdate engine has been developed and included in MuseScore 3 Beta. Keeping up to date with new releases no longer requires you to manually go find and download them. Just let the autoupdater handle downloading and installing of the new version for you! Receiving our latest bugfixes and features has never been easier.
Note, the autoupdater uses your OS locale which means that the language of the autoupdater interface will always be the same to your OS language.
After the release of MuseScore 2.3.1 on July 6th 2018, we found a couple of regressions that we addressed in MuseScore 2.3.2, released on July 31st 2018. We also updated all languages to latest translations.
See also the Release notes for MuseScore 2.3.1 and MuseScore 2.3.
After the release of MuseScore 2.3 on June 29th 2018, we found a couple of regressions that we addressed in MuseScore 2.3.1 released on July 6th 2018. We also updated all languages to latest translations.
See also the Release notes for MuseScore 2.3.
MuseScore 2.3 was released June 29, 2018.
Thank you to everyone who contributed to this release, and a special shout-out to the five new contributors:
After the release of MuseScore 2.2 on March 27th 2018, we found a couple of regressions that we addressed in MuseScore 2.2.1 released on April 3rd 2018. We also updated all languages to latest translations.
See also the Release notes for MuseScore 2.2.
MuseScore 2.2 was released March 27, 2018.
Improvements to the handling of voltas and repeats come with some compatibility issues. Where 2.1 and before required the repeat list of a volta to be set to the nth time that measure/volta is encountered (against intuition and against the existing voltas from the palette), 2.2 now requires the repeat list to reflect the human-readable logic of being the n th repeat in total. In consequence, some files created in 2.1 and before might be played with a different roadmap, especially if there are more than 2 voltas to a given repeat. It can be fixed by editing the volta's repeat list in Volta Properties (accessed via secondary-click).
In short, 2.2 now behaves like earlier versions should have behaved and workarounds employed in older version to get the playback right are no longer needed (and will need to be reverted).
In 2.2, jumps have a new property, "With repeats," which if enabled causes playback to take repeats. Using this new feature in a score does not bar you from also editing that score using previous versions of MuseScore 2, but obviously those versions do not support this feature, either in playback or in saving files.
MuseScore 2.2 comes with a slightly different SoundFont called MuseScore_General.sf3, so your scores might sound a little bit different (hopefully better!). If you have saved custom synthesizer settings in a given score or as a new default, if those settings contain a reference to the old FluidR3Mono_GM.sf3, you might need to manually update those settings. For most users, the change to FluidR3Mono_GM should be automatic, seamless, and barely noticeable. If you have previously uploaded a score to MuseScore.com using the default playback and would like to get the new sounds, simply update your score.
See also Incompatibilities between 2.1 and previous versions, which also apply between MuseScore 2.2 and versions before 2.1.
Thank you to everyone who contributed to this release, and a special shout-out to the 15 new contributors:
MuseScore 2.1 was released May 2, 2017.
We have a new option in Staff Properties for tablature staves to allow fingerings in tablature. If this option is activated in 2.1, fingerings can be added to fret numbers, and fingerings attached to linked staves will be displayed in the tab staff. A file created with MuseScore 2.1 with this option activated will not show fingerings if opened with MuseScore 2.0.
The text style for dynamics (which is used to automatically format text added to a dynamic, such as "sub.") is now italic by default. If a score created with MuseScore 2.1 using this style is opened in MuseScore 2.0, 2.0 will render the text without italics. If a score made in 2.0 has default, non-italic, text added to a dynamic, it will be displayed in italics in MuseScore 2.1.
In MuseScore 2.0, the Instrument Change element allows you to change the sound for a staff mid-score, but the transposition is not handled correctly, nor does the change affect linked parts. This leads to scores that play back incorrectly if they display correctly, or display incorrectly if they play back correctly—or that do both incorrectly. For MuseScore 2.1, this is fixed—Instrument Change elements added to scores using MuseScore 2.1 will now transpose and affect linked parts correctly. A file that contains transposing Instrument Change elements created with MuseScore 2.0 will not automatically be fixed by opening it in MuseScore 2.1—it will continue to behave incorrectly with respect to either display or playback or both. However, if you remove the Instrument Change elements, correct any remaining errors, and re-add the Instrument Change elements using MuseScore 2.1, it should behave correctly for both display and playback. On the other hand, a score with transposing Instrument Change elements that works correctly in in MuseScore 2.1 will not continue to work correctly if opened with MuseScore 2.0. In general, the playback will be correct, but the display will be transposed incorrectly.
Historical tablature support, particularly for lute, has been greatly improved and it comes with incompatibilities with MuseScore 2.0. Tablature scores from 2.0 should be mostly fine opened in 2.1; the only exception is that "10" will be replaced by "X" both in fret numbers and in string ordinals (needs clarifying—10 in standard tab is still 10), but opening a 2.1 file in 2.0 will cause severe issues if the score uses these new tablature styles.
Multimeasure rests now automatically break on both sides of a measure with a fermata. If a score created in 2.0 has a multimeasure rest with a fermata hidden somewhere inside of it, when opening that score with 2.1 the multimeasure rest will be broken. If the user already manually broke the multimeasure rest to expose the fermata in 2.0, there will be no change opening it in 2.1. On the flip side, if a score is created in 2.1 with multimeasure rests automatically broken by fermatas, and then that score is opened and printed from 2.0, the fermatas won't appear.
Courtesy accidentals added to a note tied to the previous measure will display in 2.1 but will not display in 2.0. Both versions will play this correctly.
A problem with the playback of the Tenor Drums instrument was discovered after the release. These had no playback at all prior to MuseScore version 2.0.3; in 2.1, the drum 4 and spock drums do not play, either in scores created with previous versions of MuseScore or in scores newly created with 2.1. This can be fixed in either of two ways:
Thank you to everyone who contributed to this release, and a special shout-out to the 20 new contributors:
MuseScore 2.0.3 was released April 6, 2016.
See also playback bugs fixed below.
In order to make MuseScore files more compatible from one OS to an other, MuseScore 2.0.3 now ships the same version of FreeType for all operating systems. FreeType is the library which helps MuseScore to find out about the width of a notehead, for example. All the score elements metrics (but not the text) are now given by the same FreeType library. That should improve consistency across operating systems (i.e., a given score should be rendered the same on any OS with 2.0.3), but it also means that some scores might be rendered slightly differently than in 2.0.2.
Slurs from one note with a stem to another note with an opposite stem are placed better in 2.0.3. Therefore, any manual adjustment to slurs in this configuration made in previous 2.0.x will look different in 2.0.3.
MuseScore 2.0.3 adds cresc. and dim. dashed lines. Previous 2.0.x versions do not support this feature, and will display these lines as regular, solid hairpins. If a given score is then saved with an earlier 2.0.x and re-opened in 2.0.3, 2.0.3 will attempt to re-create the original dashed text line, but only with the default text and text properties—any changes from the defaults will be lost in this process.
MuseScore 2.0.2 was released July 16, 2015.
#69161: [GP] Issue with barlines in Bass parts
#45221: Layout changes after action
#32886: In Continuous View, the last visible measure is moved under the continuous panel
#68131: Stave properties window cannot be resized (and default size needs to be "minimum")
#37346: Can't enable Pan roll during playback
#68041: Zoom to 100% command (and shortcut)
#68331: Lines other than ottavas should not start at accidental
#68466: Lines in empty measures change length on toggling multimeasure rests
#63176: Note input cursor glitches for voice >1 when advancing into gaps
#68956: Barlines disappear in one-line drum staff when reducing span - new when hiding/unhiding staves
#68921: Reordering instruments within barline spans creates "custom" barlines that won't extend properly
#41786: Bar lines too short in tablature after amending linked (or not) staves.
#68946: metatag $n in PDF of parts+score should be constant equal to total number of pages, not cumulatively increasing with each part
#60791: A time signature change deletes all voices >1 in Tab staff with linked staves
#67516: Add traditional Ped / * line to Advanced palette
#67621: Repeat dots show on hidden / empty staves for multi-staff instruments
#65996: Creating joined score with less instruments/staves in subsequent scores vs. the first yields corrupt score
#67031: Copying measure with gliss spanning into next bar copies gliss but doesn't display it
#67836: Transposition of score by key gets incorrect interval if first stave is unpitched
#60491: Frames can be set to have 0sp height or width, but this is not saved
#66576: Opening a score createted via "Save selection" of a linked staff causes a crash
#66321: Some default bends type are badly displayed
#59301: Deleting measure with clef change corrupts clef map
#63231: Changing "Actual Measure Duration" under a volta causes crash
#66441: Continue last session plus StartCenter doesn't work
#65786: Crash or loss of data on save/reload on paste to text frame
#54221: Horizontal frame before last measure of system creates crowded layout
#29686: Positioning, angle and length of tremolo between notes incorrect
#45356: manual position of a line (8va, cresc., etc.) not preserved on copy/paste
#66776: "V" shortcut does not affect the ties and slurs which extend on the following system
#64141: Add "Whole note = n" to tempo texts
#65066: Score elements not deselecting after "select all" option
#66826: Key change not displayed at start of system with "Generate key signatures" off
#67026: Parts do not pick up articulation applied with keyboard shortcut
#62091: Musescore crashes when selecting all notes and switch to voice 1
#67001: Crash on opening file with apparently invalid note anchored textline
#66946: Null/Empty/Invalid Jumps should either not interfere with playback or should report error
#58821: Shift+left arrow key from single selecion before multimeasure rest leads to range selection up to end of score
#63961: "Fake" barlines on score missing on some instrumental parts and disappearing completely after a save.
#60871: Adding Time Signature at Clef change ignores new clef while still showing it
#64251: Adding ornament on tablature causes crash
#66076: When entering note too long for measure, tie not created in linked staves/parts
#65861: Copy paste of single chord symbols does not transpose
#65421: straight arpeggio down plays notes in wrong order
#66276: My First Score shifts from A4 to Letter after load in USA (or Canada?)
#66241: Grace note offsets in linked TAB not saved
#66061: A score creation with two instruments and linked staves is corrupted immediatly after entering a note
#65961: Dotted Line to Anchor Text
#65831: Links and manual adjustments to bends not saved
#65116: Metronome is wrong if 4/4 after 2/2 (equivalent time signature)
#65041: Breath marks cause spacing problems with chord symbols
#64961: Drum parts have the same MIDI port
#64911: Repeats display with space when clef is removed
#64861: Linked tablature fret with dot doesn't display bracket
#64856: Accented characters at beginning/end of lyrics ignored with respect to alignment
#64696: [MusicXML] Wrong midi port when exporting Instrument Change
#64506: Repeat measure reports as corrupt when saving online, corrects itself on save / reload
#64266: Fretboard diagrams do not remain attached to staff at the correct location
#64241: D.S. from within repeat bars to a Segno outside crashes on playback
#64206: Repeat Measure sign in one staff of multi-stave inst. causes repeated playback of all staves
#64201: [MusicXML import] corruption caused by whole-measure rests with type whole
#64041: Problem writing -^b9
#63096: Text not kept when moving (cut-paste) an existing rehearsal mark
#63786: Tuplet text style applies only after save and reload
#63711: No naturals appear for change to open/atonal key signature
#63706: Dynamics and Tempo: reset to style in text properties produces a wrong result
#63676: Follow text for tempo should work if the style of the text is changed
#63561: TAB - Modified stem direction - don't work properly
#63481: Symbol lines and symbols ignore small staff size
#63366: Naming new workspace: slash, asterisk, etc. not escaped or filtered; write of workspace file fails
#63081: Crash in repitch mode entering note in voice >1 with no chord/rest at cursor
#62506: [MusicXML import] crash editing The Stolen Child full score.xml
#62236: Apparent corruption on copying a two-note tremolo across a barline
#61476: Corruption reading empty measure with 7/4 actual duration
#61061: Crash when scrolling in panoramic view and mmRest
#60931: Deleting multiline text in frames cause crash
#60891: Split a measure by selecting a rest or note beginning on the first beat causes corruption
#59226: [Musicxml import] crash if notations on rest
#59161: Crash on importing 1.x score with slur without start chord
#63641: Hitting Enter in Page Settings with "OK" button highlighted instead does "Apply to all Parts"
#62961: Double-clicking hairpin in palette with list selection causes X number of hairpins to all be stacked at the exact same position
#62956: Regression in MuseScore 2—clicking note then shift-clicking measure leads to list selection instead of range selection
#62276: Viola da gamba in 2.0 missing pizzicato and tremolo channels
#61106: "Reset Stretch" Does not affect mmrests if more than mmrest is highlighted
#60746: Symbols appear at wrong height for staves > 1
#60651: Fret conflict shouldn't be exported to PDF or printed
#60631: 2.0 nightly - No line number reported in MSCZ XML errors
#60571: Select similar spanners in a range selection doesn't work
#60486: Color of voice selector in Staff Text Properties is not the same than in toolbar
#59766: Stems do not align with DO and TI note head
#59316: Instruments marked invisible should not get shown in the create excerpts dialog
#49246: Some elements duplicated on time sig change
#53081: Respell pitches mode adds note to chord when input is by mouse.
#59861: Tick "stemless" in measure properties for an irregular triplet and dotted notes causes a crash in Tab staff
#59176: crash when running "Add/Remove Line Breaks" against score or part with multi-measure rests turned on
#58971: Changing voice of grace notes creates corrupted score
#58926: Pasting image causes a crash
#59171: Pressing a key in Piano Keyboard window sustains indefinitely (if sound supports it)
#59881: Check "stemless" in Measure Properties works badly in Tab staff
#59821: shift+letter adds note according to current cursor position rather than position of added note
#58796: Bracket and instrument name misaligned to one-line staff
#57261: multi-notes tremolo not played back correctly
#50011: Continuous View—part names overlap
#43181: First instrument names misplaced in continuous view when barlines are joined
MuseScore 2.0.1 was released May 5, 2015.
Fix #53261: Crash when playing with lead-in in a score with repeats
Update FluidR3 SoundFont to last version
MuseScore 2.0 was released March 23, 2015.
MuseScore 2.0 is packed full of new features and improvements.
MuseScore 1.3 was released February 28, 2013.
MuseScore 1.3 is mainly a bug fix release. Two bugs causing a major nuisance and a dozen of smaller ones have been fixed. No new features have been added. The translations and the handbooks have been updated.
MuseScore 1.3 is packaged with Qt 4.8.4 on Windows and Mac OS X.
MuseScore 1.2 was released March 14, 2012.
The focus of MuseScore 1.2 is stability, by reducing bugs. Only a very limited set of new features have been added. Translations and the handbooks have been updated. Estonian and Belarusian have been added.
MuseScore Connect has been updated.
On Mac, MuseScore 1.2 is released in binary form only for Mac OS X 10.6+ running an Intel processor.
41g-PartNoId.xml
causes crash41h-TooManyParts.xml
causes crash46a-Barlines.xml
: unexpected multi-measure rests45e-Repeats-Nested-Alternatives.xml
: repeat start missing32a-Notations.xml
: missing notations01f-Pitches-ParenthesizedMicrotoneAccidentals.xml
imports without microtone accidentals01e-Pitches-ParenthesizedAccidentals.xml
imports without double flat in parentheses41d-StaffGroups-Nested.xml
: part-group symbol=line not supported23a-Tuplets.xml
02a-Rests-Durations.xml
MuseScore 1.1 was released July 27, 2011.
MuseScore 1.1 is a bug fix release. The focus of this release was stability by reducing bugs, only a very limited set of new features were added. Several new translations were added.
MuseScore 1.0 was released February 4, 2011.
MuseScore 1.0 builds further on the foundation of MuseScore 0.9.6 and the 3 bug fix releases released since June 2010. The focus of this release was stability by reducing bugs, only a very limited set of new features were added. Several new translations were added.
Release announcment for MuseScore 0.9.6 (the release notes seem to have gotten lost)
MuseScore 0.9.6.3 was released September 21, 2010.
MuseScore 0.9.6.3 is a bug-fix release that corrects more than a dozen problems, mostly critical. There are no new features in 0.9.6.3 compared to 0.9.6. Below is a full list of the corrections.
MuseScore 0.9.6.2 was released August 16, 2010.
MuseScore 0.9.6.2 is a bugfix release including 12 bugfixes mainly critical ones. There are no new features in 0.9.6.2 compared to 0.9.6. You can read the details of the bugfixes below.
MuseScore 0.9.6.1 was released July 12, 2010.
MuseScore 0.9.6.1 is mainly a bugfix release including almost 40 bugfixes. There are no new features in 0.9.6.1 compared to 0.9.6. You can read the details of the bugfixes below.