@end ignore
+@item
+It is now possible to move systems with reference to their current
+position using the @code{extra-offset} subproperty of
+@code{NonMusicalPaperColumn.line-break-system-details}. Both vertical
+and horizontal changes are possible. This feature is especially useful
+for making slight adjustments to the default vertical position of
+individual systems. See @ruser{Explicit staff and system positioning} for
+more information.
+
@item
It is now possible to add text to analysis brackets through the
@code{HorizontalBracketText} object.
involved to become more involved. LilyPond participates in GSoC as part
of the @uref{http://www.gnu.org/, GNU project}.
-We have had GSoC participants in 2012, 2015 and 2016 and encourage
-students to apply for the 2017 program.
-
-If you are interested to apply for the program with LilyPond as a
-project, please read the information below and don't hesitate to write
-us on our developer mailing list (see @ref{Contact}). The student
-application window is March 20 to April 3, 2017, but we strongly
-encourage you to get in touch with our community ahead of that.
+We have had GSoC participants in 2012, 2015, 2016 and 2017. This site
+will be updated in time before the 2018 season will start.
@divEnd
@divClass{column-center-middle-color2 bigger-subsubheadings}
@subheading Project Ideas List
-Below is a list of GSoC project ideas (last update: January 2017), but
+Below is a list of GSoC project ideas (last update: May 2017), but
if you have other ideas for a project you may complete within the three
months of the program you're welcome to make a suggestion on our
developer mailing list (see @ref{Contact}). There are a number of areas
@uref{http://sourceforge.net/p/testlilyissues/issues/, here}.
-@subsubheading Improve internal chord structure
-
-The internal representation of LilyPond chords is not powerful enough
-to capture the nomenclature of jazz chords. Currently the chord has
-a root, a bass and an inversion. It would be nice to be able to handle
-stacked or polychords, minor/major, etc. In order to do this, an
-internal representation with the ability to capture the essence of
-complex chords must be developed. As a bonus, once the internal
-representation is developed, the output formatting of chord names can
-be improved.
-
-@emph{Difficulty:} Easy/medium
-
-@emph{Requirements:} Scheme (Guile), but the level necessary can be
-easily learned
-
-@emph{Recommended:} Chord theory and naming
-
-@emph{Mentor:} Carl Sorensen
-
-
@subsubheading Adopt the SMuFL music font encoding standard
For several years now a new standard for music fonts has been around:
the input. For example,
@example
-width = 4.5\cm
-name = "Wendy"
-aFivePaper = \paper @{ paperheight = 21.0 \cm @}
+myWidth = 60 % a number to pass to a \paper variable (the unit is millimeter)
+myName = "Wendy" % a string to pass to a markup
+aFivePaper = \paper @{ #(set-paper-size "a5") @}
@end example
Depending on its contents, the variable can be used in different
@example
\paper @{
\aFivePaper
- line-width = \width
+ line-width = \myWidth
@}
@{
- c4^\name
+ c4^\myName
@}
@end example
can specify exact vertical positions on the page.
@code{NonMusicalPaperColumn.line-break-system-details} accepts
-an associative list of three different settings:
+an associative list of four different settings:
@itemize
@item @code{X-offset}
@item @code{Y-offset}
+@item @code{extra-offset}
@item @code{alignment-distances}
@end itemize
too, that the @code{Y-offset} property here determines the exact vertical
position on the page at which each new system will render.
+In contrast to the absolute positioning available through
+@code{Y-offset} and @code{X-offset}, relative positioning is possible
+with the @code{extra-offset} property of
+@code{line-break-system-details}. Placement is relative to the
+default layout or to the absolute positioning created by setting
+@code{X-offset} and @code{Y-offset}. The property @code{extra-offset}
+accepts a @code{pair} consisting of displacements along the X-axis and
+Y-axis.
+
+@lilypond[verbatim,quote,staffsize=16]
+\header { tagline = ##f }
+\paper { left-margin = 0\mm }
+\book {
+ \score {
+ <<
+ \new Staff <<
+ \new Voice {
+ s1*5 \break
+ \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details
+ #'((extra-offset . (0 . 10)))
+ s1*5 \break
+ \overrideProperty Score.NonMusicalPaperColumn.line-break-system-details
+ #'((extra-offset . (0 . 10)))
+ s1*5 \break
+ }
+ \new Voice { \repeat unfold 15 { c'4 c' c' c' } }
+ >>
+ \new Staff {
+ \repeat unfold 15 { d'4 d' d' d' }
+ }
+ >>
+ }
+}
+@end lilypond
+
Now that we have set the vertical startpoint of each system
explicitly, we can also set the vertical distances between staves
within each system manually. We do this using the @code{alignment-distances}
do not count as a staff.
@item The units of the numbers passed to @code{X-offset},
-@code{Y-offset} and @code{alignment-distances} are interpreted as multiples
-of the distance between adjacent staff lines. Positive values move staves
-and lyrics up, negative values move staves and lyrics down.
+@code{Y-offset}, @code{extra-offset} and @code{alignment-distances} are
+interpreted as multiples of the distance between adjacent staff lines.
+Positive values move staves and lyrics up, negative values move staves
+and lyrics down.
@item Because the @code{NonMusicalPaperColumn.line-break-system-details}
settings given here allow the positioning of staves and systems anywhere
@ifclear web_version
@c no anchor links, just link to News page
-@ref{News, LilyPond 2.19.59 released - @emph{April 09, 2017}}
+@ref{News, LilyPond 2.19.60 released - @emph{May 08, 2017}}
@ref{News, Two LilyPond projects in Google Summer of Code 2016 - @emph{April 23, 2016}}
@ifset web_version
@c anchor links, link to individual news items by their <a> tag
-@uref{news.html#LilyPond-2_002e19_002e59-released-April-09_002c-2017,
- LilyPond 2.19.59 released - @emph{April 09, 2017}}
+@uref{news.html#LilyPond-2_002e19_002e60-released-May-08_002c-2017,
+ LilyPond 2.19.60 released - @emph{May 08, 2017}}
@uref{news.html#Two-LilyPond-projects-in-Google-Summer-of-Code-2016-April-23_002c-2016,
Two LilyPond projects in Google Summer of Code 2016 - @emph{April 23, 2016}}
@c used for news about the upcoming release; see CG on Release Work
@newsItem
-@subheading LilyPond 2.19.59 released @emph{April 09, 2017}
+@subheading LilyPond 2.19.60 released @emph{May 08, 2017}
We are happy to announce the release of LilyPond
-2.19.59. This release includes a number of enhancements, and contains some
+2.19.60. This release includes a number of enhancements, and contains some
work in progress. You will have access to the very latest features, but
some may be incomplete, and you may encounter bugs and crashes. If you
require a stable version of LilyPond, we recommend using the 2.18
* don't duplicate entries from news-new.itexi
@end ignore
+@newsItem
+@subheading LilyPond 2.19.59 released @emph{April 09, 2017}
+
+We are happy to announce the release of LilyPond
+2.19.59. This release includes a number of enhancements, and contains some
+work in progress. You will have access to the very latest features, but
+some may be incomplete, and you may encounter bugs and crashes. If you
+require a stable version of LilyPond, we recommend using the 2.18
+version.
+
+@newsEnd
+
@newsItem
@subheading LilyPond 2.19.58 released @emph{March 26, 2017}
PACKAGE_NAME=LilyPond
MAJOR_VERSION=2
MINOR_VERSION=19
-PATCH_LEVEL=60
+PATCH_LEVEL=61
MY_PATCH_LEVEL=
VERSION_STABLE=2.18.2
-VERSION_DEVEL=2.19.59
+VERSION_DEVEL=2.19.60
--- /dev/null
+\version "2.19.60"
+
+\header {
+ texidoc = "By setting @code{extra-offset} within the
+@code{line-break-system-details} of @code{NonMusicalPaperColumn},
+systems may be moved in relation either to their default position on the
+printable area of the page or the absolute position specified by
+@code{X-offset} or @code{Y-offset} within
+@code{line-break-system-details}."
+
+}
+
+#(set-default-paper-size "a6" 'portrait)
+
+\paper {
+ indent = 0.0
+ oddHeaderMarkup = "header"
+ oddFooterMarkup = "footer"
+ system-separator-markup = \slashSeparator
+ ragged-right = ##t
+}
+
+\book {
+ \score {
+ {
+ \overrideProperty
+ Score.NonMusicalPaperColumn.line-break-system-details
+ #'((extra-offset . (8.0 . 0.0)))
+ c1 c1 \break
+
+ \overrideProperty
+ Score.NonMusicalPaperColumn.line-break-system-details
+ #'((extra-offset . (12.0 . 8.0)))
+ c1 c1 \break
+
+ \overrideProperty
+ Score.NonMusicalPaperColumn.line-break-system-details
+ #'((X-offset . 8.0)
+ (Y-offset . 36.0)
+ (extra-offset . (-8.0 . 30.0))
+ )
+ c1 c1
+ }
+ }
+}
AA {A}|_
N [0-9]
ANY_CHAR (.|\n)
-WORD {A}([-_]{A}|{A})*
-COMMAND \\{WORD}
+SYMBOL {A}([-_]{A}|{A})*
+COMMAND \\{SYMBOL}
/* SPECIAL category is for every letter that needs to get passed to
* the parser rather than being redefinable by the user */
SPECIAL [-+*/=<>{}!?_^'',.:]
/* Flex picks the longest matching pattern including trailing
* contexts. Without the backup pattern, r-. does not trigger the
- * {RESTNAME} rule but rather the {WORD}/[-_] rule coming later,
+ * {RESTNAME} rule but rather the {SYMBOL}/[-_] rule coming later,
* needed for avoiding backup states.
*/
}
<notes,figures>{
- {WORD}/[-_] | // backup rule
- {WORD} {
+ {SYMBOL}/[-_] | // backup rule
+ {SYMBOL} {
return scan_bare_word (YYText_utf8 ());
}
\\\" {
s = lyric_fudge (s);
yylval = ly_string2scm (s);
- return WORD;
+ return SYMBOL;
}
/* This should really just cover {} */
[{}] {
}
}
<chords>{
- {WORD}/[-_] | // backup rule
- {WORD} {
+ {SYMBOL}/[-_] | // backup rule
+ {SYMBOL} {
return scan_bare_word (YYText_utf8 ());
}
\\\" {
string s (YYText_utf8 ());
yylval = ly_string2scm (s);
- return WORD;
+ return SYMBOL;
}
[{}] {
yylval = SCM_UNSPECIFIED;
}
<INITIAL>{
- {WORD}/[-_] | // backup rule
- {WORD} {
+ {SYMBOL}/[-_] | // backup rule
+ {SYMBOL} {
return scan_bare_word (YYText_utf8 ());
}
\\\" {
yylval = ly_string2scm (str);
- return STRING; // WORD would cause additional processing
+ return STRING; // SYMBOL would cause additional processing
}
int
return state;
}
yylval = ly_string2scm (str);
- return WORD;
+ return SYMBOL;
}
int
%token STRING
%token SYMBOL_LIST
%token TONICNAME_PITCH
-%token WORD
+%token SYMBOL
%left '-' '+'
*/
assignment_id:
STRING
- | WORD
+ | SYMBOL
;
assignment:
symbol_list_part_bare:
- WORD
+ SYMBOL
{
$$ = try_word_variants (Lily::key_list_p, $1);
if (SCM_UNBNDP ($$)) {
else
MYREPARSE (@4, $2, SCM_ARG, $4);
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup WORD
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup SYMBOL
{
$$ = $3;
SCM res = try_word_variants ($2, $4);
MYBACKUP (STRING, $4, @4);
}
}
- | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup WORD
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup SYMBOL
{
SCM res = try_word_variants ($2, $4);
if (!SCM_UNBNDP (res))
// know the predicate to be false.
MYREPARSE (@3, $1, SCM_ARG, $3);
}
- | EXPECT_SCM function_arglist_optional WORD
+ | EXPECT_SCM function_arglist_optional SYMBOL
{
$$ = $2;
SCM res = try_word_variants ($1, $3);
| context_def_mod STRING {
$$ = scm_list_2 ($1, $2);
}
- | context_def_mod WORD {
+ | context_def_mod SYMBOL {
$$ = scm_list_2 ($1, $2);
}
| context_def_mod embedded_scm
string:
STRING
- | WORD
+ | SYMBOL
| full_markup
;
text:
STRING
- | WORD
+ | SYMBOL
| full_markup
| embedded_scm_bare
{
;
simple_string: STRING
- | WORD
+ | SYMBOL
| embedded_scm_bare
{
if (scm_is_string ($1)) {
STRING {
$$ = scm_string_to_symbol ($1);
}
- | WORD
+ | SYMBOL
{
if (!is_regular_identifier ($1, false))
parser->parser_error (@1, (_ ("symbol expected")));
make_simple_markup ($1));
$$ = t->unprotect ();
}
- | WORD {
+ | SYMBOL {
// Flag a warning? could be unintentional
Music *t = MY_MAKE_MUSIC ("TextScriptEvent", @$);
t->set_property ("text",
bass_number:
UNSIGNED
| STRING
- | WORD
+ | SYMBOL
| full_markup
| embedded_scm_bare
{
parser->parser_error (@1, _ ("markup outside of text script or \\lyricmode"));
$$ = $1;
}
- | WORD {
+ | SYMBOL {
if (!parser->lexer_->is_lyric_state ())
parser->parser_error (@1, _f ("not a note name: %s", ly_scm2string ($1)));
$$ = $1;
STRING {
$$ = make_simple_markup ($1);
}
- | WORD {
+ | SYMBOL {
$$ = make_simple_markup ($1);
}
| SCORE {
%}
-\version "2.19.59" % necessary for upgrading to future LilyPond versions.
+\version "2.19.60" % necessary for upgrading to future LilyPond versions.
\header{
title = "A scale in LilyPond"
%}
-\version "2.19.59" % necessary for upgrading to future LilyPond versions.
+\version "2.19.60" % necessary for upgrading to future LilyPond versions.
\header{
title = "A scale in LilyPond"
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: lilypond 2.19.59\n"
+"Project-Id-Version: lilypond 2.19.60\n"
"Report-Msgid-Bugs-To: http://post.gmane.org/post.php?group=gmane.comp.gnu."
"lilypond.bugs\n"
-"POT-Creation-Date: 2017-04-09 11:00+0100\n"
+"POT-Creation-Date: 2017-05-07 11:40+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
msgid "cannot find context to switch to"
msgstr ""
-#. No enclosing context was found because the iterator's immediate
-#. context is the kind that was sought.
-#. We could change the current translator's id, but that would make
-#. errors hard to catch.
-#.
-#. last->translator_id_string () = get_change
-#. ()->change_to_id_string ();
-#: change-iterator.cc:78
+#. No enclosing context of the right kind was found
+#. and the iterator's immediate context is the kind that was sought.
+#: change-iterator.cc:74
#, c-format
msgid "not changing to same context type: %s"
msgstr ""
#. FIXME: incomprehensible message
-#: change-iterator.cc:82
+#: change-iterator.cc:78
msgid "none of these in my family"
msgstr ""
msgid "giving up"
msgstr ""
-#: parser.yy:482 parser.yy:649 parser.yy:988 parser.yy:1069 parser.yy:1305
+#: parser.yy:485 parser.yy:652 parser.yy:992 parser.yy:1073 parser.yy:1309
msgid "bad expression type"
msgstr ""
-#: parser.yy:901 parser.yy:1508 parser.yy:1570
+#: parser.yy:905 parser.yy:1512 parser.yy:1574
msgid "not a context mod"
msgstr ""
-#: parser.yy:982 parser.yy:1061 parser.yy:1213
+#: parser.yy:986 parser.yy:1065 parser.yy:1217
msgid "need \\paper for paper block"
msgstr ""
-#: parser.yy:1095
+#: parser.yy:1099
msgid "Missing music in \\score"
msgstr ""
-#: parser.yy:1132
+#: parser.yy:1136
msgid "\\paper cannot be used in \\score, use \\layout instead"
msgstr ""
-#: parser.yy:1183
+#: parser.yy:1187
msgid "Spurious expression in \\score"
msgstr ""
-#: parser.yy:1387
+#: parser.yy:1391
msgid "music expected"
msgstr ""
-#: parser.yy:1397 parser.yy:1431
+#: parser.yy:1401 parser.yy:1435
msgid "unexpected post-event"
msgstr ""
-#: parser.yy:1439
+#: parser.yy:1443
msgid "Ignoring non-music expression"
msgstr ""
-#: parser.yy:1749 parser.yy:1768
+#: parser.yy:1754 parser.yy:1775
msgid "not a key"
msgstr ""
-#: parser.yy:2628 parser.yy:2746 parser.yy:2759 parser.yy:2768
+#: parser.yy:2685 parser.yy:2806 parser.yy:2819 parser.yy:2828
msgid "bad grob property path"
msgstr ""
-#: parser.yy:2726
+#: parser.yy:2786
msgid "only \\consists and \\remove take non-string argument."
msgstr ""
-#: parser.yy:2787
+#: parser.yy:2847
msgid "bad context property path"
msgstr ""
-#: parser.yy:2872
+#: parser.yy:2934
msgid "markup expected"
msgstr ""
-#: parser.yy:2884
+#: parser.yy:2947
msgid "simple string expected"
msgstr ""
-#: parser.yy:2901
+#: parser.yy:2960 parser.yy:2970
msgid "symbol expected"
msgstr ""
-#: parser.yy:3041
+#: parser.yy:3110
msgid "not a rhythmic event"
msgstr ""
-#: parser.yy:3091
+#: parser.yy:3160
msgid "post-event expected"
msgstr ""
-#: parser.yy:3100 parser.yy:3105
+#: parser.yy:3169 parser.yy:3174
msgid "have to be in Lyric mode for lyrics"
msgstr ""
-#: parser.yy:3181
+#: parser.yy:3250
msgid "expecting string or post-event as script definition"
msgstr ""
-#: parser.yy:3285
+#: parser.yy:3361
msgid "not an articulation"
msgstr ""
-#: parser.yy:3351 parser.yy:3403
+#: parser.yy:3427 parser.yy:3479
msgid "not a duration"
msgstr ""
-#: parser.yy:3424
+#: parser.yy:3501
msgid "bass number expected"
msgstr ""
-#: parser.yy:3516
+#: parser.yy:3593
msgid "have to be in Note mode for notes"
msgstr ""
-#: parser.yy:3555
+#: parser.yy:3632
msgid "have to be in Chord mode for chords"
msgstr ""
-#: parser.yy:3598
+#: parser.yy:3675
msgid "markup outside of text script or \\lyricmode"
msgstr ""
-#: parser.yy:3603
+#: parser.yy:3680
#, c-format
msgid "not a note name: %s"
msgstr ""
-#: parser.yy:3755 parser.yy:3764
+#: parser.yy:3685
+msgid "string outside of text script or \\lyricmode"
+msgstr ""
+
+#: parser.yy:3837 parser.yy:3846
msgid "not an unsigned integer"
msgstr ""
-#: parser.yy:3851
+#: parser.yy:3933
msgid "not a markup"
msgstr ""
msgid "undefined character or shorthand: %s"
msgstr ""
-#: lexer.ll:1236
+#: lexer.ll:1247
msgid "non-UTF-8 input"
msgstr ""
-#: lexer.ll:1280
+#: lexer.ll:1291
#, c-format
msgid "Invalid version string \"%s\""
msgstr ""
-#: lexer.ll:1285
+#: lexer.ll:1296
#, c-format
msgid "file too old: %s (oldest supported: %s)"
msgstr ""
-#: lexer.ll:1286
+#: lexer.ll:1297
msgid "consider updating the input with the convert-ly script"
msgstr ""
-#: lexer.ll:1292
+#: lexer.ll:1303
#, c-format
msgid "program too old: %s (file requires: %s)"
msgstr ""
msgid "`~a' failed (~a)\n"
msgstr ""
-#: backend-library.scm:108
+#: backend-library.scm:109
#, scheme-format
msgid "Converting to `~a'...\n"
msgstr ""
#. Do not try to guess the name of the png file,
#. GS produces PNG files like BASE-page%d.png.
-#: backend-library.scm:118
+#: backend-library.scm:119
#, scheme-format
msgid "Converting to ~a..."
msgstr ""
-#: backend-library.scm:134
+#: backend-library.scm:135
#, scheme-format
msgid "Copying to `~a'...\n"
msgstr ""
-#: backend-library.scm:200
+#: backend-library.scm:201
#, scheme-format
msgid "Deleting `~a'...\n"
msgstr ""
-#: backend-library.scm:219
+#: backend-library.scm:220
#, scheme-format
msgid "Writing header field `~a' to `~a'..."
msgstr ""
-#: backend-library.scm:268
+#: backend-library.scm:269
#, scheme-format
msgid "missing stencil expression `~S'"
msgstr ""
msgid "defaulting to ~S pt"
msgstr ""
-#: define-markup-commands.scm:3863
+#: define-markup-commands.scm:3867
#, scheme-format
msgid "not a valid duration string: ~a"
msgstr ""
-#: define-markup-commands.scm:4076
+#: define-markup-commands.scm:4080
#, scheme-format
msgid "not a valid duration string: ~a - ignoring"
msgstr ""
msgid "Font export directory `~a' already exists."
msgstr ""
-#: framework-ps.scm:901
+#: framework-ps.scm:907
msgid ""
"\n"
"The PostScript backend does not support the\n"
msgid "Bad chord repetition"
msgstr ""
-#: music-functions.scm:966
+#: music-functions.scm:968
+#, scheme-format
+msgid "Bad voice id: ~a"
+msgstr ""
+
+#: music-functions.scm:979
+msgid "\\voices needs more ids"
+msgstr ""
+
+#: music-functions.scm:998
#, scheme-format
msgid "music expected: ~S"
msgstr ""
-#: music-functions.scm:1316
+#: music-functions.scm:1348
#, scheme-format
msgid "cannot find quoted music: `~S'"
msgstr ""
-#: music-functions.scm:1453
+#: music-functions.scm:1485
msgid "Add @var{octave-shift} to the octave of @var{pitch}."
msgstr ""
-#: music-functions.scm:1516
+#: music-functions.scm:1548
#, scheme-format
msgid "Unknown octaveness type: ~S "
msgstr ""
-#: music-functions.scm:1517
+#: music-functions.scm:1549
msgid "Defaulting to 'any-octave."
msgstr ""
-#: music-functions.scm:1916
+#: music-functions.scm:1948
#, scheme-format
msgid "unknown accidental style: ~S"
msgstr ""
-#: music-functions.scm:2141
+#: music-functions.scm:2173
msgid "Missing duration"
msgstr ""
-#: music-functions.scm:2662
+#: music-functions.scm:2694
#, scheme-format
msgid "not a symbol list: ~a"
msgstr ""
-#: music-functions.scm:2665
+#: music-functions.scm:2697
#, scheme-format
msgid "conflicting tag group ~a"
msgstr ""
system-separator-markup)
#f))
- (page-stencil (ly:make-stencil '()))
+ (page-stencil empty-stencil)
(last-system #f)
(last-y 0.0)
(add-system
(lambda (system)
(let* ((stencil (paper-system-stencil system))
- (y (ly:prob-property system 'Y-offset 0))
+ (extra-offset (ly:prob-property system 'extra-offset '(0 . 0)))
+ (x (+ (ly:prob-property system 'X-offset 0.0)
+ (car extra-offset)))
+ (y (+ (ly:prob-property system 'Y-offset 0.0)
+ (cdr extra-offset)))
(is-title (paper-system-title?
system)))
- (add-to-page stencil
- (ly:prob-property system 'X-offset 0.0)
- y)
+ (add-to-page stencil x y)
(if (and (ly:stencil? system-separator-stencil)
last-system
(not (paper-system-title? system))
replaced-stil))
(define-public (stencil-with-color stencil color)
- (ly:make-stencil
- (list 'color color (ly:stencil-expr stencil))
- (ly:stencil-extent stencil X)
- (ly:stencil-extent stencil Y)))
+ (if (color? color)
+ (ly:make-stencil
+ (list 'color color (ly:stencil-expr stencil))
+ (ly:stencil-extent stencil X)
+ (ly:stencil-extent stencil Y))
+ stencil))
(define*-public (stencil-whiteout-outline
stil #:optional (thickness 0.3) (color white)