Hi Valentin,

This is a certain limitation in how the harmonicByFret-Function works. It will
calculate the pitch for the given note, thus the Noteheads are automatically
placed onto higher strings. Thus you eighter will have to manually specify the
string number, or you might do something like in the appended file, which is
modifying the harmonicByFret-function to automatically use the proper string.
This should work at least for open strings, for artificial harmonics this is
not really a problem, since harmonicByFret sucks for that anyway.

Thanks much! I think the problem is more complicated than that, or my lack of understanding more fundamental than that.

With your modification, the output now is:

which is _not_ correct since all the harmonics should be played on the third string. (At least on violin/cello its perfectly common to play harmonics in the "upper" half of the string, hence with "fret numbers".) On the cello, I get the sounding pitches from the lower staff by playing harmonics on the 12th, 7th, 5th fret all on the same string. (I hope it's clear that I speak of imaginary semitone frets on a cello.)

1) I think your function

    \set minimumFret = #(ly:pitch-semitones
                          (calc-harmonic-pitch (fret->pitch (number->string 12))                                                (make-music 'NoteEvent 'pitch (ly:make-pitch 0 0)))

is just a complicated way of writing \set minimumFret = 12:

(fret->pitch "12") looks up the partial that you get by touching the "12"th fret - which is 1st partial (hardcoded in #fret-partials) - and then translates this into a pitch-delta from c'; this yields #'(1 0 0) (hardcoded in #partial-pitch) which means c''. Hence, you basically call (calc-harmonic-pitch pitch-c'' pitch-c'). This yields c'', hence the call of pitch-semitones returns 12.

2) Now, calc-harmonic-pitch (which seems to have been written by Carl 10 years ago, so I'm very glad he chimed in already) seems to me to be basically a variant of \transpose, for instance:

\version "2.21.0"

chp =
#(define-music-function (p m) (ly:pitch? ly:music?)
   (calc-harmonic-pitch p m))

mus = \relative c' {
  c4 d e f g

\new Staff { \chp f' \mus }

(But, as I already remarked yesterday, I think that calc-harmonic-pitch does not work correctly for chords in \relative music:

\version "2.21.0"

chp =
#(define-music-function (p m) (ly:pitch? ly:music?)
   (calc-harmonic-pitch p m))

mus = \relative c' {
  c4 <d g'> e f g

\new Staff { \chp c'' \mus }

If this is expected behaviour, then at least I do not understand it.)

3) Ok, assuming that my diagnosis is correct and you actually just achieve \set minimumFret = 12 (at least it's obvious that your code does not depend on the parameters given to harmonicByFret): This shouldn't be what we need, I think, because we explicitly asked for frets no. 7 and 5, respectively. We shouldn't force a minimum fret, but a string number.

4) All of this makes so little sense to me that I'm sure I suffer from some fundamental misunderstanding of the way the harmonics implementation is supposed to work. I have no idea why LilyPond, when we minimumFret to 12, created a harmonic note on the string above with fret number smaller than 12. So I probably should ask: Is my understanding correct that printing <7> on a certain second string in a tablature diagram should mean that this string should be played with an open harmonic with finger on the 7th fret?


Reply via email to