<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>A Tasty Pixel » Blog</title>
	<atom:link href="http://atastypixel.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://atastypixel.com/blog</link>
	<description></description>
	<lastBuildDate>Tue, 24 Jan 2012 10:40:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Loopy is on sale for the holidays!</title>
		<link>http://atastypixel.com/blog/loopy-is-on-sale-for-the-holidays/</link>
		<comments>http://atastypixel.com/blog/loopy-is-on-sale-for-the-holidays/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 13:03:27 +0000</pubDate>
		<dc:creator>Michael Tyson</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[Loopy]]></category>
		<category><![CDATA[Loopy HD]]></category>
		<category><![CDATA[Sale]]></category>

		<guid isPermaLink="false">http://atastypixel.com/blog/?p=2400</guid>
		<description><![CDATA[We&#8217;ve dropped Loopy&#8217;s price for the holiday period! Loopy HD, for iPad and iPhone, is 50% off at $3.99 (normally $7.99), and Loopy, for iPhone, is 30% off at $1.99 (normally $2.99). Happy holidays! Gift Loopy Gift Loopy HD]]></description>
			<content:encoded><![CDATA[<p><img style="display:block; margin-left:auto; margin-right:auto;" class="aligncenter" src="http://atastypixel.com/blog/wp-content/uploads/2011/12/loopy-sale.jpg" alt="Loopy, the live looper for iOS, is on sale for the holidays" title="loopy-sale.jpg" border="0" width="570" height="364" /></p>

<p>We&#8217;ve dropped <a href="http://loopyapp.com">Loopy&#8217;s</a> price for the holiday period!</p>

<p><a href="http://loopyapp.com/download-hd">Loopy HD</a>, for iPad and iPhone, is 50% off at $3.99 (normally $7.99), and <a href="http://loopyapp.com/download">Loopy</a>, for iPhone, is 30% off at $1.99 (normally $2.99).</p>

<p>Happy holidays!</p>

<div style="margin-top: 50px; margin-left: 50px; display:block; width: 150px; float: left; text-align: center;">
<a style="text-decoration: none; font-size: 16px; font-weight: bold; color: #777;" href="https://buy.itunes.apple.com/WebObjects/MZFinance.woa/wa/giftSongsWizard?gift=1&#038;salableAdamId=300257824&#038;productType=C&#038;pricingParameter=STDQ"><img style="display:block; margin-left:auto; margin-right:auto;" class="aligncenter" src="http://atastypixel.com/blog/wp-content/uploads/2011/12/gift-loopy.jpg" alt="Gift loopy" title="gift-loopy.jpg" border="0" width="150" height="153" />Gift Loopy</a>
</div>

<div style="margin-top: 50px; margin-right: 50px; display:block; width: 150px; float: right; text-align: center;">
<a style="text-decoration: none; font-size: 16px; font-weight: bold; color: #777;" href="https://buy.itunes.apple.com/WebObjects/MZFinance.woa/wa/giftSongsWizard?gift=1&#038;salableAdamId=467923185&#038;productType=C&#038;pricingParameter=STDQ"><img style="display:block; margin-left:auto; margin-right:auto;" class="aligncenter" src="http://atastypixel.com/blog/wp-content/uploads/2011/12/gift-loopy-hd.jpg" alt="Gift loopy hd" title="gift-loopy-hd.jpg" border="0" width="150" height="153" />Gift Loopy HD</a>
</div>

<div style="clear: both;"></div>
 <img src="http://atastypixel.com/blog/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2400" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://atastypixel.com/blog/loopy-is-on-sale-for-the-holidays/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Presenting TPAudioController, the iOS audio engine library</title>
		<link>http://atastypixel.com/blog/presenting-tpaudiocontroller-the-ios-audio-engine-library/</link>
		<comments>http://atastypixel.com/blog/presenting-tpaudiocontroller-the-ios-audio-engine-library/#comments</comments>
		<pubDate>Sun, 11 Dec 2011 20:50:47 +0000</pubDate>
		<dc:creator>Michael Tyson</dc:creator>
				<category><![CDATA[Geekspeak]]></category>
		<category><![CDATA[Products]]></category>
		<category><![CDATA[Audio]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[TPAudioController]]></category>

		<guid isPermaLink="false">http://atastypixel.com/blog/?p=2387</guid>
		<description><![CDATA[TPAudioController is a flexible, easy-to-use and complete audio engine for iOS, built upon Core Audio, which handles all setup and management of the low-level Remote IO audio unit system, with support for capturing input via the microphone, automatic mixing of multiple audio signals with per-channel volume and pan controls, and capturing audio system output for [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://atastypixel.com/blog/wp-content/uploads/2011/12/icon-medium.jpg" alt="Icon medium" title="icon-medium.jpg" border="0" width="183" height="147" style="float:right;" class="alignright" />
<a href="http://atastypixel.com/code/TPAudioController/">TPAudioController</a> is a flexible, easy-to-use and complete audio engine for iOS, built upon Core Audio, which handles all setup and management of the low-level Remote IO audio unit system, with support for capturing input via the microphone, automatic mixing of multiple audio signals with per-channel volume and pan controls, and capturing audio system output for session recording.</p>

<p>The library, which is also the engine behind our popular live looper app <a href="http://loopyapp.com">Loopy</a>, defines protocols for recording, playback, and audio output capture for easy inclusion with existing or new projects.</p>

<p>It&#8217;s designed to be really easy to work with, in order to get new audio projects off the ground  quickly, and to dramatically cut down the iOS audio learning curve.</p>

<p>Find out more, download an evaluation version of the framework and a complete sample synth app <a href="http://atastypixel.com/code/TPAudioController/">here</a>.</p>
 <img src="http://atastypixel.com/blog/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2387" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://atastypixel.com/blog/presenting-tpaudiocontroller-the-ios-audio-engine-library/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Circular (ring) buffer plus neat virtual memory mapping trick</title>
		<link>http://atastypixel.com/blog/circular-ring-buffer-plus-neat-virtual-memory-mapping-trick/</link>
		<comments>http://atastypixel.com/blog/circular-ring-buffer-plus-neat-virtual-memory-mapping-trick/#comments</comments>
		<pubDate>Sat, 10 Dec 2011 13:13:20 +0000</pubDate>
		<dc:creator>Michael Tyson</dc:creator>
				<category><![CDATA[Geekspeak]]></category>
		<category><![CDATA[Audio]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Optimisation]]></category>

		<guid isPermaLink="false">http://atastypixel.com/blog/?p=2370</guid>
		<description><![CDATA[I&#8217;ve just updated my C circular buffer implementation, adopting the trick originally proposed by Philip Howard and adapted to Darwin by Kurt Revis: A virtual copy of the buffer is inserted directly after the end of the buffer, so that you can write past the end of the buffer, but have your writes automatically wrapped [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just updated my <a href="http://atastypixel.com/blog/a-simple-fast-circular-buffer-implementation-for-audio-processing/">C circular buffer implementation</a>, adopting the trick originally proposed by <a href="http://vrb.slashusr.org/">Philip Howard</a> and <a href="http://www.snoize.com/Code/PlayBufferedSoundFile.tar.gz">adapted to Darwin</a> by <a href="http://www.snoize.com">Kurt Revis</a>: A virtual copy of the buffer is inserted directly after the end of the buffer, so that you can write past the end of the buffer, but have your writes automatically wrapped around to the start &#8212; no need to manually implement buffer wrapping logic.</p>

<p>This dramatically simplifies the use of a circular buffer &#8212; you can use chunks of the buffer without any need to worry about where the wrap point is.</p>

<p>See the new implementation, which is thread-safe with one consumer and one producer, with no need for locks, making it perfect for use with high-priority Core Audio threads, on <a href="https://github.com/michaeltyson/TPCircularBuffer">GitHub: TPCircularBuffer</a>.</p>

<p>There&#8217;s a basic example of its use over on the <a href="http://atastypixel.com/blog/a-simple-fast-circular-buffer-implementation-for-audio-processing/">original post</a>.</p>
 <img src="http://atastypixel.com/blog/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2370" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://atastypixel.com/blog/circular-ring-buffer-plus-neat-virtual-memory-mapping-trick/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Major Loopy update: Our iOS live looper just got MIDI!</title>
		<link>http://atastypixel.com/blog/major-loopy-and-loopy-hd-update-midi/</link>
		<comments>http://atastypixel.com/blog/major-loopy-and-loopy-hd-update-midi/#comments</comments>
		<pubDate>Sun, 04 Dec 2011 18:43:05 +0000</pubDate>
		<dc:creator>Michael Tyson</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[Loopy]]></category>
		<category><![CDATA[Loopy HD]]></category>
		<category><![CDATA[Update]]></category>

		<guid isPermaLink="false">http://atastypixel.com/blog/?p=2364</guid>
		<description><![CDATA[I&#8217;m excited to announce the release of Loopy 2.2, and Loopy HD 1.1, which introduce features that the professional and semi-professional musicians are going to love: Trainable MIDI control, and MIDI clock sync! Loopy can now be entirely controlled via external MIDI devices, via the Camera Connection Kit for iPad, or any one of a [...]]]></description>
			<content:encoded><![CDATA[<p><img style="display:block; margin-left:auto; margin-right:auto;" class="aligncenter" src="http://atastypixel.com/blog/wp-content/uploads/2011/12/MIDI-Update.jpg" alt="MIDI Update" title="MIDI-Update.jpg" border="0" width="550" height="345" /></p>

<p>I&#8217;m excited to announce the release of Loopy 2.2, and Loopy HD 1.1, which introduce features that the professional and semi-professional musicians are going to love: Trainable MIDI control, and MIDI clock sync!</p>

<p>Loopy can now be entirely controlled via external MIDI devices, via the Camera Connection Kit for iPad, or any one of a number of third party adapters for the iPhone and iPod Touch.</p>

<p>With Loopy, musicians can now accomplish the kind of setup that would otherwise cost hundreds of dollars in expensive, bulky specialised equipment to achieve.</p>

<p>Controllable actions include record toggle, mute toggle, record then automatically select next track, record then overdub, toggle record with no count-in/out, clear, re-record, solo, volume, pan, tempo adjust or tempo tap, pause, double or halve clock length…</p>

<p>The update also introduces MIDI clock sync: The clock can be synchronised, in either direction, with external devices, other software (such as Ableton Live) over WiFi, software running on other iOS devices via WiFi or Bluetooth, and even other compatible apps running on the same iOS device, via virtual MIDI!</p>

<p>Oh, yeah – one more thing: Loopy on the iPhone or iPod Touch can now run up to 12 channels. Yep. Layer it up, baby.</p>
 <img src="http://atastypixel.com/blog/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2364" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://atastypixel.com/blog/major-loopy-and-loopy-hd-update-midi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Equipment: Busking with Loopy on a Budget</title>
		<link>http://atastypixel.com/blog/equipment-busking-with-loopy-on-a-budget/</link>
		<comments>http://atastypixel.com/blog/equipment-busking-with-loopy-on-a-budget/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 13:46:36 +0000</pubDate>
		<dc:creator>Michael Tyson</dc:creator>
				<category><![CDATA[Geekspeak]]></category>
		<category><![CDATA[Products]]></category>
		<category><![CDATA[Equipment]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Loopy]]></category>
		<category><![CDATA[Loopy HD]]></category>

		<guid isPermaLink="false">http://atastypixel.com/blog/?p=2345</guid>
		<description><![CDATA[Loopy user and forum member fonyo recently wrote an article on the Loopy forum about busking with low-budget equipment and Loopy. There was some great information in the article, so I&#8217;ve reproduced it here with some editorial modifications. I&#8217;ve been planning for a long time to do some busking. I&#8217;ve always been amazed by street [...]]]></description>
			<content:encoded><![CDATA[<blockquote>
  <p>Loopy user and forum member <a href="http://forum.loopyapp.com/profile/44/fonyo">fonyo</a> recently wrote an article on the Loopy forum about <a href="http://forum.loopyapp.com/discussion/19/idea-of-busking-with-fairly-low-budget-equipment">busking with low-budget equipment and Loopy</a>.  There was some great information in the article, so I&#8217;ve reproduced it here with some editorial modifications.</p>
</blockquote>

<p>I&#8217;ve been planning for a long time to do some busking. I&#8217;ve always been amazed by street musicians, and can watch them for hours.  That&#8217;s why I&#8217;ve put together some thoughts on buying portable equipment.</p>

<p>In summary: For just a fraction more money than that saved by choosing Loopy instead of a single Boss RC-300 Loop Station, you can pick up a complete, high-quality busking setup, perfect for going out into the street and performing for the public.</p>

<h2>Boss RC-300 vs Loopy</h2>

<p>First, let me compare the new Boss RC-300 Loop Station with Loopy, not counting the iPhone&#8217;s/iPad&#8217;s price (because we love it and would buy it anyway!).  I chose the RC-300 as it gives you the closest number of individual loop tracks you can record/overdub</p>

<table style="margin-left: auto; margin-right: auto;">
<tr><th>Item</th><th>Cost</th><th>Number of tracks</th></tr>
<tr><th>Boss RC-300</th><td>£400 +</td><td>3 stereo</td></tr>
<tr><th>Loopy</th><td>£2</td><td>6 stereo</td></tr>
<tr><th>Loopy HD</th><td>£5</td><td>6, 9 or 12 stereo</td></tr>
</table>

<p>My point is this: let&#8217;s forget the RC-300 and save that 400 quid for other stuff to buy so we can go out and play!</p>

<h2>Equipment list</h2>

<p>Here&#8217;s my equipment list. I tried to find a balance between price and quality, while also keeping in mind portability.</p>

<table style="margin-left: auto; margin-right: auto;">
<tr><th>Item</th><th>Cost</th></tr>
<tr><td>Loopy</td><td>£2 / £5 HD</td></tr>
<tr><td>iRig G&#038;I interface</td><td>  ~£25</td></tr>
<tr><td>iRig MIDI</td><td>   ~£50</td></tr>
<tr><td>iKlip MINI</td><td>  ~£25</td></tr>
<tr><td>MOTU ZBOX</td><td>   ~£32</td></tr>
<tr><td>BEHRINGER FCB1010</td><td>   ~£95</td></tr>
<tr><td>BEHRINGER XENYX 1002 B</td><td>  ~£74</td></tr>
<tr><td>PylePro PWMA series</td><td>     ~£100-200</td></tr>
</table>

<p>Let&#8217;s see the details of each. Loopy is obvious, it&#8217;s the &#8220;core&#8221; in our iDevice and the iKlip is holding it (e.g. on a mic stand).</p>

<p>iRig guitar &amp; instrument interface is transferring the sound to the iDevice.</p>

<p>iRig MIDI to control Loopy through MIDI (I know it&#8217;s not capable of doing this yet but soon it will be!) and we connect a nice MIDI foot switch (cheap and smart) the Behringer FCB1010.  This is the only thing which needs a power supply but I&#8217;m listing it as I would go for it anyway.  I&#8217;m sure now that iRig MIDI and LINE6 Mobilizer II are released we will soon find many battery-operated or maybe even passive foot-switches for iDevices through MIDI.</p>

<p>I&#8217;m sorry to disappoint you, but an electric condenser mic like the iRig iMic just won&#8217;t give you a nice sound, and as the tests and reviews are showing it&#8217;s just not suited for professional use such as live quality street busking.</p>

<p>That&#8217;s why I came up with an idea of a small but powerful battery-operated mixer with enough inputs to handle your better quality microphones.  You can also plug in your instruments or any device with line out, such as an iPod as a music source.</p>

<p>The mixer device is the Behringer XENYX 1002B which runs on two (!) 9VDC batteries. The main output of the mixer (your gig) goes into the iRig&#8217;s TRS input. As a nice optional hardware for electric guitars with pickups, I recommend the MOTU ZBOX. It&#8217;s a miracle for guitar sound, and it&#8217;s passive so it doesn&#8217;t require any current. The Behringer 1002B has 5mic-line input OR 2mic-line/6stereo input with 3bandEQ, 2aux etc.</p>

<p>Finally, the Public Address (PA). I&#8217;ve found real luggage-like battery powered speakers made by PylePro and those are just wicked! Low-budget but nice stuff. They have wheels and handle for easy relocating, EQ, and many other cool things built-in. They give you enough power to blow away your own head with guitar riffs, beatbox, singing, so you can just use Loopy to amaze your audience! The iRig&#8217;s output goes in the PylePro&#8217;s input, and there we are.</p>

<p>You do need to buy a mic, but this way nearly anything will sound better than that electric condenser.</p>

<h2>Summary</h2>

<p>For the money you avoided spending on a Boss RC-300 LS for £400 (vs. Loopy 2 HD for £5), you can pick up nearly all this equipment &#8212; the sum is between 400-550 depending on where and what you buy or not.  Then, you&#8217;re good to go and show some real busking to the public and start a career like our Uncle Dub Fx!</p>

<blockquote>
  <p>You can discuss fonyo&#8217;s research at the <a href="http://forum.loopyapp.com/discussion/19/idea-of-busking-with-fairly-low-budget-equipment">Loopy forum</a>.</p>
</blockquote>
 <img src="http://atastypixel.com/blog/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2345" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://atastypixel.com/blog/equipment-busking-with-loopy-on-a-budget/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Update: Loopy 2.1.1 and Loopy HD 1.0.1</title>
		<link>http://atastypixel.com/blog/update-loopy-2-1-1-and-loopy-hd-1-0-1/</link>
		<comments>http://atastypixel.com/blog/update-loopy-2-1-1-and-loopy-hd-1-0-1/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 16:37:23 +0000</pubDate>
		<dc:creator>Michael Tyson</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[Loopy]]></category>
		<category><![CDATA[Loopy HD]]></category>
		<category><![CDATA[Update]]></category>

		<guid isPermaLink="false">http://atastypixel.com/blog/?p=2341</guid>
		<description><![CDATA[Updates to Loopy and Loopy HD have just hit the App Store! Loopy 2.1.1 and Loopy HD 1.0.1 feature a number of bug fixes and iOS 5 compatibility fixes, as well as a few new features: Configurable fade-in and fade-out With this switched on, and with mute count-in/count-out enabled, the second tap on a playing [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://atastypixel.com/blog/wp-content/uploads/2011/10/2.1.1.jpg" alt="Loopy 2.1.1" title="2.1.1.jpg" border="0" width="381" height="400" style="float:right;" class="alignright" />Updates to Loopy and Loopy HD have just hit the App Store!</p>

<p>Loopy 2.1.1 and Loopy HD 1.0.1 feature a number of bug fixes and iOS 5 compatibility fixes, as well as a few new features:</p>

<h2>Configurable fade-in and fade-out</h2>

<p>With this switched on, and with mute count-in/count-out enabled, the second tap on a playing or muted track will begin a fade in or out.  A third tap will immediately play or mute the track.  Without mute count-in/out, the first tap begins fade, the second plays or mutes immediately.</p>

<h2>&#8220;Re-record&#8221; function</h2>

<p>When clearing a track, this new function will cause the track to clear and begin recording again at the start of the next loop (or straight away, with count-in off)</p>

<h2>&#8220;Chained mute&#8221; feature</h2>

<p>If you mute a track (or tracks) while another track is counting in to record, then the muted track(s) will only mute after the recording ends, instead of at the next loop.</p>

<p>I hope you like the changes! Stay tuned for more.</p>
 <img src="http://atastypixel.com/blog/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2341" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://atastypixel.com/blog/update-loopy-2-1-1-and-loopy-hd-1-0-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Featured Artist: Benjamin Poole</title>
		<link>http://atastypixel.com/blog/featured-artist-benjamin-poole/</link>
		<comments>http://atastypixel.com/blog/featured-artist-benjamin-poole/#comments</comments>
		<pubDate>Sat, 08 Oct 2011 09:34:41 +0000</pubDate>
		<dc:creator>Michael Tyson</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[Featured Artist]]></category>
		<category><![CDATA[Loopy]]></category>

		<guid isPermaLink="false">http://atastypixel.com/blog/?p=2338</guid>
		<description><![CDATA[Love Theme (feat. the Tiny Instrument Orchestra)(Loopy) by benjaminpoole Benjamin Poole&#8217;s creations with Loopy are beautifully whimsical, uplifting and sometimes melancholy tracks that feature second-hand and vintage toy instruments that Benjamin has found via Craigslist and through friends. Judging by the quality of his work, I&#8217;d assumed that Benjamin was a professional musician experimenting with [...]]]></description>
			<content:encoded><![CDATA[<p><object height="81" width="100%"> <param name="movie" value="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F20253766"></param> <param name="allowscriptaccess" value="always"></param> <embed allowscriptaccess="always" height="81" src="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F20253766" type="application/x-shockwave-flash" width="100%"></embed> </object>  <span style="font-size: 80%;"><a href="http://soundcloud.com/benjaminpoole/love-theme-feat-the-tiny">Love Theme (feat. the Tiny Instrument Orchestra)(Loopy)</a> by <a href="http://soundcloud.com/benjaminpoole">benjaminpoole</a></span></p>

<p>Benjamin Poole&#8217;s creations with Loopy are beautifully whimsical, uplifting and sometimes melancholy tracks that feature second-hand and vintage toy instruments that Benjamin has found via Craigslist and through friends.</p>

<p>Judging by the quality of his work, I&#8217;d assumed that Benjamin was a professional musician experimenting with Loopy, but to my surprise, this is just his hobby: Benjamin&#8217;s a full time Communications major!</p>

<p>Benjamin can be found posting to SoundCloud as <a href="http://soundcloud.com/benjaminpoole">benjaminpoole</a>.</p>

<p><object height="81" width="100%"> <param name="movie" value="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F24195149"></param> <param name="allowscriptaccess" value="always"></param> <embed allowscriptaccess="always" height="81" src="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F24195149" type="application/x-shockwave-flash" width="100%"></embed> </object>  <span style="font-size: 80%;"><a href="http://soundcloud.com/benjaminpoole/good-morning-loopy-experiment">Good Morning (Loopy Experiment)</a> by <a href="http://soundcloud.com/benjaminpoole">benjaminpoole</a></span></p>

<p>You can hear what others are doing with Loopy at <a href="http://soundcloud.com/groups/loopyapp">Loopy&#8217;s very active SoundClound group</a>.</p>
 <img src="http://atastypixel.com/blog/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2338" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://atastypixel.com/blog/featured-artist-benjamin-poole/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Experiences with some app promotion strategies</title>
		<link>http://atastypixel.com/blog/experiences-with-some-app-promotion-strategies/</link>
		<comments>http://atastypixel.com/blog/experiences-with-some-app-promotion-strategies/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 17:09:37 +0000</pubDate>
		<dc:creator>Michael Tyson</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Geekspeak]]></category>
		<category><![CDATA[Advertising]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Apps]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Marketing]]></category>
		<category><![CDATA[PR]]></category>

		<guid isPermaLink="false">http://atastypixel.com/blog/?p=2327</guid>
		<description><![CDATA[In the dim and distant past, while in a moment of neglecting my PhD to work on the very first version of Loopy (which is now currently one of the most popular music apps on the iPad!), I had grand visions of an almost totally passive income, making apps. I love the creative initial product [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://atastypixel.com/blog/wp-content/uploads/2011/10/buy-my-thing.jpg" alt="Buy my thing" title="buy-my-thing.jpg" border="0" width="240" height="240" style="float:right;" class="alignright" />In the dim and distant past, while in a moment of neglecting my PhD to work on the very first version of <a href="http://loopyapp.com">Loopy</a> (which is now currently one of the most popular music apps on the iPad!), I had grand visions of an almost totally passive income, making apps.  I love the creative initial product development process and, with naive optimism, I pictured pumping apps out and then sitting back and watching the money roll on in.  Tim Ferriss&#8217;s <a href="http://www.fourhourworkweek.com/">4-Hour Workweek</a> had me enthusiastically lifestyle-designing and dreaming of all my free moneys.</p>

<p>I bet I&#8217;m not the only one, but of course reality struck and we realised that the App Store aint that kind of beast. Like any other product, an app needs to be actively presented to the world on a regular basis, and needs to be nurtured to keep it fresh and relevant.</p>

<p>I say &#8220;we&#8221; because at this point, my partner <a href="http://nelliewindmill.com">Katherine</a> joined me after this particular revelation, and became A Tasty Pixel&#8217;s part-time marketing director and PR strategist &#8212; it&#8217;s taken two of us to keep A Tasty Pixel&#8217;s wheels turning smoothly, and we still have a <em>lot</em> to learn.</p>

<p>I thought I&#8217;d take a moment to reflect on some of the lessons we&#8217;ve learned in the past year, in which we&#8217;ve released a relatively successful travel planning and travel assistant app, <a href="http://cartographer-app.com">The Cartographer</a>, a very successful live looping app, <a href="http://loopyapp.com">Loopy</a>, and its big brother <a href="http://loopyapp.com">Loopy HD</a>, and tried a bunch of promotion strategies, some successful, some not, and some that haven&#8217;t yet run their course.<span id="more-2327"></span></p>

<h3>Stating the obvious: It&#8217;s not enough to just build it</h3>

<p>Just for the record, and I&#8217;m sure we all know this now, but &#8220;build it and they will come&#8221; doesn&#8217;t cut it on the App Store.  Maybe it did in Month One, but now, you might as well not start if you&#8217;re not going to devote a goodly amount of time to promoting your app, because it just won&#8217;t get anywhere amongst the hoards of other apps.</p>

<h3>Don&#8217;t expect everything to work</h3>

<p>Perhaps the biggest, or at least most helpful, lesson we learned was not to expect everything to go as planned, and not to get too down if a strategy didn&#8217;t pan out.</p>

<p>It&#8217;s often impossible to predict which things will be successful and which not, but we found it helpful to consider the payoff for the successful strategies being spread around amongst all the strategies, successful or not &#8212; that way, we could be pleased about the ones that paid off, and philosophical about the ones that didn&#8217;t!  The trick is just to keep at it, and keep being creative.</p>

<h3>High quality attracts attention</h3>

<p>Please excuse a moment of immodesty: I&#8217;d like to think my apps have a fairly high standard of quality, and it would appear that making &#8220;premium&#8221; apps really does pay off!</p>

<p>It&#8217;s not entirely &#8220;build it and they will come&#8221;, but having an app that looks great and that customers love gives you a big head-start in the PR game.  Word of mouth is huge on the App Store, and the mouths in question produce more words about great apps.</p>

<p>What&#8217;s more, a feature by Apple, which generally only happens to high-quality apps, can make a massive difference, both in the short and long term, and gives an app a great &#8220;social proof&#8221; bump.</p>

<p>Incidentally, this goes for the app site too. Sites like <a href="http://appsites.com">App Sites</a> reward beautiful designs, and you can get picked up on various design blogs too &#8212; we&#8217;ve had quite a bit of traffic lately from <a href="http://www.blogduwebdesign.com/webdesign-inspiration/20-webdesign-efficaces-pour-presenter-une-application-mobile/522">Blog Du Webdesign</a>, for example.  And the same goes for demo videos. The Cartographer&#8217;s demo got a huge response, and got a lot of word of mouth, <em>just about the video itself</em>:</p>

<iframe width="539" height="274" src="http://www.youtube.com/embed/H1CbO1zgNXY?rel=0" frameborder="0" allowfullscreen></iframe>

<p>So: Put in the extra sweat-and-tears. It&#8217;s worth it.</p>

<h3>Influencers</h3>

<p>Sometimes, depending on the nature of the app, a good word from an influencer in the area can be huge.</p>

<p>For example, when Loopy was in pre-release, I made contact with a musician I&#8217;m a big fan of, <a href="http://dubfx.net">Dub Fx</a> (you might know him from <a href="http://www.youtube.com/watch?v=8F6EoMdn95E">this video</a>, which went viral a couple of years ago). Ben was very interested in the app, and threw his not inconsiderable support behind it, unleashing this amazing demo video:</p>

<iframe width="539" height="274" src="http://www.youtube.com/embed/7GgiVhTB_yA?rel=0" frameborder="0" allowfullscreen></iframe>

<p>…our jaws were dangling around our knees when I found that in my inbox!  We&#8217;ve since decided to work together &#8212; look out for the Dub Fx app some time next year!</p>

<p>That was the success story &#8212; our experience with The Cartographer was quite different, though. Katherine spent months upon months getting to know travel bloggers, interacting on their blogs and via various social media, hoping to make connections and get to introduce the app to some of them.</p>

<p>The good news is that we made some really good new friends out of the process, which makes it all worthwhile as far as I&#8217;m concerned.  But as a marketing strategy, it was a total bust. As it turns out, many travel bloggers seem to be  quite unresponsive &#8212; some of them, despite lots of friendly comments and other interactions, never even noticed us!  Some did, and kindly give us a mention on their blogs, but this didn&#8217;t seem to have any effect!</p>

<p>It turns out, as Katherine discovered in an industry report, the places that travellers (our target audience) go on the Internet: Not travel blogs!  Travellers visit airline sites, hotel websites, TripAdvisor and forums, Lonely Planet&#8217;s forums…all places that we have no hope of exerting any influence at all (those forums, by the way, are <em>militantly</em> moderated for anything that even loosely resembles product mentions).  So, we did the best we could, given the options, but it&#8217;s a really difficult market.</p>

<p>So, I suppose the lesson there is tread carefully, do your research, and spend the time strategically &#8212; be aware that the payoff might be huge, or it might be nil.  If we&#8217;d known in advance how poorly the months of work Katherine put into meeting travel bloggers would turn out, we might have invested less time in it.  We may have even decided to find an alternative target market.</p>

<h3>Reviewers</h3>

<p>There are a <em>lot</em> of app review sites out there, now. It&#8217;s just insane &#8212; it seems like every man, his dog, and several of his goldfish have app review blogs.  Back at the start, Katherine put in a huge number of hours and built us a spreadsheet of the most important reviewers.  With that done, whenever we do a release, she spends half a day (that&#8217;s how long it takes, or more!) emailing and filling out web forms of reviewers.</p>

<p>Most of them never respond, especially the big ones &#8212; they get such a barrage of review requests, it&#8217;s not hugely surprising.  Many blogs offer paid reviews, but we haven&#8217;t gone down that track yet, so, nothing to report there.  But many have responded, and every review helps, both for the social proof and word-of-mouth, and for the SEO.</p>

<p>Honestly, we haven&#8217;t yet collected hard stats about the proportion of reviewers who contact us in response to our initial contact, and how many are contacting us of their own accord.  Many of the significant reviews we&#8217;ve had have happened independently of us tracking down and contacting the reviewers in question, though.</p>

<p>So, we&#8217;re still undecided about whether the amount of time invested in telling reviewers about our products is really paying off.  I think we&#8217;ll always do it for initial releases, and possibly for major, major updates, though.</p>

<h3>Journalists</h3>

<p>This is something we want to do, but haven&#8217;t really pursued a whole lot &#8212; finding relevant journalists and contacting them directly.  We&#8217;ve found contacts for a few, but they always seem to be out-of-date and emails just bounce.</p>

<p>So, this seems like a good thing to do, but still TBD.</p>

<h3>Press releases</h3>

<p>Press releases seem to have two main benefits &#8212; they help with SEO, which helps users find your app &#8212; and they marginally increase the likelihood of getting picked up and getting some free media.</p>

<p>We&#8217;ve been doing regular monthly <a href="http://www.prweb.com/releases/2011/10/prweb8853583.htm">press releases</a> via PRWeb (a.k.a. Vocus) for a few months now, after previously only doing a big one (via PRWeb) for launch, and a couple smaller ones (via the much cheaper PRMac service) for updates.</p>

<p>Vocus talked us into signing up for a 12 month subscription (for a thousand-and-something $), which includes one release a month, and a representative who helps suggest topics, and checks over our drafts.  Our representative Rebecca has been great with both, and has been very responsive with answering our dumb questions along the way.</p>

<p>We&#8217;ve been <a href="http://www.sfgate.com/cgi-bin/article.cgi?f=/g/a/2011/10/06/prweb8853583.DTL">pseudo-picked up</a> by a few nice sites like the San Francisco Chronicle, although it&#8217;s automated and I don&#8217;t know how much of a direct difference it actually makes.  At the moment, loopyapp.com&#8217;s page rank is at 4, which is not bad at all, some of which is presumably thanks to our releases, and we seem to rank fairly well with most of the google searches we want to be associated with.  An interesting side note is that quite a lot of our referred web traffic is coming straight from PRWeb, which surprised me.</p>

<p>As with a lot of these strategies, I can&#8217;t say for sure whether it&#8217;s been a huge success so far &#8212; it&#8217;s hard to determine the cause of a good page rank, for example &#8212; but my gut feeling is that it&#8217;s worthwhile; it makes sense.</p>

<h3>Social media</h3>

<p>I never &#8220;got&#8221; Facebook up until quite recently, but now I can&#8217;t get enough &#8212; after being a staunch Twitter user for quite a long time, I&#8217;ve discovered that Facebookers are amazingly engaged.  I remember hearing somewhere that one Facebook follower (…&#8221;like&#8221;-r?) is worth several Twitter followers, and that rings true. I have a great time hanging around on the <a href="http://facebook.com/ATastyPixel">A Tasty Pixel Facebook page</a> and interacting with people there, as opposed to Twitter, which is sometimes a little bit like shouting into a black hole.</p>

<p>Google+? I have no bleeding idea. Anyone?</p>

<p>Anyway, it&#8217;s important to engage with your customers on both, but particularly Facebook, and there&#8217;s lots of scope for interesting interactions with customers.  For example, I&#8217;m about to start building effects into Loopy, and I was curious about what people most wanted to see.  So, I created a <a href="http://www.facebook.com/home.php?sk=question&amp;id=219136051461469&amp;qa_ref=qd">poll</a> on the Facebook page, and got a great response (&#8220;More Cowbell&#8221; coming right up…).</p>

<p>I quite like being able to &#8220;be me&#8221; on Twitter and Facebook, to show what I&#8217;m up to, get feedback on stuff as I&#8217;m making it, and to respond straight away to people.  I get to present a personal face, instead of being A Company.</p>

<p>As Loopy is a music-creation app, it also hooks straight into SoundCloud, and has a very active <a href="http://soundcloud.com/groups/loopyapp">SoundCloud group</a> which I find myself trawling every morning &#8212; a great entertainment.  One of the unexpected benefits is that I&#8217;ve met quite a few talented and lovely people though SoundCloud, some of whom have gone on to become testers and advisors, and help shape Loopy.</p>

<h3>Customer support</h3>

<p>While this isn&#8217;t promotion-related, I&#8217;ve been in the position (being a one-person dev company) to interact with customers directly, and I make a point of responding almost immediately when possible, and doing my best to address problems straight away. On a couple of occasions, the customer&#8217;s helped me identify a time-sensitive issue &#8212; they&#8217;re using The Cartographer and are about to go away on holiday &#8212; and I&#8217;ve had a fixed ad-hoc build out to them within a couple of hours, which has been very satisfying on both sides!</p>

<p>Customers love the straight-to-developer contact and the fast replies, and quite a few people have gone on to become very vocal supporters, which has been great. A very positive support experience goes a long way towards building goodwill, and I think it&#8217;s super-important. It also feels really satisfying, so in my option, there&#8217;s no reason not to go all-out!</p>

<h3>Expertise</h3>

<p><a href="http://www.fourhourworkweek.com/">Tim Ferriss</a> encourages product creators to position themselves as authorities in the area targeted by the product, to give the product more clout and attract more attention.  The idea is, if your app is targeted at a particular area, and you have experience in that area, then write: write on your own blog, and seek out others to do guest posts on (make sure it links back to you!).</p>

<p>We&#8217;re spending a few years travelling in a motorhome around Europe as we set up A Tasty Pixel and Katherine&#8217;s art business, and The Cartographer was built as a result of our experiences travelling.  So, (I say &#8220;so&#8221;, but actually we were already blogging as a journal for ourselves &#8212; but let us conveniently ignore that fact) we keep a <a href="http://technomadics.net">travel blog</a>, which brings in some traffic.  But not much &#8212; honestly, this is a terrible example, and we&#8217;ve had very few results, possibly because of the nature (and diminutive size!) of our audience.  Were we to focus on promoting our blog more and making it less &#8220;this-is-what-we-did&#8221; and more &#8220;this-is-what-you-can-do&#8221;, we might see more response, but our priorities lie decidedly elsewhere &#8212; traditional travel blogging: not our bag, baby.</p>

<p>But, I know this can work &#8212; I know it&#8217;s an extreme example, but look at <a href="http://www.stuckincustoms.com/">Trey Ratcliff</a>, the HDR photography authority, and his app <a href="http://www.100camerasin1.com/">100 Cameras In 1</a>. They got onto CNN, ferchrissake, and pretty much every other media outlet you can imagine!</p>

<h3>Paid advertising</h3>

<p>This is the next frontier, for us, and I&#8217;m fairly excited about it.  Everything I&#8217;ve mentioned up to this point has been about &#8220;free media&#8221;, but advertising is a whole new category to explore.</p>

<p>With that said, I&#8217;ve had two initial forays into ads: Facebook, and AdMob, and both have been total failures.</p>

<p><img style="display:block; margin-left:auto; margin-right:auto;" class="aligncenter" src="http://atastypixel.com/blog/wp-content/uploads/2011/10/Screen-Shot-2011-10-07-at-16.55.38.png" alt="Facebook ads" title="Screen Shot 2011-10-07 at 16.55.38.png" border="0" width="540" height="141" /></p>

<p>To an advertiser, Facebook is like a giant damn candy shop. (I felt really weird when I read <a href="http://www.geekculture.com/joyoftech/joyarchives/1594.html">this recent Joy of Tech</a>, and found myself drooling a little bit by the fifth panel…).  The kind of targeting options available are just a-mazing &#8212; you can target people from their age, gender and location, right down to their areas of interest (which is insanely cool), and even down to targeting users who like one particular competitor&#8217;s product.</p>

<p>Despite the cool factor, it turned out to be pretty much a total bust for attempt 1 &#8212; we were paying a stupid amount per click, compared to the actual amount we would earn per sale.  We spent $75, and got…45 clicks.  That&#8217;s $1.60 per click, which represents about 75% of our actual take per sale, and it&#8217;s very unlikely even 10% of those clicks resulted in a sale.</p>

<p>At the time, I was choosing to bid per thousand clicks (CPM), instead of per click (CPC), but the reason I chose to was that the recommended CPC was well above what I was prepared to spend.</p>

<p><img src="http://atastypixel.com/blog/wp-content/uploads/2011/10/Screen-Shot-2011-10-07-at-17.03.36.png" alt="AdMob summary" title="AdMob summary" border="0" width="147" height="300" style="float:right; margin-left: 20px;" class="alignright" />The lesson there is that Facebook users aren&#8217;t ready to buy straight away. A friend who works in advertising reported good results marketing the <em>Facebook page</em> instead of the product, so that users who are interested can hang around for a while, get to know you, and then you can market to them later.  I&#8217;ll try this soon, and I&#8217;m hoping that the mechanics of a social ad (with a &#8220;Like&#8221; button on the ad, instead of a click to navigate away from the current page) will result in higher (and cheaper!) conversions.</p>

<p>I found similar results with AdMob &#8212; we got a much, much better cost per click (I was playing with the minimum bid of 29c per click), but even at 29c/click, in order to break even for our $2.99 app, 1 in 7 people who click the ad would have to buy it, which I think is far-fetched.</p>

<p>So, as far as direct advertising goes: As someone who earns just over $2 per sale, we just can&#8217;t afford it!  My next experiment: Trying to use Facebook to increase our social reach, instead.</p>

<h3>Summary</h3>

<p>It&#8217;s become abundantly clear to us that app promotion is a job in itself, and it&#8217;s one that can scale right up to the amount of time you have available.  They key is to be constantly creative, and to be out there, all the time, chipping away.</p>

<p>Almost everything&#8217;s a shot in the dark, and while many strategies may yield no results at all, some might be a big break (like meeting Dub Fx, for us), so it&#8217;s important to just keep on trying.</p>

<p>Apple give you absolutely no help in tracking the success of any particular strategy, unfortunately, although there are <a href="http://atastypixel.com/blog/automatically-track-app-sale-referrals/">tricks you can use</a> to help track where some of your sales are coming from.</p>

<p>The PR thing is just as important as actually creating the app; it&#8217;s hard, and it&#8217;s constant, and it means that running a software development company is anything but a &#8220;passive income&#8221;.  Fortunately for me, I love it to bits!</p>
 <img src="http://atastypixel.com/blog/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2327" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://atastypixel.com/blog/experiences-with-some-app-promotion-strategies/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Loopy HD is here!</title>
		<link>http://atastypixel.com/blog/loopy-hd-is-here/</link>
		<comments>http://atastypixel.com/blog/loopy-hd-is-here/#comments</comments>
		<pubDate>Wed, 05 Oct 2011 23:00:47 +0000</pubDate>
		<dc:creator>Michael Tyson</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Loopy HD]]></category>

		<guid isPermaLink="false">http://atastypixel.com/blog/?p=2314</guid>
		<description><![CDATA[I’m very pleased to announce that Loopy HD has arrived! A Tasty Pixel HQ has been a-buzz with activity these last few months, and we have a solid iPad live looper with top-notch features to show for it. Loopy HD takes Loopy, doubles the number of tracks to fill up that big iPad display (6, [...]]]></description>
			<content:encoded><![CDATA[<p><img style="display:block; margin-left:auto; margin-right:auto; margin-bottom: 50px;" class="aligncenter" src="http://atastypixel.com/blog/wp-content/uploads/2011/10/loopy-hd-screens.jpg" alt="Loopy HD is here!" title="loopy-hd-screens.jpg" border="0" width="540" height="354" /></p>

<p><img src="http://atastypixel.com/blog/wp-content/uploads/2011/10/loopy-hd-inset1.jpg" alt="Loopy hd inset1" title="loopy-hd-inset1.jpg" border="0" width="194" height="165" style="float:right; margin-left: 30px; margin-bottom: 30px;" class="alignright" />I’m very pleased to announce that <a href="http://loopyapp.com">Loopy HD</a> has arrived! A Tasty Pixel HQ has been a-buzz with activity these last few months, and we have a solid iPad live looper with top-notch features to show for it.</p>

<p>Loopy HD takes Loopy, doubles the number of tracks to fill up that big iPad display (6, 9 or 12 tracks), adds a beautiful big control panel with more session controls, and brings an even more polished audio engine and spot-on time accuracy.</p>

<p>We&#8217;ve got huge plans for this app and it&#8217;s just going to keep getting better. Right around the corner is MIDI support, so you can control the app with a pedal, and sync the tempo with other devices and other apps, over the network or even on the same device. Fun!</p>

<p><a href="http://loopyapp.com/download-hd"><img style="display:block; margin-left:auto; margin-right:auto; margin-top: 40px; margin-bottom: 40px" class="aligncenter" src="http://atastypixel.com/blog/wp-content/uploads/2011/10/app-store.jpg" alt="App store" title="app-store.jpg" border="0" width="137" height="50" /></a></p>

<p>If you already own Loopy, Loopy HD will be on sale for $3.99 for a few days, so you don&#8217;t have to pay full price. We&#8217;ll also be giving away some promo codes from our <a href="http://facebook.com/ATastyPixel">Facebook page</a>, so join us over there if you&#8217;re interested.</p>

<p>We&#8217;ve already given away some promo codes on our <a href="http://atastypixel.com/newsletter">newsletter</a>, but we do this from time to time, so subscribe if you&#8217;d like to nab one the next time.</p>

<p><a href="http://loopyapp.com/download">Loopy</a> has been updated too! Version 2.1 includes all of the improvements to the audio and timing engines from Loopy HD, as well as a smaller version of Loopy HD&#8217;s control panel. There&#8217;s a number of new features, as well, like count-in muting and unmuting, the ability to turn off track sync, and zip file support.</p>

<p>Thanks, Steve.</p>
 <img src="http://atastypixel.com/blog/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2314" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://atastypixel.com/blog/loopy-hd-is-here/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Loopy HD is coming</title>
		<link>http://atastypixel.com/blog/loopy-hd-is-coming/</link>
		<comments>http://atastypixel.com/blog/loopy-hd-is-coming/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 20:58:42 +0000</pubDate>
		<dc:creator>Michael Tyson</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[Demo]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[Loopy]]></category>
		<category><![CDATA[Loopy HD]]></category>
		<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://atastypixel.com/blog/?p=2296</guid>
		<description><![CDATA[Loopy HD is on its way: It will be available on October 6. Stay tuned!]]></description>
			<content:encoded><![CDATA[<iframe width="512" height="377" src="http://www.youtube.com/embed/0iMFZXvCsZQ?rel=0" frameborder="0" allowfullscreen class="aligncenter" style="display: block; margin: 0 auto;"></iframe>

<p>Loopy HD is on its way: It will be available on October 6. Stay tuned!</p>
 <img src="http://atastypixel.com/blog/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2296" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://atastypixel.com/blog/loopy-hd-is-coming/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Using a VirtualBox VM to operate a network device for your Mac</title>
		<link>http://atastypixel.com/blog/using-a-virtualbox-vm-to-operate-a-network-device-for-your-mac/</link>
		<comments>http://atastypixel.com/blog/using-a-virtualbox-vm-to-operate-a-network-device-for-your-mac/#comments</comments>
		<pubDate>Sat, 24 Sep 2011 13:54:15 +0000</pubDate>
		<dc:creator>Michael Tyson</dc:creator>
				<category><![CDATA[Geekspeak]]></category>
		<category><![CDATA[Drivers]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Virtualization]]></category>

		<guid isPermaLink="false">http://atastypixel.com/blog/?p=2292</guid>
		<description><![CDATA[I recently wrote about our long-range USB WiFi antenna over on Technomadics, which is the nifty little device that we use to connect to the Internet while we&#8217;re travelling. It&#8217;s great, but &#8212; and it&#8217;s a kinda large but &#8212; the OS X driver (it&#8217;s an RTL8187) is just mind-blowingly appalling. It crashes very frequently, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://atastypixel.com/blog/wp-content/uploads/2011/09/Screen-Shot-2011-09-24-at-14.37.11.png" alt="VirtualBox running TinyCoreLinux, operating the RTL8187 wifi adapter" title="Screen Shot 2011-09-24 at 14.37.11.png" border="0" width="350" height="215" style="border: 1px solid black; float:right;" class="alignright" />I recently wrote about our long-range USB WiFi antenna over on <a href="http://technomadics.net/2011/07/31/equipment-how-were-staying-connected-to-the-internet-in-europe/">Technomadics</a>, which is the nifty little device that we use to connect to the Internet while we&#8217;re travelling.  It&#8217;s great, but &#8212; and it&#8217;s a kinda large but &#8212; the OS X driver (it&#8217;s an RTL8187) is just mind-blowingly appalling.  It crashes very frequently, I can&#8217;t sleep my Mac at night without unplugging the device, and when I plug the device back in in the morning, nine times out of ten I need to reboot. Plus, I have to run the whole system in 32-bit mode because the driver is ancient.  Realtek refuse to assist, so that&#8217;s that.</p>

<p>Three thousand reboots later, I decided enough was enough, and set about seeing if I could run a virtual machine with a small Linux installation which operated the card on behalf of my Mac, and shared the resulting Internet connection.  It was a long learning curve, but I managed to get it all working quite satisfactorily, along with an Internet Sharing setup on my mac to share the connection onwards to other machines on the local network.</p>

<p>What&#8217;s more, the drivers I&#8217;m using under Linux &#8212; actually, they&#8217;re Windows XP drivers, running under the fantastic <em>ndiswrapper</em> utility &#8212; are brilliant, and I get much better signal strength, stability and throughput, to my great surprise.</p>

<p>If you&#8217;re in a similar situation, and either have a crappy driver to contend with, or no driver at all, or even just want a more solid firewall between you and the dangerous open WiFi world, here&#8217;re some instructions on how to get it set up, along with a virtual appliance I put together to make it all happen.</p>

<p>A warning in advance: This is Linux, so it aint for the faint of heart. If you&#8217;re not familiar with Linux, by all means give it a go, but be forewarned that if everything doesn&#8217;t work for you out-of-the-box, it is a steep learning curve.<span id="more-2292"></span></p>

<p>The virtual appliance is set up by default to run the RTL8187 device using ndiswrapper, but the standard wireless drivers package is installed, and should automatically work with another adapter. If not, let me know and I might be able to assist.</p>

<h3>Step 1: Download</h3>

<p>First, download and install <a href="http://www.virtualbox.org/">VirtualBox</a>, the fantastic and totally free VM software.  You&#8217;ll also want to grab the &#8220;VirtualBox 4.1.2 Oracle VM VirtualBox Extension Pack&#8221;, which brings USB 2.0 support.</p>

<p>Next, download the <a href="http://atastypixel.com/blog/wp-content/uploads/2011/09/Microcore-Router.ova">Microcore Router virtual appliance</a> that I put together (it&#8217;s 45Mb).  This is set up for use with <a href="http://www.tinycorelinux.net/">Microcore Linux</a>, and contains:</p>

<ul>
<li>Wireless device drivers</li>
<li>Ndiswrapper</li>
<li>The Windows XP version of the RTL8187 device driver</li>
<li>iptables, with a script to set up IP masquerading</li>
<li>dnsmasq, set up to provide a DHCP address to your Mac host</li>
<li>Wireless-tools (iwconfig, etc), and WICD</li>
</ul>

<p>Finally, <a href="http://distro.ibiblio.org/tinycorelinux/3.x/archive/3.8.4/distribution_files/microcore_3.8.4.iso">download the Microcore live CD image</a> (the virtual appliance was set up with Microcore 3.8.4 &#8211; if you wish to use newer versions, you&#8217;ll also need to update the extensions, but you&#8217;re on your own there.).</p>

<h3>Step 2: Installation and Setup</h3>

<p>Install VirtualBox, then double-click on the extension pack to install that.  Then, double-click on the <em>Microcore-Router.ova</em> virtual appliance to import it.</p>

<p><img style="display:block; margin-left:auto; margin-right:auto;" class="aligncenter" src="http://atastypixel.com/blog/wp-content/uploads/2011/09/Screen-Shot-2011-09-24-at-14.31.45.png" alt="Importing the virtual appliance" title="Screen Shot 2011-09-24 at 14.31.45.png" border="0" width="580" height="478" /></p>

<p>Next, we need to create a virtual network interface to link the guest virtual machine, and your Mac.  Open VirtualBox preferences, and click the &#8220;Network&#8221; tab.  Click the &#8220;+&#8221; button to create a new host-only network, and enter the settings below (192.168.22.2, netmask 255.255.255.0).  Click the &#8220;DHCP Server&#8221; tab and make sure it&#8217;s disabled, then click OK.  This virtual interface is already selected for use within the VM&#8217;s settings.</p>

<p><img style="display:block; margin-left:auto; margin-right:auto;" class="aligncenter" src="http://atastypixel.com/blog/wp-content/uploads/2011/09/Screen-Shot-2011-09-24-at-14.36.03.png" alt="Setting up the host only network interface" title="Screen Shot 2011-09-24 at 14.36.03.png" border="0" width="540" height="371" /></p>

<p>Now attach the Microcore ISO to the virtual appliance by clicking the &#8220;Storage&#8221; section of the VirtualBox VM settings, then selecting the CD item underneath &#8220;IDE Controller&#8221;, selecting &#8220;Choose a virtual CD/DVD disk file…&#8221;, and choosing the Microcore ISO.  This lets us boot the VM into Microcore.</p>

<p><img style="display:block; margin-left:auto; margin-right:auto;" class="aligncenter" src="http://atastypixel.com/blog/wp-content/uploads/2011/09/Screen-Shot-2011-09-24-at-14.34.30.png" alt="Attaching the Microcore iso to the virtual appliance" title="Screen Shot 2011-09-24 at 14.34.30.png" border="0" width="540" height="356" /></p>

<p><img style="display:block; margin-left:auto; margin-right:auto;" class="aligncenter" src="http://atastypixel.com/blog/wp-content/uploads/2011/09/Screen-Shot-2011-09-24-at-14.34.51.png" alt="Microcore ISO attached to VM" title="Screen Shot 2011-09-24 at 14.34.51.png" border="0" width="336" height="246" /></p>

<p>Finally, if you&#8217;re using a USB network device, plug it in now.  Attach the network device to the VM by opening the &#8220;Ports&#8221; (or &#8220;USB&#8221;) settings, then clicking the USB &#8220;+&#8221; symbol and selecting the device.</p>

<p>Note: I&#8217;ve already added the RTL8187 device to the VM setup, so if you&#8217;ve got one too, you shouldn&#8217;t have to do anything here.</p>

<p><img style="display:block; margin-left:auto; margin-right:auto;" class="aligncenter" src="http://atastypixel.com/blog/wp-content/uploads/2011/09/Screen-Shot-2011-09-29-at-11.02.16.png" alt="USB Ports screen" title="Screen Shot 2011-09-29 at 11.02.16.png" border="0" width="540" height="426" /></p>

<h3>Step 3: Boot VM</h3>

<p>Now, you&#8217;re ready to boot.  Close the settings window and hit &#8220;Start&#8221;.  You should see the Microcore boot screen appear, with a prompt for boot options.</p>

<p><img style="display:block; margin-left:auto; margin-right:auto;" class="aligncenter" src="http://atastypixel.com/blog/wp-content/uploads/2011/09/Screen-Shot-2011-09-24-at-14.35.35.png" alt="Microcore boot screen" title="Screen Shot 2011-09-24 at 14.35.35.png" border="0" width="548" height="353" /></p>

<p>Type the following in, to make Microcore boot with the setup contained within the virtual appliance:</p>

<p><code>mc opt=sda1 restore=sda1</code></p>

<p>If you&#8217;re using an RTL8187 too, then you&#8217;ll want to blacklist the buggy Linux device driver here, so that ndiswrapper can run the device with the improved Windows drivers:</p>

<p><code>mc opt=sda1 restore=sda1 blacklist=rtl8187</code></p>

<p>Hit enter to start booting, and within a few seconds you should be faced with an empty screen and a prompt.</p>

<p>With a bit of luck, your network device has been detected and started up; type <code>wicd-curses</code> and hit enter to launch the WiFi control panel.</p>

<p><img style="display:block; margin-left:auto; margin-right:auto;" class="aligncenter" src="http://atastypixel.com/blog/wp-content/uploads/2011/09/Screen-Shot-2011-09-24-at-14.37.111.png" alt="wicd-curses WiFi control panel" title="Screen Shot 2011-09-24 at 14.37.11.png" border="0" width="540" height="332" /></p>

<p>If you don&#8217;t see any networks here, and you expect to, then it could be that your network device hasn&#8217;t been picked up.  Otherwise, breathe a sigh of relief and press on.</p>

<h3>Step 4: Configure the Mac</h3>

<p>Now that we&#8217;re booted and running the VM, we need to set up your Mac to access the internet via the VM&#8217;s connection.</p>

<p>Minimise the VM window &#8212; we&#8217;re done for now &#8212; and open up a Terminal window on your Mac.  Ping 192.168.22.1, which is the VM&#8217;s configured address.  Do you see ping replies?  Then you&#8217;re almost there.</p>

<p>The final step is to make your Mac use the guest&#8217;s DHCP server, to obtain the correct settings. Type the following in Terminal to make it happen:</p>

<p><code>sudo ipconfig set vboxnet0 DHCP</code></p>

<p>To make sure it&#8217;s done the right thing, type <code>ifconfig vboxnet0</code>. You should see something like:</p>

<p><pre>
vboxnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 0a:00:27:00:00:00 
    inet 192.168.22.2 netmask 0xffffff00 broadcast 192.168.22.255
    inet 192.168.22.72 netmask 0xffffff00 broadcast 192.168.22.255
</pre></p>

<p>That is, the default address we specified when setting up the VirtualBox host adapter, and a new alias that has an address assigned by the DHCP server running within the VM.  If you see this, then you should be good to go: Try opening up a web browser or pinging google.com.</p>

<p>If it&#8217;s working, then congratulations!  Mission accomplished.</p>

<h3>Optional Step 5: Internet Sharing</h3>

<p>For bonus points, you can set up your Mac so that other computers on your network can share the connection.  It&#8217;s not as simple as just starting up Internet Sharing from System Preferences, however, because System Preferences doesn&#8217;t know about the virtual network device we&#8217;re using.</p>

<p>Instead, we have to do it the old-fashioned manual way: Set up IP forwarding, NAT, and set up a DHCP server.  I&#8217;ve created a service (loosely based upon Schley Stauffer Andrew Kutz&#8217;s <a href="http://akutz.wordpress.com/2009/08/20/building-a-better-os-x-firewall-or-how-i-solved-the-nat-problem-for-virtualbox/">akin service</a>) that monitors the VM&#8217;s network state, and automatically does all this, sharing the VM&#8217;s connection via Ethernet and Wi-Fi.</p>

<p>Download the service resources here:</p>

<p><a href="http://atastypixel.com/blog/wp-content/uploads/2012/01/vmboxnat.zip" title="vmboxnat.zip" alt="Vmboxnat">vmboxnat.zip</a></p>

<p>Extract, then go to the folder in Terminal and type:</p>

<p><code>sudo ./install</code></p>

<p>This will install to <code>/usr/local/vmboxnat</code>, and register the service with launchctl.  This is a script which runs in the background and starts up internet sharing when the VM is detected, then stops it when the VM goes away.</p>

<p>If you open up Console now, you should see something like:</p>

<p><pre>
…au.id.tyson.michael.vmboxnat[13099]: Starting vmboxnat
…au.id.tyson.michael.vmboxnat[13099]: assigned DHCP address
…au.id.tyson.michael.vmboxnat[13099]: created alias interfaces
…au.id.tyson.michael.vmboxnat[13099]: enabled ip forwarding
…au.id.tyson.michael.vmboxnat[13099]: enabled natd
…au.id.tyson.michael.vmboxnat[13099]: established ipfw rules
…au.id.tyson.michael.vmboxnat[13099]: enabled bootpd
</pre></p>

<p>That means you&#8217;re all set.</p>

<p>Note that you&#8217;ll need to manually create an ad-hoc WiFi network, as we can&#8217;t automatically create a network the way the official Internet Sharing system does.  Once you&#8217;ve created it, though, other hosts accessing that network should automatically receive an address via DHCP, and be good to go.</p>
 <img src="http://atastypixel.com/blog/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2292" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://atastypixel.com/blog/using-a-virtualbox-vm-to-operate-a-network-device-for-your-mac/feed/</wfw:commentRss>
		<slash:comments>43</slash:comments>
		</item>
		<item>
		<title>Automatically Track App Sale Referrals</title>
		<link>http://atastypixel.com/blog/automatically-track-app-sale-referrals/</link>
		<comments>http://atastypixel.com/blog/automatically-track-app-sale-referrals/#comments</comments>
		<pubDate>Tue, 13 Sep 2011 11:40:56 +0000</pubDate>
		<dc:creator>Michael Tyson</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Geekspeak]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Stats]]></category>
		<category><![CDATA[Tracking]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://atastypixel.com/blog/?p=2275</guid>
		<description><![CDATA[I recently came across an article on Mobile Orchard about connecting click-throughs to app sales, which is a rather ingenious idea using the affiliate program LinkShare to create trackable links. As Apple record and report orders that come via these referral links, you can actually see the number of sales (not just views of the [...]]]></description>
			<content:encoded><![CDATA[<p>I recently came across an article on Mobile Orchard about <a href="http://mobileorchard.com/connecting-click-throughs-to-app-sales/">connecting click-throughs to app sales</a>, which is a rather ingenious idea using the affiliate program <a href="http://linkshare.com">LinkShare</a> to create trackable links.  As Apple record and report orders that come via these referral links, you can actually see the number of sales (not just views of the App Store page) that resulted from follows of the link. Plus you get a 5% cut of the sale!</p>

<p>I&#8217;m doing some experiments with advertising my live looper app <a href="http://loopyapp.com">Loopy</a> lately, and want a way to track the success of various approaches.  It occurred to me that the totally freeform nature of the LinkShare &#8220;signature&#8221; field (which you can use to track traffic sources) lends itself to an even more flexible approach than that presented in the Mobile Orchard article.</p>

<p>Here&#8217;s a way to use that signature field to report the domain name of any referrer who links either to the app page, or to a download link (like, say, http://loopyapp.com/download).</p>

<p>This way, if, say, TUAW link to your app site, if someone clicks through then clicks the download link on your app site and buys, the resulting order will be reported as coming from TUAW.  If someone clicks through from your Facebook page, it&#8217;ll come up as coming from Facebook.  You can even modify the script further to report more precise details (like the path), if you like.</p>

<p>It assumes you&#8217;re using PHP, but the principle&#8217;s the same for any other language (BYO code, though ;-)).</p>

<h3>Step 1: Sign up to LinkShare</h3>

<p>First, if you haven&#8217;t already, <a href="http://click.linksynergy.com/fs-bin/click?id=/yGrgMJzFG0&amp;offerid=7097&amp;type=3&amp;subid=0">Sign up to the LinkShare program</a> &#8212; Once you&#8217;ve created a LinkShare account, join the <a href="http://cli.linksynergy.com/cli/publisher/programs/advertiser_detail.php?oid=146261&amp;mid=13508&amp;offerNid=1&amp;controls=1:1:3:0:0:1">Apple affiliate program</a> via the &#8220;Programs&#8221; tab.  After 3 days, you&#8217;ll get an email welcoming you to the program, and you&#8217;ll be good to go.</p>

<h3>Step 2: Create a product link</h3>

<p>Once you&#8217;re admitted to the program, open up the &#8220;My Advertisers&#8221; sub-tab from the LinkShare Programs tab, and open the &#8220;Link Maker Tool&#8221;. This lets you search for products, and create a link that will open up your app&#8217;s App Store page, and will be associated with your LinkShare account.</p>

<p><img style="display:block; margin-left:auto; margin-right:auto;" class="aligncenter" src="http://atastypixel.com/blog/wp-content/uploads/2011/09/Screen-Shot-2011-09-13-at-13.17.31.png" alt="Screen Shot 2011 09 13 at 13 17 31" title="Screen Shot 2011-09-13 at 13.17.31.png" border="0" width="600" height="475" /></p>

<h3>Step 3: Create a download redirection script</h3>

<p>Now we&#8217;re going to set up a script on your app site which will redirect the visitor to the URL you just created (which in turn, redirects straight to the App Store page).  It&#8217;ll add a &#8220;signature&#8221; parameter to the URL, which corresponds to the original referrer, so you can track where orders came from.</p>

<p>Create a file called &#8216;download.php&#8217; in the root of your app site, with the following content, with your LinkShare URL inserted where indicated:</p>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">// Replace the following URL with the LinkShare URL you created</span>
<span style="color: #000088;">$linkshare_url</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://click.linksynergy.com/fs-bin/stat?id=/yGrgMJzFG0&amp;offerid=146261&amp;type=3&amp;subid=0&amp;tmpid=1826&amp;RD_PARM1=http%253A<span style="color: #009933; font-weight: bold;">%252F</span><span style="color: #009933; font-weight: bold;">%252F</span>itunes.apple.com<span style="color: #009933; font-weight: bold;">%252F</span>app<span style="color: #009933; font-weight: bold;">%252F</span>loopy<span style="color: #009933; font-weight: bold;">%252F</span>id300257824<span style="color: #009933; font-weight: bold;">%253F</span>mt%253D8<span style="color: #009933; font-weight: bold;">%2526u</span>o%253D4%2526partnerId%253D30&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$referer</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'original_referer'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$referer</span> <span style="color: #009900;">&#41;</span> <span style="color: #000088;">$referer</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;HTTP_REFERER&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$referer</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$signature</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;@https?://(?:www\.)?([^/]+?)(?:\.com)?/.*@&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$1</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$referer</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$signature</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;@^(?:www\.)?(.+?)(?:\.com)?$@&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$1</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;HTTP_HOST&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$signature</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;@[^a-zA-Z0-9]@&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$signature</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Location: &quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$linkshare_url</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;&amp;u1=&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$signature</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>


<p>This script looks for the <em>original</em> referrer in a session variable (which we&#8217;ll set up in the next step), so that the domain of the site that links to your app site is used, not just your app site&#8217;s domain.  Then it creates a properly-formatted signature parameter (just alphanumeric), appends it to your LinkShare URL, and sends the viewer onwards.</p>

<p><em>Bonus points</em>: I prefer to get rid of the &#8216;php&#8217; extension to make the URL a bit cleaner.  Pop the following into your .htaccess file to access &#8216;download.php&#8217; as just &#8216;download&#8217;:</p>

<p><pre>
&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule . %{REQUEST_FILENAME}.php [L]
&lt;/IfModule&gt;
</pre></p>

<h3>Step 4: Remember the referrer</h3>

<p>Now, on the landing page script for your app site (or the site header), pop this in at the very start:</p>


<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">session_start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;original_referer&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;original_referer&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;HTTP_REFERER&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>


<p>This stores the original referrer URL in a session variable, to use when we actually link the viewer through to the App Store.</p>

<h3>Step 5: Test it</h3>

<p>To make sure everything&#8217;s working properly, open download.php again, and replace &#8220;header&#8221; at the bottom with &#8220;echo&#8221;, so that instead of redirecting the browser, we just print out the URL where we would be redirecting to.</p>

<p>Open your <em>appsite</em>/download URL, and make sure the URL ends with &#8220;&amp;u1=<em>appsite</em>&#8220;.  That&#8217;s for direct visitors.  Now, click through to your app site from another site, then click your &#8220;download&#8221; link.  You should now see the name of the original site you linked from as the &#8220;u1&#8243; parameter at the end of the URL.</p>

<p>Once you&#8217;re satisfied that you&#8217;re good to go, make sure you replace &#8220;echo&#8221; with &#8220;header&#8221; again.</p>

<h3>Step 6: Track</h3>

<p>Now that you&#8217;re ready to track referrals, you can give out your <em>http://yourappsite/download</em> URL as your app&#8217;s direct iTunes download link (to reviewers, in your press releases, etc).</p>

<p>You can view a report showing clicks and orders associated with each referrer on the LinkShare page &#8212; create an advanced report by clicking the &#8220;Advanced Reports&#8221; sub-tab, then select your desired date range (I use &#8220;Since Last Payment&#8221;, and under &#8220;Report Type&#8221;, select &#8220;Signature Activity&#8221;.  Hit &#8220;View Report&#8221;, and you&#8217;ll see your clicks and sales versus each referrer (&#8220;Member ID&#8221;, on the report).</p>

<p>Voila! Omnipotence achieved.</p>

<p><em>Addendum: This technique works for tracking referrers, but if you&#8217;re wanting to track the performance of ads (say, with AdMob), you&#8217;ll want to use your original LinkShare URL, with a custom &#8220;&amp;u1&#8243; signature parameter.  As ad platforms like AdMob link directly (and don&#8217;t, as far as I know, send a referer parameter), this script won&#8217;t pick up that it&#8217;s from your ad platform.</em></p>

<p><em>Addendum 2: LinkShare&#8217;s reports don&#8217;t distinguish between products, so if you&#8217;ve multiple apps, you might want to add a prefix to your signature parameter to tell &#8216;em apart. You could, say, replace that <code>header("Location: ".$linkshare_url."&amp;u1=".$signature);</code> line with something like <code>header("Location: ".$linkshare_url."&amp;u1=myapp".$signature);</code>.</em></p>
 <img src="http://atastypixel.com/blog/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2275" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://atastypixel.com/blog/automatically-track-app-sale-referrals/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Loopy HD interface preview video</title>
		<link>http://atastypixel.com/blog/loopy-hd-interface-preview-video/</link>
		<comments>http://atastypixel.com/blog/loopy-hd-interface-preview-video/#comments</comments>
		<pubDate>Sat, 10 Sep 2011 09:04:12 +0000</pubDate>
		<dc:creator>Michael Tyson</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[Demo]]></category>
		<category><![CDATA[Loopy HD]]></category>
		<category><![CDATA[Preview]]></category>
		<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://atastypixel.com/blog/?p=2272</guid>
		<description><![CDATA[Here&#8217;s a short preview of Loopy HD&#8217;s interface:]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a short preview of Loopy HD&#8217;s interface:</p>

<iframe width="570" height="427" src="http://www.youtube.com/embed/x_Gi2hzbapk" frameborder="0" style="display:block;margin:0 auto;" class="aligncenter" allowfullscreen></iframe>
 <img src="http://atastypixel.com/blog/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2272" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://atastypixel.com/blog/loopy-hd-interface-preview-video/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On Loopy, and the iPad</title>
		<link>http://atastypixel.com/blog/on-loopy-and-the-ipad/</link>
		<comments>http://atastypixel.com/blog/on-loopy-and-the-ipad/#comments</comments>
		<pubDate>Thu, 08 Sep 2011 12:22:27 +0000</pubDate>
		<dc:creator>Michael Tyson</dc:creator>
				<category><![CDATA[Products]]></category>
		<category><![CDATA[iPad]]></category>
		<category><![CDATA[Loopy]]></category>
		<category><![CDATA[Loopy HD]]></category>
		<category><![CDATA[Universal]]></category>
		<category><![CDATA[Update]]></category>

		<guid isPermaLink="false">http://atastypixel.com/blog/?p=2270</guid>
		<description><![CDATA[Update: Loopy HD is released! If you&#8217;ve been aware of the goings-on at camp A Tasty Pixel lately, you&#8217;ll be aware that Loopy HD is on its way. This is the iPad-friendly version of Loopy, and it&#8217;ll be available on October 6. In advance of the happy occasion, I thought I&#8217;d outline our Master Plan. [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update: <a href="http://loopyapp.com">Loopy HD</a> is released!</strong></p>

<p><img src="http://atastypixel.com/blog/wp-content/uploads/2011/09/loopy-hd-icon.jpg" alt="Loopy hd icon" title="loopy-hd-icon.jpg" border="0" width="278" height="411" style="float:right;" class="alignright" />If you&#8217;ve been aware of the goings-on at camp A Tasty Pixel lately, you&#8217;ll be aware that Loopy HD is on its way.</p>

<p>This is the iPad-friendly version of Loopy, and it&#8217;ll be available on October 6.</p>

<p>In advance of the happy occasion, I thought I&#8217;d outline our Master Plan.</p>

<p>Once Loopy HD is out, there&#8217;ll be two versions of Loopy:</p>

<ul>
<li>Loopy will remain at its low $2.99 price point, and will remain iPhone only.</li>
<li>Loopy HD will be available at a more iPad-esque price point, $7.99, and is targeted specifically at iPad users.  However, Loopy HD will actually be a Universal app, so that iPad users can also use the app on their iPhone without having to purchase the app again.</li>
</ul>

<p>Loopy HD will take advantage of that nice big screen, and will have a configurable number of tracks &#8212; 6, 9 or 12.</p>

<p>To cater for existing iPad owners who have already bought a copy of Loopy, Loopy HD will be available at a dramatically reduced price for launch, so you won&#8217;t have to pay full price &#8212; we&#8217;ll let you know via an in-app message from Loopy (and the usual channels) when it&#8217;s available.</p>

<p>Until then, I&#8217;m getting back to work!</p>

<ul>
<li><a href="http://atastypixel.com/blog/tag/loopy-hd/">More Loopy HD news</a></li>
<li><a href="http://youtu.be/0iMFZXvCsZQ">Watch the Loopy HD preview video</a></li>
<li>Follow us on <a href="http://facebook.com/ATastyPixel">Facebook</a> or <a href="http://twitter.com/ATastyPixel">Twitter</a> for news and giveaways</li>
</ul>
 <img src="http://atastypixel.com/blog/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2270" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://atastypixel.com/blog/on-loopy-and-the-ipad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Experiments with precise timing in iOS</title>
		<link>http://atastypixel.com/blog/experiments-with-precise-timing-in-ios/</link>
		<comments>http://atastypixel.com/blog/experiments-with-precise-timing-in-ios/#comments</comments>
		<pubDate>Wed, 07 Sep 2011 16:31:18 +0000</pubDate>
		<dc:creator>Michael Tyson</dc:creator>
				<category><![CDATA[Geekspeak]]></category>
		<category><![CDATA[Audio]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Timing]]></category>

		<guid isPermaLink="false">http://atastypixel.com/blog/?p=2265</guid>
		<description><![CDATA[iOS is by no means a realtime operating system, but I&#8217;m aware that NSTimer and NSObject&#8217;s performSelector:withObject:afterDelay: mechanism aren&#8217;t particularly accurate, and I was curious to see whether I could do better. Hands up, backing away Disclaimer: I am not at all an expert in realtime programming, or Mach, or iOS-device optimisation, so this is [...]]]></description>
			<content:encoded><![CDATA[<p>iOS is by no means a realtime operating system, but I&#8217;m aware that NSTimer and NSObject&#8217;s <em>performSelector:withObject:afterDelay:</em> mechanism aren&#8217;t particularly accurate, and I was curious to see whether I could do better.</p>

<h3>Hands up, backing away</h3>

<p>Disclaimer: I am not at all an expert in realtime programming, or Mach, or iOS-device optimisation, so this is pretty much a fumble in the dark.   I won&#8217;t be at all offended if anyone wishes to shoot me down and offer a more sensible solution &#8212; in fact, please do! Until then, watch as I stumble on…</p>

<p>Also note that there are often ways to eliminate the need for precise timing of this nature, by architecting code appropriately &#8212; when it comes to audio, for example, CoreAudio provides a very accurate time base in render callbacks.  For things like metronomes or audio synthesizers, it&#8217;s always better to establish a starting time, and use the difference between the current time and the starting time in order to determine state, rather than using a timer to advance the state.  Still, sometimes, you just need a timer…</p>

<h3>What the blazes?</h3>

<p>So, I&#8217;m working on an update to <a href="http://loopyapp.com">Loopy</a>, which uses a shared clock object to synchronise tracks and a variety of events (like user interface updates or timed track manipulations).  A tester noted that the mute/unmute quantisation feature that I&#8217;ve recently implemented, which will mute or unmute a loop at its starting point (rather than whenever you tap it), tends to overshoot a little, resulting in a small part of the beginning of the loop being audible.</p>

<p>Of course, there are other solutions to this particular problem (like stopping or starting playback from the audio render callback, and using Core Audio&#8217;s timestamps for exact timing), but I use timers in other places outside Core Audio&#8217;s domain, which makes Core Audio&#8217;s timing mechanism unavailable, and I wanted to see how accurate I could get the timing.</p>

<h3>Our friend, <em>mach_wait_until</em></h3>

<p>I read in several places mention of the Mach API utility <em>mach_wait_until</em> (from <em>mach/mach_time.h</em>), which is very low-level and supposedly fairly accurate.  So, based on that lead, I put together an Objective-C singleton class that launches a high-priority thread, and uses said thread to schedule events.</p>

<p>An NSArray of events are maintained, and a <em>scheduleAction:target:inTimeInterval:</em> routine creates and adds events to this array, then pokes the thread.</p>

<p>The thread grabs the next event in sequence, then uses <em>mach_wait_until</em> to sleep until the time of the next event arrives, then performs the specified action on the target.  It&#8217;s kinda a DIY NSRunLoop.</p>

<p>Here&#8217;s a comparison between this technique, and just using <em>performSelector:withObject:afterDelay:</em> (which schedules a timer on the NSRunLoop), observed while performing various scheduled events within Loopy running on my iPhone 4 with the debugger, and derived by comparing the time of event execution with the event&#8217;s scheduled time:</p>

<table>
<tr><th>Mechanism</th><th>Average discrepancy</th><th>Minimum discrepancy</th><th>Maximum discrepancy</th></tr>
<tr><td><strong>NSRunLoop</strong></td><td>16.9ms</td><td>0.25ms</td><td>153.7ms</td></tr>
<tr><td><strong>TPPreciseTimer</strong></td><td>5.5ms</td><td>0.033ms</td><td>72.0ms</td></tr>
</table>

<p>That was attempt number 1: This seems to give us about 11.4ms better accuracy on average (three times more accurate).</p>

<p>Not bad, but it turns out <em>mach_wait_until</em> isn&#8217;t really that accurate, particularly if there&#8217;s a bunch of other stuff going on in other threads.</p>

<h3>Spinning, for fun and profit</h3>

<p>For my second attempt, the thread performs a <em>mach_wait_until</em> until just before the event is due, then performs a spin lock until the time arrives, using <em>mach_absolute_time</em> to compare the current time with the target time.</p>

<p>This gave further improved results &#8212; here&#8217;s that table again, but with the new scheme added, with a few different spin lock times:</p>

<table>
<tr><th>Mechanism</th><th>Average discrepancy</th><th>Minimum discrepancy</th><th>Maximum discrepancy</th></tr>
<tr><td><strong>NSRunLoop</strong></td><td>16.9ms</td><td>0.25ms</td><td>153.7ms</td></tr>
<tr><td><strong>TPPreciseTimer (original)</strong></td><td>5.5ms</td><td>0.033ms</td><td>72.0ms</td></tr>
<tr><td><strong>TPPreciseTimer (10ms spinlock)</strong></td><td>6.0ms</td><td>0.002ms</td><td>76.5ms</td></tr>
<tr><td><strong>TPPreciseTimer (100ms spinlock)</strong></td><td>3.7ms</td><td>0.002ms</td><td>44.8ms</td></tr>
<tr><td><strong>TPPreciseTimer (200ms spinlock)</strong></td><td>2.91ms</td><td>0.002ms</td><td>74.1ms</td></tr>
</table>

<p>It appears that the more stuff there is going on in other threads, the more likely the <em>mach_absolute_time</em> call is to overshoot.  So, the more time spent in the spin lock, the more leeway <em>mach_absolute_time</em> has to wait too long.  Of course, that&#8217;s at the cost of making the CPU twiddle its thumbs for the duration.</p>

<h3>Better than a punch in the knee</h3>

<p>The results weren&#8217;t quite as fantastic as I&#8217;d hoped &#8212; still within the same order of magnitude, that&#8217;s for sure &#8212; but the average case for the 200ms spinlock approach is 14ms, or 5.8 times, more accurate than the traditional approach, and the minimum case is dramatically better.</p>

<p>You know, I think if I was aware of the results in advance, I might not bother, but I&#8217;ll stick with my hard-won 14ms now that I&#8217;m here (that&#8217;s 617 audio samples, I&#8217;ll have you know).</p>

<p>If anyone&#8217;s curious about the implementation (or wants to take a stab at doing better), here it is, along with a wildly simplistic commandline test app: <a href="http://atastypixel.com/blog/wp-content/uploads/2011/09/TPPreciseTimer.zip" title="TPPreciseTimer.zip" alt="TPPreciseTimer">TPPreciseTimer.zip</a></p>

<p>Now to get back to some real work.</p>

<h3>Addendum: GCD follow-up</h3>

<p>Chris in the comments below suggested trying a GCD-based approach, using <em>dispatch_after</em>.  Curious, I rigged it up, and these are the stats, collected the same way as above, added to the prior table:</p>

<table>
<tr><th>Mechanism</th><th>Average discrepancy</th><th>Minimum discrepancy</th><th>Maximum discrepancy</th></tr>
<tr><td><strong>NSRunLoop</strong></td><td>16.9ms</td><td>0.25ms</td><td>153.7ms</td></tr>
<tr><td><strong>TPPreciseTimer (original)</strong></td><td>5.5ms</td><td>0.033ms</td><td>72.0ms</td></tr>
<tr><td><strong>TPPreciseTimer (10ms spinlock)</strong></td><td>6.0ms</td><td>0.002ms</td><td>76.5ms</td></tr>
<tr><td><strong>TPPreciseTimer (100ms spinlock)</strong></td><td>3.7ms</td><td>0.002ms</td><td>44.8ms</td></tr>
<tr><td><strong>TPPreciseTimer (200ms spinlock)</strong></td><td>2.91ms</td><td>0.002ms</td><td>74.1ms</td></tr>
<tr><td><strong>dispatch_after (main queue)</strong></td><td>14.8ms</td><td>0.16ms</td><td>161.2ms</td></tr>
<tr><td><strong>dispatch_after (dedicated queue)</strong></td><td>19.2ms</td><td>0.1ms</td><td>174.9ms</td></tr>
<tr><td><strong>dispatch_after (dedicated queue + 100ms spinlock)</strong></td><td>22.4ms</td><td>0.002ms</td><td>306.8ms</td></tr>
</table>

<p>So, they appear pretty much the same as the NSRunLoop stats.</p>
 <img src="http://atastypixel.com/blog/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=2265" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://atastypixel.com/blog/experiments-with-precise-timing-in-ios/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
	</channel>
</rss>

