Screenshot of Tempest in a Java Pot

About Tempest in a Java Pot

Demonstration video of Tempest in a Java Pot.
Tempest in a Java Pot (yes, it's a pun of "Tempest in a teapot") is a small, open source, Java application I made to test out how well computer monitors can work as radio transmitters after I read about Tempest online. The monitor is used as a transmitter by displaying specially constructed images like the one shown above on the monitor with the intent of generating a desired radio wave from the electromagnetic emanations leaking out of the monitor. The video to the right shows Tempest in a Java Pot in action. Although this program does work for causing my AM radio to play audio from the monitor, after some additional experimentation it appears that the AM radio is primarily picking up the audio waveform (which is what creates the horizontal lines in the transmission images as seen above) from the transmission images, not the AM waveform (which creates the diagonal lines shown in the above image). This can be demonstrated when running Tempest in a Java Pot by setting the "Algorithm to use for generating transmission frame" option to "Audio waveform" which causes the AM carrier wave to be removed from the transmission frames.

Tempest in a Java Pot should work on most MacOS X, Windows, Linux, and Solaris computers which have a Java 7 or newer runtime installed. You can get the Java runtime for free from https://www.java.com/ if you need it. In order to run without any stuttering the system needs to have OpenGL acceleration working well and a sufficiently fast processor. The processor speed needed to run without stuttering can vary greatly depending on what resolution and refresh rate is being used but any processor running at over 1 GHz should be able to run at at least 640 x 480 @ 60 Hz sufficiently. A 2.4 GHz Core 2 Duo runs well at 1024 x 768 @ 60 Hz. You will probably need one of the old, bulky CRT monitors in order to generate a signal that can be picked up by a radio, but some LCD monitors may work too. Tempest in a Java Pot should be able to play most MP3s and most 16 bit, stereo WAV or AIFF files. Some other less common file types may work as well and you can also possibly install additional Service Provider Interfaces (SPI) to add support for more file formats. Also it should be possible to support mono or 8 bit WAV or AIFF files with some tweaks to the code if anyone is interested.

If you have any questions or comments, feel free to contact me.

How to Use

Once you have downloaded the "Tempest in a Java Pot v0.5.jar" file you should be able to run it on most properly configured operating systems by double clicking the "Tempest in a Java Pot v0.5.jar" file. Alternatively from a command line you can run:

java -jar "Tempest in a Java Pot v0.5.jar"

Once you get Tempest in a Java Pot running you will be greeted with a settings dialog like the one shown.
Screenshot of Tempest in a Java Pot settings dialog box
Setting dialog box for Tempest in a Java Pot.

From the settings dialog either enter the path to a supported audio file type (MP3s or 16 bit, stereo WAV or AIFF files) in the "Audio file path" text field or click the "Browse..." button to select one. Once a valid audio file is entered you may then either click the "Run in Window" or "Run Full Screen" button to play and transmit the audio file using the default settings. Note that running full screen will generate a better signal for a radio to pick up since more of the screen can then be used for generating the image/signal. The other settings are explained below:
AM frequency to transmit on
This is used to select the AM frequency in kHz which should be used when generating the transmission image. Note that after some further experimentation this setting seems to have little effect on how well an AM radio will pick up the audio signal, see the About Tempest in a Java Pot section above for more about this.
Audio transmission amplification
This is used to amplify or quiet the audio that is used to generate the transmission frame by specifying how loud the audio should be as a percentage of its normal value. Setting this to values over 100% can increase the distance over which the audio signal can be picked up but can also cause clipping to occur.
Algorithm to use for generating transmission frame
Selects which algorithm is used for generating the transmission frames. The "Sine wave AM carrier x Audio waveform plus Offset" option should generate the most correct AM signal but in practice the "Audio waveform" algorithm seems to work best for causing an AM radio to pick up the audio signal, see the About Tempest in a Java Pot section above for more about this.
Resolution and refresh rate to use
Selects what resolution and refresh rate should be used when displaying the transmission frames. Higher resolutions and refresh rates will require greater processor usage which may result in stuttering. Lower resolutions and refresh rates also generally will result in slightly better audio quality because they typically result in the horizontal blanking interval on the monitor being relatively shorter than the interval in which the screen is being drawn.

While transmitting/playing an audio file you can also use the following keys to perform the following actions:
Escape and Q Keys
Stop transmitting/playing the audio file and return to the settings dialog box.
Left and Right Arrow Keys
Change the AM frequency to transmit on.
Up and Down Arrow Keys
Change the audio transmission amplification.
< > , and . Keys
Change the algorithm to use for generating transmission frames.
T Key
Toggle between transmitting/playing a tone or the audio file.
1 2 3 4 5 6 7 8 9 and (1)0 Keys
When transmitting/playing a tone, set the tone frequency to the value of the key x 100 Hz.

More Information

License

Tempest in a Java Pot is licensed under the Simplified BSD license but also includes binaries from the JOGL and MP3SPI projects. JOGL is licensed under various BSD like licenses and MP3SPI is licensed under the LGPL. See the LICENSE.txt file included with the source code for more information.