Autor Thema: Automatische Fingersätze?  (Gelesen 3102 mal)

ingmar

  • Member
Automatische Fingersätze?
« am: Montag, 25. Januar 2016, 20:13 »
Der Titel ist etwas provokant formuliert; es wäre sicher keine gute Idee, Fingersätze etwa für Streichinstrumente wirklich automatisch zu setzen. Aber aus einem bestimmten Grund suche ich eine Möglichkeit, bestimmte absolute (!) Tonhöhen zu markieren. Ich möchte also beispielsweise an jedes a, ein ^0 anhängen, so dass diese Tonhöhen in der Partitur markiert sind.

Ich hab das jetzt erstmal in Frescobaldi probiert, indem ich die Tonhöhen in absolute umgewandelt habe und die Dauern in ausdrückliche, dann im Editor Suche und Ersetze. Wegen der vielen möglichen Tonlängen (a,\breve - a,1. - a,1 - a2. - a,2 - ...) ist das aber mühsam, auch wenn es mir reichen würde, das für Dauern >= 2 zu machen, und Bindungen ganz zu ignorieren. Man müsste einen regulären Ausdruck verwenden. Leider finde ich keine Doku der RegEx-Dialekts, den Frescobaldi einsetzt.

Ich sollte noch hinzusagen: Ich brauche das nur als temporäre Arbeitserleichterung. Die Lösung muss überhaupt nicht schön sein, und ihr solltet auch nicht viel Zeit reinstecken, das wär die Sache nicht wert.


Danke für jeden Hinweis. : - )
--ingmar


fugenkomponist

  • Member
Re: Automatische Fingersätze?
« Antwort #1 am: Montag, 25. Januar 2016, 22:02 »
Hier eine Musikfunktion, die hoffentlich genau das tut, was sie soll ;)

Das ändert tatsächlich nur die Partitur, nicht die Noteneingabe, was für eine temporäre Lösung vermutlich sinnvoller und weniger aufwendig ist. Und es funktioniert mit allen Notenlängen

\version "2.19.35"
\language "deutsch"

leeresaiten =
#(define-music-function (music) (ly:music?)
   (music-map
    (lambda (m)
      (if (and
           (music-is-of-type? m 'note-event)
           (equal? (ly:music-property m 'pitch)
                   (ly:make-pitch -1 5)))
          (begin
           (ly:music-set-property! m 'articulations
             (cons
              (make-music 'FingeringEvent 'digit 0)
              (ly:music-property m 'articulations)))
           m)
          m))
    music))

\leeresaiten \relative {
  d' a c e
  a gis e c
  as a a2
}

\leeresaiten <<
  \new Staff \relative {
    c'1 a
  }
  \new Staff \relative {
    a f
  }
>>

ingmar

  • Member
re: Automatische Fingersätze?
« Antwort #2 am: Sonntag, 31. Januar 2016, 19:19 »
Ja, das scheint der richtige Weg zu sein; danke.

Allerdings hab ich bisher nur 2.18.2 installiert, wo es nicht läuft ("Wrong number of arguments to #<procedure #f (music)>"). Ich denke, ich werde mir erstmal so behelfen.

Gruß,
--ingmar

fugenkomponist

  • Member
Re: re: Automatische Fingersätze?
« Antwort #3 am: Sonntag, 31. Januar 2016, 20:26 »
Allerdings hab ich bisher nur 2.18.2 installiert, wo es nicht läuft ("Wrong number of arguments to #<procedure #f (music)>").
Ersetze die 5. Zeile durch#(define-music-function (parser location music) (ly:music?)(und natürlich die 1. Zeile durch die richtige Version), dann gehts auch mit 2.18.2. Deshalb bitte immer die verwendete LilyPond-Version angeben ;)

Edit: Ach ja, falls die Frage noch aufkommt: Das ganze geht für mehrere Töne, indem du Zeilen 10 und 11 ersetzt durch           (member (ly:music-property m 'pitch)
                   (list #{a#} #{gis'#})))
« Letzte Änderung: Sonntag, 31. Januar 2016, 20:32 von fugenkomponist »

barrio

  • Member
Re: Automatische Fingersätze?
« Antwort #4 am: Sonntag, 28. Februar 2016, 14:00 »
Ich bin noch Lilyn00b und versuche ein bischen mit Scheme zu experimentieren. Die Funktion kann ich bis auf eines nachvollziehen: Woher weiß ich, dass man an ly:music-set-property als val ein pair aus Wert & Typ übergeben muss? Die IR sagt dazu lapidar:

Zitat
Function: ly:music-set-property! mus sym val

    Set property sym in music expression mus to val.
Und mit \displayMusic sehe ich als Wert von articulations eine Liste:
'NoteEvent
          'articulations
          (list (make-music
                  'FingeringEvent
                  'digit
                  1))

fugenkomponist

  • Member
Re: Automatische Fingersätze?
« Antwort #5 am: Sonntag, 28. Februar 2016, 14:05 »
Woher weiß ich, dass man an ly:music-set-property als val ein pair aus Wert & Typ übergeben muss? Die IR sagt dazu lapidar:

Zitat
Function: ly:music-set-property! mus sym val

    Set property sym in music expression mus to val.
Meinst du, warum ich per cons hier ein Paar baue?
           (ly:music-set-property! m 'articulations
             (cons
              (make-music 'FingeringEvent 'digit 0)
              (ly:music-property m 'articulations)))
• mus ist hier m.
• sym ist 'articulations.
• val ist (cons (make-music 'FingeringEvent 'digit 0) (ly:music-property m 'articulations)). Ich hänge hier also das FingeringEvent an die evtl. schon vorhandene Liste 'articulations dran; ich will ja nicht andere Artikulationen verlieren. ly:music-property gibt '() zurück, wenn die Liste noch gar nicht existiert (also noch keine Artikulationen da sind), d. h. diesen Fall brauche ich nicht extra zu behandeln.

barrio

  • Member
Re: Automatische Fingersätze?
« Antwort #6 am: Sonntag, 28. Februar 2016, 15:01 »
Danke für die schnelle Antwort, soweit war es mir schon klar. Ich stehe leider dennoch etwas auf der Leitung: Wieso führt die Übergabe der neuen Property und der evtl. bereits vorhandenen Liste von Properties als Pair dazu, dass die neue Property an die vorhandene Liste angehängt wird?

fugenkomponist

  • Member
Re: Automatische Fingersätze?
« Antwort #7 am: Sonntag, 28. Februar 2016, 15:24 »
Eine Liste ist nichts anderes als ein Paar aus erstem Element und Restliste.

'(1 5 8 7 3) ist also das gleiche wie '(1 . (5 8 7 3)) oder auch '(1 . (5 . (8 . (7 . (3 . ()))))). Bzw. eben (cons 1 '(5 8 7 3)) oder auch (cons 1 (cons 5 (cons 8 (cons 7 (cons 3 '()))))).

In unserem Fall mach ich also folgendes: Ich hole eine Liste mit Artikulationen (die evtl. leer ist) '(a b c d) und hänge per cons vorne den Fingersatz 'f dran, so ergibt sich (cons 'f '(a b c d)) bzw. '(f a b c d). (Ich hab hier mal mit Symbolen 'a bis 'f gearbeitet, tatsächlich hast du ja aber dann andere Werte.)
« Letzte Änderung: Sonntag, 28. Februar 2016, 15:26 von fugenkomponist »

barrio

  • Member
Re: Automatische Fingersätze?
« Antwort #8 am: Sonntag, 28. Februar 2016, 15:30 »
Ja, danke. Jetzt hat es klick gemacht, da merkt man wieder meine Defizite in elementaren Scheme Grundlagen... Sollte ich mal angehen. Das man eine Liste als Pair aus erstem und Restelementen auffassen kann, hatte ich schon wieder vergessen.

iugin

  • Member
Re: Automatische Fingersätze?
« Antwort #9 am: Montag, 29. Februar 2016, 20:28 »
Hallo Ingmar

wenn ich dich richtig verstehe, möchtest du das im Code ändern.
Ein Regex wäre:
Suchen
(a[!1-9.,'()\[\]~]*) ()Ersetzen
\1^0 Das funktioniert im Frescobaldi (du kannst weitere Zeichen hinfügen, ich weiss nicht, ob ich alle genommen habe).
Das Problem ist, dass auch einzelne 'a's in Lyrics erstezt werden.
Achtung: vor dem (a und vor dem \1 gibt es ein Leerschlag.

Lieber Gruss

Eugenio
« Letzte Änderung: Montag, 29. Februar 2016, 22:47 von iugin »