<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
<channel>
<title><![CDATA[ Tony Wallace Woodworks ]]></title>
<description><![CDATA[ Guitars and Woodwork, Handmade in Canada 🍁 ]]></description>
<link>https://tonywallace.com</link>
<image>
    <url>https://tonywallace.com/favicon.png</url>
    <title>Tony Wallace Woodworks</title>
    <link>https://tonywallace.com</link>
</image>
<lastBuildDate>Thu, 17 Sep 2026 20:16:26 +0000</lastBuildDate>
<atom:link href="https://tonywallace.com" rel="self" type="application/rss+xml"/>
<ttl>60</ttl>

    <item>
        <title><![CDATA[ How to Build a Go-Bar Deck for as Little Money as Possible ]]></title>
        <description><![CDATA[ A go-bar deck can be a great solution to a variety of unusual clamping problems. Here&#39;s how to make one on the cheap. ]]></description>
        <link>https://tonywallace.com/how-to-build-a-go-bar-deck-for-as-little-money-as-possible/</link>
        <guid isPermaLink="false">6a91dfe3f2bc8f0001f953b9</guid>
        <category><![CDATA[ Woodworking ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Thu, 17 Sep 2026 13:16:22 +0000</pubDate>
        <media:content url="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/09/go-bar-deck-feature.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<aside class="gh-post-upgrade-cta">
    <div class="gh-post-upgrade-cta-content" style="background-color: #6795cb">
                <h2>This post is for subscribers only</h2>
            <a class="gh-btn" data-portal="signup" href="#/portal/signup" style="color:#6795cb">Subscribe now</a>
            <p><small>Already have an account? <a data-portal="signin" href="#/portal/signin">Sign in</a></small></p>
    </div>
</aside>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Project Archive: Bookbinder&#x27;s Press ]]></title>
        <description><![CDATA[ A custom bookbinder&#39;s press with a screw action and swappable top plates. ]]></description>
        <link>https://tonywallace.com/project-archive-bookbinders-press/</link>
        <guid isPermaLink="false">6a9970ebb3345100014fdce5</guid>
        <category><![CDATA[ Woodwork ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Thu, 10 Sep 2026 21:18:49 +0000</pubDate>
        <media:content url="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/09/bookbinders-press-feature.webp" medium="image"/>
        <content:encoded><![CDATA[ <p>My partner Vanessa practices bookbinding as a hobby. Last Christmas I made her a bookbinder's press to replace the stack of books and gym weights she was using. The press is built around a 12" <a href="https://www.ponyjorgensen.com/product/pony-press-screws/?ref=tonywallace.com" rel="noreferrer">Pony press screw</a> and has a maximum travel of roughly 6". </p><p>The frame consists of two beams stabilized by two uprights. The beams and uprights are 3" by 2" and laminated from two layers of maple for additional strength. The joints between them are dowelled. </p><p>The baseplate and plinth are 12" by 15" and made of 18mm baltic birch plywood. The baseplate is screwed to the bottom of the frame and supports front and rear walls made of 1" thick maple. The plinth is grooved so it registers with the walls but is otherwise free-floating. It rests directly upon the bottom beam so the frame absorbs all the force from the screw. The walls are only there to keep the plinth in place.</p><p>The press has three top plates of various sizes, to accommodate paper up to 5x7", 8x10" or 11x14". When pressing larger paper, the smaller top plates can be stacked on top of the larger ones to help distribute force. (As shown, the two smaller plates are stacked on top of the paper being pressed, and the large plate is below.)</p><p>All surfaces are finished with Osmo Polyx hard wax oil in the gloss sheen.</p><p>I would be happy to make more presses like this, so if you're a bookbinder please <a href="mailto:shop@tonywallace.com" rel="noreferrer">contact me</a> for details.</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Website Updates for September 2026 ]]></title>
        <description><![CDATA[ Changes to the Tony Wallace Woodworks website. ]]></description>
        <link>https://tonywallace.com/website-updates-for-september-2026/</link>
        <guid isPermaLink="false">6aa1c769594dae00014c3883</guid>
        <category><![CDATA[ News ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Wed, 09 Sep 2026 21:08:37 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>I just completed a series of updates to the Tony Wallace Woodworks website. Here's the changelog:</p><ul><li>Design refresh! (It's largely the same as before, but tightened up a bit.)</li><li>New channels for <a href="https://tonywallace.com/tag/guitars/" rel="noreferrer">Guitars</a> and <a href="https://tonywallace.com/tag/woodwork/" rel="noreferrer">Woodwork</a> that make examples of my work more prominent.</li><li>A new <a href="https://tonywallace.com/services/" rel="noreferrer">Services</a> page.</li></ul><p>In addition to these changes, I've decided to require a (free) subscription for most of my longer form writing, like tutorials. You can read why <a href="https://tonywallace.com/why-subscribe/" rel="noreferrer">here</a>. If you received this post by email, you're already subscribed.</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Reclaimed Wood: August 2026 ]]></title>
        <description><![CDATA[ A recap of my Instagram posts for August 2026. ]]></description>
        <link>https://tonywallace.com/reclaimed-wood-august-2026/</link>
        <guid isPermaLink="false">6a972d4fdd33040001ca75e7</guid>
        <category><![CDATA[ Instagram ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Tue, 01 Sep 2026 20:01:45 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>This is the latest in a series of monthly Instagram recaps for <a href="https://www.instagram.com/tonywallacewoodworks?ref=tonywallace.com" rel="noreferrer">@tonywallacewoodworks</a>. You can see the previous recap from July <a href="https://tonywallace.com/reclaimed-wood-june-2026-2/" rel="noreferrer">here</a>. </p>
<!--kg-card-begin: html-->
<ul class="ic-instagram-embed">
  <li><a href="https://www.instagram.com/p/DbmAG2MEdyp?ref=tonywallace.com" target="_blank">Reusable bag drying racks</a></li>
  <li><a href="https://www.instagram.com/p/DbrTz4yu-zs?ref=tonywallace.com" target="_blank">Fretting with the Fractal Fret Press</a></li>
  <li><a href="https://www.instagram.com/p/Db6pU6qRAf5?ref=tonywallace.com" target="_blank">Small manual screwdriver</a></li>
  <li><a href="https://www.instagram.com/p/DcM2PDNjvNM?ref=tonywallace.com" target="_blank">T-style guitars with new custom necks</a></li>
  <li><a href="https://www.instagram.com/p/DcRtPoapm2E?ref=tonywallace.com" target="_blank">Reusable bag drying rack (again)</a></li>
  <li><a href="https://www.instagram.com/reel/DcjsIP2pcY2?ref=tonywallace.com" target="_blank">Using a cabinet installation jack as a drill press table lift</a></li>
</ul>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ My Favourite Drill Press Mods ]]></title>
        <description><![CDATA[ The best quality-of-life upgrades I&#39;ve made to my old Rockwell/Beaver radial drill press. ]]></description>
        <link>https://tonywallace.com/my-favourite-drill-press-mods/</link>
        <guid isPermaLink="false">6a8f1cd9c363af0001c2c8fb</guid>
        <category><![CDATA[ Woodworking ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Wed, 26 Aug 2026 21:38:25 +0000</pubDate>
        <media:content url="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/08/drill-press-mods-feature.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<aside class="gh-post-upgrade-cta">
    <div class="gh-post-upgrade-cta-content" style="background-color: #6795cb">
                <h2>This post is for subscribers only</h2>
            <a class="gh-btn" data-portal="signup" href="#/portal/signup" style="color:#6795cb">Subscribe now</a>
            <p><small>Already have an account? <a data-portal="signin" href="#/portal/signin">Sign in</a></small></p>
    </div>
</aside>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ T-Style Guitar Builds One and Two ]]></title>
        <description><![CDATA[ I built these two T-style guitars last year but didn’t really consider them to be finished because I used aftermarket necks as placeholders until I could build my own. Well, now they’re finished. ]]></description>
        <link>https://tonywallace.com/t-style-guitar-builds-one-and-two/</link>
        <guid isPermaLink="false">6a86118a4766f70001e8c402</guid>
        <category><![CDATA[ Guitarmaking ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Wed, 19 Aug 2026 20:57:12 +0000</pubDate>
        <media:content url="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/08/t-style-builds-feature.webp" medium="image"/>
        <content:encoded><![CDATA[ <p>I built these two T-style guitars last year but didn’t really consider them to be finished because I used aftermarket necks as placeholders until I could build my own. Well, now they’re finished.<br><br>Over the last week I’ve upgraded both guitars with necks of my own construction and given them full setups. Here are the specs:</p><h2 id="build-one-green">Build One (Green)</h2><p><br><strong>Body:</strong> Swamp ash<br><strong>Finish</strong>:&nbsp;Lee Valley aniline dye in forest green, Osmo&nbsp;Polyx (satin) and Walrus Oil&nbsp;furniture wax.<br><strong>Pickguard:</strong> Curly maple finished with Osmo Polyx (satin)<br><strong>Neck:</strong> Riftsawn walnut with a quartersawn white oak fretboard and walnut face markers, finished with Osmo Polyx. The fretboard is pore-filled with CA glue for a hard finish, similar to a lacquered maple fretboard.<br><strong>Pickups:</strong> Fender American Vintage ‘52 Telecaster<br><strong>Bridge:</strong> Wilkinson by Gotoh WT3<br><strong>Tuners:</strong>&nbsp;Gotoh SD381-MG-T 6-in-line locking<br><strong>Fretboard radius: </strong>16”<br><strong>Weight:</strong> 7lbs, 9oz.</p><h2 id="build-two-blue">Build Two (Blue)</h2><p><br><strong>Body:</strong> Maple<br><strong>Finish:</strong> Lee Valley aniline dye in peacock blue, Osmo&nbsp;Polyx (satin) and Walrus Oil&nbsp;furniture wax.<br><strong>Neck:</strong> Riftsawn mahogany with a canarywood fretboard and padauk face markers, finished with Osmo Polyx.<br><strong>Pickups:</strong>&nbsp;StewMac&nbsp;“The Standard Telecaster”<br><strong>Bridge:</strong> Gotoh GTC201<br><strong>Tuners:</strong>&nbsp;Gotoh SD381-MG-T 6-in-line locking<br><strong>Fretboard radius: </strong>16”<br><strong>Weight:</strong> 9lbs, 6oz.</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ How to Intonate the Wilkinson by Gotoh WT3 Bridge ]]></title>
        <description><![CDATA[ Unlike a traditional 3-saddle bridge, the Wilkinson by Gotoh WT3 has saddles that pivot so you can adjust the intonation of each string separately. It&#39;s a process of trial and error that requires some patience. Here&#39;s how to do it. ]]></description>
        <link>https://tonywallace.com/how-to-intonate-the-wilkinson-by-gotoh-wt3-bridge/</link>
        <guid isPermaLink="false">6a84bc7de1af9900010f1cfd</guid>
        <category><![CDATA[ Guitarmaking ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Tue, 18 Aug 2026 20:26:06 +0000</pubDate>
        <media:content url="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/08/gotoh-wt3-feature.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<aside class="gh-post-upgrade-cta">
    <div class="gh-post-upgrade-cta-content" style="background-color: #6795cb">
                <h2>This post is for subscribers only</h2>
            <a class="gh-btn" data-portal="signup" href="#/portal/signup" style="color:#6795cb">Subscribe now</a>
            <p><small>Already have an account? <a data-portal="signin" href="#/portal/signin">Sign in</a></small></p>
    </div>
</aside>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Improving Accuracy at the Drill Press ]]></title>
        <description><![CDATA[ Controlling your approach is key to accuracy with a drill press. This guide will help you improve your technique and get consistent, repeatable results. ]]></description>
        <link>https://tonywallace.com/improving-accuracy-at-the-drill-press/</link>
        <guid isPermaLink="false">6a732de2afb11d00014edc11</guid>
        <category><![CDATA[ Woodworking ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Fri, 07 Aug 2026 13:00:17 +0000</pubDate>
        <media:content url="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/08/drill-press-feature.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<aside class="gh-post-upgrade-cta">
    <div class="gh-post-upgrade-cta-content" style="background-color: #6795cb">
                <h2>This post is for subscribers only</h2>
            <a class="gh-btn" data-portal="signup" href="#/portal/signup" style="color:#6795cb">Subscribe now</a>
            <p><small>Already have an account? <a data-portal="signin" href="#/portal/signin">Sign in</a></small></p>
    </div>
</aside>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Reusable Bag Drying Racks ]]></title>
        <description><![CDATA[ Drying racks for reusable bags and Swedish dish cloths, now available in my online store. ]]></description>
        <link>https://tonywallace.com/reusable-bag-drying-racks/</link>
        <guid isPermaLink="false">6a7320a5afb11d00014edbc4</guid>
        <category><![CDATA[ Woodwork ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Wed, 05 Aug 2026 13:00:55 +0000</pubDate>
        <media:content url="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/08/reusable-bag-drying-racks-feature.webp" medium="image"/>
        <content:encoded><![CDATA[ <p>We started using reusable, resealable bags a few years ago, and also try to reuse disposable bags as much as we can. The trouble with these bags is that they're annoying to dry after washing. You have to find some way to hold them open so they can air out. I made a drying rack for reusable bags to solve this problem. After using it for a few years, we've also found that it works well to dry reusable Swedish dish cloths. </p><p>I've made a batch of these racks for my <a href="https://tonywallacewoodworks.square.site/shop/reusable-bag-drying-racks/MASK77RST3NU3C7BT5NV4FSL?ref=tonywallace.com" rel="noreferrer">online store</a>. They're available in two sizes. The <a href="https://tonywallacewoodworks.square.site/product/reusable-bag-drying-rack-small/TGAPLFLLMBJKIWQMGDI4HQZ5?ref=tonywallace.com" rel="noreferrer">smaller rack</a> is good for small and medium size bags, and for Swedish dish cloths. The <a href="https://tonywallacewoodworks.square.site/product/reusable-bag-drying-rack-large/CRTFJ2FPIZ5FFN37QIPIHRBA?ref=tonywallace.com" rel="noreferrer">larger rack</a> will do everything the smaller one does and handle larger bags up to 30cm (12") deep. </p><div class="kg-card kg-button-card kg-align-center"><a href="https://tonywallacewoodworks.square.site/shop/reusable-bag-drying-racks/MASK77RST3NU3C7BT5NV4FSL?ref=tonywallace.com" class="kg-btn kg-btn-accent">Shop Reusable Bag Drying Racks</a></div><p></p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Reclaimed Wood: July 2026 ]]></title>
        <description><![CDATA[ A recap of my Instagram posts for July 2026. ]]></description>
        <link>https://tonywallace.com/reclaimed-wood-june-2026-2/</link>
        <guid isPermaLink="false">6a6df1ab78000d000133d39a</guid>
        <category><![CDATA[ Instagram ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Sat, 01 Aug 2026 13:34:05 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>This is the latest in a series of monthly Instagram recaps for <a href="https://www.instagram.com/tonywallacewoodworks?ref=tonywallace.com" rel="noreferrer">@tonywallacewoodworks</a>. You can see the previous recap from June <a href="https://tonywallace.com/reclaimed-wood-june-2026/" rel="noreferrer">here</a>. </p><p>The <a href="https://tonywallacewoodworks.square.site/product/tea-light-tray-07-2026/IIPNACBOSI7DHU25KYTGGPOG?cs=true&cst=custom&ref=tonywallace.com" rel="noreferrer">tealight tray</a> and <a href="https://tonywallacewoodworks.square.site/product/bud-vase-and-organizer-07-2026/4QWF7NBTQSRNKD2GWOS5B22Z?cs=true&cst=custom&ref=tonywallace.com" rel="noreferrer">bud vase/organizer</a> shown below are currently available in my new <a href="https://tonywallacewoodworks.square.site/?ref=tonywallace.com" rel="noreferrer">online store</a>.</p>
<!--kg-card-begin: html-->
<ul class="ic-instagram-embed">
  <li><a href="https://www.instagram.com/p/DaWGKCJy3NO?ref=tonywallace.com" target="_blank">Tealight Tray</a></li>
  <li><a href="https://www.instagram.com/p/DaWGgQrS4nU?ref=tonywallace.com" target="_blank">Bud Vase/Organizer</a></li>
  <li><a href="https://www.instagram.com/p/DagnaWmjpGC?ref=tonywallace.com" target="_blank">Neck carving &mdash; the best part of the guitarmaking process</a></li>
  <li><a href="https://www.instagram.com/p/DajKLllDl6X?ref=tonywallace.com" target="_blank">Repairing small dents with steam</a></li>
  <li><a href="https://www.instagram.com/reel/Dan_m2TJxjv?ref=tonywallace.com" target="_blank">Thinning a guitar headstock</a></li>
  <li><a href="https://www.instagram.com/p/DbHI8QhESbp?ref=tonywallace.com" target="_blank">A Firebird-esque top profile on a new guitar body prototype</a></li>
  <li><a href="https://www.instagram.com/p/DbJhP5uiQQN?ref=tonywallace.com" target="_blank">Progress on a new guitar body prototype</a></li>
  <li><a href="https://www.instagram.com/p/DbY_10miefR?ref=tonywallace.com" target="_blank">Arm carve on a new guitar body prototype</a></li>
  <li><a href="https://www.instagram.com/p/DbZByvWCaVB?ref=tonywallace.com" target="_blank">Belly carve on a new guitar body prototype</a></li>
</ul>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ The Tony Wallace Woodworks Online Store ]]></title>
        <description><![CDATA[ Announcing my new online store. ]]></description>
        <link>https://tonywallace.com/the-tony-wallace-woodworks-online-store/</link>
        <guid isPermaLink="false">6a68e86ea09c7a00014a3805</guid>
        <category><![CDATA[ News ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Tue, 28 Jul 2026 18:00:04 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>I just launched an online store to sell some of my smaller pieces. You can have a look <a href="https://tonywallacewoodworks.square.site/?ref=tonywallace.com" rel="noreferrer">here</a>. Shipping for online orders is only available in Canada for the time being. If you would like to place an order from outside Canada, <a href="mailto:shop@tonywallace.com" rel="noreferrer">contact me</a> and we'll figure it out.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://tonywallacewoodworks.square.site/?ref=tonywallace.com" class="kg-btn kg-btn-accent">Visit the store</a></div><p></p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Project Archive: Side Panels for Vintage HiFi Equipment ]]></title>
        <description><![CDATA[ Replacement side panels for a vintage Sony tuner. ]]></description>
        <link>https://tonywallace.com/project-archive-side-panels-for-vintage-hifi-equipment/</link>
        <guid isPermaLink="false">6a4679a0389ef00001b05250</guid>
        <category><![CDATA[ Woodwork ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Fri, 03 Jul 2026 13:00:27 +0000</pubDate>
        <media:content url="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/07/sony-tuner-feature.webp" medium="image"/>
        <content:encoded><![CDATA[ <p>I wrote in March about a set of <a href="https://tonywallace.com/project-archive-floor-speaker-stands/" rel="noreferrer">walnut floor speaker stands</a> I made for a customer. He recently asked me to replace the worn out side panels on his 1978 Sony ST-A3A AM/FM tuner with solid walnut to match the stands. He found the tuner at a thrift store and the edge veneers had peeled off the original particleboard side panels. This was a simple and fun project – rectangular panels with carefully positioned and counterbored mounting holes, and a little rabbet routed into the front edge to accommodate the control panel. Honestly, the hardest part was trying to find decent quality walnut that was milled from a mature tree and wasn't half sapwood*. (That didn't work out very well so I had to be very careful about how I used the wood I had. On the plus side, I got a <a href="https://www.instagram.com/p/DZvNZl4RJGL?ref=tonywallace.com" rel="noreferrer">pretty cool bookmatched panel</a> out of the remainder.) </p><p>I was careful to match all dimensions to the originals so the panels would be as close to a perfect reproduction as possible. The mounting holes and counterbores seem unnecessarily large at first, but the original manufacturing tolerances were probably a bit loose and 48 years of handling certainly hasn't helped. Larger holes allow a bit of play to better align the side panels to the control panel.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/07/sony-tuner-counterbore.webp" class="kg-image" alt="An image showing the large counterbores in the side panels." loading="lazy" width="2000" height="1125" srcset="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w600/2026/07/sony-tuner-counterbore.webp 600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1000/2026/07/sony-tuner-counterbore.webp 1000w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1600/2026/07/sony-tuner-counterbore.webp 1600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/07/sony-tuner-counterbore.webp 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">A test fit before finishing demonstrates the need for large counterbores in the side panels.</span></figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/07/sony-tuner-alignment.webp" class="kg-image" alt="An image showing the alignment of the side panel to the control panel." loading="lazy" width="2000" height="1125" srcset="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w600/2026/07/sony-tuner-alignment.webp 600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1000/2026/07/sony-tuner-alignment.webp 1000w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1600/2026/07/sony-tuner-alignment.webp 1600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/07/sony-tuner-alignment.webp 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Alignment of the side panel to the control panel. For scale, the control panel is about 3mm (1/8") thick. </span></figcaption></figure><p>The Instagram reel shows how much this simple upgrade improved the tuner's appearance:</p>
<!--kg-card-begin: html-->
<figure class="ic-figure-centered">
  <blockquote class="instagram-media" data-instgrm-permalink="https://www.instagram.com/reel/DZxLDuPOPPV/?utm_source=ig_embed&amp;utm_campaign=loading" data-instgrm-version="14" style=" background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:540px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);"><div style="padding:16px;"> <a href="https://www.instagram.com/reel/DZxLDuPOPPV/?utm_source=ig_embed&utm_campaign=loading" style=" background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%;" target="_blank"> <div style=" display: flex; flex-direction: row; align-items: center;"> <div style="background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;"></div> <div style="display: flex; flex-direction: column; flex-grow: 1; justify-content: center;"> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;"></div> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;"></div></div></div><div style="padding: 19% 0;"></div> <div style="display:block; height:50px; margin:0 auto 12px; width:50px;"><svg width="50px" height="50px" viewBox="0 0 60 60" version="1.1" xmlns="https://www.w3.org/2000/svg" xmlns:xlink="https://www.w3.org/1999/xlink"><g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g transform="translate(-511.000000, -20.000000)" fill="#000000"><g><path d="M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 563.154,70.057 562.106,71.106 C561.058,72.155 560.06,72.803 558.662,73.347 C557.607,73.757 556.021,74.244 553.102,74.378 C549.944,74.521 548.997,74.552 541,74.552 C533.003,74.552 532.056,74.521 528.898,74.378 C525.979,74.244 524.393,73.757 523.338,73.347 C521.94,72.803 520.942,72.155 519.894,71.106 C518.846,70.057 518.197,69.06 517.654,67.663 C517.244,66.606 516.755,65.022 516.623,62.101 C516.479,58.943 516.448,57.996 516.448,50 C516.448,42.003 516.479,41.056 516.623,37.899 C516.755,34.978 517.244,33.391 517.654,32.338 C518.197,30.938 518.846,29.942 519.894,28.894 C520.942,27.846 521.94,27.196 523.338,26.654 C524.393,26.244 525.979,25.756 528.898,25.623 C532.057,25.479 533.004,25.448 541,25.448 C548.997,25.448 549.943,25.479 553.102,25.623 C556.021,25.756 557.607,26.244 558.662,26.654 C560.06,27.196 561.058,27.846 562.106,28.894 C563.154,29.942 563.803,30.938 564.346,32.338 C564.756,33.391 565.244,34.978 565.378,37.899 C565.522,41.056 565.552,42.003 565.552,50 C565.552,57.996 565.522,58.943 565.378,62.101 M570.82,37.631 C570.674,34.438 570.167,32.258 569.425,30.349 C568.659,28.377 567.633,26.702 565.965,25.035 C564.297,23.368 562.623,22.342 560.652,21.575 C558.743,20.834 556.562,20.326 553.369,20.18 C550.169,20.033 549.148,20 541,20 C532.853,20 531.831,20.033 528.631,20.18 C525.438,20.326 523.257,20.834 521.349,21.575 C519.376,22.342 517.703,23.368 516.035,25.035 C514.368,26.702 513.342,28.377 512.574,30.349 C511.834,32.258 511.326,34.438 511.181,37.631 C511.035,40.831 511,41.851 511,50 C511,58.147 511.035,59.17 511.181,62.369 C511.326,65.562 511.834,67.743 512.574,69.651 C513.342,71.625 514.368,73.296 516.035,74.965 C517.703,76.634 519.376,77.658 521.349,78.425 C523.257,79.167 525.438,79.673 528.631,79.82 C531.831,79.965 532.853,80.001 541,80.001 C549.148,80.001 550.169,79.965 553.369,79.82 C556.562,79.673 558.743,79.167 560.652,78.425 C562.623,77.658 564.297,76.634 565.965,74.965 C567.633,73.296 568.659,71.625 569.425,69.651 C570.167,67.743 570.674,65.562 570.82,62.369 C570.966,59.17 571,58.147 571,50 C571,41.851 570.966,40.831 570.82,37.631"></path></g></g></g></svg></div><div style="padding-top: 8px;"> <div style=" color:#3897f0; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:550; line-height:18px;">View this post on Instagram</div></div><div style="padding: 12.5% 0;"></div> <div style="display: flex; flex-direction: row; margin-bottom: 14px; align-items: center;"><div> <div style="background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(0px) translateY(7px);"></div> <div style="background-color: #F4F4F4; height: 12.5px; transform: rotate(-45deg) translateX(3px) translateY(1px); width: 12.5px; flex-grow: 0; margin-right: 14px; margin-left: 2px;"></div> <div style="background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(9px) translateY(-18px);"></div></div><div style="margin-left: 8px;"> <div style=" background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 20px; width: 20px;"></div> <div style=" width: 0; height: 0; border-top: 2px solid transparent; border-left: 6px solid #f4f4f4; border-bottom: 2px solid transparent; transform: translateX(16px) translateY(-4px) rotate(30deg)"></div></div><div style="margin-left: auto;"> <div style=" width: 0px; border-top: 8px solid #F4F4F4; border-right: 8px solid transparent; transform: translateY(16px);"></div> <div style=" background-color: #F4F4F4; flex-grow: 0; height: 12px; width: 16px; transform: translateY(-4px);"></div> <div style=" width: 0; height: 0; border-top: 8px solid #F4F4F4; border-left: 8px solid transparent; transform: translateY(-4px) translateX(8px);"></div></div></div> <div style="display: flex; flex-direction: column; flex-grow: 1; justify-content: center; margin-bottom: 24px;"> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 224px;"></div> <div style=" background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 144px;"></div></div></a><p style=" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;"><a href="https://www.instagram.com/reel/DZxLDuPOPPV/?utm_source=ig_embed&utm_campaign=loading" style=" color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none;" target="_blank">A post shared by Tony Wallace Woodworks (@tonywallacewoodworks)</a></p></div></blockquote>
<script async src="//www.instagram.com/embed.js"></script>
</figure>
<!--kg-card-end: html-->

<!--kg-card-begin: html-->
<small>*This is becoming a real problem. It seems like we need walnut to lose popularity for a while so stocks can recover, but it's hard to say no to a species that looks so good and is so easy to work.</small>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Reclaimed Wood: June 2026 ]]></title>
        <description><![CDATA[ A recap of my Instagram posts for June 2026. ]]></description>
        <link>https://tonywallace.com/reclaimed-wood-june-2026/</link>
        <guid isPermaLink="false">6a46740e389ef00001b051e7</guid>
        <category><![CDATA[ Instagram ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Thu, 02 Jul 2026 14:40:00 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>This is the latest in a series of monthly Instagram recaps for <a href="https://www.instagram.com/tonywallacewoodworks?ref=tonywallace.com" rel="noreferrer">@tonywallacewoodworks</a>. You can see the previous recap from March <a href="https://tonywallace.com/reclaimed-wood-march-2026/" rel="noreferrer">here</a>. (I didn't post while I was at <a href="https://tonywallace.com/blackwood-guitar-company-spring-2026/" rel="noreferrer">Blackwood Guitar Company</a> in April, and I just didn't get back to it for a while afterwards.)</p>
<!--kg-card-begin: html-->
<ul class="ic-instagram-embed">
  <li><a href="https://www.instagram.com/p/DZbAHOSDkBy?ref=tonywallace.com" target="_blank">New purpleheart bud vases for sale at J2 Gallery in Gananoque</a></li>
  <li><a href="https://www.instagram.com/p/DZbCQ_JjkSF?ref=tonywallace.com" target="_blank">Trying out a planar arm carve and lower horn slope on a guitar body prototype</a></li>
  <li><a href="https://www.instagram.com/p/DZnsudmpHiT?ref=tonywallace.com" target="_blank">Fun geological finds in the table saw after cutting acrylic</a></li>
  <li><a href="https://www.instagram.com/p/DZu8aPYuobF?ref=tonywallace.com" target="_blank">Headstock veneer sandwiches</a></li>
  <li><a href="https://www.instagram.com/p/DZvNZl4RJGL?ref=tonywallace.com" target="_blank">A mildly suggestive bookmatched walnut panel</a></li>
  <li><a href="https://www.instagram.com/reel/DZxLDuPOPPV?ref=tonywallace.com" target="_blank">Solid walnut side panel upgrade for a 1978 Sony AM/FM tuner</a></li>
  <li><a href="https://www.instagram.com/p/DZ_DtzHjioe?ref=tonywallace.com" target="_blank">Partial depth fretboard binding</a></li>
</ul>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Blackwood Guitar Company, Spring 2026 ]]></title>
        <description><![CDATA[ What to expect from the five week acoustic guitar building course at Blackwood Guitar Company. ]]></description>
        <link>https://tonywallace.com/blackwood-guitar-company-spring-2026/</link>
        <guid isPermaLink="false">69f89f3b9f74ed000138d508</guid>
        <category><![CDATA[ Guitarmaking ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Mon, 04 May 2026 17:45:57 +0000</pubDate>
        <media:content url="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/05/blackwood-guitar-feature.webp" medium="image"/>
        <content:encoded><![CDATA[ <p>I've been thinking about taking an acoustic guitar building course on and off for about thirty years now. The blocker has been time –  most serious courses are at least five weeks long and are effectively full time jobs with overtime. Tuition is also typically $5000+ CAD, which is very reasonable when you consider the course duration and the instructor's investment in  the school, but is nevertheless a significant chunk of change.  I was able to take the time because I stopped working full time in software development towards the end of last year, for <a href="https://ky.fyi/posts/ai-burnout?ref=tonywallace.com" rel="noreferrer">reasons</a>. The tuition could be covered by savings. With that sorted out, I enrolled in the Spring 2026 session at <a href="https://www.blackwoodguitar.ca/acoustic-guitar-making-course/?ref=tonywallace.com" rel="noreferrer">Blackwood Guitar Company</a> in Mallorytown, Ontario. </p><p>My goal in writing this is not to give a detailed account of my time at Blackwood ("on day 1, we chose our woods and I almost started a fire in the drum sander" – true story) but to give you an idea of what you might expect from the course.</p><p>Blackwood is owned and operated by <a href="https://www.blackwoodguitar.ca/about/?ref=tonywallace.com" rel="noreferrer">Ted Brown</a>, a luthier who studied with <a href="https://dejongeguitars.com/?ref=tonywallace.com" rel="noreferrer">Sergei DeJonge</a> and <a href="https://www.guitarespellerin.com/en/?ref=tonywallace.com" rel="noreferrer">Michel Pellerin</a>. Ted also studied cabinetmaking with <a href="https://www.finewoodworking.com/2009/09/10/james-krenov-1920-2009?ref=tonywallace.com" rel="noreferrer">James Krenov</a> at College of the Redwoods and founded <a href="https://www.rosewoodstudio.com/?ref=tonywallace.com" rel="noreferrer">Rosewood Studio</a>. In my experience, Ted is direct and fair, the sort of no-bullshit teacher you should want if you're serious about learning something. He isn't going to do your work for you but he will help you when you need it.</p><p>You have your choice of several guitar designs and woods, which you'll choose on the first day. A basic back and sides set is included with the course, or you can upgrade to fancier woods at an additional cost. I chose a twelve fret parlor body style with Indian rosewood back and sides and a lutz spruce top. (I didn't upgrade because I'm cheap and the basic woods were of high quality.) All other materials and tools are provided. Each bench is equipped with a set of basic hand tools. There is also a shared set of hand tools, a machine shop, and more clamps than you've probably ever seen in one place. (And yet, somehow, we still could have used more clamps.)</p><p>The course moves <em>very</em> fast. It has to, because getting several students from zero to a completed guitar in five weeks is a tall order. I'm used to working alone and at my own pace in a private workshop, so it took me a few days to get used to working in a shared space and on someone else's schedule. I fell behind early in the course, and while I was never more than a half day behind the rest of the class, it took me about three weeks before I really felt like I had caught up. Be prepared to work hard and at a high level of focus every day, and expect to work overtime on evenings and Saturday mornings. </p><p>Ted demonstrates processes at a pace that is intended to keep the class moving forward. That means that you may get a demo hours or days before you'll be ready to carry out the process. The provided notes serve as a good reminder of the order of operations for each process but are often short on details. You need to take your own notes, and take photos and videos of all the demos and setups so you can refer to them later. </p><p>Things will go wrong. Wood will be wood. It will not always behave the way you expect. You will make mistakes. You're building a guitar, but you're also going to get some repair experience along the way. Your first guitar was never going to be perfect, so treat problems as learning opportunities and try to recover as gracefully as you can.</p><p>There's no guarantee that you'll actually finish your guitar. I gather that most people do, more or less, but it depends on you putting in the work. Everyone in my class finished, and we even had some time to dial in our setups, but we also had the benefit of a smaller than usual class size. My guitar could still use some more finish work on the back and sides, but that's no problem. Ted teaches French polishing in the course, which makes it easy to touch up the finish in the future. For now, I'm enjoying my guitar and not worried about the flaws.</p><p>If you're thinking about taking an acoustic guitar building course, I recommend Blackwood. It isn't easy, but if you put in the work you'll be rewarded with a great guitar and a solid grasp of the craft.</p><figure class="kg-card kg-video-card kg-width-regular kg-card-hascaption" data-kg-thumbnail="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/media/2026/05/blackwood-guitar-demo_thumb.jpg" data-kg-custom-thumbnail="">
            <div class="kg-video-container">
                <video src="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/media/2026/05/blackwood-guitar-demo.mp4" poster="https://img.spacergif.org/v1/1280x720/0a/spacer.png" width="1280" height="720" playsinline="" preload="metadata" style="background: transparent url('https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/media/2026/05/blackwood-guitar-demo_thumb.jpg') 50% 50% / cover no-repeat;"></video>
                <div class="kg-video-overlay">
                    <button class="kg-video-large-play-icon" aria-label="Play video">
                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                            <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"></path>
                        </svg>
                    </button>
                </div>
                <div class="kg-video-player-container">
                    <div class="kg-video-player">
                        <button class="kg-video-play-icon" aria-label="Play video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                                <path d="M23.14 10.608 2.253.164A1.559 1.559 0 0 0 0 1.557v20.887a1.558 1.558 0 0 0 2.253 1.392L23.14 13.393a1.557 1.557 0 0 0 0-2.785Z"></path>
                            </svg>
                        </button>
                        <button class="kg-video-pause-icon kg-video-hide" aria-label="Pause video">
                            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                                <rect x="3" y="1" width="7" height="22" rx="1.5" ry="1.5"></rect>
                                <rect x="14" y="1" width="7" height="22" rx="1.5" ry="1.5"></rect>
                            </svg>
                        </button>
                        <span class="kg-video-current-time">0:00</span>
                        <div class="kg-video-time">
                            /<span class="kg-video-duration">0:21</span>
                        </div>
                        <input type="range" class="kg-video-seek-slider" max="100" value="0">
                        <button class="kg-video-playback-rate" aria-label="Adjust playback speed">1×</button>
                        <button class="kg-video-unmute-icon" aria-label="Unmute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                                <path d="M15.189 2.021a9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h1.794a.249.249 0 0 1 .221.133 9.73 9.73 0 0 0 7.924 4.85h.06a1 1 0 0 0 1-1V3.02a1 1 0 0 0-1.06-.998Z"></path>
                            </svg>
                        </button>
                        <button class="kg-video-mute-icon kg-video-hide" aria-label="Mute">
                            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                                <path d="M16.177 4.3a.248.248 0 0 0 .073-.176v-1.1a1 1 0 0 0-1.061-1 9.728 9.728 0 0 0-7.924 4.85.249.249 0 0 1-.221.133H5.25a3 3 0 0 0-3 3v2a3 3 0 0 0 3 3h.114a.251.251 0 0 0 .177-.073ZM23.707 1.706A1 1 0 0 0 22.293.292l-22 22a1 1 0 0 0 0 1.414l.009.009a1 1 0 0 0 1.405-.009l6.63-6.631A.251.251 0 0 1 8.515 17a.245.245 0 0 1 .177.075 10.081 10.081 0 0 0 6.5 2.92 1 1 0 0 0 1.061-1V9.266a.247.247 0 0 1 .073-.176Z"></path>
                            </svg>
                        </button>
                        <input type="range" class="kg-video-volume-slider" max="100" value="100">
                    </div>
                </div>
            </div>
            <figcaption><p><span style="white-space: pre-wrap;">My finished guitar.</span></p></figcaption>
        </figure> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Reclaimed Wood: March 2026 ]]></title>
        <description><![CDATA[ A recap of my Instagram posts for March 2026. ]]></description>
        <link>https://tonywallace.com/reclaimed-wood-march-2026/</link>
        <guid isPermaLink="false">69d3938c463e63000182764b</guid>
        <category><![CDATA[ Instagram ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Mon, 06 Apr 2026 11:12:25 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>This is the latest in a series of monthly Instagram recaps for <a href="https://www.instagram.com/tonywallacewoodworks?ref=tonywallace.com" rel="noreferrer">@tonywallacewoodworks</a>. You can see last month's recap <a href="https://tonywallace.com/reclaimed-wood-february-2026/" rel="noreferrer">here</a>.</p>
<!--kg-card-begin: html-->
<ul class="ic-instagram-embed">
  <li><a href="https://www.instagram.com/reel/DVeg75Tkutv?ref=tonywallace.com" target="_blank">Progress check for a new batch of guitar necks</a></li>
  <li><a href="https://www.instagram.com/p/DWABV8ujoP_?ref=tonywallace.com" target="_blank">Walnut speaker stands spotted in the wild</a></li>
  <li><a href="https://www.instagram.com/p/DWC2V_AjrRR?ref=tonywallace.com" target="_blank">Smoothing a guitar body blank by hand</a></li>
  <li><a href="https://www.instagram.com/p/DWKfTJLDk0R?ref=tonywallace.com" target="_blank">My bud vases are available at J2 Gallery in Gananoque</a></li>
</ul>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Bud Vases at J2 Gallery in Gananoque ]]></title>
        <description><![CDATA[ I&#39;m happy to announce that a selection of my wood bud vases are now available at J2 Gallery Studio in Gananoque, Ontario. ]]></description>
        <link>https://tonywallace.com/bud-vases-at-j2-gallery-in-gananoque/</link>
        <guid isPermaLink="false">69bff0e9dad184000180e7b8</guid>
        <category><![CDATA[ Woodwork ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Sun, 22 Mar 2026 13:56:57 +0000</pubDate>
        <media:content url="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/03/bud-vase-j2-gallery-feature.webp" medium="image"/>
        <content:encoded><![CDATA[ <p>I'm happy to announce that a selection of my wood bud vases are now available at <a href="https://www.j2gallerystudio.com/?ref=tonywallace.com" rel="noreferrer">J2 Gallery Studio</a> in Gananoque, Ontario. The vases are variations on the design I presented in my <a href="https://tonywallace.com/project-archive-bud-vase/" rel="noreferrer">Project Archive: Bud Vase</a> post.</p><p>J2 is located at 33 King St. East, right across from Gananoque Town Hall.</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Project Archive: Floor Speaker Stands ]]></title>
        <description><![CDATA[ A pair of walnut floor speaker stands that I created for a customer. ]]></description>
        <link>https://tonywallace.com/project-archive-floor-speaker-stands/</link>
        <guid isPermaLink="false">69b9612dc767ed000193b00f</guid>
        <category><![CDATA[ Woodwork ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Tue, 17 Mar 2026 17:14:29 +0000</pubDate>
        <media:content url="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/03/speaker-stands-feature.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<!--kg-card-begin: html-->
<blockquote>
  Excuse my language....but those look f**king dope!
  <cite>&ndash; Satisfied Customer</cite>
</blockquote>
<!--kg-card-end: html-->
<p>I recently received a commission to build a pair of stands for a set of floor speakers. The customer wanted to raise the speakers roughly 9" and tilt them back to improve projection. The speakers have a faux-walnut veneer so we decided to use solid walnut for the stands, so they would be reasonably close in colour.</p><p>I started by building a parametric CAD model of the stands. I normally don't model my projects. I prefer to sketch things out in pencil on graph paper, and I generally only measure parts whose dimensions are critical to the success of the project. Everything else is marked and cut in reference to those critical parts. The benefit of having a model doesn't always justify the effort involved in creating it. However, I felt that I needed a model for this project, for a few reasons:</p><ul><li>The stands would tilt back and I didn't know what the ideal angle would be. Changing the angle would affect other dimensions, particularly the length of the joint between the leg and speaker support.</li><li>I wanted to provide the customer with a simple rendering and to be able to respond quickly if they wanted changes.</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/03/speaker-stands-renderings.webp" class="kg-image" alt="An image showing CAD renderings of the speaker stand design from various perspectives." loading="lazy" width="2000" height="1125" srcset="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w600/2026/03/speaker-stands-renderings.webp 600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1000/2026/03/speaker-stands-renderings.webp 1000w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1600/2026/03/speaker-stands-renderings.webp 1600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/03/speaker-stands-renderings.webp 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">CAD renderings of the speaker stand design.</span></figcaption></figure><p>Once the customer approved the rendering, I went shopping for lumber, milled it to the rough dimensions required by the designs, and <a href="https://woodworking.stackexchange.com/a/637?ref=tonywallace.com" rel="noreferrer">stickered</a> it for a few weeks to make sure it would be stable. </p><p>Each stand would have two leg assemblies, each consisting of three parts: the base, the leg and the speaker support. The leg assemblies had to be identical. Any deviation would prevent the stands from sitting properly on the floor, or prevent the speakers from sitting properly on the stands, or both. Either of these conditions could introduce vibration that would take away from the music. The best way to achieve the necessary consistency across all the parts would be to rout them to a template, so I made a templates for the three parts of the leg assembly from 12mm birch plywood. I traced the templates onto the lumber, cut the parts close to the lines on the bandsaw, and routed the parts to the templates. I also cut the cross brace for each stand on the table saw.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/03/speaker-stands-templates.webp" class="kg-image" alt="An image showing plywood templates for the speaker support, leg and base parts of the leg assembly." loading="lazy" width="2000" height="1500" srcset="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w600/2026/03/speaker-stands-templates.webp 600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1000/2026/03/speaker-stands-templates.webp 1000w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1600/2026/03/speaker-stands-templates.webp 1600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/03/speaker-stands-templates.webp 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Plywood templates for the speaker support, leg and base parts of the leg assembly.</span></figcaption></figure><p>The parts would be assembled using three 1/4" dowels per joint. I marked precise center lines on the legs, continued the lines onto the bases and speaker supports, and used them to align my drilling jig. After drilling for the joints between the leg and base, and the leg and speaker support, I drilled another set of holes on the inside of each leg to attach the leg assembles to the cross brace. A dry fit of all the parts showed that dowel joinery could not guarantee that both speaker supports would end up with precisely the same tilt angle. It would be very easy for the leg assemblies to end up slightly out of plane with one another, so I needed a way to keep them aligned during glue-up. My solution was to use the dowel holes on the inside of each leg to keep the legs in the same position – leaving a bit of space between them so they wouldn't be glued together accidentally – and to clamp the bases and speaker supports between scraps of plywood to keep them coplanar. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/03/speaker-stands-fixture-1.webp" class="kg-image" alt="An image showing a simple fixture to keep the leg assembly aligned during glue-up." loading="lazy" width="2000" height="2000" srcset="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w600/2026/03/speaker-stands-fixture-1.webp 600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1000/2026/03/speaker-stands-fixture-1.webp 1000w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1600/2026/03/speaker-stands-fixture-1.webp 1600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/03/speaker-stands-fixture-1.webp 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">A simple fixture to keep the leg assembly aligned during glue-up.</span></figcaption></figure><p>Next, I sanded the leg assemblies and cross braces, and routed roundovers around all the outside edges except where the stands would make contact with the speakers and the floor. I used a router to establish a consistent 1/8" radius for the roundovers but sanded them out by hand for a less mechanical look. The last step of assembly involved glueing the legs to the cross braces. I clamped them together lightly and put a five pound weight on top of each assembly to keep the legs planted to the bench while the glue dried. The result is a pair of stands that sit perfectly flat.</p><p>I finished the stands with Osmo Polyx hard wax oil in a satin sheen, which is my go-to finish for most things, but especially for walnut. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/03/speaker-stands-shop-2.webp" class="kg-image" alt="An image showing the speaker stands after applying finish." loading="lazy" width="2000" height="1553" srcset="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w600/2026/03/speaker-stands-shop-2.webp 600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1000/2026/03/speaker-stands-shop-2.webp 1000w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1600/2026/03/speaker-stands-shop-2.webp 1600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/03/speaker-stands-shop-2.webp 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">The speaker stands after applying finish.</span></figcaption></figure><p>Overall, I'm very happy with how this project turned out. My customer's feedback has been overwhelmingly positive, not only with regard to the stands' appearance and basic functionality, but also with regard to the improvement they've made to how his speakers sound. That wasn't something we could plan for in advance, but decoupling the speakers from the floor and tilting them towards the listener should make a difference.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/03/speaker-stands-1.webp" class="kg-image" alt="An image showing the left three-quarter view of one of the speaker stands with a speaker resting on it." loading="lazy" width="1350" height="2400" srcset="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w600/2026/03/speaker-stands-1.webp 600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1000/2026/03/speaker-stands-1.webp 1000w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/03/speaker-stands-1.webp 1350w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">One of the speaker stands in use.</span></figcaption></figure> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Reclaimed Wood: February 2026 ]]></title>
        <description><![CDATA[ A recap of my Instagram posts for February 2026. ]]></description>
        <link>https://tonywallace.com/reclaimed-wood-february-2026/</link>
        <guid isPermaLink="false">69a58fa1f0b11700017dccd8</guid>
        <category><![CDATA[ Instagram ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Mon, 02 Mar 2026 13:46:52 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>This is the latest in a series of monthly Instagram recaps for <a href="https://www.instagram.com/tonywallacewoodworks?ref=tonywallace.com" rel="noreferrer">@tonywallacewoodworks</a>. You can see last month's recap <a href="https://tonywallace.com/reclaimed-wood-january-2026/" rel="noreferrer">here</a>.</p>
<!--kg-card-begin: html-->
<ul class="ic-instagram-embed">
  <li><a href="https://www.instagram.com/reel/DUT3X9OEjkB?ref=tonywallace.com" target="_blank">Gluing up a guitar body blank with Equipressure clamps</a></li>
  <li><a href="https://www.instagram.com/p/DUmDOPPEtxO?ref=tonywallace.com" target="_blank">Creating templates for a set of speaker stands</a></li>
  <li><a href="https://www.instagram.com/reel/DUqaeBwDgeA?ref=tonywallace.com" target="_blank">Slotting a guitar fingerboard with a pull saw and miter box</a></li>
  <li><a href="https://www.instagram.com/reel/DUrXwcRDh4W?ref=tonywallace.com" target="_blank">Psychedelic drill press</a></li>
  <li><a href="https://www.instagram.com/p/DUtsdnvkt1E?ref=tonywallace.com" target="_blank">Custom wood face dots for guitar fingerboards</a></li>
  <li><a href="https://www.instagram.com/p/DU647igDnjC?ref=tonywallace.com" target="_blank">Routing guitar neck blanks for truss rods</a></li>
  <li><a href="https://www.instagram.com/reel/DVPaKm-js54?ref=tonywallace.com" target="_blank">Creating a custom guitar headstock template</a></li>
  <li><a href="https://www.instagram.com/p/DVTkdrvjjoi?ref=tonywallace.com" target="_blank">Walnut speaker stands before applying finish</a></li>
  <li><a href="https://www.instagram.com/reel/DVUOH2Lknxc?ref=tonywallace.com" target="_blank">Finishing walnut speaker stands</a></li>
</ul>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ How to Square the Stewmac Fret Slotting Miter Box ]]></title>
        <description><![CDATA[ If your Stewmac fret slotting miter box is out of square, this adjustment process might help. ]]></description>
        <link>https://tonywallace.com/how-to-square-the-stewmac-fret-slotting-miter-box/</link>
        <guid isPermaLink="false">698dc236ef41af0001a74208</guid>
        <category><![CDATA[ Guitarmaking ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Thu, 12 Feb 2026 14:02:03 +0000</pubDate>
        <media:content url="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/02/stewmac-fret-slotting-miter-box-feature.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<aside class="gh-post-upgrade-cta">
    <div class="gh-post-upgrade-cta-content" style="background-color: #6795cb">
                <h2>This post is for subscribers only</h2>
            <a class="gh-btn" data-portal="signup" href="#/portal/signup" style="color:#6795cb">Subscribe now</a>
            <p><small>Already have an account? <a data-portal="signin" href="#/portal/signin">Sign in</a></small></p>
    </div>
</aside>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Tool Review: 4-way Equipressure Clamp ]]></title>
        <description><![CDATA[ A review of the 4-way Equipressure clamp. ]]></description>
        <link>https://tonywallace.com/tool-review-4-way-equipressure-clamp/</link>
        <guid isPermaLink="false">6981f53134e5630001eb834c</guid>
        <category><![CDATA[ Product Review ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Tue, 03 Feb 2026 20:00:00 +0000</pubDate>
        <media:content url="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/02/equipressure-clamps-feature.webp" medium="image"/>
        <content:encoded><![CDATA[ <div class="kg-card kg-callout-card kg-callout-card-accent"><div class="kg-callout-emoji">⚠️</div><div class="kg-callout-text">This is not a sponsored review. I purchased this product myself and haven't been influenced by the manufacturer or retailer.</div></div><p></p><p>Panel glue-ups present two main challenges. First, you need the mating faces of each board to be straight and square to achieve a gap-free glue joint. This is accomplished with a jointer (power or hand plane) or maybe your table saw if you have a good enough blade. The second challenge is to keep the boards vertically aligned under clamping pressure. If you're working with long, thin boards, you may find that they're bowed enough to introduce alignment problems towards the middle of the panel. Even if all the boards are perfectly flat, they can drift out of alignment while the glue is wet. There are ways to solve these problems. You can pile on more clamps and cauls to force the boards into vertical alignment, but that can be difficult for large panels. You can clamp the boards and then try to hammer them into alignment, but that isn't a reliable method – nor is it graceful. You can also start with thicker boards and plane out the excess after the glue-up, if you have a big enough thickness planer, or enough skill and patience with a hand plane. Or you can try <a href="https://www.busybeetools.com/products/clamp-4-way-equiprssure?_pos=1&_psq=equipressure&_ss=e&_v=1.0&ref=tonywallace.com" rel="noreferrer">4-way Equipressure clamps</a>.</p><h2 id="how-equipressure-clamps-work">How Equipressure Clamps Work</h2><p>The idea behind these clamps is simple. The two ends of a screw clamp are connected by bars that sit above and below the boards to be clamped. Tightening the screw applies horizontal pressure to join the boards while drawing the bars together to force the boards into vertical alignment. This is basically a streamlined version of the "more clamps and cauls" approach I mentioned above, and it works quite well in practice, at least for my purposes. A tool can be very effective in one context but fairly useless in another. When someone tells you that a tool works well, it's important to understand their test parameters so you can determine how they align with your own. Here are my parameters:</p><ul><li>I'm using these clamps to join guitar body blanks, which generally consist of two boards. I haven't tested these clamps on a large panel glue-up.</li><li>I'm working with fairly thick hardwood stock. The minimum thickness is generally around 1-5/8" (41mm) and the boards are freshly surfaced on four sides. I'm using the clamps to keep the boards from slipping out of alignment more than to correct for distortion.</li></ul><p>Your situation and needs may be different than mine, so take that into account when you decide whether or not to try this product.</p><h2 id="assembly-and-use">Assembly and Use</h2><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/02/equipressure-clamps-parts.webp" class="kg-image" alt="Image showing the parts of a 4-way Equipressure clamp." loading="lazy" width="2000" height="1125" srcset="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w600/2026/02/equipressure-clamps-parts.webp 600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1000/2026/02/equipressure-clamps-parts.webp 1000w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1600/2026/02/equipressure-clamps-parts.webp 1600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/02/equipressure-clamps-parts.webp 2400w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">Each clamp consists of two spring arms (bottom) and four brackets (top) that you mount on bars that you provide.</span></figcaption></figure><p>Each clamp consists of two spring arms, one with a screw and the other with a fixed caul, and four brackets (two long and two short) that mount to bars that you provide. I milled my bars from rough 8/4 (2"or 50mm) maple to ensure that they would be as hard as, or harder than, most of the woods that I would be working with. You can make your bars as long as you need them to be. I chose 24" (around 600mm) for guitar body blanks and other small panels. The important dimensions are the width and height of the bars, which can't exceed 1-5/8" (41mm) and 2" (50mm) respectively, for the bars to fit through the spring arms. (Similar clamps are offered by several vendors and sizing may vary, so be sure to verify the clearance on your own spring arms before you make your bars.) Mount the brackets to the bars using the supplied hardware, using a long bracket on one end of each bar and a short one on the other. Finally, line the bars with packing tape to prevent glue from bonding to them.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/02/equipressure-clamps-assembled.webp" class="kg-image" alt="Image showing an assembled 4-way Equipressure clamp." loading="lazy" width="2000" height="1382" srcset="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w600/2026/02/equipressure-clamps-assembled.webp 600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1000/2026/02/equipressure-clamps-assembled.webp 1000w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1600/2026/02/equipressure-clamps-assembled.webp 1600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/02/equipressure-clamps-assembled.webp 2400w" sizes="(min-width: 1200px) 1200px"><figcaption><span style="white-space: pre-wrap;">The assembled clamp.</span></figcaption></figure><p>To use the clamps, place one bar from each clamp on your bench with the brackets facing down. Arrange the boards for your panel across the bars, without glue. Place the other bar for each clamp across the top of the boards, with the brackets facing up. Slip the spring arms over the bars and into the grooves on the brackets, making sure to use the same grooves on the top and bottom bars. Unwind the screws all the way and move the spring arms to the innermost brackets that will accommodate your panel while allowing some leeway. Tighten the screws to make sure that everything aligns properly. Once you've completed a successful dry run, you can slide the boards out of the clamps to prepare for glue-up. Unfortunately, this is where it gets a bit tricky.</p><p>If you read reviews of these clamps, the common refrain is that they're awkward to set up. In my experience that's a valid complaint but there are ways to improve the situation. First, elevate the bottom row of bars from your bench by an inch or two. It's much easier to move the spring arms if they aren't resting on your bench under the weight of everything else. Second, cut some strips of thin wood slightly wider than the thickness of your panel and use them as spacers between the top and bottom bars so you can slide the boards in and out without resistance. Insert the spacers before you slide the boards in and remove them before you tighten the clamps. After you loosen the clamps, slide the spacers back in before you remove the panel. (If you can find a set of small bar clamps that can be reconfigured as spreaders to lift the top bar, I imagine that would work well in place of the spacers.)</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/02/equipressure-clamps-spacer.webp" class="kg-image" alt="Image showing a thin board being used as a spacer to keep a 4-way Equipressure clamp open." loading="lazy" width="1800" height="2400" srcset="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w600/2026/02/equipressure-clamps-spacer.webp 600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1000/2026/02/equipressure-clamps-spacer.webp 1000w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1600/2026/02/equipressure-clamps-spacer.webp 1600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/02/equipressure-clamps-spacer.webp 1800w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Using a thin board as a spacer to hold the clamp open.</span></figcaption></figure><p>With the boards out of the clamps, you can apply glue to the edges, reinsert the boards into the clamps, remove the spacers if you're using them, double check that everything is aligned and tighten the clamps. Wait 5-10 minutes for the glue squeeze out to thicken before you scrape off as much as you can reach – it's cleaner and more effective than cleaning it up with water. Leave the panel under clamping pressure according to the glue manufacturer's recommendations. The minimum time is usually between 30 and 60 minutes, but I like to do up my panel glue-ups at the end of the day and leave them clamped until the following morning. </p><h2 id="the-results">The Results</h2><p>After using these clamps I've only needed a few passes with a card scraper to clean off any remaining glue and get a perfect joint on my body blanks. The 4-way Equipressure clamps are a bit difficult to set up at first, but in my opinion the results are worth the effort.</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Reclaimed Wood: January 2026 ]]></title>
        <description><![CDATA[ A recap of my Instagram posts for January 2026. ]]></description>
        <link>https://tonywallace.com/reclaimed-wood-january-2026/</link>
        <guid isPermaLink="false">6980a59f7801df0001b568f8</guid>
        <category><![CDATA[ Instagram ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Mon, 02 Feb 2026 20:18:57 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>This is the first of a series of monthly Instagram recaps for <a href="https://www.instagram.com/tonywallacewoodworks?ref=tonywallace.com" rel="noreferrer">@tonywallacewoodworks</a>. I was prompted to do this by a friend who doesn't have an Instagram account but wanted to be able to see what I was posting. (Ideally, I'd automate the publication of an RSS feed for my Instagram feed, but it looks like that requires an Instagram for Business account. If anyone knows a way around that, please comment on this post.)</p><p>How this will work:</p><ul><li>If you're reading this in an email, you'll see a list of links that point to my Instagram posts. </li><li>If you're reading this on the web, the list of links will be replaced with embedded Instagram posts. (If that fails for some reason, the original list should still be visible.)</li><li>If you use a browser or extension that blocks trackers, the embedded Instagram posts may not load but the links to the posts will still work.</li><li>You'll see a login prompt when you view a post in a web browser while you aren't logged into Instagram. You can dismiss it with the X button.</li><li>I won't include Instagram posts that just point back to posts on this blog.</li></ul><p>Special thanks to Nessa for the "Reclaimed Wood" title! 🙂</p><p>Here's what I posted in January 2026:</p>
<!--kg-card-begin: html-->
<ul class="ic-instagram-embed">
  <li><a href="https://www.instagram.com/p/DTgY6ZxEt60?ref=tonywallace.com" target="_blank">Fitting the neck for my second Telecaster build</a></li>
  <li><a href="https://www.instagram.com/p/DTg3-K4jilm?ref=tonywallace.com" target="_blank">Installing string ferrules for my second Telecaster build</a></li>
  <li><a href="https://www.instagram.com/reel/DTlHWaQjpiX?ref=tonywallace.com" target="_blank">An overview of my milling process for a guitar neck blank</a></li>
  <li><a href="https://www.instagram.com/reel/DTlmCrJEoI3?ref=tonywallace.com" target="_blank">$2 amp cover</a></li>
  <li><a href="https://www.instagram.com/reel/DTlnY8wEoyi?ref=tonywallace.com" target="_blank">An overview of my milling process for a guitar body blank</a></li>
  <li><a href="https://www.instagram.com/reel/DTn_L0Ckir-?ref=tonywallace.com" target="_blank">Sheilding pickup cavities with copper foil tape for my second Telecaster build</a></li>
  <li><a href="https://www.instagram.com/reel/DTqo2wmknfx?ref=tonywallace.com" target="_blank">Pickups and bridge installed for my second Telecaster build</a></li>
  <li><a href="https://www.instagram.com/reel/DTtR78XErzg?ref=tonywallace.com" target="_blank">Timelapse of the wiring for my second Telecaster build</a></li>
  <li><a href="https://www.instagram.com/reel/DTvqO9Wkveb?ref=tonywallace.com" target="_blank">Everybody loves Richard Marx, right? Right?</a></li>
  <li><a href="https://www.instagram.com/reel/DT3TLttDmyh?ref=tonywallace.com" target="_blank">First sounds from my second Telecaster build</a></li>
  <li><a href="https://www.instagram.com/reel/DT3ZSgdEvMP?ref=tonywallace.com" target="_blank">Tuner installation for my second Telecaster build</a></li>
  <li><a href="https://www.instagram.com/reel/DUEpvnmjh1e?ref=tonywallace.com" target="_blank">Using my ergonomic sanding block</a></li>
</ul>
<!--kg-card-end: html-->
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Project Archive: Bud Vase ]]></title>
        <description><![CDATA[ My take on a vase design that Steve Der-Garabedian presented in Canadian Woodworking. ]]></description>
        <link>https://tonywallace.com/project-archive-bud-vase/</link>
        <guid isPermaLink="false">697bbf003cb1ce00011e7d87</guid>
        <category><![CDATA[ Woodwork ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Thu, 29 Jan 2026 20:31:59 +0000</pubDate>
        <media:content url="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/01/bud-vase-feature.webp" medium="image"/>
        <content:encoded><![CDATA[ <p>This is my take on a vase design that <a href="https://www.blackwalnutstudio.ca/?ref=tonywallace.com" rel="noreferrer">Steve Der-Garabedian</a> presented in <a href="https://canadianwoodworking.com/project/make-a-simple-vase/?ref=tonywallace.com" rel="noreferrer">Canadian Woodworking</a>. The example shown here was made from padauk. I have also made them in walnut and maple. The vessel is a 15x150mm glass test tube.</p><p>The main difference between my version and Der-Garabedian's is that I've started with a larger blank and used more aggressive cutaways. I rough out the shape on the bandsaw, in part to reduce the amount of wood that I convert to dust, and in part to improve consistency. The fine shaping is done with spindle and edge sanders, and by hand sanding. The finish is Osmo Polyx in satin sheen to maintain a natural appearance.</p><p>Project date: December 2025</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/01/bud-vase-leaves.webp" class="kg-image" alt="" loading="lazy" width="2000" height="2667" srcset="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w600/2026/01/bud-vase-leaves.webp 600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1000/2026/01/bud-vase-leaves.webp 1000w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/size/w1600/2026/01/bud-vase-leaves.webp 1600w, https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/01/bud-vase-leaves.webp 2400w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">The bud vase with greenery.</span></figcaption></figure> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Instagram: tonywallacewoodworks ]]></title>
        <description><![CDATA[ A new Instagram account for my woodworking and guitar making work. ]]></description>
        <link>https://tonywallace.com/instagram-tonywallacewoodworks/</link>
        <guid isPermaLink="false">696fabd59542fd00017781f1</guid>
        <category><![CDATA[ News ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Tue, 20 Jan 2026 16:49:46 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>Last week I set up a new Instagram account for my woodworking and guitar making work: <a href="https://www.instagram.com/tonywallacewoodworks?ref=tonywallace.com" rel="noreferrer">tonywallacewoodworks</a></p><p>I'm generally averse to being on camera so you won't see much of me other than my hands. You also won't hear my voice very often. (That's no great loss.) </p><p>You will see whatever I'm working on today, or this week, so <a href="https://www.instagram.com/tonywallacewoodworks?ref=tonywallace.com" rel="noreferrer">come follow along</a> while I make things.</p><p>If you aren't reading this on your phone, you can use this QR code:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2026/01/instagram-tonywallacewoodworks-qr-2.jpg" class="kg-image" alt="" loading="lazy" width="567" height="567"><figcaption><span style="white-space: pre-wrap;">QR code link to tonywallacewoodworks on Instagram</span></figcaption></figure> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Post History Restored ]]></title>
        <description><![CDATA[ My old posts are back to preserve history. ]]></description>
        <link>https://tonywallace.com/post-history-restored/</link>
        <guid isPermaLink="false">695fdeff1ba5ea0001d163d5</guid>
        <category><![CDATA[ News ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Thu, 08 Jan 2026 17:36:14 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>When I launched this website last month, I published a series of new posts but didn't migrate my old posts. I don't want to contribute to the epidemic of link rot on the internet so I have restored the post history and set up redirects to resolve old links to the new posts. I've also migrated posts from the old Irritant Creative blog and set up redirects from there to here. </p><p>Most of these posts document a period from 2014 -2016 when I was doing audio-related programming work and writing about it. (I was still active for a few years afterwards but had stopped writing, which I regret. A lot happened in those years.) They're all out of date, but if you want to read them you can head over to the <a href="https://tonywallace.com/tag/obsolete" rel="noreferrer">obsolete posts page</a>.</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Generating Colour Variants in CSS with color-mix ]]></title>
        <description><![CDATA[ How to generate colour variants using the css color-mix function. ]]></description>
        <link>https://tonywallace.com/generating-colour-variants-in-css-with-color-mix/</link>
        <guid isPermaLink="false">6941613d69e0a900019329f3</guid>
        <category><![CDATA[ Web Development ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Tue, 16 Dec 2025 17:00:30 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <div class="kg-card kg-callout-card kg-callout-card-accent"><div class="kg-callout-emoji">🤔</div><div class="kg-callout-text">This post deviates from my normal woodworking focus. It assumes that you're familiar with css in general and <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Cascading_variables/Using_custom_properties?ref=tonywallace.com" rel="noreferrer">custom properties</a> in particular.</div></div><p>When I build a design system for a website, I like to define a family of lighter and darker variants of each colour. In the past, I've done this by manually generating each variant in one of two ways:</p><ul><li>Using a design or colour management app to define each variant, then setting the hex/rgb values as css custom properties. This was slow to set up in the first place and made it difficult to adapt to changes later on. If I wanted to change the hue for a colour, I had to redefine all the variants and update all the custom properties.</li><li>Defining the colours in code using <code>hsl()</code>. This made it easier to define variants by adjusting saturation and lightness without affecting the hue, and to change the hue later on without affecting saturation and lightness. The downside is that most of the colour values I receive from other people aren't defined in hsl to begin with. I still needed a colour picker to translate from other colour spaces.</li></ul><p>Granted, you've been able to solve these issues for years by using <a href="https://sass-lang.com/documentation/modules/color/?ref=tonywallace.com" rel="noreferrer">sass</a>, but I prefer standard css. This post will demonstrate how we can use the new <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/color_value/color-mix?ref=tonywallace.com" rel="noreferrer">color-mix</a> function to generate colour variants in code without requiring other languages or tools. (At the time of writing, the <a href="https://web.dev/baseline/?ref=tonywallace.com" rel="noreferrer">Baseline</a> status for <code>color-mix()</code> is "widely available," meaning that it has been implemented in all major browsers for at least 30 months and can generally be used without worrying about compatibility.) </p><p>The first step is to define a custom property for the accent colour.</p><figure class="kg-card kg-code-card"><pre><code class="language-css">:root {
  --color-accent: #6795cb;
}</code></pre><figcaption><p><span style="white-space: pre-wrap;">Defining a css custom property for the accent colour.</span></p></figcaption></figure><p>I used this technique to generate the color variants for the Ghost theme on this site, using the <code>--ghost-accent-color</code> custom property instead of a fixed accent colour. This allows the accent colour to be configured in the Ghost theme settings. </p><figure class="kg-card kg-code-card"><pre><code class="language-css">:root {
  --color-accent: var(--ghost-accent-color);
}</code></pre><figcaption><p><span style="white-space: pre-wrap;">Setting the accent colour to the </span><code spellcheck="false" style="white-space: pre-wrap;"><span>--ghost-accent-color</span></code><span style="white-space: pre-wrap;"> custom property that Ghost injects in the theme css.</span></p></figcaption></figure><p>Having defined the accent colour, we can define tinted variants of white and black. Adding a subtle tint to white and black can soften them and help them sit more comfortably with the accent colour. </p><p>I define custom properties for pure white and black that I incorporate into the <code>color-mix()</code> function and use anywhere else I want the pure variant. You might consider this to be an unnecessary step because pure white (<code>#fff</code>) and black (<code>#000</code>) are constant, but I prefer to have everything defined in one place.</p><p>Next, I use <code>color-mix()</code> to generate the tinted variants. This function requires a <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/color-interpolation-method?ref=tonywallace.com" rel="noreferrer">colour interpolation method</a> consisting of the keyword <code>in</code> followed by a <a href="https://developer.mozilla.org/en-US/docs/Glossary/Color_space?ref=tonywallace.com" rel="noreferrer">colour space</a>. (I'm using the <a href="https://developer.mozilla.org/en-US/docs/Glossary/Color_space?ref=tonywallace.com#cielab_color_spaces" rel="noreferrer">oklch</a> colour space.) The second argument is the base colour – white or black, in this case. The third argument is the colour to be mixed into the base colour, and the mix percentage. The result is assigned to a new custom property. </p><p>Increasing the mix percentage will push the result towards the accent colour. Decreasing it will push it towards the base colour. The key here is subtlety – I normally use a 1% mix of the accent colour for white, and around 5-10% for black. The result should still pass for white or black if you look at it in isolation. If the mix is too strong, it will start to look like a highly diluted version of the accent colour.</p><figure class="kg-card kg-code-card"><pre><code class="language-css">:root {
  --color-accent: #6795cb;

  --color-white: #fff;

  --color-black: #000;
  
  --color-white-tinted: color-mix(
    in oklch, 
    var(--color-white), 
    var(--color-accent) 1%
  );
  
  --color-black-tinted: color-mix(
    in oklch, 
    var(--color-black), 
    var(--color-accent) 10%
  );
}</code></pre><figcaption><p><span style="white-space: pre-wrap;">Defining tinted variants of white and black using `color-mix()`.</span></p></figcaption></figure><p>We can use the same technique to generate lighter and darker variants of the accent colour. I name these using levels from <code>050</code> to <code>950</code>, e.g. <code>--color-accent-350</code>, similar to how <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/font-weight?ref=tonywallace.com#common_weight_name_mapping" rel="noreferrer">font weight</a> levels are specified. Level <code>500</code> is the pure accent colour. The levels below <code>500</code> increase the mix of white into the accent colour by 10% per level, making them progressively lighter. The levels above <code>500</code> increase the mix of black into the accent colour by 10% per level, making them progressively darker.</p><figure class="kg-card kg-code-card"><pre><code class="language-css">:root {
  --color-accent-050: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-white) 90%
  );
  
  --color-accent-100: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-white) 80%
  );
  
  --color-accent-150: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-white) 70%
  );
  
  --color-accent-200: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-white) 60%
  );
  
  --color-accent-250: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-white) 50%
  );
  
  --color-accent-300: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-white) 40%
  );
  
  --color-accent-350: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-white) 30%
  );
  
  --color-accent-400: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-white) 20%
  );
  
  --color-accent-450: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-white) 10%
  );
  
  --color-accent-500: var(--color-accent);
  
  --color-accent-550: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-black) 10%
  );
  
  --color-accent-600: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-black) 20%
  );
  
  --color-accent-650: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-black) 30%
  );
  
  --color-accent-700: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-black) 40%
  );
  
  --color-accent-750: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-black) 50%
  );
  
  --color-accent-800: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-black) 60%
  );
  
  --color-accent-850: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-black) 70%
  );
  
  --color-accent-900: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-black) 80%
  );
  
  --color-accent-950: color-mix(
    in oklch,
    var(--color-accent),
    var(--color-black) 90%
  );
}</code></pre><figcaption><p><span style="white-space: pre-wrap;">Defining variants of the accent colour using `color-mix()`.</span></p></figcaption></figure><p>If you're designing a larger system with many colours, you can repeat this for each one. Adjust the levels as necessary – perfect 10% increments may not be optimal for all colours. </p><p>I also use this technique to define variants of grey by mixing pure white into the tinted black, in 10% increments. Because we're mixing white into black, a higher mix percentage results in a lighter shade of grey. </p><figure class="kg-card kg-code-card"><pre><code class="language-css">:root {
  --color-gray-100: color-mix(
    in oklch,
    var(--color-black-tinted),
    var(--color-white) 90%
  );
  
  --color-gray-200: color-mix(
    in oklch,
    var(--color-black-tinted),
    var(--color-white) 80%
  );
  
  --color-gray-300: color-mix(
    in oklch,
    var(--color-black-tinted),
    var(--color-white) 70%
  );
  
  --color-gray-400: color-mix(
    in oklch,
    var(--color-black-tinted),
    var(--color-white) 60%
  );
  
  --color-gray-500: color-mix(
    in oklch,
    var(--color-black-tinted),
    var(--color-white) 50%
  );
  
  --color-gray-600: color-mix(
    in oklch,
    var(--color-black-tinted),
    var(--color-white) 40%
  );
  
  --color-gray-700: color-mix(
    in oklch,
    var(--color-black-tinted),
    var(--color-white) 30%
  );
  
  --color-gray-800: color-mix(
    in oklch,
    var(--color-black-tinted),
    var(--color-white) 20%
  );
  
  --color-gray-900: color-mix(
    in oklch,
    var(--color-black-tinted),
    var(--color-white) 10%
  );
}</code></pre><figcaption><p><span style="white-space: pre-wrap;">Defining variants of grey using `color-mix()`.</span></p></figcaption></figure><p>Incorporate these variants into your design system however you like. For example, if you use <code>--color-accent-500</code> (the pure accent colour) as the text colour for buttons, you might use a darker variant like <code>--color-accent-600</code> for the hover and active states, and one of the greys for the disabled state.</p><figure class="kg-card kg-code-card"><pre><code class="language-css">button {
  color: var(--color-accent-500);
}

button:hover,
button:active {
  color: var(--color-accent-600);
}

button:disabled {
  color: var(--color-gray-500);
}</code></pre><figcaption><p><span style="white-space: pre-wrap;">Using the colour variants to style buttons.</span></p></figcaption></figure><p>You might not use every one of these variants in your styles – I rarely do – but having them makes it easy to tweak the contrast between elements without altering the basic hue.</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ How to Make Beeswax Paste ]]></title>
        <description><![CDATA[ Make a simple and versatile paste wax with besswax and mineral oil. You can use it as a renewable food-safe finish, a rust inhibitor, or a light lubricant. ]]></description>
        <link>https://tonywallace.com/how-to-make-beeswax-paste/</link>
        <guid isPermaLink="false">69330f19db88f40001558d40</guid>
        <category><![CDATA[ Woodworking ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Fri, 05 Dec 2025 18:12:13 +0000</pubDate>
        <media:content url="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2025/12/beeswax.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<aside class="gh-post-upgrade-cta">
    <div class="gh-post-upgrade-cta-content" style="background-color: #6795cb">
                <h2>This post is for subscribers only</h2>
            <a class="gh-btn" data-portal="signup" href="#/portal/signup" style="color:#6795cb">Subscribe now</a>
            <p><small>Already have an account? <a data-portal="signin" href="#/portal/signin">Sign in</a></small></p>
    </div>
</aside>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Create an Ergonomic Sanding Block From an Old Hand Plane ]]></title>
        <description><![CDATA[ How to easily and inexpensively adapt an old flea market hand plane to be used as a comfortable sanding block for large surfaces. ]]></description>
        <link>https://tonywallace.com/create-an-ergonomic-sanding-block-from-an-old-hand-plane/</link>
        <guid isPermaLink="false">6931f5fc4586720001469489</guid>
        <category><![CDATA[ Woodworking ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Thu, 04 Dec 2025 21:01:37 +0000</pubDate>
        <media:content url="https://storage.ghost.io/c/c7/b6/c7b6bcc1-8332-4c1f-bb68-1960fb8a8798/content/images/2025/12/sanding-block-assembled-1.webp" medium="image"/>
        <content:encoded><![CDATA[ 
<aside class="gh-post-upgrade-cta">
    <div class="gh-post-upgrade-cta-content" style="background-color: #6795cb">
                <h2>This post is for subscribers only</h2>
            <a class="gh-btn" data-portal="signup" href="#/portal/signup" style="color:#6795cb">Subscribe now</a>
            <p><small>Already have an account? <a data-portal="signin" href="#/portal/signin">Sign in</a></small></p>
    </div>
</aside>
 ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Welcome ]]></title>
        <description><![CDATA[ A new tonywallace.com for 2026. ]]></description>
        <link>https://tonywallace.com/welcome/</link>
        <guid isPermaLink="false">6931814d0b7517000837d997</guid>
        <category><![CDATA[ News ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Thu, 04 Dec 2025 12:40:45 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>2026 is almost upon us and it's time for a new website. </p><p>My last site was a static site built with Eleventy. It worked well enough (and cost nothing) but the publishing process, while not <em>terribly</em> onerous, still discouraged me from writing. Plus, any new post would have to be accompanied by a newsletter for anyone to notice it, which was just another thing to do.</p><p>This site is hosted with <a href="https://ghost.org/?ref=tonywallace.com">ghost</a> and uses a custom theme that I can update easily on a whim. Or when something breaks. The big benefit of this setup is that I can type and press a _Publish_ button like a normal person, and other people (like you!) can <a href="#/portal/">subscribe</a> and receive posts by email.</p><p>If you know me at all, it's likely that you know me as a software developer. Maybe as the guy who made the (now defunct) <a href="https://cdm.link/drum-machines-browser-tab-places-find-web-audio/?ref=tonywallace.com" rel="noreferrer">WebX0X</a> drum machine back in 2015. I will occasionally write about software here, but my focus will be on woodworking and guitar making. Life's too short to stare at a screen all day, but I hope you'll find a few minutes to follow along with me.</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing Serialist ]]></title>
        <description><![CDATA[ Serialist is a live coding environment that uses serialist-grammar to generate MIDI messages. ]]></description>
        <link>https://tonywallace.com/serialist/</link>
        <guid isPermaLink="false">695fc63e1ba5ea0001d1639a</guid>
        <category><![CDATA[ Audio ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Sun, 20 Nov 2016 00:00:00 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <div class="kg-card kg-callout-card kg-callout-card-accent"><div class="kg-callout-emoji">⚠️</div><div class="kg-callout-text">This post was originally published on the Irritant Creative blog but was moved here to preserve history. Please update your links. If you're looking for the Irritant Creative website, <a href="https://irritantcreative.ca/?ref=tonywallace.com" rel="noreferrer">click here</a>.</div></div><p></p><p>Serialist is a live coding environment that uses <a href="https://github.com/irritant/serialist-grammar?ref=tonywallace.com">serialist-grammar</a> to generate MIDI messages. It requires a MIDI synthesizer (software or hardware) and does not generate any sound on its own.</p><p>View the project on <a href="https://github.com/irritant/serialist?ref=tonywallace.com">Github</a>. Just want to play? Visit <a href="http://serialist.irritantcreative.ca/?ref=tonywallace.com">serialist.irritantcreative.ca</a> for the live demo.</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing serialist-grammar ]]></title>
        <description><![CDATA[ A new grammar and parser for the expression and transformation of rows in serial music composition. ]]></description>
        <link>https://tonywallace.com/serialist-grammar/</link>
        <guid isPermaLink="false">695fc7e51ba5ea0001d163bf</guid>
        <category><![CDATA[ Audio ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Thu, 03 Nov 2016 00:00:00 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <div class="kg-card kg-callout-card kg-callout-card-accent"><div class="kg-callout-emoji">⚠️</div><div class="kg-callout-text">This post was originally published on the Irritant Creative blog but was moved here to preserve history. Please update your links. If you're looking for the Irritant Creative website, <a href="https://irritantcreative.ca/?ref=tonywallace.com" rel="noreferrer">click here</a>.</div></div><p></p><p>A few weeks ago, I attended the <a href="http://iclc.livecodenetwork.org/2016/?ref=tonywallace.com">International Conference on Live Coding</a> at McMaster University in Hamilton, Ontario, Canada. The opening day workshops inspired me to design a new grammar and parser for the expression and transformation of rows in <a href="https://en.wikipedia.org/wiki/Serialism?ref=tonywallace.com">serial music composition</a>. The resulting JavaScript library is called serialist-grammar and is available for free on <a href="https://github.com/irritant/serialist-grammar?ref=tonywallace.com">Github</a> and <a href="https://www.npmjs.com/package/serialist-grammar?ref=tonywallace.com">npm</a>.</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ webx0x.com - Save and Share Your Beats ]]></title>
        <description><![CDATA[ WebX0X has a new home at WebX0X.com. ]]></description>
        <link>https://tonywallace.com/webx0x-com/</link>
        <guid isPermaLink="false">695fc5501ba5ea0001d16389</guid>
        <category><![CDATA[ Audio ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Tue, 08 Sep 2015 00:00:00 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <div class="kg-card kg-callout-card kg-callout-card-accent"><div class="kg-callout-emoji">⚠️</div><div class="kg-callout-text">This post was originally published on the Irritant Creative blog but was moved here to preserve history. Please update your links. If you're looking for the Irritant Creative website, <a href="https://irritantcreative.ca/?ref=tonywallace.com" rel="noreferrer">click here</a>.</div></div><p></p><p><a href="https://webx0x.com/?ref=tonywallace.com">WebX0X</a> has a new home at <a href="https://webx0x.com/?ref=tonywallace.com">WebX0X.com</a>. This update enables saving and sharing your beats.</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Introducing WebX0X ]]></title>
        <description><![CDATA[ WebX0X is a drum synthesizer and sequencer built using the Web Audio API. All sound generation is performed entirely in the browser without the use of samples. ]]></description>
        <link>https://tonywallace.com/webx0x/</link>
        <guid isPermaLink="false">695fc2b81ba5ea0001d1636f</guid>
        <category><![CDATA[ Audio ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Thu, 18 Jun 2015 00:00:00 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <div class="kg-card kg-callout-card kg-callout-card-accent"><div class="kg-callout-emoji">⚠️</div><div class="kg-callout-text">This post was originally published on the Irritant Creative blog but was moved here to preserve history. Please update your links. If you're looking for the Irritant Creative website, <a href="https://irritantcreative.ca/?ref=tonywallace.com" rel="noreferrer">click here</a>.</div></div><p></p><p><a href="https://tonywallace.com/projects/x0x">WebX0X</a> is a drum synthesizer and sequencer built using the Web Audio API. All sound generation is performed entirely in the browser without the use of samples.</p><p>Web Audio promises to bring high performance, low latency audio playback, processing and synthesis to the web. It's an intriguing prospect, since web browsers' audio capabilities have historically been limited to playback of pre-recorded files. Simple playback is important - it's easily the most common way that most people experience digital audio on the web - but without tools to generate and modify sound our creative options are restricted. Web Audio gives us those tools. WebX0X is a demonstration of some of its possibilities.</p><p>WebX0X takes its name from the classic drum machines made by Roland in the 1980s, most notably the <a href="https://en.wikipedia.org/wiki/Roland_TR-606?ref=tonywallace.com">TR-606</a>, <a href="https://en.wikipedia.org/wiki/Roland_TR-707?ref=tonywallace.com">TR-707</a>, <a href="https://en.wikipedia.org/wiki/Roland_TR-808?ref=tonywallace.com">TR-808</a> and <a href="https://en.wikipedia.org/wiki/Roland_TR-909?ref=tonywallace.com">TR-909</a>. Like the 606 and 808, WebX0X synthesizes all its sounds using simple oscillators, noise generators, filters and envelope generators (the 909 used a mix of analog synthesis and digital samples, while the later 707 was entirely sample based), and has an integrated step sequencer to control patterns. WebX0X has 4 synthesizers, or ‘voices’. Unlike most classic analog drum machines, WebX0X uses the same algorithm for all voices. Each voice is tuned to resemble a different kind of drum by default (kick, snare, hihat and cowbell), but is also capable of a wide variety of other percussive sounds. This makes WebX0X very flexible.</p><h2 id="voice-architecture">Voice Architecture</h2><p>Each voice has two signal paths, <em>Tone</em> and <em>Noise</em> that are combined at the <em>Mix</em> stage.</p><h3 id="tone">Tone</h3><p>The <em>Tone</em> signal path consists of an oscillator, a filter and an amplifier. It can be used to give a sound ‘body’, like the ringing of a snare drum or the booming sound of a kick drum.</p><h4 id="oscillator">Oscillator</h4><ul><li><em>Waveform:</em> Selects the oscillator's waveform (<em>triangle</em>, <em>sawtooth</em> or <em>square</em>).</li><li><em>Initial Pitch:</em> Controls the oscillator's frequency at the onset of a sound.</li><li><em>Final Pitch:</em> Controls the oscillator's resting frequency.</li><li><em>Pitch Decay:</em> Controls the time it takes to transition from <em>Initial Pitch</em> to <em>Final Pitch</em>.</li><li><em>Decay Curve:</em> Selects the curve used by the pitch envelope generator (<em>linear</em> or <em>exponential</em>).</li></ul><h4 id="filter">Filter</h4><ul><li><em>Type:</em> Selects the filter's algorithm (<em>lowpass</em>, <em>highpass</em> or <em>bandpass</em>).</li><li><em>Initial Cutoff:</em> Controls the filter's cutoff frequency at the onset of a sound.</li><li><em>Final Cutoff:</em> Controls the filter's resting cutoff frequency.</li><li><em>Cutoff Decay:</em> Controls the time it takes to transition from <em>Initial Cutoff</em> to <em>Final Cutoff</em>.</li><li><em>Q:</em> Controls the filter's resonance or bandwidth.</li><li><em>Decay Curve:</em> Selects the curve used by the filter cutoff envelope generator (<em>linear</em> or <em>exponential</em>).</li></ul><h4 id="amp">Amp</h4><ul><li><em>Level:</em> Controls the tone's volume at the onset of a sound.</li><li><em>Decay:</em> Controls the time it takes to transition from <em>Level</em> to silence. This determines the perceived length of the tone.</li><li><em>Decay Curve:</em> Controls the curve used by the amp envelope generator (<em>linear</em> or <em>exponential</em>).</li></ul><h3 id="noise">Noise</h3><p>The <em>Noise</em> signal path consists of a noise generator, a filter and an amplifier. It can be used to give a sound ‘snap’, like the snares on a snare drum or the attack of a kick drum. It is also the main component of hihat and cymbal sounds.</p><h4 id="oscillator-1">Oscillator</h4><ul><li><em>Color:</em> Controls the quality of the noise source. Lower settings generate a more stable, ‘pure’ sound. Higher settings reduce fidelity.</li></ul><h4 id="filter-1">Filter</h4><ul><li>Similar to the <em>Tone Filter</em> section.</li></ul><h4 id="amp-1">Amp</h4><ul><li>Similar to the <em>Tone Amp</em> section.</li></ul><h3 id="mix">Mix</h3><ul><li><em>Level:</em> Controls the voice's overall volume.</li><li><em>Mute:</em> Mutes or unmutes the voice.</li></ul><h2 id="sequencer">Sequencer</h2><p>Each voice has a 32 step sequencer. Each step represents one sixteenth note. Turn steps on or off by clicking them. The voice will play when the sequencer's playback position reaches a step that is on (highlighted).</p><p>All four sequencers are synced and controlled by the global transport buttons (<em>Play/Pause</em> and <em>Stop</em>) and tempo input.</p><h2 id="browser-compatibility">Browser Compatibility</h2><p>WebX0X supports recent versions of Chrome, Firefox and Safari on desktop (Chrome works best). It has also been tested in Mobile Safari (iOS 8).</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ WebSynthUI ]]></title>
        <description><![CDATA[ WebSynthUI is a collection of HTML5 UI components. ]]></description>
        <link>https://tonywallace.com/web-synth-ui/</link>
        <guid isPermaLink="false">695e7f6acf5f8000016fcd1a</guid>
        <category><![CDATA[ Programming ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Tue, 09 Jun 2015 00:00:00 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p><a href="https://github.com/irritant/WebSynthUI?ref=tonywallace.com">WebSynthUI</a> is a collection of HTML5 UI components that I designed for a Web Audio project I'm working on, but that could be just as useful in other interfaces. It currently consists of a rotary knob, a segmented switch and a toggle switch.</p><p>I plan to add more components as I have time. The most obvious omissions from the current collection are horizontal and vertical faders, and a momentary switch or trigger pad, so I'll try to get to those soon.</p><p><a href="https://github.com/irritant/WebSynthUI?ref=tonywallace.com">Check out the source on Github.</a></p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ WebDrum ]]></title>
        <description><![CDATA[ WebDrum is a WebAudio drum synthesizer. ]]></description>
        <link>https://tonywallace.com/web-drum/</link>
        <guid isPermaLink="false">695e8285cf5f8000016fcd53</guid>
        <category><![CDATA[ Programming ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Sat, 14 Mar 2015 00:00:00 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p><a href="https://github.com/irritant/WebDrum?ref=tonywallace.com">WebDrum</a> is a WebAudio drum synthesizer that uses my <a href="https://github.com/irritant/WebNoise?ref=tonywallace.com">WebNoise</a> and <a href="https://github.com/irritant/WebAHDSR?ref=tonywallace.com">WebAHDSR</a> projects. Each WebDrum instance can be configured to produce a single drum sound. You can create as many instances as browser performance will allow to produce a varied drum set.</p><p>Speaking of browser performance, Chrome currently handles projects with large or complex audio graphs better than Firefox or Safari, so I recommend running WebDrum under Chrome.</p><p><a href="https://github.com/irritant/WebDrum?ref=tonywallace.com">Check out the source on Github.</a></p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ WebSequence ]]></title>
        <description><![CDATA[ WebSequence is a sequencing toolbox intended for use in WebAudio projects. ]]></description>
        <link>https://tonywallace.com/web-sequence/</link>
        <guid isPermaLink="false">695e8036cf5f8000016fcd2d</guid>
        <category><![CDATA[ Programming ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Sat, 07 Mar 2015 00:00:00 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p><a href="https://github.com/irritant/WebSequence?ref=tonywallace.com">WebSequence</a> is a sequencing toolbox intended for use in WebAudio projects, but it is also usable for repetitive timing tasks in non-audio projects. It consists of two objects:</p><ul><li><em>WebSequence</em> controls the order and execution of a series of <em>events</em>. Events are merely functions that execute arbitrary code at a given step in the sequence. Sequences may be modified by adding, replacing or removing events at any time, even during playback.</li><li><em>WebSequenceTimer</em> controls the timing pulse for one or more <em>WebSequence</em> objects. The time interval between pulses can be set in milliseconds or by specifying a tempo in beats per minute and a duration (e.g. <code>1/4</code> for a quarter note).</li></ul><p><a href="https://github.com/irritant/WebSequence?ref=tonywallace.com">Check out the source on Github.</a></p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ WebNoise ]]></title>
        <description><![CDATA[ WebNoise is a noise generator for WebAudio. ]]></description>
        <link>https://tonywallace.com/web-noise/</link>
        <guid isPermaLink="false">695e80fbcf5f8000016fcd40</guid>
        <category><![CDATA[ Programming ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Sun, 22 Feb 2015 00:00:00 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p><a href="https://github.com/irritant/WebNoise?ref=tonywallace.com">WebNoise</a> is a noise generator for WebAudio. You can adjust the noise character by setting the block size, which changes the frequency at which the output value fluctuates. This feature was influenced by Hexinverter's excellent <a href="http://cv.hexinverter.net/?projects=vcnoiz-v10&ref=tonywallace.com">VCNoiz</a> Eurorack module.</p><p><a href="https://github.com/irritant/WebNoise?ref=tonywallace.com">Check out the source on Github.</a></p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ WebAHDSR ]]></title>
        <description><![CDATA[ WebAHDSR is an envelope generator that controls the value of any JavaScript AudioParam. ]]></description>
        <link>https://tonywallace.com/web-ahdsr/</link>
        <guid isPermaLink="false">695e8303cf5f8000016fcd66</guid>
        <category><![CDATA[ Programming ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Mon, 16 Feb 2015 00:00:00 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p><a href="https://github.com/irritant/WebAHDSR?ref=tonywallace.com">WebAHDSR</a> is an envelope generator that controls the value of any JavaScript AudioParam. Useful if you want to create synthesizers using the WebAudio API.</p><p><a href="https://github.com/irritant/WebAHDSR?ref=tonywallace.com">Check out the source on Github.</a></p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ Sequencing with TWNote ]]></title>
        <description><![CDATA[ A tutorial on using TWNote, TWPitch and TWDuration in SuperCollider. ]]></description>
        <link>https://tonywallace.com/twnote-tutorial/</link>
        <guid isPermaLink="false">695e857ecf5f8000016fcdac</guid>
        <category><![CDATA[ Programming ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Thu, 01 Jan 2015 16:10:00 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>I designed <a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com#twnote">TWNote</a> (and its constituent classes, <a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com#twpitch">TWPitch</a> and <a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com#twduration">TWDuration</a>) to make working with traditional musical notes in <a href="https://github.com/supercollider/supercollider?ref=tonywallace.com">SuperCollider</a> easier. This tutorial will demonstrate how to use TWNote and SuperCollider's <a href="http://doc.sccode.org/Classes/Task.html?ref=tonywallace.com">Task</a> object to create sequences.</p><p><em>This tutorial assumes that you have basic working knowledge of the SuperCollider language. If you need help, the </em><a href="http://doc.sccode.org/Help.html?ref=tonywallace.com"><em>SuperCollider documentation</em></a><em> is a good place to start.</em></p><h2 id="installing-twsupercolliderextensions">Installing TWSuperColliderExtensions</h2><p>Follow the <a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com#installation">TWSuperColliderExtensions installation instructions</a> before continuing with this tutorial.</p><h2 id="introducing-twpitch-twduration-and-twnote">Introducing TWPitch, TWDuration and TWNote</h2><h3 id="twpitch">TWPitch</h3><p><a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com#twpitch">TWPitch</a> describes a pitch as a combination of a <a href="http://en.wikipedia.org/wiki/Pitch_class?ref=tonywallace.com">pitch class</a> and octave. The pitch class and octave may be provided or inferred from a MIDI note number:</p><pre><code class="language-supercollider">(
    var pitch1 = TWPitch.newPitch(pitchClass: 9, octave: 5);
    pitch1.pitchClass.postln; // 9
    pitch1.octave.postln; // 5
    pitch1.midiNoteNumber.postln; // 69
    pitch1.frequency.postln; // 440

    var pitch2 = TWPitch.newPitchWithMIDINoteNumber(noteNumber: 69);
    pitch2.pitchClass.postln; // 9
    pitch2.octave.postln; // 5
    pitch2.midiNoteNumber.postln; // 69
    pitch2.frequency.postln; // 440
)
</code></pre><p>TWPitch calculates frequency based on a reference frequency that defaults to 440Hz. You can change the reference frequency globally for all instances of TWPitch:</p><pre><code class="language-supercollider">TWPitch.setReferenceFrequency(442.0);
</code></pre><p>If the new reference frequency does not relate to the note A in the 5th octave, you will also need to change the reference pitch class and octave:</p><pre><code class="language-supercollider">// Set the reference frequency to approximately C (pitch class 0) in the 4th octave (slightly flat):
TWPitch.setReferenceFrequency(130.8);
TWPitch.setReferencePitchClass(0);
TWPitch.setReferenceOctave(4);

(
    var pitch = TWPitch.newPitch(pitchClass: 9, octave: 5);
    pitch.pitchClass.postln; // 9
    pitch.octave.postln; // 5
    pitch.midiNoteNumber.postln; // 69
    pitch.frequency.postln; // ~439.957
)
</code></pre><p>TWPitch can also provide a MIDI-compatible octave number. By default, the MIDI octave is equal to <code>pitch.octave - 1</code>. This is appropriate for most MIDI systems. Some systems (eg. Yamaha) use <code>pitch.octave - 2</code>, which can be obtained by adjusting the MIDI base octave:</p><pre><code class="language-supercollider">(
    var pitch1 = TWPitch.newPitch(pitchClass: 9, octave: 5);
    pitch1.octave.postln; // 5
    pitch1.midiOctave.postln; // 4
)

TWPitch.setMIDIBaseOctave(-2); // Allowable range is -2..0

(
    var pitch2 = TWPitch.newPitch(pitchClass: 9, octave: 5);
    pitch2.octave.postln; // 5
    pitch2.midiOctave.postln; // 3
)
</code></pre><h3 id="twduration">TWDuration</h3><p><a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com#twduration">TWDuration</a> describes a note duration as a fraction, in which the denominator represents a division of a typical 4 beat measure (eg. <code>4</code> for a quarter note or <code>8</code> for an eighth note) and the numerator represents the number of divisions:</p><pre><code class="language-supercollider">var wholeNote = TWDuration.newDuration(numerator: 1, denominator: 1);
var halfNote = TWDuration.newDuration(numerator: 1, denominator: 2);
var quarterNote = TWDuration.newDuration(numerator: 1, denominator: 4);
var eighthNote = TWDuration.newDuration(numerator: 1, denominator: 8);
var sixteenthNote = TWDuration.newDuration(numerator: 1, denominator: 16);
var dottedHalfNote = TWDuration.newDuration(numerator: 3, denominator: 4);
var dottedQuarterNote = TWDuration.newDuration(numerator: 3, denominator: 8);
var eighthNoteTriplet = TWDuration.newDuration(numerator: 1, denominator: 12);
var quarterNoteTriplet = TWDuration.newDuration(numerator: 2, denominator: 12);
</code></pre><p>The value of a TWDuration can be calculated as a decimal value:</p><pre><code class="language-supercollider">(
    var duration = TWDuration.newDuration(numerator: 1, denominator: 8);
    duration.decimal.postln; // 0.125
)
</code></pre><p>As a clock value, which can be used with SuperCollider's Task object:</p><pre><code class="language-supercollider">(
    var duration = TWDuration.newDuration(numerator: 1, denominator: 8);
    duration.clock.postln; // 0.5
)
</code></pre><p>Or as time in seconds or milliseconds. Time calculations are based on a reference tempo, which defaults to 60 beats per minute. You can change the reference tempo globally for all instances of TWDuration:</p><pre><code class="language-supercollider">(
    var duration1 = TWDuration.newDuration(numerator: 1, denominator: 8);
    duration1.seconds.postln; // 0.5
    duration1.milliseconds.postln; // 500
)

TWDuration.setReferenceTempo(120.0);

(
    var duration2 = TWDuration.newDuration(numerator: 1, denominator: 8);
    duration2.seconds.postln; // 0.25
    duration2.milliseconds.postln; // 250
)
</code></pre><h3 id="twnote">TWNote</h3><p><a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com#twnote">TWNote</a> describes a note as a combination of a pitch (an instance of TWPitch) and a duration (an instance of TWDuration). TWNote objects also have a boolean property named <code>isRest</code> that indicates whether or not the note should be treated as a rest. <em>(It is the responsibility of the code that interprets the note to handle the rest properly.)</em></p><pre><code class="language-supercollider">(
    var note = TWNote.newNote;
    note.pitch.postln; // a TWPitch
    note.duration.postln; // a TWDuration
    note.isRest.postln; // false
)
</code></pre><p>TWNote has several constructors:</p><pre><code class="language-supercollider">// Verbose constructor:

(
    var note1 = TWNote.newNote(
        pitch: TWPitch.newPitch(
            pitchClass: 9,
            octave: 5),
        duration: TWDuration.newDuration(
            numerator: 1,
            denominator: 4),
        isRest: false);

    note1.pitch.pitchClass.postln; // 9
    note1.pitch.octave.postln; // 5
    note1.pitch.midiNoteNumber.postln; // 69
    note1.pitch.frequency.postln; // 440
    note1.duration.decimal.postln; // 0.25
    note1.isRest.postln; // false
)

// Convenience constructors:

(
    var note2 = TWNote.newNoteWithPitchClass(
        pitchClass: 9,
        octave: 5,
        durationNumerator: 1,
        durationDenominator: 4);

    note2.pitch.pitchClass.postln; // 9
    note2.pitch.octave.postln; // 5
    note2.pitch.midiNoteNumber.postln; // 69
    note2.pitch.frequency.postln; // 440
    note2.duration.decimal.postln; // 0.25
    note2.isRest.postln; // false
)

(
    var note3 = TWNote.newNoteWithMIDINoteNumber(
        noteNumber: 69,
        durationNumerator: 1,
        durationDenominator: 4);

    note3.pitch.pitchClass.postln; // 9
    note3.pitch.octave.postln; // 5
    note3.pitch.midiNoteNumber.postln; // 69
    note3.pitch.frequency.postln; // 440
    note3.duration.decimal.postln; // 0.25
    note3.isRest.postln; // false
)

(
    var rest = TWNote.newRest(
        durationNumerator: 1,
        durationDenominator: 4);

    rest.duration.decimal.postln; // 0.25
    rest.isRest.postln; // true
)
</code></pre><h2 id="sequencing-twnote-objects-with-tasks">Sequencing TWNote Objects With Tasks</h2><p>SuperCollider's <a href="http://doc.sccode.org/Classes/Task.html?ref=tonywallace.com">Task</a> object provides a convenient and powerful way to sequence events that works well with TWNote. You can build simple sequence with a list of TWNote objects:</p><pre><code class="language-supercollider">(
    // Create a global clock using the TWDuration reference tempo:
    ~clock = TempoClock.new(TWDuration.referenceTempo / 60.0);

    var sequence = Task({[
        TWNote.newNoteWithPitchClass(pitchClass: 0, octave: 5, durationNumerator: 1, durationDenominator: 4),
        TWNote.newNoteWithPitchClass(pitchClass: 4, octave: 5, durationNumerator: 1, durationDenominator: 4),
        TWNote.newNoteWithPitchClass(pitchClass: 5, octave: 5, durationNumerator: 1, durationDenominator: 4),
        TWNote.newNoteWithPitchClass(pitchClass: 11, octave: 4, durationNumerator: 1, durationDenominator: 4)
        ].do({
            // The .do function receives the note object as its first argument:
            arg note;
            // Print the note's frequency:
            note.pitch.frequency.postln;
            // Wait for the duration of the note's clock value:
            note.duration.clock.wait;
        });
    }, ~clock);

    sequence.play;
)
</code></pre><p>Now add a simple SynthDef to play each note in the sequence:</p><pre><code class="language-supercollider">// Boot the local server:
Server.default = s = Server.local.boot;

(
    SynthDef(\osc, {
        arg frequency = 440.0, duration = 1.0;
        var attack = 0.05;
        var decay = 0.1;
        var hold = duration - (attack + decay);
        var osc = SinOsc.ar(
            freq: frequency,
            mul: EnvGen.kr(
                envelope: Env(
                    levels: [0.000001, 0.1, 0.1, 0.000001],
                    times: [attack, hold, decay],
                    curve: \exponential
                ),
                doneAction: 2)
        );
        Out.ar([0, 1], osc);
    }).load(s);
)

(
    // Create a global clock using the TWDuration reference tempo:
    ~clock = TempoClock.new(TWDuration.referenceTempo / 60.0);

    var sequence = Task({[
        TWNote.newNoteWithPitchClass(pitchClass: 0, octave: 5, durationNumerator: 1, durationDenominator: 4),
        TWNote.newNoteWithPitchClass(pitchClass: 4, octave: 5, durationNumerator: 1, durationDenominator: 4),
        TWNote.newNoteWithPitchClass(pitchClass: 5, octave: 5, durationNumerator: 1, durationDenominator: 4),
        TWNote.newNoteWithPitchClass(pitchClass: 11, octave: 4, durationNumerator: 1, durationDenominator: 4)
        ].do({
            // The .do function receives the note object as its first argument:
            arg note;
            // Use the time in seconds for the synth duration:
            Synth(\osc, [frequency: note.pitch.frequency, duration: note.duration.seconds]);
            // Wait for the duration of the note's clock value:
            note.duration.clock.wait;
        });
    }, ~clock);

    sequence.play;
)
</code></pre><p>Polyphonic sequences can be created by combining multiple Task objects. Notice how rests are handled in <code>sequence2</code>:</p><pre><code class="language-supercollider">// Boot the local server:
Server.default = s = Server.local.boot;

(
    SynthDef(\osc, {
        arg frequency = 440.0, duration = 1.0;
        var attack = 0.05;
        var decay = 0.1;
        var hold = duration - (attack + decay);
        var osc = SinOsc.ar(
            freq: frequency,
            mul: EnvGen.kr(
                envelope: Env(
                    levels: [0.000001, 0.1, 0.1, 0.000001],
                    times: [attack, hold, decay],
                    curve: \exponential
                ),
                doneAction: 2)
        );
        Out.ar([0, 1], osc);
    }).load(s);
)

(
    // Create a global clock using the TWDuration reference tempo:
    ~clock = TempoClock.new(TWDuration.referenceTempo / 60.0);

    var sequence1 = Task({[
        TWNote.newNoteWithPitchClass(pitchClass: 0, octave: 5, durationNumerator: 1, durationDenominator: 4),
        TWNote.newNoteWithPitchClass(pitchClass: 4, octave: 5, durationNumerator: 1, durationDenominator: 4),
        TWNote.newNoteWithPitchClass(pitchClass: 5, octave: 5, durationNumerator: 1, durationDenominator: 4),
        TWNote.newNoteWithPitchClass(pitchClass: 11, octave: 4, durationNumerator: 1, durationDenominator: 4)
        ].do({
            // The .do function receives the note object as its first argument:
            arg note;
            // Use the time in seconds for the synth duration:
            Synth(\osc, [frequency: note.pitch.frequency, duration: note.duration.seconds]);
            // Wait for the duration of the note's clock value:
            note.duration.clock.wait;
        });
    }, ~clock);

    var sequence2 = Task({[
        TWNote.newRest(durationNumerator: 2, durationDenominator: 12),
        TWNote.newNoteWithPitchClass(pitchClass: 0, octave: 6, durationNumerator: 1, durationDenominator: 4),
        TWNote.newNoteWithPitchClass(pitchClass: 11, octave: 5, durationNumerator: 1, durationDenominator: 4),
        TWNote.newNoteWithPitchClass(pitchClass: 9, octave: 5, durationNumerator: 1, durationDenominator: 4),
        TWNote.newNoteWithPitchClass(pitchClass: 7, octave: 5, durationNumerator: 1, durationDenominator: 12)
        ].do({
            arg note;
            // Do not play the synth during rests, but do wait out the duration:
            if (note.isRest.not, {
                Synth(\osc, [frequency: note.pitch.frequency, duration: note.duration.seconds]);
            });
            note.duration.clock.wait;
        });
    }, ~clock);

    var polySequence = Task({
        sequence1.play;
        sequence2.play;
    }, ~clock);

    polySequence.play;
)
</code></pre><p>Be sure to check out the full documentation for <a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com#twnote">TWNote</a>, <a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com#twpitch">TWPitch</a> and <a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com#twduration">TWDuration</a>. Documentation and help for the SuperCollider language is available at <a href="http://doc.sccode.org/Help.html?ref=tonywallace.com">doc.sccode.org</a>.</p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ TWNote SuperCollider Extension ]]></title>
        <description><![CDATA[ TWNote is a SuperCollider extension that combines one instance each of TWPitch and TWDuration to create a description of a musical note. ]]></description>
        <link>https://tonywallace.com/twnote/</link>
        <guid isPermaLink="false">695e842bcf5f8000016fcd8a</guid>
        <category><![CDATA[ Programming ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Thu, 01 Jan 2015 00:00:00 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p><a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com#twnote">TWNote</a> is a <a href="https://github.com/supercollider/supercollider?ref=tonywallace.com">SuperCollider</a> extension that combines one instance each of <a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com#twpitch">TWPitch</a> and <a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com#twduration">TWDuration</a> to create a description of a musical note.</p><p><a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com">Check out the source on Github.</a></p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ TWDuration SuperCollider Extension ]]></title>
        <description><![CDATA[ TWDuration is a SuperCollider extension that facilitates conversion from fractional note durations to time in seconds and milliseconds. ]]></description>
        <link>https://tonywallace.com/twduration/</link>
        <guid isPermaLink="false">695e8545cf5f8000016fcd9b</guid>
        <category><![CDATA[ Programming ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Wed, 31 Dec 2014 00:00:00 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p><a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com#twduration">TWDuration</a> is a <a href="https://github.com/supercollider/supercollider?ref=tonywallace.com">SuperCollider</a> extension that facilitates conversion from fractional note durations (eg. <code>1/4</code>, <code>1/8</code>, <code>1/16</code>) to time in seconds and milliseconds.</p><p><a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com">Check out the source on Github.</a></p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ TWPitch SuperCollider Extension ]]></title>
        <description><![CDATA[ TWPitch facilitates the use of pitch class notation in SuperCollider. ]]></description>
        <link>https://tonywallace.com/twpitch/</link>
        <guid isPermaLink="false">695e838fcf5f8000016fcd79</guid>
        <category><![CDATA[ Programming ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Tue, 23 Dec 2014 00:00:00 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p><a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com#twpitch">TWPitch</a> facilitates the use of pitch class notation in <a href="https://github.com/supercollider/supercollider?ref=tonywallace.com">SuperCollider</a>. Pitch class notation is a system in which pitches and their enharmonic equivalents are identified by integers ranging from <code>0</code> to <code>11</code>:</p><pre><code>0:  C
1:  C sharp / D flat
2:  D
...
9:  A
10: A sharp / B flat
11: B
</code></pre><p>Octaves are identified by integers ranging from <code>0</code> to <code>inf</code>. Pitch class <code>0</code> in octave <code>0</code> produces C at ~8.176Hz. Pitch class <code>9</code> in octave <code>5</code> produces A at 440.0Hz.</p><p><a href="https://github.com/irritant/TWSuperColliderExtensions?ref=tonywallace.com">Check out the source on Github.</a></p> ]]></content:encoded>
    </item>
    <item>
        <title><![CDATA[ WWDC 2013 ]]></title>
        <description><![CDATA[ A brief review of WWDC 2013. ]]></description>
        <link>https://tonywallace.com/wwdc-2013/</link>
        <guid isPermaLink="false">695e7eabcf5f8000016fcd0c</guid>
        <category><![CDATA[ Apple ]]></category>
        <dc:creator><![CDATA[ Tony Wallace ]]></dc:creator>
        <pubDate>Mon, 17 Jun 2013 00:00:00 +0000</pubDate>
        <media:content url="" medium="image"/>
        <content:encoded><![CDATA[ <p>I was lucky to be able to attend Apple's <a href="http://developer.apple.com/wwdc?ref=tonywallace.com">Worldwide Developer Conference</a> (WWDC) in San Francisco this year and I can't imagine a better year after 2007 to have been there. Seeing your primary platform recieve a massive design overhaul and then getting an entire week to soak in all the changes is something else, and the one-to-one time with Apple's engineers is invaluable. If you're an iOS or Mac developer and you haven't been to WWDC, try to get there.</p><p>If you care about iOS and OS X at all and still haven't seen the keynote, it's worth a few hours of your time. If you're an iOS developer, you <em>need</em> to bring yourself up to date with the new design language in iOS7, UIKit Dynamics, Multipeer Connectivity and SpriteKit (even if you aren't a game dev) first. They will change how you design your apps. The session videos are available in the <a href="https://itunes.apple.com/us/app/wwdc/id640199958?mt=8&ref=tonywallace.com">WWDC app</a> now.</p><p>A lot of apps are going to have to undergo significant change to look and feel right in iOS7. Within a day of the announcement I started planning a ground up redesign of Taxulator, inside and out. A simple freshening isn't going to cut it. It's time to rethink how the app works and how users will interact with it. Taxulator was the first app I built for the "old" iOS and I'm excited to bring it to iOS7, hopefully in time for the official release.</p> ]]></content:encoded>
    </item>

</channel>
</rss>