( ⇒ 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