Autor Thema: Mehrere Stimmen gleichzeitig zitieren?  (Gelesen 4314 mal)

spinne

  • Member
Mehrere Stimmen gleichzeitig zitieren?
« am: Sonntag, 14. Oktober 2012, 15:14 »
Hallo,

ist es möglich mehrere Stimmen gleichzeitig zu zitieren? Wenn ja, wie?
(GNU LilyPond 2.12.3)

Beispiel:
Flöte hat c notiert, Klarinette hat zur selben Zeit h notiert. Also klingend c (Flöte) und a (Klar).
Im Altsax möchte ich nun ein Zitat einfügen in dem beide Stimmen für die Dauer des Zitates kombiniert werden, d. h. im Altsax soll ein Akkord erscheinen mit a und fis (= klingend c und a).

Ist das überhaupt, und wenn ja, wie möglich?

Nein, ich kann keinen Code posten der fehlerhaft ist weil es keinen fehlerhaften, relevanten Code gibt:-)

Gruss

Holger

Be-3

  • Member
Re: Mehrere Stimmen gleichzeitig zitieren?
« Antwort #1 am: Sonntag, 14. Oktober 2012, 15:35 »
Nein, ich kann keinen Code posten der fehlerhaft ist weil es keinen fehlerhaften, relevanten Code gibt:-)

Ist ja gut, Holger,

ich habe verstanden, daß Dir ein Stichwort genügt... :)
Was spricht eigentlich dagegen, mit \addQuote schlicht und ergreifend statt nur einer Stimme alle beiden Stimmen Klarinette und Flöte zu definieren, das ganze "clafl" zu nennen und zu zitieren?

Viele Grüße
Torsten

spinne

  • Member
Re: Mehrere Stimmen gleichzeitig zitieren?
« Antwort #2 am: Sonntag, 14. Oktober 2012, 16:39 »

ich habe verstanden, daß Dir ein Stichwort genügt... :)
Was spricht eigentlich dagegen, mit \addQuote schlicht und ergreifend statt nur einer Stimme alle beiden Stimmen Klarinette und Flöte zu definieren, das ganze "clafl" zu nennen und zu zitieren?

Viele Grüße
Torsten

Aha... :-)
Also:
\addQuote "clafl" { \flute \clarinet }
dachte ich mir... anscheinend falsch gedacht und auch in der Doku nichts dazu gefunden oder an der falschen Stelle gesucht.
Weiteres Problem: Wo definiere ich das, falls / wenn es dann geht?
Dateistruktur sieht so aus:
Header.ly (globale Sachen und Makros)
part_flute.ly (Flötenstimme)
part_clarinet.ly (Klarinettenstimme)
Score.ly (Partitur, für das Promlem hier eigentlich nicht relevant)

Die Stimmen sehen in etwa so aus:
\include "Header.ly"
Flute = {
\global
\set Staff.instrumentName = #"Flute I (C)"
\set Staff.shortInstrumentName = #"Fl. I"
\override Hairpin #'minimum-length = #7
\clef treble
<<
\transpose c' c' \relative c' {
\transposition c
% ab jetzt viel Musik :-)
}
>>
}
\addQuote "Flute" { \Flute }

Analog alle anderen Stimmen ( bei dem Projekt ca 40 :-) )

Im Altsax steht natürlich noch ein \include "part_flute.ly"

Bin noch ratlos:-)
Noch mehr Tips oder Beispiele?

Gruss
Holger

harm6

  • Member
Re: Mehrere Stimmen gleichzeitig zitieren?
« Antwort #3 am: Sonntag, 14. Oktober 2012, 18:23 »
Hallo Holger,

Zitat von: spinne
\addQuote "clafl" { \flute \clarinet }

schreibt beide Stimmen hintereinander.

Was Du hier haben willst ist:

\addQuote "clafl" { <<\flute \clarinet>> }

Ich habe auch mal, ausgehend von \transposedCueDuring, \transposedSeveralCueDuring geschrieben um mehrere Stimmen zitieren zu können.
Es funktioniert allerdings erst ab 2.16.
Und ich habe es noch nicht geschafft die Stimmen einzeln transponierbar zu machen.

\version "2.16.0"
#(define-public (string-list? x)
  (and (list? x) (every string? x)))

#(define-public (string-or-string-list? x)
(or (string? x) (string-list? x)))

transposedSeveralCueDuring =
#(define-music-function (parser location what dir pitch main-music)
        (string-or-string-list? ly:dir? ly:pitch? ly:music?)
  (let ((new-what (if (string? what)
           (list what)
           what)))
  (make-simultaneous-music
    (map
      (lambda (x)
        (make-music 'QuoteMusic
             'element main-music
             'quoted-context-type 'Voice
             'quoted-context-id "cue"
             'quoted-music-name x
             'quoted-voice-direction dir
             'quoted-transposition pitch))
             new-what))))

Flute = {
        \transpose c' c'
        \relative c' {
        e1
        e'2 f
        }
}        
ClarinetI = {
        \transpose c' c'
        \relative c' {
        \transposition bes
        c1
        c'2 d
        }
}

Vla = \relative c'' {
        \clef alto
        g1
        g4 c b g
}

\addQuote "ClarinetI" { \ClarinetI }
\addQuote "Flute" { \transposition bes \Flute }
\addQuote "Vla" { \transposition bes \Vla }


Tenorhorn = {
        \transpose c' c'
        \relative c' {
        \transposition bes
        c1
        \transposedSeveralCueDuring #'("ClarinetI" "Flute" "Vla") #UP d' { R1 }
        c1
        }
}

\new Staff \Tenorhorn

Gruß,
  Harm

P.S.:
Zitat von: Be-3
ich habe verstanden, daß Dir ein Stichwort genügt...
Ja, aber anderen, weniger erfahrenen Lesern dieses Threads vielleicht nicht.

Be-3

  • Member
Re: Mehrere Stimmen gleichzeitig zitieren?
« Antwort #4 am: Sonntag, 14. Oktober 2012, 19:07 »
Hallo zusamen,


Zitat von: Be-3
ich habe verstanden, daß Dir ein Stichwort genügt...
Ja, aber anderen, weniger erfahrenen Lesern dieses Threads vielleicht nicht.
+1
(a) Außerdem sind nachvollziehbare Beispiele auch sehr nützlich für andere Mitlesende, dann können die auch ihren Nutzen draus ziehen.
(b) früher oder später (sieht man ja hier deutlich) hat sogar Holger ein paar Zeilen Coding offenbart. Zwar nicht kompilierbar, aber immerhin :D

So ein Fall wird schnell unübersichtilch (mich z. B. verwirren die kreuz und quer transponierenden Instrumente und ich muß immer aufpassen, wenn wie in diesem Fall Klarinette in B und Flöte in C in einer Saxophonstimme in Es zitiert werden sollen.

@Holger: Hast Du die Stimmen klingend oder transponiert eingegeben? Wo stehen die \transpose- und \transposition-Befehle? Bei all diesen Fragen hülfe ein kleines kompilierbares Beispiel...

Ich habe auch mal, ausgehend von \transposedCueDuring, \transposedSeveralCueDuring geschrieben um mehrere Stimmen zitieren zu können.
Es funktioniert allerdings erst ab 2.16.
Und ich habe es noch nicht geschafft die Stimmen einzeln transponierbar zu machen.

@Harm:
könnte man nicht eine alist von pairs übergeben, in etwa:
\transposedSeveralCueDuring #'(("ClarinetI" . d' ) ("Flute" . c' )) #UP { R1 }
Dann hätte man jedes Zitat mitsamt der zugehörigen Transponierung gleichzeitig am Wickel...

Viele Grüße
Torsten

harm6

  • Member
Re: Mehrere Stimmen gleichzeitig zitieren?
« Antwort #5 am: Sonntag, 14. Oktober 2012, 20:18 »
Hallo Torsten,

[...]
@Harm:
könnte man nicht eine alist von pairs übergeben, in etwa:
\transposedSeveralCueDuring #'(("ClarinetI" . d' ) ("Flute" . c' )) #UP { R1 }
Dann hätte man jedes Zitat mitsamt der zugehörigen Transponierung gleichzeitig am Wickel...
[...]

Würde ich gerne (oder auch indem ich die pitches in eine separate Liste packe), aber ich verstehe im Moment nicht wie ich aus dem ausgelesenen value einen pitch mache:

   #(define lst '(("ClarinetI" . d' ) ("Flute" . c' )))
   %% #(write (cdar lst))
   #(write (ly:pitch? (cdar lst)))

gibt
   #f
aus.

Mit
   #(define lst '(("ClarinetI" . #{ d' #}) ("Flute" . #{ c' #})))
ist es genau so.

Natürlich gibt es
   ly:make-pitch
aber es verlangt drei Argumente. Im Moment weiß ich noch nicht, wie ich das handhaben soll.


Hast Du eine Anregung?


Gruß,
  Harm

Be-3

  • Member
Re: Mehrere Stimmen gleichzeitig zitieren?
« Antwort #6 am: Montag, 15. Oktober 2012, 22:20 »
Natürlich gibt es
   ly:make-pitch
aber es verlangt drei Argumente. Im Moment weiß ich noch nicht, wie ich das handhaben soll.


Hast Du eine Anregung?

Hallo Harm,

das ist tatsächlich ein harter Brocken, damit hatte ich nicht gerechnet...
Irgendwie scheint es keine fertige Funktion zu geben, die aus einem Symbol bzw. einem String einen echten pitch-Wert erzeugt (zumindest habe ich keine gefunden).
Eine Bestätigung hierfür wäre, daß eigentlich immer im Scheme-Code, wo ein pitch-Wert benötigt wird, die Funktion ly:make-pitch mit ihren drei Argumenten Oktavnummer, Notennummer und Alteration benutzt wird.

Ich habe mal Dein Scheme-Beispielcoding Zeile für Zeile ausgebaut und hierbei folgenden Weg beschritten:
  • Lesen des alist-Elements (wie bei Dir schon) - Typ: Symbol
  • Umwandlung in einen String
  • Apostrophe bzw. Kommata "abstrippen"
  • mit dem "reinen" Notennamen (z. B. c, d, dis, bes usw.) in der alist 'pitchnames die entsprechenden Notennummern und Alterations lesen. Teilerfolg: dann hat es schon den gewünschten Typ "pitch", aber die Oktave stimmt noch nicht unbedingt
  • aus dem "Oktavstring" (der kann leer sein oder entweder aus einer Anzahl Apostrophen oder Punkten bestehen) berechne ich die Oktavnummer, indem ich ihre Anzahl (d. h. die Länge des Strings) bestimme. Kommata werden negativ gerechnet, am Ende wird 1 abgezogen
  • Schließlich kann man mit ly:make-pitch aus den drei so gewonnenen Werten einen echten pitch-Wert erzeugen.

Dieser Ergebniswert überlebt sogar die ly:pitch?-Prüfung.

Ist wahnsinnig unelegant und umständlich, aber so funktioniert's wenigstens.
Daraus ließe sich dann eine schöne Funktion bauen.

\version "2.16.0"


#(define lst '(("ClarinetI" . d' ) ("Flute" . c' )))

#(define notename (symbol->string (cdar lst)))
#(newline) #(display "Umwandlung in String: ") #(write notename)

#(define name
     (cond
       ((string-contains notename "'") (car (string-split notename #\' )))
       ((string-contains notename ",") (car (string-split notename #\, )))
       (else notename)))
#(define namelength (string-length name))
#(define octavestr (substring notename namelength))

% Oktavennummer aus der Anzahl der Apostrophe oder Kommata bestimmen:
#(define octave (- (* (string-length octavestr) (if (string-contains octavestr ",") -1 1)) 1))

#(newline) #(display "Notenname: ") #(write name)
#(display " / Oktavstring: ") #(write octavestr)
#(display " / Oktavennummer: ") #(write octave)

% Notennummer und Alteration aus pitchnames-Tabelle lesen
#(define pitch (cdr (assoc (string->symbol name) pitchnames)))
#(newline) #(display "Pitch (noch ohne Oktave) aus pitchnames-Tabelle: ") #(write pitch)

% Endgültigen Pitch-Wert aus Oktavnummer, Notennummer und Alteration bauen:
#(define pitch (ly:make-pitch octave (ly:pitch-notename pitch) (ly:pitch-alteration pitch)))
#(newline) #(display "Ergebnis: ") #(write pitch)
#(display "   Prüfung: wirklich pitch? ") #(write (ly:pitch? pitch))

Viele Grüße
Torsten

harm6

  • Member
Re: Mehrere Stimmen gleichzeitig zitieren?
« Antwort #7 am: Samstag, 20. Oktober 2012, 17:21 »
Hallo Torsten,

vielen Dank für Deine Arbeit.
Ich hatte befürchtet, daß es auf sowas hinauslaufen würde.

Statt eine alist anzulegen und auszuwerten, habe ich dann einen anderen Weg eingeschlagen und zwei getrennte Listen benutzt.

\version "2.16.0"

#(define (string-list? x)
  (and (list? x) (every string? x)))

#(define (string-or-string-list? x)
  (or (string? x) (string-list? x)))
 
#(define (pitch-or-music? x)
  (or (ly:pitch? x) (ly:music? x)))

transposedSeveralCueDuring =
#(define-music-function (parser location what transpose dir main-music)
        (string-or-string-list? pitch-or-music? ly:dir?  ly:music?)
  (let* ((new-what (if (string? what)
           (list what)
           what))
         (pitch-list (if (ly:pitch? transpose)
                       (list transpose)
                       (let ((elts (ly:music-property transpose 'elements)))
                         (map (lambda (x) (ly:music-property x 'pitch)) elts)))))
  (if (not (= (length new-what) (length pitch-list)))
    (ly:warning "Length of lists doesn't match"))
  (make-simultaneous-music
    (map
      (lambda (x y)
        (make-music 'QuoteMusic
             'element main-music
             'quoted-context-type 'Voice
             'quoted-context-id "cue"
             'quoted-music-name x
             'quoted-voice-direction dir
             'quoted-transposition y))
             new-what pitch-list))))

Flute = \relative c' {
        e1
        e'2 f
        }
       
ClarinetI = \relative c' {
        c1
        c'2 d
        }

Vla = \relative c'' {
        \clef alto
        g1
        g4 c b g
}

\addQuote "ClarinetI" { \ClarinetI }
\addQuote "Flute" { \Flute }
\addQuote "Vla" { \Vla }

Tenorhorn = {
        \transpose c' c'
        \relative c' {
        \transposition bes
        c1
        \transposedSeveralCueDuring
   #'("ClarinetI" "Flute" "Vla")
   ##{ cis' d ges #}
           #UP { R1 }
        c1
        }
}

\new Staff \Tenorhorn

Allerdins muß man einen einzelnen pitch als ##{ cis #} angeben. Die einfachere Syntax klappt nicht mehr.
Dieses Problem hatte ich auf der internationalen Seite gepostet. Die Antwort von David Kastrup ist vielleicht von Interesse.


Gruß,
  Harm

Be-3

  • Member
Re: Mehrere Stimmen gleichzeitig zitieren?
« Antwort #8 am: Samstag, 20. Oktober 2012, 20:35 »
Allerdins muß man einen einzelnen pitch als ##{ cis #} angeben. Die einfachere Syntax klappt nicht mehr.

Hallo Harm,

was spräche eigentlich dagegen, statt eines pitch-Wertes einfach nur die Anzahl der zu tranponierenden Halbtonschritte anzugeben? Also 12 für eine Oktave nach oben oder -2 für einen Ganzton nach unten...
Das wären dann völlig unproblematische einfache Zahlen, mit denen sich hervorragend rechnen ließe.
Ich fände das sogar fast einleuchtender als eine Tonhöhe bezogen auf c' anzugeben, denn in unseren Beispielfällen mit transponierenden Instrumenten kam doch ein B-Instrument vor, und um seine \transposition auszugleichen, mußte man d' angeben - da scheint mir ein simples +2 weniger verwirrend...

Viele Grüße
Torsten

harm6

  • Member
Re: Mehrere Stimmen gleichzeitig zitieren?
« Antwort #9 am: Samstag, 20. Oktober 2012, 23:27 »
(...)
was spräche eigentlich dagegen, statt eines pitch-Wertes einfach nur die Anzahl der zu tranponierenden Halbtonschritte anzugeben? Also 12 für eine Oktave nach oben oder -2 für einen Ganzton nach unten...
Das wären dann völlig unproblematische einfache Zahlen, mit denen sich hervorragend rechnen ließe.
(...)

Hallo Torsten,

Zahlen anzugeben wäre natürlich das einfachste, jedoch erhebt dann ein anderes Problem sein Haupt:
Wie differenziert man enharmonisch verwechselbare Tonarten?
Alles was mir auf die Schnelle einfällt, verkompliziert alles wieder.

Insofern warte ich mal ab, was David Kastrup mit ly:pitch anstellen wird und bescheide mich bis dahin mit meiner obigen Funktion.

Wenn Dir natürlich noch etwas besseres einfällt ... :)

Gruß,
  Harm

Be-3

  • Member
Re: Mehrere Stimmen gleichzeitig zitieren?
« Antwort #10 am: Dienstag, 13. November 2012, 19:54 »
Hallo Harm,

tja, das stimmt, die enharmonische Verwechslerei hatte ich überhaupt nicht bedacht, deshalb ist die Übergabe einer schlichten Zahl natürlich Quatsch...


Wenn Dir natürlich noch etwas besseres einfällt ... :)

Aber: mir ist tatsächlich noch was besseres eingefallen: Wir haben in all dem Trubel völlig übersehen, daß man schlicht und ergreifend mehrere (!) \cueDuring-Befehle direkt hintereinander angeben kann:  ;) :D ;D

Hier mal Dein Beispiel von ganz oben ohne jegliche Eigenfunktion (Wortspiel). Ich habe bei \addQuote jeweils die \transposition rausgeschmissen und die Klarinette nur mit \cueDuring zitiert (paßt ja zum Terrorhorn), die Flöte von c' auf d runtertransponiert (das Horn muß ja tatsächlich auch fis und g spielen, wenn e und f erklingen sollen). Die Viola "darf" in ihrer Oktave bleiben, wird aber auch um einen Ganzton nach oben gerückt:

\version "2.16.0"

Flute = {
        \transpose c' c'
        \relative c' {
        e1
        e'2 f
        }
}        
ClarinetI = {
        \transpose c' c'
        \relative c' {
        \transposition bes
        c1
        c'2 d
        }
}

Vla = \relative c'' {
        \clef alto
        g1
        g4 c b g
}

\addQuote "ClarinetI" { \ClarinetI }
\addQuote "Flute" { \Flute }
\addQuote "Vla" { \Vla }


Tenorhorn = {
        \transpose c' c'
        \relative c' {
        \transposition bes
        c1
        \cueDuring #"ClarinetI" #UP
        \transposedCueDuring #"Flute" #UP f
        \transposedCueDuring #"Vla" #UP a'
                { R1 }
        c1
        }
}

\new Staff \Tenorhorn

Besser spät als nie,
Torsten