Skip to content

Commit 39a13f2

Browse files
author
laurent
committed
Steps duration for Grid patterns
1 parent 47761ba commit 39a13f2

File tree

2 files changed

+154
-69
lines changed

2 files changed

+154
-69
lines changed

workoutbuilder.qml

Lines changed: 112 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -370,16 +370,17 @@ MuseScore {
370370
property var _ddNotes: { {
371371
var dd=_degrees.map(function (e) { return {text: e, step: e}});
372372
// dd.unshift({text: '<html><span style="font-family:\'MScore Text\'; font-size: 20px; text-align: center; vertical-align: middle">\uE4E5</span></html>', step: 'R'});
373-
dd.unshift({text: '(R)', step: 'R'});
374373
// dd.unshift({text: String.fromCharCode(7694), step: 'R'});
374+
dd.unshift({text: '(R)', step: 'R'});
375375
dd.unshift({text: '', step: ''});
376376
return dd;
377377
}
378378
}
379379

380380
property var _ddGridNotes: { {
381-
var dd = [''];
382-
dd = dd.concat(_griddegrees);
381+
var dd=_griddegrees.map(function (e) { return {text: e, step: e}});
382+
dd.unshift({text: '(R)', step: 'R'});
383+
dd.unshift({text: '', step: ''});
383384
return dd;
384385
}
385386
}
@@ -482,22 +483,63 @@ MuseScore {
482483
var p = null;
483484
if (raw.gridType==='grid') {
484485
p = [];
485-
for (var j = 0; j < _max_steps; j++) {
486-
var sn = raw.steps.get(j);
487-
if (sn.degree !== '') {
486+
// for (var j = 0; j < _max_steps; j++) {
487+
// var sn = raw.steps.get(j);
488+
// if (sn.degree !== '') {
489+
// var d = _griddegrees.indexOf(sn.degree);
490+
// if (d > -1)
491+
// p.push(sn.degree); // we keep the degree !!!
492+
// } else
493+
// break;
494+
// }
495+
// 2.4.0 adding in reverse order
496+
for (var j = (_max_steps-1); j >=0 ; j--) {
497+
var sn = raw.steps.get(j);
498+
if (sn.degree === 'R') {
499+
p.unshift({"note": null, "duration": sn.duration});
500+
}
501+
else if (sn.degree !== '') {
488502
var d = _griddegrees.indexOf(sn.degree);
489503
if (d > -1)
490-
p.push(sn.degree); // we keep the degree !!!
491-
} else
492-
break;
493-
}
504+
p.unshift({"note": sn.degree, "duration": sn.duration}); // we keep the degree !!!
505+
} else if (p.length===0) {
506+
continue;
507+
}
508+
// else
509+
// p.unshift({"note": null, "duration": sn.duration});
510+
}
494511

495512
if (p.length == 0) {
496513
break;
497514
}
498-
}
515+
516+
517+
499518

500-
// 1.2) Retrieving loop mode
519+
// 1.2) Completing the pattern to have a round duration
520+
if (chkAdaptativeMeasure.checked && chkStrictLayout.checked) {
521+
var total = p.map(function (e) {
522+
return e.duration
523+
}).reduce(function (t, n) {
524+
return t + n;
525+
});
526+
if (total < Math.ceil(total)) {
527+
var inc = Math.ceil(total) - total;
528+
console.log("adding a rest of " + inc);
529+
p.push({
530+
"note": null,
531+
"duration": inc
532+
});
533+
} else
534+
console.log("!! Measure is complete. Don't need to add some rests");
535+
} else
536+
console.log("!! Don't need to check for measure completness");
537+
538+
539+
debugO("after cleaning", p);
540+
}
541+
542+
// 1.3) Retrieving loop mode
501543
var mode = raw.loopMode;
502544
mode = _loops.filter(function(e) {return e.id===mode})[0];
503545
console.log("looping mode : " + mode.label);
@@ -511,6 +553,7 @@ MuseScore {
511553
"gridType": raw.gridType,
512554
};
513555
patts.push(pattern);
556+
debugO("ready",pattern.notes); // debug
514557

515558
}
516559

@@ -578,35 +621,42 @@ MuseScore {
578621
// if (pp.notes.length==1 && pp.notes[0]==null) {
579622
if (pp.gridType!=="grid") {
580623
// Chord mode: take only the notes of the chord
581-
steps=chord.chordnotes.map(function(e) { return parseInt(e.note); }).sort(function(a,b) { return a-b;});
624+
var nns=chord.chordnotes.map(function(e) { return parseInt(e.note); }).sort(function(a,b) { return a-b;});
582625

583-
console.log("~~~~Dealing with the ChordNotes~~~~~"+pp.gridType)
626+
console.log("~~~~Dealing with the ChordNotes~~~~~"+pp.gridType)
584627
if (chord.bass!=null) {
585628
console.log("~~~~Dealing with the bass~~~~~")
586-
console.log("Steps before: "+steps);
629+
console.log("nns before: "+nns);
587630
var bass=chord.bass.key;
588-
var idx=steps.indexOf(bass);
589-
steps.pop(); // retirer le "12"
590-
console.log("Steps without 12: "+steps);
591-
steps=steps.concat(steps.splice(0,idx).map(function(e){ return e+12}));
592-
console.log("Steps rotated: "+steps);
593-
steps=steps.concat(12+bass);
594-
console.log("Steps with bass+12: "+steps);
631+
var idx=nns.indexOf(bass);
632+
nns.pop(); // retirer le "12"
633+
console.log("nns without 12: "+nns);
634+
nns=nns.concat(nns.splice(0,idx).map(function(e){ return e+12}));
635+
console.log("nns rotated: "+nns);
636+
nns=nns.concat(12+bass);
637+
console.log("nns with bass+12: "+nns);
638+
595639
}
596640

597-
if(pp.gridType=="chorddown") steps=steps.reverse();
641+
steps=nns.map(function(e) { return { note: e, duration: 1 }});
642+
643+
if(pp.gridType=="chorddown") steps=reversePattern(steps);
598644

599645
} else {
600646
// Traditional mode: pattern based
601647
for (var n = 0; n < pp.notes.length; n++) {
602-
var ip = parseInt(pp.notes[n]) - 1; // TODO: This is not clean: using a label "1" and trying to deduce the valid array index
648+
var degree=pp.notes[n];
649+
var inScale =null;
650+
if (degree.note !== null) {
651+
var ip = parseInt(degree.note) - 1; // TODO: This is not clean: using a label "1" and trying to deduce the valid array index
603652

604653
console.log(ip + "--" + (ip % 7) + "--" + Math.floor(ip / 7) + "--" + (Math.floor(ip / 7) * 12) + "**" + scale[ip % 7] + "**" + (scale[ip % 7] + (Math.floor(ip / 7) * 12)));
605654

606-
var inScale = (scale[ip % 7]) + (Math.floor(ip / 7) * 12);
607-
655+
inScale = (scale[ip % 7]) + (Math.floor(ip / 7) * 12);
656+
}
608657
console.log(n + ": " + pp.notes[n].note + " --> " + ip + " --> " + inScale);
609-
steps.push(inScale);
658+
var step={note: inScale, duration: degree.duration};
659+
steps.push(step);
610660
}
611661
}
612662

@@ -620,7 +670,7 @@ MuseScore {
620670

621671
var local = extendPattern(pattern);
622672
// tweak the representation
623-
local.representation = (pattern.name && pattern.name !== "") ? pattern.name : pp.notes.join("/");
673+
local.representation = (pattern.name && pattern.name !== "") ? pattern.name : pp.notes.map(function(e) { e.note }).filter(function(e) { e!==null }) .join("/");
624674
var subpatterns = local["subpatterns"];
625675

626676
//console.log("# subpatterns: "+subpatterns.length);
@@ -640,6 +690,7 @@ MuseScore {
640690
var notes = [];
641691

642692
var p=(!chkInvert.checked || ((r % 2) == 0))?basesteps:reversePattern(basesteps);
693+
643694
for (var j = 0; j < p.length; j++) {
644695
console.log(">>> Looking at note " + j + ": " + p[j].note);
645696
//notes.push(root + p[j]);
@@ -666,6 +717,7 @@ MuseScore {
666717
}
667718

668719
return pages;
720+
//return [];
669721

670722
}
671723
function printWorkout_forScale() {
@@ -1080,7 +1132,8 @@ MuseScore {
10801132

10811133
if (adaptativeMeasure) {
10821134
// beatsByMeasure = (pages[i][j].gridType!=="grid")?pages[i][j].notes.length:signatureForPattern(pages[i][j].notes.length);
1083-
beatsByMeasure = (pages[i][j].gridType!==undefined && pages[i][j].gridType!=="grid")?pages[i][j].notes.length:signatureForPattern(pages[i][j].notes);
1135+
// beatsByMeasure = (pages[i][j].gridType!==undefined && pages[i][j].gridType!=="grid")?pages[i][j].notes.length:signatureForPattern(pages[i][j].notes);
1136+
beatsByMeasure = signatureForPattern(pages[i][j].notes);
10841137
console.log("recomputing beatsByMeasure to "+beatsByMeasure+" (#2) / gridType: "+pages[i][j].gridType);
10851138
} else {
10861139
beatsByMeasure = 4;
@@ -2756,9 +2809,6 @@ MuseScore {
27562809
}
27572810

27582811
Binding on currentIndex {
2759-
// value: model.map(function (e) {
2760-
// return e[lstStep.valueRole]
2761-
// }).indexOf(note);
27622812
value: {
27632813
_ddNotes.map(function (e) {
27642814
return e[lstStep.valueRole]
@@ -2800,21 +2850,49 @@ MuseScore {
28002850

28012851
enabled: gridType==="grid"
28022852

2853+
textRole: "text"
2854+
property var valueRole: "step"
2855+
28032856
onActivated: {
28042857
console.log("degree at "+stepIndex+" of "+patternIndex+": "+degree);
2805-
degree = model[currentIndex];
2858+
degree = model[currentIndex][valueRole];
28062859
workoutName = undefined; // resetting the name of the
28072860
console.log("==> now degree: "+degree);
28082861
}
28092862

28102863
Binding on currentIndex {
2811-
value: lstGStep.model.indexOf(degree)
2864+
// value: lstGStep.model.indexOf(degree)
2865+
value: {
2866+
_ddGridNotes.map(function (e) {
2867+
return e[lstGStep.valueRole]
2868+
}).indexOf(note);
2869+
}
28122870
}
28132871

28142872

28152873
editable: false
28162874
Layout.alignment: Qt.AlignLeft | Qt.QtAlignBottom
28172875
implicitWidth: 30
2876+
2877+
delegate: ItemDelegate {
2878+
contentItem: Text {
2879+
text: modelData[lstGStep.textRole]
2880+
// textFormat: Text.RichText
2881+
anchors.verticalCenter: parent.verticalCenter
2882+
font: lstGStep.font
2883+
}
2884+
highlighted: lstStep.highlightedIndex === index
2885+
2886+
}
2887+
2888+
contentItem: Text {
2889+
text: lstGStep.displayText
2890+
// textFormat: Text.RichText
2891+
verticalAlignment: Text.AlignVCenter
2892+
anchors.verticalCenter: parent.verticalCenter
2893+
horizontalAlignment: Qt.AlignHCenter
2894+
}
2895+
28182896
}
28192897
}
28202898

0 commit comments

Comments
 (0)