Skip to content

Releases

scoreview-engine v4.7.7-engine.1

Choose a tag to compare

@github-actions github-actions released this 13 Nov 22:38
release v4.7.7-engine.1

MuseScore 4.7.7 (b750c43) (#46, closes #47). The only upstream file this
tree carries a copy of that moved is share/instruments/instruments.xml:
"Acoustic Bass" is now an ambiguous entry with pizzicato, arco and tremolo
channels, a separate acoustic-bass-guitar instrument was added, and the
contrabass pPitchRange widened to 34-74. Re-copied verbatim, lock re-pinned.

Corpus gate: 570/570 scores convert, no regressions, all 8 native waivers
still fire. The wasm gate passes with the same 11 libm-noise waivers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

scoreview-engine v4.7.6-engine.4

Choose a tag to compare

@github-actions github-actions released this 08 Nov 21:10
release v4.7.6-engine.4

Security fixes from the audit (#44, issues #29-#43). Scores are checked
before the upstream reader runs: nesting depth, clef staff and segment
indices, repeat counts, staff ids, the version string and the zip
structure, with every deflate entry inflated once against its declared
size. A score can no longer pull another live score's pictures out of the
global image store, and 2.x text styles no longer carry over from one 2.x
score to the next. The wasm module is built with -fwasm-exceptions, so
engine exceptions become ordinary errors instead of aborts; after a real
trap the JS wrapper refuses further calls (EngineAbortedError) and the
worker wrapper terminates the worker. generateExcerpts is linear in the
part count (128 parts: 19.8 s -> 0.67 s).

Output is unchanged: the native corpus report is bit-identical to
v4.7.6-engine.3's for all 570 scores, SVG included, and the wasm gate
passes with the same waivers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

scoreview-engine v4.7.6-engine.3

Choose a tag to compare

@github-actions github-actions released this 30 Oct 18:51
release v4.7.6-engine.3

emsdk 6.0.13 (#23), the last open item of the dependency check (#12).
Nothing this build uses moved between 6.0.9 and 6.0.13, and the zlib port
is still 1.3.2 with the same hash.

Output is unchanged: the native corpus is not touched by the toolchain,
and the wasm gate fires the same eleven waivers on the same eleven scores
as under 6.0.9, byte counts identical.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

scoreview-engine v4.7.6-engine.2

Choose a tag to compare

@github-actions github-actions released this 30 Oct 06:56
release v4.7.6-engine.2

FreeType 2.15.0 and brotli 1.2.1 (#22), both flagged security-critical by
the weekly dependency check (#12). brotli 1.2.1 fixes CVE-2026-111497, an
out-of-bounds write in the decoder that unpacks every woff2 table, fonts
handed to addFont() included; FreeType 2.15.0 carries further fixes of
its own (e.g. CVE-2026-95512).

Output is unchanged: the native corpus report is bit-identical to
v4.7.6-engine.1's for all 570 scores, SVG included, and the wasm gate
fires the same eleven waivers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

scoreview-engine v4.7.6-engine.1

Choose a tag to compare

@github-actions github-actions released this 29 Oct 21:36
release v4.7.6-engine.1

MuseScore 4.7.6 (#20). One change reaches this engine: RepeatList::unwind()
now plays a volta whose endings all lie beyond the exhausted repeats after
them. Under 4.7.5 such a score stopped at that volta - upstream's
repeat70/71 played measures 1;2;1, repeat72 1;2;1;4;5, instead of
1;2;1;3;4;5 - in MIDI and in mpos alike. CI now checks that order on
repeat70.mscx, since no vtest score has such a volta.

Everything else held still: no shadow copy drifted, and the native corpus
report is identical to 4.7.5's for all 570 scores, SVG bytes included; the
wasm gate fires the same eleven waivers. The counter starts again at 1
with the MuseScore version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

scoreview-engine v4.7.5-engine.6

Choose a tag to compare

@AndiMb AndiMb released this 25 Oct 11:53
release v4.7.5-engine.6

Views: a loaded score can now be engraved as a part, on a phone-sized page,
in concert pitch or transposed - still by MuseScore, only with other
settings. ScoreView needs this to show a singer their own part instead of
dimming the others, to give a phone larger notes than a shrunken A4 page,
and to transpose the notation along with the sound. Until now the engine
offered the score exactly as the file engraves it and nothing else.

The pieces were already there: the loader reads stored excerpts with
their style and lays them out with the main score; only the C ABI refused
every excerpt id. setExcerptId() now selects a stored excerpt,
generateExcerpts(partIds) makes one holding exactly the given parts, and
applyView() sets a page format (105 x 186 mm portrait or landscape, line
and page breaks removed, section breaks kept, empty staves hidden),
concert pitch, or a transposition by interval spelled as MuseScore's
dialog does (src/view/intervalmap.h, unit-tested).

A view keeps the main score's time axis: excerpts share its repeat list
and tempo map. savePositions(false, true) numbers measures as the main
score does, each taking the box of whatever the view draws at that tick,
so a part's multimeasure rest stands for every measure it covers.
viewMapping() maps the view back - baseElid gives the main score's
segment number at the same tick, staffMap the main score's staff - taken
before any edit, since a view of the full score edits the main score
itself. MIDI stays the main score's; an excerpt's MIDI is refused.

Metadata gains "excerpts" (stored parts with their part ids) and
"hasTransposingParts". It no longer dereferences a null playback channel
for an excerpt part (Part::midiProgram), which crashed the metadata of a
stored two-part excerpt.

The native CLI takes the same as --excerpt, --part, --view and --mapping.
The corpus gate is unchanged for the full score (no regressions over 570
scores); the two new metadata keys are allowed like the earlier additions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HR7wyuvffSuWkRYxv9D5kL

scoreview-engine v4.7.5-engine.5

Choose a tag to compare

@github-actions github-actions released this 17 Oct 16:43
release v4.7.5-engine.5

Metadata gains measureFacts and a tick per noteSpellings entry. ScoreView
wants beats per measure for its metronome and for beat numbers over the
notes, and had to estimate them from a measure's duration and the quarter
tempo - which cannot tell 6/8 from 3/4 and miscounts a pickup. The position
export says when a measure starts, not what it is; the time signature per
measure can only come from here.

measureFacts lists every notated measure as {measure, tick, sigN, sigD,
ticks}: the nominal signature it was laid out with and its actual length,
so a pickup (shorter) and an irregular measure (longer) are visible as
such. Same numbering as keySigs - score order, repeats not unrolled, 480
ticks per quarter; consecutive entries are contiguous.

noteSpellings entries carry the segment's notated tick on the same scale,
so "where in its measure does this chord stand" is one subtraction, exact,
without a detour through milliseconds and tempo.

Checked on a hand-written score with a one-quarter pickup, a 3/4 and a 6/8
measure (480, 1920, 1440, 1440 ticks) and on the key-signature fixture. The
corpus comparison against the frozen Qt baseline allows the new key; native
and wasm still compare it exactly. The MuseScore core stays unpatched.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HR7wyuvffSuWkRYxv9D5kL

scoreview-engine v4.7.5-engine.4

Choose a tag to compare

@github-actions github-actions released this 07 Oct 19:33
release v4.7.5-engine.4

Metadata gains lyricSyllables and noteSpellings. ScoreView needs both for
reading on a phone: a lyrics-only view that highlights the sung syllable,
and note names over the noteheads with "tap a note to hear it". The SVG
draws lyrics only as glyph references, without text or verse, and the
stock CLI's flat "lyrics" string loses which syllable belongs to which
verse, staff and segment - so the data can only come from here.

lyricSyllables lists every visible syllable as {elid, staff, voice,
verse, syllabic, text, melisma}; elid is the same ChordRest segment index
as in timing.json and the SVG seg-N class. Score::lyrics() is not used, it
changes playbackCount. Above 20000 syllables the field is omitted.

noteSpellings lists every drawn notehead per (elid, staff, voice) as
[pitch, tpc] in SVG document order, including grace notes and ornament
auxiliary notes, so a client can match them one-to-one with the SVG
noteheads. pitch is ppitch() (what the MIDI plays), tpc the spelling the
SVG shows. Over the vtest corpus (838 files, 14254 notes) the counts match
the SVG Note elements for every key.

The corpus comparison against the frozen Qt baseline allows the two new
keys; native and wasm still compare them exactly. The MuseScore core stays
unpatched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HR7wyuvffSuWkRYxv9D5kL

scoreview-engine v4.7.5-engine.3

Choose a tag to compare

@github-actions github-actions released this 24 Sep 07:18
release v4.7.5-engine.3

Metadata gains keySigs and rehearsalMarks. ScoreView needs the sounding
key including its mode for a start-tone/tonic button, and rehearsal marks
for jumping to "C" in rehearsal navigation. The mode is in no artifact of
the stock CLI (the MIDI key signature always carries mode byte 0), so it
can only come from here.

Both lists are built in src/meta/scoremeta.cpp from the score model; the
MuseScore core stays unpatched. Measures are counted 1-based along the
notated chain, ticks are notated (repeats not unrolled). The corpus
comparison against the frozen Qt baseline allows the two new keys, native
and wasm still compare them exactly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HR7wyuvffSuWkRYxv9D5kL

scoreview-engine v4.7.5-engine.2

Choose a tag to compare

@github-actions github-actions released this 23 Sep 16:27
release v4.7.5-engine.2

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WTxayt47EMoR1bu7Y35Hz8