[fix] detect key signature correctly

need to look at cursor.keySignature to properly name the notes

Also, fixed soprano recorder octaves
This commit is contained in:
2026-05-13 12:14:08 +02:00
parent f4df20188c
commit b40a7f4ad2
2 changed files with 103 additions and 60 deletions

View File

@ -55,34 +55,34 @@ const woodwinds = [
{ {
name: "Soprano Recorder", name: "Soprano Recorder",
fingering: { fingering: {
"C4": "11111111", "C5": "11111111",
"C#4": "1111111|", "C#5": "1111111|",
"D4": "11111110", "D5": "11111110",
"D#4": "111111|o", "D#5": "111111|o",
"E4": "111111oo", "E5": "111111oo",
"F4": "11110011", "F5": "11110011",
"F#4": "1111011o", "F#5": "1111011o",
"G4": "111100oo", "G5": "111100oo",
"G#4": "111011|o", "G#5": "111011|o",
"A4": "111000oo", "A5": "111000oo",
"A#4": "110110oo", "A#5": "110110oo",
"B4": "110000oo", "B5": "110000oo",
"C5": "101000oo", "C6": "101000oo",
"C#5": "011000oo", "C#6": "011000oo",
"D5": "001000oo", "D6": "001000oo",
"D#5": "0011111o", "D#6": "0011111o",
"E5": "-11111oo", "E6": "-11111oo",
"F5": "-111101o", "F6": "-111101o",
"F#5": "-11101oo", "F#6": "-11101oo",
"G5": "-11100oo", "G6": "-11100oo",
"G#5": "-11010oo", "G#6": "-11010oo",
"A5": "-11000oo", "A6": "-11000oo",
"A#5": "-110011|", "A#6": "-110011|",
"B5": "-11011oo", "B6": "-11011oo",
"C6": "-10011oo", "C7": "-10011oo",
"C#6": "-1011011", "C#7": "-1011011",
"D6": "-1011011", "D7": "-1011011",
"D#6": "-011011o", "D#7": "-011011o",
}, },
format: format:
`$note `$note

View File

@ -339,40 +339,82 @@ MuseScore {
return String.fromCharCode(0x2080 + n) return String.fromCharCode(0x2080 + n)
} }
function noteToName(note) { function noteToPitchName(accidental, pitchClass, defaultValue) {
var mapping = { switch (accidental) {
[Accidental.FLAT]: { case Accidental.FLAT:
1: "D♭", case Accidental.NATURAL_FLAT:
3: "E♭", switch (pitchClass) {
4: "F♭", case 1: return "D♭"
6: "G♭", case 3: return "E♭"
8: "A♭", case 4: return "F♭"
10: "B♭", case 6: return "G♭"
11: "C♭" case 8: return "A♭"
}, case 10: return "B♭"
[Accidental.SHARP]: { case 11: return "C♭"
0: "B♯", default: return defaultValue
1: "C♯", }
3: "D♯", case Accidental.SHARP:
5: "E♯", case Accidental.NATURAL_SHARP:
6: "F♯", switch (pitchClass) {
8: "G♯", case 0: return "B♯"
10: "A♯" case 1: return "C♯"
}, case 3: return "D♯"
[Accidental.NONE]: { case 5: return "E♯"
0: "C", case 6: return "F♯"
2: "D", case 8: return "G♯"
4: "E", case 10: return "A♯"
5: "F", default: return defaultValue
7: "G", }
9: "A", case Accidental.NONE:
11: "B" case Accidental.NATURAL:
} switch (pitchClass) {
case 0: return "C"
case 2: return "D"
case 4: return "E"
case 5: return "F"
case 7: return "G"
case 9: return "A"
case 11: return "B"
default: return defaultValue
}
default: return "!" + defaultValue
} }
}
function isSharp(pitch, keySig) {
var p = 6
for (var i = 0; i < keySig; ++i) {
if (pitch == p) {
return true
}
p = (p + 7) % 12
}
return false
}
function isFlat(pitch, keySig) {
var p = 10
for (var i = 0; i > keySig; --i) {
if (pitch == p) {
return true
}
p = (p + 5) % 12
}
return false
}
function noteToName(note, keySig, defaultValue) {
var accidental = note.accidentalType
var pitchClass = note.pitch % 12 var pitchClass = note.pitch % 12
if (accidental == Accidental.NONE && isSharp(pitchClass, keySig)) {
accidental = Accidental.SHARP
}
if (accidental == Accidental.NONE && isFlat(pitchClass, keySig)) {
accidental = Accidental.FLAT
}
var octave = Math.floor(note.pitch / 12) - 1 var octave = Math.floor(note.pitch / 12) - 1
var name = (mapping[note.accidentalType] || {}) [pitchClass] || "?" var pitchName = noteToPitchName(accidental, pitchClass, defaultValue)
return name + subscriptDigit(octave) return pitchName + subscriptDigit(octave)
} }
//--------------------------------------------------------- //---------------------------------------------------------
@ -609,12 +651,13 @@ MuseScore {
while (cursor.segment) { while (cursor.segment) {
if (cursor.element && cursor.element.type === Element.CHORD) { if (cursor.element && cursor.element.type === Element.CHORD) {
var chord = cursor.element var chord = cursor.element
var keySignature = cursor.keySignature
var midi = chord.notes[0].pitch var midi = chord.notes[0].pitch
if (userTransposed) midi += 12 if (userTransposed) midi += 12
var noteId = pitchToName(midi) var noteId = pitchToName(midi)
var noteName = noteToName(chord.notes[0]) var noteName = noteToName(chord.notes[0], keySignature, "?")
var text = newElement(Element.STAFF_TEXT) var text = newElement(Element.STAFF_TEXT)