@@ -21,7 +21,12 @@ MuseScore {
21
21
description: " Harmonica Tab plugin"
22
22
menuPath: " Plugins.Harmonica Tablature"
23
23
pluginType: " dialog"
24
-
24
+
25
+ // ------ OPTIONS -------
26
+ property string sep : " \n " // change to "," if you want tabs horizontally
27
+ property string bendChar : " b" // change to "'" if you want bend to be noted with a '
28
+ // ------ OPTIONS -------
29
+
25
30
id: window
26
31
width: 280
27
32
height: 180
@@ -32,7 +37,7 @@ MuseScore {
32
37
anchors .left : parent .left
33
38
anchors .right : parent .right
34
39
height: 90
35
-
40
+
36
41
ComboBox {
37
42
currentIndex: 17
38
43
model: ListModel {
@@ -128,74 +133,74 @@ MuseScore {
128
133
text: " Close"
129
134
onClicked: { Qt .quit () }
130
135
}
131
-
136
+
132
137
}
133
-
138
+
134
139
function tabNotes (notes , text ) {
135
-
140
+
136
141
var richter = [" +1" , " -1b" , " -1" , " +1o" , " +2" , " -2bb" , " -2b" , " -2" , " -3bbb" , " -3bb" , " -3b" , " -3" ,
137
142
" +4" , " -4b" , " -4" , " +4o" , " +5" , " -5" , " +5o" , " +6" , " -6b" , " -6" , " +6o" , " -7" ,
138
143
" +7" , " -7o" , " -8" , " +8b" , " +8" , " -9" , " +9b" , " +9" , " -9o" , " -10" , " +10bb" , " +10b" ,
139
144
" +10" , " -10o" ]; // Standard Richter tuning with overbends
140
-
145
+
141
146
var richterValved = [" +1" , " -1b" , " -1" , " +2b" , " +2" , " -2bb" , " -2b" , " -2" , " -3bbb" , " -3bb" , " -3b" , " -3" ,
142
147
" +4" , " -4b" , " -4" , " +5b" , " +5" , " -5" , " +6b" , " +6" , " -6b" , " -6" , " -7b" , " -7" ,
143
148
" +7" , " -8b" , " -8" , " +8b" , " +8" , " -9" , " +9b" , " +9" , " -10b" , " -10" , " +10bb" , " +10b" ,
144
149
" +10" ];
145
150
richterValved[- 2 ] = " +1bb" ; richterValved[- 1 ] = " +1b" ; // Two notes below the key at blow 1
146
-
151
+
147
152
var paddyRichter = [" +1" , " -1b" , " -1" , " +2b" , " +2" , " -2bb" , " -2b" , " -2" , " +3b" , " +3" , " -3b" , " -3" ,
148
153
" +4" , " -4b" , " -4" , " +5b" , " +5" , " -5" , " +6b" , " +6" , " -6b" , " -6" , " -7b" , " -7" ,
149
154
" +7" , " -8b" , " -8" , " +8b" , " +8" , " -9" , " +9b" , " +9" , " -10b" , " -10" , " +10bb" , " +10b" ,
150
155
" +10" ];
151
156
paddyRichter[- 2 ] = " +1bb" ; paddyRichter[- 1 ] = " +1b" ; // Two notes below the key at blow 1
152
157
// Brendan Power's tuning, half valved
153
-
158
+
154
159
var country = [" +1" , " -1b" , " -1" , " +1o" , " +2" , " -2bb" , " -2b" , " -2" , " -3bbb" , " -3bb" , " -3b" , " -3" ,
155
160
" +4" , " -4b" , " -4" , " +4o" , " +5" , " -5b" , " -5" , " +6" , " -6b" , " -6" , " +6o" , " -7" ,
156
161
" +7" , " -7o" , " -8" , " +8b" , " +8" , " -9" , " +9b" , " +9" , " -9o" , " -10" , " +10bb" , " +10b" ,
157
162
" +10" , " -10o" ];
158
-
163
+
159
164
var standardChromatic = [" +1" , ' +1s' , " -1" , " -1s" , " +2" , " -2" , " -2s" , " +3" , " +3s" , " -3" , " -3s" ," -4" ,
160
165
" +4" , " +4s" , " -5" , " -5s" , " +6" , " -6" , " -6s" , " +7" , " +7s" , " -7" , " -7s" , " -8" ,
161
166
" +8" , " +8s" , " -9" , " -9s" , " +10" , " -10" , " -10s" , " +11" , " +11s" , " -11" , " -11s" , " -12" ,
162
167
" +12" , " +12s" , " -12" , " -12s" ];
163
-
168
+
164
169
var zirkValved = [" +1" , " -1b" , " -1" , " +2b" , " +2" , " -2" , " +3b" , " +3" , " -3b" , " -3" , " +4" , " -4b" ,
165
170
" -4" , " +5b" , " +5" , " -5b" , " -5" , " +6" , " -6b" , " -6" , " +7b" , " +7" , " -7" , " +8b" ,
166
171
" +8" , " -8b" , " -8" , " +9b" , " +9" , " -9" , " 10b" , " +10" , " -10b" , " -10" ]; // Circular/Spiral tuned diatonic
167
172
// Key per Seydel "G"on blow 1, C major at draw 2, A minor at draw 1
168
-
173
+
169
174
var trueChrom = [" +1" , " -1b" , " -1" , " +2" , " -2b" , " -2" , " +3b" , " +3" , " -3b" , " -3" , " +4" , " -4b" ,
170
175
" -4" , " +5b" , " +5" , " -5b" , " -5" , " +6" , " -6b" , " -6" , " +7b" , " +7" , " -7b" , " -7" ,
171
176
" +8" , " -8b" , " -8" , " +9b" , " +9" , " -9b" , " -9" , " +10" , " -10b" , " -10" ]; // True Chromatic diatonic, valves
172
- // Another side of the spiral logic is expanded in the “True Chromatic” tuning, designed by Eugene Ivanov.
173
- // All chords can be arranged in a continuous, looped progression on major and minor triads:
177
+ // Another side of the spiral logic is expanded in the “True Chromatic” tuning, designed by Eugene Ivanov.
178
+ // All chords can be arranged in a continuous, looped progression on major and minor triads:
174
179
// C Eb G Bb D F A C E G B D Gb A Db E Ab B Eb Gb Bb Db F Ab C (and looped on C minor after that).
175
-
180
+
176
181
var naturalMinor = [" +1" , " -1b" , " -1" , " +2" , " -2bbb" , " -2bb" , " -2b" , " -2" , " -3bb" , " -3b" , " -3" , " +3o" ,
177
182
" +4" , " -4b" , " -4" , " +5" , " -5b" , " -5" , " +5o" , " +6" , " -6b" , " -6" , " -7" , " +7b" ,
178
183
" +7" , " -7o" , " -8" , " +8" , " -8o" , " -9" , " +9b" , " +9" , " -9o" , " -10" , " +10bb" , " +10b" ,
179
184
" +10" , " -10o" ]; // Labeled by blow 1 like Hohner. Seydel and Lee Okar labels by draw 2
180
-
185
+
181
186
var melodyMaker = [ , , , , , // label by draw 2
182
187
" +1" , " -1b" , " -1" , " +1o" ," +2" , " -2bb" ," -2b" , " -2" , " +2o" , " +3" , " -3b" , " -3" ,
183
188
" +4" , " -4b" , " -4" , " +4o" , " +5" , " -5b" , " -5" , " +6" , " -6b" , " -6" , " +6o" , " -7" ,
184
189
" +7" , " -7o" , " -8" , " +8b" , " +8" , " -8o" , " -9" , " +9" , " -9o" , " -10" , " +10bb" , " +10b" ,
185
- " +10" , " -10o" ];
186
-
190
+ " +10" , " -10o" ];
191
+
187
192
var spiral_b1 = [" +1" , " -1b" , " -1" , " +2b" , " +2" , " -2" , " +3b" , " +3" , " -3b" , " -3" , " +4b" , " +4" ,
188
193
" -4" , " +5b" , " +5" , " -5b" , " -5" , " +6" , " -6b" , " -6" , " +7b" , " +7b" , " -7" , " -7" ,
189
194
" +8" , " -8b" , " -8" , " +9b" , " +9" , " -9" , " +10b" , " +10" , " -10b" , " -10" ]; // Circular/Spiral tuned diatonic
190
195
// Inversed for Blow 1. Key of C major scale starts at blow 1
191
-
196
+
192
197
var powerBender = [" +1" , " -1b" , " -1" , " +2b" , " +2" , " -2bb" , " -2b" , " -2" , " -3bbb" , " -3bb" , " -3b" , " -3" ,
193
198
" +4" , " -4b" , " -4" , " -5b" , " -5" , " +6" , " -6b" , " -6" , " +7b" , " +7" , " -7b" , " -7" ,
194
199
" +8" , " -8b" , " -8" , " +9b" , " +9" , " -9bb" , " -9b" , " -9" , " +10b" , " +10" , " -10bb" , " -10b" ,
195
200
" -10" ];
196
201
powerBender[- 2 ] = " +1bb" ; powerBender[- 1 ] = " +1b" ; // Two notes below the key at blow 1
197
202
// Brendan Power's tuning, half valved
198
-
203
+
199
204
var powerDraw = [" +1" , " -1b" , " -1" , " +2b" , " +2" , " -2bb" , " -2b" , " -2" , " -3bbb" , " -3bb" , " -3b" , " -3" ,
200
205
" +4" , " -4b" , " -4" , " +5b" , " +5" , " -5" , " +6b" , " +6" , " -6b" , " -6" , " -7b" , " -7" ,
201
206
" +8" , " -8b" , " -8" , " +9b" , " +9" , " -9bb" , " -9b" , " -9" , " +10b" , " +10" , " -10bb" , " -10b" ,
@@ -219,24 +224,28 @@ MuseScore {
219
224
case 12 : tuning = powerDraw; break ;
220
225
default : tuning = richter; break ;
221
226
}
222
-
227
+
223
228
var harpkey = keylist .key
224
- console .log (" harpkey set to " + keylist .key )
225
-
229
+ console .log (" harpkey set to " + keylist .key )
230
+
226
231
for (var i = 0 ; i < notes .length ; i++ ) {
227
- var sep = " \n " ; // change to "," if you want them horizontally
232
+
228
233
if ( i > 0 )
229
234
text .text = sep + text .text ;
230
-
235
+
231
236
if (typeof notes[i].pitch === " undefined" ) // just in case
232
237
return
233
- if (typeof tuning[notes[i].pitch - harpkey] === " undefined" )
234
- text .text = " X" ;
235
- else
236
- text .text = tuning[notes[i].pitch - harpkey] + text .text ;
238
+ var tab = tuning[notes[i].pitch - harpkey];
239
+ if (typeof tab === " undefined" )
240
+ text .text = " X" ;
241
+ else {
242
+ if (bendChar !== " b" )
243
+ tab = tab .replace (/ b/ g , bendChar);
244
+ text .text = tab + text .text ;
245
+ }
237
246
}
238
247
}
239
-
248
+
240
249
function applyToSelection (func ) {
241
250
if (typeof curScore === ' undefined' )
242
251
Qt .quit ();
@@ -267,20 +276,20 @@ MuseScore {
267
276
endStaff = cursor .staffIdx ;
268
277
}
269
278
console .log (startStaff + " - " + endStaff + " - " + endTick)
270
-
279
+
271
280
for (var staff = startStaff; staff <= endStaff; staff++ ) {
272
281
for (var voice = 0 ; voice < 4 ; voice++ ) {
273
282
cursor .rewind (1 ); // beginning of selection
274
283
cursor .voice = voice;
275
284
cursor .staffIdx = staff;
276
-
285
+
277
286
if (fullScore) // no selection
278
287
cursor .rewind (0 ); // beginning of score
279
-
288
+
280
289
while (cursor .segment && (fullScore || cursor .tick < endTick)) {
281
290
if (cursor .element && cursor .element .type == Element .CHORD ) {
282
291
var text = newElement (Element .STAFF_TEXT );
283
-
292
+
284
293
var graceChords = cursor .element .graceNotes ;
285
294
for (var i = 0 ; i < graceChords .length ; i++ ) {
286
295
// iterate through all grace chords
@@ -294,11 +303,11 @@ MuseScore {
294
303
// new text for next element
295
304
text = newElement (Element .STAFF_TEXT );
296
305
}
297
-
306
+
298
307
var notes = cursor .element .notes ;
299
308
tabNotes (notes, text);
300
309
text .pos .y = textposition;
301
-
310
+
302
311
if ((voice == 0 ) && (notes[0 ].pitch > 83 ))
303
312
text .pos .x = 1 ;
304
313
cursor .add (text);
@@ -309,13 +318,13 @@ MuseScore {
309
318
} // end for staff
310
319
Qt .quit ();
311
320
} // end applyToSelection()
312
-
321
+
313
322
function apply () {
314
323
curScore .startCmd ()
315
324
applyToSelection (tabNotes)
316
- curScore .endCmd ()
325
+ curScore .endCmd ()
317
326
}
318
-
327
+
319
328
onRun: {
320
329
if (typeof curScore === ' undefined' )
321
330
Qt .quit ();
0 commit comments