0.1.0 - Initial commit
This commit is contained in:
80
lib/audio/oscillator.go
Normal file
80
lib/audio/oscillator.go
Normal file
@@ -0,0 +1,80 @@
|
||||
package audio
|
||||
|
||||
import "math"
|
||||
|
||||
// Generates audio samples for a given waveform type
|
||||
func (g *Generator) generateOscillator(waveType string, freq, duration, amplitude, phase float64) []float64 {
|
||||
samples := int(duration * g.sampleRate)
|
||||
if samples <= 0 {
|
||||
return nil
|
||||
}
|
||||
output := make([]float64, samples)
|
||||
|
||||
sampleRateInv := 1.0 / g.sampleRate
|
||||
twoPiFreq := 2 * math.Pi * freq
|
||||
fadeSamples := int(math.Min(0.005*g.sampleRate, float64(samples)*0.1))
|
||||
fadeSamplesInv := 1.0 / float64(fadeSamples)
|
||||
switch waveType {
|
||||
case "sine":
|
||||
for i := 0; i < samples; i++ {
|
||||
t := float64(i)*sampleRateInv + phase
|
||||
sample := math.Sin(twoPiFreq*t) * amplitude
|
||||
|
||||
if i < fadeSamples {
|
||||
sample *= float64(i) * fadeSamplesInv
|
||||
} else if i >= samples-fadeSamples {
|
||||
sample *= float64(samples-i) * fadeSamplesInv
|
||||
}
|
||||
|
||||
output[i] = sample
|
||||
}
|
||||
case "square":
|
||||
for i := 0; i < samples; i++ {
|
||||
t := float64(i)*sampleRateInv + phase
|
||||
var sample float64
|
||||
if math.Sin(twoPiFreq*t) > 0 {
|
||||
sample = amplitude
|
||||
} else {
|
||||
sample = -amplitude
|
||||
}
|
||||
|
||||
if i < fadeSamples {
|
||||
sample *= float64(i) * fadeSamplesInv
|
||||
} else if i >= samples-fadeSamples {
|
||||
sample *= float64(samples-i) * fadeSamplesInv
|
||||
}
|
||||
|
||||
output[i] = sample
|
||||
}
|
||||
case "saw":
|
||||
for i := 0; i < samples; i++ {
|
||||
t := float64(i)*sampleRateInv + phase
|
||||
sample := (2*(t*freq-math.Floor(0.5+t*freq))) * amplitude
|
||||
|
||||
if i < fadeSamples {
|
||||
sample *= float64(i) * fadeSamplesInv
|
||||
} else if i >= samples-fadeSamples {
|
||||
sample *= float64(samples-i) * fadeSamplesInv
|
||||
}
|
||||
|
||||
output[i] = sample
|
||||
}
|
||||
case "triangle":
|
||||
for i := 0; i < samples; i++ {
|
||||
t := float64(i)*sampleRateInv + phase
|
||||
sample := (math.Abs(2*(t*freq-math.Floor(t*freq+0.5)))*2 - 1) * amplitude
|
||||
|
||||
if i < fadeSamples {
|
||||
sample *= float64(i) * fadeSamplesInv
|
||||
} else if i >= samples-fadeSamples {
|
||||
sample *= float64(samples-i) * fadeSamplesInv
|
||||
}
|
||||
|
||||
output[i] = sample
|
||||
}
|
||||
default:
|
||||
return output
|
||||
}
|
||||
|
||||
return output
|
||||
}
|
||||
Reference in New Issue
Block a user