lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Stemming for hymnal


From: Mats Bengtsson
Subject: Re: Stemming for hymnal
Date: Mon, 23 May 2005 16:57:07 +0200
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050511

The best solution is probably to use a Scheme function similar to
the one used in the implementation of \partcombine, that looks at
the duration of the notes in the two voices and combines the notes
into chords if they have the same duration and into separate voices
if the durations differ. Maybe such a solution has already been done
by somebody, I recommend to search the mailing list archives.

Anyway, if you already have a program that generates the .ly code
and that program knows when the note durations are different and
when they are the same, then you could get a similar results by simply
putting both parts in the same Voice context as long as the durations
are the same. If you do that and also force the same stem directions
within that Voice context, then you can get the desired layout.
For an example, I took the first 5 bars of the upper stave in your
example:

\version "2.4.0"

upperOne = {
  \time 4/4 \key g \major
r2.^\markup "Angel's Story 76.76D, Arthur Henry Mann, 1881 (O Jesus I
Have Promised)"  b'4 b'4. b'8 a'4 g' g'2 fis'4 d' c''4. c''8 b'4 a'
b'2. b'4 \bar "|."
}
upperTwo = {
  \key g \major
r2. d'4 | d'4. d'8 c'4 \new Voice {\voiceTwo b8 d' } |
d'2 d'4 d' | << {} \\ {d' fis'8 fis' }>> g'4 d' d'2. g'4
}
  \score {
    \context GrandStaff
     <<
      \context Staff = upper {
         \new Voice << \voiceOne \upperOne \upperTwo >>
      }
    >>
  }
\layout {
  \context {
    \Score
    \remove "Bar_number_engraver"
  }
}

I don't really understand why you used a PianoStaff instead of a
GrandStaff. Also, my example shows a better way to remove the bar
numbers completely.

Of course, an even better way to do it is

\score {
  \context GrandStaff
   <<
    \context Staff = upper {
  \time 4/4 \key g \major
r2.^\markup "Angel's Story 76.76D, Arthur Henry Mann, 1881 (O Jesus I Have Promised)" <b' d'>4 |
<b' d'>4. <b' d'>8 <a' c'>4 <<{g'} \\{b8 d'}>> |
<g' d'>2 <fis' d'>4 d' |
<<{c''4. c''8 } \\ {d'4 fis'8 fis' } >> <b' g'>4 <a' d'>
<b' d'>2. <b' g'>4 \bar "|."}
  >>
}

which corresponds to what the Scheme function I mentioned at the
beginning should produce. Maybe it's easy for your program to
do it as well.

    /Mats


address@hidden wrote:
Still having some unresolved trouble with stems for my public domain
hymnal project.

I've attached an excerpt to show you what I'm doing.

The problem is that, in hymnals, notes from different parts share the
same stem (and hence the same stem direction) in most cases, except
when the note durations are different or the notes are in unison or
only a second apart.

The sample below uses stem direction to seperate the parts.  This works
properly, and makes for a reasonably readable score, except that it
isn't what's expected for a hymnal.  Any suggestions?

I'm producing the lilypond input programmatically and could set the stem
direction for individual notes in my software, but my experimenting with
that (using \voiceOne and \voiceTwo to set stem direction) hasn't worked
because the stems aren't combined properly, so beams and flags are
misplaced.

Steve

-------


upperOne = {
  \voiceOne
  \time 4/4 \key g \major
r2.^\markup "Angel's Story 76.76D, Arthur Henry Mann, 1881 (O Jesus I
Have Promised)"  b'4 b'4. b'8 a'4 g' g'2 fis'4 d' c''4. c''8 b'4 a'
b'2. b'4 d''4. d''8 c''4 b' b'2 c''4 b' a'4. g'8 fis'4 g' a'2. ais'4
b'4. b'8 a'4 g' g'2 fis'4 d' c''4. c''8 b'4 a' b'2. b'4 e''4. d''8 c''4
b' d''2 c''4 e' g'4. fis'8 e'4 fis' g'2. s4 \bar "|."
  \time 4/4 \key d \major
fis'4^\markup "Bradbury 87.87D, William B. Bradbury, 1859 (Savior Like a
Shepherd Lead Us)"  fis' fis'8 e' fis' g' a'4 ( d'' ) a' ( fis' ) e'
fis' g'8 b' a' g' fis'1 fis'4 fis' fis'8 e' fis' g' a'4 ( d'' ) a' (
fis' ) e' fis' g'8 b' a' g' fis'1 a'8 a' b'4 d''2 cis''8 b' a'4 fis'2
fis'8 fis' e'4 b' a' g' fis'2. a'8 a' b'4 d''2 cis''8 b' a'4 d''2 d'8
e' fis'4 a' g' e' d'2. \bar "|."
  \time 6/4 \key f \major
a'2^\markup "Martyn , Simeon B. Marsh, 1834 (??)"  a'4 a'2 f'4 g'2 g'4
g'2. a'2 a'4 c''2 bes'4 a'2. g' f'1. a'2 a'4 a'2 f'4 g'2 g'4 g'2. a'2
a'4 c''2 bes'4 a'2. g' f'1. c''2 c''4 c''2 c''4 d''2. d'' c''1. c''2
c''4 c''2 c''4 d''2. d'' c''1. a'2 a'4 a'2 f'4 g'2 g'4 g'2. a'2 a'4
c''2 bes'4 a'2. g' f'1. \bar "|."
  \time 3/4 \key g \major
r2^\markup "New Britain CM, Virginia Harmony, 1831; Harmization: Edwin
Othello Excell, 1900 (Amazing Grace)"  d'4 g'2 b'8 g' b'2 a'4 g'2 e'4
d'2 d'4 g'2 b'8 g' b'2 a'4 d''2. b'4 d''4. b'8 d'' b' g'2 d'4 e'4. g'8
g' e' d'2 d'4 g'2 b'8 g' b'2 a'4 g'2 ( g' ) s4 \bar "|."
  \time 3/4 \key ees \major
ees'4^\markup "Slane 10.10.10.10, Ancient Irish melody (Be Thou My
Vision)"  ees' f'8 ees' c'4 bes4. c'8 ees'4 ees' f' g'2. f'4 f' f' f'
g' bes' c'' bes' g' bes'2. c''4. d''8 ees'' d'' c''4 bes' g' bes' ees'
d' c'2 bes4 ees' g' bes' c''8 bes' g'4 ees'8 g' f'4 ees' ees' ees'2. \bar "|."
  \time 3/4 \key bes \major
r2^\markup "Toplady 7.7.7.7.7.7, Thomas Hastings, 1830 (Rock of Ages)" f'8. g'16 f'4 d' bes'8. g'16 f'2 bes'8 c'' d''4. c''8 bes' a' bes'2
a'8. bes'16 c''4. c''8 a' f' bes'2 a'8. bes'16 c''4. c''8 a' f' bes'2
f'8. g'16 f'4 d' bes'8. g'16 f'2 bes'8 c'' d''4. c''8 bes' a' bes'2 s4 \bar "|."
  \time 4/4 \key des \major
r2.^\markup "Ville de Havre , Philip Paul Bliss, 1876 (...)"  aes'4
aes'2 ges'4 f' f'2 ees'4 f' ( ges' bes' ) aes' ges' f'2. aes'4 des''2
c''4 bes' bes'2 aes'4 g' aes'2. aes'4 des''2 des''4 c'' bes'2 bes'4
bes' ees''2 ees''4 des'' c''2 bes'4 aes' des''2 des''4 des'' des''2
c''4 des'' des''2. aes'4 aes' aes'1 ( aes'2 ) aes'4 aes' aes'1 ( aes'2
) f'4 aes' bes'2 bes'4 des'' des''2 c''4 des'' des''2 s4 \bar "|."
} upperTwo = { \voiceTwo
  \key g \major
r2. d'4 d'4. d'8 c'4 b8 d' d'2 d'4 d' d' fis'8 fis' g'4 d' d'2. g'4
gis'4. gis'8 a'4 e' e'2 e'4 e' e'4. cis'8 cis'4 cis' d'2. c'4 b d'8 d'
c'4 b8 d' d'2 d'4 d' d' fis'8 fis' g'4 d' d'2. g'4 gis'4. gis'8 a'4 e'
e'2 e'4 c' d'4. c'8 c'4 c' b2. s4 \bar "|."
  \key d \major
d'4 d' d'8 cis' d' e' fis'2 fis'4 ( d' ) cis' d' e'8 g' fis' e' d'1 d'4
d' d'8 cis' d' e' fis'2 fis'4 ( d' ) cis' d' e'8 g' fis' e' d'1 fis'8
fis' g'4 b'2 a'8 g' fis'4 d'2 d'8 d' cis'4 g' fis' e' d'2. fis'8 fis'
g'4 b'2 a'8 g' fis'4 fis'2 d'8 d' d'4 fis' e' cis' d'2. \bar "|."
  \key f \major
f'2 f'4 f'2 f'4 e'2 e'4 e'2. f'2 f'4 f'2 g'4 f'2. e' f'1. f'2 f'4 f'2
f'4 e'2 e'4 e'2. f'2 f'4 f'2 g'4 f'2. e' f'1. f'2 e'4 f'2 f'4 f'2. f'
f'1. f'2 e'4 f'2 f'4 f'2. f' e'1. f'2 f'4 f'2 f'4 e'2 e'4 e'2. f'2 f'4
f'2 f'4 f'2. f'2 e'4 f'1. \bar "|."
  \key g \major
r2 b4 b2 d'4 d'2 c'4 b2 c'4 b2 b4 b2 b4 d'2 d'4 d'2. d'4 d'2 d''8 b' d'2
d'4 c'4. d'8 c'4 b2 d'4 b2 d'4 d'2 c'4 b2 ( b ) s4 \bar "|."
  \key ees \major
ees'4 ees' f'8 ees' c'4 bes4. c'8 c'2 ees'4 ees'2. bes4 <<ees' a >><<d'
bes >>c' d' g'8 f' g'4 f' ees' <<f'2 ees' >>ees'4 ees' aes' g' g'2 d'4
f' ees' d' c'2 bes4 c' <<ees' c' >>d' ees'2. c' bes \bar "|."
  \key bes \major
r2 d'8. ees'16 d'4 bes f'8. ees'16 d'2 f'8 f' f'4. g'8 f' ees' d'2 c'8.
d'16 ees'4. ees'8 ees' ees' d'2 c'8. d'16 ees'4. ees'8 ees' ees' d'2
d'8. ees'16 d'4 bes f'8. ees'16 d'2 d'8 ees' f'4. g'8 f' ees' d'2 s4 \bar "|."
  \key des \major
r2. f'4 f'2 ees'4 des' des'2 c'4 des' c'2 c'4 ees' des'2. f'4 f'2 ees'4
des' f'2 ees'4 ees' ees'2. ges'4 f'2 f'4 aes' ges'2 bes'4 aes' ges'2
ges'4 g' aes'2 aes'4 aes' aes'2 des'4 ees' f'2 ees'4 f' f'2. r1 f'4 f'
ees'2 r1 ees'4 ges' f'2 des'4 f' ges'2 ges'4 ges' f'2 ees'4 f' f'2 s4 \bar "|."
} lowerOne = { \voiceOne
  \key g \major
r2. g4 d e fis g b2 a4 fis fis a8 a g4 c' b2. b4 b4. b8 e'4 d' d'2 c'4
d' cis'4. b8 a4 g g2 fis4 fis g d8 e fis4 fis b2 a4 fis fis a8 a g4 c'
b2. b4 b4. b8 e'4 d' b2 c'4 a b4. a8 g4 a g2. s4 \bar "|."
  \key d \major
a4 a a8 a a a a2 d'4 ( a ) a a a8 a a a a1 a4 a a8 a a a a2 d'4 ( a ) a
a a8 a a a a1 d'8 d' d'4 d'2 d'8 d' d'4 a2 a8 a a4 a a a a2. d'8 d' d'4
d'2 d'8 d' d'4 a2 fis8 g a4 a a g fis2. \bar "|."
  \key f \major
c'2 c'4 c'2 a4 c'2 c'4 c'2. c'2 c'4 c'2 d'4 c'2. bes a1. c'2 c'4 c'2 a4
c'2 c'4 c'2. c'2 c'4 c'2 d'4 c'2. bes a1. a2 bes4 c'2 a4 bes2. bes a1.
a2 bes4 c'2 a4 a2. b c'1. c'2 c'4 c'2 b4 c'2 c'4 c'2. c'2 c'4 ees'2 d'4
c'2. bes a1. \bar "|."
  \key g \major
r2 g4 d2 g4 g2 fis4 g2 g4 g2 g4 d2 g4 g2 fis4 g2. g4 b2 b4 g2 g4 g2 e8 g
g2 g4 g2 g8 b g2 fis4 g2 ( g ) s4 \bar "|."
  \key ees \major
bes4 c' bes aes8 g f4 g g2 c'4 bes2. f f4 bes bes ees' bes bes bes2.
aes4 c' c'8 f' ees'4 d' bes bes2 aes4 g aes8 g f4 <<ees2 g >>g4 g bes2
aes8 <<g4. aes >>f4 g2. \bar "|."
  \key bes \major
r2 bes8. bes16 bes4 f bes8. bes16 bes2 bes8 a bes4. ees'8 d' c' bes2 f4
f4. a8 c' a bes2 f8. bes16 a4. a8 c' a bes2 bes8. bes16 bes4 f bes8.
bes16 bes2 bes8 a bes4. ees'8 d' c' bes2 s4 \bar "|."
  \key des \major
r2. aes4 aes2 aes4 aes aes2 aes4 aes aes2 aes4 aes aes2. aes4 bes2 a4
bes des'2 c'4 bes c'2. c'4 des'2 des'4 des' des'2 des'4 d' ees'2 ees'4
ees' ees'2 des'4 c' des'2 aes4 bes aes2 aes4 aes aes2. r1 aes4 des' c'2
r1 c'4 ees' des'2 aes4 des' des'2 des'4 bes aes2 aes4 aes aes2 s4 \bar "|."
} lowerTwo = { \voiceTwo
  \key g \major
r2. g,4 g, g, g, g,8 b, d2 d4 d d4. d8 e4 fis g2. g4 e4. e8 fis4 gis
gis2 a4 a a,4. a,8 a,4 a, d2. d4 g, g, g, g,8 b, d2 d4 d d4. d8 e4 fis
g2. g4 e4. e8 fis4 gis gis2 a4 a, d4. d8 d4 d g,2. s4 \bar "|."
  \key d \major
d4 d d8 g fis e d2 d a,4 a, a,8 a, a, a, fis1 d4 d d8 g fis e d2 d a,4
a, a,8 a, a, a, a1 d8 d g4 g2 g8 g d4 d2 d8 d a,4 a, a, a, d2. d8 d g4
g2 g8 g d4 d2 d8 d d4 d a, a, d2. \bar "|."
  \key f \major
f2 f4 f2 f4 c2 c4 c2. f2 f4 a,2 bes,4 c2. c f1. f2 f4 f2 f4 c2 c4 c2. f2
f4 a,2 bes,4 c2. c f1. f2 g4 a2 f4 bes,2. bes,2 d4 f1. f2 g4 a2 f4 d2. g
c1. f2 f4 f2 d4 c2 c4 c2. f2 f4 a2 bes4 c'2. c f1. \bar "|."
  \key g \major
r2 g,4 g,2 g,8 b, d2 d4 e2 c4 g,2 g,4 g,2 g,8 b, d2 c4 b,2. g,4 g2 g4
b,2 b,4 c4. b,8 c4 g,2 b,4 e2 d4 d2 d4 g,2 ( g, ) s4 \bar "|."
  \key ees \major
g4 aes g f8 ees d4 ees c bes, aes, ees, bes, ees d c bes, bes,8 a, g, f
ees d c4 d ees bes, bes ( g ) aes f c8 d ees f g a bes g d4 g f ees f8
ees d4 c2 bes,8 aes, g,4 ees, g, aes,8 bes, c4 aes, ees,2. \bar "|."
  \key bes \major
r2 bes,8. bes,16 bes,4 bes, d8. ees16 bes,2 d8 f bes4. ees8 f f bes,2 f4
f4. f8 f f bes,2 f8. f16 f4. f8 f f bes,2 bes,8. bes,16 bes,4 bes, d8.
ees16 bes,2 g8 f bes4. ees8 f f bes,2 s4 \bar "|."
  \key des \major
r2. des4 des2 des4 des8 f aes2 ges4 f ees2 aes,4 aes, des2. des4 bes,2
c4 des des2 ees4 ees aes,2. aes4 des2 des4 f ges2 ges4 f ees2 ees4 ees
aes2 aes4 aes8 ges f2 f4 ges aes2 aes,4 aes, des2. r1 des4 f aes2 r1
aes,4 aes, des2 des4 des ges2 ges4 ges aes2 aes,4 aes, des2 s4 \bar "|."
}
  \score {
    \context PianoStaff
    \with {
            \override VerticalAlignment #'forced-distance = #11
            % default is 12, 11 gives us slightly tighter spacing between bass
and treble stafs
    } <<
      \context Staff = upper <<
        \override Score.BarNumber #'break-visibility = #all-invisible
\break
        \context Voice = one {  \upperOne }
        \context Voice = two  \upperTwo
>> \context Staff = lower <<
        \clef bass
        \context Voice = three  \lowerOne
        \context Voice = four  \lowerTwo
>> >>
  }
\layout {
  betweensystemspace = 0

  \context {
    \Score
    % defaults
    % (shortest-duration-space . 2.0)
    % (spacing-increment . 1.2)
    % (base-shortest-duration . ,(ly:make-moment 1 8))
    % tighter spacing
    \override SpacingSpanner #'shortest-duration-space = #2.4
    \override SpacingSpanner #'spacing-increment = #0.6
    \override SpacingSpanner #'base-shortest-duration = #(ly:make-moment
1 8)
  }
}




_______________________________________________
lilypond-user mailing list
address@hidden
http://lists.gnu.org/mailman/listinfo/lilypond-user

--
=============================================
        Mats Bengtsson
        Signal Processing
        Signals, Sensors and Systems
        Royal Institute of Technology
        SE-100 44  STOCKHOLM
        Sweden
        Phone: (+46) 8 790 8463                         
        Fax:   (+46) 8 790 7260
        Email: address@hidden
        WWW: http://www.s3.kth.se/~mabe
=============================================




reply via email to

[Prev in Thread] Current Thread [Next in Thread]