You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 080e038
Browse filesBrowse the repository at this point in the historyBrowse files
Give the window an outputs row, and something to send with
§5.9's last unbuilt row, and the one Phase 5's exit criterion turns on: "a new user
can go from launch to synced output without documentation, a text editor, or a
restart". Until now the window could watch a tempo perfectly and nothing left the
machine — Link, OSC and MIDI clock existed only in takt4-cli.
The window owns §4.2's output thread now, so **it stopped draining the beat ring**.
`rt::SpscRing` allows one consumer; with two, the window and the runner would take
half the beats each and the transports would send every other one. `tick()` drains
frames, which is a different ring with a different consumer — §5.9's trace.
The ordering §4.3 needs has moved into `LiveTracker` rather than staying a rule for
callers to remember. The host time stamp is taken on the audio thread, so the clock
has to be installed before the stream is opened; `setHostTimeSource` now hands the
tracker a clock and `start()` installs it at the right moment. It also resets the
regression there, which nothing did before and nothing needed to: the console opens
one stream and exits, but a window opens a new one every time Start is pressed, and
a regression fitted to the last run maps a sample counter that has restarted at zero
to a time long past. `HostTimeSource` grew `resetHostTimeFilter` as a default no-op
for that — a restarted sample clock is the interface's business, not Link's alone.
The row itself is the sketch: Link with its peer count, an OSC target field, a MIDI
port picker, and what has actually been sent. The tick and the reading are
deliberately different things — a box says what the operator asked for, the peer
count and the beat counter say what is happening, and "on, with nobody at the other
end" is exactly the failure somebody needs to see at a gig. The MIDI picker's first
entry is empty, so switching the clock off is a choice in the same list rather than
a second control.
Two small decisions in the OSC field. It applies on Enter rather than on every
keystroke, because `edited` fires per character and each one would tear the sockets
down and rebuild them halfway through an address. And a part that will not parse is
named on the status line while the rest are still applied: an operator typing a
second address must not lose the first one that was working. Commas separate, since
the window offers a single line.
Seven tests. Two hold `LiveTracker` to the §4.3 ordering with a fake `HostTimeSource`
— that the clock is not touched before a run, that it is forgotten *before* the
stream rather than after, and that a second run forgets the first. Five drive the
row: that the window comes up sending nothing, that the Link tick reaches the
transports without putting takt4 in front of peers before Start, that a bad OSC entry
keeps the good ones, that a MIDI port which will not open is said out loud, and —
with a real device — that nothing is dropped, which is what proves exactly one
consumer is draining that ring.
176 tests with the UI off, 197 with it on. The excerpt still ends "499 frames, 21
beats (5 downbeats), ending at 127.7 BPM in 4/4, locked".
0 commit comments