Stamp the start into the files. Insert at Timecode in the editor.
If you have multitrack recordings and an LTC track alongside them, TCFrameLock sets the Broadcast Wave start point from that LTC on every audio track. In your movie editor, Insert at Timecode or Spot reads that start and places the clips on the timeline. The audio is copied, not re-encoded.
You recorded several tracks, and one of them is Linear Timecode. You want those files on a movie timeline at the same place the camera was. TCFrameLock reads the LTC and writes that start into every audio track as Broadcast Wave. In the editor you Insert at Timecode so the new files start on the right frame.
Your audio tracks plus the LTC. WAV or AIFF, or a whole folder. The app looks for the timecode track so you do not have to label it.
That track is the clock that ran while you recorded. The app uses it to find one start timecode for the whole session. That start is the beginning of the files, so every track shares it.
Each track comes back as a Broadcast WAV with that start already set. In the movie editor, Insert at Timecode or Spot reads that start and places the clip on the timeline. That is how they land on the right frame.
This is the actual pipeline in the app: decode, rewind to sample 0, convert SMPTE to a sample count, then write Broadcast Wave metadata. The numbers below are a real worked example at 48 kHz / 24 fps.
Drop WAV or AIFF. The app probes sample rate, channel count, and length, then streams the first 60 seconds of every channel looking for LTC. Music can fake a sync word; a dedicated TC track is the usual source.
LTC is Manchester biphase in the audio. The decoder is created with audio samples per video frame = round(sampleRate / nominalFPS). Isolated sync-word hits in music are ignored. Lock requires eight consecutive frames whose frame-count-since-midnight increases by exactly 1.
sampleOffset is libltc’s frame.off_start, the sample in the file where that decoded frame begins.
If the picker does not match the signal (23.976 vs 24, NDF vs DF), the app warns and offers the suggested rate. It does not silently switch.
Recordings rarely start exactly on the first decoded frame. TCFrameLock walks the clock backward so the stamped address is “what SMPTE said when sample 0 was recorded.”
Drop-frame uses SMPTE 30-family counting (drop 2 frames every minute except every 10th). A manual HH:MM:SS:FF override skips decode and uses your typed address instead.
Time Reference is a 64-bit unsigned integer at byte 338 of the bext chunk. Each mix file is stamped at that file’s sample rate, so two mixes at different rates still share the same start timecode.
24 fps · DECODED · sample 0
Units: PCM samples since 00:00:00:00 at the output file’s sample rate. Same SMPTE start, different integer if a mix is 96 kHz instead of 48 kHz.
The writer streams a temp WAV, places bext immediately after fmt (EBU ordering), copies the data chunk in 1 MB buffers, atomically renames, then re-reads Time Reference. RF64 / files over 4 GB are refused. Source files are never overwritten.
WAVE container. Size rewritten after the new bext is inserted.
Original format chunk. Linear PCM only. Copied as-is.
Originator TCFrameLock. timeReference 172772000 at offset 338. Existing bext fields are preserved if the file already had one.
PCM copied verbatim. No resample, no dither, no transcode. That is the mix you already printed.
Output name: Mix_L_TC_143022.wav. If that name is taken, the app adds -2, -3, and so on. Reveal in Finder when the run finishes.
Multitrack files plus the LTC that was recorded with them. Drop the files or a folder.
That track is the clock that ran with the recording. The app uses it to find one start timecode for the whole session, then that same start is what gets written onto every audio track.
Each track gets a new Broadcast WAV with that start written in. Same audio. The LTC file is not rewritten.
Bring the new files into your movie editor. Insert at Timecode or Spot puts each clip on the timeline at the right frame.
| Platform | macOS 14 or later, sandboxed native SwiftUI app |
|---|---|
| Inputs | WAV (RIFF) and AIFF / AIF, linear PCM |
| Outputs | Broadcast WAV with bext; filename *_TC_HHmmss.wav |
| Frame rates | 23.976 NDF, 24, 25, 29.97 NDF, 29.97 DF, 30 |
| Time Reference | EBU Tech 3285, UInt64 little-endian at bext offset 338 |
| Originator | TCFrameLock, plus stamp date/time when creating a new bext |
| Not supported | RF64, compressed audio, files that would exceed the 4 GB RIFF limit |
| Network | None. Files never leave the Mac. |
Native WAV PCM is streamed through unchanged. You are adding or relocating metadata, not printing a new mix.
The decoded track is the source of truth for the session start. It is not written. Only the audio tracks are stamped.
Channel decode and BWF writes are chunked. Multi-gigabyte mixes do not get loaded twice into memory.
The output is opened again and Time Reference is read back. A mismatch is a failed file, not a silent bad stamp.
nominalFPS is the true rate (24000/1001, 30000/1001). Display digits stay 24 or 30. The two are not confused.
No account, no upload, no analytics in the app. Processing is a file in, a file out, on your disk.
Pay once for a personal or studio license. Questions go to the email below.
Product questions, license questions, and anything the app points you to this site for.
When you pay, you get a license to use TCFrameLock on Macs you own or control, for personal or studio work. You may not copy, share, or resell the app. TCFrameLock itself stays proprietary; you may replace the bundled libltc under its LGPL terms. Publisher: Stackcommander LLC.
If something is wrong with the purchase or the download, email support@stackcommander.com. Our order process is conducted by our online reseller Paddle.com. Paddle.com is the Merchant of Record for all our orders. Paddle provides all customer service inquiries and handles returns. Full page: refund policy.
The app does not upload files or analytics. Processing is on your Mac. Privacy policy.
macOS 14 or later.
TCFrameLock uses libltc (LGPL). Licenses and source are in TCFrameLock → About TCFrameLock.
If you have multitrack recordings and an LTC track recorded with them, TCFrameLock sets the Broadcast Wave start on every audio track from that LTC. In your movie editor, Insert at Timecode or Spot reads that start and places the clips on the timeline. The audio itself is not re-encoded.
In the EBU bext chunk, Time Reference is a 64-bit integer: PCM samples since midnight (00:00:00:00) at the file’s sample rate. NLEs use it to place sample 0 on a known SMPTE address. The app does not write a human-readable HH:MM:SS:FF string as the alignment value. It writes the sample count those systems expect.
No. A native WAV is stamped by injecting or updating bext and copying the data chunk. AIFF is converted to a working WAV first so the rest of the pipeline can run; the original AIFF is left alone.
No. The LTC source is read only. Audio tracks are written as new timestamped WAV files. Existing files are never overwritten.
The session is marked ambiguous. You pick the LTC source in the UI, or right-click a file and assign it. If nothing locks, you can still type a manual start timecode.
23.976 NDF, 24, 25, 29.97 NDF, 29.97 drop-frame, and 30. Changing the picker re-analyzes the files. A mismatch with the LTC signal is a warning, not a silent rewrite.
No. You pay once for a personal or studio license. See Buy / download or email support@stackcommander.com.