Deutsches Lilypond Forum (Archiv)

Allgemein => Fragen zu Funktionen => Thema gestartet von: Manuela am Montag, 16. Mai 2016, 16:42

Titel: Lilypond compiliert nicht, zu viele Contexte (GELÖST)
Beitrag von: Manuela am Montag, 16. Mai 2016, 16:42
Endlich habe ich es geschafft, Lilypond ist restlos überfordert  :(

Minmalcode gibt es diesmal keinen  ;)

Rauskommen sollte das Ergebnisblatt in allen Tonleitern
Titel: Re: Lilypond haut sich über die Häuser
Beitrag von: fugenkomponist am Montag, 16. Mai 2016, 17:10
Sieht so aus, als wär dir aufgrund der Größe des Projekts der Arbeitsspeicher ausgegangen. (Wieviel davon hast du?) Du könntest probieren, das Ganze irgendwie aufzuteilen, vielleicht hilft es auch, Automatismen (wie Zeilenumbruch) durch manuelle Lösungen zu ersetzen. Hier (https://liarchiv.joonet.de/index.php?topic=1996.5) wurde so ein ähnliches Problem schon mal besprochen, vielleicht ist da was für dich dabei.

Ein Minimalbeispiel ist da natürlich nicht drin, aber vielleicht hilft ja der komplette Code ;) Ansonsten könntest du noch überlegen, ob du das Projekt in mehrere Teile aufteilen könntest (mehrere \bookparts o. ä.)
Titel: Re: Lilypond haut sich über die Häuser
Beitrag von: harm6 am Montag, 16. Mai 2016, 17:39
Falls Du Deinen code aus
https://liarchiv.joonet.de/index.php?topic=1948.msg12673#msg12673 (https://liarchiv.joonet.de/index.php?topic=1948.msg12673#msg12673)
verwendest habe ich zwar einen Verdacht, der sich aus dem letzten mal nährt, wo ich einen `bad_alloc' sah, aber ohne code kann ich da nichts weiter sagen.

Gruß,
  Harm
Titel: Re: Lilypond haut sich über die Häuser
Beitrag von: Manuela am Montag, 16. Mai 2016, 21:29
Falls Du Deinen code aus
https://liarchiv.joonet.de/index.php?topic=1948.msg12673#msg12673 (https://liarchiv.joonet.de/index.php?topic=1948.msg12673#msg12673)

Dein Verdacht ist richtig  :)

Falls du dir den Code wirklich antun willst  ;)
Titel: Re: Lilypond haut sich über die Häuser
Beitrag von: harm6 am Dienstag, 17. Mai 2016, 01:13
Nun, eigentlich verdächtige ich das übermäßige erschaffen von neuen Contexten für das Problem verantwortlich zu sein.
Hast Du mal gezählt wieviele Voices `MehrKlang' in nur einem Aufruf erschafft? Und Du willst gleich eine ganze Menge davon haben. ;)
Die ganze Definition von `MeinHeader' halte ich unter diesem Gesichtspunkt für suspekt.

Ich poste meinen Verdacht jetzt, ohne schon eine Verbesserung vorschlagen zu können, da ich zu müde bin vor morgen daran weiterarbeiten zu können. Vielleicht hilft es ja.

Gruß,
  Harm
Titel: Re: Lilypond haut sich über die Häuser
Beitrag von: Manuela am Dienstag, 17. Mai 2016, 07:00
Nun, eigentlich verdächtige ich das übermäßige erschaffen von neuen Contexten für das Problem verantwortlich zu sein.
Hast Du mal gezählt wieviele Voices `MehrKlang' in nur einem Aufruf erschafft? Und Du willst gleich eine ganze Menge davon haben. ;)

Ich würde es ja gerne einfacher machen - wenn ich wüsste, wie. Ich bin froh, dass es überhaupt funktioniert.

Außerdem neige ich dazu, Programme bis an ihre Grenzen auszureizen  ;) Ist aber nicht Absicht, sondern schlichte Dummheit. Oder Unfähigkeit.  ;)
Titel: Re: Lilypond haut sich über die Häuser
Beitrag von: Arnold am Dienstag, 17. Mai 2016, 10:25
Hallo Manuela,

erst einmal ein Tip, wie ich eine Speicherüberschreigung in der Vergangenheit (unter Windows) "debugged" habe:
Task-Manager gestartet, die Prozesse dargestellt, dabei die Spalten "Max. Arbeitssatz (Speicher)", "Arbeitsspeicher (privater Arbeitssatz) und "Zugesicherte Größe" angezeigt, da ganze so hingesrollt, daß "lilypond.exe" erscheinen wird.
Danach habe ich lilypond mit der Debug-Option (oder mit nur mäßig mehr Verarbeitungsmeldungen) per Kommandozeile gestartet.
Um besser verfolgen zu können, in welchem Bearbeitungsschritt wieviel zusätzlicher Speicher angefordert wird, habe ich das sogar mit meiner Kamera gefilmt und mir später im Stopbildmodus angesehen!

Mein privates Ergebnis in diesem Fall:
- Für die Bestimmung der Zeilenumbrüche wird einiges an RAM-Speicher benötigt. Somit könnte es hilfreich sein, komplett auf mauellen Zeilenumbruch umzustellen.
- Für den Aufbau der "Druckinformation" kurz vor der Ausgabe des PDF wird nochmal eine riesige RAM-Menge benötigt.
- Die Windows-Version gibt es nur als 32-Bit-Version. Zudem ist diese als "nicht-large-Address-aware" deklariert, und kann somit max. 2 GB RAM (einchließlich des Programmcodes!) verwalten. Ich habe die EXE-Datei (mit Werkzeugen vom MS-C-Compiler) einfach als "large-Address-aware" umdeklariert (in der Annahme, daß das Programm eigentlich large-address-aware ist, nur die Deklaration im Linkvorgang vergessen wurde), uns seither kann ich unter 64-Bit-Windows auch meine großen Dateien übersetzen - bis max. 4 GB RAM-Nutzung.
- Noch mehr Ramnutzung wäre nur mit einer 64-Bit-Version möglich - oder indirekt durch das Zusammensetzen mehrere Einzelkompilationen.

Ja, ich träume noch von »precompiled bookparts«, vielleicht eine Zwischen-Ausgabe ähnlich der SCM-Ausgabe, und wenn man diese dann in eine Oberstufe (per include) einbindet, dann werden eigentlich nur noch die Seitennummern, das Inhaltsverzeichnis, der alphabethishe  Titelindex, und die eventuell vorhandenen Seitenverweise erstellt bzw. angepaßt. Aber das wäre ein anderer Thread.

Arnold.
Titel: Re: Lilypond haut sich über die Häuser
Beitrag von: harm6 am Dienstag, 17. Mai 2016, 14:10
Hallo Manuela,

weiter unten der veränderte Inhalt Deines 01.ly-files. Es kompiliert jetzt auf meinem nicht besonders starken laptop innerhalb von fünf Minuten.
Wie schon vermutet lag es im wesentlichen an der Unzahl neu erschaffener Contexte.
Setze Contexte fort (wenns geht), erschaffe nicht jedesmal neue.
Darüberhinaus habe ich `MeinHeader' so geändert, daß nicht eine extra Leerzeile entsteht, nur um ein markup zu platzieren, mit der Notwendigkeit diese Zeile dann wieder weitgehend unsichtbar zu machen.
`annotateKey' ist verändert, um zusätzlichen Text vor und hinter die ausgelesene Tonart zu setzen.
Btw, das original `format-key-info-markup' gab auch das ausgelesene Tongeschlecht zurück. Warum hast Du es geändert nur um dann das Tongeschlecht manuell anzugeben? (Hab' ich aber nicht geändert.)
`multipleTransposes' habe ich durch eine andere procedure ersetzt, um einen transpoierbaren pitch in ein markup zu kriegen. Das erfolgt ganz am Ende und ist tatsächlich eine weitere Möglichkeit sowas ins markup zu bekommen, allerdings ist jegliche Variabilität natürlich dahin und deshalb nur in einem Sonderfall wie diesem einsetzbar.
Inwieweit es möglich wäre in diesem Deinem Sonderfall den engraver durch ähnliche Funktionalität zu ersetzen habe ich nicht erforscht.
Ganz generell habe ich die Geschichte nur kompilierbar gemacht.
Du wirst feststellen, daß sich z.B. das horizontale Spacing geändert hat, etc.
Aber einerseits wollte ich Dir nicht vorgreifen, andererseits betrachte es Hausaufgabe :D
Zum Beispiel all diese zusätzlichen Klammern.
Du weißt, das <<>>/{} eine Bedeutung haben! Das sind nur Kleinigkeiten aber in der Masse erhöhen sie irgenwann die Kompilierungszeit ...
Soweit das (unvollständige ;) ) change-log. Hier der code:

\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)

#(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"
               root-1
               (symbol->string scale-1))))
        (if (eq? scale-1 'Moll)
            german-strg
            german-strg)))))

myContext =  \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 mrkp-2)(markup? markup?)
   #{
     \once \override TextScript.before-line-breaking =
     #(lambda (grob)
        (ly:grob-set-property! grob 'text
          (markup #:line (mrkp-1 (ly:grob-property grob 'text) mrkp-2))))
     \once \override TextScript.annotate-key = ##t
   #})
   
MeinHeader =
#(define-music-function (Pitch1 Pitch2 mkup mus)
   (ly:pitch? ly:pitch? markup? ly:music?)
   #{
     \context Voice = "up" \with { \consists #annotate-key-engraver }
       {
         \break
         \undo \omit Staff.StaffSymbol
         \key $Pitch2 \major
         \annotateKey 
           \markup #(format #f "Mehrklänge mit Grundton ~a in "
             (string-upcase (symbol->string (note-name->lily-string Pitch1))))
           $mkup
         %\grace s1
         $mus
       }
   #})

MehrKlang =
#(define-music-function (tonic)(ly:pitch?)
#{
  \context Staff = "main" {
      \MeinHeader $tonic g "-Dur"
        <<
          \context Voice = "up"
          {
            \key g \major
            \CChordsGDur \bar "|." \break
          }
          \context ChordNames = "chrds" \CChordsGDur
        >>
      \MeinHeader $tonic c "-Dur"
        <<
          \context Voice = "up"
          {
            \key c \major
            \CChordsCDur \bar "|."  \break
          }
          \context ChordNames = "chrds" \CChordsCDur
        >>
      \MeinHeader $tonic f "-Dur"
        <<
          \context Voice = "up"
          {
            \key f \major
            \CChordsFDur \bar "|." \break
          }
          \context ChordNames = "chrds" \CChordsFDur
        >>
      \MeinHeader $tonic b "-Dur"
        <<
          \context Voice = "up"
          {
            \key b \major
            \CChordsBDur \bar "|." \break
          }
          \context ChordNames = "chrds" \CChordsBDur
        >>
      \MeinHeader $tonic es "-Dur"
        <<
          \context Voice = "up"
          {
            \key es \major
            \CChordsEsDur \bar "|." \break
          }
          \context ChordNames = "chrds" \CChordsEsDur
        >>
      \MeinHeader $tonic as "-Dur"
        <<
          \context Voice = "up"
          {
            \key as \major
            \CChordsAsDur \bar "|." \break
          }
          \context ChordNames = "chrds" \CChordsAsDur
        >>
      \MeinHeader $tonic des "-Dur"
        <<
          \context Voice = "up"
          {
            \key des \major
            \CChordsDesDur 
            \bar "|."
            \stopStaff
            \omit Staff.StaffSymbol
            s1 *5 s1 s1 s1
            \once \omit Staff.BarLine
            \startStaff
            \break
          }
          \context ChordNames = "chrds" \CChordsDesDur
        >>
    \pageBreak
  }
#})

\book {
  %% book paper, which is inherited by all children bookparts
  \paper {
    #(set-paper-size "a4")
    ragged-last-bottom = ##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) }
  }
  \bookpart {
    \score {
     %\multipleTransposes { c g d a e h, fis ges des as es b f } \MehrKlang
     $(make-sequential-music
       (map
         (lambda (p)
           #{ \transpose c $p \MehrKlang $(ly:pitch-transpose p #{ c #}) #})
         (event-chord-pitches #{ <c g d a e h, fis ges des as es b f>  #})))
    }

  }

  \myContext
}


HTH,
  Harm

P.S.
Bitte ändere den Titel dieses Threads.
Er ist ja ganz witzig, aber im Archiv kaum wiederfindbar.

Zitat
Ist aber nicht Absicht, sondern schlichte Dummheit. Oder Unfähigkeit.
Weder noch!
Titel: Re: Lilypond compiliert nicht, zu viele Contexte
Beitrag von: Manuela am Dienstag, 17. Mai 2016, 19:50
Danke Harm für diese Mühe, ich muss den Code erst studieren.

Den Titel habe ich jetzt geändert, falls du einen anderen Vorschlag hast, dann poste ihn bitte, ich mache das dann.

Nochmals ganz herzlichen Dank!


Du weißt, das <<>>/{} eine Bedeutung haben! Das sind nur Kleinigkeiten aber in der Masse erhöhen sie irgenwann die Kompilierungszeit ...


Ja, ich weiß, ich kämpfe noch...  ;)

Wahrscheinlich bin ich durch andere Programmiersprachen in meinem Scheme-Verständnis behindert (das scheint ein verbreitetes Phänomen zu sein, wie ich aus anderen Forumsbeiträgen gesehen habe)
Titel: Re: Lilypond compiliert nicht, zu viele Contexte
Beitrag von: harm6 am Dienstag, 17. Mai 2016, 20:43
Zitat
Danke Harm für diese Mühe, ich muss den Code erst studieren.

Ich hoffe es funktioniert wie Du möchtest.

Zitat
Den Titel habe ich jetzt geändert, falls du einen anderen Vorschlag hast, dann poste ihn bitte, ich mache das dann.

Ich bin mir nicht völlig sicher, daß es an zu vielen contexten liegt. Aber auf jeden Fall an zu vielen on-the-fly geschaffenen, denn LilyPond ordnet neue Contexte (Staff, ChordNames, etc) per default immer "unten" an, d.h. das spacing wird jedesmal anspruchsvoller (auch wenn das nicht immer direkt sichtbar wird). Insoweit ist der Thread-Titel eine gute Annäherung. Ich würde ihn so lassen.

Zitat
    Du weißt, das <<>>/{} eine Bedeutung haben! Das sind nur Kleinigkeiten aber in der Masse erhöhen sie irgenwann die Kompilierungszeit ...

Ja, ich weiß, ich kämpfe noch...  ;)

Wahrscheinlich bin ich durch andere Programmiersprachen in meinem Scheme-Verständnis behindert (das scheint ein verbreitetes Phänomen zu sein, wie ich aus anderen Forumsbeiträgen gesehen habe)

Das scheint so zu sein.
Allerdings ist {}, etc primär LilyPond-Syntax, nicht scheme.

Falls es jemanden interessiert:

\displayMusic {}
\displayMusic <<>>
\displayMusic <>

gibt folgendes aus:

Zitat
(make-music
  'SequentialMusic
  'elements
  '())


(make-music
  'SimultaneousMusic
  'elements
  '())


(make-music
  'EventChord
  'elements
  '())

Insoweit erzeugt ein code wie
\new Staff  { << { \meine-music } >> }
gleich drei neue und überflüssige Ebenen.

Zitat
Nochmals ganz herzlichen Dank!

Gern geschehen. :)

Gruß,
  Harm
Titel: Re: Lilypond compiliert nicht, zu viele Contexte
Beitrag von: Manuela am Dienstag, 17. Mai 2016, 21:37
Dann hatte ich dich im anderen Thread genau verkehrt rum verstanden. Ich dachte, es wäre besser \new Voice zu schreiben anstatt \context Voice.

Jedenfalls gefällt mir das Layout jetzt viel besser  :)

Dein Laptop braucht tatsächlich 5 Minuten zum kompilieren? Mein PC erledigt das in 20 sec, ist allerdings kein Laptop. Ich werde mal auf meinem kleinen Tablet testen, wie lange das braucht.
Titel: Re: Lilypond compiliert nicht, zu viele Contexte
Beitrag von: harm6 am Dienstag, 17. Mai 2016, 22:13
Zitat
Dann hatte ich dich im anderen Thread genau verkehrt rum verstanden. Ich dachte, es wäre besser \new Voice zu schreiben anstatt \context Voice.
Welcher andere Thread? Bitte immer verlinken ;)
Es kommt auf die konkrete Sutuation an ob \new oder \context
In diesem hier solltest Du contexte am leben halten und wieder aufgreifen, also \context

Zitat
Jedenfalls gefällt mir das Layout jetzt viel besser
:D

Zitat
Dein Laptop braucht tatsächlich 5 Minuten zum kompilieren? Mein PC erledigt das in 20 sec, ist allerdings kein Laptop.
Nun, tatsächlich ist mein laptop etwas schwach auf der Brust.
Liegt zum einen daran, daß ich nicht die verbaute Festplatte genommen habe, sondern die aus dem Vorgänger genommen habe. Älter und kleiner.
Zum anderen (neben sonstigen Ursachen) ist dieses laptop als "Einsteiger-Modell" verkauft worden. Ich war es halt leid ein richtig gutes laptop für viele hundert Euro zu kaufen, nur um irgendwann (meistens ziemlich bald) zu hören: "Ihr motherboard ist irreparabel."
Ist ein Versuch, aber momentan siehts so aus als ob dieses laptop midestens so lange lebt wie seine Vorgänger. Bislang also bedaure ich den Kauf nicht, auch wenn es schon Einschränkungen gibt.


Gruß,
  Harm

Titel: Re: Lilypond compiliert nicht, zu viele Contexte
Beitrag von: Manuela am Dienstag, 17. Mai 2016, 22:40
Welcher andere Thread? Bitte immer verlinken ;)

Das war dieser Thread https://liarchiv.joonet.de/index.php?topic=2262.0 (https://liarchiv.joonet.de/index.php?topic=2262.0)
Titel: Re: Lilypond compiliert nicht, zu viele Contexte
Beitrag von: Arnold am Mittwoch, 18. Mai 2016, 10:29
Hallo zusammen,

ich habe auch noch ein paar Versuche durchgeführt:

Zuerst habe ich nacheinander einzelne Transposistionen geprüft:
%    \score { \MehrKlang }
    \score { \transpose c g \MehrKlang }
%    \score { \transpose c d \MehrKlang }
%    \score { \transpose c a \MehrKlang }
Ergebnis: bei den Transpositionen nach e, es und f kam es zum Absturz

Als nächstes habe ich alle zehn verbleibenden (lauffähigen) Transpositionen je als eigener Score-Block definiert:
    \score { \MehrKlang }
    \score { \transpose c g \MehrKlang }
    \score { \transpose c d \MehrKlang }
    \score { \transpose c a \MehrKlang }
    %FEHLER: \score { \transpose c e \MehrKlang }
    \score { \transpose c h, \MehrKlang }
    \score { \transpose c fis \MehrKlang }
    \score { \transpose c ges \MehrKlang }
    \score { \transpose c des \MehrKlang }
    \score { \transpose c as \MehrKlang }
    %FEHLER: \score { \transpose c es \MehrKlang }
    \score { \transpose c b \MehrKlang }
    %FEHLER: \score { \transpose c f \MehrKlang }
Ergebnis: In knapp 11 Sekunden wurde die PDF-Datei erstellt, und nicht einmal ein halbes Gigabyte RAM (Peak) wurde benötigt.
Um das zu sehen, habe ich den Aufruf eines (eigenen) externen Programms an den Schluß von 'postscript->pdf' in backend-library.scm hinzugefügen müssen.

Die nächsten beiden Versuche führten beide zum Absturz.
Entweder alle Transpositionen (wie oben) in einer Voice: \score { {
  \MehrKlang
  \transpose c g \MehrKlang
  \transpose c d \MehrKlang
  % und so weiter
} }
oder mit multipleTransposes:     \score {
     \multipleTransposes { c g d a h, fis ges des as b } \MehrKlang
    }
Ergebnis: nach knapp 9 Minuten wird das 4-GB-Limit überschritten und Lilypond stürzt ab.

Fazit: Mehrere kleine Scores lassen sich erheblich schneller übersetzen als ein einziger großer Riesen-Score-Block.

Arnold


Titel: Re: Lilypond compiliert nicht, zu viele Contexte
Beitrag von: Manuela am Mittwoch, 18. Mai 2016, 11:23
Arnold, danke für deine Mühe  :)

Mein Problem ist, dass ich faul bin und mir Schreibarbeit sparen möchte. Daher lasse ich lieber den Computer länger rechnen. Natürlich könnte ich mit copy & paste lauter Scores für die einzelnen Tonarten erstellen. Wenn ich dann irgendwo eine Kleinigkeit im Layout ändere, kann ich das dann 13x mit einem Editor ändern. Was ziemlich mühsam ist.
Titel: Re: Lilypond compiliert nicht, zu viele Contexte
Beitrag von: fugenkomponist 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.
Titel: Re: Lilypond compiliert nicht, zu viele Contexte (GELÖST)
Beitrag von: harm6 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...
Titel: Re: Lilypond compiliert nicht, zu viele Contexte (GELÖST)
Beitrag von: Manuela 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?
Titel: Re: Lilypond compiliert nicht, zu viele Contexte (GELÖST)
Beitrag von: harm6 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
Titel: Re: Lilypond compiliert nicht, zu viele Contexte (GELÖST)
Beitrag von: Manuela 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.
Titel: Re: Lilypond compiliert nicht, zu viele Contexte (GELÖST)
Beitrag von: harm6 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
Titel: Re: Lilypond compiliert nicht, zu viele Contexte (GELÖST)
Beitrag von: Manuela 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  ;)