Horn decoding tutorial
Decoding horns was a large piece of the current phase of the OTP22 ARG. While many people took part in the ARG thus far, only a few assisted in decoding the horns or even understand how they are decoded at all. I am writing this guide to fix that, so everyone participating in the game at least understands how the horns were decoded and where we are getting the messages that have played an integral part in the progession of this ARG.
To start, let's explain what the horns are. They are what sound like random noises (or "horns") that were played when calling many of the numbers involved in this ARG. The horn sound contain data that can be decoded to produce a message. I am going to explain the steps to go from a sound file, to a fully decode message. In this example, I am going to walk you through decoding the first part of the "Poland" horn, but the same process will work for any of the current horns.
Here is a list of the software you will need during the decoding process.
From Sound File to Spectrogram
- The first step is to grab your sound file. I would recommend pulling it directly from the OTP22 Auto-Dialer to ensure you get a clean, consistent sound source.
- Open Sonic Visualiser and go to File-> Open and select the WAV file recording of the horn you wish to decode.
- Now we are going to add a spectrogram layer by going to Layer->Add Spectrogram.
- Now we need to adjust the setting for the Spectrogram Layer. Change the Colour to Black on White. Change the Scale to Linear. Change the Window size to 2048 and overlap to 93.75%(or closest value). Set bins to All Bins and frequency scale to Linear. Your resulting settings should look like this:
- Now we need to export our spectrogram to an image file. Go to File->Export Image File. Save the file as a PNG somewhere on your computer. Ensure that you select "Export the whole pane" when prompted.
- You should now have a spectrogram image file that looks something like this (but a lot bigger):
From Spectrogram to Lengths
Now that we have our spectrogram, we can start decoding data present in it to find our "lengths".
- Open the spectrogram file we just created in Photoshop or Gimp. The file is going to be pretty zoomed out, so you will want to increase the zoom to at least 150% to make it easier to work with the file.
- We will be focuing on the very bottom of the image, so scroll down to the bottom. We need to locate where the actual data starts first and get rid of the preamble and other extrenaous noise. I have hilighted the preamble in the photo below. Directly to the right of the preamble starts our data.
- Now we are going to start marking the data. In the image above, you will notice the alternating dark and light bars. That is our data! We need to find out the width of one bar of each color. The easiest way I have found to do this, is to simply draw a rectangle over one of them and copy it across to "measure" how many bars make up each section. So, let's start with the white. The first "bar" is only one, so we can use that for our measurements. Copy that measurement rectangle all the way across the spectrogram to the end of the data. Just alternate the rectangles up and down a few pixels each time so you can easily identify them. Now do the same thing with a different color for the black areas. Your spectrogram should now look something like this:
- Now, to get our lengths, we simply count across the bottom the number of each color block grouped together.
- We come up with our lengths of: 112141321124521241122222115311112
From Lengths to Binary
Now we need to convert the lengths we just found into binary.
- First, we need to determine if the first character is a 0 or a 1. This is basically a guess so lets start with 1. We can just flip the bits later to try a starting bit of 0 if necessary.
- Each length tells us how many characters we are going to add to our binary. If the length is 1, we are adding 1 character. Length of 2 we add 2 and so on.
- The actual character we add to our binary is going to be alternating between 0 and 1, starting with the start bit of 1 we decided on earlier.
- So the first length is 1. We add 1 character, and our first character is the number 1. Binary So Far: 1
- The second length is also a 1. We add 1 character, and alternate to 0. Binary So Far: 10
- Now we have a 2 as our next length. We add two characters, and alternate back to 1. Binary So Far: 1011
- Keeping doing this until you reach the final length and you will come up with a final Binary of: 10110111101110010110000111110010011110100110011001011111000101011
From Binary to Our Secret Message
Now we have reached the final step. The binary we have is encoded with ITA2, so we need to decode it to reveal our message.
- Let's bring up the table of ITA2 encoding on Wikipedia.
- Take the binary we found in the previous step and break it into groups of five.
- Each horn message has been left MSB on the decoding table thus far, so assume that is the case, but keep in mind you might need to try right MSB in the future.
- Match each group of five characters from our binary up with its value in the ITA2 table.
- That leaves us with: PVMPAMWGNBKZJ
- Well, that doesn't seem to mean anything. Remember when we chose 1 as our starting bit before? Well, lets flip the starting bit to 0. All of our 0's become 1's and 1's become 0's. Now we have a binary of: 01001000010001101001111000001101100001011001100110100000111010100
- Match that up with the ITA2 table and we get: DEADMANSWITCH
- That's It! Our message has been found! Report back to chat with hidden gems of PM goodness.
The text above walks you through every step so you understand what the process is and how you are getting your end result. That being said, several people have created autmated scripts to take you from length right to decoded message. These scripts automatically find the binary and match it up with the ITA2 table. You can also easily flip the bits by selecting the proper options.
Special thanks to Rahm for figuring out the process to decode these message and nfx for all the work he put into looking for the solution.