# Fotografía sonora · Método FS-3.0

Esta versión responde a la petición de Abraham de sustituir las regiones elegidas por el compositor por una regla medible, reproducible y aplicable a otras fotografías. V2 permanece en `Escuchar-v2.html`. Abrir `Escuchar-v3.html` para el nuevo estudio. Las tres piezas comparten parámetros y armonía; duran 59 segundos con cola. No se eligen puntos a mano ni se usa azar en el análisis o la síntesis.

## Qué cambia respecto de V2

En V2 las regiones y alturas de melodía estaban escritas por el compositor; sólo intensidad y timbre dependían de las mediciones de esas regiones. Los recuadros no eran aleatorios, pero tampoco se obtenían con un detector general. En V3 tanto la región como la altura sin afinar se calculan con el mismo algoritmo para cualquier imagen. El resultado sonifica estructura luminosa; no identifica el significado cultural, la época o la biografía de las personas.

## Receta completa

1. Orientar con EXIF. Convertir un perfil ICC incrustado a sRGB. Si no hay perfil, asumir sRGB; un perfil inválido produce error. Componer transparencia sobre blanco. Reducir/ampliar con Pillow LANCZOS a 768 px en el lado largo; se impone un mínimo de 32 × 24 píxeles para imágenes de proporciones extremas. En ese caso excepcional puede variar la proporción. Se muestra exactamente el PNG que se analiza.
2. Linealizar cada canal sRGB: `c/12.92` si `c ≤ 0.04045`; en otro caso `((c+0.055)/1.055)^2.4`. Calcular `Y = 0.2126 R + 0.7152 G + 0.0722 B`. Es luminancia relativa de los píxeles bajo el modelo sRGB; no una medida en lux o cd/m² de la escena original, ni una medida completa de brillo percibido.
3. Suavizar Y mediante `scipy.ndimage.gaussian_filter(sigma=1.2, mode='reflect', truncate=4)`. Calcular `Gx = sobel(Ysuave, axis=1)/8` y `Gy = sobel(Ysuave, axis=0)/8`, ambos con bordes reflejados. Magnitud `G = sqrt(Gx² + Gy²)`. El divisor 8 hace explícita la normalización de Sobel; las unidades son luminancia relativa por píxel de la imagen normalizada.
4. Dividir en 32 columnas × 24 filas con límites enteros obtenidos mediante linspace y truncado a entero. Medir el promedio de G dentro de cada celda. En cada columna seleccionar la fila con el mayor promedio. Si hay empate exacto, gana la fila superior. Si el máximo es menor que `0.00001`, no se emite una nota. Una fotografía uniforme puede tener un campo armónico sostenido pero no una melodía de bordes.
5. Calcular x e y como centro geométrico de la celda, en coordenadas de 0 a 1. Su instante es `1.2 + x × (64 × 60/72)` segundos; esto alinea cada nota con el barrido. La altura sin afinar es `60 + 24 × (1 − y)` MIDI. Elegir la nota más cercana del acorde actual entre MIDI 60 y 84; empate hacia la nota inferior. Frecuencia: `440 × 2^((MIDI−69)/12)` Hz.
6. Las 16 barras de 4 tiempos usan `[Dm, Dm, Bb, Bb, F, F, C, C]` dos veces. No hay elección armónica por fotografía. Tempo 72 BPM, gate 1.25 tiempos. Son convenciones compositivas, no descubrimientos físicos. La cuantización reduce información: regiones distintas pueden dar la misma nota.
7. La velocidad base de cada evento es `min(1, 0.25 + 0.65 sqrt(Gmedio/0.08))`. La síntesis conserva el motor aditivo de NumPy: luz media → nivel y release; contraste → ataque; color → proporción de armónicos. Cada manifiesto contiene los valores realmente ejecutados: nivel, ataque, release, panorámica y armónicos. El campo continuo lee 32 columnas × 12 bandas de luminancia; interpola entre los centros exactos de las columnas y afina las 12 voces a los cuatro acordes. SciPy produce la reverberación mediante convolución. Los faders y la ganancia global se calibran automáticamente por pieza; por ello el volumen total no es un fotómetro para comparar dos fotografías. Dentro de cada pieza se conservan las relaciones calculadas.
8. Audio PCM de 24 bits / 48 kHz, MP3 de escucha y stems alineados de campo, notas y espacio. El visualizador usa el mismo manifiesto y `audio.currentTime`. No hay reloj de animación musical independiente.

## Capa vectorial

SVG de curvas de igual luminancia con niveles Y = 0.08, 0.18, 0.35, 0.55 y 0.75. Marching squares sobre una retícula de hasta 160 × 160 muestras de la Y calculada; interpolación lineal y regla de silla de montar declarada en `method.py`. Son aproximaciones de isolíneas de la fotografía procesada, no contornos semánticos. El barrido revela las líneas que atraviesa. Los puntos indican centros de celdas seleccionadas. El rectángulo naranja es la celda realmente medida. La barra lateral compara el gradiente de las 24 filas de esa columna, en escala fija 0–0.12 (se satura por encima). El círculo sigue la envolvente de la nota seca, no una onda física en el espacio fotografiado. La reverberación continúa sin inventar nuevas fuentes visuales.

Las regiones más intensas no son necesariamente las más importantes para una persona. El máximo puede saltar entre objetos y la cuantización puede producir saltos melódicos. Un recorte, retoque, cambio de exposición o de perfil puede cambiar el resultado: reproducibilidad significa mismas entradas y parámetros, no invariancia ante cualquier edición.

## Repetir con otra fotografía

En el laboratorio local, `http://127.0.0.1:8767/Escuchar-v3.html`, pulsar **Probar otra foto**. El servidor local ejecuta el mismo método con Python, NumPy y SciPy. La imagen permanece en esta computadora. Formatos de prueba: JPEG, PNG, WebP y TIFF que Pillow pueda decodificar; orientación/perfil según receta. No es un decodificador RAW/HEIC. La sala estática funciona sin servidor para las piezas ya renderizadas.

El lanzador `Abrir-laboratorio.command` inicia el servidor cuando no esté activo. Para reconstruir por código: `production/build.py` sin argumentos reconstruye las tres fotografías originales; con una ruta analiza y renderiza ese archivo. `production/publish.py` publica la sala; `production/validate.py` verifica el método. Las rutas de SSD y runtime están explícitas. No se necesitan muestras, servicios de generación ni modelos de visión.

Conservar el archivo original, el PNG analizado, manifiesto, configuración, versiones y código. `signature` es SHA-256 del JSON canónico de mediciones, selecciones y parámetros antes de añadir contornos. También se guardan hashes de imagen original, PNG y WAV. La repetibilidad bit a bit se prueba en este entorno; otros decodificadores o versiones numéricas podrían introducir pequeñas diferencias.

## Verificación

`analysis/method-qa.json`: repetir el análisis de cada foto; comprobar máximos por columna, cuantización y tiempos dentro de una muestra; imágenes uniformes negras/grises/blancas sin notas de borde; borde sintético localizado; reflexión horizontal que invierte las columnas de energía; segundo render del primer WAV con el mismo SHA-256. `analysis/browser-qa.json`: carga, reproducción, evento vectorial, posiciones, navegación, capas y vista móvil. Los medidores de audio se guardan por pieza. Esto comprueba implementación y reproducibilidad; no constituye validación psicofísica de reconocimiento de imágenes por oído, ni escucha estética independiente.

## Fuentes primarias

- Thomas Hermann (ICAD 2008), [Taxonomy and Definitions for Sonification and Auditory Display](https://www.icad.org/Proceedings/2008/Hermann2008.pdf). Criterios de dependencia de datos, método sistemático, reproducibilidad y uso con otros conjuntos de datos. No demuestra que una traducción específica sea una ley natural.
- W3C, [Relative luminance / Contrast](https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum). Linealización y coeficientes sRGB. Se usa únicamente su definición de luminancia relativa, no una recomendación de mapeo musical.
- SciPy, [Sobel](https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.sobel.html) y [Gaussian filter](https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.gaussian_filter.html). Operaciones de procesamiento que ejecuta este método.

Consultadas el 30 de octubre de 2026. La selección por máximo de columna, la retícula, los umbrales, la afinación y las reglas visuales son decisiones de este estudio. No se atribuyen a esas fuentes ni a una equivalencia universal entre visión y sonido.

## Registro de decisión

RUN: ACS-RUN-20261030-FOTOGRAFIA-SONORA-003. Trace 1. Régimen autoral. Lente: composición musical ACS-21, contrato leído; ejecución y revisión técnica por agente principal, sin revisión independiente. Objetivo: método general y vectorización causal que Abraham pueda entender y repetir. Autoridad: instrucción de Abraham de basarlo en mediciones. Decisión: sustituir coordenadas y alturas escritas por máximos de gradiente y posición vertical cuantizada; conservar V2 y cuatro acordes; motor Python NumPy/SciPy. Incertidumbre: resultado musical pendiente de escucha humana; el contraste no equivale a relevancia cultural. Memoria: Abraham valoró el carácter de píxeles y pidió ver la causa real de cada nota.
