Deutsches Lilypond Forum (Archiv)

Allgemein => Fragen zu Funktionen => Thema gestartet von: Arnold am Donnerstag, 14. April 2011, 15:51

Titel: Bindebogen-Haltebogen-Mehrdeutigkeit
Beitrag von: Arnold am Donnerstag, 14. April 2011, 15:51
Hallo,

was ich bisher als Workaround für das Problem einer Binding z. Bsp. von cis über den Taktschrich nach c gefunden habe, ist einigermaßen akzeptabel (unter dem von mir bevorzugten modern-cautionary Versetzungszeichenmodus, wo mit »!« die Klammer vom automatischen Vorzeichen nicht wegzubekommen ist).

Aber - hat jemand vieleicht eine elegantere, einfacher anzuwendende Lösung?
Titel: Re:Bindebogen-Haltebogen-Mehrdeutigkeit
Beitrag von: ding-dong am Donnerstag, 14. April 2011, 16:55
schön, dein code gefällt mir ausgezeichnet, (und auch der output); aber - ehrlich gesagt - verstehe ich nicht was deine frage ist!
Titel: Re:Bindebogen-Haltebogen-Mehrdeutigkeit
Beitrag von: Arnold am Freitag, 15. April 2011, 10:38
Gegeben sei: ein Bindung (slur) von cis'' nach c'', in C-Dur, und so gelegen, daß die beiden Noten in unterschielichen Takten liegen.
quasi: cis''( | c'')

Ohne Vorgabe eines accidental-styles (also 'default') würde ich die Noten vom Notenblatt "falsch" spielen!
Denn, es sieht aus wie: cis''~ | cis''

Mit dem von mir bevorzugen Vorzeichen-Setz-Stilen (modern-cautionary oder modern-voice-cautionary) sieht es ein bischen besser aus, dann ist nämlich das Auflösungszeichen der zweiten Note vorhanden, wenn auch eingeklammert dargestellt.
quasi: cis''( | c''?)
Allerdings, so (mit eingeklammertem Vorzeichen) schreibt man auch "vom Editor hinzugefügte Vorzeichen, die nicht im Original vorhanden waren".

Und nun suche ich nach einer einfach anwendbaren Methode, die Klammer von dem Vorzeichen wieder wegzubringen (eventuell nur von einzelnen Tönen eines Akkords), ohne den einmal eingestellten Versetzungszeichenmodus zu überschreiben, denn das gleiche Voice-Schnipsel möchte ich mehrfach verwenden, eben auch in anderenen Vorzeichenmodi.
Das Ausrufezeichen allein, ergo { cis''( | c''!) }, zeigt bei modern-cautionary keine Wirkung.
Titel: Re:Bindebogen-Haltebogen-Mehrdeutigkeit
Beitrag von: ding-dong am Freitag, 15. April 2011, 13:56
meinst du:
  cis1( \once \override AccidentalCautionary #'parenthesized = ##f c)
Titel: Re:Bindebogen-Haltebogen-Mehrdeutigkeit
Beitrag von: Arnold am Dienstag, 19. April 2011, 12:30
Fast (so in der zweiten Zeile meines Beispiels verwendet).

Dieses override wirkt auf einen ganzen Akkord, und damit auch auf Töne, deren Vorzeichen ich gern eingeklammert lassen möchte.
Aber ich bin gerade einem speziellen »\tweak #'before-line-breaking #remove-parenthesis-from-associated-accidental« auf der Spur, mit dem ich sogar für das einem einzelnen Ton aus einem Akkord zugeodnete Vorzeichen die Einklammerung wieder entfernen kann - für die restlichen Töne gilt dann weiterhin die als accidental-style eingestellte Methode. Zusammen mit einem Ausrufezeichen nach dem Pitch wird dann dieser Ton in jedem accidental-style mit einem nicht eingeklammerten Versetzungszeichen ausgegeben.
Der einzige Nachteil (außer dem Wunsch nach einem Vollautomatismus ohne manuelle Eingriffe) ist dann noch, das die einzugebenden Identifikatoren relativ lange sind (in meinem Beispiel 76 Zeichen plus Leerzeichen) und sich nur schwer auf zwei bis drei Zeichen Gesamtlänge verkürzen lassen.
Titel: Re:Bindebogen-Haltebogen-Mehrdeutigkeit
Beitrag von: harm6 am Dienstag, 19. April 2011, 14:58
Hallo Arnold,

ist zwar nicht ganz was Du willst, aber zumindest eine Vereinfachung (->Anhang). Hoffe ich zumindest, denn es ist noch nicht ausgiebig getestet.
Falls Du mit »\tweak #'before-line-breaking #remove-parenthesis-from-associated-accidental« klarkommst, poste doch mal das Ergebnis. Ich habe das erst mal nicht ans laufen gekriegt.

Gruß,
  Harm
Titel: Re:Bindebogen-Haltebogen-Mehrdeutigkeit
Beitrag von: harm6 am Mittwoch, 20. April 2011, 01:51
Hallo Arnold,

ich hab' mal mit dem \tweak weiter rumgespielt und bin auf folgendes gekommen:

\version "2.12.3"

#(define (parenthesized-accidental note-grob parenthesized)
 (let ((accidental (ly:grob-object note-grob 'accidental-grob)))
   (if (not (null? accidental))
     (ly:grob-set-property! accidental 'parenthesized parenthesized))))
    
twParAcc =
#(define-music-function (parser location parenthesized music) (boolean? ly:music?)
         (set! (ly:music-property music 'tweaks)
(acons 'before-line-breaking (lambda (grob) (parenthesized-accidental grob parenthesized))
         (ly:music-property music 'tweaks)))
   music)
        
testVier = {
          \time 3/4
          \key f \major

\partial 4

cis''4(

\once \override Accidental #'color = #red
c''!) r8 as' cis''4(

<cis'' \twParAcc ##t a'?>) r8 as' cis''4(


\once \override Accidental #'color = #red
\once \override AccidentalCautionary #'color = #blue
<c''! \twParAcc ##t a'?>)
\bar "|."
}

\score {
        \new Staff \with { \override AccidentalCautionary #'parenthesized = ##f}
  {
    #(set-accidental-style 'modern-cautionary)
    \testVier
  }
  \header { piece = "accidental-style: modern-cautionary - complex workaround - simplified II" }
}

Der Ansatz: das Einklammern gänzlich ausschließen und nur bei Bedarf wieder anknipsen.

#(define (parenthesized-accidental ... reicht eigentlich schon, führt aber zu einem überlangen Befehl:
\tweak #'before-line-breaking #(lambda (grob) (parenthesized-accidental grob #t)).

twParAcc = #(define-music-function ... führt zu \twParAcc ##t und ist da schon wesentlich angenehmer.

Eigentlich bin ich mir ziemlich sicher, daß man das noch verkürzen könnte, aber es ist schon spät ... ;)

Warum das mit den Farben nicht mehr funktioniert weiß ich allerdings nicht !?

Gruß,
  Harm

P.S. Die Anleitung hierzu entnahm ich dem Beitrag von Robin Bannister auf http://www.mail-archive.com/lilypond-user@gnu.org/msg59440.html (http://www.mail-archive.com/lilypond-user@gnu.org/msg59440.html)
Titel: Re:Bindebogen-Haltebogen-Mehrdeutigkeit
Beitrag von: Arnold am Mittwoch, 20. April 2011, 09:30
Gratulation!

Ich habe meine Routine »remove-parenthesis-from-associated-accidental« basierend auf den gleichen Beitrag von Robin Bannister aufgebaut.
#(define (remove-parenthesis-from-associated-accidental note-grob)
 (let ((accidental (ly:grob-object note-grob 'accidental-grob)))
   (if (not (null? accidental))
    (ly:grob-set-property! accidental 'parenthesized #f))))
Was mir aber noch fehlte, war das "kurze" (schreibfaule) Einfügen des tweaks wie in deiner Funktion twParAcc.
Darauf werde ich weiter aufbauen.

Ich werde - nur in den missverständlichen Notationsfällen - so etwas schreiben wie < \FA c''!> (dabei ist FA das Gegenstück zu twParAcc, immer mit ##f für nicht-einzuklammern). Vielleicht kann ich mir auch noch das Ausrufezeichen sparen.
Den Rest der Noten belasse ich wie bisher, denn der accidental-style #'modern-[voice]-cautionary kommt mir beim Spielen (Blasinstrument) recht entgegen.


P.S. die Farben waren nur da, um hervorzuheben, daß es um die Vorzeichen und deren Einklammerung ging.
Titel: Re:Bindebogen-Haltebogen-Mehrdeutigkeit
Beitrag von: harm6 am Mittwoch, 20. April 2011, 13:04
Hallo Arnold,

nachdem ich eine Nacht drüber geschlafen habe kamen mir noch ein paar Gedanken:


Gruß,
  Harm
Titel: Re:Bindebogen-Haltebogen-Mehrdeutigkeit
Beitrag von: Arnold am Donnerstag, 21. April 2011, 10:06
Hallo,

das mit der Farbe hat vielleicht damit zu tun, daß ein AccidentalCautionary auch ohne Klammer noch ein AccidentalCautionary bleibt und nicht zum Accidental wird.

Also, meine Anwendung sieht jetzt etwa so aus:
#(define (remove-parenthesis-from-accidental grob)
  (let ((accidental (ly:grob-object grob 'accidental-grob)))
   (if (not (null? accidental))
    (ly:grob-set-property! accidental 'parenthesized #f)
    (display " accidental-grob nicht gefunden! "))))

FA = #(define-music-function (parser location music) (ly:music?)
  (set! (ly:music-property music 'tweaks)
   (acons 'before-line-breaking remove-parenthesis-from-accidental
    (ly:music-property music 'tweaks)))
  music)

testFuenf = {
  \time 3/4
  \key f \major
  \partial 4
  cis''4(
  % \once \override Accidental #'color = #red
  % \once \override AccidentalCautionary #'color = #blue
  <\FA c''!>) r8 as' cis''4(
  <cis'' a'>) r8 as' cis''4(
  % \once \override Accidental #'color = #red
  % \once \override AccidentalCautionary #'color = #blue
  <\FA c''! a'>)
  \bar "|."
}

\score {
  \new Staff {
    #(set-accidental-style 'modern-cautionary)
    \testFuenf
  }
  \header { piece = "Arnold - #(set-accidental-style 'modern-cautionary)" }
}
Schließlich will ich ja die in über 99 % der Fälle richtig gesetzten eingeklammerten Erinnerungsvorzeichen, deshalb kein globales Entklammern. Nur die paar Verwirrung stiftenden Töne bekommen die Klammern entfernt.
Noch habe ich nicht gesucht, wie ich mir das Eingeben das Ausrufezeichens sparen kann (und auch in \FA hineinprogrammieren) - was ich aber nur dann benötige, wenn ich einmal doch mit dem accidental-style »standard« die Noten formatiere, denn sonst werden dort überhaupt keine Vorzeichen ausgegeben.
\score {
  \new Staff {
    #(set-accidental-style 'default)
    \testFuenf
  }
  \header { piece = "normaly not used by Arnold - #(set-accidental-style 'default)" }
}

Danke für die bereits geleistete große Hilfe.
Titel: Re:Bindebogen-Haltebogen-Mehrdeutigkeit
Beitrag von: harm6 am Donnerstag, 21. April 2011, 21:09
Hallo Arnold,

da es in diesem Thread hauptsächlich um das "tweaken" von "Accidentals" in Abhängigkeit von #(set-accidental-style 'modern-cautionary) geht, schlage ich vor ihn umzubenennen. Die "Bindebogen-Haltebogen-Mehrdeutigkeit" war ja nur der Anlaß sich Gedanken über das Erscheinungsbild der Vorzeichen zu machen.
Mir schwebt da etwas vor wie accidental-style und \tweak Accidental ?
Das würde es anderen erlauben das Thema schneller und besser zu finden!
Falls Du Dich dieser Ansicht anschließen kannst, bitte ich Dich den Administrator dazu zu veranlassen.

Gruß,
  Harm
Titel: Re:Bindebogen-Haltebogen-Mehrdeutigkeit
Beitrag von: Arnold am Mittwoch, 27. April 2011, 10:21
Andererseits,

diese Mehrdeutigkeit ist der Anlaß gewesen, um - etwas ausschweifend - nach einem praktikablen Workaround zu suchen. Von daher kann der Titel eigentlich schon bleiben - oder sollte er »Forcieren eines nicht eingelammerten Vorzeichens am Taktanfang, z. Bsp. wegen der Bindebogen-Haltebogen-Mehrdeutigkeit« benannt werden (gibt vielleicht den 1. Preis für die längste Überschrift)

Ich rekapituliere:
Wenn ein Ton direkt zum darauffolgenden Ton gebunden wird,
und dieser zweite Ton am Anfang eines neuen Taktes steht,
und der erste Ton alteriert ist,
und der zweite Ton das Vorzeichen des ersten Tones wieder (zur vorgzeichneten Tonart hin) wegnimmt,
dann entsteht in der Notenschrift eine Mehrdeutigkeit, ob das nun ein Haltebogen oder ein Bindebogen ist,
und dann muß (zur Klärung dieser Mehrdeutigkeit) am zweiten Ton ein Vorzeichen (ohne Einkalmmerung) platzert werden.
Zudem erkennt lilypond in der aktuellen Version (2.12.3) diese Mehrdeutigkeit nicht und die Anzeige des Vorzeichens muß manuell forciert werden.

Je nach eingestelltem Vorzeichen-Modus ergibt sich am zweiten Ton ohne manuellen Eingriff:
a) gar kein Vorzeichen
b) ein eingeklammertes Vorzeichen
c) ein nicht eingeklammertes Vorzeichen

Im Fall a) würde ein angefügtes Ausrufezeichen genügen.
Im Fall b) ist das Entfernen der Klammer um das Vorzeichen komplexer, vor allem, wenn es sich um einen einzelnen Ton aus einem Akkord handelt und das Entklammern nur das Vorzeichen dieses einen Tones betreffen soll.
Im Fall c) bräuchte man gar nichts zu machen.

Mit der in diesem Thread entwickelten Methode kann eine Definition im Voice-Schnipsel angegeben werden, welche bei allen Vorzeichenmodi zum gewünschten Ergebnis führt. Und das Ganze ohne die Gefahr von Seiteneffekten aufgrund nicht abgeholter »\once \override« .

Nach einem include der "privaten Bibliothek" mit der genannten FA-Definition
#(define (remove-parenthesis-from-accidental grob)
  (let ((accidental (ly:grob-object grob 'accidental-grob)))
   (if (not (null? accidental))
    (ly:grob-set-property! accidental 'parenthesized #f)
    (display " accidental-grob nicht gefunden! "))))

FA = #(define-music-function (parser location music) (ly:music?)
  (set! (ly:music-property music 'tweaks)
   (acons 'before-line-breaking remove-parenthesis-from-accidental
    (ly:music-property music 'tweaks)))
  music)
erweitert man den betroffenen Ton mit »<\FA « vor und »!>« nach dem »Pitch« (falls er bereits in einem Akkord steht, entfallen natürlich »<« und »>«), also um insgesamt sieben zusätzliche Zeichen, und dann wird der betroffene Ton in jedem Vorzeichenmodus wie notwendig dargestellt.