8000 Audio · gto76/python-cheatsheet@335fcd1 · GitHub
[go: up one dir, main page]

Skip to content

Commit 335fcd1

Browse files
committed
Audio
1 parent bfb3065 commit 335fcd1

File tree

3 files changed

+59
-45
lines changed

3 files changed

+59
-45
lines changed

README.md

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2867,7 +2867,7 @@ import wave
28672867
```
28682868

28692869
```python
2870-
<Wave> = wave.open('<path>', 'rb') # Opens the WAV file.
2870+
<Wave> = wave.open('<path>') # Opens the WAV file for reading.
28712871
<int> = <Wave>.getframerate() # Returns number of frames per second.
28722872
<int> = <Wave>.getnchannels() # Returns number of samples per frame.
28732873
<int> = <Wave>.getsampwidth() # Returns number of bytes per sample.
@@ -2880,7 +2880,7 @@ import wave
28802880
<Wave>.setframerate(<int>) # Pass 44100 for CD, 48000 for video.
28812881
<Wave>.setnchannels(<int>) # Pass 1 for mono, 2 for stereo.
28822882
<Wave>.setsampwidth(<int>) # Pass 2 for CD, 3 for hi-res sound.
2883-
<Wave>.setparams(<tuple>) # Sets all parameters.
2883+
<Wave>.setparams(<tuple>) # Tuple must contain all parameters.
28842884
<Wave>.writeframes(<bytes>) # Appends frames to the file.
28852885
```
28862886
* **Bytes object contains a sequence of frames, each consisting of one or more samples.**
@@ -2904,28 +2904,28 @@ import wave
29042904
```python
29052905
def read_wav_file(filename):
29062906
def get_int(bytes_obj):
2907-
an_int = int.from_bytes(bytes_obj, 'little', signed=(sampwidth != 1))
2908-
return an_int - 128 * (sampwidth == 1)
2909-
with wave.open(filename, 'rb') as file:
2910-
sampwidth = file.getsampwidth()
2907+
an_int = int.from_bytes(bytes_obj, 'little', signed=(p.sampwidth != 1))
2908+
return an_int - 128 * (p.sampwidth == 1)
2909+
with wave.open(filename) as file:
2910+
p = file.getparams()
29112911
frames = file.readframes(-1)
2912-
bytes_samples = (frames[i : i+sampwidth] for i in range(0, len(frames), sampwidth))
2913-
return [get_int(b) / pow(2, sampwidth * 8 - 1) for b in bytes_samples]
2912+
bytes_samples = (frames[i : i + p.sampwidth] for i in range(0, len(frames), p.sampwidth))
2913+
return [get_int(b) / pow(2, p.sampwidth * 8 - 1) for b in bytes_samples], p
29142914
```
29152915

29162916
### Write Float Samples to WAV File
29172917
```python
2918-
def write_to_wav_file(filename, float_samples, nchannels=1, sampwidth=2, framerate=44100):
2918+
def write_to_wav_file(filename, samples_f, p=None, nchannels=1, sampwidth=2, framerate=44100):
29192919
def get_bytes(a_float):
29202920
a_float = max(-1, min(1 - 2e-16, a_float))
2921-
a_float += sampwidth == 1
2922-
a_float *= pow(2, sampwidth * 8 - 1)
2923-
return int(a_float).to_bytes(sampwidth, 'little', signed=(sampwidth != 1))
2921+
a_float += p.sampwidth == 1
2922+
a_float *= pow(2, p.sampwidth * 8 - 1)
2923+
return int(a_float).to_bytes(p.sampwidth, 'little', signed=(p.sampwidth != 1))
2924+
if p is None:
2925+
p = wave._wave_params(nchannels, sampwidth, framerate, 0, 'NONE', 'not compressed')
29242926
with wave.open(filename, 'wb') as file:
2925-
file.setnchannels(nchannels)
2926-
file.setsampwidth(sampwidth)
2927-
file.setframerate(framerate)
2928-
file.writeframes(b''.join(get_bytes(f) for f in float_samples))
2927+
file.setparams(p)
2928+
file.writeframes(b''.join(get_bytes(f) for f in samples_f))
29292929
```
29302930

29312931
### Examples
@@ -2936,12 +2936,12 @@ samples_f = (sin(i * 2 * pi * 440 / 44100) for i in range(100_000))
29362936
write_to_wav_file('test.wav', samples_f)
29372937
```
29382938

2939-
#### Adds noise to the mono WAV file:
2939+
#### Adds noise to the WAV file:
29402940
```python
2941-
from random import random
2942-
add_noise = lambda value: value + (random() - 0.5) * 0.03
2943-
samples_f = (add_noise(f) for f in read_wav_file('test.wav'))
2944-
write_to_wav_file('test.wav', samples_f)
2941+
from random import uniform
2942+
samples_f, params = read_wav_file('test.wav')
2943+
samples_f = (f + uniform(-0.05, 0.05) for f in samples_f)
2944+
write_to_wav_file('test.wav', samples_f, params)
29452945
```
29462946

29472947
#### Plays the WAV file:

index.html

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454

5555
<body>
5656
<header>
57-
<aside>October 2, 2024</aside>
57+
<aside>October 3, 2024</aside>
5858
<a href="https://gto76.github.io" rel="author">Jure Šorn</a>
5959
</header>
6060

@@ -2340,7 +2340,7 @@ <h3 id="format-2">Format</h3><div><h4 id="forstandardtypesizesandmanualalignment
23402340
<div><h2 id="audio"><a href="#audio" name="audio">#</a>Audio</h2><pre><code class="python language-python hljs"><span class="hljs-keyword">import</span> wave
23412341
</code></pre></div>
23422342

2343-
<pre><code class="python language-python hljs">&lt;Wave&gt; = wave.open(<span class="hljs-string">'&lt;path&gt;'</span>, <span class="hljs-string">'rb'</span>) <span class="hljs-comment"># Opens the WAV file.</span>
2343+
<pre><code class="python language-python hljs">&lt;Wave&gt; = wave.open(<span class="hljs-string">'&lt;path&gt;'</span>) <span class="hljs-comment"># Opens the WAV file for reading.</span>
23442344
&lt;int&gt; = &lt;Wave&gt;.getframerate() <span class="hljs-comment"># Returns number of frames per second.</span>
23452345
&lt;int&gt; = &lt;Wave&gt;.getnchannels() <span class="hljs-comment"># Returns number of samples per frame.</span>
23462346
&lt;int&gt; = &lt;Wave&gt;.getsampwidth() <span class="hljs-comment"># Returns number of bytes per sample.</span>
@@ -2351,7 +2351,7 @@ <h3 id="format-2">Format</h3><div><h4 id="forstandardtypesizesandmanualalignment
23512351
&lt;Wave&gt;.setframerate(&lt;int&gt;) <span class="hljs-comment"># Pass 44100 for CD, 48000 for video.</span>
23522352
&lt;Wave&gt;.setnchannels(&lt;int&gt;) <span class="hljs-comment"># Pass 1 for mono, 2 for stereo.</span>
23532353
&lt;Wave&gt;.setsampwidth(&lt;int&gt;) <span class="hljs-comment"># Pass 2 for CD, 3 for hi-res sound.</span>
2354-
&lt;Wave&gt;.setparams(&lt;tuple&gt;) <span class="hljs-comment"># Sets all parameters.</span>
2354+
&lt;Wave&gt;.setparams(&lt;tuple&gt;) <span class="hljs-comment"># Tuple must contain all parameters.</span>
23552355
&lt;Wave&gt;.writeframes(&lt;bytes&gt;) <span class="hljs-comment"># Appends frames to the file.</span>
23562356
</code></pre>
23572357
<ul>
@@ -2372,26 +2372,26 @@ <h3 id="format-2">Format</h3><div><h4 id="forstandardtypesizesandmanualalignment
23722372

23732373
<div><h3 id="readfloatsamplesfromwavfile">Read Float Samples from WAV File</h3><pre><code class="python language-python hljs"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">read_wav_file</span><span class="hljs-params">(filename)</span>:</span>
23742374
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_int</span><span class="hljs-params">(bytes_obj)</span>:</span>
2375-
an_int = int.from_bytes(bytes_obj, <span class="hljs-string">'little'</span>, signed=(sampwidth != <span class="hljs-number">1</span>))
2376-
<span class="hljs-keyword">return</span> an_int - <span class="hljs-number">128</span> * (sampwidth == <span class="hljs-number">1</span>)
2377-
<span class="hljs-keyword">with</span> wave.open(filename, <span class="hljs-string">'rb'</span>) <span class="hljs-keyword">as</span> file:
2378-
sampwidth = file.getsampwidth()
2375+
an_int = int.from_bytes(bytes_obj, <span class="hljs-string">'little'</span>, signed=(p.sampwidth != <span class="hljs-number">1</span>))
2376+
<span class="hljs-keyword">return</span> an_int - <span class="hljs-number">128</span> * (p.sampwidth == <span class="hljs-number">1</span>)
2377+
<span class="hljs-keyword">with</span> wave.open(filename) <span class="hljs-keyword">as</span> file:
2378+
p = file.getparams()
23792379
frames = file.readframes(<span class="hljs-number">-1</span>)
2380-
bytes_samples = (frames[i : i+sampwidth] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">0</span>, len(frames), sampwidth))
2381-
<span class="hljs-keyword">return</span> [get_int(b) / pow(<span class="hljs-number">2</span>, sampwidth * <span class="hljs-number">8</span> - <span class="hljs-number">1</span>) <span class="hljs-keyword">for</span> b <span class="hljs-keyword">in</span> bytes_samples]
2380+
bytes_samples = (frames[i : i + p.sampwidth] <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">0</span>, len(frames), p.sampwidth))
2381+
<span class="hljs-keyword">return</span> [get_int(b) / pow(<span class="hljs-number">2</span>, p.sampwidth * <span class="hljs-number">8</span> - <span class="hljs-number">1</span>) <span class="hljs-keyword">for</span> b <span class="hljs-keyword">in</span> bytes_samples], p
23822382
</code></pre></div>
23832383

2384-
<div><h3 id="writefloatsamplestowavfile">Write Float Samples to WAV File</h3><pre><code class="python language-python hljs"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">write_to_wav_file</span><span class="hljs-params">(filename, float_samples, nchannels=<span class="hljs-number">1</span>, sampwidth=<span class="hljs-number">2</span>, framerate=<span class="hljs-number">44100</span>)</span>:</span>
2384+
<div><h3 id="writefloatsamplestowavfile">Write Float Samples to WAV File</h3><pre><code class="python language-python hljs"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">write_to_wav_file</span><span class="hljs-params">(filename, samples_f, p=<span class="hljs-keyword">None</span>, nchannels=<span class="hljs-number">1</span>, sampwidth=<span class="hljs-number">2</span>, framerate=<span class="hljs-number">44100</span>)</span>:</span>
23852385
<span class="hljs-function"><span class="hljs-keyword">def</span> E377 <span class="hljs-title">get_bytes</span><span class="hljs-params">(a_float)</span>:</span>
23862386
a_float = max(<span class="hljs-number">-1</span>, min(<span class="hljs-number">1</span> - <span class="hljs-number">2e-16</span>, a_float))
2387-
a_float += sampwidth == <span class="hljs-number">1</span>
2388-
a_float *= pow(<span class="hljs-number">2</span>, sampwidth * <span class="hljs-number">8</span> - <span class="hljs-number">1</span>)
2389-
<span class="hljs-keyword">return</span> int(a_float).to_bytes(sampwidth, <span class="hljs-string">'little'</span>, signed=(sampwidth != <span class="hljs-number">1</span>))
2387+
a_float += p.sampwidth == <span class="hljs-number">1</span>
2388+
a_float *= pow(<span class="hljs-number">2</span>, p.sampwidth * <span class="hljs-number">8</span> - <span class="hljs-number">1</span>)
2389+
<span class="hljs-keyword">return</span> int(a_float).to_bytes(p.sampwidth, <span class="hljs-string">'little'</span>, signed=(p.sampwidth != <span class="hljs-number">1</span>))
2390+
<span class="hljs-keyword">if</span> p <span class="hljs-keyword">is</span> <span class="hljs-keyword">None</span>:
2391+
p = wave._wave_params(nchannels, sampwidth, framerate, <span class="hljs-number">0</span>, <span class="hljs-string">'NONE'</span>, <span class="hljs-string">'not compressed'</span>)
23902392
<span class="hljs-keyword">with</span> wave.open(filename, <span class="hljs-string">'wb'</span>) <span class="hljs-keyword">as</span> file:
2391-
file.setnchannels(nchannels)
2392-
file.setsampwidth(sampwidth)
2393-
file.setframerate(framerate)
2394-
file.writeframes(<span class="hljs-string">b''</span>.join(get_bytes(f) <span class="hljs-keyword">for</span> f <span class="hljs-keyword">in</span> float_samples))
2393+
file.setparams(p)
2394+
file.writeframes(<span class="hljs-string">b''</span>.join(get_bytes(f) <span class="hljs-keyword">for</span> f <span class="hljs-keyword">in</span> samples_f))
23952395
</code></pre></div>
23962396

23972397
<div><h3 id="examples-1">Examples</h3><div><h4 id="savesa440hzsinewavetoamonowavfile">Saves a 440 Hz sine wave to a mono WAV file:</h4><pre><code class="python language-python hljs"><span class="hljs-keyword">from</span> math <span class="hljs-keyword">import</span> pi, sin
@@ -2400,10 +2400,10 @@ <h3 id="format-2">Format</h3><div><h4 id="forstandardtypesizesandmanualalignment
24002400
</code></pre></div></div>
24012401

24022402

2403-
<div><h4 id="addsnoisetothemonowavfile">Adds noise to the mono WAV file:</h4><pre><code class="python language-python hljs"><span class="hljs-keyword">from</span> random <span class="hljs-keyword">import</span> random
2404-
add_noise = <span class="hljs-keyword">lambda</span> value: value + (random() - <span class="hljs-number">0.5</span>) * <span class="hljs-number">0.03</span>
2405-
samples_f = (add_noise(f) <span class="hljs-keyword">for</span> f <span class="hljs-keyword">in</span> read_wav_file(<span class="hljs-string">'test.wav'</span>))
2406-
write_to_wav_file(<span class="hljs-string">'test.wav'</span>, samples_f)
2403+
<div><h4 id="addsnoisetothewavfile">Adds noise to the WAV file:</h4><pre><code class="python language-python hljs"><span class="hljs-keyword">from</span> random <span class="hljs-keyword">import</span> uniform
2404+
samples_f, params = read_wav_file(<span class="hljs-string">'test.wav'</span>)
2405+
samples_f = (f + uniform(<span class="hljs-number">-0.05</span>, <span class="hljs-number">0.05</span>) <span class="hljs-keyword">for</span> f <span class="hljs-keyword">in</span> samples_f)
2406+
write_to_wav_file(<span class="hljs-string">'test.wav'</span>, samples_f, params)
24072407
</code></pre></div>
24082408

24092409
<div><h4 id="playsthewavfile">Plays the WAV file:</h4><pre><code class="python language-python hljs"><span class="hljs-comment"># $ pip3 install simpleaudio</span>
@@ -2931,7 +2931,7 @@ <h3 id="format-2">Format</h3><div><h4 id="forstandardtypesizesandmanualalignment
29312931

29322932

29332933
<footer>
2934-
<aside>October 2, 2024</aside>
2934+
<aside>October 3, 2024</aside>
29352935
<a href="https://gto76.github.io" rel="author">Jure Šorn</a>
29362936
</footer>
29372937

parse.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,20 @@ const LOGGING_EXAMPLE =
220220
'<span class="hljs-meta">&gt;&gt;&gt; </span>print(open(<span class="hljs-string">\'test.log\'</span>).read())\n' +
221221
'2023-02-07 23:21:01,430 CRITICAL:my_module:Running out of disk space.\n';
222222

223-
const AUDIO =
223+
const AUDIO_1 =
224+
'<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">write_to_wav_file</span><span class="hljs-params">(filename, samples_f, p=<span class="hljs-keyword">None</span>, nchannels=<span class="hljs-number">1</span>, sampwidth=<span class="hljs-number">2</span>, framerate=<span class="hljs-number">44100</span>)</span>:</span>\n' +
225+
' <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">get_bytes</span><span class="hljs-params">(a_float)</span>:</span>\n' +
226+
' a_float = max(<span class="hljs-number">-1</span>, min(<span class="hljs-number">1</span> - <span class="hljs-number">2e-16</span>, a_float))\n' +
227+
' a_float += p.sampwidth == <span class="hljs-number">1</span>\n' +
228+
' a_float *= pow(<span class="hljs-number">2</span>, p.sampwidth * <span class="hljs-number">8</span> - <span class="hljs-number">1</span>)\n' +
229+
' <span class="hljs-keyword">return</span> int(a_float).to_bytes(p.sampwidth, <span class="hljs-string">\'little\'</span>, signed=(p.sampwidth != <span class="hljs-number">1</span>))\n' +
230+
' <span class="hljs-keyword">if</span> p <span class="hljs-keyword">is</span> <span class="hljs-keyword">None</span>:\n' +
231+
' p = wave._wave_params(nchannels, sampwidth, framerate, <span class="hljs-number">0</span>, <span class="hljs-string">\'NONE\'</span>, <span class="hljs-string">\'not compressed\'</span>)\n' +
232+
' <span class="hljs-keyword">with</span> wave.open(filename, <span class="hljs-string">\'wb\'</span>) <span class="hljs-keyword">as</span> file:\n' +
233+
' file.setparams(p)\n' +
234+
' file.writeframes(<span class="hljs-string">b\'\'</span>.join(get_bytes(f) <span class="hljs-keyword">for</span> f <span class="hljs-keyword">in</span> samples_f))\n';
235+
236+
const AUDIO_2 =
224237
'<span class="hljs-keyword">from</span> math <span class="hljs-keyword">import</span> pi, sin\n' +
225238
'samples_f = (sin(i * <span class="hljs-number">2</span> * pi * <span class="hljs-number">440</span> / <span class="hljs-number">44100</span>) <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(<span class="hljs-number">100_000</span>))\n' +
226239
'write_to_wav_file(<span class="hljs-string">\'test.wav\'</span>, samples_f)\n';
@@ -839,7 +852,8 @@ function fixHighlights() {
839852
$(`code:contains(import curses, os)`).html(CURSES);
840853
$(`code:contains(pip3 install tqdm)`).html(PROGRESS_BAR);
841854
$(`code:contains(>>> log.basicConfig()`).html(LOGGING_EXAMPLE);
842-
$(`code:contains(samples_f = (sin(i *)`).html(AUDIO);
855+
$(`code:contains(a_float = max()`).html(AUDIO_1);
856+
$(`code:contains(samples_f = (sin(i *)`).html(AUDIO_2);
843857
$(`code:contains(collections, dataclasses, enum, io, itertools)`).html(MARIO);
844858
$(`code:contains(>>> gb = df.groupby)`).html(GROUPBY);
845859
$(`code:contains(cdef <ctype> <var_name> = <obj>)`).html(CYTHON_1);

0 commit comments

Comments
 (0)
0