From eb36587ccf1ddc9674a14f5c28a5257cb7344e46 Mon Sep 17 00:00:00 2001 From: Markus Graf Date: Fri, 27 Mar 2026 14:15:16 +0100 Subject: [PATCH] feat(09-01): add Group field to FreqConfig and rebalance ClassFreqConfigs - Add Group string field to FreqConfig struct (GRP-04) - Add frequency allocation table comment (32 slots, 65-2449 Hz, FREQ-03) - Rebalance all 14 ClassFreqConfigs entries to major-second ladder (FREQ-01) - Infrastructure band (Triangle, 65-133 Hz): ICMP/NTP/DHCP/DNS - Web band (Sawtooth, 150-169 Hz): HTTPS/HTTP - Mail band (Triangle, 214 Hz): SMTP - Remote Access band (Square, 343 Hz): SSH - Unknown band (Custom, 771-1375 Hz): Unknown1-4, OtherTCP, OtherUDP - Remove stale NumLayers and GainPerLayer constants (Phase 8 cleanup) - Non-Unknown entries use WaveformPresetHarmonics; Unknown retain hand-tuned {1,1.0},{2,0.8},{3,0.4} --- synth/config.go | 166 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 144 insertions(+), 22 deletions(-) diff --git a/synth/config.go b/synth/config.go index ca2c003..58ea9b8 100644 --- a/synth/config.go +++ b/synth/config.go @@ -3,10 +3,10 @@ package synth import "github.com/netsynth/netsynth/classify" const ( - SampleRate = 44100 // D-13: CD quality - WindowMs = 500 // matches aggregate.DefaultWindowMs - SamplesPerWindow = SampleRate * WindowMs / 1000 // 22050 - WhisperFloor = 0.03 // D-08/D-09: 3% of max amplitude + SampleRate = 44100 // D-13: CD quality + WindowMs = 500 // matches aggregate.DefaultWindowMs + SamplesPerWindow = SampleRate * WindowMs / 1000 // 22050 + WhisperFloor = 0.03 // D-08/D-09: 3% of max amplitude ) // WaveformType selects the harmonic preset for a synthesis layer. @@ -68,26 +68,148 @@ type FreqConfig struct { Harmonics []HarmonicDef Pan float64 // [-1, 1]: -1=full left, 0=center, +1=full right WaveformType WaveformType // zero value WaveformCustom uses Harmonics as-is + Group string // sound family: "Infrastructure", "Web", "Mail", "Remote Access", "Unknown", etc. } +// Frequency Allocation Table (Phase 9 design — major-second ladder, 65-2449 Hz) +// +// Slot Hz Class Group Waveform Pan +// 0 65 ICMP Infrastructure Triangle -0.3 +// 1 73 NTP Infrastructure Triangle -0.1 +// 2 82 DHCP Infrastructure Triangle 0.1 +// 3 93 mDNS Infrastructure Triangle 0.3 (Phase 10) +// 4 105 SSDP Infrastructure Triangle -0.2 (Phase 10) +// 5 118 SNMP Infrastructure Triangle 0.2 (Phase 10) +// 6 133 DNS Infrastructure Triangle 0.0 +// 7 150 HTTPS Web Sawtooth -0.4 +// 8 169 HTTP Web Sawtooth -0.3 +// 9 190 HTTP3 Web Sawtooth -0.2 (Phase 10) +// 10 214 SMTP Mail Triangle 0.2 +// 11 241 IMAP Mail Triangle 0.3 (Phase 10) +// 12 271 POP3 Mail Triangle 0.4 (Phase 10) +// 13 305 SMTP-sub Mail Triangle 0.5 (Phase 10) +// 14 343 SSH Remote Access Square -0.7 +// 15 385 RDP Remote Access Square -0.6 (Phase 10) +// 16 432 Telnet Remote Access Square -0.5 (Phase 10) +// 17 485 VNC Remote Access Square -0.4 (Phase 10) +// 18 545 FTP File Transfer Square 0.5 (Phase 10) +// 19 612 SMB File Transfer Square 0.6 (Phase 10) +// 20 687 TFTP File Transfer Square 0.7 (Phase 10) +// 21 771 unknown-1 Unknown Custom -0.9 +// 22 866 unknown-2 Unknown Custom 0.9 +// 23 972 unknown-3 Unknown Custom -0.7 +// 24 1091 unknown-4 Unknown Custom 0.7 +// 25 1225 other-TCP Unknown Custom -0.5 +// 26 1375 other-UDP Unknown Custom 0.5 +// 27 1543 MySQL Database Sawtooth -0.4 (Phase 10) +// 28 1732 PostgreSQL Database Sawtooth -0.2 (Phase 10) +// 29 1944 Redis Database Sawtooth 0.2 (Phase 10) +// 30 2182 MongoDB Database Sawtooth 0.4 (Phase 10) +// 31 2449 SIP VoIP Sine 0.0 (Phase 10) +// +// Auto-assign range: [2500, 4000] Hz (see config/config.go) + // ClassFreqConfigs maps each traffic class to its synthesis parameters. -// Frequencies use musical intervals per D-02/D-03. Harmonics per D-05/D-06. -// Pan positions per D-12. +// Frequencies per Phase 9 major-second ladder design. Harmonics per D-05/D-06. +// Pan positions per D-12. Group field drives family-aware config output (GRP-04). var ClassFreqConfigs = map[classify.TrafficClass]FreqConfig{ - classify.ClassICMP: {BaseHz: 65.0, Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.4}, {3, 0.15}}, Pan: 0.0}, - classify.ClassDNS: {BaseHz: 110.0, Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.5}, {3, 0.25}}, Pan: -0.2}, - classify.ClassHTTPS: {BaseHz: 175.0, Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.6}, {3, 0.3}}, Pan: 0.2}, - classify.ClassHTTP: {BaseHz: 220.0, Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.5}, {4, 0.2}}, Pan: -0.35}, - classify.ClassSSH: {BaseHz: 330.0, Harmonics: []HarmonicDef{{1, 1.0}, {3, 0.6}, {5, 0.3}}, Pan: 0.35}, - classify.ClassSMTP: {BaseHz: 440.0, Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.3}, {3, 0.1}}, Pan: -0.55}, - classify.ClassNTP: {BaseHz: 520.0, Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.25}}, Pan: 0.55}, - classify.ClassDHCP: {BaseHz: 600.0, Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.35}, {3, 0.15}}, Pan: -0.75}, - classify.ClassOtherTCP: {BaseHz: 700.0, Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.2}}, Pan: 0.75}, - classify.ClassOtherUDP: {BaseHz: 780.0, Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.2}}, Pan: -0.75}, - // D-05: Unknown buckets in 850-1100 Hz dissonant range, detuned intervals - // D-06: Same dissonant harmonic character {1,1.0},{2,0.8},{3,0.4} for all 4 - classify.ClassUnknown1: {BaseHz: 862.0, Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.8}, {3, 0.4}}, Pan: 0.6}, - classify.ClassUnknown2: {BaseHz: 920.0, Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.8}, {3, 0.4}}, Pan: -0.6}, - classify.ClassUnknown3: {BaseHz: 981.0, Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.8}, {3, 0.4}}, Pan: 0.9}, - classify.ClassUnknown4: {BaseHz: 1047.0, Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.8}, {3, 0.4}}, Pan: -0.9}, + // --- Infrastructure (Triangle, 65-133 Hz) --- + classify.ClassICMP: { + BaseHz: 65.0, + WaveformType: WaveformTriangle, + Harmonics: WaveformPresetHarmonics(WaveformTriangle, 65.0, SampleRate), + Pan: -0.3, + Group: "Infrastructure", + }, + classify.ClassNTP: { + BaseHz: 73.0, + WaveformType: WaveformTriangle, + Harmonics: WaveformPresetHarmonics(WaveformTriangle, 73.0, SampleRate), + Pan: -0.1, + Group: "Infrastructure", + }, + classify.ClassDHCP: { + BaseHz: 82.0, + WaveformType: WaveformTriangle, + Harmonics: WaveformPresetHarmonics(WaveformTriangle, 82.0, SampleRate), + Pan: 0.1, + Group: "Infrastructure", + }, + classify.ClassDNS: { + BaseHz: 133.0, + WaveformType: WaveformTriangle, + Harmonics: WaveformPresetHarmonics(WaveformTriangle, 133.0, SampleRate), + Pan: 0.0, + Group: "Infrastructure", + }, + // --- Web (Sawtooth, 150-169 Hz) --- + classify.ClassHTTPS: { + BaseHz: 150.0, + WaveformType: WaveformSawtooth, + Harmonics: WaveformPresetHarmonics(WaveformSawtooth, 150.0, SampleRate), + Pan: -0.4, + Group: "Web", + }, + classify.ClassHTTP: { + BaseHz: 169.0, + WaveformType: WaveformSawtooth, + Harmonics: WaveformPresetHarmonics(WaveformSawtooth, 169.0, SampleRate), + Pan: -0.3, + Group: "Web", + }, + // --- Mail (Triangle, 214 Hz) --- + classify.ClassSMTP: { + BaseHz: 214.0, + WaveformType: WaveformTriangle, + Harmonics: WaveformPresetHarmonics(WaveformTriangle, 214.0, SampleRate), + Pan: 0.2, + Group: "Mail", + }, + // --- Remote Access (Square, 343 Hz) --- + classify.ClassSSH: { + BaseHz: 343.0, + WaveformType: WaveformSquare, + Harmonics: WaveformPresetHarmonics(WaveformSquare, 343.0, SampleRate), + Pan: -0.7, + Group: "Remote Access", + }, + // --- Unknown (Custom harmonics, 771-1375 Hz) --- + // D-05/D-06: dissonant harmonic character {1,1.0},{2,0.8},{3,0.4} retained for all Unknown entries. + // WaveformType is zero value (WaveformCustom) so bank.go uses the stored Harmonics directly. + classify.ClassUnknown1: { + BaseHz: 771.0, + Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.8}, {3, 0.4}}, + Pan: -0.9, + Group: "Unknown", + }, + classify.ClassUnknown2: { + BaseHz: 866.0, + Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.8}, {3, 0.4}}, + Pan: 0.9, + Group: "Unknown", + }, + classify.ClassUnknown3: { + BaseHz: 972.0, + Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.8}, {3, 0.4}}, + Pan: -0.7, + Group: "Unknown", + }, + classify.ClassUnknown4: { + BaseHz: 1091.0, + Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.8}, {3, 0.4}}, + Pan: 0.7, + Group: "Unknown", + }, + classify.ClassOtherTCP: { + BaseHz: 1225.0, + Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.8}, {3, 0.4}}, + Pan: -0.5, + Group: "Unknown", + }, + classify.ClassOtherUDP: { + BaseHz: 1375.0, + Harmonics: []HarmonicDef{{1, 1.0}, {2, 0.8}, {3, 0.4}}, + Pan: 0.5, + Group: "Unknown", + }, }