1e51ef7def
- Konzept/, didaktik_geografie/, didaktik_simulation/, v2-modules/, v2-platform/ - 12 code-workspace-Files - STATUS-*.md - viele M/D/R-Änderungen an bereits getrackten Files - .gitignore verstärkt: **/.humaninput/, **/secret_keys.txt Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
57 lines
2.3 KiB
HTML
57 lines
2.3 KiB
HTML
<!doctype html>
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>Stimm-Probe</title>
|
|
<style>
|
|
body { font-family: system-ui, sans-serif; max-width: 640px; margin: 40px auto; padding: 0 20px; background:#f5efe0; color:#1f2a24; }
|
|
h1 { font-size: 20px; color:#2d5434; }
|
|
.row { margin: 20px 0; padding:16px; background:#fff; border-radius:8px; box-shadow:0 2px 8px rgba(0,0,0,.06); }
|
|
.row h2 { margin:0 0 8px; font-size:14px; color:#3d5165; }
|
|
.row audio { width:100%; }
|
|
button { padding:10px 16px; border:none; border-radius:6px; background:#2d5434; color:#fff; cursor:pointer; margin-right:8px; font-weight:600; }
|
|
button:hover { background:#3d6a44; }
|
|
small { color:#3d5165; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h1>Stimm-Probe · OpenAI Nova, Speed 1.12</h1>
|
|
|
|
<div class="row">
|
|
<h2>1. Direkt (ohne Funk-Effekt)</h2>
|
|
<audio id="audRaw" controls></audio>
|
|
<script>document.getElementById('audRaw').src = 'sounds/radio/_probe_nova.mp3?v=' + Date.now();</script>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<h2>2. Mit Funk-Effekt (wie im Spiel)</h2>
|
|
<button id="playFilt">Funk-Variante abspielen</button>
|
|
<button id="stopFilt">Stop</button>
|
|
<br><small>Bandpass ~1800 Hz + leichte Distortion</small>
|
|
</div>
|
|
|
|
<script>
|
|
const audioCtx = new (window.AudioContext || window.webkitAudioContext)();
|
|
let src = null, gain = null;
|
|
async function playFiltered() {
|
|
if (audioCtx.state === 'suspended') await audioCtx.resume();
|
|
if (src) { try { src.stop(); } catch(e){} src = null; }
|
|
const buf = await (await fetch('sounds/radio/_probe_nova.mp3?v=' + Date.now())).arrayBuffer();
|
|
const audioBuf = await audioCtx.decodeAudioData(buf);
|
|
src = audioCtx.createBufferSource(); src.buffer = audioBuf;
|
|
const bp = audioCtx.createBiquadFilter();
|
|
bp.type = 'bandpass'; bp.frequency.value = 1800; bp.Q.value = 3;
|
|
const dist = audioCtx.createWaveShaper();
|
|
const curve = new Float32Array(256);
|
|
for (let i=0;i<256;i++){const x=(i/128)-1;curve[i]=Math.sign(x)*Math.pow(Math.abs(x),0.6);}
|
|
dist.curve = curve;
|
|
gain = audioCtx.createGain(); gain.gain.value = 2.8;
|
|
src.connect(bp); bp.connect(dist); dist.connect(gain); gain.connect(audioCtx.destination);
|
|
src.start(0);
|
|
}
|
|
document.getElementById('playFilt').addEventListener('click', playFiltered);
|
|
document.getElementById('stopFilt').addEventListener('click', () => { if (src) { try { src.stop(); } catch(e){} src = null; } });
|
|
</script>
|
|
</body>
|
|
</html>
|