Skip to content

CI validation: Omnichord AMY release R20260908T212305 - #16

Closed
linuxificator wants to merge 120 commits into
mainfrom
releases/amy_omnichord_R20260908T212305
Closed

linuxificator wants to merge 120 commits into
mainfrom
releases/amy_omnichord_R20260908T212305

Conversation

@linuxificator

Copy link
Copy Markdown
Owner

Temporary fork-internal CI validation PR for the release branch. Do not merge; it will be closed after the platform matrix completes.

linuxificator and others added 30 commits August 22, 2026 23:11
Add a fixed-size AF_UNIX/SOCK_SEQPACKET transport for local AMY wire messages, including peer credential checks, bounded queueing, cleanup safeguards, standalone regression tests, and focused CI.
Add a generic Android AAR service that renders AMY through Oboe/AAudio and accepts ordinary AMY wire packets over the private Unix transport. Include the minimal C-scale hello-world app plus Android build and emulator integration CI.
Document the generic Android AAR, Oboe backend, private SOCK_SEQPACKET client contract, readiness semantics, build requirements, and hello-world example.
Measure the raw AMY render stream and exact signed-16-bit buffer handed to Oboe during the Android hello-world integration test. Retain both WAVs and level statistics in CI, require byte-for-byte AMY-to-Oboe identity, healthy peak level, and no full-scale clipping.

Use AMY V10.0 for the audible hello-world. AMY's V control is a 0..10 bus/master scale and the final mixer applies a 0.1 factor, so the previous V2.0 setting was only 20% linear gain (about -14 dB relative to V10.0).

Validated at -2.721 dBFS peak with zero clipping and zero AMY-to-Oboe sample differences in Android AMY run 32630088165.
Make the Java hello-world a transport-only client. MainActivity no longer imports or starts AmyService and no longer loads a JNI/native client library. It uses Android LocalSocket SOCK_SEQPACKET directly and sends only ordinary AMY wire packets to filesDir/amy.sock.

Move service startup to an AAR-owned ContentProvider lifecycle hook, remove the hello-world C++/CMake client wrapper, and move test-only audio capture arming into CI so the example remains free of service/test control logic.
Add a fixed-size AF_UNIX/SOCK_SEQPACKET transport for local AMY wire messages, including peer credential checks, bounded queueing, cleanup safeguards, standalone regression tests, and focused CI.
amy.h defined the block size unconditionally -- 256, or 128 under
AMY_DAISY -- so a host could not ask for anything else without editing
the header. tulip5 wants 128 and 64 on the ESP32-P4 for lower latency
(the P4's CPU is thought to have the headroom; the S3's does not), and
its only route was a patched shadow of amy/src.

Now `-DAMY_BLOCK_SIZE=128` is honoured: the default sits behind
`#ifndef`, BLOCK_SIZE_BITS is derived from it, and a size that is not a
power of two from 32 to 1024 is an #error. Built with nothing passed,
the result is byte-identical to before -- 256, and 128 on Daisy.

BLOCK_SIZE_BITS is derived as an expression rather than one literal per
size on purpose: `make amy/constants.py` greps every numeric #define
out of this header and the last one would win, so a ladder of literals
would have reported BLOCK_SIZE_BITS=10 to Python and the generated JS.
The expression is skipped by that grep and the two literals above it
still report the default.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
dpwe's review: a host should choose the block in BITS, with the size
(1 << BLOCK_SIZE_BITS), because asking in bits is what says the block
has to be a power of two. Checked against the code and it does: every
use of BLOCK_SIZE_BITS is a shift -- the per-block amplitude ramps in
oscillators.c and the pan ramp in amy.c -- so a block that was not a
power of two would ramp to the wrong place with no error.

So -DBLOCK_SIZE_BITS=7 is the override, 5..10 is #error'd outside, and
AMY_BLOCK_SIZE is (1 << BLOCK_SIZE_BITS). Built with nothing passed it
is 8 (256), or 7 (128) on Daisy, as before.

The special case is amy/constants.py: it is a grep of the NUMERIC
#defines in amy.h, so a derived AMY_BLOCK_SIZE dropped out of it and
with it out of amy.render() and the generated JS API. The Makefile rule
now appends AMY_BLOCK_SIZE computed from the BLOCK_SIZE_BITS that
landed; constants.py and amy_api.generated.js are regenerated (the JS
diff is the one key moving to the end).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Jeroen Vriesman and others added 28 commits September 7, 2026 18:09
BLOCK_SIZE_BITS can be chosen at compile time
# Conflicts:
#	amy/constants.py
#	src/amy.h
@linuxificator

Copy link
Copy Markdown
Owner Author

Validation complete: the full AMY regression matrix and the standalone Linux/macOS/Windows Godot addon build passed for this release commit. Closing this CI-only PR without merging; the release branch remains available.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants