# The cases of the HLE DSP source oracle (N3-02): tools/native/dsp_oracle/dsp_oracle.py runs each of them
# against Azahar's own Source and writes native/tests/dsp_hle_expected.inc; native/tests/dsp_hle_test.cpp
# plays the same cases on mh4n::dsp_hle::Source and compares every frame. The format is in the script's
# docstring and docs/native/dsp.md. Every case is 200 frames unless it says otherwise; the audio is made by
# seeded generators (nothing of any game). Buffer ids are distinct inside a case (equal ids play in an order
# the standard library's heap decides). Addresses are in FCRAM, unless the case is about addresses.
#
# Sets of ADPCM coefficients used below (8 pairs, 11 fractional bits):
#   A: 0 0  2048 0  0 2048  1024 1024  4096 -2048  3584 -1536  3072 -1024  4608 -2560
#   B: 0 0  1024 0  512 512  1536 -512  2000 -800  100 100  -1024 0  700 300

# ---- every format, every interpolation mode, rate multipliers 0.25 to 4.0 ----
case pcm16_mono_${interp}_r${rate} sweep interp=none,linear,poly rate=0.25,0.5,1.0,1.37,2.9,4.0
mem 0x20000000 walk16 seed=11 bytes=20000
mem 0x20010000 walk16 seed=12 bytes=6000
mem 0x20008000 walk16 seed=13 bytes=6000
0 format pcm16 mono
0 interp ${interp}
0 rate ${rate}
0 gain 0 1.0 1.0 0.5 0.25
0 gain 1 0.5 0.25 0 0
0 gain 2 0 0 1.0 1.0
0 embedded addr=0x20000000 len=9000 id=3
0 queue 0 addr=0x20010000 len=2500 id=5
0 queue 1 addr=0x20010800 len=1001 id=4
0 enable 1
0 sync 7
30 sync 8
100 queue 2 addr=0x20008000 len=2900 id=9
100 enable 1
101 sync 9

case pcm16_stereo_${interp}_r${rate} sweep interp=none,linear,poly rate=0.5,1.37,2.9
mem 0x20000000 walk16 seed=21 bytes=32000
mem 0x20010000 walk16 seed=22 bytes=10000
mem 0x20008000 walk16 seed=23 bytes=10000
0 format pcm16 stereo
0 interp ${interp}
0 rate ${rate}
0 gain 0 1.0 1.0 0.5 0.25
0 gain 1 0.5 0.25 0 0
0 gain 2 0 0 1.0 1.0
0 embedded addr=0x20000000 len=7500 id=3
0 queue 0 addr=0x20010000 len=2400 id=5
0 queue 1 addr=0x20010800 len=1000 id=4
0 enable 1
0 sync 7
30 sync 8
100 queue 2 addr=0x20008000 len=2500 id=9
100 enable 1
101 sync 9

case pcm8_mono_${interp}_r${rate} sweep interp=none,linear,poly rate=0.5,1.37,2.9
mem 0x20000000 walk8 seed=31 bytes=9000
mem 0x20010000 walk8 seed=32 bytes=3000
mem 0x20008000 walk8 seed=33 bytes=3000
0 format pcm8 mono
0 interp ${interp}
0 rate ${rate}
0 gain 0 1.0 1.0 0.5 0.25
0 gain 1 0.5 0.25 0 0
0 gain 2 0 0 1.0 1.0
0 embedded addr=0x20000000 len=8999 id=3
0 queue 0 addr=0x20010000 len=2500 id=5
0 queue 1 addr=0x20010800 len=1001 id=4
0 enable 1
0 sync 7
30 sync 8
100 queue 2 addr=0x20008000 len=2900 id=9
100 enable 1
101 sync 9

case pcm8_stereo_${interp}_r${rate} sweep interp=none,linear,poly rate=0.5,1.37,2.9
mem 0x20000000 walk8 seed=41 bytes=16000
mem 0x20010000 walk8 seed=42 bytes=5000
mem 0x20008000 walk8 seed=43 bytes=5000
0 format pcm8 stereo
0 interp ${interp}
0 rate ${rate}
0 gain 0 1.0 1.0 0.5 0.25
0 gain 1 0.5 0.25 0 0
0 gain 2 0 0 1.0 1.0
0 embedded addr=0x20000000 len=7500 id=3
0 queue 0 addr=0x20010000 len=2400 id=5
0 queue 1 addr=0x20010800 len=1000 id=4
0 enable 1
0 sync 7
30 sync 8
100 queue 2 addr=0x20008000 len=2500 id=9
100 enable 1
101 sync 9

case adpcm_mono_${interp}_r${rate} sweep interp=none,linear,poly rate=0.5,1.37,2.9
mem 0x20000000 adpcm seed=51 bytes=5000
mem 0x20010000 adpcm seed=52 bytes=1800
mem 0x20008000 adpcm seed=53 bytes=1800
0 format adpcm mono
0 interp ${interp}
0 rate ${rate}
0 gain 0 1.0 1.0 0.5 0.25
0 gain 1 0.5 0.25 0 0
0 gain 2 0 0 1.0 1.0
0 coeffs 0 0 2048 0 0 2048 1024 1024 4096 -2048 3584 -1536 3072 -1024 4608 -2560
0 embedded addr=0x20000000 len=8999 id=3
0 queue 0 addr=0x20010000 len=2500 id=5
0 queue 1 addr=0x20010800 len=1001 id=4
0 enable 1
0 sync 7
30 sync 8
100 queue 2 addr=0x20008000 len=2899 id=9
100 enable 1
101 sync 9

# ---- loops ----
case loop_pcm16_mono
mem 0x20000000 walk16 seed=61 bytes=12000
0 format pcm16 mono
0 interp linear
0 rate 1.37
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=4000 id=1 loop
0 enable 1
0 sync 1

case loop_pcm16_stereo_poly
mem 0x20000000 walk16 seed=62 bytes=24000
0 format pcm16 stereo
0 interp poly
0 rate 0.77
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=3001 id=1 loop
0 enable 1

case loop_pcm8_mono_none
mem 0x20000000 walk8 seed=63 bytes=6000
0 format pcm8 mono
0 interp none
0 rate 2.3
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=1999 id=1 loop
0 enable 1

case loop_adpcm_mono
mem 0x20000000 adpcm seed=64 bytes=2000
0 format adpcm mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 coeffs 0 0 2048 0 0 2048 1024 1024 4096 -2048 3584 -1536 3072 -1024 4608 -2560
0 embedded addr=0x20000000 len=2800 id=1 loop adirty yn1=100 yn2=-200
0 enable 1

# a looping queued buffer plays for ever: the one behind it (higher id) never starts
case loop_queue_blocks_the_next
mem 0x20000000 walk16 seed=65 bytes=8000
mem 0x20004000 walk16 seed=66 bytes=8000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 queue 0 addr=0x20000000 len=1500 id=2 loop
0 queue 1 addr=0x20004000 len=2000 id=3
0 enable 1

# the loop is dropped from the queue by a partial reset, and a new buffer follows
case loop_then_partial_reset
mem 0x20000000 walk16 seed=67 bytes=8000
mem 0x20004000 walk16 seed=68 bytes=8000
0 format pcm16 mono
0 interp linear
0 rate 1.5
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=1200 id=2 loop
0 enable 1
60 partial_reset
60 queue 0 addr=0x20004000 len=2500 id=4
60 enable 1

# a looping PCM16 buffer is read again from memory every frame (its not yet consumed part)
case loop_pcm16_rewritten_in_memory
mem 0x20000000 walk16 seed=69 bytes=8000
0 format pcm16 mono
0 interp none
0 rate 0.5
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=2000 id=1 loop
0 enable 1
10 poke 0x20000400 7fff7fff7fff7fff8000800080008000
11 poke 0x20000800 0102030405060708090a0b0c0d0e0f10
50 poke 0x20000000 11111111222222223333333344444444
120 poke 0x20000c00 aaaaaaaabbbbbbbbccccccccdddddddd

# the same for PCM8 and ADPCM: they are not read again, a change in memory does not play
case loop_pcm8_rewritten_in_memory
mem 0x20000000 walk8 seed=70 bytes=4000
0 format pcm8 mono
0 interp none
0 rate 0.5
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=2000 id=1 loop
0 enable 1
10 poke 0x20000100 7f7f7f7f7f7f7f7f80808080


# ---- queues: ids out of order, enqueued over time, zero and tiny lengths ----
case ids_out_of_order
mem 0x20000000 walk16 seed=71 bytes=20000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 queue 0 addr=0x20000000 len=1000 id=7
0 queue 1 addr=0x20000800 len=900 id=2
0 queue 2 addr=0x20001000 len=800 id=5
0 queue 3 addr=0x20001800 len=700 id=3
0 enable 1
4 queue 0 addr=0x20002000 len=600 id=1
5 queue 1 addr=0x20002800 len=500 id=40000
20 queue 2 addr=0x20003000 len=400 id=6

# the embedded buffer is ordered by its id with the queue's
case embedded_among_queued
mem 0x20000000 walk16 seed=72 bytes=20000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=800 id=8
0 queue 0 addr=0x20000800 len=700 id=6
0 queue 1 addr=0x20001000 len=600 id=9
0 queue 2 addr=0x20001800 len=500 id=7
0 enable 1

case zero_and_tiny_lengths
mem 0x20000000 walk16 seed=73 bytes=8000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 queue 0 addr=0x20000000 len=0 id=1
0 queue 1 addr=0x20000100 len=1 id=2
0 queue 2 addr=0x20000200 len=2 id=3
0 queue 3 addr=0x20000300 len=3 id=4
0 enable 1
3 queue 0 addr=0x20000400 len=0 id=5
3 queue 1 addr=0x20000500 len=161 id=6
3 queue 2 addr=0x20000800 len=0 id=7
3 queue 3 addr=0x20000900 len=160 id=8
3 enable 1

case tiny_buffers_fast_rate
mem 0x20000000 walk16 seed=74 bytes=8000
0 format pcm16 mono
0 interp none
0 rate 4.0
0 gain 0 1.0 1.0 0 0
0 queue 0 addr=0x20000000 len=2 id=1
0 queue 1 addr=0x20000100 len=3 id=2
0 queue 2 addr=0x20000200 len=1 id=3
0 queue 3 addr=0x20000300 len=5 id=4
0 enable 1
2 queue 0 addr=0x20000400 len=7 id=5
2 queue 1 addr=0x20000500 len=2 id=6
2 enable 1

case adpcm_odd_lengths
mem 0x20000000 adpcm seed=75 bytes=2000
0 format adpcm mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 coeffs 0 0 1024 0 512 512 1536 -512 2000 -800 100 100 -1024 0 700 300
0 queue 0 addr=0x20000000 len=15 id=1
0 queue 1 addr=0x20000100 len=1 id=2
0 queue 2 addr=0x20000200 len=14 id=3
0 queue 3 addr=0x20000300 len=27 id=4
0 enable 1
2 queue 0 addr=0x20000400 len=29 id=5
2 queue 1 addr=0x20000500 len=3 id=6
2 enable 1

# the format and the channel count are latched when a buffer is enqueued (the frame it is read in)
case format_changes_between_buffers
mem 0x20000000 walk16 seed=76 bytes=8000
mem 0x20004000 walk8 seed=77 bytes=4000
mem 0x20006000 adpcm seed=78 bytes=1000
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 coeffs 0 0 2048 0 0 2048 1024 1024 4096 -2048 3584 -1536 3072 -1024 4608 -2560
0 format pcm16 stereo
0 queue 0 addr=0x20000000 len=1500 id=1
0 enable 1
2 format pcm8 stereo
2 queue 1 addr=0x20004000 len=1500 id=2
4 format adpcm mono
4 queue 2 addr=0x20006000 len=1000 id=3

# a format of 3 and a channel field of 0 or 3
case format_three_and_odd_channels
mem 0x20000000 walk16 seed=79 bytes=8000
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 format 3 mono
0 queue 0 addr=0x20000000 len=500 id=1
0 enable 1
1 format pcm16 3
1 queue 1 addr=0x20000000 len=500 id=2
2 format pcm16 0
2 queue 2 addr=0x20000000 len=500 id=3

# ---- the embedded buffer: play position, partial updates ----
case embedded_play_position
mem 0x20000000 walk16 seed=81 bytes=8000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=3000 id=1 pos=1234
0 enable 1
30 embedded addr=0x20000000 len=1000 id=2 pos=1000
30 enable 1
31 embedded addr=0x20000000 len=1000 id=3 pos=1
31 enable 1

case embedded_play_position_loop
mem 0x20000000 walk16 seed=82 bytes=8000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=1500 id=1 pos=700 loop
0 enable 1

case partial_update_pcm16_grow_shrink
mem 0x20000000 walk16 seed=83 bytes=16000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=2000 id=1
0 enable 1
5 partial len=4000
15 partial len=3500 loop
25 partial len=100
26 partial len=5000
27 enable 1
40 partial len=6000
50 partial len=0
51 partial len=7000
52 enable 1
80 partial len=7500 loop
120 partial len=2000

# a shrink below the play position sets the position back to 0
case partial_update_shrink_below_position
mem 0x20000000 walk16 seed=84 bytes=16000
0 format pcm16 mono
0 interp none
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=6000 id=1
0 enable 1
20 partial len=100
30 partial len=3000
31 enable 1
40 partial len=20
41 enable 1

case partial_update_stereo_and_rate
mem 0x20000000 walk16 seed=85 bytes=32000
0 format pcm16 stereo
0 interp poly
0 rate 1.5
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=3000 id=1
0 enable 1
10 partial len=5000
30 partial len=4500 loop
31 enable 1
60 partial len=6000
61 enable 1

# a partial update is ignored for PCM8 and ADPCM, and does not loop what is not looping
case partial_update_ignored_pcm8
mem 0x20000000 walk8 seed=86 bytes=9000
0 format pcm8 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=4000 id=1
0 enable 1
5 partial len=4000
15 partial len=100 loop

case partial_update_ignored_adpcm
mem 0x20000000 adpcm seed=87 bytes=2000
0 format adpcm mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 coeffs 0 0 2048 0 0 2048 1024 1024 4096 -2048 3584 -1536 3072 -1024 4608 -2560
0 embedded addr=0x20000000 len=3400 id=1
0 enable 1
5 partial len=4000
15 partial len=100 loop

# a partial update before any buffer was played, and after the source ran out
case partial_update_without_buffer
mem 0x20000000 walk16 seed=88 bytes=8000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 partial len=100
1 embedded addr=0x20000000 len=300 id=1
1 enable 1
3 partial len=900
100 partial len=300 loop
110 enable 1


# ---- ADPCM: coefficient changes, history ----
case adpcm_coefficient_changes
mem 0x20000000 adpcm seed=91 bytes=6000
0 format adpcm mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 coeffs 0 0 2048 0 0 2048 1024 1024 4096 -2048 3584 -1536 3072 -1024 4608 -2560
0 queue 0 addr=0x20000000 len=1400 id=1
0 queue 1 addr=0x20000800 len=1400 id=2
0 enable 1
20 coeffs 0 0 1024 0 512 512 1536 -512 2000 -800 100 100 -1024 0 700 300
20 queue 0 addr=0x20001000 len=1400 id=3
20 enable 1
21 queue 1 addr=0x20001800 len=1400 id=4
50 coeffs rand:5:3000
50 queue 2 addr=0x20002000 len=1400 id=5
50 enable 1
80 coeffs rand:6
80 queue 3 addr=0x20002800 len=1400 id=6
80 enable 1
110 coeffs 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
110 queue 0 addr=0x20003000 len=1400 id=7
110 enable 1

# the history (yn1, yn2) is taken from a buffer only when its dirty flag is set
case adpcm_history_dirty_flag
mem 0x20000000 adpcm seed=92 bytes=4000
0 format adpcm mono
0 interp none
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 coeffs 0 0 2048 0 0 2048 1024 1024 4096 -2048 3584 -1536 3072 -1024 4608 -2560
0 queue 0 addr=0x20000000 len=700 id=1 adirty yn1=1000 yn2=-1000
0 queue 1 addr=0x20000400 len=700 id=2 yn1=5000 yn2=5000
0 queue 2 addr=0x20000800 len=700 id=3 adirty yn1=-30000 yn2=30000
0 enable 1
12 queue 0 addr=0x20000c00 len=700 id=4 yn1=1 yn2=2
13 queue 1 addr=0x20001000 len=700 id=5 adirty yn1=65535 yn2=32768

# the ps of a buffer is never read
case adpcm_ps_is_ignored
mem 0x20000000 adpcm seed=93 bytes=4000
0 format adpcm mono
0 interp none
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 coeffs 0 0 2048 0 0 2048 1024 1024 4096 -2048 3584 -1536 3072 -1024 4608 -2560
0 queue 0 addr=0x20000000 len=700 id=1 ps=0x00ff
0 queue 1 addr=0x20000400 len=700 id=2 ps=0x0033
0 enable 1

# the coefficients of source 5 (the table has 24 rows)
case adpcm_source_five source=5
mem 0x20000000 adpcm seed=94 bytes=4000
0 format adpcm mono
0 interp linear
0 rate 1.2
0 gain 0 1.0 1.0 0 0
0 coeffs 0 0 1024 0 512 512 1536 -512 2000 -800 100 100 -1024 0 700 300
0 queue 0 addr=0x20000000 len=1500 id=1
0 enable 1

# ---- filters ----
case filter_simple
mem 0x20000000 walk16 seed=101 bytes=20000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=10000 id=1 loop
0 simple 0x4000 0x2000
0 filters 1 0
0 enable 1
50 simple 0x7fff 0x7000
100 simple 0x1000 -0x3000
150 simple -0x4000 0x0000

case filter_biquad
mem 0x20000000 walk16 seed=102 bytes=20000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=10000 id=1 loop
0 biquad 0x1000 0x2000 0x1000 0x2000 0x1000
0 filters 0 1
0 enable 1
60 biquad -0x1000 0x3000 0x0800 -0x0800 0x2000
120 biquad 0 0 0 0 0x4000

case filter_both
mem 0x20000000 walk16 seed=103 bytes=20000
0 format pcm16 stereo
0 interp poly
0 rate 0.8
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=5000 id=1
0 simple 0x6000 0x1000
0 biquad 0x0800 0x2400 0x2000 0x2000 0x1800
0 filters 1 1
0 enable 1

case filter_random_simple_${seed} sweep seed=1,2,3,4
mem 0x20000000 walk16 seed=104 bytes=20000
0 format pcm16 mono
0 interp linear
0 rate 1.1
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=10000 id=1 loop
0 simple rand:${seed}
0 filters 1 0
0 enable 1
80 simple rand:${seed}0

case filter_random_biquad_${seed} sweep seed=1,2,3,4
mem 0x20000000 walk16 seed=105 bytes=20000
0 format pcm16 mono
0 interp linear
0 rate 1.1
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=10000 id=1 loop
0 biquad rand:${seed}
0 filters 0 1
0 enable 1
80 biquad rand:${seed}0:9000

case filter_random_both_${seed} sweep seed=11,12
mem 0x20000000 walk16 seed=106 bytes=20000
0 format pcm16 mono
0 interp linear
0 rate 1.1
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=10000 id=1
0 simple rand:${seed}:20000
0 biquad rand:${seed}1:12000
0 filters 1 1
0 enable 1

# turning a filter off resets its coefficients and history: turning it on again does not bring them back
case filter_disable_resets
mem 0x20000000 walk16 seed=107 bytes=20000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=10000 id=1 loop
0 simple 0x2000 0x3000
0 biquad 0x1000 0x2000 0x1000 0x2000 0x1000
0 filters 1 1
0 enable 1
40 filters 0 1
80 filters 1 1
120 filters 0 0
160 filters 1 1

# the filters see the silent first frame and the end of the queue
case filter_with_short_buffers
mem 0x20000000 walk16 seed=108 bytes=8000
0 format pcm16 mono
0 interp none
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 simple 0x6000 0x3000
0 filters 1 0
0 queue 0 addr=0x20000000 len=250 id=1
0 queue 1 addr=0x20000800 len=90 id=2
0 enable 1
10 queue 0 addr=0x20001000 len=170 id=3
10 enable 1

# ---- gains: ramps, three mixes, a source that is off ----
case gain_ramps
mem 0x20000000 walk16 seed=111 bytes=20000
0 format pcm16 stereo
0 interp linear
0 rate 1.0
0 embedded addr=0x20000000 len=5000 id=1 loop
0 gain 0 1.0 0.0 0.5 0.25
0 gain 1 0.0 1.0 0.25 0.5
0 gain 2 0.3 0.3 0.3 0.3
0 enable 1
10 gain 0 0.0 1.0 0.25 0.5
11 gain 0 0.7 0.7 0.7 0.7
12 gain 1 1.0 1.0 1.0 1.0
30 gain 2 0.123 0.456 0.789 0.012
31 gain 2 0.123 0.456 0.789 0.012
60 gain 0 0.0 0.0 0.0 0.0
61 gain 0 1.0 1.0 1.0 1.0

# a gain written while the source is off takes effect without a ramp
case gain_while_disabled
mem 0x20000000 walk16 seed=112 bytes=20000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 embedded addr=0x20000000 len=9000 id=1 loop
0 gain 0 0.5 0.5 0.5 0.5
0 enable 1
20 enable 0
21 gain 0 1.0 1.0 1.0 1.0
22 gain 1 1.0 1.0 1.0 1.0
30 enable 1
50 enable 0
51 enable 1
52 gain 0 0.25 0.25 0.25 0.25

case gain_values_beyond_one
mem 0x20000000 walk16 seed=113 bytes=20000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 embedded addr=0x20000000 len=9000 id=1
0 gain 0 4.0 -1.0 0.0 100.0
0 gain 1 -0.5 2.5 1.0 1.0
0 enable 1
40 gain 0 -4.0 8.0 0.001 1.0

# ---- state: enable, sync, reset, partial reset, sleep and wakeup ----
case enable_toggles
mem 0x20000000 walk16 seed=121 bytes=20000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=9000 id=1 loop
0 enable 1
20 enable 0
40 enable 1
41 sync 3
60 enable 0
61 enable 1
80 enable 0
100 sync 9
120 enable 1

case sync_counts
mem 0x20000000 walk16 seed=122 bytes=20000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=500 id=1
0 sync 65535
0 enable 1
5 sync 0
6 sync 1234
30 sync 31
100 sync 44

case reset_mid_play
mem 0x20000000 walk16 seed=123 bytes=20000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=9000 id=1
0 enable 1
0 sync 5
30 reset
31 enable 1
32 format pcm16 mono
32 embedded addr=0x20000000 len=400 id=2
32 enable 1
60 reset
60 format pcm16 mono
60 interp none
60 rate 2.0
60 gain 0 1.0 1.0 0 0
60 embedded addr=0x20000000 len=1000 id=3
60 enable 1

case partial_reset_mid_play
mem 0x20000000 walk16 seed=124 bytes=20000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 queue 0 addr=0x20000000 len=1000 id=1
0 queue 1 addr=0x20000800 len=1000 id=2
0 queue 2 addr=0x20001000 len=1000 id=3
0 queue 3 addr=0x20001800 len=1000 id=4
0 enable 1
12 partial_reset
13 queue 0 addr=0x20002000 len=500 id=5

case sleep_and_wakeup
mem 0x20000000 walk16 seed=125 bytes=20000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 simple 0x6000 0x1000
0 filters 1 0
0 embedded addr=0x20000000 len=9000 id=1 loop
0 enable 1
30 sleep
31 reset
40 wakeup
80 sleep
90 wakeup
91 wakeup

# ---- rates ----
case rate_zero_and_negative
mem 0x20000000 walk16 seed=131 bytes=20000
0 format pcm16 mono
0 interp linear
0 rate 0.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=9000 id=1 loop
0 enable 1
40 rate -1.0
80 rate 0.5
120 rate -0.0
160 rate 3.0

case rate_extremes
mem 0x20000000 walk16 seed=132 bytes=40000
0 format pcm16 mono
0 interp linear
0 rate 0.001
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=19000 id=1 loop
0 enable 1
30 rate 0.0001
60 rate 16.0
90 rate 100.5
120 rate 1.0000001
150 rate 0.9999999
180 rate 7.77

case rate_changes_every_few_frames
mem 0x20000000 walk16 seed=133 bytes=40000
0 format pcm16 stereo
0 interp poly
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=9500 id=1 loop
0 enable 1
7 rate 1.3333334
13 rate 0.6666667
19 rate 2.5
25 rate 0.3
31 rate 1.7
37 rate 0.9
43 rate 3.3
49 rate 0.15

# ---- addresses ----
case address_unmapped_then_valid
mem 0x20000000 walk16 seed=141 bytes=8000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 queue 0 addr=0x00001000 len=500 id=1
0 queue 1 addr=0x20000000 len=500 id=2
0 queue 2 addr=0x1fffffff len=300 id=3
0 queue 3 addr=0x20000000 len=300 id=4
0 enable 1
5 queue 0 addr=0x00000000 len=100 id=5
5 queue 1 addr=0xffffffff len=100 id=6
5 enable 1

case address_low_bits_are_masked
mem 0x20000000 walk16 seed=142 bytes=8000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 queue 0 addr=0x20000003 len=400 id=1
0 queue 1 addr=0x20000402 len=400 id=2
0 queue 2 addr=0x20000801 len=400 id=3
0 enable 1

case address_area_ends
mem 0x20000000 walk16 seed=143 bytes=8000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 queue 0 addr=0x30000000 len=400 id=1
0 queue 1 addr=0x30000004 len=400 id=2
0 queue 2 addr=0x18600000 len=400 id=3
0 queue 3 addr=0x18600004 len=400 id=4
0 enable 1
4 queue 0 addr=0x1ff80000 len=300 id=5
4 queue 1 addr=0x1ff80004 len=300 id=6
4 queue 2 addr=0x1f400000 len=300 id=7
4 queue 3 addr=0x1f400004 len=300 id=8
4 enable 1

case address_other_areas_read_zeros
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 queue 0 addr=0x18000000 len=300 id=1
0 queue 1 addr=0x1ff00000 len=300 id=2
0 queue 2 addr=0x1f000000 len=300 id=3
0 queue 3 addr=0x2f000000 len=300 id=4
0 enable 1

case address_of_a_looping_buffer_invalid
mem 0x20000000 walk16 seed=144 bytes=8000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x00001000 len=500 id=1 loop
0 queue 0 addr=0x20000000 len=500 id=2
0 enable 1

# the buffer reads past what was placed: zeros
case buffer_longer_than_its_data
mem 0x203ff000 walk16 seed=145 bytes=4096
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 queue 0 addr=0x203ff000 len=3000 id=1
0 enable 1

# ---- loose ends ----
case loop_related_is_only_logged
mem 0x20000000 walk16 seed=151 bytes=8000
0 format pcm16 mono
0 interp linear
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=3000 id=1
0 loop_related 0x12345
0 enable 1
10 loop_related 0

case first_frame_after_enable_is_silent
mem 0x20000000 walk16 seed=152 bytes=8000
0 format pcm16 mono
0 interp none
0 rate 1.0
0 gain 0 1.0 1.0 1.0 1.0
0 embedded addr=0x20000000 len=9000 id=1
5 enable 1
30 enable 0
31 enable 1

case interpolation_changes
mem 0x20000000 walk16 seed=153 bytes=40000
0 format pcm16 mono
0 interp none
0 rate 1.37
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=19000 id=1 loop
0 enable 1
20 interp linear
40 interp poly
60 interp none
80 interp poly
100 interp linear

# ---- extreme coefficients: the 32-bit sums overflow in Azahar's C++ and wrap in its compiled code ----
case filter_extreme_simple
mem 0x20000000 noise seed=161 bytes=20000
0 format pcm16 stereo
0 interp none
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=5000 id=1 loop
0 simple -32768 -32768
0 filters 1 0
0 enable 1
40 simple 32767 32767
80 simple -32768 32767
120 simple 32767 -32768

# a pattern that overflows the simple filter's sum (-32768 * -32768 twice): x alternates 32767, -32768
case filter_extreme_simple_pattern
mem 0x20000000 noise seed=165 bytes=64
0 format pcm16 mono
0 interp none
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=2 id=1 loop
0 poke 0x20000000 ff7f0080
0 simple -32768 -32768
0 filters 1 0
0 enable 1

case filter_extreme_biquad
mem 0x20000000 noise seed=162 bytes=20000
0 format pcm16 stereo
0 interp none
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=5000 id=1 loop
0 biquad -32768 -32768 -32768 -32768 -32768
0 filters 0 1
0 enable 1
40 biquad 32767 32767 32767 32767 32767
80 biquad -32768 32767 -32768 32767 -32768
120 biquad 32767 -32768 32767 -32768 32767

case filter_extreme_both
mem 0x20000000 noise seed=163 bytes=20000
0 format pcm8 stereo
0 interp linear
0 rate 0.9
0 gain 0 1.0 1.0 0 0
0 embedded addr=0x20000000 len=9000 id=1 loop
0 simple -32768 -32768
0 biquad -32768 -32768 -32768 -32768 -32768
0 filters 1 1
0 enable 1

# noise as ADPCM: scales up to 15 and every predictor, with coefficients at the ends of the range
case adpcm_extreme_coefficients
mem 0x20000000 noise seed=164 bytes=4000
0 format adpcm mono
0 interp none
0 rate 1.0
0 gain 0 1.0 1.0 0 0
0 coeffs -32768 -32768 -32768 -32768 -32768 -32768 -32768 -32768 -32768 -32768 -32768 -32768 -32768 -32768 -32768 -32768
0 embedded addr=0x20000000 len=2000 id=1 loop adirty yn1=-32768 yn2=-32768
0 enable 1
60 coeffs 32767 32767 32767 32767 32767 32767 32767 32767 32767 32767 32767 32767 32767 32767 32767 32767
120 coeffs -32768 32767 -32768 32767 -32768 32767 -32768 32767 -32768 32767 -32768 32767 -32768 32767 -32768 32767

# ======================================================================================================
# Frame cases (N3-03): `mode=frame` drives all 24 sources, the mixers and the effects through Azahar's
# GenerateCurrentFrame. `s<k> <command>` is a source command for source k; the other commands are the
# mixers' (see the script's docstring). Each frame, the commands go into the region the DSP reads. The
# master volume starts at 0 (silence) until a case sets it. Samples that two sources or the aux buses add
# stay below 2^29, so that no float-to-s32 conversion of the downmix is out of range (Azahar's result there
# depends on the host: D78, dsp.md); the delay cases keep |b| below 1 so that the filter stays finite.

# ---- the master volume, the gains and the aux return volumes ----
case frame_silent_until_master_volume mode=frame
mem 0x20000000 walk16 seed=201 bytes=16000
0 s0 format pcm16 stereo
0 s0 interp linear
0 s0 gain 0 1.0 1.0 0.5 0.5
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1
0 s0 sync 1
100 master 1.0
150 master 0.0

case frame_master_volume_${vol} mode=frame sweep vol=1.0,0.5,0.25,2.5,-1.0
mem 0x20000000 walk16 seed=202 bytes=16000
0 s0 format pcm16 stereo
0 s0 interp linear
0 s0 rate 1.37
0 s0 gain 0 1.0 0.8 0.6 0.4
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1
0 master ${vol}
50 master 0.125
51 master ${vol}
120 master 0.0
121 master ${vol}

case frame_routing_to_the_three_mixes mode=frame
mem 0x20000000 walk16 seed=203 bytes=16000
mem 0x20004000 walk16 seed=204 bytes=16000
mem 0x20008000 walk16 seed=205 bytes=16000
0 master 1.0
0 auxreturn 0 0.5
0 auxreturn 1 0.25
0 s0 format pcm16 stereo
0 s0 gain 0 1.0 1.0 0 0
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1
0 s1 format pcm16 stereo
0 s1 gain 1 1.0 1.0 0.5 0.5
0 s1 embedded addr=0x20004000 len=4000 id=1 loop
0 s1 enable 1
0 s2 format pcm16 stereo
0 s2 gain 2 0.75 0.25 0.75 0.25
0 s2 embedded addr=0x20008000 len=4000 id=1 loop
0 s2 enable 1
100 auxreturn 0 1.0
140 auxreturn 1 0.0

case frame_gain_changes_ramp mode=frame
mem 0x20000000 walk16 seed=206 bytes=16000
0 master 1.0
0 s0 format pcm16 stereo
0 s0 gain 0 0 0 0 0
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1
10 s0 gain 0 1.0 1.0 1.0 1.0
30 s0 gain 0 0.0 0.5 0.5 0.0
31 s0 gain 0 1.0 0.0 0.0 1.0
60 s0 gain 2 1.0 1.0 1.0 1.0

# ---- the output format: mono, stereo and surround (plays as stereo) ----
case frame_output_format_${fmt} mode=frame sweep fmt=mono,stereo,surround
mem 0x20000000 walk16 seed=207 bytes=16000
mem 0x20004000 walk16 seed=208 bytes=16000
0 master 0.75
0 outfmt ${fmt}
0 s0 format pcm16 stereo
0 s0 gain 0 1.0 0.5 0.25 0.75
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1
0 s1 format pcm16 mono
0 s1 gain 0 0.1 0.9 0.3 0.7
0 s1 embedded addr=0x20004000 len=8000 id=1 loop
0 s1 enable 1
80 outfmt stereo
120 outfmt mono
160 outfmt surround

# ---- saturation: 24 loud sources, a master volume above 1 ----
case frame_saturation_${volume} mode=frame sweep volume=1.0,40.0
mem 0x20000000 noise seed=211 bytes=16000
mem 0x20004000 noise seed=212 bytes=16000
0 master ${volume}
0 s0 format pcm16 stereo
0 s0 gain 0 1.0 1.0 1.0 1.0
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1
0 s1 format pcm16 stereo
0 s1 gain 0 1.0 1.0 1.0 1.0
0 s1 embedded addr=0x20004000 len=4000 id=1 loop
0 s1 enable 1
0 s2 format pcm16 mono
0 s2 gain 0 1.0 1.0 1.0 1.0
0 s2 embedded addr=0x20000000 len=8000 id=1 loop
0 s2 enable 1

# ---- the aux buses: the sources' mixes go out to the application and its samples come back, a frame late ----
case frame_aux_bus_${bus} mode=frame sweep bus=0,1
mem 0x20000000 walk16 seed=221 bytes=16000
mem 0x20004000 walk16 seed=222 bytes=16000
0 master 1.0
0 auxreturn 0 1.0
0 auxreturn 1 1.0
0 auxbus ${bus} 1
0 s0 format pcm16 stereo
0 s0 gain 1 1.0 1.0 0.5 0.5
0 s0 gain 2 0.5 0.5 1.0 1.0
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1
0 s1 format pcm16 stereo
0 s1 gain 0 0.5 0.5 0.5 0.5
0 s1 embedded addr=0x20004000 len=4000 id=1 loop
0 s1 enable 1
0 auxmix 1 seed=1 amp=5000
0 auxmix 2 seed=2 amp=5000
1 auxmix 1 seed=3 amp=5000
1 auxmix 2 seed=4 amp=5000
2 auxmix 1 seed=5 amp=5000
2 auxmix 2 seed=6 amp=5000
3 auxmix 1 seed=7 amp=5000
3 auxmix 2 seed=8 amp=5000
60 auxbus ${bus} 0
61 auxbus ${bus} 1
62 auxmix 1 seed=9 amp=5000
62 auxmix 2 seed=10 amp=5000
63 auxmix 1 seed=11 amp=5000
63 auxmix 2 seed=12 amp=5000
120 auxbus 0 1
120 auxbus 1 1
121 auxmix 1 seed=13 amp=500000000
121 auxmix 2 seed=14 amp=500000000
122 auxmix 1 seed=15 amp=0
122 auxmix 2 seed=16 amp=0
160 auxbus 0 0
160 auxbus 1 0

case frame_aux_bus_without_dirty_bit_is_not_read mode=frame
mem 0x20000000 walk16 seed=223 bytes=16000
0 master 1.0
0 auxreturn 0 1.0
0 s0 format pcm16 stereo
0 s0 gain 1 1.0 1.0 1.0 1.0
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1
0 dspwrite 40 0100
0 auxmix 1 seed=21 amp=5000
50 auxbus 0 1
50 auxmix 1 seed=22 amp=5000
51 auxmix 1 seed=23 amp=5000


# ---- the delay effect, on the first and on the second aux mix ----
case frame_delay_on_mix_${fx}_${n}_frames mode=frame sweep fx=0,1 n=1,2,5
mem 0x20000000 walk16 seed=231 bytes=16000
0 master 1.0
0 auxreturn 0 1.0
0 auxreturn 1 1.0
0 s0 format pcm16 stereo
0 s0 gain 1 1.0 1.0 1.0 1.0
0 s0 gain 2 0.5 1.0 0.25 0.5
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1
0 delay ${fx} frames=${n} g=64 a=64 b=0
40 delay ${fx} frames=${n} g=0 a=128 b=64
80 delay ${fx} frames=${n} g=-64 a=96 b=-32
120 delay ${fx} enable=0
140 delay ${fx} frames=3 g=32 a=100 b=90

case frame_delay_both_buses_and_aux_enabled mode=frame
mem 0x20000000 walk16 seed=232 bytes=16000
mem 0x20004000 walk16 seed=233 bytes=16000
0 master 1.0
0 auxreturn 0 0.5
0 auxreturn 1 0.5
0 auxbus 0 1
0 auxbus 1 1
0 s0 format pcm16 stereo
0 s0 gain 1 1.0 1.0 1.0 1.0
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1
0 s1 format pcm16 stereo
0 s1 gain 2 1.0 1.0 1.0 1.0
0 s1 embedded addr=0x20004000 len=4000 id=1 loop
0 s1 enable 1
0 delay 0 frames=2 g=64 a=64 b=32
0 delay 1 frames=4 g=64 a=96 b=16
0 auxmix 1 seed=31 amp=8000
0 auxmix 2 seed=32 amp=8000
1 auxmix 1 seed=33 amp=8000
1 auxmix 2 seed=34 amp=8000

# The edges of the delay's configuration: frame_count 0 bypasses it, a long delay is clamped to 4 seconds,
# a disabled one is reset (the clamp itself is pinned by frame_delay_818_and_819_frames, at the end of the
# file), a new configuration of the same length keeps the buffers, an effect whose own
# dirty word is 0 or whose main dirty bit is not set is not read.
case frame_delay_edges mode=frame
mem 0x20000000 walk16 seed=234 bytes=16000
0 master 1.0
0 auxreturn 0 1.0
0 auxreturn 1 1.0
0 s0 format pcm16 stereo
0 s0 gain 1 1.0 1.0 1.0 1.0
0 s0 gain 2 1.0 1.0 1.0 1.0
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1
2 delay 0 frames=0 g=64 a=64 b=32
2 delay 1 frames=1000 g=64 a=64 b=32
30 delay 0 frames=3 g=64 a=64 b=32
31 delay 0 frames=3 g=96 a=32 b=64
40 delay 0 frames=3 g=96 a=32 b=-64 dirty=0
41 delay 0 frames=2 g=96 a=32 b=-64 nomain
60 delay 0 enable=0
61 delay 0 enable=0
80 delay 0 frames=2 g=0 a=0 b=0
100 delay 0 frames=65535 g=16 a=16 b=16
101 delay 0 frames=818 g=16 a=16 b=16
102 delay 0 frames=819 g=16 a=16 b=16
140 delay 0 frames=1 g=127 a=-128 b=0 work=0x20100000 outputs=3

# A gain of 256 on full-scale noise: the delay's output is about 8.4e6, well inside the s32 range, so nothing is
# clamped here (frame_delay_saturates_to_the_s32_range does that).
case frame_delay_large_values mode=frame
mem 0x20000000 noise seed=235 bytes=16000
0 master 0.0001
0 auxreturn 0 0.0001
0 s0 format pcm16 stereo
0 s0 gain 1 1.0 1.0 1.0 1.0
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1
0 delay 0 frames=1 g=0 a=32767 b=0

# ---- the reverb is not implemented in Azahar: its blocks and dirty bits change nothing ----
case frame_reverb_does_nothing mode=frame
mem 0x20000000 walk16 seed=236 bytes=16000
0 master 1.0
0 auxreturn 0 1.0
0 auxreturn 1 1.0
0 s0 format pcm16 stereo
0 s0 gain 1 1.0 1.0 1.0 1.0
0 s0 gain 2 1.0 1.0 1.0 1.0
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1
10 reverb 0 rand:1
11 reverb 1 rand:2
12 reverb 0 rand:3

# ---- the other bits of the DSP configuration: cleared when read, nothing else happens ----
case frame_dirty_bits_are_cleared mode=frame
mem 0x20000000 walk16 seed=237 bytes=16000
0 master 1.0
0 s0 format pcm16 stereo
0 s0 gain 0 1.0 1.0 1.0 1.0
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1
5 headphones 1
6 dspdirty 0xFFFFFFFF
7 dspdirty 0x000080C0
8 dspdirty 0xE8000000
9 dspwrite 4 0000803f
9 dspwrite 22 0000
20 dspdirty 0x00010000
21 dspwrite 4 0000003f
22 dspwrite 4 0000803f

# ---- the frame counters wrap around ----
case frame_counters_wrap mode=frame fc=65500
mem 0x20000000 walk16 seed=238 bytes=16000
0 master 1.0
0 s0 format pcm16 stereo
0 s0 gain 0 1.0 1.0 1.0 1.0
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1
40 master 0.5

case frame_counters_start_at_one mode=frame fc=1
mem 0x20000000 walk16 seed=239 bytes=16000
0 master 1.0
0 s0 format pcm16 stereo
0 s0 gain 0 1.0 1.0 1.0 1.0
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1

# ---- sleep and wakeup: the whole memory and the state of the mixers and of the effects come back ----
case frame_sleep_and_wakeup mode=frame
mem 0x20000000 walk16 seed=241 bytes=16000
0 master 1.0
0 auxreturn 0 0.5
0 auxbus 0 1
0 s0 format pcm16 stereo
0 s0 gain 0 1.0 1.0 0.5 0.5
0 s0 gain 1 1.0 1.0 0.5 0.5
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1
0 delay 0 frames=2 g=64 a=64 b=32
0 auxmix 1 seed=41 amp=3000
1 auxmix 1 seed=42 amp=3000
60 sleep
70 master 0.25
90 wakeup
91 master 0.75
130 sleep
131 wakeup

# ---- the sources of the sample memory: pokes and buffers that change under the DSP ----
case frame_source_statuses_and_stops mode=frame
mem 0x20000000 walk16 seed=243 bytes=3000
mem 0x20004000 adpcm seed=244 bytes=2000
0 master 1.0
0 s0 format pcm16 mono
0 s0 gain 0 1.0 1.0 1.0 1.0
0 s0 queue 0 addr=0x20000000 len=1000 id=3
0 s0 queue 1 addr=0x20000000 len=500 id=2
0 s0 enable 1
0 s0 sync 1
0 s3 format adpcm mono
0 s3 gain 0 1.0 1.0 1.0 1.0
0 s3 coeffs rand:5:3000
0 s3 queue 0 addr=0x20004000 len=3000 id=1 adirty ps=0x10 yn1=100 yn2=-100
0 s3 enable 1
0 s3 sync 2
0 s23 format pcm16 mono
0 s23 gain 0 1.0 1.0 1.0 1.0
0 s23 queue 0 addr=0x40000000 len=1000 id=1
0 s23 enable 1
50 s3 enable 0
50 s0 sync 5
51 s3 enable 1
51 s0 queue 2 addr=0x20000000 len=800 id=9
80 s23 reset

# ---- all 24 sources at once: every format, rate and interpolation mode, filters, the three mixes, both
# aux buses with the delay on them, and a master volume ----
case frame_24_sources mode=frame
mem 0x20000000 walk16 seed=300 bytes=16000
mem 0x20004000 walk16 seed=301 bytes=16000
mem 0x20008000 walk8 seed=302 bytes=16000
mem 0x2000c000 walk8 seed=303 bytes=16000
mem 0x20010000 adpcm seed=304 bytes=16000
mem 0x20014000 walk16 seed=305 bytes=16000
mem 0x20018000 walk16 seed=306 bytes=16000
mem 0x2001c000 walk8 seed=307 bytes=16000
mem 0x20020000 walk8 seed=308 bytes=16000
mem 0x20024000 adpcm seed=309 bytes=16000
mem 0x20028000 walk16 seed=310 bytes=16000
mem 0x2002c000 walk16 seed=311 bytes=16000
mem 0x20030000 walk8 seed=312 bytes=16000
mem 0x20034000 walk8 seed=313 bytes=16000
mem 0x20038000 adpcm seed=314 bytes=16000
mem 0x2003c000 walk16 seed=315 bytes=16000
mem 0x20040000 walk16 seed=316 bytes=16000
mem 0x20044000 walk8 seed=317 bytes=16000
mem 0x20048000 walk8 seed=318 bytes=16000
mem 0x2004c000 adpcm seed=319 bytes=16000
mem 0x20050000 walk16 seed=320 bytes=16000
mem 0x20054000 walk16 seed=321 bytes=16000
mem 0x20058000 walk8 seed=322 bytes=16000
mem 0x2005c000 walk8 seed=323 bytes=16000
0 master 0.5
0 auxreturn 0 0.5
0 auxreturn 1 0.25
0 auxbus 0 1
0 auxbus 1 1
0 delay 0 frames=2 g=48 a=64 b=32
0 delay 1 frames=3 g=32 a=80 b=16
1 auxmix 1 seed=51 amp=20000
1 auxmix 2 seed=61 amp=20000
2 auxmix 1 seed=52 amp=20000
2 auxmix 2 seed=62 amp=20000
3 auxmix 1 seed=53 amp=20000
3 auxmix 2 seed=63 amp=20000
4 auxmix 1 seed=54 amp=20000
4 auxmix 2 seed=64 amp=20000
0 auxmix 1 seed=50 amp=20000
0 auxmix 2 seed=60 amp=20000
0 s0 format pcm16 mono
0 s0 interp linear
0 s0 rate 1.0
0 s0 gain 0 0.0 0.125 0.375 0.375
0 s0 gain 1 0.5 0.0 0.0625 0.375
0 s0 gain 2 0.375 0.375 0.25 0.375
0 s0 embedded addr=0x20000000 len=8000 id=1 loop
0 s0 enable 1
0 s0 sync 1
0 s1 format pcm16 stereo
0 s1 interp none
0 s1 rate 0.5
0 s1 gain 0 0.375 0.5 0.25 0.375
0 s1 gain 1 0 0 0 0
0 s1 gain 2 0.0 0.0 0.125 0.0
0 s1 embedded addr=0x20004000 len=4000 id=2 loop
0 s1 filters 1 0
0 s1 simple rand:1:16000
1 s1 enable 1
1 s1 sync 2
0 s2 format pcm8 mono
0 s2 interp poly
0 s2 rate 1.37
0 s2 gain 0 0.25 0.0 0.5 0.25
0 s2 gain 1 0.5 0.125 0.0625 0.25
0 s2 gain 2 0.125 0.125 0.125 0.25
0 s2 embedded addr=0x20008000 len=16000 id=3 loop
2 s2 enable 1
2 s2 sync 3
0 s3 format pcm8 stereo
0 s3 interp linear
0 s3 rate 2.0
0 s3 gain 0 0.5 0.375 0.5 0.0
0 s3 gain 1 0.5 0.125 0.0 0.375
0 s3 gain 2 0 0 0 0
0 s3 embedded addr=0x2000c000 len=8000 id=4 loop
0 s3 filters 0 1
0 s3 biquad rand:103:12000
3 s3 enable 1
3 s3 sync 4
0 s4 format adpcm mono
0 s4 interp none
0 s4 rate 0.75
0 s4 gain 0 0.0625 0.5 0.5 0.5
0 s4 gain 1 0.375 0.125 0.0 0.5
0 s4 gain 2 0.125 0.125 0.25 0.25
0 s4 coeffs rand:4:3000
0 s4 embedded addr=0x20010000 len=28000 id=5 loop adirty ps=0x10
4 s4 enable 1
4 s4 sync 5
0 s5 format pcm16 mono
0 s5 interp poly
0 s5 rate 1.0
0 s5 gain 0 0.0 0.25 0.375 0.375
0 s5 gain 1 0 0 0 0
0 s5 gain 2 0 0 0 0
0 s5 embedded addr=0x20014000 len=8000 id=6 loop
0 s5 filters 1 0
0 s5 simple rand:5:16000
5 s5 enable 1
5 s5 sync 6
0 s6 format pcm16 stereo
0 s6 interp linear
0 s6 rate 2.9
0 s6 gain 0 0.125 0.25 0.375 0.25
0 s6 gain 1 0.375 0.375 0.0 0.375
0 s6 gain 2 0.0625 0.0625 0.0 0.5
0 s6 embedded addr=0x20018000 len=4000 id=7 loop
6 s6 enable 1
6 s6 sync 7
0 s7 format pcm8 mono
0 s7 interp none
0 s7 rate 0.25
0 s7 gain 0 0.375 0.5 0.0 0.5
0 s7 gain 1 0 0 0 0
0 s7 gain 2 0.25 0.0625 0.0 0.5
0 s7 embedded addr=0x2001c000 len=16000 id=8 loop
0 s7 filters 0 1
0 s7 biquad rand:107:12000
7 s7 enable 1
7 s7 sync 8
0 s8 format pcm8 stereo
0 s8 interp poly
0 s8 rate 1.0
0 s8 gain 0 0.5 0.25 0.5 0.25
0 s8 gain 1 0.5 0.375 0.125 0.375
0 s8 gain 2 0.25 0.5 0.125 0.375
0 s8 embedded addr=0x20020000 len=8000 id=9 loop
8 s8 enable 1
8 s8 sync 9
0 s9 format adpcm mono
0 s9 interp linear
0 s9 rate 0.5
0 s9 gain 0 0.5 0.375 0.5 0.25
0 s9 gain 1 0.25 0.25 0.0625 0.125
0 s9 gain 2 0 0 0 0
0 s9 coeffs rand:9:3000
0 s9 embedded addr=0x20024000 len=28000 id=10 loop adirty ps=0x10
0 s9 filters 1 0
0 s9 simple rand:9:16000
9 s9 enable 1
9 s9 sync 10
0 s10 format pcm16 mono
0 s10 interp none
0 s10 rate 1.37
0 s10 gain 0 0.5 0.375 0.25 0.375
0 s10 gain 1 0.25 0.125 0.0625 0.125
0 s10 gain 2 0.5 0.25 0.25 0.375
0 s10 embedded addr=0x20028000 len=8000 id=11 loop
10 s10 enable 1
10 s10 sync 11
0 s11 format pcm16 stereo
0 s11 interp poly
0 s11 rate 2.0
0 s11 gain 0 0.25 0.25 0.375 0.5
0 s11 gain 1 0 0 0 0
0 s11 gain 2 0 0 0 0
0 s11 embedded addr=0x2002c000 len=4000 id=12 loop
0 s11 filters 0 1
0 s11 biquad rand:111:12000
11 s11 enable 1
11 s11 sync 12
0 s12 format pcm8 mono
0 s12 interp linear
0 s12 rate 0.75
0 s12 gain 0 0.375 0.125 0.25 0.0625
0 s12 gain 1 0.25 0.5 0.25 0.0
0 s12 gain 2 0.5 0.125 0.25 0.125
0 s12 embedded addr=0x20030000 len=16000 id=13 loop
12 s12 enable 1
12 s12 sync 13
0 s13 format pcm8 stereo
0 s13 interp none
0 s13 rate 1.0
0 s13 gain 0 0.0 0.0625 0.5 0.25
0 s13 gain 1 0 0 0 0
0 s13 gain 2 0.0 0.25 0.375 0.375
0 s13 embedded addr=0x20034000 len=8000 id=14 loop
0 s13 filters 1 0
0 s13 simple rand:13:16000
13 s13 enable 1
13 s13 sync 14
0 s14 format adpcm mono
0 s14 interp poly
0 s14 rate 2.9
0 s14 gain 0 0.0 0.375 0.0625 0.0625
0 s14 gain 1 0.0 0.375 0.0 0.375
0 s14 gain 2 0.125 0.5 0.5 0.125
0 s14 coeffs rand:14:3000
0 s14 embedded addr=0x20038000 len=28000 id=15 loop adirty ps=0x10
14 s14 enable 1
14 s14 sync 15
0 s15 format pcm16 mono
0 s15 interp linear
0 s15 rate 0.25
0 s15 gain 0 0.0625 0.0 0.125 0.5
0 s15 gain 1 0.375 0.375 0.25 0.5
0 s15 gain 2 0 0 0 0
0 s15 embedded addr=0x2003c000 len=8000 id=16 loop
0 s15 filters 0 1
0 s15 biquad rand:115:12000
15 s15 enable 1
15 s15 sync 16
0 s16 format pcm16 stereo
0 s16 interp none
0 s16 rate 1.0
0 s16 gain 0 0.25 0.375 0.0625 0.375
0 s16 gain 1 0.5 0.375 0.125 0.0
0 s16 gain 2 0.25 0.5 0.0625 0.0625
0 s16 embedded addr=0x20040000 len=4000 id=17 loop
16 s16 enable 1
16 s16 sync 17
0 s17 format pcm8 mono
0 s17 interp poly
0 s17 rate 0.5
0 s17 gain 0 0.375 0.125 0.375 0.25
0 s17 gain 1 0 0 0 0
0 s17 gain 2 0 0 0 0
0 s17 embedded addr=0x20044000 len=16000 id=18 loop
0 s17 filters 1 0
0 s17 simple rand:17:16000
17 s17 enable 1
17 s17 sync 18
0 s18 format pcm8 stereo
0 s18 interp linear
0 s18 rate 1.37
0 s18 gain 0 0.0 0.0 0.125 0.5
0 s18 gain 1 0.125 0.0 0.0 0.375
0 s18 gain 2 0.25 0.125 0.5 0.125
0 s18 embedded addr=0x20048000 len=8000 id=19 loop
18 s18 enable 1
18 s18 sync 19
0 s19 format adpcm mono
0 s19 interp none
0 s19 rate 2.0
0 s19 gain 0 0.25 0.125 0.0 0.25
0 s19 gain 1 0 0 0 0
0 s19 gain 2 0.0625 0.375 0.375 0.0625
0 s19 coeffs rand:19:3000
0 s19 embedded addr=0x2004c000 len=28000 id=20 loop adirty ps=0x10
0 s19 filters 0 1
0 s19 biquad rand:119:12000
19 s19 enable 1
19 s19 sync 20
0 s20 format pcm16 mono
0 s20 interp poly
0 s20 rate 0.75
0 s20 gain 0 0.25 0.375 0.125 0.25
0 s20 gain 1 0.375 0.0625 0.5 0.5
0 s20 gain 2 0.0 0.375 0.25 0.0
0 s20 embedded addr=0x20050000 len=8000 id=21 loop
20 s20 enable 1
20 s20 sync 21
0 s21 format pcm16 stereo
0 s21 interp linear
0 s21 rate 1.0
0 s21 gain 0 0.0625 0.5 0.0625 0.0
0 s21 gain 1 0.5 0.375 0.0 0.25
0 s21 gain 2 0 0 0 0
0 s21 embedded addr=0x20054000 len=4000 id=22 loop
0 s21 filters 1 0
0 s21 simple rand:21:16000
21 s21 enable 1
21 s21 sync 22
0 s22 format pcm8 mono
0 s22 interp none
0 s22 rate 2.9
0 s22 gain 0 0.5 0.0 0.0625 0.5
0 s22 gain 1 0.375 0.0625 0.375 0.0625
0 s22 gain 2 0.0625 0.5 0.0625 0.25
0 s22 embedded addr=0x20058000 len=16000 id=23 loop
22 s22 enable 1
22 s22 sync 23
0 s23 format pcm8 stereo
0 s23 interp poly
0 s23 rate 0.25
0 s23 gain 0 0.125 0.25 0.375 0.25
0 s23 gain 1 0 0 0 0
0 s23 gain 2 0 0 0 0
0 s23 embedded addr=0x2005c000 len=8000 id=24 loop
0 s23 filters 0 1
0 s23 biquad rand:123:12000
23 s23 enable 1
23 s23 sync 24
100 master 1.0
100 outfmt mono
150 outfmt stereo
120 s5 enable 0
130 s5 embedded addr=0x20014000 len=2000 id=77
131 s5 enable 1

# ---- the delay's limits (N3-03, fix round 1), appended so that the rows above keep their place ----

# The delay's output is clamped to the s32 range before it is converted: the aux buses carry the application's
# samples at +-2e9, the delay (a = 156) multiplies them to about 3e11 in both directions, and the aux return
# volume is small enough that the converted values (about 2e8) stay inside the s32 range in the downmix. Without
# the clamp the conversion gives INT32_MIN for every one of them and the positive half flips sign.
case frame_delay_saturates_to_the_s32_range mode=frame
mem 0x20000000 walk16 seed=253 bytes=16000
0 s0 format pcm16 mono
0 s0 embedded addr=0x20000000 len=8000 id=1 loop
0 s0 enable 1
0 master 0.1
0 auxreturn 0 0.1
0 auxreturn 1 0.1
0 auxbus 0 1
0 auxbus 1 1
0 delay 0 frames=1 g=0 a=20000 b=0
0 delay 1 frames=2 g=0 a=-20000 b=0
0 auxmix 1 seed=71 amp=2000000000
0 auxmix 2 seed=72 amp=2000000000
1 auxmix 1 seed=73 amp=2000000000
1 auxmix 2 seed=74 amp=2000000000
2 auxmix 1 seed=75 amp=2000000000
2 auxmix 2 seed=76 amp=2000000000
3 auxmix 1 seed=77 amp=2000000000
3 auxmix 2 seed=78 amp=2000000000
60 delay 0 frames=1 g=0 a=20000 b=0
61 auxmix 1 seed=79 amp=2000000000
62 auxmix 1 seed=80 amp=2000000000

# The 4-second limit of the delay: 818 frames (130,880 samples) is below it and 819 (131,040) is above it, so it
# becomes 130,912. The echo of the source returns after that many samples, and the case runs past it
# (1000 frames), so a longer limit puts the echo of the 819-frame delay 128 samples later and changes the table.
case frame_delay_818_and_819_frames mode=frame frames=1000
mem 0x20000000 walk16 seed=251 bytes=16000
mem 0x20004000 noise seed=252 bytes=16000
0 master 1.0
0 auxreturn 0 1.0
0 auxreturn 1 1.0
0 s0 format pcm16 stereo
0 s0 gain 1 1.0 1.0 1.0 1.0
0 s0 embedded addr=0x20000000 len=4000 id=1 loop
0 s0 enable 1
0 s1 format pcm16 stereo
0 s1 gain 2 1.0 1.0 1.0 1.0
0 s1 embedded addr=0x20004000 len=4000 id=1 loop
0 s1 enable 1
0 delay 0 frames=818 g=0 a=64 b=0
0 delay 1 frames=819 g=0 a=64 b=0
