-
Notifications
You must be signed in to change notification settings - Fork 2.6k
/
colornotes.qml
131 lines (117 loc) · 5.26 KB
/
colornotes.qml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
//=============================================================================
// MuseScore
// Music Composition & Notation
//
// Copyright (C) 2012 Werner Schweer
// Copyright (C) 2013-2017 Nicolas Froment, Joachim Schmitz
// Copyright (C) 2014 Jörn Eichler
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2
// as published by the Free Software Foundation and appearing in
// the file LICENCE.GPL
//=============================================================================
import QtQuick 2.2
import MuseScore 3.0
MuseScore {
version: "3.0"
description: qsTr("This plugin colors notes in the selection depending on their pitch as per the Boomwhackers convention")
menuPath: "Plugins.Notes.Color Notes"
property variant colors : [ // "#rrggbb" with rr, gg, and bb being the hex values for red, green, and blue, respectively
"#e21c48", // C
"#f26622", // C#/Db
"#f99d1c", // D
"#ffcc33", // D#/Eb
"#fff32b", // E
"#bcd85f", // F
"#62bc47", // F#/Gb
"#009c95", // G
"#0071bb", // G#/Ab
"#5e50a1", // A
"#8d5ba6", // A#/Bb
"#cf3e96" // B
]
property string black : "#000000"
// Apply the given function to all notes in selection
// or, if nothing is selected, in the entire score
function applyToNotesInSelection(func) {
var cursor = curScore.newCursor();
cursor.rewind(1);
var startStaff;
var endStaff;
var endTick;
var fullScore = false;
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.
// rewind(2) goes behind the last segment (where
// there's none) and sets tick=0
endTick = curScore.lastSegment.tick + 1;
} else {
endTick = cursor.tick;
}
endStaff = cursor.staffIdx;
}
console.log(startStaff + " - " + endStaff + " - " + endTick)
for (var staff = startStaff; staff <= endStaff; staff++) {
for (var voice = 0; voice < 4; voice++) {
cursor.rewind(1); // sets voice to 0
cursor.voice = voice; //voice has to be set after goTo
cursor.staffIdx = staff;
if (fullScore)
cursor.rewind(0) // if no selection, beginning of score
while (cursor.segment() && (fullScore || cursor.tick < endTick)) {
if (cursor.element() && cursor.element().type === Ms.CHORD) {
var graceChords = cursor.element().graceNotes;
for (var i = 0; i < graceChords.length; i++) {
// iterate through all grace chords
var graceNotes = graceChords[i].notes;
for (var j = 0; j < graceNotes.length; j++)
func(graceNotes[j]);
}
var notes = cursor.element().notes;
for (var k = 0; k < notes.length; k++) {
var note = notes[k];
func(note);
}
}
cursor.next();
}
}
}
}
function colorNote(note) {
if (note.get("color") === black)
note.set("color", colors[note.pitch % 12]);
else
note.set("color", black);
if (note.accidental) {
//if (note.accidental.get("color") === black)
//note.accidental.set("color", colors[note.pitch % 12]);
//else
note.accidental.set("color", black);
}
for (var i = 0; i < note.dots.length; i++) {
if (note.dots[i]) {
//if (note.dots[i].get("color") === black)
//note.dots[i].set("color", colors[note.pitch % 12]);
//else
note.dots[i].set("color", black);
}
}
}
onRun: {
console.log("hello colornotes");
if (typeof curScore === 'undefined')
Qt.quit();
applyToNotesInSelection(colorNote)
Qt.quit();
}
}