feat(toma-progresiva): alarma más fuerte 3 ciclos con sawtooth+compressor y vibración 5x900ms

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-07-17 18:36:33 -05:00
co-authored by Claude Sonnet 4.6
parent 7f522a683e
commit 65c3cc8c20
+23 -11
View File
@@ -2086,16 +2086,28 @@ function _guardarFirmaMP(widget, svg, msgEl, entry, campoId) {
function _mpPlayBeep() {
try {
var ctx = new (window.AudioContext || window.webkitAudioContext)();
[880, 1100, 880, 1100].forEach(function(freq, i) {
var osc = ctx.createOscillator(), gain = ctx.createGain();
osc.connect(gain); gain.connect(ctx.destination);
osc.frequency.value = freq;
var t0 = ctx.currentTime + i * 0.22;
gain.gain.setValueAtTime(0.7, t0);
gain.gain.exponentialRampToValueAtTime(0.001, t0 + 0.18);
osc.start(t0); osc.stop(t0 + 0.18);
});
var ctx = new (window.AudioContext || window.webkitAudioContext)();
var comp = ctx.createDynamicsCompressor();
comp.threshold.value = -6; comp.ratio.value = 12; comp.attack.value = 0;
comp.connect(ctx.destination);
// 3 ciclos de alarma, cada ciclo 3 notas; 2 osciladores por nota para más volumen
var notes = [1200, 880, 1200];
for (var cycle = 0; cycle < 3; cycle++) {
notes.forEach(function(freq, i) {
var t0 = ctx.currentTime + cycle * 1.0 + i * 0.28;
[0, 6].forEach(function(detune) { // dos osciladores ligeramente desafinados
var osc = ctx.createOscillator();
var g = ctx.createGain();
osc.type = 'sawtooth';
osc.frequency.value = freq;
osc.detune.value = detune;
osc.connect(g); g.connect(comp);
g.gain.setValueAtTime(1.0, t0);
g.gain.exponentialRampToValueAtTime(0.001, t0 + 0.24);
osc.start(t0); osc.stop(t0 + 0.24);
});
});
}
} catch(e) {}
}
@@ -2128,7 +2140,7 @@ function _mpIniciarCountdown(targetMsOrMins, nextLabel, nextFirmaId) {
box.style.animation = 'mp-pulse 1s ease-in-out infinite';
box.innerHTML = '<div style="font-size:1.1rem;font-weight:700"><i class="fas fa-bell me-2"></i>¡Hora de la siguiente muestra!</div>'
+ (nextLabel ? '<div style="font-size:.85rem;opacity:.9;margin-top:4px">' + nextLabel + '</div>' : '');
if (navigator.vibrate) navigator.vibrate([500,150,500,150,500]);
if (navigator.vibrate) navigator.vibrate([900,150,900,150,900,150,900,150,900]);
_mpPlayBeep();
// Desbloquear y mostrar siguiente canvas
var nw = nextFirmaId ? document.getElementById('fpw-' + nextFirmaId) : null;