Deutsches Lilypond Forum (Archiv)

Allgemein => Fragen zu Funktionen => Thema gestartet von: chf am Montag, 5. März 2012, 17:05

Titel: Vorzeichen in Akkorden
Beitrag von: chf am Montag, 5. März 2012, 17:05
Liebe Freunde,

wieder ein kleines großes Problem:
Es ist keine Tonart vorgegeben. Ich setze alle Vorzeichen konkret. Es wechseln also
\override Staff.Accidental #'transparent = ##t  und - - - = ##f.
Im folgenden Beispiel möchte ich im 2. Akkord bei "b" kein Auflösungszeichen sehen.

\version "2.14.2"
\relative c' {
<bes! d e>1 <b d es!>

Ich habe es auch mit zweistimmiger Notierung versucht - das Ergebnis ist "alles oder nichts".
Gibt es dafür eine Lösung?

Gruß
chf
Titel: Re: Vorzeichen in Akkorden
Beitrag von: ding-dong am Montag, 5. März 2012, 17:26
Zitat
Im folgenden Beispiel möchte ich im 2. Akkord bei "b" kein Auflösungszeichen sehen.

ich sehe keines ;)

warum erwartest du eines?
Titel: Re: Vorzeichen in Akkorden
Beitrag von: chf am Montag, 5. März 2012, 18:49
Entschuldige - da muss ich doch ein wenig weiter ausholen...
Titel: Re: Vorzeichen in Akkorden
Beitrag von: harm6 am Montag, 5. März 2012, 21:54
Hallo Christa,

ein override-Befehl wirkt auf alle Ereignisse die zu einem bestimmten Zeitpunkt stattfinden ("alles oder nichts"). Man muß also einen tweak-Befehl bemühen. Es ist allerdings gar nicht so einfach das hinzukriegen, so daß es lange Zeit als unmöglich galt. Seit ein paar Jahren gibt es aber eine Lösung, die hier im Forum auch schon verschiedentlich angewendet wurde.

-> https://liarchiv.joonet.de/index.php?topic=876.msg4825#msg4825 (https://liarchiv.joonet.de/index.php?topic=876.msg4825#msg4825)
-> https://liarchiv.joonet.de/index.php?topic=345.msg2008#msg2008

Zu Deinem eigentlichen Problem:
Folgende Funktion erlaubt das selektive unsichtbar-machen von Vorzeichen in einem Akkord.

\version "2.14.2"

transpAcc =
#(define-music-function (parser location music) (ly:music?)

(define (transparent-accidental note-grob)
  (let ((accidental (ly:grob-object note-grob 'accidental-grob)))
    (if (not (null? accidental))
      (ly:grob-set-property! accidental 'transparent #t))))
     
         (set! (ly:music-property music 'tweaks)
(acons 'before-line-breaking (lambda (grob) (transparent-accidental grob))
         (ly:music-property music 'tweaks)))
   music)

\relative c' {
        <\transpAcc cis \transpAcc eis! \transpAcc gis? cis>1
}

HTH,
  Harm
Titel: Re: Vorzeichen in Akkorden
Beitrag von: harm6 am Montag, 5. März 2012, 22:14
Hallo nochmal,

vielleicht ist es Dir ja lieber die Vorzeichen nicht nur unsichtbar zu machen, sondern selektiv ganz zu entfernen, denn auch unsichtbare Vorzeichen nehmen Platz ein.
-> PNG

\version "2.14.2"

transpAcc =
#(define-music-function (parser location music) (ly:music?)

(define (transparent-accidental note-grob)
  (let ((accidental (ly:grob-object note-grob 'accidental-grob)))
    (if (not (null? accidental))
      (ly:grob-set-property! accidental 'transparent #t))))
     
         (set! (ly:music-property music 'tweaks)
(acons 'before-line-breaking (lambda (grob) (transparent-accidental grob))
         (ly:music-property music 'tweaks)))
   music)

\relative c' {
        <\transpAcc cis \transpAcc eis! \transpAcc gis? cis>1
}

killAcc =
#(define-music-function (parser location music)(ly:music?)

(define (suppress-accidental note-grob)
  (let ((accidental (ly:grob-object note-grob 'accidental-grob)))
    (if (not (null? accidental))
      (ly:grob-suicide! accidental))))
     
         (set! (ly:music-property music 'tweaks)
(acons 'before-line-breaking (lambda (grob) (suppress-accidental grob))
         (ly:music-property music 'tweaks)))
   music)
   
\relative c' {
        <\killAcc cis \killAcc eis! \killAcc gis? cis>1



Gruß,
  Harm
Titel: Re: Vorzeichen in Akkorden
Beitrag von: chf am Dienstag, 6. März 2012, 12:01
Danke!!!
Titel: Re: Vorzeichen in Akkorden
Beitrag von: Arnold am Donnerstag, 8. März 2012, 08:48
Nur noch so ein Gedankenspiel:

Wenn alle Vorzeichen sowieso explizit angegeben werden sollen (Ausrufezeichen hinter dem Pitch), dann könnte man sich auch einen Vorzeichenmodus erstellen, der erst einmal gar keine Vorzeichen anzeigt.

Und zum Korrektur-Lesen, würde ich dann die Notenköpfe je nach Vorzeichen (im Pitch der Notenköpfe) anders färben. Das dürfte mit einer globalen »before-line-breaking-prozedur« machbar sein, vielleicht muß ich aber noch nach den korrekten Bezeichnern für »besondere Notenköpfe« (z. Bsp. im pitchedTrill) suchen.

Arnold
Titel: Re: Vorzeichen in Akkorden
Beitrag von: harm6 am Donnerstag, 8. März 2012, 10:32
Hallo Arnold,

Zitat
Wenn alle Vorzeichen sowieso explizit angegeben werden sollen (Ausrufezeichen hinter dem Pitch), dann könnte man sich auch einen Vorzeichenmodus erstellen, der erst einmal gar keine Vorzeichen anzeigt.

wußte ich doch, daß mit sowas kommst :)

Aber wenn man den Weg über den Vorzeichenmodus beschreiten möchte, so meine ich, daß man anstatt eine Neudefinition zu versuchen auch mit: #(set-accidental-style 'forget) hinkommen müßte. Und um es wieder zurückzusetzen #(set-accidental-style 'default)

Das gilt für 2.14.2.
Für 2.15.31 kann man einfach \accidentalStyle "forget" bzw \accidentalStyle "default" schreiben.

(Es gibt sooo viele neue, schöne bzw verbesserte Features in 2.15. !!)

Gruß,
  Harm
Titel: Re: Vorzeichen in Akkorden
Beitrag von: Arnold am Donnerstag, 8. März 2012, 12:35
Ja,

mein Gedanke war, wenn ich »forget« benutze, bekommen ich vor jedem tonleiterfremden Pitch ein Vorzeichen, und kann es nur mit einem \tweak beforlinebreaking innerhalb eines Akkords wieder entfernen.
Wenn ich das «forget« zu einem »never« clone, dann kann ich mit einem Ausrufezeichen das Vorzeichen hinzufügen.

Aber vielleicht sollten wir folgenden Verbesserungsvorschlag ausarbeiten:
1) Ein »kopfstehendes Ausrufezeichen« (bin mir nicht sicher, ob das Zeichen eine gute Wahl ist) nach dem Pitch soll bewirken, daß das Vorzeichen gar nicht dargestellt wird.
2) Ein »normales Ausrufezeichen« soll immer bewirken, daß das Vorzeichen dargestellt wird, und zwar ohne Klammer, auch wenn es beim \accidentalSyle "modern-cautionary" (oder ähnlichem) als eingeklammertes Erinnerungs-Vorzeichen dargestellt würde.
- Da ich aber vermute, daß man dafür auch den C-Code anpassen müßte, wird's wohl nicht so einfach gleich einen Lösungsvorschlag mitzuliefern.
 ;)