Revision history for Music-NWC2MusicXML

0.002.4	Tue Nov  3 04:12:32 PM EST 2026
	[ Bug Fixes ]
	- MusicXML: DynVariance events (Style:Crescendo / Style:Diminuendo) were
	  incorrectly emitted as hairpin wedge elements (<wedge type="crescendo"/
	  <wedge type="diminuendo"/>).  DynVariance records represent written text
	  markings ("cresc.", "dim.") not hairpins; hairpins come from
	  Opts:Crescendo/Opts:Diminuendo on individual notes.  DynVariance is now
	  emitted as <words font-style="italic">cresc.</words> or
	  <words font-style="italic">dim.</words>.  Style:crescOff now correctly
	  emits nothing (no stop element needed for a text marking).
	- Parser: Text events with a Pos field but no Placement field defaulted to
	  placement="below" regardless of vertical position.  Placement is now
	  inferred from the sign of Pos: Pos >= 0 gives above, Pos < 0 gives below.
	  This fixes text directions such as "Slightly faster" (Pos:7) appearing
	  below the stave instead of above it.
	- Parser: StaffProperties EndingBar values such as "Section Close" were
	  stored verbatim with spaces, but _emit_measure compared against the
	  no-space forms ("SectionClose").  The mismatch caused the ending barline
	  to be silently dropped.  EndingBar values are now normalised (spaces
	  stripped) on ingestion.  Additionally, a second StaffProperties record
	  (carrying channel/volume data) was clobbering the EndingBar already
	  parsed from the first record; _ending_bar is now only updated when the
	  field is present in the record.

0.002.3	Mon Nov  2 02:09:55 PM EST 2026
	[ Bug Fixes ]
	- Parser/MusicXML: Tempo records with an optional Text field (e.g.
	  Text:"With Expression") were silently discarded.  The text is now stored
	  in the Tempo event and emitted as a <words font-style="italic"> direction
	  in the same <direction> block as the metronome mark.  When text is
	  present the metronome element uses parentheses="yes" so renderers display
	  the marking as e.g. "With Expression (crotchet = 92)".
	- MusicXML: TempoVariance style Ritenuto was emitted verbatim as "Ritenuto"
	  instead of the standard abbreviation "rit.".
	- t/edge_cases.t: permission-check subtest now skips on Cygwin where
	  chmod 0000 does not restrict file reads due to Windows ACL mapping.
	  fixes https://matrix.perl-magpie.org/results/b4259172-d4a0-11f1-b947-97e253e5423d

0.002.2	Fri Oct 30 04:14:18 PM EDT 2026
	[ Bug Fixes ]
	- Parser: NWCTXT files produced by some NWC versions spell the hairpin
	  dynamic record as DynamicVariance instead of the abbreviated DynVariance.
	  Added DynamicVariance as an alias in the dispatch table so crescendo,
	  diminuendo, and hairpin-off markings are parsed correctly from both spellings.

0.002.1	Mon Oct 12 04:14:34 PM EDT 2026
	[ Bug Fixes ]
	- NWC TempoVariance:Fermata records were emitted as a text direction
	  (<words font-style="italic">Fermata</words>) instead of the correct
	  MusicXML <fermata/> notation element on the decorated note or rest.
	  Fermata symbols now appear as <notations><fermata/></notations> on the
	  sounding event that immediately follows the TempoVariance:Fermata record.

0.002.0	Fri Oct  9 08:39:33 PM EDT 2026
	[ Bug Fixes ]
	- MusicXML::_annotate_events: slur_stop was placed on the last note carrying
	  the Slur token rather than on the landing note (the first following note
	  without Slur).  For the common single-note slur this produced a zero-length
	  arc with start and stop on the same note.
	- NWC::read: suppress autodie on the open() call so the "Cannot read file"
	  croak fires correctly on Cygwin, where -r returns true for chmod 0000 files
	  due to imprecise Windows ACL mapping.
	  fixes https://matrix.perl-magpie.org/results/dbc4dafe-7e31-1014-904b-aa3c0773776a
	[ Enhancements ]
	- Score::validate now performs per-staff checks when --validate is passed:
	  empty staff detection, measure-duration consistency against the active
	  time signature, unmatched tie detection, and unclosed slur detection.

0.001.1	Fri Sep 19 12:00:00 PM EDT 2026
	[ Bug Fixes]
	- Fix Test Dashboard URL
	- Bump minimum version of Params::Validate::Strict
	  fixes https://matrix.perl-magpie.org/results/c463e98e-b3b3-11f1-9d51-cce2e4961366

0.001.0	Fri Sep 18 12:49:11 PM EDT 2026
      Initial CPAN release. Fully functional NWC-to-MusicXML conversion pipeline.

      Core modules:
      - Music::NWC2MusicXML         -- top-level facade; single-file and batch conversion.
      - Music::NWC2MusicXML::NWC    -- NWC 2.x binary container decoder (zlib decompression).
      - Music::NWC2MusicXML::Parser -- NWCTXT text parser producing Score/Staff/Event trees.
      - Music::NWC2MusicXML::Score  -- internal score model.
      - Music::NWC2MusicXML::Staff  -- internal staff model.
      - Music::NWC2MusicXML::Event  -- internal event model with exact rational durations.
      - Music::NWC2MusicXML::MusicXML -- MusicXML 4.0 generator.
      - Music::NWC2MusicXML::Diagnostics -- i18n warning/logging subsystem.
      - bin/nwc2musicxml            -- command-line interface.

      MusicXML features emitted:
      - Notes, chords, rests (all NWC durations; dotted, double-dotted, triplets).
      - Grace notes (<grace/> element; duration omitted per MusicXML schema).
      - Slurs (numbered 1-6 for simultaneous arcs), ties, articulations, ornaments.
      - Clef, key-signature, and time-signature changes (initial and mid-staff).
      - Transposing instruments (<transpose><chromatic>).
      - Tempo and tempo-variance directions (metronome, rit., accel., etc.).
      - Dynamic markings with per-staff MIDI velocity (DynVel) mapping.
      - Hairpin crescendo/diminuendo wedges.
      - Text directions, flow-control marks (coda, segno, D.C., D.S., Fine, ...).
      - Lyrics with syllabic type (begin/middle/end/single).
      - Part groups (bracket and brace) from WithNextStaff flags.
      - MIDI channel, program, volume, and pan from NWC staff properties.
      - Visible/hidden staves (print-object="no" on part-name).
      - Custom ending barlines from NWC EndingBar property.
      - Asymmetric page margins (Left/Right/Top/Bottom from PgMargins).
      - Word-font and lyric-font defaults from NWC Font records.
      - Score metadata: title, author, lyricist, copyright, comments.
      - Repeat barlines (MasterRepeatOpen/Close, LocalRepeatOpen/Close).
      - Double, section-close, and other barline styles.

      CLI features:
      - Single-file and batch conversion.
      - Recursive directory scanning (--recursive).
      - Selectable output directory (--output-dir).
      - Overwrite guard (--overwrite).
      - Warning log file (--warnings).
      - Extended consistency validation (--validate).
