From c3783ead8cfa07118bfb27cbc2fb44f21dc0da00 Mon Sep 17 00:00:00 2001 From: Matthew Scott Date: Mon, 25 Nov 2024 10:35:22 -0600 Subject: [PATCH] add new modulation types for FMX and Analog Generator osc2 --- specs/fileformat.yaml | 4 + src/python/rv/modules/base/analoggenerator.py | 2 + src/python/rv/modules/base/fmx.py | 2 + src/ts/modtypes/analogGenerator.ts | 2 + src/ts/modtypes/analogGeneratorEnums.ts | 2 + src/ts/modtypes/fmx.ts | 2 + src/ts/modtypes/fmxEnums.ts | 2 + tests/files/analog-generator.sunsynth | Bin 737 -> 758 bytes tests/files/fmx.sunsynth | Bin 3611 -> 2587 bytes tests/python/conftest.py | 27 +- .../readwrite/synth/test_analog_generator.py | 2 +- tests/python/readwrite/synth/test_fmx.py | 268 +----------------- .../analog-generator.sunsynth.test.ts | 6 +- tests/ts/readwrite/fmx.sunsynth.test.ts | 88 ++---- 14 files changed, 65 insertions(+), 342 deletions(-) diff --git a/specs/fileformat.yaml b/specs/fileformat.yaml index f08f3e3..648f900 100644 --- a/specs/fileformat.yaml +++ b/specs/fileformat.yaml @@ -870,6 +870,8 @@ module_types: "max": 4 "bitwise_and": 5 "bitwise_xor": 6 + "min_abs": 7 + "max_abs": 8 controllers: - volume: { min: 0, max: 256, default: 80 } - waveform: { enum: Waveform, default: "triangle" } @@ -1474,6 +1476,8 @@ module_types: "bitwise_and": 7 "bitwise_xor": 8 "phase_plus": 9 + "min_abs": 10 + "max_abs": 11 Op1OutputMode: "none": 0 "to_output": 1 diff --git a/src/python/rv/modules/base/analoggenerator.py b/src/python/rv/modules/base/analoggenerator.py index 28bffd3..b8f99eb 100644 --- a/src/python/rv/modules/base/analoggenerator.py +++ b/src/python/rv/modules/base/analoggenerator.py @@ -64,6 +64,8 @@ class Osc2Mode(IntEnum): max = 4 bitwise_and = 5 bitwise_xor = 6 + min_abs = 7 + max_abs = 8 volume = Controller((0, 256), 80) waveform = Controller(Waveform, Waveform.triangle) diff --git a/src/python/rv/modules/base/fmx.py b/src/python/rv/modules/base/fmx.py index b67c08e..cd9bb8f 100644 --- a/src/python/rv/modules/base/fmx.py +++ b/src/python/rv/modules/base/fmx.py @@ -81,6 +81,8 @@ class ModulationType(IntEnum): bitwise_and = 7 bitwise_xor = 8 phase_plus = 9 + min_abs = 10 + max_abs = 11 class Op1OutputMode(IntEnum): none = 0 diff --git a/src/ts/modtypes/analogGenerator.ts b/src/ts/modtypes/analogGenerator.ts index a90b828..d42d88a 100644 --- a/src/ts/modtypes/analogGenerator.ts +++ b/src/ts/modtypes/analogGenerator.ts @@ -68,6 +68,8 @@ export namespace AnalogGenerator { Max = 4, BitwiseAnd = 5, BitwiseXor = 6, + MinAbs = 7, + MaxAbs = 8, } export enum CtlNum { Volume = 1, diff --git a/src/ts/modtypes/analogGeneratorEnums.ts b/src/ts/modtypes/analogGeneratorEnums.ts index cb6478a..2e00678 100644 --- a/src/ts/modtypes/analogGeneratorEnums.ts +++ b/src/ts/modtypes/analogGeneratorEnums.ts @@ -59,4 +59,6 @@ export enum Osc2Mode { Max = 4, BitwiseAnd = 5, BitwiseXor = 6, + MinAbs = 7, + MaxAbs = 8, } diff --git a/src/ts/modtypes/fmx.ts b/src/ts/modtypes/fmx.ts index 17d87bf..81fc87e 100644 --- a/src/ts/modtypes/fmx.ts +++ b/src/ts/modtypes/fmx.ts @@ -87,6 +87,8 @@ export namespace Fmx { BitwiseAnd = 7, BitwiseXor = 8, PhasePlus = 9, + MinAbs = 10, + MaxAbs = 11, } export enum Op1OutputMode { // noinspection JSUnusedGlobalSymbols diff --git a/src/ts/modtypes/fmxEnums.ts b/src/ts/modtypes/fmxEnums.ts index 3c94927..d1f38b5 100644 --- a/src/ts/modtypes/fmxEnums.ts +++ b/src/ts/modtypes/fmxEnums.ts @@ -79,6 +79,8 @@ export enum ModulationType { BitwiseAnd = 7, BitwiseXor = 8, PhasePlus = 9, + MinAbs = 10, + MaxAbs = 11, } export enum Op1OutputMode { // noinspection JSUnusedGlobalSymbols diff --git a/tests/files/analog-generator.sunsynth b/tests/files/analog-generator.sunsynth index c63919c4f794b9c754d2b9eefb9a06396bfc9aa9..e4f640515bdf4217da588190d67944ef186463cc 100644 GIT binary patch delta 89 zcmaFJ`i)gMI5^Ue0SLlegMwK=3?{~n!b=%NIe<*(Fh?J-7>Mob>9S$+LB`dS?=W&q Y&S8p?;sc5@f*=Th*}<-UEqnpEpP$2nW0Rxqt)#kdPGx delta 1134 zcmXYxc}&v>7>3K~5a@>7P^T1xDIFlKBBj6Y0}2BK8JG1)+!`2%&L9lMF@iNB=$sCvWop`_?(sN$iu8*Tsuw zqKQmOHlG!dsKfq_iAh)IOOvN&m35{rl{~{iQ=7^Kmh;V5#YD7s##wfn>D1Bjv9p6& zW_;EE;~9@gnJv40v!QBEC1hEgf|jR4KuvcbcIp*OzP3bJupRohxZwwCPdqut7q>oH ziVnsgOnaolE}Jk+To!>I8$ZIlwkWK(j>bb-QFzH1iACGh=;5ouAY+maFPFumYe)

_?!4=SO06{pCyKD?ATNbq`Sc(qtg`KdYNpL&Q=+uJC|d6<6x{5}mTrYT^*H7f*X_LfLF z>zQr|C(Ku{HcrLoE{AitbqxRN9nX`JB;Mh;nzgqzj9;wbQypu#+*ZS|ESV3>KIVBG z%i<%E?70@W)M7brLw{cBx`?$_ZoF@)9m|fI^W5VT)H5P*O;QM+7|bE zI$>4X0)%oO%qsB19j6tTdo~!QwF35MhGCw&8rL3BBMgM&$rWm>hziB8r7DbDro_|l zD6s#m470X-VZ_b_*ih(*UA1#jS7$Io&*u~HNO}cwm3p@5C&5GLq_(v8RDu24bxw_QP|Z)dbhEF^kX&Dvbl}=a?VlTt!v~Ve@q7|r|JH2 zOYR92^M*zT{`8(J@4x>(H>;%_k?zHog+44a`0)BtZyn!V;l<;-y!fZ^g?z&3##=KT zc+(p@-ZX5*fvqBb{Q5QRzjTlMWEZI>w3|M>*+Rvy%IHl+7RmLotQE)ddF!+%e~Y1gl0RxU$e4$7B-JK61gbJO>n~+v7S{TTE}aK>fB! z2;&zp)MkWe<9VnT20(W01dKbE!PATkC>f3e(@}enId=-tr7u*Xo+2eJ-E0WZKQXA& z9O+M8Y63Nxmyq_KZ)sm^80bZ< diff --git a/tests/python/conftest.py b/tests/python/conftest.py index e30f9e7..cfe6276 100644 --- a/tests/python/conftest.py +++ b/tests/python/conftest.py @@ -15,11 +15,12 @@ def test_files_path() -> Path: @pytest.fixture def read_write_read_synth(test_files_path): def _read_write_read_synth(name: str) -> Synth: - synth = read_sunvox_file(test_files_path / f"{name}.sunsynth") + synth = read_sunvox_file(path := test_files_path / f"{name}.sunsynth") f = BytesIO() synth.write_to(f) f.seek(0) synth = read_sunvox_file(f) + synth.module.path = path # for inspecting original file as needed return synth return _read_write_read_synth @@ -55,19 +56,31 @@ def _read_write_read_project(name: str, verbose=False) -> Project: @pytest.fixture def dump_on_failure(): - """Context manager useful for debugging test failures for module tests.""" + """ + Context manager to print a hex dump of the module on failure. + + Include the fixture and then use it like this: + + with dump_on_failure(mod): # or mod.path to dump the original file + assert mod.custom_waveform.values == EXPECTED_CUSTOM_WAVEFORM + """ @contextmanager - def _dump_on_failure(module: m.Module): + def _dump_on_failure(module: m.Module | Path): try: yield except Exception: from rv.lib.iff import dump_file - f = BytesIO() - synth = Synth(module) - synth.write_to(f) - f.seek(0) + if isinstance(module, m.Module): + f = BytesIO() + synth = Synth(module) + synth.write_to(f) + f.seek(0) + elif isinstance(module, Path): + f = module.open("rb") + else: + raise TypeError(f"Don't know how to dump {type(module)}") dump_file(f) raise diff --git a/tests/python/readwrite/synth/test_analog_generator.py b/tests/python/readwrite/synth/test_analog_generator.py index edc3573..f77dcd3 100644 --- a/tests/python/readwrite/synth/test_analog_generator.py +++ b/tests/python/readwrite/synth/test_analog_generator.py @@ -32,7 +32,7 @@ def test_analog_generator(read_write_read_synth): assert mod.mode == mod.Mode.lq assert mod.noise == 9 assert mod.osc2_volume == 20640 - assert mod.osc2_mode == mod.Osc2Mode.mul + assert mod.osc2_mode == mod.Osc2Mode.max_abs assert mod.osc2_phase == 0 assert mod.volume_envelope_scaling_per_key diff --git a/tests/python/readwrite/synth/test_fmx.py b/tests/python/readwrite/synth/test_fmx.py index bfac25b..545d56c 100644 --- a/tests/python/readwrite/synth/test_fmx.py +++ b/tests/python/readwrite/synth/test_fmx.py @@ -1,7 +1,7 @@ from rv.api import m -def test_fmx(read_write_read_synth): +def test_fmx(read_write_read_synth, dump_on_failure): mod: m.Fmx = read_write_read_synth("fmx").module assert mod.flags == 0x02000059 @@ -35,7 +35,7 @@ def test_fmx(read_write_read_synth): assert mod.op5_decay == 653 assert mod.op1_sustain_level == 1506 assert mod.op2_sustain_level == 2534 - assert mod.op3_sustain_level == 3252 + assert mod.op3_sustain_level == 3234 assert mod.op4_sustain_level == 23034 assert mod.op5_sustain_level == 3503 assert mod.op1_release == 6497 @@ -119,8 +119,8 @@ def test_fmx(read_write_read_synth): assert mod.op4_feedback == 26614 assert mod.op5_feedback == 17200 assert mod.op1_modulation_type == mod.ModulationType.sub - assert mod.op2_modulation_type == mod.ModulationType.frequency - assert mod.op3_modulation_type == mod.ModulationType.amplitude_mul + assert mod.op2_modulation_type == mod.ModulationType.min_abs + assert mod.op3_modulation_type == mod.ModulationType.max_abs assert mod.op4_modulation_type == mod.ModulationType.min assert mod.op5_modulation_type == mod.ModulationType.sub assert mod.op1_output_mode == 0 @@ -129,261 +129,5 @@ def test_fmx(read_write_read_synth): assert mod.op4_output_mode == 2 -EXPECTED_CUSTOM_WAVEFORM = [ - 0.23258860409259796, - 0.28716719150543213, - 0.33988499641418457, - 0.3905003070831299, - 0.43874162435531616, - 0.4843390882015228, - 0.5272365808486938, - 0.5672786235809326, - 0.6041287779808044, - 0.6377434730529785, - 0.6680856943130493, - 0.6950294971466064, - 0.718247652053833, - 0.7379667162895203, - 0.7541000843048096, - 0.7664385437965393, - 0.7750416398048401, - 0.7800208926200867, - 0.7814271450042725, - 0.7789393663406372, - 0.772946298122406, - 0.7635419964790344, - 0.8365955948829651, - 0.8237184882164001, - 0.8068667054176331, - 0.7860580086708069, - 0.7628260850906372, - 0.7345373034477234, - 0.7025718092918396, - 0.6699537038803101, - 0.6312897205352783, - 0.5893936157226562, - 0.544437050819397, - 0.5012393593788147, - 0.4510851502418518, - 0.3985336422920227, - 0.3437948226928711, - 0.2933891713619232, - 0.23541350662708282, - 0.17610563337802887, - 0.12288980931043625, - 0.06199882552027702, - 0.0006794976070523262, - -0.060750387609004974, - -0.114327073097229, - -0.1749647706747055, - -0.23475059866905212, - -0.2859053313732147, - -0.343142569065094, - -0.39861631393432617, - -0.45199453830718994, - -0.4964962601661682, - -0.5451078414916992, - -0.5907776355743408, - -0.6332420110702515, - -0.6677308082580566, - -0.7035722732543945, - -0.7355403900146484, - -0.761013388633728, - -0.7853280305862427, - -0.8052794337272644, - -0.8207546472549438, - -0.8323591947555542, - -0.8393306732177734, - -0.8415870070457458, - -0.8425549268722534, - -0.8361444473266602, - -0.8250311613082886, - -0.8092741966247559, - -0.7958842515945435, - -0.7718666791915894, - -0.7435323596000671, - -0.7110217809677124, - -0.6845620274543762, - -0.6449171304702759, - -0.6017055511474609, - -0.5671621561050415, - -0.5180232524871826, - -0.4661105275154114, - -0.41174858808517456, - -0.3687247335910797, - -0.3105382025241852, - -0.25084754824638367, - -0.2039089798927307, - -0.14217057824134827, - -0.07994867116212845, - -0.017657138407230377, - 0.03120145946741104, - 0.09301437437534332, - 0.15382125973701477, - 0.21325230598449707, - 0.2600589692592621, - 0.31650879979133606, - 0.37059485912323, - 0.41352012753486633, - 0.46296000480651855, - 0.509142279624939, - 0.5518043637275696, - 0.586479663848877, - 0.6226131916046143, - 0.6545447111129761, - 0.6815400123596191, - 0.7059248685836792, - 0.7256537079811096, - 0.7406331300735474, - 0.7554891109466553, - 0.7621375918388367, - 0.7638754844665527, - 0.7607458829879761, - 0.7625833749771118, - 0.7510920166969299, - 0.7349019646644592, - 0.7273757457733154, - 0.7032579779624939, - 0.6748769283294678, - 0.6424469947814941, - 0.6230509281158447, - 0.583917498588562, - 0.5414230823516846, - 0.5146118998527527, - 0.46669110655784607, - 0.4162820279598236, - 0.3637271225452423, - 0.32909584045410156, - 0.27325761318206787, - 0.21629741787910461, - 0.15865042805671692, - 0.1194186806678772, - 0.06085902452468872, - 0.0026753395795822144, - -0.037727177143096924, - -0.09500941634178162, - -0.1508598029613495, - -0.20491887629032135, - -0.24377082288265228, - -0.29458335041999817, - -0.34262585639953613, - -0.3875787854194641, - -0.42161351442337036, - -0.46132758259773254, - -0.4972194731235504, - -0.5259842276573181, - -0.5554612874984741, - -0.5805566906929016, - -0.6011256575584412, - -0.620720624923706, - -0.6338445544242859, - -0.6421701908111572, - -0.6542209386825562, - -0.6547582745552063, - -0.6504875421524048, - -0.6414929628372192, - -0.6426220536231995, - -0.6260185837745667, - -0.604975163936615, - -0.5797035694122314, - -0.5702730417251587, - -0.5382753610610962, - -0.5026274919509888, - -0.4862741231918335, - -0.444942831993103, - -0.40072768926620483, - -0.35400837659835815, - -0.3297971785068512, - -0.27923211455345154, - -0.22711940109729767, - -0.1988571137189865, - -0.14455834031105042, - -0.08971892297267914, - -0.034773483872413635, - -0.0032774358987808228, - 0.05166421830654144, - 0.10567985475063324, - 0.15833929181098938, - 0.1900215893983841, - 0.2404107302427292, - 0.28846144676208496, - 0.318450927734375, - 0.36270684003829956, - 0.4037582278251648, - 0.4413085877895355, - 0.46650227904319763, - 0.4984695017337799, - 0.5262860655784607, - 0.5466063022613525, - 0.5678738355636597, - 0.5844971537590027, - 0.5963878035545349, - 0.6084100008010864, - 0.6129369735717773, - 0.6125881671905518, - 0.6073499917984009, - 0.6100589632987976, - 0.5973415374755859, - 0.5798882246017456, - 0.5757607221603394, - 0.5511680245399475, - 0.5222228169441223, - 0.48917868733406067, - 0.47606852650642395, - 0.4368879497051239, - 0.39428162574768066, - 0.37547004222869873, - 0.3278135061264038, - 0.277525931596756, - 0.22500203549861908, - 0.19999893009662628, - 0.14435580372810364, - 0.08744654059410095, - 0.029727116227149963, - 0.0009678304195404053, - -0.057664625346660614, - -0.11603009700775146, - -0.14588646590709686, - -0.20350223779678345, - -0.2598009705543518, - -0.31434154510498047, - -0.3431132435798645, - -0.39464202523231506, - -0.44345176219940186, - -0.4697651267051697, - -0.5140451192855835, - -0.5547241568565369, - -0.5914567708969116, - -0.6121114492416382, - -0.642626941204071, - -0.6685411930084229, - -0.6896885633468628, - -0.7026157975196838, - -0.7163175344467163, - -0.7248663902282715, - -0.7313686013221741, - -0.7319871783256531, - -0.7272921800613403, - -0.7172779440879822, - -0.7141537070274353, - -0.6961480379104614, - -0.6729942560195923, - -0.6629302501678467, - -0.6321297287940979, - -0.5965664386749268, - -0.5564976334571838, - -0.5373690128326416, - -0.49072349071502686, - -0.4402046799659729, - -0.3861745595932007, - -0.359448105096817, - -0.3004870116710663, - -0.23893007636070251, - -0.20792485773563385, - -0.1428895741701126, - -0.07629040628671646, - -0.008521927520632744, - 0.02612357586622238, - 0.0950724333524704, - 0.16405576467514038, -] +# [TODO] record a custom waveform into FMX file and check it here +EXPECTED_CUSTOM_WAVEFORM = [0] * 256 diff --git a/tests/ts/readwrite/analog-generator.sunsynth.test.ts b/tests/ts/readwrite/analog-generator.sunsynth.test.ts index 6c517bd..8c7e3d0 100644 --- a/tests/ts/readwrite/analog-generator.sunsynth.test.ts +++ b/tests/ts/readwrite/analog-generator.sunsynth.test.ts @@ -49,7 +49,7 @@ describe("Reading the analog-generator.sunsynth file", () => { expect(c.mode).toEqual(m.AnalogGenerator.Mode.Lq) expect(c.noise).toEqual(9) expect(c.osc2Volume).toEqual(20640) - expect(c.osc2Mode).toEqual(m.AnalogGenerator.Osc2Mode.Mul) + expect(c.osc2Mode).toEqual(m.AnalogGenerator.Osc2Mode.MaxAbs) const { o } = mod expect(o.volumeEnvelopeScalingPerKey).toEqual(true) @@ -76,7 +76,7 @@ describe("Reading the analog-generator.sunsynth file", () => { expectChunk({ name: "CVAL", type: "int32", value }) } expectChunk({ name: "SSYN", type: "empty" }) - expectChunk({ name: "VERS", type: "version", value: [2, 0, 0, 0] }) + expectChunk({ name: "VERS", type: "version", value: [2, 1, 2, 0] }) expectChunk({ name: "SFFF", type: "uint32", value: 0x02000049 }) expectChunk({ name: "SNAM", type: "fixedString", value: "analog-generator" }) expectChunk({ name: "STYP", type: "cstring", value: "Analog generator" }) @@ -108,7 +108,7 @@ describe("Reading the analog-generator.sunsynth file", () => { expectCval(2) expectCval(9) expectCval(20640) - expectCval(2) + expectCval(8) expectCval(0) const { name, type, values } = v() diff --git a/tests/ts/readwrite/fmx.sunsynth.test.ts b/tests/ts/readwrite/fmx.sunsynth.test.ts index a5c6564..b0f469b 100644 --- a/tests/ts/readwrite/fmx.sunsynth.test.ts +++ b/tests/ts/readwrite/fmx.sunsynth.test.ts @@ -49,7 +49,7 @@ describe("Reading the fmx.sunsynth file", () => { expect(c.op5Decay).toEqual(653) expect(c.op1SustainLevel).toEqual(1506) expect(c.op2SustainLevel).toEqual(2534) - expect(c.op3SustainLevel).toEqual(3252) + expect(c.op3SustainLevel).toEqual(3234) expect(c.op4SustainLevel).toEqual(23034) expect(c.op5SustainLevel).toEqual(3503) expect(c.op1Release).toEqual(6497) @@ -133,8 +133,8 @@ describe("Reading the fmx.sunsynth file", () => { expect(c.op4Feedback).toEqual(26614) expect(c.op5Feedback).toEqual(17200) expect(c.op1ModulationType).toEqual(m.Fmx.ModulationType.Sub) - expect(c.op2ModulationType).toEqual(m.Fmx.ModulationType.Frequency) - expect(c.op3ModulationType).toEqual(m.Fmx.ModulationType.AmplitudeMul) + expect(c.op2ModulationType).toEqual(m.Fmx.ModulationType.MinAbs) + expect(c.op3ModulationType).toEqual(m.Fmx.ModulationType.MaxAbs) expect(c.op4ModulationType).toEqual(m.Fmx.ModulationType.Min) expect(c.op5ModulationType).toEqual(m.Fmx.ModulationType.Sub) expect(c.op1OutputMode).toEqual(0) @@ -145,70 +145,20 @@ describe("Reading the fmx.sunsynth file", () => { }) const expectedCustomWaveform = new Float32Array([ - 0.23258860409259796, 0.28716719150543213, 0.33988499641418457, 0.3905003070831299, - 0.43874162435531616, 0.4843390882015228, 0.5272365808486938, 0.5672786235809326, - 0.6041287779808044, 0.6377434730529785, 0.6680856943130493, 0.6950294971466064, - 0.718247652053833, 0.7379667162895203, 0.7541000843048096, 0.7664385437965393, - 0.7750416398048401, 0.7800208926200867, 0.7814271450042725, 0.7789393663406372, - 0.772946298122406, 0.7635419964790344, 0.8365955948829651, 0.8237184882164001, - 0.8068667054176331, 0.7860580086708069, 0.7628260850906372, 0.7345373034477234, - 0.7025718092918396, 0.6699537038803101, 0.6312897205352783, 0.5893936157226562, - 0.544437050819397, 0.5012393593788147, 0.4510851502418518, 0.3985336422920227, - 0.3437948226928711, 0.2933891713619232, 0.23541350662708282, 0.17610563337802887, - 0.12288980931043625, 0.06199882552027702, 0.0006794976070523262, - -0.060750387609004974, -0.114327073097229, -0.1749647706747055, -0.23475059866905212, - -0.2859053313732147, -0.343142569065094, -0.39861631393432617, -0.45199453830718994, - -0.4964962601661682, -0.5451078414916992, -0.5907776355743408, -0.6332420110702515, - -0.6677308082580566, -0.7035722732543945, -0.7355403900146484, -0.761013388633728, - -0.7853280305862427, -0.8052794337272644, -0.8207546472549438, -0.8323591947555542, - -0.8393306732177734, -0.8415870070457458, -0.8425549268722534, -0.8361444473266602, - -0.8250311613082886, -0.8092741966247559, -0.7958842515945435, -0.7718666791915894, - -0.7435323596000671, -0.7110217809677124, -0.6845620274543762, -0.6449171304702759, - -0.6017055511474609, -0.5671621561050415, -0.5180232524871826, -0.4661105275154114, - -0.41174858808517456, -0.3687247335910797, -0.3105382025241852, -0.25084754824638367, - -0.2039089798927307, -0.14217057824134827, -0.07994867116212845, - -0.017657138407230377, 0.03120145946741104, 0.09301437437534332, 0.15382125973701477, - 0.21325230598449707, 0.2600589692592621, 0.31650879979133606, 0.37059485912323, - 0.41352012753486633, 0.46296000480651855, 0.509142279624939, 0.5518043637275696, - 0.586479663848877, 0.6226131916046143, 0.6545447111129761, 0.6815400123596191, - 0.7059248685836792, 0.7256537079811096, 0.7406331300735474, 0.7554891109466553, - 0.7621375918388367, 0.7638754844665527, 0.7607458829879761, 0.7625833749771118, - 0.7510920166969299, 0.7349019646644592, 0.7273757457733154, 0.7032579779624939, - 0.6748769283294678, 0.6424469947814941, 0.6230509281158447, 0.583917498588562, - 0.5414230823516846, 0.5146118998527527, 0.46669110655784607, 0.4162820279598236, - 0.3637271225452423, 0.32909584045410156, 0.27325761318206787, 0.21629741787910461, - 0.15865042805671692, 0.1194186806678772, 0.06085902452468872, 0.0026753395795822144, - -0.037727177143096924, -0.09500941634178162, -0.1508598029613495, - -0.20491887629032135, -0.24377082288265228, -0.29458335041999817, - -0.34262585639953613, -0.3875787854194641, -0.42161351442337036, -0.46132758259773254, - -0.4972194731235504, -0.5259842276573181, -0.5554612874984741, -0.5805566906929016, - -0.6011256575584412, -0.620720624923706, -0.6338445544242859, -0.6421701908111572, - -0.6542209386825562, -0.6547582745552063, -0.6504875421524048, -0.6414929628372192, - -0.6426220536231995, -0.6260185837745667, -0.604975163936615, -0.5797035694122314, - -0.5702730417251587, -0.5382753610610962, -0.5026274919509888, -0.4862741231918335, - -0.444942831993103, -0.40072768926620483, -0.35400837659835815, -0.3297971785068512, - -0.27923211455345154, -0.22711940109729767, -0.1988571137189865, -0.14455834031105042, - -0.08971892297267914, -0.034773483872413635, -0.0032774358987808228, - 0.05166421830654144, 0.10567985475063324, 0.15833929181098938, 0.1900215893983841, - 0.2404107302427292, 0.28846144676208496, 0.318450927734375, 0.36270684003829956, - 0.4037582278251648, 0.4413085877895355, 0.46650227904319763, 0.4984695017337799, - 0.5262860655784607, 0.5466063022613525, 0.5678738355636597, 0.5844971537590027, - 0.5963878035545349, 0.6084100008010864, 0.6129369735717773, 0.6125881671905518, - 0.6073499917984009, 0.6100589632987976, 0.5973415374755859, 0.5798882246017456, - 0.5757607221603394, 0.5511680245399475, 0.5222228169441223, 0.48917868733406067, - 0.47606852650642395, 0.4368879497051239, 0.39428162574768066, 0.37547004222869873, - 0.3278135061264038, 0.277525931596756, 0.22500203549861908, 0.19999893009662628, - 0.14435580372810364, 0.08744654059410095, 0.029727116227149963, 0.0009678304195404053, - -0.057664625346660614, -0.11603009700775146, -0.14588646590709686, - -0.20350223779678345, -0.2598009705543518, -0.31434154510498047, -0.3431132435798645, - -0.39464202523231506, -0.44345176219940186, -0.4697651267051697, -0.5140451192855835, - -0.5547241568565369, -0.5914567708969116, -0.6121114492416382, -0.642626941204071, - -0.6685411930084229, -0.6896885633468628, -0.7026157975196838, -0.7163175344467163, - -0.7248663902282715, -0.7313686013221741, -0.7319871783256531, -0.7272921800613403, - -0.7172779440879822, -0.7141537070274353, -0.6961480379104614, -0.6729942560195923, - -0.6629302501678467, -0.6321297287940979, -0.5965664386749268, -0.5564976334571838, - -0.5373690128326416, -0.49072349071502686, -0.4402046799659729, -0.3861745595932007, - -0.359448105096817, -0.3004870116710663, -0.23893007636070251, -0.20792485773563385, - -0.1428895741701126, -0.07629040628671646, -0.008521927520632744, 0.02612357586622238, - 0.0950724333524704, 0.16405576467514038, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + 0.0, ])