>
>
> ---------- Forwarded message ----------
> From: Lucas Pinke <[email protected]>
> To: Carl Sorensen <[email protected]>
> Cc: "Tim's Bitstream" <[email protected]>, List Lilypond-User Mailing <
> [email protected]>
> Bcc:
> Date: Thu, 25 Dec 2025 19:40:34 -0300
> Subject: Re: ChordName tensions in parenthesis
>
>> I thought about using a chord exceptions file with \include, but it would
>> have to include every permutation of tensions and extensions being used.
>
>
> Reading Carl's first email, I've thought of the same... but writing this
> file and configuring it would be a seven headed beast on its own.
>


I have mixed feelings about suggesting this since in general I think your
idea about using parentheses in chord symbols is misguided.

Parens do not convey any additional information so they simply take up
space.  Especially with the intended horizontal layout, chord symbols with
more than one extension end up being horizontally long and this creates
layout issues when space becomes an issue, such as when there are
half-measure chords.

Rather, in general I would suggest an approach that stacks extensions.  If
the intention of the parens is to help differentiate the extensions from
the base chord symbol, that can be accomplished by the smaller font and
stacked placement for extensions.

In any case, that is all opinion and I will not try any more to convince
you otherwise.


However, to accomplish what you want, I do think that using "chord
exceptions" is the way to go.

You complain about how many there are, but there are probably fewer of them
than the amount of text you've already typed in this thread.

My opinion about chord symbols is that to do a great job, you absolutely
need a style sheet that works with the font you choose to use, and sets the
relative sizes and positions of the chord root, the symbol, and the
extensions.  It is not just a string of text.  Any approach that is just a
string of text is bound to be mediocre (IMHO).

While it is nice that lilypond provides a bunch of controls to tweak
things--such as the no chord symbol and the symbol used for major--we can't
expect it to do a great job with only these tweaks, because it lacks full
typographic control of the different parts of the chord symbol.

Of course, chord exceptions allow you to do this, but you have to
completely roll your own.

In terms of future lilypond development concepts, I think the best thing
would be to define some sort of typographic structure that could be applied
to all chord symbols which treats the different parts of the chord symbol
differently, and has config for font family, font size, and
spacing/placement for each part of the chord symbol, and ideally treats
cases for different numbers of extensions differently.

It is also a difficult topic since there is no single standard for chord
symbols, and there are several competing approaches.  All of which are
somewhat valid.

This also includes topics like, is a 9th chord formatted like a 7th chord
but just with a 9, or do you want to list it as a 7th chord with a 9
extension?  Is a maj7 chord formatted with the maj7 is an extension?  How
about for a minor chord with a major 7, is the major 7 treated like an
extension?  There are no right and wrong answers to many questions like
this, since a wide variety of expressions are considered valid.  The point
is, that to get what you want, you should not expect the lilypond default
to conform to any particular approach, since it likely never will.

So, you will likely have to use chord exceptions if you want enough control
over the chord symbol formatting.

For starters, here is a list of some common chords with extensions (as well
as some uncommon ones that I've run across).  This approach uses parens,
and 9ths are always treated as extensions.  Not sure if that is how you
want to approach it but hopefully this is a good enough starting point that
you can tweak it to what you need.

If you would like to see a more typographically curated version, I can
share with you the chord exceptions I use.


\version "2.24.0"
\include "english.ly"

parenthesizedChordNames = {

    % Major
    <c e g d'>1-\markup { "(add 9)" }
    <c e g a d'>1-\markup { "(6 9)" }
    <c e g b d-sharp' f-sharp' a-flat'>1-\markup { "maj7 (#9 #11 b13)" }
    <c e g b d' a'>1-\markup { "maj7 (9 13)" }
    <c e g b f-sharp' a'>1-\markup { "maj7 (#11 13)" }

    % Minor
    <c e-flat g a-flat>1-\markup { "min (b6)" }
    <c e-flat g a d'>1-\markup { "min (6 9)" }
    <c e-flat g b-flat f'>1-\markup { "min7 (11)" }
    <c e-flat g b-flat d' f'>1-\markup { "min7 (9 11)" }
    <c e-flat g b-flat a'>1-\markup { "min7 (13)" }
    <c e-flat g b-flat a-flat'>1-\markup { "min7 (b13)" }
    <c e-flat g b>1-\markup { "min (maj7)" }
    <c e-flat g b d'>1-\markup { "min (maj7 9)" }
    <c e-flat g b d' a'>1-\markup { "min (maj7 9 13}" }
    <c e-flat g b-flat d' f' a'>1-\markup { "min7 (9 13)" }
    <c e-flat g b d' f' a'>1-\markup { "min (maj7 11 13" }
    <c e-flat g b d' f-sharp' a'>1-\markup { "min (maj7 9 #11 13)" }
    <c e-flat g b-flat d'>1-\markup { "min7 (9)" }
    <c e-flat g b-flat d' f>1-\markup { "min7 (9 11)" }
    <c e-flat g b-flat d' a'>1-\markup { "min7 (9 13)" }
    <c e-flat g b-flat a-flat'>1-\markup { "min7 (b13)" }
    <c e-flat g b-flat d' a-flat'>1-\markup { "min7 (9 b13)" }
    <c e-flat g b a-flat'>1-\markup { "min (maj7 b13)" }
    <c e-flat g b-flat d-flat' f-sharp'>1-\markup { "min7 (b9 #11)" }
    <c e-flat g d-flat' a-flat'>1-\markup { "min (b9 b13}" }

    % Dominant
    <c e g b-flat d'>1-\markup { "7 (9)" }
    <c e g b-flat d-flat'>1-\markup { "7 (b9)" }
    <c e g b-flat d-sharp' a-flat'>1-\markup { "7 (#9 b13)" }
    <c e g b-flat d-sharp'>1-\markup { "7 (#9)" }
    <c e g b-flat c-sharp' d-sharp'>1-\markup { "7 (b9 #9)" }
    <c e g b-flat d-sharp' f-sharp'>1-\markup { "7 (#9 #11)" }
    <c e g b-flat d-flat' f-sharp'>1-\markup { "7 (b9 #11)" }
    <c e g b-flat d' f-sharp'>1-\markup { "7 (9 #11)" }
    <c e g b-flat d' f-sharp' a'>1-\markup { "7 (9 #11 13)" }
    <c e g b-flat d' a'>1-\markup { "7 (9 13)" }
    <c e g b-flat d-flat' a'>1-\markup { "7 (b9 13)" }
    <c e g b-flat a-flat'>1-\markup { "7 (b13)" }
    <c e g b-flat d' a-flat'>1-\markup { "7 (9 b13)" }
    <c e g b-flat d' f' a-flat'>1-\markup { "7 (9 11 b13)" }
    <c e g b-flat d-flat' a-flat'>1-\markup { "7 (b9 b13)" }
    <c e g b-flat d-flat' f-sharp' a'>1-\markup { "7 (b9 #11 13)" }
    <c e g b-flat c-sharp' d-sharp' a-flat'>1-\markup { "7 (b9 #9 b13)" }

    % Dominant b5
    <c e g-flat b-flat>1-\markup { "7 (b5)" }
    <c e g-flat b-flat d'>1-\markup { "7 (b5 9)" }
    <c e g-flat b-flat a'>1-\markup { "7 (b5 13)" }
    <c e g-flat b-flat d-flat'>1-\markup { "7 (b5 b9)" }
    <c e g-flat b-flat d-flat' a'>1-\markup { "7 (b5 b9 13)" }
    <c e g-flat b-flat a-flat'>1-\markup { "7 (b5 b13)" }
    <c e g-flat b-flat d-sharp'>1-\markup { "7 (b5 #9)" }

    % Half-diminished
    <c e-flat g-flat b-flat c-sharp'>1-\markup { "min7 (b5 b9)" }
    <c e-flat g-flat b-flat d-flat'>1-\markup { "min7 (b5 b9)" }
    <c e-flat g-flat b-flat d'>1-\markup { "min7 (b5 9)" }
    <c e-flat g-flat b-flat f'>1-\markup { "min7 (b5 11)" }
    <c e-flat g-flat b-flat a'>1-\markup { "min7 (b5 13)" }
    <c e-flat g-flat b-flat d' a'>1-\markup { "min7 (b5 9 13)" }

    % Augmented
    <c e g-sharp b-flat d'>1-\markup { "aug7 (9)" }
    <c e g-sharp b-flat c-sharp' d-sharp'>1-\markup { "aug7 (b9 #9)" }
    <c e g-sharp b-flat d-sharp'>1-\markup { "aug7 (#9)" }
    <c e g-sharp b-flat f-sharp'>1-\markup { "aug7 (#11)" }
    <c e g-sharp d-flat'>1-\markup { "aug (b9)" }
    <c e g-sharp b-flat d-flat'>1-\markup { "aug7 (b9)" }
    <c e g-sharp b-flat d' a'>1-\markup { "aug7 (9 13)" }
    <c e g-sharp b-flat d-sharp' f-sharp'>1-\markup { "aug7 (#9 #11)" }
    <c e g-sharp b-flat d-flat' f-sharp'>1-\markup { "aug7 (b9 #11)" }

    % Lydian
    <c e g b f-sharp'>1-\markup { "maj7 (#11)" }
    <c e g b d' f-sharp'>1-\markup { "maj7 (9 #11)" }
    <c e g b d' f-sharp' a'>1-\markup { "maj7 (9 #11 13)" }
    <c e g b-flat f-sharp'>1-\markup { "7 (#11)" }
    <c e g b-flat f-sharp' a-flat'>1-\markup { "7 (#11 13)" }
    <c e g d-sharp' f-sharp'>1-\markup { "maj (#9 #11)" }
}
parenthesizedChordNameExceptions = #(append
(sequential-music-to-chord-exceptions parenthesizedChordNames #t)
ignatzekExceptions)

exampleChords = {

    \mark "Major"
    <c e g d'>1
    <c e g a d'>1
    <c e g b d-sharp' f-sharp' a-flat'>1
    <c e g b d' a'>1
    <c e g b f-sharp' a'>1
    \break

    \mark "Minor"
    <c e-flat g a-flat>1
    <c e-flat g a d'>1
    <c e-flat g b-flat f'>1
    <c e-flat g b-flat d' f'>1
    <c e-flat g b-flat a'>1
    <c e-flat g b-flat a-flat'>1
    <c e-flat g b>1
    <c e-flat g b d'>1
    <c e-flat g b d' a'>1
    <c e-flat g b-flat d' f' a'>1
    <c e-flat g b d' f' a'>1
    <c e-flat g b d' f-sharp' a'>1
    <c e-flat g b-flat d'>1
    <c e-flat g b-flat d' f>1
    <c e-flat g b-flat d' a'>1
    <c e-flat g b-flat a-flat'>1
    <c e-flat g b-flat d' a-flat'>1
    <c e-flat g b a-flat'>1
    <c e-flat g b-flat d-flat' f-sharp'>1
    <c e-flat g d-flat' a-flat'>1
    \break

    \mark "Dominant"
    <c e g b-flat d'>1
    <c e g b-flat d-flat'>1
    <c e g b-flat d-sharp' a-flat'>1
    <c e g b-flat d-sharp'>1
    <c e g b-flat c-sharp' d-sharp'>1
    <c e g b-flat d-sharp' f-sharp'>1
    <c e g b-flat d-flat' f-sharp'>1
    <c e g b-flat d' f-sharp'>1
    <c e g b-flat d' f-sharp' a'>1
    <c e g b-flat d' a'>1
    <c e g b-flat d-flat' a'>1
    <c e g b-flat a-flat'>1
    <c e g b-flat d' a-flat'>1
    <c e g b-flat d' f' a-flat'>1
    <c e g b-flat d-flat' a-flat'>1
    <c e g b-flat d-flat' f-sharp' a'>1
    <c e g b-flat c-sharp' d-sharp' a-flat'>1
    \break

    \mark "Dominant b5"
    <c e g-flat b-flat>1
    <c e g-flat b-flat d'>1
    <c e g-flat b-flat a'>1
    <c e g-flat b-flat d-flat'>1
    <c e g-flat b-flat d-flat' a'>1
    <c e g-flat b-flat a-flat'>1
    <c e g-flat b-flat d-sharp'>1
    \break

    \mark "Half-diminished"
    <c e-flat g-flat b-flat c-sharp'>1
    <c e-flat g-flat b-flat d-flat'>1
    <c e-flat g-flat b-flat d'>1
    <c e-flat g-flat b-flat f'>1
    <c e-flat g-flat b-flat a'>1
    <c e-flat g-flat b-flat d' a'>1
    \break

    \mark "Augmented"
    <c e g-sharp b-flat d'>1
    <c e g-sharp b-flat c-sharp' d-sharp'>1
    <c e g-sharp b-flat d-sharp'>1
    <c e g-sharp b-flat f-sharp'>1
    <c e g-sharp d-flat'>1
    <c e g-sharp b-flat d-flat'>1
    <c e g-sharp b-flat d' a'>1
    <c e g-sharp b-flat d-sharp' f-sharp'>1
    <c e g-sharp b-flat d-flat' f-sharp'>1
    \break

    \mark "Lydian"
    <c e g b f-sharp'>1
    <c e g b d' f-sharp'>1
    <c e g b d' f-sharp' a'>1
    <c e g b-flat f-sharp'>1
    <c e g b-flat f-sharp' a-flat'>1
    <c e g d-sharp' f-sharp'>1
}

exampleParenthesizedChords = {
    \set chordNameExceptions = #parenthesizedChordNameExceptions
    \exampleChords
}

<<
    \new ChordNames \exampleParenthesizedChords
    \new Staff \exampleChords
>>



 HTH,


Elaine Alt
415 . 341 .4954                                           "*Confusion is
highly underrated*"
[email protected]
Producer ~ Composer ~ Instrumentalist ~ Educator
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to