How to bring back the colour to the dots in a fretboard in Lilypond 2.20? - lilypond

I need help with a rather obscure problem. But important to me as an educator.
In Lilypond 2.18 and before, using the colouring scheme from the snippets (https://t1p.de/b7s8) I was able to colour the dots of the fretboard with the root note colour. I would simply use the code:
\override FretBoard #'color = #color-notehead.
(top part of the attached image)
When I upgraded to Lilypond 2.20, the colour from the dots vanished, replaced by black (as in the bottom part of the attached image).
I didn't change any of the code (which I can provide if needed).
Now, with
\override FretBoard #'(fret-diagram-details dot-color) = #'white
I can override the dot-colour to some static colours - but it's a far cry from the beauty of dynamically coloured dots.
Could someone advise where this went wrong?
Attached image with 2.18 and 2.20 renditions of the same code
Here's a Minimal code sample, which colours dynamically the dots by it's root note in 2.18, but leaves them with a static colour in 2.20
\version "2.20.0"
\header { title = "Guitar Chords"}
{
%Chords
\storePredefinedDiagram #default-fret-table \chordmode {a}
#guitar-tuning #"o;o;2-2;2-3;2-4;o;"
\storePredefinedDiagram #default-fret-table \chordmode {bes}
#guitar-tuning #"1-1-(;1-1;3-2;3-3;3-4;1-1-);"
\storePredefinedDiagram #default-fret-table \chordmode {c}
#guitar-tuning #"3-3;3-4;2-2;o;1-1;o;"
}
%Colour map
#(define color-mapping
(list
(cons (ly:make-pitch 0 0 NATURAL) (x11-color 'red3))
(cons (ly:make-pitch 0 5 NATURAL) (x11-color 'blue3))
(cons (ly:make-pitch 0 6 FLAT) (x11-color 'magenta3))
)
)
%Compare pitch and alteration (not octave).
#(define (pitch-equals? p1 p2)
(and
(= (ly:pitch-alteration p1) (ly:pitch-alteration p2))
(= (ly:pitch-notename p1) (ly:pitch-notename p2))))
#(define (pitch-to-color pitch)
(let ((color (assoc pitch color-mapping pitch-equals?)))
(if color
(cdr color))))
#(define (color-notehead grob)
(pitch-to-color
(ly:event-property (event-cause grob) 'pitch)))
chordNames = \chordmode { a2 bes c }
\score {
<<
\new ChordNames \chordNames
\new FretBoards
{ \override FretBoards.FretBoard #'size = #'2.0
\override FretBoard #'(fret-diagram-details finger-code) = #'in-dot
\override FretBoard #'(fret-diagram-details orientation) = #'portrait
%This command changes the colour of the fretboard (and used to change the dots in 2.18)
\override FretBoard #'color = #color-notehead
\chordNames
}
>>
}

On the Lilypond Forum, Harm posted a hack. When added, it colours the dots in the same colour as the fretboard. It's a temporary solution, but works as a charm.
\override FretBoards.FretBoard.before-line-breaking =
#(lambda (grob)
(ly:grob-set-nested-property! grob '(fret-diagram-details dot-color)
(color-dot grob)))

Related

How can I include ossia without creating a blank space?

I am trying to add an ossia staff above the upper staff of a grand
staff. Working from this mailing list post, I have
constructed a minimal example that almost does what I want. The
problem is that the entire score contains a blank space for the ossia
staff, even in systems that have no ossia.
Here is the example (truly, a melodious composition):
\version "2.18.2"
ossia = \new Staff = "ossia" \with {
\remove "Time_signature_engraver"
fontSize = #-2
\override StaffSymbol #'staff-space = #(magstep -2)
\override Clef #'transparent = ##t
\override KeySignature #'stencil = ##f
} {
\key b \major
\override Staff.BarLine #'allow-span-bar = ##f
\stopStaff
s2.*100 % ???
}
treble = \new Staff = "treble" {
\clef treble
\key b \major
\relative c' {
\repeat unfold 10 { b8 cis dis fis dis cis }
b4 dis fis |
b4
<<
{ dis, fis }
\context Staff = "ossia" {
\startStaff \tuplet 3/2 { dis8 b dis } fis4 \stopStaff
}
>> |
b2. |
}
}
bass = \new Staff = "bass" {
\clef bass
\key b \major
\relative c {
\repeat unfold 12 { fis,4 fis4 fis4 | }
b2.
}
}
pianoStaff = \new PianoStaff {
\compressFullBarRests
\time 3/4
<<
\ossia
\treble
\bass
>>
}
\paper {
#(set-paper-size "letter")
indent = 25\mm
short-indent = 5\mm
}
\score {
<< \pianoStaff >>
% This changes nothing:
% \layout { \context { \Staff \RemoveEmptyStaves } }
}
Here is the output (PNG image, 85 KB).
Some interesting things to note:
If I remove the s2.*100 at line 13 (marked % ???), or change the
value to anything smaller than 12, the ossia staff renders
completely incorrectly. It appears below the bass clef, includes the
clef and time signature, and is in the key of C (i.e., the rendered
notes include accidentals). Basically, it looks like it's failed to
notice that the ossia staff exists and has constructed a brand new
one. I suspect that this is because the ossia staff is supposed to
extend past each point where it is used—i.e., when switching staff
contexts, one can go "back in time" but not forward. I don't really
understand this, but I can live with it, as it doesn't seem to have
an intrinsic effect as long as \compressFullBarRests is enabled.
I have included the paper size in the MWE to force consistent
dimensions on different systems.
As I noted in the score, adding \RemoveEmptyStaves does not remove
the empty staves.
My question is: how can I keep the ossia staff rendered as it does in
this example (small and above the treble clef) without adding the
empty space on all previous systems?
\RemoveEmptyStaves is not working because the staves are within a PianoStaff, so you must add \remove "Keep_alive_together_engraver" to the \layout block. Here's a minimal example of a documentation snippet slightly modified:
\version "2.18.2"
\new PianoStaff
<<
\new Staff = "ossia" \with {
\remove "Time_signature_engraver"
\hide Clef
fontSize = #-3
\override StaffSymbol.staff-space = #(magstep -3)
\override StaffSymbol.thickness = #(magstep -3)
} \relative c'' {
R1*3
c4 e8 d c2
}
\new Staff \relative c' {
c4 b c2
e4 f e2
g4 a g2 \break
c4 b c2
g4 a g2
e4 d c2
}
>>
\layout {
\context {
\Staff \RemoveEmptyStaves
\override VerticalAxisGroup.remove-first = ##t
}
\context {
\PianoStaff
\remove "Keep_alive_together_engraver"
}
}
Your example is quite big, not a real MWE. s2.*100 doesn't make any sense to me. I suggest that you submit a smaller example.

How to reliably display a delayed turn?

I'm trying to typeset a short piano piece, 'Nocturne n°5' by John Field. My main problem occurs on bars 14, 17 and 38 where a gruppetto is rendered as a delayed turn with a natural sign.
This is how it looks like in one of the editions you can find on the Internet:
This what I can achieve myself:
This is the code that I have tried:
\version "2.8.12"
upper = \relative c'' {
\key bes \major
\time 12/8
%bar 14
d4.-> c2.
<<
{
c4.( f4. ees4 c8 bes4. c4.
des2.~\sf des4.)
}
\\
{
% we create the following sequence: { r8 d16 c16 b16 c16 }
s8
\single \hideNotes d16
\single \hideNotes c16
\single \hideNotes \once \set suggestAccidentals = ##t
\single \hideNotes \once \override AccidentalSuggestion #'outside-staff-priority = ##f
\single \hideNotes \once \override AccidentalSuggestion #'avoid-slur = #'inside
\single \hideNotes \once \override AccidentalSuggestion #'font-size = #-3
\single \hideNotes \once \override AccidentalSuggestion #'script-priority = #-1
\single \hideNotes b16-\turn
\single \hideNotes c16
% those spaces are to align with the second voice
% kept in the for the duration of the phrasing slur
s2. s2.
s2. s4.
}
>>
}
lower = \relative c {
\key bes \major
\time 12/8
%bar14
e8[( \sustainOn c'8 bes8 g'8 c,8 bes8]
e,8[ g'8 bes,8]
ees,8[ \sustainOn f'8 a,8])
d,8[( \sustainOn f'8 bes,8]
ees,8[ \sustainOff c'8 g8]
f8[ d'8 bes8]
f8[ ees'8 a,8])
}
\score {
\new PianoStaff
<<
\new Staff = "upper" { \clef treble \upper }
\new Staff = "lower" { \clef bass \lower }
>>
\layout { }
}
You'll notice that I chose to create a temporary polyphonic passage and I have a choice to hide either the upper or the lower voice. I have experimented with both but it seems more logical to keep the rendered voice on the upper side and keep the lower voice hidden. However, this make the turn appear on the lower part of the staff.
Edit
I have updated the question with a snippet that should now compile for others to try. My main problem is that the delayed turn happens during a passage that must span a phrasing slur. Since I could not find a way to have a slur span across single-voice and multi-voice passages, I need to keep the polyphonic passage for longer than just the delayed turn part.
How can I improve on the placement of the turn and the accidental.
In your updated example, the problem is different so I'm adding a new answer.
You are using the double backslash construct in the temporary polyphonic passage and the turn displays below the staff. This happens because you never define the voices explicitely. In the Notation Reference 1.5.2:
The << {…} \ {…} >> construct, where the two (or more) expressions
are separated by double backslashes, behaves differently to the
similar construct without the double backslashes: all the expressions
within this construct are assigned to new Voice contexts. These new
Voice contexts are created implicitly..
So LilyPond will assign \voiceOne to the first voice and \voiceTwo to the second voice. In \voiceTwo the \turn and other similar objects are displayed below the staff. I recommend reading Explicitly instantiating voices.
Solution: either remove the \\ or add \voiceThree in the second voice of the temporary polyphonic passage (\voiceOne is implicitely used in the first voice of the passage and if you use it in the second you'll have a collision with the slur; that's why you need \voiceThree).
You shouldn't use the \turn within a \markup block; instead, attach it immediately to the note:
\once \hideNotes b16-\turn
By the way, this is the example in the lilypond documentation.
I could not compile your snippet so I recreated it from scratch (disclaimer: I don't play piano and my musical knowledge is limited) but it looks fine to me:
\version "2.19.40"
global = {
\key bes \major
\numericTimeSignature
\time 12/8
}
right = \relative c'' {
\global
% bar 14
<<
{ d4.-> c2. c4.-2( | }
{
s1 s4
\once \set suggestAccidentals = ##t
\once \override AccidentalSuggestion.outside-staff-priority = ##f
\once \override AccidentalSuggestion.avoid-slur = #'inside
\once \override AccidentalSuggestion.font-size = -3
\once \override AccidentalSuggestion.script-priority = -1
\single \hideNotes
b4-\turn
}
>>
f'4.-5) ees4-3
}
left = \relative c {
\global
% bar 14
e8\sustainOn([ c' bes g' c, bes] e, g' bes, ees,\sustainOn f' a,) |
ees8\sustainOn f' bes,-2 f-5\sustainOff
}
\score {
\new PianoStaff
<<
\new Staff = "right" \right
\new Staff = "left" { \clef bass \left }
>>
\layout { }
}

Lilypond: manually print a key signature (or cancellation)

My piece involves a D.S. al coda repeat across a key signature change, like:
\mark \markup { \musicglyph #"scripts.segno" }
\key a \minor
a b c' d'
% more music in a minor
\key a \major
a b cis' d'
% more music in a major
\once \override Score.RehearsalMark #'break-visibility = #end-of-line-visible
\once \override Score.RehearsalMark #'self-alignment-X = #RIGHT
\mark "D.S. al coda"
\bar "||"
% coda in a major follows
To help the player make the transition back from a major to a minor at the dal segno I'd like to print a key cancellation just before the double bar. The bars of the coda that follows, should remain in a major.
How would I accomplish that in Lilypond 2.14 or higher?
Append to your code
\key a \minor % change key back from a-major to a-minor
s1 % enforce output of key cancellation with a hidden rest
\bar "" % suppress trailing bar

How do I limit the Staff.NoteHead overrides?

I often have a string of harmonics, so I decided to use a music function (the function is a tangent; if I place the override directly with the notes I get the same problem. The issue is the override itself):
harmonics =
#(define-music-function
(parser location notes)
(ly:music?)
#{
%\harmonicsOn
\override Staff.NoteHead #'style = #'harmonic-mixed
$notes
\revert Staff.NoteHead #'style
%\harmonicsOff
#}
)
\harmonicsOn and \harmonicsOff works, but they're always hollow notes so I don't want to use them. Overriding the notehead allows me to have solid heads on quarter notes.
My problem is that the note heads are overridden for all notes in the duration, not only the notes supplied to the function (see m. 2, 3 in the image below the following code):
melody = \relative c' { \stemUp
\repeat unfold 4 { r8 b g b e' b, | }
\bar "|."
}
harmony = \relative c' { \stemDown
e,2. |
\harmonics { e } |
\harmonics { e4 e } s |
e2. |
}
\score {
\new Staff {
\time 3/4 \clef "treble_8"
\key g \major
<<
\new Voice { \melody} \new Voice { \harmony}
>>
}
}
I'm looking for a way to modify only the notes I want (in this case, in \harmony), leaving the other notes within that duration untouched.
Edit: I tried with lilypond 2.17 using the new \temporary command, but I get the same result.
Full code | NoteHead Internals Documentation
Your problem is that your function uses the \override command, which affects all simultaneous grobs in a given context, and thus it is changing all noteheads in the Staff context (which contains both melody and harmony music). If you change the noteheads only in the Voice context, then your problem is solved:
harmonics =
#(define-music-function
(parser location notes)
(ly:music?)
#{
%\harmonicsOn
\override Voice.NoteHead #'style = #'harmonic-mixed
$notes
\revert Voice.NoteHead #'style
%\harmonicsOff
#}
)

Changing all the colors in Lilypond

In Lilypond I can change the color of one type of object with a line like
\override Staff.Clef #'color = #(rgb-color 0.4 0.5 0.6)
I'd like to have everything in the same (non-default) color, but I neither found a list of all the objects I could color nor did I find a command to change all the colors at once. Could anybody please point me to either?
The LilyPond Snippet Repository has a solution that iterates through the list of objects contained in all-grob-descriptions:
#(define (override-color-for-all-grobs color)
(lambda (context)
(let loop ((x all-grob-descriptions))
(if (not (null? x))
(let ((grob-name (caar x)))
(ly:context-pushpop-property context grob-name 'color color)
(loop (cdr x)))))))
% Example of usage:
\relative c' {
\applyContext #(override-color-for-all-grobs (x11-color 'blue))
c4\pp\< d e f
\grace { g16[( a g fis]) } g1\ff\!
}
Note that this will change the color of every graphical object only if you run it in the proper context (Score, I think, will generally suffice), so you may need to do the following if you're in the middle of, say, a Voice context:
\stopStaff
\context Score
\applyContext #(override-color-for-all-grobs (x11-color 'blue))
\startStaff
The list of graphical objects you need is at the bottom of this page. So a simple albeit tedious approach would be to iterate through all those objects you use, e.g.
\override Staff.Clef #'color = #(rgb-color 0.4 0.5 0.6)
\override Staff.NoteHead #'color = #(rgb-color 0.4 0.5 0.6)
\override Staff.Beam #'color = #(rgb-color 0.4 0.5 0.6)
\override Staff.Slur #'color = #(rgb-color 0.4 0.5 0.6)
etc.
There's probably a much better way but I can't figure it out. Alternatively, as has been suggested before you could consider doing some post-processing on the output from Lilypond, which may be simpler depending on the tools you have available.
I strongly recommend that you read the excellent documentation, in particular how to navigate the Internals Reference as covered by the Learning Manual and the Notation Reference
Also you may obtain a better answer from the lilypond-user mailing list.