Skip to content

Instantly share code, notes, and snippets.

@skitaoka
Created September 27, 2023 10:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save skitaoka/ecb4e49e00be19de654b03cd72d07583 to your computer and use it in GitHub Desktop.
Save skitaoka/ecb4e49e00be19de654b03cd72d07583 to your computer and use it in GitHub Desktop.
Tuning Plugin for MuseScore4 (12-EDO, 19-EDO, 31-EDO, 43-EDO, 53-EDO)
import QtQuick 2.1
import QtQuick.Controls 1.3
import QtQuick.Controls.Styles 1.3
import MuseScore 3.0
MuseScore {
version: "1.0"
title: "TuneTheEDO"
description: "12-EDO, 19-EDO, 31-EDO, 43-EDO and 53-EDO"
menuPath: "Plugins.Tune.TheEDO"
pluginType: "dialog"
categoryCode: "playback"
width: 320
height: 240
Rectangle {
Button {
x: 10
y: 20
width: 300
height: 40
text: "12-EDO"
onClicked: { apply(_12edo); quit(); }
}
Button {
x: 10
y: 60
width: 150
height: 80
text: "19-EDO"
onClicked: { apply(_19edo); quit(); }
}
Button {
x: 160
y: 60
width: 150
height: 80
text: "31-EDO"
onClicked: { apply(_31edo); quit(); }
}
Button {
x: 10
y: 140
width: 150
height: 80
text: "43-EDO"
onClicked: { apply(_43edo); quit(); }
}
Button {
x: 160
y: 140
width: 150
height: 80
text: "53-EDO"
onClicked: { apply(_53edo); quit(); }
}
}
function apply(func) {
const SCORE_START = 0
const SELECTION_START = 1
const SELECTION_END = 2
curScore.startCmd();
var startStaff;
var endStaff;
var endTick;
var inRange;
var rewind;
var cursor = curScore.newCursor();
cursor.rewind(SELECTION_START);
if (cursor.segment) {
startStaff = cursor.staffIdx;
cursor.rewind(SELECTION_END);
endStaff = cursor.staffIdx;
endTick = 0
if (cursor.tick == 0) {
endTick = curScore.lastSegment.tick + 1;
} else {
endTick = cursor.tick;
}
inRange = function() {
return cursor.segment && cursor.tick < endTick
}
rewind = function(voice, staff) {
cursor.rewind(SELECTION_START)
cursor.voice = voice
cursor.staffIdx = staff
}
} else {
startStaff = 0;
endStaff = curScore.nstaves - 1;
inRange = function() {
return cursor.segment
}
rewind = function(voice, staff) {
cursor.voice = voice
cursor.staffIdx = staff
cursor.rewind(SCORE_START)
}
}
for (var staff = startStaff; staff <= endStaff; ++staff) {
for (var voice = 0; voice < 4; ++voice) {
rewind(voice, staff);
while (inRange()) {
if (cursor.element && (cursor.element.type == Element.CHORD)) {
var notes = cursor.element.notes;
for (var i = 0; i < notes.length; ++i) {
func(notes[i]);
}
}
cursor.next();
}
}
}
curScore.endCmd();
}
function _12edo(note) {
note.tuning = 0;
}
function _19edo(note) {
const a = 0;
const b = 200;
const c = 300;
const d = 500;
const e = 700;
const f = 800;
const g = 1000;
const A = 0;
const B = 3;
const C = 5;
const D = 8;
const E = 11;
const F = 13;
const G = 16;
const S = 1;
const N = 19;
switch (note.tpc) { // Tonal Pitch Class
case 17: note.tuning = (A+S*0) * 1200 / N - (a+100*0); break; // A
case 19: note.tuning = (B+S*0) * 1200 / N - (b+100*0); break; // B
case 14: note.tuning = (C+S*0) * 1200 / N - (c+100*0); break; // C
case 16: note.tuning = (D+S*0) * 1200 / N - (d+100*0); break; // D
case 18: note.tuning = (E+S*0) * 1200 / N - (e+100*0); break; // E
case 13: note.tuning = (F+S*0) * 1200 / N - (f+100*0); break; // F
case 15: note.tuning = (G+S*0) * 1200 / N - (g+100*0); break; // G
case 10: note.tuning = (A-S*1) * 1200 / N - (a-100*1); break; // Ab
case 12: note.tuning = (B-S*1) * 1200 / N - (b-100*1); break; // Bb
case 7: note.tuning = (C-S*1) * 1200 / N - (c-100*1); break; // Cb
case 9: note.tuning = (D-S*1) * 1200 / N - (d-100*1); break; // Db
case 11: note.tuning = (E-S*1) * 1200 / N - (e-100*1); break; // Eb
case 6: note.tuning = (F-S*1) * 1200 / N - (f-100*1); break; // Fb
case 8: note.tuning = (G-S*1) * 1200 / N - (g-100*1); break; // Gb
case 3: note.tuning = (A-S*2) * 1200 / N - (a-100*2); break; // Abb
case 5: note.tuning = (B-S*2) * 1200 / N - (b-100*2); break; // Bbb
case 0: note.tuning = (C-S*2) * 1200 / N - (c-100*2); break; // Cbb
case 2: note.tuning = (D-S*2) * 1200 / N - (d-100*2); break; // Dbb
case 4: note.tuning = (E-S*2) * 1200 / N - (e-100*2); break; // Ebb
case -1: note.tuning = (F-S*2) * 1200 / N - (f-100*2); break; // Fbb
case 1: note.tuning = (G-S*2) * 1200 / N - (g-100*2); break; // Gbb
case 24: note.tuning = (A+S*1) * 1200 / N - (a+100*1); break; // A#
case 26: note.tuning = (B+S*1) * 1200 / N - (b+100*1); break; // B#
case 21: note.tuning = (C+S*1) * 1200 / N - (c+100*1); break; // C#
case 23: note.tuning = (D+S*1) * 1200 / N - (d+100*1); break; // D#
case 25: note.tuning = (E+S*1) * 1200 / N - (e+100*1); break; // E#
case 20: note.tuning = (F+S*1) * 1200 / N - (f+100*1); break; // F#
case 22: note.tuning = (G+S*1) * 1200 / N - (g+100*1); break; // G#
case 31: note.tuning = (A+S*2) * 1200 / N - (a+100*2); break; // Ax
case 33: note.tuning = (B+S*2) * 1200 / N - (b+100*2); break; // Bx
case 28: note.tuning = (C+S*2) * 1200 / N - (c+100*2); break; // Cx
case 30: note.tuning = (D+S*2) * 1200 / N - (d+100*2); break; // Dx
case 32: note.tuning = (E+S*2) * 1200 / N - (e+100*2); break; // Ex
case 27: note.tuning = (F+S*2) * 1200 / N - (f+100*2); break; // Fx
case 29: note.tuning = (G+S*2) * 1200 / N - (g+100*2); break; // Gx
}
}
function _31edo(note) {
const a = 0;
const b = 200;
const c = 300;
const d = 500;
const e = 700;
const f = 800;
const g = 1000;
const A = 0;
const B = 5;
const C = 8;
const D = 13;
const E = 18;
const F = 21;
const G = 26;
const S = 2;
const N = 31;
switch (note.tpc) { // Tonal Pitch Class
case 17: note.tuning = (A+S*0) * 1200 / N - (a+100*0); break; // A
case 19: note.tuning = (B+S*0) * 1200 / N - (b+100*0); break; // B
case 14: note.tuning = (C+S*0) * 1200 / N - (c+100*0); break; // C
case 16: note.tuning = (D+S*0) * 1200 / N - (d+100*0); break; // D
case 18: note.tuning = (E+S*0) * 1200 / N - (e+100*0); break; // E
case 13: note.tuning = (F+S*0) * 1200 / N - (f+100*0); break; // F
case 15: note.tuning = (G+S*0) * 1200 / N - (g+100*0); break; // G
case 10: note.tuning = (A-S*1) * 1200 / N - (a-100*1); break; // Ab
case 12: note.tuning = (B-S*1) * 1200 / N - (b-100*1); break; // Bb
case 7: note.tuning = (C-S*1) * 1200 / N - (c-100*1); break; // Cb
case 9: note.tuning = (D-S*1) * 1200 / N - (d-100*1); break; // Db
case 11: note.tuning = (E-S*1) * 1200 / N - (e-100*1); break; // Eb
case 6: note.tuning = (F-S*1) * 1200 / N - (f-100*1); break; // Fb
case 8: note.tuning = (G-S*1) * 1200 / N - (g-100*1); break; // Gb
case 3: note.tuning = (A-S*2) * 1200 / N - (a-100*2); break; // Abb
case 5: note.tuning = (B-S*2) * 1200 / N - (b-100*2); break; // Bbb
case 0: note.tuning = (C-S*2) * 1200 / N - (c-100*2); break; // Cbb
case 2: note.tuning = (D-S*2) * 1200 / N - (d-100*2); break; // Dbb
case 4: note.tuning = (E-S*2) * 1200 / N - (e-100*2); break; // Ebb
case -1: note.tuning = (F-S*2) * 1200 / N - (f-100*2); break; // Fbb
case 1: note.tuning = (G-S*2) * 1200 / N - (g-100*2); break; // Gbb
case 24: note.tuning = (A+S*1) * 1200 / N - (a+100*1); break; // A#
case 26: note.tuning = (B+S*1) * 1200 / N - (b+100*1); break; // B#
case 21: note.tuning = (C+S*1) * 1200 / N - (c+100*1); break; // C#
case 23: note.tuning = (D+S*1) * 1200 / N - (d+100*1); break; // D#
case 25: note.tuning = (E+S*1) * 1200 / N - (e+100*1); break; // E#
case 20: note.tuning = (F+S*1) * 1200 / N - (f+100*1); break; // F#
case 22: note.tuning = (G+S*1) * 1200 / N - (g+100*1); break; // G#
case 31: note.tuning = (A+S*2) * 1200 / N - (a+100*2); break; // Ax
case 33: note.tuning = (B+S*2) * 1200 / N - (b+100*2); break; // Bx
case 28: note.tuning = (C+S*2) * 1200 / N - (c+100*2); break; // Cx
case 30: note.tuning = (D+S*2) * 1200 / N - (d+100*2); break; // Dx
case 32: note.tuning = (E+S*2) * 1200 / N - (e+100*2); break; // Ex
case 27: note.tuning = (F+S*2) * 1200 / N - (f+100*2); break; // Fx
case 29: note.tuning = (G+S*2) * 1200 / N - (g+100*2); break; // Gx
}
}
function _43edo(note) {
const a = 0;
const b = 200;
const c = 300;
const d = 500;
const e = 700;
const f = 800;
const g = 1000;
const A = 0;
const B = 7;
const C = 11;
const D = 18;
const E = 25;
const F = 29;
const G = 36;
const S = 3;
const N = 43;
switch (note.tpc) { // Tonal Pitch Class
case 17: note.tuning = (A+S*0) * 1200 / N - (a+100*0); break; // A
case 19: note.tuning = (B+S*0) * 1200 / N - (b+100*0); break; // B
case 14: note.tuning = (C+S*0) * 1200 / N - (c+100*0); break; // C
case 16: note.tuning = (D+S*0) * 1200 / N - (d+100*0); break; // D
case 18: note.tuning = (E+S*0) * 1200 / N - (e+100*0); break; // E
case 13: note.tuning = (F+S*0) * 1200 / N - (f+100*0); break; // F
case 15: note.tuning = (G+S*0) * 1200 / N - (g+100*0); break; // G
case 10: note.tuning = (A-S*1) * 1200 / N - (a-100*1); break; // Ab
case 12: note.tuning = (B-S*1) * 1200 / N - (b-100*1); break; // Bb
case 7: note.tuning = (C-S*1) * 1200 / N - (c-100*1); break; // Cb
case 9: note.tuning = (D-S*1) * 1200 / N - (d-100*1); break; // Db
case 11: note.tuning = (E-S*1) * 1200 / N - (e-100*1); break; // Eb
case 6: note.tuning = (F-S*1) * 1200 / N - (f-100*1); break; // Fb
case 8: note.tuning = (G-S*1) * 1200 / N - (g-100*1); break; // Gb
case 3: note.tuning = (A-S*2) * 1200 / N - (a-100*2); break; // Abb
case 5: note.tuning = (B-S*2) * 1200 / N - (b-100*2); break; // Bbb
case 0: note.tuning = (C-S*2) * 1200 / N - (c-100*2); break; // Cbb
case 2: note.tuning = (D-S*2) * 1200 / N - (d-100*2); break; // Dbb
case 4: note.tuning = (E-S*2) * 1200 / N - (e-100*2); break; // Ebb
case -1: note.tuning = (F-S*2) * 1200 / N - (f-100*2); break; // Fbb
case 1: note.tuning = (G-S*2) * 1200 / N - (g-100*2); break; // Gbb
case 24: note.tuning = (A+S*1) * 1200 / N - (a+100*1); break; // A#
case 26: note.tuning = (B+S*1) * 1200 / N - (b+100*1); break; // B#
case 21: note.tuning = (C+S*1) * 1200 / N - (c+100*1); break; // C#
case 23: note.tuning = (D+S*1) * 1200 / N - (d+100*1); break; // D#
case 25: note.tuning = (E+S*1) * 1200 / N - (e+100*1); break; // E#
case 20: note.tuning = (F+S*1) * 1200 / N - (f+100*1); break; // F#
case 22: note.tuning = (G+S*1) * 1200 / N - (g+100*1); break; // G#
case 31: note.tuning = (A+S*2) * 1200 / N - (a+100*2); break; // Ax
case 33: note.tuning = (B+S*2) * 1200 / N - (b+100*2); break; // Bx
case 28: note.tuning = (C+S*2) * 1200 / N - (c+100*2); break; // Cx
case 30: note.tuning = (D+S*2) * 1200 / N - (d+100*2); break; // Dx
case 32: note.tuning = (E+S*2) * 1200 / N - (e+100*2); break; // Ex
case 27: note.tuning = (F+S*2) * 1200 / N - (f+100*2); break; // Fx
case 29: note.tuning = (G+S*2) * 1200 / N - (g+100*2); break; // Gx
}
}
function _53edo(note) {
const a = 0;
const b = 200;
const c = 300;
const d = 500;
const e = 700;
const f = 800;
const g = 1000;
const A = 0;
const B = 9;
const C = 13;
const D = 22;
const E = 31;
const F = 35;
const G = 44;
const S = 5;
const N = 53;
switch (note.tpc) { // Tonal Pitch Class
case 17: note.tuning = (A+S*0) * 1200 / N - (a+100*0); break; // A
case 19: note.tuning = (B+S*0) * 1200 / N - (b+100*0); break; // B
case 14: note.tuning = (C+S*0) * 1200 / N - (c+100*0); break; // C
case 16: note.tuning = (D+S*0) * 1200 / N - (d+100*0); break; // D
case 18: note.tuning = (E+S*0) * 1200 / N - (e+100*0); break; // E
case 13: note.tuning = (F+S*0) * 1200 / N - (f+100*0); break; // F
case 15: note.tuning = (G+S*0) * 1200 / N - (g+100*0); break; // G
case 10: note.tuning = (A-S*1) * 1200 / N - (a-100*1); break; // Ab
case 12: note.tuning = (B-S*1) * 1200 / N - (b-100*1); break; // Bb
case 7: note.tuning = (C-S*1) * 1200 / N - (c-100*1); break; // Cb
case 9: note.tuning = (D-S*1) * 1200 / N - (d-100*1); break; // Db
case 11: note.tuning = (E-S*1) * 1200 / N - (e-100*1); break; // Eb
case 6: note.tuning = (F-S*1) * 1200 / N - (f-100*1); break; // Fb
case 8: note.tuning = (G-S*1) * 1200 / N - (g-100*1); break; // Gb
case 3: note.tuning = (A-S*2) * 1200 / N - (a-100*2); break; // Abb
case 5: note.tuning = (B-S*2) * 1200 / N - (b-100*2); break; // Bbb
case 0: note.tuning = (C-S*2) * 1200 / N - (c-100*2); break; // Cbb
case 2: note.tuning = (D-S*2) * 1200 / N - (d-100*2); break; // Dbb
case 4: note.tuning = (E-S*2) * 1200 / N - (e-100*2); break; // Ebb
case -1: note.tuning = (F-S*2) * 1200 / N - (f-100*2); break; // Fbb
case 1: note.tuning = (G-S*2) * 1200 / N - (g-100*2); break; // Gbb
case 24: note.tuning = (A+S*1) * 1200 / N - (a+100*1); break; // A#
case 26: note.tuning = (B+S*1) * 1200 / N - (b+100*1); break; // B#
case 21: note.tuning = (C+S*1) * 1200 / N - (c+100*1); break; // C#
case 23: note.tuning = (D+S*1) * 1200 / N - (d+100*1); break; // D#
case 25: note.tuning = (E+S*1) * 1200 / N - (e+100*1); break; // E#
case 20: note.tuning = (F+S*1) * 1200 / N - (f+100*1); break; // F#
case 22: note.tuning = (G+S*1) * 1200 / N - (g+100*1); break; // G#
case 31: note.tuning = (A+S*2) * 1200 / N - (a+100*2); break; // Ax
case 33: note.tuning = (B+S*2) * 1200 / N - (b+100*2); break; // Bx
case 28: note.tuning = (C+S*2) * 1200 / N - (c+100*2); break; // Cx
case 30: note.tuning = (D+S*2) * 1200 / N - (d+100*2); break; // Dx
case 32: note.tuning = (E+S*2) * 1200 / N - (e+100*2); break; // Ex
case 27: note.tuning = (F+S*2) * 1200 / N - (f+100*2); break; // Fx
case 29: note.tuning = (G+S*2) * 1200 / N - (g+100*2); break; // Gx
}
}
onRun: {
if (!curScore) {
error("No score open.\nThis plugin requires an open score to run.\n")
quit()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment