diff --git a/README.md b/README.md index 572295a..23b39ae 100644 --- a/README.md +++ b/README.md @@ -2622,7 +2622,8 @@ img.putdata([(add_noise(h), s, v) for h, s, v in img.getdata()]) img.convert(mode='RGB').save('test.png') ``` -### Animation +Animation +--------- #### Creates a GIF of a bouncing ball: ```python # $ pip3 install imageio @@ -2644,27 +2645,39 @@ imageio.mimsave('test.gif', frames, duration=0.03) Audio ----- ```python -import wave -from struct import pack, iter_unpack +import wave, struct +``` + +```python +<Wave_read> = wave.open('<path>', 'rb') +<bytes> = <Wave_read>.readframes(nframes) +``` + +```python +<Wave_write> = wave.open('<path>', 'wb') +<Wave_write>.writeframes(<bytes>) +<Wave_write>.setnchannels(<int>) # Number of samples per frame. +<Wave_write>.setsampwidth(<int>) # Sample size in bytes. +<Wave_write>.setframerate(<int>) # Frames per second. ``` ### Read Frames from WAV File ```python def read_wav_file(filename): - with wave.open(filename, 'rb') as wf: - frames = wf.readframes(wf.getnframes()) - return [a[0] for a in iter_unpack('<h', frames)] + with wave.open(filename, 'rb') as file: + frames = file.readframes(file.getnframes()) + return [a[0] for a in struct.iter_unpack('<h', frames)] ``` ### Write Frames to WAV File ```python def write_to_wav_file(filename, frames_int, mono=True): - frames_short = (pack('<h', a) for a in frames_int) - with wave.open(filename, 'wb') as wf: - wf.setnchannels(1 if mono else 2) - wf.setsampwidth(2) - wf.setframerate(44100) - wf.writeframes(b''.join(frames_short)) + frames_short = (struct.pack('<h', a) for a in frames_int) + with wave.open(filename, 'wb') as file: + file.setnchannels(1 if mono else 2) + file.setsampwidth(2) + file.setframerate(44100) + file.writeframes(b''.join(frames_short)) ``` ### Examples @@ -2684,7 +2697,8 @@ frames_i = (add_noise(a) for a in read_wav_file('test.wav')) write_to_wav_file('test.wav', frames_i) ``` -### Synthesizer +Synthesizer +----------- #### Plays Popcorn by Gershon Kingsley: ```python # $ pip3 install simpleaudio diff --git a/index.html b/index.html index aa91de9..e7bf275 100644 --- a/index.html +++ b/index.html @@ -2234,7 +2234,7 @@ img.putdata([(add_noise(h), s, v) <span class="hljs-keyword">for</span> h, s, v img.convert(mode=<span class="hljs-string">'RGB'</span>).save(<span class="hljs-string">'test.png'</span>) </code></pre></div> -<div><h3 id="animation">Animation</h3><div><h4 id="createsagifofabouncingball">Creates a GIF of a bouncing ball:</h4><pre><code class="python language-python hljs"><span class="hljs-comment"># $ pip3 install imageio</span> +<div><h2 id="animation"><a href="#animation" name="animation">#</a>Animation</h2><div><h4 id="createsagifofabouncingball">Creates a GIF of a bouncing ball:</h4><pre><code class="python language-python hljs"><span class="hljs-comment"># $ pip3 install imageio</span> <span class="hljs-keyword">from</span> PIL <span class="hljs-keyword">import</span> Image, ImageDraw <span class="hljs-keyword">import</span> imageio WIDTH, R = <span class="hljs-number">126</span>, <span class="hljs-number">10</span> @@ -2250,23 +2250,31 @@ imageio.mimsave(<span class="hljs-string">'test.gif'</span>, frames, duration=<s </code></pre></div></div> -<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 -<span class="hljs-keyword">from</span> struct <span class="hljs-keyword">import</span> pack, iter_unpack +<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, struct </code></pre></div> +<pre><code class="python language-python hljs"><Wave_read> = wave.open(<span class="hljs-string">'<path>'</span>, <span class="hljs-string">'rb'</span>) +<bytes> = <Wave_read>.readframes(nframes) +</code></pre> +<pre><code class="python language-python hljs"><Wave_write> = wave.open(<span class="hljs-string">'<path>'</span>, <span class="hljs-string">'wb'</span>) +<Wave_write>.writeframes(<bytes>) +<Wave_write>.setnchannels(<int>) <span class="hljs-comment"># Number of samples per frame.</span> +<Wave_write>.setsampwidth(<int>) <span class="hljs-comment"># Sample size in bytes.</span> +<Wave_write>.setframerate(<int>) <span class="hljs-comment"># Frames per second.</span> +</code></pre> <div><h3 id="readframesfromwavfile">Read Frames 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> - <span class="hljs-keyword">with</span> wave.open(filename, <span class="hljs-string">'rb'</span>) <span class="hljs-keyword">as</span> wf: - frames = wf.readframes(wf.getnframes()) - <span class="hljs-keyword">return</span> [a[<span class="hljs-number">0</span>] <span class="hljs-keyword">for</span> a <span class="hljs-keyword">in</span> iter_unpack(<span class="hljs-string">'<h'</span>, frames)] + <span class="hljs-keyword">with</span> wave.open(filename, <span class="hljs-string">'rb'</span>) <span class="hljs-keyword">as</span> file: + frames = file.readframes(file.getnframes()) + <span class="hljs-keyword">return</span> [a[<span class="hljs-number">0</span>] <span class="hljs-keyword">for</span> a <span class="hljs-keyword">in</span> struct.iter_unpack(<span class="hljs-string">'<h'</span>, frames)] </code></pre></div> <div><h3 id="writeframestowavfile">Write Frames 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, frames_int, mono=True)</span>:</span> - frames_short = (pack(<span class="hljs-string">'<h'</span>, a) <span class="hljs-keyword">for</span> a <span class="hljs-keyword">in</span> frames_int) - <span class="hljs-keyword">with</span> wave.open(filename, <span class="hljs-string">'wb'</span>) <span class="hljs-keyword">as</span> wf: - wf.setnchannels(<span class="hljs-number">1</span> <span class="hljs-keyword">if</span> mono <span class="hljs-keyword">else</span> <span class="hljs-number">2</span>) - wf.setsampwidth(<span class="hljs-number">2</span>) - wf.setframerate(<span class="hljs-number">44100</span>) - wf.writeframes(<span class="hljs-string">b''</span>.join(frames_short)) + frames_short = (struct.pack(<span class="hljs-string">'<h'</span>, a) <span class="hljs-keyword">for</span> a <span class="hljs-keyword">in</span> frames_int) + <span class="hljs-keyword">with</span> wave.open(filename, <span class="hljs-string">'wb'</span>) <span class="hljs-keyword">as</span> file: + file.setnchannels(<span class="hljs-number">1</span> <span class="hljs-keyword">if</span> mono <span class="hljs-keyword">else</span> <span class="hljs-number">2</span>) + file.setsampwidth(<span class="hljs-number">2</span>) + file.setframerate(<span class="hljs-number">44100</span>) + file.writeframes(<span class="hljs-string">b''</span>.join(frames_short)) </code></pre></div> <div><h3 id="examples-1">Examples</h3><div><h4 id="savesasinewavetoamonowavfile">Saves a 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 @@ -2282,7 +2290,7 @@ frames_i = (add_noise(a) <span class="hljs-keyword">for</span> a <span class="h write_to_wav_file(<span class="hljs-string">'test.wav'</span>, frames_i) </code></pre></div> -<div><h3 id="synthesizer">Synthesizer</h3><div><h4 id="playspopcornbygershonkingsley">Plays Popcorn by Gershon Kingsley:</h4><pre><code class="python language-python hljs"><span class="hljs-comment"># $ pip3 install simpleaudio</span> +<div><h2 id="synthesizer"><a href="#synthesizer" name="synthesizer">#</a>Synthesizer</h2><div><h4 id="playspopcornbygershonkingsley">Plays Popcorn by Gershon Kingsley:</h4><pre><code class="python language-python hljs"><span class="hljs-comment"># $ pip3 install simpleaudio</span> <span class="hljs-keyword">import</span> simpleaudio, math, struct <span class="hljs-keyword">from</span> itertools <span class="hljs-keyword">import</span> chain, repeat F = <span class="hljs-number">44100</span>