Table of Contents

LTC timecode as sync source

This application note describes a method to receive analog timecode from an external source. For simplicity we use a USB analog soundcard that we plug in to the blocks server. Such audio interface should be "class compliant" USB-A, that means to special driver is required for the device to operate basic functionality properly.

We refer to the analog input on the Blocks server in the article, the application can run on any linux computer, so if your source signal is elsewhere it may make sense to pickup the sync signal with another computer running the LTC_timecode reader software. One way of doing that is to use the blocks server image to create the computer. Disable the blocks service and then follow the instructions in this application not to make this into a LTC timecode reader device.

There are other alternative that sometimes may be more suitable, such as the one shown here: https://www.youtube.com/watch?v=VY9kEkZim_k made by joananton@joananton.com. This reciever will produce serial data from the LTC timecode and can be connected to any Blocks spot with the same driver used in this article.

Setup the timecode reader software

Plug in the USB audio device to the blocks server. Use a second computer to play some sample LTC timecode, just for testing purposes. We play the sample audio from a Windows laptops mediaplayer. Plug an 3.5mm audio cable between the computers audio output with the line in/mic input of the analog audio card of the Blocks server.

Find out the ALSA name of the sound device

To capture the desired device we must figure out the ALSA name of the usb-device. To do so we open the terminal as the pixi-server user and type:

arecord -L

Look for an entry like:

plughw:CARD=Device,DEV=0
    USB PnP Sound Device, USB Audio
    Hardware device with all software conversions

The ALSA name is

plughw:CARD=Device,DEV=0

If you have more than one USB audio device one can expect the next one to be named:

plughw:CARD=Device_1,DEV=0

and so on.

Echo test

To test if we get any signal one can now plug in headphones in the USB card output and make an Echo test:

arecord -D plughw:CARD=Device,DEV=0 -f cd | aplay

You should hear the incoming timecode in the headphones. Stop the echo test by hitting ctrl+c.

Test run the LTC reader software

Now we can dryrun also the LTC reader software by making it log the time using the -t parameter. Change to the directory where the software is stored, on a Blocks server image is is stored in home/blocks/native/

cd native

Run the program using the -d parameter to specify device and -t parameter to run in test mode.

./timecode-reader -d plughw:CARD=Device,DEV=0 -t

We should see the time changing as the time source progress in the console output:

New settings: i/2000/t/25/p/1633/n/1/c/0/w/150/f/2
01:57.11 signal, dbFS: -0.6

In test mode we may also see some error logging while reading the signal.

Non contiguos 92925 with lastAccepted 92929
Minor error ignored. 92926 contiguous with lastReceived 92925

Use the timecode in Blocks

There are a few steps to do before we can make use of the incoming analog timesource in blocks.

Enable the driver

The driver to handle the timedata from the LTC-reader software is not enabled by default. To enable the driver you must make sure the driver files exist in the script/driver directory in the PIXILAB-Blocks-root. The TimecodeLTC driver is stored in the script/driver-archive/ directory and needs to be enabled:

Change to the script directory:

 cd /home/blocks/PIXILAB-Blocks-root/script 

Move the driver files to the drive directory:

 mv /driver-archive/TimecodeLTC.ts /driver-archive/TimecodeLTC.ts driver/

Restart the blocks server:

systemctl --user restart blocks.service

The driver is now available to use on network devices.

Setup the network device in blocks

Under the page Manage/Network we set up a new device and assign the TimecodeLTC driver. The port is predefined in the driver to match the default configuration to the Timecode reader on the server.

Configure the driver

You must configure the driver with the expected timecode type. The driver will fporward this information to the timecode reader program . This can be done with one of the following methods:

A. Set the 'type' property of this Network Device to the expected type. This can be done using a Task triggered on system start-up or the 'connected' appears on the network).

B. Set options using JSON data in the "Custom Options" field of the Network Device, like this: {"type": "29.97_drop", "offset": 0.0} Supported type values: "24","25","29.97_drop","29.97_nondrop","30".

Connect a Blocks timeline to sync with timecode

Create a timeline block, it can be left empty for testing purposes. Set the timeline to use External synchronization in the timeline settings. Select your LTCTimecode device as sync source property.

Apply any time offset as required. This timeline is now controlled by the timecode.

Make the Timecode reader autostart

To make the timecode reader autostart we must perform a few more steps. On a blocks server we have prepared whats called a unit file used by systemd in most linux distros to manage running programs and services.

Change to the users unit files directory:

cd /home/pixi-server/.config/systemd/user

Edit the timecode-reader.service.config file.

nano timecode-reader.service.config

Edit the TIMECODE_READER_OPTIONS= line to make the software use the wanted device name. In my case I set it to:

TIMECODE_READER_OPTIONS=-d plughw:CARD=Device,DEV=0

Next step is to enable the service at computer startup.

systemctl --user enable --now timecode-reader.service

Make multiple Timecode readers autostart

:!: IMPORTANT: To use multiple timecode readers on the same computer, make sure you're running version 1.4 or later of the timecode-reader program. You can see the version number by the following command on the command line, while logged in as the pixi-server user. If your version is older than 1.4, download version 1.4 here, unpack the ZIP and replace the timecode-reader file in the native subdirectory of the home directory.

~/native/timecode-reader -h

To read more than one LTC timecode source you could duplicate and modify the unit file, thus creating a separate unit file for this purpose. However, a better solution is to modify the unit file to a unit template, as this keeps all the common stuff in one place. Follow this procudure to use that option.

1. Rename the unit file like this:

mv timecode-reader.service timecode-reader@.service

2. Edit the unit template.

nano timecode-reader@.service

Using this configuration:

[unit]
Description=LTC Timecode Reader (%i)

[Service]
EnvironmentFile=%h/.config/systemd/user/timecode-reader.%i.config
ExecStart=%h/native/timecode-reader $TIMECODE_READER_OPTIONS
TimeoutStopSec=20
Restart=on-failure
RestartSec=10

[Install]
WantedBy=default.target

3. Rename the unit's configuration file:

mv timecode-reader.service.config timecode-reader.alpha.config

4. Make a copy of that configuration file with a new name:

cp timecode-reader.alpha.config timecode-reader.beta.config

5. Edit the config files, specifying different audio interfaces and different network ports in each instance.

nano timecode-reader.beta.config

The configuraition file will look something like this (but with your device name and desired port number)

# Options to pass to the timecode-reader program, e.g.,
# TIMECODE_READER_OPTIONS=-d "Alsa device name" -p "UDP port"
TIMECODE_READER_OPTIONS=-d plughw:CARD=Device_1,DEV=0 -p 1638

6. Notify systemd of your changes:

systemctl --user daemon-reload 

7. Finally, enable and start the two instances

systemctl --user enable --now timecode-reader@alpha.service
systemctl --user enable --now timecode-reader@beta.service