<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://davidluzgouveia.github.io/xna/feed.xml" rel="self" type="application/atom+xml" /><link href="https://davidluzgouveia.github.io/xna/" rel="alternate" type="text/html" /><updated>2026-03-08T18:01:45+00:00</updated><id>https://davidluzgouveia.github.io/xna/feed.xml</id><title type="html">David Gouveia</title><subtitle></subtitle><entry><title type="html">One-line Algorithmic Music in XNA</title><link href="https://davidluzgouveia.github.io/xna/one-line-algorithmic-music-in-xna" rel="alternate" type="text/html" title="One-line Algorithmic Music in XNA" /><published>2011-10-21T00:00:00+00:00</published><updated>2011-10-21T00:00:00+00:00</updated><id>https://davidluzgouveia.github.io/xna/one-line-algorithmic-music-in-xna</id><content type="html" xml:base="https://davidluzgouveia.github.io/xna/one-line-algorithmic-music-in-xna"><![CDATA[<p>Last week I found an interesting video on YouTube, accompanied by an <a href="http://countercomplex.blogspot.com/2011/10/algorithmic-symphonies-from-one-line-of.html">article</a>:</p>

<iframe width="420" height="315" src="//www.youtube.com/embed/qlrs2Vorw2Y?rel=0" frameborder="0" allowfullscreen=""></iframe>

<p>I liked the idea so much that I decided to give it a try on XNA. I also saw a <a href="http://wurstcaptures.untergrund.net/music/">JavaScript implementation online</a>, where the user could write the code directly into an input field, and the application would generate the corresponding sound clip for you. This left me wondering about two points in particular:</p>

<ol>
  <li>Can I get the XNA Audio API to work on a Windows Form application as a standalone, i.e. without having a Game instance or even graphics at all?</li>
  <li>Is there a way to let the user write the code into a text box and hear the result without having to recompile the application?</li>
</ol>

<p>The answer to both questions is yes. Here’s how I did it.</p>

<h2 id="using-the-xna-audio-api-as-a-standalone-library">Using the XNA Audio API as a standalone library</h2>

<p>This one was particularly easy to solve. I started by creating a Windows Forms application and manually <em>adding a reference</em> to the Microsoft.Xna.Framework assembly. This was enough to grant me access to everything I needed from XNA, in particular the DynamicSoundEffectInstance class.</p>

<p>There’s one catch though. If you’re not using the Game class (such as in this case), XNA expects you to call the FrameworkDispatcher.Update() method periodically. I’ve read that around 20 times a second is enough so I went with that. You also need to call that method at least once before starting audio playback, or your application will crash.</p>

<p>Here’s how I solved it. Note: If you’re not familiar with XNA’s dynamic audio API then check one of my earlier articles such as this: <a href="/xna/creating-a-basic-synth-in-xna-part-ii">Creating a Basic Synth in XNA 4.0 - Part II</a>.</p>

<ol>
  <li>Created a new thread for the audio.</li>
  <li>On that new thread, I started by calling FrameworkDispatcher.Update() once.</li>
  <li>Then I enter a loop where I call FrameworkDispatcher.Update() again, and submit my audio buffers.</li>
  <li>I added a Thread.Sleep(50) at the end of the loop to make it loop roughly 20 times per second.</li>
</ol>

<p>Here’s the relevant part of the code. When the form has finished loading, I create my audio buffer, a DynamicSoundEffectInstance object, and start the audio thread:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">protected</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnLoad</span><span class="p">(</span><span class="n">EventArgs</span> <span class="n">e</span><span class="p">)</span>
<span class="p">{</span>
    <span class="c1">// Create byte buffer for storing and submitting audio samples</span>
    <span class="n">_buffer</span> <span class="p">=</span> <span class="k">new</span> <span class="kt">byte</span><span class="p">[</span><span class="m">256</span><span class="p">*</span><span class="m">2</span><span class="p">];</span>

    <span class="c1">// Create a new DynamicSoundEffectInstance at 8Khz Mono</span>
    <span class="n">_instance</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">DynamicSoundEffectInstance</span><span class="p">(</span><span class="m">8000</span><span class="p">,</span> <span class="n">AudioChannels</span><span class="p">.</span><span class="n">Mono</span><span class="p">);</span>

    <span class="c1">// Creates and starts the audio thread</span>
    <span class="k">new</span> <span class="nf">Thread</span><span class="p">(</span><span class="n">AudioThread</span><span class="p">).</span><span class="nf">Start</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And this is the thread method. The comments should make it self-explanatory:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="k">void</span> <span class="nf">AudioThread</span><span class="p">()</span>
<span class="p">{</span>
    <span class="c1">// Service the XNA Framework once before everything is started</span>
    <span class="n">FrameworkDispatcher</span><span class="p">.</span><span class="nf">Update</span><span class="p">();</span>

    <span class="c1">// Start the DynamicSoundEffectInstance</span>
    <span class="n">_instance</span><span class="p">.</span><span class="nf">Play</span><span class="p">();</span>

    <span class="c1">// Go into a loop that repeats around 20 times per second (50ms sleep)</span>
    <span class="k">while</span> <span class="p">(</span><span class="n">_running</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="c1">// Service the XNA Framework once per loop</span>
        <span class="n">FrameworkDispatcher</span><span class="p">.</span><span class="nf">Update</span><span class="p">();</span>

        <span class="c1">// Fill and submit buffer</span>
        <span class="k">while</span> <span class="p">(</span><span class="n">_instance</span><span class="p">.</span><span class="n">PendingBufferCount</span> <span class="p">&amp;</span><span class="n">lt</span><span class="p">;</span> <span class="m">3</span><span class="p">)</span>
            <span class="nf">SubmitBuffer</span><span class="p">();</span>

        <span class="n">Thread</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="m">50</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>To make the audio thread quit when the application exists, I did this:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">protected</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnClosed</span><span class="p">(</span><span class="n">EventArgs</span> <span class="n">e</span><span class="p">)</span>
<span class="p">{</span>
    <span class="c1">// Triggers the audio thread to close</span>
    <span class="n">_running</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Finally, here’s what I did to submit the audio buffers. I’ll talk about the GetSample() method later, since it’s linked to the runtime compiler side of the application (the part which lets you write and listen to your own code in real-time). Also notice that in the for-loop I also increment an integer variable called “_time”. This is the value that will correspond to the “t” on our formulas:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="k">void</span> <span class="nf">SubmitBuffer</span><span class="p">()</span>
<span class="p">{</span>
    <span class="c1">// Fill the buffer and advance time</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">!=</span> <span class="n">_buffer</span><span class="p">.</span><span class="n">Length</span><span class="p">;</span> <span class="p">++</span><span class="n">i</span><span class="p">,</span> <span class="p">++</span><span class="n">_time</span><span class="p">)</span>
        <span class="n">_buffer</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">=</span> <span class="p">(</span><span class="kt">byte</span><span class="p">)</span> <span class="nf">GetSample</span><span class="p">();</span>

    <span class="c1">// Submit buffer</span>
    <span class="n">_instance</span><span class="p">.</span><span class="nf">SubmitBuffer</span><span class="p">(</span><span class="n">_buffer</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And just to make it complete, here’s all of the member variables used. Unlike my earlier synth articles, these algorithms work directly with bytes, so I only needed to create a single byte buffer to do the processing:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="n">DynamicSoundEffectInstance</span> <span class="n">_instance</span><span class="p">;</span>
<span class="k">private</span> <span class="kt">byte</span><span class="p">[]</span> <span class="n">_buffer</span><span class="p">;</span>
<span class="k">private</span> <span class="kt">int</span> <span class="n">_time</span><span class="p">;</span>
<span class="k">private</span> <span class="n">Type</span> <span class="n">_generatorType</span><span class="p">;</span>
<span class="k">private</span> <span class="kt">bool</span> <span class="n">_running</span> <span class="p">=</span> <span class="k">true</span><span class="p">;</span>
</code></pre></div></div>

<p>That’s all for the audio generation part of the application. Now for the part that takes your one-line algorithm (as a string) and turns it into code that you can execute!</p>

<h2 id="the-c-runtime-compiler">The C# Runtime Compiler</h2>

<p>Dynamic languages usually have a method that lets you execute code in the form of a string (frequently named something like “eval”). However, C# does not have such a mechanism. What it does have however, is a way to compile and assemble C# code at runtime. This means that you can write a complete class as a string, feed it through the runtime compiler, and then have access to it like any other class in your project (by making use of some Reflection).</p>

<p>So, imagine we had a class like this:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">namespace</span> <span class="nn">MusicAlgorithm</span> <span class="p">{</span>
    <span class="k">public</span> <span class="k">static</span> <span class="k">class</span> <span class="nc">AudioGenerator</span> <span class="p">{</span>
        <span class="k">public</span> <span class="k">static</span> <span class="kt">int</span> <span class="nf">Generate</span><span class="p">(</span><span class="kt">int</span> <span class="n">t</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="k">return</span> <span class="cm">/* YOUR ALGORITHM HERE */</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Then all we’d need to do is call the static AudioGenerator.Generate(_time) method using our “_time” variable, and store the resulting value in our audio buffer. Here’s how you can compile and assemble a class like this at runtime. Read through the comments for a better understanding of what I did:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="k">void</span> <span class="nf">SetAlgorithm</span><span class="p">(</span><span class="kt">string</span> <span class="n">algorithm</span><span class="p">)</span>
<span class="p">{</span>
    <span class="c1">// Reset values</span>
    <span class="n">_time</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span>
    <span class="n">_generatorType</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span>

    <span class="c1">// Ignore if the user wrote nothing</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">String</span><span class="p">.</span><span class="nf">IsNullOrWhiteSpace</span><span class="p">(</span><span class="n">algorithm</span><span class="p">))</span>
        <span class="k">return</span><span class="p">;</span>

    <span class="c1">// Create string containing the code for the class</span>
    <span class="c1">// It concatenates the algorithm written by the user with the return statement</span>
    <span class="n">StringBuilder</span> <span class="n">codeBuilder</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">StringBuilder</span><span class="p">();</span>
    <span class="n">codeBuilder</span><span class="p">.</span><span class="nf">AppendLine</span><span class="p">(</span><span class="s">"namespace MusicAlgorithm {"</span><span class="p">);</span>
    <span class="n">codeBuilder</span><span class="p">.</span><span class="nf">AppendLine</span><span class="p">(</span><span class="s">" public static class AudioGenerator {"</span><span class="p">);</span>
    <span class="n">codeBuilder</span><span class="p">.</span><span class="nf">AppendLine</span><span class="p">(</span><span class="s">" public static int Generate(int t) { return "</span> <span class="p">+</span> <span class="n">algorithm</span> <span class="p">+</span> <span class="s">"; }"</span><span class="p">);</span>
    <span class="n">codeBuilder</span><span class="p">.</span><span class="nf">AppendLine</span><span class="p">(</span><span class="s">" }"</span><span class="p">);</span>
    <span class="n">codeBuilder</span><span class="p">.</span><span class="nf">AppendLine</span><span class="p">(</span><span class="s">"}"</span><span class="p">);</span>
    <span class="kt">string</span> <span class="n">code</span> <span class="p">=</span> <span class="n">codeBuilder</span><span class="p">.</span><span class="nf">ToString</span><span class="p">();</span>

    <span class="c1">// Compile code string in memory. Notice that the language chosen is C#</span>
    <span class="c1">// And how the GenerateExecutable and GenerateInMemory properties are set</span>
    <span class="n">CodeDomProvider</span> <span class="n">codeDomProvider</span> <span class="p">=</span> <span class="n">CodeDomProvider</span><span class="p">.</span><span class="nf">CreateProvider</span><span class="p">(</span><span class="s">"C#"</span><span class="p">);</span>
    <span class="n">CompilerParameters</span> <span class="n">compileParams</span> <span class="p">=</span> <span class="k">new</span> <span class="n">CompilerParameters</span> <span class="p">{</span> <span class="n">GenerateExecutable</span> <span class="p">=</span> <span class="k">false</span><span class="p">,</span> <span class="n">GenerateInMemory</span> <span class="p">=</span> <span class="k">true</span> <span class="p">};</span>
    <span class="n">CompilerResults</span> <span class="n">compilerResults</span> <span class="p">=</span> <span class="n">codeDomProvider</span><span class="p">.</span><span class="nf">CompileAssemblyFromSource</span><span class="p">(</span><span class="n">compileParams</span><span class="p">,</span> <span class="k">new</span><span class="p">[]</span> <span class="p">{</span><span class="n">code</span><span class="p">});</span>

    <span class="c1">// On error display message and exit</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">compilerResults</span><span class="p">.</span><span class="n">Errors</span><span class="p">.</span><span class="n">HasErrors</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">MessageBox</span><span class="p">.</span><span class="nf">Show</span><span class="p">(</span><span class="nf">GetErrorMessage</span><span class="p">(</span><span class="n">compilerResults</span><span class="p">));</span>
        <span class="k">return</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="c1">// Otherwise store a Type reference to the assembly we compiled</span>
    <span class="c1">// Using reflection we can call the Generate method from this Type</span>
    <span class="n">_generatorType</span> <span class="p">=</span> <span class="n">compilerResults</span><span class="p">.</span><span class="n">CompiledAssembly</span><span class="p">.</span><span class="nf">GetType</span><span class="p">(</span><span class="s">"MusicAlgorithm.AudioGenerator"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>By the way, GetErrorMessage() is just an helper method I made to join all the error messages in a single string for output. It is defined like so:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="k">static</span> <span class="kt">string</span> <span class="nf">GetErrorMessage</span><span class="p">(</span><span class="n">CompilerResults</span> <span class="n">compilerResults</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">StringBuilder</span> <span class="n">errorBuilder</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">StringBuilder</span><span class="p">();</span>
    <span class="k">foreach</span> <span class="p">(</span><span class="n">CompilerError</span> <span class="n">compilerError</span> <span class="k">in</span> <span class="n">compilerResults</span><span class="p">.</span><span class="n">Errors</span><span class="p">)</span>
        <span class="n">errorBuilder</span><span class="p">.</span><span class="nf">AppendLine</span><span class="p">(</span><span class="n">compilerError</span><span class="p">.</span><span class="n">ErrorText</span><span class="p">);</span>
    <span class="k">return</span> <span class="n">errorBuilder</span><span class="p">.</span><span class="nf">ToString</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>By the end of it, if calling SetAlgorithm(algorithm) did not find any errors on your code, then the Type object “_generatorType” will be pointing at the type of the class you compiled at runtime. Using this Type object, you can simply use Reflection to invoke the Generate method on it:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="kt">int</span> <span class="nf">GetSample</span><span class="p">()</span>
<span class="p">{</span>
    <span class="c1">// Redirects the call to our compiled code if any</span>
    <span class="k">return</span> <span class="n">_generatorType</span> <span class="p">!=</span> <span class="k">null</span> <span class="p">?</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span> <span class="n">_generatorType</span><span class="p">.</span><span class="nf">GetMethod</span><span class="p">(</span><span class="s">"Generate"</span><span class="p">).</span><span class="nf">Invoke</span><span class="p">(</span><span class="k">null</span><span class="p">,</span> <span class="k">new</span> <span class="kt">object</span><span class="p">[]</span> <span class="p">{</span><span class="n">_time</span><span class="p">})</span> <span class="p">:</span> <span class="m">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And that’s all. I was worried that this might turn out to be too slow for real-time usage, but it seems to work okay, at least on my machine.</p>

<h2 id="results">Results</h2>

<p>Here’s a video of the final result as usual, and the source code:</p>

<iframe width="420" height="315" src="//www.youtube.com/embed/vvcALTJf-OQ?rel=0" frameborder="0" allowfullscreen=""></iframe>

<p class="button"><a href="https://github.com/davidluzgouveia/blog-music-algorithm">Source Code</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[Last week I found an interesting video on YouTube, accompanied by an article:]]></summary></entry><entry><title type="html">Scrolling Textures with Zoom and Rotation</title><link href="https://davidluzgouveia.github.io/xna/scrolling-textures-with-zoom-and-rotation" rel="alternate" type="text/html" title="Scrolling Textures with Zoom and Rotation" /><published>2011-09-20T00:00:00+00:00</published><updated>2011-09-20T00:00:00+00:00</updated><id>https://davidluzgouveia.github.io/xna/scrolling-textures-with-zoom-and-rotation</id><content type="html" xml:base="https://davidluzgouveia.github.io/xna/scrolling-textures-with-zoom-and-rotation"><![CDATA[<p>I’ve already written twice before (<a href="/xna/scrolling-textures-in-xna">here</a> and <a href="/xna/2d-camera-with-parallax-scrolling-in-xna">here</a>) about a way to make a texture seem to repeat itself infinitely in every direction as you moved your camera around, all with a single draw instruction. That can be very useful in a number of game scenarios, such as creating a spacefield background for a spaceship shooter type of game.</p>

<p>That technique relied on the graphic’s card wrap texture addressing mode to do the wrapping automatically for you, while the spritebatch’s source and destination rectangles were used to to move (changing the source rectangle position) or zoom (change the source rectangle size in relation to destination rectangle) the camera. But it still had the problems that it didn’t support rotation (setting the rotation on SpriteBatch.value would cause the entire quad to rotate, not just the content) or respect the camera’s origin.</p>

<p>In order to do that, we need a bit more control. So this time I’ll show you how to correct this behavior by taking control over the texture coordinate generation process using a simple vertex shader. Using this technique you can take any texture (of any size) and make it repeat infinitely no matter what camera orientation you’re currently in. Consider it an upgrade to the older article!</p>

<p>I’ll start with the video sample for this article which should show you what to expect from it:</p>

<iframe width="420" height="315" src="http://www.youtube.com/embed/I-GeeSntNrQ?rel=0" allowfullscreen="" frameborder="0"></iframe>

<h2 id="part-1---setting-up-xna">Part 1 - Setting up XNA</h2>

<p>Okay, so we’d like to load a texture and draw it so that it fills the entire screen and seems to repeat infinitely. Furthermore we want to do this in a single draw call, and also want to be able to transform our camera at will without the effect breaking. You should already know how to do the first two steps of the process from the other article, which are, loading the texture and starting the spritebatch in wrap mode:</p>

<p>1) Load the texture:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Class scope</span>
<span class="n">Texture2D</span> <span class="n">_bg</span><span class="p">;</span>

<span class="c1">// On LoadContent</span>
<span class="n">_bg</span> <span class="p">=</span> <span class="n">Content</span><span class="p">.</span><span class="n">Load</span><span class="p">&lt;</span><span class="n">Texture2D</span><span class="p">&gt;(</span><span class="s">"bg"</span><span class="p">);</span>
</code></pre></div></div>

<p>2) Activate texture wrapping - Pass SamplerState.LinearWrap to SpriteBatch.Begin:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Down inside your Draw method</span>
<span class="n">_spriteBatch</span><span class="p">.</span><span class="nf">Begin</span><span class="p">(</span><span class="n">SpriteSortMode</span><span class="p">.</span><span class="n">Deferred</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="n">SamplerState</span><span class="p">.</span><span class="n">LinearWrap</span><span class="p">,</span> <span class="p">[</span><span class="n">omitted</span> <span class="n">other</span> <span class="n">parameters</span><span class="p">]);</span>
</code></pre></div></div>

<p>Next what we will do is draw this texture using a quad (i.e. two triangles connected to each other that form a rectangle - SpriteBatch already does this for us) that ALWAYS covers the entire screen, and leave it to a vertex shader to displace our texture coordinates so that it looks like we’re seeing it from another angle and distance. This means that even though the quad is always standing still, because of our vertex shader, its content will appear to change position, rotation, zoom, etc.</p>

<p>So let’s render that quad…</p>

<p>3) Render the texture as a fullscreen quad - Pass GraphicsDevice.Viewport.Bound as both source and destination rectangles to SpriteBatch.Draw:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Draw texture to viewport-sized quad setting both source and destination rectangles</span>
<span class="n">_spriteBatch</span><span class="p">.</span><span class="nf">Draw</span><span class="p">(</span><span class="n">_bg</span><span class="p">,</span> <span class="n">GraphicsDevice</span><span class="p">.</span><span class="n">Viewport</span><span class="p">.</span><span class="n">Bounds</span><span class="p">,</span> <span class="n">GraphicsDevice</span><span class="p">.</span><span class="n">Viewport</span><span class="p">.</span><span class="n">Bounds</span><span class="p">,</span> <span class="n">Color</span><span class="p">.</span><span class="n">White</span><span class="p">);</span>
</code></pre></div></div>

<p>Now on to the vertex shader…</p>

<h2 id="part-2---vertex-shader">Part 2 - Vertex Shader</h2>

<p>I’ll be using a vertex shader to take the original texture coordinates for each of the quad’s vertices, and displace them so that we see any entirely different portion of the texture depending on our camera parameters. By doing so, the texture content will appear to move, rotate or zoom, even though the quad’s geometry (the four vertices that make up the quad) will still be fixed to our screen’s corners. Also, it doesn’t matter if the resulting coordinate falls outside the 0.0-1.0 range because we are using the wrap texture addressing mode which automatically brings them back into the 0.0-1.0 range at the end!</p>

<p>Here’s the vetex shader we need to use:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">sampler</span> <span class="n">TextureSampler</span> <span class="p">:</span> <span class="nf">register</span><span class="p">(</span><span class="n">s0</span><span class="p">);</span>
<span class="n">float2</span> <span class="n">ViewportSize</span><span class="p">;</span>
<span class="n">float4x4</span> <span class="n">ScrollMatrix</span><span class="p">;</span>

<span class="k">void</span> <span class="nf">SpriteVertexShader</span><span class="p">(</span><span class="n">inout</span> <span class="n">float4</span> <span class="n">color</span> <span class="p">:</span> <span class="n">COLOR0</span><span class="p">,</span> <span class="n">inout</span> <span class="n">float2</span> <span class="n">texCoord</span> <span class="p">:</span> <span class="n">TEXCOORD0</span><span class="p">,</span> <span class="n">inout</span> <span class="n">float4</span> <span class="n">position</span> <span class="p">:</span> <span class="n">POSITION0</span><span class="p">)</span>
<span class="p">{</span>
    <span class="c1">// Half pixel offset for correct texel centering.</span>
    <span class="n">position</span><span class="p">.</span><span class="n">xy</span> <span class="p">-=</span> <span class="m">0.5</span><span class="p">;</span>

    <span class="c1">// Viewport adjustment.</span>
    <span class="n">position</span><span class="p">.</span><span class="n">xy</span> <span class="p">=</span> <span class="n">position</span><span class="p">.</span><span class="n">xy</span> <span class="p">/</span> <span class="n">ViewportSize</span><span class="p">;</span>
    <span class="n">position</span><span class="p">.</span><span class="n">xy</span> <span class="p">*=</span> <span class="nf">float2</span><span class="p">(</span><span class="m">2</span><span class="p">,</span> <span class="p">-</span><span class="m">2</span><span class="p">);</span>
    <span class="n">position</span><span class="p">.</span><span class="n">xy</span> <span class="p">-=</span> <span class="nf">float2</span><span class="p">(</span><span class="m">1</span><span class="p">,</span> <span class="p">-</span><span class="m">1</span><span class="p">);</span>

    <span class="c1">// Transform our texture coordinates to account for camera</span>
    <span class="n">texCoord</span> <span class="p">=</span> <span class="nf">mul</span><span class="p">(</span><span class="nf">float4</span><span class="p">(</span><span class="n">texCoord</span><span class="p">.</span><span class="n">xy</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">1</span><span class="p">),</span> <span class="n">ScrollMatrix</span><span class="p">).</span><span class="n">xy</span><span class="p">;</span>
<span class="p">}</span>

<span class="n">technique</span> <span class="n">SpriteBatch</span>
<span class="p">{</span>
    <span class="n">pass</span>
    <span class="p">{</span>
        <span class="n">VertexShader</span> <span class="p">=</span> <span class="n">compile</span> <span class="n">vs_2_0</span> <span class="nf">SpriteVertexShader</span><span class="p">();</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The vertex shader is pretty minimalistic. Most of the vertex shader is boilerplate code that is needed for any vertex shader working with SpriteBatch, which I got straight of the MSDN samples. The only relevant line is where I transform the texture coordinates (last line of the vertex shader function) using a matrix that I called the “scroll matrix” (by lack of a better name - I just made that up). That’s the matrix which does all of the work, and I’ll describe it next. You’ll need to supply that matrix along with the viewport’s size from your game.</p>

<p>If you’ve never used a shader before, you should read some other tutorials first, but basically you need to put this code on a text file, give it an “.fx” file extension and add it to your content pipeline. You load it just like a Texture or another content pipeline object, but using the class Effect instead.</p>

<h2 id="part-3---back-on-xna-generating-the-scroll-matrix">Part 3 - Back on XNA: Generating the Scroll Matrix</h2>

<p>Creating the “scroll matrix” is not too hard. If you already have a camera class, you only need to add this method to it:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="n">Matrix</span> <span class="nf">GetScrollMatrix</span><span class="p">(</span><span class="n">Vector2</span> <span class="n">textureSize</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="n">Matrix</span><span class="p">.</span><span class="nf">CreateTranslation</span><span class="p">(</span><span class="k">new</span> <span class="nf">Vector3</span><span class="p">(-</span><span class="n">Origin</span> <span class="p">/</span> <span class="n">textureSize</span><span class="p">,</span> <span class="m">0.0f</span><span class="p">))</span> <span class="p">*</span>
        <span class="n">Matrix</span><span class="p">.</span><span class="nf">CreateScale</span><span class="p">(</span><span class="m">1f</span> <span class="p">/</span> <span class="n">Zoom</span><span class="p">)</span> <span class="p">*</span>
        <span class="n">Matrix</span><span class="p">.</span><span class="nf">CreateRotationZ</span><span class="p">(</span><span class="n">Rotation</span><span class="p">)</span> <span class="p">*</span>
        <span class="n">Matrix</span><span class="p">.</span><span class="nf">CreateTranslation</span><span class="p">(</span><span class="k">new</span> <span class="nf">Vector3</span><span class="p">(</span><span class="n">Origin</span> <span class="p">/</span> <span class="n">textureSize</span><span class="p">,</span> <span class="m">0.0f</span><span class="p">))</span> <span class="p">*</span>
        <span class="n">Matrix</span><span class="p">.</span><span class="nf">CreateTranslation</span><span class="p">(</span><span class="k">new</span> <span class="nf">Vector3</span><span class="p">(</span><span class="n">Position</span> <span class="p">/</span> <span class="n">textureSize</span><span class="p">,</span> <span class="m">0.0f</span><span class="p">));</span>
<span class="p">}</span>
</code></pre></div></div>

<p>If you compare it with your camera’s usual View Matrix you’ll notice a few differences. This one is basically a World Matrix (notice the S-R-T order of multiplication instead of T-R-S) with the catch that all translations (i.e. Position and Origin) are mapped to the texture’s space (which is sometimes called uv space too - a two dimensional space where where (0,0) corresponds to the top-left corner of the texture, and and (1,1) corresponds to the bottom-right corner of the texture) before being applied, which can be done by dividing their magnitudes by the texture’s size.</p>

<p>This matrix basically figures out where each of the corners of our screen/quad lie in texture space based on the camera’s current transform. After figuring that out, the default pixel shader takes care of the rest!</p>

<h2 id="part-4---loading-and-using-the-effect">Part 4 - Loading and using the Effect</h2>

<p>Now the only thing we need to do is load the vertex shader effect, pass it the camera’s “scroll matrix” and viewport size, and use it on our SpriteBatch when drawing the texture:</p>

<p>1) Load effect:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Global scope</span>
<span class="n">Effect</span> <span class="n">_effect</span><span class="p">;</span>

<span class="c1">// On LoadContent</span>
<span class="n">_effect</span> <span class="p">=</span> <span class="n">Content</span><span class="p">.</span><span class="n">Load</span><span class="p">&lt;</span><span class="n">Effect</span><span class="p">&gt;(</span><span class="s">"infinite"</span><span class="p">);</span>
<span class="n">_effect</span><span class="p">.</span><span class="n">Parameters</span><span class="p">[</span><span class="s">"ViewportSize"</span><span class="p">].</span><span class="nf">SetValue</span><span class="p">(</span><span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="n">GraphicsDevice</span><span class="p">.</span><span class="n">Viewport</span><span class="p">.</span><span class="n">Width</span><span class="p">,</span> <span class="n">GraphicsDevice</span><span class="p">.</span><span class="n">Viewport</span><span class="p">.</span><span class="n">Height</span><span class="p">));</span>
</code></pre></div></div>

<p>2) Pass scroll matrix to the effect:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// On Draw</span>
<span class="c1">// Prepare the effect with a view matrix</span>
<span class="n">_effect</span><span class="p">.</span><span class="n">Parameters</span><span class="p">[</span><span class="s">"ScrollMatrix"</span><span class="p">].</span><span class="nf">SetValue</span><span class="p">(</span><span class="n">_scrollCamera</span><span class="p">.</span><span class="nf">GetScrollMatrix</span><span class="p">(</span><span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="n">_bg</span><span class="p">.</span><span class="n">Width</span><span class="p">,</span> <span class="n">_bg</span><span class="p">.</span><span class="n">Height</span><span class="p">)));</span>
<span class="c1">// Start the SpriteBatch using LinearWrap and the scroll effect</span>
<span class="n">_spriteBatch</span><span class="p">.</span><span class="nf">Begin</span><span class="p">(</span><span class="n">SpriteSortMode</span><span class="p">.</span><span class="n">Deferred</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="n">SamplerState</span><span class="p">.</span><span class="n">LinearWrap</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="n">_effect</span><span class="p">);</span>
</code></pre></div></div>

<p>3) Prepare SpriteBatch to use our effect:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// On Draw</span>
<span class="c1">// Start the SpriteBatch using LinearWrap and the scroll effect</span>
<span class="n">_spriteBatch</span><span class="p">.</span><span class="nf">Begin</span><span class="p">(</span><span class="n">SpriteSortMode</span><span class="p">.</span><span class="n">Deferred</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="n">SamplerState</span><span class="p">.</span><span class="n">LinearWrap</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="n">_effect</span><span class="p">);</span>
</code></pre></div></div>

<p>And that’s all there is to it. Check the source code below for the complete source code for this article:</p>

<h2 id="final-thoughts">Final Thoughts</h2>

<p>My first version of this article used a pixel shader instead of a vertex shader to do all the work. I’ve now changed it into a vertex shader instead which gives the same result, but is much, much more efficient (e.g. on my sample, with a vertex shader I transform only four texture coordinates for the entire effect, while with a pixel shader I was transforming hundreds of thousands of texture coordinates). For reference, here is the pixel shader I was using.</p>

<blockquote class="error">
  <p>Warning: Use the vertex shader version. It’s a lot more efficient.</p>
</blockquote>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">sampler</span> <span class="n">TextureSampler</span> <span class="p">:</span> <span class="nf">register</span><span class="p">(</span><span class="n">s0</span><span class="p">);</span>
<span class="n">float4x4</span> <span class="n">ScrollMatrix</span><span class="p">;</span>

<span class="n">float4</span> <span class="nf">main</span><span class="p">(</span><span class="n">float4</span> <span class="n">color</span> <span class="p">:</span> <span class="n">COLOR0</span><span class="p">,</span> <span class="n">float2</span> <span class="n">texCoord</span> <span class="p">:</span> <span class="n">TEXCOORD0</span><span class="p">)</span> <span class="p">:</span> <span class="n">COLOR0</span>
<span class="p">{</span>
    <span class="c1">// Convert our uv coordinates into a 4d vector for matrix multiplication</span>
    <span class="c1">// Transform it by the Scroll Matrix</span>
    <span class="n">float2</span> <span class="n">coords</span> <span class="p">=</span> <span class="nf">mul</span><span class="p">(</span><span class="nf">float4</span><span class="p">(</span><span class="n">texCoord</span><span class="p">.</span><span class="n">xy</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">1</span><span class="p">),</span> <span class="n">ScrollMatrix</span><span class="p">).</span><span class="n">xy</span><span class="p">;</span>

    <span class="c1">// Sample the texture at the calculated spot</span>
    <span class="k">return</span> <span class="nf">tex2D</span><span class="p">(</span><span class="n">TextureSampler</span><span class="p">,</span> <span class="n">coords</span><span class="p">)</span> <span class="p">*</span> <span class="n">color</span><span class="p">;</span>
<span class="p">}</span>

<span class="n">technique</span> <span class="n">Infinite</span>
<span class="p">{</span>
    <span class="c1">// Make sure you're using Wrap mode and a full screen quad</span>
    <span class="n">pass</span> <span class="n">Pass1</span>
    <span class="p">{</span>
        <span class="n">PixelShader</span> <span class="p">=</span> <span class="n">compile</span> <span class="n">ps_2_0</span> <span class="nf">main</span><span class="p">();</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p class="button"><a href="https://github.com/davidluzgouveia/blog-infinite-layer">Source Code</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[I’ve already written twice before (here and here) about a way to make a texture seem to repeat itself infinitely in every direction as you moved your camera around, all with a single draw instruction. That can be very useful in a number of game scenarios, such as creating a spacefield background for a spaceship shooter type of game.]]></summary></entry><entry><title type="html">Adding a Skybox to RenderMonkey</title><link href="https://davidluzgouveia.github.io/xna/adding-a-skybox-to-rendermonkey" rel="alternate" type="text/html" title="Adding a Skybox to RenderMonkey" /><published>2011-09-12T00:00:00+00:00</published><updated>2011-09-12T00:00:00+00:00</updated><id>https://davidluzgouveia.github.io/xna/adding-a-skybox-to-rendermonkey</id><content type="html" xml:base="https://davidluzgouveia.github.io/xna/adding-a-skybox-to-rendermonkey"><![CDATA[<p>Yesterday I wrote a <a href="/xna/rendermonkey-beginners-tutorial">tutorial about the basics of RenderMonkey</a>. This time I’ll be showing how to replace the solid colored background that RenderMonkey uses to clear the screen, with a skybox. I expect you to have read and tried that tutorial already, and know your way around HLSL and how to create a skybox outside the context of RenderMonkey. There are many resources available on the web about how to implement skyboxes (such as <a href="http://rbwhitaker.wikidot.com/skyboxes-1">this</a>). By the way, my implementation is based on Riemer Grootjans’ book <a href="http://www.amazon.com/XNA-Game-Programming-Recipes-Problem-Solution/dp/143021855X">XNA 3.0 Game Programming Recipes</a> , which is quite a useful book covering a lot of different topics.</p>

<h2 id="introduction">Introduction</h2>

<p>On the day I started writing my first shaders on RenderMonkey, I had to figure out how to add a skybox to my scene so that I could properly test effects such as environment mapping. I searched around RenderMonkey’s interface but did not find any built-in way of rendering a skybox, so I ended up writing it on my own. I thought there could be a more intuitive way of doing this, so I figure it might be of some worth sharing my experience here. But if there is indeed an easier way to accomplish this, please let me know!</p>

<p>The trick to rendering the skybox was to add a second shader pass to the effect, and using the first one for the skybox while the second one is used for the model. The implementation I’ll be showing here works by rendering a simple texture mapped cube model (generated procedurally by RenderMonkey) which is always centered around the camera. This way, no matter where your camera is, the skybox will always look like it’s staying far away from the it. In order to be able to render the cube from inside out, I had modify the graphic card’s render state and invert the culling order, and I also had to disable writing to the Z-buffer while rendering the skybox, so that it didn’t interfer later with my scene on the second pass. As for the texturing of the skybox, I used one of the default cubemaps and the texCUBE HLSL intrinsic do to all the work. Well, let’s get started!</p>

<h2 id="starting-the-effect">Starting the Effect</h2>

<p>The first step is to create a new DirectX effect on your workspace and add a second pass to it by right-clicking on the effect and choose “Add Pass”:</p>

<p><a href="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/a_pass1.jpg"><img src="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/a_pass1-300x101.jpg" alt="a_pass1" /></a></p>

<p>Your workspace should look like this afterwards:</p>

<p><a href="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/a_pass2.jpg"><img src="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/a_pass2.jpg" alt="a_pass2" /></a></p>

<p>From now on you’ll be working mostly on the first pass (Pass 0) to set up that skybox. You’ll need to create a cube model, prepare some variables and a cubemap texture for the shader, write the shader itself and configure the graphic card’s render state properly. But don’t worry, I’ll guide you step by step.</p>

<h2 id="creating-the-cube">Creating the Cube</h2>

<p>To create the cube model that will be used as a skybox, right-click on your effect and add a new model, but don’t choose any model from the list. Instead click on the default model which is on top of the list. Rename it to “Box” if you want so that you don’t confuse it with the existing model.</p>

<p><a href="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/b_model1.jpg"><img src="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/b_model1-300x178.jpg" alt="b_model1" /></a></p>

<p>Now right-click on your new model, and select “Geometry Generator” under the “Generator” menu option. This will fill your model with data that is procedurally generated by RenderMonkey based on your choices:</p>

<p><a href="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/b_model2.jpg"><img src="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/b_model2-300x288.jpg" alt="b_model2" /></a></p>

<p>On the dialog that pops up, create a box of arbitrary size. I created a 25x25x25 box which worked fine for me, because depending on your near and far planes are configured, choosing a box that is too small or too large may cause problems:</p>

<p><a href="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/b_model3.jpg"><img src="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/b_model3-300x243.jpg" alt="b_model3" /></a></p>

<p>And before we forget, head inside your pass 0, and right-clicking on the model Reference Node there, assign it to your newly created box, because it’s probably still be pointing at your first model:</p>

<p><a href="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/b_model4.jpg"><img src="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/b_model4-300x91.jpg" alt="b_model4" /></a></p>

<h2 id="creating-variables">Creating Variables</h2>

<p>The skybox shader I’ll be showing below makes use of three global variables: the position of the camera, the view-projection matrix and the cubemap texture used for the sky:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">float4</span> <span class="n">ViewPosition</span><span class="p">;</span>
<span class="n">float4x4</span> <span class="n">ViewProjection</span><span class="p">;</span>
<span class="n">sampler</span> <span class="n">Texture</span><span class="p">;</span>
</code></pre></div></div>

<p>So go ahead and create each of these variables as explained on the previous tutorial, remembering to choose the appropriate data types and semantics. The ViewProjection matrix should already be created for you by default, I simply renamed it because I don’t like the default notation. As for the ViewPosition, can find it under the Float predefined variables:</p>

<p><a href="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/c_var1.jpg"><img src="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/c_var1-300x137.jpg" alt="c_var1" /></a></p>

<p>For the texture, use the specific Cubemap option to load it:</p>

<p><a href="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/c_var2.jpg"><img src="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/c_var2-300x87.jpg" alt="c_var2" /></a></p>

<p>And don’t forget to also add a Texture Object called “Texture” to your pass 0, linked to the cubemap you just created:</p>

<p><a href="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/c_var4.jpg"><img src="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/c_var4-300x170.jpg" alt="c_var4" /></a></p>

<p>Optionally, you can configure your texture object to use a better filtering scheme:</p>

<p><a href="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/c_var5.jpg"><img src="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/c_var5-300x181.jpg" alt="c_var5" /></a></p>

<h2 id="adding-the-code">Adding the Code</h2>

<p>Now it’s time to add the vertex and pixel shader code. You can find it ready below, so simply copy it into the vertex shader and pixel shader sections of pass 0. The code is commented to explain what it’s doing, but if you have any questions let me know!</p>

<p>The vertex shader:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">float4</span> <span class="n">ViewPosition</span><span class="p">;</span>
<span class="n">float4x4</span> <span class="n">ViewProjection</span><span class="p">;</span>

<span class="k">struct</span> <span class="nc">VS_INPUT</span>
<span class="p">{</span>
    <span class="n">float4</span> <span class="n">position</span> <span class="p">:</span> <span class="n">POSITION0</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="nc">VS_OUTPUT</span>
<span class="p">{</span>
    <span class="n">float4</span> <span class="n">position</span> <span class="p">:</span> <span class="n">POSITION0</span><span class="p">;</span>
    <span class="n">float3</span> <span class="n">position3D</span> <span class="p">:</span> <span class="n">TEXCOORD0</span><span class="p">;</span>
<span class="p">};</span>

<span class="c1">// Constructs a translation matrix</span>
<span class="n">float4x4</span> <span class="nf">translation</span><span class="p">(</span><span class="n">float3</span> <span class="n">position</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="nf">float4x4</span><span class="p">(</span>
        <span class="nf">float4</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">),</span>
        <span class="nf">float4</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="m">1</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">),</span>
        <span class="nf">float4</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="m">0</span><span class="p">,</span><span class="m">1</span><span class="p">,</span><span class="m">0</span><span class="p">),</span>
        <span class="nf">float4</span><span class="p">(</span><span class="n">position</span><span class="p">.</span><span class="n">xyz</span><span class="p">,</span> <span class="m">1</span><span class="p">)</span>
    <span class="p">);</span>
<span class="p">}</span>

<span class="n">VS_OUTPUT</span> <span class="nf">vs_main</span><span class="p">(</span><span class="n">VS_INPUT</span> <span class="n">input</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">VS_OUTPUT</span> <span class="n">output</span><span class="p">;</span>

    <span class="c1">// Create a world matrix that translates the skybox to the camera position</span>
    <span class="n">float4x4</span> <span class="n">world</span> <span class="p">=</span> <span class="nf">translation</span><span class="p">(</span><span class="n">ViewPosition</span><span class="p">.</span><span class="n">xyz</span><span class="p">);</span>

    <span class="c1">// Combine it with the existing view projection matrix</span>
    <span class="n">float4x4</span> <span class="n">WorldViewProjection</span> <span class="p">=</span> <span class="nf">mul</span><span class="p">(</span><span class="n">world</span><span class="p">,</span> <span class="n">ViewProjection</span><span class="p">);</span>

    <span class="c1">// Transform your vertex into place</span>
    <span class="n">output</span><span class="p">.</span><span class="n">position</span> <span class="p">=</span> <span class="nf">mul</span><span class="p">(</span><span class="n">input</span><span class="p">.</span><span class="n">position</span><span class="p">,</span> <span class="n">WorldViewProjection</span><span class="p">);</span>

    <span class="c1">// Save the original vertex position in model space</span>
    <span class="c1">// Since the cube model is centered around the origin, you can use these</span>
    <span class="c1">// vertex positions directly as directions for your cubemap :)</span>
    <span class="n">output</span><span class="p">.</span><span class="n">position3D</span> <span class="p">=</span> <span class="n">input</span><span class="p">.</span><span class="n">position</span><span class="p">;</span>

    <span class="k">return</span> <span class="n">output</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The pixel shader:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">sampler</span> <span class="n">Texture</span><span class="p">;</span>

<span class="k">struct</span> <span class="nc">VS_OUTPUT</span>
<span class="p">{</span>
    <span class="n">float4</span> <span class="n">position</span> <span class="p">:</span> <span class="n">POSITION0</span><span class="p">;</span>
    <span class="n">float3</span> <span class="n">position3D</span> <span class="p">:</span> <span class="n">TEXCOORD0</span><span class="p">;</span>
<span class="p">};</span>

<span class="n">float4</span> <span class="nf">ps_main</span><span class="p">(</span><span class="n">VS_OUTPUT</span> <span class="n">input</span><span class="p">)</span> <span class="p">:</span> <span class="n">COLOR0</span>
<span class="p">{</span>
    <span class="c1">// Use the original vertex position to sample the texture cube</span>
    <span class="k">return</span> <span class="nf">texCUBE</span><span class="p">(</span><span class="n">Texture</span><span class="p">,</span> <span class="n">input</span><span class="p">.</span><span class="n">position3D</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="configure-render-states">Configure Render States</h2>

<p>You probably still can’t see anything, but the shader should already compile without errors. The reason you can’t see anything is because you’re seeing the cube model from inside out, and since its faces are facing the wrong direction they aren’t rendered. Let’s correct that now by changing the culling mode on our graphics card. Another thing we need to do is disable writing to the z-buffer because we want the sky to always appear last in the scene.</p>

<p>To add these changes, simply right-click on pass 0 and select “Add Render State Block” from the list. Now repeat the same thing on pass 1 because you’ll want to undo your changes there before rendering your model. Match your settings to the ones on the pictures below.</p>

<p>Pass 0 Render State Options:</p>

<p><a href="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/e_state1.jpg"><img src="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/e_state1-300x117.jpg" alt="e_state1" /></a></p>

<p>Pass 1 Render State Options:</p>

<p><a href="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/e_state2.jpg"><img src="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/e_state2-300x117.jpg" alt="e_state2" /></a></p>

<h2 id="conclusion">Conclusion</h2>

<p>And that’s it! Now you can change over to pass 1 and write another shader there, because the skybox will still be displayed on the background, and react correctly to the camera. Here’s the result:</p>

<p><a href="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/g_end.jpg"><img src="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/g_end-300x229.jpg" alt="g_end" /></a></p>

<p>And having a proper skybox in place opens the door to testing many different effects involving reflection and refraction such as this:</p>

<p><a href="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/example.jpg"><img src="/xna/assets/2011-09-12-adding-a-skybox-to-rendermonkey/example-300x180.jpg" alt="example" /></a></p>

<p>Just one final tip: by default, your pass 1 is referencing the same Stream Mapping structure as pass 0. If you need different sets of data for both passes, just create a new Stream Mapping object on your effect, and using the right mouse button, change the reference on pass 1 to your new instance.</p>

<p>That’s all for today, I hope you enjoyed the article.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Yesterday I wrote a tutorial about the basics of RenderMonkey. This time I’ll be showing how to replace the solid colored background that RenderMonkey uses to clear the screen, with a skybox. I expect you to have read and tried that tutorial already, and know your way around HLSL and how to create a skybox outside the context of RenderMonkey. There are many resources available on the web about how to implement skyboxes (such as this). By the way, my implementation is based on Riemer Grootjans’ book XNA 3.0 Game Programming Recipes , which is quite a useful book covering a lot of different topics.]]></summary></entry><entry><title type="html">RenderMonkey Beginner’s Tutorial</title><link href="https://davidluzgouveia.github.io/xna/rendermonkey-beginners-tutorial" rel="alternate" type="text/html" title="RenderMonkey Beginner’s Tutorial" /><published>2011-09-11T00:00:00+00:00</published><updated>2011-09-11T00:00:00+00:00</updated><id>https://davidluzgouveia.github.io/xna/rendermonkey-beginners-tutorial</id><content type="html" xml:base="https://davidluzgouveia.github.io/xna/rendermonkey-beginners-tutorial"><![CDATA[<p>This time I’ll be presenting a beginner’s tutorial about RenderMonkey, which is a shader development environment created by AMD that facilitates the task of creating and testing shader programs. Although AMD has stopped developing it, you can sill <a href="http://developer.amd.com/archive/gpu/rendermonkey/">get it for free</a>.</p>

<p>I’ll be using HLSL for the scope of this tutorial, but I intend to focus only on how to get RenderMonkey up and running, so I won’t be teaching you how to program in HLSL. If you don’t have any experience, <a href="http://www.catalinzima.com/tutorials/crash-course-in-hlsl/">here’s a nice resource</a> for getting started with HLSL - kudos to <a href="http://www.catalinzima.com/">Catalin Zima</a> for the wonderful tutorial. After learning the syntax, you should also learn how to implement some basic shaders. The XNA education catalogue<a href="http://create.msdn.com/en-US/education/catalog/article/shader_primer"> has a series just for that</a>!</p>

<h2 id="shader-code">Shader Code</h2>

<p>The shader used in this tutorial mixes ambient and diffuse lighting with a diffuse texture map. Here’s the code for the shader:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">float4x4</span> <span class="n">WorldViewProjection</span><span class="p">;</span>
<span class="n">float4x4</span> <span class="n">WorldInverseTranspose</span><span class="p">;</span>
<span class="n">float3</span> <span class="n">LightDirection</span><span class="p">;</span>
<span class="n">float4</span> <span class="n">Ambient</span><span class="p">;</span>
<span class="n">sampler</span> <span class="n">Texture</span><span class="p">;</span>

<span class="k">struct</span> <span class="nc">VS_INPUT</span>
<span class="p">{</span>
    <span class="n">float4</span> <span class="n">position</span> <span class="p">:</span> <span class="n">POSITION0</span><span class="p">;</span>
    <span class="n">float3</span> <span class="n">normal</span> <span class="p">:</span> <span class="n">NORMAL0</span><span class="p">;</span>
    <span class="n">float2</span> <span class="n">texturecoord</span> <span class="p">:</span> <span class="n">TEXCOORD0</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="nc">VS_OUTPUT</span>
<span class="p">{</span>
    <span class="n">float4</span> <span class="n">position</span> <span class="p">:</span> <span class="n">POSITION0</span><span class="p">;</span>
    <span class="n">float3</span> <span class="n">normal</span> <span class="p">:</span> <span class="n">TEXCOORD0</span><span class="p">;</span>
    <span class="n">float2</span> <span class="n">texturecoord</span> <span class="p">:</span> <span class="n">TEXCOORD1</span><span class="p">;</span>
<span class="p">};</span>

<span class="n">VS_OUTPUT</span> <span class="nf">vs_main</span><span class="p">(</span><span class="n">VS_INPUT</span> <span class="n">input</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">VS_OUTPUT</span> <span class="n">output</span><span class="p">;</span>
    <span class="n">output</span><span class="p">.</span><span class="n">position</span> <span class="p">=</span> <span class="nf">mul</span><span class="p">(</span><span class="n">input</span><span class="p">.</span><span class="n">position</span><span class="p">,</span> <span class="n">WorldViewProjection</span><span class="p">);</span>
    <span class="n">output</span><span class="p">.</span><span class="n">normal</span> <span class="p">=</span> <span class="nf">mul</span><span class="p">(</span><span class="n">input</span><span class="p">.</span><span class="n">normal</span><span class="p">,</span> <span class="n">WorldInverseTranspose</span><span class="p">);</span>
    <span class="n">output</span><span class="p">.</span><span class="n">texturecoord</span> <span class="p">=</span> <span class="n">input</span><span class="p">.</span><span class="n">texturecoord</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">output</span><span class="p">;</span>
<span class="p">}</span>

<span class="n">float4</span> <span class="nf">ps_main</span><span class="p">(</span><span class="n">VS_OUTPUT</span> <span class="n">input</span><span class="p">)</span> <span class="p">:</span> <span class="n">COLOR0</span>
<span class="p">{</span>
    <span class="n">float3</span> <span class="n">normal</span> <span class="p">=</span> <span class="nf">normalize</span><span class="p">(</span><span class="n">input</span><span class="p">.</span><span class="n">normal</span><span class="p">);</span>
    <span class="n">float3</span> <span class="n">light</span> <span class="p">=</span> <span class="nf">normalize</span><span class="p">(</span><span class="n">LightDirection</span><span class="p">);</span>
    <span class="n">float4</span> <span class="n">diffuse</span> <span class="p">=</span> <span class="nf">tex2D</span><span class="p">(</span><span class="n">Texture</span><span class="p">,</span> <span class="n">input</span><span class="p">.</span><span class="n">texturecoord</span><span class="p">);</span>
    <span class="kt">float</span> <span class="n">diffuseContribution</span> <span class="p">=</span> <span class="nf">clamp</span><span class="p">(</span><span class="nf">dot</span><span class="p">(</span><span class="n">normal</span><span class="p">,</span> <span class="p">-</span><span class="n">light</span><span class="p">),</span> <span class="m">0</span><span class="p">,</span> <span class="m">1</span><span class="p">);</span>
    <span class="k">return</span> <span class="n">Ambient</span> <span class="p">+</span> <span class="n">diffuse</span> <span class="p">*</span> <span class="n">diffuseContribution</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And what it’s supposed to look like:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/0.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/0-300x213.jpg" alt="0" /></a></p>

<p>So let’s get started!</p>

<h2 id="creating-the-effect">Creating the Effect</h2>

<p>When starting RenderMonkey you’ll get an Empty Workspace that’s ready to be used. Your application should look like this:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/01.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/01-300x208.jpg" alt="01" /></a></p>

<p>A lot of your work will be done on the Workspace Window on the left, which by default shows a single empty workspace. So let’s start by adding a new Effect to it. Right-click on Effect Workspace and add a new Default Effect of your desired type (2). Since I’m programming in HLSL, I created a new DirectX shader. There are many templates ready that you can use when starting your own shaders, but for this tutorial I’ll just choose “DirectX” from the list which creates the most basic shader possible (i.e. a vertex shader that simply applies a WorldViewProjection transformation and a pixel shader that always outputs the same color).</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/02.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/02-300x63.jpg" alt="02" /></a></p>

<p>Once you have your Effect created, your window should look like this:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/03.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/03-300x208.jpg" alt="03" /></a></p>

<p>Now we’re ready to start setting everything up!</p>

<h2 id="changing-the-model">Changing the Model</h2>

<p>You probably noticed that the default model used by RenderMonkey is a sphere. That’s not the best choice for testing your shaders, so let’s start by changing it. On your Workspace Window simply right-click on Model and select a new one:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/04.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/04.jpg" alt="04" /></a></p>

<p>I’ll use a simple teapot:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/05.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/05-300x208.jpg" alt="05" /></a></p>

<h2 id="setting-variables">Setting Variables</h2>

<p>The next step is to create a link between RenderMonkey and the global variables used in our shader. The global variables used by our shader are as follows:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">float4x4</span> <span class="n">WorldViewProjection</span><span class="p">;</span>
<span class="n">float4x4</span> <span class="n">WorldInverseTranspose</span><span class="p">;</span>
<span class="n">float3</span> <span class="n">LightDirection</span><span class="p">;</span>
<span class="n">float4</span> <span class="n">Ambient</span><span class="p">;</span>
<span class="n">sampler</span> <span class="n">Texture</span><span class="p">;</span>
</code></pre></div></div>

<p>We’ll need to create a new variable inside our Effect on the Workspace Window for each global variable in our code, so that RenderMonkey can interact with our shader. Make sure to give them the same name and the appropriate data type too. Creating a new variable is as simple as right-clicking on your Effect, going under Add Variable and picking the right data type from the list:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/06.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/06-300x135.jpg" alt="06" /></a></p>

<p>You can start by creating a Float3 called LightDirection and a Color called Ambient.</p>

<p>As for defining our matrixes (such as WorldViewProjection and WorldInverseTranspose), these usually have special meanings, and we’d like RenderMonkey to establish the right connection between them and our scene (e.g. link the View matrix to our camera). To do that, simply use one of the Predefined matrixes that RenderMonkey provides, as each of them already come with the appropriate semantic assigned:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/07.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/07-300x148.jpg" alt="07" /></a></p>

<p>Finally, for creating the texture variable that will be sampled by the shader, we need to do it in two steps.</p>

<p>First, right-click on your Effect, select Add Texture and load a 2D Texture of your choice:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/08.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/08-300x108.jpg" alt="08" /></a></p>

<p>Next, scroll down to Pass 0, right-click on it and add a new Texture Object, linking it to the texture you just created. Be sure to name this Texture Object the same as the sampler used in your code (in our case, Texture):</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/09.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/09-300x250.jpg" alt="09" /></a></p>

<p>I also got rid of the matrix that came with the default effect since I won’t be needing it. When you’re done, your Effect tree should look like:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/10.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/10.jpg" alt="10" /></a></p>

<h2 id="binding-shader-inputs">Binding Shader Inputs</h2>

<p>One other step we need to take, that is frequently forgotten, is to bind RenderMonkey to our vertex shader inputs so that the correct data is streamed. Looking back on our code, we had the following vertex shader input structure:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">struct</span> <span class="nc">VS_INPUT</span>
<span class="p">{</span>
    <span class="n">float4</span> <span class="n">position</span> <span class="p">:</span> <span class="n">POSITION0</span><span class="p">;</span>
    <span class="n">float3</span> <span class="n">normal</span> <span class="p">:</span> <span class="n">NORMAL0</span><span class="p">;</span>
    <span class="n">float2</span> <span class="n">texturecoord</span> <span class="p">:</span> <span class="n">TEXCOORD0</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>

<p>We’ll need to mimick this structure on RenderMonkey. Inside your Effect tree, right-click on Stream Mapping and choose Edit:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/11.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/11-273x300.jpg" alt="11" /></a></p>

<p>On the window that appears, simply add two new channels and configure them such that they’re compatible with the data types and semantics of your vertex shader input. In our case:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/12.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/12-300x106.jpg" alt="12" /></a></p>

<h2 id="create-the-code">Create the Code</h2>

<p>Now for the most important part, entering the code. Scroll down to Pass 0 and right-click on Vertex Shader, choosing Edit from the list. That should open the Code Editor for your effect, with the default implementation still on it:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/13.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/13.jpg" alt="13" /></a></p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/14.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/14-300x179.jpg" alt="14" /></a></p>

<p>The most relevant thing to notice here is that unlike most shaders you write, in RenderMonkey you will write your vertex shader and your pixel shader in separate tabs, and the variables you define in one of the tabs are local to it (i.e. can’t be accessed by the other tab).</p>

<p>This means that you’ll have to split your shader code in two, the vertex half and the pixel half. That’s no big deal though. Here’s what it looks like after the split (refer to the full implementation on top for comparison).</p>

<p>Under the Vertex Shader tab:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">float4x4</span> <span class="n">WorldViewProjection</span><span class="p">;</span>
<span class="n">float4x4</span> <span class="n">WorldInverseTranspose</span><span class="p">;</span>

<span class="k">struct</span> <span class="nc">VS_INPUT</span>
<span class="p">{</span>
    <span class="n">float4</span> <span class="n">position</span> <span class="p">:</span> <span class="n">POSITION0</span><span class="p">;</span>
    <span class="n">float3</span> <span class="n">normal</span> <span class="p">:</span> <span class="n">NORMAL0</span><span class="p">;</span>
    <span class="n">float2</span> <span class="n">texturecoord</span> <span class="p">:</span> <span class="n">TEXCOORD0</span><span class="p">;</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="nc">VS_OUTPUT</span>
<span class="p">{</span>
    <span class="n">float4</span> <span class="n">position</span> <span class="p">:</span> <span class="n">POSITION0</span><span class="p">;</span>
    <span class="n">float3</span> <span class="n">normal</span> <span class="p">:</span> <span class="n">TEXCOORD0</span><span class="p">;</span>
    <span class="n">float2</span> <span class="n">texturecoord</span> <span class="p">:</span> <span class="n">TEXCOORD1</span><span class="p">;</span>
<span class="p">};</span>

<span class="n">VS_OUTPUT</span> <span class="nf">vs_main</span><span class="p">(</span><span class="n">VS_INPUT</span> <span class="n">input</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">VS_OUTPUT</span> <span class="n">output</span><span class="p">;</span>
    <span class="n">output</span><span class="p">.</span><span class="n">position</span> <span class="p">=</span> <span class="nf">mul</span><span class="p">(</span><span class="n">input</span><span class="p">.</span><span class="n">position</span><span class="p">,</span> <span class="n">WorldViewProjection</span><span class="p">);</span>
    <span class="n">output</span><span class="p">.</span><span class="n">normal</span> <span class="p">=</span> <span class="nf">mul</span><span class="p">(</span><span class="n">input</span><span class="p">.</span><span class="n">normal</span><span class="p">,</span> <span class="n">WorldInverseTranspose</span><span class="p">);</span>
    <span class="n">output</span><span class="p">.</span><span class="n">texturecoord</span> <span class="p">=</span> <span class="n">input</span><span class="p">.</span><span class="n">texturecoord</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">output</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Under the Pixel Shader tab:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">float3</span> <span class="n">LightDirection</span><span class="p">;</span>
<span class="n">float4</span> <span class="n">Ambient</span><span class="p">;</span>
<span class="n">sampler</span> <span class="n">Texture</span><span class="p">;</span>

<span class="k">struct</span> <span class="nc">VS_OUTPUT</span>
<span class="p">{</span>
    <span class="n">float4</span> <span class="n">position</span> <span class="p">:</span> <span class="n">POSITION0</span><span class="p">;</span>
    <span class="n">float3</span> <span class="n">normal</span> <span class="p">:</span> <span class="n">TEXCOORD0</span><span class="p">;</span>
    <span class="n">float2</span> <span class="n">texturecoord</span> <span class="p">:</span> <span class="n">TEXCOORD1</span><span class="p">;</span>
<span class="p">};</span>

<span class="n">float4</span> <span class="nf">ps_main</span><span class="p">(</span><span class="n">VS_OUTPUT</span> <span class="n">input</span><span class="p">)</span> <span class="p">:</span> <span class="n">COLOR0</span>
<span class="p">{</span>
    <span class="n">float3</span> <span class="n">normal</span> <span class="p">=</span> <span class="nf">normalize</span><span class="p">(</span><span class="n">input</span><span class="p">.</span><span class="n">normal</span><span class="p">);</span>
    <span class="n">float3</span> <span class="n">light</span> <span class="p">=</span> <span class="nf">normalize</span><span class="p">(</span><span class="n">LightDirection</span><span class="p">);</span>
    <span class="n">float4</span> <span class="n">diffuse</span> <span class="p">=</span> <span class="nf">tex2D</span><span class="p">(</span><span class="n">Texture</span><span class="p">,</span> <span class="n">input</span><span class="p">.</span><span class="n">texturecoord</span><span class="p">);</span>
    <span class="kt">float</span> <span class="n">diffuseContribution</span> <span class="p">=</span> <span class="nf">clamp</span><span class="p">(</span><span class="nf">dot</span><span class="p">(</span><span class="n">normal</span><span class="p">,</span> <span class="p">-</span><span class="n">light</span><span class="p">),</span> <span class="m">0</span><span class="p">,</span> <span class="m">1</span><span class="p">);</span>
    <span class="k">return</span> <span class="n">Ambient</span> <span class="p">+</span> <span class="n">diffuse</span> <span class="p">*</span> <span class="n">diffuseContribution</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The only points worth noting is that I repeated my VS_OUTPUT structure since it was needed on both sides, and I cleaned my global variables so that only the ones that were used in each file were present.</p>

<p>Also, ensure that your vertex shader and pixel shader functions names match the ones defined under Entry Point. By default, these should be “vs_main” and “ps_main” respectively.</p>

<p>Now let’s see the code in action! Simply press the Compile button on the toolbar:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/15.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/15-300x83.jpg" alt="15" /></a></p>

<p>And this is what you should get:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/16.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/16-300x208.jpg" alt="16" /></a></p>

<p>It looks all white! But don’t worry, that’s only because your LightDirection and Ambient variables are still with their default values. RenderMonkey provides an interesting way for you to edit your variables, so that you may see your shader updating in real-time as you change them!</p>

<h2 id="tweaking-variables">Tweaking Variables</h2>

<p>There are two variables we’d like to tweak here: LightDirection and Ambient. Start by right-clicking on your LightDirection variable and setting it as an Artist Variable. Colors are set as Artist Variables by default so you don’t need to repeat the process for your Ambient color:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/17.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/17.jpg" alt="17" /></a></p>

<p>Now fire up the Artist Editor window:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/18.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/18.jpg" alt="18" /></a></p>

<p>And this is what you’ll see on the right side of your application:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/19.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/19.jpg" alt="19" /></a></p>

<p>Now all you have to do is tweak the variables to your liking. Expand your options in the Artist Editor window so that you have better control over them. In my case I specified that my LightDirection vector should be normalized, and I set my Ambient color to a very dark color:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/20.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/20-300x208.jpg" alt="20" /></a></p>

<h2 id="texture-sampler-options">Texture Sampler Options</h2>

<p>Just to throw in one last tip, the texture on my teapot looks a bit rough. I’m guessing it’s probably being sampled using point filtering. Let’s change that!</p>

<p>Right-click on your Texture Object and choose Edit. That’s where you can configure everything about your sampler! I’ll simply change my magnification/minification/mipmapping filters to linear, which should make the texture appear smoother:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/21.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/21-300x280.jpg" alt="21" /></a></p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/22.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/22-300x296.jpg" alt="22" /></a></p>

<h2 id="conclusion">Conclusion</h2>

<p>And that’s it! You can now maximize your preview window and enjoy. Oh, and you can use the camera controls located on the toolbar to navigate the scene:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/23.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/23.jpg" alt="23" /></a></p>

<p>Here’s the final result:</p>

<p><a href="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/24.jpg"><img src="/xna/assets/2011-09-11-rendermonkey-beginners-tutorial/24-300x208.jpg" alt="24" /></a></p>

<p>I hope you enjoyed this tutorial, and as usual feel free to post any questions on the comment section below.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[This time I’ll be presenting a beginner’s tutorial about RenderMonkey, which is a shader development environment created by AMD that facilitates the task of creating and testing shader programs. Although AMD has stopped developing it, you can sill get it for free.]]></summary></entry><entry><title type="html">Limiting 2D Camera Movement with Zoom</title><link href="https://davidluzgouveia.github.io/xna/limiting-2d-camera-movement-with-zoom" rel="alternate" type="text/html" title="Limiting 2D Camera Movement with Zoom" /><published>2011-09-10T00:00:00+00:00</published><updated>2011-09-10T00:00:00+00:00</updated><id>https://davidluzgouveia.github.io/xna/limiting-2d-camera-movement-with-zoom</id><content type="html" xml:base="https://davidluzgouveia.github.io/xna/limiting-2d-camera-movement-with-zoom"><![CDATA[<p>On my <a href="/xna/2d-camera-with-parallax-scrolling-in-xna">2D Camera with Parallax Scrolling in XNA</a> article, one of the topics I described down in the FAQ section was how to limit the range of movement of a 2D camera so that only part of the game world may be seen.</p>

<p>I implemented it as a simple optional rectangle property called Limits which restricted camera movement so that the player could not see anything beyond that region.</p>

<p>However, I considered the simplest of the scenarios where you don’t need this functionality AND camera zooming/rotation at the same time. To answer a question posted under that article, this time I’ll be presenting a more elaborate implementation that also takes zoom into consideration.</p>

<p>Camera rotation will still be kept out of the equation, since I can’t imagine how it could be made to work with sensible results considering that the viewport is rectangular.</p>

<h2 id="introduction">Introduction</h2>

<p>I’ll start by presenting a little video of what the purpose of this article is. You can download the source code at the end as usual:</p>

<iframe width="420" height="345" src="http://www.youtube.com/embed/tZGl8Utw_cs" allowfullscreen="" frameborder="0"></iframe>

<p>Now onto how it’s done. Let us consider the following simple Camera interface for our example:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">interface</span> <span class="nc">Camera</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="n">Viewport</span> <span class="n">Viewport</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="n">Vector2</span> <span class="n">Position</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">float</span> <span class="n">Zoom</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="n">Matrix</span> <span class="n">ViewMatrix</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="n">Rectangle</span><span class="p">?</span> <span class="n">Limits</span> <span class="p">{</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>What we’d like to achieve is that whenever the Limits property has a value assigned to it, any changes to Position and Zoom should be validated to ensure the player never sees anything beyond the limited region. Changing the camera’s limit should also revalidate everything.</p>

<p>To make this task easier, we’ll create two helper methods, ValidateZoom() and ValidatePosition() which will be called from within our setters above and correct any invalid values for us. Once we have these two methods implemented, the rest is trivial.</p>

<h2 id="validate-zoom">Validate Zoom</h2>

<p>Making sure the camera’s zoom is valid is not too hard once you think about it. In general terms what you’d like to achieve is to ensure that the area that the camera can see is never larger than the limiting rectangle.</p>

<p>So, exactly how big is this area that the camera can see? Well, we know that when the camera isn’t zoomed at all (i.e. the Zoom property is 1), then the area the camera can see corresponds exactly to the game’s Viewport. It is also intuitive to think that if you’re zoomed in, you can see less of the world. Conversely, if you’re zoomed out you can see more than you could before.</p>

<p>This implies that the camera “size” (i.e. the size of the area visible by the camera) is inversely proportional to the camera’s zoom, or in mathematical terms:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">CameraSize</span> <span class="p">=</span> <span class="n">ViewportSize</span> <span class="p">/</span> <span class="n">Zoom</span>
</code></pre></div></div>

<p>Now that we know how large the camera is, let us revisit our initial statement - “Ensure that the area that the camera can see is never larger than the limiting rectangle”. We can just as easily model that with a mathematical expression:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">CameraSize</span> <span class="p">&lt;=</span> <span class="n">LimitSize</span>
</code></pre></div></div>

<p>Combining both equations into one and rearranging it we arrive at the following conclusion:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Zoom</span> <span class="p">&gt;=</span> <span class="n">ViewportSize</span> <span class="p">/</span> <span class="n">LimitSize</span>
</code></pre></div></div>

<p>All that remains is to implement it. The only problem here is that while Zoom is a scalar (float), ViewportSize and LimitSize are both vectors so we can’t compare them directly. The solution is to compare separatedly for the X and Y axes and ignore the smallest value of the two. In code:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="k">void</span> <span class="nf">ValidateZoom</span><span class="p">()</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">_limits</span><span class="p">.</span><span class="n">HasValue</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="kt">float</span> <span class="n">minZoomX</span> <span class="p">=</span> <span class="p">(</span><span class="kt">float</span><span class="p">)</span><span class="n">_viewport</span><span class="p">.</span><span class="n">Width</span> <span class="p">/</span> <span class="n">_limits</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">Width</span><span class="p">;</span>
        <span class="kt">float</span> <span class="n">minZoomY</span> <span class="p">=</span> <span class="p">(</span><span class="kt">float</span><span class="p">)</span><span class="n">_viewport</span><span class="p">.</span><span class="n">Height</span> <span class="p">/</span> <span class="n">_limits</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">Height</span><span class="p">;</span>
        <span class="n">_zoom</span> <span class="p">=</span> <span class="n">MathHelper</span><span class="p">.</span><span class="nf">Max</span><span class="p">(</span><span class="n">_zoom</span><span class="p">,</span> <span class="n">MathHelper</span><span class="p">.</span><span class="nf">Max</span><span class="p">(</span><span class="n">minZoomX</span><span class="p">,</span> <span class="n">minZoomY</span><span class="p">));</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="validate-position">Validate Position</h2>

<p>Validating the camera’s position after moving it or changing zoom is a bit harder. First you need to know where the top left corner of the camera stands in World space. For that you need to take your ViewMatrix and invert it so that you can transform points from View space back into World space, and apply it to the camera’s local top left corner (which in View space is simply Vector2.Zero), which gives you its position in world space. That position is then clamped inside the limiting rectangle’s min and max corners. However there are two catches that you need to take care of.</p>

<p>The first one is that, we’re clamping our top LEFT corner against the limiting rectangle’s bottom RIGHT corner, so in order to compensate we need to subtract it the camera’s size too (remember the formula above?). The second one is that the camera’s top left corner in world space doesn’t necessarily correspond to the camera’s position (because of zoom). To solve that I start by taking note of how much both of these values differ in order to correct that offset at the end. Here’s the code:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="k">void</span> <span class="nf">ValidatePosition</span><span class="p">()</span>
<span class="p">{</span>
    <span class="k">if</span><span class="p">(</span><span class="n">_limits</span><span class="p">.</span><span class="n">HasValue</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">Vector2</span> <span class="n">cameraWorldMin</span> <span class="p">=</span> <span class="n">Vector2</span><span class="p">.</span><span class="nf">Transform</span><span class="p">(</span><span class="n">Vector2</span><span class="p">.</span><span class="n">Zero</span><span class="p">,</span> <span class="n">Matrix</span><span class="p">.</span><span class="nf">Invert</span><span class="p">(</span><span class="n">ViewMatrix</span><span class="p">));</span>
        <span class="n">Vector2</span> <span class="n">cameraSize</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="n">_viewport</span><span class="p">.</span><span class="n">Width</span><span class="p">,</span> <span class="n">_viewport</span><span class="p">.</span><span class="n">Height</span><span class="p">)</span> <span class="p">/</span> <span class="n">_zoom</span><span class="p">;</span>
        <span class="n">Vector2</span> <span class="n">limitWorldMin</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="n">_limits</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">Left</span><span class="p">,</span> <span class="n">_limits</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">Top</span><span class="p">);</span>
        <span class="n">Vector2</span> <span class="n">limitWorldMax</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="n">_limits</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">Right</span><span class="p">,</span> <span class="n">_limits</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">Bottom</span><span class="p">);</span>
        <span class="n">Vector2</span> <span class="n">positionOffset</span> <span class="p">=</span> <span class="n">_position</span> <span class="p">-</span> <span class="n">cameraWorldMin</span><span class="p">;</span>
        <span class="n">_position</span> <span class="p">=</span> <span class="n">Vector2</span><span class="p">.</span><span class="nf">Clamp</span><span class="p">(</span><span class="n">cameraWorldMin</span><span class="p">,</span> <span class="n">limitWorldMin</span><span class="p">,</span> <span class="n">limitWorldMax</span> <span class="p">-</span> <span class="n">cameraSize</span><span class="p">)</span> <span class="p">+</span> <span class="n">positionOffset</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="updating-the-properties">Updating the Properties</h2>

<p>All that remains is to make use of these two methods in order to validate our data. Just add them inside your property setters. When changing position you don’t need to do any zoom validation. When changing zoom however, you have to follow it with a position validation because if you were standing close to the border, the position might end up being invalid after zooming out. Same thing when changing the camera’s limit, don’t forget to validate everything.</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="n">Vector2</span> <span class="n">Position</span>
<span class="p">{</span>
    <span class="k">get</span> <span class="p">{</span> <span class="k">return</span> <span class="n">_position</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">set</span>
    <span class="p">{</span>
        <span class="n">_position</span> <span class="p">=</span> <span class="k">value</span><span class="p">;</span>
        <span class="nf">ValidatePosition</span><span class="p">();</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">public</span> <span class="kt">float</span> <span class="n">Zoom</span>
<span class="p">{</span>
    <span class="k">get</span> <span class="p">{</span> <span class="k">return</span> <span class="n">_zoom</span><span class="p">;</span>	<span class="p">}</span>
    <span class="k">set</span>
    <span class="p">{</span>
        <span class="n">_zoom</span> <span class="p">=</span> <span class="k">value</span><span class="p">;</span>
        <span class="nf">ValidateZoom</span><span class="p">();</span>
        <span class="nf">ValidatePosition</span><span class="p">();</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">public</span> <span class="n">Rectangle</span><span class="p">?</span> <span class="n">Limits</span>
<span class="p">{</span>
    <span class="k">set</span>
    <span class="p">{</span>
        <span class="n">_limits</span> <span class="p">=</span> <span class="k">value</span><span class="p">;</span>
        <span class="nf">ValidateZoom</span><span class="p">();</span>
        <span class="nf">ValidatePosition</span><span class="p">();</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="usage-example">Usage Example</h2>

<p>Using this technique is as simple as setting a new Rectangle to the Limits property, such as:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">_camera</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Camera</span><span class="p">(</span><span class="n">GraphicsDevice</span><span class="p">.</span><span class="n">Viewport</span><span class="p">);</span>
<span class="n">_camera</span><span class="p">.</span><span class="n">Limits</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Rectangle</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">512</span><span class="p">,</span> <span class="m">512</span><span class="p">);</span>
</code></pre></div></div>

<p>No matter how big or small your Viewport and Limits rectangle currently are, the camera’s position and zoom are initialized so that the player is guaranteed to only see the inside of that region. As you saw on the video earlier, I cycle through rectangles of many different sizes and locations and the camera is automatically updated to focus on that content.</p>

<p class="button"><a href="https://github.com/davidluzgouveia/blog-camera-limiting">Source Code</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[On my 2D Camera with Parallax Scrolling in XNA article, one of the topics I described down in the FAQ section was how to limit the range of movement of a 2D camera so that only part of the game world may be seen.]]></summary></entry><entry><title type="html">Pathfinding on a 2D Polygonal Map</title><link href="https://davidluzgouveia.github.io/xna/pathfinding-on-a-2d-polygonal-map" rel="alternate" type="text/html" title="Pathfinding on a 2D Polygonal Map" /><published>2011-05-20T00:00:00+00:00</published><updated>2011-05-20T00:00:00+00:00</updated><id>https://davidluzgouveia.github.io/xna/pathfinding-on-a-2d-polygonal-map</id><content type="html" xml:base="https://davidluzgouveia.github.io/xna/pathfinding-on-a-2d-polygonal-map"><![CDATA[<p>I haven’t had much time to update the blog lately (mostly due to having to crunch work on my thesis) and for that I apologize. But since it’s been one month since my last post, I decided to write something up today, even if it’s not a full blown article with source code like my previous posts.</p>

<p>So, here’s the deal! I’ve been working on 2D point-and-click graphic adventure game engine and editor lately, and what I’d like to share today is the general idea of how I ended up implementing the pathfinding for my engine.</p>

<p>If you’ve never seen a 2D point-and-click graphic adventure game, it’s a game genre that used to be really popular during the 90s. I think this video sums it all up (literally):</p>

<iframe width="420" height="315" src="//www.youtube.com/embed/xnSzf8eirww?rel=0" frameborder="0" allowfullscreen=""></iframe>

<p>So, in most point-and-click graphic adventure games, whenever you click on the screen, your character tries to get as close as he can to that location, while evading all the obstacles along the way. But unlike a tile-based game where the walkable areas are easily represented by a regular grid, the floor on a graphic adventure game can have virtually any arbitrary shape.</p>

<p>In the old days (in the golden era of LucasArts and the SCUMM) they would often represent the walkable areas as a set of walk boxes, which were really nothing more than simple horizontal trapezoids laid down to cover the entire floor area. A pre-processing stage would then calculate the shortest path between each and every walk box, and store the results in a matrix, so they could simply be looked up at runtime (which traded an higher memory footprint for increased performance).</p>

<p>Nowadays, computers have become so advanced that it’s not really necessary to do this - we can simply run the pathfinding in realtime and be done with it. And as for the floor representation, I wanted something that would be easier to define in my editor than trying to manually cover the floor with individual trapezoids. I wanted the user to be able to simply <em>draw</em> any shape he wanted, no matter how complex, and have the character automatically know how to navigate it!</p>

<p>So here’s a video of what I came up with:</p>

<iframe width="560" height="315" src="//www.youtube.com/embed/fC1_v0FTKa4?rel=0" frameborder="0" allowfullscreen=""></iframe>

<h2 id="algorithm">Algorithm</h2>

<p>The pathfinding algorithm used in the video is really just a regular A*. I recommend <a href="http://blogs.msdn.com/b/ericlippert/archive/2007/10/02/path-finding-using-a-in-c-3-0.aspx">this resource</a> to learn how to implement it in C#, and what I used is pretty much just a direct translation from the method described there! What’s more special here is how the graph is created, which is what enables us to walk all over the surface of the polygon without ever leaving it, and always finding the shortest route possible. So, here’s the process needed to create the graph:</p>

<ol>
  <li>First, create a graph node for each concave vertex of the polygon. If the polygon has holes, then you should also include the convex vertices of the hole polygons.</li>
  <li>Run a line-of-sight algorithm between each pair of graph nodes and link those which are in direct line-of-sight from each other.</li>
</ol>

<p>As an example, here’s a simpler polygon than the one in the video. I’ve marked all the concave vertices with a circle, and you can also see the connections between each of them. This is all you need to be able to walk over the polygon!</p>

<p><a href="/xna/assets/2011-05-20-pathfinding-on-a-2d-polygonal-map/VisibilityGraph.png"><img src="/xna/assets/2011-05-20-pathfinding-on-a-2d-polygonal-map/VisibilityGraph.png" alt="VisibilityGraph" /></a></p>

<p>This sort of graph is usually referred to as a visibility graph, and because of that, the pathfinding method I used is also known as points-of-visibility pathfinding. You can read more about it in the first two Game Programming Gems books, on the articles “The Basics of A* for Path Planning” and “Expanded Geometry for Points-of-Visibility Pathfinding” respectively. The graph could still be optimized to remove a lot of redundant edges that will never be needed to move around obstacles, but I left that for a later stage since I’m not running into any performance issues at the moment.</p>

<p>With your graph structure created, you can apply the A* algorithm over it by following these steps:</p>

<ol>
  <li>First verify if both the start and end points of the path are inside the polygon. If the end point is outside the polygon you can optionally clamp it back inside.</li>
  <li>Then start by checking if both points are in line-of-sight. If they are, there’s no need for pathfinding, just walk there!</li>
  <li>Otherwise, add the start and end points of your path as new temporary nodes to the graph.</li>
  <li>Connect them to every other node that they can see on the graph.</li>
  <li>Run your A* implementation on the graph to get your path. This path is guaranteed to be as direct as possible!</li>
  <li>Finally, remove the two temporary nodes from the graph.</li>
</ol>

<p>Taking the graph from earlier, this process could be represented as something like:</p>

<p><a href="/xna/assets/2011-05-20-pathfinding-on-a-2d-polygonal-map/VisibilityGraph2.png"><img src="/xna/assets/2011-05-20-pathfinding-on-a-2d-polygonal-map/VisibilityGraph2.png" alt="VisibilityGraph2" /></a></p>

<p>Where the red and green dots are the start and end nodes which have been added to the graph, and linked to every other node they can see (the green lines). Then a path is taken from this new graph (the light blue line).</p>

<h2 id="code-snippets">Code Snippets</h2>

<p>I don’t have a full sample that I can share at this moment, but I’ll describe two of the most tricky parts of the process. Hopefully you can figure out the rest from the references I gave above.</p>

<p>One essential part of the process is knowing if two points inside a polygon are in line of sight or not. In order to do that, I run a line segment intersection test between the line segment formed by both nodes, and all edges of the polygon. If both nodes are in line-of-sight, then the test should return false. It’s not very efficient since I compare against all edges of the polygon, but it gets the work done. Heres the helper method I use for the line segment intersection test:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="nf">LineSegmentsCross</span><span class="p">(</span><span class="n">Vector2</span> <span class="n">a</span><span class="p">,</span> <span class="n">Vector2</span> <span class="n">b</span><span class="p">,</span> <span class="n">Vector2</span> <span class="n">c</span><span class="p">,</span> <span class="n">Vector2</span> <span class="n">d</span><span class="p">)</span>
<span class="p">{</span>
    <span class="kt">float</span> <span class="n">denominator</span> <span class="p">=</span> <span class="p">((</span><span class="n">b</span><span class="p">.</span><span class="n">X</span> <span class="p">-</span> <span class="n">a</span><span class="p">.</span><span class="n">X</span><span class="p">)</span> <span class="p">*</span> <span class="p">(</span><span class="n">d</span><span class="p">.</span><span class="n">Y</span> <span class="p">-</span> <span class="n">c</span><span class="p">.</span><span class="n">Y</span><span class="p">))</span> <span class="p">-</span> <span class="p">((</span><span class="n">b</span><span class="p">.</span><span class="n">Y</span> <span class="p">-</span> <span class="n">a</span><span class="p">.</span><span class="n">Y</span><span class="p">)</span> <span class="p">*</span> <span class="p">(</span><span class="n">d</span><span class="p">.</span><span class="n">X</span> <span class="p">-</span> <span class="n">c</span><span class="p">.</span><span class="n">X</span><span class="p">));</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">denominator</span> <span class="p">==</span> <span class="m">0</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="kt">float</span> <span class="n">numerator1</span> <span class="p">=</span> <span class="p">((</span><span class="n">a</span><span class="p">.</span><span class="n">Y</span> <span class="p">-</span> <span class="n">c</span><span class="p">.</span><span class="n">Y</span><span class="p">)</span> <span class="p">*</span> <span class="p">(</span><span class="n">d</span><span class="p">.</span><span class="n">X</span> <span class="p">-</span> <span class="n">c</span><span class="p">.</span><span class="n">X</span><span class="p">))</span> <span class="p">-</span> <span class="p">((</span><span class="n">a</span><span class="p">.</span><span class="n">X</span> <span class="p">-</span> <span class="n">c</span><span class="p">.</span><span class="n">X</span><span class="p">)</span> <span class="p">*</span> <span class="p">(</span><span class="n">d</span><span class="p">.</span><span class="n">Y</span> <span class="p">-</span> <span class="n">c</span><span class="p">.</span><span class="n">Y</span><span class="p">));</span>

    <span class="kt">float</span> <span class="n">numerator2</span> <span class="p">=</span> <span class="p">((</span><span class="n">a</span><span class="p">.</span><span class="n">Y</span> <span class="p">-</span> <span class="n">c</span><span class="p">.</span><span class="n">Y</span><span class="p">)</span> <span class="p">*</span> <span class="p">(</span><span class="n">b</span><span class="p">.</span><span class="n">X</span> <span class="p">-</span> <span class="n">a</span><span class="p">.</span><span class="n">X</span><span class="p">))</span> <span class="p">-</span> <span class="p">((</span><span class="n">a</span><span class="p">.</span><span class="n">X</span> <span class="p">-</span> <span class="n">c</span><span class="p">.</span><span class="n">X</span><span class="p">)</span> <span class="p">*</span> <span class="p">(</span><span class="n">b</span><span class="p">.</span><span class="n">Y</span> <span class="p">-</span> <span class="n">a</span><span class="p">.</span><span class="n">Y</span><span class="p">));</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">numerator1</span> <span class="p">==</span> <span class="m">0</span> <span class="p">||</span> <span class="n">numerator2</span> <span class="p">==</span> <span class="m">0</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="kt">float</span> <span class="n">r</span> <span class="p">=</span> <span class="n">numerator1</span> <span class="p">/</span> <span class="n">denominator</span><span class="p">;</span>
    <span class="kt">float</span> <span class="n">s</span> <span class="p">=</span> <span class="n">numerator2</span> <span class="p">/</span> <span class="n">denominator</span><span class="p">;</span>

    <span class="k">return</span> <span class="p">(</span><span class="n">r</span> <span class="p">&gt;</span> <span class="m">0</span> <span class="p">&amp;&amp;</span> <span class="n">r</span> <span class="p">&lt;</span> <span class="m">1</span><span class="p">)</span> <span class="p">&amp;&amp;</span> <span class="p">(</span><span class="n">s</span> <span class="p">&gt;</span> <span class="m">0</span> <span class="p">&amp;&amp;</span> <span class="n">s</span> <span class="p">&lt;</span> <span class="m">1</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The other important point is to know whether a vertex in a polygon is convex or not. I use the following method for this (remember, if the polygon you’re testing is a hole, then you should invert the result):</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="nf">IsVertexConcave</span><span class="p">(</span><span class="n">IList</span><span class="p">&lt;</span><span class="n">Vector2</span><span class="p">&gt;</span> <span class="n">vertices</span><span class="p">,</span> <span class="kt">int</span> <span class="n">vertex</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">Vector2</span> <span class="n">current</span> <span class="p">=</span> <span class="n">vertices</span><span class="p">[</span><span class="n">vertex</span><span class="p">];</span>
    <span class="n">Vector2</span> <span class="n">next</span> <span class="p">=</span> <span class="n">vertices</span><span class="p">[(</span><span class="n">vertex</span> <span class="p">+</span> <span class="m">1</span><span class="p">)</span> <span class="p">%</span> <span class="n">vertices</span><span class="p">.</span><span class="n">Count</span><span class="p">];</span>
    <span class="n">Vector2</span> <span class="n">previous</span> <span class="p">=</span> <span class="n">vertices</span><span class="p">[</span><span class="n">vertex</span> <span class="p">==</span> <span class="m">0</span> <span class="p">?</span> <span class="n">vertices</span><span class="p">.</span><span class="n">Count</span> <span class="p">-</span> <span class="m">1</span> <span class="p">:</span> <span class="n">vertex</span> <span class="p">-</span> <span class="m">1</span><span class="p">];</span>

    <span class="n">Vector2</span> <span class="n">left</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="n">current</span><span class="p">.</span><span class="n">X</span> <span class="p">-</span> <span class="n">previous</span><span class="p">.</span><span class="n">X</span><span class="p">,</span> <span class="n">current</span><span class="p">.</span><span class="n">Y</span> <span class="p">-</span> <span class="n">previous</span><span class="p">.</span><span class="n">Y</span><span class="p">);</span>
    <span class="n">Vector2</span> <span class="n">right</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="n">next</span><span class="p">.</span><span class="n">X</span> <span class="p">-</span> <span class="n">current</span><span class="p">.</span><span class="n">X</span><span class="p">,</span> <span class="n">next</span><span class="p">.</span><span class="n">Y</span> <span class="p">-</span> <span class="n">current</span><span class="p">.</span><span class="n">Y</span><span class="p">);</span>

    <span class="kt">float</span> <span class="n">cross</span> <span class="p">=</span> <span class="p">(</span><span class="n">left</span><span class="p">.</span><span class="n">X</span> <span class="p">*</span> <span class="n">right</span><span class="p">.</span><span class="n">Y</span><span class="p">)</span> <span class="p">-</span> <span class="p">(</span><span class="n">left</span><span class="p">.</span><span class="n">Y</span> <span class="p">*</span> <span class="n">right</span><span class="p">.</span><span class="n">X</span><span class="p">);</span>

    <span class="k">return</span> <span class="n">cross</span> <span class="p">&lt;</span> <span class="m">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>To check if a point inside a polygon I used the following method which has some extra code added for tolerance near the edges:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">static</span> <span class="kt">bool</span> <span class="nf">Inside</span><span class="p">(</span><span class="n">IList</span><span class="p">&lt;</span><span class="n">Vector2</span><span class="p">&gt;</span> <span class="n">polygon</span><span class="p">,</span> <span class="n">Vector2</span> <span class="n">position</span><span class="p">,</span> <span class="kt">bool</span> <span class="n">toleranceOnOutside</span> <span class="p">=</span> <span class="k">true</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">Vector2</span> <span class="n">point</span> <span class="p">=</span> <span class="n">position</span><span class="p">;</span>

    <span class="k">const</span> <span class="kt">float</span> <span class="n">epsilon</span> <span class="p">=</span> <span class="m">0.5f</span><span class="p">;</span>

    <span class="kt">bool</span> <span class="n">inside</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span>

    <span class="c1">// Must have 3 or more edges</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">polygon</span><span class="p">.</span><span class="n">Count</span> <span class="p">&lt;</span> <span class="m">3</span><span class="p">)</span> <span class="k">return</span> <span class="k">false</span><span class="p">;</span>

    <span class="n">Vector2</span> <span class="n">oldPoint</span> <span class="p">=</span> <span class="n">polygon</span><span class="p">[</span><span class="n">polygon</span><span class="p">.</span><span class="n">Count</span> <span class="p">-</span> <span class="m">1</span><span class="p">];</span>
    <span class="kt">float</span> <span class="n">oldSqDist</span> <span class="p">=</span> <span class="n">Vector2</span><span class="p">.</span><span class="nf">DistanceSquared</span><span class="p">(</span><span class="n">oldPoint</span><span class="p">,</span> <span class="n">point</span><span class="p">);</span>

    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="n">polygon</span><span class="p">.</span><span class="n">Count</span><span class="p">;</span> <span class="n">i</span><span class="p">++)</span>
    <span class="p">{</span>
        <span class="n">Vector2</span> <span class="n">newPoint</span> <span class="p">=</span> <span class="n">polygon</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
        <span class="kt">float</span> <span class="n">newSqDist</span> <span class="p">=</span> <span class="n">Vector2</span><span class="p">.</span><span class="nf">DistanceSquared</span><span class="p">(</span><span class="n">newPoint</span><span class="p">,</span> <span class="n">point</span><span class="p">);</span>

        <span class="k">if</span> <span class="p">(</span><span class="n">oldSqDist</span> <span class="p">+</span> <span class="n">newSqDist</span> <span class="p">+</span> <span class="m">2.0f</span> <span class="p">*</span> <span class="n">System</span><span class="p">.</span><span class="n">Math</span><span class="p">.</span><span class="nf">Sqrt</span><span class="p">(</span><span class="n">oldSqDist</span> <span class="p">*</span> <span class="n">newSqDist</span><span class="p">)</span> <span class="p">-</span> <span class="n">Vector2</span><span class="p">.</span><span class="nf">DistanceSquared</span><span class="p">(</span><span class="n">newPoint</span><span class="p">,</span> <span class="n">oldPoint</span><span class="p">)</span> <span class="p">&lt;</span> <span class="n">epsilon</span><span class="p">)</span>
            <span class="k">return</span> <span class="n">toleranceOnOutside</span><span class="p">;</span>

        <span class="n">Vector2</span> <span class="n">left</span><span class="p">;</span>
        <span class="n">Vector2</span> <span class="n">right</span><span class="p">;</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">newPoint</span><span class="p">.</span><span class="n">X</span> <span class="p">&gt;</span> <span class="n">oldPoint</span><span class="p">.</span><span class="n">X</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">left</span> <span class="p">=</span> <span class="n">oldPoint</span><span class="p">;</span>
            <span class="n">right</span> <span class="p">=</span> <span class="n">newPoint</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span>
        <span class="p">{</span>
            <span class="n">left</span> <span class="p">=</span> <span class="n">newPoint</span><span class="p">;</span>
            <span class="n">right</span> <span class="p">=</span> <span class="n">oldPoint</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="k">if</span> <span class="p">(</span><span class="n">left</span><span class="p">.</span><span class="n">X</span> <span class="p">&lt;</span> <span class="n">point</span><span class="p">.</span><span class="n">X</span> <span class="p">&amp;&amp;</span> <span class="n">point</span><span class="p">.</span><span class="n">X</span> <span class="p">&lt;=</span> <span class="n">right</span><span class="p">.</span><span class="n">X</span> <span class="p">&amp;&amp;</span> <span class="p">(</span><span class="n">point</span><span class="p">.</span><span class="n">Y</span> <span class="p">-</span> <span class="n">left</span><span class="p">.</span><span class="n">Y</span><span class="p">)</span> <span class="p">*</span> <span class="p">(</span><span class="n">right</span><span class="p">.</span><span class="n">X</span> <span class="p">-</span> <span class="n">left</span><span class="p">.</span><span class="n">X</span><span class="p">)</span> <span class="p">&lt;</span> <span class="p">(</span><span class="n">right</span><span class="p">.</span><span class="n">Y</span> <span class="p">-</span> <span class="n">left</span><span class="p">.</span><span class="n">Y</span><span class="p">)</span> <span class="p">*</span> <span class="p">(</span><span class="n">point</span><span class="p">.</span><span class="n">X</span> <span class="p">-</span> <span class="n">left</span><span class="p">.</span><span class="n">X</span><span class="p">))</span>
            <span class="n">inside</span> <span class="p">=</span> <span class="p">!</span><span class="n">inside</span><span class="p">;</span>

        <span class="n">oldPoint</span> <span class="p">=</span> <span class="n">newPoint</span><span class="p">;</span>
        <span class="n">oldSqDist</span> <span class="p">=</span> <span class="n">newSqDist</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="n">inside</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And to check for line of sight between two points inside the polygon,  it was basically this:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">bool</span> <span class="nf">InLineOfSight</span><span class="p">(</span><span class="n">Polygon</span> <span class="n">polygon</span><span class="p">,</span> <span class="n">Vector2</span> <span class="n">start</span><span class="p">,</span> <span class="n">Vector2</span> <span class="n">end</span><span class="p">)</span>
<span class="p">{</span>
  <span class="c1">// Not in LOS if any of the ends is outside the polygon</span>
  <span class="k">if</span> <span class="p">(!</span><span class="n">polygon</span><span class="p">.</span><span class="nf">Inside</span><span class="p">(</span><span class="n">start</span><span class="p">)</span> <span class="p">||</span> <span class="p">!</span><span class="n">polygon</span><span class="p">.</span><span class="nf">Inside</span><span class="p">(</span><span class="n">end</span><span class="p">))</span> <span class="k">return</span> <span class="k">false</span><span class="p">;</span>

  <span class="c1">// In LOS if it's the same start and end location</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">Vector2</span><span class="p">.</span><span class="nf">Distance</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">)</span> <span class="p">&lt;</span> <span class="n">epsilon</span><span class="p">)</span> <span class="k">return</span> <span class="k">true</span><span class="p">;</span>

  <span class="c1">// Not in LOS if any edge is intersected by the start-end line segment</span>
  <span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">vertices</span> <span class="k">in</span> <span class="n">polygon</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">var</span> <span class="n">n</span> <span class="p">=</span> <span class="n">vertices</span><span class="p">.</span><span class="n">Count</span><span class="p">;</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">j</span> <span class="p">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="p">++)</span>
      <span class="k">if</span> <span class="p">(</span><span class="nf">LineSegmentsCross</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">vertices</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">vertices</span><span class="p">[(</span><span class="n">i</span><span class="p">+</span><span class="m">1</span><span class="p">)%</span><span class="n">n</span><span class="p">]))</span>
        <span class="k">return</span> <span class="k">false</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="c1">// Finally the middle point in the segment determines if in LOS or not</span>
  <span class="k">return</span> <span class="n">polygon</span><span class="p">.</span><span class="nf">Inside</span><span class="p">((</span><span class="n">start</span> <span class="p">+</span> <span class="n">end</span><span class="p">)</span> <span class="p">/</span> <span class="m">2f</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Finally, you might have noticed how in the video I was joining and subtracting polygons from each other while drawing. This process was made easy due to a library called Clipper (which you can get <a href="http://sourceforge.net/projects/polyclipping/">here</a>). It’s pretty easy to use! What I’m doing is close to:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Clipper</span> <span class="n">clipper</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Clipper</span><span class="p">();</span>
<span class="n">clipper</span><span class="p">.</span><span class="nf">AddPolygons</span><span class="p">(</span><span class="n">_fullPolygon</span><span class="p">,</span> <span class="n">PolyType</span><span class="p">.</span><span class="n">ptSubject</span><span class="p">);</span>
<span class="n">clipper</span><span class="p">.</span><span class="nf">AddPolygon</span><span class="p">(</span><span class="n">_temporaryPolygon</span><span class="p">,</span> <span class="n">PolyType</span><span class="p">.</span><span class="n">ptClip</span><span class="p">);</span>
<span class="n">List</span><span class="p">&lt;</span><span class="n">List</span><span class="p">&lt;</span><span class="n">IntPoint</span><span class="p">&gt;&gt;</span> <span class="n">solution</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">List</span><span class="p">&lt;</span><span class="n">IntPoint</span><span class="p">&gt;&gt;();</span>
<span class="n">clipper</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="n">ClipType</span><span class="p">.</span><span class="n">ctUnion</span><span class="p">,</span> <span class="n">solution</span><span class="p">,</span> <span class="n">PolyFillType</span><span class="p">.</span><span class="n">pftEvenOdd</span><span class="p">,</span> <span class="n">PolyFillType</span><span class="p">.</span><span class="n">pftEvenOdd</span><span class="p">));</span>
<span class="n">_temporaryPolygon</span><span class="p">.</span><span class="nf">Clear</span><span class="p">();</span>
<span class="n">_fullPolygon</span> <span class="p">=</span> <span class="n">solution</span><span class="p">;</span>
</code></pre></div></div>

<p>And that’s all for today, I hope you enjoyed it. I don’t have any source code at this time, since this is still coupled with my game engine, but I might get to it sometime in the future when I have more time. Until then!</p>]]></content><author><name></name></author><summary type="html"><![CDATA[I haven’t had much time to update the blog lately (mostly due to having to crunch work on my thesis) and for that I apologize. But since it’s been one month since my last post, I decided to write something up today, even if it’s not a full blown article with source code like my previous posts.]]></summary></entry><entry><title type="html">Creating a Basic Synth in XNA 4.0 - Part III</title><link href="https://davidluzgouveia.github.io/xna/creating-a-basic-synth-in-xna-part-iii" rel="alternate" type="text/html" title="Creating a Basic Synth in XNA 4.0 - Part III" /><published>2011-04-21T00:00:00+00:00</published><updated>2011-04-21T00:00:00+00:00</updated><id>https://davidluzgouveia.github.io/xna/creating-a-basic-synth-in-xna-part-iii</id><content type="html" xml:base="https://davidluzgouveia.github.io/xna/creating-a-basic-synth-in-xna-part-iii"><![CDATA[<p>Hello! This is the third and final part of my <a href="/xna/creating-a-basic-synth-in-xna-part-i">Creating a Basic Synth in XNA 4.0</a> series. Don’t worry though, since I intend to write some more about this subject in the future, but since the topics I expect to cover will start getting more advanced, I’ll make them into a separate series.</p>

<p>In <a href="/xna/creating-a-basic-synth-in-xna-part-ii">part II</a> I’ve shown how to use the <em>DynamicSoundEffectInstance</em> class in order to to continuously play any single sound signal that we were capable of generating. I also wrote a separate article about <a href="/xna/about-oscillators">oscillators</a> (which you should also read if you haven’t done so already) which describes a simple class which takes care of generating some of the most common types of synthesized sounds.</p>

<p>Now it’s time to bring it all together and build a little interactive synthesizer that we can play like a piano on our keyboard keys! But for that, there are two major problems that we need to address:</p>

<ol>
  <li><em>Polyphony</em> - Being able to play more than one sound at the same time.</li>
  <li><em>Time</em> - Being able to control where each note starts and stops.</li>
</ol>

<p>This time I probably won’t be able to cover every bit of code used in the article, but you can download the sample source code at the end and hopefully it should fill any gaps.</p>

<h2 id="architecture">Architecture</h2>

<p>The architecture of the synthesizer I created for this article is divided into three classes or components. You can see them on the image below:</p>

<p><a href="/xna/assets/2011-04-21-creating-a-basic-synth-in-xna-part-iii/synthdiagram1.png"><img src="/xna/assets/2011-04-21-creating-a-basic-synth-in-xna-part-iii/synthdiagram1.png" alt="The Building Blocks" /></a>
<em>The Building Blocks</em></p>

<p>What this diagram represents is that we’ll haves a <em>Synth</em> class with a bunch of <em>Voice</em> objects inside. You can think of a <em>Voice</em> object as being something that encapsulates a single individual sound, and provides some control over it. Unsurprisingly, the number of <em>Voice</em> objects created determine how many sounds the <em>Synth</em> can play at the same time, or in other words its polyphony.</p>

<p>As for generating the sound itself, the <em>Voice</em> object delegates that task to the <em>Oscillator</em> class that I already discussed. In this case, there will be a single <em>Oscillator</em> shared by all voices, which means that every key we press will be making the same type of sound (but at different frequencies).</p>

<p>So, how do we solve the problems of polyphony and time control using this architecture? Simple!</p>

<ol>
  <li>In regards to implementing <strong>polyphony</strong>, what happens is that the <em>Synth</em> class keep a list with all the <em>Voices</em> that are currently being played, and anytime it needs to submit a new audio buffer, it iterates over all active voices passing each of them the same audio buffer. Then it’s up to the <em>Voices</em> to do their own processing on that buffer. The catch is that, unlike what we did in part II, instead of overwriting the buffer with new values, these values will be <em>added</em> to the values that are already there, which effectively mixes all sounds the together!</li>
  <li>As for having some control over <strong>time</strong> I’ve just mentioned that all the notes that are playing are put on an active voices list. Because of that, controlling when a note starts or stops is pretty easy! To start a note, just create a <em>Voice</em> and add it to the active voices list. To stop a note, just get the <em>Voice</em> that is associated with it and remove it from the active voices list. In order to allow a Voice to kill itself from inside, I added a boolean <em>IsAlive</em> property to my voices, and when iterating over them on my Synth class, I remove any voice that is already dead from the list. Voila!</li>
</ol>

<p>The Synth class deserves some special attention because of all the different things it will be doing. Let’s start with an image of its internals:</p>

<p><a href="/xna/assets/2011-04-21-creating-a-basic-synth-in-xna-part-iii/synthdiagram21.png"><img src="/xna/assets/2011-04-21-creating-a-basic-synth-in-xna-part-iii/synthdiagram21.png" alt="Synth Architecture" /></a>
<em>Synth Architecture</em></p>

<p>The <strong>Audio Engine</strong> bit is exactly what was described in part II of the series. It creates a DynamicSoundEffectInstance object plus a couple of buffers, and links everything together, taking care of submiting a new audio buffer when needed. The only big difference is that here the audio engine will loop over all active voices and delegate the task of modifying the audio buffers to them.</p>

<p>The <strong>Voices</strong> section is responsible for managing all the voices. It uses three different data structures for this:</p>

<ul>
  <li><em>Pool of Voices</em> - An array of size Polyphony containing all the voices that will be used by the synthesizer. These will be created when the synthesizer is initialized, and remain constant until the end.</li>
  <li><em>Active Voices</em> - A list where we store references to all of the voices that are currently playing. This list is picked up by the audio engine and determines which notes we’ll be hearing.</li>
  <li><em>Free Voices</em> - A stack which will be used to quickly get a voice that is not being used when we ask the synthesizer to play a new note.</li>
</ul>

<p><strong>Interaction</strong> with the synthesizer is done through two methods named <em>NoteOn</em> and <em>NoteOff</em>. The <em>NoteOn</em> method fetches a free voice, initializes it with the frequency corresponding to the note we want to play, and adds it to the active voices list. The <em>NoteOff</em> method simply tells the voice corresponding to that particular note to stop playing.</p>

<p>For this we also need the <strong>Note Registry</strong> which is a simple dictionary that keeps a connection between each playing note and its respective voice object.</p>

<p>Okay, enough of the architecture. I’ll jump straight into some code now. I’ll try to cover the most important bits, but download the source code at the end of the article and play around with it.</p>

<h2 id="step-1-the-oscillator-class">Step 1: The Oscillator Class</h2>

<p>I’ll start with the simplest step which is generating the audio signal. I’ve already talked about this subject <a href="/xna/about-oscillators">before</a>. Basically we’ll create a class called Oscillator whose sole purpose is to generate audio signals of different types.</p>

<p>But in comparison with the Oscillator class I described earlier, I made a few modifications this time to make it a bit easier to understand:</p>

<ul>
  <li>I changed it into a static class with separate methods for each type of wave. Now you don’t even need to create an Oscillator. Instead you only need to call the right method and you’re good to go.</li>
  <li>I also changed the signature of the main function a bit. This time our oscillator will depend on two different parameters (frequency and time) while the signal’s maximum amplitude will remain fixed to 1. Any changes to the signal’s amplitude will come later from our synth.</li>
</ul>

<p>Here’s the code:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">static</span> <span class="k">class</span> <span class="nc">Oscillator</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">static</span> <span class="kt">float</span> <span class="nf">Sine</span><span class="p">(</span><span class="kt">float</span> <span class="n">frequency</span><span class="p">,</span> <span class="kt">float</span> <span class="n">time</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="p">(</span><span class="kt">float</span><span class="p">)</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Sin</span><span class="p">(</span><span class="n">frequency</span> <span class="p">*</span> <span class="n">time</span> <span class="p">*</span> <span class="m">2</span> <span class="p">*</span> <span class="n">Math</span><span class="p">.</span><span class="n">PI</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">static</span> <span class="kt">float</span> <span class="nf">Square</span><span class="p">(</span><span class="kt">float</span> <span class="n">frequency</span><span class="p">,</span> <span class="kt">float</span> <span class="n">time</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="nf">Sine</span><span class="p">(</span><span class="n">frequency</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span> <span class="p">&gt;=</span> <span class="m">0</span> <span class="p">?</span> <span class="m">1.0f</span> <span class="p">:</span> <span class="p">-</span><span class="m">1.0f</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">static</span> <span class="kt">float</span> <span class="nf">Sawtooth</span><span class="p">(</span><span class="kt">float</span> <span class="n">frequency</span><span class="p">,</span> <span class="kt">float</span> <span class="n">time</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="p">(</span><span class="kt">float</span><span class="p">)</span> <span class="p">(</span><span class="m">2</span> <span class="p">*</span> <span class="p">(</span><span class="n">time</span> <span class="p">*</span> <span class="n">frequency</span> <span class="p">-</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Floor</span><span class="p">(</span><span class="n">time</span> <span class="p">*</span> <span class="n">frequency</span> <span class="p">+</span> <span class="m">0.5</span><span class="p">)));</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">static</span> <span class="kt">float</span> <span class="nf">Triangle</span><span class="p">(</span><span class="kt">float</span> <span class="n">frequency</span><span class="p">,</span> <span class="kt">float</span> <span class="n">time</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">return</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Abs</span><span class="p">(</span><span class="nf">Sawtooth</span><span class="p">(</span><span class="n">frequency</span><span class="p">,</span> <span class="n">time</span><span class="p">))</span> <span class="p">*</span> <span class="m">2.0f</span> <span class="p">-</span> <span class="m">1.0f</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">delegate</span> <span class="kt">float</span> <span class="nf">OscillatorDelegate</span><span class="p">(</span><span class="kt">float</span> <span class="n">frequency</span><span class="p">,</span> <span class="kt">float</span> <span class="n">time</span><span class="p">);</span>
</code></pre></div></div>

<p>You may have noticed that I also declared a delegate with the same signature as these methods. This will be useful to store a reference to one of the oscillator methods, and being able to change them on the fly on my synth class. That’s all for this part, and with this we’ve got the four most common sound waveforms covered. Let’s move to step two then.</p>

<h2 id="step-2-the-voice-class">Step 2: The Voice Class</h2>

<p>Next I’ll be talking about the <em>Voice</em> class. I’ll start with the public interface of the Voice class, and what each of its methods need to do. The comments should be self-explanatory:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Returns true if voice is still playing, false if it has ended.</span>
<span class="kt">bool</span> <span class="n">IsAlive</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>

<span class="c1">// Starts the voice using the chosen frequency</span>
<span class="k">void</span> <span class="nf">Start</span><span class="p">(</span><span class="kt">float</span> <span class="n">frequency</span><span class="p">);</span>

<span class="c1">// Stops voice playback</span>
<span class="k">void</span> <span class="nf">Stop</span><span class="p">();</span>

<span class="c1">// Add contribution to the buffer</span>
<span class="k">void</span> <span class="nf">Process</span><span class="p">(</span><span class="kt">float</span><span class="p">[,]</span> <span class="n">buffer</span><span class="p">);</span>
</code></pre></div></div>

<p>Implementing it is not too hard. The Voice class keeps a reference to the parent synth class which is used to access the shared oscillator. Calling <em>Stop</em> will make the voice stop immediatly by setting the <em>IsAlive</em> property to false. The only part that might not be too obvious, is why I multiply the sample by 0.3f before adding it to the buffer. I do so in order to lower its volume a bit and prevent the resulting values to start saturating with just a couple of notes pressed. Still, if you try to play too many notes at the same time, you’re bound to run into distortion problems, unless you start using a more intricate mixing algorithm (instead of just adding the samples together).</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">Voice</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="nf">Voice</span><span class="p">(</span><span class="n">Synth</span> <span class="n">synth</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">_synth</span> <span class="p">=</span> <span class="n">synth</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="kt">bool</span> <span class="n">IsAlive</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">private</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">Start</span><span class="p">(</span><span class="kt">float</span> <span class="n">frequency</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">_frequency</span> <span class="p">=</span> <span class="n">frequency</span><span class="p">;</span>
        <span class="n">_time</span> <span class="p">=</span> <span class="m">0.0f</span><span class="p">;</span>
        <span class="n">IsAlive</span> <span class="p">=</span> <span class="k">true</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">Stop</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">IsAlive</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">Process</span><span class="p">(</span><span class="kt">float</span><span class="p">[,]</span> <span class="n">buffer</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">IsAlive</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="kt">int</span> <span class="n">samplesPerBuffer</span> <span class="p">=</span> <span class="n">buffer</span><span class="p">.</span><span class="nf">GetLength</span><span class="p">(</span><span class="m">1</span><span class="p">);</span>
            <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="n">samplesPerBuffer</span><span class="p">;</span> <span class="n">i</span><span class="p">++)</span>
            <span class="p">{</span>
                <span class="kt">float</span> <span class="n">sample</span> <span class="p">=</span> <span class="n">_synth</span><span class="p">.</span><span class="nf">Oscillator</span><span class="p">(</span><span class="n">_frequency</span><span class="p">,</span> <span class="n">_time</span><span class="p">);</span>
                <span class="c1">// Important: Use += instead of = !</span>
                <span class="n">buffer</span><span class="p">[</span><span class="m">0</span><span class="p">,</span> <span class="n">i</span><span class="p">]</span> <span class="p">+=</span> <span class="n">sample</span> <span class="p">*</span> <span class="m">0.3f</span><span class="p">;</span>
                <span class="n">_time</span> <span class="p">+=</span> <span class="m">1.0f</span> <span class="p">/</span> <span class="n">Synth</span><span class="p">.</span><span class="n">SampleRate</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">private</span> <span class="kt">float</span> <span class="n">_frequency</span><span class="p">;</span>
    <span class="k">private</span> <span class="kt">float</span> <span class="n">_time</span><span class="p">;</span>
    <span class="k">private</span> <span class="k">readonly</span> <span class="n">Synth</span> <span class="n">_synth</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>At the end of this article I’ll show an upgraded version of the Voice class which allows you to add a simple fade-in/fade-out to your voices which gets rid of a few annoying sound problems and makes everything sound better. But for now I’ll move on to the <em>Synth</em> class.</p>

<h2 id="step-3-the-synth-class">Step 3: The Synth Class</h2>

<p>A large part of the Synth class is the low-level audio engine management that I’ve described in <a href="/xna/creating-a-basic-synth-in-xna-part-ii">part II</a>, so I’ll skip right over those and only talk about the significant changes.</p>

<p>To start with, there’s the four data structures that are used to manage all of the voices. They’re all initialized in the constructor of the class. First, we create an array of voices (sized Polyphony) which will be our voice pool. This is the only point in our application where we will be instantiating Voice objects - after that it’s just references to existing objects being moved around. Next is the stack of free voices, which initially contains all of the voices in the pool. Then there’s a list of active voices, which starts out empty, and is used to keep all the voices that are playing at any given moment. Finally we keep a dictionary linking notes (which in this sample will be an integer value with 0 corresponding to C4, and moving up and down in semi-tones) to the voices they correspond to. This is necessary when we tell the synth to stop playing a note, so that it can delegate the order to the appropriate voice.</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">Polyphony</span> <span class="p">=</span> <span class="m">32</span><span class="p">;</span>
<span class="k">private</span> <span class="k">readonly</span> <span class="n">Voice</span><span class="p">[]</span> <span class="n">_voicePool</span><span class="p">;</span>
<span class="k">private</span> <span class="k">readonly</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Voice</span><span class="p">&gt;</span> <span class="n">_activeVoices</span><span class="p">;</span>
<span class="k">private</span> <span class="k">readonly</span> <span class="n">Stack</span><span class="p">&lt;</span><span class="n">Voice</span><span class="p">&gt;</span> <span class="n">_freeVoices</span><span class="p">;</span>
<span class="k">private</span> <span class="k">readonly</span> <span class="n">Dictionary</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="n">Voice</span><span class="p">&gt;</span> <span class="n">_noteRegistry</span><span class="p">;</span>

<span class="c1">// On Constructor</span>
<span class="n">_voicePool</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Voice</span><span class="p">[</span><span class="n">Polyphony</span><span class="p">];</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="n">Polyphony</span><span class="p">;</span> <span class="p">++</span><span class="n">i</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">_voicePool</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Voice</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">_freeVoices</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Stack</span><span class="p">&lt;</span><span class="n">Voice</span><span class="p">&gt;(</span><span class="n">_voicePool</span><span class="p">);</span>
<span class="n">_activeVoices</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Voice</span><span class="p">&gt;();</span>
<span class="n">_noteRegistry</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Dictionary</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="n">Voice</span><span class="p">&gt;();</span>
</code></pre></div></div>

<p>Next in line is our <em>SubmitBuffer</em> method (once again see part II for clarifications). The first big difference is that we need to clear the buffer (fill it completely with zeros) at the top of each submission. This is necessary because our voices won’t be overwriting the buffer like we before but rather adding their values on top of the existing buffer, so wee need an empty plate to start with (think of it as calling the GraphicsDevice.Clear method for graphics). I’ve gone and moved the <em>ConvertBuffer</em> method into a static helper class, but its contents are still the same as before.</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="k">void</span> <span class="nf">SubmitBuffer</span><span class="p">()</span>
<span class="p">{</span>
    <span class="nf">ClearWorkingBuffer</span><span class="p">();</span> <span class="c1">// Fill buffer with zeros</span>
    <span class="nf">FillWorkingBuffer</span><span class="p">();</span>
    <span class="n">SoundHelper</span><span class="p">.</span><span class="nf">ConvertBuffer</span><span class="p">(</span><span class="n">_workingBuffer</span><span class="p">,</span> <span class="n">_xnaBuffer</span><span class="p">);</span> <span class="c1">// Same method used in part II</span>
    <span class="n">_instance</span><span class="p">.</span><span class="nf">SubmitBuffer</span><span class="p">(</span><span class="n">_xnaBuffer</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Where most of the magic starts is inside the <em>FillWorkingBuffer</em> method. Whereas we used to directly write to the buffer inside of that method, now the only thing it does is iterate over all the active voices, calling Process on them, and removing any dead voices at the end of it. Notice how I iterate over the voices in reverse order, in order to be able to remove them without invalidating my for-index.</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="k">void</span> <span class="nf">FillWorkingBuffer</span><span class="p">()</span>
<span class="p">{</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="n">_activeVoices</span><span class="p">.</span><span class="n">Count</span> <span class="p">-</span> <span class="m">1</span><span class="p">;</span> <span class="n">i</span> <span class="p">&gt;=</span> <span class="m">0</span><span class="p">;</span> <span class="p">--</span><span class="n">i</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">Voice</span> <span class="n">voice</span> <span class="p">=</span> <span class="n">_activeVoices</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
        <span class="n">voice</span><span class="p">.</span><span class="nf">Process</span><span class="p">(</span><span class="n">_workingBuffer</span><span class="p">);</span>

        <span class="k">if</span> <span class="p">(!</span><span class="n">voice</span><span class="p">.</span><span class="n">IsAlive</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">_activeVoices</span><span class="p">.</span><span class="nf">RemoveAt</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
            <span class="n">_freeVoices</span><span class="p">.</span><span class="nf">Push</span><span class="p">(</span><span class="n">voice</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And finally we have the two methods that provide interactivity to the synthesizer, NoteOn and NoteOff. When calling NoteOn, the first thing it does is check the note registry to ensure that note is not already registered. If everything goes well, it tries to fetch a free voice from the top of the stack, registers that voice to the current note, initializes the voice with the appropriate frequency, and finally adds it to the active voices list. The SoundHelper.NoteToFrequency method is used to calculate the right frequency for each musical note (with 0 corresponding to C4 and so forth). Check the source code at the end for the implementation.</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">void</span> <span class="nf">NoteOn</span><span class="p">(</span><span class="kt">int</span> <span class="n">note</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">_noteRegistry</span><span class="p">.</span><span class="nf">ContainsKey</span><span class="p">(</span><span class="n">note</span><span class="p">))</span>
    <span class="p">{</span>
        <span class="k">return</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="n">Voice</span> <span class="n">freeVoice</span> <span class="p">=</span> <span class="nf">GetFreeVoice</span><span class="p">();</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">freeVoice</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">return</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="n">_noteRegistry</span><span class="p">[</span><span class="n">note</span><span class="p">]</span> <span class="p">=</span> <span class="n">freeVoice</span><span class="p">;</span>

    <span class="n">freeVoice</span><span class="p">.</span><span class="nf">Start</span><span class="p">(</span><span class="n">SoundHelper</span><span class="p">.</span><span class="nf">NoteToFrequency</span><span class="p">(</span><span class="n">note</span><span class="p">));</span>

    <span class="n">_activeVoices</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="n">freeVoice</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>As for stopping a note, it’s a matter of checking the note registry to see if it exists, stopping the corresponding voice and removing the note from the registry.</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">void</span> <span class="nf">NoteOff</span><span class="p">(</span><span class="kt">int</span> <span class="n">note</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">Voice</span> <span class="n">voice</span><span class="p">;</span>
    <span class="k">if</span><span class="p">(</span><span class="n">_noteRegistry</span><span class="p">.</span><span class="nf">TryGetValue</span><span class="p">(</span><span class="n">note</span><span class="p">,</span> <span class="k">out</span> <span class="n">voice</span><span class="p">))</span>
    <span class="p">{</span>
        <span class="n">voice</span><span class="p">.</span><span class="nf">Stop</span><span class="p">();</span>
        <span class="n">_noteRegistry</span><span class="p">.</span><span class="nf">Remove</span><span class="p">(</span><span class="n">note</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>You could stop by now, and you’d have a simple synthesizer ready to be played. All you’d have to do is link each NoteOn and NoteOff call with your keyboard’s KeyDown and KeyUp events and you’d be set. But if you do that, you might notice an annoying little “pop” sound when starting or stopping each note. Keep reading to see how this can be solved.</p>

<h2 id="optional-step-4-adding-fade-in-and-fade-out">Optional Step 4: Adding Fade-In and Fade-Out</h2>

<p>There’s a problem with abruptly starting or stopping a sound: the sudden loss in amplitude of the signal can easily create a noticeable “pop” sound that ruins the whole experience. You can hear that in the video sample at the end of the article, whenever I disable the fade mechanism.</p>

<p>In order to prevent this, I’m going to modify the Voice class a bit in order to add a controllable fade-in and fade-out period to the sounds. Fading a sound basically means multiplying the value of the sample you generated by a floating point number between 0 and 1. So you need to find a way to start this floating point number at 0, move it until it reaches 1, and then do the opposite motion at the end of the sound.</p>

<p>What surprised me the most about this is that even if the fade duration is really small (like 5ms, which is so small you probably won’t even notice a difference), it will still be enough to get rid of those unwanted noises! Here’s a list of all the changes I did, but check the source code archive at the end for the actual implementation.</p>

<p><em>Changes to the Voice class:</em></p>

<ol>
  <li>Added FadeInDuration/FadeOutDuration integer variables to my synth which describe the duration of each these phases in samples (so if your sample rate is 44100, then a duration of 44100 will be equivalent to one second).</li>
  <li>Added three different states to the Voice class: Attack (Fade-In), Sustain (Normal) and Release (Fade-Out). I’ll mention why I chose those names below.</li>
  <li>Doing Start() now moves to the Attack state if FadeInDuration is not zero.</li>
  <li>Doing Stop() doesn’t kill the Voice immediatly, but rather changes to the Release state (unless FadeOutDuration is zero).</li>
  <li>Use a counter inside Process to keep track of time and calculate the correct fading factor (between 0 and 1).</li>
  <li>Multiply the sample generated by the fading factor to modify it.</li>
  <li>Killing the Voice is now done inside Process when the Release state ends.</li>
</ol>

<p>This is actually one of the subjects I want to treat in more detail in a later article. What we’re doing is basically modifying the volume or amplitude of our signal over time. This is something usually referred to as an <a href="http://en.wikipedia.org/wiki/Synthesizer#ADSR_envelope">envelope or ADSR envelope</a>. The names I chose (Attack, Sustain and Release) are related to that subject too! But for now just think of them as being simple fade operations.</p>

<p>Doing these changes has a few interesting implications in our synth. The graphics below describe in general terms how the volume of our sounds vary with time, and help correlate them with the NoteOn and NoteOff commands that we issue. Initially, before adding fading to our Voice class, what we had was something like this:</p>

<p><a href="/xna/assets/2011-04-21-creating-a-basic-synth-in-xna-part-iii/envelope1.png"><img src="/xna/assets/2011-04-21-creating-a-basic-synth-in-xna-part-iii/envelope1.png" alt="Without Attack/Release" /></a>
<em>Without Attack/Release</em></p>

<p>Each voice was alive only during the time between our NoteOn and NoteOff, and the changes in volume were abrupt. Now with these changes, we have something like this instead:</p>

<p><a href="/xna/assets/2011-04-21-creating-a-basic-synth-in-xna-part-iii/envelope2.png"><img src="/xna/assets/2011-04-21-creating-a-basic-synth-in-xna-part-iii/envelope2.png" alt="With Attack/Release" /></a>
<em>With Attack/Release</em></p>

<p>See how the note remains alive for a bit even after the NoteOff command? And finally, there’s a special case I’d like to talk about. What happens if your NoteOff command happens <em>before</em> the attack phase ends? In that case we should skip the sustain phase completely, and start reversing the volume back to 0 from the point it was currently at:</p>

<p><a href="/xna/assets/2011-04-21-creating-a-basic-synth-in-xna-part-iii/envelope3.png"><img src="/xna/assets/2011-04-21-creating-a-basic-synth-in-xna-part-iii/envelope3.png" alt="Special Case" /></a>
<em>Special Case</em></p>

<h2 id="conclusions">Conclusions</h2>

<p>And that’s all for today! I hope you enjoyed the series, and feel free to leave any questions or suggestions in the comments section below. As usual, I’ll end the article with a video sample and the source code for you to compile and play around with. Until next time!</p>

<iframe width="420" height="315" src="//www.youtube.com/embed/qza5GrHMD-w?rel=0" frameborder="0" allowfullscreen=""></iframe>

<p class="button"><a href="https://github.com/davidluzgouveia/blog-simple-synth">Source Code</a></p>

<blockquote class="info">
  <p>Note: You can disregard the Piano class. It’s just a hack I threw together to render a simple piano keyboard procedurally.</p>
</blockquote>]]></content><author><name></name></author><summary type="html"><![CDATA[Hello! This is the third and final part of my Creating a Basic Synth in XNA 4.0 series. Don’t worry though, since I intend to write some more about this subject in the future, but since the topics I expect to cover will start getting more advanced, I’ll make them into a separate series.]]></summary></entry><entry><title type="html">2D Camera with Parallax Scrolling in XNA</title><link href="https://davidluzgouveia.github.io/xna/2d-camera-with-parallax-scrolling-in-xna" rel="alternate" type="text/html" title="2D Camera with Parallax Scrolling in XNA" /><published>2011-04-10T00:00:00+00:00</published><updated>2011-04-10T00:00:00+00:00</updated><id>https://davidluzgouveia.github.io/xna/2d-camera-with-parallax-scrolling-in-xna</id><content type="html" xml:base="https://davidluzgouveia.github.io/xna/2d-camera-with-parallax-scrolling-in-xna"><![CDATA[<p>Parallax scrolling is a technique that is frequently used in sidescrolling 2D games to give the impression of depth. It consists of making objects that are further away appear to move slower in relation to the viewer than objects that are near. Pay attention to your surroundings next time you’re on a moving vehicle, and you’ll notice that this also appears to happen in real life!</p>

<p>They say a picture is worth a thousand words, but with parallax scrolling you really have to see it in motion in order to appreciate it. So I’ll start by showing the video sample for this article right away:</p>

<iframe width="420" height="315" src="//www.youtube.com/embed/1u5cGZPdyEk?rel=0" frameborder="0" allowfullscreen=""></iframe>

<p>There you have it. So, there are actually many different ways to achieve this effect, but I’d like to focus on the two that I find easier to use:</p>

<ol>
  <li><strong>Scrolling Textures</strong> - Useful for scenes like a starfield or a 2D sky. Somewhat limited beyond that.</li>
  <li><strong>Camera Modification</strong> - General purpose and much more flexible.</li>
</ol>

<h2 id="method-1---scrolling-textures">Method 1 - Scrolling Textures</h2>

<p>If you want to implement parallax scrolling entirely with repeating textures, then the easiest way is to use the technique described in my earlier article called <a href="/xna/scrolling-textures-in-xna">Scrolling Textures in XNA</a>. This is useful for instance to create starfields or 2D skies, but not as useful for games where the background needs to change constantly.</p>

<p>So let’s say you have three textures (texture1, texture2 and texture3) that you want to draw on top of each other and scroll them at different speeds. All you have to do is use the <a href="/xna/scrolling-textures-in-xna">technique I described</a> passing your camera position as your texture’s scroll position, and multiplying each of them by a different constant (e.g. 1.0f would mean full speed, 0.5f half speed, 2.0f double speed, etc.). Example below:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">spriteBatch</span><span class="p">.</span><span class="nf">Begin</span><span class="p">(</span><span class="n">SpriteSortMode</span><span class="p">.</span><span class="n">Deferred</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="n">SamplerState</span><span class="p">.</span><span class="n">LinearWrap</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="k">null</span><span class="p">);</span>
<span class="n">spriteBatch</span><span class="p">.</span><span class="nf">Draw</span><span class="p">(</span><span class="n">texture1</span><span class="p">,</span> <span class="n">position</span><span class="p">,</span> <span class="k">new</span> <span class="nf">Rectangle</span><span class="p">(</span><span class="n">cameraX</span> <span class="p">*</span> <span class="m">0.5f</span><span class="p">,</span> <span class="n">cameraY</span> <span class="p">*</span> <span class="m">0.5f</span><span class="p">,</span> <span class="n">texture1</span><span class="p">.</span><span class="n">Width</span><span class="p">,</span> <span class="n">texture1</span><span class="p">.</span><span class="n">Height</span><span class="p">),</span> <span class="n">Color</span><span class="p">.</span><span class="n">White</span><span class="p">);</span>
<span class="n">spriteBatch</span><span class="p">.</span><span class="nf">Draw</span><span class="p">(</span><span class="n">texture2</span><span class="p">,</span> <span class="n">position</span><span class="p">,</span> <span class="k">new</span> <span class="nf">Rectangle</span><span class="p">(</span><span class="n">cameraX</span> <span class="p">*</span> <span class="m">0.8f</span><span class="p">,</span> <span class="n">cameraY</span> <span class="p">*</span> <span class="m">0.8f</span><span class="p">,</span> <span class="n">texture2</span><span class="p">.</span><span class="n">Width</span><span class="p">,</span> <span class="n">texture2</span><span class="p">.</span><span class="n">Height</span><span class="p">),</span> <span class="n">Color</span><span class="p">.</span><span class="n">White</span><span class="p">);</span>
<span class="n">spriteBatch</span><span class="p">.</span><span class="nf">Draw</span><span class="p">(</span><span class="n">texture3</span><span class="p">,</span> <span class="n">position</span><span class="p">,</span> <span class="k">new</span> <span class="nf">Rectangle</span><span class="p">(</span><span class="n">cameraX</span> <span class="p">*</span> <span class="m">1.0f</span><span class="p">,</span> <span class="n">cameraY</span> <span class="p">*</span> <span class="m">1.0f</span><span class="p">,</span> <span class="n">texture3</span><span class="p">.</span><span class="n">Width</span><span class="p">,</span> <span class="n">texture3</span><span class="p">.</span><span class="n">Height</span><span class="p">),</span> <span class="n">Color</span><span class="p">.</span><span class="n">White</span><span class="p">);</span>
<span class="n">spriteBatch</span><span class="p">.</span><span class="nf">End</span><span class="p">();</span>
</code></pre></div></div>

<p>That’s all there is to it! And in case you didn’t notice, the video sample of my <a href="/xna/scrolling-textures-in-xna">Scrolling Textures in XNA</a> article already had parallax scrolling in it - there are in fact three layers of clouds moving at different speeds - although the effect is very subtle!</p>

<iframe width="420" height="315" src="//www.youtube.com/embed/Ly7SJeiirhU?rel=0" frameborder="0" allowfullscreen=""></iframe>

<blockquote class="info">
  <p>Update: I wrote a new article about this topic which lets you use zoom and rotation at the same time as scrolling the background infinitely. Check it out <a href="/xna/scrolling-textures-with-zoom-and-rotation">here</a>.**</p>
</blockquote>

<h2 id="method-2---camera-modification">Method 2 - Camera Modification</h2>

<p>Although using scrolling textures is quite easy, it is not applicable to all cases. Most of the time, your game world simply won’t be made up of repeating textures, but you’ll still want to leverage parallax scrolling. Other times you’ll also need the ability to move your camera around, rotate it and zoom it.</p>

<p>A couple years ago, David Amador wrote a <a href="http://www.david-amador.com/2009/10/xna-camera-2d-with-zoom-and-rotation/">popular article</a> on how to create a 2D camera with zoom and rotation using a simple transformation matrix. I’m not going to describe the entire technique again here, so if you don’t already have a matrix based 2D camera implemented, you might want to start there in order to understand the basics.</p>

<p>It turns out that adding parallax scrolling support to a matrix based camera class is extremely simple (the video at the top of the article uses this technique). Here’s the entire camera implementation:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">Camera</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="nf">Camera</span><span class="p">(</span><span class="n">Viewport</span> <span class="n">viewport</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">Origin</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="n">viewport</span><span class="p">.</span><span class="n">Width</span> <span class="p">/</span> <span class="m">2.0f</span><span class="p">,</span> <span class="n">viewport</span><span class="p">.</span><span class="n">Height</span> <span class="p">/</span> <span class="m">2.0f</span><span class="p">);</span>
        <span class="n">Zoom</span> <span class="p">=</span> <span class="m">1.0f</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="n">Vector2</span> <span class="n">Position</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="n">Vector2</span> <span class="n">Origin</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">float</span> <span class="n">Zoom</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">float</span> <span class="n">Rotation</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>

    <span class="k">public</span> <span class="n">Matrix</span> <span class="nf">GetViewMatrix</span><span class="p">(</span><span class="n">Vector2</span> <span class="n">parallax</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="c1">// To add parallax, simply multiply it by the position</span>
        <span class="k">return</span> <span class="n">Matrix</span><span class="p">.</span><span class="nf">CreateTranslation</span><span class="p">(</span><span class="k">new</span> <span class="nf">Vector3</span><span class="p">(-</span><span class="n">Position</span> <span class="p">*</span> <span class="n">parallax</span><span class="p">,</span> <span class="m">0.0f</span><span class="p">))</span> <span class="p">*</span>
            <span class="c1">// The next line has a catch. See note below.</span>
            <span class="n">Matrix</span><span class="p">.</span><span class="nf">CreateTranslation</span><span class="p">(</span><span class="k">new</span> <span class="nf">Vector3</span><span class="p">(-</span><span class="n">Origin</span><span class="p">,</span> <span class="m">0.0f</span><span class="p">))</span> <span class="p">*</span>
            <span class="n">Matrix</span><span class="p">.</span><span class="nf">CreateRotationZ</span><span class="p">(</span><span class="n">Rotation</span><span class="p">)</span> <span class="p">*</span>
            <span class="n">Matrix</span><span class="p">.</span><span class="nf">CreateScale</span><span class="p">(</span><span class="n">Zoom</span><span class="p">,</span> <span class="n">Zoom</span><span class="p">,</span> <span class="m">1</span><span class="p">)</span> <span class="p">*</span>
            <span class="n">Matrix</span><span class="p">.</span><span class="nf">CreateTranslation</span><span class="p">(</span><span class="k">new</span> <span class="nf">Vector3</span><span class="p">(</span><span class="n">Origin</span><span class="p">,</span> <span class="m">0.0f</span><span class="p">));</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>I simplified it as much as possible, but the only change made in order to support parallax was to make the <em>GetViewMatrix</em> method require you to specify the desired parallax factor (if you do not wish to have any parallax, simply pass it <em>Vector.One</em>), which is then multiplied by the camera’s position when calculating the view matrix.</p>

<blockquote class="info">
  <p>The Origin Trick: I made another change in comparison with David Amador’s method (which is more a matter of personal preference) that was include an additional (negative) Origin translation matrix before the Rotation and Zoom matrices (I marked the code with a comment). I prefer doing this because it makes your origin calculations only affect zooming and rotating, but leave translation untouched. That’s because I prefer to set my camera’s position using the top-left corner, but still want to have it rotate and zoom around the center of the screen. This way you can have both at the same time! Also I recommend doing this since it makes some optional calculations (such as limiting the camera’s position or looking at an object) easier to handle, because you won’t have to factor in your origin.</p>
</blockquote>

<p>What this means is that, for instance, if you pass it a Vector2(0.5f, 0.5f), objects will appear to move at half of their original speed, and if you pass it a Vector2(2.0f, 2.0f) they’ll appear to move twice as fast. As I mentioned above, passing it Vector.One means that there will be no parallax scrolling applied to that object, and passing it a Vector2.Zero will make the object stay in the same place even as you move the camera around. You can even pass different amounts of parallax for the X and Y axis if you wish!</p>

<h2 id="usage-scenario">Usage Scenario</h2>

<p>Now, in order to use this class, simply instantiate it passing it your current viewport:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Camera</span> <span class="n">camera</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Camera</span><span class="p">(</span><span class="n">GraphicsDevice</span><span class="p">.</span><span class="n">Viewport</span><span class="p">);</span>
</code></pre></div></div>

<p>And use the <em>GetViewMatrix</em> method to get a transformation matrix for your SpriteBatch:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Vector2</span> <span class="n">parallax</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="m">0.5f</span><span class="p">);</span>
<span class="n">spriteBatch</span><span class="p">.</span><span class="nf">Begin</span><span class="p">(</span><span class="n">SpriteSortMode</span><span class="p">.</span><span class="n">Deferred</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="n">camera</span><span class="p">.</span><span class="nf">GetViewMatrix</span><span class="p">(</span><span class="n">parallax</span><span class="p">));</span>
<span class="n">spriteBatch</span><span class="p">.</span><span class="nf">Draw</span><span class="p">(</span><span class="n">texture</span><span class="p">,</span> <span class="n">position</span><span class="p">,</span> <span class="n">Color</span><span class="p">.</span><span class="n">White</span><span class="p">);</span> <span class="c1">// This sprite will appear to move at 50% of the normal speed</span>
<span class="n">spriteBatch</span><span class="p">.</span><span class="nf">End</span><span class="p">();</span>
</code></pre></div></div>

<p>By the way, I’m not worrying about performance optimizations in this article for the sake of simplicity. In practice, you might not want to recalculate the view matrix every frame, and instead cache it and only update it when the camera changes. I’ll leave that exercise up to the reader, but if you need a tip just leave a comment below.</p>

<p>If all you wanted to know was how to implement parallax scrolling, then by now you should already have everything that you need. Below I’ll be describing some more advanced topics, which I believe should be worthwile to know, so I recommend reading to the end!</p>

<h2 id="optional-layer-grouping">Optional: Layer Grouping</h2>

<p>I find that the easiest way to handle different parallax values it to introduce the concept of layers. A layer is simply a group of game objects that share the same parallax value. Ideally you should be able to create as many layers as you want, set each of their parallax speeds, add your game objects to them, and just tell them to draw themselves. Here’s how I usually do it:</p>

<p>I’ll start by creatig a <em>Layer</em> class which has its own parallax speed, and holds a bunch of <em>Sprite</em> objects. Calling <em>Draw</em> will make all sprites be displayed with the correct parallax.</p>

<p>Here’s a minimal <em>Sprite</em> class implementation (for simplicity I stripped out rotation and scaling information, since it doesn’t serve any purpose in this example):</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">struct</span> <span class="nc">Sprite</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="n">Texture2D</span> <span class="n">Texture</span><span class="p">;</span>
    <span class="k">public</span> <span class="n">Vector2</span> <span class="n">Position</span><span class="p">;</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">Draw</span><span class="p">(</span><span class="n">SpriteBatch</span> <span class="n">spriteBatch</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">if</span><span class="p">(</span><span class="n">Texture</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
            <span class="n">spriteBatch</span><span class="p">.</span><span class="nf">Draw</span><span class="p">(</span><span class="n">Texture</span><span class="p">,</span> <span class="n">Position</span><span class="p">,</span> <span class="n">Color</span><span class="p">.</span><span class="n">White</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And here’s the <em>Layer</em> class. You need to already have a <em>Camera</em> object created when you create a new <em>Layer</em>, but after that it’s pretty straighforward. The only significant part is the call to <em>SpriteBatch.Begin</em> which relies on the camera to build a view matrix for the appropriate parallax value.</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">Layer</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="nf">Layer</span><span class="p">(</span><span class="n">Camera</span> <span class="n">camera</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">_camera</span> <span class="p">=</span> <span class="n">camera</span><span class="p">;</span>
        <span class="n">Parallax</span> <span class="p">=</span> <span class="n">Vector2</span><span class="p">.</span><span class="n">One</span><span class="p">;</span>
        <span class="n">Sprites</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Sprite</span><span class="p">&gt;();</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="n">Vector2</span> <span class="n">Parallax</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Sprite</span><span class="p">&gt;</span> <span class="n">Sprites</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">private</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">Draw</span><span class="p">(</span><span class="n">SpriteBatch</span> <span class="n">spriteBatch</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">spriteBatch</span><span class="p">.</span><span class="nf">Begin</span><span class="p">(</span><span class="n">SpriteSortMode</span><span class="p">.</span><span class="n">Deferred</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="n">_camera</span><span class="p">.</span><span class="nf">GetViewMatrix</span><span class="p">(</span><span class="n">Parallax</span><span class="p">));</span>
        <span class="k">foreach</span><span class="p">(</span><span class="n">Sprite</span> <span class="n">sprite</span> <span class="k">in</span> <span class="n">Sprites</span><span class="p">)</span>
            <span class="n">sprite</span><span class="p">.</span><span class="nf">Draw</span><span class="p">(</span><span class="n">spriteBatch</span><span class="p">);</span>
        <span class="n">spriteBatch</span><span class="p">.</span><span class="nf">End</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="k">private</span> <span class="k">readonly</span> <span class="n">Camera</span> <span class="n">_camera</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="usage-scenario-1">Usage Scenario</h2>

<p>Putting it all together, you could for example setup a scene with 9 different parallax layers. Each of these layers will get a different parallax value, hold one sprite:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">_layers</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Layer</span><span class="p">&gt;();</span>

<span class="c1">// Create a camera instance and limit its moving range</span>
<span class="n">_camera</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Camera</span><span class="p">(</span><span class="n">GraphicsDevice</span><span class="p">.</span><span class="n">Viewport</span><span class="p">)</span> <span class="p">{</span> <span class="n">Limits</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Rectangle</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">3200</span><span class="p">,</span> <span class="m">600</span><span class="p">)</span> <span class="p">};</span>

<span class="c1">// Create 9 layers with parallax ranging from 0% to 100% (only horizontal)</span>
<span class="n">_layers</span> <span class="p">=</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="n">Layer</span><span class="p">&gt;</span>
<span class="p">{</span>
    <span class="k">new</span> <span class="nf">Layer</span><span class="p">(</span><span class="n">_camera</span><span class="p">)</span> <span class="p">{</span> <span class="n">Parallax</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="m">0.0f</span><span class="p">,</span> <span class="m">1.0f</span><span class="p">)</span> <span class="p">},</span>
    <span class="k">new</span> <span class="nf">Layer</span><span class="p">(</span><span class="n">_camera</span><span class="p">)</span> <span class="p">{</span> <span class="n">Parallax</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="m">0.1f</span><span class="p">,</span> <span class="m">1.0f</span><span class="p">)</span> <span class="p">},</span>
    <span class="k">new</span> <span class="nf">Layer</span><span class="p">(</span><span class="n">_camera</span><span class="p">)</span> <span class="p">{</span> <span class="n">Parallax</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="m">0.2f</span><span class="p">,</span> <span class="m">1.0f</span><span class="p">)</span> <span class="p">},</span>
    <span class="k">new</span> <span class="nf">Layer</span><span class="p">(</span><span class="n">_camera</span><span class="p">)</span> <span class="p">{</span> <span class="n">Parallax</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="m">0.3f</span><span class="p">,</span> <span class="m">1.0f</span><span class="p">)</span> <span class="p">},</span>
    <span class="k">new</span> <span class="nf">Layer</span><span class="p">(</span><span class="n">_camera</span><span class="p">)</span> <span class="p">{</span> <span class="n">Parallax</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="m">0.4f</span><span class="p">,</span> <span class="m">1.0f</span><span class="p">)</span> <span class="p">},</span>
    <span class="k">new</span> <span class="nf">Layer</span><span class="p">(</span><span class="n">_camera</span><span class="p">)</span> <span class="p">{</span> <span class="n">Parallax</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="m">0.5f</span><span class="p">,</span> <span class="m">1.0f</span><span class="p">)</span> <span class="p">},</span>
    <span class="k">new</span> <span class="nf">Layer</span><span class="p">(</span><span class="n">_camera</span><span class="p">)</span> <span class="p">{</span> <span class="n">Parallax</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="m">0.6f</span><span class="p">,</span> <span class="m">1.0f</span><span class="p">)</span> <span class="p">},</span>
    <span class="k">new</span> <span class="nf">Layer</span><span class="p">(</span><span class="n">_camera</span><span class="p">)</span> <span class="p">{</span> <span class="n">Parallax</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="m">0.8f</span><span class="p">,</span> <span class="m">1.0f</span><span class="p">)</span> <span class="p">},</span>
    <span class="k">new</span> <span class="nf">Layer</span><span class="p">(</span><span class="n">_camera</span><span class="p">)</span> <span class="p">{</span> <span class="n">Parallax</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="m">1.0f</span><span class="p">,</span> <span class="m">1.0f</span><span class="p">)</span> <span class="p">}</span>
<span class="p">};</span>

<span class="c1">// Add one sprite to each layer</span>
<span class="n">_layers</span><span class="p">[</span><span class="m">0</span><span class="p">].</span><span class="n">Sprites</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">Sprite</span> <span class="p">{</span> <span class="n">Texture</span> <span class="p">=</span> <span class="n">Content</span><span class="p">.</span><span class="n">Load</span><span class="p">&lt;</span><span class="n">Texture2D</span><span class="p">&gt;(</span><span class="s">"Layer1"</span><span class="p">)</span> <span class="p">});</span>
<span class="n">_layers</span><span class="p">[</span><span class="m">1</span><span class="p">].</span><span class="n">Sprites</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">Sprite</span> <span class="p">{</span> <span class="n">Texture</span> <span class="p">=</span> <span class="n">Content</span><span class="p">.</span><span class="n">Load</span><span class="p">&lt;</span><span class="n">Texture2D</span><span class="p">&gt;(</span><span class="s">"Layer2"</span><span class="p">)</span> <span class="p">});</span>
<span class="n">_layers</span><span class="p">[</span><span class="m">2</span><span class="p">].</span><span class="n">Sprites</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">Sprite</span> <span class="p">{</span> <span class="n">Texture</span> <span class="p">=</span> <span class="n">Content</span><span class="p">.</span><span class="n">Load</span><span class="p">&lt;</span><span class="n">Texture2D</span><span class="p">&gt;(</span><span class="s">"Layer3"</span><span class="p">)</span> <span class="p">});</span>
<span class="n">_layers</span><span class="p">[</span><span class="m">3</span><span class="p">].</span><span class="n">Sprites</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">Sprite</span> <span class="p">{</span> <span class="n">Texture</span> <span class="p">=</span> <span class="n">Content</span><span class="p">.</span><span class="n">Load</span><span class="p">&lt;</span><span class="n">Texture2D</span><span class="p">&gt;(</span><span class="s">"Layer4"</span><span class="p">)</span> <span class="p">});</span>
<span class="n">_layers</span><span class="p">[</span><span class="m">4</span><span class="p">].</span><span class="n">Sprites</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">Sprite</span> <span class="p">{</span> <span class="n">Texture</span> <span class="p">=</span> <span class="n">Content</span><span class="p">.</span><span class="n">Load</span><span class="p">&lt;</span><span class="n">Texture2D</span><span class="p">&gt;(</span><span class="s">"Layer5"</span><span class="p">)</span> <span class="p">});</span>
<span class="n">_layers</span><span class="p">[</span><span class="m">5</span><span class="p">].</span><span class="n">Sprites</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">Sprite</span> <span class="p">{</span> <span class="n">Texture</span> <span class="p">=</span> <span class="n">Content</span><span class="p">.</span><span class="n">Load</span><span class="p">&lt;</span><span class="n">Texture2D</span><span class="p">&gt;(</span><span class="s">"Layer6"</span><span class="p">)</span> <span class="p">});</span>
<span class="n">_layers</span><span class="p">[</span><span class="m">6</span><span class="p">].</span><span class="n">Sprites</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">Sprite</span> <span class="p">{</span> <span class="n">Texture</span> <span class="p">=</span> <span class="n">Content</span><span class="p">.</span><span class="n">Load</span><span class="p">&lt;</span><span class="n">Texture2D</span><span class="p">&gt;(</span><span class="s">"Layer7"</span><span class="p">)</span> <span class="p">});</span>
<span class="n">_layers</span><span class="p">[</span><span class="m">7</span><span class="p">].</span><span class="n">Sprites</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">Sprite</span> <span class="p">{</span> <span class="n">Texture</span> <span class="p">=</span> <span class="n">Content</span><span class="p">.</span><span class="n">Load</span><span class="p">&lt;</span><span class="n">Texture2D</span><span class="p">&gt;(</span><span class="s">"Layer8"</span><span class="p">)</span> <span class="p">});</span>
<span class="n">_layers</span><span class="p">[</span><span class="m">8</span><span class="p">].</span><span class="n">Sprites</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="k">new</span> <span class="n">Sprite</span> <span class="p">{</span> <span class="n">Texture</span> <span class="p">=</span> <span class="n">Content</span><span class="p">.</span><span class="n">Load</span><span class="p">&lt;</span><span class="n">Texture2D</span><span class="p">&gt;(</span><span class="s">"Layer9"</span><span class="p">)</span> <span class="p">});</span>
</code></pre></div></div>

<p>And draw everything with a simple loop:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">foreach</span> <span class="p">(</span><span class="n">Layer</span> <span class="n">layer</span> <span class="k">in</span> <span class="n">_layers</span><span class="p">)</span>
    <span class="n">layer</span><span class="p">.</span><span class="nf">Draw</span><span class="p">(</span><span class="n">_spriteBatch</span><span class="p">);</span>
</code></pre></div></div>

<p>And if you want to move the camera around, just use the properties exposed by the <em>Camera</em> class. All parallax magic will be done for you behind the scenes!</p>

<h2 id="frequently-asked-questions">Frequently Asked Questions</h2>

<p>Since I probably won’t be talking about the topic of 2D cameras again, I’ll take the chance to answer a few questions that I often see on the forums:</p>

<p><strong><em>Q: When moving the camera around while it’s rotated, how do I make it follow the camera’s rotation?</em></strong></p>

<p>A: You’ll need to do a little math for this. Add this method to your camera class:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">void</span> <span class="nf">Move</span><span class="p">(</span><span class="n">Vector2</span> <span class="n">displacement</span><span class="p">,</span> <span class="kt">bool</span> <span class="n">respectRotation</span> <span class="p">=</span> <span class="k">false</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">respectRotation</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">displacement</span> <span class="p">=</span> <span class="n">Vector2</span><span class="p">.</span><span class="nf">Transform</span><span class="p">(</span><span class="n">displacement</span><span class="p">,</span> <span class="n">Matrix</span><span class="p">.</span><span class="nf">CreateRotationZ</span><span class="p">(-</span><span class="n">Rotation</span><span class="p">));</span>
    <span class="p">}</span>

    <span class="n">Position</span> <span class="p">+=</span> <span class="n">displacement</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Now whenever you want to move in accordance with the camera’s rotation, just set the “respectRotation” parameter to true!</p>

<p><strong><em>Q: How do I make my camera look at some object, or follow my character?</em></strong></p>

<p>A: Centering your camera around an object is simply a matter of settings its position to the same as the object, and subtracting half of the screen’s size from it (so you need to store your screen size inside your camera class. For this example I’ll assume that you stored a <em>Viewport</em> object in a member variable called _viewport). Here’s an helper method that will center the camera around some position:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">void</span> <span class="nf">LookAt</span><span class="p">(</span><span class="n">Vector2</span> <span class="n">position</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">Position</span> <span class="p">=</span> <span class="n">position</span> <span class="p">-</span> <span class="k">new</span> <span class="nf">Vector2</span><span class="p">(</span><span class="n">_viewport</span><span class="p">.</span><span class="n">Width</span> <span class="p">/</span> <span class="m">2.0f</span><span class="p">,</span> <span class="n">_viewport</span><span class="p">.</span><span class="n">Height</span> <span class="p">/</span> <span class="m">2.0f</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Now if you want to make your camera always follow your character, all you need to do is add something like this to the end of your update loop:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Updates your character's position</span>
<span class="n">character</span><span class="p">.</span><span class="nf">Update</span><span class="p">(</span><span class="n">gameTime</span><span class="p">);</span>

<span class="c1">// Updates your camera to lock on the character</span>
<span class="n">camera</span><span class="p">.</span><span class="nf">LookAt</span><span class="p">(</span><span class="n">character</span><span class="p">.</span><span class="n">Position</span><span class="p">);</span>
</code></pre></div></div>

<blockquote class="note">
  <p>Note: If you didn’t use my origin trick (explained earlier), then you’ll also need to add the camera’s Origin at the end in order to correct the offset.</p>
</blockquote>

<p><strong><em>Q: How do I make the camera stop moving beyond the edges of my level?</em></strong></p>

<p>A: Okay, this is a bit more complicated, so I’ll go over it in a few separate steps.</p>

<p>First of all, just like the previous question, one thing your limiting code will need to know is how big your viewport is. So start by storing the viewport when you get it in the constructor for later use.</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="nf">Camera</span><span class="p">(</span><span class="n">Viewport</span> <span class="n">viewport</span><span class="p">)</span>
<span class="p">{</span>
    <span class="n">_viewport</span> <span class="p">=</span> <span class="n">viewport</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">private</span> <span class="k">readonly</span> <span class="n">Viewport</span> <span class="n">_viewport</span><span class="p">;</span>
</code></pre></div></div>

<p>Next I’ll add a Rectangle property called Limits that lets you choose the extent of what your camera should be able to see. This extent should always be at least as big as the viewport. The question mark (?) after Rectangle makes it possible to assign it a null value. This isn’t normally possible because Rectangle is a value type. I made it this way so that setting Limits to null will disable camera bound limiting altogether. Here’s the code (notice how I validate the rectangle to ensure it’s always bigger than the viewport):</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="n">Rectangle</span><span class="p">?</span> <span class="n">Limits</span>
<span class="p">{</span>
    <span class="k">get</span> <span class="p">{</span> <span class="k">return</span> <span class="n">_limits</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">set</span>
    <span class="p">{</span>
        <span class="k">if</span><span class="p">(</span><span class="k">value</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="c1">// Assign limit but make sure it's always bigger than the viewport</span>
            <span class="n">_limits</span> <span class="p">=</span> <span class="k">new</span> <span class="n">Rectangle</span>
                <span class="p">{</span>
                    <span class="n">X</span> <span class="p">=</span> <span class="k">value</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">X</span><span class="p">,</span>
                    <span class="n">Y</span> <span class="p">=</span> <span class="k">value</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">Y</span><span class="p">,</span>
                    <span class="n">Width</span> <span class="p">=</span> <span class="n">System</span><span class="p">.</span><span class="n">Math</span><span class="p">.</span><span class="nf">Max</span><span class="p">(</span><span class="n">_viewport</span><span class="p">.</span><span class="n">Width</span><span class="p">,</span> <span class="k">value</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">Width</span><span class="p">),</span>
                    <span class="n">Height</span> <span class="p">=</span> <span class="n">System</span><span class="p">.</span><span class="n">Math</span><span class="p">.</span><span class="nf">Max</span><span class="p">(</span><span class="n">_viewport</span><span class="p">.</span><span class="n">Height</span><span class="p">,</span> <span class="k">value</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">Height</span><span class="p">)</span>
                <span class="p">};</span>

            <span class="c1">// Validate camera position with new limit</span>
            <span class="n">Position</span> <span class="p">=</span> <span class="n">Position</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span>
        <span class="p">{</span>
            <span class="n">_limits</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="k">private</span> <span class="n">Rectangle</span><span class="p">?</span> <span class="n">_limits</span><span class="p">;</span>
</code></pre></div></div>

<p>Finally, change your Position property so that its setter checks for the existance of a limit, and clamps the position accordingly. This technique as it stands doesn’t work so well when the camera is scaled or rotated, so I disabled the limiting behavior when the camera is transformed for the sake of correctness. But feel free to try to work around that limitation!</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="n">Vector2</span> <span class="n">Position</span>
<span class="p">{</span>
    <span class="k">get</span> <span class="p">{</span> <span class="k">return</span> <span class="n">_position</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">set</span>
    <span class="p">{</span>
        <span class="n">_position</span> <span class="p">=</span> <span class="k">value</span><span class="p">;</span>

        <span class="c1">// If there's a limit set and the camera is not transformed clamp position to limits</span>
        <span class="k">if</span><span class="p">(</span><span class="n">Limits</span> <span class="p">!=</span> <span class="k">null</span> <span class="p">&amp;&amp;</span> <span class="n">Zoom</span> <span class="p">==</span> <span class="m">1.0f</span> <span class="p">&amp;&amp;</span> <span class="n">Rotation</span> <span class="p">==</span> <span class="m">0.0f</span><span class="p">)</span>
        <span class="p">{</span>
            <span class="n">_position</span><span class="p">.</span><span class="n">X</span> <span class="p">=</span> <span class="n">MathHelper</span><span class="p">.</span><span class="nf">Clamp</span><span class="p">(</span><span class="n">_position</span><span class="p">.</span><span class="n">X</span><span class="p">,</span> <span class="n">Limits</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">X</span><span class="p">,</span> <span class="n">Limits</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">X</span> <span class="p">+</span> <span class="n">Limits</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">Width</span> <span class="p">-</span> <span class="n">_viewport</span><span class="p">.</span><span class="n">Width</span><span class="p">);</span>
            <span class="n">_position</span><span class="p">.</span><span class="n">Y</span> <span class="p">=</span> <span class="n">MathHelper</span><span class="p">.</span><span class="nf">Clamp</span><span class="p">(</span><span class="n">_position</span><span class="p">.</span><span class="n">Y</span><span class="p">,</span> <span class="n">Limits</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">Y</span><span class="p">,</span> <span class="n">Limits</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">Y</span> <span class="p">+</span> <span class="n">Limits</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">Height</span> <span class="p">-</span> <span class="n">_viewport</span><span class="p">.</span><span class="n">Height</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>That’s it! Now if your level starts at (0,0) and has a size of (8000, 600) you can make sure your camera won’t leave that region by simply doing:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">yourCamera</span><span class="p">.</span><span class="n">Limits</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Rectangle</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">8000</span><span class="p">,</span> <span class="m">600</span><span class="p">);</span>
</code></pre></div></div>

<p>Even better is that if you combine this with the <em>LookAt</em> method described above, you will automatically get the common behavior where the camera seems to stop when your character reaches the borders of the map, and resumes again when you move away from the borders! No additional code needed.</p>

<blockquote class="note">
  <p>Note: Once again, if you didn’t use the “origin trick” before you’ll also need to add the origin’s X and Y values to the Clamp calculation (inside the Clamp operations, on the min and max parameters).</p>
</blockquote>

<blockquote class="info">
  <p>Update: I wrote another article with more information about this matter. Check it out here: <a href="/xna/limiting-2d-camera-movement-with-zoom">Limiting 2D Camera Movement with Zoom</a>.</p>
</blockquote>

<p><strong><em>Q: How do I find what position in the screen (or world) a certain point in the world (or screen) corresponds to?</em></strong></p>

<p>This is common for instance when you want to pick objects on the screen with your mouse (screen to world), or to find out which objects are inside of your view (world to screen). If you have parallax scrolling, then this is something you’ll want to do at layer level (since each layer can have a different view matrix), but the general idea is still the same. If you don’t have parallax scrolling, just do this in your camera class instead with the appropriate changes!</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="n">Vector2</span> <span class="nf">WorldToScreen</span><span class="p">(</span><span class="n">Vector2</span> <span class="n">worldPosition</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="n">Vector2</span><span class="p">.</span><span class="nf">Transform</span><span class="p">(</span><span class="n">worldPosition</span><span class="p">,</span> <span class="n">camera</span><span class="p">.</span><span class="nf">GetViewMatrix</span><span class="p">(</span><span class="n">parallax</span><span class="p">));</span>
<span class="p">}</span>

<span class="k">public</span> <span class="n">Vector2</span> <span class="nf">ScreenToWorld</span><span class="p">(</span><span class="n">Vector2</span> <span class="n">screenPosition</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="n">Vector2</span><span class="p">.</span><span class="nf">Transform</span><span class="p">(</span><span class="n">screenPosition</span><span class="p">,</span> <span class="n">Matrix</span><span class="p">.</span><span class="nf">Invert</span><span class="p">(</span><span class="n">camera</span><span class="p">.</span><span class="nf">GetViewMatrix</span><span class="p">(</span><span class="n">parallax</span><span class="p">)));</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This will get you the correct results, even if your camera is all rotated and scaled.</p>

<h2 id="conclusions">Conclusions</h2>

<p>That’s all for this article. If you have any questions that I didn’t cover here, leave a comment below and I’ll do my best to answer them and update the FAQ accordingly. And as usual, you can find the source code for this article’s sample below. The camera class provided has all of the tips I described implemented, and I also included a SimpleCamera class (although I’m not using it) which is the bare minimum you need to get things working.</p>

<p class="button"><a href="https://github.com/davidluzgouveia/blog-parallax-scrolling">Source Code</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[Parallax scrolling is a technique that is frequently used in sidescrolling 2D games to give the impression of depth. It consists of making objects that are further away appear to move slower in relation to the viewer than objects that are near. Pay attention to your surroundings next time you’re on a moving vehicle, and you’ll notice that this also appears to happen in real life!]]></summary></entry><entry><title type="html">About Oscillators</title><link href="https://davidluzgouveia.github.io/xna/about-oscillators" rel="alternate" type="text/html" title="About Oscillators" /><published>2011-04-09T00:00:00+00:00</published><updated>2011-04-09T00:00:00+00:00</updated><id>https://davidluzgouveia.github.io/xna/about-oscillators</id><content type="html" xml:base="https://davidluzgouveia.github.io/xna/about-oscillators"><![CDATA[<p>In my <a href="/xna/creating-a-basic-synth-in-xna-part-ii">Creating a Basic Synth in XNA 4.0 - Part II</a> article I exemplified sound generation using a simple sine wave function. However, the sample video at the end of the article showed a bunch of different kinds of waves. Each of those types of waves are very common in sound synthesis, and were being generated by a simple class that I named <em>Oscillator</em>. I’ll be talking about the <em>Oscillator</em> class now.</p>

<p><a href="/xna/assets/2011-04-09-about-oscillators/OscillatorHud.jpg"><img src="/xna/assets/2011-04-09-about-oscillators/OscillatorHud-300x94.jpg" alt="OscillatorHud" /></a></p>

<p>In general terms, an oscillator is a mechanical or electronic device that generates a signal. The nature of the generated signal depends on how the oscillator is built. In most oscillators used by real synthesizers, the frequency of the signal is controlled by varying the voltage of its input. On the other hand, the amplitude of the generated signal is usually fixed, and has to be modified later using amplifiers or envelopes (something that I’ll talk about some other time).</p>

<p>In our case, since we’re emulating an oscillator in software, we can pretty much do whatever we want. We can specify whatever parameters we need to control the sound, and we’re under no obligiation to mimic how a real oscillator works. So the first think I did was go ahead and add two properties to directly control the amplitude and frequency of the signal.</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="kt">double</span> <span class="n">Amplitude</span> <span class="p">=</span> <span class="m">1.0</span><span class="p">;</span>
<span class="k">public</span> <span class="kt">double</span> <span class="n">Frequency</span> <span class="p">=</span> <span class="m">440.0</span><span class="p">;</span>
</code></pre></div></div>

<p>There. Another thing we need is a way to get the generated signal. In conformance with the interface described in my <a href="/xna/creating-a-basic-synth-in-xna-part-ii">earlier article</a>, I created a method to give me the amplitude of the signal for any given time:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="kt">double</span> <span class="nf">GetSignal</span><span class="p">(</span><span class="kt">double</span> <span class="n">time</span><span class="p">);</span>
</code></pre></div></div>

<p>Finally, I wanted my oscillator to support a few different types of waves. I created an enumeration of all types of waves I needed, and a property to hold what type of wave to use.</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">enum</span> <span class="n">WaveformTypes</span>
<span class="p">{</span>
    <span class="n">Sine</span><span class="p">,</span>
    <span class="n">Triangle</span><span class="p">,</span>
    <span class="n">Square</span><span class="p">,</span>
    <span class="n">Sawtooth</span><span class="p">,</span>
    <span class="n">Pulse</span><span class="p">,</span>
    <span class="n">Noise</span>
<span class="p">}</span>

<span class="k">public</span> <span class="n">WaveformTypes</span> <span class="n">Waveform</span> <span class="p">=</span> <span class="n">WaveformTypes</span><span class="p">.</span><span class="n">Sine</span><span class="p">;</span>
</code></pre></div></div>

<p>So, what’s with all these types of waves? Actually, these types of waves are special because they form the basis for the kind of synthesis we’ll be using - <em>subtractive synthesis</em>.</p>

<h2 id="subtractive-synthesis">Subtractive Synthesis</h2>

<p>There are more than one way to generate sounds. The one we’ll be using is called subtractive synthesis. It’s called this way because we start with a sound that contains all the required harmonic content for the final sound, and then remove any wanted frequencies from the sound with a filter, while shaping the sound’s volume with an envelope. This is usually viewed as a two step process, where each component is either a <em>source</em> (which generates the original sound) or a <em>modifier</em> (which changes the sound to our needs).</p>

<p>Right now we’re only interested in sources, because that’s what our oscillator is. Most sources used in subtractive synthesizers are based around mathematic concepts, such as waves - or as they’re commonly called, waveforms. There are a few types of waveforms present in almost any oscillator used for synthesizers:</p>

<p><strong>Sine</strong>
<a href="/xna/assets/2011-04-09-about-oscillators/Sine.png"><img src="/xna/assets/2011-04-09-about-oscillators/Sine-300x159.png" alt="Sine" /></a></p>

<p><strong>Triangle</strong>
<a href="/xna/assets/2011-04-09-about-oscillators/Triangle.png"><img src="/xna/assets/2011-04-09-about-oscillators/Triangle-300x159.png" alt="Triangle" /></a></p>

<p><strong>Square</strong>
<a href="/xna/assets/2011-04-09-about-oscillators/Square.png"><img src="/xna/assets/2011-04-09-about-oscillators/Square-300x159.png" alt="Square" /></a></p>

<p><strong>Sawtooth</strong>
<a href="/xna/assets/2011-04-09-about-oscillators/Sawtooth.png"><img src="/xna/assets/2011-04-09-about-oscillators/Sawtooth-300x159.png" alt="Sawtooth" /></a></p>

<p><strong>Pulse</strong>
<a href="/xna/assets/2011-04-09-about-oscillators/Pulse.png"><img src="/xna/assets/2011-04-09-about-oscillators/Pulse-300x159.png" alt="Pulse" /></a></p>

<p><strong>Noise</strong>
<a href="/xna/assets/2011-04-09-about-oscillators/Noise.png"><img src="/xna/assets/2011-04-09-about-oscillators/Noise-300x159.png" alt="Noise" /></a></p>

<blockquote class="note">
  <p>Notes: The last one is actually not a waveform, but rather a random signal which contains a constantly changing mix of all frequencies. It is also frequently known as white noise. Another thing to notice is that the only difference between a square waveform and a pulse waveform is that the square waveform “switches” side exactly in the middle of its period, while the pulse wave can change earlier or later than that (this is controlled by a parameter known as duty cycle or pulse width). In fact a square waveform is simply a pulse waveform with a duty cycle of 50%.</p>
</blockquote>

<p>Each of them sounds slightly different from the others, not only because of their shape, but because of the harmonics they contain. The theory behind it is a little complicated, so for now I would just experiment with each of them in order for the ear to become used to how they sound. You’ll realize for instance, that the triangle waveform sounds very soothing, while the sawtooth is much harsher.</p>

<h2 id="implementation">Implementation</h2>

<p>For the implementation of these waveforms, I simply looked up their mathematical formulas on wikipedia and translated them to code. Here’s the complete <em>GetSignal</em> method.</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="kt">double</span> <span class="nf">GetSignal</span><span class="p">(</span><span class="kt">double</span> <span class="n">time</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">switch</span> <span class="p">(</span><span class="n">Waveform</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">case</span> <span class="n">WaveType</span><span class="p">.</span><span class="n">Sine</span><span class="p">:</span>
        <span class="p">{</span>
            <span class="k">return</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Sin</span><span class="p">(</span><span class="n">Frequency</span> <span class="p">*</span> <span class="n">time</span> <span class="p">*</span> <span class="m">2</span> <span class="p">*</span> <span class="n">Math</span><span class="p">.</span><span class="n">PI</span><span class="p">)</span> <span class="p">*</span> <span class="n">Amplitude</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">case</span> <span class="n">WaveType</span><span class="p">.</span><span class="n">Triangle</span><span class="p">:</span>
        <span class="p">{</span>
            <span class="k">return</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Abs</span><span class="p">(</span><span class="m">2</span> <span class="p">*</span> <span class="p">(</span><span class="n">time</span> <span class="p">*</span> <span class="n">Frequency</span> <span class="p">-</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Floor</span><span class="p">(</span><span class="n">time</span> <span class="p">*</span> <span class="n">Frequency</span> <span class="p">+</span> <span class="m">0.5</span><span class="p">)))</span> <span class="p">*</span> <span class="n">Amplitude</span> <span class="p">*</span> <span class="m">2</span> <span class="p">-</span> <span class="n">Amplitude</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">case</span> <span class="n">WaveType</span><span class="p">.</span><span class="n">Square</span><span class="p">:</span>
        <span class="p">{</span>
            <span class="k">return</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Sin</span><span class="p">(</span><span class="n">Frequency</span> <span class="p">*</span> <span class="n">time</span> <span class="p">*</span> <span class="m">2</span> <span class="p">*</span> <span class="n">Math</span><span class="p">.</span><span class="n">PI</span><span class="p">)</span> <span class="p">&gt;=</span> <span class="m">0</span> <span class="p">?</span> <span class="n">Amplitude</span> <span class="p">:</span> <span class="p">-</span><span class="n">Amplitude</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">case</span> <span class="n">WaveType</span><span class="p">.</span><span class="n">Sawtooth</span><span class="p">:</span>
        <span class="p">{</span>
            <span class="k">return</span> <span class="m">2</span> <span class="p">*</span> <span class="p">(</span><span class="n">time</span> <span class="p">*</span> <span class="n">Frequency</span> <span class="p">-</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Floor</span><span class="p">(</span><span class="n">time</span> <span class="p">*</span> <span class="n">Frequency</span> <span class="p">+</span> <span class="m">0.5</span><span class="p">))</span> <span class="p">*</span> <span class="n">Amplitude</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">case</span> <span class="n">WaveType</span><span class="p">.</span><span class="n">Pulse</span><span class="p">:</span>
        <span class="p">{</span>
            <span class="kt">double</span> <span class="n">period</span> <span class="p">=</span> <span class="m">1.0</span> <span class="p">/</span> <span class="n">Frequency</span><span class="p">;</span>
            <span class="kt">double</span> <span class="n">timeModulusPeriod</span> <span class="p">=</span> <span class="n">time</span> <span class="p">-</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Floor</span><span class="p">(</span><span class="n">time</span> <span class="p">/</span> <span class="n">period</span><span class="p">)</span> <span class="p">*</span> <span class="n">period</span><span class="p">;</span>
            <span class="kt">double</span> <span class="n">phase</span> <span class="p">=</span> <span class="n">timeModulusPeriod</span> <span class="p">/</span> <span class="n">period</span><span class="p">;</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">phase</span> <span class="p">&lt;=</span> <span class="n">DutyCycle</span><span class="p">)</span>
                <span class="k">return</span> <span class="n">Amplitude</span><span class="p">;</span>
            <span class="k">else</span>
                <span class="k">return</span> <span class="p">-</span><span class="n">Amplitude</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">case</span> <span class="n">WaveType</span><span class="p">.</span><span class="n">Noise</span><span class="p">:</span>
        <span class="p">{</span>
            <span class="k">return</span> <span class="p">(</span><span class="n">Rng</span><span class="p">.</span><span class="nf">NextDouble</span><span class="p">()</span> <span class="p">-</span> <span class="n">Rng</span><span class="p">.</span><span class="nf">NextDouble</span><span class="p">())</span> <span class="p">*</span> <span class="n">Amplitude</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>And I also added a parameter for controlling the duty cycle of pulse waves, which should always stay between 0 and 1:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="kt">double</span> <span class="n">DutyCycle</span> <span class="p">=</span> <span class="m">0.5</span><span class="p">;</span>
</code></pre></div></div>

<p>And a random number generation for generating the noise signal:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="k">static</span> <span class="k">readonly</span> <span class="n">Random</span> <span class="n">Rng</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Random</span><span class="p">();</span>
</code></pre></div></div>

<h2 id="usage">Usage</h2>

<p>If you’ve looked at the sample source code of the <a href="/xna/creating-a-basic-synth-in-xna-part-ii">previous article</a> you can see how the oscillator class was used. Basically I created two <em>Oscillator</em> instances, one for the left and one for the right channel. When reading input from the keyboard I simply changed the oscillator parameters, and when generating the sound samples, I delegated that to the corresponding GetSignal method of the Oscillator class. That’s it!</p>

<p class="button"><a href="/xna/creating-a-basic-synth-in-xna-part-iii">Continue To Part III</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[In my Creating a Basic Synth in XNA 4.0 - Part II article I exemplified sound generation using a simple sine wave function. However, the sample video at the end of the article showed a bunch of different kinds of waves. Each of those types of waves are very common in sound synthesis, and were being generated by a simple class that I named Oscillator. I’ll be talking about the Oscillator class now.]]></summary></entry><entry><title type="html">Creating a Basic Synth in XNA 4.0 - Part II</title><link href="https://davidluzgouveia.github.io/xna/creating-a-basic-synth-in-xna-part-ii" rel="alternate" type="text/html" title="Creating a Basic Synth in XNA 4.0 - Part II" /><published>2011-03-30T00:00:00+00:00</published><updated>2011-03-30T00:00:00+00:00</updated><id>https://davidluzgouveia.github.io/xna/creating-a-basic-synth-in-xna-part-ii</id><content type="html" xml:base="https://davidluzgouveia.github.io/xna/creating-a-basic-synth-in-xna-part-ii"><![CDATA[<p>Hello folks, and welcome to part II of my <em><a href="/xna/creating-a-basic-synth-in-xna-part-i">Creating a Basic Synth in XNA 4.0</a></em> series!</p>

<p>This time I’ll be covering the <em>DynamicSoundEffectInstance</em> class and how to put some of the concepts we discussed earlier into practice. Therefore (if you haven’t done so already) I recommend that you read <a href="/xna/creating-a-basic-synth-in-xna-part-i">part I</a> before proceeding. I’d also like to warn you that this article will be quite long. The good news is that this is the hardest part for a beginner to overcome, and future articles on this series will probably be smaller and in general easier to grasp.</p>

<p>By the way, there’s a video sample at the end of the article in case you’d like to see it in action before you start reading!</p>

<h2 id="summary">Summary</h2>

<p>I’ll start with a summary of everything that has been discussed already in part I:</p>

<ul>
  <li>Sound is the way our brain interprets the pressure oscillations that reach our eardrums.</li>
  <li>These pressure oscillations can be mathematically represented as waves.</li>
  <li>The wave’s basic relation to sound is that <em>amplitude</em> equals volume, <em>frequency</em> equals pitch and <em>shape</em> equals tone.</li>
  <li>A wave can be implemented (in code) as any regular function that returns an amplitude given a specific time input (e.g. double wave(double time)).</li>
  <li>Even though a wave is a continuous function you can approximate it by <em>sampling</em> only a “few” points along the way.</li>
</ul>

<h2 id="introduction">Introduction</h2>

<p>Using this knowledge to generate our own sounds in XNA 4.0 is possible because of a new class called <em>DynamicSoundEffectInstance</em> which exposes all of the necessary low-level access. In theory, the whole process is pretty straightforward: you create some function that represents the sound wave you’d like to playback, read (or sample) enough values from that function to get a decent representation, and feed all of them to XNA which routes them through the low-level audio engine that takes care of the rest. In practice however, it’s not that easy because of a few important details that you will have to know in order to use the class properly:</p>

<ol>
  <li>(<em>Configuration</em>) The <em>DynamicSoundEffectInstance</em> class is flexible enough to support different sample rates and multiple channel configurations. You’ll need to understand these concepts and set the parameters accordingly.</li>
  <li>(<em>Format</em>) The <em>DynamicSoundEffectInstance</em> class expects the data you submit to be presented in a very specific way. As we’ll see, this format is not exactly the easiest to work with when doing our wave calculations.</li>
  <li>(<em>Chunks</em>) Even if you have a large amount of sound data, you (most likely) won’t be submitting all of it at once, since that would be slow. Instead, in order to enable real-time behavior you’ll be dividing your data in small chunks and submitting them one at a time.</li>
</ol>

<p>And I’ll admit that some of these details can be pretty confusing if you’ve never seen anything like this before. It did take me some time before finally getting that “a-ha” moment. Therefore, let’s take it one step at a time. I’ll describe each step you need to implement in order to use the <em>DynamicSoundEffectInstance</em> class, and present my solutions to the problems encountered during the way. Let’s start!</p>
<h3 id="the-steps">The Steps</h3>
<p>In order to create and use the <em>DynamicSoundEffectInstance</em> class, you’ll need to follow these four steps:</p>

<ol>
  <li>Create and configure a <em>DynamicSoundEffectInstance</em> object.</li>
  <li>Create a buffer to hold your audio samples.</li>
  <li>Fill the buffer with meaningful values.</li>
  <li>Submit the buffer to the <em>DynamicSoundEffectInstance</em> object when needed.</li>
</ol>

<h2 id="step-1-create-dynamicsoundeffectinstance">Step 1: Create DynamicSoundEffectInstance</h2>

<p>If you’ve used XNA’s <em>SoundEffect API</em> before, then you might already be familiar with the <em>SoundEffect</em> and <em>SoundEffectInstance</em> classes. When using the content pipeline to load sound effects for your game, you receive a <em>SoundEffect</em> object that can be used to playback that sound. You can also use the SoundEffect.CreateInstance() method to create single instances of that SoundEffect for individual control. Either way, when loading a sound resource through the content pipeline, all of its data is automatically copied into the object’s audio buffer, and the sound engine only needs to start playing it when requested.</p>

<p>On the other hand, the <em>DynamicSoundEffectInstance</em> class (which inherits from <em>SoundEffectInstance</em>) is created with an <strong>empty</strong> audio buffer, and instead allows <em>you</em> to fill it with data. But since you’re the one providing it with all of the data, there are some extra decisions you need to take on how the data should be interpreted. Some of these parameters are already fixed for you by the framework while others are selected when creating the <em>DynamicSoundEffectInstance</em> object. Either way it’s important to know exactly what they mean, so I’ll describe them one by one.</p>

<p>Let’s start by taking a look at <em>DynamicSoundEffectInstance</em>’s constructor:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="nf">DynamicSoundEffectInstance</span> <span class="p">(</span><span class="kt">int</span> <span class="n">sampleRate</span><span class="p">,</span> <span class="n">AudioChannels</span> <span class="n">channels</span><span class="p">)</span>
</code></pre></div></div>

<p>As you can see, there are two parameters that you need to pass to the constructor: the sample rate and the audio channels count.</p>
<h3 id="sample-rate">Sample Rate</h3>
<p>As explained in part I of this article, the sample rate describes how many audio samples (remember, a sample is exactly one value taken from our wave function) will be processed every second (for each audio channel). Having a larger sample rate is desirable because it means that you can better represent fast variations in the sound and higher frequencies. The XNA Framework lets you select a sample rate ranging from 8.000 Hz to 48.000 Hz. Audio CD’s use a sample rate of 44.100 Hz so if you’re creating a music application you’ll probably want to use at least that for best results.</p>
<h3 id="audio-channels-count">Audio Channels Count</h3>
<p>You’ve probably heard the words Stereo and Mono before. The main difference between them is that with Mono (1 audio channel), even if you have a pair of speakers, they will both emit the same sound, whereas with Stereo (2 audio channels) you have the freedom to specify different sounds for each speaker (left and right). It’s natural then that with Stereo you’ll need to hold twice the amount of information. The XNA Framework currently supports two possible configurations: AudioChannels.Mono (1 audio channel) and AudioChannels.Stereo (2 audio channels).</p>

<p>Besides these two parameters, there are also a couple things that you do not have control over (because XNA enforces them for you), but should still understand:</p>
<h3 id="bit-depth">Bit Depth</h3>
<p><strong>__</strong>The bit depth describes how many bits of precision will be used to encode each sample. A larger bit depth implies that you’ll have more precision when dealing with small variations of amplitude in your wave, and get a digital representation that is closer to the original analog wave. When working with waves you’ll normally be generating floating-point samples (usually between -1.0 and 1.0). The problem is that XNA’s audio engine does not work with floating-samples directly. Instead, it works with a fixed bit depth of 16 bits/sample (signed). So basically, you’ll need to convert each of your floating-point samples (in the -1.0 to 1.0 range) to a short (signed 16-bit integer) sample (in the short.MinValue to short.MaxValue) range before feeding them to XNA.</p>
<h3 id="audio-format">Audio Format</h3>
<p>We’ve just seen that XNA forces a signed 16-bit integer bit depth. That’s only one part of the audio format, namely the one which specifies how each audio sample is represented. But we’ve also seen that by choosing a Stereo configuration you can have two audio channels playing simultaneously. The samples for each audio channel will have to be packed into the same buffer, so how are they organized in relation to each other? Well, when you have only one audio channel, each sample is simply stored in the buffer in same the order they appear. But if you have two audio channels, then it’s a different story. Instead, you’ll have to interleave one audio sample from the left channel with one audio sample from the right channel, and repeat until there are no more samples left (i.e. LRLRLRLRLR etc.). Naturally, you’ll also be needing a buffer with twice the size in order to fit all the samples there. I’ll touch this subject again when describing how to create the audio buffers.</p>

<p><img src="/xna/assets/2011-03-30-creating-a-basic-synth-in-xna-part-ii/Screen11-300x286.gif" alt="Sample Rate" />
<em>Sample Rate (Horizontal) and Bit Depth (Vertical)</em></p>

<p>Okay, now that you understand most of the necessary concepts, let’s start putting it to practice and create that <em>DynamicSoundEffectInstance</em> object. I’ll be working with a sample rate of 44.100 Hz and Stereo audio for the rest of this article, since it covers most of the edge cases. Here’s the code for this step:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// On your class</span>
<span class="k">private</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">SampleRate</span> <span class="p">=</span> <span class="m">44100</span><span class="p">;</span>
<span class="k">private</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">ChannelsCount</span> <span class="p">=</span> <span class="m">2</span><span class="p">;</span>
<span class="k">private</span> <span class="n">DynamicSoundEffectInstance</span> <span class="n">_instance</span><span class="p">;</span>

<span class="c1">// On LoadContent</span>
<span class="n">_instance</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">DynamicSoundEffectInstance</span><span class="p">(</span><span class="n">SampleRate</span><span class="p">,</span> <span class="p">(</span><span class="n">ChannelsCount</span> <span class="p">==</span> <span class="m">2</span><span class="p">)</span> <span class="p">?</span> <span class="n">AudioChannels</span><span class="p">.</span><span class="n">Stereo</span> <span class="p">:</span> <span class="n">AudioChannels</span><span class="p">.</span><span class="n">Mono</span><span class="p">);</span>
</code></pre></div></div>

<h2 id="step-2-create-audio-buffers">Step 2: Create Audio Buffers</h2>

<p>This is possibly the hardest step to understand in the whole process, because it depends on most of the concepts we’ve just seen. Let’s start from the beginning. A buffer is simply an array of values, and you’ll need to create one big enough to hold the audio data that will be passed to audio engine. But how big should it be, and in what format should it be created?</p>
<h3 id="size">Size</h3>
<p>The first step is to decide how many audio samples (per channel) do you want to submit to XNA at a time (i.e. on each submit operation). To avoid confusion with the physical size of the buffers we’ll be creating, I’ll call this amount “<em>SamplesPerBuffer</em>” from now on. This is an arbitrary value, so you can choose whatever you like, but depending on your choice, there are a few implications. Depending on the size you choose, the audio engine could become unstable, and you’ll have drops in the audio signal and glitches. Also depending on the size you choose, the latency of your signal will change, which in pratical terms determines how fast your application will be able to react to user input. The rules of thumb are:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Big</span> <span class="n">Buffer</span> <span class="p">=</span> <span class="n">More</span> <span class="nf">Stable</span> <span class="p">(</span><span class="n">Good</span><span class="p">),</span> <span class="n">More</span> <span class="nf">Latency</span> <span class="p">(</span><span class="n">Bad</span><span class="p">)</span>
<span class="n">Small</span> <span class="n">Buffer</span> <span class="p">=</span> <span class="n">Less</span> <span class="nf">Stable</span> <span class="p">(</span><span class="n">Bad</span><span class="p">),</span> <span class="n">Less</span> <span class="nf">Latency</span> <span class="p">(</span><span class="n">Good</span><span class="p">)</span>
</code></pre></div></div>

<p>Ideally you’ll want to choose a value that is <em>small</em> enough for latency to be near real-time, but <em>large</em> enough not to hear any sound glitches. I usually start around 3000 and then tweak it to my needs. On my Windows machine I can get it down to about 1000 or less and it still works perfectly.</p>
<h3 id="format">Format</h3>
<p>So, we’ve decided that each buffer should hold, for instance, 3000 audio samples (as I said, experiment with this value). Now what format should our buffer have? That’s where it gets tricky. The thing is, the format that is more convenient for doing wave calculations is not the same that XNA expects to receive.</p>

<p>In order to ease this step, I like to create <em>two different buffers</em>: one to do all of our wave math calculations (which I’ll call that the “<em>Working Buffer</em>”), and a different one to actually comunicate with XNA (which I’ll call the “<em>XNA Buffer</em>”). I’ll provide a method that will convert samples from one format to the other so you won’t have to worry about XNA’s internal format at all. Now on to our buffer formats:</p>
<h3 id="working-buffer-format">Working Buffer Format</h3>

<ol>
  <li>Our wave function outputs floating-point samples.</li>
  <li>Each audio channel will be generated and stored separatedly.</li>
</ol>

<p>So we’ll create a bi-dimensional floating-point array depending on the number of channels, like so:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Working</span> <span class="n">Buffer</span> <span class="p">=</span> <span class="kt">float</span><span class="p">[</span><span class="n">ChannelsCount</span><span class="p">,</span> <span class="n">SamplesPerBuffer</span><span class="p">]</span>
</code></pre></div></div>

<h3 id="xna-buffer-format">XNA Buffer Format</h3>

<ol>
  <li>XNA expects each sample to be a signed 16-bit integer (or short).</li>
  <li>XNA expects both audio channels to be passed together, in an interleaved fashion (LRLRLRLRLR).</li>
  <li>Important: Even though samples are expected to be 16-bit (short), for compatibility reasons XNA accepts its buffer as an array of <em>bytes</em> (8-bit)! This means that you’ll have to encode <em>each</em> of your 16-bit (short) samples as <em>two</em> consecutive 8-bit (byte) samples instead.</li>
</ol>

<p>Point 3 is very important because it means that you’ll have to multiply the whole size of your buffer by 2 in order to hold all the necessary bytes (which will be 2 bytes for each sample). Since everything will be stored in a row, we use a uni-dimensional array, like so:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">XNA</span> <span class="n">Buffer</span> <span class="p">=</span> <span class="kt">byte</span><span class="p">[</span><span class="n">ChannelsCount</span> <span class="p">*</span> <span class="n">SamplesPerBuffer</span> <span class="p">*</span> <span class="m">2</span><span class="p">]</span>
<span class="p">(</span><span class="k">where</span> <span class="m">2</span> <span class="k">is</span> <span class="n">the</span> <span class="n">number</span> <span class="n">of</span> <span class="n">bytes</span> <span class="n">per</span> <span class="n">sample</span><span class="p">)</span>
</code></pre></div></div>

<p>I created this image that should help you visualize better how the two buffers are related. The buffer in the middle is never really created, but serves to illustrate how we need to convert our samples from floats/doubles to shorts, before splitting them up into bytes (click to see in full size).</p>

<p><a href="/xna/assets/2011-03-30-creating-a-basic-synth-in-xna-part-ii/order.png"><img src="/xna/assets/2011-03-30-creating-a-basic-synth-in-xna-part-ii/order-300x260.png" alt="Audio Buffers" /></a>
<em>Audio Buffers</em></p>

<p>That’s all there is to it. As long as you create these arrays with the right size and format, you should be okay. Here’s the code:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// On your class</span>
<span class="k">public</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">SamplesPerBuffer</span> <span class="p">=</span> <span class="m">3000</span><span class="p">;</span>
<span class="k">private</span> <span class="kt">float</span><span class="p">[,]</span> <span class="n">_workingBuffer</span><span class="p">;</span>
<span class="k">private</span> <span class="kt">byte</span><span class="p">[]</span> <span class="n">_xnaBuffer</span><span class="p">;</span>

<span class="c1">// On LoadContent, after creating the DynamicSoundEffectInstance object</span>
<span class="n">_workingBuffer</span> <span class="p">=</span> <span class="k">new</span> <span class="kt">float</span><span class="p">[</span><span class="n">ChannelsCount</span><span class="p">,</span> <span class="n">SamplesPerBuffer</span><span class="p">];</span>
<span class="k">const</span> <span class="kt">int</span> <span class="n">bytesPerSample</span> <span class="p">=</span> <span class="m">2</span><span class="p">;</span>
<span class="n">_xnaBuffer</span> <span class="p">=</span> <span class="k">new</span> <span class="kt">byte</span><span class="p">[</span><span class="n">ChannelsCount</span> <span class="p">*</span> <span class="n">SamplesPerBuffer</span> <span class="p">*</span> <span class="n">bytesPerSample</span><span class="p">];</span>
</code></pre></div></div>

<p>And the method I mentioned before that converts the contents of the working buffer into the xna buffer is (just add it to your class, it’s an utility method):</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="k">static</span> <span class="k">void</span> <span class="nf">ConvertBuffer</span><span class="p">(</span><span class="kt">float</span><span class="p">[,]</span> <span class="k">from</span><span class="p">,</span> <span class="kt">byte</span><span class="p">[]</span> <span class="n">to</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">const</span> <span class="kt">int</span> <span class="n">bytesPerSample</span> <span class="p">=</span> <span class="m">2</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">channels</span> <span class="p">=</span> <span class="k">from</span><span class="p">.</span><span class="nf">GetLength</span><span class="p">(</span><span class="m">0</span><span class="p">);</span>
    <span class="kt">int</span> <span class="n">samplesPerBuffer</span> <span class="p">=</span> <span class="k">from</span><span class="p">.</span><span class="nf">GetLength</span><span class="p">(</span><span class="m">1</span><span class="p">);</span>

    <span class="c1">// Make sure the buffer sizes are correct</span>
    <span class="n">System</span><span class="p">.</span><span class="n">Diagnostics</span><span class="p">.</span><span class="n">Debug</span><span class="p">.</span><span class="nf">Assert</span><span class="p">(</span><span class="n">to</span><span class="p">.</span><span class="n">Length</span> <span class="p">==</span> <span class="n">samplesPerBuffer</span> <span class="p">*</span> <span class="n">channels</span> <span class="p">*</span> <span class="n">bytesPerSample</span><span class="p">,</span> <span class="s">"Buffer sizes are mismatched."</span><span class="p">);</span>

    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="n">samplesPerBuffer</span><span class="p">;</span> <span class="n">i</span><span class="p">++)</span>
    <span class="p">{</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">c</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">c</span> <span class="p">&lt;</span> <span class="n">channels</span><span class="p">;</span> <span class="n">c</span><span class="p">++)</span>
        <span class="p">{</span>
            <span class="c1">// First clamp the value to the [-1.0..1.0] range</span>
            <span class="kt">float</span> <span class="n">floatSample</span> <span class="p">=</span> <span class="n">MathHelper</span><span class="p">.</span><span class="nf">Clamp</span><span class="p">(</span><span class="n">from1</span><span class="p">,</span> <span class="p">-</span><span class="m">1.0f</span><span class="p">,</span> <span class="m">1.0f</span><span class="p">);</span>

            <span class="c1">// Convert it to the 16 bit [short.MinValue..short.MaxValue] range</span>
            <span class="kt">short</span> <span class="n">shortSample</span> <span class="p">=</span> <span class="p">(</span><span class="kt">short</span><span class="p">)</span> <span class="p">(</span><span class="n">floatSample</span> <span class="p">&gt;=</span> <span class="m">0.0f</span> <span class="p">?</span> <span class="n">floatSample</span> <span class="p">*</span> <span class="kt">short</span><span class="p">.</span><span class="n">MaxValue</span> <span class="p">:</span> <span class="n">floatSample</span> <span class="p">*</span> <span class="kt">short</span><span class="p">.</span><span class="n">MinValue</span> <span class="p">*</span> <span class="p">-</span><span class="m">1</span><span class="p">);</span>

            <span class="c1">// Calculate the right index based on the PCM format of interleaved samples per channel [L-R-L-R]</span>
            <span class="kt">int</span> <span class="n">index</span> <span class="p">=</span> <span class="n">i</span> <span class="p">*</span> <span class="n">channels</span> <span class="p">*</span> <span class="n">bytesPerSample</span> <span class="p">+</span> <span class="n">c</span> <span class="p">*</span> <span class="n">bytesPerSample</span><span class="p">;</span>

            <span class="c1">// Store the 16 bit sample as two consecutive 8 bit values in the buffer with regard to endian-ness</span>
            <span class="k">if</span> <span class="p">(!</span><span class="n">BitConverter</span><span class="p">.</span><span class="n">IsLittleEndian</span><span class="p">)</span>
            <span class="p">{</span>
                <span class="n">to</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="p">=</span> <span class="p">(</span><span class="kt">byte</span><span class="p">)(</span><span class="n">shortSample</span> <span class="p">&gt;&gt;</span> <span class="m">8</span><span class="p">);</span>
                <span class="n">to</span><span class="p">[</span><span class="n">index</span> <span class="p">+</span> <span class="m">1</span><span class="p">]</span> <span class="p">=</span> <span class="p">(</span><span class="kt">byte</span><span class="p">)</span><span class="n">shortSample</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="k">else</span>
            <span class="p">{</span>
                <span class="n">to</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="p">=</span> <span class="p">(</span><span class="kt">byte</span><span class="p">)</span><span class="n">shortSample</span><span class="p">;</span>
                <span class="n">to</span><span class="p">[</span><span class="n">index</span> <span class="p">+</span> <span class="m">1</span><span class="p">]</span> <span class="p">=</span> <span class="p">(</span><span class="kt">byte</span><span class="p">)(</span><span class="n">shortSample</span> <span class="p">&gt;&gt;</span> <span class="m">8</span><span class="p">);</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The method is heavily commented in order to explain what’s going on, but if you have any question about it, feel free to leave it in the comment section below.</p>

<h2 id="step-3-fill-buffers">Step 3: Fill Buffers</h2>

<p>Now that you’ve gotten here, the rest is actually quite easy! Remember that any calculations you do will be stored in the <em>Working Buffer</em>. Then at the end, you simply use the ConvertBuffer method above to copy it to the XNA buffer in the right format. For the sake of keeping it easy, we’ll be using a simple sine wave function that is described like this:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">double</span> <span class="nf">SineWave</span><span class="p">(</span><span class="kt">double</span> <span class="n">time</span><span class="p">,</span> <span class="kt">double</span> <span class="n">frequency</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Sin</span><span class="p">(</span><span class="n">time</span> <span class="p">*</span> <span class="m">2</span> <span class="p">*</span> <span class="n">Math</span><span class="p">.</span><span class="n">PI</span> <span class="p">*</span> <span class="n">frequency</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Then we’ll be filling our working buffer, such that the left and right audio channels are playing sine waves of different frequencies (in order to clearly demonstrate the effects of stereo audio). Generating waves of different frequencies is pretty straightforward, since you just need to pass a different “frequency” parameter to the function. But what value do we pass to the “time” parameter? We need a way to <em>know</em>, for each individual sample we’re generating, at what <em>time</em> that sample corresponds to. For that we need to create some sort of timer.</p>

<p>First, create a variable to count how much time has passed so far:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// On your class</span>
<span class="k">private</span> <span class="kt">double</span> <span class="n">_time</span> <span class="p">=</span> <span class="m">0.0</span><span class="p">;</span>
</code></pre></div></div>

<p>But instead of incrementing it in our Update method as you’re probably used to, we should increment it whenever we advance to the next sample during generation. Calculating <em>how much</em> we should advance our time variable is also easy. We know, for instance, that if we have a SampleRate of 44100 Hz, this means that there will be 44100 samples in a second. Therefore, we can also deduce that each sample has a duration of 1 / 44100 seconds! So basically all we have to do is advance our time variable in (1 / SampleRate) increments, and our variable will always hold a very accurate representation of time (just check the example code below).</p>

<p>So let’s put this all together and create a FillWorkingBuffer() method that fills our buffer with values from the SineWave function above, while automatically counting the time for us. Note that this function is generating a 440 Hz sine wave for the left channel, and a 220 Hz sine wave for the right channel:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="k">void</span> <span class="nf">FillWorkingBuffer</span><span class="p">()</span>
<span class="p">{</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="n">SamplesPerBuffer</span><span class="p">;</span> <span class="n">i</span><span class="p">++)</span>
    <span class="p">{</span>
        <span class="c1">// Here is where you sample your wave function</span>
        <span class="n">_workingBuffer</span><span class="p">[</span><span class="m">0</span><span class="p">,</span> <span class="n">i</span><span class="p">]</span> <span class="p">=</span> <span class="p">(</span><span class="kt">float</span><span class="p">)</span> <span class="nf">SineWave</span><span class="p">(</span><span class="n">_time</span><span class="p">,</span> <span class="m">440</span><span class="p">);</span> <span class="c1">// Left Channel</span>
        <span class="n">_workingBuffer</span><span class="p">[</span><span class="m">1</span><span class="p">,</span> <span class="n">i</span><span class="p">]</span> <span class="p">=</span> <span class="p">(</span><span class="kt">float</span><span class="p">)</span> <span class="nf">SineWave</span><span class="p">(</span><span class="n">_time</span><span class="p">,</span> <span class="m">220</span><span class="p">);</span> <span class="c1">// Right Channel</span>

        <span class="c1">// Advance time passed since beginning</span>
        <span class="c1">// Since the amount of samples in a second equals the chosen SampleRate</span>
        <span class="c1">// Then each sample should advance the time by 1 / SampleRate</span>
        <span class="n">_time</span> <span class="p">+=</span> <span class="m">1.0</span> <span class="p">/</span> <span class="n">SampleRate</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Also don’t forget to call ConvertBuffer() at the end in order to convert your working buffer into XNA’s format!</p>

<h2 id="step-4-submit-buffer">Step 4: Submit Buffer</h2>

<p>All that’s left is to call Play() on our DynamicSoundEffectInstance object and start submitting buffers to it. Submitting the buffer itself is pretty trivial, all you need to do is call:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">DynamicSoundEffectInstance</span><span class="p">.</span><span class="nf">SubmitBuffer</span><span class="p">(</span><span class="kt">byte</span><span class="p">[]</span> <span class="n">buffer</span><span class="p">)</span>
</code></pre></div></div>

<p>Since filling, converting and submiting a buffer is usually done in sequence, let’s group all three operations in a function for ease of use:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="k">void</span> <span class="nf">SubmitBuffer</span><span class="p">()</span>
<span class="p">{</span>
    <span class="nf">FillWorkingBuffer</span><span class="p">();</span>
    <span class="nf">ConvertBuffer</span><span class="p">(</span><span class="n">_workingBuffer</span><span class="p">,</span> <span class="n">_xnaBuffer</span><span class="p">);</span>
    <span class="n">_instance</span><span class="p">.</span><span class="nf">SubmitBuffer</span><span class="p">(</span><span class="n">_xnaBuffer</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>We’re almost there. There’s only one question remaining! How do I know when it’s time to submit a new buffer? There are two different ways to accomplish this:</p>

<ol>
  <li>Hook the DynamicSoundEffectInstance.BufferNeeded event and submit it there.</li>
  <li>Poll DynamicSoundEffectInstance.PendingBufferCount in your update loop and decide yourself when to submit.</li>
</ol>

<p>I prefer way number 2 because it allows me to keep a consistent amount of buffers in reserve, which prevents audio glitches and dropouts. I tried doing that with the BufferNeeded event (method 1), and when monitoring my PendingBufferCount value, it would keep fluctuating around every second, whereas with method 2 it stays stable. Furthermore, it’s really easy! All you need to do is add this to your Update method:</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// On Update</span>
<span class="k">while</span><span class="p">(</span><span class="n">_instance</span><span class="p">.</span><span class="n">PendingBufferCount</span> <span class="p">&lt;</span> <span class="m">3</span><span class="p">)</span>
    <span class="nf">SubmitBuffer</span><span class="p">();</span>
</code></pre></div></div>

<p>At last, simply call Play() on your DynamicSoundEffectInstance object after creating the buffers and preparing everything, in order to start playback of your sound!</p>

<div class="language-c# highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// At the end of LoadContent</span>
<span class="n">_instance</span><span class="p">.</span><span class="nf">Play</span><span class="p">();</span>
</code></pre></div></div>

<h2 id="sample">Sample</h2>

<p>Here’s a sample video and source code showing everything described in this article put into practice. You’ll probably notice that there’s many different types of waves being generated (sine, square, pulse, triangle, sawtooth, noise). Since this article became big enough as it is, I’ll be covering those in a <a href="/xna/about-oscillators">separate article dedicated to describing the Oscillator class</a> I’m using on the sample. An oscillator is basically a device that creates wave signals for you. Don’t worry, it’s not complicated at all compared to what we already did.</p>

<iframe width="420" height="315" src="//www.youtube.com/embed/nsg7-5TXgAg?rel=0" frameborder="0" allowfullscreen=""></iframe>

<p class="button"><a href="https://github.com/davidluzgouveia/blog-dynamic-sound">Source Code</a></p>

<h2 id="conclusions">Conclusions</h2>

<p>That’s it! I know it was long, but by now you hopefully have an annoying buzzing sound playing on your speakers. There’s still many things missing though, most notably:</p>

<ul>
  <li>You can’t play more than one sound at once (like a piano, i.e. we lack polyphony).</li>
  <li>You can’t control the note’s durations (i.e. when they start and stop, etc)</li>
</ul>

<p>These are the two questions that I’ll address in part III of the series, which will show you how to create a little playable “piano” with dynamically generated audio. It will also describe how to start shaping all of this code into a framework so that we can have more flexibility to add new sounds, effects and other goodies in the future. Meanwhile, be sure to also check <a href="/xna/about-oscillators">my article about oscillators</a> in sound synthesis. Until then!</p>

<p class="button"><a href="/xna/creating-a-basic-synth-in-xna-part-iii">Continue To Part III</a></p>]]></content><author><name></name></author><summary type="html"><![CDATA[Hello folks, and welcome to part II of my Creating a Basic Synth in XNA 4.0 series!]]></summary></entry></feed>