|
From: | Lukas-Fabian Moser |
Subject: | Re: Harmonics in tablature |
Date: | Sun, 28 Jun 2020 16:56:48 +0200 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.8.0 |
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
(ly:prob-property
(calc-harmonic-pitch (fret->pitch
(number->string 12))
(make-music
'NoteEvent 'pitch (ly:make-pitch 0 0)))
'pitch))
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?
Lukas
[Prev in Thread] | Current Thread | [Next in Thread] |