Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
311 commits
Select commit Hold shift + click to select a range
37a7e27
fix: connect slots taking sv types by member pointer
claude Sep 25, 2026
838a2ea
feat: lrc lyrics parser
claude Sep 25, 2026
bdb0489
test: the lyrics plot style of the svgui fork
claude Sep 25, 2026
61ffb7d
feat: import timed lyrics onto the reference
claude Sep 25, 2026
716ac5e
feat: lyrics are kept in the session
claude Sep 25, 2026
870c7d3
fix: lyrics stay under the top layer when the layer above them goes
claude Sep 25, 2026
b51afa6
docs: record the android and sailfish os port research
claude Sep 25, 2026
be790f3
docs: timed lyrics
claude Sep 25, 2026
23e19af
docs: work orders for the android port's phase agents
claude Sep 25, 2026
d1ddcb5
docs: the android toolchain is reachable, so a2 and a3 follow a1
claude Sep 25, 2026
a0ab4ad
docs: plan for a calibrate audio button and dev checks
claude Sep 25, 2026
a1db452
build: a setup script for building and testing in the ubuntu cloud co…
claude Sep 25, 2026
bcbb5c9
test: the takes file suite's windows path assertions run on windows only
claude Sep 25, 2026
a9cd3ba
docs: calibrate audio phases, decisions and facts checked in the code
claude Sep 25, 2026
e2cf7c0
fix: connect slots taking sv types by member pointer
claude Sep 25, 2026
b2ae57c
docs: calibrate audio work orders, linux build traps and baseline
claude Sep 25, 2026
e13fb9a
test: queue the stale pitch event as a functor
claude Sep 25, 2026
3318c02
docs: calibrate audio work orders, the app suite baseline on linux
claude Sep 25, 2026
8b9f07b
docs: building on linux
claude Sep 25, 2026
d4546eb
docs: the android apk is built in the container, not by a workflow
claude Sep 25, 2026
d475649
test: lyrics along the bottom, in boxes, with the word being sung
claude Sep 25, 2026
944df7c
feat: the calibrate audio test reference and sweep finder
claude Sep 25, 2026
12a13b8
docs: calibrate audio work orders, A2 refined from what A1 found
claude Sep 25, 2026
0419d36
fix: a take from a device not at 44.1 khz lands where it was sung
claude Sep 25, 2026
688fd50
docs: phase a1 done, its log entry and the state after it
claude Sep 25, 2026
3e8c5d2
test: waitForRange() waits for the merge itself
claude Sep 25, 2026
3287396
test: TestMainWindow in a header of its own
claude Sep 25, 2026
a7e561c
test: the manual checklist, automated where it can be
claude Sep 25, 2026
58e150d
docs: building and testing on Linux in a cloud session
claude Sep 25, 2026
a03b7ec
feat: calibrate audio verdicts and the round trip they correct
claude Sep 25, 2026
b73adaa
docs: calibrate audio, B1 refined; punch-ins from the layout, rate na…
claude Sep 25, 2026
7ece072
feat: highlight the word being sung, fade the waveform under the lyrics
claude Sep 25, 2026
2a20de5
fix: live dots are drawn as they come during a take
claude Sep 26, 2026
329d6ba
fix: the coverage band stays on top of the take's waveform
claude Sep 26, 2026
c733e3b
fix: what commitData() saves at logout is a .ton
claude Sep 26, 2026
a30fa8f
fix: a take is in time with playback constrained to the selection
claude Sep 26, 2026
f1de6a2
build: android toolchain, qt for android and the c libraries in the c…
claude Sep 26, 2026
bd9fe09
docs: a3 split into building tony for android and packaging the apk
claude Sep 26, 2026
58de074
feat: an audio check that records ordinary takes against a test refer…
claude Sep 26, 2026
7fb4174
fix: the live dots are drawn without drawing the whole pane again
claude Sep 26, 2026
aabc989
fix: the calibration layout has room for four punch-ins of three sweeps
claude Sep 26, 2026
46425d3
docs: calibrate audio, B2 to B4 refined after B1
claude Sep 26, 2026
f996f4e
build: build tony for android as the shared library qt loads
claude Sep 26, 2026
44cae60
fix: lyrics boxes match the word times, and stay in one row
claude Sep 26, 2026
47944f2
feat: takes use the round trip the audio check measured
claude Sep 26, 2026
2424bd6
docs: calibrate audio work orders, B2 done
claude Sep 26, 2026
2fe1100
test: lyrics laid out again after an edit, and the box row found
claude Sep 26, 2026
2e003f7
build: package tony for android as a debug apk
claude Sep 26, 2026
2abe36b
feat: find pyin and open picked files on android
claude Sep 26, 2026
0b8d007
feat: read and write TTML lyrics, with an end for every word
claude Sep 26, 2026
2a306fb
test: waiting for a ranged analysis waits for the range to be done
claude Sep 26, 2026
8524d5f
feat: the audio check plays its reference centred and at -12 dBFS
claude Sep 26, 2026
3963e51
docs: calibrate audio work orders, B3 done
claude Sep 26, 2026
6d2978b
feat: import TTML lyrics, and export the lyrics as TTML
claude Sep 26, 2026
92d04b8
fix: pitch candidates make no undo commands
jhhr Sep 26, 2026
785be7c
test: the edit tool may edit the take's note over the coverage strip
jhhr Sep 26, 2026
9bcb51a
fix: an edited note of a take keeps the take's pitch
jhhr Sep 26, 2026
18ac4ea
docs: a fork's branch follows the tony branch
jhhr Sep 26, 2026
6c80111
feat: the rules for editing lyrics words, as pure functions
claude Sep 26, 2026
9b1fb6c
feat: Playback > Calibrate Audio, a dialog over the audio check
claude Sep 26, 2026
7b44cba
docs: calibrate audio work orders, B4 done
claude Sep 26, 2026
8b752c4
docs: calibrate audio work orders, C0 refined
claude Sep 26, 2026
c31b63c
feat: touch gestures on the panes
claude Sep 26, 2026
42b7650
docs: phase a4 done, and its log entry
claude Sep 26, 2026
1ef2494
feat: TakeDiff, the pure comparisons the dev checks make on a take
claude Sep 26, 2026
c784877
feat: Edit Lyrics, to drag a word's start or end
claude Sep 26, 2026
33df1b5
docs: calibrate audio work orders, C1 split and refined
claude Sep 26, 2026
85b5b69
feat: compact touch layout for a phone
claude Sep 26, 2026
d3e0ac1
docs: phase a5 done, and its log entry
claude Sep 26, 2026
d775cc6
docs: the work order for phase a6, the oboe audio backend
claude Sep 26, 2026
2cf1698
test: the throttle's stream is paced by the clock
jhhr Sep 26, 2026
92b8b5f
test: a take's snapshot waits for its audio to be read
jhhr Sep 26, 2026
40037cf
feat: change, add and delete lyrics words
claude Sep 26, 2026
0c43b2c
docs: the work order for phase a7, sessions in place with all files a…
claude Sep 26, 2026
1cf602a
docs: TTML lyrics, Export Lyrics and editing the words
claude Sep 26, 2026
276e8e1
build: oboe 1.11.0 in the android prefix
claude Sep 26, 2026
f326bfb
feat: oboe audio backend on android
claude Sep 26, 2026
bd3524c
docs: phase a6 done, its log entry, and a3b's apk built
claude Sep 26, 2026
4370131
feat: dev checks for latency after save and reopen, and several phrases
claude Sep 26, 2026
d0d242d
fix: one arg() call for messages and names holding paths
claude Sep 26, 2026
6cb3c38
feat: sessions in place on android, scrollable menus, save on suspend
claude Sep 26, 2026
3062d25
docs: phase a7 done, and its log entry
claude Sep 26, 2026
c8b9585
Merge default into feat/calibrateaudiotests
claude Sep 26, 2026
6745b2f
fix: no variables named near or far, which windows headers define away
jhhr Sep 26, 2026
1744406
docs: calibrate audio re-planned after the merge of default
claude Sep 26, 2026
04cd280
docs: calibrate audio work orders name the Windows macro trap
claude Sep 26, 2026
1b9c879
test: the dev checks' suite in an executable of its own, test-tony-dev
claude Sep 26, 2026
89db72c
Merge pull request #2 from jhhr/feat/calibrateaudiotests
jhhr Sep 26, 2026
d099eac
Merge default into claude/nifty-goodall-4kocmz
claude Sep 26, 2026
276036e
feat: dev checks for live dots, the take in the speakers, and the mic…
claude Sep 26, 2026
68c9a91
docs: calibrate audio work orders, C1c refined
claude Sep 26, 2026
f627f96
build: container-setup.sh from feat/tonyandroid
claude Sep 26, 2026
bb29899
test: suites run as shards in parallel processes
claude Sep 26, 2026
75ed4e3
build: the cloud environment's setup script and a session's backgroun…
claude Sep 26, 2026
b1b8f08
feat: dev checks for recording from a position, the lead-in, pre-roll…
claude Sep 26, 2026
668057f
docs: calibrate audio, the user's dev run and the driver project; C2 …
claude Sep 26, 2026
8ba73a4
docs: work orders for the second phone test's fixes and vertical zoom
claude Sep 26, 2026
6157d2e
build: a sessionstart hook starts the cloud session's build
claude Sep 26, 2026
de4cb95
feat: shift the whole lyrics, by dragging or by a number of seconds
claude Sep 26, 2026
0f1688a
test: the takes file suite's windows path assertions run on windows only
claude Sep 26, 2026
f5b4ed2
fix: no helper named bold, which the macos sdk declares globally
claude Sep 26, 2026
cf7d2fc
test: ci names each failed test and runs the suites one at a time
claude Sep 26, 2026
fbdce6c
feat: dev checks for Stop on a long song, and the joins
claude Sep 26, 2026
7de2e80
docs: calibrate audio work orders, C2b and C2c
claude Sep 26, 2026
f844596
Merge pull request #1 from jhhr/claude/nifty-goodall-4kocmz
jhhr Sep 26, 2026
18a12e8
test: ci's list of failed tests keeps each one's values and location
claude Sep 26, 2026
32cd804
Merge default into claude/confident-planck-2zlcwn
claude Sep 26, 2026
a654b38
fix: each test shard has a home of its own
claude Sep 26, 2026
0bb8a21
build: the cloud build covers test-tony-dev
claude Sep 26, 2026
50dea8e
docs: a cloud session pushes to a fork only once it is attached
claude Sep 26, 2026
6fa6b2d
test: the save prompt is recognised by its text, which macos keeps
claude Sep 26, 2026
f4ab1c8
Merge default into claude/confident-planck-2zlcwn
claude Sep 26, 2026
6ba885f
test: the throttle's last notice is waited for, not given a fixed time
claude Sep 26, 2026
aa09681
test: linux ci on ubuntu 24.04, whose qt is 6.4
claude Sep 26, 2026
ab3b596
test: windows ci builds with msys2's mingw64, as the fork is built
claude Sep 26, 2026
aee97cd
docs: the fork push was refused under custom network access
claude Sep 26, 2026
a414936
fix: the setup script says where the android sdk went
claude Sep 26, 2026
4fb73ac
fix: the lead-in check survives a stalled event loop
claude Sep 26, 2026
c4c0807
docs: calibrate audio work orders, C2b done
claude Sep 26, 2026
082e7c9
docs: auto mode blocks fork work unless the user names it
claude Sep 26, 2026
3b94043
build: the cloud environment trusts the library forks in auto mode
claude Sep 26, 2026
d404a0a
Merge pull request #6 from jhhr/claude/confident-planck-2zlcwn
jhhr Sep 26, 2026
2024f9d
test: tests of what happens during a take's analysis hold that analysis
claude Sep 26, 2026
e5f3354
test: svcore with its reader test reading nothing before a decode starts
claude Sep 26, 2026
8451344
fix: picking files on android: parentheses, drive, downloads, menus
claude Sep 26, 2026
967fb8b
docs: phase a7b done, the evidence behind it, and its log entry
claude Sep 26, 2026
5f7b2b8
fix: a note held across the start of a punch-in stays one note
claude Sep 26, 2026
84f85a1
docs: calibrate audio work orders, C3 refined
claude Sep 26, 2026
18cfd12
Merge default into claude/ci-jobs-failing-xxrsmg
claude Sep 26, 2026
b899fe8
docs: the work order for phase a7c, android's decoders for m4a
claude Sep 26, 2026
e03f9d2
test: retire test-tony-device, whose checks the dev run now makes
claude Sep 26, 2026
57696f2
docs: calibrate audio work orders, D refined
claude Sep 26, 2026
bf39289
feat: zoom and scroll the frequency range by touch
claude Sep 26, 2026
b2cfa87
docs: phase a4b done, and its log entry
claude Sep 26, 2026
449c7e4
docs: Calibrate Audio and the dev checks as built
claude Sep 26, 2026
cf8f47f
feat: m4a, flac and ogg through android's decoders
claude Sep 26, 2026
306ebfa
fix: an incomplete session is saved only when the user says so
claude Sep 26, 2026
a1cc110
docs: phase a7c done, and its log entry
claude Sep 26, 2026
cad6993
docs: the joins check's comment says what a misplaced punch-in shows
claude Sep 26, 2026
0d0cdf1
test: races with a ranged analysis are set up by holding its merge
claude Sep 26, 2026
49f2271
docs: work orders for phases a9 and a10
claude Sep 26, 2026
b729383
docs: plan for sharded test runs on windows
claude Sep 26, 2026
fb5fa6f
Merge default into feat/tonyandroid
claude Sep 26, 2026
ba2f632
docs: a9 re-scoped after the merge of default
claude Sep 26, 2026
ad2d93a
Merge default into feat/calibrateaudiotests
claude Sep 26, 2026
40ce2f5
test: the app and dev suites' qtest timeout is meson's own
claude Sep 26, 2026
c459b8a
test: a singing analysis test waits for the transform to go
claude Sep 26, 2026
263dcff
test: the lyrics failure dialogs are matched by their text as well
claude Sep 26, 2026
9910950
test: windows ci lists failed tests from the suites' result files
claude Sep 26, 2026
dbce0cb
test: each shard runs under an application name of its own
claude Sep 26, 2026
53a835f
test: wait until stop would keep a take before stopping it
claude Sep 26, 2026
4373327
test: shards share HOME, kept apart by their application names
claude Sep 26, 2026
4502fdc
fix: a ranged analysis is merged from the event loop, however soon it…
claude Sep 26, 2026
0df08a5
fix: live dots reach the GUI thread in batches and redraw only their …
claude Sep 26, 2026
2e31893
docs: shards are kept apart by their application names
claude Sep 26, 2026
1979ccc
feat: pitch and notes sized for the screen, and a plot size setting
claude Sep 26, 2026
de6b3e2
test: takes stopped at once record something first
claude Sep 26, 2026
7ce97ab
test: qt 6.4's watchdog no longer ends the longest suite
claude Sep 26, 2026
0c4f5fd
test: a take is stopped only once it has some audio in it
claude Sep 26, 2026
f850b51
Merge pull request #5 from jhhr/feat/calibrateaudiotests
jhhr Sep 26, 2026
f09f920
docs: work orders for a11 and a4c
claude Sep 26, 2026
00d9339
fix: the cursor keeps the reference's pace at 48 kHz; Save Log closes…
claude Sep 26, 2026
60df16d
test: macos ci checks the app it builds, and packages nothing
claude Sep 26, 2026
de8f18b
Merge default into claude/zen-ramanujan-is4ryn
claude Sep 26, 2026
b4704a1
Merge pull request #7 from jhhr/claude/zen-ramanujan-is4ryn
jhhr Sep 26, 2026
898f6e1
Merge default into feat/tonyandroid: Calibrate Audio and the dev checks
claude Sep 26, 2026
17e0a35
feat: vertical zoom keeps the pitch in view
claude Sep 26, 2026
78a8bb7
Merge origin/feat/tonyandroid: the cursor at 48 kHz
claude Sep 26, 2026
bcfbfdd
Merge origin/feat/tonyandroid: vertical zoom keeps the pitch in view
claude Sep 26, 2026
59f9e76
docs: the driver project, WASAPI next to MME: plan and work orders
claude Sep 26, 2026
89b9018
fix: tony-only defines stay off svcore and the plugins
jhhr Sep 26, 2026
c409401
fix: svgui pinned at tony-customizations, where PR #1's work landed
jhhr Sep 26, 2026
b022990
docs: the app suite takes about 12 minutes on Windows
jhhr Sep 26, 2026
5ba1490
docs: builds use -j 4, one job per core
jhhr Sep 26, 2026
18c1227
Merge default into claude/ci-jobs-failing-xxrsmg
claude Sep 26, 2026
9589dfa
fix: calibrate audio measures a device at 48 kHz like any other
claude Sep 26, 2026
9fc25b5
feat: lyrics at 65 % of their size on android
claude Sep 26, 2026
5cbd120
Merge feat/wasapi into feat/tonyandroid: calibrate audio at 48 kHz
claude Sep 26, 2026
806b28a
build: bqaudioio from the fork, with a PortAudio implementation per w…
claude Sep 26, 2026
58b0974
docs: the driver project's work order for w3, the driver and latency …
claude Sep 26, 2026
88783c2
docs: work orders for a12 and a12b, calibrate audio and the dev run o…
claude Sep 26, 2026
ce7411e
Merge pull request #4 from jhhr/claude/ci-jobs-failing-xxrsmg
jhhr Sep 26, 2026
dc4d74f
feat: calibrate audio on the phone, a figure per route
claude Sep 26, 2026
8f1cfb3
feat: playback > audio driver and audio latency, with mme named by de…
claude Sep 26, 2026
8bdd54c
docs: the driver project's work order for w4, the docs pass
claude Sep 26, 2026
a818119
feat: view > lyrics size, 50 % by default on android
claude Sep 26, 2026
ae78793
docs: work order for a12c, the calibrate audio dialog small and out o…
claude Sep 26, 2026
f437540
Merge default into feat/tonyandroid
claude Sep 26, 2026
5734fe7
test: android ci builds the apk with the scripts of deploy/android
claude Sep 26, 2026
2fe7ea2
docs: the audio drivers as built, and what to try on windows
claude Sep 26, 2026
6f96979
feat: calibrate audio dialog small, and a corner indicator while a ch…
claude Sep 26, 2026
c26f242
fix: the host qt for android is built without zstd
claude Sep 26, 2026
ce75830
Merge origin/feat/tonyandroid: default's CI and test runner fixes
claude Sep 26, 2026
743e83b
docs: the android ci job, what it builds and what it caches
claude Sep 26, 2026
16f602b
test: android ci shows what repoint install changed in the tree
claude Sep 26, 2026
af06892
feat: the dev run on the phone
claude Sep 26, 2026
8cb8a6a
fix: the lock file ends with a newline, as repoint writes it
claude Sep 26, 2026
e6e4c19
docs: work order for a13, fixes from the dev runs on the phone
claude Sep 26, 2026
8d82e25
fix: the vertical zoom test builds on windows
jhhr Sep 26, 2026
ce0087d
test: no near or far in the vertical zoom test
claude Sep 26, 2026
f75f868
test: the incomplete-session message found by its text on macOS
claude Sep 26, 2026
b490b00
test: the live dots feed's tests count by their own clock
claude Sep 26, 2026
e51bf6c
test: touch tests clear qt 6.4's double-click state first
claude Sep 26, 2026
9352f05
fix: the dev checks read right at 48 kHz, and item 3 allows for a sou…
claude Sep 26, 2026
92c7d44
feat: wasapi at 20 ms is the default driver, from the user's runs
claude Sep 26, 2026
7dee516
fix: oboe reads all its input, refuses latency read behind it, reopen…
claude Sep 26, 2026
0b5a6c0
feat: calibrate audio's tones with harmonics and a vibrato, for a pho…
claude Sep 26, 2026
8839573
fix: dev checks leave pitch they cannot see not judged; oboe named in…
claude Sep 26, 2026
a68d5ac
Merge origin/feat/tonyandroid: test fixes for qt 6.4 and macos
claude Sep 26, 2026
2339c48
fix: a path from a downloads uri has one slash at its start everywhere
claude Sep 26, 2026
bf565f6
feat: the audio stream keeps running between takes on desktop
claude Sep 26, 2026
2049f95
fix: no latency measured after input overruns; the log names the build
claude Sep 26, 2026
a8a5280
Merge origin/feat/tonyandroid: downloads uri paths
claude Sep 26, 2026
ab482d0
fix: the dev checks' item 3 sets apart dots at a tone's end as well
claude Sep 26, 2026
042e3d7
Merge feat/wasapi into feat/tonyandroid: audio drivers on Windows
claude Sep 26, 2026
4bd81a5
Merge feat/ciandroid: the android ci job
claude Sep 26, 2026
a7c9d4c
feat: the dev checks place takes within 6 ms, what a running stream o…
claude Sep 26, 2026
f5941a8
fix: an input latency over the input's buffer is input lost; oboe nam…
claude Sep 26, 2026
96ebd76
Merge origin/feat/tonyandroid: the android ci job
claude Sep 26, 2026
559fb46
Merge origin/feat/tonyandroid into feat/wasapi
claude Sep 26, 2026
e43070d
docs: the dev checks' suite takes about seven minutes since the phone…
claude Sep 26, 2026
ce58ced
test: the swapped-in audio is read in full before its length is checked
claude Sep 26, 2026
c1dc3b8
docs: the second kept-running dev run on wasapi
claude Sep 26, 2026
d0dbaeb
Merge origin/feat/tonyandroid into feat/wasapi
claude Sep 26, 2026
7dc3dca
feat: android keeps the audio stream running between takes, suspended…
claude Sep 26, 2026
c86d1ec
docs: work order a15, the song scroll bar in the compact layout
claude Sep 26, 2026
d6b2202
docs: what the second kept-running run's recordings show
claude Sep 26, 2026
75a77da
test: the idle suspend is timed from before the take's stop
claude Sep 26, 2026
2d369a7
feat: a thin song scroll bar in place of the navigator in the compact…
claude Sep 26, 2026
137de87
Merge feat/wasapi into feat/tonyandroid: dev checks within 6 ms, dots…
claude Sep 26, 2026
485d3b2
feat: the live dots have a level floor of -60 dbfs
claude Sep 26, 2026
4ff658a
docs: the third kept-running run, and the end of the driver work
claude Sep 26, 2026
34e8831
Merge feat/wasapi into feat/tonyandroid: the live dots' level floor, …
claude Sep 26, 2026
1850166
feat: the live dots drop yin's octave slips
claude Sep 26, 2026
1e22e35
Merge origin/feat/tonyandroid: the live dots' level floor, with the o…
claude Sep 26, 2026
2946cfa
build: the forks pinned at their tony-customizations heads
claude Sep 26, 2026
7d4f98b
test: no far in the song scroll bar test
claude Sep 27, 2026
8c0e3b8
test: the play pointer may be as late as the machine's timers are
claude Sep 27, 2026
83359e4
docs: the README describes the singing practice fork
claude Sep 27, 2026
8728507
Merge pull request #9 from jhhr/claude/practical-feynman-x575ei
jhhr Sep 27, 2026
2951ee5
Merge remote-tracking branch 'origin/default' into feat/tonyandroid
claude Sep 27, 2026
3c66e74
docs: the README covers the android app and the new view settings
claude Sep 27, 2026
f59e8cd
test: the live dots feed's last two fixed waits wait for what they need
claude Sep 27, 2026
f5a4848
docs: the final pass over the android port, and the work orders folde…
claude Sep 27, 2026
4f6aefa
Merge origin/feat/tonyandroid: the live dots feed's test waits
claude Sep 27, 2026
49daf0f
test: the app suite's meson timeout is 30 minutes
claude Sep 27, 2026
b4b8af9
Merge pull request #8 from jhhr/feat/tonyandroid
jhhr Sep 27, 2026
78c88ca
feat: the session remembers the background music
claude Sep 27, 2026
edf18df
Merge pull request #10 from jhhr/claude/vibrant-mendel-hzu4my
jhhr Sep 27, 2026
2e62080
test: the linux and android ci jobs run in a cloud session too
claude Sep 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"hooks": {
"SessionStart": [
{
"matcher": "startup|resume",
"hooks": [
{
"type": "command",
"command": "bash \"$CLAUDE_PROJECT_DIR\"/deploy/linux/cloud-session.sh start --if-cloud"
}
]
}
]
}
}
19 changes: 19 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Copilot instructions

The instructions for AI agents in this repository are in [`AGENTS.md`](../AGENTS.md) at
the repository root, and the documentation they point to is in [`docs/`](../docs/). Read
`AGENTS.md` first and follow it; this file exists only so that tools which look here find
their way there.

The essentials, for a context that cannot follow the link:

- Fork of Tony (Qt6 / C++17, meson + ninja, Sonic Visualiser libraries) adding singing
practice features. The fork's own code is in `main/`; tests are in `main/test/`.
- Build from Git Bash with
`export PATH="/c/msys64/mingw64/bin:$PATH" MINGW_PREFIX="C:/msys64/mingw64"` and
`ninja -j 3 -C build_mingw Tony.exe test-tony-core.exe test-tony-app.exe`, logging to a
file under `tmp/`. From PowerShell use `.\build.bat` and `.\build.bat test`.
- `svcore/`, `svgui/`, `svapp/` and the other top-level library directories are separate,
gitignored repositories. See `docs/forks.md` before changing one.
- Match the surrounding code, keep changes in scope, and give every behaviour a test that
can fail.
94 changes: 94 additions & 0 deletions .github/workflows/android.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
name: Android CI

on: [push, pull_request]

# The APK, built by the scripts in deploy/android/ as the cloud container
# builds it (docs/building.md). Qt for Android and the C libraries are
# built from source there, which takes most of an hour: each is cached,
# keyed on the script that builds it and the toolchain's, and saved as
# soon as it is built, so that a later step's failure does not cost it

env:
# The runner's own SDK and NDK are other versions; everything that
# looks for one in the environment is to find the scripts'
ANDROID_HOME: /opt/android/sdk
ANDROID_SDK_ROOT: /opt/android/sdk
ANDROID_NDK: /opt/android/sdk/ndk/27.2.12479018
ANDROID_NDK_HOME: /opt/android/sdk/ndk/27.2.12479018
ANDROID_NDK_ROOT: /opt/android/sdk/ndk/27.2.12479018
ANDROID_NDK_LATEST_HOME: /opt/android/sdk/ndk/27.2.12479018

jobs:
build:

runs-on: ubuntu-24.04

steps:
- uses: actions/checkout@v4
with:
# build-apk.sh counts the commits for the version code
fetch-depth: 0
# The runner's own Android SDK and .NET take disk the Qt build needs
- name: free-disk
run: |
df -h /
sudo rm -rf /usr/local/lib/android /usr/share/dotnet /opt/ghc /usr/local/.ghcup
df -h /
- name: prepare
run: |
sudo mkdir -p /opt/android
sudo chown "$(id -u):$(id -g)" /opt/android
- name: install-packages
run: |
sudo apt-get update
sudo apt-get install -y git mercurial smlnj
- name: repoint
run: ./repoint install
- name: setup-toolchain
run: deploy/android/setup-toolchain.sh
- name: restore-qt
id: qt
uses: actions/cache/restore@v4
with:
path: /opt/android/qt
key: android-qt-${{ hashFiles('deploy/android/build-qt.sh', 'deploy/android/setup-toolchain.sh') }}
- name: build-qt
run: deploy/android/build-qt.sh
- name: save-qt
if: steps.qt.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
path: /opt/android/qt
key: ${{ steps.qt.outputs.cache-primary-key }}
- name: restore-deps
id: deps
uses: actions/cache/restore@v4
with:
path: /opt/android/deps-arm64-v8a
key: android-deps-${{ hashFiles('deploy/android/build-deps.sh', 'deploy/android/setup-toolchain.sh') }}
- name: build-deps
run: deploy/android/build-deps.sh
- name: save-deps
if: steps.deps.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
path: /opt/android/deps-arm64-v8a
key: ${{ steps.deps.outputs.cache-primary-key }}
- name: build-tony
run: deploy/android/build-tony.sh
- name: build-apk
run: deploy/android/build-apk.sh
- name: upload-apk
uses: actions/upload-artifact@v4
with:
name: Tony-debug-apk
path: build-android/apk/Tony-debug.apk
if-no-files-found: error
# The scripts show the end of a failing log; the whole of each is here
- name: upload-logs
if: failure()
uses: actions/upload-artifact@v4
with:
name: android-logs
path: /opt/android/logs
if-no-files-found: ignore
25 changes: 18 additions & 7 deletions .github/workflows/linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,21 @@ on: [push, pull_request]
jobs:
build:

runs-on: ubuntu-22.04
runs-on: ubuntu-24.04

steps:
- uses: actions/checkout@v2
- name: install-packages
run: |
sudo apt-get update
sudo apt-get install build-essential libbz2-dev libfftw3-dev libfishsound1-dev libid3tag0-dev liblo-dev liblrdf0-dev libmad0-dev liboggz2-dev libopus-dev libopusfile-dev libpulse-dev libsamplerate-dev libsndfile-dev libsord-dev libxml2-utils portaudio19-dev qt6-base-dev qt6-pdf-dev qt6-base-dev-tools libqt6svg6-dev raptor2-utils git mercurial autoconf automake libtool smlnj capnproto libcapnp-dev ninja-build libglib2.0-dev libboost-all-dev
sudo apt-get install build-essential libbz2-dev libfftw3-dev libfishsound1-dev libid3tag0-dev liblo-dev liblrdf0-dev libmad0-dev liboggz2-dev libopus-dev libopusfile-dev libpulse-dev libsamplerate0-dev libsndfile1-dev libsord-dev libxml2-utils portaudio19-dev qt6-base-dev qt6-pdf-dev qt6-base-dev-tools qt6-svg-dev raptor2-utils git mercurial autoconf automake libtool smlnj capnproto libcapnp-dev ninja-build libglib2.0-dev libboost-all-dev
- name: install-meson
run: |
mkdir -p tmp/meson
cd tmp/meson
wget https://github.com/mesonbuild/meson/releases/download/1.3.1/meson-1.3.1.tar.gz
tar xvf meson-1.3.1.tar.gz
sudo ln -s $(pwd)/meson-1.3.1/meson.py /usr/bin/meson
sudo ln -sf $(pwd)/meson-1.3.1/meson.py /usr/bin/meson
- name: install-rubberband
run: |
mkdir -p tmp/rubberband
Expand All @@ -33,10 +33,21 @@ jobs:
- name: repoint
run: ./repoint install
- name: configure
run: |
qtchooser -install qt6 $(which qmake6)
QT_SELECT=qt6 meson setup build --buildtype release
run: meson setup build --buildtype release
- name: make
run: ninja -C build
- name: test
run: meson test -C build
id: test
run: meson test -C build --print-errorlogs --num-processes 1
# meson shows at most the last 100 lines of a failing log, and one
# test executable runs several QTest suites: name every failed test,
# with the lines QTest indents under it (compared values, where it
# failed) and the totals of each suite that failed
- name: test-failures
if: failure() && steps.test.outcome == 'failure'
run: |
awk '/^test:/ { print; next }
/^Totals:/ { if ($0 !~ /, 0 failed/) print; next }
/^(FAIL!|XPASS|QFATAL)|Received signal/ { print; fail = 1; next }
/^[A-Z!]+ *: / { fail = 0 }
fail && /^ / { print }' build/meson-logs/testlog.txt
23 changes: 17 additions & 6 deletions .github/workflows/macos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,23 @@ jobs:
- name: make
run: ninja -C build
- name: test
run: meson test -C build
- name: deploy-app
id: test
run: meson test -C build --print-errorlogs --num-processes 1
# meson shows at most the last 100 lines of a failing log, and one
# test executable runs several QTest suites: name every failed test,
# with the lines QTest indents under it (compared values, where it
# failed) and the totals of each suite that failed
- name: test-failures
if: failure() && steps.test.outcome == 'failure'
run: |
ls -lR /usr/local/opt
QTDIR=/usr/local/opt/qt6 ./deploy/macos/deploy.sh "Tony"
awk '/^test:/ { print; next }
/^Totals:/ { if ($0 !~ /, 0 failed/) print; next }
/^(FAIL!|XPASS|QFATAL)|Received signal/ { print; fail = 1; next }
/^[A-Z!]+ *: / { fail = 0 }
fail && /^ / { print }' build/meson-logs/testlog.txt
# No app bundle: the packaging scripts in deploy/osx are qmake's,
# and this build makes none. The app it does build has to start
- name: check
run: |
otool -L ./"Tony.app/Contents/MacOS/Tony"
./"Tony.app/Contents/MacOS/Tony" --version
otool -L build/tony
build/tony --version
110 changes: 78 additions & 32 deletions .github/workflows/windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,54 +2,100 @@ name: Windows CI

on: [push, pull_request]

# Built as it is on the development machine (docs/building.md): MSYS2's
# mingw64 toolchain, Qt and libraries, with meson and ninja

jobs:
build:

runs-on: windows-2019
runs-on: windows-2022

steps:
- uses: actions/checkout@v3
- uses: ProjectSavanna/setup-sml@v1.2.0
with:
smlnj-version: '110.99.4'
- uses: actions/setup-python@v1
with:
python-version: '3.x'
- uses: jurplel/install-qt-action@v3
with:
version: '6.6.1'
host: 'windows'
target: 'desktop'
arch: 'win64_msvc2019_64'
- uses: MarkusJx/install-boost@v2.4.5
id: install-boost
with:
boost_version: 1.84.0
platform_version: 2019
toolset: msvc
- uses: ilammy/msvc-dev-cmd@v1
with:
vsversion: '2019'

- name: install-meson
run: pip install meson ninja
# repoint checks six of the libraries out with Mercurial
- name: mercurial
run: if (-not (Get-Command hg -ErrorAction SilentlyContinue)) { pip install mercurial }

- name: repoint
run: ./repoint install

- name: configure
run: meson setup build --buildtype release
env:
BOOST_ROOT: ${{ steps.install-boost.outputs.BOOST_ROOT }}
- uses: msys2/setup-msys2@v2
with:
msystem: MINGW64
update: true
install: >-
mingw-w64-x86_64-gcc
mingw-w64-x86_64-meson
mingw-w64-x86_64-ninja
mingw-w64-x86_64-pkgconf
mingw-w64-x86_64-qt6-base
mingw-w64-x86_64-qt6-svg
mingw-w64-x86_64-boost
mingw-w64-x86_64-bzip2
mingw-w64-x86_64-zlib
mingw-w64-x86_64-fftw
mingw-w64-x86_64-libsamplerate
mingw-w64-x86_64-rubberband
mingw-w64-x86_64-libsndfile
mingw-w64-x86_64-flac
mingw-w64-x86_64-libogg
mingw-w64-x86_64-libvorbis
mingw-w64-x86_64-opus
mingw-w64-x86_64-opusfile
mingw-w64-x86_64-libmad
mingw-w64-x86_64-libid3tag
mingw-w64-x86_64-portaudio
mingw-w64-x86_64-serd
mingw-w64-x86_64-sord

- name: copy-qt-etc
# meson.build reads MINGW_PREFIX, which an MSYS2 shell sets to the
# POSIX path /mingw64: gcc wants the Windows one. Every step sets it,
# as ninja may run meson again
- name: configure
shell: msys2 {0}
run: |
foreach ($lib in 'Core','Gui','Widgets','Network','Xml','Svg','Test') { copy "..\Qt\6.6.1\msvc2019_64\bin\Qt6$lib.dll" build }
cp sv-dependency-builds\win64-msvc\lib\libsndfile-1.dll build
export MINGW_PREFIX=$(cygpath -m /mingw64)
meson setup build --buildtype release

- name: build
run: ninja -C build
- name: make
shell: msys2 {0}
run: |
export MINGW_PREFIX=$(cygpath -m /mingw64)
ninja -C build

# Tony's suites also write their results to files: here QTest's
# output to stdout does not reach meson's log
- name: test
run: meson test -C build

id: test
shell: msys2 {0}
run: |
export MINGW_PREFIX=$(cygpath -m /mingw64)
mkdir -p build/test-results
export TONY_TEST_LOG_DIR=$(cygpath -m "$PWD/build/test-results")
meson test -C build --print-errorlogs --num-processes 1
# meson shows at most the last 100 lines of a failing log, and one
# test executable runs several QTest suites: name every failed test,
# with the lines QTest indents under it (compared values, where it
# failed) and the totals of each suite that failed
- name: test-failures
if: failure() && steps.test.outcome == 'failure'
shell: msys2 {0}
run: |
awk '/^test:/ { print; next }
/^Totals:/ { if ($0 !~ /, 0 failed/) print; next }
/^(FAIL!|XPASS|QFATAL)|Received signal/ { print; fail = 1; next }
/^[A-Z!]+ *: / { fail = 0 }
fail && /^ / { print }' build/meson-logs/testlog.txt
awk 'function show(line) {
if (!shown) { print "suite: " FILENAME; shown = 1 }
print line
}
FNR == 1 { shown = 0; fail = 0 }
/^Totals:/ { if ($0 !~ /, 0 failed/) show($0); next }
/^(FAIL!|XPASS|QFATAL)/ { show($0); fail = 1; next }
/^[A-Z!]+ *: / { fail = 0 }
fail && /^ / { show($0) }' build/test-results/*.txt
9 changes: 8 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,12 @@ chp
pyin
glob:.repoint*
build
build-android
build-linux-ci
build_win32
build_win64
build_win64_debug
build_linux
*.AppImage
*.AppDir
Dockerfile*.gen
Expand All @@ -49,4 +52,8 @@ test-svcore-*
*.dmg
.notarization-uuid
Dockerfile*.gen

tmp
# Claude Code's local files (settings.local.json, worktrees); only the
# shared settings, with the cloud session's hook, are tracked
.claude/*
!.claude/settings.json
Loading