Deutschsprachiges LilyPond-Forum

Allgemeine Fragen und Probleme => Fragen und Probleme aller Art => Thema gestartet von: Manuela am Samstag, 24. August 2019, 22:26

Titel: Eine Tonleiter mittels Scheme "rotieren", d.h. die ersten Töne hinten anhängen
Beitrag von: Manuela am Samstag, 24. August 2019, 22:26
Hi,

mein Scheme ist wieder einmal eingerostet.
Ich möchte eine Liste von Tönen sozusagen rotieren, d.h. die Liste um eine vorgegebene Zahl verschieben.
\ShiftScale { c d e f g a } #2 soll { e f g a c d } ergeben.
Mein Ansatz lautet folgendermaßen
\version "2.19.82"

#(define (shift the-scale n)
   (let* ((pili (music-pitches the-scale)))
     (cond ((= n 0) lst)
       (#t (shift (append (cdr pili)
                    (list (car pili))) (- n 1))))))

ShiftScale =
#(define-music-function (the-scale n)(ly:music? number?)
   (make-sequential-music
    (shift the-scale n)))

\ShiftScale \relative { c d e f g } #2

und gibt eine Fehlermeldung aus.

Evtl. gibt es bereits eine Funktion, die das erledigt?
Titel: Antw:Eine Tonleiter mit Scheme "rotieren", d.h. die ersten Töne hinten anhängen
Beitrag von: Arnold am Montag, 26. August 2019, 09:52
Hallo Manuela,

nur, um den »Denkknoten« zu lösen:


Arnold
Titel: Antw:Eine Tonleiter mittels Scheme "rotieren", d.h. die ersten Töne hinten anhängen
Beitrag von: Manuela am Montag, 26. August 2019, 11:59
Hallo Arnold,

danke für deine Antwort. Als Input soll ausschließlich eine squentielle Liste von Tönen dienen, nichts sonst.

Wie gesagt, mein Scheme ist eingerostet, mir würde es sehr helfen, wenn du die Funktion so umformuliert könntest, dass sie funktioniert und das tut, was ich will.  :)
Titel: Antw:Eine Tonleiter mittels Scheme "rotieren", d.h. die ersten Töne hinten anhängen
Beitrag von: harm6 am Montag, 26. August 2019, 12:15
Hallo Manuela,

zumindest für das minimale Beispiel könnte man \modalTranspose verwenden:


\version "2.19.83"

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

\modalTranspose c e \m \m


Vielleicht reicht das ja schon für Deine Zwecke?

Gruß,
  Harm
Titel: Antw:Eine Tonleiter mittels Scheme "rotieren", d.h. die ersten Töne hinten anhängen
Beitrag von: Manuela am Montag, 26. August 2019, 13:35
Danke Harm, das reicht für meine Zwecke.

Update: doch nicht ganz, ich müsste die Stufe der Tonleiter als Zahl angeben können, ohne die konkreten Noten zu wissen.
Titel: Antw:Eine Tonleiter mittels Scheme "rotieren", d.h. die ersten Töne hinten anhängen
Beitrag von: Manuela am Dienstag, 27. August 2019, 07:45
Harm, vll hast du mein letztes Update nicht gelesen.

Für dich als Scheme-Experten ist das sicherlich ein Klacks, meinen Programmentwurf zum Laufen zu bringen, ich plage mich damit, weil ich schon lange mit Scheme nichts mehr gemacht habe.

Ich verstehe eh nicht, wieso man bei \modalTranspose keine Stufen als Zahlen angeben kann.
Titel: Antw:Eine Tonleiter mittels Scheme "rotieren", d.h. die ersten Töne hinten anh.
Beitrag von: Arnold am Dienstag, 27. August 2019, 09:35
Hallo Manuela,

Du erscheinst mir ein wenig bequem geworden zu sein - sollte ich da nicht für meine Dienstleisungen künftig ein Honorar verlangen (z. Bsp. € 2,50 Serverkostenbeitrag für das erste Mal :) )

Nun, hier mein Entwurf. ROL wie »rotate left«, oder »rollieren« falls das Wort besser gefällt.
Gedacht für Musik-Schnipsel mit einer Liste im innern, also vor allem die »Sequentielle Musik« (ergo »{ ... }« ).
Bei der »Simultanen Musik« (ergo »<< ... >>«) macht nicht alles Sinn.
Es werden die Events in der Liste rotiert (also würde \breathe oder \mark mitgezählt, in dem Konstrukt »<< { a4 b } \\ { c2 } >>« auch der Separator zwischen den beiden Sequentiellen Musikabschnitten - da würde ein rotieren und damit verschieben des Separators an den Anfang oder das Ende der Liste nur Unruhe stiften.
%{
ROtate Left Sequential Music
%}
\version "2.19.80"

RolSM =
#(define-music-function (mus count)
  (ly:music? integer?)
  (let* ((es (ly:music-property mus 'elements '()))
         (lg (length es)))
   (if (equal? lg 0) (begin
     (ly:warning "Das war doch keine Sequentielle Musik als Argument der Funktion RolSM")
     mus)
    (let ((s (modulo count lg)))
     (if (equal? s 0)
      mus
      (begin (ly:music-set-property! mus 'elements
        (append (list-tail es s) (list-head es s)))
       mus))))))

M = { c'4 d' e' f' g' a' b' c'' }

{ s4*0^"Quelle = \\M" \M }
{ s4*0^"\\RolSM \\M #1" \RolSM \M #1 }
{ s4*0^"\\RolSM \\M #2" \RolSM \M #2 }
{ s4*0^"\\RolSM \\M #-1 (rechts statt links rotiert)" \RolSM \M #-1 }

MM = <<
  \new Staff { \clef treble c''1 }
  \addlyrics { Huch }
  \new Lyrics \lyricmode { Husch }
  \new Staff { \clef alto   e'1 }
  \addlyrics { Hopla }
  \new Staff { \clef tenor  g1 }
  \addlyrics { Nanu }
  \new Staff { \clef bass   c1 }
  \addlyrics { Psst! }
>>

\new StaffGroup \MM
\new StaffGroup \RolSM \MM #1
\new StaffGroup \RolSM \MM #4


Arnold

P.S. Habe gerade noch gesehen, daß ich eine Klammer im SCHEME-Code falsch gesetzt habe.
»mus))« habe ich schnell zu »mus)« abgeändert, und die ausgleichende Klammer dann an der Schlußzeile hinten angefügt, ohne das Beispiel jetzt nochmal zu testen.
Titel: Antw:Eine Tonleiter mittels Scheme "rotieren", d.h. die ersten Töne hinten anh.
Beitrag von: Manuela am Dienstag, 27. August 2019, 12:07
Zitat von: Arnold am Dienstag, 27. August 2019, 09:35
Du erscheinst mir ein wenig bequem geworden zu sein - sollte ich da nicht für meine Dienstleisungen künftig ein Honorar verlangen (z. Bsp. € 2,50 Serverkostenbeitrag für das erste Mal :) )

Hallo Arnold,
danke für deine Antworten.

Wenn du meine Beträge anschaust, wirst du vielleicht sehen, dass ich in diesem Forum nicht nur Fragen stelle, sondern auch Antworten gebe.

Ich dachte, ein Forum ist dafür da, Fragen zu stellen? Wenn du es als bequem bezeichnest, wenn ich eine Frage zu Scheme stelle, anstatt stundenlang selbst zu tüfteln, dann mag das sein. Ich verbringe meine Zeit lieber mit Dingen, die ich besser kann und die mrir leichter von der Hand gehen. Mit Scheme plage ich mich nach wie vor, und vieles habe ich inzwischen wieder vergessen. Jetzt greife ich meine alten Scheme-Programme wieder auf und will sie übersichtlich in einem Wiki präsentieren. Die beschriebene Funktion würde mir dabei helfen, in einer Vorlage 3 Parameter einzusparen. Ist aber nicht wirklich essentiell, es geht auch so.
Titel: Antw:Eine Tonleiter mittels Scheme "rotieren", d.h. die ersten Töne hinten anh.
Beitrag von: Arnold am Dienstag, 27. August 2019, 12:39
Entschuldigung Manuela,
ich wollte dich nicht angreifen. Es war eher ironisch gemeint - deshalb das Smily.

Wichtig ist in diesem Thema aber:
Wenn man nicht versteht, wie die per Lilypond-Syntax eingegebenen Strukturen im Scheme aussehen, dann kann man bei der Anwendung von solchen SCHEME-Programmen von einem Fettmäpfchen ins nächste treten.

Dieses Verständnis zu vermitteln, wäre vielleicht auch einen Wiki-Eintrag wert. Aber wenn es ein "angeheder Experte" zu erkären versucht, versteht ein Laie möglicherweise nur "Bahnhof".

Arnold
Titel: Antw:Eine Tonleiter mittels Scheme "rotieren", d.h. die ersten Töne hinten anhängen
Beitrag von: Manuela am Dienstag, 27. August 2019, 15:04
Hallo Arnold,

schon ok.  ;)

Magst du einen Eintrag in meinem Wiki schreiben?