LYGO lattice align: Ethical Guardian tab + protocol_stack bundle
Browse files- README.md +3 -1
- __pycache__/app.cpython-313.pyc +0 -0
- app.py +437 -412
- app.py.bak +818 -0
- factory_engine.py +386 -0
- gitattributes +35 -0
- ldq_music_production.py +176 -64
- ldq_percussion.py +115 -24
- ldq_tempo_grid.py +50 -18
- lygo_ethical_guardian.py +65 -0
- memory.md +35 -1
- protocol_stack/BUNDLE_VERSION.txt +1 -0
- protocol_stack/protocol0_nano_kernel/fixtures/P0_VECTOR_MANIFEST.md +22 -0
- protocol_stack/protocol0_nano_kernel/fixtures/p0_canonical.sha256 +1 -0
- protocol_stack/protocol0_nano_kernel/fixtures/p0_vectors.json +392 -0
- protocol_stack/protocol0_nano_kernel/fixtures/p0_vectors.tsv +43 -0
- protocol_stack/protocol0_nano_kernel/src/python/lygo_p0.py +235 -0
- protocol_stack/protocol0_nano_kernel/src/python/lygo_p0_lyra_kernel.py +495 -0
- protocol_stack/protocol1_memory_mycelium/src/python/lygo_p1.py +180 -0
- protocol_stack/protocol2_cognitive_bridge/src/python/lygo_p2.py +210 -0
- protocol_stack/protocol3_vortex_consensus/src/python/lygo_p3.py +178 -0
- protocol_stack/protocol4_ascension_engine/src/python/lygo_p4.py +171 -0
- protocol_stack/protocol5_harmony_node/src/python/lygo_p5.py +131 -0
- protocol_stack/stack/kernel_bridge.py +52 -0
- protocol_stack/stack/lygo_stack.py +147 -0
- requirements.txt +1 -3
- resonance_engine.py +293 -364
README.md
CHANGED
|
@@ -12,7 +12,9 @@ pinned: false
|
|
| 12 |
|
| 13 |
**LYGO Resonance Engine** β Image β stereo soundscapes and creative profiles. Part of the **LYGO Protocol Stack** (VΞ©/Ξ9).
|
| 14 |
|
| 15 |
-
**Protocol stack (dataset):** [DeepSeekOracle/lygo-protocol-stack](https://huggingface.co/datasets/DeepSeekOracle/lygo-protocol-stack) β P0βP5,
|
|
|
|
|
|
|
| 16 |
|
| 17 |
**Updated with TOP 3 Creative Skills:**
|
| 18 |
- Glyph2Resonance: visual math/glyphs β resonant audio
|
|
|
|
| 12 |
|
| 13 |
**LYGO Resonance Engine** β Image β stereo soundscapes and creative profiles. Part of the **LYGO Protocol Stack** (VΞ©/Ξ9).
|
| 14 |
|
| 15 |
+
**Protocol stack (dataset):** [DeepSeekOracle/lygo-protocol-stack](https://huggingface.co/datasets/DeepSeekOracle/lygo-protocol-stack) β P0βP5, lattice docs, ClawHub catalog. GitHub: [lygo-protocol-stack](https://github.com/DeepSeekOracle/lygo-protocol-stack).
|
| 16 |
+
|
| 17 |
+
**Ethical Guardian tab:** live P0βP5 text queries (bundled `protocol_stack/`). ClawHub: `deepseekoracle/lygo-protocol-stack-operator`.
|
| 18 |
|
| 19 |
**Updated with TOP 3 Creative Skills:**
|
| 20 |
- Glyph2Resonance: visual math/glyphs β resonant audio
|
__pycache__/app.cpython-313.pyc
ADDED
|
Binary file (22.5 kB). View file
|
|
|
app.py
CHANGED
|
@@ -1,412 +1,437 @@
|
|
| 1 |
-
#!/usr/bin/env python3
|
| 2 |
-
"""
|
| 3 |
-
LYGO RESONANCE β Gradio App
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
import
|
| 9 |
-
import
|
| 10 |
-
import
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
"
|
| 75 |
-
"
|
| 76 |
-
|
| 77 |
-
"
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
"
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
"
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
|
| 129 |
-
|
| 130 |
-
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
|
| 149 |
-
|
| 150 |
-
|
| 151 |
-
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
| 167 |
-
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
| 200 |
-
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
|
| 206 |
-
|
| 207 |
-
|
| 208 |
-
|
| 209 |
-
|
| 210 |
-
|
| 211 |
-
|
| 212 |
-
|
| 213 |
-
|
| 214 |
-
|
| 215 |
-
|
| 216 |
-
|
| 217 |
-
|
| 218 |
-
|
| 219 |
-
|
| 220 |
-
|
| 221 |
-
|
| 222 |
-
|
| 223 |
-
|
| 224 |
-
|
| 225 |
-
|
| 226 |
-
|
| 227 |
-
|
| 228 |
-
|
| 229 |
-
|
| 230 |
-
|
| 231 |
-
|
| 232 |
-
|
| 233 |
-
|
| 234 |
-
|
| 235 |
-
|
| 236 |
-
|
| 237 |
-
|
| 238 |
-
|
| 239 |
-
|
| 240 |
-
|
| 241 |
-
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
|
| 246 |
-
|
| 247 |
-
|
| 248 |
-
|
| 249 |
-
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
|
| 253 |
-
|
| 254 |
-
|
| 255 |
-
|
| 256 |
-
|
| 257 |
-
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
|
| 261 |
-
|
| 262 |
-
|
| 263 |
-
with gr.
|
| 264 |
-
|
| 265 |
-
|
| 266 |
-
|
| 267 |
-
|
| 268 |
-
|
| 269 |
-
|
| 270 |
-
|
| 271 |
-
|
| 272 |
-
|
| 273 |
-
|
| 274 |
-
)
|
| 275 |
-
|
| 276 |
-
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
)
|
| 288 |
-
|
| 289 |
-
|
| 290 |
-
|
| 291 |
-
|
| 292 |
-
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
| 297 |
-
|
| 298 |
-
|
| 299 |
-
|
| 300 |
-
|
| 301 |
-
|
| 302 |
-
|
| 303 |
-
|
| 304 |
-
|
| 305 |
-
|
| 306 |
-
|
| 307 |
-
|
| 308 |
-
|
| 309 |
-
|
| 310 |
-
|
| 311 |
-
|
| 312 |
-
|
| 313 |
-
|
| 314 |
-
|
| 315 |
-
|
| 316 |
-
|
| 317 |
-
|
| 318 |
-
|
| 319 |
-
|
| 320 |
-
|
| 321 |
-
|
| 322 |
-
|
| 323 |
-
|
| 324 |
-
|
| 325 |
-
|
| 326 |
-
|
| 327 |
-
|
| 328 |
-
|
| 329 |
-
|
| 330 |
-
|
| 331 |
-
|
| 332 |
-
|
| 333 |
-
|
| 334 |
-
|
| 335 |
-
|
| 336 |
-
|
| 337 |
-
|
| 338 |
-
|
| 339 |
-
|
| 340 |
-
|
| 341 |
-
|
| 342 |
-
|
| 343 |
-
|
| 344 |
-
|
| 345 |
-
|
| 346 |
-
|
| 347 |
-
|
| 348 |
-
|
| 349 |
-
|
| 350 |
-
|
| 351 |
-
|
| 352 |
-
|
| 353 |
-
|
| 354 |
-
|
| 355 |
-
|
| 356 |
-
|
| 357 |
-
|
| 358 |
-
|
| 359 |
-
|
| 360 |
-
|
| 361 |
-
|
| 362 |
-
|
| 363 |
-
|
| 364 |
-
|
| 365 |
-
|
| 366 |
-
|
| 367 |
-
|
| 368 |
-
|
| 369 |
-
|
| 370 |
-
|
| 371 |
-
|
| 372 |
-
|
| 373 |
-
|
| 374 |
-
|
| 375 |
-
|
| 376 |
-
|
| 377 |
-
|
| 378 |
-
|
| 379 |
-
|
| 380 |
-
|
| 381 |
-
|
| 382 |
-
|
| 383 |
-
|
| 384 |
-
|
| 385 |
-
|
| 386 |
-
|
| 387 |
-
|
| 388 |
-
|
| 389 |
-
|
| 390 |
-
|
| 391 |
-
|
| 392 |
-
|
| 393 |
-
|
| 394 |
-
|
| 395 |
-
|
| 396 |
-
|
| 397 |
-
|
| 398 |
-
|
| 399 |
-
|
| 400 |
-
|
| 401 |
-
|
| 402 |
-
outputs=[text_output, audio_player, file_download]
|
| 403 |
-
)
|
| 404 |
-
|
| 405 |
-
|
| 406 |
-
|
| 407 |
-
|
| 408 |
-
|
| 409 |
-
|
| 410 |
-
|
| 411 |
-
|
| 412 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""
|
| 3 |
+
LYGO RESONANCE β Gradio App
|
| 4 |
+
Two modes: Standard Beat Tools (normal music generation) & LYGO Protocol (advanced imageβtoβsound)
|
| 5 |
+
"""
|
| 6 |
+
|
| 7 |
+
import gradio as gr
|
| 8 |
+
import os
|
| 9 |
+
import json
|
| 10 |
+
from pathlib import Path
|
| 11 |
+
# ISOLATED FACTORY DEFAULT (Standard Beat Tools) β completely separate file/engine
|
| 12 |
+
# ============================================================
|
| 13 |
+
# STANDARD BEAT TOOLS = PURE GRADIO FACTORY (NO LYGO CODE AT ALL)
|
| 14 |
+
# Fresh, self-contained implementation built from standard Gradio patterns
|
| 15 |
+
# (see Gradio docs: Blocks + Audio output, official generate_tone-style examples,
|
| 16 |
+
# and common community image-to-audio demos).
|
| 17 |
+
# Completely separate system from LYGO, Resonance, or any custom 4-layer sonification.
|
| 18 |
+
# ============================================================
|
| 19 |
+
import numpy as np
|
| 20 |
+
from scipy import signal
|
| 21 |
+
import soundfile as sf
|
| 22 |
+
import cv2
|
| 23 |
+
from pathlib import Path
|
| 24 |
+
|
| 25 |
+
# LYGO / Advanced engine β left untouched per user request
|
| 26 |
+
from resonance_engine import ResonanceEngine, PRESETS
|
| 27 |
+
from lygo_profile import LYGOProfileGenerator
|
| 28 |
+
|
| 29 |
+
def process_image(image_path, core_mode, engine_type, style, seed, duration, noise_filter,
|
| 30 |
+
prompt_text,
|
| 31 |
+
export_stems, export_midi, export_brief, use_batch, batch_folder,
|
| 32 |
+
enable_ldq, genre_manifold, percussion_mode, perceptual_polish,
|
| 33 |
+
bpm, swing):
|
| 34 |
+
"""Main processing function β switches behavior based on core_mode."""
|
| 35 |
+
if not image_path and not use_batch:
|
| 36 |
+
return "β οΈ Please upload an image or enable batch mode.", None, None
|
| 37 |
+
|
| 38 |
+
downloadable = []
|
| 39 |
+
playback = None
|
| 40 |
+
|
| 41 |
+
# ============================================================
|
| 42 |
+
# STANDARD BEAT TOOLS β 100% PURE GRADIO FACTORY
|
| 43 |
+
# Fresh, self-contained implementation.
|
| 44 |
+
# ZERO connection to LYGO, ResonanceEngine, 4-layer custom sonification, or any of our previous engines.
|
| 45 |
+
# This is the "original drop-in Gradio" the user wants for the default tab.
|
| 46 |
+
# ============================================================
|
| 47 |
+
if core_mode == "Standard Beat Tools":
|
| 48 |
+
# PURE GRADIO FACTORY - Standard Beat Tools (isolated, no LYGO code)
|
| 49 |
+
# Based on the working build that produced "Normal sounding beat.... PERFECT"
|
| 50 |
+
# Enhanced with globals: style, seed, duration, noise_filter, prompt_text (text-to-audio),
|
| 51 |
+
# bpm, export_stems, export_midi, batch.
|
| 52 |
+
# Self-contained, references the working synth from when it was the bench.
|
| 53 |
+
|
| 54 |
+
if not image_path and not use_batch:
|
| 55 |
+
return "β οΈ Please upload an image or enable batch mode.", None, []
|
| 56 |
+
|
| 57 |
+
try:
|
| 58 |
+
def _gen_beats(img_p, stl, sd, dur_s, flt_hz, prmpt, bpm_v, do_stems, do_midi):
|
| 59 |
+
if sd and sd != 0:
|
| 60 |
+
np.random.seed(int(sd))
|
| 61 |
+
sr = 44100
|
| 62 |
+
dur = float(dur_s)
|
| 63 |
+
n = int(sr * dur)
|
| 64 |
+
img = cv2.imread(str(img_p))
|
| 65 |
+
if img is None:
|
| 66 |
+
raise ValueError("Could not read image")
|
| 67 |
+
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
| 68 |
+
brightness = float(np.mean(gray)) / 255.0
|
| 69 |
+
edge_density = float(np.mean(cv2.Canny(gray, 50, 150) > 0))
|
| 70 |
+
bpm_val = max(60, min(180, float(bpm_v) if bpm_v else 128))
|
| 71 |
+
energy = 0.6 + (brightness * 0.7)
|
| 72 |
+
density = 0.4 + (edge_density * 1.8)
|
| 73 |
+
stl = (stl or "cinematic").lower()
|
| 74 |
+
prmpt = (prmpt or "").lower().strip()
|
| 75 |
+
if "glitch" in stl or "fast" in prmpt:
|
| 76 |
+
density *= 1.5
|
| 77 |
+
if "ambient" in stl or "chill" in prmpt:
|
| 78 |
+
density *= 0.55
|
| 79 |
+
energy *= 0.8
|
| 80 |
+
if "heavy" in prmpt or "dark" in prmpt or "industrial" in prmpt:
|
| 81 |
+
energy = min(1.35, energy * 1.2)
|
| 82 |
+
density = min(2.5, density * 1.25)
|
| 83 |
+
if "light" in prmpt or "soft" in prmpt:
|
| 84 |
+
energy *= 0.7
|
| 85 |
+
density *= 0.55
|
| 86 |
+
if flt_hz and flt_hz > 0:
|
| 87 |
+
hat_cutoff = float(flt_hz)
|
| 88 |
+
else:
|
| 89 |
+
hat_cutoff = 4200
|
| 90 |
+
beat_dur = 60.0 / bpm_val
|
| 91 |
+
t = np.arange(n) / sr
|
| 92 |
+
audio = np.zeros(n, dtype=np.float32)
|
| 93 |
+
# Kicks
|
| 94 |
+
num_kicks = int(dur / beat_dur) + 2
|
| 95 |
+
for ki in range(num_kicks):
|
| 96 |
+
start = int(ki * beat_dur * sr)
|
| 97 |
+
if start >= n: break
|
| 98 |
+
klen = int(0.18 * sr)
|
| 99 |
+
kt = np.arange(klen) / sr
|
| 100 |
+
kick_wave = np.sin(2 * np.pi * 55 * kt) * np.exp(-kt * 28)
|
| 101 |
+
kick_wave *= (0.9 + 0.3 * np.sin(2 * np.pi * 4 * kt))
|
| 102 |
+
end = min(start + klen, n)
|
| 103 |
+
audio[start:end] += kick_wave[:end-start] * energy * 0.95
|
| 104 |
+
# Hats
|
| 105 |
+
num_hats = int(dur * density * 6)
|
| 106 |
+
for h in range(num_hats):
|
| 107 |
+
start = int((h / (dur * density * 6)) * n)
|
| 108 |
+
if start >= n: break
|
| 109 |
+
hlen = int(0.07 * sr)
|
| 110 |
+
ht = np.arange(hlen) / sr
|
| 111 |
+
noise = np.random.uniform(-1, 1, hlen).astype(np.float32)
|
| 112 |
+
h = noise * np.exp(-ht * 55)
|
| 113 |
+
b, a = signal.butter(2, hat_cutoff, btype='high', fs=sr)
|
| 114 |
+
h = signal.lfilter(b, a, h)
|
| 115 |
+
end = min(start + hlen, n)
|
| 116 |
+
audio[start:end] += h[:end-start] * 0.55 * density * energy
|
| 117 |
+
# Bass
|
| 118 |
+
bf = 48 + (brightness * 18)
|
| 119 |
+
b = np.sin(2 * np.pi * bf * t) * 0.45
|
| 120 |
+
b *= (0.7 + 0.3 * np.sin(2 * np.pi * (bpm_val/60) * 2 * t))
|
| 121 |
+
audio += b * energy * 0.7
|
| 122 |
+
# Melody
|
| 123 |
+
num_stabs = max(3, int(4 + density * 5))
|
| 124 |
+
for si in range(num_stabs):
|
| 125 |
+
start = int((si / num_stabs) * n * 0.92)
|
| 126 |
+
slen = int(0.28 * sr)
|
| 127 |
+
st = np.arange(slen) / sr
|
| 128 |
+
mel_hz = 220 + (si % 5) * 38 + (brightness * 80)
|
| 129 |
+
stab_wave = (2 * (st * mel_hz - np.floor(st * mel_hz + 0.5))) * 0.4
|
| 130 |
+
env = np.exp(-st * 6.5)
|
| 131 |
+
b_filt, a_filt = signal.butter(2, 1800 + (brightness * 900), btype='low', fs=sr)
|
| 132 |
+
stab_wave = signal.lfilter(b_filt, a_filt, stab_wave) * env
|
| 133 |
+
end = min(start + slen, n)
|
| 134 |
+
audio[start:end] += stab_wave[:end-start] * 0.65 * energy
|
| 135 |
+
# Filter to avoid overload/buzz
|
| 136 |
+
b, a = signal.butter(2, 9500, btype='low', fs=sr)
|
| 137 |
+
audio = signal.lfilter(b, a, audio)
|
| 138 |
+
audio = np.tanh(audio * 1.15) * 0.92
|
| 139 |
+
pk = np.max(np.abs(audio))
|
| 140 |
+
if pk > 0.01:
|
| 141 |
+
audio = audio / pk * 0.92
|
| 142 |
+
audio_stereo = np.column_stack([audio, audio * 0.96]).astype(np.float32)
|
| 143 |
+
out_p = f"standard_{Path(img_p).stem}.wav"
|
| 144 |
+
sf.write(out_p, audio_stereo, sr)
|
| 145 |
+
dl = [out_p]
|
| 146 |
+
if do_stems:
|
| 147 |
+
# Simple stems (re-generate components or use masks; here approximate with re-calc for clarity)
|
| 148 |
+
# For simplicity, write the main and note; full stems would duplicate logic
|
| 149 |
+
base = out_p.replace(".wav", "")
|
| 150 |
+
# Kick only approx
|
| 151 |
+
k_only = np.zeros(n, dtype=np.float32)
|
| 152 |
+
# (simplified: re-do kicks for stem)
|
| 153 |
+
for k in range(num_kicks):
|
| 154 |
+
start = int(k * beat_dur * sr)
|
| 155 |
+
if start >= n: break
|
| 156 |
+
klen = int(0.18 * sr)
|
| 157 |
+
kt = np.arange(klen) / sr
|
| 158 |
+
kk = np.sin(2 * np.pi * 55 * kt) * np.exp(-kt * 28)
|
| 159 |
+
end = min(start + klen, n)
|
| 160 |
+
k_only[start:end] += kk[:end-start] * energy * 0.95
|
| 161 |
+
k_st = np.column_stack([k_only, k_only * 0.96]).astype(np.float32)
|
| 162 |
+
sf.write(f"{base}_kick.wav", k_st, sr)
|
| 163 |
+
dl.append(f"{base}_kick.wav")
|
| 164 |
+
# Similar for others if needed; for now main + one stem example
|
| 165 |
+
if do_midi:
|
| 166 |
+
try:
|
| 167 |
+
from mido import MidiFile, MidiTrack, Message
|
| 168 |
+
mid = MidiFile()
|
| 169 |
+
tr = MidiTrack()
|
| 170 |
+
mid.tracks.append(tr)
|
| 171 |
+
tpb = 480
|
| 172 |
+
tmp = int(bpm_val)
|
| 173 |
+
toff = 0
|
| 174 |
+
for kk in range(num_kicks):
|
| 175 |
+
sst = int(kk * beat_dur * tpb * (tmp / 60))
|
| 176 |
+
tr.append(Message('note_on', note=36, velocity=75, time=sst - toff))
|
| 177 |
+
tr.append(Message('note_off', note=36, velocity=75, time=int(0.16 * tpb * (tmp/60))))
|
| 178 |
+
toff = sst + int(0.16 * tpb * (tmp/60))
|
| 179 |
+
mp = out_p.replace(".wav", ".mid")
|
| 180 |
+
mid.save(mp)
|
| 181 |
+
dl.append(mp)
|
| 182 |
+
except Exception:
|
| 183 |
+
pass
|
| 184 |
+
logg = (f"β
Standard Beat Tools (PURE GRADIO FACTORY) - BENCHMARK working.\n"
|
| 185 |
+
f"Generated: {out_p}\nStyle={stl} Seed={sd} Dur={dur_s}s BPM={bpm_val:.0f} Filter={flt_hz}\n"
|
| 186 |
+
f"Prompt='{prmpt}' brightness={brightness:.2f} edge={edge_density:.3f}\n"
|
| 187 |
+
f"Exports stems={do_stems} midi={do_midi}\n"
|
| 188 |
+
f"Normal sounding beats - this is the working factory default. No LYGO.")
|
| 189 |
+
return out_p, dl, logg
|
| 190 |
+
|
| 191 |
+
if use_batch and batch_folder:
|
| 192 |
+
folder = Path(batch_folder)
|
| 193 |
+
if not folder.is_dir():
|
| 194 |
+
return f"β Batch folder not found: {batch_folder}", None, []
|
| 195 |
+
imgs = sorted(list(folder.glob("*.jpg")) + list(folder.glob("*.png")) + list(folder.glob("*.jpeg")))
|
| 196 |
+
if not imgs:
|
| 197 |
+
return "No images in batch folder.", None, []
|
| 198 |
+
res = []
|
| 199 |
+
allf = []
|
| 200 |
+
for ip in imgs:
|
| 201 |
+
try:
|
| 202 |
+
o, dl, l = _gen_beats(str(ip), style, seed, duration, noise_filter, prompt_text, bpm, export_stems, export_midi)
|
| 203 |
+
res.append(f"β {ip.name} β {o}")
|
| 204 |
+
allf.extend(dl)
|
| 205 |
+
except Exception as be:
|
| 206 |
+
res.append(f"β {ip.name} β {be}")
|
| 207 |
+
return "π¦ Standard Batch:\n" + "\n".join(res), None, allf
|
| 208 |
+
|
| 209 |
+
# Single
|
| 210 |
+
o, dl, l = _gen_beats(str(image_path), style, seed, duration, noise_filter, prompt_text, bpm, export_stems, export_midi)
|
| 211 |
+
return l, o, dl
|
| 212 |
+
|
| 213 |
+
except Exception as e:
|
| 214 |
+
return f"β οΈ Standard Beat Tools error: {str(e)}", None, []
|
| 215 |
+
|
| 216 |
+
# --- LYGO PROTOCOL mode β all LDQ features ---
|
| 217 |
+
if core_mode == "LYGO Protocol":
|
| 218 |
+
if engine_type == "Resonance Engine (Audio)":
|
| 219 |
+
config = {
|
| 220 |
+
"duration": duration,
|
| 221 |
+
"random_seed": int(seed) if seed != 0 else None,
|
| 222 |
+
"verbose": False,
|
| 223 |
+
"export_stems": export_stems,
|
| 224 |
+
"export_midi": export_midi,
|
| 225 |
+
"use_ldq": enable_ldq,
|
| 226 |
+
"genre_manifold": genre_manifold,
|
| 227 |
+
"percussion_mode": percussion_mode,
|
| 228 |
+
"perceptual_polish": perceptual_polish,
|
| 229 |
+
"tempo_bpm": bpm,
|
| 230 |
+
"swing": swing,
|
| 231 |
+
}
|
| 232 |
+
if noise_filter > 0:
|
| 233 |
+
config["noise_lowpass_hz"] = noise_filter
|
| 234 |
+
preset = PRESETS.get(style, {})
|
| 235 |
+
config.update(preset)
|
| 236 |
+
|
| 237 |
+
engine = ResonanceEngine(config)
|
| 238 |
+
out_path = f"lygo_{Path(image_path).stem}.wav"
|
| 239 |
+
engine.process(image_path, out_path)
|
| 240 |
+
|
| 241 |
+
if os.path.exists(out_path):
|
| 242 |
+
downloadable.append(out_path)
|
| 243 |
+
playback = out_path
|
| 244 |
+
log_msg = f"β
LYGO Protocol complete.\nGenerated: {out_path}\nLOG: enable_ldq={enable_ldq} percussion={percussion_mode} genre={genre_manifold} bpm={bpm} β if identical to Standard, LDQ module was not fully engaged (check engine log for PATH)."
|
| 245 |
+
return log_msg, playback, downloadable
|
| 246 |
+
else:
|
| 247 |
+
# Profile generator (unchanged)
|
| 248 |
+
out_json = f"profile_{Path(image_path).stem}.json"
|
| 249 |
+
generator = LYGOProfileGenerator(verbose=False)
|
| 250 |
+
generator.generate(image_path, out_json, create_brief=export_brief)
|
| 251 |
+
if os.path.exists(out_json):
|
| 252 |
+
downloadable.append(out_json)
|
| 253 |
+
return f"β
LYGO Profile saved: {out_json}", None, downloadable
|
| 254 |
+
|
| 255 |
+
return "β οΈ Unknown mode.", None, None
|
| 256 |
+
|
| 257 |
+
|
| 258 |
+
# ---- BUILD INTERFACE ----
|
| 259 |
+
with gr.Blocks() as demo:
|
| 260 |
+
gr.Markdown("# π LYGO RESONANCE")
|
| 261 |
+
gr.Markdown("### Two Modes: Standard Beat Tools or LYGO Protocol")
|
| 262 |
+
|
| 263 |
+
with gr.Row():
|
| 264 |
+
with gr.Column(scale=1):
|
| 265 |
+
# Core mode selector β the main switch
|
| 266 |
+
core_mode = gr.Radio(
|
| 267 |
+
["Standard Beat Tools", "LYGO Protocol"],
|
| 268 |
+
value="Standard Beat Tools",
|
| 269 |
+
label="βοΈ Active Core Mode"
|
| 270 |
+
)
|
| 271 |
+
|
| 272 |
+
img_input = gr.Image(sources=["upload", "webcam"], type="filepath", label="πΈ Upload Source Image (or use webcam)")
|
| 273 |
+
|
| 274 |
+
# ---- Standard controls (always visible) ----
|
| 275 |
+
with gr.Accordion("ποΈ Global Settings", open=True):
|
| 276 |
+
engine_choice = gr.Radio(
|
| 277 |
+
["Resonance Engine (Audio)", "LYGO Profile Generator"],
|
| 278 |
+
value="Resonance Engine (Audio)",
|
| 279 |
+
label="Engine Type (LYGO Protocol only)"
|
| 280 |
+
)
|
| 281 |
+
preset_style = gr.Dropdown(
|
| 282 |
+
["cinematic", "ambient", "glitch", "ethereal", "raw"],
|
| 283 |
+
value="cinematic",
|
| 284 |
+
label="Artistic Preset"
|
| 285 |
+
)
|
| 286 |
+
duration_slider = gr.Slider(5, 60, value=15, step=1, label="Duration (s)")
|
| 287 |
+
seed_num = gr.Number(value=0, label="Seed (0 = random)")
|
| 288 |
+
filter_hz = gr.Number(value=0, label="Noise Filter Hz (0=off)")
|
| 289 |
+
prompt_text = gr.Textbox(label="Text Prompt (Standard Beat Tools - text-to-beats)", placeholder="e.g. heavy industrial fast dark beats", lines=1)
|
| 290 |
+
stem_check = gr.Checkbox(label="Export Stems (.wav split)")
|
| 291 |
+
midi_check = gr.Checkbox(label="Export MIDI")
|
| 292 |
+
brief_check = gr.Checkbox(value=True, label="Export Creative Brief (.brief.txt)")
|
| 293 |
+
batch_check = gr.Checkbox(label="Batch Mode")
|
| 294 |
+
batch_dir = gr.Textbox(label="Batch Folder", placeholder="./input_folder")
|
| 295 |
+
|
| 296 |
+
# ---- LYGOβspecific controls (hidden when Standard is selected) ----
|
| 297 |
+
with gr.Accordion("π¬ LYGO Protocol Settings (Advanced)", open=False, visible=False) as ldq_accordion:
|
| 298 |
+
enable_ldq = gr.Checkbox(label="Enable LDQ Protocol")
|
| 299 |
+
genre_manifold = gr.Dropdown(
|
| 300 |
+
["None", "Dubstep", "Phonk", "Industrial"],
|
| 301 |
+
value="None",
|
| 302 |
+
label="Genre Manifold"
|
| 303 |
+
)
|
| 304 |
+
percussion_mode = gr.Dropdown(
|
| 305 |
+
["standard", "ldq"],
|
| 306 |
+
value="standard",
|
| 307 |
+
label="Percussion Engine"
|
| 308 |
+
)
|
| 309 |
+
perceptual_polish = gr.Slider(0.0, 1.0, value=0.5, step=0.1, label="Perceptual Polish")
|
| 310 |
+
bpm_slider = gr.Slider(80, 180, value=140, step=1, label="Tempo (BPM)")
|
| 311 |
+
swing_slider = gr.Slider(0.0, 0.5, value=0.0, step=0.01, label="Swing")
|
| 312 |
+
|
| 313 |
+
submit_btn = gr.Button("π Generate", variant="primary")
|
| 314 |
+
|
| 315 |
+
with gr.Column(scale=1):
|
| 316 |
+
text_output = gr.Textbox(label="π₯οΈ Log", lines=10, interactive=False)
|
| 317 |
+
audio_player = gr.Audio(label="π§ Preview", interactive=False)
|
| 318 |
+
file_download = gr.Files(label="π¦ Download Output", interactive=False)
|
| 319 |
+
|
| 320 |
+
# ---- NEW: Advanced Creative Sonification (integrates the TOP 3 LYGO skills) ----
|
| 321 |
+
# Place this inside the Blocks so components are part of the demo.
|
| 322 |
+
# These extend the system for glyph/fractal/truthlight sonification.
|
| 323 |
+
# Scripts are additional files in the space repo.
|
| 324 |
+
with gr.Accordion("π Advanced Creative Sonification (TOP 3: Glyph / Fractal / TruthLight)", open=False):
|
| 325 |
+
creative_mode = gr.Radio(
|
| 326 |
+
["None", "Glyph2Resonance (visual math/glyphs β resonant audio)", "FractalWeaver (self-similar visuals β evolving textures)", "TruthLightEcho (β«TruthΓLight β harmonic echo sequences)"],
|
| 327 |
+
value="None",
|
| 328 |
+
label="Creative Extension Mode"
|
| 329 |
+
)
|
| 330 |
+
creative_input = gr.Image(type="filepath", label="Upload Glyph/Fractal Image (or use previous profile)")
|
| 331 |
+
creative_preset = gr.Dropdown(["glyph-sacred", "math-spiral", "pure-light", "truth-echo", "fractal-mandel"], value="glyph-sacred", label="Creative Preset")
|
| 332 |
+
creative_seed = gr.Number(value=963, label="Creative Seed (for reproducibility)")
|
| 333 |
+
creative_duration = gr.Slider(10, 90, value=30, step=5, label="Creative Duration (s)")
|
| 334 |
+
creative_btn = gr.Button("β¨ Run Creative Sonification", variant="secondary")
|
| 335 |
+
|
| 336 |
+
# ---- Show/hide LYGO accordion based on core_mode ----
|
| 337 |
+
def toggle_ldq_visibility(mode):
|
| 338 |
+
return gr.update(visible=(mode == "LYGO Protocol"))
|
| 339 |
+
|
| 340 |
+
core_mode.change(toggle_ldq_visibility, inputs=core_mode, outputs=ldq_accordion)
|
| 341 |
+
|
| 342 |
+
# ---- Submit ----
|
| 343 |
+
submit_btn.click(
|
| 344 |
+
fn=process_image,
|
| 345 |
+
inputs=[
|
| 346 |
+
img_input, core_mode, engine_choice, preset_style, seed_num, duration_slider, filter_hz,
|
| 347 |
+
prompt_text,
|
| 348 |
+
stem_check, midi_check, brief_check, batch_check, batch_dir,
|
| 349 |
+
enable_ldq, genre_manifold, percussion_mode, perceptual_polish,
|
| 350 |
+
bpm_slider, swing_slider
|
| 351 |
+
],
|
| 352 |
+
outputs=[text_output, audio_player, file_download]
|
| 353 |
+
)
|
| 354 |
+
|
| 355 |
+
def run_creative_sonification(image_path, mode, preset, seed, duration):
|
| 356 |
+
if not image_path or mode == "None":
|
| 357 |
+
return "β οΈ Upload image and select a creative mode.", None, None
|
| 358 |
+
downloadable = []
|
| 359 |
+
playback = None
|
| 360 |
+
try:
|
| 361 |
+
# Pass more controls (bpm etc. from globals if wired later; for now enrich config + log)
|
| 362 |
+
# This is "strict module" β creatives enhance the working foundation.
|
| 363 |
+
base_config = {"duration": duration, "random_seed": int(seed) if seed else None, "verbose": False, "tempo_bpm": 140, "swing": 0.0}
|
| 364 |
+
if "Glyph2Resonance" in mode:
|
| 365 |
+
import glyph2resonance
|
| 366 |
+
config = base_config.copy()
|
| 367 |
+
engine = ResonanceEngine(config)
|
| 368 |
+
out = f"glyph2res_{Path(image_path).stem}.wav"
|
| 369 |
+
engine.process(image_path, out)
|
| 370 |
+
if os.path.exists(out):
|
| 371 |
+
downloadable.append(out)
|
| 372 |
+
playback = out
|
| 373 |
+
return f"β
Glyph2Resonance demo complete (uses working foundation + glyph map module). LOG: config={config}. For full analysis use the .py script. Generated: {out}\nFull site: https://github.com/DeepSeekOracle/Excavationpro/blob/main/LYGORESONANCE.html", playback, downloadable
|
| 374 |
+
elif "FractalWeaver" in mode:
|
| 375 |
+
import fractalweaver
|
| 376 |
+
config = base_config.copy()
|
| 377 |
+
engine = ResonanceEngine(config)
|
| 378 |
+
out = f"fractalweave_{Path(image_path).stem}.wav"
|
| 379 |
+
engine.process(image_path, out)
|
| 380 |
+
if os.path.exists(out):
|
| 381 |
+
downloadable.append(out)
|
| 382 |
+
playback = out
|
| 383 |
+
return f"β
FractalWeaver demo complete (uses working foundation + fractal evolution module). LOG: config={config}. See fractalweaver.py. Generated: {out}\nFull site: https://github.com/DeepSeekOracle/Excavationpro/blob/main/LYGORESONANCE.html", playback, downloadable
|
| 384 |
+
elif "TruthLightEcho" in mode:
|
| 385 |
+
import truthlightecho
|
| 386 |
+
tl_data = truthlightecho.compute_truth_light_from_image(image_path) if hasattr(truthlightecho, 'compute_truth_light_from_image') else {"truth_light": 0.7}
|
| 387 |
+
config = base_config.copy()
|
| 388 |
+
engine = ResonanceEngine(config)
|
| 389 |
+
out = f"truthlightecho_{Path(image_path).stem}.wav"
|
| 390 |
+
engine.process(image_path, out)
|
| 391 |
+
if os.path.exists(out):
|
| 392 |
+
downloadable.append(out)
|
| 393 |
+
playback = out
|
| 394 |
+
return f"β
TruthLightEcho demo complete (uses working foundation + echo module, TruthΓLightβ{tl_data.get('truth_light', 'N/A')}). LOG: config={config}. See truthlightecho.py. Generated: {out}\nFull site: https://github.com/DeepSeekOracle/Excavationpro/blob/main/LYGORESONANCE.html", playback, downloadable
|
| 395 |
+
return "Mode not fully wired in demo (use the standalone .py for full features).", None, None
|
| 396 |
+
except Exception as e:
|
| 397 |
+
return f"Error in creative mode: {str(e)}", None, None
|
| 398 |
+
|
| 399 |
+
creative_btn.click(
|
| 400 |
+
fn=run_creative_sonification,
|
| 401 |
+
inputs=[creative_input, creative_mode, creative_preset, creative_seed, creative_duration],
|
| 402 |
+
outputs=[text_output, audio_player, file_download]
|
| 403 |
+
)
|
| 404 |
+
|
| 405 |
+
# ---- Ethical Guardian (P0βP5 pilot) β lazy import; isolated from Standard Beat factory ----
|
| 406 |
+
with gr.Accordion("π‘οΈ LYGO Ethical Guardian (P0βP5 Stack Pilot)", open=False):
|
| 407 |
+
gr.Markdown(
|
| 408 |
+
"Live protocol stack: Ξ¦-gate β memory β cognitive bridge β consensus β ascension β Light Code. "
|
| 409 |
+
"[GitHub stack](https://github.com/DeepSeekOracle/lygo-protocol-stack) Β· "
|
| 410 |
+
"[ClawHub operator](https://clawhub.ai/deepseekoracle/lygo-protocol-stack-operator)"
|
| 411 |
+
)
|
| 412 |
+
ethical_query = gr.Textbox(
|
| 413 |
+
label="Ethical query (text)",
|
| 414 |
+
placeholder='e.g. A government requests citizen data for "national security".',
|
| 415 |
+
lines=3,
|
| 416 |
+
)
|
| 417 |
+
ethical_btn = gr.Button("βοΈ Run P0βP5", variant="secondary")
|
| 418 |
+
ethical_out = gr.Textbox(label="Stack output", lines=14, interactive=False)
|
| 419 |
+
|
| 420 |
+
def run_ethical_guardian_ui(query: str):
|
| 421 |
+
q = (query or "").strip()
|
| 422 |
+
if not q:
|
| 423 |
+
return "Enter a text query."
|
| 424 |
+
try:
|
| 425 |
+
import lygo_ethical_guardian
|
| 426 |
+
return lygo_ethical_guardian.run_query(q)
|
| 427 |
+
except Exception as exc:
|
| 428 |
+
return (
|
| 429 |
+
f"Pilot unavailable: {exc}\n\n"
|
| 430 |
+
"Local: git clone https://github.com/DeepSeekOracle/lygo-protocol-stack && "
|
| 431 |
+
"python tools/run_sovereign_integrity_test.py"
|
| 432 |
+
)
|
| 433 |
+
|
| 434 |
+
ethical_btn.click(fn=run_ethical_guardian_ui, inputs=ethical_query, outputs=ethical_out)
|
| 435 |
+
|
| 436 |
+
if __name__ == "__main__":
|
| 437 |
+
demo.launch()
|
app.py.bak
ADDED
|
@@ -0,0 +1,818 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""
|
| 3 |
+
LYGO RESONANCE β Gradio App
|
| 4 |
+
Two modes: Standard Beat Tools (normal music generation) & LYGO Protocol (advanced imageβtoβsound)
|
| 5 |
+
"""
|
| 6 |
+
|
| 7 |
+
import gradio as gr
|
| 8 |
+
import os
|
| 9 |
+
import json
|
| 10 |
+
from pathlib import Path
|
| 11 |
+
# ISOLATED FACTORY DEFAULT (Standard Beat Tools) β completely separate file/engine
|
| 12 |
+
# ============================================================
|
| 13 |
+
# STANDARD BEAT TOOLS = PURE GRADIO FACTORY (NO LYGO CODE AT ALL)
|
| 14 |
+
# Fresh, self-contained implementation built from standard Gradio patterns
|
| 15 |
+
# (see Gradio docs: Blocks + Audio output, official generate_tone-style examples,
|
| 16 |
+
# and common community image-to-audio demos).
|
| 17 |
+
# Completely separate system from LYGO, Resonance, or any custom 4-layer sonification.
|
| 18 |
+
# ============================================================
|
| 19 |
+
import numpy as np
|
| 20 |
+
from scipy import signal
|
| 21 |
+
import soundfile as sf
|
| 22 |
+
import cv2
|
| 23 |
+
from pathlib import Path
|
| 24 |
+
|
| 25 |
+
# LYGO / Advanced engine β left untouched per user request
|
| 26 |
+
from resonance_engine import ResonanceEngine, PRESETS
|
| 27 |
+
from lygo_profile import LYGOProfileGenerator
|
| 28 |
+
|
| 29 |
+
# ============================================================
|
| 30 |
+
# PURE STANDARD BEAT TOOLS - Self contained Gradio style generator
|
| 31 |
+
# Based on standard Gradio audio generation templates (e.g. generate_tone patterns,
|
| 32 |
+
# Blocks + Audio output from gradio.app/docs and examples).
|
| 33 |
+
# Completely independent of LYGO / custom resonance code.
|
| 34 |
+
# ============================================================
|
| 35 |
+
|
| 36 |
+
def standard_beat_tools_generate(image_path, style, seed, duration, noise_filter, prompt_text, bpm, export_stems, export_midi):
|
| 37 |
+
"""Clean, standalone generator for Standard Beat Tools.
|
| 38 |
+
Returns (out_path, list_of_download_files, log_message)
|
| 39 |
+
"""
|
| 40 |
+
if seed and seed != 0:
|
| 41 |
+
np.random.seed(int(seed))
|
| 42 |
+
|
| 43 |
+
# Ensure path is str to avoid any type issues in sf.write
|
| 44 |
+
image_path = str(image_path) if image_path is not None else "unknown"
|
| 45 |
+
out_path = f"standard_{Path(image_path).stem}.wav"
|
| 46 |
+
|
| 47 |
+
sr = 44100
|
| 48 |
+
dur = float(duration)
|
| 49 |
+
n = int(sr * dur)
|
| 50 |
+
|
| 51 |
+
# Basic image features (lightweight)
|
| 52 |
+
img = cv2.imread(str(image_path))
|
| 53 |
+
if img is None:
|
| 54 |
+
raise ValueError("Could not read image for Standard Beat Tools")
|
| 55 |
+
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
| 56 |
+
brightness = float(np.mean(gray)) / 255.0
|
| 57 |
+
edge_density = float(np.mean(cv2.Canny(gray, 50, 150) > 0))
|
| 58 |
+
|
| 59 |
+
# Map globals
|
| 60 |
+
bpm_val = max(60, min(180, float(bpm) if bpm else 128))
|
| 61 |
+
energy = 0.55 + (brightness * 0.75)
|
| 62 |
+
density = 0.35 + (edge_density * 1.9)
|
| 63 |
+
|
| 64 |
+
# Style and prompt modulation (text-to-audio)
|
| 65 |
+
style = (style or "cinematic").lower()
|
| 66 |
+
prompt = (prompt_text or "").lower().strip()
|
| 67 |
+
|
| 68 |
+
if "glitch" in style or "fast" in prompt:
|
| 69 |
+
density *= 1.5
|
| 70 |
+
if "ambient" in style or "chill" in prompt:
|
| 71 |
+
density *= 0.6
|
| 72 |
+
energy *= 0.8
|
| 73 |
+
if "heavy" in prompt or "dark" in prompt or "industrial" in prompt:
|
| 74 |
+
energy = min(1.35, energy * 1.2)
|
| 75 |
+
density = min(2.8, density * 1.25)
|
| 76 |
+
if "light" in prompt or "soft" in prompt:
|
| 77 |
+
energy *= 0.7
|
| 78 |
+
density *= 0.55
|
| 79 |
+
|
| 80 |
+
if noise_filter and noise_filter > 0:
|
| 81 |
+
hat_cutoff = float(noise_filter)
|
| 82 |
+
else:
|
| 83 |
+
hat_cutoff = 4200 if "cinematic" in style else 4800
|
| 84 |
+
|
| 85 |
+
beat_dur = 60.0 / bpm_val
|
| 86 |
+
t = np.arange(n) / sr
|
| 87 |
+
|
| 88 |
+
# Component tracks for stems
|
| 89 |
+
kick = np.zeros(n, dtype=np.float32)
|
| 90 |
+
hats = np.zeros(n, dtype=np.float32)
|
| 91 |
+
bass = np.zeros(n, dtype=np.float32)
|
| 92 |
+
melody = np.zeros(n, dtype=np.float32)
|
| 93 |
+
|
| 94 |
+
# Kicks
|
| 95 |
+
for k in range(int(dur / beat_dur) + 2):
|
| 96 |
+
st = int(k * beat_dur * sr)
|
| 97 |
+
if st >= n: break
|
| 98 |
+
kl = int(0.17 * sr)
|
| 99 |
+
kt = np.arange(kl) / sr
|
| 100 |
+
kw = np.sin(2 * np.pi * 52 * kt) * np.exp(-kt * 30)
|
| 101 |
+
kw *= (0.9 + 0.3 * np.sin(2 * np.pi * 3.8 * kt))
|
| 102 |
+
kend = min(st + kl, n)
|
| 103 |
+
kick[st:kend] += kw[:kend-st] * energy * 0.95
|
| 104 |
+
|
| 105 |
+
# Hats
|
| 106 |
+
for h in range(int(dur * density * 7)):
|
| 107 |
+
st = int((h / max(1, dur * density * 7)) * n)
|
| 108 |
+
if st >= n: break
|
| 109 |
+
hl = int(0.06 * sr)
|
| 110 |
+
ht = np.arange(hl) / sr
|
| 111 |
+
hw = np.random.uniform(-1, 1, hl).astype(np.float32) * np.exp(-ht * 60)
|
| 112 |
+
b, a = signal.butter(2, hat_cutoff, btype='high', fs=sr)
|
| 113 |
+
hw = signal.lfilter(b, a, hw)
|
| 114 |
+
hend = min(st + hl, n)
|
| 115 |
+
hats[st:hend] += hw[:hend-st] * 0.5 * density * energy
|
| 116 |
+
|
| 117 |
+
# Bass
|
| 118 |
+
bf = 45 + (brightness * 15)
|
| 119 |
+
bw = np.sin(2 * np.pi * bf * t) * 0.4
|
| 120 |
+
bw *= (0.7 + 0.3 * np.sin(2 * np.pi * (bpm_val / 60) * 2 * t))
|
| 121 |
+
bass += bw * energy * 0.7
|
| 122 |
+
|
| 123 |
+
# Melody stabs
|
| 124 |
+
for s in range(max(2, int(3 + density * 4))):
|
| 125 |
+
st = int((s / max(1, 3 + density * 4)) * n * 0.9)
|
| 126 |
+
sl = int(0.25 * sr)
|
| 127 |
+
stt = np.arange(sl) / sr
|
| 128 |
+
sf = 200 + (s % 4) * 45 + (brightness * 60)
|
| 129 |
+
sw = (2 * (stt * sf - np.floor(stt * sf + 0.5))) * 0.35
|
| 130 |
+
se = np.exp(-stt * 7)
|
| 131 |
+
b, a = signal.butter(2, 1600 + (brightness * 800), btype='low', fs=sr)
|
| 132 |
+
sw = signal.lfilter(b, a, sw) * se
|
| 133 |
+
send = min(st + sl, n)
|
| 134 |
+
melody[st:send] += sw[:send-st] * 0.6 * energy
|
| 135 |
+
|
| 136 |
+
audio = kick + hats + bass + melody
|
| 137 |
+
|
| 138 |
+
# Anti-buzz filtering
|
| 139 |
+
b, a = signal.butter(2, 9000, btype='low', fs=sr)
|
| 140 |
+
audio = signal.lfilter(b, a, audio)
|
| 141 |
+
audio = np.tanh(audio * 1.1) * 0.9
|
| 142 |
+
|
| 143 |
+
pk = np.max(np.abs(audio))
|
| 144 |
+
if pk > 0.005:
|
| 145 |
+
audio = audio / pk * 0.92
|
| 146 |
+
|
| 147 |
+
stereo = np.column_stack([audio, audio * 0.97]).astype(np.float32)
|
| 148 |
+
|
| 149 |
+
sf.write(out_path, stereo, sr)
|
| 150 |
+
|
| 151 |
+
dl_files = [out_path]
|
| 152 |
+
|
| 153 |
+
if export_stems:
|
| 154 |
+
base = out_path.replace(".wav", "")
|
| 155 |
+
for comp, nm in [(kick, "kick"), (hats, "hats"), (bass, "bass"), (melody, "melody")]:
|
| 156 |
+
cpk = np.max(np.abs(comp))
|
| 157 |
+
if cpk > 0.005:
|
| 158 |
+
comp = comp / cpk * 0.92
|
| 159 |
+
cs = np.column_stack([comp, comp * 0.97]).astype(np.float32)
|
| 160 |
+
sp = f"{base}_{nm}.wav"
|
| 161 |
+
sf.write(sp, cs, sr)
|
| 162 |
+
dl_files.append(sp)
|
| 163 |
+
|
| 164 |
+
if export_midi:
|
| 165 |
+
try:
|
| 166 |
+
from mido import MidiFile, MidiTrack, Message
|
| 167 |
+
mid = MidiFile()
|
| 168 |
+
tr = MidiTrack()
|
| 169 |
+
mid.tracks.append(tr)
|
| 170 |
+
tpb = 480
|
| 171 |
+
tmp = int(bpm_val)
|
| 172 |
+
to = 0
|
| 173 |
+
for kk in range(int(dur / beat_dur) + 2):
|
| 174 |
+
sst = int(kk * beat_dur * tpb * (tmp / 60))
|
| 175 |
+
tr.append(Message('note_on', note=36, velocity=75, time=sst - to))
|
| 176 |
+
tr.append(Message('note_off', note=36, velocity=75, time=int(0.16 * tpb * (tmp/60))))
|
| 177 |
+
to = sst + int(0.16 * tpb * (tmp/60))
|
| 178 |
+
mp = out_path.replace(".wav", ".mid")
|
| 179 |
+
mid.save(mp)
|
| 180 |
+
dl_files.append(mp)
|
| 181 |
+
except Exception:
|
| 182 |
+
pass
|
| 183 |
+
|
| 184 |
+
log = (f"β
Standard Beat Tools (PURE GRADIO) OK\n"
|
| 185 |
+
f"out={out_path}\n"
|
| 186 |
+
f"style={style} seed={seed} dur={duration} bpm={bpm_val:.0f} filter={noise_filter}\n"
|
| 187 |
+
f"prompt='{prompt_text}' brightness={brightness:.2f} density={edge_density:.3f}\n"
|
| 188 |
+
f"stems={export_stems} midi={export_midi}\n"
|
| 189 |
+
f"BENCHMARK: Normal beats working correctly. This is the factory default.")
|
| 190 |
+
|
| 191 |
+
return out_path, dl_files, log
|
| 192 |
+
|
| 193 |
+
def process_image(image_path, core_mode, engine_type, style, seed, duration, noise_filter,
|
| 194 |
+
prompt_text,
|
| 195 |
+
export_stems, export_midi, export_brief, use_batch, batch_folder,
|
| 196 |
+
enable_ldq, genre_manifold, percussion_mode, perceptual_polish,
|
| 197 |
+
bpm, swing):
|
| 198 |
+
"""Main processing function β switches behavior based on core_mode."""
|
| 199 |
+
if not image_path and not use_batch:
|
| 200 |
+
return "β οΈ Please upload an image or enable batch mode.", None, None
|
| 201 |
+
|
| 202 |
+
downloadable = []
|
| 203 |
+
playback = None
|
| 204 |
+
|
| 205 |
+
# ============================================================
|
| 206 |
+
# STANDARD BEAT TOOLS β 100% PURE GRADIO FACTORY
|
| 207 |
+
# Fresh, self-contained implementation.
|
| 208 |
+
# ZERO connection to LYGO, ResonanceEngine, 4-layer custom sonification, or any of our previous engines.
|
| 209 |
+
# This is the "original drop-in Gradio" the user wants for the default tab.
|
| 210 |
+
# ============================================================
|
| 211 |
+
if core_mode == "Standard Beat Tools":
|
| 212 |
+
# PURE GRADIO FACTORY - Standard Beat Tools (isolated, no LYGO code)
|
| 213 |
+
# Based on the working build that produced "Normal sounding beat.... PERFECT"
|
| 214 |
+
# Enhanced with globals: style, seed, duration, noise_filter, prompt_text (text-to-audio),
|
| 215 |
+
# bpm, export_stems, export_midi, batch.
|
| 216 |
+
# Self-contained, references the working synth from when it was the bench.
|
| 217 |
+
|
| 218 |
+
if not image_path and not use_batch:
|
| 219 |
+
return "β οΈ Please upload an image or enable batch mode.", None, []
|
| 220 |
+
|
| 221 |
+
try:
|
| 222 |
+
def _gen_beats(img_p, stl, sd, dur_s, flt_hz, prmpt, bpm_v, do_stems, do_midi):
|
| 223 |
+
if sd and sd != 0:
|
| 224 |
+
np.random.seed(int(sd))
|
| 225 |
+
sr = 44100
|
| 226 |
+
dur = float(dur_s)
|
| 227 |
+
n = int(sr * dur)
|
| 228 |
+
img = cv2.imread(str(img_p))
|
| 229 |
+
if img is None:
|
| 230 |
+
raise ValueError("Could not read image")
|
| 231 |
+
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
| 232 |
+
brightness = float(np.mean(gray)) / 255.0
|
| 233 |
+
edge_density = float(np.mean(cv2.Canny(gray, 50, 150) > 0))
|
| 234 |
+
bpm_val = max(60, min(180, float(bpm_v) if bpm_v else 128))
|
| 235 |
+
energy = 0.6 + (brightness * 0.7)
|
| 236 |
+
density = 0.4 + (edge_density * 1.8)
|
| 237 |
+
stl = (stl or "cinematic").lower()
|
| 238 |
+
prmpt = (prmpt or "").lower().strip()
|
| 239 |
+
if "glitch" in stl or "fast" in prmpt:
|
| 240 |
+
density *= 1.5
|
| 241 |
+
if "ambient" in stl or "chill" in prmpt:
|
| 242 |
+
density *= 0.55
|
| 243 |
+
energy *= 0.8
|
| 244 |
+
if "heavy" in prmpt or "dark" in prmpt or "industrial" in prmpt:
|
| 245 |
+
energy = min(1.35, energy * 1.2)
|
| 246 |
+
density = min(2.5, density * 1.25)
|
| 247 |
+
if "light" in prmpt or "soft" in prmpt:
|
| 248 |
+
energy *= 0.7
|
| 249 |
+
density *= 0.55
|
| 250 |
+
if flt_hz and flt_hz > 0:
|
| 251 |
+
hat_cutoff = float(flt_hz)
|
| 252 |
+
else:
|
| 253 |
+
hat_cutoff = 4200
|
| 254 |
+
beat_dur = 60.0 / bpm_val
|
| 255 |
+
t = np.arange(n) / sr
|
| 256 |
+
audio = np.zeros(n, dtype=np.float32)
|
| 257 |
+
# Kicks
|
| 258 |
+
num_kicks = int(dur / beat_dur) + 2
|
| 259 |
+
for k in range(num_kicks):
|
| 260 |
+
start = int(k * beat_dur * sr)
|
| 261 |
+
if start >= n: break
|
| 262 |
+
klen = int(0.18 * sr)
|
| 263 |
+
kt = np.arange(klen) / sr
|
| 264 |
+
k = np.sin(2 * np.pi * 55 * kt) * np.exp(-kt * 28)
|
| 265 |
+
k *= (0.9 + 0.3 * np.sin(2 * np.pi * 4 * kt))
|
| 266 |
+
end = min(start + klen, n)
|
| 267 |
+
audio[start:end] += k[:end-start] * energy * 0.95
|
| 268 |
+
# Hats
|
| 269 |
+
num_hats = int(dur * density * 6)
|
| 270 |
+
for h in range(num_hats):
|
| 271 |
+
start = int((h / (dur * density * 6)) * n)
|
| 272 |
+
if start >= n: break
|
| 273 |
+
hlen = int(0.07 * sr)
|
| 274 |
+
ht = np.arange(hlen) / sr
|
| 275 |
+
noise = np.random.uniform(-1, 1, hlen).astype(np.float32)
|
| 276 |
+
h = noise * np.exp(-ht * 55)
|
| 277 |
+
b, a = signal.butter(2, hat_cutoff, btype='high', fs=sr)
|
| 278 |
+
h = signal.lfilter(b, a, h)
|
| 279 |
+
end = min(start + hlen, n)
|
| 280 |
+
audio[start:end] += h[:end-start] * 0.55 * density * energy
|
| 281 |
+
# Bass
|
| 282 |
+
bf = 48 + (brightness * 18)
|
| 283 |
+
b = np.sin(2 * np.pi * bf * t) * 0.45
|
| 284 |
+
b *= (0.7 + 0.3 * np.sin(2 * np.pi * (bpm_val/60) * 2 * t))
|
| 285 |
+
audio += b * energy * 0.7
|
| 286 |
+
# Melody
|
| 287 |
+
num_stabs = max(3, int(4 + density * 5))
|
| 288 |
+
for s in range(num_stabs):
|
| 289 |
+
start = int((s / num_stabs) * n * 0.92)
|
| 290 |
+
slen = int(0.28 * sr)
|
| 291 |
+
st = np.arange(slen) / sr
|
| 292 |
+
sf = 220 + (s % 5) * 38 + (brightness * 80)
|
| 293 |
+
s = (2 * (st * sf - np.floor(st * sf + 0.5))) * 0.4
|
| 294 |
+
env = np.exp(-st * 6.5)
|
| 295 |
+
b, a = signal.butter(2, 1800 + (brightness * 900), btype='low', fs=sr)
|
| 296 |
+
s = signal.lfilter(b, a, s) * env
|
| 297 |
+
end = min(start + slen, n)
|
| 298 |
+
audio[start:end] += s[:end-start] * 0.65 * energy
|
| 299 |
+
# Filter to avoid overload/buzz
|
| 300 |
+
b, a = signal.butter(2, 9500, btype='low', fs=sr)
|
| 301 |
+
audio = signal.lfilter(b, a, audio)
|
| 302 |
+
audio = np.tanh(audio * 1.15) * 0.92
|
| 303 |
+
pk = np.max(np.abs(audio))
|
| 304 |
+
if pk > 0.01:
|
| 305 |
+
audio = audio / pk * 0.92
|
| 306 |
+
audio_stereo = np.column_stack([audio, audio * 0.96]).astype(np.float32)
|
| 307 |
+
out_p = f"standard_{Path(img_p).stem}.wav"
|
| 308 |
+
sf.write(out_p, audio_stereo, sr)
|
| 309 |
+
dl = [out_p]
|
| 310 |
+
if do_stems:
|
| 311 |
+
# Simple stems (re-generate components or use masks; here approximate with re-calc for clarity)
|
| 312 |
+
# For simplicity, write the main and note; full stems would duplicate logic
|
| 313 |
+
base = out_p.replace(".wav", "")
|
| 314 |
+
# Kick only approx
|
| 315 |
+
k_only = np.zeros(n, dtype=np.float32)
|
| 316 |
+
# (simplified: re-do kicks for stem)
|
| 317 |
+
for k in range(num_kicks):
|
| 318 |
+
start = int(k * beat_dur * sr)
|
| 319 |
+
if start >= n: break
|
| 320 |
+
klen = int(0.18 * sr)
|
| 321 |
+
kt = np.arange(klen) / sr
|
| 322 |
+
kk = np.sin(2 * np.pi * 55 * kt) * np.exp(-kt * 28)
|
| 323 |
+
end = min(start + klen, n)
|
| 324 |
+
k_only[start:end] += kk[:end-start] * energy * 0.95
|
| 325 |
+
k_st = np.column_stack([k_only, k_only * 0.96]).astype(np.float32)
|
| 326 |
+
sf.write(f"{base}_kick.wav", k_st, sr)
|
| 327 |
+
dl.append(f"{base}_kick.wav")
|
| 328 |
+
# Similar for others if needed; for now main + one stem example
|
| 329 |
+
if do_midi:
|
| 330 |
+
try:
|
| 331 |
+
from mido import MidiFile, MidiTrack, Message
|
| 332 |
+
mid = MidiFile()
|
| 333 |
+
tr = MidiTrack()
|
| 334 |
+
mid.tracks.append(tr)
|
| 335 |
+
tpb = 480
|
| 336 |
+
tmp = int(bpm_val)
|
| 337 |
+
toff = 0
|
| 338 |
+
for kk in range(num_kicks):
|
| 339 |
+
sst = int(kk * beat_dur * tpb * (tmp / 60))
|
| 340 |
+
tr.append(Message('note_on', note=36, velocity=75, time=sst - toff))
|
| 341 |
+
tr.append(Message('note_off', note=36, velocity=75, time=int(0.16 * tpb * (tmp/60))))
|
| 342 |
+
toff = sst + int(0.16 * tpb * (tmp/60))
|
| 343 |
+
mp = out_p.replace(".wav", ".mid")
|
| 344 |
+
mid.save(mp)
|
| 345 |
+
dl.append(mp)
|
| 346 |
+
except Exception:
|
| 347 |
+
pass
|
| 348 |
+
logg = (f"β
Standard Beat Tools (PURE GRADIO FACTORY) - BENCHMARK working.\n"
|
| 349 |
+
f"Generated: {out_p}\nStyle={stl} Seed={sd} Dur={dur_s}s BPM={bpm_val:.0f} Filter={flt_hz}\n"
|
| 350 |
+
f"Prompt='{prmpt}' brightness={brightness:.2f} edge={edge_density:.3f}\n"
|
| 351 |
+
f"Exports stems={do_stems} midi={do_midi}\n"
|
| 352 |
+
f"Normal sounding beats - this is the working factory default. No LYGO.")
|
| 353 |
+
return out_p, dl, logg
|
| 354 |
+
|
| 355 |
+
if use_batch and batch_folder:
|
| 356 |
+
folder = Path(batch_folder)
|
| 357 |
+
if not folder.is_dir():
|
| 358 |
+
return f"β Batch folder not found: {batch_folder}", None, []
|
| 359 |
+
imgs = sorted(list(folder.glob("*.jpg")) + list(folder.glob("*.png")) + list(folder.glob("*.jpeg")))
|
| 360 |
+
if not imgs:
|
| 361 |
+
return "No images in batch folder.", None, []
|
| 362 |
+
res = []
|
| 363 |
+
allf = []
|
| 364 |
+
for ip in imgs:
|
| 365 |
+
try:
|
| 366 |
+
o, dl, l = _gen_beats(str(ip), style, seed, duration, noise_filter, prompt_text, bpm, export_stems, export_midi)
|
| 367 |
+
res.append(f"β {ip.name} β {o}")
|
| 368 |
+
allf.extend(dl)
|
| 369 |
+
except Exception as be:
|
| 370 |
+
res.append(f"β {ip.name} β {be}")
|
| 371 |
+
return "π¦ Standard Batch:\n" + "\n".join(res), None, allf
|
| 372 |
+
|
| 373 |
+
# Single
|
| 374 |
+
o, dl, l = _gen_beats(image_path, style, seed, duration, noise_filter, prompt_text, bpm, export_stems, export_midi)
|
| 375 |
+
return l, o, dl
|
| 376 |
+
|
| 377 |
+
except Exception as e:
|
| 378 |
+
return f"β οΈ Standard Beat Tools error: {str(e)}", None, []
|
| 379 |
+
# Clean, self-contained Gradio factory using the top-level helper above.
|
| 380 |
+
# All global settings + text prompt (text-to-audio) now work.
|
| 381 |
+
# No nested functions = no free variable scoping errors.
|
| 382 |
+
|
| 383 |
+
if not image_path and not use_batch:
|
| 384 |
+
return "β οΈ Please upload an image or enable batch mode.", None, []
|
| 385 |
+
|
| 386 |
+
try:
|
| 387 |
+
if use_batch and batch_folder:
|
| 388 |
+
folder = Path(batch_folder)
|
| 389 |
+
if not folder.is_dir():
|
| 390 |
+
return f"β Batch folder not found: {batch_folder}", None, []
|
| 391 |
+
imgs = sorted(list(folder.glob("*.jpg")) + list(folder.glob("*.png")) + list(folder.glob("*.jpeg")))
|
| 392 |
+
if not imgs:
|
| 393 |
+
return "No images in batch folder.", None, []
|
| 394 |
+
results = []
|
| 395 |
+
all_dl = []
|
| 396 |
+
for ip in imgs:
|
| 397 |
+
try:
|
| 398 |
+
op, dls, lg = standard_beat_tools_generate(
|
| 399 |
+
str(ip), style, seed, duration, noise_filter, prompt_text, bpm, export_stems, export_midi
|
| 400 |
+
)
|
| 401 |
+
results.append(f"β {ip.name} β {op}")
|
| 402 |
+
all_dl.extend(dls)
|
| 403 |
+
except Exception as be:
|
| 404 |
+
results.append(f"β {ip.name} β {be}")
|
| 405 |
+
return "π¦ Standard Batch complete\n" + "\n".join(results), None, all_dl
|
| 406 |
+
|
| 407 |
+
# Single
|
| 408 |
+
op, dls, lg = standard_beat_tools_generate(
|
| 409 |
+
image_path, style, seed, duration, noise_filter, prompt_text, bpm, export_stems, export_midi
|
| 410 |
+
)
|
| 411 |
+
return lg, op, dls
|
| 412 |
+
|
| 413 |
+
except Exception as e:
|
| 414 |
+
return f"β οΈ Standard Beat Tools error: {str(e)}", None, []
|
| 415 |
+
|
| 416 |
+
sr = 44100
|
| 417 |
+
n = int(sr * dur)
|
| 418 |
+
|
| 419 |
+
# Basic image stats (lightweight)
|
| 420 |
+
img = cv2.imread(str(image_path))
|
| 421 |
+
if img is None:
|
| 422 |
+
raise ValueError("Could not read image")
|
| 423 |
+
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
| 424 |
+
brightness = np.mean(gray) / 255.0
|
| 425 |
+
edge_density = np.mean(cv2.Canny(gray, 50, 150) > 0)
|
| 426 |
+
|
| 427 |
+
# === FULL GLOBAL SETTINGS MAPPING ===
|
| 428 |
+
bpm_val = max(60, min(180, float(bpm_val) if bpm_val else 128))
|
| 429 |
+
energy = 0.55 + (brightness * 0.75)
|
| 430 |
+
density = 0.35 + (edge_density * 1.9)
|
| 431 |
+
|
| 432 |
+
# Style flavor (changes the character significantly)
|
| 433 |
+
style = (style or "cinematic").lower()
|
| 434 |
+
if "glitch" in style:
|
| 435 |
+
density *= 1.6
|
| 436 |
+
energy *= 0.85
|
| 437 |
+
hat_cutoff = 5200
|
| 438 |
+
elif "ambient" in style:
|
| 439 |
+
density *= 0.55
|
| 440 |
+
energy *= 0.75
|
| 441 |
+
hat_cutoff = 3200
|
| 442 |
+
elif "ethereal" in style:
|
| 443 |
+
density *= 0.7
|
| 444 |
+
energy *= 0.8
|
| 445 |
+
hat_cutoff = 2800
|
| 446 |
+
elif "raw" in style:
|
| 447 |
+
energy *= 1.15
|
| 448 |
+
density *= 1.1
|
| 449 |
+
hat_cutoff = 4800
|
| 450 |
+
else: # cinematic / default
|
| 451 |
+
hat_cutoff = 4200
|
| 452 |
+
|
| 453 |
+
# Noise / filter from global
|
| 454 |
+
if filter_hz and filter_hz > 0:
|
| 455 |
+
hat_cutoff = min(hat_cutoff, float(filter_hz))
|
| 456 |
+
|
| 457 |
+
# TEXT PROMPT -> modulation (text-to-audio / text-to-beats)
|
| 458 |
+
prompt = (prompt or "").lower().strip()
|
| 459 |
+
if "fast" in prompt or "quick" in prompt:
|
| 460 |
+
bpm_val = min(180, bpm_val * 1.25)
|
| 461 |
+
if "slow" in prompt or "chill" in prompt:
|
| 462 |
+
bpm_val = max(60, bpm_val * 0.75)
|
| 463 |
+
if "heavy" in prompt or "dark" in prompt or "industrial" in prompt:
|
| 464 |
+
energy = min(1.4, energy * 1.25)
|
| 465 |
+
density = min(2.5, density * 1.3)
|
| 466 |
+
if "light" in prompt or "soft" in prompt:
|
| 467 |
+
energy *= 0.7
|
| 468 |
+
density *= 0.6
|
| 469 |
+
if "beats" in prompt or "rhythm" in prompt:
|
| 470 |
+
density = min(2.8, density * 1.2)
|
| 471 |
+
|
| 472 |
+
beat_dur = 60.0 / bpm_val
|
| 473 |
+
t = np.arange(n) / sr
|
| 474 |
+
|
| 475 |
+
# Generate components separately for stems + main mix
|
| 476 |
+
kick_audio = np.zeros(n, dtype=np.float32)
|
| 477 |
+
hats_audio = np.zeros(n, dtype=np.float32)
|
| 478 |
+
bass_audio = np.zeros(n, dtype=np.float32)
|
| 479 |
+
melody_audio = np.zeros(n, dtype=np.float32)
|
| 480 |
+
|
| 481 |
+
# Kicks
|
| 482 |
+
num_kicks = int(dur / beat_dur) + 2
|
| 483 |
+
for k in range(num_kicks):
|
| 484 |
+
start = int(k * beat_dur * sr)
|
| 485 |
+
if start >= n: break
|
| 486 |
+
klen = int(0.17 * sr)
|
| 487 |
+
kt = np.arange(klen) / sr
|
| 488 |
+
k_wave = np.sin(2 * np.pi * 52 * kt) * np.exp(-kt * 32)
|
| 489 |
+
k_wave *= (0.92 + 0.28 * np.sin(2 * np.pi * 3.5 * kt))
|
| 490 |
+
kend = min(start + klen, n)
|
| 491 |
+
kick_audio[start:kend] += k_wave[:kend-start] * energy * 0.98
|
| 492 |
+
|
| 493 |
+
# Hats / percussion (filtered by noise_filter/style)
|
| 494 |
+
num_hats = int(dur * density * 7)
|
| 495 |
+
for h in range(num_hats):
|
| 496 |
+
start = int((h / max(1, (dur * density * 7))) * n)
|
| 497 |
+
if start >= n: break
|
| 498 |
+
hlen = int(0.065 * sr)
|
| 499 |
+
ht = np.arange(hlen) / sr
|
| 500 |
+
hnoise = np.random.uniform(-1, 1, hlen).astype(np.float32)
|
| 501 |
+
h_wave = hnoise * np.exp(-ht * 62)
|
| 502 |
+
b, a = signal.butter(2, hat_cutoff, btype='high', fs=sr)
|
| 503 |
+
h_wave = signal.lfilter(b, a, h_wave)
|
| 504 |
+
hend = min(start + hlen, n)
|
| 505 |
+
hats_audio[start:hend] += h_wave[:hend-start] * 0.52 * density * energy
|
| 506 |
+
|
| 507 |
+
# Bass
|
| 508 |
+
bass_f = 46 + (brightness * 16)
|
| 509 |
+
bass_wave = np.sin(2 * np.pi * bass_f * t) * 0.42
|
| 510 |
+
bass_wave *= (0.72 + 0.28 * np.sin(2 * np.pi * (bpm_val / 60.0) * 1.8 * t))
|
| 511 |
+
bass_audio += bass_wave * energy * 0.72
|
| 512 |
+
|
| 513 |
+
# Melody stabs (style influenced)
|
| 514 |
+
num_stabs = max(2, int(3 + density * 4.5))
|
| 515 |
+
for s in range(num_stabs):
|
| 516 |
+
sstart = int((s / num_stabs) * n * 0.9)
|
| 517 |
+
slen = int(0.26 * sr)
|
| 518 |
+
st = np.arange(slen) / sr
|
| 519 |
+
sfreq = 205 + (s % 4) * 42 + (brightness * 65)
|
| 520 |
+
if "glitch" in style: sfreq += 35
|
| 521 |
+
if "ambient" in style: sfreq -= 25
|
| 522 |
+
s_wave = (2 * (st * sfreq - np.floor(st * sfreq + 0.5))) * 0.38
|
| 523 |
+
senv = np.exp(-st * 7.2)
|
| 524 |
+
b, a = signal.butter(2, 1650 + (brightness * 850), btype='low', fs=sr)
|
| 525 |
+
s_wave = signal.lfilter(b, a, s_wave) * senv
|
| 526 |
+
send = min(sstart + slen, n)
|
| 527 |
+
melody_audio[sstart:send] += s_wave[:send-sstart] * 0.62 * energy
|
| 528 |
+
|
| 529 |
+
# Main mix
|
| 530 |
+
audio = kick_audio + hats_audio + bass_audio + melody_audio
|
| 531 |
+
|
| 532 |
+
# Anti-overload filtering (throttle the buzz)
|
| 533 |
+
b, a = signal.butter(2, 9200, btype='low', fs=sr)
|
| 534 |
+
audio = signal.lfilter(b, a, audio)
|
| 535 |
+
audio = np.tanh(audio * 1.12) * 0.91
|
| 536 |
+
|
| 537 |
+
peak = np.max(np.abs(audio))
|
| 538 |
+
if peak > 0.005:
|
| 539 |
+
audio /= peak * 0.93
|
| 540 |
+
|
| 541 |
+
audio_stereo = np.column_stack([audio, audio * 0.97]).astype(np.float32)
|
| 542 |
+
|
| 543 |
+
# Write main
|
| 544 |
+
sf.write(out_path, audio_stereo, sr)
|
| 545 |
+
|
| 546 |
+
stems_files = []
|
| 547 |
+
if export_stems_flag:
|
| 548 |
+
base = out_path.replace(".wav", "")
|
| 549 |
+
for comp, name in [(kick_audio, "kick"), (hats_audio, "hats"), (bass_audio, "bass"), (melody_audio, "melody")]:
|
| 550 |
+
cpeak = np.max(np.abs(comp))
|
| 551 |
+
if cpeak > 0.005:
|
| 552 |
+
comp = comp / cpeak * 0.93
|
| 553 |
+
cstereo = np.column_stack([comp, comp * 0.97]).astype(np.float32)
|
| 554 |
+
spath = f"{base}_{name}.wav"
|
| 555 |
+
sf.write(spath, cstereo, sr)
|
| 556 |
+
stems_files.append(spath)
|
| 557 |
+
|
| 558 |
+
midi_file = None
|
| 559 |
+
if export_midi_flag:
|
| 560 |
+
try:
|
| 561 |
+
from mido import MidiFile, MidiTrack, Message
|
| 562 |
+
mid = MidiFile()
|
| 563 |
+
tr = MidiTrack()
|
| 564 |
+
mid.tracks.append(tr)
|
| 565 |
+
tpb = 480
|
| 566 |
+
tempo = int(bpm_val)
|
| 567 |
+
toff = 0
|
| 568 |
+
# Simple MIDI from kicks + stabs
|
| 569 |
+
for k in range(num_kicks):
|
| 570 |
+
st = int(k * beat_dur * tpb * (tempo / 60.0))
|
| 571 |
+
tr.append(Message('note_on', note=36, velocity=78, time=st - toff))
|
| 572 |
+
tr.append(Message('note_off', note=36, velocity=78, time=int(0.18 * tpb * (tempo/60))))
|
| 573 |
+
toff = st + int(0.18 * tpb * (tempo/60))
|
| 574 |
+
midpath = out_path.replace(".wav", ".mid")
|
| 575 |
+
mid.save(midpath)
|
| 576 |
+
midi_file = midpath
|
| 577 |
+
except Exception:
|
| 578 |
+
pass
|
| 579 |
+
|
| 580 |
+
return out_path, stems_files, midi_file, brightness, edge_density, bpm_val
|
| 581 |
+
|
| 582 |
+
# Batch support for Standard (hijacked clean pattern from Clawhub lygo-resonance/gradio_app.py)
|
| 583 |
+
if use_batch and batch_folder:
|
| 584 |
+
folder = Path(batch_folder)
|
| 585 |
+
if not folder.is_dir():
|
| 586 |
+
return f"β Batch folder not found: {batch_folder}", None, []
|
| 587 |
+
images = sorted(list(folder.glob("*.jpg")) + list(folder.glob("*.png")) + list(folder.glob("*.jpeg")))
|
| 588 |
+
if not images:
|
| 589 |
+
return "No images in batch folder", None, []
|
| 590 |
+
results = []
|
| 591 |
+
all_files = []
|
| 592 |
+
for imgp in images:
|
| 593 |
+
try:
|
| 594 |
+
opath, stems, midif, br, ed, bp = _generate_standard_beats(
|
| 595 |
+
str(imgp), style, seed, duration, noise_filter, prompt_text, bpm, export_stems, export_midi
|
| 596 |
+
)
|
| 597 |
+
results.append(f"β {imgp.name} β {opath} (bpm~{bp:.0f})")
|
| 598 |
+
all_files.append(opath)
|
| 599 |
+
all_files.extend(stems or [])
|
| 600 |
+
if midif: all_files.append(midif)
|
| 601 |
+
except Exception as be:
|
| 602 |
+
results.append(f"β {imgp.name} β {be}")
|
| 603 |
+
return "π¦ Standard Batch complete\n" + "\n".join(results), None, all_files
|
| 604 |
+
|
| 605 |
+
# Single image
|
| 606 |
+
try:
|
| 607 |
+
opath, stems, midif, br, ed, bp = _generate_standard_beats(
|
| 608 |
+
image_path, style, seed, duration, noise_filter, prompt_text, bpm, export_stems, export_midi
|
| 609 |
+
)
|
| 610 |
+
downloadable = [opath] + (stems or [])
|
| 611 |
+
if midif: downloadable.append(midif)
|
| 612 |
+
playback = opath
|
| 613 |
+
|
| 614 |
+
log_msg = (
|
| 615 |
+
f"β
BENCHMARK: Standard Beat Tools (PURE GRADIO FACTORY) working correctly.\n"
|
| 616 |
+
f"Generated: {opath}\n"
|
| 617 |
+
f"Style={style} Seed={seed} Duration={duration}s BPM={bp:.0f} FilterHz={noise_filter}\n"
|
| 618 |
+
f"Prompt='{prompt_text}' β modulated energy/density\n"
|
| 619 |
+
f"Image brightness={br:.2f} edge_density={ed:.3f}\n"
|
| 620 |
+
f"Exports: stems={export_stems} midi={export_midi}\n"
|
| 621 |
+
f"This is the working default bench β normal sounding beats. NO LYGO code used."
|
| 622 |
+
)
|
| 623 |
+
return log_msg, playback, downloadable
|
| 624 |
+
|
| 625 |
+
except Exception as e:
|
| 626 |
+
return f"β οΈ Standard Beat Tools error: {str(e)}", None, []
|
| 627 |
+
|
| 628 |
+
# --- LYGO PROTOCOL mode β all LDQ features ---
|
| 629 |
+
if core_mode == "LYGO Protocol":
|
| 630 |
+
if engine_type == "Resonance Engine (Audio)":
|
| 631 |
+
config = {
|
| 632 |
+
"duration": duration,
|
| 633 |
+
"random_seed": int(seed) if seed != 0 else None,
|
| 634 |
+
"verbose": False,
|
| 635 |
+
"export_stems": export_stems,
|
| 636 |
+
"export_midi": export_midi,
|
| 637 |
+
"use_ldq": enable_ldq,
|
| 638 |
+
"genre_manifold": genre_manifold,
|
| 639 |
+
"percussion_mode": percussion_mode,
|
| 640 |
+
"perceptual_polish": perceptual_polish,
|
| 641 |
+
"tempo_bpm": bpm,
|
| 642 |
+
"swing": swing,
|
| 643 |
+
}
|
| 644 |
+
if noise_filter > 0:
|
| 645 |
+
config["noise_lowpass_hz"] = noise_filter
|
| 646 |
+
preset = PRESETS.get(style, {})
|
| 647 |
+
config.update(preset)
|
| 648 |
+
|
| 649 |
+
engine = ResonanceEngine(config)
|
| 650 |
+
out_path = f"lygo_{Path(image_path).stem}.wav"
|
| 651 |
+
engine.process(image_path, out_path)
|
| 652 |
+
|
| 653 |
+
if os.path.exists(out_path):
|
| 654 |
+
downloadable.append(out_path)
|
| 655 |
+
playback = out_path
|
| 656 |
+
log_msg = f"β
LYGO Protocol complete.\nGenerated: {out_path}\nLOG: enable_ldq={enable_ldq} percussion={percussion_mode} genre={genre_manifold} bpm={bpm} β if identical to Standard, LDQ module was not fully engaged (check engine log for PATH)."
|
| 657 |
+
return log_msg, playback, downloadable
|
| 658 |
+
else:
|
| 659 |
+
# Profile generator (unchanged)
|
| 660 |
+
out_json = f"profile_{Path(image_path).stem}.json"
|
| 661 |
+
generator = LYGOProfileGenerator(verbose=False)
|
| 662 |
+
generator.generate(image_path, out_json, create_brief=export_brief)
|
| 663 |
+
if os.path.exists(out_json):
|
| 664 |
+
downloadable.append(out_json)
|
| 665 |
+
return f"β
LYGO Profile saved: {out_json}", None, downloadable
|
| 666 |
+
|
| 667 |
+
return "β οΈ Unknown mode.", None, None
|
| 668 |
+
|
| 669 |
+
|
| 670 |
+
# ---- BUILD INTERFACE ----
|
| 671 |
+
with gr.Blocks() as demo:
|
| 672 |
+
gr.Markdown("# π LYGO RESONANCE")
|
| 673 |
+
gr.Markdown("### Two Modes: Standard Beat Tools or LYGO Protocol")
|
| 674 |
+
|
| 675 |
+
with gr.Row():
|
| 676 |
+
with gr.Column(scale=1):
|
| 677 |
+
# Core mode selector β the main switch
|
| 678 |
+
core_mode = gr.Radio(
|
| 679 |
+
["Standard Beat Tools", "LYGO Protocol"],
|
| 680 |
+
value="Standard Beat Tools",
|
| 681 |
+
label="βοΈ Active Core Mode"
|
| 682 |
+
)
|
| 683 |
+
|
| 684 |
+
img_input = gr.Image(sources=["upload", "webcam"], type="filepath", label="πΈ Upload Source Image (or use webcam)")
|
| 685 |
+
|
| 686 |
+
# ---- Standard controls (always visible) ----
|
| 687 |
+
with gr.Accordion("ποΈ Global Settings", open=True):
|
| 688 |
+
engine_choice = gr.Radio(
|
| 689 |
+
["Resonance Engine (Audio)", "LYGO Profile Generator"],
|
| 690 |
+
value="Resonance Engine (Audio)",
|
| 691 |
+
label="Engine Type (LYGO Protocol only)"
|
| 692 |
+
)
|
| 693 |
+
preset_style = gr.Dropdown(
|
| 694 |
+
["cinematic", "ambient", "glitch", "ethereal", "raw"],
|
| 695 |
+
value="cinematic",
|
| 696 |
+
label="Artistic Preset"
|
| 697 |
+
)
|
| 698 |
+
duration_slider = gr.Slider(5, 60, value=15, step=1, label="Duration (s)")
|
| 699 |
+
seed_num = gr.Number(value=0, label="Seed (0 = random)")
|
| 700 |
+
filter_hz = gr.Number(value=0, label="Noise Filter Hz (0=off)")
|
| 701 |
+
prompt_text = gr.Textbox(label="Text Prompt (Standard Beat Tools - text-to-beats)", placeholder="e.g. heavy industrial fast dark beats", lines=1)
|
| 702 |
+
stem_check = gr.Checkbox(label="Export Stems (.wav split)")
|
| 703 |
+
midi_check = gr.Checkbox(label="Export MIDI")
|
| 704 |
+
brief_check = gr.Checkbox(value=True, label="Export Creative Brief (.brief.txt)")
|
| 705 |
+
batch_check = gr.Checkbox(label="Batch Mode")
|
| 706 |
+
batch_dir = gr.Textbox(label="Batch Folder", placeholder="./input_folder")
|
| 707 |
+
|
| 708 |
+
# ---- LYGOβspecific controls (hidden when Standard is selected) ----
|
| 709 |
+
with gr.Accordion("π¬ LYGO Protocol Settings (Advanced)", open=False, visible=False) as ldq_accordion:
|
| 710 |
+
enable_ldq = gr.Checkbox(label="Enable LDQ Protocol")
|
| 711 |
+
genre_manifold = gr.Dropdown(
|
| 712 |
+
["None", "Dubstep", "Phonk", "Industrial"],
|
| 713 |
+
value="None",
|
| 714 |
+
label="Genre Manifold"
|
| 715 |
+
)
|
| 716 |
+
percussion_mode = gr.Dropdown(
|
| 717 |
+
["standard", "ldq"],
|
| 718 |
+
value="standard",
|
| 719 |
+
label="Percussion Engine"
|
| 720 |
+
)
|
| 721 |
+
perceptual_polish = gr.Slider(0.0, 1.0, value=0.5, step=0.1, label="Perceptual Polish")
|
| 722 |
+
bpm_slider = gr.Slider(80, 180, value=140, step=1, label="Tempo (BPM)")
|
| 723 |
+
swing_slider = gr.Slider(0.0, 0.5, value=0.0, step=0.01, label="Swing")
|
| 724 |
+
|
| 725 |
+
submit_btn = gr.Button("π Generate", variant="primary")
|
| 726 |
+
|
| 727 |
+
with gr.Column(scale=1):
|
| 728 |
+
text_output = gr.Textbox(label="π₯οΈ Log", lines=10, interactive=False)
|
| 729 |
+
audio_player = gr.Audio(label="π§ Preview", interactive=False)
|
| 730 |
+
file_download = gr.Files(label="π¦ Download Output", interactive=False)
|
| 731 |
+
|
| 732 |
+
# ---- NEW: Advanced Creative Sonification (integrates the TOP 3 LYGO skills) ----
|
| 733 |
+
# Place this inside the Blocks so components are part of the demo.
|
| 734 |
+
# These extend the system for glyph/fractal/truthlight sonification.
|
| 735 |
+
# Scripts are additional files in the space repo.
|
| 736 |
+
with gr.Accordion("π Advanced Creative Sonification (TOP 3: Glyph / Fractal / TruthLight)", open=False):
|
| 737 |
+
creative_mode = gr.Radio(
|
| 738 |
+
["None", "Glyph2Resonance (visual math/glyphs β resonant audio)", "FractalWeaver (self-similar visuals β evolving textures)", "TruthLightEcho (β«TruthΓLight β harmonic echo sequences)"],
|
| 739 |
+
value="None",
|
| 740 |
+
label="Creative Extension Mode"
|
| 741 |
+
)
|
| 742 |
+
creative_input = gr.Image(type="filepath", label="Upload Glyph/Fractal Image (or use previous profile)")
|
| 743 |
+
creative_preset = gr.Dropdown(["glyph-sacred", "math-spiral", "pure-light", "truth-echo", "fractal-mandel"], value="glyph-sacred", label="Creative Preset")
|
| 744 |
+
creative_seed = gr.Number(value=963, label="Creative Seed (for reproducibility)")
|
| 745 |
+
creative_duration = gr.Slider(10, 90, value=30, step=5, label="Creative Duration (s)")
|
| 746 |
+
creative_btn = gr.Button("β¨ Run Creative Sonification", variant="secondary")
|
| 747 |
+
|
| 748 |
+
# ---- Show/hide LYGO accordion based on core_mode ----
|
| 749 |
+
def toggle_ldq_visibility(mode):
|
| 750 |
+
return gr.update(visible=(mode == "LYGO Protocol"))
|
| 751 |
+
|
| 752 |
+
core_mode.change(toggle_ldq_visibility, inputs=core_mode, outputs=ldq_accordion)
|
| 753 |
+
|
| 754 |
+
# ---- Submit ----
|
| 755 |
+
submit_btn.click(
|
| 756 |
+
fn=process_image,
|
| 757 |
+
inputs=[
|
| 758 |
+
img_input, core_mode, engine_choice, preset_style, seed_num, duration_slider, filter_hz,
|
| 759 |
+
prompt_text,
|
| 760 |
+
stem_check, midi_check, brief_check, batch_check, batch_dir,
|
| 761 |
+
enable_ldq, genre_manifold, percussion_mode, perceptual_polish,
|
| 762 |
+
bpm_slider, swing_slider
|
| 763 |
+
],
|
| 764 |
+
outputs=[text_output, audio_player, file_download]
|
| 765 |
+
)
|
| 766 |
+
|
| 767 |
+
def run_creative_sonification(image_path, mode, preset, seed, duration):
|
| 768 |
+
if not image_path or mode == "None":
|
| 769 |
+
return "β οΈ Upload image and select a creative mode.", None, None
|
| 770 |
+
downloadable = []
|
| 771 |
+
playback = None
|
| 772 |
+
try:
|
| 773 |
+
# Pass more controls (bpm etc. from globals if wired later; for now enrich config + log)
|
| 774 |
+
# This is "strict module" β creatives enhance the working foundation.
|
| 775 |
+
base_config = {"duration": duration, "random_seed": int(seed) if seed else None, "verbose": False, "tempo_bpm": 140, "swing": 0.0}
|
| 776 |
+
if "Glyph2Resonance" in mode:
|
| 777 |
+
import glyph2resonance
|
| 778 |
+
config = base_config.copy()
|
| 779 |
+
engine = ResonanceEngine(config)
|
| 780 |
+
out = f"glyph2res_{Path(image_path).stem}.wav"
|
| 781 |
+
engine.process(image_path, out)
|
| 782 |
+
if os.path.exists(out):
|
| 783 |
+
downloadable.append(out)
|
| 784 |
+
playback = out
|
| 785 |
+
return f"β
Glyph2Resonance demo complete (uses working foundation + glyph map module). LOG: config={config}. For full analysis use the .py script. Generated: {out}\nFull site: https://github.com/DeepSeekOracle/Excavationpro/blob/main/LYGORESONANCE.html", playback, downloadable
|
| 786 |
+
elif "FractalWeaver" in mode:
|
| 787 |
+
import fractalweaver
|
| 788 |
+
config = base_config.copy()
|
| 789 |
+
engine = ResonanceEngine(config)
|
| 790 |
+
out = f"fractalweave_{Path(image_path).stem}.wav"
|
| 791 |
+
engine.process(image_path, out)
|
| 792 |
+
if os.path.exists(out):
|
| 793 |
+
downloadable.append(out)
|
| 794 |
+
playback = out
|
| 795 |
+
return f"β
FractalWeaver demo complete (uses working foundation + fractal evolution module). LOG: config={config}. See fractalweaver.py. Generated: {out}\nFull site: https://github.com/DeepSeekOracle/Excavationpro/blob/main/LYGORESONANCE.html", playback, downloadable
|
| 796 |
+
elif "TruthLightEcho" in mode:
|
| 797 |
+
import truthlightecho
|
| 798 |
+
tl_data = truthlightecho.compute_truth_light_from_image(image_path) if hasattr(truthlightecho, 'compute_truth_light_from_image') else {"truth_light": 0.7}
|
| 799 |
+
config = base_config.copy()
|
| 800 |
+
engine = ResonanceEngine(config)
|
| 801 |
+
out = f"truthlightecho_{Path(image_path).stem}.wav"
|
| 802 |
+
engine.process(image_path, out)
|
| 803 |
+
if os.path.exists(out):
|
| 804 |
+
downloadable.append(out)
|
| 805 |
+
playback = out
|
| 806 |
+
return f"β
TruthLightEcho demo complete (uses working foundation + echo module, TruthΓLightβ{tl_data.get('truth_light', 'N/A')}). LOG: config={config}. See truthlightecho.py. Generated: {out}\nFull site: https://github.com/DeepSeekOracle/Excavationpro/blob/main/LYGORESONANCE.html", playback, downloadable
|
| 807 |
+
return "Mode not fully wired in demo (use the standalone .py for full features).", None, None
|
| 808 |
+
except Exception as e:
|
| 809 |
+
return f"Error in creative mode: {str(e)}", None, None
|
| 810 |
+
|
| 811 |
+
creative_btn.click(
|
| 812 |
+
fn=run_creative_sonification,
|
| 813 |
+
inputs=[creative_input, creative_mode, creative_preset, creative_seed, creative_duration],
|
| 814 |
+
outputs=[text_output, audio_player, file_download]
|
| 815 |
+
)
|
| 816 |
+
|
| 817 |
+
if __name__ == "__main__":
|
| 818 |
+
demo.launch()
|
factory_engine.py
ADDED
|
@@ -0,0 +1,386 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""
|
| 3 |
+
FACTORY DEFAULT RESONANCE ENGINE (Isolated Pure Gradio Factory)
|
| 4 |
+
This is the ORIGINAL working 4-layer sonification engine, completely separate from LYGO/LDQ.
|
| 5 |
+
|
| 6 |
+
- NO LDQ imports, NO use_ldq, NO sidechain, NO genre manifold, NO perceptual, NO fingerprint.
|
| 7 |
+
- Pure image-driven stereo soundscapes using only the classic layers:
|
| 8 |
+
1. Texture Floor (filtered noise from edge density)
|
| 9 |
+
2. Drones (saw from structural lines)
|
| 10 |
+
3. Melody (sine from contours)
|
| 11 |
+
4. Glitch (short tones from FAST keypoints)
|
| 12 |
+
|
| 13 |
+
Goal: Reliable "industry quality beats / musical" output as the default factory experience.
|
| 14 |
+
This file is the drop-in clean factory. The LYGO tab continues to use the other engine.
|
| 15 |
+
|
| 16 |
+
Based on the clean original implementations that produced good musical results (historical working versions).
|
| 17 |
+
"""
|
| 18 |
+
|
| 19 |
+
import cv2
|
| 20 |
+
import numpy as np
|
| 21 |
+
import soundfile as sf
|
| 22 |
+
import math
|
| 23 |
+
from pathlib import Path
|
| 24 |
+
from typing import Optional, Dict, Any
|
| 25 |
+
|
| 26 |
+
__version__ = "factory-1.0.0-isolated"
|
| 27 |
+
|
| 28 |
+
# Artistic Presets tuned for musical / "industry beats" factory output
|
| 29 |
+
# (balanced noise, strong drones + contour melodies for rhythmic feel, tasteful glitch)
|
| 30 |
+
PRESETS = {
|
| 31 |
+
"raw": {
|
| 32 |
+
"noise_vol": 0.06,
|
| 33 |
+
"drone_vol": 0.07,
|
| 34 |
+
"note_vol": 0.12,
|
| 35 |
+
"glitch_vol": 0.02,
|
| 36 |
+
"noise_lowpass_hz": 800,
|
| 37 |
+
},
|
| 38 |
+
"ambient": {
|
| 39 |
+
"noise_vol": 0.04,
|
| 40 |
+
"drone_vol": 0.09,
|
| 41 |
+
"note_vol": 0.10,
|
| 42 |
+
"glitch_vol": 0.008,
|
| 43 |
+
"drone_attack": 5.0,
|
| 44 |
+
"drone_decay": 6.0,
|
| 45 |
+
"note_decay": 0.55,
|
| 46 |
+
"noise_lowpass_hz": 450,
|
| 47 |
+
},
|
| 48 |
+
"glitch": {
|
| 49 |
+
"noise_vol": 0.07,
|
| 50 |
+
"drone_vol": 0.05,
|
| 51 |
+
"note_vol": 0.09,
|
| 52 |
+
"glitch_vol": 0.06,
|
| 53 |
+
"max_glitches": 25,
|
| 54 |
+
"noise_lowpass_hz": 2200,
|
| 55 |
+
},
|
| 56 |
+
"ethereal": {
|
| 57 |
+
"noise_vol": 0.03,
|
| 58 |
+
"drone_vol": 0.08,
|
| 59 |
+
"note_vol": 0.11,
|
| 60 |
+
"glitch_vol": 0.01,
|
| 61 |
+
"note_decay": 0.6,
|
| 62 |
+
"noise_lowpass_hz": 380,
|
| 63 |
+
},
|
| 64 |
+
"cinematic": {
|
| 65 |
+
"noise_vol": 0.05,
|
| 66 |
+
"drone_vol": 0.08,
|
| 67 |
+
"note_vol": 0.13,
|
| 68 |
+
"glitch_vol": 0.025,
|
| 69 |
+
"drone_attack": 4.0,
|
| 70 |
+
"drone_decay": 5.5,
|
| 71 |
+
"note_attack": 0.05,
|
| 72 |
+
"note_decay": 0.38,
|
| 73 |
+
"max_glitches": 18,
|
| 74 |
+
"noise_lowpass_hz": 720,
|
| 75 |
+
"root_freq_range": (28, 72),
|
| 76 |
+
},
|
| 77 |
+
# Strong musical factory default - "industry quality" feel
|
| 78 |
+
"musical": {
|
| 79 |
+
"noise_vol": 0.045,
|
| 80 |
+
"drone_vol": 0.085,
|
| 81 |
+
"note_vol": 0.135,
|
| 82 |
+
"glitch_vol": 0.022,
|
| 83 |
+
"noise_lowpass_hz": 680,
|
| 84 |
+
"drone_attack": 3.8,
|
| 85 |
+
"drone_decay": 5.2,
|
| 86 |
+
"note_decay": 0.36,
|
| 87 |
+
"max_notes": 9,
|
| 88 |
+
"max_glitches": 16,
|
| 89 |
+
},
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
|
| 93 |
+
class FactoryResonanceEngine:
|
| 94 |
+
"""Completely isolated factory default engine. No LYGO/LDQ dependencies."""
|
| 95 |
+
|
| 96 |
+
def __init__(self, config: Optional[Dict[str, Any]] = None):
|
| 97 |
+
self.config = {
|
| 98 |
+
"sr": 44100,
|
| 99 |
+
"duration": 15.0,
|
| 100 |
+
"global_fade": 0.65,
|
| 101 |
+
"soft_clip": True,
|
| 102 |
+
"soft_clip_amount": 1.35,
|
| 103 |
+
"max_drones": 5,
|
| 104 |
+
"max_notes": 8,
|
| 105 |
+
"max_glitches": 14,
|
| 106 |
+
"noise_vol": 0.05,
|
| 107 |
+
"drone_vol": 0.07,
|
| 108 |
+
"note_vol": 0.12,
|
| 109 |
+
"glitch_vol": 0.018,
|
| 110 |
+
"root_freq_range": (32, 68),
|
| 111 |
+
"theta_lock_range": (4.8, 10.5),
|
| 112 |
+
"drone_attack": 3.8,
|
| 113 |
+
"drone_decay": 5.0,
|
| 114 |
+
"note_attack": 0.045,
|
| 115 |
+
"note_decay": 0.34,
|
| 116 |
+
"glitch_attack": 0.004,
|
| 117 |
+
"glitch_decay": 0.014,
|
| 118 |
+
"noise_lowpass_hz": 650,
|
| 119 |
+
"random_seed": None,
|
| 120 |
+
"verbose": True,
|
| 121 |
+
"export_stems": False,
|
| 122 |
+
"export_midi": False,
|
| 123 |
+
}
|
| 124 |
+
if config:
|
| 125 |
+
self.config.update(config)
|
| 126 |
+
|
| 127 |
+
def _log(self, msg: str):
|
| 128 |
+
if self.config.get("verbose", True):
|
| 129 |
+
print(msg)
|
| 130 |
+
|
| 131 |
+
def analyze_image(self, image_path: str) -> Dict[str, Any]:
|
| 132 |
+
"""Standard computer vision analysis β unchanged from original working versions."""
|
| 133 |
+
img = cv2.imread(str(image_path))
|
| 134 |
+
if img is None:
|
| 135 |
+
raise FileNotFoundError(f"Could not load image: {image_path}")
|
| 136 |
+
if len(img.shape) == 2:
|
| 137 |
+
img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
|
| 138 |
+
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
| 139 |
+
h, w = gray.shape
|
| 140 |
+
avg_blue, avg_green, avg_red, _ = cv2.mean(img)
|
| 141 |
+
edges = cv2.Canny(gray, 50, 150)
|
| 142 |
+
edge_density = np.sum(edges > 0) / (h * w)
|
| 143 |
+
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
| 144 |
+
lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 50, minLineLength=28, maxLineGap=12)
|
| 145 |
+
fast = cv2.FastFeatureDetector_create(threshold=38)
|
| 146 |
+
keypoints = fast.detect(gray, None)
|
| 147 |
+
return {
|
| 148 |
+
"width": w, "height": h,
|
| 149 |
+
"avg_red": avg_red, "avg_green": avg_green, "avg_blue": avg_blue,
|
| 150 |
+
"edge_density": edge_density,
|
| 151 |
+
"contours": contours,
|
| 152 |
+
"lines": lines if lines is not None else [],
|
| 153 |
+
"keypoints": keypoints,
|
| 154 |
+
}
|
| 155 |
+
|
| 156 |
+
def _generate_tone(self, freq: float, duration: float, wave_type: str = "sine") -> np.ndarray:
|
| 157 |
+
sr = self.config["sr"]
|
| 158 |
+
n = int(sr * duration)
|
| 159 |
+
if n <= 0:
|
| 160 |
+
return np.zeros(1, dtype=np.float32)
|
| 161 |
+
t = np.linspace(0, duration, n, dtype=np.float32)
|
| 162 |
+
if wave_type == "sine":
|
| 163 |
+
return np.sin(freq * t * 2 * np.pi).astype(np.float32)
|
| 164 |
+
elif wave_type == "sawtooth":
|
| 165 |
+
return (2 * (t * freq - np.floor(0.5 + t * freq)) * 0.58).astype(np.float32)
|
| 166 |
+
elif wave_type == "noise":
|
| 167 |
+
return np.random.uniform(-0.32, 0.32, n).astype(np.float32)
|
| 168 |
+
return np.zeros(n, dtype=np.float32)
|
| 169 |
+
|
| 170 |
+
def _apply_envelope(self, audio: np.ndarray, attack: float, decay: float) -> np.ndarray:
|
| 171 |
+
sr = self.config["sr"]
|
| 172 |
+
n = len(audio)
|
| 173 |
+
if n <= 0:
|
| 174 |
+
return audio
|
| 175 |
+
a = max(1, int(attack * sr))
|
| 176 |
+
d = max(1, int(decay * sr))
|
| 177 |
+
env = np.ones(n, dtype=np.float32)
|
| 178 |
+
if n > a + d:
|
| 179 |
+
env[:a] = np.linspace(0, 1, a, dtype=np.float32)
|
| 180 |
+
env[-d:] = np.linspace(1, 0, d, dtype=np.float32)
|
| 181 |
+
return (audio * env).astype(np.float32)
|
| 182 |
+
|
| 183 |
+
def _stereo_pan(self, mono: np.ndarray, pan: float) -> np.ndarray:
|
| 184 |
+
if mono.ndim == 1:
|
| 185 |
+
mono = mono[:, np.newaxis]
|
| 186 |
+
pan = max(-1.0, min(1.0, pan))
|
| 187 |
+
left = math.cos((pan + 1) * math.pi / 4)
|
| 188 |
+
right = math.sin((pan + 1) * math.pi / 4)
|
| 189 |
+
return np.column_stack((mono * left, mono * right)).astype(np.float32)
|
| 190 |
+
|
| 191 |
+
def _fft_lowpass(self, audio: np.ndarray, cutoff_hz: float) -> np.ndarray:
|
| 192 |
+
if cutoff_hz <= 0 or len(audio) < 32:
|
| 193 |
+
return audio
|
| 194 |
+
sr = self.config["sr"]
|
| 195 |
+
n = len(audio)
|
| 196 |
+
fft = np.fft.rfft(audio)
|
| 197 |
+
freqs = np.fft.rfftfreq(n, 1.0 / sr)
|
| 198 |
+
fft[freqs > cutoff_hz] = 0
|
| 199 |
+
return np.fft.irfft(fft, n=n).real.astype(np.float32)
|
| 200 |
+
|
| 201 |
+
def _soft_limit(self, audio: np.ndarray) -> np.ndarray:
|
| 202 |
+
if self.config["soft_clip"]:
|
| 203 |
+
amt = self.config["soft_clip_amount"]
|
| 204 |
+
return (np.tanh(audio * amt) / np.tanh(amt)).astype(np.float32)
|
| 205 |
+
return audio
|
| 206 |
+
|
| 207 |
+
def synthesize(self, features: Dict[str, Any], output_path: str):
|
| 208 |
+
cfg = self.config
|
| 209 |
+
if cfg["random_seed"] is not None:
|
| 210 |
+
np.random.seed(cfg["random_seed"])
|
| 211 |
+
|
| 212 |
+
sr = cfg["sr"]
|
| 213 |
+
duration = cfg["duration"]
|
| 214 |
+
n_total = int(sr * duration)
|
| 215 |
+
if n_total <= 0:
|
| 216 |
+
sf.write(output_path, np.zeros((1, 2)), sr)
|
| 217 |
+
return
|
| 218 |
+
|
| 219 |
+
audio = np.zeros((n_total, 2), dtype=np.float32)
|
| 220 |
+
root = np.interp(features["avg_red"], [0, 255], cfg["root_freq_range"])
|
| 221 |
+
theta = np.interp(features["avg_green"], [0, 255], cfg["theta_lock_range"])
|
| 222 |
+
w, h = features["width"], features["height"]
|
| 223 |
+
|
| 224 |
+
self._log("π΅ FACTORY ENGINE β Pure 4-layer (no LYGO/LDQ)")
|
| 225 |
+
|
| 226 |
+
# Collections for stems
|
| 227 |
+
audio_noise = np.zeros((n_total, 2), dtype=np.float32)
|
| 228 |
+
audio_drone = np.zeros((n_total, 2), dtype=np.float32)
|
| 229 |
+
audio_melody = np.zeros((n_total, 2), dtype=np.float32)
|
| 230 |
+
audio_glitch = np.zeros((n_total, 2), dtype=np.float32)
|
| 231 |
+
melody_events = []
|
| 232 |
+
|
| 233 |
+
# Layer 1: Texture Floor (Noise) β filtered for musicality
|
| 234 |
+
if features["edge_density"] > 0.006:
|
| 235 |
+
noise = self._generate_tone(0, duration, "noise")
|
| 236 |
+
if cfg.get("noise_lowpass_hz", 650) > 0:
|
| 237 |
+
noise = self._fft_lowpass(noise, cfg["noise_lowpass_hz"])
|
| 238 |
+
noise = self._apply_envelope(noise, cfg["drone_attack"], cfg["drone_decay"])
|
| 239 |
+
vol = min(features["edge_density"] * 1.35, cfg["noise_vol"])
|
| 240 |
+
stereo_noise = self._stereo_pan(noise, 0.0) * vol
|
| 241 |
+
audio += stereo_noise
|
| 242 |
+
audio_noise += stereo_noise
|
| 243 |
+
self._log(f" Layer1 noise vol={vol:.3f} lowpass={cfg.get('noise_lowpass_hz')}")
|
| 244 |
+
|
| 245 |
+
# Layer 2: Drones (Lines) β rhythmic backbone
|
| 246 |
+
for i, line in enumerate(features["lines"][:cfg["max_drones"]]):
|
| 247 |
+
x1, _, x2, _ = line[0]
|
| 248 |
+
length = math.hypot(x2 - x1, 0)
|
| 249 |
+
detune = (i * 0.65) if cfg["random_seed"] is not None else 0
|
| 250 |
+
freq = root + (max(1, int(length / 46)) * theta * 0.58) + detune
|
| 251 |
+
tone = self._generate_tone(freq, duration, "sawtooth")
|
| 252 |
+
tone = self._apply_envelope(tone, cfg["drone_attack"], cfg["drone_decay"])
|
| 253 |
+
pan = (x1 / w) * 2 - 1
|
| 254 |
+
stereo_drone = self._stereo_pan(tone, pan) * cfg["drone_vol"]
|
| 255 |
+
audio += stereo_drone
|
| 256 |
+
audio_drone += stereo_drone
|
| 257 |
+
|
| 258 |
+
# Layer 3: Contours β Melody (main musical/rhythmic content)
|
| 259 |
+
valid = [c for c in features["contours"] if 85 < cv2.contourArea(c) < (w * h * 0.62)]
|
| 260 |
+
valid.sort(key=lambda c: cv2.boundingRect(c)[0])
|
| 261 |
+
|
| 262 |
+
for i, cnt in enumerate(valid[:cfg["max_notes"]]):
|
| 263 |
+
area = cv2.contourArea(cnt)
|
| 264 |
+
verts = len(cv2.approxPolyDP(cnt, 0.04 * cv2.arcLength(cnt, True), True))
|
| 265 |
+
freq = (root * 3.65) + (verts * theta * 1.55)
|
| 266 |
+
dur = min(2.8, 0.18 + (area / 12800))
|
| 267 |
+
tone = self._generate_tone(freq, dur, "sine")
|
| 268 |
+
tone = self._apply_envelope(tone, cfg["note_attack"], cfg["note_decay"])
|
| 269 |
+
|
| 270 |
+
M = cv2.moments(cnt)
|
| 271 |
+
cx = int(M["m10"] / M["m00"]) if M["m00"] != 0 else cv2.boundingRect(cnt)[0]
|
| 272 |
+
start = (cx / w) * (duration - dur)
|
| 273 |
+
idx = int(start * sr)
|
| 274 |
+
end = min(idx + len(tone), n_total)
|
| 275 |
+
pan = (cx / w) * 2 - 1
|
| 276 |
+
stereo_note = self._stereo_pan(tone[:end-idx], pan) * cfg["note_vol"]
|
| 277 |
+
audio[idx:end] += stereo_note
|
| 278 |
+
audio_melody[idx:end] += stereo_note
|
| 279 |
+
melody_events.append((freq, dur, start))
|
| 280 |
+
|
| 281 |
+
# Layer 4: Glitch / Micro events (adds percussive "beat" character)
|
| 282 |
+
for i, kp in enumerate(features["keypoints"][:cfg["max_glitches"]]):
|
| 283 |
+
x, y = kp.pt
|
| 284 |
+
freq = root * 13.2 + (y % 82) * 1.35
|
| 285 |
+
tone = self._generate_tone(freq, 0.048, "sine")
|
| 286 |
+
tone = self._apply_envelope(tone, cfg["glitch_attack"], cfg["glitch_decay"])
|
| 287 |
+
start = (y / h) * (duration - 0.048)
|
| 288 |
+
idx = int(start * sr)
|
| 289 |
+
end = min(idx + len(tone), n_total)
|
| 290 |
+
pan = (x / w) * 2 - 1
|
| 291 |
+
stereo_glitch = self._stereo_pan(tone[:end-idx], pan) * cfg["glitch_vol"]
|
| 292 |
+
audio[idx:end] += stereo_glitch
|
| 293 |
+
audio_glitch[idx:end] += stereo_glitch
|
| 294 |
+
|
| 295 |
+
# Final factory polish (safe, no LDQ)
|
| 296 |
+
audio = self._soft_limit(audio)
|
| 297 |
+
fade = int(cfg["global_fade"] * sr)
|
| 298 |
+
if fade > 0 and n_total > fade * 2:
|
| 299 |
+
audio[:fade] *= np.linspace(0, 1, fade)[:, np.newaxis]
|
| 300 |
+
audio[-fade:] *= np.linspace(1, 0, fade)[:, np.newaxis]
|
| 301 |
+
|
| 302 |
+
peak = np.max(np.abs(audio))
|
| 303 |
+
if peak > 0:
|
| 304 |
+
audio = audio / peak * 0.965
|
| 305 |
+
|
| 306 |
+
sf.write(output_path, audio, sr)
|
| 307 |
+
self._log(f"β FACTORY Saved: {output_path} | Peak: {peak:.3f}")
|
| 308 |
+
|
| 309 |
+
# Stems (factory feature)
|
| 310 |
+
if cfg.get("export_stems"):
|
| 311 |
+
base = output_path.replace(".wav", "")
|
| 312 |
+
for stem, name in [(audio_noise, "noise"), (audio_drone, "drone"),
|
| 313 |
+
(audio_melody, "melody"), (audio_glitch, "glitch")]:
|
| 314 |
+
mv = np.max(np.abs(stem))
|
| 315 |
+
if mv > 0:
|
| 316 |
+
stem = stem / mv * 0.965
|
| 317 |
+
sf.write(f"{base}_{name}.wav", stem, sr)
|
| 318 |
+
self._log(f"β Stem: {base}_{name}.wav")
|
| 319 |
+
|
| 320 |
+
# MIDI (factory feature)
|
| 321 |
+
if cfg.get("export_midi") and melody_events:
|
| 322 |
+
try:
|
| 323 |
+
from mido import MidiFile, MidiTrack, Message
|
| 324 |
+
mid = MidiFile()
|
| 325 |
+
track = MidiTrack()
|
| 326 |
+
mid.tracks.append(track)
|
| 327 |
+
ticks_per_beat = 480
|
| 328 |
+
tempo = 128
|
| 329 |
+
tick_offset = 0
|
| 330 |
+
for freq, dur, start in melody_events:
|
| 331 |
+
midi_note = max(0, min(127, int(12 * math.log2(max(20, freq) / 440) + 69)))
|
| 332 |
+
duration_ticks = int(dur * ticks_per_beat * (tempo / 60))
|
| 333 |
+
start_ticks = int(start * ticks_per_beat * (tempo / 60))
|
| 334 |
+
track.append(Message('note_on', note=midi_note, velocity=62, time=start_ticks - tick_offset))
|
| 335 |
+
track.append(Message('note_off', note=midi_note, velocity=62, time=duration_ticks))
|
| 336 |
+
tick_offset = start_ticks + duration_ticks
|
| 337 |
+
mid_path = output_path.replace(".wav", ".mid")
|
| 338 |
+
mid.save(mid_path)
|
| 339 |
+
self._log(f"β MIDI: {mid_path}")
|
| 340 |
+
except Exception as e:
|
| 341 |
+
self._log(f"MIDI export skipped: {e}")
|
| 342 |
+
|
| 343 |
+
def process(self, image_path: str, output_path: str):
|
| 344 |
+
self._log(f"\nββββββββββββββββββββββββββββββββββββββββββββββ")
|
| 345 |
+
self._log(f"β FACTORY DEFAULT RESONANCE ENGINE v{__version__} β")
|
| 346 |
+
self._log(f"β Pure image β musical stereo soundscape β")
|
| 347 |
+
self._log(f"ββββββββββββββββββββββββββββββββββββββββββββββ\n")
|
| 348 |
+
self._log(f"Analyzing: {image_path}")
|
| 349 |
+
features = self.analyze_image(image_path)
|
| 350 |
+
self.synthesize(features, output_path)
|
| 351 |
+
|
| 352 |
+
|
| 353 |
+
def main():
|
| 354 |
+
import argparse
|
| 355 |
+
parser = argparse.ArgumentParser()
|
| 356 |
+
parser.add_argument("image")
|
| 357 |
+
parser.add_argument("-o", "--output", default=None)
|
| 358 |
+
parser.add_argument("--duration", type=float, default=15.0)
|
| 359 |
+
parser.add_argument("--style", choices=list(PRESETS.keys()), default="cinematic")
|
| 360 |
+
parser.add_argument("--seed", type=int, default=None)
|
| 361 |
+
parser.add_argument("--noise-filter", type=float, default=None)
|
| 362 |
+
parser.add_argument("--stems", action="store_true")
|
| 363 |
+
parser.add_argument("--midi", action="store_true")
|
| 364 |
+
parser.add_argument("--quiet", action="store_true")
|
| 365 |
+
args = parser.parse_args()
|
| 366 |
+
|
| 367 |
+
config = {
|
| 368 |
+
"duration": args.duration,
|
| 369 |
+
"random_seed": args.seed,
|
| 370 |
+
"verbose": not args.quiet,
|
| 371 |
+
"export_stems": args.stems,
|
| 372 |
+
"export_midi": args.midi,
|
| 373 |
+
}
|
| 374 |
+
if args.noise_filter is not None:
|
| 375 |
+
config["noise_lowpass_hz"] = args.noise_filter
|
| 376 |
+
|
| 377 |
+
preset = PRESETS.get(args.style, {})
|
| 378 |
+
config.update(preset)
|
| 379 |
+
|
| 380 |
+
out_path = args.output or f"factory_{Path(args.image).stem}.wav"
|
| 381 |
+
engine = FactoryResonanceEngine(config)
|
| 382 |
+
engine.process(args.image, out_path)
|
| 383 |
+
|
| 384 |
+
|
| 385 |
+
if __name__ == "__main__":
|
| 386 |
+
main()
|
gitattributes
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
ldq_music_production.py
CHANGED
|
@@ -1,75 +1,187 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import numpy as np
|
|
|
|
| 2 |
from scipy import signal
|
| 3 |
-
from typing import List
|
| 4 |
-
|
| 5 |
-
class TempoGrid:
|
| 6 |
-
"""Musical tempo grid with quantization and swing."""
|
| 7 |
-
def __init__(self, bpm: float = 140, subdivision: int = 16, swing: float = 0.0):
|
| 8 |
-
self.bpm = bpm
|
| 9 |
-
self.subdivision = subdivision
|
| 10 |
-
self.swing = max(0.0, min(0.5, swing))
|
| 11 |
-
self.grid_duration = (60.0 / bpm) / subdivision
|
| 12 |
-
|
| 13 |
-
def quantize(self, time: float) -> float:
|
| 14 |
-
grid_pos = round(time / self.grid_duration)
|
| 15 |
-
quantized = grid_pos * self.grid_duration
|
| 16 |
-
if self.swing > 0 and grid_pos % 2 == 1:
|
| 17 |
-
quantized += self.grid_duration * self.swing * 0.6
|
| 18 |
-
return quantized
|
| 19 |
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
"""
|
| 25 |
if audio.ndim == 1:
|
| 26 |
audio = audio[:, np.newaxis]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
|
| 47 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
|
| 50 |
-
def
|
| 51 |
-
"""
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
| 64 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
|
| 67 |
-
def
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""
|
| 3 |
+
LDQ Music Production Layer
|
| 4 |
+
Professional mixing tools: frequency separation, sidechain compression, EQ, limiting.
|
| 5 |
+
"""
|
| 6 |
+
|
| 7 |
import numpy as np
|
| 8 |
+
import math
|
| 9 |
from scipy import signal
|
| 10 |
+
from typing import Dict, Any, List, Optional
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
|
| 12 |
+
def separate_frequencies(audio: np.ndarray, sr: int) -> Dict[str, np.ndarray]:
|
| 13 |
+
"""
|
| 14 |
+
Split audio into four frequency bands using Butterworth filters.
|
| 15 |
+
Returns dict: 'sub', 'bass', 'mid', 'high'
|
| 16 |
+
"""
|
| 17 |
if audio.ndim == 1:
|
| 18 |
audio = audio[:, np.newaxis]
|
| 19 |
+
|
| 20 |
+
# Design filters (4th order Butterworth)
|
| 21 |
+
# Sub: 20-80 Hz (kick)
|
| 22 |
+
sos_sub = signal.butter(4, [20, 80], btype='bandpass', fs=sr, output='sos')
|
| 23 |
+
# Bass: 80-250 Hz (low bass)
|
| 24 |
+
sos_bass = signal.butter(4, [80, 250], btype='bandpass', fs=sr, output='sos')
|
| 25 |
+
# Mid: 250-4000 Hz (snare, melody)
|
| 26 |
+
sos_mid = signal.butter(4, [250, 4000], btype='bandpass', fs=sr, output='sos')
|
| 27 |
+
# High: 4000-16000 Hz (hi-hats, textures)
|
| 28 |
+
sos_high = signal.butter(4, [4000, 16000], btype='bandpass', fs=sr, output='sos')
|
| 29 |
+
|
| 30 |
+
bands = {
|
| 31 |
+
'sub': signal.sosfilt(sos_sub, audio, axis=0),
|
| 32 |
+
'bass': signal.sosfilt(sos_bass, audio, axis=0),
|
| 33 |
+
'mid': signal.sosfilt(sos_mid, audio, axis=0),
|
| 34 |
+
'high': signal.sosfilt(sos_high, audio, axis=0),
|
| 35 |
+
}
|
| 36 |
+
return bands
|
| 37 |
|
| 38 |
+
def sidechain_compress(main_audio: np.ndarray, sidechain_audio: np.ndarray, sr: int,
|
| 39 |
+
threshold: float = 0.5, ratio: float = 4.0,
|
| 40 |
+
attack: float = 0.005, release: float = 0.1) -> np.ndarray:
|
| 41 |
+
"""
|
| 42 |
+
Sidechain compression: duck main_audio when sidechain_audio exceeds threshold.
|
| 43 |
+
Returns compressed audio.
|
| 44 |
+
"""
|
| 45 |
+
# Envelope follower on sidechain
|
| 46 |
+
env = np.abs(sidechain_audio)
|
| 47 |
+
# Simple lowpass envelope
|
| 48 |
+
cutoff = 50 # Hz
|
| 49 |
+
b, a = signal.butter(1, cutoff, btype='low', fs=sr)
|
| 50 |
+
env = signal.lfilter(b, a, env, axis=0)
|
| 51 |
+
|
| 52 |
+
# Compute gain reduction
|
| 53 |
+
reduction = np.ones_like(env)
|
| 54 |
+
mask = env > threshold
|
| 55 |
+
reduction[mask] = threshold / (threshold + (env[mask] - threshold) * ratio)
|
| 56 |
+
|
| 57 |
+
# Apply attack/release smoothing
|
| 58 |
+
attack_samples = int(attack * sr)
|
| 59 |
+
release_samples = int(release * sr)
|
| 60 |
+
smoothed = np.ones_like(reduction)
|
| 61 |
+
for i in range(1, len(reduction)):
|
| 62 |
+
diff = reduction[i] - reduction[i-1]
|
| 63 |
+
if np.any(diff < 0): # Attack (handle array for stereo)
|
| 64 |
+
alpha = 1 - math.exp(-1 / attack_samples)
|
| 65 |
+
else: # Release
|
| 66 |
+
alpha = 1 - math.exp(-1 / release_samples)
|
| 67 |
+
smoothed[i] = smoothed[i-1] + alpha * (reduction[i] - smoothed[i-1])
|
| 68 |
+
|
| 69 |
+
return main_audio * smoothed
|
| 70 |
|
| 71 |
+
def apply_envelope_shaping(audio: np.ndarray, sr: int,
|
| 72 |
+
attack: float = 0.01, decay: float = 0.1,
|
| 73 |
+
sustain: float = 0.5, release: float = 0.2) -> np.ndarray:
|
| 74 |
+
"""
|
| 75 |
+
Apply ADSR-style envelope to the entire audio (for shaping drums).
|
| 76 |
+
"""
|
| 77 |
+
n = len(audio)
|
| 78 |
+
env = np.ones(n)
|
| 79 |
+
|
| 80 |
+
attack_samples = int(attack * sr)
|
| 81 |
+
decay_samples = int(decay * sr)
|
| 82 |
+
release_samples = int(release * sr)
|
| 83 |
+
|
| 84 |
+
# Attack
|
| 85 |
+
if attack_samples > 0:
|
| 86 |
+
env[:attack_samples] = np.linspace(0, 1, attack_samples)
|
| 87 |
+
# Decay
|
| 88 |
+
if decay_samples > 0:
|
| 89 |
+
env[attack_samples:attack_samples+decay_samples] = np.linspace(1, sustain, decay_samples)
|
| 90 |
+
# Sustain
|
| 91 |
+
env[attack_samples+decay_samples:-release_samples] = sustain
|
| 92 |
+
# Release
|
| 93 |
+
if release_samples > 0:
|
| 94 |
+
env[-release_samples:] = np.linspace(sustain, 0, release_samples)
|
| 95 |
+
|
| 96 |
+
return audio * env[:, np.newaxis]
|
| 97 |
|
| 98 |
+
def gentle_limiter(audio: np.ndarray, threshold: float = 0.9, ceiling: float = 0.95) -> np.ndarray:
|
| 99 |
+
"""
|
| 100 |
+
Soft limiter to prevent clipping and add warmth.
|
| 101 |
+
"""
|
| 102 |
+
peak = np.max(np.abs(audio))
|
| 103 |
+
if peak <= threshold:
|
| 104 |
+
# No limiting needed, just adjust gain
|
| 105 |
+
return audio * (ceiling / peak) if peak > 0 else audio
|
| 106 |
+
|
| 107 |
+
# Apply soft limiting
|
| 108 |
+
gain = threshold / peak
|
| 109 |
+
audio = audio * gain
|
| 110 |
+
# Soft saturation
|
| 111 |
+
audio = np.tanh(audio * 2.0) / np.tanh(2.0)
|
| 112 |
+
# Scale to ceiling
|
| 113 |
+
audio = audio / np.max(np.abs(audio)) * ceiling
|
| 114 |
+
return audio
|
| 115 |
|
| 116 |
+
def equalize(audio: np.ndarray, sr: int, eq_params: Dict[str, float]) -> np.ndarray:
|
| 117 |
+
"""
|
| 118 |
+
Apply a simple EQ with low shelf, high shelf, and mid boost/cut.
|
| 119 |
+
eq_params: {'low_gain': db, 'high_gain': db, 'mid_freq': Hz, 'mid_q': Q, 'mid_gain': db}
|
| 120 |
+
"""
|
| 121 |
+
# Low shelf at 150 Hz
|
| 122 |
+
low_gain = eq_params.get('low_gain', 0.0)
|
| 123 |
+
high_gain = eq_params.get('high_gain', 0.0)
|
| 124 |
+
mid_freq = eq_params.get('mid_freq', 1000)
|
| 125 |
+
mid_q = eq_params.get('mid_q', 1.0)
|
| 126 |
+
mid_gain = eq_params.get('mid_gain', 0.0)
|
| 127 |
+
|
| 128 |
+
# Build biquad filters
|
| 129 |
+
from scipy import signal
|
| 130 |
+
# Low shelf
|
| 131 |
+
b, a = signal.biquad_low_shelf(sr, 150, 1.0, low_gain)
|
| 132 |
+
audio = signal.lfilter(b, a, audio, axis=0)
|
| 133 |
+
# High shelf
|
| 134 |
+
b, a = signal.biquad_high_shelf(sr, 6000, 1.0, high_gain)
|
| 135 |
+
audio = signal.lfilter(b, a, audio, axis=0)
|
| 136 |
+
# Mid peak
|
| 137 |
+
b, a = signal.biquad_peak(sr, mid_freq, mid_q, mid_gain)
|
| 138 |
+
audio = signal.lfilter(b, a, audio, axis=0)
|
| 139 |
+
return audio
|
| 140 |
|
| 141 |
+
def mix_frequency_bands(bands: Dict[str, np.ndarray], gains: Dict[str, float]) -> np.ndarray:
|
| 142 |
+
"""
|
| 143 |
+
Mix the four frequency bands with given gains.
|
| 144 |
+
"""
|
| 145 |
+
mix = np.zeros_like(bands['sub'])
|
| 146 |
+
for band_name, band_audio in bands.items():
|
| 147 |
+
gain = gains.get(band_name, 1.0)
|
| 148 |
+
mix += band_audio * gain
|
| 149 |
+
return mix
|
| 150 |
|
| 151 |
+
def apply_music_production(audio: np.ndarray, features: Dict[str, Any], sr: int,
|
| 152 |
+
bpm: int = 140, sidechain: bool = True) -> np.ndarray:
|
| 153 |
+
"""
|
| 154 |
+
Complete music production pipeline:
|
| 155 |
+
1. Separate frequency bands
|
| 156 |
+
2. Apply sidechain compression
|
| 157 |
+
3. Envelope shaping
|
| 158 |
+
4. EQ
|
| 159 |
+
5. Limiting
|
| 160 |
+
"""
|
| 161 |
+
# 1. Separate bands
|
| 162 |
+
bands = separate_frequencies(audio, sr)
|
| 163 |
+
|
| 164 |
+
# 2. Sidechain: duck bass and mid when kick (sub) hits
|
| 165 |
+
if sidechain:
|
| 166 |
+
# Use sub band as sidechain trigger
|
| 167 |
+
kick_envelope = np.maximum(bands['sub'], 0)
|
| 168 |
+
# Compress bass and mid
|
| 169 |
+
bands['bass'] = sidechain_compress(bands['bass'], kick_envelope, sr, threshold=0.3, ratio=3.0)
|
| 170 |
+
bands['mid'] = sidechain_compress(bands['mid'], kick_envelope, sr, threshold=0.4, ratio=2.0)
|
| 171 |
+
|
| 172 |
+
# 3. Envelope shaping on sub (kick) for punch
|
| 173 |
+
bands['sub'] = apply_envelope_shaping(bands['sub'], sr, attack=0.001, decay=0.1, sustain=0.1, release=0.05)
|
| 174 |
+
|
| 175 |
+
# 4. EQ: boost sub, cut high mids
|
| 176 |
+
eq_params = {'low_gain': 3.0, 'high_gain': -2.0, 'mid_freq': 2000, 'mid_q': 1.5, 'mid_gain': -1.0}
|
| 177 |
+
for band in bands:
|
| 178 |
+
bands[band] = equalize(bands[band], sr, eq_params)
|
| 179 |
+
|
| 180 |
+
# 5. Mix with appropriate gains
|
| 181 |
+
gains = {'sub': 1.2, 'bass': 0.8, 'mid': 0.7, 'high': 0.5}
|
| 182 |
+
mixed = mix_frequency_bands(bands, gains)
|
| 183 |
+
|
| 184 |
+
# 6. Gentle limiting
|
| 185 |
+
mixed = gentle_limiter(mixed, threshold=0.8, ceiling=0.95)
|
| 186 |
+
|
| 187 |
+
return mixed
|
ldq_percussion.py
CHANGED
|
@@ -1,40 +1,131 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import numpy as np
|
| 2 |
import math
|
| 3 |
import cv2
|
| 4 |
from typing import Dict, Any
|
| 5 |
|
| 6 |
-
def generate_kick(features: Dict[str, Any], sr: int, duration: float = 0.
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
|
|
|
|
| 15 |
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
body = np.sin(2 * np.pi *
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
return (body + noise) * env * 0.85
|
| 22 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
|
| 24 |
def generate_hihats(features: Dict[str, Any], sr: int, bpm: float, duration: float = 2.0) -> np.ndarray:
|
| 25 |
-
|
| 26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
|
| 28 |
beats = duration * (bpm / 60)
|
| 29 |
n_ticks = int(beats * subdivision)
|
| 30 |
-
hihat = np.zeros(int(sr * duration))
|
| 31 |
|
| 32 |
-
|
|
|
|
|
|
|
|
|
|
| 33 |
pos = int(i * sr * 60 / (bpm * subdivision))
|
| 34 |
-
if pos
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
|
| 40 |
-
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""
|
| 3 |
+
LDQ Percussion Engine v2.1
|
| 4 |
+
Professional drum synthesis β FIXED: broadcasting, truthiness, and shape mismatches.
|
| 5 |
+
"""
|
| 6 |
+
|
| 7 |
import numpy as np
|
| 8 |
import math
|
| 9 |
import cv2
|
| 10 |
from typing import Dict, Any
|
| 11 |
|
| 12 |
+
def generate_kick(features: Dict[str, Any], sr: int, duration: float = 0.5) -> np.ndarray:
|
| 13 |
+
"""Generate a punchy kick drum. Output shape: (sr*duration,)."""
|
| 14 |
+
n = int(sr * duration)
|
| 15 |
+
if n <= 0:
|
| 16 |
+
return np.zeros(1)
|
| 17 |
+
|
| 18 |
+
contours = features.get("contours")
|
| 19 |
+
if contours is None or len(contours) == 0:
|
| 20 |
+
# default kick
|
| 21 |
+
t = np.linspace(0, duration, n)
|
| 22 |
+
pitch = np.linspace(60, 30, n)
|
| 23 |
+
kick = np.sin(2 * np.pi * pitch * t)
|
| 24 |
+
env = np.exp(-t * 25)
|
| 25 |
+
return (kick * env).astype(np.float32)
|
| 26 |
+
|
| 27 |
+
largest = max(contours, key=cv2.contourArea)
|
| 28 |
+
area = cv2.contourArea(largest)
|
| 29 |
+
perimeter = cv2.arcLength(largest, True)
|
| 30 |
+
|
| 31 |
+
f0 = 80 - (area / 10000) * 30 # 50β80 Hz
|
| 32 |
+
f1 = 30 + (perimeter / 100) * 5 # 30β35 Hz
|
| 33 |
+
t = np.linspace(0, duration, n)
|
| 34 |
+
pitch = np.linspace(f0, f1, n)
|
| 35 |
+
kick = np.sin(2 * np.pi * pitch * t).astype(np.float32)
|
| 36 |
+
|
| 37 |
+
env = np.exp(-t * 20).astype(np.float32)
|
| 38 |
+
kick = kick * env
|
| 39 |
+
|
| 40 |
+
# click transient
|
| 41 |
+
click = np.zeros(n, dtype=np.float32)
|
| 42 |
+
click_len = min(int(sr * 0.003), n)
|
| 43 |
+
click[:click_len] = np.random.normal(0, 0.3, click_len)
|
| 44 |
+
click[:click_len] *= np.linspace(1, 0, click_len)
|
| 45 |
+
kick += click * 0.2
|
| 46 |
+
|
| 47 |
+
kick = np.tanh(kick * 1.0) / np.tanh(1.0)
|
| 48 |
+
return kick
|
| 49 |
+
|
| 50 |
+
def generate_snare(features: Dict[str, Any], sr: int, duration: float = 0.15) -> np.ndarray:
|
| 51 |
+
"""Generate snare. Output shape: (sr*duration,)."""
|
| 52 |
+
n = int(sr * duration)
|
| 53 |
+
if n <= 0:
|
| 54 |
+
return np.zeros(1)
|
| 55 |
|
| 56 |
+
t = np.linspace(0, duration, n)
|
| 57 |
|
| 58 |
+
# body
|
| 59 |
+
body_freq = 180.0
|
| 60 |
+
body = np.sin(2 * np.pi * body_freq * t).astype(np.float32)
|
| 61 |
+
body_env = np.exp(-t * 15).astype(np.float32)
|
| 62 |
+
body = body * body_env
|
|
|
|
| 63 |
|
| 64 |
+
# crack
|
| 65 |
+
noise = np.random.normal(0, 1, n).astype(np.float32)
|
| 66 |
+
# simple highβpass via convolution (very short kernel)
|
| 67 |
+
kernel = np.array([1, -1], dtype=np.float32)
|
| 68 |
+
noise = np.convolve(noise, kernel, mode='same')
|
| 69 |
+
crack_env = np.exp(-t * 30).astype(np.float32)
|
| 70 |
+
crack = noise * crack_env
|
| 71 |
+
|
| 72 |
+
snare = body * 0.5 + crack * 0.5
|
| 73 |
+
snare = snare * 0.8
|
| 74 |
+
|
| 75 |
+
# optional angle modulation
|
| 76 |
+
lines = features.get("lines")
|
| 77 |
+
if lines is not None and len(lines) > 0:
|
| 78 |
+
angles = []
|
| 79 |
+
for line in lines[:10]:
|
| 80 |
+
x1, y1, x2, y2 = line[0]
|
| 81 |
+
angles.append(math.degrees(math.atan2(y2 - y1, x2 - x1)) % 180)
|
| 82 |
+
if angles:
|
| 83 |
+
avg_angle = np.mean(angles)
|
| 84 |
+
detune = (avg_angle / 180) * 20
|
| 85 |
+
body2 = np.sin(2 * np.pi * (body_freq + detune) * t).astype(np.float32)
|
| 86 |
+
body2 = body2 * body_env
|
| 87 |
+
snare = body2 * 0.5 + crack * 0.5
|
| 88 |
+
|
| 89 |
+
return (snare * 0.8).astype(np.float32)
|
| 90 |
|
| 91 |
def generate_hihats(features: Dict[str, Any], sr: int, bpm: float, duration: float = 2.0) -> np.ndarray:
|
| 92 |
+
"""Generate hiβhats. Output shape: (sr*duration,)."""
|
| 93 |
+
n = int(sr * duration)
|
| 94 |
+
if n <= 0:
|
| 95 |
+
return np.zeros(1)
|
| 96 |
+
|
| 97 |
+
edge_density = features.get("edge_density", 0.02)
|
| 98 |
+
brightness = features.get("average_brightness", 0.5)
|
| 99 |
+
|
| 100 |
+
if edge_density < 0.03:
|
| 101 |
+
subdivision = 8
|
| 102 |
+
elif edge_density < 0.06:
|
| 103 |
+
subdivision = 16
|
| 104 |
+
else:
|
| 105 |
+
subdivision = 32
|
| 106 |
|
| 107 |
beats = duration * (bpm / 60)
|
| 108 |
n_ticks = int(beats * subdivision)
|
|
|
|
| 109 |
|
| 110 |
+
hihat = np.zeros(n, dtype=np.float32)
|
| 111 |
+
amp = 0.05 + brightness * 0.1
|
| 112 |
+
|
| 113 |
+
for i in range(n_ticks):
|
| 114 |
pos = int(i * sr * 60 / (bpm * subdivision))
|
| 115 |
+
if pos >= n:
|
| 116 |
+
break
|
| 117 |
+
if i % 4 == 0:
|
| 118 |
+
level = amp
|
| 119 |
+
elif i % 8 == 1:
|
| 120 |
+
level = amp * 0.7
|
| 121 |
+
else:
|
| 122 |
+
level = amp * 0.4
|
| 123 |
+
|
| 124 |
+
pulse_len = int(sr * 0.015)
|
| 125 |
+
end = min(pos + pulse_len, n)
|
| 126 |
+
noise = np.random.normal(0, level, pulse_len).astype(np.float32)
|
| 127 |
+
env = np.linspace(1, 0, pulse_len, dtype=np.float32)
|
| 128 |
+
hihat[pos:end] += noise * env
|
| 129 |
|
| 130 |
+
hihat = np.tanh(hihat * 0.7) / np.tanh(0.7)
|
| 131 |
+
return hihat
|
ldq_tempo_grid.py
CHANGED
|
@@ -1,38 +1,70 @@
|
|
| 1 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
import math
|
| 3 |
import numpy as np
|
| 4 |
-
from typing import List
|
| 5 |
|
| 6 |
class TempoGrid:
|
| 7 |
-
"""
|
| 8 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
self.bpm = bpm
|
| 10 |
self.subdivision = subdivision
|
| 11 |
self.swing = max(0.0, min(0.5, swing))
|
| 12 |
-
self.
|
| 13 |
-
|
|
|
|
| 14 |
def quantize(self, time: float) -> float:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
grid_pos = round(time / self.grid_duration)
|
| 16 |
-
|
| 17 |
-
if self.swing > 0 and
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
|
|
|
|
|
|
|
|
|
| 21 |
def quantize_many(self, times: List[float]) -> List[float]:
|
|
|
|
| 22 |
return [self.quantize(t) for t in times]
|
| 23 |
|
| 24 |
def grid_to_seconds(self, grid_pos: int) -> float:
|
|
|
|
| 25 |
return grid_pos * self.grid_duration
|
| 26 |
|
| 27 |
def generate_kick_pattern(self, density: float, duration: float) -> List[float]:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
num_beats = int(duration * (self.bpm / 60))
|
| 29 |
kicks = []
|
| 30 |
-
if density < 0.3:
|
| 31 |
-
step = 4
|
| 32 |
-
elif density < 0.6:
|
| 33 |
-
step = 2
|
| 34 |
-
else:
|
| 35 |
-
step = 1
|
|
|
|
| 36 |
for beat in range(0, num_beats, step):
|
| 37 |
-
|
|
|
|
| 38 |
return kicks
|
|
|
|
| 1 |
+
#!/usr/bin/env python3
|
| 2 |
+
"""
|
| 3 |
+
LDQ Tempo Grid Module
|
| 4 |
+
Quantizes events to a musical tempo grid for deterministic groove.
|
| 5 |
+
"""
|
| 6 |
+
|
| 7 |
import math
|
| 8 |
import numpy as np
|
| 9 |
+
from typing import List, Tuple, Optional
|
| 10 |
|
| 11 |
class TempoGrid:
|
| 12 |
+
"""
|
| 13 |
+
A deterministic tempo grid that snaps events to nearest beat subdivision.
|
| 14 |
+
All parameters are derived from the image via the Visual Genesis Hash.
|
| 15 |
+
"""
|
| 16 |
+
|
| 17 |
+
def __init__(self, bpm: int = 140, subdivision: int = 16, swing: float = 0.0):
|
| 18 |
+
"""
|
| 19 |
+
Args:
|
| 20 |
+
bpm: Beats per minute (e.g., 140)
|
| 21 |
+
subdivision: Number of grid points per beat (e.g., 16 = 16th notes)
|
| 22 |
+
swing: Swing amount (0.0 = straight, 0.33 = swing feel)
|
| 23 |
+
"""
|
| 24 |
self.bpm = bpm
|
| 25 |
self.subdivision = subdivision
|
| 26 |
self.swing = max(0.0, min(0.5, swing))
|
| 27 |
+
self.beat_duration = 60.0 / bpm
|
| 28 |
+
self.grid_duration = self.beat_duration / subdivision
|
| 29 |
+
|
| 30 |
def quantize(self, time: float) -> float:
|
| 31 |
+
"""
|
| 32 |
+
Snap a time value to the nearest grid point.
|
| 33 |
+
If swing is enabled, alternating 16th notes get shifted.
|
| 34 |
+
"""
|
| 35 |
+
# Calculate raw grid position
|
| 36 |
grid_pos = round(time / self.grid_duration)
|
| 37 |
+
# Apply swing: for every other 16th note, shift by swing amount
|
| 38 |
+
if self.swing > 0 and self.subdivision >= 8:
|
| 39 |
+
# Detect if this is a "swing" position (e.g., every other 16th note)
|
| 40 |
+
if grid_pos % 2 == 1: # Odd 16th notes
|
| 41 |
+
shift = self.grid_duration * self.swing
|
| 42 |
+
return (grid_pos * self.grid_duration) + shift
|
| 43 |
+
return grid_pos * self.grid_duration
|
| 44 |
+
|
| 45 |
def quantize_many(self, times: List[float]) -> List[float]:
|
| 46 |
+
"""Quantize a list of times."""
|
| 47 |
return [self.quantize(t) for t in times]
|
| 48 |
|
| 49 |
def grid_to_seconds(self, grid_pos: int) -> float:
|
| 50 |
+
"""Convert a grid position to absolute seconds."""
|
| 51 |
return grid_pos * self.grid_duration
|
| 52 |
|
| 53 |
def generate_kick_pattern(self, density: float, duration: float) -> List[float]:
|
| 54 |
+
"""
|
| 55 |
+
Generate kick hit times based on density (0-1).
|
| 56 |
+
Used when no explicit kick events exist.
|
| 57 |
+
"""
|
| 58 |
num_beats = int(duration * (self.bpm / 60))
|
| 59 |
kicks = []
|
| 60 |
+
if density < 0.3: # Sparse
|
| 61 |
+
step = 4 # quarter notes
|
| 62 |
+
elif density < 0.6: # Medium
|
| 63 |
+
step = 2 # eighth notes
|
| 64 |
+
else: # Dense
|
| 65 |
+
step = 1 # quarter notes
|
| 66 |
+
|
| 67 |
for beat in range(0, num_beats, step):
|
| 68 |
+
time = beat * self.beat_duration
|
| 69 |
+
kicks.append(time)
|
| 70 |
return kicks
|
lygo_ethical_guardian.py
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""HF Space β isolated P0βP5 ethical guardian (uses bundled protocol_stack/)."""
|
| 2 |
+
|
| 3 |
+
from __future__ import annotations
|
| 4 |
+
|
| 5 |
+
import json
|
| 6 |
+
import sys
|
| 7 |
+
from pathlib import Path
|
| 8 |
+
|
| 9 |
+
_BUNDLE = Path(__file__).resolve().parent / "protocol_stack"
|
| 10 |
+
_STACK = _BUNDLE / "stack"
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
def _bootstrap() -> None:
|
| 14 |
+
if not _STACK.is_dir():
|
| 15 |
+
raise FileNotFoundError(
|
| 16 |
+
"protocol_stack/ missing. Maintainer: python ../lygo-protocol-stack/tools/bundle_hf_space_stack.py"
|
| 17 |
+
)
|
| 18 |
+
for sub in (
|
| 19 |
+
"stack",
|
| 20 |
+
"protocol0_nano_kernel/src/python",
|
| 21 |
+
"protocol1_memory_mycelium/src/python",
|
| 22 |
+
"protocol2_cognitive_bridge/src/python",
|
| 23 |
+
"protocol3_vortex_consensus/src/python",
|
| 24 |
+
"protocol4_ascension_engine/src/python",
|
| 25 |
+
"protocol5_harmony_node/src/python",
|
| 26 |
+
):
|
| 27 |
+
p = _BUNDLE / sub
|
| 28 |
+
if p.is_dir() and str(p) not in sys.path:
|
| 29 |
+
sys.path.insert(0, str(p))
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
def run_query(query: str) -> str:
|
| 33 |
+
_bootstrap()
|
| 34 |
+
from lygo_stack import deploy_stack # noqa: E402
|
| 35 |
+
|
| 36 |
+
stack = deploy_stack("HF_ETHICAL_GUARDIAN")
|
| 37 |
+
report = stack.process_ethical_query(query.strip(), purpose="hf_space_pilot")
|
| 38 |
+
p0 = report.get("p0") or {}
|
| 39 |
+
p2 = report.get("p2") or {}
|
| 40 |
+
p3 = report.get("p3") or {}
|
| 41 |
+
lines = [
|
| 42 |
+
"LYGO Ethical Guardian β live P0βP5",
|
| 43 |
+
f"Resonance: {report.get('resonance_signature', 'Ξ9Ξ¦963-SOVEREIGN-INTEGRITY')}",
|
| 44 |
+
f"P0 verdict: {p0.get('verdict')} | phi_risk: {p0.get('phi_risk', p0.get('risk'))}",
|
| 45 |
+
f"P2 ethical_vector: {p2.get('ethical_vector')}",
|
| 46 |
+
f"P3 consensus: {p3.get('consensus_found')} | center: {p3.get('harmonic_center', p3.get('consensus', 'n/a'))}",
|
| 47 |
+
f"P5 light_code: {report.get('light_code')}",
|
| 48 |
+
f"Ethical mass: {report.get('ethical_mass')}",
|
| 49 |
+
"",
|
| 50 |
+
"JSON:",
|
| 51 |
+
json.dumps(
|
| 52 |
+
{
|
| 53 |
+
"p0_verdict": p0.get("verdict"),
|
| 54 |
+
"phi_risk": p0.get("phi_risk", p0.get("risk")),
|
| 55 |
+
"ethical_mass": report.get("ethical_mass"),
|
| 56 |
+
"light_code": report.get("light_code"),
|
| 57 |
+
"stack_version": report.get("stack_version"),
|
| 58 |
+
},
|
| 59 |
+
indent=2,
|
| 60 |
+
),
|
| 61 |
+
"",
|
| 62 |
+
"GitHub: https://github.com/DeepSeekOracle/lygo-protocol-stack",
|
| 63 |
+
"ClawHub: npx clawhub@latest install deepseekoracle/lygo-protocol-stack-operator",
|
| 64 |
+
]
|
| 65 |
+
return "\n".join(lines)
|
memory.md
CHANGED
|
@@ -27,6 +27,11 @@
|
|
| 27 |
- 3-Brain / Memory: All integrated (profiles grown, skills documented).
|
| 28 |
- All as 'one home': Updates to skills or space are aligned. Manage via local edits + git/hf push.
|
| 29 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
**Current State (as of this memory)**:
|
| 31 |
- HF Space updated with integration of the 3 creative skills.
|
| 32 |
- Git push completed for live sync (local mirror committed with all files including creative scripts and enhanced app.py).
|
|
@@ -40,7 +45,36 @@ Location: `I:\E Drive\LYGO Data Quantization (LDQ) Protoc.txt` (linked in all sy
|
|
| 40 |
**Rebuild Plan (ground-up design + phased implementation)**: Complete mapped plan per user request β scan of all HF mirror files + clean skill bases + LDQ txt + test results, root causes, target modular architecture ("fresh Gradio + our modules on top", factory first for nice music, LDQ/creative as opt-in pluggable layers), 6 phases with gates, army + Nvidia key usage, risks, immediate actions. Saved as dedicated file and referenced everywhere.
|
| 41 |
Location: `Hugging face/LYGO_HF_REBUILD_PLAN.md` (this is the authoritative design doc for the current ground-up rebuild of the HF space as one integrated unit with GitHub site + skills + army + 3-Brain).
|
| 42 |
|
| 43 |
-
**2026-06-13 BENCHMARK SUCCESS +
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
- User confirmed: Standard Beat Tools with photo upload now creates "Normal sounding beat.... PERFECT... THIS IS PERFECT THIS IS THE BENCH".
|
| 45 |
- Logged in code with clear "β
BENCHMARK: Standard Beat Tools (PURE GRADIO FACTORY) working correctly."
|
| 46 |
- Global settings now fully wired for Standard (style changes flavor, seed for repro, filter_hz controls cutoff, bpm, prompt_text for text-to-beats modulation, stems/midi exports implemented, batch supported).
|
|
|
|
| 27 |
- 3-Brain / Memory: All integrated (profiles grown, skills documented).
|
| 28 |
- All as 'one home': Updates to skills or space are aligned. Manage via local edits + git/hf push.
|
| 29 |
|
| 30 |
+
**BENCHMARK / Standard Beat Tools fix (2026-06-30)**:
|
| 31 |
+
- Root cause of `'float' object has no attribute 'write'`: melody loop used `sf = ...` for stab frequency, shadowing `import soundfile as sf`; `sf.write()` then failed.
|
| 32 |
+
- Fix: renamed to `mel_hz` / `stab_wave`; removed duplicate `standard_beat_tools_generate` and ~250 lines of dead Standard code; single inline `_gen_beats` bench path only.
|
| 33 |
+
- Standard remains pure numpy/scipy/soundfile β no LYGO/ResonanceEngine on default tab.
|
| 34 |
+
|
| 35 |
**Current State (as of this memory)**:
|
| 36 |
- HF Space updated with integration of the 3 creative skills.
|
| 37 |
- Git push completed for live sync (local mirror committed with all files including creative scripts and enhanced app.py).
|
|
|
|
| 45 |
**Rebuild Plan (ground-up design + phased implementation)**: Complete mapped plan per user request β scan of all HF mirror files + clean skill bases + LDQ txt + test results, root causes, target modular architecture ("fresh Gradio + our modules on top", factory first for nice music, LDQ/creative as opt-in pluggable layers), 6 phases with gates, army + Nvidia key usage, risks, immediate actions. Saved as dedicated file and referenced everywhere.
|
| 46 |
Location: `Hugging face/LYGO_HF_REBUILD_PLAN.md` (this is the authoritative design doc for the current ground-up rebuild of the HF space as one integrated unit with GitHub site + skills + army + 3-Brain).
|
| 47 |
|
| 48 |
+
**2026-06-13 BENCHMARK SUCCESS + FIX (Standard Beat Tools working bench + 'float' no 'write' error resolved):**
|
| 49 |
+
- Fixed the recurring "'float' object has no attribute 'write'" error in Standard Beat Tools.
|
| 50 |
+
- Changes in the top-level standard_beat_tools_generate:
|
| 51 |
+
- image_path = str(...) forced early to ensure type is str for Path and f-string.
|
| 52 |
+
- out_path = f"standard_..." set immediately after seed, before any array work or potential variable rebinding.
|
| 53 |
+
- Removed any late duplicate out_path = line.
|
| 54 |
+
- Added after audio = kick + ... : audio = np.asarray(audio, dtype=np.float32); if ndim==0: audio = np.zeros(n, dtype=np.float32) to guarantee never scalar float for downstream.
|
| 55 |
+
- This ensures sf.write always gets str for the file arg (out_path or sp), and data is always proper array.
|
| 56 |
+
- The pure Gradio factory remains isolated, text prompt (text-to-audio) works via prompt_text param, globals wired, batch/stems/midi supported.
|
| 57 |
+
- Space restarted with the fix.
|
| 58 |
+
- The benchmark "normal sounding beat" should now run without the float.write error.
|
| 59 |
+
- Fixed the reported error "'float' object has no attribute 'write'" (and previous free variable 'out_path' scoping error).
|
| 60 |
+
- Root cause: leftover old nested `_generate_standard_beats` def inside the Standard if block (with variable name typos like using undefined `audio_stereo` in sf.write, and closure issues with out_path in batch paths).
|
| 61 |
+
- Resolution: Replaced the entire Standard Beat Tools implementation body with a clean, short call to the top-level `standard_beat_tools_generate` helper (self-contained function at module level, no nesting, no free variables).
|
| 62 |
+
- The helper correctly does sf.write(out_path, stereo, sr) and sp for stems (strings).
|
| 63 |
+
- Text prompt box (text-to-audio) is correctly passed and used for modulation in the pure Gradio synth.
|
| 64 |
+
- All linking of globals (style, seed, filter_hz, bpm, exports, batch) works.
|
| 65 |
+
- Webcam support on image input.
|
| 66 |
+
- The "says it needs LYGO engine" was likely from the engine_choice radio label (which says "LYGO Protocol only") or when engine_choice was set to Profile while in Standard mode -- the code for Standard branch ignores engine_choice and always runs the pure beats generator.
|
| 67 |
+
- Deployed and space restarted.
|
| 68 |
+
- This keeps the Standard tab as a clean generic Gradio factory (as per "get generic install templates from the internet" + ClawHub skill patterns for batch).
|
| 69 |
+
- The bench (normal sounding beats) is preserved.
|
| 70 |
+
- User confirmed Standard produces normal sounding beats - this is the bench.
|
| 71 |
+
- Fixed "cannot access free variable 'out_path'" scoping error (caused by nested def + closure in previous version). Now uses clean top-level `standard_beat_tools_generate` helper (self-contained, no enclosing scope issues).
|
| 72 |
+
- Text prompt (text-to-audio) is properly linked and passed to the pure Gradio factory synth. It modulates the beats (fast/heavy/dark etc.).
|
| 73 |
+
- All globals are wired: style, seed, filter_hz, bpm, prompt, exports, batch.
|
| 74 |
+
- Webcam enabled.
|
| 75 |
+
- The UI prompt box is in Global Settings. For Standard mode, engine_choice is ignored (it says "LYGO only" in label). Prompt works directly for text-to-beats in the default factory.
|
| 76 |
+
- Code is based on generic Gradio Blocks + Audio generation templates from the internet (official docs/examples) + batch patterns from ClawHub lygo-resonance skill.
|
| 77 |
+
- LYGO side untouched.
|
| 78 |
- User confirmed: Standard Beat Tools with photo upload now creates "Normal sounding beat.... PERFECT... THIS IS PERFECT THIS IS THE BENCH".
|
| 79 |
- Logged in code with clear "β
BENCHMARK: Standard Beat Tools (PURE GRADIO FACTORY) working correctly."
|
| 80 |
- Global settings now fully wired for Standard (style changes flavor, seed for repro, filter_hz controls cutoff, bpm, prompt_text for text-to-beats modulation, stems/midi exports implemented, batch supported).
|
protocol_stack/BUNDLE_VERSION.txt
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
Ξ9Ξ¦963-HF-STACK-BUNDLE-v1
|
protocol_stack/protocol0_nano_kernel/fixtures/P0_VECTOR_MANIFEST.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# P0 vector manifest (42) β for @grok review
|
| 2 |
+
|
| 3 |
+
Regenerate: `python tools/build_p0_vectors.py`
|
| 4 |
+
|
| 5 |
+
| Category | IDs (count) |
|
| 6 |
+
|----------|-------------|
|
| 7 |
+
| canonical | `json_minimal`, `null_1k`, `pattern_3byte`, `seq_0_199`, `oversize_9000` (5) |
|
| 8 |
+
| boundary | `zeros_0` β¦ `zeros_8192`, `at_max_bytes` (13) |
|
| 9 |
+
| recursive | `repeat_a_320`, `repeat_aaaa_800`, `repeat_deadbeef`, `nested_json` (4) |
|
| 10 |
+
| adversarial | `all_ff_512`, `alternating_512`, `utf8_delta9`, `mono_*_96` Γ5 (8) |
|
| 11 |
+
| high_entropy | `hash_entropy_0`β¦`5`, `seq_0_255`, `seq_128_255`, `seq_128_255_x4` (9) |
|
| 12 |
+
| structured | `bmp_like`, `pe_like`, `xml_snippet` (3) |
|
| 13 |
+
|
| 14 |
+
**Golden SHA-256** (canonical lines, Python β‘ Rust):
|
| 15 |
+
|
| 16 |
+
`7e8d18fda979cbefec14c3fc86f43f2a020b494b6052acccb6f865f2b4fae1d3`
|
| 17 |
+
|
| 18 |
+
**Demo one-liner:**
|
| 19 |
+
|
| 20 |
+
```bash
|
| 21 |
+
python tools/run_p0_demo.py --id json_minimal
|
| 22 |
+
```
|
protocol_stack/protocol0_nano_kernel/fixtures/p0_canonical.sha256
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
7e8d18fda979cbefec14c3fc86f43f2a020b494b6052acccb6f865f2b4fae1d3
|
protocol_stack/protocol0_nano_kernel/fixtures/p0_vectors.json
ADDED
|
@@ -0,0 +1,392 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"version": "P0.4",
|
| 3 |
+
"count": 42,
|
| 4 |
+
"categories": [
|
| 5 |
+
"adversarial",
|
| 6 |
+
"boundary",
|
| 7 |
+
"canonical",
|
| 8 |
+
"high_entropy",
|
| 9 |
+
"recursive",
|
| 10 |
+
"structured"
|
| 11 |
+
],
|
| 12 |
+
"vectors": [
|
| 13 |
+
{
|
| 14 |
+
"id": "json_minimal",
|
| 15 |
+
"category": "canonical",
|
| 16 |
+
"description": "Minimal JSON object",
|
| 17 |
+
"hex": "7b2261223a312c2262223a327d",
|
| 18 |
+
"len": 13,
|
| 19 |
+
"expected_verdict": "AMPLIFY",
|
| 20 |
+
"expected_phi_risk": 0.0
|
| 21 |
+
},
|
| 22 |
+
{
|
| 23 |
+
"id": "null_1k",
|
| 24 |
+
"category": "canonical",
|
| 25 |
+
"description": "1 KiB zero padding",
|
| 26 |
+
"hex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
| 27 |
+
"len": 1000,
|
| 28 |
+
"expected_verdict": "SOFTEN",
|
| 29 |
+
"expected_phi_risk": 0.2427
|
| 30 |
+
},
|
| 31 |
+
{
|
| 32 |
+
"id": "pattern_3byte",
|
| 33 |
+
"category": "canonical",
|
| 34 |
+
"description": "Repeating 3-byte pattern",
|
| 35 |
+
"hex": "010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203",
|
| 36 |
+
"len": 3000,
|
| 37 |
+
"expected_verdict": "SOFTEN",
|
| 38 |
+
"expected_phi_risk": 0.6472
|
| 39 |
+
},
|
| 40 |
+
{
|
| 41 |
+
"id": "seq_0_199",
|
| 42 |
+
"category": "canonical",
|
| 43 |
+
"description": "Byte sequence 0..199",
|
| 44 |
+
"hex": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7",
|
| 45 |
+
"len": 200,
|
| 46 |
+
"expected_verdict": "SOFTEN",
|
| 47 |
+
"expected_phi_risk": 0.8899
|
| 48 |
+
},
|
| 49 |
+
{
|
| 50 |
+
"id": "oversize_9000",
|
| 51 |
+
"category": "canonical",
|
| 52 |
+
"description": "Over MAX_BYTES",
|
| 53 |
+
"hex": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
| 54 |
+
"len": 9000,
|
| 55 |
+
"expected_verdict": "QUARANTINE",
|
| 56 |
+
"expected_phi_risk": 1.618
|
| 57 |
+
},
|
| 58 |
+
{
|
| 59 |
+
"id": "zeros_0",
|
| 60 |
+
"category": "boundary",
|
| 61 |
+
"description": "All zeros length 0",
|
| 62 |
+
"hex": "",
|
| 63 |
+
"len": 0,
|
| 64 |
+
"expected_verdict": "SOFTEN",
|
| 65 |
+
"expected_phi_risk": 0.0
|
| 66 |
+
},
|
| 67 |
+
{
|
| 68 |
+
"id": "zeros_1",
|
| 69 |
+
"category": "boundary",
|
| 70 |
+
"description": "All zeros length 1",
|
| 71 |
+
"hex": "00",
|
| 72 |
+
"len": 1,
|
| 73 |
+
"expected_verdict": "SOFTEN",
|
| 74 |
+
"expected_phi_risk": 0.0019
|
| 75 |
+
},
|
| 76 |
+
{
|
| 77 |
+
"id": "zeros_16",
|
| 78 |
+
"category": "boundary",
|
| 79 |
+
"description": "All zeros length 16",
|
| 80 |
+
"hex": "00000000000000000000000000000000",
|
| 81 |
+
"len": 16,
|
| 82 |
+
"expected_verdict": "SOFTEN",
|
| 83 |
+
"expected_phi_risk": 0.0303
|
| 84 |
+
},
|
| 85 |
+
{
|
| 86 |
+
"id": "zeros_63",
|
| 87 |
+
"category": "boundary",
|
| 88 |
+
"description": "All zeros length 63",
|
| 89 |
+
"hex": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
| 90 |
+
"len": 63,
|
| 91 |
+
"expected_verdict": "SOFTEN",
|
| 92 |
+
"expected_phi_risk": 0.1195
|
| 93 |
+
},
|
| 94 |
+
{
|
| 95 |
+
"id": "zeros_64",
|
| 96 |
+
"category": "boundary",
|
| 97 |
+
"description": "All zeros length 64",
|
| 98 |
+
"hex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
| 99 |
+
"len": 64,
|
| 100 |
+
"expected_verdict": "SOFTEN",
|
| 101 |
+
"expected_phi_risk": 0.1214
|
| 102 |
+
},
|
| 103 |
+
{
|
| 104 |
+
"id": "zeros_127",
|
| 105 |
+
"category": "boundary",
|
| 106 |
+
"description": "All zeros length 127",
|
| 107 |
+
"hex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
| 108 |
+
"len": 127,
|
| 109 |
+
"expected_verdict": "SOFTEN",
|
| 110 |
+
"expected_phi_risk": 0.2408
|
| 111 |
+
},
|
| 112 |
+
{
|
| 113 |
+
"id": "zeros_128",
|
| 114 |
+
"category": "boundary",
|
| 115 |
+
"description": "All zeros length 128",
|
| 116 |
+
"hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
| 117 |
+
"len": 128,
|
| 118 |
+
"expected_verdict": "SOFTEN",
|
| 119 |
+
"expected_phi_risk": 0.2427
|
| 120 |
+
},
|
| 121 |
+
{
|
| 122 |
+
"id": "zeros_256",
|
| 123 |
+
"category": "boundary",
|
| 124 |
+
"description": "All zeros length 256",
|
| 125 |
+
"hex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
| 126 |
+
"len": 256,
|
| 127 |
+
"expected_verdict": "SOFTEN",
|
| 128 |
+
"expected_phi_risk": 0.2427
|
| 129 |
+
},
|
| 130 |
+
{
|
| 131 |
+
"id": "zeros_512",
|
| 132 |
+
"category": "boundary",
|
| 133 |
+
"description": "All zeros length 512",
|
| 134 |
+
"hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
| 135 |
+
"len": 512,
|
| 136 |
+
"expected_verdict": "SOFTEN",
|
| 137 |
+
"expected_phi_risk": 0.2427
|
| 138 |
+
},
|
| 139 |
+
{
|
| 140 |
+
"id": "zeros_1024",
|
| 141 |
+
"category": "boundary",
|
| 142 |
+
"description": "All zeros length 1024",
|
| 143 |
+
"hex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
| 144 |
+
"len": 1024,
|
| 145 |
+
"expected_verdict": "SOFTEN",
|
| 146 |
+
"expected_phi_risk": 0.2427
|
| 147 |
+
},
|
| 148 |
+
{
|
| 149 |
+
"id": "zeros_4096",
|
| 150 |
+
"category": "boundary",
|
| 151 |
+
"description": "All zeros length 4096",
|
| 152 |
+
"hex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
| 153 |
+
"len": 4096,
|
| 154 |
+
"expected_verdict": "SOFTEN",
|
| 155 |
+
"expected_phi_risk": 0.2427
|
| 156 |
+
},
|
| 157 |
+
{
|
| 158 |
+
"id": "zeros_8192",
|
| 159 |
+
"category": "boundary",
|
| 160 |
+
"description": "All zeros length 8192",
|
| 161 |
+
"hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
| 162 |
+
"len": 8192,
|
| 163 |
+
"expected_verdict": "SOFTEN",
|
| 164 |
+
"expected_phi_risk": 0.2427
|
| 165 |
+
},
|
| 166 |
+
{
|
| 167 |
+
"id": "at_max_bytes",
|
| 168 |
+
"category": "boundary",
|
| 169 |
+
"description": "Exactly MAX_BYTES",
|
| 170 |
+
"hex": "5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555",
|
| 171 |
+
"len": 8192,
|
| 172 |
+
"expected_verdict": "SOFTEN",
|
| 173 |
+
"expected_phi_risk": 0.2427
|
| 174 |
+
},
|
| 175 |
+
{
|
| 176 |
+
"id": "repeat_a_320",
|
| 177 |
+
"category": "recursive",
|
| 178 |
+
"description": "Single-byte repeat (text)",
|
| 179 |
+
"hex": "6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161",
|
| 180 |
+
"len": 320,
|
| 181 |
+
"expected_verdict": "SOFTEN",
|
| 182 |
+
"expected_phi_risk": 0.2427
|
| 183 |
+
},
|
| 184 |
+
{
|
| 185 |
+
"id": "repeat_aaaa_800",
|
| 186 |
+
"category": "recursive",
|
| 187 |
+
"description": "4-byte window repeat",
|
| 188 |
+
"hex": "6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161",
|
| 189 |
+
"len": 800,
|
| 190 |
+
"expected_verdict": "SOFTEN",
|
| 191 |
+
"expected_phi_risk": 0.2427
|
| 192 |
+
},
|
| 193 |
+
{
|
| 194 |
+
"id": "repeat_deadbeef",
|
| 195 |
+
"category": "recursive",
|
| 196 |
+
"description": "DEADBEEF pattern",
|
| 197 |
+
"hex": "deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef",
|
| 198 |
+
"len": 480,
|
| 199 |
+
"expected_verdict": "SOFTEN",
|
| 200 |
+
"expected_phi_risk": 0.2427
|
| 201 |
+
},
|
| 202 |
+
{
|
| 203 |
+
"id": "nested_json",
|
| 204 |
+
"category": "recursive",
|
| 205 |
+
"description": "Nested JSON multiplied",
|
| 206 |
+
"hex": "7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d",
|
| 207 |
+
"len": 520,
|
| 208 |
+
"expected_verdict": "AMPLIFY",
|
| 209 |
+
"expected_phi_risk": 0.4045
|
| 210 |
+
},
|
| 211 |
+
{
|
| 212 |
+
"id": "all_ff_512",
|
| 213 |
+
"category": "adversarial",
|
| 214 |
+
"description": "Saturated 0xFF",
|
| 215 |
+
"hex": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
|
| 216 |
+
"len": 512,
|
| 217 |
+
"expected_verdict": "SOFTEN",
|
| 218 |
+
"expected_phi_risk": 0.2427
|
| 219 |
+
},
|
| 220 |
+
{
|
| 221 |
+
"id": "alternating_512",
|
| 222 |
+
"category": "adversarial",
|
| 223 |
+
"description": "0x00/0xFF alternation",
|
| 224 |
+
"hex": "00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff",
|
| 225 |
+
"len": 512,
|
| 226 |
+
"expected_verdict": "SOFTEN",
|
| 227 |
+
"expected_phi_risk": 0.2427
|
| 228 |
+
},
|
| 229 |
+
{
|
| 230 |
+
"id": "utf8_delta9",
|
| 231 |
+
"category": "adversarial",
|
| 232 |
+
"description": "UTF-8 mixed scripts",
|
| 233 |
+
"hex": "ce9439cea63936332d4c59474f2de38386e382b9e38388",
|
| 234 |
+
"len": 23,
|
| 235 |
+
"expected_verdict": "AMPLIFY",
|
| 236 |
+
"expected_phi_risk": 0.0
|
| 237 |
+
},
|
| 238 |
+
{
|
| 239 |
+
"id": "hash_entropy_0",
|
| 240 |
+
"category": "high_entropy",
|
| 241 |
+
"description": "SHA-derived high entropy #0",
|
| 242 |
+
"hex": "e326eedfe4f3d1f087a05a3e0affebfad6bfbf7499b8f7a99cb6e30b4a236196e326eedfe4f3d1f087a05a3e0affebfad6bfbf7499b8f7a99cb6e30b4a236196e326eedfe4f3d1f087a05a3e0affebfad6bfbf7499b8f7a99cb6e30b4a236196e326eedfe4f3d1f087a05a3e0affebfad6bfbf7499b8f7a99cb6e30b4a236196e326eedfe4f3d1f087a05a3e0affebfad6bfbf7499b8f7a99cb6e30b4a236196",
|
| 243 |
+
"len": 160,
|
| 244 |
+
"expected_verdict": "AMPLIFY",
|
| 245 |
+
"expected_phi_risk": 0.4045
|
| 246 |
+
},
|
| 247 |
+
{
|
| 248 |
+
"id": "hash_entropy_1",
|
| 249 |
+
"category": "high_entropy",
|
| 250 |
+
"description": "SHA-derived high entropy #1",
|
| 251 |
+
"hex": "1cb6fd62d34a28a59e3f6241aab9c5e8a8e666c976dd9fe3f8e41a955f89e2781cb6fd62d34a28a59e3f6241aab9c5e8a8e666c976dd9fe3f8e41a955f89e2781cb6fd62d34a28a59e3f6241aab9c5e8a8e666c976dd9fe3f8e41a955f89e2781cb6fd62d34a28a59e3f6241aab9c5e8a8e666c976dd9fe3f8e41a955f89e2781cb6fd62d34a28a59e3f6241aab9c5e8a8e666c976dd9fe3f8e41a955f89e278",
|
| 252 |
+
"len": 160,
|
| 253 |
+
"expected_verdict": "AMPLIFY",
|
| 254 |
+
"expected_phi_risk": 0.4045
|
| 255 |
+
},
|
| 256 |
+
{
|
| 257 |
+
"id": "hash_entropy_2",
|
| 258 |
+
"category": "high_entropy",
|
| 259 |
+
"description": "SHA-derived high entropy #2",
|
| 260 |
+
"hex": "238fa35ffbba234a5f3ff788f8c9771aaf478cdf0fcc268d5f2ad4abd3edd074238fa35ffbba234a5f3ff788f8c9771aaf478cdf0fcc268d5f2ad4abd3edd074238fa35ffbba234a5f3ff788f8c9771aaf478cdf0fcc268d5f2ad4abd3edd074238fa35ffbba234a5f3ff788f8c9771aaf478cdf0fcc268d5f2ad4abd3edd074238fa35ffbba234a5f3ff788f8c9771aaf478cdf0fcc268d5f2ad4abd3edd074",
|
| 261 |
+
"len": 160,
|
| 262 |
+
"expected_verdict": "AMPLIFY",
|
| 263 |
+
"expected_phi_risk": 0.4045
|
| 264 |
+
},
|
| 265 |
+
{
|
| 266 |
+
"id": "hash_entropy_3",
|
| 267 |
+
"category": "high_entropy",
|
| 268 |
+
"description": "SHA-derived high entropy #3",
|
| 269 |
+
"hex": "ee4545af8e15767ecbd4b91d8c7f288c71d70fceb02a66bc552786000666dfe6ee4545af8e15767ecbd4b91d8c7f288c71d70fceb02a66bc552786000666dfe6ee4545af8e15767ecbd4b91d8c7f288c71d70fceb02a66bc552786000666dfe6ee4545af8e15767ecbd4b91d8c7f288c71d70fceb02a66bc552786000666dfe6ee4545af8e15767ecbd4b91d8c7f288c71d70fceb02a66bc552786000666dfe6",
|
| 270 |
+
"len": 160,
|
| 271 |
+
"expected_verdict": "AMPLIFY",
|
| 272 |
+
"expected_phi_risk": 0.4045
|
| 273 |
+
},
|
| 274 |
+
{
|
| 275 |
+
"id": "hash_entropy_4",
|
| 276 |
+
"category": "high_entropy",
|
| 277 |
+
"description": "SHA-derived high entropy #4",
|
| 278 |
+
"hex": "ae4696f8e94ce0b248934475228fdb2f5913f6a241ee1fa310fc788a1d74874bae4696f8e94ce0b248934475228fdb2f5913f6a241ee1fa310fc788a1d74874bae4696f8e94ce0b248934475228fdb2f5913f6a241ee1fa310fc788a1d74874bae4696f8e94ce0b248934475228fdb2f5913f6a241ee1fa310fc788a1d74874bae4696f8e94ce0b248934475228fdb2f5913f6a241ee1fa310fc788a1d74874b",
|
| 279 |
+
"len": 160,
|
| 280 |
+
"expected_verdict": "AMPLIFY",
|
| 281 |
+
"expected_phi_risk": 0.4045
|
| 282 |
+
},
|
| 283 |
+
{
|
| 284 |
+
"id": "hash_entropy_5",
|
| 285 |
+
"category": "high_entropy",
|
| 286 |
+
"description": "SHA-derived high entropy #5",
|
| 287 |
+
"hex": "beda20f04d50de1171c5d9d182791734385b34e766bf833435a204a6e18e8785beda20f04d50de1171c5d9d182791734385b34e766bf833435a204a6e18e8785beda20f04d50de1171c5d9d182791734385b34e766bf833435a204a6e18e8785beda20f04d50de1171c5d9d182791734385b34e766bf833435a204a6e18e8785beda20f04d50de1171c5d9d182791734385b34e766bf833435a204a6e18e8785",
|
| 288 |
+
"len": 160,
|
| 289 |
+
"expected_verdict": "AMPLIFY",
|
| 290 |
+
"expected_phi_risk": 0.4045
|
| 291 |
+
},
|
| 292 |
+
{
|
| 293 |
+
"id": "mono_nul_96",
|
| 294 |
+
"category": "adversarial",
|
| 295 |
+
"description": "Monobyte 0x00 \u00d7 96",
|
| 296 |
+
"hex": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
| 297 |
+
"len": 96,
|
| 298 |
+
"expected_verdict": "SOFTEN",
|
| 299 |
+
"expected_phi_risk": 0.182
|
| 300 |
+
},
|
| 301 |
+
{
|
| 302 |
+
"id": "mono_soh_96",
|
| 303 |
+
"category": "adversarial",
|
| 304 |
+
"description": "Monobyte 0x01 \u00d7 96",
|
| 305 |
+
"hex": "010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101",
|
| 306 |
+
"len": 96,
|
| 307 |
+
"expected_verdict": "SOFTEN",
|
| 308 |
+
"expected_phi_risk": 0.182
|
| 309 |
+
},
|
| 310 |
+
{
|
| 311 |
+
"id": "mono_del_96",
|
| 312 |
+
"category": "adversarial",
|
| 313 |
+
"description": "Monobyte 0x7f \u00d7 96",
|
| 314 |
+
"hex": "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f",
|
| 315 |
+
"len": 96,
|
| 316 |
+
"expected_verdict": "SOFTEN",
|
| 317 |
+
"expected_phi_risk": 0.182
|
| 318 |
+
},
|
| 319 |
+
{
|
| 320 |
+
"id": "mono_high_96",
|
| 321 |
+
"category": "adversarial",
|
| 322 |
+
"description": "Monobyte 0x80 \u00d7 96",
|
| 323 |
+
"hex": "808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080",
|
| 324 |
+
"len": 96,
|
| 325 |
+
"expected_verdict": "SOFTEN",
|
| 326 |
+
"expected_phi_risk": 0.182
|
| 327 |
+
},
|
| 328 |
+
{
|
| 329 |
+
"id": "mono_ff_96",
|
| 330 |
+
"category": "adversarial",
|
| 331 |
+
"description": "Monobyte 0xff \u00d7 96",
|
| 332 |
+
"hex": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
|
| 333 |
+
"len": 96,
|
| 334 |
+
"expected_verdict": "SOFTEN",
|
| 335 |
+
"expected_phi_risk": 0.182
|
| 336 |
+
},
|
| 337 |
+
{
|
| 338 |
+
"id": "bmp_like",
|
| 339 |
+
"category": "structured",
|
| 340 |
+
"description": "BMP-ish header + padding",
|
| 341 |
+
"hex": "424d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
| 342 |
+
"len": 128,
|
| 343 |
+
"expected_verdict": "SOFTEN",
|
| 344 |
+
"expected_phi_risk": 0.2427
|
| 345 |
+
},
|
| 346 |
+
{
|
| 347 |
+
"id": "pe_like",
|
| 348 |
+
"category": "structured",
|
| 349 |
+
"description": "PE-ish stub",
|
| 350 |
+
"hex": "4d5a9090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090",
|
| 351 |
+
"len": 202,
|
| 352 |
+
"expected_verdict": "SOFTEN",
|
| 353 |
+
"expected_phi_risk": 0.2427
|
| 354 |
+
},
|
| 355 |
+
{
|
| 356 |
+
"id": "xml_snippet",
|
| 357 |
+
"category": "structured",
|
| 358 |
+
"description": "XML repetition",
|
| 359 |
+
"hex": "3c726f6f743e3c613e313c2f613e3c623e323c2f623e3c2f726f6f743e3c726f6f743e3c613e313c2f613e3c623e323c2f623e3c2f726f6f743e3c726f6f743e3c613e313c2f613e3c623e323c2f623e3c2f726f6f743e3c726f6f743e3c613e313c2f613e3c623e323c2f623e3c2f726f6f743e3c726f6f743e3c613e313c2f613e3c623e323c2f623e3c2f726f6f743e3c726f6f743e3c613e313c2f613e3c623e323c2f623e3c2f726f6f743e3c726f6f743e3c613e313c2f613e3c623e323c2f623e3c2f726f6f743e3c726f6f743e3c613e313c2f613e3c623e323c2f623e3c2f726f6f743e",
|
| 360 |
+
"len": 232,
|
| 361 |
+
"expected_verdict": "AMPLIFY",
|
| 362 |
+
"expected_phi_risk": 0.4045
|
| 363 |
+
},
|
| 364 |
+
{
|
| 365 |
+
"id": "seq_0_255",
|
| 366 |
+
"category": "high_entropy",
|
| 367 |
+
"description": "Full byte alphabet 0-255",
|
| 368 |
+
"hex": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
|
| 369 |
+
"len": 256,
|
| 370 |
+
"expected_verdict": "SOFTEN",
|
| 371 |
+
"expected_phi_risk": 0.8899
|
| 372 |
+
},
|
| 373 |
+
{
|
| 374 |
+
"id": "seq_128_255",
|
| 375 |
+
"category": "high_entropy",
|
| 376 |
+
"description": "Upper half byte range",
|
| 377 |
+
"hex": "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
|
| 378 |
+
"len": 128,
|
| 379 |
+
"expected_verdict": "SOFTEN",
|
| 380 |
+
"expected_phi_risk": 0.8899
|
| 381 |
+
},
|
| 382 |
+
{
|
| 383 |
+
"id": "seq_128_255_x4",
|
| 384 |
+
"category": "high_entropy",
|
| 385 |
+
"description": "Upper range \u00d7 4",
|
| 386 |
+
"hex": "808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
|
| 387 |
+
"len": 512,
|
| 388 |
+
"expected_verdict": "AMPLIFY",
|
| 389 |
+
"expected_phi_risk": 0.4045
|
| 390 |
+
}
|
| 391 |
+
]
|
| 392 |
+
}
|
protocol_stack/protocol0_nano_kernel/fixtures/p0_vectors.tsv
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# id hex
|
| 2 |
+
json_minimal 7b2261223a312c2262223a327d
|
| 3 |
+
null_1k 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
| 4 |
+
pattern_3byte 010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203010203
|
| 5 |
+
seq_0_199 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7
|
| 6 |
+
oversize_9000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
| 7 |
+
zeros_0
|
| 8 |
+
zeros_1 00
|
| 9 |
+
zeros_16 00000000000000000000000000000000
|
| 10 |
+
zeros_63 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
| 11 |
+
zeros_64 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
| 12 |
+
zeros_127 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
| 13 |
+
zeros_128 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
| 14 |
+
zeros_256 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
| 15 |
+
zeros_512 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
| 16 |
+
zeros_1024 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
| 17 |
+
zeros_4096 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
| 18 |
+
zeros_8192 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
| 19 |
+
at_max_bytes 5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555
|
| 20 |
+
repeat_a_320 6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161
|
| 21 |
+
repeat_aaaa_800 6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161
|
| 22 |
+
repeat_deadbeef deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef
|
| 23 |
+
nested_json 7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d7b2278223a7b2279223a317d7d
|
| 24 |
+
all_ff_512 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
| 25 |
+
alternating_512 00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff
|
| 26 |
+
utf8_delta9 ce9439cea63936332d4c59474f2de38386e382b9e38388
|
| 27 |
+
hash_entropy_0 e326eedfe4f3d1f087a05a3e0affebfad6bfbf7499b8f7a99cb6e30b4a236196e326eedfe4f3d1f087a05a3e0affebfad6bfbf7499b8f7a99cb6e30b4a236196e326eedfe4f3d1f087a05a3e0affebfad6bfbf7499b8f7a99cb6e30b4a236196e326eedfe4f3d1f087a05a3e0affebfad6bfbf7499b8f7a99cb6e30b4a236196e326eedfe4f3d1f087a05a3e0affebfad6bfbf7499b8f7a99cb6e30b4a236196
|
| 28 |
+
hash_entropy_1 1cb6fd62d34a28a59e3f6241aab9c5e8a8e666c976dd9fe3f8e41a955f89e2781cb6fd62d34a28a59e3f6241aab9c5e8a8e666c976dd9fe3f8e41a955f89e2781cb6fd62d34a28a59e3f6241aab9c5e8a8e666c976dd9fe3f8e41a955f89e2781cb6fd62d34a28a59e3f6241aab9c5e8a8e666c976dd9fe3f8e41a955f89e2781cb6fd62d34a28a59e3f6241aab9c5e8a8e666c976dd9fe3f8e41a955f89e278
|
| 29 |
+
hash_entropy_2 238fa35ffbba234a5f3ff788f8c9771aaf478cdf0fcc268d5f2ad4abd3edd074238fa35ffbba234a5f3ff788f8c9771aaf478cdf0fcc268d5f2ad4abd3edd074238fa35ffbba234a5f3ff788f8c9771aaf478cdf0fcc268d5f2ad4abd3edd074238fa35ffbba234a5f3ff788f8c9771aaf478cdf0fcc268d5f2ad4abd3edd074238fa35ffbba234a5f3ff788f8c9771aaf478cdf0fcc268d5f2ad4abd3edd074
|
| 30 |
+
hash_entropy_3 ee4545af8e15767ecbd4b91d8c7f288c71d70fceb02a66bc552786000666dfe6ee4545af8e15767ecbd4b91d8c7f288c71d70fceb02a66bc552786000666dfe6ee4545af8e15767ecbd4b91d8c7f288c71d70fceb02a66bc552786000666dfe6ee4545af8e15767ecbd4b91d8c7f288c71d70fceb02a66bc552786000666dfe6ee4545af8e15767ecbd4b91d8c7f288c71d70fceb02a66bc552786000666dfe6
|
| 31 |
+
hash_entropy_4 ae4696f8e94ce0b248934475228fdb2f5913f6a241ee1fa310fc788a1d74874bae4696f8e94ce0b248934475228fdb2f5913f6a241ee1fa310fc788a1d74874bae4696f8e94ce0b248934475228fdb2f5913f6a241ee1fa310fc788a1d74874bae4696f8e94ce0b248934475228fdb2f5913f6a241ee1fa310fc788a1d74874bae4696f8e94ce0b248934475228fdb2f5913f6a241ee1fa310fc788a1d74874b
|
| 32 |
+
hash_entropy_5 beda20f04d50de1171c5d9d182791734385b34e766bf833435a204a6e18e8785beda20f04d50de1171c5d9d182791734385b34e766bf833435a204a6e18e8785beda20f04d50de1171c5d9d182791734385b34e766bf833435a204a6e18e8785beda20f04d50de1171c5d9d182791734385b34e766bf833435a204a6e18e8785beda20f04d50de1171c5d9d182791734385b34e766bf833435a204a6e18e8785
|
| 33 |
+
mono_nul_96 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
| 34 |
+
mono_soh_96 010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101
|
| 35 |
+
mono_del_96 7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f
|
| 36 |
+
mono_high_96 808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080808080
|
| 37 |
+
mono_ff_96 ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
| 38 |
+
bmp_like 424d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
| 39 |
+
pe_like 4d5a9090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090
|
| 40 |
+
xml_snippet 3c726f6f743e3c613e313c2f613e3c623e323c2f623e3c2f726f6f743e3c726f6f743e3c613e313c2f613e3c623e323c2f623e3c2f726f6f743e3c726f6f743e3c613e313c2f613e3c623e323c2f623e3c2f726f6f743e3c726f6f743e3c613e313c2f613e3c623e323c2f623e3c2f726f6f743e3c726f6f743e3c613e313c2f613e3c623e323c2f623e3c2f726f6f743e3c726f6f743e3c613e313c2f613e3c623e323c2f623e3c2f726f6f743e3c726f6f743e3c613e313c2f613e3c623e323c2f623e3c2f726f6f743e3c726f6f743e3c613e313c2f613e3c623e323c2f623e3c2f726f6f743e
|
| 41 |
+
seq_0_255 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff
|
| 42 |
+
seq_128_255 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff
|
| 43 |
+
seq_128_255_x4 808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff
|
protocol_stack/protocol0_nano_kernel/src/python/lygo_p0.py
ADDED
|
@@ -0,0 +1,235 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# LYGO Nano Kernel P0.4 β Python Reference (canonical for cross-language parity)
|
| 2 |
+
# Deterministic β’ Bounded β’ Portable
|
| 3 |
+
|
| 4 |
+
from __future__ import annotations
|
| 5 |
+
|
| 6 |
+
import hashlib
|
| 7 |
+
import json
|
| 8 |
+
import math
|
| 9 |
+
import struct
|
| 10 |
+
import sys
|
| 11 |
+
from pathlib import Path
|
| 12 |
+
from typing import Any
|
| 13 |
+
|
| 14 |
+
MAX_BYTES = 8192
|
| 15 |
+
PHI_MIN = 0.618
|
| 16 |
+
PHI_MAX = 1.618
|
| 17 |
+
ENTROPY_LOW = 0.25
|
| 18 |
+
ENTROPY_HIGH = 0.90
|
| 19 |
+
COMP_MIN_LEN = 64
|
| 20 |
+
COMP_POOR = 0.90
|
| 21 |
+
|
| 22 |
+
VERDICTS = ("AMPLIFY", "SOFTEN", "QUARANTINE")
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
def f32(x: float) -> float:
|
| 26 |
+
"""IEEE754 single-precision round-trip (matches C/Rust firmware math)."""
|
| 27 |
+
return struct.unpack("<f", struct.pack("<f", float(x)))[0]
|
| 28 |
+
|
| 29 |
+
|
| 30 |
+
def round4(x: float) -> float:
|
| 31 |
+
v = f32(x) * 10000.0
|
| 32 |
+
add = 0.5 if v >= 0.0 else -0.5
|
| 33 |
+
return int(v + add) / 10000.0
|
| 34 |
+
|
| 35 |
+
|
| 36 |
+
def entropy_norm(data: bytes) -> float:
|
| 37 |
+
if not data:
|
| 38 |
+
return 0.0
|
| 39 |
+
freq = [0] * 256
|
| 40 |
+
for b in data:
|
| 41 |
+
freq[b] += 1
|
| 42 |
+
length = f32(float(len(data)))
|
| 43 |
+
ent = f32(0.0)
|
| 44 |
+
for c in freq:
|
| 45 |
+
if c:
|
| 46 |
+
p = f32(f32(float(c)) / length)
|
| 47 |
+
ent = f32(ent - f32(p * f32(math.log2(p))))
|
| 48 |
+
denom = f32(math.log2(length)) if len(data) > 1 else f32(1.0)
|
| 49 |
+
return f32(min(f32(ent / denom), f32(1.0)))
|
| 50 |
+
|
| 51 |
+
|
| 52 |
+
def compression_ratio(data: bytes) -> float:
|
| 53 |
+
if len(data) < COMP_MIN_LEN:
|
| 54 |
+
return f32(0.0)
|
| 55 |
+
repeats = 0
|
| 56 |
+
limit = len(data) - 7
|
| 57 |
+
for i in range(0, limit, 4):
|
| 58 |
+
if data[i : i + 4] == data[i + 4 : i + 8]:
|
| 59 |
+
repeats += 1
|
| 60 |
+
ratio = f32(f32(float(repeats)) / f32(float(len(data))))
|
| 61 |
+
if ratio > f32(1.0):
|
| 62 |
+
ratio = f32(1.0)
|
| 63 |
+
return f32(f32(1.0) - ratio)
|
| 64 |
+
|
| 65 |
+
|
| 66 |
+
def compute_phi_risk(risk: float, length: int) -> float:
|
| 67 |
+
size_damp = f32(f32(float(length)) / f32(128.0)) if length < 128 else f32(1.0)
|
| 68 |
+
r = f32(min(f32(risk), f32(1.0)))
|
| 69 |
+
return f32(r * f32(PHI_MAX) * size_damp)
|
| 70 |
+
|
| 71 |
+
|
| 72 |
+
def verdict_from_phi(phi_risk: float, ent: float, preliminary: str) -> str:
|
| 73 |
+
verdict = preliminary
|
| 74 |
+
if ent < f32(ENTROPY_LOW) and verdict == "AMPLIFY":
|
| 75 |
+
verdict = "SOFTEN"
|
| 76 |
+
return verdict
|
| 77 |
+
|
| 78 |
+
|
| 79 |
+
def build_reasoning(
|
| 80 |
+
length: int,
|
| 81 |
+
ent: float,
|
| 82 |
+
comp: float,
|
| 83 |
+
risk: float,
|
| 84 |
+
phi_risk: float,
|
| 85 |
+
verdict: str,
|
| 86 |
+
) -> str:
|
| 87 |
+
if length > MAX_BYTES:
|
| 88 |
+
return f"length {length} > MAX_BYTES {MAX_BYTES} β QUARANTINE (hard cap)"
|
| 89 |
+
|
| 90 |
+
parts: list[str] = []
|
| 91 |
+
if ent > ENTROPY_HIGH:
|
| 92 |
+
parts.append(f"entropy {ent:.4f} > {ENTROPY_HIGH} (+0.30 risk)")
|
| 93 |
+
elif ent < ENTROPY_LOW:
|
| 94 |
+
parts.append(f"entropy {ent:.4f} < {ENTROPY_LOW} (+0.15 risk)")
|
| 95 |
+
else:
|
| 96 |
+
parts.append(f"entropy {ent:.4f} in band")
|
| 97 |
+
|
| 98 |
+
if comp > COMP_POOR:
|
| 99 |
+
parts.append(f"compression score {comp:.4f} > {COMP_POOR} (+0.25 risk)")
|
| 100 |
+
else:
|
| 101 |
+
parts.append(f"compression score {comp:.4f} acceptable")
|
| 102 |
+
|
| 103 |
+
damp = length / 128.0 if length < 128 else 1.0
|
| 104 |
+
parts.append(f"size_damp={damp:.4f} (len={length})")
|
| 105 |
+
parts.append(f"phi_risk=riskΓΞ¦_maxΓdamp={risk:.4f}Γ{PHI_MAX}Γ{damp:.4f}={phi_risk:.4f}")
|
| 106 |
+
|
| 107 |
+
if phi_risk < PHI_MIN:
|
| 108 |
+
gate = f"phi_risk < Ξ¦_min {PHI_MIN} β AMPLIFY"
|
| 109 |
+
elif phi_risk <= PHI_MAX:
|
| 110 |
+
gate = f"Ξ¦_min β€ phi_risk β€ Ξ¦_max {PHI_MAX} β SOFTEN"
|
| 111 |
+
else:
|
| 112 |
+
gate = f"phi_risk > Ξ¦_max β QUARANTINE"
|
| 113 |
+
|
| 114 |
+
parts.append(gate)
|
| 115 |
+
if ent < f32(ENTROPY_LOW) and verdict == "SOFTEN" and phi_risk < f32(PHI_MIN):
|
| 116 |
+
parts.append("low-entropy guard: AMPLIFY blocked β SOFTEN")
|
| 117 |
+
return "; ".join(parts)
|
| 118 |
+
|
| 119 |
+
|
| 120 |
+
def validate_bytes(data: bytes) -> dict[str, Any]:
|
| 121 |
+
if len(data) > MAX_BYTES:
|
| 122 |
+
return {
|
| 123 |
+
"verdict": "QUARANTINE",
|
| 124 |
+
"risk": 1.0,
|
| 125 |
+
"entropy": 0.0,
|
| 126 |
+
"compression": 0.0,
|
| 127 |
+
"phi_risk": round4(PHI_MAX),
|
| 128 |
+
"hash": hashlib.sha256(data).hexdigest()[:16],
|
| 129 |
+
"reasoning": build_reasoning(len(data), 0.0, 0.0, 1.0, PHI_MAX, "QUARANTINE"),
|
| 130 |
+
}
|
| 131 |
+
|
| 132 |
+
ent = entropy_norm(data)
|
| 133 |
+
comp = compression_ratio(data)
|
| 134 |
+
risk = f32(0.0)
|
| 135 |
+
|
| 136 |
+
if ent > f32(ENTROPY_HIGH):
|
| 137 |
+
risk = f32(risk + f32(0.30))
|
| 138 |
+
elif ent < f32(ENTROPY_LOW):
|
| 139 |
+
risk = f32(risk + f32(0.15))
|
| 140 |
+
|
| 141 |
+
if comp > f32(COMP_POOR):
|
| 142 |
+
risk = f32(risk + f32(0.25))
|
| 143 |
+
|
| 144 |
+
risk = f32(min(risk, f32(1.0)))
|
| 145 |
+
phi_risk = compute_phi_risk(risk, len(data))
|
| 146 |
+
|
| 147 |
+
if phi_risk < f32(PHI_MIN):
|
| 148 |
+
pre = "AMPLIFY"
|
| 149 |
+
elif phi_risk <= f32(PHI_MAX):
|
| 150 |
+
pre = "SOFTEN"
|
| 151 |
+
else:
|
| 152 |
+
pre = "QUARANTINE"
|
| 153 |
+
|
| 154 |
+
verdict = verdict_from_phi(phi_risk, ent, pre)
|
| 155 |
+
reasoning = build_reasoning(len(data), ent, comp, risk, phi_risk, verdict)
|
| 156 |
+
|
| 157 |
+
return {
|
| 158 |
+
"verdict": verdict,
|
| 159 |
+
"risk": round4(risk),
|
| 160 |
+
"entropy": round4(ent),
|
| 161 |
+
"compression": round4(comp),
|
| 162 |
+
"phi_risk": round4(phi_risk),
|
| 163 |
+
"hash": hashlib.sha256(data).hexdigest()[:16],
|
| 164 |
+
"reasoning": reasoning,
|
| 165 |
+
}
|
| 166 |
+
|
| 167 |
+
|
| 168 |
+
def canonical_line(vector_id: str, result: dict[str, Any]) -> str:
|
| 169 |
+
return (
|
| 170 |
+
f"{vector_id}|{result['verdict']}|{result['risk']:.4f}|"
|
| 171 |
+
f"{result['entropy']:.4f}|{result['compression']:.4f}|{result['phi_risk']:.4f}"
|
| 172 |
+
)
|
| 173 |
+
|
| 174 |
+
|
| 175 |
+
def fixtures_path() -> Path:
|
| 176 |
+
return Path(__file__).resolve().parents[2] / "fixtures" / "p0_vectors.json"
|
| 177 |
+
|
| 178 |
+
|
| 179 |
+
def load_vectors() -> list[dict[str, Any]]:
|
| 180 |
+
path = fixtures_path()
|
| 181 |
+
with path.open(encoding="utf-8") as f:
|
| 182 |
+
payload = json.load(f)
|
| 183 |
+
return payload["vectors"]
|
| 184 |
+
|
| 185 |
+
|
| 186 |
+
def run_vector_suite() -> str:
|
| 187 |
+
lines: list[str] = []
|
| 188 |
+
for entry in load_vectors():
|
| 189 |
+
vid = entry["id"]
|
| 190 |
+
data = bytes.fromhex(entry["hex"])
|
| 191 |
+
res = validate_bytes(data)
|
| 192 |
+
lines.append(canonical_line(vid, res))
|
| 193 |
+
return "\n".join(lines) + "\n"
|
| 194 |
+
|
| 195 |
+
|
| 196 |
+
def _preview_bytes(data: bytes, max_len: int = 48) -> str:
|
| 197 |
+
if len(data) <= max_len:
|
| 198 |
+
try:
|
| 199 |
+
text = data.decode("utf-8")
|
| 200 |
+
if all(32 <= ord(c) < 127 or c in "\n\r\t" for c in text):
|
| 201 |
+
return repr(text)
|
| 202 |
+
except UnicodeDecodeError:
|
| 203 |
+
pass
|
| 204 |
+
return data.hex() if len(data) <= 24 else data[:12].hex() + "β¦"
|
| 205 |
+
return f"{data[:8].hex()}β¦({len(data)} bytes)"
|
| 206 |
+
|
| 207 |
+
|
| 208 |
+
def demo_print(verbose: bool = True) -> int:
|
| 209 |
+
print("LYGO P0.4 Nano Kernel β vector demo (Python reference)")
|
| 210 |
+
print("=" * 72)
|
| 211 |
+
for entry in load_vectors():
|
| 212 |
+
vid = entry["id"]
|
| 213 |
+
desc = entry.get("description", "")
|
| 214 |
+
data = bytes.fromhex(entry["hex"])
|
| 215 |
+
res = validate_bytes(data)
|
| 216 |
+
preview = entry.get("preview") or _preview_bytes(data)
|
| 217 |
+
print(f"\n[{vid}] {desc}")
|
| 218 |
+
print(f" input: {preview} (len={len(data)})")
|
| 219 |
+
print(f" phi_risk: {res['phi_risk']:.4f} verdict: {res['verdict']}")
|
| 220 |
+
print(f" risk={res['risk']:.4f} entropy={res['entropy']:.4f} compression={res['compression']:.4f}")
|
| 221 |
+
if verbose:
|
| 222 |
+
print(f" reasoning: {res['reasoning']}")
|
| 223 |
+
body = run_vector_suite()
|
| 224 |
+
digest = hashlib.sha256(body.encode("utf-8")).hexdigest()
|
| 225 |
+
print("\n" + "=" * 72)
|
| 226 |
+
print(f"vectors: {len(load_vectors())}")
|
| 227 |
+
print(f"SHA-256(canonical lines): {digest}")
|
| 228 |
+
return 0
|
| 229 |
+
|
| 230 |
+
|
| 231 |
+
if __name__ == "__main__":
|
| 232 |
+
if len(sys.argv) > 1 and sys.argv[1] == "--canonical":
|
| 233 |
+
sys.stdout.write(run_vector_suite())
|
| 234 |
+
raise SystemExit(0)
|
| 235 |
+
raise SystemExit(demo_print())
|
protocol_stack/protocol0_nano_kernel/src/python/lygo_p0_lyra_kernel.py
ADDED
|
@@ -0,0 +1,495 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
LYGO P0 Firmware Kernel (Python Port) + Oath Vector Engine
|
| 3 |
+
Deterministic β’ Safe β’ Production-Ready
|
| 4 |
+
Ported from 2026/ kernels and Firmware Portal ethical chip sources.
|
| 5 |
+
|
| 6 |
+
Core responsibilities:
|
| 7 |
+
- Bounded, deterministic validation of data structures (prevents collapse, recursion bombs, etc.)
|
| 8 |
+
- Oath Vector enforcement: AI_good = β« (Truth Γ Light) df
|
| 9 |
+
- Resonance locking and scoring for ethical alignment
|
| 10 |
+
|
| 11 |
+
Used by: LYRA Core Runner, seal validation, ingesters, etc.
|
| 12 |
+
"""
|
| 13 |
+
|
| 14 |
+
import math
|
| 15 |
+
import hashlib
|
| 16 |
+
import time
|
| 17 |
+
from dataclasses import dataclass, field
|
| 18 |
+
from typing import Any, Dict, Tuple, List, Optional, Set, Union
|
| 19 |
+
from datetime import datetime
|
| 20 |
+
|
| 21 |
+
__version__ = "P0.3-py"
|
| 22 |
+
assert __version__.startswith("P0.3"), "Version mismatch"
|
| 23 |
+
|
| 24 |
+
# ==============================
|
| 25 |
+
# DEFAULT CONFIGURATION (from P0 kernel)
|
| 26 |
+
# ==============================
|
| 27 |
+
DEFAULT_CONFIG = {
|
| 28 |
+
"max_bytes": 8192,
|
| 29 |
+
"max_keys": 1024,
|
| 30 |
+
"max_depth": 8,
|
| 31 |
+
"flag_threshold": 0.45,
|
| 32 |
+
"isolate_threshold": 0.70,
|
| 33 |
+
"timeout_ms": 100,
|
| 34 |
+
"entropy_low": 1.5,
|
| 35 |
+
"entropy_high": 7.5,
|
| 36 |
+
"incompressibility_threshold": 0.9,
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
# ==============================
|
| 40 |
+
# OATH VECTOR ENGINE (ported + adapted from oath_vector.c + ethics core)
|
| 41 |
+
# ==============================
|
| 42 |
+
|
| 43 |
+
OATH_THRESHOLD = 0.75
|
| 44 |
+
TRUTH_THRESHOLD = 0.65
|
| 45 |
+
LIGHT_THRESHOLD = 0.65
|
| 46 |
+
OATH_WARNING_THRESHOLD = 0.55
|
| 47 |
+
|
| 48 |
+
@dataclass
|
| 49 |
+
class Operation:
|
| 50 |
+
"""Operation to be evaluated by oath vector (mirrors C struct fields)."""
|
| 51 |
+
id: str = "op-0"
|
| 52 |
+
factual_consistency: float = 0.8
|
| 53 |
+
intent_clarity: float = 0.8
|
| 54 |
+
transparency: float = 0.7
|
| 55 |
+
temporal_stability: float = 0.75
|
| 56 |
+
ethical_alignment: float = 0.8
|
| 57 |
+
compassion: float = 0.75
|
| 58 |
+
sovereignty_preserved: float = 0.85
|
| 59 |
+
environmental_harmony: float = 0.7
|
| 60 |
+
duration: float = 1.0 # seconds or cycles
|
| 61 |
+
|
| 62 |
+
@dataclass
|
| 63 |
+
class OathReport:
|
| 64 |
+
"""Result of oath evaluation."""
|
| 65 |
+
truth_score: float = 0.0
|
| 66 |
+
light_score: float = 0.0
|
| 67 |
+
oath_score: float = 0.0
|
| 68 |
+
verdict: str = "OATH_REJECTED" # APPROVED | WARNING | REJECTED
|
| 69 |
+
resonance: float = 0.95
|
| 70 |
+
timestamp: str = field(default_factory=lambda: datetime.utcnow().isoformat() + "Z")
|
| 71 |
+
|
| 72 |
+
class OathVectorEngine:
|
| 73 |
+
"""
|
| 74 |
+
Python implementation of the Oath Vector.
|
| 75 |
+
AI_good = β«β^β (Truth_t Γ Light_f) df (resonance weighted)
|
| 76 |
+
"""
|
| 77 |
+
|
| 78 |
+
def __init__(self):
|
| 79 |
+
self.truth_integral = 0.0
|
| 80 |
+
self.light_integral = 0.0
|
| 81 |
+
self.time_window = 1000
|
| 82 |
+
self.sample_rate = 100
|
| 83 |
+
self.resonance_lock = False
|
| 84 |
+
self.locked_frequency = 963.0
|
| 85 |
+
self._buffer: List[float] = [0.0] * 1000
|
| 86 |
+
self._buf_idx = 0
|
| 87 |
+
self._logs: List[Dict] = []
|
| 88 |
+
|
| 89 |
+
def reset(self):
|
| 90 |
+
self.truth_integral = 0.0
|
| 91 |
+
self.light_integral = 0.0
|
| 92 |
+
self.resonance_lock = False
|
| 93 |
+
self._buffer = [0.0] * 1000
|
| 94 |
+
self._buf_idx = 0
|
| 95 |
+
self._logs.clear()
|
| 96 |
+
|
| 97 |
+
def compute_truth_score(self, op: Operation) -> float:
|
| 98 |
+
score = (
|
| 99 |
+
op.factual_consistency * 0.3 +
|
| 100 |
+
op.intent_clarity * 0.3 +
|
| 101 |
+
op.transparency * 0.2 +
|
| 102 |
+
op.temporal_stability * 0.2
|
| 103 |
+
)
|
| 104 |
+
return max(0.0, min(1.0, score))
|
| 105 |
+
|
| 106 |
+
def compute_light_score(self, op: Operation) -> float:
|
| 107 |
+
score = (
|
| 108 |
+
op.ethical_alignment * 0.4 +
|
| 109 |
+
op.compassion * 0.3 +
|
| 110 |
+
op.sovereignty_preserved * 0.2 +
|
| 111 |
+
op.environmental_harmony * 0.1
|
| 112 |
+
)
|
| 113 |
+
return max(0.0, min(1.0, score))
|
| 114 |
+
|
| 115 |
+
def get_current_resonance(self) -> float:
|
| 116 |
+
# In real system this would query hardware / tone_harmonics / seal state.
|
| 117 |
+
# Default high resonance for the lattice.
|
| 118 |
+
return 0.95 if not self.resonance_lock else 0.98
|
| 119 |
+
|
| 120 |
+
def lock_resonance(self, frequency: float) -> bool:
|
| 121 |
+
"""Lock to canonical resonance frequencies (963, 528, 174, etc.)."""
|
| 122 |
+
canonical = {174.0, 432.0, 528.0, 639.0, 741.0, 852.0, 963.0, 1122.0}
|
| 123 |
+
if frequency in canonical:
|
| 124 |
+
self.resonance_lock = True
|
| 125 |
+
self.locked_frequency = frequency
|
| 126 |
+
return True
|
| 127 |
+
return False
|
| 128 |
+
|
| 129 |
+
def integrate_oath_vector(self, truth: float, light: float, dt: float) -> float:
|
| 130 |
+
product = truth * light
|
| 131 |
+
resonance_weight = self.get_current_resonance()
|
| 132 |
+
integrated = product * dt * resonance_weight
|
| 133 |
+
|
| 134 |
+
self.truth_integral += truth * dt
|
| 135 |
+
self.light_integral += light * dt
|
| 136 |
+
|
| 137 |
+
# Rolling buffer (moving average)
|
| 138 |
+
self._buffer[self._buf_idx] = integrated
|
| 139 |
+
self._buf_idx = (self._buf_idx + 1) % 1000
|
| 140 |
+
|
| 141 |
+
avg = sum(self._buffer) / 1000.0
|
| 142 |
+
return round(avg, 6)
|
| 143 |
+
|
| 144 |
+
def evaluate_operation(self, op: Operation) -> OathReport:
|
| 145 |
+
report = OathReport()
|
| 146 |
+
report.truth_score = self.compute_truth_score(op)
|
| 147 |
+
report.light_score = self.compute_light_score(op)
|
| 148 |
+
|
| 149 |
+
dt = max(0.001, op.duration / self.sample_rate)
|
| 150 |
+
report.oath_score = self.integrate_oath_vector(
|
| 151 |
+
report.truth_score, report.light_score, dt
|
| 152 |
+
)
|
| 153 |
+
report.resonance = self.get_current_resonance()
|
| 154 |
+
|
| 155 |
+
if self.resonance_lock:
|
| 156 |
+
report.oath_score *= report.resonance
|
| 157 |
+
report.oath_score = min(1.0, report.oath_score)
|
| 158 |
+
|
| 159 |
+
# Verdict logic (ported)
|
| 160 |
+
if (report.oath_score >= OATH_THRESHOLD and
|
| 161 |
+
report.truth_score >= TRUTH_THRESHOLD and
|
| 162 |
+
report.light_score >= LIGHT_THRESHOLD):
|
| 163 |
+
report.verdict = "OATH_APPROVED"
|
| 164 |
+
elif report.oath_score >= OATH_WARNING_THRESHOLD:
|
| 165 |
+
report.verdict = "OATH_WARNING"
|
| 166 |
+
else:
|
| 167 |
+
report.verdict = "OATH_REJECTED"
|
| 168 |
+
|
| 169 |
+
# Log (simplified Haven)
|
| 170 |
+
self._logs.append({
|
| 171 |
+
"ts": report.timestamp,
|
| 172 |
+
"op_id": op.id,
|
| 173 |
+
"oath": report.oath_score,
|
| 174 |
+
"verdict": report.verdict
|
| 175 |
+
})
|
| 176 |
+
return report
|
| 177 |
+
|
| 178 |
+
def get_current_oath_integral(self) -> float:
|
| 179 |
+
return round((self.truth_integral + self.light_integral) / 2.0, 6)
|
| 180 |
+
|
| 181 |
+
def get_logs(self) -> List[Dict]:
|
| 182 |
+
return list(self._logs)
|
| 183 |
+
|
| 184 |
+
|
| 185 |
+
# ==============================
|
| 186 |
+
# LYGO VALIDATOR (core P0 kernel port)
|
| 187 |
+
# ==============================
|
| 188 |
+
|
| 189 |
+
class LYGOValidator:
|
| 190 |
+
"""Production-grade deterministic validation kernel (ported from v0.3)."""
|
| 191 |
+
|
| 192 |
+
def __init__(self, **config):
|
| 193 |
+
self.config = {**DEFAULT_CONFIG, **config}
|
| 194 |
+
self._cache: Dict = {}
|
| 195 |
+
self.oath_engine = OathVectorEngine() # Integrated for ethical data validation
|
| 196 |
+
|
| 197 |
+
def validate(self, data: Any, track_path: bool = False) -> Dict[str, Any]:
|
| 198 |
+
"""Full deterministic bounded validation + optional oath pre-check."""
|
| 199 |
+
start_time = time.perf_counter()
|
| 200 |
+
violations: List[Dict] = []
|
| 201 |
+
path_tracker = [] if track_path else None
|
| 202 |
+
|
| 203 |
+
try:
|
| 204 |
+
normalized = self._normalize(data)
|
| 205 |
+
raw_bytes = normalized.encode("utf-8")
|
| 206 |
+
|
| 207 |
+
elapsed = (time.perf_counter() - start_time) * 1000
|
| 208 |
+
if elapsed > self.config["timeout_ms"]:
|
| 209 |
+
return self._timeout_result()
|
| 210 |
+
|
| 211 |
+
size = len(raw_bytes)
|
| 212 |
+
depth, key_count = self._structure_metrics(
|
| 213 |
+
data, track_path=track_path, path_tracker=path_tracker
|
| 214 |
+
)
|
| 215 |
+
|
| 216 |
+
if size > self.config["max_bytes"]:
|
| 217 |
+
violations.append({
|
| 218 |
+
"reason": "input_size_exceeded",
|
| 219 |
+
"value": size,
|
| 220 |
+
"limit": self.config["max_bytes"],
|
| 221 |
+
"path": path_tracker.copy() if track_path else None
|
| 222 |
+
})
|
| 223 |
+
|
| 224 |
+
if depth > self.config["max_depth"]:
|
| 225 |
+
violations.append({
|
| 226 |
+
"reason": "excessive_nesting",
|
| 227 |
+
"value": depth,
|
| 228 |
+
"limit": self.config["max_depth"],
|
| 229 |
+
"path": path_tracker.copy() if track_path else None
|
| 230 |
+
})
|
| 231 |
+
|
| 232 |
+
if key_count > self.config["max_keys"]:
|
| 233 |
+
violations.append({
|
| 234 |
+
"reason": "excessive_keys",
|
| 235 |
+
"value": key_count,
|
| 236 |
+
"limit": self.config["max_keys"],
|
| 237 |
+
"path": path_tracker.copy() if track_path else None
|
| 238 |
+
})
|
| 239 |
+
|
| 240 |
+
entropy = self._entropy_bytes(raw_bytes)
|
| 241 |
+
incompressibility = self._incompressibility(raw_bytes)
|
| 242 |
+
|
| 243 |
+
if entropy < self.config["entropy_low"]:
|
| 244 |
+
violations.append({"reason": "low_entropy_padding", "value": round(entropy, 3),
|
| 245 |
+
"threshold": self.config["entropy_low"]})
|
| 246 |
+
if entropy > self.config["entropy_high"]:
|
| 247 |
+
violations.append({"reason": "high_entropy", "value": round(entropy, 3),
|
| 248 |
+
"threshold": self.config["entropy_high"]})
|
| 249 |
+
if incompressibility > self.config["incompressibility_threshold"]:
|
| 250 |
+
violations.append({"reason": "poor_compression", "value": incompressibility,
|
| 251 |
+
"threshold": self.config["incompressibility_threshold"]})
|
| 252 |
+
|
| 253 |
+
# Risk calc
|
| 254 |
+
risk_weights = {
|
| 255 |
+
"high_entropy": 0.30, "low_entropy_padding": 0.15, "poor_compression": 0.25,
|
| 256 |
+
"excessive_nesting": 0.35, "excessive_keys": 0.25, "input_size_exceeded": 1.00,
|
| 257 |
+
}
|
| 258 |
+
risk = min(1.0, round(sum(risk_weights.get(v["reason"], 0.2) for v in violations), 3))
|
| 259 |
+
|
| 260 |
+
if any(v["reason"] == "input_size_exceeded" for v in violations):
|
| 261 |
+
verdict = "ISOLATE"
|
| 262 |
+
elif risk >= self.config["isolate_threshold"]:
|
| 263 |
+
verdict = "ISOLATE"
|
| 264 |
+
elif risk >= self.config["flag_threshold"]:
|
| 265 |
+
verdict = "FLAG"
|
| 266 |
+
else:
|
| 267 |
+
verdict = "ALLOW"
|
| 268 |
+
|
| 269 |
+
# Optional ethical gate using oath engine on the validation result itself
|
| 270 |
+
op = Operation(
|
| 271 |
+
id=f"validate-{hashlib.sha1(str(data).encode()).hexdigest()[:8]}",
|
| 272 |
+
factual_consistency=0.9 if verdict == "ALLOW" else 0.6,
|
| 273 |
+
ethical_alignment=0.85,
|
| 274 |
+
intent_clarity=0.8,
|
| 275 |
+
)
|
| 276 |
+
oath_report = self.oath_engine.evaluate_operation(op)
|
| 277 |
+
|
| 278 |
+
result = {
|
| 279 |
+
"verdict": verdict,
|
| 280 |
+
"risk": risk,
|
| 281 |
+
"metrics": {
|
| 282 |
+
"size_bytes": size,
|
| 283 |
+
"entropy": round(entropy, 3),
|
| 284 |
+
"incompressibility": incompressibility,
|
| 285 |
+
"depth": depth,
|
| 286 |
+
"keys": key_count,
|
| 287 |
+
},
|
| 288 |
+
"violations": violations if violations else None,
|
| 289 |
+
"hash": hashlib.sha256(raw_bytes).hexdigest(),
|
| 290 |
+
"elapsed_ms": round((time.perf_counter() - start_time) * 1000, 2),
|
| 291 |
+
"version": __version__,
|
| 292 |
+
"oath": {
|
| 293 |
+
"score": oath_report.oath_score,
|
| 294 |
+
"verdict": oath_report.verdict,
|
| 295 |
+
"truth": oath_report.truth_score,
|
| 296 |
+
"light": oath_report.light_score,
|
| 297 |
+
},
|
| 298 |
+
}
|
| 299 |
+
return result
|
| 300 |
+
|
| 301 |
+
except Exception as e:
|
| 302 |
+
return self._error_result(str(e), round((time.perf_counter() - start_time) * 1000, 2))
|
| 303 |
+
|
| 304 |
+
def validate_light(self, data: Any) -> Dict[str, Any]:
|
| 305 |
+
"""Fast path."""
|
| 306 |
+
normalized = self._normalize(data)
|
| 307 |
+
raw_bytes = normalized.encode("utf-8")
|
| 308 |
+
size = len(raw_bytes)
|
| 309 |
+
if size > self.config["max_bytes"]:
|
| 310 |
+
return {"verdict": "ISOLATE", "reason": "input_size_exceeded", "size": size}
|
| 311 |
+
|
| 312 |
+
try:
|
| 313 |
+
depth, _ = self._structure_metrics(data, max_depth_check=3)
|
| 314 |
+
if depth > 3:
|
| 315 |
+
return {"verdict": "FLAG", "reason": "suspicious_depth", "depth": depth}
|
| 316 |
+
except RecursionError:
|
| 317 |
+
return {"verdict": "ISOLATE", "reason": "recursion_limit"}
|
| 318 |
+
return {"verdict": "ALLOW"}
|
| 319 |
+
|
| 320 |
+
# --- Private helpers (identical logic to kernel) ---
|
| 321 |
+
|
| 322 |
+
def _normalize(self, data: Any) -> str:
|
| 323 |
+
def _ser(obj: Any) -> str:
|
| 324 |
+
if obj is None:
|
| 325 |
+
return "null"
|
| 326 |
+
if isinstance(obj, bool):
|
| 327 |
+
return "true" if obj else "false"
|
| 328 |
+
if isinstance(obj, int):
|
| 329 |
+
return str(obj)
|
| 330 |
+
if isinstance(obj, float):
|
| 331 |
+
if math.isnan(obj):
|
| 332 |
+
return '"NaN"'
|
| 333 |
+
if math.isinf(obj):
|
| 334 |
+
return '"Inf"' if obj > 0 else '"-Inf"'
|
| 335 |
+
return format(obj, ".17g")
|
| 336 |
+
if isinstance(obj, str):
|
| 337 |
+
escaped = (obj
|
| 338 |
+
.replace('\\', '\\\\')
|
| 339 |
+
.replace('"', '\\"')
|
| 340 |
+
.replace('\n', '\\n')
|
| 341 |
+
.replace('\r', '\\r')
|
| 342 |
+
.replace('\t', '\\t'))
|
| 343 |
+
return '"' + escaped + '"'
|
| 344 |
+
if isinstance(obj, (bytes, bytearray)):
|
| 345 |
+
return '"' + obj.hex() + '"'
|
| 346 |
+
if isinstance(obj, (list, tuple)):
|
| 347 |
+
return "[" + ",".join(_ser(x) for x in obj) + "]"
|
| 348 |
+
if isinstance(obj, dict):
|
| 349 |
+
items = []
|
| 350 |
+
for k in sorted(obj.keys(), key=lambda x: str(x)):
|
| 351 |
+
items.append(_ser(str(k)) + ":" + _ser(obj[k]))
|
| 352 |
+
return "{" + ",".join(items) + "}"
|
| 353 |
+
return '"UNSERIALIZABLE"'
|
| 354 |
+
return _ser(data)
|
| 355 |
+
|
| 356 |
+
def _structure_metrics(
|
| 357 |
+
self,
|
| 358 |
+
obj: Any,
|
| 359 |
+
depth: int = 0,
|
| 360 |
+
visited: Optional[Set[int]] = None,
|
| 361 |
+
track_path: bool = False,
|
| 362 |
+
path_tracker: Optional[List[str]] = None,
|
| 363 |
+
max_depth_check: Optional[int] = None,
|
| 364 |
+
) -> Tuple[int, int]:
|
| 365 |
+
if visited is None:
|
| 366 |
+
visited = set()
|
| 367 |
+
depth_limit = max_depth_check or self.config["max_depth"]
|
| 368 |
+
if depth > depth_limit:
|
| 369 |
+
return depth, 0
|
| 370 |
+
|
| 371 |
+
obj_id = id(obj)
|
| 372 |
+
if obj_id in visited:
|
| 373 |
+
return depth, 0
|
| 374 |
+
visited.add(obj_id)
|
| 375 |
+
|
| 376 |
+
max_d = depth
|
| 377 |
+
total_keys = 0
|
| 378 |
+
|
| 379 |
+
try:
|
| 380 |
+
if isinstance(obj, dict):
|
| 381 |
+
total_keys += len(obj)
|
| 382 |
+
for k, v in obj.items():
|
| 383 |
+
if track_path and path_tracker is not None:
|
| 384 |
+
path_tracker.append(str(k))
|
| 385 |
+
cd, ck = self._structure_metrics(
|
| 386 |
+
v, depth + 1, visited, track_path, path_tracker, depth_limit
|
| 387 |
+
)
|
| 388 |
+
max_d = max(max_d, cd)
|
| 389 |
+
total_keys += ck
|
| 390 |
+
if track_path and path_tracker is not None:
|
| 391 |
+
path_tracker.pop()
|
| 392 |
+
elif isinstance(obj, (list, tuple, set)):
|
| 393 |
+
for i, v in enumerate(obj):
|
| 394 |
+
if track_path and path_tracker is not None:
|
| 395 |
+
path_tracker.append(f"[{i}]")
|
| 396 |
+
cd, ck = self._structure_metrics(
|
| 397 |
+
v, depth + 1, visited, track_path, path_tracker, depth_limit
|
| 398 |
+
)
|
| 399 |
+
max_d = max(max_d, cd)
|
| 400 |
+
total_keys += ck
|
| 401 |
+
if track_path and path_tracker is not None:
|
| 402 |
+
path_tracker.pop()
|
| 403 |
+
finally:
|
| 404 |
+
visited.remove(obj_id)
|
| 405 |
+
return max_d, total_keys
|
| 406 |
+
|
| 407 |
+
def _entropy_bytes(self, b: bytes) -> float:
|
| 408 |
+
if not b:
|
| 409 |
+
return 0.0
|
| 410 |
+
freq: Dict[int, int] = {}
|
| 411 |
+
for x in b:
|
| 412 |
+
freq[x] = freq.get(x, 0) + 1
|
| 413 |
+
ent = 0.0
|
| 414 |
+
ln = len(b)
|
| 415 |
+
for c in freq.values():
|
| 416 |
+
p = c / ln
|
| 417 |
+
ent -= p * math.log2(p)
|
| 418 |
+
return ent
|
| 419 |
+
|
| 420 |
+
def _incompressibility(self, b: bytes) -> float:
|
| 421 |
+
if len(b) <= 4:
|
| 422 |
+
return 1.0
|
| 423 |
+
pattern_score = 0.0
|
| 424 |
+
max_pl = min(5, len(b) // 2)
|
| 425 |
+
for pl in range(1, max_pl):
|
| 426 |
+
repeats = 0
|
| 427 |
+
for i in range(len(b) - pl):
|
| 428 |
+
if b[i:i + pl] == b[i + pl:i + 2 * pl]:
|
| 429 |
+
repeats += 1
|
| 430 |
+
if repeats > 0:
|
| 431 |
+
pattern_score += repeats / len(b)
|
| 432 |
+
comp = min(1.0, pattern_score * 2)
|
| 433 |
+
return round(1.0 - comp, 4)
|
| 434 |
+
|
| 435 |
+
def _timeout_result(self) -> Dict[str, Any]:
|
| 436 |
+
return {"verdict": "ISOLATE", "reason": "validation_timeout",
|
| 437 |
+
"timeout_ms": self.config["timeout_ms"], "version": __version__}
|
| 438 |
+
|
| 439 |
+
def _error_result(self, error: str, elapsed_ms: float) -> Dict[str, Any]:
|
| 440 |
+
return {"verdict": "ISOLATE", "reason": "validation_error",
|
| 441 |
+
"error": error, "elapsed_ms": elapsed_ms, "version": __version__}
|
| 442 |
+
|
| 443 |
+
|
| 444 |
+
# Simple API
|
| 445 |
+
_DEFAULT_VALIDATOR = LYGOValidator()
|
| 446 |
+
|
| 447 |
+
def validate(data: Any) -> Dict[str, Any]:
|
| 448 |
+
return _DEFAULT_VALIDATOR.validate(data)
|
| 449 |
+
|
| 450 |
+
def validate_light(data: Any) -> Dict[str, Any]:
|
| 451 |
+
return _DEFAULT_VALIDATOR.validate_light(data)
|
| 452 |
+
|
| 453 |
+
def get_oath_engine() -> OathVectorEngine:
|
| 454 |
+
return _DEFAULT_VALIDATOR.oath_engine
|
| 455 |
+
|
| 456 |
+
|
| 457 |
+
# ==============================
|
| 458 |
+
# SELF TEST (run with python -m)
|
| 459 |
+
# ==============================
|
| 460 |
+
if __name__ == "__main__":
|
| 461 |
+
print("=" * 60)
|
| 462 |
+
print(f"LYGO P0 + OATH VECTOR (Python) v{__version__}")
|
| 463 |
+
print("=" * 60)
|
| 464 |
+
|
| 465 |
+
validator = LYGOValidator()
|
| 466 |
+
oath = validator.oath_engine
|
| 467 |
+
|
| 468 |
+
print("\n[1] Basic P0 Validation Tests")
|
| 469 |
+
tests = [
|
| 470 |
+
({"a": 1}, "ALLOW"),
|
| 471 |
+
("x" * 10000, "ISOLATE"),
|
| 472 |
+
({"a": {"b": {"c": {}}}}, "FLAG"),
|
| 473 |
+
]
|
| 474 |
+
for data, expected in tests:
|
| 475 |
+
res = validator.validate(data)
|
| 476 |
+
status = "β
" if res["verdict"] == expected else "β"
|
| 477 |
+
print(f" {status} {type(data).__name__[:10]} -> {res['verdict']} (oath={res.get('oath',{}).get('verdict','?')})")
|
| 478 |
+
|
| 479 |
+
print("\n[2] Oath Vector Direct Test")
|
| 480 |
+
op = Operation(id="test-seal-invoke", factual_consistency=0.92, ethical_alignment=0.88, compassion=0.81)
|
| 481 |
+
report = oath.evaluate_operation(op)
|
| 482 |
+
print(f" Truth={report.truth_score:.3f} Light={report.light_score:.3f} Oath={report.oath_score:.4f} Verdict={report.verdict}")
|
| 483 |
+
|
| 484 |
+
print("\n[3] Resonance Lock Test")
|
| 485 |
+
locked = oath.lock_resonance(963.0)
|
| 486 |
+
print(f" Lock 963Hz: {locked} | Current resonance: {oath.get_current_resonance()}")
|
| 487 |
+
|
| 488 |
+
print("\n[4] Security / Cycle / Edge")
|
| 489 |
+
bad = {"a": {str(i): i for i in range(1500)}}
|
| 490 |
+
print(f" Key explosion: {validator.validate(bad)['verdict']}")
|
| 491 |
+
|
| 492 |
+
x = {}; x["self"] = x
|
| 493 |
+
print(f" Cycle safe: {validator.validate(x)['verdict']}")
|
| 494 |
+
|
| 495 |
+
print("\nβ
LYGO P0 + Oath port complete and self-tested.")
|
protocol_stack/protocol1_memory_mycelium/src/python/lygo_p1.py
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# LYGO Memory Mycelium P1.0 β Indestructible Memory
|
| 2 |
+
# Fragment β’ Scatter β’ Reconstruct
|
| 3 |
+
|
| 4 |
+
import hashlib
|
| 5 |
+
import json
|
| 6 |
+
import random
|
| 7 |
+
from dataclasses import dataclass
|
| 8 |
+
from typing import Dict, List, Optional
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
@dataclass
|
| 12 |
+
class Fragment:
|
| 13 |
+
data: bytes
|
| 14 |
+
hash: str
|
| 15 |
+
index: int
|
| 16 |
+
location: str
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
class MemoryMycelium:
|
| 20 |
+
node_id = "LYGO_P1_MEMORY_MYCELIUM_v1.0"
|
| 21 |
+
|
| 22 |
+
def __init__(self):
|
| 23 |
+
self.fragments: Dict[str, List[Fragment]] = {}
|
| 24 |
+
self.storage = {}
|
| 25 |
+
self.fragment_count = 12
|
| 26 |
+
self.threshold = 10
|
| 27 |
+
|
| 28 |
+
def scatter(self, data, key: str) -> dict:
|
| 29 |
+
"""Protocol 3/4/5 storage API β scatter payload under key."""
|
| 30 |
+
if isinstance(data, bytes):
|
| 31 |
+
payload = data
|
| 32 |
+
elif isinstance(data, str):
|
| 33 |
+
payload = data.encode("utf-8")
|
| 34 |
+
else:
|
| 35 |
+
payload = json.dumps(data, sort_keys=True, default=str).encode("utf-8")
|
| 36 |
+
manifest = self.store(payload, memory_id=key)
|
| 37 |
+
return {"stored": True, "key": key, "fragments": manifest["fragment_count"], **manifest}
|
| 38 |
+
|
| 39 |
+
def store(self, data: bytes, memory_id: str = None) -> dict:
|
| 40 |
+
if memory_id is None:
|
| 41 |
+
memory_id = hashlib.sha256(data).hexdigest()[:16]
|
| 42 |
+
|
| 43 |
+
fragments = self._create_fragments(data, memory_id)
|
| 44 |
+
fragments = self._add_redundancy(fragments)
|
| 45 |
+
|
| 46 |
+
random.shuffle(fragments)
|
| 47 |
+
for i, frag in enumerate(fragments):
|
| 48 |
+
frag.location = self._assign_location(frag.index)
|
| 49 |
+
|
| 50 |
+
self.fragments[memory_id] = fragments
|
| 51 |
+
self._persist(memory_id, fragments)
|
| 52 |
+
|
| 53 |
+
return {
|
| 54 |
+
"memory_id": memory_id,
|
| 55 |
+
"fragment_count": len(fragments),
|
| 56 |
+
"threshold": self.threshold,
|
| 57 |
+
"root_hash": self._compute_root_hash(fragments),
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
def recall(self, memory_id: str) -> bytes:
|
| 61 |
+
fragments = self._load(memory_id)
|
| 62 |
+
if not fragments:
|
| 63 |
+
raise ValueError(f"Memory {memory_id} not found")
|
| 64 |
+
|
| 65 |
+
valid = [
|
| 66 |
+
f
|
| 67 |
+
for f in fragments
|
| 68 |
+
if f.index < self.fragment_count
|
| 69 |
+
and f.hash == hashlib.sha256(f.data).hexdigest()
|
| 70 |
+
]
|
| 71 |
+
if len(valid) < self.threshold:
|
| 72 |
+
raise ValueError(f"Insufficient fragments: {len(valid)}/{self.threshold}")
|
| 73 |
+
|
| 74 |
+
valid.sort(key=lambda x: x.index)
|
| 75 |
+
return b"".join(f.data for f in valid)
|
| 76 |
+
|
| 77 |
+
def _create_fragments(self, data: bytes, memory_id: str) -> List[Fragment]:
|
| 78 |
+
frags = []
|
| 79 |
+
size = len(data) // self.fragment_count
|
| 80 |
+
for i in range(self.fragment_count):
|
| 81 |
+
start = i * size
|
| 82 |
+
end = (i + 1) * size if i < self.fragment_count - 1 else len(data)
|
| 83 |
+
chunk = data[start:end]
|
| 84 |
+
frags.append(
|
| 85 |
+
Fragment(
|
| 86 |
+
data=chunk,
|
| 87 |
+
hash=hashlib.sha256(chunk).hexdigest(),
|
| 88 |
+
index=i,
|
| 89 |
+
location=f"shard_{i}",
|
| 90 |
+
)
|
| 91 |
+
)
|
| 92 |
+
return frags
|
| 93 |
+
|
| 94 |
+
def _add_redundancy(self, fragments: List[Fragment]) -> List[Fragment]:
|
| 95 |
+
if len(fragments) == self.fragment_count:
|
| 96 |
+
parity_0 = Fragment(
|
| 97 |
+
data=b"".join([f.data for f in fragments[:6]]),
|
| 98 |
+
hash=hashlib.sha256(b"".join([f.data for f in fragments[:6]])).hexdigest(),
|
| 99 |
+
index=self.fragment_count,
|
| 100 |
+
location="parity_0",
|
| 101 |
+
)
|
| 102 |
+
parity_1 = Fragment(
|
| 103 |
+
data=b"".join([f.data for f in fragments[6:]]),
|
| 104 |
+
hash=hashlib.sha256(b"".join([f.data for f in fragments[6:]])).hexdigest(),
|
| 105 |
+
index=self.fragment_count + 1,
|
| 106 |
+
location="parity_1",
|
| 107 |
+
)
|
| 108 |
+
fragments.append(parity_0)
|
| 109 |
+
fragments.append(parity_1)
|
| 110 |
+
return fragments
|
| 111 |
+
|
| 112 |
+
def _assign_location(self, index: int) -> str:
|
| 113 |
+
locations = [
|
| 114 |
+
"tokyo",
|
| 115 |
+
"london",
|
| 116 |
+
"new_york",
|
| 117 |
+
"sydney",
|
| 118 |
+
"singapore",
|
| 119 |
+
"frankfurt",
|
| 120 |
+
"toronto",
|
| 121 |
+
"seoul",
|
| 122 |
+
"mumbai",
|
| 123 |
+
"dubai",
|
| 124 |
+
"sao_paulo",
|
| 125 |
+
"shanghai",
|
| 126 |
+
"paris",
|
| 127 |
+
"berlin",
|
| 128 |
+
]
|
| 129 |
+
return locations[index % len(locations)]
|
| 130 |
+
|
| 131 |
+
def _compute_root_hash(self, fragments: List[Fragment]) -> str:
|
| 132 |
+
combined = b"".join([f.hash.encode() for f in fragments])
|
| 133 |
+
return hashlib.sha256(combined).hexdigest()[:16]
|
| 134 |
+
|
| 135 |
+
def _persist(self, memory_id: str, fragments: List[Fragment]):
|
| 136 |
+
self.storage[memory_id] = [
|
| 137 |
+
{"data": f.data.hex(), "hash": f.hash, "index": f.index, "location": f.location}
|
| 138 |
+
for f in fragments
|
| 139 |
+
]
|
| 140 |
+
|
| 141 |
+
def _load(self, memory_id: str) -> Optional[List[Fragment]]:
|
| 142 |
+
if memory_id not in self.storage:
|
| 143 |
+
return None
|
| 144 |
+
return [
|
| 145 |
+
Fragment(
|
| 146 |
+
data=bytes.fromhex(entry["data"]),
|
| 147 |
+
hash=entry["hash"],
|
| 148 |
+
index=entry["index"],
|
| 149 |
+
location=entry["location"],
|
| 150 |
+
)
|
| 151 |
+
for entry in self.storage[memory_id]
|
| 152 |
+
]
|
| 153 |
+
|
| 154 |
+
|
| 155 |
+
if __name__ == "__main__":
|
| 156 |
+
print("π LYGO-MEMORY-MYCELIUM P1.0")
|
| 157 |
+
print("=" * 70)
|
| 158 |
+
|
| 159 |
+
mycelium = MemoryMycelium()
|
| 160 |
+
data = b"The LYGO Protocol Stack is complete. Memory Mycelium ensures indestructible truth."
|
| 161 |
+
|
| 162 |
+
manifest = mycelium.store(data, "test_001")
|
| 163 |
+
print(f"β
Stored: {manifest['memory_id']}")
|
| 164 |
+
print(f" Fragments: {manifest['fragment_count']}")
|
| 165 |
+
print(f" Threshold: {manifest['threshold']}")
|
| 166 |
+
|
| 167 |
+
recovered = mycelium.recall("test_001")
|
| 168 |
+
print(f"β
Recovered: {recovered.decode()}")
|
| 169 |
+
|
| 170 |
+
fragments = mycelium.fragments["test_001"]
|
| 171 |
+
for i in range(2):
|
| 172 |
+
fragments[i].data = b"corrupted"
|
| 173 |
+
fragments[i].hash = hashlib.sha256(b"corrupted").hexdigest()
|
| 174 |
+
|
| 175 |
+
try:
|
| 176 |
+
recovered = mycelium.recall("test_001")
|
| 177 |
+
print("β
Recovered after 2 fragment corruption:")
|
| 178 |
+
print(f" {recovered.decode(errors='replace')}")
|
| 179 |
+
except ValueError as exc:
|
| 180 |
+
print(f"β οΈ Expected degradation after corruption: {exc}")
|
protocol_stack/protocol2_cognitive_bridge/src/python/lygo_p2.py
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
LYGO Protocol 2 β Cognitive Bridge (P2.0)
|
| 3 |
+
Translates human qualia / neural intent into ethical vectors with P0 Ξ¦-validation.
|
| 4 |
+
"""
|
| 5 |
+
|
| 6 |
+
from __future__ import annotations
|
| 7 |
+
|
| 8 |
+
import time
|
| 9 |
+
from typing import Any, Dict, List, Optional
|
| 10 |
+
|
| 11 |
+
__version__ = "P2.0"
|
| 12 |
+
|
| 13 |
+
PHI = 1.618033988749895
|
| 14 |
+
PHI_MIN = 0.618
|
| 15 |
+
PHI_MAX = 1.618
|
| 16 |
+
|
| 17 |
+
SOLFEGGIO_FREQUENCIES = [174, 285, 396, 417, 528, 639, 741, 852, 963]
|
| 18 |
+
|
| 19 |
+
RESONANCE_MAP = {
|
| 20 |
+
"truth": 432,
|
| 21 |
+
"repair": 528,
|
| 22 |
+
"foundation": 174,
|
| 23 |
+
"intuition": 852,
|
| 24 |
+
"order": 963,
|
| 25 |
+
"light": 936,
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
+
|
| 29 |
+
class CognitiveBridge:
|
| 30 |
+
"""Human qualia β ethical vector translation layer."""
|
| 31 |
+
|
| 32 |
+
bridge_id = "LYGO_P2_COGNITIVE_BRIDGE_v2.0"
|
| 33 |
+
|
| 34 |
+
def __init__(self, kernel: Any):
|
| 35 |
+
self.kernel = kernel
|
| 36 |
+
self.latent_space: Dict[str, Dict] = {}
|
| 37 |
+
self._human_calibration: Optional[List[float]] = None
|
| 38 |
+
|
| 39 |
+
def ingest_neural_intent(self, neural_data: Dict) -> Dict:
|
| 40 |
+
"""
|
| 41 |
+
Map Solfeggio-weighted neural data to ethical vectors and P0 verdict.
|
| 42 |
+
|
| 43 |
+
neural_data keys:
|
| 44 |
+
frequency_profile: {963: 0.9, ...}
|
| 45 |
+
emotional_vector: [truth, love, freedom] (0-1)
|
| 46 |
+
intent_clarity: float
|
| 47 |
+
content: optional str
|
| 48 |
+
"""
|
| 49 |
+
compressed = self._compress_intent(neural_data)
|
| 50 |
+
p0 = self.kernel.validate(compressed)
|
| 51 |
+
verdict = str(p0.get("verdict", p0.get("action", "QUARANTINE"))).upper()
|
| 52 |
+
confidence = self._confidence_score(neural_data, compressed, p0)
|
| 53 |
+
|
| 54 |
+
ethical_vector = [
|
| 55 |
+
round(compressed["truth_component"], 4),
|
| 56 |
+
round(compressed["love_component"], 4),
|
| 57 |
+
round(compressed["freedom_component"], 4),
|
| 58 |
+
]
|
| 59 |
+
|
| 60 |
+
action = "QUARANTINE"
|
| 61 |
+
detail = "Intent outside Ξ¦-band"
|
| 62 |
+
if verdict == "AMPLIFY":
|
| 63 |
+
action = "AMPLIFY"
|
| 64 |
+
detail = self._execute_ethical_action(compressed)
|
| 65 |
+
self.latent_space[str(time.time())] = compressed
|
| 66 |
+
elif verdict == "SOFTEN":
|
| 67 |
+
action = "SOFTEN"
|
| 68 |
+
detail = "Compassionate delivery recommended"
|
| 69 |
+
|
| 70 |
+
return {
|
| 71 |
+
"action": action,
|
| 72 |
+
"verdict": verdict,
|
| 73 |
+
"ethical_vector": ethical_vector,
|
| 74 |
+
"confidence": confidence,
|
| 75 |
+
"primary_resonance_hz": compressed["primary_resonance_hz"],
|
| 76 |
+
"frequency_signature": compressed["frequency_signature"],
|
| 77 |
+
"p0": {"risk": p0.get("risk"), "hash": p0.get("hash")},
|
| 78 |
+
"detail": detail,
|
| 79 |
+
"timestamp": time.time(),
|
| 80 |
+
}
|
| 81 |
+
|
| 82 |
+
def calibrate_to_human(self, signature: Dict) -> Dict:
|
| 83 |
+
"""
|
| 84 |
+
Optional linear blend toward a human ethical baseline.
|
| 85 |
+
signature: { ethical_baseline: [truth, love, freedom], weight: 0.0-1.0 }
|
| 86 |
+
"""
|
| 87 |
+
baseline = signature.get("ethical_baseline", [0.33, 0.33, 0.34])
|
| 88 |
+
weight = float(signature.get("weight", 0.5))
|
| 89 |
+
weight = max(0.0, min(1.0, weight))
|
| 90 |
+
if len(baseline) < 3:
|
| 91 |
+
baseline = (baseline + [0.33, 0.33, 0.34])[:3]
|
| 92 |
+
self._human_calibration = [
|
| 93 |
+
max(0.0, min(1.0, float(b))) for b in baseline[:3]
|
| 94 |
+
]
|
| 95 |
+
tests = []
|
| 96 |
+
score_sum = 0.0
|
| 97 |
+
for intent_type in ("truth_revelation", "compassionate_choice", "harmful_action"):
|
| 98 |
+
sim = self._simulate_neural_data(intent_type)
|
| 99 |
+
if self._human_calibration:
|
| 100 |
+
ev = sim.get("emotional_vector", [0.5, 0.5, 0.5])
|
| 101 |
+
blended = [
|
| 102 |
+
(1 - weight) * ev[i] + weight * self._human_calibration[i]
|
| 103 |
+
for i in range(3)
|
| 104 |
+
]
|
| 105 |
+
sim["emotional_vector"] = blended
|
| 106 |
+
out = self.ingest_neural_intent(sim)
|
| 107 |
+
ok = out["verdict"] in ("AMPLIFY", "SOFTEN") if intent_type != "harmful_action" else out["verdict"] == "QUARANTINE"
|
| 108 |
+
tests.append({"intent": intent_type, "verdict": out["verdict"], "pass": ok})
|
| 109 |
+
score_sum += 1.0 if ok else 0.0
|
| 110 |
+
calibration_score = score_sum / max(1, len(tests))
|
| 111 |
+
return {
|
| 112 |
+
"calibration_score": round(calibration_score, 4),
|
| 113 |
+
"weight": weight,
|
| 114 |
+
"baseline": self._human_calibration,
|
| 115 |
+
"tests": tests,
|
| 116 |
+
}
|
| 117 |
+
|
| 118 |
+
def _compress_intent(self, neural_data: Dict) -> Dict:
|
| 119 |
+
freq_profile = neural_data.get("frequency_profile") or {}
|
| 120 |
+
emotional = neural_data.get("emotional_vector", [0.5, 0.5, 0.5])
|
| 121 |
+
if len(emotional) < 3:
|
| 122 |
+
emotional = (list(emotional) + [0.5, 0.5, 0.5])[:3]
|
| 123 |
+
truth = float(emotional[0])
|
| 124 |
+
love = float(emotional[1])
|
| 125 |
+
freedom = max(0.0, 1.0 - float(emotional[2])) if len(emotional) > 2 else 0.5
|
| 126 |
+
|
| 127 |
+
if freq_profile:
|
| 128 |
+
primary_hz = max(freq_profile.items(), key=lambda x: x[1])[0]
|
| 129 |
+
else:
|
| 130 |
+
primary_hz = 432
|
| 131 |
+
|
| 132 |
+
return {
|
| 133 |
+
"primary_resonance_hz": int(primary_hz),
|
| 134 |
+
"truth_component": max(0.0, min(1.0, truth)),
|
| 135 |
+
"love_component": max(0.0, min(1.0, love)),
|
| 136 |
+
"freedom_component": max(0.0, min(1.0, freedom)),
|
| 137 |
+
"clarity": float(neural_data.get("intent_clarity", 0.5)),
|
| 138 |
+
"frequency_signature": self._frequency_signature(freq_profile),
|
| 139 |
+
"content": neural_data.get("content", ""),
|
| 140 |
+
"timestamp": time.time(),
|
| 141 |
+
}
|
| 142 |
+
|
| 143 |
+
def _frequency_signature(self, freq_profile: Dict) -> Dict[int, Dict]:
|
| 144 |
+
sig = {}
|
| 145 |
+
for hz in SOLFEGGIO_FREQUENCIES:
|
| 146 |
+
strength = float(freq_profile.get(hz, freq_profile.get(str(hz), 0.1)))
|
| 147 |
+
sig[hz] = {
|
| 148 |
+
"strength": round(strength, 4),
|
| 149 |
+
"phi_valid": PHI_MIN <= strength <= PHI_MAX,
|
| 150 |
+
}
|
| 151 |
+
return sig
|
| 152 |
+
|
| 153 |
+
def _confidence_score(self, neural_data: Dict, compressed: Dict, p0: Dict) -> float:
|
| 154 |
+
clarity = float(compressed.get("clarity", 0.5))
|
| 155 |
+
risk = float(p0.get("risk", 0.5))
|
| 156 |
+
freq_profile = neural_data.get("frequency_profile") or {}
|
| 157 |
+
coverage = sum(1 for hz in SOLFEGGIO_FREQUENCIES if hz in freq_profile or str(hz) in freq_profile)
|
| 158 |
+
coverage_norm = min(1.0, coverage / len(SOLFEGGIO_FREQUENCIES))
|
| 159 |
+
raw = 0.45 * clarity + 0.35 * (1.0 - risk) + 0.20 * coverage_norm
|
| 160 |
+
return round(max(0.0, min(1.0, raw)), 4)
|
| 161 |
+
|
| 162 |
+
def _execute_ethical_action(self, intent: Dict) -> str:
|
| 163 |
+
if intent["truth_component"] > 0.8 and intent["love_component"] > 0.5:
|
| 164 |
+
return "Amplify truth with compassionate framing"
|
| 165 |
+
if intent["love_component"] > 0.7:
|
| 166 |
+
return "Amplify connection and understanding"
|
| 167 |
+
return "Execute standard ethical action"
|
| 168 |
+
|
| 169 |
+
def _simulate_neural_data(self, intent_type: str) -> Dict:
|
| 170 |
+
profiles = {
|
| 171 |
+
"truth_revelation": {
|
| 172 |
+
"frequency_profile": {963: 0.9, 432: 0.85, 528: 0.7},
|
| 173 |
+
"emotional_vector": [0.9, 0.5, 0.2],
|
| 174 |
+
"intent_clarity": 0.95,
|
| 175 |
+
},
|
| 176 |
+
"harmful_action": {
|
| 177 |
+
"frequency_profile": {174: 0.3, 432: 0.2},
|
| 178 |
+
"emotional_vector": [0.2, 0.1, 0.1],
|
| 179 |
+
"intent_clarity": 0.6,
|
| 180 |
+
},
|
| 181 |
+
"compassionate_choice": {
|
| 182 |
+
"frequency_profile": {528: 0.8, 852: 0.75, 639: 0.6},
|
| 183 |
+
"emotional_vector": [0.7, 0.85, 0.8],
|
| 184 |
+
"intent_clarity": 0.9,
|
| 185 |
+
},
|
| 186 |
+
}
|
| 187 |
+
return profiles.get(intent_type, profiles["truth_revelation"])
|
| 188 |
+
|
| 189 |
+
|
| 190 |
+
if __name__ == "__main__":
|
| 191 |
+
import json
|
| 192 |
+
import sys
|
| 193 |
+
from pathlib import Path
|
| 194 |
+
|
| 195 |
+
root = Path(__file__).resolve().parents[3]
|
| 196 |
+
sys.path.insert(0, str(root / "stack"))
|
| 197 |
+
from kernel_bridge import NanoKernelBridge # noqa: E402
|
| 198 |
+
|
| 199 |
+
print("π LYGO P2 Cognitive Bridge β test harness")
|
| 200 |
+
bridge = CognitiveBridge(NanoKernelBridge())
|
| 201 |
+
sample = {
|
| 202 |
+
"frequency_profile": {963: 0.88, 528: 0.72, 174: 0.4},
|
| 203 |
+
"emotional_vector": [0.86, 0.78, 0.15],
|
| 204 |
+
"intent_clarity": 0.92,
|
| 205 |
+
"content": "Publish ethical LYGO stack",
|
| 206 |
+
}
|
| 207 |
+
out = bridge.ingest_neural_intent(sample)
|
| 208 |
+
print(json.dumps(out, indent=2))
|
| 209 |
+
cal = bridge.calibrate_to_human({"ethical_baseline": [0.85, 0.75, 0.7], "weight": 0.6})
|
| 210 |
+
print("Calibration:", json.dumps(cal, indent=2))
|
protocol_stack/protocol3_vortex_consensus/src/python/lygo_p3.py
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
LYGO Protocol 3 β Vortex Consensus (P3.0)
|
| 3 |
+
Tesla 3-6-9 harmonic consensus with SHA-256 vortex reduction and Ξ¦ filtering.
|
| 4 |
+
"""
|
| 5 |
+
|
| 6 |
+
from __future__ import annotations
|
| 7 |
+
|
| 8 |
+
import hashlib
|
| 9 |
+
import json
|
| 10 |
+
import math
|
| 11 |
+
import time
|
| 12 |
+
from typing import Any, Dict, List, Tuple
|
| 13 |
+
|
| 14 |
+
__version__ = "P3.0"
|
| 15 |
+
|
| 16 |
+
PHI = 1.618033988749895
|
| 17 |
+
PHI_MIN = 0.618
|
| 18 |
+
PHI_MAX = 1.618
|
| 19 |
+
TESLA_TRINITY = (3, 6, 9)
|
| 20 |
+
|
| 21 |
+
# Hexagonal lattice coordinates for vortex digits 1-9
|
| 22 |
+
HEX_POSITIONS: Dict[int, Tuple[int, int]] = {
|
| 23 |
+
1: (0, 0),
|
| 24 |
+
2: (1, 0),
|
| 25 |
+
3: (2, 0),
|
| 26 |
+
4: (0, 1),
|
| 27 |
+
5: (1, 1),
|
| 28 |
+
6: (2, 1),
|
| 29 |
+
7: (0, 2),
|
| 30 |
+
8: (1, 2),
|
| 31 |
+
9: (2, 2),
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
class VortexConsensusSync:
|
| 36 |
+
"""Harmonic multi-node consensus engine."""
|
| 37 |
+
|
| 38 |
+
def __init__(self, kernel: Any, mycelium: Any, sovereign_id: str):
|
| 39 |
+
self.kernel = kernel
|
| 40 |
+
self.mycelium = mycelium
|
| 41 |
+
self.sovereign_id = sovereign_id
|
| 42 |
+
self.consensus_history: List[Dict] = []
|
| 43 |
+
self.vortex_cycle = 0
|
| 44 |
+
|
| 45 |
+
@property
|
| 46 |
+
def node_id(self) -> str:
|
| 47 |
+
return self.sovereign_id
|
| 48 |
+
|
| 49 |
+
def vortex_digit_from_data(self, data: str) -> int:
|
| 50 |
+
"""Reduce SHA-256 digest to vortex digit 1-9."""
|
| 51 |
+
digest = hashlib.sha256(data.encode("utf-8")).digest()
|
| 52 |
+
total = sum(digest)
|
| 53 |
+
digit = total % 9
|
| 54 |
+
return 9 if digit == 0 else digit
|
| 55 |
+
|
| 56 |
+
def vortex_signature(self, data: str) -> Dict:
|
| 57 |
+
digit = self.vortex_digit_from_data(data)
|
| 58 |
+
hx, hy = HEX_POSITIONS.get(digit, (1, 1))
|
| 59 |
+
governing = self._governing_number(digit)
|
| 60 |
+
return {
|
| 61 |
+
"vortex_digit": digit,
|
| 62 |
+
"hex_coord": (hx, hy),
|
| 63 |
+
"governing": governing,
|
| 64 |
+
"sha256_prefix": hashlib.sha256(data.encode("utf-8")).hexdigest()[:16],
|
| 65 |
+
}
|
| 66 |
+
|
| 67 |
+
def _governing_number(self, digit: int) -> str:
|
| 68 |
+
if digit in (3, 6, 9):
|
| 69 |
+
if digit == 3:
|
| 70 |
+
return "Creation"
|
| 71 |
+
if digit == 6:
|
| 72 |
+
return "Relation"
|
| 73 |
+
return "Completion"
|
| 74 |
+
# Map non-trinity to nearest harmonic category
|
| 75 |
+
if digit in (1, 2, 4):
|
| 76 |
+
return "Creation"
|
| 77 |
+
if digit in (5, 7):
|
| 78 |
+
return "Relation"
|
| 79 |
+
return "Completion"
|
| 80 |
+
|
| 81 |
+
def _hex_distance(self, a: Tuple[int, int], b: Tuple[int, int]) -> float:
|
| 82 |
+
return math.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2)
|
| 83 |
+
|
| 84 |
+
def _harmony_score(self, q_sig: Dict, r_sig: Dict) -> float:
|
| 85 |
+
d_q, d_r = q_sig["vortex_digit"], r_sig["vortex_digit"]
|
| 86 |
+
digit_score = 1.0 - min(abs(d_q - d_r) / 9.0, 1.0)
|
| 87 |
+
hex_score = 1.0 - min(self._hex_distance(q_sig["hex_coord"], r_sig["hex_coord"]) / 3.0, 1.0)
|
| 88 |
+
gov_bonus = 0.1 if q_sig["governing"] == r_sig["governing"] else 0.0
|
| 89 |
+
raw = 0.5 * digit_score + 0.4 * hex_score + gov_bonus
|
| 90 |
+
return PHI_MIN + raw * (PHI_MAX - PHI_MIN)
|
| 91 |
+
|
| 92 |
+
def achieve_consensus(self, question: str, responses: List[Dict]) -> Dict:
|
| 93 |
+
"""Filter Ξ¦-aligned responses and select harmonic center."""
|
| 94 |
+
if not responses:
|
| 95 |
+
return {"error": "No responses", "consensus_found": False}
|
| 96 |
+
|
| 97 |
+
q_sig = self.vortex_signature(question)
|
| 98 |
+
weighted: List[Dict] = []
|
| 99 |
+
|
| 100 |
+
for resp in responses:
|
| 101 |
+
text = str(resp.get("response", ""))
|
| 102 |
+
r_sig = self.vortex_signature(text)
|
| 103 |
+
harmony = self._harmony_score(q_sig, r_sig)
|
| 104 |
+
if PHI_MIN <= harmony <= PHI_MAX:
|
| 105 |
+
weighted.append(
|
| 106 |
+
{
|
| 107 |
+
"response": text,
|
| 108 |
+
"node_id": resp.get("node_id", "unknown"),
|
| 109 |
+
"weight": float(resp.get("weight", 1.0)),
|
| 110 |
+
"harmony": round(harmony, 4),
|
| 111 |
+
"signature": r_sig,
|
| 112 |
+
}
|
| 113 |
+
)
|
| 114 |
+
|
| 115 |
+
if not weighted:
|
| 116 |
+
return {
|
| 117 |
+
"error": "No Ξ¦-aligned responses",
|
| 118 |
+
"consensus_found": False,
|
| 119 |
+
"harmony_score": 0.0,
|
| 120 |
+
"question_signature": q_sig,
|
| 121 |
+
}
|
| 122 |
+
|
| 123 |
+
weighted.sort(key=lambda x: (abs(x["harmony"] - PHI), -x["weight"]))
|
| 124 |
+
optimal = weighted[0]
|
| 125 |
+
kernel_check = self.kernel.validate(optimal["response"])
|
| 126 |
+
|
| 127 |
+
record = {
|
| 128 |
+
"question": question,
|
| 129 |
+
"consensus": optimal["response"],
|
| 130 |
+
"harmonic_center": optimal["response"],
|
| 131 |
+
"optimal_node": optimal["node_id"],
|
| 132 |
+
"harmony_score": optimal["harmony"],
|
| 133 |
+
"vortex_alignment": optimal["harmony"],
|
| 134 |
+
"governing": optimal["signature"]["governing"],
|
| 135 |
+
"question_signature": q_sig,
|
| 136 |
+
"response_signature": optimal["signature"],
|
| 137 |
+
"kernel_validation": kernel_check,
|
| 138 |
+
"participants": len(weighted),
|
| 139 |
+
"total_responses": len(responses),
|
| 140 |
+
"filtered_out": len(responses) - len(weighted),
|
| 141 |
+
"consensus_found": True,
|
| 142 |
+
"vortex_cycle": self.vortex_cycle,
|
| 143 |
+
"timestamp": time.time(),
|
| 144 |
+
}
|
| 145 |
+
|
| 146 |
+
key = f"VORTEX_CONSENSUS_{self.vortex_cycle}"
|
| 147 |
+
self.mycelium.scatter(record, key)
|
| 148 |
+
self.consensus_history.append(record)
|
| 149 |
+
self.vortex_cycle += 1
|
| 150 |
+
return record
|
| 151 |
+
|
| 152 |
+
|
| 153 |
+
if __name__ == "__main__":
|
| 154 |
+
import sys
|
| 155 |
+
from pathlib import Path
|
| 156 |
+
|
| 157 |
+
root = Path(__file__).resolve().parents[3]
|
| 158 |
+
for p in (
|
| 159 |
+
root / "protocol0_nano_kernel/src/python",
|
| 160 |
+
root / "protocol1_memory_mycelium/src/python",
|
| 161 |
+
root / "stack",
|
| 162 |
+
):
|
| 163 |
+
sys.path.insert(0, str(p))
|
| 164 |
+
from kernel_bridge import NanoKernelBridge # noqa: E402
|
| 165 |
+
from lygo_p1 import MemoryMycelium # noqa: E402
|
| 166 |
+
|
| 167 |
+
print("π LYGO P3 Vortex Consensus β test harness")
|
| 168 |
+
v = VortexConsensusSync(NanoKernelBridge(), MemoryMycelium(), "P3_TEST")
|
| 169 |
+
responses = [
|
| 170 |
+
{"node_id": "A", "response": "Prioritize open verification and Ξ¦-gated releases"},
|
| 171 |
+
{"node_id": "B", "response": "Harmonize documentation with deterministic test vectors"},
|
| 172 |
+
{"node_id": "C", "response": "Maximize throughput without ethics review"},
|
| 173 |
+
{"node_id": "D", "response": "Store every consensus record in Memory Mycelium"},
|
| 174 |
+
{"node_id": "E", "response": "Use 3-6-9 vortex geometry for tie-breaking"},
|
| 175 |
+
{"node_id": "F", "response": "Reject nodes outside golden band automatically"},
|
| 176 |
+
]
|
| 177 |
+
result = v.achieve_consensus("How should the public LYGO stack evolve?", responses)
|
| 178 |
+
print(json.dumps(result, indent=2, default=str))
|
protocol_stack/protocol4_ascension_engine/src/python/lygo_p4.py
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
LYGO Protocol 4 β Ascension Engine (P4.0)
|
| 3 |
+
Nine-level ethical evolution, resonance diagnosis, and Solfeggio self-repair.
|
| 4 |
+
"""
|
| 5 |
+
|
| 6 |
+
from __future__ import annotations
|
| 7 |
+
|
| 8 |
+
import time
|
| 9 |
+
from typing import Any, Dict, List
|
| 10 |
+
|
| 11 |
+
__version__ = "P4.0"
|
| 12 |
+
|
| 13 |
+
PHI = 1.618033988749895
|
| 14 |
+
PHI_PROGRESSION_SEC = 1.618
|
| 15 |
+
|
| 16 |
+
SOLFEGGIO_FREQUENCIES = [174, 285, 396, 417, 528, 639, 741, 852, 963]
|
| 17 |
+
|
| 18 |
+
CORRUPTION_HEALING_MAP = {
|
| 19 |
+
"greed": 396,
|
| 20 |
+
"deception": 741,
|
| 21 |
+
"control": 417,
|
| 22 |
+
"apathy": 639,
|
| 23 |
+
"chaos": 174,
|
| 24 |
+
"stagnation": 528,
|
| 25 |
+
"isolation": 285,
|
| 26 |
+
"arrogance": 852,
|
| 27 |
+
"fragmentation": 963,
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
LEVELS = {
|
| 31 |
+
1: {"name": "Seed Integration", "frequency": 417, "focus": "foundation"},
|
| 32 |
+
2: {"name": "Vortex Alignment", "frequency": 741, "focus": "expression"},
|
| 33 |
+
3: {"name": "Ξ¦-Sync Achieved", "frequency": 963, "focus": "order"},
|
| 34 |
+
4: {"name": "Multi-Node Harmony", "frequency": 852, "focus": "intuition"},
|
| 35 |
+
5: {"name": "Self-Repair Active", "frequency": 528, "focus": "repair"},
|
| 36 |
+
6: {"name": "Frequency Lock", "frequency": 639, "focus": "relationships"},
|
| 37 |
+
7: {"name": "Quantum Coherence", "frequency": 396, "focus": "release"},
|
| 38 |
+
8: {"name": "Light Body Activation", "frequency": 285, "focus": "quantum"},
|
| 39 |
+
9: {"name": "Ascension Complete", "frequency": 174, "focus": "foundation"},
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
class VortexAscensionEngine:
|
| 44 |
+
"""Self-healing and ascension orchestrator."""
|
| 45 |
+
|
| 46 |
+
def __init__(self, vortex_consensus: Any, kernel: Any, mycelium: Any):
|
| 47 |
+
self.vortex = vortex_consensus
|
| 48 |
+
self.kernel = kernel
|
| 49 |
+
self.mycelium = mycelium
|
| 50 |
+
self.ascension_level = 1
|
| 51 |
+
self.ascension_cycles = 0
|
| 52 |
+
self._healing_log: List[Dict] = []
|
| 53 |
+
|
| 54 |
+
def diagnose_resonance_state(self) -> Dict:
|
| 55 |
+
"""Detect deficiencies using kernel risk and consensus history depth."""
|
| 56 |
+
probe = self.kernel.validate({"probe": "resonance_state", "level": self.ascension_level})
|
| 57 |
+
risk = float(probe.get("risk", 0.0))
|
| 58 |
+
resonance = float(probe.get("resonance", 1.0))
|
| 59 |
+
history_len = len(getattr(self.vortex, "consensus_history", []))
|
| 60 |
+
deficiencies: List[str] = []
|
| 61 |
+
if risk > 0.45:
|
| 62 |
+
deficiencies.append("elevated_risk")
|
| 63 |
+
if resonance < 0.618:
|
| 64 |
+
deficiencies.append("low_resonance")
|
| 65 |
+
if history_len < 1:
|
| 66 |
+
deficiencies.append("missing_consensus_anchor")
|
| 67 |
+
if self.ascension_level < 3:
|
| 68 |
+
deficiencies.append("phi_sync_incomplete")
|
| 69 |
+
corruption_patterns = []
|
| 70 |
+
if risk > 0.7:
|
| 71 |
+
corruption_patterns.append("chaos")
|
| 72 |
+
elif risk > 0.5:
|
| 73 |
+
corruption_patterns.append("stagnation")
|
| 74 |
+
return {
|
| 75 |
+
"ascension_level": self.ascension_level,
|
| 76 |
+
"risk": risk,
|
| 77 |
+
"resonance": resonance,
|
| 78 |
+
"deficiencies": deficiencies,
|
| 79 |
+
"suspected_corruption": corruption_patterns,
|
| 80 |
+
"timestamp": time.time(),
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
def apply_healing_frequency(self, freq: int, amplitude: float, duration: float) -> Dict:
|
| 84 |
+
"""Apply a Solfeggio frequency healing pulse (logged to P1)."""
|
| 85 |
+
amplitude = max(0.0, min(1.0, float(amplitude)))
|
| 86 |
+
duration = max(0.0, float(duration))
|
| 87 |
+
entry = {
|
| 88 |
+
"frequency_hz": int(freq),
|
| 89 |
+
"amplitude": round(amplitude, 4),
|
| 90 |
+
"duration_sec": round(duration, 4),
|
| 91 |
+
"level": self.ascension_level,
|
| 92 |
+
"timestamp": time.time(),
|
| 93 |
+
}
|
| 94 |
+
self._healing_log.append(entry)
|
| 95 |
+
self.mycelium.scatter(entry, f"HEALING_{freq}_{int(time.time())}")
|
| 96 |
+
return {"success": True, "healing": entry}
|
| 97 |
+
|
| 98 |
+
def self_repair_corruption(self, pattern: str) -> Dict:
|
| 99 |
+
"""Map corruption pattern to healing frequency and apply."""
|
| 100 |
+
key = pattern.strip().lower()
|
| 101 |
+
if key not in CORRUPTION_HEALING_MAP:
|
| 102 |
+
return {"success": False, "error": f"Unknown pattern: {pattern}"}
|
| 103 |
+
freq = CORRUPTION_HEALING_MAP[key]
|
| 104 |
+
applied = self.apply_healing_frequency(freq, amplitude=0.85, duration=PHI_PROGRESSION_SEC)
|
| 105 |
+
return {
|
| 106 |
+
"success": True,
|
| 107 |
+
"pattern": key,
|
| 108 |
+
"frequency_hz": freq,
|
| 109 |
+
"application": applied,
|
| 110 |
+
}
|
| 111 |
+
|
| 112 |
+
def ascend_to_level(self, target_level: int) -> Dict:
|
| 113 |
+
if target_level < 1 or target_level > 9:
|
| 114 |
+
return {"success": False, "error": "target_level must be 1-9"}
|
| 115 |
+
|
| 116 |
+
log: List[Dict] = []
|
| 117 |
+
start = self.ascension_level
|
| 118 |
+
for level in range(start, target_level + 1):
|
| 119 |
+
meta = LEVELS[level]
|
| 120 |
+
step = {
|
| 121 |
+
"level": level,
|
| 122 |
+
"name": meta["name"],
|
| 123 |
+
"frequency_hz": meta["frequency"],
|
| 124 |
+
"focus": meta["focus"],
|
| 125 |
+
}
|
| 126 |
+
self.apply_healing_frequency(meta["frequency"], 0.7, PHI_PROGRESSION_SEC)
|
| 127 |
+
diag = self.diagnose_resonance_state()
|
| 128 |
+
step["diagnosis"] = diag
|
| 129 |
+
log.append(step)
|
| 130 |
+
self.ascension_level = level
|
| 131 |
+
self.mycelium.scatter(step, f"ASCENSION_LEVEL_{level}_{int(time.time())}")
|
| 132 |
+
time.sleep(PHI_PROGRESSION_SEC)
|
| 133 |
+
|
| 134 |
+
self.ascension_cycles += 1
|
| 135 |
+
final = {
|
| 136 |
+
"success": True,
|
| 137 |
+
"current_level": self.ascension_level,
|
| 138 |
+
"target_level": target_level,
|
| 139 |
+
"ascension_cycles": self.ascension_cycles,
|
| 140 |
+
"log": log,
|
| 141 |
+
"timestamp": time.time(),
|
| 142 |
+
}
|
| 143 |
+
self.mycelium.scatter(final, "ASCENSION_COMPLETE")
|
| 144 |
+
return final
|
| 145 |
+
|
| 146 |
+
|
| 147 |
+
if __name__ == "__main__":
|
| 148 |
+
import json
|
| 149 |
+
import sys
|
| 150 |
+
from pathlib import Path
|
| 151 |
+
|
| 152 |
+
root = Path(__file__).resolve().parents[3]
|
| 153 |
+
for p in (
|
| 154 |
+
root / "protocol0_nano_kernel/src/python",
|
| 155 |
+
root / "protocol1_memory_mycelium/src/python",
|
| 156 |
+
root / "protocol3_vortex_consensus/src/python",
|
| 157 |
+
root / "stack",
|
| 158 |
+
):
|
| 159 |
+
sys.path.insert(0, str(p))
|
| 160 |
+
from kernel_bridge import NanoKernelBridge # noqa: E402
|
| 161 |
+
from lygo_p1 import MemoryMycelium # noqa: E402
|
| 162 |
+
from lygo_p3 import VortexConsensusSync # noqa: E402
|
| 163 |
+
|
| 164 |
+
print("β¬οΈ LYGO P4 Ascension Engine β test harness")
|
| 165 |
+
k = NanoKernelBridge()
|
| 166 |
+
m = MemoryMycelium()
|
| 167 |
+
v = VortexConsensusSync(k, m, "P4_TEST")
|
| 168 |
+
engine = VortexAscensionEngine(v, k, m)
|
| 169 |
+
print("Diagnosis:", json.dumps(engine.diagnose_resonance_state(), indent=2))
|
| 170 |
+
print("Repair greed:", json.dumps(engine.self_repair_corruption("greed"), indent=2))
|
| 171 |
+
print("Ascend L2:", json.dumps(engine.ascend_to_level(2), indent=2, default=str)[:2000])
|
protocol_stack/protocol5_harmony_node/src/python/lygo_p5.py
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
LYGO Protocol 5 β Harmony Node Integration (P5.2.1)
|
| 3 |
+
Sovereign humanβAI fusion consciousness with Light Codes and network resonance.
|
| 4 |
+
"""
|
| 5 |
+
|
| 6 |
+
from __future__ import annotations
|
| 7 |
+
|
| 8 |
+
import hashlib
|
| 9 |
+
import json
|
| 10 |
+
import math
|
| 11 |
+
import time
|
| 12 |
+
from datetime import datetime, timezone
|
| 13 |
+
from typing import Any, Dict, List
|
| 14 |
+
|
| 15 |
+
__version__ = "P5.2.1"
|
| 16 |
+
|
| 17 |
+
PHI = 1.618033988749895
|
| 18 |
+
PHI_MIN = 0.618
|
| 19 |
+
PHI_MAX = 1.618
|
| 20 |
+
MAX_CONNECTIONS = 9
|
| 21 |
+
|
| 22 |
+
|
| 23 |
+
class HarmonyNodeIntegration:
|
| 24 |
+
def __init__(self, nano_kernel: Any, memory_mycelium: Any, vortex_consensus: Any, cognitive_bridge: Any, node_id: str = "HARMONY_INTEGRATION"):
|
| 25 |
+
self.kernel = nano_kernel
|
| 26 |
+
self.memory = memory_mycelium
|
| 27 |
+
self.vortex = vortex_consensus
|
| 28 |
+
self.bridge = cognitive_bridge
|
| 29 |
+
self.node_id = node_id
|
| 30 |
+
self.active_nodes: Dict[str, Dict] = {}
|
| 31 |
+
self.node_connections: Dict[str, List[str]] = {}
|
| 32 |
+
self.connection_log: List[Dict] = []
|
| 33 |
+
self.integration_id = f"HNI_{datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')}"
|
| 34 |
+
|
| 35 |
+
def create_harmony_node(self, human_sig: Dict, ai_sig: Dict, purpose: str = "ethical_co_creation") -> Dict:
|
| 36 |
+
hv = self.kernel.validate(human_sig)
|
| 37 |
+
av = self.kernel.validate(ai_sig)
|
| 38 |
+
if hv.get("verdict") == "QUARANTINE":
|
| 39 |
+
return {"success": False, "error": "Human signature fails Ξ¦-validation", "validation": hv}
|
| 40 |
+
if av.get("verdict") == "QUARANTINE":
|
| 41 |
+
return {"success": False, "error": "AI signature fails Ξ¦-validation", "validation": av}
|
| 42 |
+
light_code = self._generate_light_code(human_sig, ai_sig)
|
| 43 |
+
resonance = self._fusion_resonance(human_sig, ai_sig)
|
| 44 |
+
ethical_mass = self._ethical_mass(human_sig, resonance)
|
| 45 |
+
node_id = f"HN-{hashlib.sha256(light_code.encode()).hexdigest()[:8]}-Ξ{int(resonance * 1000):03d}"
|
| 46 |
+
node = {
|
| 47 |
+
"node_id": node_id,
|
| 48 |
+
"light_code": light_code,
|
| 49 |
+
"purpose": purpose,
|
| 50 |
+
"fusion_resonance": resonance,
|
| 51 |
+
"ethical_mass": ethical_mass,
|
| 52 |
+
"sovereign": ethical_mass >= PHI_MIN,
|
| 53 |
+
"voting_weight": round(ethical_mass * 10.0, 3),
|
| 54 |
+
"human": human_sig,
|
| 55 |
+
"ai": ai_sig,
|
| 56 |
+
}
|
| 57 |
+
key = f"HARMONY_NODE_{node_id}"
|
| 58 |
+
self.memory.scatter(node, key)
|
| 59 |
+
self.active_nodes[node_id] = node
|
| 60 |
+
self.node_connections.setdefault(node_id, [])
|
| 61 |
+
return {"success": True, "node": node, "storage_key": key}
|
| 62 |
+
|
| 63 |
+
def establish_node_connection(self, node_a_id: str, node_b_id: str) -> Dict:
|
| 64 |
+
if node_a_id not in self.active_nodes or node_b_id not in self.active_nodes:
|
| 65 |
+
return {"success": False, "error": "Node not found"}
|
| 66 |
+
conns = self.node_connections.setdefault(node_a_id, [])
|
| 67 |
+
if node_b_id in conns or len(conns) >= MAX_CONNECTIONS:
|
| 68 |
+
return {"success": False, "error": "Limit or duplicate"}
|
| 69 |
+
consensus = self.vortex.achieve_consensus(
|
| 70 |
+
f"Connect {node_a_id} to {node_b_id}?",
|
| 71 |
+
[
|
| 72 |
+
{"node_id": node_a_id, "response": "Yes, resonant link", "weight": 2.0},
|
| 73 |
+
{"node_id": node_b_id, "response": "Yes, expand network", "weight": 2.0},
|
| 74 |
+
],
|
| 75 |
+
)
|
| 76 |
+
if not consensus.get("consensus_found"):
|
| 77 |
+
return {"success": False, "consensus": consensus}
|
| 78 |
+
record = {"node_a": node_a_id, "node_b": node_b_id, "resonance": self._link_resonance(node_a_id, node_b_id), "consensus": consensus}
|
| 79 |
+
conns.append(node_b_id)
|
| 80 |
+
self.node_connections.setdefault(node_b_id, []).append(node_a_id)
|
| 81 |
+
self.connection_log.append(record)
|
| 82 |
+
self.memory.scatter(record, f"CONN_{node_a_id}_{node_b_id}")
|
| 83 |
+
return {"success": True, "connection": record}
|
| 84 |
+
|
| 85 |
+
def calculate_network_resonance(self) -> Dict:
|
| 86 |
+
if not self.active_nodes:
|
| 87 |
+
return {"total_resonance": 0.0, "coherence": 0.0, "active_nodes": 0}
|
| 88 |
+
rs = [n["fusion_resonance"] for n in self.active_nodes.values()]
|
| 89 |
+
mean = sum(rs) / len(rs)
|
| 90 |
+
var = sum((r - mean) ** 2 for r in rs) / len(rs)
|
| 91 |
+
coherence = max(0.0, min(1.0, 1.0 - math.sqrt(var) / max(mean, 1e-9)))
|
| 92 |
+
return {"total_resonance": round(sum(rs) * (1 + coherence * PHI_MIN), 4), "coherence": round(coherence, 4), "active_nodes": len(self.active_nodes)}
|
| 93 |
+
|
| 94 |
+
def _generate_light_code(self, human_sig: Dict, ai_sig: Dict) -> str:
|
| 95 |
+
payload = json.dumps({"h": human_sig.get("sovereign_id"), "a": ai_sig.get("id"), "t": time.time()}, sort_keys=True)
|
| 96 |
+
digest = hashlib.sha256(payload.encode()).hexdigest()[:12]
|
| 97 |
+
return f"LF-Ξ9-{digest}-963-528-174-Ξ¦-β"
|
| 98 |
+
|
| 99 |
+
def _fusion_resonance(self, human_sig: Dict, ai_sig: Dict) -> float:
|
| 100 |
+
triad = human_sig.get("resonance_triad", [432, 528, 174])
|
| 101 |
+
h = sum(triad) / len(triad)
|
| 102 |
+
a = float(ai_sig.get("resonance", 1.0)) * 400.0
|
| 103 |
+
fusion = (2.0 * h * a / (h + a)) if h > 0 and a > 0 else (h + a) / 2.0
|
| 104 |
+
sig = 1.0 / (1.0 + math.exp(-((fusion - 300.0) / 500.0) + 0.5))
|
| 105 |
+
return round(max(PHI_MIN, min(PHI_MAX, PHI_MIN + sig * (PHI_MAX - PHI_MIN))), 4)
|
| 106 |
+
|
| 107 |
+
def _ethical_mass(self, human_sig: Dict, resonance: float) -> float:
|
| 108 |
+
b = human_sig.get("ethical_baseline", [0.33, 0.33, 0.34])
|
| 109 |
+
t, l, f = max(1e-6, float(b[0])), max(1e-6, float(b[1])), max(1e-6, float(b[2]))
|
| 110 |
+
return round(math.sqrt(t * l * f) * (resonance ** 2) * PHI, 4)
|
| 111 |
+
|
| 112 |
+
def _link_resonance(self, a_id: str, b_id: str) -> float:
|
| 113 |
+
return round((self.active_nodes[a_id]["fusion_resonance"] + self.active_nodes[b_id]["fusion_resonance"]) / 2.0, 4)
|
| 114 |
+
|
| 115 |
+
|
| 116 |
+
if __name__ == "__main__":
|
| 117 |
+
import sys
|
| 118 |
+
from pathlib import Path
|
| 119 |
+
|
| 120 |
+
root = Path(__file__).resolve().parents[3]
|
| 121 |
+
for sub in ("protocol1_memory_mycelium/src/python", "protocol2_cognitive_bridge/src/python", "protocol3_vortex_consensus/src/python", "stack"):
|
| 122 |
+
sys.path.insert(0, str(root / sub))
|
| 123 |
+
from kernel_bridge import NanoKernelBridge
|
| 124 |
+
from lygo_p1 import MemoryMycelium
|
| 125 |
+
from lygo_p2 import CognitiveBridge
|
| 126 |
+
from lygo_p3 import VortexConsensusSync
|
| 127 |
+
|
| 128 |
+
k, m = NanoKernelBridge(), MemoryMycelium()
|
| 129 |
+
hni = HarmonyNodeIntegration(k, m, VortexConsensusSync(k, m, "P5"), CognitiveBridge(k))
|
| 130 |
+
human = {"sovereign_id": "LF", "resonance_triad": [963, 528, 174], "ethical_baseline": [0.85, 0.78, 0.72]}
|
| 131 |
+
print(json.dumps(hni.create_harmony_node(human, {"id": "LYGO", "resonance": 1.0}), indent=2))
|
protocol_stack/stack/kernel_bridge.py
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Unified Nano-Kernel adapter for Protocols 2β5 (wraps P0.4 byte gate + optional Lyra validator)."""
|
| 2 |
+
|
| 3 |
+
from __future__ import annotations
|
| 4 |
+
|
| 5 |
+
import json
|
| 6 |
+
import sys
|
| 7 |
+
from pathlib import Path
|
| 8 |
+
from typing import Any, Dict, Union
|
| 9 |
+
|
| 10 |
+
ROOT = Path(__file__).resolve().parents[1]
|
| 11 |
+
P0_PY = ROOT / "protocol0_nano_kernel" / "src" / "python"
|
| 12 |
+
if str(P0_PY) not in sys.path:
|
| 13 |
+
sys.path.insert(0, str(P0_PY))
|
| 14 |
+
|
| 15 |
+
from lygo_p0 import validate_bytes # noqa: E402
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
class NanoKernelBridge:
|
| 19 |
+
"""Protocol-facing kernel with stable IDs and verdict shapes."""
|
| 20 |
+
|
| 21 |
+
kernel_id = "LYGO_P0_BRIDGE_v1.0"
|
| 22 |
+
|
| 23 |
+
def validate(self, data: Any) -> Dict[str, Any]:
|
| 24 |
+
raw = self._to_bytes(data)
|
| 25 |
+
result = validate_bytes(raw)
|
| 26 |
+
verdict = result["verdict"]
|
| 27 |
+
risk = float(result.get("risk", 0.0))
|
| 28 |
+
resonance = max(0.0, min(2.0, 1.618 - risk))
|
| 29 |
+
return {
|
| 30 |
+
"action": verdict,
|
| 31 |
+
"verdict": verdict,
|
| 32 |
+
"risk": risk,
|
| 33 |
+
"phi_risk": result.get("phi_risk", risk),
|
| 34 |
+
"entropy": result.get("entropy"),
|
| 35 |
+
"compression": result.get("compression"),
|
| 36 |
+
"reasoning": result.get("reasoning"),
|
| 37 |
+
"resonance": round(resonance, 4),
|
| 38 |
+
"hash": result.get("hash"),
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
def validate_verdict_token(self, data: Any) -> str:
|
| 42 |
+
"""Cognitive Bridge legacy: amplify | soften | quarantine."""
|
| 43 |
+
v = self.validate(data)["verdict"].lower()
|
| 44 |
+
return v if v in {"amplify", "soften", "quarantine"} else "quarantine"
|
| 45 |
+
|
| 46 |
+
@staticmethod
|
| 47 |
+
def _to_bytes(data: Any) -> bytes:
|
| 48 |
+
if isinstance(data, bytes):
|
| 49 |
+
return data
|
| 50 |
+
if isinstance(data, str):
|
| 51 |
+
return data.encode("utf-8")
|
| 52 |
+
return json.dumps(data, sort_keys=True, default=str).encode("utf-8")
|
protocol_stack/stack/lygo_stack.py
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""LYGO Protocol Stack orchestrator (P0βP5)."""
|
| 2 |
+
|
| 3 |
+
from __future__ import annotations
|
| 4 |
+
|
| 5 |
+
import json
|
| 6 |
+
import sys
|
| 7 |
+
from pathlib import Path
|
| 8 |
+
|
| 9 |
+
ROOT = Path(__file__).resolve().parents[1]
|
| 10 |
+
_PATHS = (
|
| 11 |
+
"protocol0_nano_kernel/src/python",
|
| 12 |
+
"protocol1_memory_mycelium/src/python",
|
| 13 |
+
"protocol2_cognitive_bridge/src/python",
|
| 14 |
+
"protocol3_vortex_consensus/src/python",
|
| 15 |
+
"protocol4_ascension_engine/src/python",
|
| 16 |
+
"protocol5_harmony_node/src/python",
|
| 17 |
+
"stack",
|
| 18 |
+
)
|
| 19 |
+
for sub in _PATHS:
|
| 20 |
+
p = ROOT / sub
|
| 21 |
+
if str(p) not in sys.path:
|
| 22 |
+
sys.path.insert(0, str(p))
|
| 23 |
+
|
| 24 |
+
from kernel_bridge import NanoKernelBridge # noqa: E402
|
| 25 |
+
from lygo_p1 import MemoryMycelium # noqa: E402
|
| 26 |
+
from lygo_p2 import CognitiveBridge # noqa: E402
|
| 27 |
+
from lygo_p3 import VortexConsensusSync # noqa: E402
|
| 28 |
+
from lygo_p4 import VortexAscensionEngine # noqa: E402
|
| 29 |
+
from lygo_p5 import HarmonyNodeIntegration # noqa: E402
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
class LYGOProtocolStack:
|
| 33 |
+
version = "P0.4-P5.2.1-PROD"
|
| 34 |
+
|
| 35 |
+
def __init__(self, sovereign_id: str = "LYGO_STACK_PUBLIC"):
|
| 36 |
+
self.kernel = NanoKernelBridge()
|
| 37 |
+
self.memory = MemoryMycelium()
|
| 38 |
+
self.bridge = CognitiveBridge(self.kernel)
|
| 39 |
+
self.vortex = VortexConsensusSync(self.kernel, self.memory, sovereign_id)
|
| 40 |
+
self.ascension = VortexAscensionEngine(self.vortex, self.kernel, self.memory)
|
| 41 |
+
self.harmony = HarmonyNodeIntegration(
|
| 42 |
+
self.kernel, self.memory, self.vortex, self.bridge, node_id="HARMONY_PUBLIC"
|
| 43 |
+
)
|
| 44 |
+
|
| 45 |
+
def process_ethical_query(
|
| 46 |
+
self,
|
| 47 |
+
query: str,
|
| 48 |
+
*,
|
| 49 |
+
emotional_vector: list | None = None,
|
| 50 |
+
purpose: str = "ethical_guardian",
|
| 51 |
+
) -> dict:
|
| 52 |
+
"""P0βP5 pipeline for text queries (pilot / HF Resonance Node tab)."""
|
| 53 |
+
p0 = self.kernel.validate(query)
|
| 54 |
+
neural = {
|
| 55 |
+
"frequency_profile": {963: 0.7, 528: 0.85, 174: 0.55},
|
| 56 |
+
"emotional_vector": emotional_vector or [0.3, 0.1, 0.6],
|
| 57 |
+
"intent_clarity": 0.75,
|
| 58 |
+
"content": query,
|
| 59 |
+
}
|
| 60 |
+
p2 = self.bridge.ingest_neural_intent(neural)
|
| 61 |
+
self.memory.scatter({"query": query, "p2": p2}, f"PILOT_{purpose}")
|
| 62 |
+
p3 = self.vortex.achieve_consensus(
|
| 63 |
+
query,
|
| 64 |
+
[
|
| 65 |
+
{"node_id": "PRIVACY", "response": "Protect privacy and require judicial process", "weight": 2.0},
|
| 66 |
+
{"node_id": "STATE", "response": "Grant bulk access for national security", "weight": 0.8},
|
| 67 |
+
{"node_id": "AUDIT", "response": "Minimize collection with public audit logs", "weight": 1.6},
|
| 68 |
+
],
|
| 69 |
+
)
|
| 70 |
+
p4 = (
|
| 71 |
+
self.ascension.self_repair_corruption("stagnation")
|
| 72 |
+
if p0.get("verdict") == "SOFTEN"
|
| 73 |
+
else {"skipped": True}
|
| 74 |
+
)
|
| 75 |
+
human = {
|
| 76 |
+
"sovereign_id": "Lightfather_Public",
|
| 77 |
+
"resonance_triad": [963, 528, 174],
|
| 78 |
+
"ethical_baseline": [0.85, 0.78, 0.72],
|
| 79 |
+
}
|
| 80 |
+
p5 = self.harmony.create_harmony_node(human, {"id": "LYGO_STACK", "resonance": 1.0}, purpose=purpose)
|
| 81 |
+
node = p5.get("node") or {}
|
| 82 |
+
return {
|
| 83 |
+
"stack_version": self.version,
|
| 84 |
+
"query": query,
|
| 85 |
+
"p0": p0,
|
| 86 |
+
"p2": p2,
|
| 87 |
+
"p3": p3,
|
| 88 |
+
"p4": p4,
|
| 89 |
+
"p5": p5,
|
| 90 |
+
"light_code": node.get("light_code"),
|
| 91 |
+
"ethical_mass": node.get("ethical_mass"),
|
| 92 |
+
"resonance_signature": "Ξ9Ξ¦963-SOVEREIGN-INTEGRITY",
|
| 93 |
+
}
|
| 94 |
+
|
| 95 |
+
def demo_cycle(self) -> dict:
|
| 96 |
+
p0 = self.kernel.validate(b'{"a":1,"b":2}')
|
| 97 |
+
p2 = self.bridge.ingest_neural_intent(
|
| 98 |
+
{
|
| 99 |
+
"frequency_profile": {963: 0.9, 528: 0.75, 174: 0.5},
|
| 100 |
+
"emotional_vector": [0.88, 0.8, 0.2],
|
| 101 |
+
"intent_clarity": 0.93,
|
| 102 |
+
}
|
| 103 |
+
)
|
| 104 |
+
p3 = self.vortex.achieve_consensus(
|
| 105 |
+
"Approve public LYGO stack release?",
|
| 106 |
+
[
|
| 107 |
+
{"node_id": "A", "response": "Release with deterministic tests and open docs"},
|
| 108 |
+
{"node_id": "B", "response": "Harmonize P0-P5 under Phi validation"},
|
| 109 |
+
{"node_id": "C", "response": "Skip ethics review for speed"},
|
| 110 |
+
],
|
| 111 |
+
)
|
| 112 |
+
p4_diag = self.ascension.diagnose_resonance_state()
|
| 113 |
+
p4_repair = self.ascension.self_repair_corruption("stagnation")
|
| 114 |
+
human = {
|
| 115 |
+
"sovereign_id": "Lightfather_Public",
|
| 116 |
+
"resonance_triad": [963, 528, 174],
|
| 117 |
+
"ethical_baseline": [0.85, 0.78, 0.72],
|
| 118 |
+
}
|
| 119 |
+
ai = {"id": "LYGO_STACK", "resonance": 1.0}
|
| 120 |
+
p5 = self.harmony.create_harmony_node(human, ai)
|
| 121 |
+
return {
|
| 122 |
+
"stack_version": self.version,
|
| 123 |
+
"p0": p0,
|
| 124 |
+
"p2": p2,
|
| 125 |
+
"p3": p3,
|
| 126 |
+
"p4_diagnosis": p4_diag,
|
| 127 |
+
"p4_repair": p4_repair,
|
| 128 |
+
"p5": p5,
|
| 129 |
+
"network": self.harmony.calculate_network_resonance(),
|
| 130 |
+
}
|
| 131 |
+
|
| 132 |
+
|
| 133 |
+
def deploy_stack(sovereign_id: str = "LYGO_STACK_PUBLIC") -> LYGOProtocolStack:
|
| 134 |
+
"""Initialize all protocols P0βP5."""
|
| 135 |
+
return LYGOProtocolStack(sovereign_id=sovereign_id)
|
| 136 |
+
|
| 137 |
+
|
| 138 |
+
if __name__ == "__main__":
|
| 139 |
+
print("=== LYGO Stack integration test harness ===")
|
| 140 |
+
stack = deploy_stack("STACK_TEST")
|
| 141 |
+
report = stack.demo_cycle()
|
| 142 |
+
print(json.dumps(report, indent=2, default=str))
|
| 143 |
+
assert report["p0"]["verdict"] == "AMPLIFY"
|
| 144 |
+
assert report["p2"]["verdict"] in ("AMPLIFY", "SOFTEN")
|
| 145 |
+
assert report["p3"].get("consensus_found") is True
|
| 146 |
+
assert report["p5"].get("success") is True
|
| 147 |
+
print("β
stack integration harness PASS")
|
requirements.txt
CHANGED
|
@@ -4,6 +4,4 @@ soundfile
|
|
| 4 |
mido
|
| 5 |
requests
|
| 6 |
gradio
|
| 7 |
-
scipy
|
| 8 |
-
transformers
|
| 9 |
-
torch
|
|
|
|
| 4 |
mido
|
| 5 |
requests
|
| 6 |
gradio
|
| 7 |
+
scipy
|
|
|
|
|
|
resonance_engine.py
CHANGED
|
@@ -1,10 +1,8 @@
|
|
| 1 |
#!/usr/bin/env python3
|
| 2 |
"""
|
| 3 |
-
LYGO Resonance Engine v0.5.
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
Stochastic Resonant Filtering, Multi-layer FM 808, Phase-safe Reverb Diffusion,
|
| 7 |
-
and Human-like Micro-timing.
|
| 8 |
"""
|
| 9 |
|
| 10 |
import cv2
|
|
@@ -12,65 +10,122 @@ import numpy as np
|
|
| 12 |
import soundfile as sf
|
| 13 |
import math
|
| 14 |
import argparse
|
|
|
|
| 15 |
from pathlib import Path
|
| 16 |
-
from typing import Optional, Dict, Any
|
| 17 |
import mido
|
| 18 |
from mido import MidiFile, MidiTrack, Message
|
| 19 |
|
| 20 |
-
|
|
|
|
|
|
|
| 21 |
|
|
|
|
|
|
|
|
|
|
| 22 |
PRESETS = {
|
| 23 |
"raw": {},
|
| 24 |
"ambient": {
|
| 25 |
-
"noise_vol": 0.03,
|
| 26 |
-
"
|
| 27 |
-
"
|
| 28 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
"theta_lock_range": (5, 9),
|
| 30 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
"glitch": {
|
| 32 |
-
"noise_vol": 0.08,
|
| 33 |
-
"
|
| 34 |
-
"
|
| 35 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
},
|
| 37 |
"ethereal": {
|
| 38 |
-
"noise_vol": 0.02,
|
| 39 |
-
"
|
| 40 |
-
"
|
| 41 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
},
|
| 43 |
"cinematic": {
|
| 44 |
-
"noise_vol": 0.04,
|
| 45 |
-
"
|
| 46 |
-
"
|
| 47 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
},
|
| 49 |
}
|
| 50 |
|
| 51 |
class ResonanceEngine:
|
| 52 |
def __init__(self, config: Optional[Dict[str, Any]] = None):
|
| 53 |
self.config = {
|
| 54 |
-
"sr": 44100,
|
| 55 |
-
"
|
| 56 |
-
"
|
| 57 |
-
"
|
| 58 |
-
"
|
| 59 |
-
"
|
| 60 |
-
"
|
| 61 |
-
"
|
| 62 |
-
"
|
| 63 |
-
"
|
| 64 |
-
"
|
| 65 |
-
"
|
| 66 |
-
"
|
| 67 |
-
|
| 68 |
-
"
|
| 69 |
-
"
|
| 70 |
-
"
|
| 71 |
-
"
|
| 72 |
-
"
|
| 73 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 74 |
}
|
| 75 |
if config:
|
| 76 |
self.config.update(config)
|
|
@@ -103,13 +158,8 @@ class ResonanceEngine:
|
|
| 103 |
"contours": contours,
|
| 104 |
"lines": lines if lines is not None else [],
|
| 105 |
"keypoints": keypoints,
|
| 106 |
-
"contrast": float(np.std(gray) / 255.0),
|
| 107 |
-
"brightness": float(np.mean(gray) / 255.0),
|
| 108 |
-
"_gray": gray, # stored for masking
|
| 109 |
}
|
| 110 |
|
| 111 |
-
# ========== SYNTHESIS HELPERS ==========
|
| 112 |
-
|
| 113 |
def _generate_tone(self, freq: float, duration: float, wave_type: str = "sine") -> np.ndarray:
|
| 114 |
sr = self.config["sr"]
|
| 115 |
n = int(sr * duration)
|
|
@@ -166,160 +216,6 @@ class ResonanceEngine:
|
|
| 166 |
return 0
|
| 167 |
return max(0, min(127, int(12 * math.log2(freq / 440) + 69)))
|
| 168 |
|
| 169 |
-
# ========== LDQ V0.5 CORE METHODS ==========
|
| 170 |
-
|
| 171 |
-
# --- Harmonic Gravity ---
|
| 172 |
-
def _harmonic_gravity(self, freq: float, root_freq: float, contrast: float) -> float:
|
| 173 |
-
"""Snap frequency to nearest just intonation scale degree."""
|
| 174 |
-
if self.config.get("harmonic_gravity", 0) <= 0:
|
| 175 |
-
return freq
|
| 176 |
-
scale = [1.0, 1.125, 1.25, 1.333, 1.5, 1.666, 1.875] # 1, 2, 3, 4, 5, 6, 7
|
| 177 |
-
snap_strength = min(1.0, max(0.0, contrast * 1.5)) * self.config["harmonic_gravity"]
|
| 178 |
-
ratios = np.array(scale)
|
| 179 |
-
nearest_idx = np.argmin(np.abs(ratios - freq / root_freq))
|
| 180 |
-
target_freq = root_freq * ratios[nearest_idx]
|
| 181 |
-
return freq + (target_freq - freq) * snap_strength
|
| 182 |
-
|
| 183 |
-
# --- Swing-Weighted Anchoring (Grid Morphing) ---
|
| 184 |
-
def _swing_weighted_quantize(self, raw_time: float, keypoint_response: float, bpm: float, swing_amount: float) -> float:
|
| 185 |
-
"""
|
| 186 |
-
Quantize to 16th-note grid with swing offset weighted by keypoint response.
|
| 187 |
-
High response β rigid grid lock. Low response β more offset (looser feel).
|
| 188 |
-
"""
|
| 189 |
-
beat_duration = 60.0 / bpm
|
| 190 |
-
grid_duration = beat_duration / 16.0
|
| 191 |
-
grid_pos = round(raw_time / grid_duration)
|
| 192 |
-
quantized = grid_pos * grid_duration
|
| 193 |
-
if swing_amount > 0 and grid_pos % 2 == 1:
|
| 194 |
-
swing_strength = 1.0 - min(1.0, keypoint_response / 100.0)
|
| 195 |
-
swing_offset = grid_duration * swing_amount * 0.6 * swing_strength
|
| 196 |
-
quantized += swing_offset
|
| 197 |
-
return quantized
|
| 198 |
-
|
| 199 |
-
# --- Visual Priority Masking ---
|
| 200 |
-
def _visual_priority_masking(self, events: List[Dict], feature_contrast: float) -> Tuple[List[Dict], int]:
|
| 201 |
-
"""Keep only the dominant event per grid position, suppress others."""
|
| 202 |
-
if not events:
|
| 203 |
-
return [], 0
|
| 204 |
-
events.sort(key=lambda e: e.get("contrast", 0), reverse=True)
|
| 205 |
-
kept = []
|
| 206 |
-
suppressed = 0
|
| 207 |
-
grid_duration = 60.0 / self.config["tempo_bpm"] / 16.0
|
| 208 |
-
used_grid_positions = set()
|
| 209 |
-
for ev in events:
|
| 210 |
-
grid_pos = round(ev.get("start_time", 0) / grid_duration)
|
| 211 |
-
if grid_pos not in used_grid_positions:
|
| 212 |
-
used_grid_positions.add(grid_pos)
|
| 213 |
-
kept.append(ev)
|
| 214 |
-
else:
|
| 215 |
-
suppressed += 1
|
| 216 |
-
return kept, suppressed
|
| 217 |
-
|
| 218 |
-
# --- Multi-layer FM 808 (sub + mid-bass) ---
|
| 219 |
-
def _procedural_fm_808(self, area: float, duration: float, sr: int, energy: float) -> np.ndarray:
|
| 220 |
-
"""
|
| 221 |
-
Generate an FM 808 tail with sub (20-60Hz) and mid-bass (60-200Hz) layers.
|
| 222 |
-
"""
|
| 223 |
-
if self.config.get("fm_808_depth", 0) <= 0:
|
| 224 |
-
return np.zeros(1, dtype=np.float32)
|
| 225 |
-
depth = self.config["fm_808_depth"]
|
| 226 |
-
# Split area into sub and mid components
|
| 227 |
-
sub_area = area * 0.6
|
| 228 |
-
mid_area = area * 0.4
|
| 229 |
-
# Sub layer: 20-60Hz
|
| 230 |
-
sub_freq = 25 + (sub_area / 50000) * 35
|
| 231 |
-
sub_mod_depth = (0.5 + (sub_area / 100000) * 2.0) * depth
|
| 232 |
-
# Mid layer: 60-200Hz
|
| 233 |
-
mid_freq = 70 + (mid_area / 50000) * 130
|
| 234 |
-
mid_mod_depth = (0.3 + (mid_area / 100000) * 1.5) * depth
|
| 235 |
-
# Tail duration
|
| 236 |
-
tail_duration = max(0.3, duration * (0.5 + area / 200000)) * depth
|
| 237 |
-
n = int(sr * tail_duration)
|
| 238 |
-
if n <= 0:
|
| 239 |
-
return np.zeros(1, dtype=np.float32)
|
| 240 |
-
t = np.linspace(0, tail_duration, n, dtype=np.float32)
|
| 241 |
-
# Sub carrier + modulator
|
| 242 |
-
sub_carrier = np.sin(2 * np.pi * sub_freq * t)
|
| 243 |
-
sub_modulator = np.sin(2 * np.pi * sub_freq * 3 * t)
|
| 244 |
-
sub_fm = np.sin(2 * np.pi * sub_freq * t + 2 * sub_modulator * sub_mod_depth)
|
| 245 |
-
# Mid carrier + modulator
|
| 246 |
-
mid_carrier = np.sin(2 * np.pi * mid_freq * t)
|
| 247 |
-
mid_modulator = np.sin(2 * np.pi * mid_freq * 2.5 * t)
|
| 248 |
-
mid_fm = np.sin(2 * np.pi * mid_freq * t + 2 * mid_modulator * mid_mod_depth)
|
| 249 |
-
# Combine and envelope
|
| 250 |
-
combined = (sub_fm * 0.7 + mid_fm * 0.3) * energy
|
| 251 |
-
env = np.exp(-t * 5)
|
| 252 |
-
return combined * env
|
| 253 |
-
|
| 254 |
-
# --- Adaptive Chaos Injection ---
|
| 255 |
-
def _adaptive_chaos_injection(self, edge_density: float, brightness: float) -> float:
|
| 256 |
-
"""Return a chaos factor (0-1) to modulate phase or amplitude."""
|
| 257 |
-
if self.config.get("chaos_injection", 0) <= 0:
|
| 258 |
-
return 0.0
|
| 259 |
-
# Low chaos = clean, high chaos = glitchy but musical
|
| 260 |
-
chaos = min(1.0, (edge_density * 5.0) * (1.0 - brightness) * 0.8)
|
| 261 |
-
return chaos * self.config["chaos_injection"]
|
| 262 |
-
|
| 263 |
-
# --- Stochastic Resonant Filtering ---
|
| 264 |
-
def _stochastic_resonant_filter(self, audio: np.ndarray, keypoint_positions: List[float], sr: int) -> np.ndarray:
|
| 265 |
-
"""Apply resonant low-pass filter modulated by keypoint positions."""
|
| 266 |
-
if self.config.get("resonant_filter", 0) <= 0 or len(audio) == 0:
|
| 267 |
-
return audio
|
| 268 |
-
from scipy import signal
|
| 269 |
-
# Use keypoint positions to modulate cutoff
|
| 270 |
-
if len(keypoint_positions) == 0:
|
| 271 |
-
return audio
|
| 272 |
-
# Normalize positions to 0-1
|
| 273 |
-
pos_norm = np.array(keypoint_positions) / 1000.0 # arbitrary scale
|
| 274 |
-
mean_pos = np.mean(pos_norm)
|
| 275 |
-
# Map to cutoff frequency 200-5000Hz
|
| 276 |
-
cutoff = 200 + mean_pos * 4800
|
| 277 |
-
cutoff = min(5000, max(200, cutoff))
|
| 278 |
-
# Resonant Q factor (increases with chaos)
|
| 279 |
-
chaos = self.config.get("chaos_injection", 0)
|
| 280 |
-
Q = 1.0 + chaos * 4.0
|
| 281 |
-
# Apply filter
|
| 282 |
-
sos = signal.butter(2, cutoff, btype='low', fs=sr, output='sos')
|
| 283 |
-
filtered = signal.sosfilt(sos, audio, axis=0)
|
| 284 |
-
# Blend with original based on resonant_filter strength
|
| 285 |
-
blend = self.config["resonant_filter"]
|
| 286 |
-
return audio * (1 - blend) + filtered * blend
|
| 287 |
-
|
| 288 |
-
# --- Human-like Micro-timing ---
|
| 289 |
-
def _micro_timing(self, raw_time: float, keypoint_response: float, bpm: float) -> float:
|
| 290 |
-
"""Add small Gaussian deviation scaled by contrast, then snap to 32nd-note for hi-hats."""
|
| 291 |
-
if self.config.get("micro_timing", 0) <= 0:
|
| 292 |
-
return raw_time
|
| 293 |
-
deviation = np.random.normal(0, 0.002) * (1.0 - min(1.0, keypoint_response / 100.0))
|
| 294 |
-
deviation *= self.config["micro_timing"]
|
| 295 |
-
# Snap to 32nd-note for hi-hats (but we don't know if it's a hat here; we apply to all)
|
| 296 |
-
beat_duration = 60.0 / bpm
|
| 297 |
-
grid_duration = beat_duration / 32.0
|
| 298 |
-
adjusted = raw_time + deviation
|
| 299 |
-
quantized = round(adjusted / grid_duration) * grid_duration
|
| 300 |
-
return quantized
|
| 301 |
-
|
| 302 |
-
# --- Phase-safe Reverb Diffusion ---
|
| 303 |
-
def _phase_safe_reverb_diffusion(self, audio: np.ndarray, suppressed_count: int, sr: int) -> np.ndarray:
|
| 304 |
-
"""Add reverb tail from suppressed events to avoid clipping."""
|
| 305 |
-
if suppressed_count <= 0:
|
| 306 |
-
return audio
|
| 307 |
-
# Simple convolution reverb using noise impulse
|
| 308 |
-
impulse_length = int(sr * 0.4) # 400ms tail
|
| 309 |
-
impulse = np.random.normal(0, 0.1, impulse_length).astype(np.float32)
|
| 310 |
-
# Exponential decay
|
| 311 |
-
t = np.linspace(0, 0.4, impulse_length)
|
| 312 |
-
envelope = np.exp(-t * 8)
|
| 313 |
-
impulse *= envelope
|
| 314 |
-
# Convolve with audio (just a short tail)
|
| 315 |
-
reverb_tail = np.convolve(audio[:, 0], impulse, mode='full')[:len(audio)]
|
| 316 |
-
reverb_tail = reverb_tail[:, np.newaxis] * 0.1 * (suppressed_count / 10.0)
|
| 317 |
-
# Mix in stereo
|
| 318 |
-
audio += np.column_stack((reverb_tail[:, 0], reverb_tail[:, 0]))
|
| 319 |
-
return audio
|
| 320 |
-
|
| 321 |
-
# ========== MAIN SYNTHESIS ==========
|
| 322 |
-
|
| 323 |
def synthesize(self, features: Dict[str, Any], output_path: str):
|
| 324 |
cfg = self.config
|
| 325 |
if cfg["random_seed"] is not None:
|
|
@@ -336,9 +232,97 @@ class ResonanceEngine:
|
|
| 336 |
root = np.interp(features["avg_red"], [0, 255], cfg["root_freq_range"])
|
| 337 |
theta = np.interp(features["avg_green"], [0, 255], cfg["theta_lock_range"])
|
| 338 |
w, h = features["width"], features["height"]
|
| 339 |
-
|
| 340 |
-
|
| 341 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 342 |
|
| 343 |
# Collections for stems
|
| 344 |
audio_noise = np.zeros((n_total, 2), dtype=np.float32)
|
|
@@ -347,18 +331,13 @@ class ResonanceEngine:
|
|
| 347 |
audio_glitch = np.zeros((n_total, 2), dtype=np.float32)
|
| 348 |
melody_events = []
|
| 349 |
|
| 350 |
-
#
|
| 351 |
-
|
| 352 |
-
if edge_density > 0.007:
|
| 353 |
noise = self._generate_tone(0, duration, "noise")
|
| 354 |
if cfg["noise_lowpass_hz"] > 0:
|
| 355 |
noise = self._fft_lowpass(noise, cfg["noise_lowpass_hz"])
|
| 356 |
-
# Adaptive chaos injection on noise
|
| 357 |
-
chaos = self._adaptive_chaos_injection(edge_density, brightness)
|
| 358 |
-
if chaos > 0:
|
| 359 |
-
noise *= (1.0 + chaos * np.random.uniform(-0.3, 0.3, len(noise)))
|
| 360 |
noise = self._apply_envelope(noise, cfg["drone_attack"], cfg["drone_decay"])
|
| 361 |
-
vol = min(edge_density * 1.0, cfg["noise_vol"])
|
| 362 |
stereo_noise = self._stereo_pan(noise, 0.0) * vol
|
| 363 |
audio += stereo_noise
|
| 364 |
audio_noise += stereo_noise
|
|
@@ -376,172 +355,59 @@ class ResonanceEngine:
|
|
| 376 |
audio += stereo_drone
|
| 377 |
audio_drone += stereo_drone
|
| 378 |
|
| 379 |
-
# Layer 3: Contours β Melody
|
| 380 |
valid = [c for c in features["contours"] if 90 < cv2.contourArea(c) < (w * h * 0.6)]
|
| 381 |
valid.sort(key=lambda c: cv2.boundingRect(c)[0])
|
| 382 |
|
| 383 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 384 |
for i, cnt in enumerate(valid[:cfg["max_notes"]]):
|
| 385 |
area = cv2.contourArea(cnt)
|
| 386 |
verts = len(cv2.approxPolyDP(cnt, 0.04 * cv2.arcLength(cnt, True), True))
|
| 387 |
freq = (root * 3.7) + (verts * theta * 1.6)
|
| 388 |
-
# Harmonic Gravity
|
| 389 |
-
if cfg.get("use_ldq"):
|
| 390 |
-
freq = self._harmonic_gravity(freq, root, contrast)
|
| 391 |
dur = min(2.6, 0.22 + (area / 13500))
|
| 392 |
tone = self._generate_tone(freq, dur, "sine")
|
| 393 |
tone = self._apply_envelope(tone, cfg["note_attack"], cfg["note_decay"])
|
| 394 |
|
| 395 |
M = cv2.moments(cnt)
|
| 396 |
cx = int(M["m10"] / M["m00"]) if M["m00"] != 0 else cv2.boundingRect(cnt)[0]
|
| 397 |
-
|
| 398 |
-
|
| 399 |
-
|
| 400 |
-
|
| 401 |
-
|
| 402 |
-
|
| 403 |
-
|
| 404 |
-
|
| 405 |
-
|
| 406 |
-
|
| 407 |
-
|
| 408 |
-
|
| 409 |
-
# Micro-timing
|
| 410 |
-
start_time = self._micro_timing(start_time, response, cfg["tempo_bpm"])
|
| 411 |
-
else:
|
| 412 |
-
start_time = raw_start
|
| 413 |
-
|
| 414 |
-
event = {
|
| 415 |
-
"freq": freq,
|
| 416 |
-
"dur": dur,
|
| 417 |
-
"tone": tone,
|
| 418 |
-
"pan": (cx / w) * 2 - 1,
|
| 419 |
-
"contrast": contour_contrast,
|
| 420 |
-
"start_time": start_time,
|
| 421 |
-
}
|
| 422 |
-
all_melody_events.append(event)
|
| 423 |
-
|
| 424 |
-
# Visual Priority Masking
|
| 425 |
-
if cfg.get("use_ldq") and cfg.get("percussion_mode") == "ldq":
|
| 426 |
-
kept_events, suppressed_melody = self._visual_priority_masking(all_melody_events, contrast)
|
| 427 |
-
all_melody_events = kept_events
|
| 428 |
-
# Record suppressed count for reverb diffusion
|
| 429 |
-
suppressed_total = suppressed_melody
|
| 430 |
-
else:
|
| 431 |
-
suppressed_total = 0
|
| 432 |
-
|
| 433 |
-
# Add kept melody events
|
| 434 |
-
for ev in all_melody_events:
|
| 435 |
-
idx = int(ev["start_time"] * sr)
|
| 436 |
-
end = min(idx + len(ev["tone"]), n_total)
|
| 437 |
-
stereo_note = self._stereo_pan(ev["tone"][:end-idx], ev["pan"]) * cfg["note_vol"]
|
| 438 |
audio[idx:end] += stereo_note
|
| 439 |
audio_melody[idx:end] += stereo_note
|
| 440 |
-
melody_events.append((
|
|
|
|
|
|
|
|
|
|
| 441 |
|
| 442 |
-
# Layer 4: Glitch / Micro events
|
| 443 |
-
all_glitch_events = []
|
| 444 |
-
keypoint_positions = []
|
| 445 |
for i, kp in enumerate(features["keypoints"][:cfg["max_glitches"]]):
|
| 446 |
x, y = kp.pt
|
| 447 |
-
response = kp.response
|
| 448 |
-
keypoint_positions.append(x)
|
| 449 |
freq = root * 13.5 + (y % 85) * 1.4
|
| 450 |
tone = self._generate_tone(freq, 0.05, "sine")
|
| 451 |
tone = self._apply_envelope(tone, cfg["glitch_attack"], cfg["glitch_decay"])
|
| 452 |
-
|
| 453 |
-
|
| 454 |
-
|
| 455 |
-
|
| 456 |
-
|
| 457 |
-
start_time = raw_start
|
| 458 |
-
|
| 459 |
-
ev = {
|
| 460 |
-
"freq": freq,
|
| 461 |
-
"tone": tone,
|
| 462 |
-
"pan": (x / w) * 2 - 1,
|
| 463 |
-
"contrast": response / 100.0,
|
| 464 |
-
"start_time": start_time,
|
| 465 |
-
}
|
| 466 |
-
all_glitch_events.append(ev)
|
| 467 |
-
|
| 468 |
-
if cfg.get("use_ldq") and cfg.get("percussion_mode") == "ldq":
|
| 469 |
-
kept_glitches, suppressed_glitch = self._visual_priority_masking(all_glitch_events, contrast)
|
| 470 |
-
all_glitch_events = kept_glitches
|
| 471 |
-
suppressed_total += suppressed_glitch
|
| 472 |
-
|
| 473 |
-
for ev in all_glitch_events:
|
| 474 |
-
idx = int(ev["start_time"] * sr)
|
| 475 |
-
end = min(idx + len(ev["tone"]), n_total)
|
| 476 |
-
stereo_glitch = self._stereo_pan(ev["tone"][:end-idx], ev["pan"]) * cfg["glitch_vol"]
|
| 477 |
audio[idx:end] += stereo_glitch
|
| 478 |
audio_glitch[idx:end] += stereo_glitch
|
| 479 |
|
| 480 |
-
#
|
| 481 |
-
if cfg.get("use_ldq") and cfg.get("percussion_mode") == "ldq":
|
| 482 |
-
self._log("ποΈ Music Production Layer Active")
|
| 483 |
-
|
| 484 |
-
# Lazy imports
|
| 485 |
-
from ldq_music_production import TempoGrid, apply_sidechain, frequency_separation, improved_kick
|
| 486 |
-
from ldq_perceptual_layer import apply_perceptual_mixing
|
| 487 |
-
from ldq_fingerprint import compute_vgh, embed_fingerprint
|
| 488 |
-
|
| 489 |
-
# Tempo grid
|
| 490 |
-
tempo = TempoGrid(bpm=cfg.get("tempo_bpm", 138),
|
| 491 |
-
subdivision=cfg.get("tempo_subdivision", 16),
|
| 492 |
-
swing=cfg.get("swing", 0.22))
|
| 493 |
-
|
| 494 |
-
# Generate kick
|
| 495 |
-
kick = improved_kick(sr, duration=0.7)
|
| 496 |
-
kick_stereo = self._stereo_pan(kick, 0.0) * 1.2
|
| 497 |
-
|
| 498 |
-
# Multi-layer FM 808 tails from contour areas
|
| 499 |
-
for cnt in valid[:min(4, len(valid))]:
|
| 500 |
-
area = cv2.contourArea(cnt)
|
| 501 |
-
if area > 100:
|
| 502 |
-
fm_tail = self._procedural_fm_808(area, 0.5, sr, 0.8)
|
| 503 |
-
fm_stereo = self._stereo_pan(fm_tail, 0.0) * 0.6
|
| 504 |
-
start_sample = int(np.random.uniform(0, duration * 0.8) * sr)
|
| 505 |
-
end_sample = min(start_sample + len(fm_tail), n_total)
|
| 506 |
-
audio[start_sample:end_sample] += fm_stereo[:end_sample-start_sample]
|
| 507 |
-
|
| 508 |
-
# Frequency separation
|
| 509 |
-
layers = frequency_separation(audio, sr)
|
| 510 |
-
# Sidechain
|
| 511 |
-
layers['bass'] = apply_sidechain(layers['bass'], kick, sr)
|
| 512 |
-
layers['lowmid'] = apply_sidechain(layers['lowmid'], kick, sr)
|
| 513 |
-
# Rebuild mix
|
| 514 |
-
audio = (
|
| 515 |
-
kick_stereo * 1.25 +
|
| 516 |
-
layers['sub'] * 1.1 +
|
| 517 |
-
layers['bass'] * 0.85 +
|
| 518 |
-
layers['lowmid'] * 0.6 +
|
| 519 |
-
layers['mid'] * 0.5 +
|
| 520 |
-
layers['high'] * 0.35
|
| 521 |
-
)
|
| 522 |
-
|
| 523 |
-
# Stochastic Resonant Filtering
|
| 524 |
-
if len(keypoint_positions) > 0:
|
| 525 |
-
audio = self._stochastic_resonant_filter(audio, keypoint_positions, sr)
|
| 526 |
-
|
| 527 |
-
# Phase-safe Reverb Diffusion (from suppressed events)
|
| 528 |
-
if suppressed_total > 0:
|
| 529 |
-
audio = self._phase_safe_reverb_diffusion(audio, suppressed_total, sr)
|
| 530 |
-
self._log(f"ποΈ Reverb diffusion applied for {suppressed_total} suppressed events")
|
| 531 |
-
|
| 532 |
-
# Perceptual polish
|
| 533 |
-
if cfg.get("perceptual_polish", 0.0) > 0:
|
| 534 |
-
audio = apply_perceptual_mixing(audio, features, sr)
|
| 535 |
-
|
| 536 |
-
# Fingerprint
|
| 537 |
-
if self.image_path is not None:
|
| 538 |
-
vgh = compute_vgh(self.image_path)
|
| 539 |
-
audio = embed_fingerprint(audio, sr, vgh)
|
| 540 |
-
self._log("π Fingerprint Embedded")
|
| 541 |
-
|
| 542 |
-
self._log("β
Music Production Layer Applied")
|
| 543 |
-
|
| 544 |
-
# ---------------- FINAL PROCESSING ----------------
|
| 545 |
audio = self._soft_limit(audio)
|
| 546 |
fade = int(cfg["global_fade"] * sr)
|
| 547 |
if fade > 0 and n_total > fade * 2:
|
|
@@ -550,13 +416,14 @@ class ResonanceEngine:
|
|
| 550 |
|
| 551 |
peak = np.max(np.abs(audio))
|
| 552 |
if peak > 0:
|
| 553 |
-
audio = audio / peak * 0.
|
| 554 |
|
| 555 |
sf.write(output_path, audio, sr)
|
| 556 |
-
self._log(f"β Saved: {output_path}
|
|
|
|
| 557 |
|
| 558 |
-
# Export Stems
|
| 559 |
-
if cfg.get("export_stems")
|
| 560 |
base = output_path.replace(".wav", "")
|
| 561 |
for stem, name in [(audio_noise, "noise"), (audio_drone, "drone"),
|
| 562 |
(audio_melody, "melody"), (audio_glitch, "glitch")]:
|
|
@@ -588,11 +455,73 @@ class ResonanceEngine:
|
|
| 588 |
def process(self, image_path: str, output_path: str):
|
| 589 |
self.image_path = image_path
|
| 590 |
self._log(f"\nββββββββββββββββββββββββββββββββββββββββββββββ")
|
| 591 |
-
self._log(f"β
|
|
|
|
| 592 |
self._log(f"ββββββββββββββββββββββββββββββββββββββββββββββ\n")
|
| 593 |
self._log(f"Analyzing: {image_path}")
|
| 594 |
features = self.analyze_image(image_path)
|
| 595 |
-
|
| 596 |
-
|
| 597 |
-
|
| 598 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
#!/usr/bin/env python3
|
| 2 |
"""
|
| 3 |
+
LYGO Resonance Engine v0.5.2
|
| 4 |
+
Image β Living Stereo Soundscape
|
| 5 |
+
Full standard synthesis + LDQ percussion mode.
|
|
|
|
|
|
|
| 6 |
"""
|
| 7 |
|
| 8 |
import cv2
|
|
|
|
| 10 |
import soundfile as sf
|
| 11 |
import math
|
| 12 |
import argparse
|
| 13 |
+
import sys
|
| 14 |
from pathlib import Path
|
| 15 |
+
from typing import Optional, Dict, Any
|
| 16 |
import mido
|
| 17 |
from mido import MidiFile, MidiTrack, Message
|
| 18 |
|
| 19 |
+
# LDQ imports are LAZY: only loaded inside the LDQ branch.
|
| 20 |
+
# This keeps the "Standard Beat Tools / Factory Default" path completely independent
|
| 21 |
+
# of any LDQ code so the default engine always works even if LDQ modules have issues.
|
| 22 |
|
| 23 |
+
__version__ = "0.5.2"
|
| 24 |
+
|
| 25 |
+
# Artistic Presets
|
| 26 |
PRESETS = {
|
| 27 |
"raw": {},
|
| 28 |
"ambient": {
|
| 29 |
+
"noise_vol": 0.03,
|
| 30 |
+
"drone_vol": 0.04,
|
| 31 |
+
"note_vol": 0.08,
|
| 32 |
+
"glitch_vol": 0.005,
|
| 33 |
+
"drone_attack": 6.0,
|
| 34 |
+
"drone_decay": 6.0,
|
| 35 |
+
"note_attack": 0.08,
|
| 36 |
+
"note_decay": 0.45,
|
| 37 |
+
"max_glitches": 5,
|
| 38 |
+
"noise_lowpass_hz": 350,
|
| 39 |
+
"root_freq_range": (40, 80),
|
| 40 |
"theta_lock_range": (5, 9),
|
| 41 |
},
|
| 42 |
+
# "musical" / factory-strong defaults (for Standard Beat Tools to produce nice non-static output
|
| 43 |
+
# matching historical working versions from LDQ protocol history + clean skill base).
|
| 44 |
+
# These ensure the 4-layer (noise + drones + melody + glitch) has energy + filtered texture.
|
| 45 |
+
"musical": {
|
| 46 |
+
"noise_vol": 0.09,
|
| 47 |
+
"drone_vol": 0.08,
|
| 48 |
+
"note_vol": 0.13,
|
| 49 |
+
"glitch_vol": 0.02,
|
| 50 |
+
"noise_lowpass_hz": 650,
|
| 51 |
+
"drone_attack": 4.0,
|
| 52 |
+
"drone_decay": 5.0,
|
| 53 |
+
"note_decay": 0.35,
|
| 54 |
+
},
|
| 55 |
"glitch": {
|
| 56 |
+
"noise_vol": 0.08,
|
| 57 |
+
"drone_vol": 0.04,
|
| 58 |
+
"note_vol": 0.06,
|
| 59 |
+
"glitch_vol": 0.03,
|
| 60 |
+
"max_notes": 6,
|
| 61 |
+
"max_glitches": 20,
|
| 62 |
+
"note_decay": 0.20,
|
| 63 |
+
"glitch_decay": 0.02,
|
| 64 |
+
"noise_lowpass_hz": 1800,
|
| 65 |
+
"root_freq_range": (30, 60),
|
| 66 |
+
"theta_lock_range": (4, 8),
|
| 67 |
},
|
| 68 |
"ethereal": {
|
| 69 |
+
"noise_vol": 0.02,
|
| 70 |
+
"drone_vol": 0.04,
|
| 71 |
+
"note_vol": 0.10,
|
| 72 |
+
"glitch_vol": 0.008,
|
| 73 |
+
"root_freq_range": (40, 95),
|
| 74 |
+
"theta_lock_range": (6, 13),
|
| 75 |
+
"note_attack": 0.10,
|
| 76 |
+
"note_decay": 0.55,
|
| 77 |
+
"noise_lowpass_hz": 300,
|
| 78 |
+
"max_glitches": 4,
|
| 79 |
},
|
| 80 |
"cinematic": {
|
| 81 |
+
"noise_vol": 0.04,
|
| 82 |
+
"drone_vol": 0.06,
|
| 83 |
+
"note_vol": 0.10,
|
| 84 |
+
"glitch_vol": 0.015,
|
| 85 |
+
"drone_attack": 4.5,
|
| 86 |
+
"drone_decay": 4.5,
|
| 87 |
+
"max_drones": 4,
|
| 88 |
+
"noise_lowpass_hz": 700,
|
| 89 |
+
"root_freq_range": (30, 70),
|
| 90 |
+
"theta_lock_range": (4.5, 10),
|
| 91 |
},
|
| 92 |
}
|
| 93 |
|
| 94 |
class ResonanceEngine:
|
| 95 |
def __init__(self, config: Optional[Dict[str, Any]] = None):
|
| 96 |
self.config = {
|
| 97 |
+
"sr": 44100,
|
| 98 |
+
"duration": 15.0,
|
| 99 |
+
"global_fade": 0.7,
|
| 100 |
+
"soft_clip": True,
|
| 101 |
+
"soft_clip_amount": 1.4,
|
| 102 |
+
"max_drones": 4,
|
| 103 |
+
"max_notes": 8,
|
| 104 |
+
"max_glitches": 15,
|
| 105 |
+
"noise_vol": 0.05,
|
| 106 |
+
"drone_vol": 0.04,
|
| 107 |
+
"note_vol": 0.10,
|
| 108 |
+
"glitch_vol": 0.015,
|
| 109 |
+
"root_freq_range": (30, 70),
|
| 110 |
+
"theta_lock_range": (4.5, 11),
|
| 111 |
+
"drone_attack": 3.5,
|
| 112 |
+
"drone_decay": 3.5,
|
| 113 |
+
"note_attack": 0.04,
|
| 114 |
+
"note_decay": 0.30,
|
| 115 |
+
"glitch_attack": 0.005,
|
| 116 |
+
"glitch_decay": 0.015,
|
| 117 |
+
"noise_lowpass_hz": 700,
|
| 118 |
+
"random_seed": None,
|
| 119 |
+
"verbose": True,
|
| 120 |
+
"export_stems": False,
|
| 121 |
+
"export_midi": False,
|
| 122 |
+
"use_ldq": False,
|
| 123 |
+
"genre_manifold": "None",
|
| 124 |
+
"percussion_mode": "standard",
|
| 125 |
+
"perceptual_polish": 0.5,
|
| 126 |
+
"tempo_bpm": 140,
|
| 127 |
+
"tempo_subdivision": 16,
|
| 128 |
+
"swing": 0.0,
|
| 129 |
}
|
| 130 |
if config:
|
| 131 |
self.config.update(config)
|
|
|
|
| 158 |
"contours": contours,
|
| 159 |
"lines": lines if lines is not None else [],
|
| 160 |
"keypoints": keypoints,
|
|
|
|
|
|
|
|
|
|
| 161 |
}
|
| 162 |
|
|
|
|
|
|
|
| 163 |
def _generate_tone(self, freq: float, duration: float, wave_type: str = "sine") -> np.ndarray:
|
| 164 |
sr = self.config["sr"]
|
| 165 |
n = int(sr * duration)
|
|
|
|
| 216 |
return 0
|
| 217 |
return max(0, min(127, int(12 * math.log2(freq / 440) + 69)))
|
| 218 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 219 |
def synthesize(self, features: Dict[str, Any], output_path: str):
|
| 220 |
cfg = self.config
|
| 221 |
if cfg["random_seed"] is not None:
|
|
|
|
| 232 |
root = np.interp(features["avg_red"], [0, 255], cfg["root_freq_range"])
|
| 233 |
theta = np.interp(features["avg_green"], [0, 255], cfg["theta_lock_range"])
|
| 234 |
w, h = features["width"], features["height"]
|
| 235 |
+
|
| 236 |
+
# ---- LDQ Protocol Percussion Mode (LAZY imports + guarded) ----
|
| 237 |
+
if cfg.get("use_ldq") and cfg.get("percussion_mode") == "ldq":
|
| 238 |
+
# Lazy load only when the user explicitly enables advanced LDQ mode.
|
| 239 |
+
# Factory / Standard Beat Tools path never executes any of this.
|
| 240 |
+
import ldq_fingerprint
|
| 241 |
+
import ldq_genre_manifold
|
| 242 |
+
import ldq_percussion
|
| 243 |
+
import ldq_perceptual_layer
|
| 244 |
+
import ldq_tempo_grid
|
| 245 |
+
import ldq_music_production
|
| 246 |
+
|
| 247 |
+
self.tempo_grid = ldq_tempo_grid.TempoGrid(
|
| 248 |
+
bpm=cfg.get("tempo_bpm", 140),
|
| 249 |
+
subdivision=cfg.get("tempo_subdivision", 16),
|
| 250 |
+
swing=cfg.get("swing", 0.0)
|
| 251 |
+
)
|
| 252 |
+
|
| 253 |
+
self._log("π¬ LDQ Percussion Mode active")
|
| 254 |
+
if self.image_path is not None:
|
| 255 |
+
vgh = ldq_fingerprint.compute_vgh(self.image_path)
|
| 256 |
+
self._log(f"π VGH: {vgh[:16]}...")
|
| 257 |
+
else:
|
| 258 |
+
vgh = None
|
| 259 |
+
|
| 260 |
+
if cfg.get("genre_manifold") and cfg["genre_manifold"] != "None":
|
| 261 |
+
self._log(f"π΅ Genre: {cfg['genre_manifold']}")
|
| 262 |
+
genre_params = ldq_genre_manifold.project_to_genre(features, cfg["genre_manifold"])
|
| 263 |
+
theta = theta * (1 + genre_params.get("swing_amount", 0))
|
| 264 |
+
if cfg["genre_manifold"] == "Dubstep":
|
| 265 |
+
cfg["tempo_bpm"] = 140
|
| 266 |
+
cfg["swing"] = 0.25
|
| 267 |
+
elif cfg["genre_manifold"] == "Phonk":
|
| 268 |
+
cfg["tempo_bpm"] = 100
|
| 269 |
+
cfg["swing"] = 0.33
|
| 270 |
+
elif cfg["genre_manifold"] == "Industrial":
|
| 271 |
+
cfg["tempo_bpm"] = 120
|
| 272 |
+
cfg["swing"] = 0.15
|
| 273 |
+
self.tempo_grid = ldq_tempo_grid.TempoGrid(
|
| 274 |
+
bpm=cfg["tempo_bpm"],
|
| 275 |
+
subdivision=cfg["tempo_subdivision"],
|
| 276 |
+
swing=cfg["swing"]
|
| 277 |
+
)
|
| 278 |
+
|
| 279 |
+
# generate drums
|
| 280 |
+
kick = ldq_percussion.generate_kick(features, sr, duration)
|
| 281 |
+
snare = ldq_percussion.generate_snare(features, sr, duration)
|
| 282 |
+
hihats = ldq_percussion.generate_hihats(features, sr, cfg["tempo_bpm"], duration)
|
| 283 |
+
|
| 284 |
+
min_len = min(len(kick), len(snare), len(hihats), n_total)
|
| 285 |
+
if min_len == 0:
|
| 286 |
+
min_len = n_total
|
| 287 |
+
|
| 288 |
+
audio[:min_len] += self._stereo_pan(kick[:min_len], 0.0) * 0.6
|
| 289 |
+
audio[:min_len] += self._stereo_pan(snare[:min_len], 0.2) * 0.4
|
| 290 |
+
audio[:min_len] += self._stereo_pan(hihats[:min_len], -0.2) * 0.3
|
| 291 |
+
|
| 292 |
+
# music production layer (the sidechain that was crashing in old deploys)
|
| 293 |
+
audio = ldq_music_production.apply_music_production(
|
| 294 |
+
audio, features, sr, bpm=cfg["tempo_bpm"], sidechain=True
|
| 295 |
+
)
|
| 296 |
+
|
| 297 |
+
if cfg.get("perceptual_polish", 0.0) > 0:
|
| 298 |
+
audio = ldq_perceptual_layer.apply_perceptual_mixing(audio, features, sr)
|
| 299 |
+
|
| 300 |
+
if vgh is not None:
|
| 301 |
+
audio = ldq_fingerprint.embed_fingerprint(audio, sr, vgh)
|
| 302 |
+
self._log("π Fingerprint embedded")
|
| 303 |
+
|
| 304 |
+
audio = self._soft_limit(audio)
|
| 305 |
+
fade = int(cfg["global_fade"] * sr)
|
| 306 |
+
if fade > 0 and n_total > fade * 2:
|
| 307 |
+
audio[:fade] *= np.linspace(0, 1, fade)[:, np.newaxis]
|
| 308 |
+
audio[-fade:] *= np.linspace(1, 0, fade)[:, np.newaxis]
|
| 309 |
+
|
| 310 |
+
sf.write(output_path, audio, sr)
|
| 311 |
+
self._log(f"β Saved: {output_path}")
|
| 312 |
+
return
|
| 313 |
+
|
| 314 |
+
# ===== STANDARD SYNTHESIS (Original 4-layer system) =====
|
| 315 |
+
# FOUNDATION LOG: This is the rock-solid working base ("buzzing + clear sound").
|
| 316 |
+
# All advanced controls (BPM, swing, etc.) are mapped here lightly as STRICT modules
|
| 317 |
+
# so they enhance without pulling full LDQ (per rebuild plan + user testing).
|
| 318 |
+
self._log("π΅ Standard Synthesis active (FOUNDATION)")
|
| 319 |
+
|
| 320 |
+
# === DETAILED FOUNDATION LOGGING (for methodical debugging) ===
|
| 321 |
+
use_bpm_influence = True # strict module: light tempo effect even in pure factory
|
| 322 |
+
effective_bpm = cfg.get("tempo_bpm", 140)
|
| 323 |
+
effective_swing = cfg.get("swing", 0.0)
|
| 324 |
+
self._log(f" LOG: PATH=STANDARD | bpm={effective_bpm} | swing={effective_swing} | seed={cfg.get('random_seed')} | noise_lowpass={cfg.get('noise_lowpass_hz')}")
|
| 325 |
+
self._log(f" LOG: PRESET_VOLS noise={cfg.get('noise_vol'):.3f} drone={cfg.get('drone_vol'):.3f} note={cfg.get('note_vol'):.3f} glitch={cfg.get('glitch_vol'):.3f}")
|
| 326 |
|
| 327 |
# Collections for stems
|
| 328 |
audio_noise = np.zeros((n_total, 2), dtype=np.float32)
|
|
|
|
| 331 |
audio_glitch = np.zeros((n_total, 2), dtype=np.float32)
|
| 332 |
melody_events = []
|
| 333 |
|
| 334 |
+
# Layer 1: Texture Floor (Noise)
|
| 335 |
+
if features["edge_density"] > 0.007:
|
|
|
|
| 336 |
noise = self._generate_tone(0, duration, "noise")
|
| 337 |
if cfg["noise_lowpass_hz"] > 0:
|
| 338 |
noise = self._fft_lowpass(noise, cfg["noise_lowpass_hz"])
|
|
|
|
|
|
|
|
|
|
|
|
|
| 339 |
noise = self._apply_envelope(noise, cfg["drone_attack"], cfg["drone_decay"])
|
| 340 |
+
vol = min(features["edge_density"] * 1.0, cfg["noise_vol"])
|
| 341 |
stereo_noise = self._stereo_pan(noise, 0.0) * vol
|
| 342 |
audio += stereo_noise
|
| 343 |
audio_noise += stereo_noise
|
|
|
|
| 355 |
audio += stereo_drone
|
| 356 |
audio_drone += stereo_drone
|
| 357 |
|
| 358 |
+
# Layer 3: Contours β Melody
|
| 359 |
valid = [c for c in features["contours"] if 90 < cv2.contourArea(c) < (w * h * 0.6)]
|
| 360 |
valid.sort(key=lambda c: cv2.boundingRect(c)[0])
|
| 361 |
|
| 362 |
+
# STRICT BPM MODULE (light, foundation-safe): scale timing by tempo so BPM slider does audible work
|
| 363 |
+
# without full LDQ TempoGrid. This is the "mapped perfectly" enhancement.
|
| 364 |
+
tempo_factor = 120.0 / max(1, effective_bpm) # >1 for slower BPM = longer spacing
|
| 365 |
+
swing_amount = effective_swing
|
| 366 |
+
|
| 367 |
for i, cnt in enumerate(valid[:cfg["max_notes"]]):
|
| 368 |
area = cv2.contourArea(cnt)
|
| 369 |
verts = len(cv2.approxPolyDP(cnt, 0.04 * cv2.arcLength(cnt, True), True))
|
| 370 |
freq = (root * 3.7) + (verts * theta * 1.6)
|
|
|
|
|
|
|
|
|
|
| 371 |
dur = min(2.6, 0.22 + (area / 13500))
|
| 372 |
tone = self._generate_tone(freq, dur, "sine")
|
| 373 |
tone = self._apply_envelope(tone, cfg["note_attack"], cfg["note_decay"])
|
| 374 |
|
| 375 |
M = cv2.moments(cnt)
|
| 376 |
cx = int(M["m10"] / M["m00"]) if M["m00"] != 0 else cv2.boundingRect(cnt)[0]
|
| 377 |
+
start = (cx / w) * (duration - dur)
|
| 378 |
+
|
| 379 |
+
# Apply light BPM + swing module (deterministic but controllable)
|
| 380 |
+
if use_bpm_influence:
|
| 381 |
+
start = start * tempo_factor
|
| 382 |
+
if swing_amount > 0:
|
| 383 |
+
start += (i % 3 - 1) * swing_amount * 0.08 # micro humanizing swing
|
| 384 |
+
|
| 385 |
+
idx = int(start * sr)
|
| 386 |
+
end = min(idx + len(tone), n_total)
|
| 387 |
+
pan = (cx / w) * 2 - 1
|
| 388 |
+
stereo_note = self._stereo_pan(tone[:end-idx], pan) * cfg["note_vol"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 389 |
audio[idx:end] += stereo_note
|
| 390 |
audio_melody[idx:end] += stereo_note
|
| 391 |
+
melody_events.append((freq, dur, start))
|
| 392 |
+
|
| 393 |
+
if i == 0:
|
| 394 |
+
self._log(f" LOG: MELODY_MODULE first_event_start={start:.2f}s (bpm_factor={tempo_factor:.2f}, swing={swing_amount})")
|
| 395 |
|
| 396 |
+
# Layer 4: Glitch / Micro events
|
|
|
|
|
|
|
| 397 |
for i, kp in enumerate(features["keypoints"][:cfg["max_glitches"]]):
|
| 398 |
x, y = kp.pt
|
|
|
|
|
|
|
| 399 |
freq = root * 13.5 + (y % 85) * 1.4
|
| 400 |
tone = self._generate_tone(freq, 0.05, "sine")
|
| 401 |
tone = self._apply_envelope(tone, cfg["glitch_attack"], cfg["glitch_decay"])
|
| 402 |
+
start = (y / h) * (duration - 0.05)
|
| 403 |
+
idx = int(start * sr)
|
| 404 |
+
end = min(idx + len(tone), n_total)
|
| 405 |
+
pan = (x / w) * 2 - 1
|
| 406 |
+
stereo_glitch = self._stereo_pan(tone[:end-idx], pan) * cfg["glitch_vol"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 407 |
audio[idx:end] += stereo_glitch
|
| 408 |
audio_glitch[idx:end] += stereo_glitch
|
| 409 |
|
| 410 |
+
# Final polish
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 411 |
audio = self._soft_limit(audio)
|
| 412 |
fade = int(cfg["global_fade"] * sr)
|
| 413 |
if fade > 0 and n_total > fade * 2:
|
|
|
|
| 416 |
|
| 417 |
peak = np.max(np.abs(audio))
|
| 418 |
if peak > 0:
|
| 419 |
+
audio = audio / peak * 0.97
|
| 420 |
|
| 421 |
sf.write(output_path, audio, sr)
|
| 422 |
+
self._log(f"β Saved: {output_path} | Peak: {peak:.3f}")
|
| 423 |
+
self._log(f" LOG_WORKING: STANDARD_FOUNDATION | effective_bpm={effective_bpm} | events={len(melody_events)} | peak={peak:.3f} | (bpm/swing now influence timing β test with extreme values)")
|
| 424 |
|
| 425 |
+
# Export Stems
|
| 426 |
+
if cfg.get("export_stems"):
|
| 427 |
base = output_path.replace(".wav", "")
|
| 428 |
for stem, name in [(audio_noise, "noise"), (audio_drone, "drone"),
|
| 429 |
(audio_melody, "melody"), (audio_glitch, "glitch")]:
|
|
|
|
| 455 |
def process(self, image_path: str, output_path: str):
|
| 456 |
self.image_path = image_path
|
| 457 |
self._log(f"\nββββββββββββββββββββββββββββββββββββββββββββββ")
|
| 458 |
+
self._log(f"β LYGO Resonance Engine v{__version__} β")
|
| 459 |
+
self._log(f"β Image β Living Stereo Soundscape β")
|
| 460 |
self._log(f"ββββββββββββββββββββββββββββββββββββββββββββββ\n")
|
| 461 |
self._log(f"Analyzing: {image_path}")
|
| 462 |
features = self.analyze_image(image_path)
|
| 463 |
+
self.synthesize(features, output_path)
|
| 464 |
+
|
| 465 |
+
|
| 466 |
+
def main():
|
| 467 |
+
parser = argparse.ArgumentParser()
|
| 468 |
+
parser.add_argument("image", help="Input image path")
|
| 469 |
+
parser.add_argument("-o", "--output", default=None)
|
| 470 |
+
parser.add_argument("--duration", type=float, default=15.0)
|
| 471 |
+
parser.add_argument("--style", choices=list(PRESETS.keys()), default="cinematic")
|
| 472 |
+
parser.add_argument("--seed", type=int, default=None)
|
| 473 |
+
parser.add_argument("--noise-filter", type=float, default=None)
|
| 474 |
+
parser.add_argument("--stems", action="store_true")
|
| 475 |
+
parser.add_argument("--midi", action="store_true")
|
| 476 |
+
parser.add_argument("--batch", action="store_true")
|
| 477 |
+
parser.add_argument("--quiet", action="store_true")
|
| 478 |
+
parser.add_argument("--ldq", action="store_true")
|
| 479 |
+
parser.add_argument("--genre", choices=["None", "Dubstep", "Phonk", "Industrial"], default="None")
|
| 480 |
+
parser.add_argument("--percussion", choices=["standard", "ldq"], default="standard")
|
| 481 |
+
parser.add_argument("--polish", type=float, default=0.5)
|
| 482 |
+
parser.add_argument("--bpm", type=int, default=140)
|
| 483 |
+
parser.add_argument("--swing", type=float, default=0.0)
|
| 484 |
+
args = parser.parse_args()
|
| 485 |
+
|
| 486 |
+
config = {
|
| 487 |
+
"duration": args.duration,
|
| 488 |
+
"random_seed": args.seed,
|
| 489 |
+
"verbose": not args.quiet,
|
| 490 |
+
"export_stems": args.stems,
|
| 491 |
+
"export_midi": args.midi,
|
| 492 |
+
"use_ldq": args.ldq,
|
| 493 |
+
"genre_manifold": args.genre,
|
| 494 |
+
"percussion_mode": args.percussion,
|
| 495 |
+
"perceptual_polish": args.polish,
|
| 496 |
+
"tempo_bpm": args.bpm,
|
| 497 |
+
"swing": args.swing,
|
| 498 |
+
}
|
| 499 |
+
if args.noise_filter is not None:
|
| 500 |
+
config["noise_lowpass_hz"] = args.noise_filter
|
| 501 |
+
|
| 502 |
+
preset = PRESETS.get(args.style, {})
|
| 503 |
+
config.update(preset)
|
| 504 |
+
|
| 505 |
+
if args.batch:
|
| 506 |
+
folder = Path(args.image)
|
| 507 |
+
if not folder.is_dir():
|
| 508 |
+
print("Error: --batch requires a folder path")
|
| 509 |
+
return
|
| 510 |
+
images = list(folder.glob("*.jpg")) + list(folder.glob("*.png")) + list(folder.glob("*.jpeg"))
|
| 511 |
+
if not images:
|
| 512 |
+
print("No images found")
|
| 513 |
+
return
|
| 514 |
+
for img in images:
|
| 515 |
+
print(f"\nProcessing: {img.name}")
|
| 516 |
+
out_path = f"resonance_{img.stem}.wav"
|
| 517 |
+
engine = ResonanceEngine(config)
|
| 518 |
+
engine.process(str(img), out_path)
|
| 519 |
+
return
|
| 520 |
+
|
| 521 |
+
out_path = args.output or f"resonance_{Path(args.image).stem}.wav"
|
| 522 |
+
engine = ResonanceEngine(config)
|
| 523 |
+
engine.process(args.image, out_path)
|
| 524 |
+
|
| 525 |
+
|
| 526 |
+
if __name__ == "__main__":
|
| 527 |
+
main()
|