MP3

Audio Processing Workflow

Monday, April 18, 2022 

I prefer local control of media data, the rent-to-listen approach of various streaming services is certainly convenient, but pay-forever, you get what we think you should models don’t appeal to me. Over the decades, I’ve converted various eras of my physical media to digital formats using different standards that were in vogue at the time and with different emphasis on various metadata tags yielding a rather heterogeneous collection with some annoying incompatibilities that sometimes show up, for example using the Music plugin with NextCloud streaming via Subsonic to Sublime Music or Ultrasonic on Android.  I spent some time poking around to find a set of tools that satisfied my preferences for organization and structure and filled in a missing gap or two; this is what I’m doing these days and what with.

The steps outlined here are tuned to my particular use case:

  • Linux-based process.
  • I prefer mp3 to aac or flac because the format is widely compatible.  mp3 is pretty clearly inferior to aac for coding efficiency (aac produces better sound with less bits) and aac has some cool features that mp3 doesn’t but for my use compatibility wins.
  • My ears ain’t what they used to be.  I’m not sure I could ever reliably have heard the difference between 320 CBR and 190 VBR, but I definitely can’t now and less data is less data.
  • I like metadata and the flexibility in organization it provides, and like it standardized.

So to scratch that itch, I use the following steps:

  • Convert FLAC/high-data rate mp3s to VBR (about 190 kbps) with ffmpeg
  • Fix MP3 meta info wierdsies with MP3 Diags
  • NEW! Verify the audio with sox
  • Add Replay Gain tags with loudness-scanner
  • Add BPM tags with bpm-tag from bpm-tools
  • Use Puddletag to:
    • Clean any stray tags
    • Assign Genre, Artist, Year, Album, Disk Number, Track, Title, & Cover
    • Apply a standard replace function to clean text of weird characters
    • Refile and re-name in a most-os-friendly way
  • Clean up any stray data in the file system.

Links to the tools at the bottom.

Convert FLAC to MP3 with FFMPEG

The standard tool for media processing is ffmpeg.  This works for me:

find . -depth -type f -name "*.flac" -exec ffmpeg -i {} -q:a 2  -c:v copy -map_metadata 0 -id3v2_version 3 -write_id3v1 1  {}.mp3 \;
A summary:

find                  unix find command to return each found file one-by-one
.                     search from the current directory down
-depth                start at the bottom and work up
-type f               find only files (not directories)
-name "*.flac"        files that end with .flac
-exec ffmpeg          pass each found file to ffmpeg
-i {}                 ffmpeg takes the found file name as input
-q:a 2                VBR MP3 170-210 kbps
-c:v copy             copy the video stream (usually the cover image)
-map_metadata 0       copy the metadata from input to global metadata of output
-id3v2_version 3      write ID3v2.3 tag format (more compatible than ID3v2.4)
-write_id3v1 1        also write old style ID3v1 tags (maybe useless)
{}.mp3 \;             write output file (which yields "/original/filename.flac.mp3")

For album encodes with a .cue or in other formats where the above would yield one giant file, Flacon is your friend.  I would use two steps: single flac -> exploded flac, then the ffmpeg encoder myself just for comfort with the encoding parameters.

Convert high data rate CBR MP3 to VBR

Converting high data rate CBR files requires a bit more code to detect that a given file is high data rate and CBR, for which I wrote a small bash script that leverages mediainfo to extract tags from the source file and validate.

#!/bin/bash

# first make sure at least some parameter was passed, if not echo some instructions
if [ $# -eq 0 ]; then
    echo "pass a file name or try: # find . -type f -name "*.mp3" -exec recomp.sh {} \;"
    exit 1
fi

# assign input 1 to “file” to make it a little easier to follow
file=$1

# get the media type, the bitrate, and the encoding mode and assign to variables
type=$(mediainfo --Inform='General;%Format/String%' "$file")
brate=$(mediainfo --Inform='General;%OverallBitRate/String%' "$file" |& grep -Eo [0-9]+)
mode=$(mediainfo --Inform='Audio;%BitRate_Mode/String%' "$file")

# first check: is the file an mpeg audio file, if not quit
if [[ "$type" != "MPEG Audio" ]]; then
    echo $file skipped, not valid audio
    exit 0
    fi

# second check: if the file is already VBR, move on.  
if [[ "$mode" = "Variable" ]]; then
    echo $file skipped, already variable
    exit 0
    fi

# third check: the output will be 170-210, no reason to expand low bit rate files
if [[ "$brate" -gt 221 ]]
    then
        ffmpeg -hide_banner -loglevel error -i "$file"  -q:a 2  -c:v copy -map_metadata 0 -id3v2_version 3 -write_id3v1 1  "${file}.mp3"
        rm "${file}"
        mv "${file}.mp3" "${file}"
        echo $file recompressed to variable
    fi
exit

I named this script “~/projects/recomp/recomp.sh” and call it with

find . -depth -type f -name "*.mp3" -exec ~/projects/recomp/recomp.sh {} \;

which will scan down through all sub-directories and find files with .mp3 extensions, and if suitable, re-compress them to VBR as above. Yes, this is double lossy and not very audiophile, definitely prioritizing smaller files over acoustic fidelity which I cannot really hear anyway.

Fix bad data with MP3 Diags

MP3 Diags is a GUI tool for cleaning up bad tags.  It is pretty solid and hasn’t mangled any of my files yet.  It has two basic functions: passively highlight missing useful tags (replaygain, cover image, etc) and actively fix messed up tags which is a file-changing operation so make backups if needed.  I generally just click the tools buttons “1”–”4″ and it seems to do the right thing. Thanks Ciobi!

Install was easy on Ubuntu:

sudo apt install mp3diags
UPDATE Jan 2024

Binaries aren’t being built for Linux any more. If you’re going to build, the slightly non-standard dependencies include:

sudo apt install libqt5svg5 zlib1g-dev libzstd-dev libboost-dev libboost-program-options-dev
git clone https://github.com/mciobanu/mp3diags.git
cd mp3diags
cmake -S . -B build/release -DCMAKE_BUILD_TYPE=Release
cmake --build build/release -j $(getconf _NPROCESSORS_ONLN)
cd build/release
sudo make install

Check MP3 content validity with sox

Sox actually reads the audio stream block by block, which is a slow way to check files, but if there’s some bit flip or other corruption in the data stream, the other validation options won’t see it, but sox will and probably barf. An easy way to check is to have sox read all the mp3 files and output any encountered errors like so:

find . -depth -type f -name "*.mp3" -exec sox {} -n -V2 \;

-n  # null output - just do the math on the input, don't write anything
-V2 # verbose 2: Errors and warnings, including clipping

Errors might look like:

sox FAIL formats: can't open input file `./11-Precious_Memories.mp3': Invalid argument

Bummer, probably a borked file.

sox is slow and single threaded, so running multiple instances down different directory trees may speed results.

I wrote a shell script to gather stats and flag outliers, here.

Add ReplayGain Tags

To bulk add (or update) ReplayGain tags, I find loudness-scanner very easy.  I just use the droplet version and drop folders on it. The defaults do the right thing, computing track and album gain by folder. The droplet pops up a confirmation dialog which can be lost on a busy desktop, remember it.  Click to apply the tags then wait for it to finish before closing that tag list window or it will seg fault.  The only indication is in the command prompt window used to launch it, which shows “….” as it progresses and when the dots stop, you can close the tags window.

I built it from source – these steps did the needful for me:

git clone https://github.com/jiixyj/loudness-scanner
cd loudness-scanner
git submodule init
git submodule update
mkdir build
cd build
cmake ..
make
sudo make install

Then launch the droplet with

~/projects/loudness-scanner/build/loudness-drop-gtk

Add Beats Per Minute Tags

Beats per minute calcs are mostly useful for DJ types, but I use them to easily sort music for different moods or for exercise.  The calculation seems a bit arbitrary for things like speech or classical, but for those genres where BPM is relevant, bpm-tools seems to yield results that make sense.

Install with

sudo apt-get install libsox-fmt-mp3 bpm-tag

Then write tags with (the -f option overwrites existing tags).

find . -name "*.mp3" -exec bpm-tag -f {} \;

Puddletag

Back in my Windows days, I really liked MP3Tag.  I  was really happy to find puddletag, an mp3tag inspired linux variant.  It’s great, does everything it should.  I wish I had something like this for image metadata editing: the spreadsheet format is very easy to parse.  One problem I had was the deunicode tool wasn’t decoding for me, so I wrote my own wee function to extend the functions.py by calling the unidecode function.  only puddlestuff/functions.py needs to be patched to add this useful decode feature.  UTF8 characters are well supported in tags, but not in all file structures and since the goal is compatibility, mapping them to fairly intelligible  ASCII characters is useful.

This works with the 2.1.1 version.
Below is a patch file to show the very few changes needed.

--- functions.py.bak    2022-04-14 13:58:47.937873000 +0300
+++ functions.py        2022-04-14 16:49:23.705786696 +0300
@@ -43,6 +43,7 @@
 from mutagen.mp3 import HeaderNotFoundError
 from collections import defaultdict
 from functools import partial
+from unidecode import unidecode
 
 import pyparsing
 
@@ -769,6 +770,10 @@
     cleaned_fn = unicodedata.normalize('NFKD', t_fn).encode('ASCII', 'ignore')
     return ''.join(chr(c) for c in cleaned_fn if chr(c) in VALID_FILENAME_CHARS)
 
+# hack by David Gessel
+def deunicode(text):
+    dutext = unidecode(text)
+    return (dutext)
 
 def remove_dupes(m_text, matchcase=False):
     """Remove duplicate values, "Remove Dupes: $0, Match Case $1"
@@ -1126,7 +1131,8 @@
     'update_from_tag': update_from_tag,
     "validate": validate,
     'to_ascii': to_ascii,
-    'to_num': to_num
+    'to_num': to_num,
+    'deunicode': deunicode
 }
 
 no_fields = [filenametotag, load_images, move, remove_except

I use the “standard” action to clean up file names with a few changes:

  • In “title” and “album” I replace ‘ – ‘ with ‘–‘
  • in all, I RegExp replace ‘(\s)’ with ‘ ‘  – all blank space with a regular space.
  • I replace all %13 characters with a space
  • I RegExp ‘(\s)+’ with ‘ ‘ – all blank runs with a single space
  • Trim all to remove leading and ending spaces.

My tag->filename function looks like this craziness which reduces the risk of filename misbehavior on most platforms:

~/$validate(%genre%,_,/\*?;”|: +<>=[])/$validate($deunicode(%artist%),_,/\*?;”|: +<>=[])/%year%--$left($validate($deunicode(%album%),_,/\*?;”|: +<>=[]),136)$if(%discnumber%, --D$num(%discnumber%,2),"")/$left($num(%track%,2)--$validate($deunicode(%title%),_,/\*?;”|: +<>=[]),132)

Puddletag is probably in your repository. To mod the code, I first installed from source per the puddletag instructions, but had to also add unidecode to my system with

pip install unidecode

Last File System Cleanups

The above steps should yield a clean file structure without leading or trailing spaces, indeed without any spaces at all, but in case it doesn’t the rename function can help.  I installed it with

sudo apt install rename

This is useful to, for example, normalize errant spelling of mp3 – for example Mp3 or MP3 or, I suppose, mP3.

find . -depth -exec rename 's/\.mp3$/.mp3/i' {} +
aside from parameters explained previously
's/A/B/'            substitute B for each instance of A
\.                  escaped "." because "." has special meaning
$                   match end of string - so .mp3files won't match, but files.mp3 does
i                   case insensitive match (.mp3 .MP3 .mP3 .Mp3 all match)

More details on rename.

The following commands clean up errant spaces before after and repeated:

find . -depth -exec rename 's/^ *//' {} +
find . -depth -exec rename 's/ *$//' {} +
find . -depth -exec rename 's/\s+/_/g' {} +

If moving files around results in empty directories (or empty files, which shouldn’t happen) then they can be cleaned with

find . -depth -type d -empty -print -delete
find . -depth -type f -empty -print -delete

Players

If workflow preferences are highly personal, player prefs seem even more so.  Mine are as follows:

For Local Playback on a PC: Quod Libet

I like to sort by genre, artist, year, and album and Quod Libet makes that as easy as in foobar2000 did back in the olde days when Windows was still an acceptable desktop OS.  Those days are long, long over and while I am still fond of the foobar2000 approach, Quod Libet doesn’t need Wine.

Alas, one shortcoming still is that Quod Libet does not support subsonic or ampache.  That’s too bad because I really like the UI/UX.

For Subsonic Streaming on a PC: Sublime Music

Not the text editor, the music app.  It is pretty good, more pretty than Quod Libet and in a way that doesn’t entirely appeal to me, but it seems to work fairly well with NextCloud and is the best solution I’ve found so far.  It tends to flow quite a few errors and I see an odd bug where album tile selection jumps around, but it seems to work and a local program linking back to a server is generally more performant than in browser, but that’s also an option (see below) or run foobar2000 in Wine, perhaps even as an (ugh!) snap.

In Browser: NextCloud Music

Nextcloud’s Music app is one of those that imposes a sorting model that doesn’t work for me – not at all foobar2000ish – and so I don’t really use it much, but there are times, working on site for example, that a browser window is easiest.  I find I often have to rebuild the music database after changes.  Foam or Ample might be more satisfying choices functionally and aesthetically and can connect to the backend provided by Music.

Mobile: Ultrasonic

Ultrasonic works pretty well for me and seems to connect fairly reliably to my NextCloud server even in low bandwidth situations (though, obviously, not fast enough to actually listen to anything, but it doesn’t barf.)  Power Ampache might be another choice still currently developed (but I haven’t tried it myself).  Subsonic also worked with NextCloud, but I like Ultrasonic better and it is still actively developed.

If you’re on iOS instead of Android (congratulations on the envy your overpriced corporate icon inspires in the less fortunate) you almost certainly stick exclusively with your tribal allegiance and have no need for media outside of iTunes/Apple TV approved content.

Tools:

Players:

Posted at 17:59:27 GMT-0700

Category: AudioHowToLinuxTechnology

Tagging MP3 Files with Puddletag on Linux Mint

Tuesday, March 23, 2021 

A “fun” part of organizing an MP3 collection is harmonizing the tags so the datas work consistently with whatever management schema you prefer.  My preference is management by the file system—genre/artist/year/album/tracks works for me—but consistent metainformation is required and often disharmonious.  Finding metaharmony is a chore I find less taxing with a well structured tag editor and to my mind the ur-meta-tag manager is  MP3TAG.

The problem is that only works with that dead-end spyware riddled failing legacyware called “Windows.” Fortunately, in Linux-land we have puddletag, a very solid clone of MP3TAG.  The issues is that the version in repositories is (as of this writing) 1.20 and I couldn’t find a PPA for the latest, 2.0.1.  But compiling from source is super easy and works in both Linux Mint 19 and Ubuntu 20.04 and version  2.20 on 22.04 which contains my mods to latinization of foreign scripts (yay open source!):

  1. Install pre-reqs to build (don’t worry, if they’re installed, they won’t be double installed)
  2. get the tarball of the source code
  3. expand it (into a reasonable directory, like ~/projects)
  4. switch into that directory
  5. run the python executable “puddletag” directly to verify it is working
  6. install it
  7. tell the desktop manager it’s there – and it should be in your window manager along with the rest of your applications.

The latest version as of this post was 2.0.1 from https://github.com/puddletag/puddletag

sudo apt install python3-pyqt5 python3-pyqt5.qtsvg python3-pyparsing python3-mutagen python3-acoustid libchromaprint-dev libchromaprint-tools libchromaprint1 
wget href="https://github.com/puddletag/puddletag/releases/download/2.0.1/puddletag-2.0.1.tar.gz 
tar -xvf puddletag-2.0.1.tar.gz
cd puddletag-2.0.1/ 
cd puddletag 
./puddletag 
sudo python3 setup.py install 
sudo desktop-file-install puddletag.desktop

A nice feature is the configuration directory is portable and takes your complete customization with you – it is an extremely customizable program so you can generally configure it as fits your mental model.  Just copy the entire puddletag directory located at ~/.configure/puddletag.

Posted at 15:19:01 GMT-0700

Category: AudioHowToLinuxPositiveReviews

Family Feud Basra Style

Saturday, December 13, 2014 

Gunfire is pretty common here, perhaps even more common than in Oakland though usually for the same reasons: celebrating holidays, sports victories, weddings, that sort of stuff.  It is kind of fun to listen to and watch tracers and stuff, but usually the villa is also celebrating in an obvious way; when you hear gunfire you also hear cheers, at least at night.

This evening the house was quiet, but the gunfire sure wasn’t.  The guys tell me it was a tribal feud in the neighborhood, quite close from the sound of it.  This is a low-fi recording from my phone.

Posted at 17:13:13 GMT-0700

Category: AudioPlacesTravel

Rental Cadillac DTS

Tuesday, June 22, 2010 
Wtf? Another Caddy? They drive OK, but what is up with the mid-90s vintage entertainment system? Analog in only? American cars always have really crappy music navigation interfaces, but even low-end cars with the janky microsoft sync interface at least can read off a 2GB FAT USB stick (no larger).

If you’re trying to compete with Mercedes an Infinity, you have to be able to read at least a FAT32 file system if not an ipod and usefully navigate folders and playlists.

 

Posted at 11:07:28 GMT-0700

Category: NegativephotoRental carsReviews

More on the UAL PODS

Sunday, February 22, 2009 

I haven’t tried the iPod interconnect yet, but I will; I need to put some video on the iPod first. I’m not sure why they decided to use a proprietary cable. That was kind of stupid, there’s a USB port in the pod. The proprietary cable takes analog video and audio, but how hard would it to be to build a local decoder for MP3/MP4 content into the pod? Or just build a dock like the table radios at modern Holiday Inn’s that have an iPod dock built in.

The TV system is pretty good. It has a lot of content on it, but the TV shows they have are limited by source (NBC) and while The Office is pretty good, they only have two episodes. Air Canada has a lot more content and a wider variety of sources.

One of the best things Air Canada does is sponsor Canadian film makers and then showcase their work on the in-flight system. UAL should do this too, though internationally. If I was in charge of the UAL in-flight system, I’d offer an annual prize for films: the rules being if you submit, it may be shown on UAL flights as long as UAL wants, maybe $20k for first, $10k for second, $5k for third… for $35k they’d have some entertaining content. Almost every little twiddle on the Air Canada student collection beats anything by NBC.

Another problem, and this drives me nuts everywhere, is that now that there are about 2 standard aspect ratios (4:3 and 16:9) nothing is ever shown in the right one. Everything I see is squished one way or the other. The UAL system does not letterbox, so WTF? Why not blackbar the source? Is it that hard? It’s all transcoded anyway, do the black bars at transcode – they don’t take any space up in the compressed output and it would always play right. No squished faces. It really took away from my enjoyment of the cinematic experience that should have been Max Payne.

I find the lack of temporary storage space in the pods a bit irritating. It sort of sucks to have to put everything in the overhead, especially on takeoff, and then wait until the seatbelt sign is off to get it back, especially as the in-flight system can’t be enabled until a safe altitude is reached as it apparently “interferes” with the nav system. Just like iPods do… of course if the RF leakage from an iPod interfered with the nav system, what on earth are planes doing flying into urban areas with their multi-kilowatt radio and tv transmitters littering the landscape and god forbid airports with the radar sweeping around so that cell phones get knocked off their towers.

But the lie flat seats are very comfortable. This is the first long flight I’ve been on where I got to enjoy them. I was on a 767 from ORD that had the new pods and they were cool, but 4 hours is hardly time to experiment with the new features. Now they’re in 747s and I gather the 777s will be the last to be converted.

Which reminds me, I listened to the wonderful News Quiz podcast on the way and the following were two wonderful gems of many from the recent show:

“You know how the temperature is adjusted for windchill? Surveys should be adjusted for stupidity: surveys say that 1 in 3 Britons think the world was created in the last 10,000 years, but adjusted for stupidity, nobody does.”

“Instructions for sperm donors: on arrival ask for Mr. Hancock.”

Posted at 16:00:31 GMT-0700

Category: PlanesPositiveReviews

Ford Mustang

Tuesday, July 22, 2008 

Rental car review: Ford Mustang

ford mustang.jpg

I got this car with plastic on the steering wheel, the back seat belts buckled, and 5 miles on the odometer.  I very much enjoy mustangs: they’re fast and throaty and fun to drive and equipped with loud and amusing stereos.

They are small in the trunk and the back seats are pretty useless – definitely not where you want to stuff an large, elderly coworker.  But the car is fun.  Fast and fun.

The engine has more show than go – the sound of the engine is one of big power and extreme performance.  While the car handles much better than most rental cars, it does not live up to the sound of the exhaust.  A nice Audi or Volvo, for example, will accelerate faster, harder, and longer and take turns better, but never call attention to themselves while doing it.

On the other hand, actually going really fast is not always relevant: having fun is more to the point and the mustang is fun.  It feels spry and agile and powerful and serves well to take years off the driver’s age.  It’s the prefect car to cruise suburban malls, especially if one dye’s one’s hair or wears a toupee.  If chicks aren’t the goal, then it certainly makes getting to work an exercise in regression therapy.

Aside from the throaty roar and sporty performance, road noise is poorly isolated but well compensated for by a loud, bass-heavy stereo typically equipped with a CD-MP3 changer that can hold 6 CDs (or maybe 60 albums) which means on older cars one can often find heavy metal compilations forgotten in the changer.  Not so much classical.

  • Quiet – Not very quiet.
  • Comfortable – fairly comfortable.
  • Engine – a great engine for a rental car, a lot of fun.
  • Suspension – very good for a rental car.
  • Basic amenities – everything that could be reasonably powered is.
  • Stereo – killer stereo: loud and plays MP3s off a 6 CD changer.
  • Security – small but secure trunk.
Posted at 15:00:26 GMT-0700

Category: photoRental carsReviews

Ford Taurus X Rental

Wednesday, May 21, 2008 

Rental car review

ford taurus x.jpg
This week i got a new Ford Taurus X, an interesting rental car. It’s an SUV type vehicle, oversized and overaccesorized, but a surprisingly pleasant vehicle that’s fairly easy to drive and comfortable.
Now the theory is that such a car would be good for off-road use or something since it has four wheel drive, but that’s really not happening. Better to think of it as a minivan with a nose and some extra weight in the drive train. Desipite the foolishness of SUVs in general, and especially given gas prices, the car had some neat features.
  • I used the backup sensor in a parking lot – a good thing as the car is long and has poor visibility out the back.
  • It has an outside temperature indicator which I like.
  • The seat moves all the way back when you take the key out, and then back to where it was for us old people.
  • The tailgate opens and closes itself, which is kind of absurd and overkill but fun in a gadgety way.
  • The engine is fairly powerful (Canadian rentals seem to be more powerful than US rentals – my .ca Grand Am would spin it’s wheels embarrassingly easily, whereas my .ca.us Grand Am in LA was kind of anemic).
  • It’s quiet and comfortable.
  • The rear seats fold into the floor of the car – just like a mini-van.
  • The stereo had an analog input and a 6 CD MP3 changer
  • It has Microsoft Sync – more on that below.

Read more…

Posted at 23:00:30 GMT-0700

Category: photoRental carsReviews

Rental Review Impala LT

Wednesday, May 7, 2008 

Rental car review. Impala 21:13:39 flex fuel with 37km on the odometer.

impala_lt_flex_fuel.jpg
The Chevy Impala is a fairly typical American car – actually a little more comfortable than the buick.
  1. Quiet – Not too bad. The interior is pretty soft so it’s fairly quiet, though very noisy on rough roads.
  2. Comfortable – Not bad, not as ass fondling as the Volvo
  3. Basic amenities – Power everything, but no outside temperature reading. I like knowing the outside temp.
  4. Stereo – basic and acceptable. This one had a little plug in port for a MP3 player.
  5. Security – the trunk is big and secure.
Posted at 22:00:31 GMT-0700

Category: photoRental carsReviews

Volvo v50 08 wagon

Wednesday, April 23, 2008 

Rental review

IMG00264.jpg
I rent a lot of cars, and sometimes Hertz gives me something a little more interesting – like this Volvo V50. It’s a lot more comfortable than the usual Tauri, faster, and has a better stereo. The key features of a rental car are:
  1. Quiet – this car is about as quiet as any I’ve rented except perhaps the Audi A4.
  2. Comfortable – the V50 is a little less roomy than a torus, but I find the layout fits very well and doesn’t feel at all cramped.
  3. Basic amenities – I’ve gotten rental cars with manual windows or manual seats and mirror adjustments. It would matter less in one’s own car or just driving around, but realizing the mirrors are out of wack as you try to merge onto the freeway that is probably taking you the right direction before the GPS has locked satellites and discovering that you have to reach over, unroll the window, and poke at the mirror is sub optimal. The Volvo has everything you’d expect.
  4. Stereo – up here in Canada I listen to CBC-R2. Good classical and some funky music too. It’s nice when it sounds good. The Volvo has a great stereo that performs well at any volume and isn’t absurdly bass heavy like a Scion. On the other hand, the Volvo doesn’t have an iPod port like the Audi or a MP3 compatible CD player like a lot of Mustangs have.
  5. Security – I usually have a computer with me and sometimes it is convenient or necessary to leave it in the car. A trunk is a lot more secure than a wagon, and while the Volvo has a pull-out cover to hide what’s in the back, it’s not as confidence inspiring as having a solid trunk.
Posted at 22:00:27 GMT-0700

Category: photoRental carsTravel