Dear Lukas-Fabian (if I may),

Thank you very much - that is quite amazing!  But it does show what I have
long suspected: that without some extra programming, Lilypond does not have
a current facility to extract the rhythm from a music definition.  All of
the tablatures I've seen in Lilypond require the music to be entered twice:
once fully, and the other as durations only.   As well, the
tablature section in the documentation nowhere shows how to do this: to
create a tablature score with just the rhythm above it.   Maybe this will
be amended in future versions?

Thank you again,
Alasdair

On Tue, 8 Aug 2023 at 06:15, Lukas-Fabian Moser <l...@gmx.de> wrote:

> Hi Alasdair,
>
> Am 07.08.23 um 07:05 schrieb Alasdair McAndrew:
> > In fact you can just look at the snippet at
> > https://lsr.di.unimi.it/LSR/Item?id=848 I've set mine up slightly
> > differently, with letters between the lines, but the principle is the
> > same.  But as you see from this snippet, you have to enter the notes
> > and values for the tablature stave, and the note durations again (with
> > appropriate "silent" notes) for the rhythm stave.  And both these
> > staves have to be created independently and put together at the end.
> >
> > I want to know if you can do this without having to enter the rhythm
> > durations and stave separately - the information in "myNotes" in the
> > snippet contains all the information needed. I'm hoping for a solution
> > where all you need to enter is "myNotes", and then both the tablature
> > staff and the rhythm staff would be created in one go.
> >
> > Thank you again.
>
> That's basically a matter of programmatically turning the given music
> into bare (pitch-less) durations while skipping repeated durations.
>
> Question: What should be done for actual rests in the input?
>
> One possible approach might be:
>
> \version "2.24.0"
>
> %% http://lsr.di.unimi.it/LSR/Item?id=848
> %LSR modified by P.P.Schneider on Feb.2014 for v2.18
> % modified by L.-F. Moser in Aug. 2023
> % (added \extractRhythm and \tabStaves)
>
> %{ Tablature layout for viol music
>
> The snippet defines a specialized group of rhythmic and
> tablature staves able to handle old english viol tablature
> scores.
>
> The string tunings defaults to the most common viol in d
> but other usual tunings are also available.
>
> The rhythm part is used to provide only the pace changes,
> and therefore must be provided as a supplementary voice.
> %}
>
> viol-in-d-tuning = \stringTuning <d, g, c e a' d'>
>
> viol-in-d-scord-tuning = \stringTuning <c, g, c e a' d'>
>
> viol-in-g-tuning = \stringTuning <g, c f a' d' g''>
>
> ViolTabLayout = \layout {
>    \context {
>      \RhythmicStaff
>      \type "Engraver_group"
>      \name "ViolTabRhythmicStaff"
>      \alias "RhythmicStaff"
>
>      \description "Handles rhythm part of viol tablature."
>
>      \remove "Time_signature_engraver"
>      \remove "Staff_symbol_engraver"
>      \remove "Bar_engraver"
>
>      fontSize = #-3
>      \override StaffSymbol.staff-space = #(magstep -3)
>      \override Stem.length = #5
>      \override VerticalAxisGroup.staff-staff-spacing =
>      #'((basic-distance . 1)
>         (minimum-distance . 1)
>         (padding . 1))
>
>      % useful to merge chords noteheads
>      \override NoteHead.X-offset = #0
>    }
>
>    \context {
>      \TabStaff
>      \type "Engraver_group"
>      \name "ViolTabFingeringStaff"
>      \alias "Staff"
>
>      \description "Handles fingering part of viol tablature."
>
>      tablatureFormat = #fret-letter-tablature-format
>      stringTunings = #viol-in-d-tuning
>
>      % useful for tablature only scores
>      \revert TimeSignature.stencil
>      \override TimeSignature.style = #'single-digit
>    }
>
>    \context {
>      \type "Engraver_group"
>      \name "ViolTabStaff"
>      \consists "Vertical_align_engraver"
>      topLevelAlignment = ##f
>
>      \description "Handles viol tablature."
>
>      \defaultchild "ViolTabFingeringStaff"
>      \accepts "ViolTabRhythmicStaff"
>      \accepts "ViolTabFingeringStaff"
>    }
>
>    \context {
>      \Score
>      \accepts "ViolTabStaff"
>    }
> }
>
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>
> #(define rest-or-skip?
>     (music-type-predicate '(skip-event general-rest-event)))
>
> extractRhythm =
> #(define-music-function (mus) (ly:music?)
>     (make-music
>      'SequentialMusic
>      'elements
>      (let loop
>        ((remaining-notes
>          (extract-typed-music (event-chord-reduce mus)
>                               'rhythmic-event))
>         (current-duration #f))
>
>        (if
>         (null? remaining-notes)
>         '()
>         (let*
>          ((note (car remaining-notes))
>           (duration (ly:music-property note 'duration)))
>          (cons
>           (make-music
>            (if (or (rest-or-skip? note)
>                    (equal? duration current-duration))
>                'SkipEvent
>                'NoteEvent)
>            'duration duration)
>           (loop (cdr remaining-notes)
>                 (if (rest-or-skip? note) current-duration duration))))))))
>
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>
> tabStaves =
> #(define-music-function (mus) (ly:music?)
>     #{
>       <<
>         \new Staff \with { \clef bass } {
>           #mus
>         }
>         \new ViolTabStaff {
>           <<
>             \new ViolTabRhythmicStaff {
>               \extractRhythm $mus
>             }
>             \new ViolTabFingeringStaff { #mus }
>           >>
>         }
>       >>
>     #})
>
> myNotes = \relative c {
>    <d, g d'>4 e f8 g a4
>    <d b g>2. c4
>    d4. e8 f4 g
>    r8 g g f e4 a
> }
>
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>
> \score {
>    \tabStaves \myNotes
>    \layout {
>      \ViolTabLayout
>    }
> }
>
> Lukas
>
>

-- 
Alasdair McAndrew (he/him)
mob: 0432 854 858

https://numbersandshapes.net

Reply via email to