What

I’ve implemented an audio sync track generator using the 1 PPS from a GPS receiver. Below you can see the UTC pulse recorded onto the sync track (a very narrow spike around sample #63000, flush on the rising edge of the red square plot):

photo

Here, a zoomed in section around a complete binary word. At each seconds the Universal Time Coordinated is BFSK modulated, 34 bits for the firmware version + UTC SS:MM:HH:DD:mm:YY (note the syncing spike right at the left):

photo

In post, the TicTacCode (TTC) is parsed by a program named tictacsync, merging sound clips with their corresponding video tracks (thanks to FFmpeg) and this, before importing into your NLE of choice.

Pros:

  • microseconds precision (audio tests show syncing is within 0.083 ms, that’s 0.003 frame!)
  • no jam sync required
  • no settings, plug’n shoot: it is frame rate agnostic (DF, NDF? meh)
  • so it works with high speed framerates (60, 120 …), those are not supported by SMPTE LTC
  • no drift: the second is defined from the Cs atomic clocks inside GPS sats
  • low cost (20-50 USD per device)
  • more resilient than NLE waveform analysis (that lags anyway for delta distances greater than 5 meters: 15 ms)
  • it’s FLOSS

Cons:

  • one guy in his basement project (hopefully not for long)
  • As of April 2025, this product doesn’t exist, but you can assemble it now (yes, it was in the Pros list). Preflashed kits sale are available on Tindie.
  • geared toward DIYers: some soldering required
  • no software installer for now, needs installation of:
  • CLI only, for now
  • new format (it’s a feature, not a bug)
  • adequate GPS signal strength needed; not a problem for most residential buildings. I successfully tested this GNSS signal extender in a steel roofed commercial building.
  • sloppy code (but I’m working on it)

Project status

Feature complete. Progressing lentement mais sûrement: I’m doing this in my spare time: first ideas in 2016; switched on the soldering iron November 2020 (thanks to covid). Tried in 2023 to reach out some communities on the net without any luck (see this thread on jwsoundgroup). I should hone my communication skills… :-)

For now it is at an alpha stage, it needs real world testing in production settings: I plan to distribute prototypes to people willing to test software+hardware.

All three hard/soft components have been implemented and tested:

  • Two kinds of hardware dongle:
    • LINE IN and MIC IN analog type, based on SAMD21 and its DAC output.
    • for videographers using cell phones, USB-C external MIC type with a Teensy 4.0
  • Their corresponding firmware variations.
  • Post-production decoding desktop software (tictacsync python CLI)

Multicam

With a TicTacSync on each camera (even drones with USB-C input), multicam syncing is a breeze: I have successfully tweaked both the tictacsync produced file structure and Davinci Resolve settings to ingest clips and out of the box generate synced multicam clips. Here are the details: via the Project Settings panel, reel names are set to folder names on import:

photo

Multicam clips are then regrouped by reel name and ordered using the clip metadata timecode (inserted by tictacsync):

photo

Open in Timeline… and Boom, synced:

photo Note: multicam clusters coalescing is also done by the software (regardless when the clips were shot) so they are successively placed near to each other on your timeline.

How to build

Here’s the wiring between the Adafruit boards: photoThis outputs a +3.3 dBu signal with a 1.6V DC component filtered out by the line input of my H4n PRO (maybe a little too hot: there’s bleeding between channels ).

Who

I’m Raymond Lutz, a retired physics teacher (college level, in Québec) planning to produce some educational videos and I wanted a cheap way to sync audio and video, hence TicTacSync. But honestly, I kind of feel like an imposter: I’m no programmer and would like someone more skillful to maintain and build this thing. The unique computing course I ever had is 4 decades ago (FORTRAN!) in my first year of engineering studies (before dropping out). See for yourself my non-existent IT skills:

Before this project I had never
  • wrote a python script using arguments;
  • wrote a module with submodules (mine are still improperly imported);
  • uploaded a PyPI project;
  • used git (other than cloning repos)
  • wrote an Arduino sketch;
  • commented properly my code;
  • used logging instead of commented print’s;
  • defined a python class (or maybe one, decades ago fiddling with PyObjC);

and I’m still conflating python scopes with python namespaces.

Yet… I’ve made this : TicTacSync. And it works.