Apple Music vs. TIDAL on a $30,000 Stereo System →

I saw this post in a Twitter thread this morning. Upon my first readthrough, I honestly thought it was a parody, but I soon realized it wasn’t after checking out some of the comments on the post.

The premise of the post revolves around testing Apple Music and Tidal, two music streaming services, on a $30,000 stereo system powered by McIntosh equipment – yum.

The three of us were unanimous: Apple Music was the clear winner. It sounded the cleanest, the least compressed, really crisp. Spacious. Vocals that were mixed well were front and center, floating into the space above our heads as if the singer was in the room. The midrange never got lost in the mix. Bass was deep and wide but not muddled. In short, everything sounded like it was intended to sound, as it was engineered.

Apple Music streams are encoded in AAC format – a lossy format that strips out data in a destructive manner. TIDAL uses FLAC, a lossless format. By definition, Apple Music can’t be the “least compressed” when compared with TIDAL.

For some songs, we couldn’t hear a difference between Apple and Tidal. For others, Apple sounded better than Tidal, less compressed. Tidal claims it’s lossless but in other places cites a 1,411 Kbps FLAC compression rate. In any case, it certainly isn’t CD or vinyl quality.

Lossless compression simply means the compressed data can be decoded back into the original source. The “compression rate” isn’t really relevant when discussing Flac compression from a quality perspective. The CD audio standard specifies a 16-bit stereo stream with a 44.1kHz sample rate, which comes out to 1,411 kbps – that means, bitrate-wise, TIDAL is literally CD quality.

Besides being 60% cheaper, Apple has a larger music library. We couldn’t find about 10% of the playlist on Tidal.

I agree with this. TIDAL still doesn’t have a large collection to this day.

I’m not a recording engineer by any means. But my theory about why there was such a noticeable difference is this: Apple’s audio compression codec is better. Somehow AAC beats Tidal’s “lossless” FLAC encoding. How else can you explain it? Maybe there’s a crucial difference in specific app implementation? Or maybe Apple is favoring its own service on its platform?

Objectively speaking, Apple Music’s AAC codec is not better. That would be impossible since TIDAL uses a lossless codec. With that said, I can think of a few reasons why Apple Music may sound subjectively better than TIDAL.

  1. Apple works with record labels to make “Apple Digital Masters”. The idea here is to master a song with the shortcomings of the AAC format in mind. If the test songs were Apple Digital Masters, that could explain why the author thought they sounded better.
  2. Apple apps and products may have some sort of special data prioritization. A modern example of this is the W2 chip in AirPods, which communicates with Apple devices using a specific protocol for better sound quality.
  3. The author could simply be an Apple fanboy.

I probably should have mentioned that we were streaming from an iPhone 6, an iPad Pro, and an iPad Mini to an old Airport Express connected to the preamp with an optical cable.

Yikes, this disclaimer should’ve been at the top of the post because it effectively undermines the entire test. When performing tests like these, it’s important to have “controls” – parameters that you have absolute control over.

  1. There was no reason to use multiple devices. Stick with one device to remove device variance from the equation.
  2. The setup above isn’t actually a test between Apple Music and TIDAL – that’s the secondary test. The primary test here is actually the steaming quality of the Airport Express. If the devices aren’t streaming to the Airport Express in full-resolution, then you’re not listening to lossless audio from TIDAL. This test should’ve been performed without any wireless streaming.

Posts like this one really make me cringe because they are extremely misleading. Tech writers should understand the level of influence they may have on normal consumers. Publishing an audio comparison without understanding the basics of digital audio is simply unacceptable.

Now, can someone buy me a $30,000 stereo system to do a proper test? 😃

« Permalink »

HEY Email – An Initial Review

HEY is a new paid email experience designed and developed by Basecamp. I say “experience” when I describe HEY because I don’t think “service” or “platform” do it justice – it’s a complete rethinking of email. HEY takes an extremely opinionated view on email with its core features including the “Imbox”, “Screener”, “Feed”, and “Paper Trail” – more on that later.

In this article, I’ll give you my initial thoughts on HEY after using it for a week. I plan on following up with a more in-depth piece in a few months, but hopefully my first impression can help you decide if you want to give HEY a try.

Continue Reading →

A Little Subscription Purging

Today, I went through my credit card statements from the past few months in search for unnecessary subscriptions to purge. As a technology lover who’s always keen to try the latest and greatest, I don’t always remember to cancel subscriptions before the end of their respective free trial periods.

After half an hour of purging, I was able to remove $80/month worth of subscription services I don’t really use anymore! Most of the subscriptions I got rid of were related to servers, server management, and server monitoring.

What a surprise…

With $80/month of savings achieved, I dug further to see what else I could cut. I found a few more server monitoring services that I actually use for monitoring my block production node on the ICON network. Between UptimeRobot and NodePing, I was paying close to $30/month for monitoring.

I’ve been on a serverless function kick recently, so I decided to try writing a script to replace the core functionalities of UptimeRobot and NodePing. I ended up with the Python script below that makes two requests to the node with a 30 second gap in between, and messages me on Telegram if the node is offline. I’m going to add some more code over the next few days for error and timeout handling, but it works pretty well for now.

import json
import requests
import time
from multiprocessing import Process

def node_check(t):
	time.sleep(t)
	node_url = "http://...:9000/api/v1/avail/peer"
	r = requests.get(node_url)
	json_data = json.loads(r.text)
	is_service_online = json_data['status']
	is_service_available = json_data['service_available']
	if is_service_available == False or "is online" not in is_service_online:
		send_tg_message()

def send_tg_message():
	tg_bot_url = f"https://api.telegram.org/bot.../"
	chat_id = "..."
	response_message_data = {
        "chat_id": chat_id,
        "text": "RHIZOME P-Rep node (...) is offline.",
    }
	requests.post(f'{tg_bot_url}sendMessage', json=response_message_data)

def main(request):
	p = Process(target=node_check(0))
	p.start()
	p2 = Process(target=node_check(30))
	p2.start()
	p.join()
	p2.join()

I deployed the script to Google Cloud Function, and scheduled it to run once per minute with Google Cloud Scheduler. While this solution obviously doesn’t cover all the features of paid monitoring services, it’s definitely good enough for my needs – and it’s completely free.

Google Cloud Platform’s free tier allows for 2 million Cloud Function invocations and three Cloud Scheduler jobs per month. This monitoring system will cost me ~45,000 function invocations per month with a single cron job, so I’m well within the free tier. Yay for saving money!

5 Reasons Why I Love Hugo for Blogging

Late last year, I migrated my WordPress-powered blog to Hugo, and I still think it’s the best decision I’ve ever made with regard to my blogging workflow. Switching to a static site generator like Hugo has expanded my knowledge and perspective on modern CMSs and their associated technologies.

Ironically, I feel that exploring non-WordPress tools like Hugo has actually made me a better employee at Kinsta – a managed WordPress hosting company. In this post, I’ll share five reasons why I love working with Hugo, and elaborate on how it has impacted my personal and professional development.

Continue Reading →

Developing a Telegram Bot for Image Uploads

Last month, I wrote about moving my wife’s website from WordPress to Hugo. Overall, the pros of switching outweigh the cons. She’ll have to adapt to a new publishing workflow that involves pushing updates to GitHub and waiting a few minutes for her site to rebuild. At the same time, it’ll be much easier for me to add custom functionality to her site because I’m very familiar with Hugo.

My wife may want to get an iPad to replace her MacBook in the future, so I’ve been thinking of ways for her to handle image uploading on her new Hugo site. At the moment, the image uploading functionality on my site is handled by a custom Python script mapped to a macOS quick action – it sounds complex, but it’s very user-friendly. Unfortunately, this kind of setup isn’t possible on iPad.

After some hacking around, I settled on developing a Telegram bot to handle image uploads. I chose Telegram because the bot API is fairly easy to figure out, and the service itself is cross-platform. At the moment, the bot is able to take an uploaded image, download it to a temporary location, and upload it to a Google Cloud Storage bucket (where I store blog images).

The next step is to add Dropbox support as well because my current macOS quick action pushes images to Dropbox for backup purposes. After that, I just need to write some code to instruct the bot to send a Hugo shortcode after a sucessful upload. That’ll be especially useful for my wife because she can just copy and paste the shortcode straight into her post.

Cloudflare Stream vs. YouTube for Video Hosting and Streaming

I recently hosted a live webinar on how to host an online concert with Zoom and MainStage. After the webinar, I wanted to make the recording available for people to watch in case they missed the live event. My initial thought was to upload the video to YouTube and call it a day. Eventually, I decided to upload it to Cloudflare Stream instead. In this post, I’ll go over the two platforms, and share why I decided to use Cloudflare Stream over YouTube.

Continue Reading →

How to Layer Instruments in MainStage

In today’s live and studio productions, being able to quickly create complex patches with multiple layers is crucial. With its extensive library of built-in sound libraries, plugins, and performance-oriented features, MainStage allows you to easily create complex layered patches. In this post, you’ll learn how to layer instruments in MainStage.

Continue Reading →