Autor Thema: Historische Notation: Auflösungzeichen ersetzen  (Gelesen 3713 mal)

ingmar

  • Member
Historische Notation: Auflösungzeichen ersetzen
« am: Mittwoch, 18. November 2015, 15:18 »
In Mensuralnotation (sagen wir, um 1600) wurden keine Auflösungszeichen verwendet. Stattdessen wurde "b" durch ein Kreuz und umgekehrt aufgelöst. Noch Bach hatte diese Gewohnheit, eher er sich 1715 an die "moderne" Notation gewöhnte.

Das funktionierte, weil man davon ausgehen konnte, dass Töne wie his oder fes nicht auftreten würden. Auch bestand ein Bedarf, Vorzeichen aufzulösen nur innerhalb weniger Töne nach der alterierten Note. (Taktstrich wurden selten verwendet, und auch nicht in unserem Sinne.)

Vereinfachen wir die Regel so, dass nur folgende Töne möglich sind:
c, cis
d, dis
e, es
f, fis
g, gis
a, as
h, b

Nehmen wir weiter an, dass höchstens zwei andere Töne seit dem Ton mit dem Vorzeichen vergangen sind.

Ich habe nun einen Notentext in einer Variablen, der nach dieser Regel ausgedruckt werden soll.. wie könnte man sowas realisieren (die Lösung muss nicht \relative unterstützen)?

Beispiel:
\version "2.18.2"
\language "english"

BEISPIELTEXT = \relative c' {
c4 d e ds e2 d4^"b" c
bf a b2^"#" c4 d ef d
e^"#" f e2 a fs
a2 g4 f^"b"
d'2 cs4 d c^"b" bf a gs
a2 g^"b" fs4 g2 fs4 g1
}

\new Score { \BEISPIELTEXT}

Der Beispieltext gibt jeweils über den betreffenden Noten an, wie das Vorzeichen aussehen sollte.

Sicher nicht ganz einfach..!

Gruß,
--ingmar

fugenkomponist

  • Member
Re: Historische Notation: Auflösungzeichen ersetzen
« Antwort #1 am: Samstag, 30. Januar 2016, 23:03 »
So, ich hab mir diesen Thread im November als ungelesen markiert, weil ich das Thema interessant fand aber keine Zeit hatte. Hier eine mögliche Lösung, ich hoffe ich habe alles richtig verstanden:
\version "2.18.2"
\language "deutsch"

#(define (naturals-as-sharps-or-flats grob)
   (let* ((pitch (ly:event-property (event-cause grob) 'pitch))
          (alteration (ly:pitch-alteration pitch))
          (name (ly:pitch-notename pitch)))
     (if (equal? alteration 0)
         (case name
           ((0 1 3 4)
            (grob-interpret-markup grob #{ \markup \musicglyph #"accidentals.flat" #}))
           ((2 5 6)
            (grob-interpret-markup grob #{ \markup \musicglyph #"accidentals.sharp" #})))
         (ly:accidental-interface::print grob))))

\relative {
  \override Accidental.stencil = #naturals-as-sharps-or-flats
  \accidentalStyle "modern"
  \key g \dorian
  g'4 a b c
  d c h2
  c4 cis d c
  b2 a
  h1
  d4 cis c h
  b1
}

\accidentalStyle "modern" sorgt dafür, dass wie von dir angegeben auch Vorzeichen im nächsten Takt noch gesetzt werden. Der stencil kümmert sich um den Rest. Da er ja nur aufgerufen wird, wenn tatsächlich ein Vorzeichen gesetzt werden soll, kann ich einfach im Falle einer alteration=0 (also quasi „weiße Taste“) davon ausgehen, dass ich ein ♯ oder ♭ setzen soll. In den anderen Fällen lasse ich einfach die Standardfunktion ly:accidental-interface::print machen. Ach ja, die Eigenschaft name ist eine Zahl zwischen 0 und 6 für die Stufen c bis h.

Edit: Ich hab als zweites auch mal noch die Ausgabe für dein Beispiel angehängt; sieht so aus, als passts. Oder hab ich was übersehen?
2. Edit: Hab jetzt mal rangezoomt … das Spacing ist mit diesem einfachen \markup noch vollkommener Murks. Da bin ich jetzt ehrlich gesagt zu faul für, aber das Prinzip an sich funktioniert ja. Sag bescheid, wenn du noch was brauchst ;)
« Letzte Änderung: Samstag, 30. Januar 2016, 23:07 von fugenkomponist »

ingmar

  • Member
re: Historische Notation: Auflösungzeichen ersetzen
« Antwort #2 am: Sonntag, 31. Januar 2016, 19:50 »
Whow!

Erstmal vielen Dank, dass du nach so langer Zeit nochmal drauf zurückkommst! Die Sache ist immer noch aktuell für mich. Deinen (gut nachvollziehbaren) Erklärungen zufolge scheint die Funktion richtig zu arbeiten - ich fasse nochmal zusammen: Sie wird nur aufgerufen, wenn ein Vorzeichen zu schreiben wäre und prüft, ob dies '0', also ein Auflösungzeichen wär. In diesem Fall orientiert sie sich an der von mir gegebenen Liste möglicher Vorzeichen und nimmt das jeweils dort von mir nicht angegebene Vorzeichen. In den mitgegebenen Beispielen arbeitet sie völlig korrekt.

Ich hab mich gefragt, was passiert, wenn zwischen Alteration und Auflösung eine lange Strecke liegt. Aber \accidentalStyle "modern" scheint genau richtig zu arbeiten - also, sich das Vorzeichen auch über Taktgrenzen zu merken, aber eben nicht unrealistisch lang.

Ich bin überzeugt, dass das gut funktionieren wird - am meisten fragwürdig ist dabei noch die von mir aufgestellte Liste möglicher Vorzeichen, aber wenn die sich im Einzelfall tatsächlich als falsch herausstellen sollte, könnte man sie ja noch konfigurierbar machen und als Argument mit übergeben. Das von dir schon erwähnte, zu eng an der Note klebende Vorzeichen wird sich ja vielleicht von selber entdramatisieren, da ich mit den dünnen Mensuralnoten schreibe.

Ich werde den Code in den nächsten Tagen ausprobieren - bin sehr gespannt!

Nachmal herzlichen Dank, und Gruß, : - )
--ingmar

fugenkomponist

  • Member
Re: re: Historische Notation: Auflösungzeichen ersetzen
« Antwort #3 am: Sonntag, 31. Januar 2016, 20:40 »
Ich hab mich gefragt, was passiert, wenn zwischen Alteration und Auflösung eine lange Strecke liegt. Aber \accidentalStyle "modern" scheint genau richtig zu arbeiten - also, sich das Vorzeichen auch über Taktgrenzen zu merken, aber eben nicht unrealistisch lang.
Genau genommen: noch für den nächsten Takt. Und im selben Takt auch in anderen Oktaven:\version "2.19.35"

music = \relative {
  cis'2 c'
  c, c' % kein Auflösungszeichen vorm hohen c
  cis1
  d
  c % kein Auflösungszeichen
}

{ \accidentalStyle "modern" \music }

% Zum Vergleich der Standard (\accidentalStyle "default"):
\music
Zitat
Ich bin überzeugt, dass das gut funktionieren wird - am meisten fragwürdig ist dabei noch die von mir aufgestellte Liste möglicher Vorzeichen, aber wenn die sich im Einzelfall tatsächlich als falsch herausstellen sollte, könnte man sie ja noch konfigurierbar machen und als Argument mit übergeben.
Das kann man tun. „(0 1 3 4)“ oben im Code steht für c, d, f und g, also die Töne mit Kreuzen. „(2 5 6)“ müsste man nicht so explizit angeben, sondern könnte auch einfach „else“ schreiben, es reicht also, nur die eine der beiden Listen zu übergeben.

ingmar

  • Member
re: Historische Notation: Auflösungzeichen ersetzen
« Antwort #4 am: Freitag, 26. Februar 2016, 16:53 »
hallo,

ich habs inzwischen mal ausprobieren können. Leider ist es so noch nicht brauchbar:
* Das Vorzeichen wird nicht als mensural, sondern modern gesetzt.
* Auch hier ist es viel zu nah an der Note dran.

Gruß,
--ingmar

Beispiel:
\version "2.18.2"
\language "english"

#(define (naturals-as-sharps-or-flats grob)
   (let* ((pitch (ly:event-property (event-cause grob) 'pitch))
          (alteration (ly:pitch-alteration pitch))
          (name (ly:pitch-notename pitch)))
     (if (equal? alteration 0)
         (case name
           ((0 1 3 4)
            (grob-interpret-markup grob #{ \markup \musicglyph #"accidentals.flat" #}))
           (else
            (grob-interpret-markup grob #{ \markup \musicglyph #"accidentals.sharp" #})))
         (ly:accidental-interface::print grob))))

\score {
\new MensuralStaff \with {
\override Accidental.stencil = #naturals-as-sharps-or-flats
  \override MultiMeasureRest.font-size = #-6
  \override NoteHead.font-size = #1
  \override Dots.font-size = #-6
} {
\clef "petrucci-g"
\key c \dorian
\relative c'' {
r2 c2.
   d4 ef2
e2 f2.
   g4 af1
}
}
}
« Letzte Änderung: Freitag, 26. Februar 2016, 17:34 von ingmar »

fugenkomponist

  • Member
Re: re: Historische Notation: Auflösungzeichen ersetzen
« Antwort #5 am: Freitag, 26. Februar 2016, 17:37 »
* Das Vorzeichen wird nicht als mensural, sondern modern gesetzt.
Das liegt daran, dass die hart codiert sind. Ersetze accidentals.flat und accidentals.sharp durch accidentals.mensuralM1 und accidentals.mensural1 (gefunden per Autovervollständigung in Frescobaldi bzw. in der Datei scm/output-lib.scm, Zeile 852 ff.).
Zitat
* Auch hier ist es viel zu nah an der Note dran.
Das erledigt sich dann von selbst.
Zitat
* Aus irgendeinem Grunde gibt es eine ewig lange Fehlermeldung, der Schlüssel sei unbekannt, was aber wohl nichts mit unserem Thema zu tun hat.
Genau genommen ist es nur eine Warnung. Ganz einfach: LilyPond kennt Petrucci-C- und -F-Schlüssel auf verschiedenen Notenlinien (z. B. petrucci-c2), aber nur einen Petrucci-G-Schlüssel, der dann auch nur petrucci-g heißt statt petrucci-g2 (was ja eigentlich konsequent wäre). Das wär mal ein sinnvoller feature request. petrucci-g kann man ja behalten, aber petrucci-g2 als Synonym einführen ;)

Ach ja, in deinem Beispiel verwendest du nicht \accidentalStyle modern, ist das Absicht?
« Letzte Änderung: Freitag, 26. Februar 2016, 17:39 von fugenkomponist »

ingmar

  • Member
re: Historische Notation: Auflösungzeichen ersetzen
« Antwort #6 am: Freitag, 26. Februar 2016, 18:02 »
Danke! Das hilft viel weiter!

Zitat
* Aus irgendeinem Grunde gibt es eine ewig lange Fehlermeldung, der Schlüssel sei unbekannt, was aber wohl nichts mit unserem Thema zu tun hat.
Offenbar während du darauf geantwortet hast, hatte ich den Fehler auch schon gefunden und diese Stelle aus meinem letzten Beitrag entfernt.

Zitat
Ach ja, in deinem Beispiel verwendest du nicht \accidentalStyle modern, ist das Absicht?

Nein, das passiert, wenn man Minimalbeispiele konstruiert...

Gruß,
--ingmar

ingmar

  • Member
...auch für General-Vorzeichen
« Antwort #7 am: Freitag, 26. Februar 2016, 19:43 »
Wir nähern uns! Aber auf einen Spezialfall bin ich noch gestoßen: Manchmal will man für ganze Formteile die generellen Vorzeichen ändern. Beispielsweise könnte innerhalb eines Satzes, der in g-dorisch steht, ein Abschnitt in C-Dur erscheinen. Der würde im Moment natürlich Auflösungszeichen kriegen, und weil die im Mensural-Font nicht enthalten sind, stören sie sehr. Auch hier würde ich stattdessen lieber Kreuze setzen. Beispiel unten.


Gruß,
--ingmar

\version "2.18.2"
\language "english"

\score {
\new MensuralStaff \with {
  \override MultiMeasureRest.font-size = #-6
  \override NoteHead.font-size = #1
} {
\relative c'' {
\key g \dorian
g2 a bf c
\key c \major
c2 bf a g1
}
}
}

fugenkomponist

  • Member
Re: Historische Notation: Auflösungzeichen ersetzen
« Antwort #8 am: Freitag, 26. Februar 2016, 21:05 »
Die Definition von MensuralStaff (in ly/engraver-init.ly) setzt
\override KeySignature.glyph-name-alist = #alteration-mensural-glyph-name-alist
\override Accidental.glyph-name-alist = #alteration-mensural-glyph-name-alist
Diese alist ist in scm/output-lib.scm definiert (oben schonmal zitiert). Die verwendet übrigens tatsächlich ein Auflösezeichen, nämlich accidentals.vaticana0.

Entweder ist es unüblich oder die LilyPond-Entwickler habens einfach vergessen, aber was hier noch fehlen würde, um dein Vorhaben umzusetzen, wär
\override KeyCancellation.glyph-name-alist = #alteration-mensural-glyph-name-alist
Edit: Grad aufgefallen: dann hat man natürlich doch Auflösungszeichen, keine Kreuze. Dafür bräuchts vermutlich ein bisschen mehr neue Trickserei, dafür bin ich aber grad zu müde. Jedenfalls ist so ein Auflösungszeichen doch im Font drin, bloß eben unter vaticana eingeordnet; was das heißt, weiß ich nicht.
« Letzte Änderung: Freitag, 26. Februar 2016, 21:07 von fugenkomponist »