1
0
Fork 0
mirror of https://github.com/imjasonh/nescript synced 2026-07-10 17:52:51 +00:00
nescript/tests/emulator/goldens
Claude 9878b7d87d
audio: per-frame pitch envelopes for pulse SFX
Pulse-channel sfx with a multi-byte `pitch:` array used to silently
ignore everything past the first byte — the runtime audio tick
latched the period at trigger time and never updated it. Programs
that wanted a frequency sweep had no way to express it.

The compiler now compiles a per-frame pitch envelope blob alongside
the existing volume envelope when `decl.pitch` has more than one
distinct value. The blob is padded (or truncated) to the volume
envelope's length and ends in a zero sentinel so the runtime
walker stops both pointers on the same NMI. Sfx with a single
scalar pitch (or an array where every byte is the same) keep their
historical "no pitch blob, latch once" path and emit byte-identical
ROM bytes.

The runtime gains two new pieces, both gated on a new
`__sfx_pitch_used` codegen marker so programs without varying-pitch
sfx pay zero bytes:

1. `gen_audio_tick` emits a per-frame pitch update block inside
   the SFX tick: read a byte through `(AUDIO_SFX_PITCH_PTR),Y`,
   write it to `$4002` (pulse-1 period low), advance the pointer.
   The block bails on a zero high-byte pointer so a single
   program can mix scalar-pitch and varying-pitch sfx without
   one clobbering the other.

2. `emit_play_pulse` seeds `AUDIO_SFX_PITCH_PTR_LO/HI` with the
   pitch-blob label for varying-pitch sfx and zeros it for
   scalar-pitch sfx. The per-call branch is skipped entirely
   when the program has no varying-pitch sfx anywhere.

The new `examples/sfx_pitch_envelope.ne` exercises the path with
a 16-frame siren sweep. Triangle and noise per-frame pitch are
deferred — they share the same data shape but the runtime ticks
for those channels still write only their volume registers, see
docs/future-work.md for the gap.

https://claude.ai/code/session_01KEczoNUX3WmcFLfq6iAQxB
2026-04-15 02:54:56 +00:00
..
arrays_and_functions.audio.hash tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
arrays_and_functions.png tests/emulator: byte-exact golden-image diffs 2026-04-12 21:30:18 +00:00
audio_demo.audio.hash platformer: end-to-end side-scroller demo + three runtime bug fixes 2026-04-13 13:04:26 +00:00
audio_demo.png tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
bitwise_ops.audio.hash tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
bitwise_ops.png tests/emulator: byte-exact golden-image diffs 2026-04-12 21:30:18 +00:00
bouncing_ball.audio.hash tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
bouncing_ball.png tests/emulator: byte-exact golden-image diffs 2026-04-12 21:30:18 +00:00
coin_cavern.audio.hash tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
coin_cavern.png tests/emulator: byte-exact golden-image diffs 2026-04-12 21:30:18 +00:00
comparisons.audio.hash tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
comparisons.png tests/emulator: byte-exact golden-image diffs 2026-04-12 21:30:18 +00:00
friendly_assets.audio.hash language: pleasant asset syntax for palettes, CHR, bg, sfx, music 2026-04-13 16:09:53 +00:00
friendly_assets.png language: pleasant asset syntax for palettes, CHR, bg, sfx, music 2026-04-13 16:09:53 +00:00
function_chain.audio.hash tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
function_chain.png tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
hello_sprite.audio.hash tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
hello_sprite.png tests/emulator: byte-exact golden-image diffs 2026-04-12 21:30:18 +00:00
inline_asm_demo.audio.hash tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
inline_asm_demo.png tests/emulator: byte-exact golden-image diffs 2026-04-12 21:30:18 +00:00
logic_ops.audio.hash tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
logic_ops.png tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
loop_break_continue.audio.hash tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
loop_break_continue.png tests/emulator: byte-exact golden-image diffs 2026-04-12 21:30:18 +00:00
match_demo.audio.hash tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
match_demo.png tests/emulator: byte-exact golden-image diffs 2026-04-12 21:30:18 +00:00
mmc1_banked.audio.hash tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
mmc1_banked.png tests/emulator: byte-exact golden-image diffs 2026-04-12 21:30:18 +00:00
mmc3_per_state_split.audio.hash main: write the real mapper byte into the iNES header 2026-04-13 01:27:42 +00:00
mmc3_per_state_split.png tests/emulator: byte-exact golden-image diffs 2026-04-12 21:30:18 +00:00
nested_structs.audio.hash analyzer/lowering: support nested struct fields and array struct fields 2026-04-15 02:19:49 +00:00
nested_structs.png analyzer/lowering: support nested struct fields and array struct fields 2026-04-15 02:19:49 +00:00
noise_triangle_sfx.audio.hash audio: always enable all four tone channels on sfx trigger 2026-04-14 12:09:46 +00:00
noise_triangle_sfx.png audio: triangle and noise sfx channels 2026-04-14 10:42:53 +00:00
palette_and_background.audio.hash palette/background: first-class declarations with reset-time load and runtime swaps 2026-04-13 11:11:33 +00:00
palette_and_background.png palette/background: first-class declarations with reset-time load and runtime swaps 2026-04-13 11:11:33 +00:00
platformer.audio.hash feat(platformer): add stomp-or-die enemy collisions, live HUD, GameOver state 2026-04-13 20:23:07 +00:00
platformer.png feat(platformer): add stomp-or-die enemy collisions, live HUD, GameOver state 2026-04-13 20:23:07 +00:00
scanline_split.audio.hash main: write the real mapper byte into the iNES header 2026-04-13 01:27:42 +00:00
scanline_split.png tests/emulator: byte-exact golden-image diffs 2026-04-12 21:30:18 +00:00
sfx_pitch_envelope.audio.hash audio: per-frame pitch envelopes for pulse SFX 2026-04-15 02:54:56 +00:00
sfx_pitch_envelope.png audio: per-frame pitch envelopes for pulse SFX 2026-04-15 02:54:56 +00:00
sprites_and_palettes.audio.hash tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
sprites_and_palettes.png tests/emulator: byte-exact golden-image diffs 2026-04-12 21:30:18 +00:00
state_machine.audio.hash tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
state_machine.png tests/emulator: byte-exact golden-image diffs 2026-04-12 21:30:18 +00:00
structs_enums_for.audio.hash tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
structs_enums_for.png tests/emulator: byte-exact golden-image diffs 2026-04-12 21:30:18 +00:00
two_player.audio.hash tests/emulator: record audio goldens alongside screenshots 2026-04-12 22:33:48 +00:00
two_player.png tests/emulator: byte-exact golden-image diffs 2026-04-12 21:30:18 +00:00
uxrom_banked.audio.hash examples: add uxrom_banked and jsnes golden 2026-04-13 02:04:25 +00:00
uxrom_banked.png examples: add uxrom_banked and jsnes golden 2026-04-13 02:04:25 +00:00
uxrom_banked_to_banked.audio.hash codegen: support banked → banked cross-bank function calls 2026-04-15 02:37:19 +00:00
uxrom_banked_to_banked.png codegen: support banked → banked cross-bank function calls 2026-04-15 02:37:19 +00:00
uxrom_user_banked.audio.hash codegen: user code in switchable banks via cross-bank trampolines 2026-04-14 11:41:20 +00:00
uxrom_user_banked.png codegen: user code in switchable banks via cross-bank trampolines 2026-04-14 11:41:20 +00:00