lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: A query about tablature


From: Alasdair McAndrew
Subject: Re: A query about tablature
Date: Tue, 8 Aug 2023 11:48:20 +1000

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 <lfm@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

[Prev in Thread] Current Thread [Next in Thread]