Autor Thema: Pausen innerhalb von Akkorden  (Gelesen 3539 mal)

rJazz

  • Member
Pausen innerhalb von Akkorden
« am: Freitag, 11. September 2015, 19:06 »
Hallo,

kann ich Pausen in Akkorden setzen?

Das hier

<c e g >8
<r  f  a >4
<c e g>8
gibt einen Syntaxfehler:
error: syntax error, unexpected RESTNAME
Geht das überhaupt?


rJazz

  • Member
Re: Pausen innerhalb von Akkorden
« Antwort #1 am: Freitag, 11. September 2015, 19:43 »
Noch zur Erklärung meiner Frage:

ich habe ein Skript gefunden, mit dem ich die
Einzeltöne der Akkorde in verschiedene voices separieren kann,
das funktioniert aber nur, wenn es immer gleich viele
sind. Daher müsste ich bei Unisonopassagen oder Pausen
von  Einzelinstrumenten diese irgendwie  mit Pausen auffüllen.


harm6

  • Member
Re: Pausen innerhalb von Akkorden
« Antwort #2 am: Samstag, 12. September 2015, 00:27 »
Nein, Du kannst keine Pausen in Akkorde setzen.
Aber es wäre schön Du würdest einen Beispiel-code posten, nach dem motto

{ das-ist-der-eingabe-code }

{ das ist der ziel code }


Im übrigen, welches script? Bitte poste es oder einen link dahin.

-Harm

fugenkomponist

  • Member
Re: Pausen innerhalb von Akkorden
« Antwort #3 am: Sonntag, 13. September 2015, 15:09 »
Klingt nach Snippet 545; das ist aber kein externes Script, sondern halt LilyPond-Code.

rJazz

  • Member
Re: Pausen innerhalb von Akkorden
« Antwort #4 am: Sonntag, 13. September 2015, 16:43 »
\extractMusic kannte ich nicht,
das ist aber besser, als das, was ich gefunden hatte,
weil es nicht mit einer Fehlermeldung abbricht,
wenn in einzelnen Akkorden
mal weniger Töne (als die maximale Stimmenanzahl) sind,
sondern die Stimmen dann auffüllt.

Das Problem, es zu kennzeichnen, das einzelne
Stimmen Pausen haben sollen und eben nicht
aufgefüllt werden.

Harm: was meinst Du mit Beispiel-Code?
Das war doch der Beiepiel-Zielcode mit der
Pause drin (was einen Syntaxfehler gibt).

Nochmal mit dem extractNote-Skript zusammen:

\include "extractNote.ly"

music = \relative c'
{
    < c e g>
     <d f a>
     < e g>
}

vI =  \extractNote  #1 \music
vII =  \extractNote  #2 \music
vIII =  \extractNote  #3 \music

allStaff = \new Staff { \music}

vStaffI = \new Staff { \vI}
vStaffII = \new Staff { \vII}
vStaffIII = \new Staff { \vIII}

\score {
<<   
  \allStaff
  \vStaffI
  \vStaffII
  \vStaffIII

>>

\layout {}

}


Im letzten Akord sind nur zwei Töne,
die dritte Stimme wird von extractNote
mit dem g aufgefüllt.
Alternativ würde ich gern, dass die dritte
Stimme pausiert (ich würde also gern angegeben können,
dass im Akkord eine Pause in der dritten Stimme ist).


Also:

    < c e g>
     <d f a>
     < e g r >

Das gibt aber einen Syntaxfehler.




fugenkomponist

  • Member
Re: Pausen innerhalb von Akkorden
« Antwort #5 am: Sonntag, 13. September 2015, 17:12 »
Nunja, das ist anscheinend halt fest eingebaut: „r“ darf nicht in Akkorden stehen, sondern nur Tonhöhen.

Ein Ansatz könnte sein, eine eigene, sonst nicht genutzte Tonhöhe (also z. B. (ly:make-pitch -1 0 355/113)) zu definieren und per ly:parser-set-note-names zu verwenden (siehe z. B. makam.ly). extractMusic könnte dann alle Vorkommen dieser Tonhöhe durch Pausen ersetzen.
« Letzte Änderung: Sonntag, 13. September 2015, 17:15 von fugenkomponist »

harm6

  • Member
Re: Pausen innerhalb von Akkorden
« Antwort #6 am: Sonntag, 13. September 2015, 20:49 »
Zitat von: rJazz
Harm: was meinst Du mit Beispiel-Code?
Das war doch der Beiepiel-Zielcode mit der
Pause drin (was einen Syntaxfehler gibt).

Nun, manchmal bin ich etwas schwer von Begriff, deshalb brauche ich alle mögliche Hilfe, die der Fragende mir nur geben kann.
Dein code aus dem zweiten Beispiel ist da schon weiterführend.

Tatsächlich möchtest Du ja
(1)
\relative c'
{
    <c e g>
     <d f a>
     <e g>
}
durch die Anwendung einer geigneten procedure so bearbeiten, daß
\relative c' { c d e }
\relative c' { e f g }
\relative c' { g' a r }
entstehen kann.

(2)
Du glaubst das durch einfügen einer Pause in den Akkord verwirklichen zu können.


Tatsächlich geht (2) nicht.

Man könnte jetzt extractNote aus Snippet 545 so verändern, daß es eine Pause an die entsprechende Stelle setzt. Das führt zu

\version "2.18.2"

#(define (make-rest-music dur)
  (make-music 'RestEvent
              'duration dur))

#(define (noteEvent? music)
  (eq? (ly:music-property music 'name) 'NoteEvent))

#(define (expand-q-chords music); for q chords : see chord-repetition-init.ly
  (expand-repeat-chords! (list 'rhythmic-event) music))

%%%%%%%%%%%%%%%%%%%%%%%%%%  extractNote  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#(define tagNotExtractNote (gensym))
#(use-modules (ice-9 receive)) %% for the use of receive

#(define (chord->note chord n . args)
"Return either the note n of chord chord, keeping articulations or if other
numbers are specified in args, a chord with the matching notes."
  (receive (notes others)
    (partition noteEvent? (ly:music-property chord 'elements))
    (if (null? notes)
      chord
      (let* ((len (length notes))
             (res
               (filter-map
                 (lambda(i)
                   (and (integer? i)
                        (<= i len)
                        (> i 0)
                        (list-ref notes (1- i)))) ; list-ref is zero-based
                 (cons n args)))
              (one-note
                (cond
                  ;; for an empty list return a procedure, which will return
                  ;; a rest, once called appropiate
                  ((null? res) (lambda (d) (make-rest-music d)))
                  ((null? (cdr res))(car res))
                  (else #f))))
         (cond  ((ly:music? one-note)
                 (begin
                   (ly:music-set-property! one-note 'articulations
                     (append
                       (ly:music-property one-note 'articulations)
                       others))
                   one-note))
                ((procedure? one-note)
                 (one-note
                   (car
                     (delete-duplicates
                       (map
                         (lambda (n) (ly:music-property n 'duration))
                         notes)))))
                (else (ly:error "No suitable event found: ~a" one-note)))))))
         
#(define (extract-note music n . args)
"Extract the note n of each chords in music, keeping articulations.
If other numbers are given in args, the function returns a chord build with all
matching notes. If no note matches, returns the last note of the chord."
  (map-some-music
    (lambda (evt)
       (cond
         ((eq? 'EventChord (ly:music-property evt 'name))
            (let ((tags (ly:music-property evt 'tags)))
               (if (memq tagNotExtractNote tags)
                  (ly:music-set-property! evt 'tags ; only remove the tag
                      (delq tagNotExtractNote tags))
                  (set! evt (apply chord->note evt n args)))
               evt))
         (else (and (ly:music-property evt 'duration #f) evt))))
    (expand-q-chords music)))

extractNote = #(define-music-function (parser location n music )
  (number? ly:music?)
  (extract-note music n))

und scheint ja auch für Dein Beispiel zu klappen:

m =
\relative c' {
     <c e g>4
     <d f a>
     <e g>
}

\new Staff \m
\new Staff \extractNote #3 \m
\new Staff \extractNote #2 \m
\new Staff \extractNote #1 \m

Aber sobald der EventChord mit weniger Noten als die anderen, Ausgangs- oder Endpunkt eines Spanners ist wie Slur, Tie, etc, wird eine Warnung wegen nicht zu beendender Spanner ausgegeben.

Versuchs mal mit dem Beispiel aus dem LSR-snippet.

music = \relative c' {
  <c e g>4-> <d f>( <b g' d'>) <c e g>-. g2 r2 c2
}

\score {
  <<
    \new Staff \music
    \new Staff \extractNote #3 \music
    \new Staff \extractNote #2 \music
    \new Staff \extractNote #1 \music
  >>
}

In dieser Hinsicht ist auch fugenkomponists Vorschlag nicht weiter führend.


Du könntest jetzt natürlich eine weitere procedure schreiben, die untersucht, ob all diese spanner einen sinnvollen Start- und Zielpunkt haben und falls nicht, sollte der jeweilige Spanner komplett gelöscht werden...

Das ist durchaus machbar, aber ehrlich gesagt, ich habe besseres mit meiner Zeit vor ;)


Gruß,
  Harm

rJazz

  • Member
Re: Pausen innerhalb von Akkorden
« Antwort #7 am: Montag, 14. September 2015, 22:38 »
Den scheme-Code muss ich erstmal verstehen.
Bei mir fügt er auch eine Pause im Beispiel ein,
dass ist ja schon ein Schritt weiter.

An Spanner oder Slurs hatte ich gar nicht gedacht,
weil ich auch keine polyphonen Linien auf diese
Art schreiben wiil.

Den Vorschlag, eine eigene Note zu definieren,
finde ich schon flexibel (wenn e snicht zu ändern ist,
dass r im chord einen Syntaxfehler gibt).

Um das auszuprobieren, muss ich schnme aber erst
besser verstehen. Mit dem code kann ich im Moment
noch nicth viel anfangen.

Danke für Eure Hilfe!