Source code for voicebox.effects.ring_mod

__all__ = ["RingMod"]

from math import pi
from typing import Callable

import numpy as np

from voicebox.audio import Audio
from voicebox.effects.effect import EffectWithDryWet

WaveFunc = Callable[[np.ndarray], np.ndarray]


[docs] class RingMod(EffectWithDryWet): """ Ring modulation effect. Multiplies the audio signal by a carrier wave. Can be used to create choppy, Doctor Who Dalek-like effects at low carrier frequencies, or bell-like sounds at higher carrier frequencies. Args: carrier_freq (float): Carrier wave frequency in Hz. carrier_wave: Carrier wave function. Defaults to ``np.sin``. dry: Dry (input) signal level. 0 is none, 1 is unity. Default is .5. wet: Wet (affected) signal level. 0 is none, 1 is unity. Default is .5. """ carrier_freq: float = 20.0 carrier_wave: WaveFunc = np.sin def __init__( self, carrier_freq: float = 20.0, carrier_wave: WaveFunc = np.sin, dry: float = 0.5, wet: float = 0.5, ): super().__init__(dry, wet) self.carrier_freq = carrier_freq self.carrier_wave = carrier_wave
[docs] def get_wet_signal(self, audio: Audio) -> np.ndarray: t = np.arange(len(audio.signal)) / audio.sample_rate carrier_signal = self.carrier_wave(2 * pi * self.carrier_freq * t) return audio.signal * carrier_signal