Best Practices For Transferring Vinyl Records to Digital Files

Old Faithful...


If you, like me, have a sizable vinyl record collection, then at some point you may want to make digital copies of them ("vinyl rips") so you can play them out or enjoy them on your phone or computer. I've done this a fair amount of times -- probably about a hundred records -- and let me tell you: there is a lot that can go wrong and affect the quality of your transfers!

A friend of mine recently asked for some tips on vinyl ripping his own collection, so the following started as a comment on his Facebook post. However, after posting, I realized that some of this knowledge may not be very widely known, so I thought I would polish it up and make a blog post of it!

This is not a step-by-step guide for beginners; I am assuming you already have your turntable, software, and audio setup worked out. (I am also kind of assuming you are an electronic music DJ, but this advice should work for anyone.) So if you want your hand held, look elsewhere! This post is more about the little things you want to think about before you hit Record:

  1. Check your pitch calibration using the dots on the side of the platter and the red light. You want to make sure that the '0' on the pitch control corresponds with exactly 33 or 45 RPM. This is especially important for accurate BPM readings, beatgridding, and beatmatching. If you don't know how to do this, here is a good guide.

  2. It helps to have two turntables: one for recording (deck 1), and one for prepping the next disc you want to record (deck 2).

  3. Do a quick cleaning on the disc right before you record to reduce dust. A wet cleaning would be best; I usually do this on deck 2 while deck 1 records. You can put a fan on it so it dries fast. This way all you will have to do on the disc you are recording is a quick dusting or dry clean, mainly to catch dust from the slipmat (if you use those) or the rubber mat. 

  4. Use a fresh needle; worn needles will impact sound quality!

  5. Use a good preamp. it will make a huge difference! The preamps on my Pioneer XDJ controller are complete ass. Preamps are usually kind of expensive, but I've had good luck with some of the cheap Chinese units you can get off Amazon. (Fosi Audio makes a pretty good hybrid tube/solid state preamp that isn't too expensive.)

  6. If you're using a digital recorder, it can be annoying to match up generically-named audio files to their original disc. So, on a notepad, or in your phone's notes, write down the file name on the recorder next to the record name or Discogs ID. Then, it will be easy to match which file goes to each disc, and then you can add other metadata later. (And be sure to hit the 'track cut' button, or hit stop and then record again!)

  7. For electronic music: even with the Technics direct drive, even if you calibrate it with the red light and the dots, there is very slight pitch wobble and BPM won't usually be a perfect round number. I believe this is a symptom of analog being analog both on your turntable and on the record cutter that produced the original mother that your disc is stamped from. This makes accurate BPM readings and setting up beatgrids on DJ software a much bigger pain in the ass than you might be used to with digital files. Be careful playing these out with SYNC enabled!

  8. If possible, you should record in 32-bit float format. This way it is practically impossible to clip the recording! Then you can set audio levels in post and bounce the final cut to 16-bit. 32-bit float has such a wide dynamic range that clipping is never going to happen. (That said, I don't think this benefits sound quality very much if at all; but there are those who would argue that you should record in at least 24-bit. My suspicion is that this is an audiophile's old wives' tale. My own research indicates that vinyl's dynamic range is equivalent to something closer to 12-bit digital audio.)

  9. Recording in anything above 44.1khz is probably overkill -- but if you want a higher sample rate do an integer multiple like 88.2khz. This way, you can minimize the chances of downsampling adding weird quantization artifacts. Again, there are those who would argue you should record in the highest sample rate you can, but in my opinion this more audiophile cargo-culting. (The exception here is if you plan on doing weird stuff to the resulting audio file, like pitching it down, sampling, or running it through an FX chain. In those cases a higher sample rate would be better.)

  10. Set your needle weight to something a little higher than usual, so that you can minimize skips.

  11. Make sure the needle is as close to perpendicular to the disc as possible; a slanted needle will produce stereo audio levels that are slightly higher in one channel than the other. If possible you will want to verify this with level meters before getting started.

And one bonus tip: handle your needles and the tonearm very carefully! Don't be like me and drunkenly clip the cartridge with your arm, sending the needle skidding across the record like a crashed motorcycle. The tonearm+cartridge+needle assembly is very delicately balanced and shocks like that can throw something out-of-whack! 

Finally, I don't have any recommendations for needles or cartridges, other than the venerable Shure M44g, if you can get your hands on one. I'm still pissed that Shure stopped making them. When I run out of spares I will be a very sad panda. (Though I have heard good things about JICO's clones.)

Run Alembic Migrations Outside of a Transaction Block

Sitting around the campfire

I recently ran into the following error when adding some indices to a PostgreSQL database from within an Alembic migration:

CREATE INDEX CONCURRENTLY cannot run inside a transaction block

Which makes sense, particularly if you're creating the table with the index in the same migration (transaction block) -- how can `CREATE INDEX` know anything about a table that doesn't exist yet?

There are a variety of SQL schema transforms (a.k.a. DDL statements) that work this way. Alembic migrations are always run inside a transaction, and breaking out a given statement is not immediately obvious. Luckily, Alembic provides a way for us to end the transaction early and execute statements on their own ("autocommit"):

def upgrade():
    with op.get_context().autocommit_block():
        op.execute("ALTER TYPE mood ADD VALUE 'soso'")

It's important to note that any statements before the autocommit block will be committed! So it is probably best to do this last, at the end of your migration, in order to keep things simple.

And while this blog post speaks of PostgreSQL, this should apply to any database that SQLAlchemy supports!

More info: Alembic Documentation
H/T Stack Overflow

It's Technological / The Dream Now Available on Streaming!

It's Technological / The Dream


Selected tracks from my debut album, Listen E.P., are now available for your enjoyment on streaming platforms worldwide! It's Technological / The Dream can be found on Spotify, Apple Music, and many others! Give em a listen today!

How to Set an Empty Dictionary/Hash as Default Value for a PostgreSQL HSTORE Column

Do you have an HSTORE column on your PostgreSQL database that you don't want to be `null` but need to have a default value? The syntax for this is a little irregular; so I'm posting it here for my own reference and yours:

my_column HSTORE DEFAULT '' NOT NULL

is the line in your `CREATE TABLE`command that you want.

In Ruby on Rails, using an ActiveRecord migration, you would use:

t.hstore :my_column, default: {}

In Python, using an Alembic migration, you would use:

sa.Column('my_column', HSTORE(), nullable=False, server_default=sa.text("''")),

Additionally, if you want your SQLAlchemy model object to initialize this column with said empty dictionary (instead of `None`), per this StackOverflow post you need take a couple of extra steps in your model:

from sqlalchemy.dialects.postgresql import HSTORE
from sqlalchemy.ext.mutable import MutableDict

class Item(db.Model):
    my_column = db.Column(MutableDict.as_mutable(HSTORE), nullable=False, default={}, server_default='')

    def __init__(self, **kwargs):
        kwargs.setdefault('my_column', {})
        super(Item, self).__init__(**kwargs)


The More You Know!

Lyjia's Directory of Free, Open Collections of Historically Significant Art

Girl with a Pearl Earring by Johannes Vermeer (Mauritshuis)

Every so often I find myself looking for art for some reason or another -- maybe a blog post, or referencing something I saw in a museum, or maybe just for plain enjoyment -- and oftentimes it can be found in an open image collection! I've kept a small working list of these places in my head over the years, and I realized it might be useful to write them down and figure out what else is out there. As it turns out, there is a lot!

This is a collection of high-resolution, open-access, free-download, free-to-use image libraries, focusing on the visual arts like painting or photography. There are other styles of art (like sculptures, audio, or archaeological artifacts) in some of these links but that is not the focus. Most of these links are free to use in any application -- commercial or non-commercial -- but not all. Please check the license before using anything you find here commercially. The images in these links should be a mixture of public domain and Creative Commons-licensed content.

This list was last updated in July 2024.

Libraries
Space
Museums

The Getty Collection (Los Angeles)

Universities

Single-Artist Collections
Aggregators
Other Lists

sui generis.

Lyjia's Blog

All writing here is my own, does not represent the views of my employers, and is made without AI assistance.

See posts by category: