Categorygithub.com/xyproto/audioeffects
repositorypackage
0.11.1
Repository: https://github.com/xyproto/audioeffects.git
Documentation: pkg.go.dev

# Packages

No description provided by the author

# README

Audio Effects

Apply audio effects to samples.

Note that this package is a bit experimental and a work in progress.

Audio samples are passed in as []float64. The sample rate is typically 44100 or 48000.

Example use

Write a .wav file that has a very simple clap-like sound, with some reverb applied:

package main

import (
    "log"
    "math"
    "math/rand"
    "os"

    "github.com/go-audio/audio"
    "github.com/go-audio/wav"
    "github.com/xyproto/audioeffects"
)

func writeWav(filename string, samples []float64, sampleRate int, numChannels int) error {
    var (
        ch, intSample int
        intSamples    = make([]int, len(samples)*numChannels)
    )
    for i, sample := range samples {
        if sample > 1.0 {
            sample = 1.0
        } else if sample < -1.0 {
            sample = -1.0
        }
        intSample = int(math.Round(sample * 32767))
        for ch = 0; ch < numChannels; ch++ {
            intSamples[i*numChannels+ch] = intSample
        }
    }
    buf := &audio.IntBuffer{
        Data:           intSamples,
        Format:         &audio.Format{SampleRate: sampleRate, NumChannels: numChannels},
        SourceBitDepth: 16,
    }
    file, err := os.Create(filename)
    if err != nil {
        return err
    }
    defer file.Close()
    enc := wav.NewEncoder(file, sampleRate, 16, numChannels, 1)
    if err := enc.Write(buf); err != nil {
        return err
    }
    return enc.Close()
}

func main() {
    sampleRate := 48000
    duration := 3.0

    numSamples := int(duration * float64(sampleRate))
    samples := make([]float64, numSamples)

    // Create white noise burst with quick decay
    for i := 0; i < numSamples; i++ {
        if i < int(float64(sampleRate)*0.05) { // 50 ms of noise
            samples[i] = (rand.Float64()*2 - 1) * (1.0 - float64(i)/(float64(sampleRate)*0.05))
        } else {
            samples[i] = 0.0
        }
    }

    // Apply Reverb with configurable mix
    delayTimes := []float64{0.2, 0.4, 0.6, 0.8} // in seconds
    decays := []float64{0.6, 0.4, 0.2, 0.1}     // decay factors
    mix := 0.3                                  // 30% wet signal, 70% dry signal

    reverbed := audioeffects.Reverb(samples, sampleRate, delayTimes, decays, mix)

    // Normalize to prevent clipping
    normalized := audioeffects.NormalizeSamples(reverbed, 0.8)

    const filename = "clap_reverb.wav"

    err := writeWav(filename, normalized, sampleRate, 1)
    if err != nil {
        log.Fatalf("Failed to write WAV to %s: %v", filename, err)
    }
    log.Printf("Successfully wrote %s\n", filename)
}

Exported functions in this package

func lowPassCoefficients(filterType string, freq, Q, sampleRate float64) (float64, float64, float64, float64, float64)
func BiquadFilter(samples []float64, filterType string, freq, Q, sampleRate float64) []float64
func FadeIn(samples []float64, duration float64, sampleRate int) []float64
func FadeOut(samples []float64, duration float64, sampleRate int) []float64
func LowPassFilter(samples []float64, cutoffFreq float64, sampleRate int) []float64
func HighPassFilter(samples []float64, cutoffFreq float64, sampleRate int) []float64
func BandPassFilter(samples []float64, lowFreq, highFreq float64, sampleRate int) []float64
func NoiseGate(samples []float64, threshold, attack, release float64, sampleRate int) []float64
func StereoDelay(left, right []float64, sampleRate int, delayTimeLeft, delayTimeRight float64, feedback, mix float64) ([]float64, []float64)
func Expander(samples []float64, threshold, ratio, attack, release float64, sampleRate int) []float64
func SoftClip(sample, drive float64) float64
func SoftClippingDistortion(samples []float64, drive float64) []float64
func SidechainCompressor(target, trigger []float64, threshold, ratio, attack, release float64, sampleRate int) []float64
func Compressor(samples []float64, threshold, ratio, attack, release float64, sampleRate int) []float64
func Envelope(samples []float64, attack, decay, sustainLevel, release float64, sampleRate int) []float64
func Panning(samples []float64, pan float64) ([]float64, []float64)
func Tremolo(samples []float64, sampleRate int, rate, depth float64) []float64
func Flanger(samples []float64, sampleRate int, baseDelay, modDepth, modRate, feedback, mix float64) []float64
func Phaser(samples []float64, sampleRate int, rate, depth, feedback float64) []float64
func RingModulation(samples []float64, carrierFreq float64, sampleRate int) []float64
func WahWah(samples []float64, sampleRate int, baseFreq, sweepFreq, Q float64) []float64
func StereoWidening(left, right []float64, width float64) ([]float64, []float64)
func MultibandCompression(samples []float64, bands []struct
func PitchShift(samples []float64, semitones float64) []float64
func FrequencyModulation(samples []float64, carrierFreq, modDepth, sampleRate float64) []float64
func PitchModulation(samples []float64, modFreq, modDepth float64, sampleRate int) []float64
func Reverb(samples []float64, sampleRate int, delayTimes []float64, decays []float64, mix float64) []float64
func Chorus(samples []float64, sampleRate int, delay, depth, rate, mix float64) []float64
func Bitcrusher(samples []float64, bitDepth int, sampleRateReduction int) []float64
func Drive(sample, drive float64) float64
func Limiter(samples []float64) []float64
func NormalizeSamples(samples []float64, targetPeak float64) []float64
func SubtractOp(duration, amplitude float64, b1 float64, ampEnv []float64, sampleRate int) []float64
func AddPartials(duration, amplitude, frequency float64, partials []float64, ampEnv []float64, sampleRate int) []float64
func FMSynthesis(duration, carrierFreq, modFreq, modIndex, amplitude float64, ampEnv []float64, sampleRate int) []float64
func KarplusStrong(duration, amplitude float64, p int, b float64, sampleRate int) []float64
func GranularSynthesis(samples []float64, grainSize, overlap int, sampleRate int) []float64
func QuadraticFadeIn(samples []float64, duration float64, sampleRate int) []float64
func QuadraticFadeOut(samples []float64, duration float64, sampleRate int) []float64
func EnvelopeAtTime(t, attack, decay, sustainLevel, release, duration float64) float64
func Shimmer(samples []float64, sampleRate int, delayTime float64, mix float64, pitchShiftSemitones float64, feedback float64) []float64
func ShimmerBitcrusher(samples []float64, sampleRate int, delayTime float64, mix float64, pitchShiftSemitones float64, bitDepth int, sampleRateReduction int, feedback float64) []float64

General info

  • Version: 0.11.1
  • License: MIT