November 2021 update: I’ve added a link to my open sourced Conrail Engine VSD pack.

Virtual Sound Decoders bring sound cheaply and easily to N scale models. In this article, I’ll get started talking about my discoveries around them.

The other day I was thinking about sound on N scale model railroads. When it comes to getting good sound out of N models, the limits of physics mean that you can only do so much. That got me started thinking about using static sound decoders, installed under the layout, and powering larger speakers. I know a number of people have tried and done this, but it seemed like a waste of relatively expensive decoders on something that a computer should be able to do.

Then I started thinking about how I would make something like that. I figured I’d be able to build it into JMRI. It’d need a listener to listen for commands for specific addresses, it’d need a mapping utility to map sounds to commands, and it’d need some way to store and deal with the information. So I started Googling. Lo and behold, someone had already thought of it!

It turns out JMRI has it built in already, calling it Virtual Sound Decoders. It’s right there, under the debug menu!

I did some digging, and it turns out that Virtual Sound Decoders are exactly what I was looking to do. The only thing missing were good sounds for my fleet. There’s a demo VSD file (the format that are used for the sound files), and it has some basics, but it wasn’t up to what I wanted.

Luckily, implementing technologies like VSD is exactly what I do for a living, so I figured I’d be able to make my own sound files soon enough. A little more googling, and there was the answer: vsd files are just renamed zip files. Inside those zip files are the sound files (as plain old .wav files) and a config XML file that maps decoder functions to the files.

Playing with those files, and some sounds I got my hands on (I’m not revealing where yet, but hopefully more on a very useful resource shortly), I was able to relatively quickly put together a few of the decoder versions I could use:

  • A GP7 with a single chime “honker” horn.
  • A GP10 with a three chime Leslie RS-3L horn.
  • A GP38 with the Leslie horn.

You can see some examples of it in action here.


Note, the sound in the videos is not overlaid. It’s coming from the speakers I had plugged into my laptop that was connected (via a Digitrax PR3) to my DCC system.

It’s not perfect yet, and it’s not perfect for all situations, but I’m very excited about the promise of this technology.

VSDs work following the rather simple idea I had: pretending to be a sound decoder. To use them, you fire up JMRI, open DecoderPro, choose Debug =>”VSDecoder Manager”, and then “Add Decoder”. You can then enter the number of the decoder you want the VSD to respond as (or choose one from your saved roster), and then choose the VSD file you want to use with the “Load VSD File” button and the dropdown that will be populated with sound profiles once you do.

JMRI comes with a sample VSD, which is enough to get used to it. I plan on making my custom one available shortly, but until then, the sample one will make it possible to get used to them.

Hit the “Engine Start” button to start up the prime mover, and the other buttons to perform other functions (like horns and bells).

Now, once you’ve got the VSD running, select the locomotive ¬†with your DCC throttle, and the sound will be synced to the throttle commands (acceleration and deceleration, and the function buttons for things like horns and bells).

November 2021 Update: Because this post seems to receive some traction, I wanted to share the VSD file I created. Here’s a link to it in Github.