Autor Thema: "Haltestrich"  (Gelesen 3657 mal)

chf

  • Member
"Haltestrich"
« am: Samstag, 29. März 2014, 17:37 »
Liebe Freunde,

der Komponist schreibt dazu, dass die Noten mit Strich gehaltenen Tönen entsprechen und dass "raumentsprechend, der Grafik etwa folgend" interpretiert werden soll.
Ich habe versucht, das darzustellen, allerdings müssen die Striche in  Höhe der Noten erscheinen und den Abständen angepasst werden.
Wie geht das? Gibt es vielleicht eine andere Art der Notation?

Gruß
chf

harm6

  • Member
Re: "Haltestrich"
« Antwort #1 am: Samstag, 29. März 2014, 18:20 »
Hallo Christa,

ich hab erst kürzlich an space-notation gearbeitet.
Am besten wäre es ein neues grob einzuführen, aber bis das geschieht muß man einen Spanner wie das Glissando umfunktionieren.
Das hat den Nachteil, daß ein Glissando hin zu einer Pause von LilyPond nicht akzeptiert wird :(
Da müßte man dann rumfrickeln ...

Ansonsten geht es aber ganz gut.
In \durationLine #'(-0.5 . 0.6) kannst Du die Werte noch anpassen. Sie stehen für right/left padding. Im Moment ist der Anfang der Lilnie im Notenkopf aktiv.
Die Länge des glissandos kannst Du mit \gliss-length #<number> einstellen.

\version "2.16.2"

%#(use-modules (ice-9 pretty-print))
%#(use-modules (srfi srfi-1))

#(define get-grob-name
  (lambda (x) (if (ly:grob? x) (assq-ref (ly:grob-property x 'meta) 'name))))

#(define (get-grob-most-left-relative-coordinate ref-point)
  (lambda (grob)
      (cond
        ((eq? (get-grob-name grob) 'NoteColumn)
           (let* ((note-heads-array (ly:grob-object grob 'note-heads))
                  (note-heads-grobs
                    (if (not (null? note-heads-array))
                        (ly:grob-array->list note-heads-array)
                        '()))
                  (note-heads-refpoints
                    (map
                      (lambda (nh)
                        (ly:grob-relative-coordinate nh ref-point X))
                      note-heads-grobs))
                  (sorted-note-heads-refpoints (sort note-heads-refpoints <)))
            (if (not (null? sorted-note-heads-refpoints))
                (car sorted-note-heads-refpoints))))
         ((eq? (get-grob-name grob) 'AccidentalPlacement)
            (let* ((acc-list (ly:grob-object grob 'accidental-grobs))
                   (acc-refpoints
                     (map
                       (lambda (acc)
                         (ly:grob-relative-coordinate (cadr acc) ref-point X))
                       acc-list))
                   (sorted-acc-refpoints (sort acc-refpoints <)))
             (if (not (null? sorted-acc-refpoints))
                 (car sorted-acc-refpoints))))
         (else
           (if (ly:grob? grob)
               (ly:grob-relative-coordinate grob ref-point X))))))
               
#(define* (duration-line #:optional (equal-start? #f))
   (lambda (grob)
     (let* ((line-thickness (ly:staff-symbol-line-thickness grob))
            (staff-space (ly:staff-symbol-staff-space grob))
            (refp (ly:grob-system grob))
            (note-head? (lambda (x) (eq? (get-grob-name x) 'NoteHead)))
            (half-gliss-thick (- (/ staff-space 2) line-thickness))
            (thickness
              ;; (- half-gliss-thick 0.23) is my personal taste
              ;; If other value wanted, use common 'thickness override
              (ly:grob-property grob 'thickness (- half-gliss-thick 0.23)))
            (blot-diameter
              (ly:output-def-lookup (ly:grob-layout grob) 'blot-diameter))
       ;;;; left NoteColumn
            (left-Y (assoc-get 'Y (ly:grob-property grob 'left-bound-info)))
            (left-bound (ly:spanner-bound grob LEFT))
            (left-note-column (ly:grob-parent left-bound X))
            (left-note-col-X-ext
              (ly:grob-extent left-note-column left-note-column X))
            (left-note-column-coord
              (ly:grob-relative-coordinate left-note-column refp X))
       ;;;; DotColumn of left NoteColumn
            (dot-column-left (ly:note-column-dot-column left-note-column))
            (dot-column-left-X-extent
              (if (ly:grob? dot-column-left)
                  (ly:grob-extent dot-column-left dot-column-left X)
                  '(0 . 0)))
       ;;;; right NoteColumn
            (right-bound (ly:spanner-bound grob RIGHT))
            (right-bound-info (ly:grob-property grob 'right-bound-info))
            (right-note-column (ly:grob-parent right-bound X))
            (most-left-note-head-coord
             ((get-grob-most-left-relative-coordinate refp) right-note-column))
       ;;;; AccidentalPlacement of right NoteColumn
            (acc-placement (ly:note-column-accidentals right-note-column))
            (most-left-note-acc-coord
             ((get-grob-most-left-relative-coordinate refp) acc-placement))
       ;;;; Arpeggio of right NoteColumn
            (arpeggio (ly:grob-object right-note-column 'arpeggio))
            (arpeggio-coord
              (if (ly:grob? arpeggio)
                  (ly:grob-relative-coordinate arpeggio refp X)))
       ;;;; calculate most right left-bound coord
            (most-right-left-bound-coord
              (+ left-note-column-coord
                (cdr left-note-col-X-ext)
                (cdr dot-column-left-X-extent)))
       ;;;; catch most left right-bound coord
            (right-bound-coords-lst
              (list
                arpeggio-coord
                most-left-note-acc-coord
                most-left-note-head-coord))
            (cleared-right-bound-coords-lst
                (sort
                  (remove (lambda (x) (not (number? x))) right-bound-coords-lst)
                  <)))

    ;; create a flat glissando
    (ly:grob-set-nested-property! grob '(right-bound-info Y) left-Y)
   
    ;; Let all glissandi start at the same vertical position
    (if (and (note-head? left-bound) equal-start?)
        (ly:grob-set-nested-property!
          grob
          '(left-bound-info X)
          most-right-left-bound-coord))
       
    ;; Let all glissandi end at the same vertical position
    (if (note-head? right-bound)
        (ly:grob-set-nested-property!
          grob
          '(right-bound-info X)
          (car cleared-right-bound-coords-lst)))

    ;; print new stencil
    (let* ((stencil (ly:line-spanner::print grob))
           (stencil-x-ext
             (if (ly:stencil? stencil)
                 (ly:stencil-extent stencil X)
                 '(0 . 0)))
           (new-stencil
             (ly:round-filled-box
            stencil-x-ext
            (interval-widen (cons left-Y left-Y) thickness)
            blot-diameter)))
     new-stencil))))
     
gliss-length =
#(define-music-function (parser location lngth)(number?)
#{
  \once \override Glissando #'minimum-length = #lngth
#})
     
durationLine =
#(define-music-function (parser location equal-start? left-right-padding)
   ((boolean? #f) pair?)
#{
  \override Glissando #'stencil = #(duration-line equal-start?)
  \override Glissando #'(bound-details left padding) = #(car left-right-padding)
  \override Glissando #'(bound-details right padding) = #(cdr left-right-padding)
  \override Glissando #'(bound-details left-broken padding) = #0.5
  \override Glissando #'(bound-details right-broken padding) = #0.3   
#})

durationLineSettings = {
  \durationLine #'(-0.5 . 0.6)
  %% For equal glissando-start with little padding use:
  % \durationLine ##t #'(0.5 . 0.6)
 
  %% other possible settings
  %\override Glissando #'thickness = #0.2
  \override Glissando #'breakable = ##t
  \override Glissando #'after-line-breaking = ##t
  \override Glissando #'springs-and-rods = #ly:spanner::set-spacing-rods
 
  %% construction helpers, DELETE ME
  %\override Glissando #'layer = #20
  %\override Glissando #'color = #red
}

%%%%%%%%%%%%%%%%%%
%% EXAMPLE
%%%%%%%%%%%%%%%%%%

\score {
  \relative c'' {
    \clef bass
    \cadenzaOn
    \set Score.proportionalNotationDuration = #(ly:make-moment 1 8)
    \override Stem #'transparent = ##t 
    \override Flag #'transparent = ##t
    g4_\markup { \dynamic f \italic "espr. e improvisando"}
    \gliss-length #6
    fis8(\glissando
    dis b4)
    \gliss-length #12 gis8(\glissando e4)
    \gliss-length #8 c\glissando
    bes8
  }
  \layout {
    %\override NoteHead #'duration-log = #2
    \durationLineSettings
    line-width = 80
  }
}

HTH,
  Harm

trulli

  • Member
Re: "Haltestrich"
« Antwort #2 am: Samstag, 29. März 2014, 20:02 »
Der Code erzeugt ja ein cooles Notenbild...  8)

Na Christa, immer noch auf den Spuren "deines" zeitgenössischen Komponisten?

Gruß von Matthias

chf

  • Member
Re: "Haltestrich"
« Antwort #3 am: Sonntag, 30. März 2014, 18:16 »
Hallo Harm,

heißen Dank!

@Matthias
...auch, aber inzwischen kenne ich schon mehrere Handschriften...
"Mein" Verleger ist des Lobes voll über das Notenbild.

Ohne das Forum ginge nichts!

Schönste Grüße
Christa