File: 02-ducking.rst.txt

package info (click to toggle)
python-pyo 1.0.6-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 52,332 kB
  • sloc: python: 135,133; ansic: 127,822; javascript: 16,116; sh: 395; makefile: 388; cpp: 242
file content (49 lines) | stat: -rw-r--r-- 1,843 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
02-ducking.py - Adjust the gain of a signal based on the presence of another one.
============================================================================================================================================


Ducking is an audio effect commonly used in radio. In ducking, the
level of one audio signal is reduced by the presence of another signal.

Here we use a Follower object to track the RMS envelope of the voice signal. Then
we use an audio conditional to create a switch, whose value is 1 when the voice is
talking and 0 when it is silent. This signal is finally used to change the amplitude
of the music whenever the voice is talking.

.. code-block:: python

    from pyo import *
    
    s = Server().boot()
    
    # Alternate voice and silence.
    table = SndTable(SNDS_PATH + "/transparent.aif")
    metro = SDelay(Metro(3).play(), 1)
    voice = TrigEnv(metro, table, dur=table.getDur(), mul=0.7)
    stvoice = voice.mix(2).out()
    
    # Play some music-box style tune!
    freqs = midiToHz([60, 62, 64, 65, 67, 69, 71, 72])
    choice = Choice(choice=freqs, freq=[1, 2, 3, 4])
    port = Port(choice, risetime=0.001, falltime=0.001)
    sines = SineLoop(port, feedback=0.05)
    music = SPan(sines, pan=[0, 1, 0.2, 0.8, 0.5], mul=0.1).mix(2)
    
    # Follow voice RMS amplitude.
    follow = Follower(voice, freq=10)
    # talk = 1 if voice is playing and 0 if not.
    talk = follow > 0.005
    
    # Smooth the on/off signal (rising is faster than falling)...
    amp = Port(talk, risetime=0.05, falltime=0.1)
    # ... then rescale it (1 when no voice and 0.1 when voice is playing).
    ampscl = Scale(amp, outmin=1, outmax=0.1)
    
    # Display the gain factor.
    sc = Scope(ampscl)
    
    # Apply gain factor and output music.
    outsynth = (music * ampscl).out()
    
    s.gui(locals())