Autor Thema: Stichnoten mit gemeinsamen Notenhälsen  (Gelesen 2843 mal)

merula

  • Member
Stichnoten mit gemeinsamen Notenhälsen
« am: Mittwoch, 17. Oktober 2012, 15:47 »
Hallo,

ich habe ein Stück in dem Sopran und Alt unisono singen. Es gibt aber eine Stelle an der der Alt den Sopran oktaviert. Diese Stelle hätte ich gern mit Stichnoten gesetzt. Ich habe es mit dem Beispiel aus dem Manual probiert (http://lilypond.org/doc/v2.12/Documentation/user/lilypond/Writing-parts#Formatting-cue-notes):
musik = \relative c'' {
  c4 e g c
}
\addQuote "musik" { \musik }

\new Voice \relative c'' {
  \transposedCueDuring #"musik" #UP c { \musik }
}

Im Prinzip OK aber die Notenhälse hängen nicht zusammen. Die bekomme ich so zusammen:
musik = \relative c'' {
  c4 e g c
}

\new Voice <<
  { \stemUp \musik }
  { \transpose c'' c' \musik }
>>

Schön. Jetzt sind die Hälse zwar beieinander, aber die Stichnoten weg. Ich kann die Größe der Notenköpfe verringern, aber das wirkt sich entweder auf beide aus:
musik = \relative c'' {
  c4 e g c
}

\new Voice <<
  { \stemUp \musik }
  { \teeny \transpose c'' c' \musik }
>>
oder die Hälse sind nicht mehr beieinander
musik = \relative c'' {
  c4 e g c
}

\new Voice <<
  { \stemUp \musik }\\
  { \stemUp \teeny \transpose c'' c' \musik }
>>
Geht nicht irgendwie beides?

Gruß

Lars

Be-3

  • Member
Re: Stichnoten mit gemeinsamen Notenhälsen
« Antwort #1 am: Mittwoch, 17. Oktober 2012, 17:49 »
Hallo Lars,

Du möchtest also, daß "die Notenhälse zusammenhängen". Bei Stichnoten sind nicht nur die Notenköpfe kleiner, sondern auch die Hälse (also auch dünner).
Deshalb würde ich das eher als "Akkord mit unterschiedlich großen Noten" betrachten, und einzelne Noten im Akkord kann man mit dem \tweak-Befehl beeinflussen (s. "Changing a single note’s size in a chord"):
http://lilypond.org/doc/v2.12/input/lsr/lilypond-snippets/Tweaks-and-overrides#Tweaks-and-overrides

\version "2.12.3"
\new Voice \relative c'' {
  <\tweak #'font-size #-4 c, c'>4 <\tweak #'font-size #-4 e e'> <\tweak #'font-size #-4 g g'> <\tweak #'font-size #-4 c c'>
}

Ist zwar etwas umständlich, aber man kann sich ja ein Kürzel definieren (oder eine schöne Funktion schreiben).

Viele Grüße
Torsten


Edit:

... und weil es so umständlich ist, habe ich die Oktavierungsfunktion aus dem Snippet Repository http://lsr.dsi.unimi.it/LSR/Snippet?id=445 etwas angepaßt, so dass sie die oktavierten Noten in Stichnotengröße (zwei "Stufen" kleiner) setzt.
Ich weiß, daß es aktuellere Funktionen gibt, aber diese paßt noch schön zu Deiner Lilypond-Version 2.12 (ich gehe mal davon aus, daß Du noch 2.12 benutzt, weil Du ein Beispiel aus dem 2.12er-Manual angibst).

Änderungen an der Vorlage:

  • Berechnung von octave korrigiert, damit man auch Variablen (wie in Deinem Beispiel \musik) übergeben kann.
  • Umbenennung mit "cue" im Namen (nur Kosmetik)
  • Größe der oktavierten Note(n) um zwei Stufen verringert -> Stichnoten-Grlöße[\li]
Jetzt kannst Du mit \makeCueOctaves #-1 { \musik } wie gewünscht eine Oktave unter der Melodielinie Stichnoten erzeugen, die den selben Hals "benutzen" und die Hälse haben sogar ihre Standard-Ausrichtung nach oben oder unten.
Mit \makeCueOctaves #2 { ... } sind die Stichnoten zwei Oktaven höher.

\version "2.12.3"

#(define (cue-octave-up m t)
 (let* ((octave (+ (ly:pitch-octave (ly:music-property m 'pitch)) t))
      (new-note (ly:music-deep-copy m))
      (new-pitch (ly:make-pitch
        octave
        (ly:pitch-notename (ly:music-property m 'pitch))
        (ly:pitch-alteration (ly:music-property m 'pitch)))))
  (set! (ly:music-property new-note 'pitch) new-pitch)
  (ly:music-set-property! new-note 'tweaks (list (cons (quote font-size) -2)))  ; macht die oktavierte Note kleiner
  new-note))

#(define (cue-octavize-chord elements t)
 (cond ((null? elements) elements)
     ((eq? (ly:music-property (car elements) 'name) 'NoteEvent)
       (cons (car elements)
             (cons (cue-octave-up (car elements) t)
                   (cue-octavize-chord (cdr elements) t))))
     (else (cons (car elements) (cue-octavize-chord (cdr elements ) t)))))

#(define (cue-octavize music t)
 (if (eq? (ly:music-property music 'name) 'EventChord)
       (ly:music-set-property! music 'elements (cue-octavize-chord
(ly:music-property music 'elements) t)))
 music
 )

makeCueOctaves = #(define-music-function (parser location arg mus) (integer? ly:music?)
 (music-map (lambda (x) (cue-octavize x arg)) mus))


musik = \relative c'' {
  c4 e g c
}

\relative c' {
  \makeCueOctaves #-1 { \musik }
}

Viele Grüße
Torsten
« Letzte Änderung: Mittwoch, 17. Oktober 2012, 19:28 von Be-3 »

merula

  • Member
Re: Stichnoten mit gemeinsamen Notenhälsen
« Antwort #2 am: Donnerstag, 18. Oktober 2012, 10:22 »
Hi Torsten,

das sieht toll aus. Ich muss allerdings zugeben, dass ich genau nichts verstehe.  ???

Ich nutze die Version 2.17.2 auf Mac OS X. Damit kann ich das Snippet zwar ohne Fehler übersetzen, aber die Stichnoten erscheinen nicht.  :( Da rächt es sich den Code nicht zu verstehen.

Gruß

Lars

PS: Bei mir funktioniert schon das ursprüngliche Snippet nicht.
« Letzte Änderung: Donnerstag, 18. Oktober 2012, 11:37 von merula »

Be-3

  • Member
Re: Stichnoten mit gemeinsamen Notenhälsen
« Antwort #3 am: Donnerstag, 18. Oktober 2012, 14:46 »
Ich nutze die Version 2.17.2 auf Mac OS X. Damit kann ich das Snippet zwar ohne Fehler übersetzen, aber die Stichnoten erscheinen nicht. 

[...]

PS: Bei mir funktioniert schon das ursprüngliche Snippet nicht.

Hallo Lars,

ich hatte extra das alte Snippet herausgekramt, weil ich dachte, Du hättest noch Version 2.12.
Hier ist nun eine modernisierte Variante, die mit 2.17 funktioniert:

\version "2.17.1"

#(define (cue-with-octave-up m octave)
        (let* ((old-pitch (ly:music-property m 'pitch))
               (new-note (ly:music-deep-copy m))
               (new-pitch (ly:make-pitch
                   (+ octave (ly:pitch-octave old-pitch))
                   (ly:pitch-notename old-pitch)
                   (ly:pitch-alteration old-pitch))))
  (ly:music-set-property! new-note 'tweaks (list (cons (quote font-size) -2)))  ; macht die oktavierte Note kleiner
              (set! (ly:music-property new-note 'pitch) new-pitch)
              (list m new-note)))

#(define (cue-octavize music t)
   (map-some-music
     (lambda (m)
       (cond ((music-is-of-type? m 'event-chord)
                (set! (ly:music-property m 'elements)
                      (append-map!
                          (lambda (n)
                            (if (ly:music-is-of-type n 'note-event)
                                (with-octave-up n t)
                                (list n)))
                          (ly:music-property m 'elements)))
                m)
             ((music-is-of-type? m 'note-event)
                (make-event-chord (cue-with-octave-up m t)))
             (else #f)))
      music))


#(define-public makeCueOctaves (define-music-function (parser location
 arg mus) (integer? ly:music?)
     (cue-octavize mus arg)))


\relative c'' {
  \makeCueOctaves #-1 { c4 e g c }
}

Viele Grüße
Torsten

merula

  • Member
Re: Stichnoten mit gemeinsamen Notenhälsen
« Antwort #4 am: Donnerstag, 18. Oktober 2012, 15:27 »
Hallo Torsten,

ah, vielen Dank. Jetzt funktioniert es auch bei mir.  :) Was muss ich denn noch anpassen, damit auch das ganze Drumrum (slurs, dynamic etc.) mit gerendert wird?
Konkret:
cis8^\ff e e^\<([fis e]\! dis4 cis8) \bar"dashed"
cis e^\< ([dis e] fis\!) e d cis([e]~e)

Be-3

  • Member
Re: Stichnoten mit gemeinsamen Notenhälsen
« Antwort #5 am: Donnerstag, 18. Oktober 2012, 20:30 »
Was muss ich denn noch anpassen, damit auch das ganze Drumrum (slurs, dynamic etc.) mit gerendert wird?

Hallo Lars,

mühsam ernährt sich das Eichhörnchen...
Hier ist schließlich eine Variante, die sowohl mit 2.17 funktioniert und auch das Drumrum mitnimmt:

\version "2.17.1"

#(define (cue-with-octave m t)
    (let* ((duration (ly:music-property m 'duration))
           (old-pitch (ly:music-property m 'pitch))
           (octave (+ (ly:pitch-octave (ly:music-property m 'pitch)) t))
           (new-pitch (ly:make-pitch
              octave
              (ly:pitch-notename old-pitch)
              (ly:pitch-alteration old-pitch))))
; create NoteEvents using duration and pitch only
    (list (make-music 'NoteEvent 'duration duration 'pitch old-pitch)
      (make-music 'NoteEvent
         'tweaks (list (cons (quote font-size) -2)) ; macht die oktavierte Note kleiner
         'duration duration 'pitch new-pitch))))

#(define (cue-octavize music t)
    (map-some-music
      (lambda (m)
        (cond ((music-is-of-type? m 'event-chord)
          (set!
           (ly:music-property m 'elements)
             (append-map!
               (lambda (n)
                 (if (music-is-of-type? n 'note-event)
                   (cue-with-octave n t)
                   (list n)))
               (ly:music-property m 'elements)))
               m)
             ((music-is-of-type? m 'note-event)
                (make-event-chord (append (cue-with-octave m t) (ly:music-property m 'articulations))))
              (else #f)))
            music))

makeCueOctaves = #(define-music-function (parser location arg mus)
   (integer? ly:music?)
   (cue-octavize mus arg))


musik = \relative c'' {
  cis8^\ff e e^\<([fis e]\! dis4 cis8) \bar"dashed"
  cis e^\< ([dis e] fis\!) e d cis([e]~e)
}

\new Staff \makeCueOctaves #-1 \musik

\new Staff \musik


Viele Grüße
Torsten
« Letzte Änderung: Donnerstag, 18. Oktober 2012, 20:39 von Be-3 »