One last question regarding this:

* Given that now I have a way to not have to set the N.C. symbol to the
empty string, is there a way to preserve a method of using the N.C symbol
when I _want_ it?  In other words, can you _escape_ a rest so that it
doesn't get converted to a skip, say by using a variable or function to
wrap it?

That would be nice to know, but not absolutely necessary.

Thanks yet again.


On Fri, Feb 17, 2023 at 4:48 PM Jean Abou Samra <j...@abou-samra.fr> wrote:

> Le vendredi 17 février 2023 à 16:39 -0600, Matthew Probst a écrit :
>
> I'm working on charts/scores for a full rock/funk band performance, and I
> am wondering whether there's an easy way to do what I'm looking for.
> I understand chordmode and nodemode, and I understand how to set up
> separate voices to show the chordnames and a pitch squashed rhythmic
> notation of hte chords.  This makes for a really nice way to notate rhythm
> and chor dnames of guitar chords from the same chordnames variable without
> having to tweak it separately for both.  The minimal Lilypond example looks
> like this (sorry about lack of attestation on the Scheme snippet to convert
> chords into just one note for the pitch squash staff, picked it up some
> time ago and lost track of it.)
>
> \version "2.24.1"
>
> VerseRhythmChords = {
>     \chordmode {
>         e16:9 r8 q16 r8 q16 r16 r16 q16 r8 q16 q16 r8
>         e16:9 r8 q16 r8 q16 r16 r16 q16 r8 q16 q16 r8
>         e16:9 r8 q16 r8 q16 r16 r16 q16 r8 q16 q16 r8
>         bes16 q16 r16 q16 q4 g16 q16 r16 q16 q4
>     }
> }
>
> firstNoteOfChord =
> #(define-music-function (music) (ly:music?)
>    (define (iter mus)
>      (let ((elt (ly:music-property mus 'element))
>            (elts (ly:music-property mus 'elements)))
>        (map iter elts)
>        (if (not (null? elt)) (iter elt))
>        (if (and (music-is-of-type? mus 'event-chord) (not (null? elts)))
>            (ly:music-set-property! mus 'elements (list (car elts))))))
>    (iter music)
>    music)
>
> <<
>     \new ChordNames {
>         \set noChordSymbol = ""
>         \set chordChanges = ##t
>         \VerseRhythmChords
>     }
>     \new Voice \with {
>         \consists "Pitch_squash_engraver"
>     } {
>         \improvisationOn
>         \firstNoteOfChord \VerseRhythmChords
>         \improvisationOff
>     }
>
> Attached find a .PNG of the output.  I tried to hide the noChordSymbol
> with the \set noChordSymbol = "".  That hides the chord symbols, as I want
> to specify the rhythm in the chord part and don't want to show N.C. on
> every little rest.  And I'd like to show just changes in the chord, not on
> every note.  That works in cases where there are no rests between
> chords.  But the hidden N.C. symbols still "cancel" whatever the last chord
> was, kinda flooding the page with lots of extraneous chords in this
> particular application.
>
> I see how the default behavior is logical and valuable in most cases, but
> I'm wondering, in individual user-specified caess:
>
>    -
>
>    Is there a way to somehow turn off the N.C. handling entirely, without
>    a lot of trouble, for a given stretch of /chordmode?  Not just hide the
>    N.C. symbol, but cancel the fact that it determines those to be no-chord
>    spots in the score.
>    -
>
>    Failing that, what's a good workflow for handling situations where I
>    want to specify something more detailed than the "basic slash rhythm
>    notation" in the manuals, and the chord names, without overly duplicating
>    my work?
>
> Workarounds are welcome for now.  What I find myself *wanting* is a way
> to combine the articulations possible in /notemode (posisbly using special
> markups, as the syntax conflicts some) in /chordmode, in a way that passes
> through to the pitch squash engraver, without having to overly repeat
> myself.  I have basic programming knowledge and a decent understanding of
> Scheme the language itself, but not lots of experience with the internals
> of Lilypond.
>
> I get that I'm steering outside what lots of people do with this, just
> wondering what approaches make sense here.
>
> Maybe just convert all rests to skips? Like
>
> \version "2.24.1"
>
> VerseRhythmChords = {
>     \chordmode {
>         e16:9 r8 q16 r8 q16 r16 r16 q16 r8 q16 q16 r8
>         e16:9 r8 q16 r8 q16 r16 r16 q16 r8 q16 q16 r8
>         e16:9 r8 q16 r8 q16 r16 r16 q16 r8 q16 q16 r8
>         bes16 q16 r16 q16 q4 g16 q16 r16 q16 q4
>     }
> }
>
> firstNoteOfChord =
> #(define-music-function (music) (ly:music?)
>    (define (iter mus)
>      (let ((elt (ly:music-property mus 'element))
>            (elts (ly:music-property mus 'elements)))
>        (map iter elts)
>        (if (not (null? elt)) (iter elt))
>        (if (and (music-is-of-type? mus 'event-chord) (not (null? elts)))
>            (ly:music-set-property! mus 'elements (list (car elts))))))
>    (iter music)
>    music)
>
> restsToSkips =
> #(define-music-function (music) (ly:music?)
>    (music-map (lambda (m)
>                 (if (music-is-of-type? m 'general-rest-event)
>                     (make-music 'SkipEvent m)
>                     m))
>               music))
>
> <<
>     \new ChordNames {
>         \set noChordSymbol = ""
>         \set chordChanges = ##t
>         \restsToSkips \VerseRhythmChords
>     }
>     \new Voice \with {
>         \consists "Pitch_squash_engraver"
>     } {
>         \improvisationOn
>         \firstNoteOfChord \VerseRhythmChords
>         \improvisationOff
>     }
> >>
>
>

Reply via email to