Autor Thema: Quintenzirkel in Lilypond (kein Problem, nur ne Lösung ;-) )  (Gelesen 5292 mal)

Manuela

  • Member
Quintenzirkel in Lilypond (kein Problem, nur ne Lösung ;-) )
« am: Dienstag, 26. Juli 2016, 22:45 »
Ich habe soweit fertig  ;), natürlich gäbe es noch eine Menge zu verbessern/vereinfachen.

Wen es interessiert, hier der Code:

\version "2.19.37"

\language "deutsch"

%% draw a circle of fifths with Lilypond

\paper {
  #(set! paper-alist (cons '("mein Format" . (cons (* 25 in) (* 25 in))) paper-alist))
  %#(set-paper-size "mein Format")
  #(set-paper-size "a4")
  left-margin = #90
  myStaffSize = #20
  #(define fonts
     (make-pango-font-tree
      "Nimbus Sans,Nimbus Sans L"
      "Nimbus Sans,Nimbus Sans L"
      "Luxi Mono"
      (/ myStaffSize 20)))
}

%% creating the score snippets
%% we remove some items not needed

\layout {
  indent = #0
  \context {
    \Staff
    \omit TimeSignature
    \omit BarLine
    explicitClefVisibility = #end-of-line-invisible
    explicitKeySignatureVisibility = #end-of-line-invisible
    \remove "Accidental_engraver"
  }
  \context {
    \Voice
    \omit NoteHead
    \omit Stem
  }
  \context {
    \Score
    \override BarNumber.break-visibility = #all-invisible
    \override KeyCancellation.break-visibility = #'#(#f #f #f)
  }
}

%% define score snippets als markups
%% in order of appearance

CDur=\markup \score { \layout {  } { \key c \major g'4 } }
GDur=\markup \score { \layout {  } { \key g \major g'4 } }
DDur=\markup \score { \layout {  } { \key d \major g'4 } }
ADur=\markup \score { \layout {  } { \key a \major g'4 } }
EDur=\markup \score { \layout {  } { \key e \major g'4 } }
HDur=\markup \score { \layout {  } { \key h \major g'4 } }
FisDur=\markup \score { \layout {  } { \key fis \major g'4 } }
GesDur=\markup \score { \layout {  } { \key ges \major g'4 } }
DesDur=\markup \score { \layout {  } { \key des \major g'4 } }
AsDur=\markup \score { \layout {  } { \key as \major g'4 } }
EsDur=\markup \score { \layout {  } { \key es \major g'4 } }
BDur=\markup \score { \layout {  } { \key b \major g'4 } }
FDur=\markup \score { \layout {  } { \key f \major g'4 } }

#(define (st-rot stencil myangle)
   ;; just for shortening the code
   (ly:stencil-rotate stencil myangle 0 0))

#(define (x-width mystencil)
   (let* ((x-ext (ly:stencil-extent mystencil X)))
     (- (cdr x-ext) (car x-ext))))

#(define (y-width mystencil)
   (let* ((y-ext (ly:stencil-extent mystencil Y)))
     (- (cdr y-ext) (car y-ext))))

#(define (bogen winkel)
   (* ( / winkel 180) PI))

#(define (kreis-punkt radius winkel)
   ;; liefert die Koordinaten am Kreisbogen zurück
   ;; '(x . y)
   (let* ((wiboma (bogen winkel)) ;; Winkel ins Bogenmaß umrechnen
           (x-sin (sin wiboma))
           (y-cos (cos wiboma))
           (x-cor (* x-sin radius))
           (y-cor (* y-cos radius)))
     (cons x-cor y-cor)))

#(define (mittel-punkt stencil)
   ;; liefert die Koordinaten des Mittelpunktes
   ;; '( x-mittel . y-mittel)
   (let*
    ((x-li (car (ly:stencil-extent stencil X)))
     (x-re (cdr (ly:stencil-extent stencil X)))
     (y-li (car (ly:stencil-extent stencil Y)))
     (y-re (cdr (ly:stencil-extent stencil Y))))
    (cons (/ (+ x-li x-re) 2) (/ (+ y-li y-re) 2))))

#(define (move-to-circle radius winkel stencil)
   ;; versetzt einen Stencil an den Kreisrand abhängig vom Winkel
   (let* ((mittel (mittel-punkt stencil))
          (mittel-x (car mittel))
          (mittel-y (cdr mittel))
          (kreis (kreis-punkt radius winkel))
          (kreis-x (car kreis))
          (kreis-y (cdr kreis)))
     (ly:stencil-translate stencil
       (cons
        (- kreis-x mittel-x)
        (- kreis-y mittel-y)))))

#(define-markup-command (move-markup layout props mymark radius winkel)
   (markup? number? number?)
   (move-to-circle radius winkel (interpret-markup layout props mymark)))

#(define (move-to-circle-x radius winkel stencil delta)
   ;; stencil wird nach unten verschoben
   ;; winkel=0:  links ausgerichtet
   ;; winkel<>0: rechts ausgerichtet
   (let* ((mittel (mittel-punkt stencil))
          (mittel-x (car mittel))
          (mittel-y (cdr mittel))
          (kreis (kreis-punkt radius winkel))
          (kreis-x (car kreis))
          (kreis-y (cdr kreis)))
     (if (= winkel 0)
         (ly:stencil-translate stencil
           (cons
            (+ (* -2 mittel-x) delta)
            (* radius -1)))
         (ly:stencil-translate stencil
           (cons
            delta
            (* radius -1))))))

#(define QC-radius 30) %% Innen-Durchmesser des Quintenzirkels
#(define Abstand 1.45)  %% try what looks best
#(define ticker-len 1.07)
#(define outer-radius (* QC-radius Abstand))
#(define Dur-radius (* QC-radius 1.16))  %% try what looks best
#(define moll-radius (/ QC-radius 1.3)) %% try what looks best

#(define ticker-line
   (make-filled-box-stencil (cons -0.1 0.1)
     (cons (* -1 QC-radius ticker-len) (* QC-radius ticker-len))))

#(define-markup-command (move-markup-x layout props mymark radius winkel delta)
   (markup? number? number? number?)
   (move-to-circle-x radius winkel (interpret-markup layout props mymark) delta))

\markup {
  %% Score snippets
  \combine \move-markup \GDur #outer-radius #30
  \combine \move-markup \DDur #outer-radius #60
  \combine \move-markup \ADur #outer-radius #90
  \combine \move-markup \EDur #outer-radius #120
  \combine \move-markup \HDur #outer-radius #150
  \combine \move-markup-x \FisDur #outer-radius #180 #0.5
  \combine \move-markup-x \GesDur #outer-radius #0 #-0.5
  \combine \move-markup \DesDur #outer-radius #210
  \combine \move-markup \AsDur #outer-radius #240
  \combine \move-markup \EsDur #outer-radius #270
  \combine \move-markup \BDur #outer-radius #300
  \combine \move-markup \FDur #outer-radius #330
  %% ticker lines
  \combine \stencil \ticker-line
  \combine \stencil #(st-rot ticker-line 30)
  \combine \stencil #(st-rot ticker-line 60)
  \combine \stencil #(st-rot ticker-line 90)
  \combine \stencil #(st-rot ticker-line 120)
  \combine \stencil #(st-rot ticker-line 150)
  %% whiten the interior of the circle
  \with-color #white
  \combine \draw-circle #(/ QC-radius ticker-len) #0 ##t
  %% add major letters in blue
  \with-color #blue
  \abs-fontsize #22 \bold
  \combine \move-markup \circle "C" #Dur-radius #0
  \combine \move-markup "G" #Dur-radius #30
  \combine \move-markup "D" #Dur-radius #60
  \combine \move-markup "A" #Dur-radius #90
  \combine \move-markup "E" #Dur-radius #120
  \combine \move-markup "H" #Dur-radius #150
  \combine \move-markup "Ges/Fis" #Dur-radius #180
  \combine \move-markup "Des" #Dur-radius #210
  \combine \move-markup "As" #Dur-radius #240
  \combine \move-markup "Es" #Dur-radius #270
  \combine \move-markup "B" #Dur-radius #300
  \combine \move-markup "F" #Dur-radius #330
  %% add minor letters in red
  \with-color #red
  \combine \move-markup \circle "a" #moll-radius #0
  \combine \move-markup "e" #moll-radius #30
  \combine \move-markup "h" #moll-radius #60
  \combine \move-markup "fis" #moll-radius #90
  \combine \move-markup "cis" #moll-radius #120
  \combine \move-markup "gis" #moll-radius #150
  \combine \move-markup "es/dis" #moll-radius #180
  \combine \move-markup "b" #moll-radius #210
  \combine \move-markup "f" #moll-radius #240
  \combine \move-markup "c" #moll-radius #270
  \combine \move-markup "g" #moll-radius #300
  \combine \move-markup "d" #moll-radius #330
  \abs-fontsize #30
  \with-color #blue
  \combine \move-markup "Dur" #outer-radius #0
  \with-color #red
  \combine \move-markup "Moll" #(* moll-radius 0.6) #0
  \with-color #black
  \draw-circle #QC-radius #0.5 ##f

}
« Letzte Änderung: Montag, 1. August 2016, 06:24 von Manuela »

harm6

  • Member
Re: Quintenzirkel in Lilypond (kein Problem, nur ne Lösung ;-) )
« Antwort #1 am: Montag, 1. August 2016, 18:05 »
Hallo Manuela,

ich hab' gesehen Du hast den Code ins LSR gesetzt.
http://lsr.di.unimi.it/LSR/Item?u=1&id=1040
Nun bin ich einer derjenigen, die neue snippets abnicken können, insoweit ein paar Anmerkungen:

(1)
Falls etwas nicht funktioniert, bitte melde Dich.
Natürlich bin ich nicht immer verfügbar, also vorzugsweise auf der englischen mailing-ist ;)
In diesem Fall glaube ich, daß es zwischen 2.18.2 (der aktuellen stable) und 2.18.0 (der LSR-Version) eine Änderung gegeben hat wo man \layout angeben darf.
Nun habe ich 2.18.0 nicht mehr auf dem Rechner, aber mit 2.16.2 gibt folgendes exakt den Fehler aus den Du gesehen haben müßtest:
\score { \layout { } { c'1 } }
So klappt es aber:
\score { { c'1 } \layout { } }
Insoweit habe ich Deinen Code bereits korrigiert.

(2)
Zahlreiche erklärende Kommentare in den Code zu setzen, ist klasse.
Darf ich Dich trotzdem bitten das snippet nochmal so zu überarbeiten, daß die Kommentare alle in englisch sind?


Gruß und vielen Dank für das snippet,
  Harm

Manuela

  • Member
Re: Quintenzirkel in Lilypond (kein Problem, nur ne Lösung ;-) )
« Antwort #2 am: Montag, 1. August 2016, 20:41 »
ok mache ich  :) Update: erledigt

Ich hoffe, ich kann noch mehr beitragen.

« Letzte Änderung: Montag, 1. August 2016, 21:26 von Manuela »

harm6

  • Member
Re: Quintenzirkel in Lilypond (kein Problem, nur ne Lösung ;-) )
« Antwort #3 am: Montag, 1. August 2016, 22:39 »
Hab noch ein paar Verschönerungen unternommen - ist jetzt "approved" als
http://lsr.di.unimi.it/LSR/Item?id=1040

Ist
http://lsr.di.unimi.it/LSR/Item?u=1&id=1039
auch von Dir?

Gruß,
  Harm


harm6

  • Member
Re: Quintenzirkel in Lilypond (kein Problem, nur ne Lösung ;-) )
« Antwort #5 am: Dienstag, 2. August 2016, 08:33 »
"Changing the appearance of the number of Clef Modifier"
http://lsr.di.unimi.it/LSR/Item?id=1038
ist approved.
Ich habe den tag allerdings zu "Tweaks and overrides" geändert, hat ja nicht soviel mit "Contexts and engravers" zu tun ;)
Zur Erklärung: Die tags haben dann eine besondere Bedeutung, wenn das snippet zusätzlich mit einem doc-tag versehen wird, denn dann wird es (nach dem nächsten LSR-import) Teil der offiziellen Dokumentation (in Documentation/snippets) und wird dann ins entsprechende Kapitel eingeordnet.

Gruß,
  Harm

P.S.
Die anderen snippets schau ich mir später an. Ich erhole mich momentan von einer Operation und kann noch nicht länger am Computer arbeiten.
« Letzte Änderung: Dienstag, 2. August 2016, 10:57 von harm6 »

Manuela

  • Member
Re: Quintenzirkel in Lilypond (kein Problem, nur ne Lösung ;-) )
« Antwort #6 am: Dienstag, 2. August 2016, 09:00 »

Zur Erklärung: Die tags haben dann eine besondere Bedeutung, wenn das snippet zusätzlich mit einem doc-tag versehen wird, denn dann wird es (nach dem nächsten LSR-import) Teil der offiziellen Dokumentation (in Documentation/snippets) und wird dann ins entsprechende Kapitel eingeordnet.
Die anderen snippets schau ich mir später an. Ich erhole mich momentan von einer Operation und kann noch nicht länger am Computer arbeiten.

Werde ich mir ansehen und nach Möglichkeit einbauen.

Update: ich sehe gerade, die Möglichkeit, die Tags zu ändern, ist ausgegraut.

Ich habe dich bereits im Forum vermisst, gute Besserung!
« Letzte Änderung: Dienstag, 2. August 2016, 09:09 von Manuela »

fugenkomponist

  • Member
Re: Review Snippet 1037
« Antwort #7 am: Dienstag, 2. August 2016, 10:01 »
Ich kann ja mal meinen Senf zum Snippet 1037 geben ;)

1. Ich würde im Titel und im Snippet beide Male StaffGroup verwenden statt PianoStaff im Snippet. PianoStaff ist für so eine Anwendung doch eigentlich zu speziell.
2. Vielleicht kann man die Noten noch einfacher gestalten? Die haben ja eigentlich mit dem Snippet nichts zu tun; ne Variable brauchts da nicht, die verwirrt nur.
3. Es reicht a) den Engraver zu entfernen (und der heißt übrigens System_start_delimeter_engraver) oder b) Score.SystemStartBar und StaffGroup.SystemStartBracket per \omit zu entfernen. \omit setzt nur den stencil auf ##f, ich würde also eher zu a) tendieren. Trotzdem für beide Varianten mal der Code (auch Punkte 1 und 2 eingebaut):

a)
\version "2.19.46"

\layout {
  \context {
    \StaffGroup
    \remove System_start_delimiter_engraver
  }
  \context {
    \Score
    \remove System_start_delimiter_engraver
  }
}

\new StaffGroup <<
  \new Staff { a b a b }
  \new Staff { g a g a }
  \new Staff { b g b g }
>>

b)
\version "2.19.46"

\layout {
  \context {
    \StaffGroup
    \omit SystemStartBracket
  }
  \context {
    \Score
    \omit SystemStartBar
  }
}

\new StaffGroup <<
  \new Staff { a b a b }
  \new Staff { g a g a }
  \new Staff { b g b g }
>>
Bei b) könnte man theoretisch auch beide \omits in den \context-\Score-Block packen. Sauberer und fürs Verständnis besser ists aber eigentlich so.
4. Ach ja, Codeformatierung sollte möglichst vorbildlich sein, denke ich. Ob man << auf ne eigene Zeile setzt, ist jedem selbst überlassen, aber ich würd z. B. >> gleich einrücken wie \new. Und lieber vor \layout ne Leerzeile als danach ;)

Edit: Ich hab keine Ahnung, welche LilyPond-Version das LSR nutzt, vermutlich nicht 2.19 … aber obiger Code geht auch mit 2.18.2.
« Letzte Änderung: Dienstag, 2. August 2016, 10:07 von fugenkomponist »

harm6

  • Member
Re: Quintenzirkel in Lilypond (kein Problem, nur ne Lösung ;-) )
« Antwort #8 am: Dienstag, 2. August 2016, 10:49 »
Ich hab mir jetzt mal "StaffGroups without Brackets"
http://lsr.di.unimi.it/LSR/Item?u=1&id=1037
angesehen.

Die Zeile
\remove systemStartDelimiter
ist natürlich Quatsch, systemStartDelimiter ist ein context-property kein engraver. ;)

Du kannst den entsprechenden engraver raushauen oder die grobs selektiv angehen, geht beides.
Hier der Code mit ausführlichen Kommentaren:

\version "2.18.0"

scale = \relative c' {
  a4 b c d
  e4 f g a
}

%% System_start_delimiter_engraver is part of the following context(s):
%% ChoirStaff, GrandStaff, PianoStaff, Score and StaffGroup.

%% Either remove the engraver from the relevant contexts
\layout {
  \context {
    \Score
    %% don't print SystemStartBar
    \remove "System_start_delimiter_engraver"
  }
  \context {
    \PianoStaff
    %% don't print SystemStartBrace for PianoStaff
    %% SystemStartBrace is still printed for GrandStaff
    \remove "System_start_delimiter_engraver"
  }
}

%% Or do it more selectively by omitting the relevant grobs.
%
%\layout {
%  \context {
%    \Score
%    \omit SystemStartBar   
%  }
%  \context {
%    \PianoStaff
%    %% omitting SystemStartBrace here and not at Score-level is even more
%    %% selective (SystemStartBrace is still printed for GrandStaff)
%    \omit SystemStartBrace
%  }
%}
%

music =
  <<
   \new Staff { \scale \transpose c d \scale }
   \new Staff { \scale \transpose c e \scale }
   \new Staff { \scale \transpose c f \scale }
  >>

<<
  \new PianoStaff \music
   
  \new GrandStaff \music
>>
Welche Variante Du wählst bleibt erstmal Dir überlassen ;)
Ich würde beide nehmen und eine davon auskommentieren.

Natürlich sollte Titel/Beschreibung schon mit dem Code übereinstimmen, PianoStaff vs StaffGroup !

Ich hab schon mal einen link zu einem meiner snippets in die Beschreibung eingefügt...



Gruß,
  Harm

P.S. Hab erst jetzt gesehen, daß fugenkomponist bereits geantwortet hat.

Zitat von: fugenkomponist
2. Vielleicht kann man die Noten noch einfacher gestalten? Die haben ja eigentlich mit dem Snippet nichts zu tun; ne Variable brauchts da nicht, die verwirrt nur.

Da bin ich anderer Ansicht: All das nicht für den Kern des snippets nötige in Variablen zu packen find ich gut. Die kann man dann sonst wohin schieben.

Zitat von: fugenkomponist
Edit: Ich hab keine Ahnung, welche LilyPond-Version das LSR nutzt, vermutlich nicht 2.19 … aber obiger Code geht auch mit 2.18.2.
Siehe http://lsr.di.unimi.it/LSR/html/contributing.html, letzte Zeile.


« Letzte Änderung: Dienstag, 2. August 2016, 10:56 von harm6 »

harm6

  • Member
Re: Quintenzirkel in Lilypond (kein Problem, nur ne Lösung ;-) )
« Antwort #9 am: Dienstag, 2. August 2016, 10:53 »
Zitat von: Manuela
Update: ich sehe gerade, die Möglichkeit, die Tags zu ändern, ist ausgegraut.
Kann sein, daß Du keinen Zugriff mehr hast nachdem das snippet akzeptiert ist ...

Generel werden snippets mit doc-tag allerdings erheblich kritischer begutachtet sowohl was den Code angeht, als auch die Relevanz. ;)

Gruß,
  Harm

harm6

  • Member
Re: Quintenzirkel in Lilypond (kein Problem, nur ne Lösung ;-) )
« Antwort #10 am: Dienstag, 2. August 2016, 11:46 »
Ich hab mal
http://lsr.di.unimi.it/LSR/Item?u=1&id=1039
aufgehübscht, u.a. heißt es jetzt "Manipulating slurs via 'positions and 'extra-offset"

Falls Du damit einverstanden bist kann ich es dann durchwinken.


Gruß,
  Harm

Manuela

  • Member
Re: Quintenzirkel in Lilypond (kein Problem, nur ne Lösung ;-) )
« Antwort #11 am: Dienstag, 2. August 2016, 12:02 »
Falls Du damit einverstanden bist kann ich es dann durchwinken.


perfect  :)

Ich habe überhaupt nichts gegen Veränderungen/Verbesserungen  ;), außerdem ist das LSR pd
« Letzte Änderung: Dienstag, 2. August 2016, 12:13 von Manuela »

harm6

  • Member
Re: Quintenzirkel in Lilypond (kein Problem, nur ne Lösung ;-) )
« Antwort #12 am: Dienstag, 2. August 2016, 13:30 »
http://lsr.di.unimi.it/LSR/Item?u=1&id=1039 "Manipulating slurs via 'positions and 'extra-offset" ist dann approved.

Jetzt fehlt noch http://lsr.di.unimi.it/LSR/Item?u=1&id=1037 "StaffGroups without Brackets"
Da hatten fugenkomponist und meine Wenigkeit ja Vorschläge gemacht. Du kannst mir natürlich freie Hand lassen, aber ganz generell liegt die Verantwortung für ein snippet beim Ersteller.
Alle gemachten Vorschläge führen zu etwas größeren Änderungen, insoweit solltest Du Dich entscheiden und das snippet entsprechend verändern. Nicht triviale Änderungen eines snippets mache ich selbst nur dann, wenn es kaputt ist/geht oder das Coding bei weitem zu schlecht ist. Wann immer es geht aber in Absprache mit dem Autor (wenn dieser auffindbar ist, denn ich habe keinen Zugriff auf die mail-Adresse mit der der LSR-account eingerichtet wurde).

Gruß,
  Harm

Manuela

  • Member
Re: Quintenzirkel in Lilypond (kein Problem, nur ne Lösung ;-) )
« Antwort #13 am: Dienstag, 2. August 2016, 14:24 »

Jetzt fehlt noch http://lsr.di.unimi.it/LSR/Item?u=1&id=1037 "StaffGroups without Brackets"
Da hatten fugenkomponist und meine Wenigkeit ja Vorschläge gemacht. Du kannst mir natürlich freie Hand lassen, aber ganz generell liegt die Verantwortung für ein snippet beim Ersteller.

Ok ich habe jetzt mal deine Version eingestellt. Die 2. Variante zeigt aber geschwungene Klammern, zumindest im LSR, in Lilybin nicht. Witzig  ;)
« Letzte Änderung: Dienstag, 2. August 2016, 14:39 von Manuela »

harm6

  • Member
Re: Quintenzirkel in Lilypond (kein Problem, nur ne Lösung ;-) )
« Antwort #14 am: Dienstag, 2. August 2016, 14:50 »
Zitat von: Manuela
Ok ich habe jetzt mal deine Version eingestellt. Die 2. Variante zeigt aber geschwungene Klammern.

Ja, genau. Die SystemStartBrace ist für den PianoStaff ausgeschlossen wird aber für den GrandStaff gedruckt, deshalb der Kommentar:
    %% SystemStartBrace is still printed for GrandStaff

Offensichtlich sollte man das deutlicher machen. Wie wärs mit dem Code den ich jetzt verwendet habe?
http://lsr.di.unimi.it/LSR/Item?u=1&id=1037

Gruß,
  Harm