2026-03-26 11:58:44 +01:00
|
|
|
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
|
2026-03-26 13:11:24 +01:00
|
|
|
NumLayers = 14
|
|
|
|
|
GainPerLayer = 1.0 / float64(NumLayers) // D-10: ~0.0714
|
2026-03-26 11:58:44 +01:00
|
|
|
WhisperFloor = 0.03 // D-08/D-09: 3% of max amplitude
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// HarmonicDef defines one partial in an additive synthesizer.
|
|
|
|
|
type HarmonicDef struct {
|
|
|
|
|
Ratio int // harmonic number: 1=fundamental, 2=octave, 3=fifth+octave, etc.
|
|
|
|
|
Amplitude float64 // relative weight
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// FreqConfig holds synthesis parameters for one traffic class.
|
|
|
|
|
type FreqConfig struct {
|
|
|
|
|
BaseHz float64
|
|
|
|
|
Harmonics []HarmonicDef
|
|
|
|
|
Pan float64 // [-1, 1]: -1=full left, 0=center, +1=full right
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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.
|
|
|
|
|
var ClassFreqConfigs = map[classify.TrafficClass]FreqConfig{
|
|
|
|
|
classify.ClassICMP: {65.0, []HarmonicDef{{1, 1.0}, {2, 0.4}, {3, 0.15}}, 0.0},
|
|
|
|
|
classify.ClassDNS: {110.0, []HarmonicDef{{1, 1.0}, {2, 0.5}, {3, 0.25}}, -0.2},
|
|
|
|
|
classify.ClassHTTPS: {175.0, []HarmonicDef{{1, 1.0}, {2, 0.6}, {3, 0.3}}, 0.2},
|
|
|
|
|
classify.ClassHTTP: {220.0, []HarmonicDef{{1, 1.0}, {2, 0.5}, {4, 0.2}}, -0.35},
|
|
|
|
|
classify.ClassSSH: {330.0, []HarmonicDef{{1, 1.0}, {3, 0.6}, {5, 0.3}}, 0.35},
|
|
|
|
|
classify.ClassSMTP: {440.0, []HarmonicDef{{1, 1.0}, {2, 0.3}, {3, 0.1}}, -0.55},
|
|
|
|
|
classify.ClassNTP: {520.0, []HarmonicDef{{1, 1.0}, {2, 0.25}}, 0.55},
|
|
|
|
|
classify.ClassDHCP: {600.0, []HarmonicDef{{1, 1.0}, {2, 0.35}, {3, 0.15}}, -0.75},
|
|
|
|
|
classify.ClassOtherTCP: {700.0, []HarmonicDef{{1, 1.0}, {2, 0.2}}, 0.75},
|
|
|
|
|
classify.ClassOtherUDP: {780.0, []HarmonicDef{{1, 1.0}, {2, 0.2}}, -0.75},
|
2026-03-26 13:11:24 +01:00
|
|
|
// 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: {862.0, []HarmonicDef{{1, 1.0}, {2, 0.8}, {3, 0.4}}, 0.6},
|
|
|
|
|
classify.ClassUnknown2: {920.0, []HarmonicDef{{1, 1.0}, {2, 0.8}, {3, 0.4}}, -0.6},
|
|
|
|
|
classify.ClassUnknown3: {981.0, []HarmonicDef{{1, 1.0}, {2, 0.8}, {3, 0.4}}, 0.9},
|
|
|
|
|
classify.ClassUnknown4: {1047.0, []HarmonicDef{{1, 1.0}, {2, 0.8}, {3, 0.4}}, -0.9},
|
2026-03-26 11:58:44 +01:00
|
|
|
}
|