Here you can sync your radio-controlled watch or clock. For free.
Welcome to Fukushima. Well, kinda…
What is that high-frequency noise in the background?
This is JJY time signal being transmitted through your speakers at its third harmonic (because 40 KHz is impossible to emit directly). Just plug in the headphones, make sure the clock on your device is in sync, load this page and start reception on the watch. Place the watch near the speakers/headphones and you should be good.
The page is called Fukushima because the station that transmits original JJY signal at 40 KHz frequency is located there.
Why would I need this?
This was mostly made for fun and experimental purposes but if you don't want to manually sync your watch for some reason and are living too far away from any longwave time transmitters, this might really come in handy.
How do I actually start the reception?
Well, refer to the manual of your watch. On most watches, you'll have to change your home city to Tokyo. However, on most Casio Waveceptor/G-Shock branded watches you just need to enter the (undocumented) reception test menu (press Mode+Light+Receive simultaneously), select "J 40" reception mode with lower right button and start it with the upper right button. This way you don't need to fiddle around with your home timezone and will still get the emulated signal.
Wouldn't this mess up my local time?
As long as the time on your device/browser is set correctly (and synced recently - via NTP, for example), it shouldn't. Moreover, this particular page (as well as its underlying library) was created just because all existing solutions of JJY emulation do mess up your local time if your device timezone isn't Japanese. In contrast to them, regardless which timezone you're in, this service always transcodes local time into the correct Japanese time and transmits it accordingly.
What are the dependencies?
This service is completely client-side and relies on the JJY.js library. Of course, Web Audio API support is required and Performance API support is highly recommended (for more or less precise clocking). Major modern desktop and smartphone browsers support both APIs so you don't have to worry about it. Moreover, entire library is implemented in ECMAScript 5 standard so you also don't have to worry about ES6 support either.
I see that you're emitting sine waves. How is this ever expected to work? And why don't you use built-in sine (square, triangle etc) oscillator?
TL;DR: this is not a pure sine wave. Pure sine (square, triangle etc) doesn't work. This is an artificially emulated waveform similar to the 16-bit signed PCM sine wave which was used in original Japanese simulator apps long ago.
In fact, these are very good questions that don't have simple answers. This may seem to contradict any known laws of physics but here are your facts. Original JJY simulator apps (for Windows, Android and iOS) were all aimed at 16-bit signed PCM output. Their radio emission principle was based on this research (originally in Japanese). In short, all these apps were modulating the signal in an assumption that overdriven sine wave distortion would create enough power for its 3rd harmonic to be clearly transmitted via sound hardware. Web Audio API, however, operates solely on 32-bit float output, allowing us to build waveforms pure enough for any general-purpose usage. And it turned out that overdriven pure float sine simply does not produce the desired distortion effect. Same goes for either normal or overdriven square: the power of its 3rd harmonic is just not enough to be clearly received by Casio watches. So the conclusion was shocking: it's the imperfection of the sine wave that actually causes necessary signal distortion when ramping up the gain! Since Japanese researchers didn't seem to have any other output options at the time, they might easily miss this fact.
Nevertheless, the simplest option as of now was to emulate the original 16-bit signed PCM signal from float sine values by multiplying them by 32767, flooring and dividing back by 32767. All of a sudden, it started working after this. Finding even more optimal distortion level (substitution of 32767 by something else, e.g. 19683 was found to be even better when using an external USB speaker) is an entirely new field of research (since we're not limited with integer "bitness" these days and are operating on float range) but for now the quantization level of ⅓ of the AudioContext sampling rate was chosen. I.e. if your Web Audio API context sampling rate is 44100, the distorter parameter value will be equal to 14700.
However, if you're brave enough to read down to here, here's my reward for you. Recent JJY.js version exposes distorter parameter, and you can experiment with it yourself. Just append #number to this page URL. Example with 19683. Feel free to find the distorter parameter that syncs your watch the fastest. Distorter value must be an integer or float greater than or equal to 2. If the constraint fails, the default of ⅓ of the sampling rate applies.
Is there any offline app for any platform utilizing your findings?
Nope, and there are no plans to make one. However, there are some plans to make more "app-like" version of this page that would not allow any experimental customizations but would include highly-optimized code and leverage HTML5 offilne application cache. So when you visit that version once in non-incognito mode, you'll be able to return to it even when you're offline. Stay tuned!
Why isn't my watch/clock picking up the signal, regardless how I place it or what speakers/headphones I use?
It's not recommended to switch tabs while syncing because it can and will affect the precision timer code. Unfortunately, browser runtimes are very far from realtime systems. So, while all possible effort is made to emit the signal precisely each second (calculating setTimeout deltas, signal prebuffering etc), user's help is still needed to maintain this precision. Which is, in this case, as simple as keeping this tab open.
But if you're constantly here and are sure that all the reception is set up correctly but are not getting even stable L2 signal, then you're probably looking at the "beta" version of the service right now. This page is usually reuploaded whenever a new JJY.js version is tested. But if you found that this page is not capable of emitting sufficient sound whereas underlying library (JJY.js) is, feel free to contact the author on GitHub.
Are there any plans of making JJY60/WWVB/MSF/DCF77 emulators?
Let's break it down this way:
JJY60 — definitely no. All JJY-enabled watches support both JJY40 and JJY60, so I see no need in duplicating the effort by finding a different modulation method.
DCF77 — I really wish I could but most probably no. 77.5 KHz signal cannot be easily emulated under 2nd or 3rd harmonics within audible range.
MSF — yes, that's probably the best candidate which could be worked on next. It's as relevant for me as DCF77 but is much more realistic to implement because of 60 KHz transmission. It also has a more straightforward-encodable timecode information. It's going to be fun and more practical since all Casio watches capable of DCF77 are also capable of MSF reception for the same set of time zones.
WWVB — probably yes but only after MSF emulator is complete. By the way, its timecode is very similar to JJY.