In Scheme LilyPond-Variabeln ändern

Begonnen von ingmar, Donnerstag, 4. März 2021, 20:04

« vorheriges - nächstes »

ingmar

Hallo,

ich stoße immer wieder auf das Problem, in LilyPond Variablen definiert zu haben, die ich vor der Verwendung durch Aufruf einer Scheme-Funktion ändern möchte. Dann aber beschwert sich Scheme, ich würde ja nur Variablen setzen und nix damit anstellen...

Beispiel:
\version "2.20.0"
test = #(define-void-function ()()
(begin (let (music #{ \relative { g4 f e d c1 } #}))))

music = \relative { c'4 d e f g1 }

% \test

\score {\music }

Ich habe also Musik ins der Variablen music und kann sie für einen Score verwenden. Will ich sie aber zuvor (durch Auskommentieren der Scheme-Funktion test) in Scheme irgendwie bearbeiten, dann krieg ich zu hören "Missing expression".

Stimmt natürlich – aber wie umgeht der erfahrene Schemeprogrammierer die Situation?

Danke, Gruß,
--ingmar


Arnold

Hallo ingmar,

wie ich an solche Aufgaben herangehe, muß nicht zwangsweise der beste Lösungsweg für dich sein!

Ich arbeite da meist im reinen SCHEME-Level, also ohne #{ ... #}, und benutze ly:parser-lookup und ly:parser-define!.
Zum Abändern ähnlich eines Filters benutzte ich auch \musicMap, welches wohl mit einer erneuten Zuweisung gepaart werden kann. Das würde bei dir bedeuten, eine music-function anstelle einer void-function zu definieren.

Umvollständiger Beispielcode, ungeprüft ob compilierbar:
#(define (test-mapper mus)
; checks mus, which is a ly:music? type
; and modifies it if required
; returns the modified music (resp the unmodified original)
mus)

music = { c'4 g'' e''' c }

\score { \music }

music = \musicMap #test-mapper \music

\score { \music }


Arnold

harm6

Hallo ingmar,

ich muß gestehen das Problem noch nicht so recht verstanden zu haben...

Wenn ich eine Musik enhaltende Variable definiere wie
  mus = { b }
und diese dann aber verändert aufrufen möchte (als Beispiel hier ein simples \transpose), mache ich, z.B.:
direkt
  \transpose b c' \mus
oder
  musII = \transpose b c' \mus
und Aufruf als
  \new Voice \musII

Das erhält `mus' wie ursprünglich definiert und `mus' kann nach wie vor so verwendet werden.
Oder soll `mus' destruktiv verändert werden und nur noch den neuen Inhalt haben?

Gruß,
  Harm

ingmar

Ich will ziemlich viel an 'mus' verändern. Das wäre viel Code, den ich immer und immer wieder verwenden müsste. Daher wünsche ich mir eine Funktion dazu.

Zitat von: harm6 am Freitag,  5. März 2021, 10:47
Oder soll `mus' destruktiv verändert werden und nur noch den neuen Inhalt haben?
Ja, das kann auch destruktive Änderung beinhalten, es kann auch die Definition neuer Variablen beinhalten. Vielleicht habt ihr beide insofern recht, als ich versuchen könnte, es entweder voll in Scheme oder voll in LilyPond durchzuführen.

Die Frage bleibt aber trotzdem: Wie gaukle ich Scheme am einfachsten vor, mehr zu tun als sinnlos Variablen zu definieren oder zu füllen...

Danke,
--ingmar

harm6

Mir ist leider das Problem immer noch nicht klar.
Das liegt auch am Code-Beispiel des initialen posts dieses threads: die dortige void-function ist syntaktisch vermurkst und es ist unklar was eigentlich beabsichtigt ist.

Es geht natürlich:

tst =
#(define-void-function (name music)(symbol? ly:music?)
  (ly:parser-define! name music))

mus = { b4 }

\new Staff \mus

\tst mus { c'8 }

\new Staff \mus


Arnold's Beitrag partiell illustrierend.


Gruß,
  Harm