All posts by Mike Clements

Coffee Emergency

My 6 year old Delonghi ESAM330 failed me this morning. When the coffee machine breaks it’s a household emergency requiring immediate attention.

The symptom: when it turned on, the pump was working but water would not come out of the coffee dispenser nozzles, nor out of the water/steam nozzle. But water did flow into the drip pan.

The root cause: the high pressure side of the pump has 2 pipes. One goes to the system, the other is a high pressure safety bypass that works similar to the oil pressure relief valve in many cars. It has a spring pushing on a valve seat. If the system pressure gets too high (for example a pipe is clogged), the pressure works against the spring to open the valve and allow water to drain into the drip tray.

A picture’s worth 1,000 words:

You can see the spring inside the pressure relief line pushing to the right, on a little piston having a rubber seat on its face that blocks the high pressure port. That piston got stuck and wasn’t pushing against the valve, so the pressure relief valve was always open.

I removed the entire pump from the ESAM3300, then removed the large vertical white tube assembly that passes through the metal section, then removed the 2 valves at the top (the top double-U section unscrews from the rest of the white plastic). I removed the o-rings, disassembled the part including the spring and piston and soaked all the parts in 30% vinegar. Then rinsed them off, blasted out the lines with water and air pressure, applied Trident silicone grease (food grade, the same stuff I used to service SCUBA regulators) to the o-rings and seals, and reassembled everything.

When I turned it on and did a function test, the pump made a horrible metallic clacking sound. Oops! Looks like the pump must be primed. I filled a syringe with water and inserted it into the water input hose to the pump. I applied pressure to the syringe plunger until the line was pressurized, then turned on the ESAM3300. As the pump actuated, the line pressure I was applying with the syringe primed it.

It’s working like new again. Coffee emergency resolved!

Goodbye Evernote, Hello Obsidian

Summary

I’ve been an Evernote subscriber and daily user for the past 14 years. I recently switched to Obsidian. Key reasons:

  • Obsidian has native clients on all platforms: Windows, Mac, Linux, Android and iOS, while Evernote doesn’t support Linux.
  • The Obsidian clients are lightweight and fast, while the Evernote client is bloated and slow.
  • Obsidian stores your notes in text markup, using filesystem files & folders, while Evernote uses an opaque proprietary format and stores it on their servers.
  • Obsidian enables you to organize your notes into folders with no arbitrary limits to nesting depth or complexity, while Evernote limits you to a 2-level hierarchy of Stacks and Notebooks.
  • Obsidian enables you to store your notes anywhere you want on your device (even SD cards on Android devices), while Evernote stores it internally.
  • Obsidian cleanly separates the function of syncing data across devices, giving you several different options. Evernote’s syncing is built-in and proprietary.
  • Obsidian is free unless you want enterprise support or to use their data sync.

I had been using Evernote for so long, and had so much data in their system, I thought I was stuck with them for life. I dreaded switching tools because the effort of doing so seemed intimidating and risky. I am willing to pay for software and services, if they solve an important problem for me, I use them frequently, and they work well. But Evernote started failing on that last point.

The end state is that it took me 2 days to make the switch. This includes exporting all my data from Evernote, preserving its structure (stacks, notebooks, tags), getting into all my devices, running Obsidian clients on each device, synchronizing the data, and testing the system.

Part 1: Why Switch?

For the first few years Evernote was great. The only thing I didn’t like is they didn’t have a Linux client. I found the open source Nixnote2 project and even contributed some features to it in 2017. I used this for a few years until Evernote released their own Linux client, at which point I joined their beta program and started using it. It worked well and note taking life was good!

Later, Evernote not only stopped supporting their Linux client but also disabled it. And Nixnote2 didn’t work as well as it did before, due to changes Evernote made to their APIs. So I was stuck with using Evernote only in the browser. It worked OK, but not as nice as the desktop client.

Meanwhile, the Evernote Android clients were getting progressively bloated and slow with every release. Touch the app to start it, and wait up to a full minute before it’s usable. And even then it’s painfully slow. Almost unusable.

Also, Evernote was prone to sync errors when you work on more than 1 device. Edit a note and later a duplicate copy shows up because some other device hadn’t stored its changes, one got stale, Evernote couldn’t merge them so that is up to you to do manually. Ugh.

Finally, Evernote jacked up their prices, more than doubling the price of a basic personal subscription and limiting its functionality in an attempt to up-sell.

At this point my annual subscription was a few weeks away from renewing so I decided to check out alternatives.

Part 2: Pick an Alternative

There are many options for note takers. My most important requirements are support for Linux, data sync across devices, and lightweight fast clients. Also important to me is using accessible data formats and control over my data – where it resides, how I sync, etc. Last is price. Free is nice and I don’t mind setting things up on my own. But I’m willing to pay if necessary and it gives benefits worth the cost.

Obsidian met all these requirements so I gave it a whirl. My plan was to get it working and use it for a few weeks before I had to decide whether to renew Evernote.

Part 3: Setting up Obsidian

I found several great walk-throughs online about all of this, available to everyone, so I’m only going to outline the steps I followed and add a few tips.

Step 1: Export your Evernote Data

I used Evernote-Backup from GitHub. I installed and ran it inside a Python virtualenv just to be clean and safe.

This connects to the Evernote API to extract all your data, stores it in a local SQLite3 database, and exports ENEX files from that database. It preserves your Evernote stacks & folders too.

Note: the –single-notes flag is a bit confusing. It extracts each notebook to a separate file and it stores the files in folders representing their structure in Evernote. So far, so good. But when you import this into Obsidian, it ignores the directory structure, the stacks & notebooks are ignored, and all your notes appear in one big flat directory. Ugh!

The default behavior (without the –single-notes flag) creates an ENEX file for each notebook. Within each file are XML elements marking the individual notes it contains. This means it creates fewer files, yet larger ones. When you import this into Obsidian, it recreates the notebook structure and it also breaks the individual notes into separate .MD files. This is what I wanted!

At this point all my Evernote data was imported into Obsidian, preserving the folders. And I could also browse it in the filesystem. Any changes I made on one side (Obsidian or filesystem) appeared nearly instantly in the other. Very nice!

Step 2: Set up Sync

Next you need to decide how you want to synchronize your data across devices. You have several options:

  • Obsidian Sync: built-in, seamless, but opaque, and costs $10 / month.
  • Google Drive (DropBox, Box, etc.): copy your entire Obsidian data (directory tree) to the cloud storage system of your choice, and use the apps of your choice to synchronize it across your devices.
  • Git: copy your Obsidian data to GitHub/GitLab and use the apps of your choice to clone, push, branch, etc. across your devices.
  • Local: use Syncthing to sync devices on a local network.

All of these options are described in detail with tutorials you can find online. I chose Google Drive and it works nicely. My preferred sync apps:

FolderSync Pro is a great app that is highly configurable. The setup I’m using for Obsidian is a 2-way sync, including deletes and hidden files, scheduled daily, with instant sync of local changes on the mobile device. Using MD5 checksums makes the sync more efficient (both FolderSync and Google Drive support them).

Yet I have found that OverGrive is smarter & faster than FolderSync. For example if I move a directory, OverGrive handles it with a single operation – fast and efficient. Foldersync Pro handles it by downloading all the files in the new location and deleting them from the old location – much slower!

Update: Out with Google Drive!

The Problem

After a month of note-taking across 4 devices, a bunch of spurious files started appearing in Google Drive. After some testing I discovered what is going on, though I don’t know why. Here’s a simple example:

Suppose you have 2 devices, A and B. Your notes are in the cloud C. That makes 3 versions of your notes: C is the master with complete copies residing on A and B.

We start with A, B and C being identical. Now you edit a note N on device A, which uploads N to C. This should update and replace file N on C, but instead Google Drive creates a new file called “N (1)”. This downloads to device B as a new file.

Now if you edit note N on device B, you won’t see the changes made from A because they’re in a different file “N (1)”. If you don’t notice that N is out of date and you change it, device B uploads N to C and Google Drive duplicates the file again, to “N (2)”.

Now note N is split across 3 files, each having different changes that you need to manually merge and delete the duplicates.

The Solution

There is no solution. This behavior is built into Google Drive and cannot be changed. It’s been repeatedly reported as bug but they haven’t fixed it and never will.

Fortunately, we have several choices for cloud storage. I stopped using Google Drive and switched to S3.

In with Amazon S3

Obsidian has a community plug-in called Remotely Save. It is a free, open source GitHub project. Well, not entirely free. Most of its capabilities are free but it has extended capabilities if you pay for it. Fortunately, its basic free capabilities include bidirectional sync to a variety of cloud storage providers.

Using S3 to store Obsidian notes is a bit more complex to set up than consumer services like Google Drive or Dropbox. With S3 you need an AWS account, you need to create S3 buckets, set their security, create IAM users, etc. This is the kind of basic cloud stuff software engineers do every day, but normal people might find it confusing.

I did all that and it’s all working in S3 across 4 devices (desktop, laptop, phone, tablet). So far, so good!

This solution has the added benefit of relying on an Obsidian plug-in, which works seamlessly within Obsidian on all my devices, so I don’t need other software like OverGrive or FolderSync to do the job.

Conclusion

Obsidian is a better note taking experience than Evernote. Sync is the part of Obsidian that you must figure out on your own. Amazon S3 works well for me and the activity costs about 12 cents per month on my AWS bill. That’s pretty cheap considering I am a daily active user syncing across 4 devices.

Obsidian notes are in .MD format so I can read and write them with pretty much any app outside Obsidian if I want to. I can organize my notes (move folders around, etc.) from within Obsidian, or in a file manager, or at the command line, whatever tool is best for the task. And I have more confidence in my data, since I have total control over where it’s stored and how I back it up.

John Wayne / Palouse Trail

Summary

The Iron Horse / John Wayne / Palouse Trail is an old railroad line that runs across WA state into Idaho. I’ve been planning to ride it for years yet one thing or another always got in the way. From Sep 19 through 23 I finally rode it from N Bend to Othello and back with Andy and Brandon.

People who ride this trail usually go one-way the entire length to Idaho. We did it differently for a few reasons:

  • Accommodations: east of Othello there is no lodging, and food and water become scarce. We wanted to stay in motels each night in order to get a shower, a big meal, sleep in a bed. And pack lighter, not having to carry tents, sleeping bags, and extra food and water.
  • Logistics: a one-way trip lands you in Tekoa at the Idaho border, a town of less than 1,000 people having no lodging. You have no car, are nowhere near any major airport, and must find a way back to Seattle. An out and back trip makes for simpler planning.
  • Trail conditions: east of Othello, portions of the trail are closed requiring detours.
  • Geography and scenery: desert conditions start west of Othello and continue east to the Idaho border. Once you reach Othello you’ve already seen all the geography and scenery there is to see: mountains, forests, rivers, desert.

Over the 5 days we rode about 251 miles with 5,240′ of climbing. We rode for 4 of the days and took 1 rest day, averaging 63 miles for each riding day. Trail conditions varied from mostly hard-packed dirt/gravel, some soft loose gravel and sand, and a little pavement (mainly detours).

Equipment & Planning

Including everything we’d need for the next 5 days, each of us packed about 25 lbs. of stuff on our bikes – bags, clothes, chargers, food (when riding the trail), water.

I rode a dual suspension mountain bike with 27.5″ wheels, Brandon rode a gravel bike with 29″ wheels, and Andy rode a vintage mountain bike with 26″ wheels.

We planned to average 10-11 mph and that turned out to be pretty close. The longest days were around 10 hours of total time including stops. The shortest day was about 3.5 hours.

Day 1: Rattlesnake Lake to Ellensburg

76 miles, 1,713′ climb, peak 2,610′, 6:33 in motion, 8:48 total.

We started around 8:45 am from Rattlesnake Lake.

The 18 mile ride up to the Snoqualmie tunnel was a familiar warmup for the day.

By the time we got to Hyak and started down the other side things had warmed up.

This is a long but scenic day with varied geography: mountains, forest, river crossings, foothills changing to the flat plains of Eastern Washington. We stopped briefly in Cle Elum, then as we approached Ellensburg the pavement and buildings were a welcome sight after a long day.

We stayed at Hotel Windrow, which is in the town center with fine bars & restaurants in short walking distance. The staff was great and provided secure storage for our bikes. We had a big tasty meal at Ellensburg Pasta Company.

Day 2: Ellensburg to Othello

75 miles, 2,023′ climb, peak 2,593, 6:58 in motion, 10:30 total.

We got an early start, knowing this would be a long day. There is nothing between Ellensburg and Othello, so unless you are camping along the trail you’ve got to push all the way. It turned out to be the toughest day of the trip. I rode most of this section of the trail 3 years earlier, before my rear axle broke, so I was looking forward to finally completing it.

Trail conditions were a bit worse than 3 years ago, more sandy and rough. Yet still rideable – all of us had decent tires, Continental Cross Kings 2.2 inches wide and we wouldn’t want anything narrower. Like the prior day, the first 18 miles is a gradual climb to 2,600′, then a 17 mile descent to the Columbia River.

The descent is fast and easy, but the trail has sections with soft sand and others with sharp “baby head” sized rocks that you must weave around. We were having fun yet also dreading climbing back up this the next day. Smoke from nearby forest fires filled the valley and limited the views.

Above, that’s Mike in the distance; his full suspension bike gives a magic carpet ride over the rough stuff.

After crossing the Columbia River

we stopped under a tree for lunch and rest.

We had entered the desert-like terrain of central WA and the next 16 miles of the trail is very exposed, mostly hard-packed dirt with occasional sandy and gravel sections.

After another 10 miles we passed Smyrna, where my axle broke 3 years ago.

The trail detours on to Crab Creek Road, mostly gravel that was just deep enough to make riding frustratingly slow and inefficient, rolling up and down gentle hills for about 13 miles, where we hit another detour onto Highway 26.

Highway 26 is not a safe place for bicycles. Cars and big trucks zip along at 60+ mph and you never know when an inattentive driver will swerve into you. It was supposed to be less than a mile, then turning back onto other side roads. But we missed that turn and followed 26 all the way to Othello. Despite the conditions, this turned out to be shorter which was great since we were so tired.

These last 10 miles along Hwy 26 were the toughest of the entire trip. We were fatigued from the prior day, and from the past 30 miles on the exposed trail through desert conditions, and 2 full days of breathing air full of road dust and forest fire smoke. And I got a nasty wasp sting on my L shoulder through my jersey, which still itches today as I write this. Approaching Othello, the road climbs about 500′ to a plateau which took the very last wind out of our sails.

We first stopped at a Chevron station having a mini-mart that was ginormously surreal – call it a maxi-mart! We got some sorely needed food & drink, enjoyed the air conditioning and rested for a while. We stayed at the Othello Inn & Suites, which doesn’t look like much but the staff was accommodating and provided secure storage for our bikes. Recommended! We ate a big tasty dinner at Ramiro’s.

We were physically beat and the thought of repeating this long day in reverse was not appealing, especially the 17 mile sandy climb after crossing the Columbia, with a 25 mph headwind which would be nothing but a miserable suffer-fest. Over the evening we planned ways to skip that and get some rest and recovery.

Day 3: Othello to Ellensburg (Rest)

There is no taxi, Uber or Lyft in Othello – at least not on this Sunday. The Uber app said there were drivers, but that was a lie. Nor are any rental trucks available. We hired a taxi who drove up from Pasco to take me to Moses Lake, where I rented a 10′ box truck from Uhaul to drive from Othello to Ellensburg and drop off there. This eliminated a miserable suffer-fest riding day and gave us some earnestly needed recovery while preserving the rest of our ride planning.

We drove to Ellensburg, dropped off the truck

and stayed at Hotel Windrow again in the same exact room. Their roof is a great hang-out spot

and as the wind raged blowing forest fire smoke across the valley

we were happy not to be in the middle of that climbing 17 miles of sandy trail.

We tried to lunch at the Julep, but they were understaffed and service was so slow, we went to the Pearl which was much better. For dinner we hit Cornerstone Italian Kitchen which was pretty good, but not quite as good as the Pasta Company from a couple nights earlier.

Day 4: Ellensburg to Cle Elem

36 miles, 778′ climb, peak 2,260′, 3:03 in motion, 4:24 total.

No need to get up early, this would be a short day since we were riding day 1 in reverse, but splitting it across 2 days. We got a nice local breakfast at the historical Palace and hit the trail with high spirits both physically & mentally after a day of rest. It was cold enough to wear jackets.

Upon reaching Cle Elum

we had our first technical – Andy’s chain wrapped & twisted into a pretzel. It had one bent link that we managed to straighten with a pair of pliers and small crescent wrench. Fortunately, it ran straight and true for the rest of the ride.

We rode straight to Roslyn and had lunch at Basecamp, where Brandon’s dad Jeff met us. After visiting the Brick Saloon, Ice Cream (I got black licorice ice cream!) and the bike shop, we headed to Jeff’s nearby property

to work on bikes and clean ourselves up. After a tasty dinner at the Roslyn Mexican Grill, we head back to Chez Jeff and crashed for the night.

Day 5: Cle Elum to N Bend

61 miles, 724′ climb, peak 2,580′, 4:19 in motion, 5:21 total.

After a homemade breakfast with Jeff, we head out for the last day. We started day 1 at Rattlesnake Lake but now decided to ride past that into N Bend since the rest was all downhill.

The first 30 miles is a gradual climb to 2,600′. Upon reaching Lake Keechelus (which was very low on water)

we were on familiar territory and rested at Hyak. Through the tunnel, Andy suddenly poured on the coals and Brandon and I made an all-out effort to keep up. It turned out to be more than just a burst of energy, since after the tunnel we sustained the fast pace for the next 18 miles, reaching Rattlesnake Lake in 1 hour.

We continued down the hill on the Snoqualmie Valley Trail to Tanner, then into N Bend to Rio Bravo, where we often lunch after long rides in the area. The ride was complete!

Conclusion

In hindsight, our planning was solid. The best part of the trail is the western half. Riding the eastern half entails bike camping and more complex logistics with little or no benefit in terms of scenery or geography. Various agencies plan to improve the eastern half of the trail. If in future years their efforts end up restoring a continuous trail, it may be worthwhile to go back and ride that section.

Meanwhile, we are considering completing the adventure by riding from the Pacific Ocean to N Bend. This looks much more interesting in terms of scenery and geography, and more feasible with trails and towns.

Overall, it was a fun adventure. Enough of a physical challenge to give a sense of accomplishment without being brutally hard. Changing Day 3 into a rest day was an unexpected twist, but a wise adaptation to the trail conditions and our physical state. Spending 5 days with friends and getting to know each other better through a challenging yet fun adventure as everyone kept up good spirits and camaraderie was priceless.

Etcetera

Months before the trip, Mike completed rites of resurrection on Andy’s vintage bike, giving it a complete soup to nuts overhaul. Here he is a week or two before the ride,

topping off the work with a period correct Suntour Mountech II rear derailleur:

It came from eBay, new old stock, in perfect condition, with no sign of ever having been installed on a bike before. What a beautiful piece of vintage engineering: dual pivots and routing the cable through the inside of the parallelogram. It’s a rare find and a big blast of nostalgia, taking me back 40 years to my days of working in a bike shop.

Mike’s rear wheel bearings ended the ride rough & notchy (despite being cleaned and repacked with Schaeffer’s 221 #2 grease), so after the ride he installed a new set of NSK 6902 bearings, making them butter smooth again. This is the first and only issue he’s had since rebuilding these wheels 3 years ago, and it’s only basic maintenance. What a relief to put into the past all the problems with the original Reynolds hubs!

Ricky is a sweet kitty cat who befriended all the riders, here with Mike on day 4.

We also met some big friendly sheep dogs along the trail.

Windows 11

Windows Rant (Skippable)

I’ve had to use Windows since version 3.0 back in 1990. I’ve never liked it. It’s an unreliable, low performance, insecure buggy “toy” operating system. Even after Windows NT 3.51 which was the first somewhat reliable version (thanks to David Cutler because nobody at Microsoft could have pulled that off), it was still insecure and unreliable.

But plenty of software runs on Windows, so many of us are stuck with it. As Linux has advanced in maturity and popularity I’ve reached the point where it does 99% of what I need. But I still need Windows for a few things, namely running TurboTax, getting library books (Adobe Digital Editions) and printing to CDs and DVDs (Epson).

Windows version 10 to 11

Now that Windows 10 is being decommissioned, the upgrade to Windows 11 should be seamless – but it’s not. Every new version of Windows gets increasingly bloated with worse performance, and Windows 11 also requires TPM and Secure boot. I run Windows 10 in a VirtualBox VM and need to upgrade to version 11. But the Windows upgrader refuses to do this, saying TPM and Secure boot are required. This means starting with a new install on a new VM, losing all my data and apps, or having to move them over from the old VM to the new one.

Windows 11 can run just fine on this VM. There is absolutely no technical reason it can’t upgrade. It refuses due to an arbitrary decision Microsoft made, that everyone needs TPM and Secure Boot. Microsoft is like Apple – they think they know what their users need, better than the users themselves. So Microsoft does not allow users to override these artificial requirements, which adds a level of capricious arrogance to their decision. And leaves millions of users stranded.

Flyoobe to the Rescue!

Flyoobe “FLY-Oh-Bee” is an open source Github project that fixes this problem: https://github.com/builtbybel/Flyoobe

It runs the standard windows installer yet bypasses the unnecessary restrictions & requirements. But wait, there’s more! It also facilitates getting the Windows 11 upgrade files, providing several methods. And it improves the installation and customization, making it easier to remove the junk you don’t want, such as bloat-ware, spy-ware, AI and advertising.

The entire process is self-explanatory and there is plenty of info and reviews from reliable sources. Check it out and Google it.

Cut to the Chase

After the Windows 11 upgrader refused to upgrade my Windows 10 VM, I used Flyoobe to do it. It worked great, in place preserving my apps and data, and also enabled me to customize the Windows 11 to eliminate junk I didn’t want, saving disk space and improving performance.

The only drawback is that the upgrade took over 4 hours to run. This was due to the fact that the upgrade needs 30+ GB of free space that you don’t need after the upgrade is complete. I had to use an external USB stick for this, which slowed the process.

The net result is that I’m finally upgraded to Windows 11. Thanks to Flyobee, not to Microsoft.

Schwalbe Tires: Still Garbage

Back in 2021 I wrote about my terrible experiences with Schwalbe tires and said they were garbage. My intent was to help fellow cyclists avoid the flats, manufacturing defects, expenses and hassles that I encountered. Fast forward a few years to 2025 and I just got a reminder that this is still true.

I resurrected a 1980s mountain bike for a friend and for an upcoming multi-day gravel ride suggested he get a set of Continental Cross King tires. I’ve been using them for a few years and they have been excellent: tough and knobby enough to handle technical downhills (Tiger Mountain), while lighter and faster than common downhill knobbies like the Maxxis Minions. The Cross King is a good XC tire for all-around riding – the best that I have used.

My friend ignored this advice and instead got a set of Schwalbe knobbies based on positive reviews he found on the internet. Over the next 2 weeks he got 4 flats on a mix of pavement & gravel riding, nothing even technical. He brought the bike back to me for other maintenance and the front tire was flat, so call that 5 flats.

Fortunately that big gravel ride is still a couple of weeks away so I put those Schwalbe tires where they belong (the garbage bin) and installed a set of Cross Kings for him.

Friends don’t let friends buy Schwalbe tires – ‘Nuff said!

LineageOS on Tablets (and Airplanes)

Introduction

When I first started flying airplanes we used paper charts and books for maps and airport information. Every couple months we bought updates and most of us subscribed so they were sent in the mail as soon as they were published. Soon afterward, electronic versions of this became available and eventually the FAA revised their rules to accept these electronic versions. We now call this an “Electronic Flight Bag” or EFB.

Since then, I have used Android tablets and software for my EFB. I fly with a kneeboard for ease of checklists and writing (paper & pencil) and use a tablet that fits into my kneeboard. In the early days big tablets were too thick and heavy so I used a 7″ tablet. That’s pretty small for reading charts and procedures. Over time tablets got thinner and lighter and now I use a 10.5″ tablet. This measures as 9.5″ tall and 6.5″ wide; Android tablets are less square than iPads, which is a good thing since they fit better into kneeboards.

An EFB device doesn’t need a fast processor or fancy graphics or the latest version of software. The most important factors are:

  • Size: fits where you want – whether your kneeboard or elsewhere
  • Battery life: lasts all day, or as long as you need for a day of flying
  • Screen: bright enough to see in daylight
  • Connectivity: has WiFi, Bluetooth, Mobile data, or whatever you need in your airplane
  • Software: can run your EFB applications, usually means no more than 5 years old

My Airplane

Years ago I built a Stratux, which is a Raspberry Pi that provides ADS-B “In” and precise GPS. It broadcasts this data over a local WiFi in my airplane. It does not have or need internet access. The ADS-B “In” includes traffic (airplanes in the sky near me), weather, and NEXRAD imagery all updated in near-real-time.

Because of the Stratux, my EFB device only needs WiFi. It doesn’t need its own GPS, Bluetooth, or Mobile data, though it’s nice to have built-in GPS in case the Stratux fails. It’s also nice to have an ambient light sensor so the screen can automatically adjust to flying at night.

EFB Tablets

For several years I’ve been using an old cheap Lenovo 8505F. It’s been abandoned by the manufacturer and stuck on Android 10 for a long time. The battery health is deteriorating. And it’s so slow it’s frustrating to use as newer software gets more bloated expecting ever faster devices.

I decided to get a tablet that is officially supported by LineageOS, since then I won’t be stuck with planned obsolescence on an ancient version of Android. This led me to the Samsung Galaxy Tab S5E. I found one on eBay for $100 in really nice condition, like new.

LineageOS

After booting up the new tablet and ensuring all its functions worked, I followed the procedure to install LineageOS. It typically goes like this:

  1. Unlock the device bootloader.
  2. Load a custom boot image.
  3. Load a custom recovery.
  4. Load the LineageOS operating system.
  5. Load the Google Apps.

Step 1 used to require hacking, but in recent years more manufacturers provide an official way to unlock the device.

Steps 2 through 5 are done using Google Android Tools ADB (free and open source) or manufacturer-specific tools like Samsung’s Odin. The steps can be tedious: one small mistake can cause the installation to fail or even brick the device.

LineageOS is the open source version of Android. It has a simple clean interface and no bloat-ware from manufacturers or carriers. Devices usually have better performance and longer battery life when running LineageOS, compared to their OEM software. And LineageOS offers support as long as developers care to maintain it – no planned obsolescence. For example, this Galaxy Tab S5E came out in 2019 on Android 9. Now in 2025, mine runs LineageOS 22 which is Android 15.

The biggest issue with LineageOS is device support. If you want to run it, you need to visit the site and check what devices (whether phones or tablets) are supported. Tablet support is more limited than phones: only the Google Pixel and various Samsung Galaxy models. Even so, Samsung made some of the best Android tablets and they work even better on LineageOS.

IRA to Roth Conversions

Introduction

An IRA is a savings account with privileged tax status. There are essentially 2 kinds:

  • Traditional IRA: taxes are deferred. Contributions and growth are not taxed. Distributions are taxed as income.
  • Roth IRA: taxes are paid up front. Contributions are taxed as income (made from after-tax dollars). After this, no taxes are ever due again. Growth and distributions are not taxed.

Henceforth, the term “IRA” will mean a traditional IRA.

An IRA takes several forms (such as 401K) and anyone can contribute to them. A Roth is more restricted – people who make too much money cannot contribute to them.

A Roth conversion means moving money from an IRA to a Roth. Anyone can do this, at any age. Even if you are young enough that you would pay penalties for taking distributions from your IRA, those penalties don’t apply to Roth conversions. Even if you make too much money to contribute to a Roth, you can still convert IRA to Roth. For tax purposes, a Roth conversion is treated like any other IRA distribution: the money is taxed as income and adds to any other income you may have.

One important aspect of this discussion is the RMD: Required Minimum Distribution. Starting in your 70s, every year you must take distributions of around 4-5% of all of your IRAs, whether or not you need the money. This is how the government ensures they will get the taxes that have been deferred for years.

One might ask, “Why is this a problem, since you intended to use that money for retirement anyway?” And the answer may well be that it’s not a problem. Yet it may become a problem if you saved so much money that the RMDs force you to withdraw more than you need. And since it’s all income, due to progressive income brackets, taking a little more money than you need can mean paying a lot more taxes.

Why Convert?

Death and Taxes are inevitable and inescapable. Neither IRAs nor Roths are tax-free but they are taxed differently. People convert IRA to Roth for many reasons, but they all boil down to tax optimization in one form or another.

Multiplication is Commutative

Multiplication is commutative, so if your future tax rate is the same as today, there is no difference between a Roth and a traditional IRA.

Put mathematically, suppose you have

  • P = $100k, the princpal you have invested
  • G = 6%, the expected return on investment (CAGR = compound annual growth rate)
  • T = 15%, your expected tax rate
  • Y = 20, or number of years you are comparing

Then the future value of investments

  • The after-tax value of a traditional IRA is P x (1+G)^Y x (1-T)
  • The after-tax value of a Roth IRA is P x (1-T) x (1+G)^Y

All we have done is re-order the terms. Multiplication is commutative, so the result is the same:

  • IRA: 100,000 x 1.06^20 x .85 = $272,606.52
    • You invest $100k pre-tax, it grows at 6% for 20 years, afterward you pay 15% on it when you take it out.
  • Roth: 100,000 x .85 x 1.06^20 = $272,606.52
    • You pay tax on $100k and invest the remaining $85k, it grows at 6% for 20 years, afterward you take it out tax free.

Marginal Tax Rates

Every dollar converted to Roth is “income” on top of the normal expenses you are already paying, and the US income tax brackets are highly progressive. Thus Roth conversions are taxed at your marginal (highest) tax rate, and they can also kick you up into higher tax rates.

For example, your normal cost of living might put you in the 12% or 20% tax bracket. But that doesn’t mean you’ll pay that same rate on Roth conversions. They can kick you up to higher tax brackets unless you plan carefully and limit the amounts you convert.

Present vs. Future Value

The present future value of money is often ignored, but it is an important factor. Even if you pay the same dollar amount today vs in the future, it’s more expensive today.

This weakens the case for commutativity. If the tax is the same either way in absolute dollar terms, better to pay incrementally over the next 20 years, than pay up front today.

However, taxes work in percentages. Those future taxes are bigger amounts in absolute dollar terms even if they are the same percent of a bigger number. And vice versa: when you pay taxes up front with Roth, you pay on the money before it grows from investment so the same percentage is a smaller sum of money – you forego the earnings those taxes would make.

For example, consider the above commutativity analysis. The Roth has $15,000 in taxes while the  IRA has $48,107. It seems the Roth is far better with less than 1/3 the taxes. But the Roth taxes are paid up front while the IRA taxes are deferred for 20 years. That $15k grows to exactly $48,107 over 20 years. So these amounts are exactly equal considering the present vs. future value of money.

The overall impact is that Roth conversions are not as advantageous as they appear at first glance because the taxes are paid up front with present money. Even if you pay less in absolute dollar terms, they are “bigger” dollars worth more today than they would be in the future. Roth conversions still may be advantageous despite this (or not). To determine this, the comparison must consider the big picture with compounding interest and inflation.

Annual Average Tax Rate

Using annual average tax rates is misleading because the income amounts aren’t the same every year. To make it realistic you’d have to compute the income-weighted averages of each year.

Here’s an obvious example to illustrate the point: suppose you have an IRA worth $1M and your cost of living is $85k per year.

Case 1: you convert in a single year and due to progressive income tax brackets, this has an effective overall tax rate of 30% or $300k. This leaves $700k remaining which will last for just over 8 years. Your tax rate is 30% in the first year then zero for the next 7 years. The average of (30, 0, 0, 0, 0, 0, 0, 0) is 30 / 8 or 3.75%. But you paid the 30% on a huge amount ($1M), and the 0% on only $85k each year.

Case 2: you take $100k per year paying 15% on it. It’s only 15% instead of the 30% above because income tax brackets are progressive and this is a smaller amount. That’s 15% every year, so your annual average tax rate is 15%. That’s 4 times higher than the above 3.75%! But it’s applied to smaller amounts so you actually pay less tax and keep more of your money. After 8 years you still have $200k or just over 2 years of money remaining. Even though your annual average tax rate was much higher, your actual taxes were lower and your money lasted a few years longer.

If you compute the income-weighted annual average tax rate, it is the same as computing the total tax paid: $300k versus $150k. This is on the same total amount, so you doubled your taxes by converting all at once. And due to present vs. future value it’s even worse than that, since you paid $300k up front to avoid paying $150k over 10 years.

Total Value vs. After-Tax Value

The total value of IRA vs Roth accounts is often compared, which is misleading because it is the after-tax value of accounts that matters. This applies not only to you during your lifetime, but also to those who will inherit your money.

Simply put, if you have $1M in a traditional IRA, it’s not entirely yours. The government owns a portion of it through taxes. If you have $1M in a Roth IRA it is entirely yours and thus worth more. Of course, it cost you more to get $1M into a Roth than $1M into an IRA, since you paid the taxes up front.

People who inherit an IRA typically have 10 years to liquidate the account and pay income taxes on it. If your inheritors are adult children, they may be in the same or higher tax bracket than you are, and thus pay more taxes on that money than you would have.

Taxes are Interconnected and Complex

Our tax system is so complex and parts of it are so ambiguous, even accountants, lawyers and the IRS sometimes disagree on what it means. The cynical among us would say this complexity and ambiguity is a “feature” not a “bug”, as it gives the IRS flexibility in interpretation for selective enforcement or to bully or threaten taxpayers. However, one doesn’t have to be cynical to understand that the tax code is complex enough to make it difficult even to comply, let alone to optimize.

Income tax brackets are progressive, and other kinds of taxes such as Social Security, Medicare and long term capital gains have different rates that depend on each other, based on several different definitions of AGI (adjusted gross income) and MAGI (Modified AGI). Furthermore, some investments have returns that are impossible to predict, and even if you could predict them you still couldn’t predict how they impact your taxes.

For example, suppose you own shares of an index fund in a brokerage account. That fund has capital gain distributions that depend on turnover within the fund to track the index. This level of turnover depends on how different stocks increase or decrease in value which is unpredictable. And whether those gains are long or short term is also unpredictable. Furthermore, some of the stocks in the fund’s index pay dividends. The balance of funds changes, and companies change their dividend payments, so you can’t predict how much dividends you will get. And you can’t predict how much of those dividends are qualified (thus taxed as capital gains) or non-qualified (thus taxed as income).

Another example: you decide to do Roth conversions to fill the 22% tax bracket, which in 2025 has an upper limit of $206,700. Due to the standard deduction of about $30k, you actually take $236,700 to hit that limit. But that’s above the Medicare IRMAA threshold, so it triggers more taxes there. And you were meeting your cost of living by selling taxable brokerage investments, which would have had no tax because your income would have been below $100k after deductions, but the Roth conversions raised your income so now you owe 15% on those. But wait, the dividends on your brokerage account took your MAGI high enough that you also pay the NIIT of 3.8%. And because your income is so high, you also end up paying taxes on your Social Security. That’s 4 nasty surprises springing from not understanding the interconnected complexity of our tax code. The Roth conversion you think is optimal may trigger a “tax tornado” that makes it counterproductive.

Another fact: if you’re younger than 59 1/2, you pay a penalty for any IRA withdrawals that you don’t transfer into a Roth. This means if you withhold taxes from the IRA distribution that you convert, you’ll pay a penalty on that portion of it! For example, suppose you convert $10k in the 20% tax bracket. You’ll owe $2,000 in taxes. If you take $12,500 from the IRA to put $10k into a Roth and withhold the remaining $2,500 (send it to the IRS), they will charge you a $250 penalty, which is 10% of the amount you took out of the IRA and didn’t put into a Roth. The only reason you didn’t put that $2,500 into a Roth is because you sent it to the IRS, but they don’t care and that doesn’t matter. The better way to do this is take only $10k from the IRA and convert to the Roth, then pay the $2,000 tax from other funds. This saves you $750!

What makes matters worse is that many of the tools people use to plan retirement don’t account for all of this complexity, so they end up making bad suggestions, usually erring on the side of conversions that are too big and trigger nasty tax surprises.

Decisions and Scenarios

Due to the above factors, some people make ill-advised or sub-optimal Roth conversion decisions.

Some Roth conversion scenarios are easy no-brainer decisions:

  • You are certain that your taxes today are lower than they will be later.
  • There are several variations of this, and here is a common one: You retire early and live from after-tax investments. For the next few years, you have no “income”, but only long term capital gains, which are taxed at lower rates, and you could have a zero tax bill. You know that you will have “income” in the future, whether you want it or not – Social Security, RMDs, pensions. That income stream will raise your tax rates so now is the time to convert IRA to Roth while you’re in the lowest tax bracket.

Some Roth conversion scenarios are more speculative or subjective.

  • You believe that tax rates must inevitably increase in the future, due to today’s historically high levels of government debt.
  • You want your inheritors to get your estate free and clear, without burdening them with taxes that may be even higher than you would have paid if you had lived longer.
  • You want the satisfaction or confidence of knowing your future retirement will be tax-free and you’re willing to pay up front for this even if it ultimately costs you more.

Some Roth conversion scenarios are just a bad idea:

  • If your entire savings is in IRA accounts, you have little to gain and much to lose from Roth conversions.
    • While working, any amounts you convert add on top of your salary and are taxed at the highest marginal rates – higher than you’d pay if taking those distributions in retirement.
    • After you retire, any amounts you convert add on top of whatever you take to meet your cost of living, so the same applies – it’s like inflicting RMDs on yourself early and unnecessarily.

Conclusion

Roth conversions can be a useful tool to reduce taxes but they aren’t for everyone. Getting it wrong can can trigger a tax tornado. It seems to me that everyone is talking about Roth conversions, but they are rarely beneficial for most people. Before making Roth conversions, don’t make some of the common mistakes mentioned above, but do make sure you understand your reasons for doing it and the full tax implications across all sources of income.

Corda Soul Measurements: Distortion

Intro

As I was measuring the performance of the Corda Soul, I encountered an unusual distortion profile. I got curious and dug into it – here’s what I found.

Corda Soul Distortion

When I measured using an REW frequency sweep at -1 dB with the Soul at max analog volume, recording the Soul’s analog output on my Tascam DA3000, here’s what I got:
We see an unusual hump peaking at -78.5 dB between 1 and 2 kHz. That is db FS (full scale), which is about -70 dB dBr (relative to the signal). This is surprisingly high distortion. A closer look shows this is entirely 3rd harmonic (orange superimposed on the black) and it peaks between 1 and 2 kHz. This odd harmonic distortion is sometimes seen in balanced (differentially signalled) systems, which tend to squash even harmonic distortion.

What would cause this distortion hump? The WM8741 chip is rated at -100 dB THD, and the Soul should have a reference implementation. I measured this by recording the Soul’s analog output on my Tascam DA3000 recorder, so this includes distortion from its analog stage and A/D converters (rated at -90 dB). But this distortion is higher than that. I know from experience that DACs often have distortion that varies with level (more detail on this from Archimago), especially as digital input approaches full scale, so I measured the same sweep at -6 dB:

Here the distortion dropped to -92.4 dB, or about 14 dB lower. I also measured it at -12 dB:Here distortion drops to -107.6 dB (about -100 dBr), which matches the specification of the WM8741 DAC chip.

I tested distortion every 3 dB from full scale to -40 dB. At -12 dB the distortion falls into the base level noise & distortion of the Tascam recorder I used to measure it. At these digital input levels (-12 dB and lower) the Soul’s distortion is too low for me to measure, given my limited equipment.

Here are the THD versus Level graphs that I measured. First, THD relative to the signal level:

The above graph makes it difficult to see how my measuring device limits this, so here is the same graph shown in absolute terms. This shows how distortion sinks into the noise+THD of the recorder I used to measure it. The slope is about 2:1 – starting at full scale, every 1 dB reduction in signal level gives a 2 dB reduction (improvement) in THD.

In summary: Noise below -90 dB should be inaudible, and due to psychoacoustic masking, distortion below -80 dB should be inaudible.

Note that this unusual distortion profile is the same at all sample rates (44k to 192k) and digital inputs (coax, toslink and USB).

Perspective: Multitone

We don’t actually listen to pure tones or sweeps, so another perspective on distortion involves multi-tone signals having harmonic spacing that resembles music. I used REW to create a multi-tone signal having 3 frequencies per octave from 20 Hz to 20 kHz, spaced geometrically (constant ratios), for a total of 31 tones.

One aspect of multiple tones is that the signal is the sum of all the tones, so the overall signal level is higher than any of the individual tones. For the signal I used, the overall level is at -1 dB (near full scale) while each individual tone is about -24.7 dB.

A multitone signal like this may show worse distortion, as each of the many tones has its own harmonic series, and intermodulation between them creates even more spurious tones. Alternately, it might have less distortion because the tones that make up the signal must be attenuated to a lower level so their sum doesn’t exceed full scale. DACs sometimes have higher distortion near full scale, achieving their cleanest output around -3 to -12 dB.

Because this test can go either way, it gives additional insight to the DAC’s performance. One could say that DACs that perform worse on multitone are optimized for test tones, and DACs that perform better on multitone are optimized for music. Though of course, some DACs might perform well with both.

Here’s the signal in its pure mathematical form. I played this through the Soul and recorded the SPDIF output on the Tascam – this is pure digital with no D/A or A/D conversion. By “pure” I mean the imperfections in this graph are due to dither and the resolution of the Fourier Transformation used to analyze it.

In the following graphs, distortion and noise appear as small spikes or “grass” between the tones. Here’s that same signal played through the Soul’s DA converter and recorded on the Tascam:

The tips of the “grass” are around -90 dB dBr, which means dB relative to the tones. The tones are at -24.7 dBFS (dB full scale), so the vertical axis 0 dB in this graph is -24.7 dBFS, which means the tips of the grass are at -114.7 dBFS. If we sum the “grass”, they’d total about 30 dB louder, or -85 dBFS. With the multitone signal at -1 dB, that would be -84 dBr. Note that the small spikes at 60, 120 and 180 Hz come from the Tascam DA3000 recorder.

What’s really interesting about this is that the THD vs. level graphs above show distortion at -71 dB for a sine wave at -1 dB. Yet with a multitone at -1 dB, the Soul’s total distortion (both HD and IMD) is about 14 dB lower and its 3rd harmonic distortion hump disappears. The Soul performs better with multitone than it does with a single tone at the same level.

Here’s the multitone at -7 dB (6 dB quieter). Distortion is about the same in the low frequencies, yet now 10 dB lower in the mids and treble where our hearing is most sensitive to it. Note that moving the Soul’s gain switch to the low (-6 dB) position has the same effect, so it applies before DA conversion.

This puts the Soul’s distortion hump into perspective: because music consists of so many frequencies, it’s unlikely to have any single frequency above about -12 dB, and more likely -20 dB or lower even at full scale dynamic peaks, so while Soul’s hump looks bad with individual test tones, it’s cleaner when reproducing music.

To more easily see how distortion drops with digital input level, here’s the Soul’s multitone performance at 3 levels: 0 dB (grey), -6 dB (red) and -12 dB (blue), superimposed.

In this graph the lower level inputs (-6 and -12 dB) are shifted upward so the peaks from all three traces are at 100 dB SPL. The tips of the distortion grass are at -90, -100 and -110 dB, respectively.

These THD levels are lower than the specification for the WM8741 DACs that the Soul uses. This multitone distortion performance would have been considered excellent nearly 20 years ago when the 8741 DAC chip first came out.

Another possible contributor to this unusual distortion profile is Meier’s FF (more on this here). It attenuates low frequencies before DA conversion and the amp’s analog gain-feedback loop, in order to reduce overall levels from approaching full scale, and to focus negative feedback on the mids and treble. Yet this only works when low and high frequencies are played simultaneously. With single tones, it makes no difference except to reduce resolution of the low frequencies. Whatever benefits FF provides are only realized with multitone signals. It is a feature that optimizes for music rather than test signals.

Factor: Amplitude vs Frequency

Another factor regarding the relevance of distortion is the relationship between amplitude and frequency. The Soul’s distortion rise at high input levels doesn’t happen at all frequencies. It depends on both input level and frequency. At low frequencies distortion is low even at high input levels, doesn’t start to rise until above 300 Hz and peaks just above 1 kHz. Yet the amplitude of musical signals peaks in the bass and drops as frequency increases. More on that here.

In a musical signal, above whatever bass frequency amplitude peaks (typically below 300 Hz), the amplitude typically drops 6 dB per octave. If we take that highest peak bass frequency as 250 Hz, then 1 kHz is 2 octaves higher and the amplitude has dropped by 12 dB. Thus the level at 1 kHz will be 12 dB below peak, and dropping further for higher frequencies. And that is a worst-case for single tones. As mentioned above, every additional frequency in the musical signal further drops all of their individual levels.

The multi-tone test signals above have all 31 tones at equal amplitude. This overstates the Soul’s distortion when playing music, because in music the high frequency tones would be attenuated, lowering them below the threshold of the Soul’s distortion hump.

The net effect is that the Soul’s unusual distortion hump will never manifest when listening to music. It requires single-tone high frequencies at high input levels, something we only get with test signals.

Deep Dive: Odd Harmonics

The THD that the Soul produces is purely 3rd harmonic alone – all other distortion is below my measurement limits. This in part explains the good multitone performance, because the multitone combines a single harmonic for each frequency instead of a spray of them. What 3rd harmonic distortion (or more generally, odd harmonics) does to a sin wave, is it flattens the peaks & troughs. Here is an exaggerated example showing the effect of 10% (-20 dB) of 3rd harmonic.

The big dotted wave is the original signal, the small dotted wave is the 3rd harmonic, and the big solid wave is their sum, which shows how the 3rd harmonic changes the waveform. Looking at the two waves, you can see that the 3rd harmonic reverses each of the primary wave’s peaks, squashing them. This diagram is grossly exaggerated. The Soul only adds about -70 dB worst case, and -100 dB typical case, which is about 10,000 times less than the 10% shown above. The effect is too small to see (or hear) and must be exaggerated to see what’s happening.

This peak-squashing only happens only at high digital signal levels, so one possible reason is that the DAC chip isn’t “strong” enough to fully reproduce dynamic peaks. Put differently, it looks like soft clipping. The WM8741 chip is a voltage-output DAC – unlike many modern DACs which are current output and rely on external circuitry to convert current to voltage. When the digital signal gets loud, the 8741 must produce higher analog voltages, which draws more power. If the DAC’s voltage supply sags on peak demand, or the load it’s driving is too low impedance, that is the kind of distortion we’d expect to see: soft clipping which consists of odd harmonics. Another possible cause is parasitic (or designed-in) capacitance, which can cause this kind of time-based non-linearity. This seems plausible because capacitance is frequency-specific, and the Soul’s distortion profile is also (it doesn’t affect low frequencies).

I did measure the Soul with its power supply ground jumper removed, which puts a resistor in the ground path to eliminate ground loop hum. I also tested all digital inputs: coax, toslink and USB. None of these affected it.

Bypassing the DAC

I speculate that the distortion comes from DA conversion… is that actually the case?

To find out, I played test signals through the Soul, bypassing its DAC. This is possible due to a unique feature of the Soul. It has an external DAC loop similar to the tape loop that preamps used to have. This is a switch on the front panel to listen to its analog input – but this switch is separate from the digital input selector and does not disable its digital processing. It still receives and processes the digital input, and sends it out via toslink SPDIF. You can send the Soul’s digital output to an external DAC, and connect that DAC’s analog output to the Soul’s analog input. Of course, the external DAC must have balanced XLR output.

Like this:
(Digital Source)
    --d--> (Soul for DSP)
    --d--> (external DAC)
    --a--> (Soul for volume control)
    --a--> (headphones or line out)

In this mode, the Soul becomes a DSP processor and analog balanced preamp. DAC is handled externally. Why? Future proofing. DSP is purely digital which at 32-bit precision is near mathematically perfect, so it’s not going to improve over time. Analog preamp technology fully peaked and optimized years ago so that’s not improving either. But DACs are constantly evolving, so the Soul enables you to use an external DAC while keeping the rest of the unit.

Here’s the multitone played through the Soul, but using its external DAC bypass with the Topping E70 doing the D-A conversion (and the Tascam DA3000 performing A-D conversion of the final analog output, as before):

This is cleaner than the Soul’s DAC. More precisely, the E70 at full scale is comparable to the Soul at -12 dB (see below). The E70 is a state-of-the-art DAC that has impressively low distortion both with single tones and multitone. Since these signals were analog outputs captured and digitized by the Tascam DA3000, it shows that the Tascam DA3000 performs significantly better than its specification (though it still adds small spikes at 60 & 120 Hz due to imperfect power regulation), and since this signal passed through the Soul’s analog stage, it shows that it’s impressively free of noise and distortion.

Using a SOTA external DAC like the E70, the distortion hump entirely disappears and overall distortion is so low I can’t measure it with the Tascam recorder.

Comparisons: Distortion, Noise and Level

I wanted to measure at lower output levels because it better matches how we actually listen. We don’t listen to music that is constantly at max digital level (unless you listen to modern pop music that is crushed with dynamic compression, but then high quality audio equipment would be a waste of money, you would have crappy equipment and no musical taste, and wouldn’t be reading this). And we don’t listen with the volume knob turned up to max, but more typically around half way.

I also wanted to make direct comparisons between the Topping E70 and the Soul because the E70 is a modern DAC with excellent measurements. It is the best DAC I’ve ever measured, and among the best that Amir at ASR has measured. As a modern SOTA DAC, it makes a useful benchmark and comparison with the Soul.

As above, I made the following graphs by playing digital test signals into the Soul and recording its analog output on the Tascam DA3000. There are 2 key differences:

  • Which DAC I use: the Soul’s built-in WM8741s, or the E70’s ESS9028 Pros
  • Whether I control the volume with the Soul, or with the E70 (Soul volume at max)

Generally, the level of noise and distortion varies with two factors that affect its loudness:

  • The digital signal level (dB relative to full scale)
    • This tends to affect both noise and distortion
    • Lower digital levels tend to have lower distortion and higher noise
  • Attenuation from the volume setting
    • This tends to affect noise but not distortion
    • Lower output levels tend to have higher noise

First, let’s look at the distortion frequency sweep at -1 dB digital with volume turned down to -16 dB. This checks overall noise level.

Using the Soul’s internal DACs, the overall noise & distortion peaks between -100 to -108 dB depending on frequency.

Using the E70 DAC and volume control, the overall noise & distortion varies from -90 to -100 dB.

The E70 is no slouch but the Soul is about 10 dB quieter. This comes as no surprise, due to the unique way its volume control works, mentioned in my review of the Soul. It’s interesting to measure and quantify the impact of this engineering feature.

Here’s the comparison for multi-tone at 2 digital input levels: 0 dB and -6 dB, with volume at -16 and -24 dB respectively. The Soul is green and the E70 is blue.

Here is the 0 dB multitone played at -16 dB. Same as above, the tips of the Soul’s “grass” reach around -90 dB while the E70 is about 12 dB lower.

The situation changes when we reduce the levels. The -6 dB multitone played at -24 dB brings near equality as the Soul is now just a tad better than the E70.

Summary

Overall, the E70 is the more consistent performer. Its distortion is independent of level and its SNR drops linearly with level. The Soul is more complex and harder to characterize. I hesitate to say it’s optimized for music listening because we hear this a lot and it’s usually an excuse that expensive boutique audio equipment uses for poor engineering and performance. But this dive down the rabbit hole of measuring noise and distortion opened my eyes to the fact that this phrase can actually mean something. The Soul’s distortion performance is not very good when measured by a full scale tone sweep. But we don’t listen to tone sweeps at full volume. With test signals that resemble music at realistic levels, the Soul’s measured performance rivals the best modern DAC that I have seen. This gives the phrase “optimized for music” some objective meaning.

Conclusion

The E70 has exemplary noise performance, but the Soul’s noise is even lower. The Soul’s distortion depends on digital input level, while the E70 does not. With multitone signals that resemble music they are roughly equal at -12 dB; the E70 is better at higher levels and the Soul is better at lower levels. This is somewhat surprising since the Soul uses a pair of WM8741 chips, which are about 10 years older than the ESS9028 Pro that the E70 uses. This supports the idea that the implementation of a DAC chip is more important than the chip itself.

Using an external DAC with the Soul is a tradeoff between distortion and noise. The Soul does better with noise than with distortion, yet when listening to music in the real world, both are low enough that even the best SOTA external DAC should make no real improvement.

All that said, there are subtle differences that can be detected with appropriate musical source material. If you are well trained how to listen for them. Being a musician helps, as does experience with DBT/ABX testing. Also you need excellent equipment in a superbly quiet listening environment. I listen mostly to small ensemble music and found the Soul and E70 essential indistinguishable. I first noticed a difference when listening to large ensemble symphonic music with high dynamic range, during crescendos. That difference was so subtle I could only hear it on the Magnepans; it was undetectable with high quality headphones. This prompted me to do some critical listening with high quality rock music recordings (rare, but they do exist, such as some albums from Dream Theater and Pink Floyd, and Steven Wilson remixes). This, as well as the measurements above, confirmed the difference, though it remains subtle.

Fox Island Dive Sites

Fox Island has four well-known dive sites:

  1. Fox Island Bridge
  2. Z’s Reef
  3. East Wall
  4. West Wall

Map showing all 4 sites from the top clockwise. Fox Island Bridge to the N, Z’s Reef to the NE, and East and West wall are the S most on their respective sides of the island.

Tides and Currents

Due to the narrow channel between Fox Island and the Kitsap Peninsula (the Hale Passage near Artondale), tidal currents rip through at a good clip. Watch your tide & current tables and time your dive accordingly.

In case you have tide tables but don’t have current tables…

As of 2025, in the Hale Passage low tide more or less matches the low (flooding) slack. That is, the rising slack current (from ebb to flood) is 5-30 minutes after low tide. But you probably want to dive at high tide, not low tide. High tide lags the high (ebbing) slack. That is, the falling slack current (from flood to ebb) is between 2 and 2.5 hours before high tide. At high tide, the ebb current is already well established.

1. Fox Island Bridge

This is at the South (Fox Island) side of the bridge. There is open free parking. This site is not listed as a marine preserve and is open to fishing.

2. Z’s Reef

This site is only accessible by boat, because the shore along the reef is entirely privately owned. Also, it’s along Hale’s passage so watch your tides & currents. Z’s Reef is designated as a marine preserve by the WA State fishing regulations, so there is no fishing or taking of marine life of any kind.

Drop in from a boat at the slack current about 2 hours before high tide. The shore drops off moderately steep, and 60′ depth is not far from shore. The wall can be hard to find because visibility is often 10′ or less.

3. East Wall

This site is at the SE end of Fox Island, at the Fox Island Fishing Pier park. Given the name, one can surmise that this is not a marine preserve – fishing is allowed, both pole and spear. The pier is quite high with no access to the water.

Drive in; the site is usually not crowded and there is plenty of parking. There are guardrailed paths down to the pier – do not follow them. Instead, just after entering the park look to your right. Across the grass near the restrooms there’s a small green sign, easy to miss, that says, “Beach Access”. This goes down stairs then turns left into a dirt path that leads down to the beach.

The path to the shore is about 150 yards and drops 75 feet in elevation, so if you’re SCUBA diving you might want to make 2 trips or use a cart.

The beach is gravel with an easy entry & exit. This photo from the pier shows where the footpath reaches the beach:

Here’s the view from the beach after walking down the footpath:

As of 2025, magnetic north points 15.5* east of true north, and the shoreline runs nearly direct magnetic north to south.

This site is at the SE entrance to Hale’s Passage, so the tidal currents can be strong. Watch your tables and time your dive accordingly, just before the slack when the tide reverses. If you have tide tables but not current tables, this is about 2.5 hours before high tide. When the tidal current reverses, there is no noticeable slack or pause. It simply reverses direction like flicking a switch. I like to start my dive about 20 minutes before the slack so it reverses while I’m in the water.

Note: when looking up "Hale's Passage" on tide and current tables know that there are 2 of them in the Puget Sound area. One is in the North near Lummi Island, the other is here in the South near Artondale. Make sure you have the right one!

The shore drops off slowly at first, then quickly gets steeper, so you can descend quite close to shore. When I dove this site I didn’t find an actual wall, but some giant rocks from about 30 to 65 feet deep. Visibility in summer is limited, 15-20 feet on a good day. I didn’t see a lot of fish, but I did see dungeness crabs, sea stars, jellyfish, a playful seal, and other critters.

4. West Wall

This site is on the W shore of Fox Island at the end of Kamus drive. As you drive in you’ll see a yellow sign saying “no turnaround”. From there, it’s about 0.3 miles to the shore and a steep descent. Don’t park here, but continue driving down the road.

Near the end of the road there’s a gravel area at the dead-end of the road that looks like a parking lot, but is posted “no parking”. Just 100 feet or so up the road from this, there are wide spots in the road with room to park, if nobody else is there.

The shore is aligned approximately 135* to 315* compass (magnetic) heading, or SE to NW. Looking straight out from shore is about 225* or SW. As of May 2025 there are 5 buoys; 3 to the right and 2 to the left. Swim straight out to the buoys and descend. Bear left (south) as that is where you’ll find the wall.

This site is exposed to more open water, not a narrow channel, and is consequently less subject to strong tidal currents. High slack is always a good time to dive, but you have more timing flexibility at this site than at the others.

View from the shore in May 2025: