Partielles transponieren einer Stimme

Begonnen von Köbi, Samstag, 29. Juli 2017, 12:50

« vorheriges - nächstes »

Köbi

...und schon komme ich mit der nächsten Frage: Ich möchte von einem Stück verschiedene Ausgaben machen. Z.B. eine in C-Dur und eine in F-Dur. In F-Dur gibt es dann aber einige Stellen, die ich oktavieren müsste, weil sie sonst zu hoch oder zu tief sind. Mit Tags geht das zwar, ist aber sehr umständlich.


\version "2.19.64"

v = \relative { \key c \major c' d e f g a
  \tag #'original \relative { b' c b  }
  \tag #'octaveLower \relative { b c b  }
  a g f e d c2
}

\score {
  \keepWithTag #'original \v
}

\score {
  \transpose f c' \keepWithTag #'octaveLower \v
}


Gibt es eine bessere Lösung?

ingmar

#1
Hallo Köbi,

Hier im alten Forum hatte ich beschrieben, wie man eine Einzelstimme aus Bruchstücken anderer Stimmen zusammenbaut. Natürlich nimmst du dieselbe Ausgangsstimme, fügst aber \transpose ein wo nötig. Oder du machst dir eine transponierte Kopie der Ausgangsstimme und wechselst zwischen beiden ab. Damit müsste es klappen. Wenn nicht, melde dich.

--ingmar


Köbi

Ich habe mal versucht, die Idee von ingmar umzusetzen, aber ich schaffe es nicht :-(


w = \relative { \key c \major
  c'4 d e f g a
  \quoteDuring #"o" { b c b  }
  a g f e d c2
}

\addQuote "o" { \transpose c' c \w }

\score {
  \w
}


Wie stelle ich es an, dass jeweils nur eine Stimme erscheint?

Wie sieht es mit folgende Idee aus:


\version "2.19.64"

\relative { \key c \major
  c'4 d e f g a
  \transpose c c %{ Die beiden c sollten Variablen sein. %} \relative { b' c b  }
  a g f e d c2
}


Wenn ich die beiden "c" beim transpose als Variablen hin kriege, würde es gehen. oder das transpose in eine Funktion und diese dann mit den Variablen als Parameter aufrufen.

trulli

Zitat von: Köbi am Sonntag, 30. Juli 2017, 01:22
Wie stelle ich es an, dass jeweils nur eine Stimme erscheint?
Wie sieht es mit folgende Idee aus:

Hallo,

ja, das kannst du mit \transpose so machen. Natürlich kannst du das unten auch in den \Score Block schreiben. Je nachdem, was besser ist. Verschiedene Stimmen kannst du einfach benennen (habe mal \TeilA und \TeilB genommen) und im \Score Block einfach mit % auskommentieren.

\version "2.19.0"

TeilA = \relative { \key c \major
  c'4 d e f g a
  \transpose c c %{ Die beiden c sollten Variablen sein. %} \relative { b' c b  }
  a g f e d c2
}

TeilB = \relative { b'4 c b b  }


\score {
  <<
    \TeilA
    \transpose c d
    \TeilB 
  >>
}


Grüße

Köbi

Danke trulli, aber damit kann ich leider mein Problem auch nicht lösen. Ich möchte an globaler Stelle, dort wo ich mein book habe, angeben können, ob bestimmte Stellen transponiert werden sollen oder nicht. An der Stimme selbst möchte ich nichts ändern müssen. Wenn ich zwei book's habe, soll z.B. das eine die Stellen transponiert haben und das andere nicht. Und beide book's sollen zusammen erstellt werden können.

Das Mittel der Wahl wäre, wenn man die transpose-function mit Variablen als Parametern aufrufen könnte (siehe auch http://lilypond.1069038.n5.nabble.com/using-quot-transpose-quot-with-variables-td23861.html). Aber das scheint nicht zu gehen ("Unfortunately, the parser of LilyPond is hard-coded to only accept an explicit pitch name."). Mit "(ly:music-transpose <music expression> <pitch>)" (http://lilypond.1069038.n5.nabble.com/scheme-function-for-transposition-td47453.html) ist es möglich, eine eigene function dafür zu schreiben. Das Beispiel funktioniert bei mir leider nicht, es scheint mir einer ältern Version von Lilypond erstellt worden zu sein.


firstNotes = \relative c' { c4 d e f }

first = #(define-music-function (parser location root trans)(ly:music?
ly:music?)
(let* (
    (trans-note (car (ly:music-property trans 'elements)))
    (trans-pitch (ly:music-property trans-note 'pitch))
    (root-note (car (ly:music-property root 'elements)))
    (root-pitch (ly:music-property root-note 'pitch))
    (delta-pitch (ly:pitch-diff trans-pitch root-pitch)))
(ly:music-transpose (ly:music-deep-copy firstNotes) delta-pitch)
))

\score {<<
\new Staff  \firstNotes
  \new Staff  \first c d
  \new Staff  \first d fis
  \new Staff  \first e a
  >>
}


Kann mir da jemand helfen, das zum Laufen zu bringen? Wäre super :-)

harm6

#6
Entgeht mir hier was?

Das von mir verlinkte LSR-snippet ist doch ausdrücklich für diesen Fall gemacht (teilweises transponieren einer Stimme, die partiell bei gegebener Transponierung für das jeweilge Instrument nicht erreichbar ist)!

Ansonsten versteh ich die Diskussion ebenfalls nicht. Hat niemand folgendes versucht:

\version "2.19.64"

from = c
to = cis

\relative { \key c \major
  c'4 d e f g a
  \transpose \from \to %{ Die beiden c sollten Variablen sein. %} \relative { b' c b  }
  a g f e d c2
}

%% or

fromTo =
#(define-music-function (from to mus)(ly:pitch? ly:pitch? ly:music?)
#{
  \transpose $from $to $mus
#})


m =
\fromTo c cis \relative { b'4 c b  }

\relative { \key c \major
  c'4 d e f g a
  \m
  a g f e d c2
}

??

EDIT zusätzliches Code-Beispiel
Oder auch:

\version "2.19.64"

from = c
to = cis

from-to = \transpose \from \to \etc

\relative { \key c \major
  c'4 d e f g a
  \from-to \relative { b' c b  }
  a g f e d c2
}

EDIT-ENDE


Ich seh das Problem nicht!

-Harm

Köbi

Hallo harm6, nein, dir entgeht nicht grundsätzlich etwas, sorry. Unter dem Link, den du mir angegeben hast, habe ich schon gesehen, dass man grundsätzlich transponieren kann. Aber mir war es nicht möglich, dass auf meinen Fall zu übertragen, weil ich ja explizit in meiner Stimme angeben möchte, was oktaviert wird.

Dein letzter Post ist genau das, was ich suche, Danke! Dass ich \from und \to einfach so setzen und brauchen kann, war mir nicht bewusst. Vermutlich habe ich nicht die richtige Sytnax erwischt. Sei's drum, ich kann kann weiter arbeiten :-)

ingmar

Hallo,


Harms Methode kannte ich noch nicht. Offenbar wird in der ersten Lösung einfach alles, was aus einem bestimmten Bereich herausfällt, oktaviert / gefärbt / in Klammern gesetzt. Das wird sicher funktionieren, aber für musikalisch überzeugende Ergebnisse will man doch wohl meistens nicht einzelne Töne, sondern ganze Phrasen oktavieren - also immer auch mal Bereiche, die man auch in der originalen Oktav spielen könnte! Das geht mit Harms zweiter Lösung, wo man die zu oktavierenden Stellen entsprechend markiert.

Wie meine Lösung gemeint war: Ich hatte vorgeschlagen, zwei "Ströme" anzulegen und aus denen nach Bedarf abwechselnd zu "zitieren". Hier ein Beispiel:

\version "2.19.37"

w = \relative { \key c \major
  c'4 d e f
  g a b c
  b a g f
  e d c2
}

\addQuote "orig" {\w }
\addQuote "8va" { \transpose c' c \w }
% Nun haben wir jede Versionen in einem zitierbaren "Feed"

result = {
% Wir basteln uns zusammen, was wir benötigen:
\quoteDuring #"orig" { s1 }    % Original für einen Takt.
\quoteDuring #"8va" { s2. }    % Oktavierung für drei Viertel.
\quoteDuring #"orig" { s4 s2 } % Original für drei Viertel.
\quoteDuring #"8va" { s2 s1 } % Oktavierung für den Rest.
}

\score {
\result
}


Auf diese Art kannst du ein Book mit \result bauen (das enthält die Oktavierungen) und ein zweites mit \w (dem Original).

Unbequem ist hier, dass man die Längen der jeweiligen Strecken auszählen muss, statt den Oktavierungswunsch an den entsprechenden Stellen einfach in den Notentext eintragen zu können. Wenn keine Taktwechsel vorkommen, kann man aber auch, statt die Stellen per {..} {..} aneinanderzuhängen, jeweils von vorne zählen: << {..} {..} >>.


Gruß,
--ingmar

Köbi

Hallo ingmar, jetzt hab ich's auch begriffen. Stimmt, so würde es auch gehen. Aber die Lösung von harm6 ist eleganter, weil sie die globale Steuerung, so wie ich sie möchte, erlaubt. Danke einewäg.

ingmar

Ja, sag ich ja auch, Harms Lösung ist eleganter. Ich würd sie ungefähr folgendermaßen einsetzen:

(1.) Ein File mit dem Notentext; nennen wir es MeinStück_text.ly:

\version "2.19.37"
music = \relative {
c'4 d e f g a
\oct { b c b }
a g f e d c2
}


(2.) Dort, wo wir die Partitur definieren, binden wir dieses File ein:

% Diese Partitur oktaviert die mit \oct { ... } gekennzeichneten Bereiche:
oct = \transpose c c, \relative \etc
\include " MeinStück_text.ly"

\score
\new Voice {
\key c \major
\music
}
}


(3) .. und für Standardpartituren, die nicht oktavieren sollen, definierst du einfach um und bindest wieder dein File ein:

% Diese Partitur ignoriert die Oktavierung der mit \oct { ... } gekennzeichneten Bereiche:
oct = { } 
\include " MeinStück_text.ly"

\score
\new Voice {
\key c \major
\music
}
}



Gruß,
--ingmar

Köbi


trulli

Hey harm,

geile Idee mit \from \to!  :)

Trulli

Arnold

Hallo,

ich benutze für solche Fälle immer mein \transposeWithTag, habe es aber noch nie in Kombination mit \relative ausprobiert!

Meine Include-Library-Datei »tagged-transpose.ly«:
%{
tagged-transpose.ly
%}
\version "2.16.0"

#(define (check-and-transpose-with-tag delta tags e)
  (let ((eventtype (ly:music-property e 'name)))
   (if (eq? eventtype 'SequentialMusic)
    (let*
     ((music-tags (ly:music-property e 'tags))
      (act (and (not (null? music-tags))
            (if (symbol? tags)
             (memq tags music-tags)
             (any (lambda (t) (memq t music-tags)) tags)))))
     (if act
      (let*
       ((old-elems (ly:music-property e 'elements))
        (transposed-elem (ly:music-transpose
          (make-music 'SequentialMusic 'elements old-elems) delta)))
       ; (for-each display (list "\nTransposed all elements of a " eventtype " by " delta "...\n"))
       (ly:music-set-property! e 'elements (list transposed-elem)))))
    (if (eq? eventtype 'SimultaneousMusic)
     (let*
      ((music-tags (ly:music-property e 'tags))
       (act (and (not (null? music-tags))
             (if (symbol? tags)
              (memq tags music-tags)
              (any (lambda (t) (memq t music-tags)) tags)))))
      (if act
       (let*
        ((old-elems (ly:music-property e 'elements))
         (new-elems (map (lambda (m)
            (make-music 'TransposedMusic 'element
            (ly:music-transpose m delta))  )
             old-elems)))
        ; (for-each display (list "\nTransposed all elements of a " eventtype " by " delta "...\n"))
        (ly:music-set-property! e 'elements new-elems)))))))
  e)

transposeWithTag =
#(define-music-function
  (parser location from-pitch to-pitch tags mus)
  (ly:pitch? ly:pitch? symbol-list-or-symbol? ly:music?)
  (music-map (lambda (x) (check-and-transpose-with-tag
     (ly:pitch-diff to-pitch from-pitch) tags x))
   mus))


P.S. "alte" music-function-Syntax mit "parser location" in diesem Beispiel!

Die (eventuell) zu transponierenden Abschnitte müssen in einer »Sequentiellen Musik«, ergo »in geschweiften Klammern« gesetzt und mit einem Tag versehen sein.
Diese Tag-Bereiche nicht ineinander schachteln, sonst werden »doppelt umschlossene Noten« auch zweimal transponiert.

\include "tagged-transpose.ly"
music = {
  \relative c' { c4 d e f g a }
  \tag #'oct { \relative b' { b c b }}
  \relative a' { a g f e d c2 }
}

{ \music }

{ \transposeWithTag c' c #'oct \music }



Arnold

Köbi

Ich habe versucht, die Lösung von Ingmar umzusetzen, leider klappt es nicht. Ich glaube, ich habe \relative noch nicht richtig verstanden.


\version "2.19.64"

partA = { b c d c }

\relative {
  \key c \major
  g'' g g g
  \partA
  g g g g
  \transpose c c \partA
}


Warum sind Takt 2 und 4 nicht gleich' Wie muss partA lauten, damit Takt 2 und 4 gleich sind?