Deutsches Lilypond Forum (Archiv)
Allgemein => Fragen zu Funktionen => Thema gestartet von: stefanhuglfing am Sonntag, 29. Dezember 2013, 18:39
-
Ein Lied ist im 4/4-Takt bis auf zwei Takte, die je sechs Viertel enthalten.
Meine Sänger stören sich an Taktangaben während des Liedes. Deshalb habe ich
die 6/4-Takte mit \cadenzaOn bzw. -Off reingeschrieben und
damit am Anfang nichts falsches steht die Taktangabe mit \remove "Time_signature_engraver" entfernt.
\version "2.14.2-2"
SopranNoten =
\relative c'
{
a'4 g f e d2 c
\cadenzaOn f f4 g2 g4 \cadenzaOff \bar"|" a1
c4 c d c bes2 a \cadenzaOn g4 f g2 g \cadenzaOff \bar"|"
f1
\bar "|."
}
\score
{
{ \key f \major \SopranNoten }
\layout { \context { \Staff \remove "Time_signature_engraver" } }
}
Ich hätte aber gern am Anfang des Liedes beide Taktangaben.
Die Taktstriche würde ich auch selbst setzen.
Geht das?
-
Hallo Stefan,
mit einem der beiden folgenden kannst du es mal probieren
http://lsr.dsi.unimi.it/LSR/Item?id=725 (da halt den richtigen musicglyph für das c rausfinden)
http://lsr.dsi.unimi.it/LSR/Item?id=782 (wenn du tatsächlich 4/4 in Zahlen dastehen haben willst; Klammern noch rausnehmen)
Ansonsten könntest du die Taktangaben aber auch über das System schreiben:
http://lsr.dsi.unimi.it/LSR/Item?id=272
Viele Grüße,
Malte
-
Danke, es geht fast:
Am liebsten wäre mir das erste Beispiel, da gelingt es mir aber nicht, 4/4 hinzuschreiben: Wenn ich "timesig.mensural64" durch "4" "4" ersetze, bekomme ich eine Fehlermeldung.
Beim zweiten Beispiel stören mich nur die Klammern. Das ist aber nicht so schlimm.
-
Naja, im ersten Beispiel wird halt ein musicglyph erwartet (also ein einzelnes Zeichen, keine zwei Zahlen), den kann man durch timesig.C44 ersetzen:
#(define ((double-time-signature glyph a b) grob)
(grob-interpret-markup grob
(markup #:override '(baseline-skip . 0) #:number
(#:line ((markup (#:musicglyph glyph))
(#:column (a b)))))))
music = \relative c' {
\override Score.TimeSignature #'stencil =
#(double-time-signature "timesig.C44" "6" "4")
\time 3/4
c8 b c d e f g4 g g g4 a8 g f e d2. \bar "|."
}
\score { \music }(da hab ich außerdem fontsize und baselineskip angepasst)
Und im zweiten Beispiel löscht man halt die beiden Klammern:
#(define ((time-parenthesized-time up down upp downp) grob)
(grob-interpret-markup grob
(markup #:override '(baseline-skip . 0) #:number
(#:line (
(#:column (up down))
(#:column (upp downp)))))))
\relative c' {
\override Staff.TimeSignature #'stencil = #(time-parenthesized-time "4" "4" "6" "4")
\time 3/4
b8 b8 gis8 gis4 gis8
}Da kann man evtl. noch zwischen den beiden (#:column …)-Zeilen ein (#:hspace 0.5) o.ä. einfügen, damit es nicht nacht 46/44 aussieht.
Es hilft oft, sich anzuschauen, was der Code so ungefähr tut; auch ohne tiefere Scheme-Kenntnisse (die ich auch nicht habe) kann man ihn verstehen und was dran ändern.
Edit: Oh, und was mir gerade noch aufgefallen ist (falls jemand mal ein ähnliches Problem, aber mit anderen Taktarten hat): Wenn man sowas wie 4/4 (oder c) und 12/8 haben will, sollte man #:column durch #:center-column ersetzen, damit die 12 und die 8 zentriert übereinander stehen.
-
Hier mal ein komplettes Ergebnis. Verschieden lange Takte kannst du hinkriegen, indem du • entweder die Taktart wechselst und die Taktartangabe verschwinden lässt (\omit geht erst ab Version 2.17, bei 2.16 brauchst du den „#'stencil = ##f“-\override) • oder per \set Score.measureLength die Taktlänge änderst und mit \unset wieder zurücksetzt.
\version "2.17.29"
#(define ((num-double-time-signature num1 den1 num2 den2) grob)
(grob-interpret-markup grob
(markup #:override '(baseline-skip . 0) #:number
(#:line (
(#:center-column (num1 den1))
(#:center-column (num2 den2))
)))))
#(define ((glyph-double-time-signature glyph num den) grob)
(grob-interpret-markup grob
(markup #:override '(baseline-skip . 0) #:number
(#:line (
(markup (#:musicglyph glyph))
(#:center-column (num den))
)))))
\relative c' {
\override Staff.TimeSignature.stencil = #(num-double-time-signature "4" "4" "6" "4")
\time 4/4
c4 d e f
\omit Staff.TimeSignature
\time 6/4
g f e f e d
\once \override Staff.TimeSignature.stencil = ##f
\time 4/4
c d e d
\override Staff.TimeSignature.stencil = #(glyph-double-time-signature "timesig.C44" "6" "4")
\time 4/4
c4 d e f
\set Score.measureLength = #(ly:make-moment 6 4)
g f e f e d
\unset Score.measureLength
c d e f
}
Edit: mir ist gerade eingefallen, wie man noch mehr Tipparbeit sparen kann, nämlich den stencil auf ##f setzen und nur per \once \override einmalig zu setzen, wenn man ihn braucht:\relative c' {
\override Staff.TimeSignature.stencil = ##f
\once \override Staff.TimeSignature.stencil = #(num-double-time-signature "4" "4" "6" "4")
\time 4/4
c4 d e f
\time 6/4
g f e f e d
\time 4/4
c d e d
\once \override Staff.TimeSignature.stencil = #(glyph-double-time-signature "timesig.C44" "6" "4")
\time 4/4
c4 d e f
\time 6/4
g f e f e d
\time 4/4
c d e f
}
-
Es hilft oft, sich anzuschauen, was der Code so ungefähr tut; auch ohne tiefere Scheme-Kenntnisse (die ich auch nicht habe) kann man ihn verstehen und was dran ändern.
tatsächlich! Ich sollte mutiger sein.
Danke
-
Hallo,
ich habe mich mal bemüht die beiden LSR-snippets zu vereinen und noch ein paar zusätzliche features einzubauen. :)
Es ist jetzt möglich einfach
\customTimeSig 4/4 6/4
oder
\customTimeSig "C22" 6/4
zu schreiben.
Diverse Kommentare im Code.
Falls etwas unklar sein sollte oder ich irgendwas übersehen habe, meldet euch.
\version "2.18.0"
#(define-public (fraction-or-string? x)
(or
(and (pair? x)
(index? (car x)) (index? (cdr x)))
(string? x)))
#(define (single-time-sig ls arg)
;; Returns a markup to use as a single new TimeSignature.
;; Supported are fractions and strings for use with \musicglyph.
;; If fraction is printed, it's possible to customize baseline-skip and
;; font-size values taken from 'ls', which should have length 2.
;; If ls-length doesn't fit, a warning appears and an empty markup will be
;; returned.
(cond ((< (length ls) 2)
(begin
(ly:warning "List ~a is too short, returning empty-markup" ls)
empty-markup))
;; better be paranoid
((not (fraction-or-string? arg))
(begin
(ly:warning "~a is neither fraction nor string, ignoring" arg)
empty-markup))
((fraction? arg)
#{
\markup
\vcenter
\number
\override #`(baseline-skip . ,(car ls))
\override #`(font-size . ,(cadr ls))
\center-column {
#(number->string (car arg))
#(number->string (cdr arg))
}
#})
((string? arg)
#{ \markup \musicglyph #(format "timesig.~a" arg) #})
;; better be paranoid
(else empty-markup)
))
customTimeSig =
#(define-music-function (parser location baseline-fontsize sig-1 sig-2 )
((number-list? '(0 0)) fraction-or-string? fraction-or-string?)
"
Returns a double @code{TimeSignature}.
Fractions or Symbols are possible output.
If Symbols are wanted "\"timesig."\" has to be omitted.
@code{font-size} and @code{baseline-skip} are customizeable using the optional
@var{baselne-fontsize}-argument
@var{baselne-fontsize} has to be a list of length 2
For changing font-size of a TimeSig-Symbol an additional external override
should be applied.
"
#{
\once \override Staff.TimeSignature.stencil =
#(lambda (grob)
(grob-interpret-markup grob
#{
\markup
\line {
#(single-time-sig baseline-fontsize sig-1)
#(single-time-sig baseline-fontsize sig-2)
}
#}))
#})
%%%%%%%%%%%%%%%%%%%%%
% EXAMPLE
%%%%%%%%%%%%%%%%%%%%%
%% paper-, header-, layout-settings for nicer output
ly-version =
#(string-append "Engraved by LILYPOND, Version " (lilypond-version))
compiling-time =
#(string-append
"compiled at "
(strftime "%Y-%m-%d %H:%M:%S" (localtime (current-time))))
\paper {
indent = 0
markup-system-spacing #'padding = #6
top-markup-spacing #'padding = #4
oddHeaderMarkup =
\markup \fontsize #-2 \fill-line { \ly-version \compiling-time }
}
\header {
title = "Customizing Double TimeSignatures"
}
\layout {
\context {
\Score
\override RehearsalMark.self-alignment-X = #LEFT
\override RehearsalMark.font-series = #'bold
\override RehearsalMark.font-size = -2
\override RehearsalMark.padding = 3
\override RehearsalMark.break-align-symbols = #'(left-edge)
\override BarNumber.stencil = ##f
}
\context {
\Score
\override TimeSignature.break-visibility = ##(#f #t #t)
}
}
%little helper:
printTS =
\once \override Staff.TimeSignature.stencil = #ly:time-signature::print
%% The music
m-four =
\relative c' {
\time 4/4
c4 d e f
}
m-six =
\relative c' {
\time 6/4
c4 d e f e d
\break
}
m = { \m-four \m-six }
%% The example
\new Staff \with { \override TimeSignature.stencil = ##f }
\relative c' {
\mark "default"
\printTS \m-four
\printTS \m-six
\mark "customTimeSig using fractions"
\customTimeSig 4/4 6/4
\m
\mark "customTimeSig using fraction and glyph"
\customTimeSig "C22" 6/4
\m
\mark "customTimeSig using fraction, glyph and other font-name"
\once \override Staff.TimeSignature.font-name = "Verdana"
\customTimeSig "C22" 6/4
\m
\mark "using fraction, glyph and other font-name, customizing font-size"
\once \override Staff.TimeSignature.font-name = "Verdana"
\customTimeSig #'(0 2) 6/4 "C22"
\m
\mark "using fraction, glyph and other font-name, customizing baseline-skip"
\once \override Staff.TimeSignature.font-name = "ComicSans MS"
\customTimeSig #'(2.2 0) 6/4 "C22"
\m
\mark "time-sigs for ancient music"
\customTimeSig "neomensural22" "neomensural64"
\m
\mark "default again"
\revert Staff.TimeSignature.stencil
\m
}
HTH,
Harm