Created
September 27, 2023 10:10
-
-
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)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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