Cool Mouse Stuff with Linux

Linux has built-in tools for programming the buttons on your mouse or trackball. You don’t need any drivers or proprietary software. Just a few simple tools you can install from the repos. I’m doing this on Ubuntu 16 and 18, but it should work on any recent Linux distro.

First, use xev to detect how your system is recognizing the mouse buttons. Start xev from a command prompt, then hover over its window, click each button, and look at the text in the command prompt window. This will tell you the # for each button. The first 3 buttons are always defined the same way: left-click is button 1, middle-click 2, right-click 3. Extra buttons are “non-standard” and can be defined in any way.

To change what a button does, use xbindkeys. Its control script is a file in your home directory called .xbindkeysrc. The app xte fabricates keystrokes and mouseclicks.

For example: here’s an .xbindkeysrc that does 2 things:

  • Single click of button 2 (middle button) causes double-click of button 1 (left)
  • Single click of button 9 causes Control-click of button 1.
# button 2 (scroll wheel) is double click
"/usr/bin/xte 'mouseclick 1' 'mouseclick 1'"
b:2 + release

# button 9 (upper left alternate) is control + left click
"/usr/bin/xte 'keydown Control_L' 'mouseclick 1' 'keyup Control_L'"
b:9 + release

This should work everywhere in all apps. It does work in some apps (like Thunar), but not in others (like Firefox). I wondered – why?

Limitation 1

After experimenting, I discovered that xte is too fast for some apps. I added a few strategically located brief (10 ms) delays and it worked everywhere.

Example: change the above to this:

# button 2 (scroll wheel) is double click
"/usr/bin/xte 'mouseclick 1' 'usleep 10000' 'mouseclick 1'"
b:2 + release

# button 9 (upper left alternate) is control + left click
"/usr/bin/xte 'keydown Control_L' 'mousedown 1' 'usleep 10000' 'mouseup 1' 'keyup Control_L'"
b:9 + release

The usleep param is in microseconds, so 10,000 is 10 milliseconds. This now works in all apps.

Limitation 2

Another limitation: it’s hard to make the same button duplicate itself from xbindkeys. If you do this, it can lead to infinite loops. For example: xbindkeys can easily make a single click of button 2, cause a double-click of button 1. But xbindkeys can’t make a single click of button 1, cause a double-click of the same button. This will fail or cause an infinite loop.

For that, use imwheel. Originally intended to adjust the sensitivity of the scroll wheel, it is also useful for other things. This is because internally, a scroll wheel is just 2 buttons: up and down. To make it more sensitive, imwheel duplicates each click of those buttons. But imwheel can do this with any buttons, not just the scroll wheel. Its config file is .imwheelrc, in your home directory.

Here’s an imwheel config that doubles the scroll wheel sensitivity:

# Apply to all apps (individual apps can be customized)
".*"
# Amplify scroll up/down
None,    Up,    Button4,    2
None,    Down,    Button5,    2
# Amplify scroll left/right
None,    Left,    Button6,    10
None,    Right,    Button7,    10

On my trackball, the scroll wheel is Button 4 and Button 5. The scroll wheel tilts L and R; these are buttons 6 and 7. Yours may be different; check it with xev.

Elecom Trackball, IOGear GCS1102 KVM Switch, Ubuntu 18

My Logitech Trackman thumb trackball is so old it has a PS/2 plug. Its buttons are finally starting to fail and I needed to replace it. But Logitech doesn’t make wired trackballs anymore. I must have wired because (1) I use an IOGear GCS1102 KVM Switch, and (2) I prefer the instantaneous smoother response of wired devices.

I Googled around and discovered the Elecom M-XT3URBK, worth a try. At first it didn’t work. On a whim, I checked my GCS1102 (open a text editor, hit Ctrl-F12, press F4, and it prints its settings) and found it was in mouse emulation mode. I disabled mouse emulation mode (Ctrl-F12, press m) and the Elecom worked perfectly. Xev detected all buttons except the far right, which I don’t need anyway.

Good stuff:

  • Tracks at least as well (smooth, fast, accurate) as the Logitech Marble
  • Switch-adjustable DPI (low is still pretty high and works best)
  • Buttons
    • Standard L and R
    • Scroll wheel clicks like a button (without occasionally moving, like the Logitech did)
    • Scroll wheel clicks L and R to scroll horizontally
    • Two small buttons to the L of the L button
  • It’s comfortable to use
  • Elecom makes a mirror image left-handed version
  • Price: only $40 – half Logitech’s prices!

Bad stuff:

  • The cable is a bit on the short side, but still long enough I didn’t need an extension.
  • It’s a bit small for my large hands

So far, no problem. It works, scroll wheel and all buttons, without any drivers. Just plug and play. But there’s more…

SENSITIVITY and ADJUSTMENT

The Elecom is so much more sensitive than my old Logitech, I had to turn down the settings. But with the GCS1102’s mouse emulation disabled, every time I switch, each computer sees the mouse being un-plugged and re-plugged. When this happens, Ubuntu doesn’t restore the mouse settings. When I switch away and back, the mouse is back to its hyper-sensitive default setting.

I wrote a shell script /apps/bin/setMouse.sh that uses xinput to set the mouse:

#!/usr/bin/env bash
# The UI for setting mouse track speed in Ubuntu 18 is broken.
# Do it manually here
# NOTE: as of June 2018, the mouse was device 12.
# You can check this with: xinput --list --short
# To show device settings: xinput --list-props 12

echo "`date`, $USER, $DISPLAY, $XAUTHORITY" >> /apps/bin/mouse.log

if [ -z "$1" ]
then
    a="0.1"
else
    a="$1"
fi
if [ -z "$2" ]
then
    m="0.4"
else
    m="$2"
fi
if [ -z "$3" ]
then
    d="`xinput | grep Mouse | grep pointer | cut -f 2 | cut -c4-5`"
else
    d="$3"
fi

aprop=`xinput --list-props $d | grep 'Accel Speed (' | cut -f2 | cut -c23-25`
if ! [ -z "$aprop" ]
then
    xinput set-prop $d $aprop "$a"
fi
mprop=`xinput --list-props $d | grep 'Coordinate Transform' | cut -f 2 | cut -c35-37`
if ! [ -z "$mprop" ]
then
    xinput set-prop $d $mprop "$m", 0.0, 0.0, 0.0, "$m", 0.0, 0.0, 0.0, 1.0
fi

echo "`date` Mouse set up $a $m $d" >> /apps/bin/mouse.log
xinput --list-props "$d" >> /apps/bin/mouse.log

But I don’t want to have to run this script every time I switch the GCS1102. The Linux Udev system should do the job!

UDEV RULES

First, I needed a Udev rule to trigger my script. The rule must detect the USB device being plugged in, so I need its vendor and product IDs. To get these, run lsusb:

Bus 003 Device 122: ID 056e:00fb Elecom Co., Ltd

Now add a Udev rule. Mine was /etc/udev/rules.d/61-elecom-mouse.rules:

SUBSYSTEM=="usb", ATTR{idVendor}=="056e", ATTR{idProduct}=="00fb", ACTION=="add", RUN+="/apps/bin/setMouse.sh"

But it didn’t work. The script was running (I could see the log entry it creates). But the mouse sensitivity wasn’t being set.

DELAYED EXECUTION

My first thought was that the Udev event was firing before the device was registered and ready to be configured. So I added a sleep to the command. But, you can’t sleep while Udev is running your command. So I had Udev run a script that returns immediately, while sleeping a few seconds then running setMouse. A command like this:

(sleep 3 ; /apps/bin/setMouse.sh) &

But that didn’t work. It worked from the command line, but when run from Udev, the background was ignored and Udev waited for the entire time. That’s bad for 2 reasons: (1) hangs Udev for 3 seconds, (2) Udev is still waiting, so the sleep is pointless because the device won’t be ready until Udev is done.

In short, Udev is too smart by half. I needed a way to trick Udev into returning immediately, while my script pauses a few seconds then runs. I found this with the at command. First, install it:

sudo apt install at

Then, make the Udev rule look like this:

SUBSYSTEM=="usb", ATTR{idVendor}=="056e", ATTR{idProduct}=="00fb", ACTION=="add", RUN+="/usr/bin/at -M -f /apps/bin/setMouseElecom.sh now"

This tells at to trigger the script to run immediately, but at returns to Udev immediately. The script doesn’t run under Udev but under at. The setMouseElecom.sh script looks like this:

#!/usr/bin/env sh
# Called by Udev when Elecom trackball is plugged in
sleep 2
/apps/bin/setMouse.sh 0.1 0.4

Note: at can only run sh scripts, not bash.

But, it still didn’t work. The script ran, but its xinput commands always failed.

XINPUT AND XSESSION

I guessed it might be that at, running as root, didn’t have permission for my X session. I had to somehow make it join my X session before the xinput commands would work. I made a script called joinXandRun.sh:

#!/usr/bin/env bash

# Get the number of the active terminal (requires root)
TTY=$((`fgconsole`-7))

# Set env vars needed to simulate the user
export DISPLAY=:${TTY}.0
USER=`who -s | grep "(:$TTY)" | cut -d' ' -f1`
export XAUTHORITY=/home/$USER/.Xauthority

echo "`date`, $USER, $DISPLAY, $XAUTHORITY: $1" >> /apps/bin/joinXandRun.log
sudo -H -u $USER bash -c "$1 $2 $3 $4 $5 $6 $7 $8 $9"

This script finds the active X console, and its user and display. Then it sets the critical DISPLAY  and XAUTHORITY environment vars to “join” that X session. Then it runs another script passed into it, as the given user.

Then I made setMouseElecom.sh call this script:

#!/usr/bin/env sh
# Called by Udev when Elecom trackball is plugged in
sleep 2
/apps/bin/joinXandRun.sh /apps/bin/setMouse.sh 0.1 0.4

Guess what — this worked!

The really cool thing about this is that the Udev rule is device-specific, and setMouse.sh takes parameters. I could set this up to auto-detect and configure several different kinds of mice or trackballs. Each would have a different Udev rule, matching different vendor and device IDs, firing different scripts that pass different mouse setting params to setMouse.sh. This will be useful for my laptop, which uses the Elecom at work but another Logitech Trackman at home.

It turns out all the pieces are essential. Lessons learned:

  • When Udev triggers the add event, the device being added cannot yet be configured. So if your Udev script configures the device, it has to:
    • Return immediately to Udev, so Udev can finish its processing
    • Meanwhile, trigger its config processing to run after a few seconds
  • To configure devices that are part of the X session, you need to “join” the session. Otherwise, the X system won’t let your code configure the device.

PS: none of this is specific to Ubuntu 18. It should work on any recent Linux distro.

Calibre, Amazon Books, DeDRM

I’ve been a big reader since I was a kid, all kinds of books from many sources. I was an early Kindle adopter, but as Android tablets came out I found them better for reading:

  • Configurable: you can set a wider variety of fonts, sizes, margins, colors, layouts.
  • Open: you can install any number of reading apps for every eBook format available. You’re not locked into any single book ecosystem.
  • Graphics: books with pictures, diagrams, etc. are much better on a tablet. Even a large eInk reader lacks color and renders slower.

Due to the variety of books I read, no single ecosystem would do the job. Plus, I take a principled opposition to any company that tries to lock customers into its ecosystem. When I buy a book I don’t believe I’ve bought it to read on a particular device, in a particular format, to access whenever some corporation thinks I should be able to. I’ve bought the right to read it on any device, in any format, whenever I want to, forever. Just like a real book. Indeed, eBooks often cost as much as real books even though the marginal cost of the next eBook sold is zero. And, I run native Linux on all my computers.

All of this all led me to start using Calibre to manage my eBooks. Calibre is simply great – it meets all these needs and more. It’s a great organizer, supports all devices, all formats, can convert between them, and has many plugins with an active open source development community.

Without owning a Kindle, how does one buy books from Amazon, store them on your own computer and read them on any device in any format? Here’s how:

Even though I run Linux, I have a VM running Windows. I don’t use it for much, only those few apps that I can run natively on Linux or in a browser. Unfortunately, Amazon Kindle is one of those. In this VM I have the Kindle for PC app registered to my Amazon account.

I’ll assume you already have Calibre running and you’ve installed Apprentice Alf’s DeDRM plug-in.

Next, do a one-time configuration step: capture the Kindle key from your Windows PC and copy it to Calibre so it can DeDRM Kindle books.

  • On Windows
    • Install Python 2.7 and Pycrypto 2.6 for Python 2.7.
    • Unzip the Calibre DeDRM plug-in ZIP file
    • In this zip, find the file kindlekey.py.
      • This zip file has several directories and files in it. In DeDRM_6.6.0, this file is here: \DeDRM_Windows_Application\DeDRM_App\DeDRM_lib\lib
    • Open a command prompt and run this file: kindlekey.py
    • You’ll see something like this:
      • Using Library AlfCrypto DLL/DYLIB/SO
        searching for kinfoFiles in C:\Users\USERNAME\AppData\Local
        Found K4PC 1.9+ kinf2011 file: C:\Users\USERNAME\AppData\Local\Amazon\Kindle\storage\.kinf2011
        Decrypted key file using IDString ‘406xxxxxxx’ and UserName ’63xxxxxx’
    • It creates a new file: kindlekey1.k4i
    • Copy this file to a directory your Linux Calibre app can see
  • On Linux
    • Run Calibre
    • Click Configure, Plugins, File type plugins, DeDRM
    • Click Customize plugin
    • Click Kindle for Mac/PC ebooks
    • Click Import Existing Keyfiles
    • In the file dialog that pops up, pick your kindlekey1.k4i file

You’re done: Calibre DeDRM is configured to be able to DeDRM ebooks you drop on it, so long as they come from your Kindle for PC reader.

After I buy a book on Amazon, I deliver it to my Kindle for PC device.

  • In Windows:
    • Open Kindle for PC, refresh your library. The book should appear.
    • Double-click it to download it.
    • After the book opens, close it and the Kindle for PC app.
    • Open folder Users\USERNAME\Documents\My Kindle Content
    • Your book will be one of these folders named B….._EBOK
    • Sort by date to put the most recent files on top
    • Open the folder and you’ll see an azw file having the same filename as the folder.
    • Copy this azw file to a directory that your Linux Calibre can see.
  • In Linux
    • Run Calibre and drag/drop the azw file on it.
    • Calibre will strip the DRMs and add it to your library

You now own the book. It’s stored on your own hard drive, you can read it on your PC, convert it to any format you want, copy it to any device or app you want to use to read it.

I Broke My Arm!

Riding Tiger Mtn on Sat 5/12 with a friend, a wet slimy tree root suddenly torqued my front wheel around and I hit the ground hard, banged up but all body parts still firmly attached. I continued riding, but every bump triggered sharp pain in my left shoulder, so we got off the trail and rode out along the (less bumpy) gravel fire road. That meant climbing back up to the summit again before we could go back down. The good news: we got a tough cardio workout with 4,000′ of climbing in 15 miles. The bad news: got some x-rays on Mon 5/14 and found out my left humerus is fractured. I can still ride but will stick to the machines in the gym for a few weeks.

The break is a crack at the upper end of the humerus where the ball-shaped top end tapers to the straight part of the bone. The doc says it will probably heal on its own, but there’s some chance the shoulder muscles might pull it out of alignment, in which case it will require surgery to realign the bone.

I’m getting another x-ray soon to see which way this is going.

4 years later… I don’t know why I didn’t put up the pictures. They’re quite interesting, showing how fast bones can knit and heal. Bone injuries can heal faster than ligaments. In 13 days the bone had closed and knitted the crack, though it took several more weeks to fully heal.

Day 2 – cracked

Day 13 – crack is closed and knitted!

Velocity: Orbital vs. Escape

While thinking about escape velocity recently, I wondered why orbital velocity wasn’t the same as escape velocity. The intuition was: consider an object in a circular orbit around the Earth at speed v. If the object speeds up just a smidge, then its centrifugal force increases, which pulls it slightly further away from Earth, where gravity is weaker, so it goes even further away, etc. It seems like a positive feedback chain reaction, the object getting progressively further away from E. That would imply that orbital velocity equals escape velocity, because if you go even a smidge faster, you’ll eventually escape orbit.

However, I worked out the equations and escape velocity is not equal to orbital velocity, but it’s about 41% faster (actually, square root of 2 faster). Upon further thought, I realized my earlier intuition missed a key point: as the object moving slightly faster goes further from Earth, its trajectory flattens out. When its trajectory is a circle, the force of Earth’s gravity is perpendicular to its motion, so it does not affect the object’s speed. But when the object’s trajectory flattens out, it’s no longer a circle, so Earth’s gravitational pull is no longer perpendicular to its motion. Some small portion of Earth’s gravitational pull is slowing it down! Then, of course, pulls it forward speeding it up as it comes around the other side of the ellipse.

So when the object speeds up a smidge, its orbit becomes elliptical. It has to go significantly faster than that to escape from Earth. In fact, about 41% faster since the difference is the square root of 2.

This also means orbits are stable: if the velocity changes a bit the shape of the orbit changes, but it stays in orbit. If escape velocity equaled orbital velocity, orbits would be unstable: the slightest bump would send it out into space or spiraling inward.

When the math contradicts intuition, it leads to re-thinking which can deepen one’s intuitive understanding.

Escape Velocity

Escape Velocity is commonly described as the minimum speed an object must reach to escape the Earth (or other celestial body) into space. But this definition is ambiguous and can be misleading.

You can escape the Earth at walking speed, if you could walk straight up; you don’t need anywhere near escape velocity. Imagine a rocket launch; in the first few seconds just as it starts to move, it’s going up at walking speed. Theoretically, it could throttle back the engines to maintain that slight upward speed all the way into space, so long as it didn’t run out of fuel or become unstable. A space elevator could also leave Earth at mundane speeds.

The key to this ambiguity is escape velocity applies to a free body, an object that is passively moving according to the laws of physics, having no thrust of its own. In other words, if a rocket achieves escape velocity, it could at that point turn off its engines and it would still escape the Earth. Intuitively it seems the higher the altitude, the slower the escape velocity. This turns out to be correct.

Escape velocity is easy to understand and derive mathematically with some creative thinking. Imagine 2 objects in space (a big one and a much smaller one, like the Earth and a stone) surrounded by vacuum, no other objects. So there is no friction and no other bodies exerting gravitational pull. Suppose the stone is at rest relative to the Earth and almost infinitely far away. The gravitational pull is effectively zero. Imagine the stone precariously balanced just on the outer rim of Earth’s gravity well. Then you nudge the stone just a smidge toward the Earth, so it crosses that rim and the Earth starts pulling on it (and vice versa). It starts out slow, but accelerates toward the Earth incrementally faster and faster.

Eventually, when the stone reaches the Earth it will be moving very fast. Escape velocity is the speed it is going just before it smashes into the Earth. Or if it misses the Earth, it’s the speed at its point of closest approach. More correctly and completely, the stone is always traveling at escape velocity at every moment along its path. The escape velocity for that distance from the Earth, is the speed at which the stone is moving when it’s that far away.

Note: the bold face statement above is the nut of this explanation. When you grok its fullness, you grok the fullness of escape velocity.

That’s because of conservation of energy. When the stone was at the rim of Earth’s gravity well, it had a lot of potential energy. At the point of closest approach, all that potential energy has been converted into kinetic energy. Assuming no atmosphere, no losses, the two energies are equal. So as the stone speeds past the Earth, slowing down due to the same gravitational pull that sucked it in, that kinetic energy is converted back into potential energy. So it must reach the exact same distance away when it peters out and eventually stops.

The direction of motion is irrelevant to escape velocity. Normally this seems counterintuitive, but understanding escape velocity with our theoretical example, you can easily see why direction doesn’t matter. At that point of closest approach, it doesn’t matter what direction the stone is moving relative to the Earth. It could be nearly straight up (can’t be exactly straight up, or it wouldn’t have missed), or nearly horizontal. If it’s going horizontal, it has to travel further to escape, but being horizontal, gravity isn’t pulling it as hard. These conflicting factors are equal and cancel each other. All that matters is the altitude (distance of closest approach), because the speed depends only how much energy it’s gained from Earth’s gravity field.

If, at that point of closest approach, the stone were moving any slower, then it would have less kinetic energy, and it will not go as far away. That means it won’t make it to the rim of Earth’s gravity well, so it will still be inside the well, reverse direction and eventually come back to Earth. So escape velocity is the minimum speed a free body can have, and escape the Earth.

Of course, in the real world direction does matter. The Earth has an atmosphere that creates a lot of friction and energy loss at high speeds. If you go straight up, you’re in the atmosphere for a shorter time, less energy loss. If you go horizontal, you’re in the atmosphere longer and will lose more energy.

Here is the mathematical derivation:

escapeVelocity

Gun Culture: NYT Op-Ed

Today the NYT published an Op-Ed by David Joy. I enjoyed reading it and share some of his observations. About 3/4 of the way through he suggests an AR-15 is somehow different from other rifles in the store, saying, “the idea of owning a rifle designed for engaging human targets out to 600 meters just never interested me.” He asks a friend why he owns an AR-15 and is unsatisfied with his friend’s response. Here is mine.

First, David’s belief that the AR-15 is somehow different from other rifles in the store, is not justified by the facts.  The AR-15 is a semi-automatic .223 caliber rifle. It is less powerful than most common .30 caliber rifles, like the Savage .308 David uses to hunt deer. These more powerful semi-auto rifles are just as accurate, often have longer range and are commonly used for sport, hunting and self defense.

Second, David mis-characterizes the AR-15 when he describes it as “a rifle designed for engaging human targets out to 600 meters”. For engaging human targets out to 600 meters, look at what military snipers use. They use a rifle that is more powerful, more accurate, and has longer range than an AR-15. This rifle is the M-24, which is a .30 caliber bolt action Remington Model 700 with a 5 round capacity, the same kind of rifle your Grandpa carried through woods, still carried by thousands of hunters across the USA. Later, Army snipers switched to the M2010, which is another .30 caliber bolt action rifle with a 5 round magazine.

In short, according to the US Army, a rifle like David’s Savage .308 is more effective than an AR-15 at “engaging human targets out to 600 meters”. But that’s not a fair comparison; the Army doesn’t even use the AR-15.

People who don’t know much about guns believe, incorrectly, that the AR-15 is a military rifle. They believe this primarily for cosmetic reasons. Instead of steel and wood, it is black with lots of plastic and resembles the M-16 that US soldiers carry. Yet it is unusual to see an experienced gun owner like David make this mistake. The military M-16 is not an AR-15. The M-16 can fire in full automatic mode (a machine gun) which has been strictly regulated since 1934. The AR-15 fires one bullet each time you pull the trigger.

So when David says, “My friends see no difference between the guns I own and their ARs,” this should come as no surprise. The only material difference is magazine capacity.

To David’s final point, there are several good reasons to oppose an assault-weapons ban.

  1. The term “assault weapon” is pure fiction. They’re not machine guns; those have already been virtually banned since 1934. The guns named as “assault weapons” are based mainly on cosmetic features; they’re not functionally different from common sporting and hunting rifles.
  2. The AR-15 magazine holds 30 rounds. This is more than most other rifles in common use and makes it the only functional difference between the AR-15 and these other rifles. It is worth debating whether restricting such high capacity magazines might reduce crime or improve public safety. Yet our country has already had this debate, and more; see below.
  3. The Federal Govt banned “assault weapons” for 10 years, from 1994 to 2004. This included a ban on magazines in any firearm holding more than 10 rounds. Serious academics (such as the National Academy of Sciences) and the Dept. of Justice comprehensively studied the law and found it had no effect on crime, accidents, suicide or public safety.

In short, an assault weapons ban has already been tried, studied, and found to be ineffective. And the reason why is obvious: true “assault weapons” — machine guns — are already banned and have been since 1934.

Note: I don’t own an AR-15 simply because I find other guns to be more useful for sport, hunting or self defense. However, having used one, I don’t believe there is anything about it that makes it more dangerous than other rifles in common use today. I don’t see the AR-15 as a sign of a rift in gun attitudes or culture. The gun owners I know are responsible citizens, whatever kind of rifles they prefer.

Back to the HD-580 – For a While

My Audeze LCD-2 fell off my desk at work and got pranged so they’re going back to Audeze for repair and, incidentally, upgrade to the 2016 drivers. My home pair has  these drivers and they are a subtle improvement over the 2014.

In the meantime, I’m listening to my trusty old HD-580s. Original 18 year old drivers, though I’ve replaced the headband and ear pads, and the cable, a few times over the years. They’re clean and play, fit and look like new.

First impression: these HD-580s are nice headphones! Smooth mids, nice timbres, well balanced. They really were the very first audiophile headphone, SOTA for 1999, a whole different league apart from Grados and the like. But compared to the LCD-2:

  • The low bass is rolled off
  • The bass is not as tight
  • The mids are a tad boxy, not as open sounding
  • The high treble is rolled off

Overall, they sound a tad muffled and slow compared to the LCD-2. Conversely, the LCD-2 has:

  • Wider bandwidth: deeper bass, higher treble
  • Better detail & articulation throughout the range

One advantage the HD-580 has over the LCD-2 is comfort. The HD-580 are lighter and breathe better. That better breathing is due to having velour earpads instead of leather, which is more comfortable but it doesn’t seal as well which likely contributes to the bass attenuation.

Another advantage of the HD-580 is their midrange linearity. The LCD-2 has a response bump in the mids (600-1200) and a dip in treble (3-4 kHz). If you don’t have EQ to correct this, the HD-580 can actually be better than the LCD-2.

A gentle parametric EQ helps widen the HD-580’s apparent bandwidth:

  • +6 low shelf @ 100 Hz, Q=0.67

I’m enjoying this trip down memory lane. I listened to these same HD-580s during most of the 10,000 hours I put into Octane Software back in the day. They sound nice, but I will be happy to get my Audeze back.

Audio History

I loved music and was fascinated with audio electronics since I was a little kid. Later I became interested in the physics of sound.

I bought my first audio component in the 1980s in college, a Harman Kardon integrated amplifier. It was simple and cheap, had no tuner, only 40 WPC output, but it did have a phono amp (MM only) and decent gain stage. To find good speakers, my friend Shawn and I visited the local audio store and listened to several different speakers (Klipsch, Polk, and a few others) with a variety of music. We both liked the Polk 10Bs best. They had the smoothest least colored sound for my limited budget. My musical taste at the time was about half classical, half rock.

Back in those days digital audio and headphones were not an audiophile option. Good headphones simply didn’t exist and digital audio was so new, consumer CD players were expensive and tended to have poor reproduction of high frequencies and transient response. Because of this, there were no good cheap paths to high quality sound, like we have today.

I didn’t have a turntable, they were too expensive. But I did get a good CD player, an Onkyo DX-530 which was one of the first CD players to use oversampling, which improved the high frequency and transient response by enabling more gradual slope Nyquist filters.

This little system lasted me through college with many hours of satisfying listening. Then, my junior year in college, the local audio store went out of business and I got their used demo pair of Polk SDA-2 speakers. This was a big upgrade from the 10Bs, and the price was so good it was almost an even trade when I sold the 10Bs.

After graduating from college I was ready for a decent turntable. I visited the local audio store and auditioned a couple of different turntables & cartridges for several hours, picking a Thorens TD-318 MK II with an Ortofon MC-3 high output MC. That was in 1991. That HK integrated amp only had a low-gain MM phono amp, and my budget didn’t allow for a low ouput MC. The high output MC was a little on the bright side, but it had the smoothest, least colored sound compared to the MMs.

This little system lasted me for several years, until around 1995 I got a new job and promotion and my budget was ready for an upgrade. I auditioned a couple of different power amps and pre amps at the local audio store and ended up taking home an Adcom 5800 power amp with a Rotel RC-990BX pre amp, which had a dual-stage phono amp, so I could now try low output MC phono cartridges. And I had enough power to fully drive those Polk SDA-2 speakers.

At this time, digital was improving but to my ears, good vinyl still had more natural sounding high frequencies and transient response. But only good vinyl – like heavy 280-220 gram pressings, half-speed masters, etc. I started collecting MoFi half-speed masters, Cheskys, Audioquest, Telefunken, Wilson Audio, Classic, Water Lily, and other audiophile vinyl. I didn’t have the budget for much, so I carefully selected and treasured each new addition to the collection.

In the late 90s I replaced my Onkyo DX-530 with a Rega Planet CD player. I read so many good things about it, I thought it must be great. I never really got into this CD player, I think the old Onkyo was actually better. The Rega had a distinct sound that grabbed one’s attention at first. But upon further listening it was to my ears, congested and the high frequencies were all wrong. I ended up selling the Rega about a year later. It was so popular, it was easy to sell. I replaced it with a Rotel RCD-1070. Nothing special, but a solid well engineered good sounding player.

Fast forward a few years to 2000, when I sold my first startup (Octane software) and was ready for another audio upgrade. I already had reference quality amplification so this time it was the speakers. I visited the local audio store with my best albums and spent all day listening to every fine speaker system they had. I also did a bunch of research in audiophile channels. I ended up picking Magnepan 3.6/R speakers, as they had the most natural, linear, uncolored midrange and treble of any speaker I listened to. The Adcom 5800 had plenty of power with enough refined clarity to make these excellent speakers really sing.

About a year later I designed and built my own ladder stepped attenuator to replace the preamp. This added a level of clarity and transparency to the system — no active preamp is cleaner than a single metal film resistor in the signal path! And I learned a little about analog audio circuits, grounding and soldering. Now I didn’t have a phono amp anymore. I did a bunch of research and picked up a DACT CT100, which is an excellent reference quality flexible phono amp, but just a circuit card. I designed and built a power supply for it (dual 12V batteries), with a small chassis, cabling & grounding & connectors. I was delighted with the sound, a noticeable upgrade from the Rotel pre amp’s phono amp, which was quite good to begin with.

This new level of transparency revealed the limitations of the Rotel CD player so I looked for alternatives, knowing that DACs were constantly improving. I ended up with another Onkyo, a DX-7555. It had a more refined sound with more natural midrange voicing.

After we moved from Orcas Island to Seattle my listening room changed. I used test tones, microphones and measurements to tune my new audio room. I built floor-to-ceiling height 22″ diameter tube traps for the rear corners, RPG acoustic foam 4 layers thick strategically located on the wall behind the listener, careful room and speaker arrangement, and ended up with a great sounding room that was within 4 dB of flat from 40 Hz to 20 kHz. It wasn’t perfect though. There was a small rise in the mids around 1 kHz, likely inherent to the Mag 3.6 speakers, and the lowest bass octave was from 6 to 12 dB down. Notwithstanding these limitations, it was a great sounding room.

I kept this system for about 10 years, from 2005 to around 2015. Then I replaced the ladder stepped attenuator with an Oppo HA-1 DAC, using the digital outputs from my source components. And I got a Behringer DEQ 2496 and used its pure digital parametric EQ to tame the 1 kHz bump and lift the bottom bass octave. This put the in-room system response within 3 dB of flat from 30 Hz to 20 kHz, which is comparable to a good recording studio. The sound is fantastically natural: detailed yet smooth and not bright, bass is deep, yet controlled and fast, natural voicing through the mids with seamless transition to high frequencies.

Finally, in Jan 2018 I sold my turntable, vinyl, and related analog equipment. I just wasn’t using it anymore, since I had all those recordings on digital, and the sound quality of digital had improved so much, while great LPs do sound great, I no longer felt that they sounded any better than great digital.

Mike’s Best Vinyl LP Records

UPDATE: Mar 2018: These are all sold!

As I’m liquidating my vinyl and playback equipment, I’ve sorted through all my LPs and found about 100 of them to be half-speed masters, heavy vinyl, 45 RPM single sided, Japanese Press, Mobile Fidelity, Chesky, Wilson Audio, Telefunken limited edition pressings, or other such. Many are out of print, all are in mint condition – no scratches, cleaned with the Nitty Gritty 2.5FI, played only on properly aligned high end equipment.

I’ve got a few hundred more LPs not shown in this list, many of which are nice, but they’re standard quality. I’ll probably sell them in bulk for $1 each somewhere.

Here’s the list of my best LPs. Items already sold are highlighted in RED: lpListHighQuality-1712