Re: Creating click tracks for an arbitrary time signature and length of music

2019-12-20 Thread Gloops via LilyPond user discussion
Hello ! here's a very useful thing ...
Is it possible to add a countdown ?



--
Sent from: http://lilypond.1069038.n5.nabble.com/User-f3.html



Re: Suppressing a voice in the midi output

2019-12-20 Thread Sandro Santilli
On Sun, Dec 15, 2019 at 12:56:22PM +0100, Karsten Reincke wrote:
> Dear friends;
> 
> In the LilyPOnd tutorial I found the explanation how to assign each a voice a
> separate midi channel = instrument 
> 
> http://lilypond.org/doc/v2.18/Documentation/notation/creating-midi-files
> 
> Unfortunately, I have to prevent one / some voice(s) from being ingrated into 
> the
> midi file (because it only contains meta information which shall not be 
> played).
> 
> Does anyone know how I can say that voice X shall not be converted into the 
> midi
> file? Or does any know how I could assign this voice 'a silent instrument'?

Would setting volume to zero be ok for your use case ? If so, try
something like the following:

\new Staff \with {
  midiInstrument = "muted trumpet"
  midiMinimumVolume = #0.0
  midiMaximumVolume = #0.0
} {
  \new Voice = "vocal" { \melody }
}

--strk;



Re: Suppressing a voice in the midi output

2019-12-20 Thread Sandro Santilli
On Fri, Dec 20, 2019 at 10:41:26AM +0100, Sandro Santilli wrote:
> On Sun, Dec 15, 2019 at 12:56:22PM +0100, Karsten Reincke wrote:
> > Dear friends;
> > 
> > In the LilyPOnd tutorial I found the explanation how to assign each a voice 
> > a
> > separate midi channel = instrument 
> > 
> > http://lilypond.org/doc/v2.18/Documentation/notation/creating-midi-files
> > 
> > Unfortunately, I have to prevent one / some voice(s) from being ingrated 
> > into the
> > midi file (because it only contains meta information which shall not be 
> > played).
> > 
> > Does anyone know how I can say that voice X shall not be converted into the 
> > midi
> > file? Or does any know how I could assign this voice 'a silent instrument'?
> 
> Would setting volume to zero be ok for your use case ? If so, try
> something like the following:
> 
> \new Staff \with {
>   midiInstrument = "muted trumpet"
>   midiMinimumVolume = #0.0
>   midiMaximumVolume = #0.0
> } {
>   \new Voice = "vocal" { \melody }
> }

Or simply create a different "book" for the midi, and only include
the voices you want... I often do this also because I want to
\unfoldRepeats and maybe add a \tripletFeel and most significantly
because I'm using transposed instruments which then need to be
transposed for the sake of MIDI output but not for reading...

--strk;



Re: Creating click tracks for an arbitrary time signature and length of music

2019-12-20 Thread Matt Wallis

On 20/12/2019 01:10, Aaron Hill wrote:

On 2019-12-19 3:03 pm, Matt Wallis wrote:

What I want to do is to automatically create a click track for any
length of music, and any time signature. For example, if the music is
L measures in length, and the numerator of the time signature is N,
and the denominator is D, then I want a click track that looks like
this:

  \repeat unfold  \drummode { wbh \repeat unfold  { wbl\pp }}


Here's a quick-and-dirty way to achieve close to what you want:


See brilliant solution in previous message:
https://lists.gnu.org/archive/html/lilypond-user/2019-12/msg00346.html



Firstly, \clickTrack is a function for generating one measure of 
clicking based on a desired beat and meter.  The beat defaults to the 
denominator of the meter if unspecified.  If the beat duration does not 
divide the measure perfectly, a final rest is inserted to pad out the 
measure.  Here are examples of use:



   \repeat unfold 8 \clickTrack 2  4/4 % click on 1 and 3
   \repeat unfold 8 \clickTrack    4/4 % click on all four
   \repeat unfold 8 \clickTrack 4. 6/8 % click on 1 and 4
   \repeat unfold 8 \clickTrack 4  6/8 % click on 1, 3, and 5
   \repeat unfold 8 \clickTrack    6/8 % click on all six


Secondly, \clickTrackDuring is a very basic wrapper for \clickTrack that 
automatically repeats the click measure to cover the duration of the 
specified music.  Note that no attempt is made to handle music that 
changes time signature nor music with \partial measures or other funny 
business.  If you had a anacrusis, you would need to manually offset the 
music:



   % Assume \musicWithPickup begins with \partial 4
   \clickTrackDuring 3/4 { s2 \musicWithPickup }



Thanks Aaron. That is amazing, and I think it over-achieves! I 
appreciate your attention to detail - with the option to specify the 
beat, and to add a final rest if the beat does not perfectly divide the 
measure.


The fact that is does not handle music with \partial measures, nor 
changes of time signature is not a problem to me at all, and it's simple 
to work around both of these 'limitations'.


Starting with a \partial measure is never an issue for me - if I want a 
click track, then I always want it to start at the beginning of a measure.


Thanks again. This will now be added to my standard template. Never 
again will I find that my click track ends before the music because I've 
added to the music and forgotten to update the repeat count for the 
click track :-)


Matt Wallis



Re: Notes or chords sustained with a pedal

2019-12-20 Thread Robin Bannister

Robert Blackstone wrote:

Dear all,
I’m presently transcribing some piano-scores in which schords, sustained with a 
pedal are notated in a way had not seen before (see screenshot).
I would like to copy it but I have no idea how to do it.



This thread may get you started:
https://lists.gnu.org/archive/html/lilypond-user/2019-05/msg00202.html


Cheers,
Robin



How to use make-music?

2019-12-20 Thread Peter Toye
Thee are many examples of the use of the make-music function in NR and 
Snippets, but I cannot find any reference to its definition in LR, NR or IR. I 
can use the examples to do what I want, but I'd like to know a bit more about 
how it works. Is there a definition of it and its parameters anywhere (apart 
from delving into the code)?

 
Regards,

Peter
mailto:lilyp...@ptoye.com
www.ptoye.com

Re: How to use make-music?

2019-12-20 Thread David Kastrup
Peter Toye  writes:

> Thee are many examples of the use of the make-music function in NR and
> Snippets, but I cannot find any reference to its definition in LR, NR
> or IR. I can use the examples to do what I want, but I'd like to know
> a bit more about how it works. Is there a definition of it and its
> parameters anywhere (apart from delving into the code)?

Sometimes delving in the code just to discover comment strings/comments
is not the worst idea with LilyPond.

scm/define-music-types.scm:

(define-safe-public (make-music name . music-properties)
  "Create a music object of given name, and set its properties
according to @code{music-properties}, a list of alternating property symbols
and values. E.g:
@example
  (make-music 'OverrideProperty
  'symbol 'Stem
  'grob-property 'thickness
  'grob-value (* 2 1.5))
@end example
Instead of a successive symbol and value, an entry in the list may
also be an alist or a music object in which case its elements,
respectively its @emph{mutable} property list (properties not inherent
to the type of the music object) will get taken.

The argument list will be interpreted left-to-right, so later entries
override earlier ones."

-- 
David Kastrup



Re: How to use make-music?

2019-12-20 Thread Peter Toye
David,

Thanks for this. I'm obviously going to have to dust off my LISP lectures from 
1967!

Best regards,

Peter
mailto:lilyp...@ptoye.com
www.ptoye.com

-
Friday, December 20, 2019, 12:41:31 PM, David Kastrup wrote:

> Peter Toye  writes:

>> Thee are many examples of the use of the make-music function in NR and
>> Snippets, but I cannot find any reference to its definition in LR, NR
>> or IR. I can use the examples to do what I want, but I'd like to know
>> a bit more about how it works. Is there a definition of it and its
>> parameters anywhere (apart from delving into the code)?

> Sometimes delving in the code just to discover
> comment strings/comments
> is not the worst idea with LilyPond.

> scm/define-music-types.scm:

> (define-safe-public (make-music name . music-properties)
>   "Create a music object of given name, and set its properties
> according to @code{music-properties}, a list of
> alternating property symbols
> and values. E.g:
> @example
>   (make-music 'OverrideProperty
>   'symbol 'Stem
>   'grob-property 'thickness
>   'grob-value (* 2 1.5))
> @end example
> Instead of a successive symbol and value, an entry in the list may
> also be an alist or a music object in which case its elements,
> respectively its @emph{mutable} property list
> (properties not inherent
> to the type of the music object) will get taken.

> The argument list will be interpreted
> left-to-right, so later entries
> override earlier ones."

How to avoid dynamic clashes?

2019-12-20 Thread Peter Toye
I'm trying to set a score where dynamic words are too close together for 
beautiful typesetting. I've tried using offsets to move one of them vertically, 
but they don't seem to work. What's the best way of setting this to produce a 
good-looking result?

\version "2.19.83"

\score {
  <<
\new Staff   {
  \clef "bass"
  c16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 
16 16 16 16 16 16 16 16
}
\new Dynamics {
  \once \override DynamicTextSpanner.style = #'none
  \once \override DynamicText.extra-offset = #'( 0 . -3)
  s16\cresc s16\dim s4\!
}
  >>
}

 
Regards,

Peter
mailto:lilyp...@ptoye.com
www.ptoye.com

Re: How to avoid dynamic clashes?

2019-12-20 Thread Kieren MacMillan
Hi Peter,

> I'm trying to set a score where dynamic words are too close together for 
> beautiful typesetting. I've tried using offsets to move one of them 
> vertically, but they don't seem to work. What's the best way of setting this 
> to produce a good-looking result?

I’d force the notes themselves apart:

  \temporary \override NoteHead.extra-spacing-width = #'(0 . 5) c16 16 16 
16 \revert NoteHead.extra-spacing-width
  c16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 
16 16 16 16

Hope that helps!
Kieren.


Kieren MacMillan, composer (he/him/his)
‣ website: www.kierenmacmillan.info
‣ email: i...@kierenmacmillan.info




Re: How to avoid dynamic clashes?

2019-12-20 Thread Phil Holmes
How to avoid dynamic clashes? 
If you read about dynamics in the NR, it says: "Vertical positioning of 
dynamics is handled by Section "DynamicLineSpanner" in Internals Reference."   
Looking in the IR we see reference to Y-offset.  So this does as you wish, I 
think:



\score {
   <<
 \new Staff   {
   \clef "bass"
   c16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 
16 16 16 16 16 16 16 16
 }
 \new Dynamics {
   \once \override DynamicTextSpanner.style = #'none
   \once \override DynamicLineSpanner.Y-offset = #2
   s16\cresc s16\dim s4\!
 }
   >>
 }


--
Phil Holmes




 - Original Message - 

From: Peter Toye 



To: lilypond-user@gnu.org 



Sent: Friday, December 20, 2019 4:10 PM

 Subject: How to avoid dynamic clashes?
 


I'm trying to set a score where dynamic words are too close together for 
beautiful typesetting. I've tried using offsets to move one of them vertically, 
but they don't seem to work. What's the best way of setting this to produce a 
good-looking result?
 
\version "2.19.83"
 
\score {
   <<
 \new Staff   {
   \clef "bass"
   c16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 
16 16 16 16 16 16 16 16
 }
 \new Dynamics {
   \once \override DynamicTextSpanner.style = #'none
   \once \override DynamicText.extra-offset = #'( 0 . -3)
   s16\cresc s16\dim s4\!
 }
   >>
 }
 
 
 Regards,
 
Peter
 mailto:lilyp...@ptoye.com
 www.ptoye.com

Re: convert-ly problem 2

2019-12-20 Thread Knute Snortum
I think all you need in Windows is an entry in your PATH like this:

C:\Program Files (x86)\LilyPond\usr\bin

Then type

convert-ly.py

and Windows will ask you what program you want to execute it with.
Select python.exe and you're done.  At least that's how it works in my
version of Windows 10.  There are ways to set this up by hand, but try
this first.

---
Knute Snortum
(via Gmail)

On Thu, Dec 19, 2019 at 9:14 AM Carl Sorensen  wrote:
>
> In general, the way to execute convert-ly.py is not with
>
>
>
> convert-ly.py 
>
>
>
> But instead
>
>
>
> python convert-ly.py 
>
>
>
> If you create an executable batch file somewhere in your PATH called 
> convert-ly,  with the contents
>
>
>
> C:\Program Files (x86)\LilyPond\usr\bin\python.exe C:\Program Files 
> (x86)\LilyPond\usr\bin\convert-ly.py
>
>
>
> Then I expect you can just call
>
>
>
> convert-ly 
>
>
>
> But I don’t use Windows now, so I haven’t tested this.  I do use the 
> equivalent in MacOS.
>
>
>
> HTH,
>
> Carl
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> From: Peter Gentry 
> Reply-To: 
> Date: Thursday, December 19, 2019 at 8:44 AM
> To: Lilypond Users 
> Subject: convert-ly problem 2
>
>
>
> Having rediscovered the fact that Frescobaldi does not call convert-ly 
> anymore. I went to the section 2.2 of the usage manual and popped the 
> following into a windows 10 command prompt (with administrator privs)
>
>
>
> C:\Program Files (x86)\LilyPond\usr\bin>forfiles /s /p 
> "C:\users\peter\Lilypool\Music_Files\Bouffil" /M **.ly /c "cmd  /c 
> convert-ly.py  -e @file"
>
>
>
> The result was
>
> 'convert-ly.py' is not recognized as an internal or external command,
>
> operable program or batch file.
>
> Etc etc for each .ly file in the folder
>
>
>
> I have cd’d to the Lilypond usr\bin folder so I don’t think the three “s are 
> needed here, but who knows
>
> Where did I go wrong?
>
>
>
> For no particular reason I then uninstalled anaconda and python 3.8 the 
> result (after reboot) was that the same command string produced a response 
> for each .ly file in Bouffil.
>
> The response was a pop up box saying that no app was available for that file. 
> The Command Prompt then froze and I needed Task Manager to close it.
>
>
>
> Clearly these other pythons have interfered with Lily somewhere and may have 
> a bearing on my other recent issues.
>
>
>
> Does anyone else play around with Python outside of Lily who might know how 
> to keep then separate.
>
>
>
> Regards Peter
>
>



Re: How to avoid dynamic clashes?

2019-12-20 Thread Peter Toye
Thanks Phil. I was looking in the 'spacing issues' section. Just what I need 
for this particular score.

Best regards,

Peter
mailto:lilyp...@ptoye.com
www.ptoye.com

-
Friday, December 20, 2019, 4:26:46 PM, Phil Holmes wrote:


If you read about dynamics in the NR, it says: "Vertical positioning of 
dynamics is handled by Section ?DynamicLineSpanner? in InternalsReference."   
Looking in the IR we see reference to Y-offset.  So this does as you wish, I 
think:
 
\score {
   <<
 \new Staff   {
   \clef "bass"
   c16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 
16 16 16 16 16 16 16 16
 }
 \new Dynamics {
   \once \override DynamicTextSpanner.style = #'none
   \once \override DynamicLineSpanner.Y-offset = #2
   s16\cresc s16\dim s4\!
 }
   >>
 }

--
Phil Holmes
 

Re: How to avoid dynamic clashes?

2019-12-20 Thread Peter Toye
Hello Kieren,

Yes it does. So does Phil's solution. I now have to work out which I prefer in 
this particular situation.

Best regards,

Peter
mailto:lilyp...@ptoye.com
www.ptoye.com

-
Friday, December 20, 2019, 4:14:06 PM, Kieren MacMillan wrote:

> Hi Peter,

>> I'm trying to set a score where dynamic words are too close together for 
>> beautiful typesetting. I've tried using offsets to move one of them 
>> vertically, but they don't seem to work. What's the best way of setting this 
>> to produce a good-looking result?

> I’d force the notes themselves apart:

>   \temporary \override
> NoteHead.extra-spacing-width = #'(0 . 5) c16 16
> 16 16 \revert NoteHead.extra-spacing-width
>   c16 16 16 16 16 16 16 16 16 16 16 16 16
> 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16

> Hope that helps!
> Kieren.
> 

> Kieren MacMillan, composer (he/him/his)
> ‣ website: www.kierenmacmillan.info
> ‣ email: i...@kierenmacmillan.info

Naming multiple midi files

2019-12-20 Thread kupirijo

Hello,

I would like to specify the name (or extensions) of the .midi files 
exported by the \midi{} command. I have multiple \scores{} in one .ly 
file producing one .pdf file and multiple .midi files.


Thanks




Re: LSR contribution

2019-12-20 Thread Michael Käppler

Hi Harm et al.,
attached is my updated version.
I decided to split up the validity checks from the actual engraver,
because otherwise in case of invalid parameters the engraver would
only be instantiated to do nothing and nevertheless have its
acknowledger called every time.
The code is much more verbose now, which makes the flow of information
and control
clearer I hope.

Please let me know what you think about it.

Cheers,
Michael

Am 16.12.2019 um 01:50 schrieb Thomas Morley:

Am So., 15. Dez. 2019 um 21:47 Uhr schrieb Thomas Morley
:

Am So., 15. Dez. 2019 um 21:17 Uhr schrieb Michael Käppler :

Hi all,
a few days ago I submitted a snippet to the LSR (title "Coloring
successive intervals"). I can see it in the snippet database,
but not in the webpage. The "Contributing" section of LSR states, that:

"Once the snippet is in, it has to be reviewed and approved by one of
the LSR editors,
and then it must be digested by the search engine. Within a few days,
you should be able to see your snippet online."

Is this still valid in principle? Or maybe did I something wrong?

Cheers,
Michael

In principle ... yes.
Though, I seem to be the only remaining regular active LSR editor, and
my time is limited.
Thus it may take some more time than the LSR "Contributing" section says.
Announcing it on the list helps, ofcourse.

I'll take a look soon.

As promised I had a look.

Many thanks for your snippet!

For now:

First I changed the LSR button "Large snippet" to "Standalone snippet".
It's a very rare case "Large snippet" is apppropriate, usualy for
snippets outputting multipe pages. In almost every other case it's
better to uncheck the buttons or to go for "Standalone snippet".
Otherwise compressed and (imho) ugly images are output by the LSR.

Please always observe a 80-characters line-width limit for your code.

Your snippet contains some advanced code. In such cases I often want
to discuss things a bit deeper. So:

What bugged me right from the first glance over it, is your need to
define several engravers, one for each case.
I think one engraver should do the work for _all_ those cases.

Attached you'll find my suggestion for this, along with better
indentation, 80-chars-line-width along with some minor adjustments.

Please have a look.

Nevertheless that can't be the final state, imho.
May I ask you to add inline code-comments what's done and why?
There are not so many examples of scheme-engravers around. One
thoroughly commented would be great.
Additionally, I'd go for more self-explaining variable-names.
P.e. "dt-st": for me it's an arbitrary collection of characters, with
a hyphen somewhere ;)

Thanks,
   Harm


\version "2.18.2"

% Interval definitions alist
% Key:
% number determines the interval type, 1=prime, 2=second, 3=third ...
% plus and minus signs determine variant, no sign=perfect interval, +=major,
% ++=augmented, -=minor, --=diminished
% Value:
% the car represents the diatonic, the cdr the semitonic steps.
% Only positive values are specified, negative values for
% intervals downwards are generated in the engraver.
% This list may be extended or completely overwritten
% Usage: #(display (assoc-get "4--" intervaldefs))


#(define intervaldefs
   '(("1++" . (0 . 1))
 ("1" . (0 . 0))
 ("2-" . (1 . 1))
 ("2--" . (1 . 0))
 ("2+" . (1 . 2))
 ("2++" . (1 . 3))
 ("3-" . (2 . 3))
 ("3--" . (2 . 2))
 ("3+" . (2 . 4))
 ("3++" . (2 . 5))
 ("4--" . (3 . 4))
 ("4++" . (3 . 6))
 ("4" . (3 . 5))
 ("5--" . (4 . 6))
 ("5++" . (4 . 8))
 ("5" . (4 . 7))
 ("6-" . (5 . 8))
 ("6--" . (5 . 7))
 ("6+" . (5 . 9))
 ("6++" . (5 . 10))
 ("7-" . (6 . 10))
 ("7--" . (6 . 9))
 ("7+" . (6 . 11))
 ("7++" . (6 . 12))
 ("8--" . (7 . 11))
 ("8++" . (7 . 13))
 ("8" . (7 . 12))
 ("9-" . (8 . 13))
 ("9--" . (8 . 12))
 ("9+" . (8 . 14))
 ("9++" . (8 . 15))
 ("10-" . (9 . 15))
 ("10--" . (9 . 14))
 ("10+" . (9 . 16))
 ("10++" . (9 . 17))
 ("11--" . (10 . 16))
 ("11++" . (10 . 18))
 ("11" . (10 . 17))
 ("12--" . (11 . 18))
 ("12" . (11 . 19

% Create an engraver that compares the intervals between sequential pitches
% of a voice with a given list of intervals.
% If a specified interval is found, the heads of both notes encompassing
% the interval are colored.
%
% Mode of operation:
% Intervals are defined by two integers representing the diatonic
% resp. semitonic distance between two pitches.
% It is necessary to take both distances into account to distinguish
% between enharmonically identical intervals, e.g. a major third
% and a diminished fourth.
% Example:
% d -> f# : diatonic distance = 2 steps (f# is derived from f natural),
% semitonic distance = 4 steps
% d -> gb: diatonic distance = 3 steps (gb is derived from g natural),
% semitonic distance = 4 steps
%
% The engraver consists of two parts:
%
% color_interval_engraver: checks, whether the given parameters are valid,

Re: LSR contribution

2019-12-20 Thread Michael Käppler

Btw. what I do not understand is why (process-acknowledged) is called
multiple times
after one grob has been acknowledged, it is even called >before< any
grob has been
acknowledged.
You can notice this clearly in
input/regression/scheme-engraver.ly

Cheers,
Michael

Am 16.12.2019 um 01:50 schrieb Thomas Morley:

Am So., 15. Dez. 2019 um 21:47 Uhr schrieb Thomas Morley
:

Am So., 15. Dez. 2019 um 21:17 Uhr schrieb Michael Käppler :

Hi all,
a few days ago I submitted a snippet to the LSR (title "Coloring
successive intervals"). I can see it in the snippet database,
but not in the webpage. The "Contributing" section of LSR states, that:

"Once the snippet is in, it has to be reviewed and approved by one of
the LSR editors,
and then it must be digested by the search engine. Within a few days,
you should be able to see your snippet online."

Is this still valid in principle? Or maybe did I something wrong?

Cheers,
Michael

In principle ... yes.
Though, I seem to be the only remaining regular active LSR editor, and
my time is limited.
Thus it may take some more time than the LSR "Contributing" section says.
Announcing it on the list helps, ofcourse.

I'll take a look soon.

As promised I had a look.

Many thanks for your snippet!

For now:

First I changed the LSR button "Large snippet" to "Standalone snippet".
It's a very rare case "Large snippet" is apppropriate, usualy for
snippets outputting multipe pages. In almost every other case it's
better to uncheck the buttons or to go for "Standalone snippet".
Otherwise compressed and (imho) ugly images are output by the LSR.

Please always observe a 80-characters line-width limit for your code.

Your snippet contains some advanced code. In such cases I often want
to discuss things a bit deeper. So:

What bugged me right from the first glance over it, is your need to
define several engravers, one for each case.
I think one engraver should do the work for _all_ those cases.

Attached you'll find my suggestion for this, along with better
indentation, 80-chars-line-width along with some minor adjustments.

Please have a look.

Nevertheless that can't be the final state, imho.
May I ask you to add inline code-comments what's done and why?
There are not so many examples of scheme-engravers around. One
thoroughly commented would be great.
Additionally, I'd go for more self-explaining variable-names.
P.e. "dt-st": for me it's an arbitrary collection of characters, with
a hyphen somewhere ;)

Thanks,
   Harm





harmonyli.ly stable release 1.2 published

2019-12-20 Thread Karsten Reincke
Dear Friends;

a few moments ago, I published the next stable release of harmonyli.ly. This lib
for adding Functional Harmony Analysis symbols and/or Scale Step Theory symbols
into LilyPond scores can now additionally indicate, that an expected tone of a
chord does NOT appear in the notes. (see chapter 'Indicating Supressed Chord
Tones' in the tutorial). 

In the release 1.0, I had erroneously taken over a wrong pre version of an
interpretation of the Tristan chord. This mistake has also been corrected: the
chapter just for fun now contains the intended version.

Here are the links:

repository: https://github.com/kreincke/harmonyli.ly/
homepage: https://fodina.de/en/harmonyli-ly/
tutorial: https://kreincke.github.io/harmonyli.ly/tutorial.pdf

HAYM (= Happy Analyzing Your Music)
Karsten
-- 
  Karsten Reincke/\/\   (+49|0) 170 / 927 78 57
 Im Braungeröll 31   >oo<  mailto:k.rein...@fodina.de
60431 Frankfurt a.M.  \/http://www.fodina.de/kr/