magnifyMusic =
-#(define-music-function (parser location mag mus) (number? ly:music?)
- (_i "Magnify the notation of @var{mus} without changing the
-staff-size, using @var{mag} as a size factor. Stems, beams, and
-horizontal spacing are adjusted automatically.")
+#(define-music-function (parser location mag music) (positive? ly:music?)
+ (_i "Magnify the notation of @var{music} without changing the
+staff-size, using @var{mag} as a size factor. Stems, beams,
+slurs, ties, and horizontal spacing are adjusted automatically.")
+
+ ;; these props are NOT allowed to shrink below default size
+ (define unshrinkable-props
+ '(
+ ;; stems
+ Stem.thickness
+ ;; slurs
+ Slur.line-thickness
+ Slur.thickness
+ PhrasingSlur.line-thickness
+ PhrasingSlur.thickness
+ ;; ties
+ Tie.line-thickness
+ Tie.thickness
+ LaissezVibrerTie.line-thickness
+ LaissezVibrerTie.thickness
+ RepeatTie.line-thickness
+ RepeatTie.thickness
+ ))
+
+ ;; these props ARE allowed to shrink below default size
+ (define shrinkable-props
+ '(
+ ;; override at the 'Score level
+ SpacingSpanner.spacing-increment
+
+ ;; Beam.beam-thickness is dealt with separately below
+
+ ;; lengths and heights
+ Beam.length-fraction
+ Stem.length-fraction
+ Stem.beamlet-default-length
+ Slur.height-limit
+ Slur.minimum-length
+ PhrasingSlur.height-limit
+ PhrasingSlur.minimum-length
+
+ ;; every Slur.details prop that's
+ ;; not a factor, penalty, ratio, or slope
+ Slur.details.region-size
+ Slur.details.free-head-distance
+ Slur.details.free-slur-distance
+ Slur.details.gap-to-staffline-inside
+ Slur.details.gap-to-staffline-outside
+ Slur.details.extra-encompass-free-distance
+ Slur.details.extra-encompass-collision-distance
+ Slur.details.close-to-edge-length
+ Slur.details.encompass-object-range-overshoot
+ Slur.details.slur-tie-extrema-min-distance
+
+ ;; every PhrasingSlur.details prop that's
+ ;; not a factor, penalty, ratio, or slope
+ PhrasingSlur.details.region-size
+ PhrasingSlur.details.free-head-distance
+ PhrasingSlur.details.free-slur-distance
+ PhrasingSlur.details.gap-to-staffline-inside
+ PhrasingSlur.details.gap-to-staffline-outside
+ PhrasingSlur.details.extra-encompass-free-distance
+ PhrasingSlur.details.extra-encompass-collision-distance
+ PhrasingSlur.details.close-to-edge-length
+ PhrasingSlur.details.encompass-object-range-overshoot
+ PhrasingSlur.details.slur-tie-extrema-min-distance
+
+ ;; every Tie.details prop that's
+ ;; not a factor, penalty, ratio, or slope
+ Tie.details.center-staff-line-clearance
+ Tie.details.tip-staff-line-clearance
+ Tie.details.note-head-gap
+ Tie.details.stem-gap
+ Tie.details.height-limit
+ Tie.details.tie-tie-collision-distance
+ Tie.details.intra-space-threshold
+ Tie.details.outer-tie-vertical-gap
+ Tie.details.multi-tie-region-size
+ Tie.details.single-tie-region-size
+ Tie.details.between-length-limit
+ ))
#{
- \set fontSize = #(magnification->font-size mag)
- % gives beam-thickness=0.48 when mag=1 (like default),
- % gives beam-thickness=0.35 when mag=0.63 (like CueVoice)
- \temporary \override Beam.beam-thickness = #(+ 119/925 (* mag 13/37))
- \temporary \override Beam.length-fraction = #mag
- \temporary \override Stem.length-fraction = #mag
- \temporary \override Stem.thickness = #(* 1.3 (max 1 mag))
- \temporary \override Score.SpacingSpanner.spacing-increment = #(* 1.2 mag)
- #mus
- \set fontSize = 0
- \revert Beam.beam-thickness
- \revert Beam.length-fraction
- \revert Stem.length-fraction
- \revert Stem.thickness
- \revert Score.SpacingSpanner.spacing-increment
+ \context Voice {
+ \newSpacingSection
+ #(scale-fontSize mag)
+ #(scale-props unshrinkable-props mag #f)
+ #(scale-props shrinkable-props mag #t)
+ #(scale-beam-thickness mag)
+
+ #music
+
+ \newSpacingSection
+ %% reverse engineer the former fontSize value instead of using \unset
+ #(revert-fontSize mag)
+ #(revert-props (append unshrinkable-props
+ shrinkable-props
+ (list 'Beam.beam-thickness)))
+ }
#})
makeClusters =