Autor Thema: Note in Akkord verwandeln  (Gelesen 4117 mal)

erich

  • Member
Note in Akkord verwandeln
« am: Donnerstag, 7. April 2016, 12:58 »
Hallo allen

Ich habe ein Schript, das nicht ganz tut, was ich möchte
\version "2.18.2"

#(define (note->chord note)
   
     (make-music 'EventChord 'elements
     (list
      (make-music 'NoteEvent 'fehler
        (ly:music-property note 'articulations)
        'pitch (ly:music-property note 'pitch)
        'duration (ly:music-property note 'duration)
        ))))

note_chord =
#(define-music-function (parser location music)
  (ly:music?)
       
  (set! (ly:music-property music 'elements)
      (map-in-order
         (lambda (m)     
            (cond ((eq? (ly:music-property m 'name) 'EventChord)
                      m)
                  ((eq? (ly:music-property m 'name) 'NoteEvent)
                     (note->chord m))
                 (else m)))
         (ly:music-property music 'elements)
      )
  )
  music)

\score {
  <<
    \new Voice \displayMusic \note_chord{ e'^···\f} \displayMusic\note_chord{ <e'>^···\f }
  >>
}

Ich möchte, dass in beiden Fällen die gleiche Struktur ausgegeben wird; aber bei 'fehler (5. Zeile) stimmt was nicht . Weiß einer weiter? Wie vermeidet man, dass eine neue Liste erzeugt wird?

Gruß
Erich

fugenkomponist

  • Member
Re: Note in Akkord verwandeln
« Antwort #1 am: Donnerstag, 7. April 2016, 13:13 »
Es wird keine neue Liste erzeugt, es wird nur die Artikulationen-Liste der Property 'fehler des NoteEvents zugewiesen. Stattdessen sollte die Liste 'elements des EventChords aus dem NoteEvent und der Artikulationen-Liste bestehen:
#(define (note->chord note)
   (make-music 'EventChord 'elements
     (cons
      (make-music 'NoteEvent
        'pitch (ly:music-property note 'pitch)
        'duration (ly:music-property note 'duration))
      (ly:music-property note 'articulations))))

harm6

  • Member
Re: Note in Akkord verwandeln
« Antwort #2 am: Donnerstag, 7. April 2016, 21:52 »
Was spricht gegen:
\version "2.18.2"

\displayMusic
$(event-chord-wrap! #{ { e'^···\f <e'>^···\f } #})
?

Cheers,
  Harm

erich

  • Member
Re: Note in Akkord verwandeln
« Antwort #3 am: Freitag, 8. April 2016, 08:22 »
Hallo Harm

ich glaube, nichts spricht dagegen.

Zum Nachschlagen hatte ich mir mal die Notationsrefenz für 2.14 ausgedruckt, event-chord-wrap! ist erst in Version 2.16 dazugekommen, wenn ich es richtig gelesen habe.

1. Ich frage mich schon lange, warum eine (einzelne) Note beispielsweise e' nicht immer wie  <e'> kodiert wird und nicht einfach als eine Kurzform bei der Eingabe aufgefasst wird. Gibt es Fälle, wo die Unterscheidung relevant ist.

2. Hat das Ausrufungszeichen im Namen von event-chord-wrap! eine besondere Bedeutung?

Danke für den Hinweis
Gruß
Erich


fugenkomponist

  • Member
Re: Note in Akkord verwandeln
« Antwort #4 am: Freitag, 8. April 2016, 09:08 »
2. Hat das Ausrufungszeichen im Namen von event-chord-wrap! eine besondere Bedeutung?
Im rein funktionalen Programmierstil gibts keine Variablen, die nacheinander auf verschiedene Werte gesetzt und verändert werden können. Stattdessen nimmt eine Funktion einen Wert und gibt einen anderen zurück. (Vielleicht schon mal aus anderen Sprachen gehört: call-by-value, seiteneffektfrei)

Scheme ist aber nicht rein funktional, sondern erlaubt eben auch Zuweisungen und Seiteneffekte. Alle Funktionen, die eine Variable auch nach außen hin sichtbar, also nicht nur für später verworfene Zwischenergebnisse, verändern (→ Seiteneffekt, braucht call-by-reference), statt einen Wert zu bekommen und einen zurückzugeben, schreiben sich mit Ausrufezeichen, z. B. set! und ly:music-set-property!. Warum genau das jetzt auch event-chord-wrap! betrifft, weiß ich nicht, dafür kenn ich die Funktion nicht gut genug.

Bin nicht hundertprozentig sicher, ob das auch so umgesetzt ist mit call-by-value/reference. Und ich habe diese Begriffe auch noch nicht in diesem Kontext gehört, finds aber für die Vorstellung hilfreich.
« Letzte Änderung: Freitag, 8. April 2016, 09:11 von fugenkomponist »

harm6

  • Member
Re: Note in Akkord verwandeln
« Antwort #5 am: Freitag, 8. April 2016, 10:47 »
Zitat von: erich
1. Ich frage mich schon lange, warum eine (einzelne) Note beispielsweise e' nicht immer wie  <e'> kodiert wird und nicht einfach als eine Kurzform bei der Eingabe aufgefasst wird. Gibt es Fälle, wo die Unterscheidung relevant ist.

Tatschlich hat LilyPond bis einschließlich 2.14.2 genau das gemacht.
Einige Gründe für den Wechsel sind hier:
http://lilypond.org/doc/v2.16/Documentation/changes-big-page.html
kurz skizziert.

Von Umstellungsproblemen mal abgesehen, habe ich nie Schwierigkeiten bemerkt, stattdessen aber eine Reihe neuer Möglichkeiten erhalten.
Einzige Ausnahme war das articulate-script. Aber es ist sowieso ein Sonderfall, da es extern entwickelt wurde. Ist auch anders lizensiert...

Die Frage ist jetzt natürlich warum Du EventChords haben möchtest?


Gruß,
  Harm

erich

  • Member
Re: Note in Akkord verwandeln
« Antwort #6 am: Freitag, 8. April 2016, 15:08 »
Hallo Harm,

ich möchte sowas machen, wie  es das articulate-script schon macht; es geht mir also nicht um die Sichtbarmachung sondern um die Hörbarmachung.
Ich hatte dazu schon mal für lineare Musik eine Notation mit Pünktchen entwickelt, um die Dauern von Noten verkürzen zu können; zum Ausgleich wurden entsprechende unsichtbare Pausen eingefügt.  Um dieses Konzept auch für Akkorde nutzen zu können, möchte ich mir eine Falluntescheidung dadurch ersparen, dass ich zunächst einfache Noten in Akkorde umwandle.

Ich habe mir das erste Beispiel unter http://lilypond.org/doc/v2.16/Documentation/changes-big-page.html angesehen: nun hab ich zumindest eine Ahnung davon, wo die Konflikte liegen.

Ob ich mit event-chord-wrap! glücklich werde, übersehe ich noch nicht ganz; wenn ich in dem Script

\version "2.18."


#(define (note->chord note)
   (make-music 'EventChord 'elements
     (cons
      (make-music 'NoteEvent
        'pitch (ly:music-property note 'pitch)
        'duration (ly:music-property note 'duration))
      (ly:music-property note 'articulations))))

note_chord =
#(define-music-function (parser location music)
  (ly:music?)
       
  (set! (ly:music-property music 'elements)
      (map-in-order
         (lambda (m)     
            (cond ((eq? (ly:music-property m 'name) 'EventChord)
                      m)
                  ((eq? (ly:music-property m 'name) 'NoteEvent)
                     (note->chord m))
                 (else m)))
         (ly:music-property music 'elements)
      )
  )
  music)

event-chord-wrap = #event-chord-wrap!

\score {
  <<
    \new Voice \displayMusic{ \note_chord{a'^· \note_chord{b'^··}}}
%    \new Voice \displayMusic{ \event-chord-wrap{a'^· \event-chord-wrap{b'^··}}}
  >>
}

am Ende die Auskommentierung aufhebe, bekomme ich jedenfalls eine Fehlermeldung.

Grüß Dich
Erich

edit: Tippfehler beseitigt (09.04.2016) Hinweis von Harm ; eine Fehlermeldung besteht jedoch fort
« Letzte Änderung: Samstag, 9. April 2016, 08:02 von erich »

harm6

  • Member
Re: Note in Akkord verwandeln
« Antwort #7 am: Freitag, 8. April 2016, 22:16 »
Wenn man von dem Tippfehler absieht (warp !!), so ist der Knackpunkt, daß event-chord-wrap! keine music-function ist, sondern eine einfache procedure.
#(write-me "procedure? " (procedure? event-chord-wrap!))
#(write-me "music-function? " (ly:music-function? event-chord-wrap!))
führt zu
Zitat
procedure? #t
music-function? #f
Der Versuch sie neu zu benennen ändert daran ja nichts.

Beispiel:

#(define (my-music music) music)
 
{ #(my-music #{ c1 d #}) }

{ \my-music { c1 d } }

Der Aufruf mittels LilyPond-syntax scheitert, es klappt nur in scheme.


Um weiter zu kommen brauchst Du eine music-function. Die gibts schon: `eventChords'

\version "2.18."

#(define (note->chord note)
   (make-music 'EventChord 'elements
     (cons
      (make-music 'NoteEvent
        'pitch (ly:music-property note 'pitch)
        'duration (ly:music-property note 'duration))
      (ly:music-property note 'articulations))))

note_chord =
#(define-music-function (parser location music)
  (ly:music?)
       
  (set! (ly:music-property music 'elements)
      (map-in-order
         (lambda (m)     
            (cond ((eq? (ly:music-property m 'name) 'EventChord)
                      m)
                  ((eq? (ly:music-property m 'name) 'NoteEvent)
                     (note->chord m))
                 (else m)))
         (ly:music-property music 'elements)
      )
  )
  music)

\score {
  <<
    \new Voice
      %\displayMusic
      { \note_chord { a'^· \note_chord { b'^·· }}}
    \new Voice
      %\displayMusic
      { \eventChords { a'^· \eventChords { b'^·· }}}
    \new Voice
      %\displayMusic
      \eventChords { a'^· b'^·· }
  >>
}

Dann funktionierts.

Falls Du eventChords neu benennen willst, so geht das so
#(define event-chord-wrap eventChords)
oder so
event-chord-wrap = #eventChords
in 2.19. auch
event-chord-wrap = \eventChords \etc



Ich nehme an Du weißt, daß Du nicht jedes Element mittels event-chord-wrap angehen mußt ...

Gruß,
  Harm

erich

  • Member
Re: Note in Akkord verwandeln
« Antwort #8 am: Samstag, 9. April 2016, 08:36 »
Hallo Harm

danke für die hilfreichen Hinweise!

Ich habe mir mal das 1. Beispiel unter
http://lilypond.org/doc/v2.16/Documentation/changes-big-page.html#new-features-in-2_002e16-since-2_002e14
angesehen.
Ich hoffe, dass das nicht die einzige Begründung ist, für die neue Designentscheidung:
Es handelt sich doch um ein lokal auftretendes Phänomen, das auch lokal zu behandeln wäre; dass dafür eine globale Änderung vorgenommen werden musste, vermag ich nicht nachzuvollziehen. Faktisch wurde doch ein neuer Notationstyp eingefügt.

In meinen Augen geht es doch um Folgendes - ich weiß, solche Anmerkungen sind hier bei vielen nicht beliebt - :
In einem Pianostaff gibt es für die Noten (vor allem zwischen den Systemen) zwei Darstellungsweisen, entweder bezieht man sich auf das obere oder auf das untere System. Noten, die musikalisch dem unteren System zugeornet sind, aber im oberen System dargestellt werden sollen, sollten auch im unteren System vereinbart werden. Das geschieht aber nicht! Dasselbe gilt natürlich auch in der anderen Richtung.

Gruß
Erich

harm6

  • Member
Re: Note in Akkord verwandeln
« Antwort #9 am: Samstag, 9. April 2016, 11:28 »
Hallo Erich,

der erste Punkt aus den Changes für 2.16. sind die cross-staff stems.
Das hat nichts aber auch gar nichts mit der Änderung bzgl. EventChord zu tun.

Sroll runter zu:
"The following is a fundamental change in LilyPond’s music representation:..."
sowie den nächsten Punkten, um etwas über die EventChords zu lesen.

Gruß,
  Harm

Noch ein Wort zu den cross-staff stems.
Iirc, so war man allenthalben nicht besonders glücklich über diese Lösung, aber beser eine suboptimale als gar keine. So war zumindest der letzte Konsens.