Skip to content

feat: key signature print-object in mx::api - #468

Merged
webern merged 1 commit into
m/mxdev-harmframefrom
m/mxdev-keyprint
Nov 1, 2026
Merged

webern merged 1 commit into
m/mxdev-harmframefrom
m/mxdev-keyprint

Conversation

@webern

@webern webern commented Oct 28, 2026 •

Copy link
Copy Markdown
Owner

Summary

<key print-object="no"> (a key signature that applies to the music but is not drawn) had no api
home, so it was written back as a plain <key> and the signature became visible.

KeyData gains printObject, a tri-state Bool that mirrors ClefData::printObject. The reader
fills it for traditional and non-traditional keys; PropertiesWriter::writeKey, the one place a
<key> is built, emits it when it is not unspecified. The default leaves output unchanged.
data/api.features.xml marks key print-object as supported.

musuite/testInvisibleElements.xml now round-trips and is pinned in the baseline.

Not addressed here: the non-traditional key reader branch still does not set staffIndex or
tickTimePosition, and other <key> attributes (color, position, font) are still dropped.

Testing

  • New PrintObject* cases in KeyDataTest.cpp: no, yes, unspecified (omitted), non-traditional,
    per-staff, and equality
  • make api-test passes (6141 assertions in 710 test cases)
  • make api-roundtrip passes, 442 of 442 pinned files
  • make api-roundtrip-discover: 442 pass, no file that passed before now fails
  • make fmt-check passes

References

@webern webern added feature new feature request api Affects the mx::api layer impl Affects the mx::impl layer ai Issues opened by, or through, a coding agent. labels Oct 28, 2026
@webern webern mentioned this pull request Oct 28, 2026
7 tasks done
@webern
webern added this pull request to stack #475 October 28, 2026 20:08
@webern
webern marked this pull request as ready for review October 29, 2026 07:08
@webern webern changed the title feat: round-trip key signature print-object in mx::api feat: key signature print-object in mx::api Oct 30, 2026
<key print-object="no"> (a key signature that applies to the music but is
not drawn) had no api home, so it was written back as a plain <key> and the
signature became visible.

KeyData gains printObject, a Bool that mirrors ClefData::printObject. The
reader fills it for traditional and non-traditional keys, and the writer
emits it when it is not unspecified. The default leaves output unchanged.

musuite/testInvisibleElements.xml now round-trips and is pinned in the
baseline.
@webern
webern merged commit 8f27c00 into main Nov 1, 2026
8 of 16 checks passed
@webern
webern deleted the m/mxdev-keyprint branch November 1, 2026 14:09
webern added a commit that referenced this pull request Nov 1, 2026
## Summary

`<staff-details>` kept `<staff-lines>` but dropped every
`<staff-tuning>`, so a guitar tab came
back with its lines and no record of what the strings are tuned to.

`StaffData` gains `staffTunings`, a list of the new `StaffTuningData`
(line, step, alter, cents,
octave). Like `staffLines`, it is set on the measure whose attributes
carry the staff-details and
is not carried forward to later measures. The reader honours the
`number` attribute on
`<staff-details>`, and reads a `<staff-details>` that holds only
tunings. The writer emits the
tunings between `<staff-lines>` and `<staff-size>`, as the schema orders
them.

The tuning-step / tuning-alter / tuning-octave translation is shared
with the existing scordatura
reader and writer through a small header-only helper
(`TuningFunctions.h`), with no change to
scordatura behavior or diagnostics. A separate `StaffTuningData` type
rather than reusing
`AccordData`: a staff tuning has a required line, an accord an optional
string number.

`musuite/testTablature1.xml`, `testTablature2.xml` and
`testTablature3.xml` now round-trip and are
pinned in the baseline. `lysuite/ly71e_TabStaves.xml` and
`recsuite/BrookeWestSample.xml` lose
their tuning differences but still fail on other staff-details content
(staff-type, capo,
show-frets, line-detail), which is not modeled here.

## Testing

- [x] New `MeasureDataTest` cases: tuning round trip, alter and cents,
tunings without staff-lines,
two staves; new `MeasureWriterTest` case for the written
`<staff-tuning>`
- [x] Existing scordatura tests pass unchanged
- [x] `make api-test` passes (6195 assertions in 716 test cases)
- [x] `make api-roundtrip` passes, 445 of 445 pinned files
- [x] `make api-roundtrip-discover`: 445 pass, no file that passed
before now fails
- [x] Unity build (`CMAKE_UNITY_BUILD_BATCH_SIZE=0`) of the `mx` target
compiles
- [x] `make fmt-check` passes

## References

- Stacked on #468
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai Issues opened by, or through, a coding agent. api Affects the mx::api layer feature new feature request impl Affects the mx::impl layer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant