Skip to content

Add breath mark ornament - #33

Merged
denmase merged 1 commit into
mainfrom
claude/noteeditor-translate-english-fworkt
Sep 20, 2026
Merged

denmase merged 1 commit into
mainfrom
claude/noteeditor-translate-english-fworkt

Conversation

@denmase

@denmase denmase commented Sep 20, 2026

Copy link
Copy Markdown
Owner

Summary

Continuing the Indonesian notasi angka gap list (ROADMAP.md), next low-risk item.

  • Added the breath mark ornament (OrnamentType.BreathMark), wired through the same ribbon +
    Edit-menu + context-menu pattern as the existing ornaments (Grace/Trill/Turn/Mordent/Fermata).
    Unlike those, a breath mark is anchored just after the note's right edge instead of centered
    above it, matching where it's actually placed in notasi angka/jianpu sheet music -- one new
    branch each in JianpuRenderer.GetOrnamentAnchorX (non-compact layout) and
    NoteTopAnnotationLayout.GetOrnamentAnchorX (compact/stacked layout used by the editor and PDF
    export). It reuses the existing ornament Y-band and doesn't touch the accidental/octave-dot
    collision math at all, so it doesn't carry the layout risk flagged in ROADMAP.md for the
    accidental slash-convention work. Visual-only: no playback or MIDI-export effect (matching the
    roadmap's stated v1 scope).

While scoping the roadmap's originally-next item (a natural/pugar accidental sign, ), found a
real prerequisite gap: AccidentalKind.Sharp/Flat have no manual entry UI anywhere in the
app
-- JianpuPitchCodec.SetAccidentalPitch is never called outside its own tests, and the only
code path that ever produces an accidental note is MidiImportService reading a chromatic pitch
out of an imported file. Shipping a natural-sign glyph would be dead weight without that entry
point first, so documented this in ROADMAP.md as a real prerequisite and picked breath marks
instead, which needed no such prerequisite.

Test plan

Verified via the same sandbox pipeline as every prior change this session:

  • dotnet build succeeds against the real project/package graph (0 errors/warnings).
  • dotnet format --verify-no-changes passes on both projects.
  • New xUnit tests cover OrnamentService.GetPlaceholderGlyph(BreathMark), the new anchor-position
    branch in NoteTopAnnotationLayout.GetOrnamentAnchorX, and a render-to-bitmap smoke test in both
    compact and default layout modes.

Not verified in this sandbox: the breath mark's actual on-screen appearance/position hasn't
been visually confirmed on a real Windows machine, same caveat as every prior UI change this
session. dotnet test itself cannot execute here (no WindowsDesktop runtime pack); real
confirmation of the new tests comes from GitHub Actions CI.


🤖 Generated with Claude Code

https://claude.ai/code/session_01Pguj4XSScE141p1ScWoqEr


Generated by Claude Code

Adds OrnamentType.BreathMark, wired through the same ribbon/Edit-menu/
context-menu pattern as the existing ornaments (Grace/Trill/Turn/
Mordent/Fermata). Unlike those, a breath mark is anchored just after
the note's right edge instead of centered above it, since that's
where it's placed in notasi angka/jianpu sheet music -- one new
branch each in JianpuRenderer.GetOrnamentAnchorX (non-compact layout)
and NoteTopAnnotationLayout.GetOrnamentAnchorX (compact/stacked
layout). It reuses the existing ornament Y-band and doesn't touch
accidental/octave-dot collision math, so it carries none of the
layout risk flagged in ROADMAP.md for the accidental slash-convention
work. Visual-only: no playback or MIDI-export effect.

While scoping the roadmap's next item (a natural/pugar accidental
sign), found that AccidentalKind.Sharp/Flat have no manual entry UI
anywhere in the app -- accidentals are currently only ever produced
by MIDI import. Documented this in ROADMAP.md as a prerequisite gap
rather than shipping a natural-sign glyph nothing could attach, and
picked breath marks (independently scoped, no prerequisite) instead.

Verified via the same sandbox pipeline as every prior change this
session: dotnet build succeeds against the real project/package
graph, dotnet format --verify-no-changes passes on both projects, and
new xUnit tests cover the placeholder glyph and the anchor-position
branch. dotnet test itself cannot execute in this sandbox (no
WindowsDesktop runtime pack); real confirmation comes from GitHub
Actions CI.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Pguj4XSScE141p1ScWoqEr
@denmase
denmase merged commit 171b46a into main Sep 20, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants