This is a very helpful deep dive. As an occasional user, and still a newb, I greatly benefit from this demonstration of stepping through the docs. Thank you. But you’d need to be a programmer to understand how to trace through these functions as you did here. (Fortunately I am one, though not with scheme). This highlights a gap in LilyPond documentation and usability.
Also I think you meant to demonstrate this use of Internals as an alternative, or improvement, over googling (which Shane did to find “stringOneTopmost”). But your effort started with the answer he already found. It begs the question how one would have found this, via the docs, if one only started with the idea: “I want the highest sounding string on the bottom line.” Thanks again. On Thu, Nov 13, 2025 at 1:19 PM Carl Sorensen <[email protected]> wrote: > > > 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 >
