File: 01-dynamic-range.html

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 (184 lines) | stat: -rw-r--r-- 18,876 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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184

<!DOCTYPE html>

<html lang="en">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport"/><meta content="Docutils 0.17.1: http://docutils.sourceforge.net/" name="generator"/>
<title>01-dynamic-range.py - Adjust the dynamic range of the signal. — Pyo 1.0.5 documentation</title>
<link href="../../_static/pygments.css" rel="stylesheet" type="text/css"/>
<link href="../../_static/agogo.css" rel="stylesheet" type="text/css"/>
<link href="../../_static/sphinx-codeautolink.css" rel="stylesheet" type="text/css"/>
<link href="../../_static/autoclasstoc.css" rel="stylesheet" type="text/css"/>
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/sphinx_highlight.js"></script>
<link href="../../_static/E-PyoIcon.ico" rel="shortcut icon"/>
<link href="../../about.html" rel="author" title="About these documents"/>
<link href="../../genindex.html" rel="index" title="Index"/>
<link href="../../search.html" rel="search" title="Search"/>
<link href="02-ducking.html" rel="next" title="02-ducking.py - Adjust the gain of a signal based on the presence of another one."/>
<link href="index.html" rel="prev" title="08-dynamics"/>
</head><body>
<div class="header-wrapper" role="banner">
<div class="header">
<div class="headertitle"><a href="../../index.html">Pyo 1.0.5 documentation</a></div>
<div aria-label="related navigation" class="rel" role="navigation">
<a accesskey="P" href="index.html" title="08-dynamics">previous</a> |
          <a accesskey="N" href="02-ducking.html" title="02-ducking.py - Adjust the gain of a signal based on the presence of another one.">next</a> |
          <a accesskey="I" href="../../genindex.html" title="General Index">index</a>
</div>
</div>
</div>
<div class="content-wrapper">
<div class="content">
<div class="sidebar">
<h3>Table of Contents</h3>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../about.html">About pyo</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../download.html">Installing pyo with pip</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../compiling.html">Compiling pyo from sources</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../structure.html">Structure of the library</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../gettingstarted.html">Getting started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../winaudioinspect.html">Configuring the audio output (Windows)</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../perftips.html">Improve performance of pyo programs</a></li>
</ul>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../api/index.html">API documentation</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../index.html">Examples</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../01-intro/index.html">First steps</a></li>
<li class="toctree-l2"><a class="reference internal" href="../02-controls/index.html">Parameter control</a></li>
<li class="toctree-l2"><a class="reference internal" href="../03-generators/index.html">Synthesis generators</a></li>
<li class="toctree-l2"><a class="reference internal" href="../04-soundfiles/index.html">Playing with soundfiles</a></li>
<li class="toctree-l2"><a class="reference internal" href="../05-envelopes/index.html">Amplitude envelopes</a></li>
<li class="toctree-l2"><a class="reference internal" href="../06-filters/index.html">Filtering</a></li>
<li class="toctree-l2"><a class="reference internal" href="../07-effects/index.html">Creating sound effects</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="index.html">Dynamic range of audio signals</a></li>
<li class="toctree-l2"><a class="reference internal" href="../09-callbacks/index.html">Calling python functions from audio objects</a></li>
<li class="toctree-l2"><a class="reference internal" href="../10-tables/index.html">Using tables</a></li>
<li class="toctree-l2"><a class="reference internal" href="../16-midi/index.html">How to use MIDI with pyo</a></li>
<li class="toctree-l2"><a class="reference internal" href="../17-osc/index.html">How to use OSC with pyo</a></li>
<li class="toctree-l2"><a class="reference internal" href="../19-multirate/index.html">Multirate audio processing</a></li>
<li class="toctree-l2"><a class="reference internal" href="../20-multicore/index.html">Multicore audio programming</a></li>
<li class="toctree-l2"><a class="reference internal" href="../21-utilities/index.html">Utilities</a></li>
<li class="toctree-l2"><a class="reference internal" href="../22-events/index.html">Events framework</a></li>
<li class="toctree-l2"><a class="reference internal" href="../23-expression/index.html">Evaluating prefix expression</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../tutorials/index.html">Advanced tutorials</a></li>
</ul>
<div role="search">
<h3 style="margin-top: 1.5em;">Search</h3>
<form action="../../search.html" class="search" method="get">
<input name="q" type="text"/>
<input type="submit" value="Go"/>
</form>
</div>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="dynamic-range-py-adjust-the-dynamic-range-of-the-signal">
<h1>01-dynamic-range.py - Adjust the dynamic range of the signal.<a class="headerlink" href="#dynamic-range-py-adjust-the-dynamic-range-of-the-signal" title="Permalink to this heading">¶</a></h1>
<p>Comparison of three objects used to adjust the dynamic range of the signal.</p>
<ul class="simple">
<li><p>Compress : Reduces the dynamic range of an audio signal.</p></li>
<li><p>Expand : Increases the dynamic range of an audio signal.</p></li>
<li><p>Gate : Allows a signal to pass only when its amplitude is above a threshold.</p></li>
</ul>
<p>These three objects, by default, process independently each audio stream
relatively to its own RMS value. This can be a problem if they are passed
a stereo signal (or any multiphonic signals) where both channels should be
processed in the same way.</p>
<p>An alternative usage to the one illustrated below is to mix a multi-channel
signal prior to the dynamic processor and to tell the object to output the
amplitude value that should be applied to all streams at once. Something
like this:</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><a class="sphinx-codeautolink-a" href="../../api/classes/players.html#pyo.SfPlayer" title="pyo.lib.players.SfPlayer"><span class="n">sf</span></a> <span class="o">=</span> <a class="sphinx-codeautolink-a" href="../../api/classes/players.html#pyo.SfPlayer" title="pyo.lib.players.SfPlayer"><span class="n">SfPlayer</span></a><span class="p">(</span><span class="s2">"your/stereo.sound.wav"</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><a class="sphinx-codeautolink-a" href="../../api/classes/dynamics.html#pyo.Compress" title="pyo.lib.dynamics.Compress"><span class="n">cmp</span></a> <span class="o">=</span> <a class="sphinx-codeautolink-a" href="../../api/classes/dynamics.html#pyo.Compress" title="pyo.lib.dynamics.Compress"><span class="n">Compress</span></a><span class="p">(</span><span class="n">sf</span><span class="o">.</span><span class="n">mix</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span> <span class="n">thresh</span><span class="o">=-</span><span class="mi">18</span><span class="p">,</span> <span class="n">ratio</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">outputAmp</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="c1"># Compress both signal with the common amplitude curve.</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">compressed</span> <span class="o">=</span> <a class="sphinx-codeautolink-a" href="../../api/classes/players.html#pyo.SfPlayer" title="pyo.lib.players.SfPlayer"><span class="n">sf</span></a> <span class="o">*</span> <a class="sphinx-codeautolink-a" href="../../api/classes/dynamics.html#pyo.Compress" title="pyo.lib.dynamics.Compress"><span class="n">cmp</span></a>
</pre></div>
</div>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <a class="sphinx-codeautolink-a" href="../../api/alphabetical.html#module-pyo" title="pyo"><span class="nn">pyo</span></a> <span class="kn">import</span> <span class="o">*</span>

<span class="n">s</span> <span class="o">=</span> <a class="sphinx-codeautolink-a" href="../../api/classes/server.html#pyo.Server" title="pyo.lib.server.Server"><span class="n">Server</span></a><span class="p">()</span><span class="o">.</span><span class="n">boot</span><span class="p">()</span>

<span class="c1"># The original source.</span>
<a class="sphinx-codeautolink-a" href="../../api/classes/players.html#pyo.SfPlayer" title="pyo.lib.players.SfPlayer"><span class="n">src</span></a> <span class="o">=</span> <a class="sphinx-codeautolink-a" href="../../api/classes/players.html#pyo.SfPlayer" title="pyo.lib.players.SfPlayer"><span class="n">SfPlayer</span></a><span class="p">(</span><span class="s2">"../snds/drumloop.wav"</span><span class="p">,</span> <span class="n">loop</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>

<span class="c1"># The three dynamic processing.</span>
<a class="sphinx-codeautolink-a" href="../../api/classes/dynamics.html#pyo.Compress" title="pyo.lib.dynamics.Compress"><span class="n">cmp</span></a> <span class="o">=</span> <a class="sphinx-codeautolink-a" href="../../api/classes/dynamics.html#pyo.Compress" title="pyo.lib.dynamics.Compress"><span class="n">Compress</span></a><span class="p">(</span><a class="sphinx-codeautolink-a" href="../../api/classes/players.html#pyo.SfPlayer" title="pyo.lib.players.SfPlayer"><span class="n">src</span></a><span class="p">,</span> <span class="n">thresh</span><span class="o">=-</span><span class="mi">18</span><span class="p">,</span> <span class="n">ratio</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">risetime</span><span class="o">=</span><span class="mf">0.005</span><span class="p">,</span> <span class="n">falltime</span><span class="o">=</span><span class="mf">0.05</span><span class="p">,</span> <span class="n">knee</span><span class="o">=</span><span class="mf">0.5</span><span class="p">)</span>
<a class="sphinx-codeautolink-a" href="../../api/classes/dynamics.html#pyo.Expand" title="pyo.lib.dynamics.Expand"><span class="n">exp</span></a> <span class="o">=</span> <a class="sphinx-codeautolink-a" href="../../api/classes/dynamics.html#pyo.Expand" title="pyo.lib.dynamics.Expand"><span class="n">Expand</span></a><span class="p">(</span><a class="sphinx-codeautolink-a" href="../../api/classes/players.html#pyo.SfPlayer" title="pyo.lib.players.SfPlayer"><span class="n">src</span></a><span class="p">,</span> <span class="n">downthresh</span><span class="o">=-</span><span class="mi">32</span><span class="p">,</span> <span class="n">upthresh</span><span class="o">=-</span><span class="mi">12</span><span class="p">,</span> <span class="n">ratio</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">risetime</span><span class="o">=</span><span class="mf">0.005</span><span class="p">,</span> <span class="n">falltime</span><span class="o">=</span><span class="mf">0.05</span><span class="p">)</span>
<a class="sphinx-codeautolink-a" href="../../api/classes/dynamics.html#pyo.Gate" title="pyo.lib.dynamics.Gate"><span class="n">gat</span></a> <span class="o">=</span> <a class="sphinx-codeautolink-a" href="../../api/classes/dynamics.html#pyo.Gate" title="pyo.lib.dynamics.Gate"><span class="n">Gate</span></a><span class="p">(</span><a class="sphinx-codeautolink-a" href="../../api/classes/players.html#pyo.SfPlayer" title="pyo.lib.players.SfPlayer"><span class="n">src</span></a><span class="p">,</span> <span class="n">thresh</span><span class="o">=-</span><span class="mi">40</span><span class="p">,</span> <span class="n">risetime</span><span class="o">=</span><span class="mf">0.005</span><span class="p">,</span> <span class="n">falltime</span><span class="o">=</span><span class="mf">0.05</span><span class="p">)</span>

<span class="c1"># These are labels that are shown as the scope window title.</span>
<span class="n">labels</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"Original"</span><span class="p">,</span> <span class="s2">"Compressed"</span><span class="p">,</span> <span class="s2">"Expanded"</span><span class="p">,</span> <span class="s2">"Gated"</span><span class="p">]</span>

<span class="c1"># List of signals to choose from.</span>
<span class="n">signals</span> <span class="o">=</span> <span class="p">[</span><a class="sphinx-codeautolink-a" href="../../api/classes/players.html#pyo.SfPlayer" title="pyo.lib.players.SfPlayer"><span class="n">src</span></a><span class="p">,</span> <a class="sphinx-codeautolink-a" href="../../api/classes/dynamics.html#pyo.Compress" title="pyo.lib.dynamics.Compress"><span class="n">cmp</span></a><span class="p">,</span> <a class="sphinx-codeautolink-a" href="../../api/classes/dynamics.html#pyo.Expand" title="pyo.lib.dynamics.Expand"><span class="n">exp</span></a><span class="p">,</span> <a class="sphinx-codeautolink-a" href="../../api/classes/dynamics.html#pyo.Gate" title="pyo.lib.dynamics.Gate"><span class="n">gat</span></a><span class="p">]</span>

<span class="c1"># Selector is used here to choose which signal to listen to.</span>
<a class="sphinx-codeautolink-a" href="../../api/classes/pan.html#pyo.Selector" title="pyo.lib.pan.Selector"><span class="n">output</span></a> <span class="o">=</span> <a class="sphinx-codeautolink-a" href="../../api/classes/pan.html#pyo.Selector" title="pyo.lib.pan.Selector"><span class="n">Selector</span></a><span class="p">(</span><span class="n">signals</span><span class="p">)</span>

<span class="c1"># Converts the signal from mono to stereo.</span>
<span class="n">stout</span> <span class="o">=</span> <span class="n">output</span><span class="o">.</span><span class="n">mix</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="o">.</span><span class="n">out</span><span class="p">()</span>

<span class="c1"># Live oscilloscope of the alternated signals.</span>
<a class="sphinx-codeautolink-a" href="../../api/classes/analysis.html#pyo.Scope" title="pyo.lib.analysis.Scope"><span class="n">sc</span></a> <span class="o">=</span> <a class="sphinx-codeautolink-a" href="../../api/classes/analysis.html#pyo.Scope" title="pyo.lib.analysis.Scope"><span class="n">Scope</span></a><span class="p">(</span><a class="sphinx-codeautolink-a" href="../../api/classes/pan.html#pyo.Selector" title="pyo.lib.pan.Selector"><span class="n">output</span></a><span class="p">,</span> <span class="n">wintitle</span><span class="o">=</span><span class="s2">"=== Original ==="</span><span class="p">)</span>

<span class="c1"># The endOfLoop function cycles through the different signals</span>
<span class="c1"># and change the selection of the Selector object.</span>
<span class="n">num_of_sigs</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">signals</span><span class="p">)</span>
<span class="n">c</span> <span class="o">=</span> <span class="mi">1</span>


<span class="k">def</span> <span class="nf">endOfLoop</span><span class="p">():</span>
    <span class="k">global</span> <span class="n">c</span>
    <span class="n">output</span><span class="o">.</span><span class="n">voice</span> <span class="o">=</span> <span class="n">c</span>
    <span class="k">if</span> <span class="n">sc</span><span class="o">.</span><span class="n">viewFrame</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
        <span class="n">sc</span><span class="o">.</span><span class="n">viewFrame</span><span class="o">.</span><span class="n">SetTitle</span><span class="p">(</span><span class="s2">"=== </span><span class="si">%s</span><span class="s2"> ==="</span> <span class="o">%</span> <span class="n">labels</span><span class="p">[</span><span class="n">c</span><span class="p">])</span>
    <span class="n">c</span> <span class="o">=</span> <span class="p">(</span><span class="n">c</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="n">num_of_sigs</span>


<span class="c1"># endOfLoop is called every time the SfPlayer reaches the end of the sound.</span>
<a class="sphinx-codeautolink-a" href="../../api/classes/triggers.html#pyo.TrigFunc" title="pyo.lib.triggers.TrigFunc"><span class="n">tf</span></a> <span class="o">=</span> <a class="sphinx-codeautolink-a" href="../../api/classes/triggers.html#pyo.TrigFunc" title="pyo.lib.triggers.TrigFunc"><span class="n">TrigFunc</span></a><span class="p">(</span><a class="sphinx-codeautolink-a" href="../../api/classes/players.html#pyo.SfPlayer" title="pyo.lib.players.SfPlayer"><span class="n">src</span></a><span class="p">[</span><span class="s2">"trig"</span><span class="p">],</span> <span class="n">endOfLoop</span><span class="p">)</span>

<span class="n">s</span><span class="o">.</span><span class="n">gui</span><span class="p">(</span><span class="nb">locals</span><span class="p">())</span>
</pre></div>
</div>
</section>
<div class="clearer"></div>
</div>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
</div>
<div class="footer-wrapper">
<div class="footer">
<div class="left">
<div aria-label="related navigaton" role="navigation">
<a href="index.html" title="08-dynamics">previous</a> |
            <a href="02-ducking.html" title="02-ducking.py - Adjust the gain of a signal based on the presence of another one.">next</a> |
            <a href="../../genindex.html" title="General Index">index</a>
</div>
<div aria-label="source link" role="note">
</div>
</div>
<div class="right">
<div class="footer" role="contentinfo">
        © Copyright 2021, Olivier Bélanger.
      Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 5.3.0.
    </div>
</div>
<div class="clearer"></div>
</div>
</div>
</body>
</html>