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

Manuela

  • Member
Lilypond compiliert nicht, zu viele Contexte (GELÖST)
« 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
« Letzte Änderung: Mittwoch, 18. Mai 2016, 16:10 von Manuela »

fugenkomponist

  • Member
Re: Lilypond haut sich über die Häuser
« Antwort #1 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 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. ä.)

harm6

  • Member
Re: Lilypond haut sich über die Häuser
« Antwort #2 am: Montag, 16. Mai 2016, 17:39 »
Falls Du Deinen code aus
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

Manuela

  • Member
Re: Lilypond haut sich über die Häuser
« Antwort #3 am: Montag, 16. Mai 2016, 21:29 »
Falls Du Deinen code aus
https://liarchiv.joonet.de/index.php?topic=1948.msg12673#msg12673

Dein Verdacht ist richtig  :)

Falls du dir den Code wirklich antun willst  ;)

harm6

  • Member
Re: Lilypond haut sich über die Häuser
« Antwort #4 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

Manuela

  • Member
Re: Lilypond haut sich über die Häuser
« Antwort #5 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.  ;)
« Letzte Änderung: Dienstag, 17. Mai 2016, 09:12 von Manuela »

Arnold

  • Member
Re: Lilypond haut sich über die Häuser
« Antwort #6 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.

harm6

  • Member
Re: Lilypond haut sich über die Häuser
« Antwort #7 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!
« Letzte Änderung: Dienstag, 17. Mai 2016, 14:14 von harm6 »

Manuela

  • Member
Re: Lilypond compiliert nicht, zu viele Contexte
« Antwort #8 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)
« Letzte Änderung: Dienstag, 17. Mai 2016, 19:56 von Manuela »

harm6

  • Member
Re: Lilypond compiliert nicht, zu viele Contexte
« Antwort #9 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

Manuela

  • Member
Re: Lilypond compiliert nicht, zu viele Contexte
« Antwort #10 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.
« Letzte Änderung: Dienstag, 17. Mai 2016, 21:39 von Manuela »

harm6

  • Member
Re: Lilypond compiliert nicht, zu viele Contexte
« Antwort #11 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


Manuela

  • Member
Re: Lilypond compiliert nicht, zu viele Contexte
« Antwort #12 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

Arnold

  • Member
Re: Lilypond compiliert nicht, zu viele Contexte
« Antwort #13 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



Manuela

  • Member
Re: Lilypond compiliert nicht, zu viele Contexte
« Antwort #14 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.