On Thu, Nov 13, 2025 at 12:08 PM Shane Brandes <[email protected]>
wrote:

> Yes, the highest string on the bottom of the tab staff line. Which is
> precisely why I don't have a MMW. If I had I wouldn't be asking the
> question. I have tried all manner of things that I googled to no
> avail.
>
<snip>

> Finally I found this, which if you insert in the layout block for the
> tabstaff does the trick, mind you that was after more than an hour of
> googling.  stringOneTopmost = ##f
>

Shane,

Thank you for your persistence on this.  It seems that this is a hard
property to find.

Whenever you are looking for a property to affect something you are trying
to typeset, you should look in the Internals Reference.

Looking in the Internals Reference, under the TabStaff context, one can see
no reference for stringOneTopmost.

One can see the Tab_staff_symbol_engraver, which reads the property
stringTunings, for the purpose of determining the number of lines.

https://lilypond.org/doc/v2.24/Documentation/internals/tab_005fstaff_005fsymbol_005fengraver

However, the documentation makes no mention of the
Tab_staff_symbol_engraver doing anything with the pitches, which is
understandable.  There is no place on the StaffSymbol created by this
engraver to place a pitch. So the Tab_staff_symbol_engraver doesn't need to
know the value of stringOneTopmost.

What does the value of stringOneTopmost affect?  The line on which a
TabNoteHead is placed.  So let's go look in the Internals Reference for
TabNoteHead  layout object:

https://lilypond.org/doc/v2.24/Documentation/internals/tabnotehead

There's no mention there of a stringOneTopmost property, but that's not
surprising, because this property is not a property of the note head, but
of the tab staff.  But we can see that TabNoteHead is created by
Tab_note_heads_engraver, so let's go look at that.

https://lilypond.org/doc/v2.24/Documentation/internals/tab_005fnote_005fheads_005fengraver

There we can see that the Tab_note_heads_engraver reads the
stringOneTopMost property.  Aha -- we have found it!  But how to use it?

An engraver is not a layout object (grob), so it can't have grob
properties. Engravers do not have properties; they read the properties from
their enclosing context.  So in order for the Tab_note_heads_engraver to
decide whether string 1 is on the top or the bottom, it reads the
stringOneTopmost property from the TabStaff context (the context containing
the Tab_note_heads_engraver).  Thus, to put string one on  the bottom, you
can either do

\set TabStaff.stringOneTopmost = ##f

in your music, you can set it in your layout block, as you finally found,
or you can do

\new TabStaff \with {
  stringOneTopmost = ##f
} {
% music goes here
}

I've run through all this to try to show you how you could have worked with
the documentation, rather than just trying to google things.  As you found
out, Googling is not really helpful for hard-to-find properties.  But the
Internals Reference is auto-generated from the actual LilyPond codebase, so
if it's in the codebase, it's almost always in the Internals Reference.

Finally, (although I couldn't get any  help from it in this case), it's
always good to try searching the lilypond-user archives:

https://lists.gnu.org/archive/html/lilypond-user/

for detailed help in things like this.

HTH,

Carl

Reply via email to