Merge pull request #20121 from shoogle/braille-input-octave-rules

Braille input: Fix octave rules for notes that lack octave marks
This commit is contained in:
RomanPudashkin 2023-11-23 10:17:07 +02:00 committed by GitHub
commit 3fb834c20f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 10 deletions

View file

@ -367,17 +367,20 @@ BieSequencePatternType BrailleInputState::parseBraille(IntervalDirection directi
NoteName note_name = getNoteName(code);
setNoteName(note_name);
setNoteDurations(getNoteDurations(code));
code = pattern->res("octave");
if (code != NULL) {
setAddedOctave(getOctave(code));
} else {
} else if (chordBaseNoteOctave() != -1) {
int octave_diff = getOctaveDiff(chordBaseNoteName(), note_name);
setAddedOctave(chordBaseNoteOctave() + octave_diff);
} else {
setAddedOctave(-1); // unknown octave
}
setNoteName(note_name, true); // do this after determining the octave
code = pattern->res("accidental");
if (code != NULL) {
setAccidental(getAccidentalType(code));

View file

@ -490,6 +490,39 @@ void NotationBraille::setKeys(const QString& sequence)
LOGD() << brailleInput()->buffer();
std::string braille = translate2Braille(brailleInput()->buffer().toStdString());
BieRecognize(braille, brailleInput()->tupletIndicator());
NoteName prevNoteName = NoteName::C;
int prevNoteOctave = -1; // unknown octave
if (Segment* seg = interaction()->noteInput()->state().segment) {
const track_idx_t track = interaction()->noteInput()->state().currentTrack;
Chord* prevChord = nullptr;
for (Segment* s = seg->prev1(SegmentType::ChordRest); s; s = s->prev1(SegmentType::ChordRest)) {
EngravingItem* e = s->element(track);
if (e && e->isChord()) {
prevChord = toChord(e);
break;
}
}
if (prevChord) {
Note* rootNote = (currentIntervalDirection() == IntervalDirection::Up) ? prevChord->downNote() : prevChord->upNote();
String pitchName;
String accidental; // needed for tpc2name
tpc2name(rootNote->tpc(), NoteSpellingType::STANDARD, NoteCaseType::UPPER, pitchName, accidental);
size_t inote = String("CDEFGAB").indexOf(pitchName.at(0));
IF_ASSERT_FAILED(inote >= 0 && inote <= 6) {
} else {
prevNoteName = static_cast<NoteName>(inote);
prevNoteOctave = rootNote->octave();
}
}
}
brailleInput()->setNoteName(prevNoteName, true);
brailleInput()->setOctave(prevNoteOctave, true);
BieSequencePatternType type = brailleInput()->parseBraille(currentIntervalDirection());
switch (type) {
case BieSequencePatternType::Note: {
@ -891,15 +924,12 @@ IntervalDirection NotationBraille::currentIntervalDirection()
break;
}
if (EngravingItem* element = currentEngravingItem()) {
if (element->isNote()) {
Note* note = toNote(element);
if (Staff* staff = note->staff()) {
ClefType clef = staff->clef(note->tick());
if (clef >= ClefType::G && clef <= ClefType::C3) {
return IntervalDirection::Down;
}
return IntervalDirection::Up;
if (Staff* staff = element->staff()) {
ClefType clef = staff->clef(element->tick());
if (clef >= ClefType::G && clef <= ClefType::C3) {
return IntervalDirection::Down;
}
return IntervalDirection::Up;
}
}
return IntervalDirection::Down;