Go-based FM stereo transmitter with RDS, Windows-first and cross-platform
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

46 lines
1.1KB

  1. package audio
  2. import (
  3. "math"
  4. )
  5. type ToneSource struct {
  6. LeftFreq float64
  7. RightFreq float64
  8. SampleRate float64
  9. LeftPhase float64
  10. RightPhase float64
  11. Amplitude float64
  12. }
  13. func NewToneSource(sampleRate float64) *ToneSource {
  14. return &ToneSource{
  15. LeftFreq: 1000,
  16. RightFreq: 1600,
  17. SampleRate: sampleRate,
  18. Amplitude: 0.4,
  19. }
  20. }
  21. func NewConfiguredToneSource(sampleRate, leftHz, rightHz, amplitude float64) *ToneSource {
  22. src := NewToneSource(sampleRate)
  23. src.LeftFreq = leftHz
  24. src.RightFreq = rightHz
  25. src.Amplitude = amplitude
  26. return src
  27. }
  28. func (s *ToneSource) NextFrame() Frame {
  29. left := s.Amplitude * math.Sin(2*math.Pi*s.LeftPhase)
  30. right := s.Amplitude * math.Sin(2*math.Pi*s.RightPhase)
  31. s.LeftPhase += s.LeftFreq / s.SampleRate
  32. s.RightPhase += s.RightFreq / s.SampleRate
  33. if s.LeftPhase >= 1 {
  34. s.LeftPhase -= math.Floor(s.LeftPhase)
  35. }
  36. if s.RightPhase >= 1 {
  37. s.RightPhase -= math.Floor(s.RightPhase)
  38. }
  39. return NewFrame(Sample(left), Sample(right))
  40. }