Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
757 commits
Select commit Hold shift + click to select a range
9411003
Fixed: project export reports skipped rows instead of failing
JakimPL Sep 21, 2026
2b4ddd9
Minor improvements
JakimPL Sep 22, 2026
30472be
Fixed: cancel button styling and recalculating the width of a waveform
JakimPL Sep 22, 2026
2f03729
Improved: waveform ribbons for single-stemmed reconstructions
JakimPL Sep 22, 2026
88a4dbd
Fixed: a folded browser row reads in the default font
JakimPL Sep 22, 2026
1e3801c
Added: reading the recordings a reconstruction names without the rest…
JakimPL Sep 22, 2026
6d1350b
Added: the browser reads the recordings a reconstruction names
JakimPL Sep 22, 2026
396347a
Added: the recordings a reconstruction holds in the browser's hover d…
JakimPL Sep 22, 2026
315d8a5
Merge pull request #75 from JakimPL/improvements
JakimPL Sep 22, 2026
4121341
Cleared: the ledger entries a merge brought back
JakimPL Sep 29, 2026
769a74c
Removed: the remembered library path
JakimPL Sep 29, 2026
3e2abd2
Enforced: every source directory is a package
JakimPL Sep 29, 2026
468534a
Fixed: the Sample column reaching every channel
JakimPL Sep 29, 2026
ee6993c
Fixed: a Bitphase document written at concert pitch
JakimPL Sep 29, 2026
a92f40b
Reported: what a Bitphase export shortens
JakimPL Sep 29, 2026
75beff8
Settled: a channel resting through every frame as standing by
JakimPL Sep 29, 2026
0cd8144
Shown: a channel an edit silences as standing by
JakimPL Sep 29, 2026
ebdbcd8
Let go of: a recording that holds no frame
JakimPL Sep 29, 2026
58d0dbe
Recorded: the scale a conversion reads its recordings at
JakimPL Sep 29, 2026
ad71969
Restated: what puts a standing-by channel in play
JakimPL Sep 29, 2026
e32c71a
Recorded: the envelopes a removal leaves drawn
JakimPL Sep 29, 2026
7018b36
Fixed: the instruments panel drawing a removed recording
JakimPL Sep 30, 2026
329bf3b
Corrected: the figures the compression page quotes
JakimPL Sep 30, 2026
b21a5a7
Recorded: what an undo and a late regeneration leave in the Reconstru…
JakimPL Sep 30, 2026
157b8eb
Fixed: the Bitphase rows a note, a triangle and a low pitch write
JakimPL Sep 30, 2026
b043156
Fixed: the FamiTracker rows a note, a triangle and a low pitch write
JakimPL Sep 30, 2026
ad9ec14
Added: a check of what a tracker export plays against the app
JakimPL Sep 30, 2026
ab8e0d5
Fixed: the playback check handing Bitphase relative paths
JakimPL Sep 30, 2026
fd33d7a
Fixed: a note starting from what the voice before it left
JakimPL Sep 30, 2026
5f6e1cb
Fixed: the noise period a Bitphase document plays
JakimPL Sep 30, 2026
bd3afd0
Carried: a transpose-only row into a Bitphase document
JakimPL Sep 30, 2026
1b88230
Carried: a transpose-only row into a FamiTracker module
JakimPL Sep 30, 2026
96ff20a
Reworded: the export notices in plain words
JakimPL Sep 30, 2026
8693478
Added: the rules for messages a user reads
JakimPL Sep 30, 2026
095b808
Fixed: the playback check reading what Bitphase writes to the chip
JakimPL Sep 30, 2026
45b7d5f
Matched: the noise level a row sets to what the trackers play
JakimPL Sep 30, 2026
ef5c611
Fixed: a prompt raised from another prompt's answer
JakimPL Sep 30, 2026
b5f4f1e
Asked: to save the open document before loading a conversion
JakimPL Sep 30, 2026
8997384
Asked: about every unfinished document and job on exit
JakimPL Sep 30, 2026
36c796d
Followed: the open voice across undo, redo and removal
JakimPL Sep 30, 2026
f02f541
Applied: reconstruction edits one step at a time
JakimPL Sep 30, 2026
bd85b7c
Waited: every gesture reading the open sample for its edits
JakimPL Sep 30, 2026
9a09abe
Kept: the waveform faded until the last edit lands
JakimPL Sep 30, 2026
5af4761
Quieted: a save a prompt asks for
JakimPL Sep 30, 2026
1e9b3a3
Kept: the last recording of an edited document
JakimPL Sep 30, 2026
5d67f39
Trimmed: the guide sentences on what the app does by itself
JakimPL Sep 30, 2026
9099a55
Cleared: the file a removed reconstruction was shown on
JakimPL Sep 30, 2026
c7b2843
Removed: redundant description
JakimPL Oct 1, 2026
0254c64
Queued: a modal asked for while another holds the screen
JakimPL Oct 1, 2026
aad0239
Added: checking your own projects against a tracker
JakimPL Oct 1, 2026
a0f668b
Moved: the NSF console into the tools
JakimPL Oct 1, 2026
51d9c78
Added: playing exported projects through FamiTracker
JakimPL Oct 1, 2026
02d81c6
Matched: an instrument on noise and a held bend to what the trackers …
JakimPL Oct 1, 2026
b5898fc
Recorded: the tracker playback check and the noise reading in the cha…
JakimPL Oct 1, 2026
dbc9787
Weighed: a bar's ticks the way its meter accents the rows
JakimPL Oct 1, 2026
6391b52
Carried: the groove's remainder from pattern to pattern
JakimPL Oct 1, 2026
4dfeb46
Compared: how each export plays a song's timing
JakimPL Oct 1, 2026
74dce6c
Reached: the longest timer for a note below A-0
JakimPL Oct 1, 2026
a9b61ce
Merge pull request #77 from JakimPL/groove
JakimPL Oct 1, 2026
2cb7905
Merge branch 'comparators' into dev
JakimPL Oct 1, 2026
fd6a21e
Exposed: the modal line and an action's keys to readers outside them
JakimPL Oct 1, 2026
dbaa8ac
Built: a driver that runs SampleToNES on a display of its own, a scen…
JakimPL Oct 1, 2026
8fe210f
Proved: tabs, Display settings and the exit prompts on a live screen
JakimPL Oct 1, 2026
a4eb9d2
Wired: the screen scenarios into the pre-push hooks and the Linux CI run
JakimPL Oct 1, 2026
accb3ed
Documented: how a screen scenario is written, run and watched
JakimPL Oct 1, 2026
5956b6a
Built: the scenario's seeded home, the window manager's close and ges…
JakimPL Oct 2, 2026
c62140a
Proved: old and broken documents, a fresh home and what a restart kee…
JakimPL Oct 2, 2026
3fb7ab0
Proved: the Main tab's gathering, list, row settings, mix, cards, run…
JakimPL Oct 2, 2026
87d4518
Proved: every question that guards a document, on a live screen
JakimPL Oct 2, 2026
bcaa0de
Proved: the Reconstructions and Instructions tabs' playback, envelope…
JakimPL Oct 2, 2026
1728fe7
Proved: the Sequencer's tracker, voices, history and song on a live s…
JakimPL Oct 2, 2026
0ada66c
Proved: exports, imports, instruments from a channel and the NSF wind…
JakimPL Oct 2, 2026
0ac66aa
Proved: palettes, Display settings, fullscreen, dialogs, menus, keybi…
JakimPL Oct 2, 2026
e743996
Proved: closing mid-work and the exit chain on a live screen
JakimPL Oct 2, 2026
bd0385f
Added: common screens tests vocabulary
JakimPL Oct 3, 2026
ce25c71
Reorganized: screen tier into subject packages with shared vocabulary
JakimPL Oct 3, 2026
bfed33f
Fixed: the source sweep inside hidden folders and the deleted-files c…
JakimPL Oct 3, 2026
a9c723d
Fixed: note keys taking combinations meant for the shortcuts
JakimPL Oct 3, 2026
0eb01d4
Fixed: a project at an unreachable version refused by its version
JakimPL Oct 3, 2026
92113f6
Fixed: leaving where no output device is offered
JakimPL Oct 3, 2026
053b1ae
Fixed: envelope bars and stepper buttons answering a press that began…
JakimPL Oct 3, 2026
45935c2
Fixed: saving a project opened at start to its own file
JakimPL Oct 3, 2026
d730f66
Fixed: leaving with a Display size never confirmed
JakimPL Oct 3, 2026
92521d1
Fixed: a Keyboard settings row reading as listening after the reassig…
JakimPL Oct 3, 2026
1b25ccf
Fixed: a box clicked in the Converter list picks its row
JakimPL Oct 3, 2026
10175c2
Fixed: General settings filling its row while Advanced settings is pu…
JakimPL Oct 3, 2026
3b302be
Fixed: the Playback menu missing the song's transitions
JakimPL Oct 3, 2026
60ff7c7
Fixed: a run writing every reconstruction into the folder Destination…
JakimPL Oct 3, 2026
d481092
Fixed: two closes before the first is answered asking twice
JakimPL Oct 3, 2026
014a8f1
Fixed: a library folder pointed away from and back keeping its librar…
JakimPL Oct 3, 2026
85db526
Fixed: new voices reaching a pool with no project open
JakimPL Oct 3, 2026
d5c193e
Fixed: history lines naming a renamed or moved voice one way
JakimPL Oct 3, 2026
c851a51
Fixed: hovering a row that a rebuild removed
JakimPL Oct 3, 2026
00764bb
Fixed: a reconstruction whose file was removed explaining its locked …
JakimPL Oct 3, 2026
3948aea
Halved: screen workers on CI
JakimPL Oct 3, 2026
cc41926
Decoupled: screen gestures and waits from frame time
JakimPL Oct 3, 2026
42061e4
Merged: tests into bugfixes
JakimPL Oct 3, 2026
aef178a
Fixed: a missing recording leaving the reconstruction alone on the wa…
JakimPL Oct 3, 2026
933c488
Merged: bugfixes into bugfixes-main
JakimPL Oct 3, 2026
bfd8b22
Fixed: held callbacks reading rows a rebuild took away
JakimPL Oct 3, 2026
90a6e95
Fixed: a folder read outliving the exit and a folder asked for during…
JakimPL Oct 3, 2026
c922a3e
Merged: bugfixes into bugfixes-lifecycle
JakimPL Oct 3, 2026
7748933
Rewrote: the import-with-no-project scenario for the greyed pool entries
JakimPL Oct 3, 2026
82b83d6
Reworded: the lifecycle fixes' docstrings in positive terms
JakimPL Oct 3, 2026
185bd9f
Merged: bugfixes into bugfixes-sequencer
JakimPL Oct 3, 2026
b7a99c0
Merged: bugfixes-lifecycle into bugfixes
JakimPL Oct 3, 2026
4a29b0f
Merged: bugfixes-main into bugfixes
JakimPL Oct 3, 2026
e3938b9
Steadied: the Play-from-row scenario against the grid a playing song …
JakimPL Oct 3, 2026
ca64df1
Fixed: Export instrument in a two-tunings project failing with no mes…
JakimPL Oct 3, 2026
eb03911
Merged: bugfixes-sequencer into bugfixes
JakimPL Oct 3, 2026
8ca0fe0
Fixed: the song reporting its end while still holding the output
JakimPL Oct 3, 2026
3ac7eda
Fixed: Edit voice and the Converter's Load asking twice
JakimPL Oct 3, 2026
1dcbf36
Fixed: the exit running work left in its frame and losing the failure…
JakimPL Oct 3, 2026
eab23e0
Fixed: a file opened from the command line remembered by a relative path
JakimPL Oct 3, 2026
39da8b8
Fixed: a missed release holding the bar graph's press and a returning…
JakimPL Oct 3, 2026
908e0f0
Corrected: the docs and docstrings the review found out of step with …
JakimPL Oct 3, 2026
8b78474
Tightened: the leaving and kept-size cases to the buffer and the wind…
JakimPL Oct 3, 2026
4017e9b
Recorded: a rerun skipping a recording whose channels changed inside …
JakimPL Oct 3, 2026
75cb3ec
Fixed: the screen tier reading a double-click before its witness coun…
JakimPL Oct 3, 2026
094881b
Merge pull request #78 from JakimPL/tests
JakimPL Oct 3, 2026
f45bdfd
Merged: dev into bugfixes
JakimPL Oct 3, 2026
20f9b7c
Fixed: the screen tier's silent device playing through the sound serv…
JakimPL Oct 3, 2026
526f16b
Fixed: a folder read failing on a folder it may list but not enter, a…
JakimPL Oct 4, 2026
5da00bd
Fixed: a rerun skipping a recording whose channels changed, by writin…
JakimPL Oct 4, 2026
21d6cd5
Fixed: playing and applying Audio settings on a machine with no audio…
JakimPL Oct 4, 2026
e2eaf65
Fixed: Reconstruct file and Reconstruct directory converting at once …
JakimPL Oct 4, 2026
8a58519
Added: a tooltip on the greyed-out New instrument saying a project br…
JakimPL Oct 4, 2026
f023309
Fixed: Cancel in Display settings leaving a hand-sized window at the …
JakimPL Oct 4, 2026
33c2a50
Merged: bugfixes-device into bugfixes
JakimPL Oct 4, 2026
66f004e
Added: Alt+1 to Alt+4 as channel keys that answer while the digits ty…
JakimPL Oct 4, 2026
fce61bf
Fixed: the Display countdown leaving a hand-sized window at the neare…
JakimPL Oct 4, 2026
ed2b5bf
Removed: test helpers nothing calls, among them the screen tier's for…
JakimPL Oct 4, 2026
ddcfc62
Recorded: marking broken files in the browsers so fewer notices reach…
JakimPL Oct 4, 2026
f9ef08d
Fixed: a refused stream leaving the Playback menu on Pause and raisin…
JakimPL Oct 4, 2026
07b0dbf
Moved: screen scenario homes into a temporary folder, keeping a faile…
JakimPL Oct 4, 2026
09c79d6
Changed: a gesture asked for again while its question waits answering…
JakimPL Oct 4, 2026
19c40c4
Removed: the gates' ignore, with the reconstruction cases recording t…
JakimPL Oct 4, 2026
9349829
Fixed: library folders left behind keeping their libraries in memory
JakimPL Oct 4, 2026
e409fd6
Changed: the channel aliases to Ctrl+1 to Ctrl+4, with a text field k…
JakimPL Oct 4, 2026
edb9fdb
Fixed: the converter hashing its settings once per recording on every…
JakimPL Oct 4, 2026
e0348c0
Fixed: a run left with one job naming the folder in its status line
JakimPL Oct 4, 2026
06c495e
Fixed: a raise after an answer or a wait stranding a gesture's conver…
JakimPL Oct 4, 2026
b154964
Changed: every way of listing recordings refusing only during a conve…
JakimPL Oct 4, 2026
f211f85
Fixed: a folder listing only its names reading as one with no recordings
JakimPL Oct 4, 2026
ff63db0
Corrected: guide passages and docstrings that drifted from what the c…
JakimPL Oct 4, 2026
6c11ebf
Changed: the keybindings editor keeping every key of an action, a pre…
JakimPL Oct 4, 2026
2117219
Fixed: a stepper hold outliving a release made outside the window, sh…
JakimPL Oct 4, 2026
95785ba
Changed: the no-project notice naming voices for every gesture that a…
JakimPL Oct 4, 2026
e554a91
Merged: followups-converter into bugfixes
JakimPL Oct 4, 2026
8e3dd0f
Merged: followups-keys into bugfixes
JakimPL Oct 4, 2026
8e023b0
Fixed: a question that waited for the screen asking about what the an…
JakimPL Oct 4, 2026
bd67884
Fixed: a song on a stream the device refuses ending silently, with th…
JakimPL Oct 4, 2026
4a916e3
Fixed: a playback worker outliving its stop wiping or doubling the pl…
JakimPL Oct 4, 2026
ed57141
Removed: an exit case that exercised the callback queue alone, which …
JakimPL Oct 4, 2026
db48291
Fixed: the playback ownership table naming the guarded player as the …
JakimPL Oct 4, 2026
1e21993
Fixed: screen scenario homes stranded by a locked folder or a crashed…
JakimPL Oct 4, 2026
3498fd4
Merged: followups-questions into bugfixes
JakimPL Oct 4, 2026
52b9813
Fixed: a library folder loading on the way back a library the reader …
JakimPL Oct 4, 2026
ec51208
Fixed: a library folder reached again showing a version error where L…
JakimPL Oct 4, 2026
41f25a3
Fixed: library notices and confirmations naming a linked folder's tar…
JakimPL Oct 4, 2026
402014d
Fixed: a question that fails as it reaches the free screen leaving it…
JakimPL Oct 4, 2026
8047fc1
Fixed: a modal asked for in the frame after a failing turn jumping th…
JakimPL Oct 4, 2026
3c68a7c
Fixed: number fields keeping Alt chords they can't type, which blocke…
JakimPL Oct 4, 2026
5481bbc
Fixed: a stale keybinding override dropping the reassignments stored …
JakimPL Oct 4, 2026
a9a19da
Fixed: the keybindings editor keeping a key named twice, refusing a t…
JakimPL Oct 4, 2026
e917ecd
Changed: the guards waiting for the screen through the dialogs render…
JakimPL Oct 4, 2026
8e863b5
Moved: listing what a Reconstruct names and remembering its folder in…
JakimPL Oct 4, 2026
1d64f1a
Fixed: the exit leaving with a project a standing dialog left unsaved…
JakimPL Oct 4, 2026
7059b24
Corrected: docstrings and the stems document naming a missing accesso…
JakimPL Oct 4, 2026
9b3389b
Fixed: a playback worker a stop let go of reporting a late refusal wh…
JakimPL Oct 4, 2026
65577d3
Fixed: a device failing a write or a stop mid-playback escaping the p…
JakimPL Oct 4, 2026
7910571
Fixed: the audio backend torn down under a playback worker a stop let…
JakimPL Oct 4, 2026
514d000
Merged: sideeffects-keys into bugfixes
JakimPL Oct 4, 2026
f9f7c30
Fixed: a playback refused at its start opening with other words than …
JakimPL Oct 4, 2026
9bd09bb
Fixed: the modal line's description saying a window asked for again k…
JakimPL Oct 4, 2026
737fd48
Fixed: the screen tier's stale homes sweep reading every worker gone …
JakimPL Oct 4, 2026
39c0ee5
Merged: sideeffects-playback into bugfixes
JakimPL Oct 4, 2026
bc14d69
Fixed: the screen tier's scroll into view measuring a row before a fr…
JakimPL Oct 4, 2026
9e5e87a
Merge pull request #79 from JakimPL/bugfixes
JakimPL Oct 4, 2026
ee10119
Fixed: the converter's status lines and stage names reading the langu…
JakimPL Oct 4, 2026
63a1b2e
Renamed: the tabs' busy-state nudges to follow_busy_state
JakimPL Oct 4, 2026
a954135
Added: the axiom that white and dark noise sound on the noise channel…
JakimPL Oct 4, 2026
7ccfdc2
Reworked: the bugs and to-dos ledger to the entries still owed
JakimPL Oct 4, 2026
b40461b
Reworded: the ledger entries a cold read found unclear
JakimPL Oct 4, 2026
50dbc2b
Merge pull request #80 from JakimPL/ledger
JakimPL Oct 5, 2026
0d48884
Stated: the speed-clock tempo in every Bitphase song
JakimPL Oct 5, 2026
2725d20
Reached: the longest timer with a Bitphase bend
JakimPL Oct 5, 2026
853fdfe
Merge pull request #81 from JakimPL/bitphase
JakimPL Oct 5, 2026
ba927b9
Lowered: the constant-Q floor to the triangle's lowest note
JakimPL Oct 5, 2026
13ff265
Muted: a pulse below timer 8, as the sweep unit does
JakimPL Oct 5, 2026
4ae402c
Updated: documentations
JakimPL Oct 5, 2026
851e9a4
Restated: the bend confidence levels on the features' scale
JakimPL Oct 5, 2026
9f9a3f8
Rested: a triangle below divider 2 at the middle of its wave
JakimPL Oct 5, 2026
62727b9
Left out: a harmonic another voice sounds a bin away
JakimPL Oct 5, 2026
b4c450c
Guided: a high note's reading by a short-lag phase
JakimPL Oct 5, 2026
957366a
Settled: each note's bend on its own
JakimPL Oct 5, 2026
9470c86
Lowered: the bend confidence threshold to 0.10
JakimPL Oct 5, 2026
50a4aa1
Recorded: why a quiet triangle bass is left out
JakimPL Oct 5, 2026
f7bedf5
Restated: the refinement's change weight as what remains to calibrate
JakimPL Oct 5, 2026
e76e122
Minor improvements
JakimPL Oct 6, 2026
e426a5b
Merge pull request #82 from JakimPL/nes
JakimPL Oct 6, 2026
c1e0ce0
Measured: instrument sizes over whole envelopes
JakimPL Oct 6, 2026
2f55769
Labeled: size figures as uncompressed
JakimPL Oct 6, 2026
841139c
Updated: image
JakimPL Oct 6, 2026
7b619f7
Updated: displayed image size
JakimPL Oct 6, 2026
04faa17
Merge pull request #83 from JakimPL/improvements
JakimPL Oct 6, 2026
b2bfaa6
Minor improvements
JakimPL Oct 7, 2026
ef9b43e
Renamed: checkout Bitphase parameter
JakimPL Oct 7, 2026
f61e545
Relaxed: testing gates
JakimPL Oct 7, 2026
ab05130
Merge pull request #84 from JakimPL/release
JakimPL Oct 7, 2026
0f0793d
Stored: a row's pitch as the note or the step it was written as
JakimPL Oct 7, 2026
3c73b2c
Reported: instrument cells a shared FamiTracker pattern reaches after…
JakimPL Oct 7, 2026
f55a1a2
Typed: a note or a step into any pitch cell, digits typing the step
JakimPL Oct 7, 2026
108a420
Marked: the voice a typed pitch places, kept while the grid has the c…
JakimPL Oct 7, 2026
df78672
Described: the hovered tracker slot on the status bar
JakimPL Oct 7, 2026
777f991
Reproduced: a broken reconstruction failing silently at every Add and…
JakimPL Oct 7, 2026
d6ea4ae
Audited: every history step against a model of its rules and the stat…
JakimPL Oct 7, 2026
765d165
Reported: every failure no coordinator catches in the error dialog
JakimPL Oct 7, 2026
2b95208
Rolled back: a gesture that fails midway
JakimPL Oct 7, 2026
6520c47
Undone: every gesture alone through the headless application, a store…
JakimPL Oct 7, 2026
cbad3f6
Combined: every pair of history actions, edits landing late, and long…
JakimPL Oct 7, 2026
b3cc865
Kept: the latest-wins worker serving after a task fails
JakimPL Oct 7, 2026
47d57cd
Deferred: what a gesture does outside the project until it lands
JakimPL Oct 7, 2026
b0e97ed
Dropped: the hand-written adjective from instruments
JakimPL Oct 7, 2026
4ac61b5
Screened: history on both tabs, a jump held behind an edit, and undos…
JakimPL Oct 7, 2026
a3b4b63
Merge branch 'dev' into tracker
JakimPL Oct 7, 2026
9bd783e
Shared: every channel and recording an edit leaves alone, each distin…
JakimPL Oct 7, 2026
64d3b04
Rendered: reconstruction audio into a bounded cache keyed by the stre…
JakimPL Oct 7, 2026
acc6a46
Froze: the reconstruction and every part under it as tuples, stored b…
JakimPL Oct 7, 2026
1ab2028
Read: the rows of the song around the shown frame
JakimPL Oct 7, 2026
5cc3602
Shared: patterns and every value a snapshot holds, shells copied arou…
JakimPL Oct 7, 2026
99e4ba7
Drawn: the neighboring frames' rows around the shown frame
JakimPL Oct 7, 2026
fa23063
Measured: what a history entry holds and costs to land, documented as…
JakimPL Oct 7, 2026
20950ed
Centered: the followed row, with the neighboring frames around it
JakimPL Oct 7, 2026
554af79
Merge branch 'cursor' into history
JakimPL Oct 8, 2026
5b04d7f
Confined: the dialog's frame loop to the thread drawing the frames
JakimPL Oct 8, 2026
8909976
Trimmed: the guide to what a newcomer needs
JakimPL Oct 8, 2026
8d6df0c
Trimmed: the tools pages to what someone running them needs
JakimPL Oct 8, 2026
d7e969f
Trimmed: the reference and concept pages, with three factual errors c…
JakimPL Oct 8, 2026
dbade24
Fixed: the ledger asks, and one owner for the driver binary rule
JakimPL Oct 8, 2026
2c01682
Added: a display setting that hides the frame-rate reading
JakimPL Oct 8, 2026
14899cb
Moved: the screen driver into an automation unit of its own
JakimPL Oct 8, 2026
92963e0
Moved: the icon suite into the assets unit
JakimPL Oct 8, 2026
44c7b75
Added: the demo tree made from packaged specifications
JakimPL Oct 8, 2026
c56b7cb
Added: the pictures maker drawing the README from the demo tree
JakimPL Oct 8, 2026
8d75331
Added: pictures of the application to the guide
JakimPL Oct 8, 2026
4fa95b6
Fixed: the callback queue carrying a test's late work into the next test
JakimPL Oct 9, 2026
fde42fd
Fixed: the scenario process's temporary folder breaking conversions o…
JakimPL Oct 9, 2026
62a510f
Moved: the screen scenarios into a CI job of their own
JakimPL Oct 9, 2026
05d3dbe
Merge pull request #89 from JakimPL/documentation
JakimPL Oct 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
56 changes: 48 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
enable-cache: true

- name: Install system libraries
run: bash scripts/linux/build/dependencies.sh
run: python3 scripts/system_dependencies.py

- name: Install the development environment
run: uv sync --group dev
Expand All @@ -52,6 +52,8 @@ jobs:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
python: ["3.12", "3.13"]
env:
PYTHON: ${{ matrix.os == 'windows-latest' && 'python' || 'python3' }}
steps:
- uses: actions/checkout@v7

Expand All @@ -63,19 +65,57 @@ jobs:

- name: Install system libraries (Linux)
if: runner.os == 'Linux'
run: bash scripts/linux/build/dependencies.sh
run: python3 scripts/system_dependencies.py

- name: Install system libraries (macOS)
if: runner.os == 'macOS'
run: |
bash scripts/macos/build/dependencies.sh
bash scripts/macos/build/build_env.sh >> "$GITHUB_ENV"
python3 scripts/system_dependencies.py
python3 scripts/build_environment.py >> "$GITHUB_ENV"

- name: Install the development environment
id: environment
run: uv sync --group dev

- name: Run doctests
run: uv run python -m pytest src/ --doctest-modules --no-cov
- name: Run the doctests
shell: bash
run: $PYTHON scripts/run_tests.py doctests

- name: Run the unit and integration suites with coverage
run: uv run python -m pytest -n auto --cov
- name: Run the test suite with coverage
if: ${{ !cancelled() && steps.environment.outcome == 'success' }}
shell: bash
run: $PYTHON scripts/run_tests.py suite --workers auto

screens:
name: Screen scenarios (part ${{ matrix.shard }} of 3, py${{ matrix.python }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python: ["3.12", "3.13"]
shard: [1, 2, 3]
steps:
- uses: actions/checkout@v7

- name: Install uv
uses: astral-sh/setup-uv@v9.0.0
with:
python-version: ${{ matrix.python }}
enable-cache: true

- name: Install system libraries
run: python3 scripts/system_dependencies.py

- name: Install the development environment
run: uv sync --group dev

- name: Run this part of the screen scenarios
id: screens
run: python3 scripts/run_tests.py screens --screen-workers 2 --shard ${{ matrix.shard }}/3

- name: Keep what the failed screen scenarios left
if: ${{ failure() && steps.screens.outcome == 'failure' }}
uses: actions/upload-artifact@v7
with:
name: screens-py${{ matrix.python }}-part-${{ matrix.shard }}
path: build/screens/
49 changes: 18 additions & 31 deletions .github/workflows/workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,7 @@ jobs:

- name: Verify tag matches project version
if: startsWith(github.ref, 'refs/tags/v')
run: |
python3 scripts/ci/checks/version_tag.py \
--tag "$GITHUB_REF_NAME" \
--project-version "$(uv version --short)"
run: python3 scripts/verify_version_tag.py --tag "$GITHUB_REF_NAME"

- name: Build sdist and wheel
run: uv build
Expand Down Expand Up @@ -78,19 +75,28 @@ jobs:
- name: Install PortAudio (macOS)
if: runner.os == 'macOS'
run: |
bash repository/scripts/macos/build/dependencies.sh
bash repository/scripts/macos/build/build_env.sh >> "$GITHUB_ENV"
python3 repository/scripts/system_dependencies.py
python3 repository/scripts/build_environment.py >> "$GITHUB_ENV"

- name: Install the wheel and check the entry point
shell: bash
run: |
python -m pip install --upgrade pip
python -m pip install dist/*.whl
sampletones --version
sampletones --help

- name: Check the wheel carries every resource it needs at startup
shell: bash
run: sampletones --self-check
run: sampletones self-check

- name: Check a developer command refuses to run outside a checkout
shell: bash
run: |
if refusal=$(sampletones check import-boundary --all 2>&1); then
exit 1
fi
grep "runs from a checkout" <<< "$refusal"

bundle:
name: Standalone bundle (${{ matrix.platform }})
Expand All @@ -114,38 +120,19 @@ jobs:

- name: Install system libraries (Linux)
if: runner.os == 'Linux'
run: bash scripts/linux/build/dependencies.sh
run: python scripts/system_dependencies.py

- name: Create the build environment the bundle scripts expect
- name: Build the bundle
shell: bash
run: |
python -m venv .venv-build
if [ "$RUNNER_OS" = "Windows" ]; then
venv_python=.venv-build/Scripts/python.exe
else
venv_python=.venv-build/bin/python
fi
"$venv_python" -m pip install --upgrade pip
"$venv_python" -m pip install ".[build]" --group assets

- name: Build the bundle (Linux)
if: runner.os == 'Linux'
run: bash scripts/linux/build/build.sh --release

- name: Build the bundle (Windows)
if: runner.os == 'Windows'
shell: cmd
run: scripts\windows\build\build.bat --release
run: python scripts/bundle.py --release

- name: Check the bundle runs and carries its notices
shell: bash
run: python scripts/ci/checks/bundle.py bin/sampletones
run: python scripts/verify_bundle.py

- name: Zip the bundle
shell: bash
run: |
name="sampletones-${GITHUB_REF_NAME}-${{ matrix.platform }}"
python scripts/ci/zip_bundle.py bin/sampletones "bundles/${name}.zip" --root "${name}"
run: python scripts/archive_bundle.py --label "${{ matrix.platform }}"

- uses: actions/upload-artifact@v7
with:
Expand Down
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,17 @@ __pycache__/
.venv/
.venv-build/
.vscode/
.worktrees/

dist/
wheels/
/bin/
/build/
/bundles/

sampletones
!src/sampletones
!tests/sampletones
!tests/unit/sampletones

*.pyc
*.pyo
Expand Down Expand Up @@ -49,3 +51,6 @@ sampletones
*.exe
*.dll
*.so

!tests/data/compatibility/**/*.ins
!tests/data/compatibility/**/*.stn
72 changes: 39 additions & 33 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,80 +33,86 @@ repos:

- repo: local
hooks:
- id: mypy
name: mypy
entry: uv run mypy
language: system
types: [python]
verbose: True
require_serial: true
exclude: ^(tests/)

- id: pylint
name: pylint
entry: uv run pylint
language: system
types: [python]
verbose: True
require_serial: true
exclude: ^(tests/)

- id: import-boundary
name: import boundary
entry: uv run scripts/checks/import_boundary.py --all
entry: uv run sampletones check import-boundary --all
language: system
types: [python]
pass_filenames: false
verbose: true

- id: unused-tags
name: unused tags
entry: uv run scripts/checks/unused_tags.py
entry: uv run sampletones check unused-tags
language: system
types: [python]
pass_filenames: false
verbose: true

- id: rendered-literals
name: rendered literals
entry: uv run sampletones check rendered-literals
language: system
files: ^tests/.*\.py$
pass_filenames: false
verbose: true

- id: tag-names
name: tag names
entry: uv run scripts/checks/tag_names.py --all
entry: uv run sampletones check tag-names --all
language: system
types: [python]
pass_filenames: false
verbose: true

- id: palette-colors
name: palette colors
entry: uv run scripts/checks/palette_colors.py
entry: uv run sampletones check palette-colors
language: system
files: (^src/sampletones_application/.*\.py|^src/sampletones_config/.*\.yaml)$
pass_filenames: false
verbose: true

- id: language-keys
name: language keys
entry: uv run scripts/checks/language_keys.py
entry: uv run sampletones check language-keys
language: system
files: (\.py|^src/sampletones_config/lang/.*\.yaml)$
pass_filenames: false
verbose: true

- id: mypy
name: mypy
entry: uv run mypy
language: system
types: [python]
verbose: True
require_serial: true
exclude: ^(tests/)

- id: pylint
name: pylint
entry: uv run pylint
- id: shortcut-actions
name: shortcut actions
entry: uv run sampletones check shortcut-actions
language: system
types: [python]
verbose: True
require_serial: true
exclude: ^(tests/)
files: (\.py|^src/sampletones_config/keybindings/.*\.yaml)$
pass_filenames: false
verbose: true

- id: icons
name: icons
entry: uv run python scripts/assets/icons.py
entry: uv run python -m assets.icons
language: system
files: ^src/sampletones_assets/(icons|mark)/
files: ^(src/sampletones_assets/icons|assets/icons)/
pass_filenames: false
verbose: true
stages:
- pre-push

- id: pytest
name: pytest
entry: make test
language: system
types:
- python
stages:
- pre-push
pass_filenames: false
Loading
Loading