Eine Tonleiter mittels Scheme "rotieren", d.h. die ersten Töne hinten anhängen

Begonnen von Manuela, Samstag, 24. August 2019, 22:26

« vorheriges - nächstes »

Manuela

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?
Danke für eure Hilfe
viele Grüße
-- Manuela

Arnold

Hallo Manuela,

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


  • Du übergibst deine Music-function »ShfitScale« ein Element vom Typ »ly:music?«, genauer gesagt hier eine »Sequentielle Musik«
  • Also findest Du im Attribut »elements« dieser »Sequentiellen Musik« eine Scheme-Liste
  • Solange Du keine Unterstrukturen darin definiert hast, wirst Du schnell die entsprechende Umwälzfunktion im SCHEME-Handbuch finden. So etwas wie »{ c d { e f } g a }«, also Sequentielle Musik in der Sequentiellen Musik würde ich sowieso vermeiden
  • Zurückgeben mußt Du sicher wieder eine Sequentielle Musik, mit der rotierten Liste als »elements« - ob Du die nun durch die Scheme funktion »make-sequential-music« oder allgemeiner durch »make-music« mit Angabe des Typs »'SequentialMusic« und des neuen Parameterwerts von »elements« erstellst, ist wohl Geschmackssache.

Arnold

Manuela

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.  :)
Danke für eure Hilfe
viele Grüße
-- Manuela

harm6

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

Manuela

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.
Danke für eure Hilfe
viele Grüße
-- Manuela

Manuela

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.
Danke für eure Hilfe
viele Grüße
-- Manuela

Arnold

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.

Manuela

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.
Danke für eure Hilfe
viele Grüße
-- Manuela

Arnold

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

Manuela

Hallo Arnold,

schon ok.  ;)

Magst du einen Eintrag in meinem Wiki schreiben?
Danke für eure Hilfe
viele Grüße
-- Manuela