Autor Thema: Verlängerungspunkt hinter dem Takstrich (HALB GELÖST)  (Gelesen 2688 mal)

ingmar

  • Gast
Verlängerungspunkt hinter dem Takstrich (HALB GELÖST)
« am: Sonntag, 13. Juli 2014, 18:29 »
Eine - aus heutiger Sicht unübersichtliche, aber auch bei Beethoven durchaus noch gebräuchliche - Notationsform schreibt im Fall "das letzte Viertel eines Takts soll durch ein im nächsten Takt folgendes angebundenes Achtel verlängert werden" einfach einen Verlängerungspunkt hinter den Taktstrich.

Lässt sich das in Lilypond auf einfache Weise realisieren?

--ingmar
« Letzte Änderung: Sonntag, 5. Juli 2015, 12:40 von ingmar »

trulli

  • Gast
Re: Verlängerungspunkt hinter dem Takstrich
« Antwort #1 am: Sonntag, 13. Juli 2014, 22:56 »
Hi Ingmar,

man kann den Dot einfach in den nächsten Takt verschieben.

\version "2.18.0"

\relative c ' {
f4 f f \once \override Dots #'extra-offset = #'( 2.8 . -0.1)  f4.
f8 f4 f f
}


Grüße von Trulli
« Letzte Änderung: Sonntag, 13. Juli 2014, 23:08 von trulli »

harm6

  • Gast
Re: Verlängerungspunkt hinter dem Takstrich
« Antwort #2 am: Montag, 14. Juli 2014, 01:09 »
Hallo,

das hab' ich schon mal hier gemacht:
http://lists.gnu.org/archive/html/lilypond-user/2013-09/msg00584.html

Bild im Anhang.
Falls es Probleme gibt, melde Dich :)

HTH,
  Harm

ingmar

  • Gast
re: Verlängerungspunkt hinter dem Takstrich
« Antwort #3 am: Sonntag, 20. Juli 2014, 22:09 »
Zwischenstand:

Erstmal vielen Dank für die Antworten.

Die erste besticht durch ihre Einfachheit, hat aber den Nachteil, dass ich ja, wenn ichs richtig verstehe, den Punkt manuell hin- und herschiebe. Ich muss dann die Werte jeweils durch Probieren finden, und stoße bei Zeilenwechseln auf unüberwindliche Schwierigkeiten. Jedes neu eingefügte Vorzeichen kann den Satz umformatieren, und ich müsste anschließend alle Verlängerungspunkte prüfen...

Sicher eine gute Lösung für eine einfache Druckvorlage, aber nicht für ein File, aus dem ich Partitur, Einzelstimmen und eines Tages vielleicht auch transponierte Fassungen generieren können will.

Die zweite Lösung funktioniert grundsätzlich bei kleinen Files. Ich hab aber ein langes File, wo sie keinerlei Wirkung zeigt. Meine bisherigen Versuche, den Fehler zu isolieren, um ihn hier darzustellen, sind leider fehlgeschlagen. Da ich mich leider nicht jeden Tag mit dem Thema beschäftigen kann, kann es noch ein wenig dauern, bis es hier weitergeht.

Trotzdem herzlichen Dank an euch beide für die schnelle Reaktion!

Gruß,
--ingmar

ingmar

  • Gast
re: Verlängerungspunkt hinter dem Takstrich
« Antwort #4 am: Sonntag, 22. Februar 2015, 20:43 »
Hallo,


hab mich nun - nach langer Pause - wieder diesem Thema gewidmet.

Leider hat die von dir, harm6, netterweise ausbaldoverte Lösung ein Problem, wenn die punktierte Note in einer anderen Oktav liegt; offenbar wird diese Oktavänderung dann für den Punkt ein zweites Mal angenommen, so dass wir anschließend in der falschen Oktav liegen.

Ich bin da leider mit meinen Kenntnissen aufgeschmissen, aber vielleicht fällt jemand ja eine Lösung ein.

Gruß, danke : - )
--ingmar

\version "2.18.2"
\language "english"

SHIFTDOT =
#(define-music-function (parser location music) (ly:music?)
"
Replaces a dotted note with a single main note and (a tied) single additional
note. The Tie will be transparent.
The second note will appear as dot, without Stem, Flag, Beam, Articulations.
Barchecks should not be used.
Limitation: does not work for chords.
"
(let* ((duration (ly:music-property music 'duration))
    (dot-count (if (ly:duration? duration)
                       (ly:duration-dot-count duration)
                       0)))
;; Apply it only if the note is a single-dotted note
(if (= dot-count 1)
(let* ((m-1 (ly:music-deep-copy music))
(m-2 (ly:music-deep-copy music))
(dur-log (ly:duration-log duration))
(first-dur (ly:make-duration dur-log))
(second-dur (ly:make-duration (+ dur-log 1))))

;; Defines a procedure to replace the given NoteHead with a dot.
(define (note-head->dot note-head)
(let* ((stencil (ly:grob-property note-head 'stencil))
(note-head-X-length
(interval-length (ly:stencil-extent stencil X)))
(dot (ly:font-get-glyph (ly:grob-default-font note-head)
                                         "dots.dot"))
                 (dot-X-length (interval-length (ly:stencil-extent dot X)))
                 (staff-pos (ly:grob-property note-head 'staff-position))
                 (stem (ly:grob-object note-head 'stem))
                 (flag (ly:grob-object stem 'flag))
                 (accidental-grob (ly:grob-object note-head 'accidental-grob))
                 ;; Get values for translating the dot-stencil to avoid putting
                 ;; it on a staff-line.
                 ;; Because ledger-lines will be removed, we return 0, if the
                 ;; NoteHead is above or below the staff.
                 (dir (if (and (even? staff-pos)
                               (not (> staff-pos 5))
                               (not (< staff-pos -5)))
                          -2
                          0))
                 ;; Calculate a value to center the dot with NoteHeads from
                 ;; other voices
                 (x-offset (/ (- note-head-X-length dot-X-length) 2))
                 (new-note-stencil
                    (ly:stencil-translate-axis
                       (ly:stencil-aligned-to dot Y dir)
                       x-offset
                       X)))
             ;;  No Stem, Flag or Accidental!
             (if (not (null? stem))
                 (ly:grob-set-property! stem 'stencil point-stencil))
             (if (not (null? flag))
                 (ly:grob-set-property! flag 'stencil point-stencil))
             (if (not (null? accidental-grob))
                 (ly:grob-set-property! accidental-grob 'stencil point-stencil))
             ;; Replace the NoteHead with a centered dot
             (ly:grob-set-property! note-head 'stencil new-note-stencil)))

       ;; Build the notes to insert, replacing the dotted one.
       (ly:music-set-property! m-1 'duration first-dur)
       (ly:music-set-property! m-2 'duration second-dur)
       ;; In order not to disturb midi we insert a Tie here, making it
       ;; tranparent later.
       (let ((articulations (ly:music-property m-1 'articulations)))
          (ly:music-set-property! m-1 'articulations
                                      (append (list (make-music 'TieEvent))
                                              articulations)))
       ;; No Beam!
       ;; Also, we don't want other elements in 'articulations of the second
       ;; note, let it replaces them.
       (ly:music-set-property! m-2 'articulations
                                   (list (make-music 'BeamForbidEvent)))
       #{
              \override Tie #'transparent = ##t
              $m-1
              \once \override NoteHead #'no-ledgers = ##t
              \once \override NoteHead #'before-line-breaking = #note-head->dot
              $m-2
       #})
       music)))

\relative c'' {
a4 gs a \SHIFTDOT f'4.
e8 f cs d2
}

... das kommt folgendermaßen heraus:
« Letzte Änderung: Sonntag, 22. Februar 2015, 23:29 von ingmar »

harm6

  • Gast
Re: re: Verlängerungspunkt hinter dem Takstrich
« Antwort #5 am: Sonntag, 22. Februar 2015, 23:13 »
Zitat von: ingmar
Leider hat die von dir, harm6, netterweise ausbaldoverte Lösung ein Problem, wenn die punktierte Note in einer anderen Oktav liegt; offenbar wird diese Oktavänderung dann für den Punkt ein zweites Mal angenommen, so dass wir anschließend in der falschen Oktav liegen.

Das grundlegende Problem welches hier getriggert wird ist: \relative vs \absolute

Ich schrieb bereits:
[...]
Darüberhinaus ist es im relative-modus schwieriger (manchmal unmöglich) mit Musikfunktionen ins Geschehen einzugreifen. Das sind aber in der Regel Spezialfälle, die erstmal kein Argument gegen \relative darstellen.
[...]

Hier ist es aber ein Problem (die Definition würde in \absolute tadellos funktioniert haben)!

Insoweit habe ich ein optionales Argument einfügt mit dem man zwischen \relative und \absolute umschalten kann.

\version "2.18.2"
%\language "english"

SHIFTDOT =
#(define-music-function (parser location relative? music)
  ((boolean? #t) ly:music?)
  "
   Replaces a dotted note with a single main note and (a tied) single additional
   note.
   The Tie will be transparent.
   The second note will appear as dot, without Stem, Flag, Beam, Articulations.
   Barchecks should not be used.
   Limitation: does not work for chords.
   If \\absolute is used, @var{relative?} needs to be set @val{#f}
  "
 (let* ((duration (ly:music-property music 'duration))
        (dot-count (if (ly:duration? duration)
                       (ly:duration-dot-count duration)
                       0)))
  ;; Apply it only if the note is a single-dotted note
  (if (= dot-count 1)
      (let* ((m-1 (ly:music-deep-copy music))
             (m-2 (ly:music-deep-copy music))
             (dur-log (ly:duration-log duration))
             (first-dur (ly:make-duration dur-log))
             (second-dur (ly:make-duration (+ dur-log 1))))
     
       ;; Defines a procedure to replace the given NoteHead with a dot.
       (define (note-head->dot note-head)
          (let* ((stencil (ly:grob-property note-head 'stencil))
                 (note-head-X-length
                    (interval-length (ly:stencil-extent stencil X)))
                 (dot (ly:font-get-glyph (ly:grob-default-font note-head)
                                         "dots.dot"))
                 (dot-X-length (interval-length (ly:stencil-extent dot X)))
                 (staff-pos (ly:grob-property note-head 'staff-position))
                 (stem (ly:grob-object note-head 'stem))
                 (flag (ly:grob-object stem 'flag))
                 (accidental-grob (ly:grob-object note-head 'accidental-grob))
                 ;; Get values for translating the dot-stencil to avoid putting
                 ;; it on a staff-line.
                 ;; Because ledger-lines will be removed, we return 0, if the
                 ;; NoteHead is above or below the staff.
                 (dir (if (and (even? staff-pos)
                               (not (> staff-pos 5))
                               (not (< staff-pos -5)))
                          -2
                          0))
                 ;; Calculate a value to center the dot with NoteHeads from
                 ;; other voices
                 (x-offset (/ (- note-head-X-length dot-X-length) 2))
                 (new-note-stencil
                    (ly:stencil-translate-axis
                       (ly:stencil-aligned-to dot Y dir)
                       x-offset
                       X)))
             ;;  No Stem, Flag or Accidental!
             (if (not (null? stem))
                 (ly:grob-set-property! stem 'stencil point-stencil))
             (if (not (null? flag))
                 (ly:grob-set-property! flag 'stencil point-stencil))
             (if (not (null? accidental-grob))
                 (ly:grob-set-property! accidental-grob 'stencil point-stencil))
             ;; Replace the NoteHead with a centered dot
             (ly:grob-set-property! note-head 'stencil new-note-stencil)))
               
       ;; Build the notes to insert, replacing the dotted one.
       (ly:music-set-property! m-1 'duration first-dur)
       (ly:music-set-property! m-2 'duration second-dur)
       ;; In order not to disturb midi we insert a Tie here, making it
       ;; tranparent later.
       (let ((articulations (ly:music-property m-1 'articulations)))
          (ly:music-set-property! m-1 'articulations
                                      (append (list (make-music 'TieEvent))
                                              articulations)))
       ;; No Beam!
       ;; Also, we don't want other elements in 'articulations of the second
       ;; note, let us replaces them.
       (ly:music-set-property! m-2 'articulations
                                   (list (make-music 'BeamForbidEvent)))
                       
       ;; If \relative is used make sure to cause no other octavation
       (if relative?
           (let* ((m-1-pitch (ly:music-property music 'pitch))
                  (pitch-notename (ly:pitch-notename m-1-pitch))
                  (pitch-alteration (ly:pitch-alteration m-1-pitch))
                  ;; create a pitch with alteration, name and
                  ;; octave set to -1!
                  (p (ly:make-pitch -1 pitch-notename pitch-alteration)))
               (ly:music-set-property! m-2 'pitch p)))
       
       #{
           \override Tie #'transparent = ##t
           $m-1
           \noBreak
           \once \override NoteHead #'no-ledgers = ##t
           \once \override NoteHead #'before-line-breaking = #note-head->dot
           $m-2
       #})
       music)))



\relative c'' {
a4 gis a \SHIFTDOT f'4.
e8 f cis d2
}

\absolute {
a'4 gis' a' \SHIFTDOT ##f f''4.
e''8 f'' cis'' d''2
}

HTH,
  Harm

P.S. Die "Indentation" meines von Dir zitierten Codes war total verbockt. Hat da irgendein mail-program oder viewer Mist gebaut?
P.P.S harm-wikia ist geschlossen für heute ;)

ingmar

  • Gast
re: Verlängerungspunkt hinter dem Takstrich (GELÖST)
« Antwort #6 am: Samstag, 4. Juli 2015, 16:58 »
Soweit funktioniert das alles gut. Ich habe kein Problem damit, meine Quelldatein von \relative in absolute Angaben zu verwandeln, die Funktion kann sich also gerne auf relative Angaben verlassen.

Es ist aber ein weiterer Wunsch aufgekommen: Das zu automatisieren, also nicht vor die jeweilige Note davor schreiben zu müssen.

Also sowas:
MUSIC = {
    c2 d2.
       e4 f g4.
       a8 bes a g2
    f4. e8 f1.
       d e
    c1
}
 
\Shiftdot { \MUSIC }  % hier würde bei allen punktierten Noten, die über den Taktstrich zeigen (Zeilen 1, 2, 4), der Punkt hinter diesen geschoben.
\Tiedot { \MUSIC } % hier würden bei den gleichen Noten der Punkt in den entsprechenden angehängten Notenwert verwandelt.

Wofür braucht man sowas? - für historische Notation, die man einmal nahe am Original, einmal für rhythmisch unsichere Laienmusiker ausgeben will.

Gruß,
--ingmar

harm6

  • Gast
Re: Verlängerungspunkt hinter dem Takstrich (GELÖST)
« Antwort #7 am: Samstag, 4. Juli 2015, 19:18 »
Hallo ingmar,

Tiedot gibts eigentlich schon:

Tiedot =
\with {
  \remove "Note_heads_engraver"
  \consists "Completion_heads_engraver"
  \remove "Rest_engraver"
  \consists "Completion_rest_engraver"
}

MUSIC = {
    c2 d2.
       e4 f g4.
       a8 bes a g2
    f4. e8 f1.
       d e
    c1
}

\new Voice \MUSIC
\new Voice \Tiedot \MUSIC

Wenn ich Dich richtig verstehe sollen bei einer generalisierten Anwendung von SHIFTDOT nur die Noten deren Dauer in den nächsten Takt hineinragt verändert werden, nicht aber punktierte Noten innerhalb eines Taktes. Richtig?

Jede punktierte Note anzugehen wäre relative einfach, denke ich. Aber nur bestimmte, abhängig davon ob sie innerhalb des Taktes zu Ende sind? Mag sich als harte Nuss erweisen Ich denk mal drüber nach...


Gruß,
  Harm

ingmar

  • Gast
Re: Verlängerungspunkt hinter dem Takstrich
« Antwort #8 am: Sonntag, 5. Juli 2015, 03:23 »
Zitat
harm6: Tiedot gibts eigentlich schon: [...]
Ah, super! Als hätte ichs geahnt... - Kurzer Versuch:
\version "2.18.2"
\language "english"

\score {
\new Staff \with {
instrumentName = "treble"
  \remove "Note_heads_engraver"
  \consists "Completion_heads_engraver"
  \remove "Rest_engraver"
  \consists "Completion_rest_engraver"
}
\relative c' {
  b4. c8 d2.
   e4 f e8 d
e8 f g2 fs4
g2 f1
   e1
   d4 e
f2 e
  }
}
Leider werden im neuen Takt zwar Notenköpfe, aber keine Hälse gedruckt. Und im Fall der ganzen Note entsteht ein Artefakt; vielleicht wird auch hier ein gefüllter Notenkopf gedruckt und die ganze Note dann darüber.

Darüber hinaus hagelt es jede Menge Fehlermeldungen:
14:17: Warnung: der rhythmische Kopf gehört nicht zu einer rhythmischen Kolumne
                b4. c8 d2.

Jeder Takt scheint doppelt so oft moniert zu werden, wie er Noten enthält - dieser erste dreimal als ganzer Takt, dann jede Note einzeln, mit praktisch identischer Fehlermeldung.

Zitat
harm6: Wenn ich Dich richtig verstehe sollen bei einer generalisierten Anwendung von SHIFTDOT nur die Noten deren Dauer in den nächsten Takt hineinragt verändert werden, nicht aber punktierte Noten innerhalb eines Taktes. Richtig?
Ja, so hatte ich mir das vorgestellt. Aber wahrscheinlich ist zu dem Zeitpunkt, wo das entscheiden werden müsste, noch gar nicht klar, wo die Taktstriche liegen werden, richtig?

Danke, und Gruß,
--ingmar

mgd

  • Gast
Re: Verlängerungspunkt hinter dem Takstrich (GELÖST)
« Antwort #9 am: Sonntag, 5. Juli 2015, 09:27 »
Hallo ingmar,

es funktioniert, wenn du das nicht auf Staff Level, sondern auf Voice Level anwendest:
\version "2.18.2"
\language "english"

\score {
  \new Staff \with {
    instrumentName = "treble"
  } <<
    \new Voice \with {
      \remove "Note_heads_engraver"
      \consists "Completion_heads_engraver"
      \remove "Rest_engraver"
      \consists "Completion_rest_engraver"
    }
      \relative c' {
        b4. c8 d2.
  e4 f e8 d
e8 f g2 fs4
g2 f1
  e1
  d4 e
f2 e
      }
  >>
}

Ich habe es allerdings nicht mit 2.18.2, sondern mit 2.19.22 getestet. Da kommen übrigens weder bei deiner, noch bei obiger Fassung irgendwelche Warnungen.

Nachtrag:
Ich habe es inzwischen mit 2.18.2 getestet. Bei deiner Fassung bekomme ich dann Mengen an Warnungen. Obige Fassung funktioniert bei mir dann ohne Warnungen.

HTH,
Michael
« Letzte Änderung: Sonntag, 5. Juli 2015, 10:33 von mgd »

harm6

  • Gast
Re: Verlängerungspunkt hinter dem Takstrich (GELÖST)
« Antwort #10 am: Sonntag, 5. Juli 2015, 12:15 »
es funktioniert, wenn du das nicht auf Staff Level, sondern auf Voice Level anwendest: [...]

Genau, die engraver müssen für die Voices ausgetauscht werden. So zeigt es auch mein Beispiel sowie die NR. ;)

Gruß,
  Harm
« Letzte Änderung: Sonntag, 5. Juli 2015, 12:40 von harm6 »

ingmar

  • Gast
re: Verlängerungspunkt hinter dem Takstrich (HALB GELÖST)
« Antwort #11 am: Mittwoch, 11. Januar 2017, 18:25 »
Hallo,

ich hole dieses alte Thema noch einmal aus der Versenkung heraus.

Zusammenfassung: Ich habe einen Notentext in einer Variablen, den ich selber nicht verändern möchte. Er enthält punktierte Notenwerte unmittelbar vor einem Taktende, bei denen der Wert der Grundnote rechnerisch noch zum alten Takt, der der Punktierung zum neuen gehört. Ich hatte zwei Wünsche:
(1) Diesen Text so auszugeben, dass in diesen Fällen statt der Punktierung eine angehängte Note ausgegeben wird.
(2) Diesen Text so auszugeben, dass in diesen Fällen der Punkt hinter dem Taktstrich ausgegeben wird.

Für (1) hatten wir eine Lösung, die auch in 2.19.37 anstandslos funktioniert. Sie macht sogar mehr, und das ist durchaus erwünscht: Sie zerlegt alle Noten, die über den Takstrich hinauszeigen, in zwei Teile und bindet diese. Sie ist auch robust gegen mehrfache Taktwechsel zuvor. - Vielen Dank!

Für (2) hatten wir keine Lösung - möglicherweise aber die Elemente einer solchen, nur reichen meine Schemekenntnisse nicht, sie aus dem, was bisher geschrieben wurde, zu destillieren. Hier dürfen allerdings nur punktierte Noten erfasst werden (für die anderen gibts einen getrennten Thread). Das hier, im vorliegenden Thread eingangs aufgetretene Problem bei relativer Notation ist für mich nicht entscheidend, ich kann gerne in Frescobaldi den Knopf drücken, der die Tonhöhen in absolute verwandelt...

Frage natürlich noch, was passieren soll, wenn die punktierte Note zwar über die Taktgrenze reicht, aber eben nicht so, dass der Wert des Punktes genau dahinter liegt. In den Quellen habe ich dafür kein Beispiel gefunden und sage der Einfachheit halber mutig: Es wird nicht vorkommen.

Ja, vielleicht kann hier noch jemand helfen!?

Ein Minimalbeispiel zum Probieren:
\version "2.19.37"

music = \relative {
c'2 d2.
e4 f g4.
a8 bes c d2.
es2 d2 c4. bes8 a4
g2. e4
c1
}

\score {
    \new Staff {
        \new Voice \with { % tja, das eben fehlt...
        }
        \music
    }
}


Danke, Gruß,
--ingmar

EDIT: "Minimalbeispiel" hinzugefügt/verbessert; Fall der "nicht ins Raster passenden" Punktierten ergänzt.
« Letzte Änderung: Mittwoch, 11. Januar 2017, 20:01 von ingmar »