Autor Thema: Bei \transpose Kreuze bevorzugen  (Gelesen 2247 mal)

l3u

  • Member
Bei \transpose Kreuze bevorzugen
« am: Samstag, 22. September 2012, 12:14 »
Wenn ich eine Stimme transponiere, dann mischt Lilypond teilweise Kreuze und b-Vorzeichen. Kann ich \transpose mitteilen, dass es z. B. Kreuze bevorzugen soll, bzw. die entsprechenden Noten enharmonisch verwechseln soll? Bzw. kann man evtl. hier eine Funktion definieren, die das tut, ähnlich der Funktion \naturalizeMusic aus dem Handbuch ( http://lilypond.org/doc/v2.14/Documentation/notation/changing-multiple-pitches.de.html )?

Beispiel:
\include "deutsch.ly"
beispiel = \relative c' { \key b \major des d e e }
{
\beispiel \break
\transpose b c' \beispiel \break
\transpose b f' \beispiel
}

Das zweite \transpose-Ergebnis ist okay (as, a, h, h). Beim ersten setzt \transpose aber es, e fis, fis, und da hätte ich gerne dis, d, fis, fis – oder eben es, d, ges, ges.

Die Quellnoten will ich nicht entsprechend verändern, da das ja nicht nur die transponierten Stimmen betreffen würde, die mir nicht gefallen, sondern auch die, die okay sind …

Vielen Dank schonmal für die Hilfe :-)

l3u

  • Member
Re: Bei \transpose Kreuze bevorzugen
« Antwort #1 am: Samstag, 22. September 2012, 16:10 »
Ohne genau zu wissen, was ich da tue, hab ich folgende zwei Funktionen geschrieben, die (erstaunlicherweise ;-) genau das machen, was ich wollte: entweder alles mittels Kreuzen oder alles mittels bs ausdrücken. Vielleicht hat ja jemand, der sich auskennt, Lust, da mal drüber zu schauen?

Hier \makeSharp:
#(define (makePitchSharp p) (let

(
(o (ly:pitch-octave p))
(a (* 4 (ly:pitch-alteration p)))
(n (ly:pitch-notename p))
)

(cond ( (< a -1)
(set! a (+ a 4))
(set! n (- n 1))
))

(if (< n 0) (begin (set! o (- o 1)) (set! n (+ n 7)) ))
(if (> n 6) (begin (set! o (+ o 1)) (set! n (- n 7)) ))

(ly:make-pitch o n (/ a 4))

))

#(define (makeMusicSharp music) (let

(
(es (ly:music-property music 'elements))
(e (ly:music-property music 'element))
(p (ly:music-property music 'pitch))
)

(if (pair? es)
(ly:music-set-property!
music 'elements
(map (lambda (x) (makeMusicSharp x)) es)
)
)

(if (ly:music? e)
(ly:music-set-property! music 'element (
makeMusicSharp e
))
)

(if (ly:pitch? p)
(begin
(set! p (makePitchSharp p))
(ly:music-set-property! music 'pitch p)
)
)

music

))

makeSharp = #(define-music-function (parser location m)
(ly:music?)
(makeMusicSharp m)
)
Und das selbe, nur mit bs, also \makeFlat:
#(define (makePitchFlat p) (let

(
(o (ly:pitch-octave p))
(a (* 4 (ly:pitch-alteration p)))
(n (ly:pitch-notename p))
)

(cond ( (> a 1)
(set! a (- a 4))
(set! n (+ n 1))
))

(if (< n 0) (begin (set! o (- o 1)) (set! n (+ n 7)) ))
(if (> n 6) (begin (set! o (+ o 1)) (set! n (- n 7)) ))

(ly:make-pitch o n (/ a 4))

))

#(define (makeMusicFlat music) (let

(
(es (ly:music-property music 'elements))
(e (ly:music-property music 'element))
(p (ly:music-property music 'pitch))
)

(if (pair? es)
(ly:music-set-property!
music 'elements
(map (lambda (x) (makeMusicFlat x)) es)
)
)

(if (ly:music? e)
(ly:music-set-property! music 'element (
makeMusicFlat e
))
)

(if (ly:pitch? p)
(begin
(set! p (makePitchFlat p))
(ly:music-set-property! music 'pitch p)
)
)

music

))

makeFlat = #(define-music-function (parser location m)
(ly:music?)
(makeMusicFlat m)
)

harm6

  • Member
Re: Bei \transpose Kreuze bevorzugen
« Antwort #2 am: Samstag, 22. September 2012, 17:33 »
Hallo,

ich denke Dein Vorhaben ist nicht sinnvoll:

In Deinem Beispiel:
   beispiel = \relative c' { \key b \major des d e e }
gibst Du eine Tonart an. Also bewegen wir uns in Dur-moll-tonaler Music.

Der Reihe nach schreibst Du (immer in Bezug zum Tonika-Grundton):
    kleine Terz (moll-Terz)
    große Terz (Dur-Terz)
    übermäßige Quarte
    übermäßige Quarte
LilyPond transponiert das absolut einwandfrei!!

Wenn Du jetzt immer den enharmonisch verwechselbaren Ton bevorzugst, so resultiert das in befremdliche Notationen, sobald Mehrstimmigkeit zum tragen kommt (eigentlich auch schon in der Einstimmigkeit, aber mehrstimmig ist es noch deutlicher)

Ich habe \naturalizeMusic zu \flatToSharpMusic verändert, indem ich ein paar wenige Zeilen angepaßt habe:

#(define (flat->sharp-pitch p)
   (let ((o (ly:pitch-octave p))
         (a (* 4 (ly:pitch-alteration p)))
         ;; alteration, a, in quarter tone steps,
         ;; for historical reasons
         (n (ly:pitch-notename p)))
  (newline)(display "alteration ")(display a)
  (newline)(display "notenam    ")(display n)
     (cond
      ((and (> a 1) (or (eq? n 6) (eq? n 2)))
       (set! a (- a 2))
       (set! n (+ n 1)))
      ;;((and (< a -1) (or (eq? n 0) (eq? n 3)))
      ((< a -1)
       (set! a (+ a 4))
       (set! n (- n 1))))
     (cond
      ((> a 2) (set! a (- a 4)) (set! n (+ n 1)))
      ((< a -2) (set! a (+ a 4)) (set! n (- n 1))))
     (if (< n 0) (begin (set! o (- o 1)) (set! n (+ n 7))))
     (if (> n 6) (begin (set! o (+ o 1)) (set! n (- n 7))))
     (ly:make-pitch o n (/ a 4))))

#(define (flat->sharp music)
   (let ((es (ly:music-property music 'elements))
         (e (ly:music-property music 'element))
         (p (ly:music-property music 'pitch)))
     (if (pair? es)
         (ly:music-set-property!
          music 'elements
          (map (lambda (x) (flat->sharp x)) es)))
     (if (ly:music? e)
         (ly:music-set-property!
          music 'element
          (flat->sharp e)))
     (if (ly:pitch? p)
         (begin
           (set! p (flat->sharp-pitch p))
           (ly:music-set-property! music 'pitch p)))
     music))

flatToSharpMusic =
#(define-music-function (parser location m)
   (ly:music?)
   (flat->sharp m))
   
%---- TEST-1 ----

#(define-markup-command (smallItalic layout props arg) (markup?)
  (interpret-markup layout props
   `(,fontsize-markup -2 (,italic-markup ,arg))))


\layout {
        indent = 0
        \context {
          \Score
          \override TimeSignature #'stencil = ##f
          \override RehearsalMark #'self-alignment-X = #LEFT
        }
}

beispiel = \relative c' {
        \key bes \major
        des4 d e e
        f! fes fisis feses
        <bes des f>1^"minor-tonic!"
}

\markup \fill-line { \fontsize #4 \bold "testing \"beispiel\" (extended)" }

\new Staff {
        \mark \markup "original"
        \beispiel
        \break
        \mark \markup { \smallItalic "\\transpose bes c'" and \smallItalic "\\flatToSharpMusic" }
        \flatToSharpMusic \transpose bes c' \beispiel
        \break
        \mark \markup { \smallItalic "\\transpose bes f'" without \smallItalic "\\flatToSharpMusic" }
        \transpose bes f' \beispiel
}

%---- TEST-2 ----

musicII = \relative c' {
        \key c\major
        c'4 b bes a aes g ges f e ees d des c2 <b d f as>^\markup { "VII"\super dim7 }
}

\markup \fill-line { \fontsize #4 \bold "testing chromatic-scale down" }

\new Staff {
        \mark \markup "original"
        \musicII
        \break
        \mark \markup { \smallItalic "\\transpose c d" without \smallItalic "\\flatToSharpMusic"  }
        \transpose c d \musicII
        \break
        \mark \markup { \smallItalic "\\transpose c d" and \smallItalic "\\flatToSharpMusic" }
        \flatToSharpMusic \transpose c d \musicII
        \break
        \mark \markup { \smallItalic "\\transpose c ees" without \smallItalic "\\flatToSharpMusic" }
        \transpose c ees \musicII
        \break
        \mark \markup { \smallItalic "\\transpose c ees" and \smallItalic "\\flatToSharpMusic" }
        \flatToSharpMusic \transpose c ees \musicII
}

%---- TEST-3 ----

musicI = \relative c' {
        \key c\major
        c4 cis d dis e f fis g gis a ais b c2 <b d f as>^\markup { "VII"\super dim7 }
}

\markup \fill-line { \fontsize #4 \bold "testing chromatic-scale up" }

\new Staff {
        \mark \markup "original"
        \musicI
        \break
        \mark \markup { \smallItalic "\\transpose c d" and \smallItalic "\\flatToSharpMusic" }
        \flatToSharpMusic \transpose c d \musicI
        \break
        \mark \markup { \smallItalic "\\transpose c ees" and \smallItalic "\\flatToSharpMusic" }
        \flatToSharpMusic \transpose c ees \musicI
}

Das angehängte png zeigt insbesonders bei den Akkorden, aber auch wenn die Tonart Es-Dur werden soll, einen output den ich fürchterlich finde.

Zitat
Ohne genau zu wissen, was ich da tue, hab ich folgende zwei Funktionen geschrieben, die (erstaunlicherweise ;-) genau das machen, was ich wollte: entweder alles mittels Kreuzen oder alles mittels bs ausdrücken. Vielleicht hat ja jemand, der sich auskennt, Lust, da mal drüber zu schauen?

Deinen zweiten post zum Thema habe ich erst gelesen, nachdem mein Beitrag soweit fast fertig war.
Bei (flüchtiger) Durchsicht scheinst Du genau dasselbe gemacht zu haben wie ich oben. Allerdings hast Du den Code auf das wesentliche zusammengestrichen.
Das hatte ich mir geschenkt - habe ich schon gesagt, daß ich von dem ganzen Vorhaben nichts halte? ;)
Insoweit habe ich weder Deinen noch meinen Code auf mögliche Schwachstellen abgeklopft.

Zwei grundsätzliche Sachen:
(1)
Dein ursprüngliches, unverändertes Code-Beispiel gibt einen nicht korrekten output, da der context zu Anfang noch nicht etabliert ist.
Setze \new Staff davor.
(2)
Dein scheme-code ist unothodox was indentation, etc angeht.
Das macht das Verständnis schwerer oder zumindest zeitraubender.
Irgendwo habe ich schon mal ein Kompendium über scheme-schreib-Stil gesehen, finde es im Moment aber nicht. Ich empfehle Dir jedoch mal nach sowas zu suchen oder Deinen Stil dem aus den .scm-files vertrauten anzupassen.
Wobei man ehrlicherweise sagen muß, daß sich dort auch nicht immer an Konventionen gehalten wurde.


Viele Grüße,
  Harm

l3u

  • Member
Re: Bei \transpose Kreuze bevorzugen
« Antwort #3 am: Sonntag, 23. September 2012, 15:26 »
Scheme habe ich noch nie programmiert … die Einrückungen und Klammern habe ich nur so gesetzt, um zu verstehen, was da wohin gehört bzw. was wo anfängt und aufhört. Auf den ersten Blick kommt mir die Sprache sehr unübersichtlich vor, aber egal :-) Das, was ich da geschrieben habe, entspricht sicherlich nicht den gängigen Coding-Standards.

Danke für den Hinweis und das ausführliche Beispiel mit den Akkorden! Daran hatte ich gar nicht gedacht!

In diesem speziellen Fall ging es mir aber allein um einen transponierten Stimmauszug. Beispielsweise liefert das normale \transpose einen Lauf „es – e – es – e“, also erst ein b, dann ein Auflösungszeichen usw. – und da ist (zumindest für einen Saxophonisten) „dis – e – dis – e“ deutlich gefälliger zu lesen und zu spielen. Kleinigkeiten also. In einer Partitur bzw. Zusammenfassung soll das gar nicht auftauchen.

prott

  • Member
Re: Bei \transpose Kreuze bevorzugen
« Antwort #4 am: Freitag, 28. September 2012, 12:20 »
Es gibt durchaus einen Fall, in dem es sinnvoll ist, automatische Vorzeichen zu ändern: Wenn der Komponist einmal durch den ganzen Quintenzirkel läuft. Dann kann man sinnvoll bei der Transposition Kreuze durch Be ersetzen und entsprechend doppelte Vorzeichen durch benachbarte Töne. Da ich aber vorerst nicht glaube, daß Lilypond harmonische Analysen korrekt vornimmt, sollte man das von Hand korrigieren.
Ansonsten teile ich die Meinung von Harm bei tonaler Musik.
Für einen Fan von reiner Stimmung wie mich sind as und gis auch tatsächlich zwei verschiedene Töne - as ist, grob gesehen, ein drittel Halbton höher.