|
- package audio
-
- import (
- "math"
- )
-
- type ToneSource struct {
- LeftFreq float64
- RightFreq float64
- SampleRate float64
- LeftPhase float64
- RightPhase float64
- Amplitude float64
- }
-
- func NewToneSource(sampleRate float64) *ToneSource {
- return &ToneSource{
- LeftFreq: 1000,
- RightFreq: 1600,
- SampleRate: sampleRate,
- Amplitude: 0.4,
- }
- }
-
- func (s *ToneSource) NextFrame() Frame {
- left := s.Amplitude * math.Sin(2*math.Pi*s.LeftPhase)
- right := s.Amplitude * math.Sin(2*math.Pi*s.RightPhase)
- s.LeftPhase += s.LeftFreq / s.SampleRate
- s.RightPhase += s.RightFreq / s.SampleRate
- if s.LeftPhase >= 1 {
- s.LeftPhase -= math.Floor(s.LeftPhase)
- }
- if s.RightPhase >= 1 {
- s.RightPhase -= math.Floor(s.RightPhase)
- }
- return NewFrame(Sample(left), Sample(right))
- }
|