Variable in einer function setzen

Begonnen von Köbi, Mittwoch, 7. Februar 2018, 17:36

« vorheriges - nächstes »

Köbi

Hallo zusammen

Ich habe wieder einmal Urlaub und nehme mir endlich die Zeit, meine Oktavierungs-Herausforderung (https://lilypondforum.de/index.php/topic,99.0.html) weiter zu verfolgen. Beim Einbau in mein "Framework" scheitere ich jedoch. Das folgende Minimalbeispiel ist zwar völlig sinnfrei, aber ich denke, so kann ich meine Frage aufzeigen, so dass die Profis unter euch sofort sehen, wo ich auf dem Schlauch stehe:


\version "2.19.80"

getPitch = #(define-scheme-function (parser location pitch) (ly:pitch?)
  pitch
)

myTranspose = \getPitch d

newPitch = e

myMusic = \transpose c \myTranspose \relative { c' }

myScore = #(define-scheme-function () ()
  ; myTranspose = \getPitch \newPitch
  #{
    \score {
       \myMusic
    }
  #}
)

\myScore


Und nun zu meiner Frage: Wie kann ich innerhalb der function den Wert der Variablen neu setzen, so dass der Ton c nicht nach d, sondern nach newPitch transpoiniert wird? Angedeutet habe ich dies mit der Kommentarzeile.

harm6

Hallo,

Dein Beispiel ist eher verwirrend, denn erhellend für mich...

Allerdings kannst Du keinen fertigen score transponieren. Geht nicht.
Du kannst aber die Musik aus dem score rausholen, transponieren und letztlich wieder in einen score packen, zusammen mit score-header, bzw score-layout, welche sich im originalen score befunden haben mögen.

Ist es das was Du willst?

Gruß,
  Harm

Köbi

Hallo Harm

Was ich möchte, ist, von einem Stück zwei Ausgaben zu machen, wobei bei einer Ausgabe Teile des Stücks oktaviert werden sollen. Ich habe das Beispiel etwas verändert:


\version "2.19.80"

myTranspose = c

myMusic = \relative { g \transpose c \myTranspose \relative { c } }

myScore = #(define-scheme-function (pitch) (ly:pitch?)
  (
    let* ((myTranspose pitch))
    #{ \score { \myMusic } #}
  )
)

\book { \myScore c }
\book { \myScore c' }


Es wird nur das allererste myTranspose = c berücksichtigt. Ich schaffe es nicht, zwei verschiedene Transponierungen zu erzeugen. Am liebsten würde ich das Transponieren in der function vornehmen. Geht das?

Gruss, Köbi

harm6

Meinst Du sowas:

\version "2.19.80"

test =
#(define-void-function (ev-ch) (ly:music?)
  (let* ((pitch-ls (event-chord-pitches ev-ch))
         (scores
           (map
             (lambda (p)
               #{
                 \score {
                  \relative { g \transpose c $p \relative { c } }
                  }
               #})
             pitch-ls))
         (books
           (map
             (lambda (sc)
               (ly:make-book
                 $defaultpaper
                 $defaultheader
                 sc))
             scores)))
    (for-each
      (lambda (bk p)
        (ly:book-process
          bk
          $defaultpaper
          $defaultlayout
          (format #f "~a-~a"
            (ly:parser-output-name)
            (cadr (string-split (object->string p) #\SPACE)))))
      books
      pitch-ls)))
       
\test <cis cis'>

?


Gruß,
  Harm