middleCClefPosition

Begonnen von erich, Donnerstag, 24. August 2017, 09:42

« vorheriges - nächstes »

erich

Hallo allen

Aus
\displayMusic{\clef "treble" \clef "bass" }
glaub ich erkennen zu können, dass  'middleCClefPosition von -6 auf 6 geändert wird.

Ich möchte in abhängigkeit vom aktuellen Wert von  'middleCClefPosition weiter Funktionen steuern.
Wie kann ich den aktuellen Wert auslesen?

Gruß
Erich

Arnold

Hallo Erich,

in welcher »Stufe der Verarbeitung« würdest Du denn den Wert gerne auswerten?

Aus den »Internals« lese ich, daß middleCClefPosition ein Context-Property des Staff (und seiner Varianten) ist, welches vom Clef-Engraver ausgewertet wird.
Ergo, kannst Du den aktuellen Wert in der Engraving-Phase (wenn die definierte Musik-Scheme-Struktur "abgespielt" [interpretiert] wird, und die Takt-Fortschrittsanzeige am Bildschirm erscheint) durch einen selbstdefinierten Engraver auswerten und darin Funktionen starten.

Nach dem "engraving" kommen noch "before line breaking", das Line Breaking selbst, und das "after line breaking".
An den beiden durch Unterstreichung markierten Punken kann man auch nochmal ein Scheme-Programm anhängen, um die entstandenen Grafikobjekte (GROBs) zu verändern (meistens, um sie eventuell zu löschen).

Arnold

erich

Hallo Arnold, danke für Deine Antwort

Der Programmentwurf ist
\version "2.19.52"
\include "dodecapitchnames.ly"
\include "dashedstaffsymbollines.ly"


"|" = {\once \override Staff.BarLine.bar-extent = #'(-1 . 3) \bar "|"}

#(define (liste-unten num )
  (cond ((eq? num 0) (list -2 2 6))
        ((eq? num 1) (list -6 -2 2 6))
        ((eq? num 2) (list -10 -6 -2 2 6))
        ((eq? num 3) (list -14 -10 -6 -2 2 6))
        (else (list -22 -18 -14 -10 -6 -2 2 6))))

#(define (liste-oben num liste)
   (cond ((eq? num 0) liste)
         ((eq? num 1) (append '(10) liste))         
         ((eq? num 2) (append '(14) (append '(10) liste)))
         ((eq? num 3) (append '(18) (append '(14) (append '(10) liste))))   
         ((eq? num 4) (append '(22) (append '(18) (append '(14) (append '(10) liste)))))
         (else  (append '(22) (append '(18) (append '(14) (append '(10) (append '(6) liste))))))
    ))

#(define (bool-liste-unten num )
  (cond ((eq? num 0) (list #f #f #f))
        ((eq? num 1) (list #t #f #f #f))
        ((eq? num 2) (list #t #t #f #f #f))
        ((eq? num 3) (list #t #t #t #f #f #f))
        (else (list #f #f #t #t #t #f #f #f))))

#(define (bool-liste-oben num liste)
   (cond ((eq? num 0) liste)
         ((eq? num 1) (append '(#t) liste))         
         ((eq? num 2) (append '(#t) (append '(#t) liste)))
         ((eq? num 3) (append '(#t) (append '(#t) (append '(#t) liste))))   
         ((eq? num 4) (append '(#f) (append '(#t) (append '(#t) (append '(#t) liste)))))
         (else  (append '(#f) (append '(#f) (append '(#t) (append '(#t) (append '(#t) liste))))))
    ))

pz =
#(define-music-function (unten oben) (number? number?)
   
(let* ((liste (reverse (liste-oben oben (reverse (liste-unten unten)))))
       (bool-liste (reverse (bool-liste-oben oben (reverse (bool-liste-unten unten))))))
#{
  \stopStaff
  \override Staff.StaffSymbol.line-positions = #liste
  \dashedStaffSymbolLines #'(0.7 . 0.76) #bool-liste
  \startStaff
#}))

pzu =
#(define-music-function (unten) (number?)
   #{\pz #unten 0 #})
pzo =
#(define-music-function (oben) (number?)
   #{\pz 0 #oben #})
pzz =
#(define-music-function () ()
   #{\pz 0 0 #})

{\pzu1c'1 \pzz e' \pzo2 e'''}

Den Output dazu habe ich angehängt

Der Schlüssel wird später ein anderer sein. Die cond-Anweisungen sollen später durch Rekursionen ersetzt werden.

Ich möchte dieselben Funktionen im Bassschlüssel verwenden können; dazu müsste ich abfragen können, in welchem Schlüssel ich mich gerade befinde.
Gruß
Erich

Arnold

Hallo Erich.

Aktuell bearbeitest du Music-Snippets mit deinen Funktionen.
Da man nie weiß, wie diese Musikschnipsel für die Partitur eingesetzt werden, hat man hier noch keine Information über den Schlüssel.
Natürlich könntest du eine Music-Function schreiben, welche eine Sequentielle Musik der Reihe nach durchsieht und sich die Änderungen der Schlüssel gemäß Struturaufbau merkt. Solch eine Funktion wäre dann am besten "an der obersten Ebene" zu platzieren, wenn diese dann auch Simultane Musik und Notenzeilenanfänge (\new Staff) erkennt und entsprechend behandelt.
\score {
  \ApplyPzValues \new GrandStaff <<
    \new Staff { ... \pzu ... \pzo ... \pzz ... }
    \new Staff { ... }
  >>
}

Kompliziert kann es werden, wenn deine \pz* nur in einer von mehreren parallelen Stimmen vorkommen (der clef-change in der anderen), wenn ein neuer Staff erscheint welcher nicht explizit mit \new Staff deklariert wurde, ...

Die andere (elegantere) Methode wäre die Engraver-Lösung.
Dann muß dein Engraver erkennen, wann er die Aktionen, welche sonst von »\stopStaff, \override Staff.StaffSybol.line-positions, \dashedStaffSymbolLines, \startStaff« ausgelöst werden, selbst auslösen muß.
Das wäre auch für mich noch einiges Neuland in Lilypond, so daß ich dir dabei wenig helfen kann.

Vielleicht können auch die Attributwerte #liste und #bool-liste per Callback verzögert ermittelt werden, also nicht beim Erstellen der Musik-Snippets, sondern erst beim Engraver-Run. Auch dafür bin ich kein Experte, closure könnte aber das nötige Schlüsselwort sein.

Mit \applyContext kann man auch Kontextattribute in der Engraving-Phase abfragen und ändern. Ob deine Anforderung hiermit lösbar wäre, vor allem wenn zeitgleich der Schlüssel geändert werden sollte, kann ich nicht sagen.

Arnold

Arnold

Hallo Erich,

übers Wochenende habe ich noch ein wenig über dein Problem nachgedacht.

Am ehesten ans Ziel zu kommen sollte man mit der Folge »\stopStaff \applyContext ... \startStaff«.
\applyContext erwartet genau einen Aufrufparameter, eine SCHEME-Prozedur.
Diese SCHEME-Pordezur hat wiederum genau einen Aufrufparameter, den "Context" in welchem \applyContext aufgerufen wird (also grundätzlich der Voice-Context, der unterste Context).

Ich würde mich so herantasten, indem ich zuerst die Prozedur entwickle, welche den darüberliegenden Staff-Context sucht.
Dann im Staff-Context die betroffenen Attribute sucht und den aktuellen Inhalt am Bildschirm anzeigt.
Als nächstes nur eine einzige Modifikation durchführen.
Und zum Schluß die Übergabe weiterer Aufrufparameter an die SCHEME-Prozedur in \applyContext - z. Bsp. mittels #(lambda (cntx) (my-pz-apply-context-proc param-up param-down cntx)); dazu habe ich als Alternative aber auch schon eine Prozedurdeklaration in der Form #(define ((my-pz-apply-context-proc param-up param-down) cntx) ... ) gesehen.

Arnold

harm6

Hallo Arnold,

Zitat von: ArnoldAm ehesten ans Ziel zu kommen sollte man mit der Folge »\stopStaff \applyContext ... \startStaff«.
\applyContext erwartet genau einen Aufrufparameter, eine SCHEME-Prozedur.
Diese SCHEME-Pordezur hat wiederum genau einen Aufrufparameter, den "Context" in welchem \applyContext aufgerufen wird (also grundätzlich der Voice-Context, der unterste Context).

Es geht auch:
{ r1 \context Staff \applyContext #(lambda (ctx) (display ctx)) }
-> #<Context Staff=\new (#<Context Voice () >) >

ZitatIch würde mich so herantasten, indem ich zuerst die Prozedur entwickle, welche den darüberliegenden Staff-Context sucht.
Dann im Staff-Context die betroffenen Attribute sucht und den aktuellen Inhalt am Bildschirm anzeigt.

ly:context-property-where-defined geht ebenfalls.

ZitatAls nächstes nur eine einzige Modifikation durchführen.

Wird man in applyContext wohl mit ly:context-pushpop-property machen müssen.

Gruß,
  Harm


erich

Hallo Arnold, hallo harm

vielen vielen Dank für eure Mühe!

LilyPond ist doch viel besser als gedacht mal wieder; ich habe eine ganz einfache Lösung für mein Problem gefunden:

ich verwende \clef "G_13" und alles wird gut.

Ich habe nun einen 1. Entwurf meiner alternativen Musiknotation Preetzise unter
https://meyerich.pythonanywhere.com/Preetzise
veröffentlich zusammen mit einem umfangreichen Anwendungsbeispiel.
Vielleicht ist es mir ja gelungen, einige der vorgebrachten Einwende zu entkräften.

Gruß
Erich

Malte

Zitat von: erich am Dienstag, 29. August 2017, 10:12
Ich habe nun einen 1. Entwurf meiner alternativen Musiknotation Preetzise unter
https://meyerich.pythonanywhere.com/Preetzise
veröffentlich zusammen mit einem umfangreichen Anwendungsbeispiel.
Vielleicht ist es mir ja gelungen, einige der vorgebrachten Einwende zu entkräften.
Off-topic: Sollen wir nun selbst herausfinden, um welche Einwände es gehen könnte und wie die entkräftet worden sein sollen? Ehrlich gesagt hab ich schon so viel darüber gelesen, daß ich mich nicht noch einmal durch den Text arbeiten will; falls du neue, gute Argumente anbringen kannst, schau ich mir die nochmal an, ansonsten bin ich jetzt raus.

Ich finde die Umsetzung in LilyPond übrigens noch nicht wirklich gelungen:
1. Noten in deinem System sind nicht ins traditionelle umwandelbar und andersherum. Das trägt nicht gerade dazu bei, daß das System von anderen wie mir ausprobiert wird.
2. Es ist meiner Meinung nach wahnsinnig unübersichtlich, siehe Anhang. Das liegt allerdings auch am System, nicht nur an der Umsetzung.

erich

Hallo Malte,

ich bin ausführlicher auf Deine Einwende eingegangen.
siehe: https://meyerich.pythonanywhere.com/Preetzise
unter dem Absatz vorgebrachte Einwende

Ich habe die traditionelle Notendarstellung des Ausschnitts, den Du gewählt hattest, wie sie unter
http://www.klangreihenmusik.at/skriptum-erinnerung-an-windhaag-08.php3
verwendet wurde der meinigen gegenübergestellt.

Vielen Dank für Dein Interesse
Gruß
Erich

Malte

#9
Zitat von: erich am Mittwoch, 30. August 2017, 09:49
ich bin ausführlicher auf Deine Einwende eingegangen.
siehe: https://meyerich.pythonanywhere.com/Preetzise
unter dem Absatz vorgebrachte Einwende
Du bist ja witzig, zitierst meinen Hinweis auf den Anhang, verwendest in deiner Entgegnung aber ein ganz anderes Beispiel ohne irgendeinen Hinweis darauf, daß das nicht das Bild ist, worauf ich mich bezogen habe. Übrigens find ich das auch nicht wesentlich besser: es zeigt, daß ein Schlüssel mit kleinen Oktavierungszeichen nicht ausreichend ist, um schnell zu erkennen, in welcher Oktave man sich bewegt. Und es hilft nicht unbedingt, daß mit E_13 plötzlich nicht mehr die eingestrichene, sondern die kleine Oktave durchgezogene Linien hat.

Und ich erinnere an Auszüge der letzten paar Posts:
Zitat von: erichVielleicht ist es mir ja gelungen, einige der vorgebrachten Einwende zu entkräften.
Zitat von: MalteSollen wir nun selbst herausfinden, um welche Einwände es gehen könnte und wie die entkräftet worden sein sollen?
[später im Post zwei neue Einwände]
Zitat von: erichich bin ausführlicher auf Deine Einwende eingegangen.
Ja, auf die neuen, nicht auf die alten.

Ich möchte dir nicht zu nahe treten, aber deine Argumentationsweise, die an diesen beiden Beispielen ersichtlich wird, hilft nicht gerade, zu überzeugen. Ich probiere dennoch, weiter offen für neue (!) Argumente zu bleiben, falls noch welche kommen. Aber mich quasi unkorrekt zu zitieren find ich schon stark ...

Edit: Und zu deiner Antwort auf meinen ersten Einwand: Du hast natürlich Recht mit der Eingabe der Notennamen; ich bezog mich aber darauf, daß Noten, die einmal mit cd als cis/des eingegeben wurden, die enharmonische Bedeutung verlieren, also in traditioneller Notation nicht ohne manuelles Eingreifen auf eines der beiden festgelegt werden können. Und darauf, daß du Befehle hast, die den Bereich der Noten-/Hilfslinien ändern. Diese sind in traditioneller Notation erst mal nicht vorhanden, müßten also extra eingefügt werden.

Übrigens find ich es ziemlich unbequem, daß du auf meine Argumente hier auf deiner Homepage antwortest statt hier. Der Kontext geht dadurch leicht verloren. Und der Mehrwert ist mir nicht klar.

trulli

Zitat von: erich am Mittwoch, 30. August 2017, 09:49
ich bin ausführlicher auf Deine Einwende eingegangen.
siehe: https://meyerich.pythonanywhere.com/Preetzise
unter dem Absatz vorgebrachte Einwende

Über die Ausführung "Malte" aus dem "Deutschsprachigen Lilypondforum" ist eine eindeutige Zuordnung möglich. Mich würde erstmal interessieren, ob Malte dem zugestimmt hat.

LG Trulli

Malte

Das habe ich nicht explizit, allerdings ist zu bedenken, daß meine Äußerungen – wie alle Beiträge in diesem Forum – öffentlich sind. An dem Zitat stört mich nicht das Daß, sondern das Wie (einen wesentlichen Teil – den Anhang – weggelassen und später durch etwas anderes ersetzt) und ein bißchen das Wo (schließlich ist eine Diskussion nur schwer möglich, wenn ich hier schreibe und erich da, außerdem wird kaum ein anderer Leser der Seite dem Link hierher folgen und den gesamten Kontext herausfinden).

Eine eindeutige Zuordnung ist natürlich möglich, da erich – korrekterweise – einen Link gesetzt hat. Für das Zitat an sich ist dann aber eigentlich mein Name irrelevant.

trulli

Na ja, die Bilder sind nur für Mitglieder einsehbar und damit nicht öffentlich zugänglich. Das kann für die Nachvollziehbarkeit schon wichtig sein.

Mir ging es aber mehr um den menschlichen Anstand, als um rechtliche Fragen. Wenn man jemanden zitiert, den man kennt (und sei es aus einem Forum), dann sollte man vorher fragen.

LG von Trulli

Malte

Zitat von: trulli am Mittwoch, 30. August 2017, 19:45
Na ja, die Bilder sind nur für Mitglieder einsehbar und damit nicht öffentlich zugänglich. Das kann für die Nachvollziehbarkeit schon wichtig sein.
Stimmt, das hab ich nicht bedacht. Allerdings stellt mein Bild nur einen Teil-Screenshot seines Artikels da, die Rechte daran hätte er also auf jeden Fall. Das macht aber natürlich die oben beschriebene Nachvollziehbarkeit per ,,Link folgen und Originalpost lesen" unmöglich.
Zitat
Mir ging es aber mehr um den menschlichen Anstand, als um rechtliche Fragen. Wenn man jemanden zitiert, den man kennt (und sei es aus einem Forum), dann sollte man vorher fragen.
Jo, ich versteh deinen Einwand, wär natürlich nett gewesen, aber das war jetzt meine kleinste Sorge ;)

erich

#14
Hallo allen,

wenn ich hier meine Internetseite angebe, dann nicht um etwas zu erschweren; ich habe nichts gegen, wenn etwas daraus zitiert wird.

@Malte
ZitatDu bist ja witzig, zitierst meinen Hinweis auf den Anhang, verwendest in deiner Entgegnung aber ein ganz anderes Beispiel ohne irgendeinen Hinweis darauf,

Es ist fast das identische Beispiel bis auf eine Note , die ich falsch übertragen hatte. Wenn das zwischen uns geklärt ist, hab ich nichts dagegen, den Beitrag hier zu veröffentlichen. Ich hatte den anderen Weg nur gewählt, weil ich auch noch anderen im vollen Zusammenhang Deine Einwende zur Kenntnis geben wollte.
ZitatÜbrigens find ich das auch nicht wesentlich besser: es zeigt, daß ein Schlüssel mit kleinen Oktavierungszeichen nicht ausreichend ist, um schnell zu erkennen, in welcher Oktave man sich bewegt.
Das war mir auch aufgefallen, ich wollte aber nicht mithilfe von Inkscape die LiliPond-Ausgabe verändern. Es ist also nicht mein Design! Anscheinend hat sich bisher noch niemand daran gestoßen.

ZitatUnd es hilft nicht unbedingt, daß mit E_13 plötzlich nicht mehr die eingestrichene, sondern die kleine Oktave durchgezogene Linien hat.

Das kann man handhaben, wie man will; meine Begründung ist, dass der Schlüssen unwichtig sein soll, sondern dass man nur auf das Oktavierungszeichen unter dem Schlüssel zu achten hat.

@Trulli
ZitatMir ging es aber mehr um den menschlichen Anstand, als um rechtliche Fragen. Wenn man jemanden zitiert, den man kennt (und sei es aus einem Forum), dann sollte man vorher fragen.

Das ist mir so aus dem wissenschaftlichen Bereich nicht geläufig. Ich hatte in Klammern [Malte]  nach dem Wort Ich eingefügt, da man sonst hätte meinen können, ich zitierte mich selbst. Im Zusammenhang mit dem Link konnte so klar werden, wo das Zitat zu finden ist.

Gruß
Erich