// ====================================================================== // MuseScore // Drum Grooves plugin // // Copyright (C)2021 Avron Polakow (avronpolakow@gmail.com) // // 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.0 import QtQuick.Dialogs 1.2 import QtQuick.Controls 1.0 import MuseScore 3.0 MuseScore { version: "3.0" description: "This demo plugin creates drum grooves" menuPath: "Plugins._DrumsAndRhythm.DrumGrooves" requiresScore: false // pluginType: "dock" pluginType: "dialog" property bool inCmd: false /////////////////////////////////////////////////////// // NOTE! // cursor.add() DOESN'T advance the cursor // cursor.addNote() ADVANCES the cursor /////////////////////////////////////////////////////// onRun: { myText.text = cbItems.get(cbItems.currentIndex).value; // + "," + qsTr(cbItems.get(cbItems.currentIndex).text); } // Some Bass Drum Lines function bassDrum(aCursor, ai) { switch (ai) { case 1: aCursor.setDuration(1,4); aCursor.addNote(35); aCursor.setDuration(3,16); aCursor.addRest(); aCursor.setDuration(1,16); aCursor.addNote(35); aCursor.setDuration(1,4); aCursor.addNote(35); aCursor.addRest(); break; case 2: aCursor.setDuration(1,8); aCursor.addRest(); aCursor.setDuration(1,16); aCursor.addNote(35); aCursor.addNote(35); aCursor.addRest(); aCursor.setDuration(3,16); aCursor.addNote(35); aCursor.setDuration(1,4); aCursor.addNote(35); aCursor.addRest(); break; case 3: break; default: } } function createTempo(aCursor, aiNum, aiDen) { var eTempo; var eTime; aCursor.rewind(0); eTime = newElement(Element.TIMESIG); eTime.timesig = fraction(aiNum, aiDen); aCursor.add(eTime); // Music Display Symbols used for tempo // \uECA2; NoteWhole // \uECA3 \uECB7; NoteHalfUp // \uECA3; NoteHalfUp // \uECA5 \uECB7 \uECB7; NoteQuarterUp // \uECA5 \uECB7; Dotted QuarterUp // \uECA5; NoteQuarterUp // \uECA7 \uECB7 \uECB7; Note8thUp // \uECA7 \uECB7; Note8thUp // \uECA7; Note8thUp // \uECA9 \uECB7 \uECB7; Note16thUp // \uECA9 \uECB7; Note16thUp // \uECA9; Note16thUp eTempo = newElement(Element.TEMPO_TEXT); eTempo.text = '\uECA5' + ' = ' + Math.round(60); eTempo.visible = visible; aCursor.add(eTempo); } function createDrumGrooves(as_groove) { // Elements var eScore; var eCursor; var eLineBreak; var eNote; // var eTime; // time signature fraction // var eTempo; var larr_parms; var li, lj; // Numbers var lb_debug = false; var ls_debug = ""; larr_parms = as_groove.split(","); // Optional message console.log("Creating Drum Grooves"); // New Score with a drumset stave eScore = newScore("Drum-Grooves", "drumset", 8); eScore.style.setValue("enableIndentationOnFirstSystem", false); // remove indentation in the first row eScore.style.setValue("beamNoSlope", true); // use beams without slopes // Begin Command Mode eScore.startCmd(); inCmd = true; // eScore.addText("title", "Drum Grooves"); // eScore.addText("subtitle", "Rock"); // eScore.addText("composer", "Customised"); // eScore.addText("lyricist", "Sample: "); eCursor = eScore.newCursor(); eCursor.track = 0; // eCursor.rewind(0); // eTime = newElement(Element.TIMESIG); // eTime.timesig = fraction(liNum, liDen); // eCursor.add(eTime); // // // Music Display Symbols used for tempo // // \uECA2; NoteWhole // // \uECA3 \uECB7; NoteHalfUp // // \uECA3; NoteHalfUp // // \uECA5 \uECB7 \uECB7; NoteQuarterUp // // \uECA5 \uECB7; Dotted QuarterUp // // \uECA5; NoteQuarterUp // // \uECA7 \uECB7 \uECB7; Note8thUp // // \uECA7 \uECB7; Note8thUp // // \uECA7; Note8thUp // // \uECA9 \uECB7 \uECB7; Note16thUp // // \uECA9 \uECB7; Note16thUp // // \uECA9; Note16thUp // // eTempo = newElement(Element.TEMPO_TEXT); // eTempo.text = '\uECA5' + ' = ' + Math.round(60); // eTempo.visible = visible; // eCursor.add(eTempo); eLineBreak = newElement (Element.LAYOUT_BREAK); eLineBreak.layoutBreakType = LayoutBreak.LINE; eScore.addText("subtitle", larr_parms[1]) + " groove"; ls_debug = ""; switch (larr_parms[0]) { // 1st Groove case "1": { createTempo(eCursor, 4, 4) eCursor.setDuration(1,16); for (lj=1;lj<3;lj++) { if (lj % 2 == 0) { eLineBreak.eScore = curScore; eCursor.add (eLineBreak.clone ()); } for (li=1;li<17;li++) { // voice 1 - upward stem eCursor.voice = 0; // HH switch (li) { case 8: eCursor.addNote(49); break; // short crash (open HH?) case 16: eCursor.addNote(57); break; // long crash default: eCursor.addNote(42); break; // HH } if (li == 5 || li == 13) {eNote = eCursor.addNote(38, true);} // Snare // BD inside the loop - setDuration() needs to adjusted // eCursor.prev(); // eCursor.track = 1; // li==1 || li==3 || li==9 ? eCursor.addNote(35) : eCursor.addRest(); // eCursor.track = 0; } } // BD bottom voice - requires rewinding to the beginning of the score eCursor.rewind(0); eCursor.track = 1; eCursor.voice = 1; for (lj=1;lj<3;lj++) { for (li=1;li<9;li++) { (li == 1 || li == 2) ? eCursor.setDuration(1,8) : eCursor.setDuration(1,4); (li == 1 || li == 2 || li == 5) ? eCursor.addNote(35) : eCursor.addRest(); (li == 1 || li == 2) ? li=li : li++; } } break; // End of 1st Groove } // 2nd groove case "2": { createTempo(eCursor, 4, 4) eCursor.setDuration(1,8); for (lj=1;lj<3;lj++) { if (lj % 2 == 0) { eLineBreak.eScore = curScore; eCursor.add (eLineBreak.clone ()); } for (li=1;li<9;li++) { eCursor.voice = 0; // HH stroke ls_debug += "li = 42,8; "; eNote = eCursor.addNote(42); if (li == 3 || li == 7) { ls_debug += "li = 38,8; "; eNote = eCursor.addNote(38, true); } // Snare } } if (lb_debug) {eScore.addText("lyricist", ls_debug);} // BD bottom voice - requires rewinding to the beginning of the score eCursor.rewind(0); eCursor.track = 1; eCursor.voice = 1; for (lj=1;lj<3;lj++) { for (li=1;li<9;li++) { (li == 1 || li == 2 || li == 3 || li == 4) ? eCursor.setDuration(1,8) : eCursor.setDuration(1,4); (li == 1 || li == 2 || li == 4 || li == 5) ? eCursor.addNote(35) : eCursor.addRest(); (li == 1 || li == 2 || li == 3 || li == 4) ? li=li : li++; } } // End of BD break; // End of 2nd Groove } // 3rd groove case "3": { createTempo(eCursor, 4, 4) // Measure 1 eCursor.setDuration(1,4); eCursor.addNote(42); eCursor.addNote(42); eCursor.addNote(42); eCursor.addNote(42); // Measure 2 eCursor.addNote(42); eCursor.addNote(42); eCursor.addNote(42); eCursor.setDuration(1,8); eCursor.addNote(42); eCursor.addNote(38); // Measure 3 eCursor.setDuration(1,4); eCursor.addNote(42); eCursor.addNote(42); eCursor.addNote(42); eCursor.addNote(38); eCursor.addNote(49, true); eLineBreak.eScore = curScore; eCursor.add (eLineBreak.clone ()); // Measure 4 eCursor.setDuration(1,4); eCursor.addNote(42); eCursor.addNote(42); eCursor.addNote(38, true); eCursor.setDuration(3,16); eCursor.addNote(42); eCursor.setDuration(1,16); eCursor.addNote(38); eCursor.setDuration(1,4); eCursor.addNote(38); eCursor.addNote(49, true); // Same as above in single voice // Measure 5 eCursor.setDuration(1,4); var lel_note = eCursor.addNote(42); eCursor.addNote(35, true); eCursor.setDuration(3,16); eCursor.addNote(42); eCursor.setDuration(1,16); eCursor.addNote(35); eCursor.setDuration(1,4); eCursor.addNote(42); eCursor.addNote(35, true); eCursor.addNote(42); // Measure 6 eCursor.setDuration(1,8); eCursor.addNote(42); eCursor.setDuration(1,16); eCursor.addNote(35); eCursor.addNote(35); eCursor.addNote(42); eCursor.addNote(38,true); eCursor.setDuration(3,16); eCursor.addNote(35); eCursor.setDuration(1,4); eCursor.addNote(42); eCursor.addNote(35, true); eCursor.setDuration(1,8); eCursor.addNote(42); eCursor.addNote(38); // Measure 7 eCursor.setDuration(1,4); eCursor.addNote(42); eCursor.addNote(35, true); eCursor.setDuration(3,16); eCursor.addNote(42); eCursor.setDuration(1,16); eCursor.addNote(35); eCursor.setDuration(1,4); eCursor.addNote(42); eCursor.addNote(35, true); eCursor.addNote(49); eCursor.addNote(38, true); eLineBreak.eScore = curScore; eCursor.add (eLineBreak.clone ()); // Measure 8 eCursor.setDuration(1,8); eCursor.addNote(42); eCursor.setDuration(1,16); eCursor.addNote(35); eCursor.addNote(35); eCursor.addNote(42); eCursor.addNote(38,true); eCursor.setDuration(3,16); eCursor.addNote(35); eCursor.setDuration(3,16); eCursor.addNote(42); eCursor.addNote(35, true); eCursor.setDuration(1,16); eCursor.addNote(35); eCursor.setDuration(1,4); eCursor.addNote(49); eCursor.addNote(38, true); ///////////////////////////////////////////////////////////////////// // BD bottom voice - requires rewinding to the beginning of the score eCursor.rewind(0); eCursor.track = 1; eCursor.voice = 1; bassDrum(eCursor, 1); // BD Measure 1 bassDrum(eCursor, 2); // BD Measure 2 bassDrum(eCursor, 1); // BD Measure 3 bassDrum(eCursor, 2); // BD Measure 4 // // bassDrum(eCursor, 1); // BD Measure 5 // bassDrum(eCursor, 2); // BD Measure 6 // bassDrum(eCursor, 1); // BD Measure 7 // bassDrum(eCursor, 2); // BD Measure 8 // End BD break; } // End of 3rd Groove // 4th groove // TBD case "4": { // createTempo(eCursor, 4, 4) // // // Measure 1 // eCursor.setDuration(3,16); // eCursor.addNote(42); // eCursor.addNote(38, true); // eCursor.setDuration(1,16); // eCursor.addNote(42); // // eCursor.setDuration(1,16); // eCursor.addRest(); // eCursor.setDuration(3,16); // eCursor.addNote(38); // eCursor.addNote(35); // // eCursor.setDuration(1,16); // eCursor.addNote(35); // eCursor.addNote(35); // // eCursor.addNote(42); // // eCursor.setDuration(1,16); // eCursor.addRest(); // eCursor.addNote(42); // eCursor.addNote(38); // // eCursor.setDuration(3,16); // eCursor.addNote(42); // // eCursor.setDuration(1,16); // eCursor.addNote(35); // // // // Measure 2 // eCursor.setDuration(3,16); // eCursor.addNote(42); // eCursor.setDuration(1,16); // eCursor.addNote(42); // // eCursor.setDuration(3,16); // eCursor.addNote(38); // // eCursor.setDuration(1,16); // eCursor.addNote(42); // // eCursor.setDuration(3,16); // eCursor.addRest(); // // eCursor.addNote(38); // // eCursor.setDuration(1,16); // eCursor.addNote(38); // // eCursor.setDuration(1,8); // eCursor.addNote(42); // // eCursor.setDuration(1,16); // eCursor.addRest(); // //eLineBreak.eScore = curScore; //eCursor.add (eLineBreak.clone ()); // // break; } // End of 4th Groove // 5th groove case "5": { createTempo(eCursor, 4, 4) for (lj=1;lj<5;lj++) { eCursor.setDuration(1,8); for (li=1;li<17;li++) { eCursor.voice = 0; // HH stroke ls_debug += "lj/li " + lj + "/" + li + " =42; "; eNote = eCursor.addNote(42); // Rimshot if (lj < 3) { if (li == 1 || li == 4 || li == 7 || li == 11 || li == 14) { ls_debug += "lj/li " + lj + "/" + li + " note = 37,8; "; eNote = eCursor.addNote(37, true); } } else { if (li == 1 || li == 2 || li == 4 || li == 5 || li == 7 || li == 8 || li == 11 || li == 13 || li == 14 || li == 16) { ls_debug += "lj/li " + lj + "/" + li + " note = 37,8; "; eNote = eCursor.addNote(37, true); } } if (li == 8 && (lj == 2 || lj == 4)) { eLineBreak.eScore = curScore; eCursor.add (eLineBreak.clone ()); } } if (lb_debug) {eScore.addText("lyricist", ls_debug);} } // BD bottom voice - requires rewinding to the beginning of the score eCursor.rewind(0); eCursor.track = 1; eCursor.voice = 1; for (lj=1;lj<5;lj++) { for (li=1;li<17;li++) { if (li == 5 || li == 7 || li == 13 ) {eCursor.setDuration(2,8); eCursor.addRest();} if (li == 15 ) {eCursor.setDuration(1,8); eCursor.addRest();} else if (li == 1 || li == 9) {eCursor.setDuration(3,8); eCursor.addNote(35);} else if (li == 4 || li == 12 || li == 16) {eCursor.setDuration(1,8); eCursor.addNote(35);} } } // End of BD break; } // End of 5th Groove // 8th groove case "8": { createTempo(eCursor, 4, 4) // Measure 1 eCursor.setDuration(1,8); for (lj=1;lj<5;lj++) { for (li=1;li<9;li++) { eCursor.addNote(42); switch (lj) { case 1: switch (li) { case 1: case 4: eCursor.addNote(38, true); eCursor.addNote(35, true); break; case 5: case 8: eCursor.addNote(35, true); break; case 7: eCursor.addNote(38, true); break; default: break; } break; case 2: switch (li) { case 1: case 4: case 5: case 8: eCursor.addNote(35, true); break; case 3: case 6: eCursor.addNote(38, true); break; default: break; } break; case 3: switch (li) { case 1: case 4: case 8: eCursor.addNote(35, true); break; case 2: eCursor.addNote(38, true); break; case 5: eCursor.addNote(35, true); eCursor.addNote(38, true); break; default: break; eLineBreak.eScore = curScore; eCursor.add (eLineBreak.clone ()); } break; case 4: switch (li) { case 1: eCursor.addNote(35, true); eCursor.addNote(38, true); break; case 4: eCursor.addNote(35, true); eCursor.addNote(38, true); break; case 5: eCursor.addNote(35, true); break; case 8: eCursor.addNote(35, true); break; case 2: case 6: case 8: eCursor.addNote(38, true); break; default: break; } break; default: break; } } } break; } // End of 8th Groove // if (lj == 1 && (li==1 || li== 4 || li=7)) {eCursor.addNote(38, true);} // else if (lj == 2 && (li==3 || li== 6)) {eCursor.addNote(38, true);} // else if (lj == 3 && (li==3 || li== 6)) {eCursor.addNote(38, true);} ////////////////////////////////////////////////////// default: break; } // // BD bottom voice - requires rewinding to the beginning of the score // eCursor.rewind(0); // eCursor.track = 1; // eCursor.voice = 1; // for (lj=1;lj<3;lj++) // { // for (li=1;li<9;li++) // { // (li == 1 || li == 2) ? eCursor.setDuration(1,8) : eCursor.setDuration(1,4); // (li == 1 || li == 2 || li == 5) ? eCursor.addNote(35) : eCursor.addRest(); // // (li == 1 || li == 2) ? li=li : li++; // } // } // // for (lj=1;lj<3;lj++) // { // for (li=1;li<9;li++) // { // (li == 1 || li == 2 || li == 3 || li == 4) ? eCursor.setDuration(1,8) : eCursor.setDuration(1,4); // (li == 1 || li == 2 || li == 4 || li == 5) ? eCursor.addNote(35) : eCursor.addRest(); // // (li == 1 || li == 2 || li == 3 || li == 4) ? li=li : li++; // } // } // // End of BD // End Command Mode eScore.endCmd(); inCmd = false; Qt.quit(); } id:window width: 200; height: 150; Label { id: textLabel wrapMode: Text.WordWrap text: "Grooves" font.pointSize:10 // font.bold: true font.family: 'Comic Sans MS' // font.family: 'MScore Text' anchors.left: window.left anchors.top: window.top anchors.leftMargin: 18 anchors.topMargin: 1 } ComboBox { currentIndex: 0 anchors.left: window.left anchors.top: window.top anchors.leftMargin: 10 anchors.rightMargin: 10 anchors.topMargin:20 model: ListModel { id: cbItems ListElement { text: "Select One"; value: "";} ListElement { text: "Rock Groove 1"; value: "1";} ListElement { text: "Rock Groove 2"; value: "2";} ListElement { text: "Funk 1"; value: "3";} // TBD ListElement { text: "Funk 2"; value: "4";} ListElement { text: "Bossa Nova"; value: "5";} // TBD ListElement { text: "Latin"; value: "6";} // TBD ListElement { text: "Swing"; value: "7";} ListElement { text: "Samba"; value: "8";} } width: 180 // onCurrentIndexChanged: createDrumGrooves(cbItems.get(currentIndex).text); // myText.text = cbItems.get(cbItems.selectedIndex).text; onCurrentIndexChanged: { myText.text = cbItems.get(currentIndex).value + "," + qsTr(cbItems.get(currentIndex).text); // onCurrentIndexChanged: console.debug(cbItems.get(currentIndex).text); } } Label { id:myText text: "" anchors.top: textLabel.bottom anchors.left: window.left anchors.right: window.right anchors.topMargin: 40 anchors.bottomMargin: 10 anchors.leftMargin: 10 anchors.rightMargin: 10 width:200 height:20 } Button { id : buttonOK text: "Create Groove" anchors.top: textLabel.bottom anchors.left: window.left anchors.right: window.right anchors.topMargin: 60 anchors.bottomMargin: 10 anchors.leftMargin: 50 anchors.rightMargin: 50 onClicked: { createDrumGrooves(myText.text); cmd("escape"); // quit note input mode Qt.quit(); } } ////// Unused - for future reference ////// /////////////////////////////////////////// // SpinBox // { // id:spinNo // value: 4 // minimumValue : 2 // maximumValue : 12 // anchors.top: textLabel.bottom // anchors.right: window.right // anchors.leftMargin: 100 // anchors.rightMargin: 10 // width:50 // height:20 // } // Button // { // id : buttonTest // text: "Test" // anchors.top: textLabel.bottom // anchors.left: window.left // anchors.right: window.right // anchors.topMargin: 80 // anchors.bottomMargin: 10 // anchors.leftMargin: 50 // anchors.rightMargin: 50 // // onClicked: // { // myText.text = cbItems.get(cbItems.selectedIndex).value; // } // } }