Autor Thema: Lilypond compiliert nicht, zu viele Contexte (GELÖST)  (Gelesen 6544 mal)

fugenkomponist

  • Gast
Re: Lilypond compiliert nicht, zu viele Contexte
« Antwort #15 am: Mittwoch, 18. Mai 2016, 12:13 »
Was genau meinst du mit Layout? Den \layout-Block? Der kann auch außerhalb von \score stehen und bezieht sich dann auf alle folgenden.

harm6

  • Gast
Re: Lilypond compiliert nicht, zu viele Contexte (GELÖST)
« Antwort #16 am: Donnerstag, 19. Mai 2016, 01:01 »
Arnold hat natürlich recht. Und vielen Dank es mit harten Zahlen untermauert zu sehen.

Ich hatte zuerst auch dahin tendiert einzelne scores vorzuschlagen, dann aber zunächst davon abgesehen, da das zwar hier möglich ist aber in anderen Situationen braucht man manchmal halt einen durchgehenden score. Insoweit war es wichtig zu zeigen wie man von nicht kompilierbar zu unter fünf Minuten kommt (ich nehm jetzt die Werte, die ich mit meinem kleinen laptop beobachte.)

Anstatt nun einfach einen score nachdem anderen zu schreiben, hier eine voll automatisierte Fassung.
Auf meinem laptop knapp über 20 Sekunden ;)

\version "2.19.37"

#(use-modules (scm display-lily))

\language "deutsch"
\include "myExceptions.ily"
\include "myScheme.ily"
\include "myChordList.ily"
#(set-global-staff-size 18)

book-init =
\book {
  %% book paper, which is inherited by all children bookparts
  \paper {
    #(set-paper-size "a4")
    ragged-last-bottom = ##f
    %ragged-last = ##t
    line-width = 190
    left-margin = 10
    bottom-margin = 10
    top-margin = 10
    ragged-right = ##f
    %annotate-spacing = ##t
    %system-system-spacing.basic-distance = #10
    %system-system-spacing.minimum-distance = #8
    %system-system-spacing.extra-distance = #0
    %system-system-spacing.padding = #1
    %score-system-spacing.basic-distance = #0
    %last-bottom-spacing.basic-distance = #20
    print-first-page-number = ##f
    indent = 0
  }
  \header {
    title = ""
    %copyright = "Copyright Manuela Gößnitzer"
    parttagline = "Part tagline"
    copyright = \markup \fill-line {
      \abs-fontsize #9 { \FootLeft }
      % \abs-fontsize #7.0 { \italic { \FootCenter } }
      \abs-fontsize #9 { \FootRight }
    }
    copyright =\markup \abs-fontsize #7 "Copyright Manuela G."

    tagline = ""
  }
  \bookpart {
    %% a different page breaking function may be used on each part
    \paper { page-breaking = #ly:minimal-breaking }
    \header {
      %subtitle = "Alle leitereigenen Drei-, Vier- und Fünfklänge"
      title = \markup \fontsize #10 \center-column
      {
        " " " "
        \fontsize #1.4 {
          "(Fast Alle)"
          "Mehrklänge"
          "zu"
          "einem Grundton"
          { "in"  }
          "verschiedenen"
          "Tonleitern"
        }
      }

      copyright = \markup \fill-line {
        \abs-fontsize #9 { \FootLeft }
        % \abs-fontsize #7.0 { \italic { \FootCenter } }
        \abs-fontsize #9 { \FootRight }
      }
      tagline = ""
    }
    %\markup \fontsize #20 { The first book part }
    %\markup { a page break }
    \pageBreak
    \markup { first part last page }
    %\markuplist \table-of-contents
    %\markup \wordwrap { with ragged-last-bottom (see the space below this text) }
  }
}

#(define format-key-info-markup
   (lambda (root-1 scale-1 root-2 scale-2 root-3 scale-3)
     (markup
      ;#:bold
      (let ((german-strg
             (format #f "~a ~a"
               root-1
               (symbol->string scale-1))))
        (if (eq? scale-1 'Moll)
            german-strg
            german-strg)))))

\layout {
  \context {
    \Score
    \remove "Bar_number_engraver" % Taktnummerierung
    \override RehearsalMark.self-alignment-X = #LEFT
    \override KeyCancellation.break-visibility = #'#(#f #f #f)
    \override NonMusicalPaperColumn.page-break-permission = ##f
    proportionalNotationDuration = #(ly:make-moment 1/2)
  }
  \context {
    \ChordNames
    chordNameLowercaseMinor = ##f
    chordRootNamer = #germanChords
    chordNoteNamer = #note-name->german-markup
    \override ChordName.font-name = #"Monospac821 BT"
    chordNameExceptions = #chExceptions
    \override ChordName.font-size = #1
    \override ChordName.font-series = #'bold
  }
  \context {
    \Staff
    \remove "Time_signature_engraver"
    \override TextScript.direction = #UP
    \override KeySignature.break-visibility = #begin-of-line-visible
    printKeyCancellation = ##f
    explicitKeySignatureVisibility = ##(#f #f #t)
  }
  \context {
    \Voice
    \override TextScript.padding = #0
    \override TextScript.direction = #UP
    \override TextScript.font-size = #3
    \override TextScript.font-series = #'bold %normal
  }
}

annotateKey =
#(define-music-function (mrkp-1)(markup?)
   #{
     \once \override TextScript.before-line-breaking =
     #(lambda (grob)
        (ly:grob-set-property! grob 'text
          (markup #:line (mrkp-1 (ly:grob-property grob 'text)))))
     \once \override TextScript.annotate-key = ##t
   #})

   
#(define (sim-music ev-chrd p m)
;; Return a list of sublists containing scores
  (map
    (lambda (t)
      (scorify-music
        #{
          \transpose c $t
          <<
            \new Voice \with { \consists #annotate-key-engraver }
            {
              \key $p \major
              \annotateKey 
                \markup #(format #f "Mehrklänge mit Grundton ~a in "
                  (string-capitalize
                    (symbol->string (note-name->lily-string t))))
              $m \bar "|."
            }
            \new ChordNames $m
          >>
        #}))
    (event-chord-pitches ev-chrd)))

#(define (scores ev-chrd tonics chrds)
;; process `sim-music' and reorder the result

  (define (reorder-list ls rl)
    ;; '((1 2 3)(a b c)(x y z))
    ;; -> '((1 a x)(2 b y)(3 c z))
    (if (every null? ls)
        (reverse rl)
        (reorder-list
          (map cdr ls)
          (cons (map car ls) rl))))
       
  (let ((lst
          (reverse
            (map
              (lambda (tonic music) (sim-music ev-chrd tonic music))
              (event-chord-pitches tonics)
              chrds))))
         
  (reorder-list lst '())))

print-book =
#(define-void-function (which tonics chords)(ly:music? ly:music? list?)
  ;; add all bookparts to `book-init'
  (for-each
    (lambda (bp) (ly:book-add-bookpart! book-init bp))
    ;; wrap all scores in every sublist of (scores which chords) into a bookpart
    (map ly:make-book-part (scores which tonics chords)))
  ;; process the book to make it ready for output
  (ly:book-process   
    book-init
    $defaultpaper
    $defaultlayout
    (ly:parser-output-name)))
 
\print-book
  <c g d a e h, fis ges des as es b f>
  <g c f b es as des>
  #(list
    CChordsGDur
    CChordsCDur
    CChordsFDur
    CChordsBDur
    CChordsEsDur
    CChordsAsDur
    CChordsDesDur)

Dasselbe auch im Anhang.
Würd mich interessieren wieviel RAM es jetzt braucht (wahrscheinlich etwas mehr als bei einzelnen scores).
Arnold, falls Du Zeit hast ...

Gruß,
  Harm

EDIT:
Kann mal jemand nachprüfen, ob der Inhalt des angehängten files mit dem Code inline übereinstimmt?
Für mich sieht es so aus als ob die letzten Zeilen abgeschnitten wären. Ich hab das file jetzt zum zweiten mal hochgeladen...
« Letzte Änderung: Donnerstag, 19. Mai 2016, 01:13 von harm6 »

Manuela

  • Gast
Re: Lilypond compiliert nicht, zu viele Contexte (GELÖST)
« Antwort #17 am: Donnerstag, 19. Mai 2016, 21:10 »
Harm, das ist echt genial  :), viel eleganter als das, was ich fabriziert habe  ::)

Ich habe aus der Liste in \print-book das gemacht

CChords = { c:m c:7 c:maj7 }
MeineTonleiter= { <c d e f g a h > }
ChordsInScale = %% ist nur ein dummy, damit es compiliert
#(define-music-function (m)(ly:music?)
   #{ $m #} )
\print-book
<c g d a e h, fis ges des as es b f>
<g c f b es as des>
#(list
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c g \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c f \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c b \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c es \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c as \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c des \MeineTonleiter } #}
  )
 

Das geht sicher auch noch einfacher?
« Letzte Änderung: Donnerstag, 19. Mai 2016, 21:48 von Manuela »

harm6

  • Gast
Re: Lilypond compiliert nicht, zu viele Contexte (GELÖST)
« Antwort #18 am: Donnerstag, 19. Mai 2016, 22:49 »
Hallo Manuela,

mir ist nicht klar was Du erreichen möchtest.

Zunächst meinst Du wahrscheinlich:
CChords = \chordmode { c:m c:7 c:maj7 }

Und soll das wirklich ein Akkord sein:
MeineTonleiter= { <c d e f g a h > }
?

Ich hab' mal eine Zeile ausgeschnitten und angehängt. Kann mir aber nicht vorstellen, daß das Ergebnis gewollt ist.

Bitte erstelle diese Zeile manuell so, wie Du sie haben willst und poste den code dann.

Gruß,
  Harm

Manuela

  • Gast
Re: Lilypond compiliert nicht, zu viele Contexte (GELÖST)
« Antwort #19 am: Freitag, 20. Mai 2016, 07:02 »
Zunächst meinst Du wahrscheinlich:
CChords = \chordmode { c:m c:7 c:maj7 }
ja natürlich  :-[

Und soll das wirklich ein Akkord sein:
MeineTonleiter= { <c d e f g a h > }


\ChordsInScale  hat natürlich zwei Argumente (meine Schlampigkeit!)
Das erste ist eine Liste von Akkorden, das zweite irgendein musikalischer Ausdruck, z.B. alle Noten einer Tonleiter.
Als Ergebnis kommt eine Liste jener Akkorde raus, deren Noten im zweiten Ausdruck enthalten sind.
Ich habe also die Liste
#(list
    CChordsGDur
    CChordsCDur
    CChordsFDur
    CChordsBDur
    CChordsEsDur
    CChordsAsDur
    CChordsDesDur)
verallgmeinert.

harm6

  • Gast
Re: Lilypond compiliert nicht, zu viele Contexte (GELÖST)
« Antwort #20 am: Samstag, 21. Mai 2016, 21:00 »
Hallo Manuela,

dieser Code (mit dem Funktions-dummy)
CChords = \chordmode { c:m c:7 c:maj7 }
MeineTonleiter= { c d e f g a b }
ChordsInScale = %% ist nur ein dummy, damit es compiliert
#(define-music-function (m scale)(ly:music? ly:music?) m)
gibt in der Anwendung:
(list
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c g \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c f \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c b \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c es \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c as \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c des \MeineTonleiter } #}
  )
eine Liste mit 7 identischen Elementen aus.

Sichtbar zu machen mit:
$(make-sequential-music
(list
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c g \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c f \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c b \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c es \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c as \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c des \MeineTonleiter } #}
  )
  )

Wie ist `ChordsInScale' definiert? Oder ist die Frage, wie man `ChordsInScale' definieren sollte?


Mit anderen Worten, zumindest für mich ist Dein Anliegen nach wie vor unklar.


-Harm

Manuela

  • Gast
Re: Lilypond compiliert nicht, zu viele Contexte (GELÖST)
« Antwort #21 am: Samstag, 21. Mai 2016, 23:01 »
Hallo Harm, danke für deine Mühe.

dieser Code (mit dem Funktions-dummy)
CChords = \chordmode { c:m c:7 c:maj7 }
MeineTonleiter= { c d e f g a b }
ChordsInScale = %% ist nur ein dummy, damit es compiliert
#(define-music-function (m scale)(ly:music? ly:music?) m)
gibt in der Anwendung:
(list
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c g \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c f \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c b \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c es \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c as \MeineTonleiter } #}
  #{ \transpose c c' { \ChordsInScale \CChords \transpose c des \MeineTonleiter } #}
  )
eine Liste mit 7 identischen Elementen aus.

Das ist klar, denn "ChordsInScale" aus dem hier geposteten Code ist ja nur ein dummy. Die "echte" Funktion liefert sehr wohl unterschiedliche Ergebnisse. Nämlich im 1. Aufruf alle Akkorde aus CChords, die sich als Töne der G-Dur Tonleiter darstellen lassen. Im 2. Aufuf alle Akkorde aus CChords, die sich am Klavier ausschließlich auf weißen Tasten spielen lassen. Im 3. Aufruf alle Akkorde aus CChords, die sich mit Tönen der F-Dur spielen lassen etc.

Wie ist `ChordsInScale' definiert? Oder ist die Frage, wie man `ChordsInScale' definieren sollte?
Mit anderen Worten, zumindest für mich ist Dein Anliegen nach wie vor unklar.

Der Aufbau von "ChordsInScale" ist für meine Fragestellung nicht entscheidend. Ich weiß nicht, wie ich mich verständlich machen könnte. Du hast mir schon so viel geholfen, ich möchte dich mit dieser Fragestellung jetzt nicht weiter behelligen, mein nächstes Problem kommt bestimmt  ;)