Deutschsprachiges LilyPond-Forum

Allgemeine Fragen und Probleme => Fragen und Probleme aller Art => Thema gestartet von: Köbi am Mittwoch, 7. August 2019, 21:17

Titel: Variable setzen in function
Beitrag von: Köbi am Mittwoch, 7. August 2019, 21:17
Um die Ferienflaute zu überbrücken ;-)

Warum funktioniert der folgende Code nicht?


\version "2.19.83"

FuncA =
#(define-void-function
  (aPar)
  (string?)
  #{
    newPar = #aPar
  #}
  )

\FuncA "par1"


Ich bekomme "error: not a note name: newPar"  :-(
Ich würde gerne in Lilypond-Syntax in der function eine Variable setzen.

Danke im voraus für eure Bemühungen!
Titel: Antw:Variable setzen in function
Beitrag von: harm6 am Mittwoch, 7. August 2019, 22:09
#{ #} dient dazu Musik in guile einzubetten. Du versuchst dort eine Definition durchzuführen.
Kann nicht klappen, siehe:
#(display-scheme-music #{ #})
->
(make-music (quote Music))

Warum eigentlich in einer Funktion und nicht ganz simple toplevel?

Nichtsdestotrotz, so kann man es machen:
\version "2.19.83"

FuncA =
#(define-void-function (aPar) (string?)
  (module-define! (current-module) 'newPar aPar))

\FuncA "par1"

#(write newPar)


Ich halte aber nichts davon, möglicherweise änderte ich meine Meinung, wenn ich wüßte wofür Du's brauchst. ;)

Gruß,
  Harm
Titel: Antw:Variable setzen in function
Beitrag von: Köbi am Mittwoch, 7. August 2019, 23:18
Danke Harm. Ich war eigentlich an etwas anderem dran, das nicht funktionierte. Beim reduzieren auf ein Minimalbeispiel bin ich über das obige gestolpert und habe es deshalb als erstes gepostet.

Das Grundanliegen ist, dass ich Noten abhängig von einer Bedingung ausgeben möchte. Dazu nutze ich functions. Folgendes Minimalbeispiel funktioniert:


\version "2.19.83"

ScoreSetup =
#(define-void-function
  (aMusic)
  (ly:music?)
  (ly:parser-define! 'currentMusic aMusic)
  )


ScoreTwo =
#(define-scheme-function (aTempo) (string?)
   #{
     \score {
       \relative {
         \tempo #aTempo
         \currentMusic
       }
     }
   #}
   )

\ScoreSetup \relative { e' }
\ScoreTwo "Tempo1"


Die letzten zwei Zeilen sollen aber nur ausgeführt werden, wenn eine Bedingung erfüllt ist. Pseudocode:


xA = 0
xB = 0
#(if (equal? xA xB)
  #{
    \ScoreSetup \relative { e' }
    \ScoreTwo "Tempo1"
  #}
)


Wie mache ich das?
Titel: Antw:Variable setzen in function
Beitrag von: harm6 am Donnerstag, 8. August 2019, 02:22

\version "2.19.83"

ScoreSetup =
#(define-void-function (aMusic) (ly:music?)
  (ly:parser-define! 'currentMusic aMusic))

ScoreTwo =
#(define-scheme-function (aTempo) (string?)
   #{
     \score {
       \relative {
         \tempo #aTempo
         \currentMusic
       }
     }
   #})
%
%\ScoreSetup \relative { e' }
%\ScoreTwo "Tempo1"

xA = 0
xB = 0

%% needs to be here to signal the definition of `xB´ is finished
%% (other "fillers" are possible as well)
#(list)
$(if (equal? xA xB)
     (begin
      (ScoreSetup #{ \relative { e' } #})
      #{
        \ScoreTwo "Tempo1"
      #}))


funktioniert hier.

Gruß,
  Harm

EDIT code korrigiert
Titel: Antw:Variable setzen in function
Beitrag von: Köbi am Donnerstag, 8. August 2019, 21:52
Danke Harm, das hilft mir weiter :-)