Fingersatz und XML-Import

Begonnen von Hilflos-im-Code, Montag, 27. Januar 2020, 10:47

« vorheriges - nächstes »

Hilflos-im-Code

Wenn ich XML-Dateien importiere erhalte ich bei Intervallen und Akkorden mit Fingersätzen:
{<g a> -2 -0}
{< g -2 a  -0> }

Kennt jemand einen simplen Trick, wie man das Umpositionieren der Fingersatzzahlen automatisieren kann?

Hilflos-im-Code

Ich habe die das Posting schlecht formuliert.

Der XML erzeugt {<g a> -2 -0}

Das Ergebnis muss zu {< g -2 a  -0> }

umgeformt werden.

Kann man das automatisieren? Ich gehe davon aus, dass es nicht mit Lilypond passieren kann, sondern mit einem fähigen Texteditor und regulären Ausdrücken. Kennt jemand so etwas, der Ersetzenmodus von frescobaldi hilft trotz regulärer Ausdrücke nicht weiter.

Arnold

Hallo,

wenn ich es unbedingt bräuchte, würde ich als »externe« Programmiersprache wohl C benutzen,
aber der Aufwand wäre erheblich:

  • Kommentare und Zeichenketten ausklammern
  • in Tockens einteilen (Start-Akkord, Ende-Akkord, Pitch-Names, Artikulaion, ...)
  • umsortieren und ausgeben

Aber, mit \musicMap sollte es auch im Lilypond möglich sein!
Das erste Argument von \musicMap ist eine selbst definierte Bearbeitungsfunktion, welche als Parameter ein ly:music?-Element übergeben bekommt, und (das gegebenenfalls bearbeitete) zurückgibt.
Das zweite Argument von \musicMap ist die zu bearbeitende Musik (auch ly:music?)
Wenn ein »EventChord« von dieser SCHEME-Funktion gesichtet wird, dann muß dieses also bearbeitet werden (bzw. eine abgeänderte Kopie erstellt werden), bei allen anderen Events wird das Original zurückgegeben.
Die Akkord-globale Liste der Artikulationen muß durchgegangen werden. Jede Fingerbezeichnung wird aus dieser Akkord-globalen Liste entfernt und statt dessen als Artikulation an den soundsovielten (durchgezählten) Pitch angehängt.

Leider wird es bei mir aber einige Zeit dauern bis ich Zeit finde, eine solches Beispiel zu programmieren. Ich kann Dir leider nicht auf die Schnelle helfen - außer das Prinzip aufzuzeigen.

Arnold

Arnold

Hallo,

ein privater Termin fiel aus, da hab' ich gleich die Zeit genutzt:
\version "2.19.83"

Musik = {
  <c' d'-.>2 -1 -2 -5 -7
  % <c'' -1 e'' -2 >
  <c' d' g'>2 -1 -> -2 -3 \f -- \trill
  % <c'' -1 e'' -2 >->\f--\trill
}

#(define (MoveFingeringIntoChords mus)
  (let ((eventtype (ly:music-property mus 'name)))
   (if (eq? eventtype 'EventChord)
    (let ((nes '())
          (index 0))
     ;;; (display "\n EventChord gefunden.\n")
     (for-each (lambda (ce)
       (let ((etype (ly:music-property ce 'name)))
        ;;; (for-each display (list "\n Typ = " etype "\n"))
        (if (eq? etype 'FingeringEvent)
         (let ((find-no 0)
               (dest-found #f))
          ;;; (for-each display (list "\n move FingeringEvent into " (1+ index) ". Note of Chord\n"))
          (for-each (lambda (dn)
            (let ((dtype (ly:music-property dn 'name)))
             (if (eq? dtype 'NoteEvent)
              (begin
               (if (equal? index find-no)
                (begin
                 ;;; (display "  Aktion!\n")
                 (ly:music-set-property! dn 'articulations
                  (cons ce (ly:music-property dn 'articulations '())))
                 (set! dest-found #t))
                ;;; (display "  keine Aktion.\n")
               )
               (set! find-no (1+ find-no)))))) nes)
          (if (not dest-found)
           (ly:warning
            "more fingerings found than notes in chord at ~a / ~a"
            (ly:music-property mus 'origin)
            (ly:music-property ce 'origin)))
          (set! index (1+ index)))
         (set! nes (append nes (cons ce '())))
      ))) (ly:music-property mus 'elements))
     (ly:music-set-property! mus 'elements nes))) mus))

% \displayMusic
{ \Musik }

\musicMap #MoveFingeringIntoChords \Musik

Ist zwar alles andere als elegant programmiert, doch seinen Zweck hat es erfüllt.
Die (durch vorangestlltes »;«) auskommentierten display-Anweisungen zeigen grob die Bearbeitungsschritte an.

P.S. Ich habe die Version 2.19.83 benutzt.

Arnold

Hilflos-im-Code

Hallo Arnold,

leider habe ich hier zu spät reingeschaut.

Zu erst vielen, vielen Dank für deine Mühe.

Warum habe ich zu spät geschaut. Das Problem vernünftig zu "programmieren" dürfte schwer sein, denn es gibt zu viele Varianten, was da an Fingersatzangaben steht. Z.B. funktioniert dein System schon nicht mehr, wenn die mittlere Note keine Fingersatzzahl bekommt, oder je nach Quelle stehen die Fingersatzzahlen in der gleichen Reihenfolge. Also jeder XML-produzierende-Vorgang hat seine eigene Endsyntax in der Lilyponddatei. Das System wird noch komplexer, weil wir Gitarristen auch die rechte Hand dranschreiben (\rightHandFinger #2) Wenn dein Ansatz falsche Ergebnisse produziert, wie bessert man die nach?

Deswegen bin auf den Texteditor gekommen.  80 Prozent treffen, den Rest händisch nachbessern. Der Lilypondquelltext muss änderbar bleiben, falls der Mechanismus versagt.

Vielen Dank, aber bitte für mich nicht weiter machen.

Arnold

Kein Problem,

ich wollte im wesentlichen die Methode aufzeigen, wie so etwas geht, unter der Annahme, daß

  • es gleichviele Fingerangaben sind wie Noten im Akkord
  • die Fingerangaben auch in der gleichen Reihenfolge wie die Noten im Akkord angegeben sind

Denkbar wäre z. Bsp. eine Erweiterung, daß »Finger Nr. 9« (oder andere Zahl) als Platzhalter »diese Note nicht mit Fingersatz belegen« behandelt wird.
Fingersätze, die schon innerhalb des Akkords angegeben sind, werden ja nicht angefasst - das wäre für die (restlichen) Korrekturen geeignet.

Aber, deine Erfahrungsbeschreibung klingt so, als wäre ein »Expertensystem« bzw. eine »künstliche Intelligenz« das Mittel der Wahl,
und da kann ich sowieso nicht mehr weiterhelfen.
Außerdem ist die Anlernzeit für solche Syteme nicht zu unterschätzen.

Arnold

P.S. Ich habe schon einmal einen Gitarristen gesehen, der eine Saite mit dem kleinen Finger angezupft hat - mit dem kleinen Finger der linken Hand, während die anderen Finger die Saiten abgriffen.

Hilflos-im-Code

Zitat von: Arnold am Mittwoch, 29. Januar 2020, 16:38

P.S. Ich habe schon einmal einen Gitarristen gesehen, der eine Saite mit dem kleinen Finger angezupft hat - mit dem kleinen Finger der linken Hand, während die anderen Finger die Saiten abgriffen.
Nennt sich Abzugsbindung und ist vollkommen normal. Wird wie folgt notiert:
{ b ( a ) }
Falls Du jetzt an Legato denkst, das nennt sich auch Legatotechnik. Dazu gehören auch Aufschlagbindungen. Finger klopft so stark auf das Griffbrett, sodass ein Ton entsteht.