<!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.de.html#Top"> <link rel="up" href="Building-complicated-functions.de.html#Building-complicated-functions" title="Building complicated functions"> <link rel="prev" href="Doubling-a-note-with-slurs-_0028example_0029.de.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: <a rel="previous" accesskey="p" href="Doubling-a-note-with-slurs-_0028example_0029.de.html#Doubling-a-note-with-slurs-_0028example_0029">Doubling a note with slurs (example)</a>, Up: <a rel="up" accesskey="u" href="Building-complicated-functions.de.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.de.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 -. -> } </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">{ << \music s1*0-.-> } </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 ===> (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-> ===> (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 ‘place’) is the ‘elements’ 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: <a rel="previous" accesskey="p" href="Doubling-a-note-with-slurs-_0028example_0029.de.html#Doubling-a-note-with-slurs-_0028example_0029">Doubling a note with slurs (example)</a>, Up: <a rel="up" accesskey="u" href="Building-complicated-functions.de.html#Building-complicated-functions">Building complicated functions</a> </div> <div style="background-color: #e8ffe8; padding: 2; border: #c0ffc0 1px solid;"> <p> <font size="-1"> Diese Seite ist für LilyPond-2.11.57 (Entwicklungszweig). <br> <address> Fehler bitte an <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> melden. </address> <br> Ihre <a href="http://lilypond.org/web/devel/participating/documentation-adding">Vorschläge für die Dokumentation</a> sind willkommen. </font> </p> </div> </BODY></html>