Sophie

Sophie

distrib > Mandriva > 2009.0 > i586 > by-pkgid > 3a7b4dfc766af1222d90c7f03a0844e6 > files > 6704

lilypond-doc-2.11.57-1mdv2009.0.i586.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<!-- header_tag -->
<html lang="en">
<head>
<title>Adding articulation to notes (example) - GNU LilyPond Notation Reference</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="description" content="GNU LilyPond Notation Reference">
<meta name="generator" content="makeinfo 4.11">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Building-complicated-functions.html#Building-complicated-functions" title="Building complicated functions">
<link rel="prev" href="Doubling-a-note-with-slurs-_0028example_0029.html#Doubling-a-note-with-slurs-_0028example_0029" title="Doubling a note with slurs (example)">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
Copyright (C) 1999--2007 by the authors

     Permission is granted to copy, distribute and/or modify this
     document under the terms of the GNU Free Documentation License,
     Version 1.1 or any later version published by the Free Software
     Foundation; with no Invariant Sections.  A copy of the license is
     included in the section entitled ``GNU Free Documentation
     License''.
   -->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
  pre.display { font-family:inherit }
  pre.format  { font-family:inherit }
  pre.smalldisplay { font-family:inherit; font-size:smaller }
  pre.smallformat  { font-family:inherit; font-size:smaller }
  pre.smallexample { font-size:smaller }
  pre.smalllisp    { font-size:smaller }
  span.sc    { font-variant:small-caps }
  span.roman { font-family:serif; font-weight:normal; } 
  span.sansserif { font-family:sans-serif; font-weight:normal; } 
hr { border:0; height:1; color: #000000; background-color: #000000; }
/* hr {
  border:  none;
  height: 1px;
  color: #666666;
  background-color: #666666;
}
body {
  border-left: 1px solid #666666;
  border-right: 1px solid #666666;
  color: #332d28;
  margin-right: auto;
  margin-left: auto;
  width: 60em;
  list-style-type: square;
  font-family: Arial,Helvetica,sans-serif;
  padding-right: 1em;
  padding-left: 1em;
}
a {
  border-bottom: 1px dashed #344242;
  text-decoration: none;
  color: #344242;
}
a:link {
  text-decoration: none;
}
a:visited {
  border-bottom: 1px dashed #666666;
  color: #666666;
}
a:active {
  border-bottom: 1px solid #00cccc;
  color: #00cccc;
}
a:hover {
  border-bottom: 1px solid #1d7b85;
  color: #1d7b85;
}
blockquote {
  border: 1px solid #cccccc;
  padding: 3px;
  width: 40em;
}
.node {
  border-left: 1px solid #666666;
  margin: -0.5em 0px 1em;
  padding: 2px 1px 0px;
  font-style: italic;
}
.node a {
  border:  none;
  text-decoration: underline;
  font-style: normal;
  font-weight: bold;
}
.verbatim {
  font-family: "Courier New",Courier,monospace;
}
.unnumberedsubsubsec {
  font-size: large;
  color: #1d7b85;
}
.subsubheading {
  font-size: large;
  color: #3b220d;
}
.contents {
  border: 1px dashed #339999;
  margin: 3px 2em;
  list-style-type: square;
  padding-right: 1em;
  width: 40em;
  background-color: #fcfff9;
}
.contents a {
  border-bottom: 1px dashed #423d34;
  text-decoration: none;
  color: #423d34;
}
.contents a:visited {
  border-bottom: 1px dashed #666666;
  color: #666666;
}
.contents a:active {
  border-bottom: 1px solid #f0d86d;
  color: #f0d86d;
}
.contents a:hover {
  border-bottom: 1px solid #3b220d;
  color: #3b220d;
}
.menu {
  border-left: 1px dashed #339999;
  margin: 3px 2em 1em;
  list-style-type: square;
  padding-left: 1.4em;
  width: 40em;
}
.unnumbered {
}
h2 {
  font-size: x-large;
  color: #1d7b85;
}
*/
--></style>
</head>
<BODY BGCOLOR=WHITE TEXT=BLACK>

<div class="node">
<p>
<a name="Adding-articulation-to-notes-(example)"></a>
<a name="Adding-articulation-to-notes-_0028example_0029"></a>
Previous:&nbsp;<a rel="previous" accesskey="p" href="Doubling-a-note-with-slurs-_0028example_0029.html#Doubling-a-note-with-slurs-_0028example_0029">Doubling a note with slurs (example)</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Building-complicated-functions.html#Building-complicated-functions">Building complicated functions</a>
<hr>
</div>

<h4 class="subsection">6.3.4 Adding articulation to notes (example)</h4>

<p>The easy way to add articulation to notes is to merge two music
expressions into one context, as explained in
<a href="Creating-contexts.html#Creating-contexts">Creating contexts</a>.  However, suppose that we want to write
a music function which does this.

   <p>A <code>$variable</code> inside the <code>#{...#}</code> notation is like
using a regular <code>\variable</code> in classical LilyPond
notation.  We know that

<pre class="example">{ \music -. -&gt; }
</pre>
   <p class="noindent">will not work in LilyPond.  We could avoid this problem by attaching
the articulation to a fake note,

<pre class="example">{ &lt;&lt; \music s1*0-.-&gt; }
</pre>
   <p class="noindent">but for the sake of this example, we will learn how to do this in
Scheme.  We begin by examining our input and desired output,

<pre class="example">%  input
\displayMusic c4
===&gt;
(make-music
  'EventChord
  'elements
  (list (make-music
          'NoteEvent
          'duration
          (ly:make-duration 2 0 1 1)
          'pitch
          (ly:make-pitch -1 0 0))))
=====
%  desired output
\displayMusic c4-&gt;
===&gt;
(make-music
  'EventChord
  'elements
  (list (make-music
          'NoteEvent
          'duration
          (ly:make-duration 2 0 1 1)
          'pitch
          (ly:make-pitch -1 0 0))
        (make-music
          'ArticulationEvent
          'articulation-type
          "marcato")))
</pre>
   <p>We see that a note (<code>c4</code>) is represented as an <code>EventChord</code>
expression, with a <code>NoteEvent</code> expression in its elements list.  To
add a marcato articulation, an <code>ArticulationEvent</code> expression must
be added to the elements property of the <code>EventChord</code>
expression.

   <p>To build this function, we begin with

<pre class="example">(define (add-marcato event-chord)
  "Add a marcato ArticulationEvent to the elements of `event-chord',
  which is supposed to be an EventChord expression."
  (let ((result-event-chord (ly:music-deep-copy event-chord)))
    (set! (ly:music-property result-event-chord 'elements)
          (cons (make-music 'ArticulationEvent
                  'articulation-type "marcato")
                (ly:music-property result-event-chord 'elements)))
    result-event-chord))
</pre>
   <p>The first line is the way to define a function in Scheme: the function
name is <code>add-marcato</code>, and has one variable called
<code>event-chord</code>.  In Scheme, the type of variable is often clear
from its name.  (this is good practice in other programming languages,
too!)

<pre class="example">"Add a marcato..."
</pre>
   <p class="noindent">is a description of what the function does.  This is not strictly
necessary, but just like clear variable names, it is good practice.

<pre class="example">(let ((result-event-chord (ly:music-deep-copy event-chord)))
</pre>
   <p><code>let</code> is used to declare local variables.  Here we use one local
variable, named <code>result-event-chord</code>, to which we give the value
<code>(ly:music-deep-copy event-chord)</code>.  <code>ly:music-deep-copy</code> is
a function specific to LilyPond, like all functions prefixed by
<code>ly:</code>.  It is use to make a copy of a music
expression.  Here we copy <code>event-chord</code> (the parameter of the
function).  Recall that our purpose is to add a marcato to an
<code>EventChord</code> expression.  It is better to not modify the
<code>EventChord</code> which was given as an argument, because it may be
used elsewhere.

   <p>Now we have a <code>result-event-chord</code>, which is a
<code>NoteEventChord</code> expression and is a copy of <code>event-chord</code>.  We
add the marcato to its elements list property.

<pre class="example">(set! place new-value)
</pre>
   <p>Here, what we want to set (the &lsquo;place&rsquo;) is the &lsquo;elements&rsquo; property of
<code>result-event-chord</code> expression.

<pre class="example">(ly:music-property result-event-chord 'elements)
</pre>
   <p><code>ly:music-property</code> is the function used to access music properties
(the <code>'elements</code>, <code>'duration</code>, <code>'pitch</code>, etc, that we
see in the <code>\displayMusic</code> output above).  The new value is the
former elements property, with an extra item: the
<code>ArticulationEvent</code> expression, which we copy from the
<code>\displayMusic</code> output,

<pre class="example">(cons (make-music 'ArticulationEvent
        'articulation-type "marcato")
      (ly:music-property result-event-chord 'elements))
</pre>
   <p><code>cons</code> is used to add an element to a list without modifying the
original list.  This is what we
want: the same list as before, plus the new <code>ArticulationEvent</code>
expression.  The order inside the elements property is not important here.

   <p>Finally, once we have added the marcato articulation to its <code>elements</code>
property, we can return <code>result-event-chord</code>, hence the last line of
the function.

   <p>Now we transform the <code>add-marcato</code> function into a music
function,

<pre class="example">addMarcato = #(define-music-function (parser location event-chord)
                                     (ly:music?)
    "Add a marcato ArticulationEvent to the elements of `event-chord',
    which is supposed to be an EventChord expression."
    (let ((result-event-chord (ly:music-deep-copy event-chord)))
      (set! (ly:music-property result-event-chord 'elements)
            (cons (make-music 'ArticulationEvent
                    'articulation-type "marcato")
                  (ly:music-property result-event-chord 'elements)))
      result-event-chord))
</pre>
   <p>We may verify that this music function works correctly,

<pre class="example">\displayMusic \addMarcato c4
</pre>
   <!-- footer_tag --><br><hr>
<div class="node">
<p>
<a name="Adding-articulation-to-notes-_0028example_0029"></a>
Previous:&nbsp;<a rel="previous" accesskey="p" href="Doubling-a-note-with-slurs-_0028example_0029.html#Doubling-a-note-with-slurs-_0028example_0029">Doubling a note with slurs (example)</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Building-complicated-functions.html#Building-complicated-functions">Building complicated functions</a>
</div>

<div style="background-color: #e8ffe8; padding: 2; border: #c0ffc0 1px solid;">
<p>
<font size="-1">
This page is for LilyPond-2.11.57 (development-branch).
<br>
<address>
Report errors to <a href="http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs">http://post.gmane.org/post.php?group=gmane.comp.gnu.lilypond.bugs</a>. </address>
<br>
Your <a href="http://lilypond.org/web/devel/participating/documentation-adding">suggestions for the documentation</a> are welcome.
</font>
</p>
</div>

</BODY></html>