I should add that those remarks of mine were not meant as complaints about
Lilypond; merely as observations.  I'm very aware that as an open-source
project, Lilypond's strength derives from the hard, unpaid, tireless and
often thankless work by its developers.  It is often said about open source
projects that if you want some particular functionality, you should write
it yourself and submit it for review.  However, my programming skills (at
least in scheme) are too poor for this myself.

But maybe your code could be submitted to be part of Lilypond in future?

Alasdair

On Tue, 8 Aug 2023 at 11:48, Alasdair McAndrew <amc...@gmail.com> wrote:

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


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

https://numbersandshapes.net

Reply via email to