Audio: log2 voice scaling (up to 8), wider detune spread

1 obs = solo, 3 = duo, 8 = trio, 15 = quartet, 30 = quintet, 60 = sextet.
Wider detune (±8, ±13, ±18...) so stacked voices shimmer instead
of sounding like the same oscillator copied.
This commit is contained in:
you
2026-03-22 18:45:47 +00:00
parent 2688f3e63a
commit c7f12c72b9
2 changed files with 5 additions and 4 deletions
+4 -3
View File
@@ -52,8 +52,9 @@
const filterFreq = mapRange(Math.min(hopCount, 10), 1, 10, 8000, 800);
// Volume from observations
const volume = Math.min(0.5, 0.15 + (obsCount - 1) * 0.03);
const voiceCount = Math.min(obsCount, 4);
const volume = Math.min(0.6, 0.15 + (obsCount - 1) * 0.02);
// More observers = richer chord: 1→1, 3→2, 8→3, 15→4, 30→5, 60→6
const voiceCount = Math.min(Math.max(1, Math.ceil(Math.log2(obsCount + 1))), 8);
// Audio nodes
const filter = audioCtx.createBiquadFilter();
@@ -85,7 +86,7 @@
const noteEnd = noteStart + duration;
for (let v = 0; v < voiceCount; v++) {
const detune = v === 0 ? 0 : (v % 2 === 0 ? 1 : -1) * (v * 7);
const detune = v === 0 ? 0 : (v % 2 === 0 ? 1 : -1) * (v * 5 + 3); // ±8, ±13, ±18, ±23...
const osc = audioCtx.createOscillator();
const envGain = audioCtx.createGain();
+1 -1
View File
@@ -91,7 +91,7 @@
<script src="traces.js?v=1774135052" onerror="console.error('Failed to load:', this.src)"></script>
<script src="analytics.js?v=1774126708" onerror="console.error('Failed to load:', this.src)"></script>
<script src="audio.js?v=1774200683" onerror="console.error('Failed to load:', this.src)"></script>
<script src="audio-v1-constellation.js?v=1774204296" onerror="console.error('Failed to load:', this.src)"></script>
<script src="audio-v1-constellation.js?v=1774205147" onerror="console.error('Failed to load:', this.src)"></script>
<script src="live.js?v=1774205085" onerror="console.error('Failed to load:', this.src)"></script>
<script src="observers.js?v=1774290000" onerror="console.error('Failed to load:', this.src)"></script>
<script src="observer-detail.js?v=1774028201" onerror="console.error('Failed to load:', this.src)"></script>