Skip to content

Commit 4248656

Browse files
committedMar 25, 2025
Synthesizer
1 parent 73c6f32 commit 4248656

File tree

2 files changed

+34
-34
lines changed

2 files changed

+34
-34
lines changed
 

‎README.md

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2943,8 +2943,7 @@ write_to_wav_file('test.wav', samples_f, p=params)
29432943
# $ pip3 install simpleaudio
29442944
from simpleaudio import play_buffer
29452945
with wave.open('test.wav') as file:
2946-
p = file.getparams()
2947-
frames = file.readframes(-1)
2946+
frames, p = file.readframes(-1), file.getparams()
29482947
play_buffer(frames, p.nchannels, p.sampwidth, p.framerate).wait_done()
29492948
```
29502949

@@ -2963,20 +2962,21 @@ Synthesizer
29632962
#### Plays Popcorn by Gershon Kingsley:
29642963
```python
29652964
# $ pip3 install simpleaudio
2966-
import array, itertools as it, math, simpleaudio
2967-
2968-
F = 44100
2969-
P1 = '71♩,69♪,,71♩,66♪,,62♩,66♪,,59♩,,,71♩,69♪,,71♩,66♪,,62♩,66♪,,59♩,,,'
2970-
P2 = '71♩,73♪,,74♩,73♪,,74♪,,71♪,,73♩,71♪,,73♪,,69♪,,71♩,69♪,,71♪,,67♪,,71♩,,,'
2971-
get_pause = lambda seconds: it.repeat(0, int(seconds * F))
2972-
sin_f = lambda i, hz: math.sin(i * 2 * math.pi * hz / F)
2973-
get_wave = lambda hz, seconds: (sin_f(i, hz) for i in range(int(seconds * F)))
2974-
get_hz = lambda note: 440 * 2 ** ((int(note[:2]) - 69) / 12)
2975-
get_sec = lambda note: 1/4 if '' in note else 1/8
2976-
get_samples = lambda note: get_wave(get_hz(note), get_sec(note)) if note else get_pause(1/8)
2977-
samples_f = it.chain.from_iterable(get_samples(n) for n in (P1+P2).split(','))
2978-
samples_i = array.array('h', (int(f * 30000) for f in samples_f))
2979-
simpleaudio.play_buffer(samples_i, 1, 2, F).wait_done()
2965+
import itertools as it, math, array, simpleaudio
2966+
2967+
def play_notes(notes, bpm=132, f=44100):
2968+
get_pause = lambda n_beats: it.repeat(0, int(n_beats * 60/bpm * f))
2969+
sin_f = lambda i, hz: math.sin(i * 2 * math.pi * hz / f)
2970+
get_wave = lambda hz, n_beats: (sin_f(i, hz) for i in range(int(n_beats * 60/bpm * f)))
2971+
get_hz = lambda note: 440 * 2 ** ((int(note[:2]) - 69) / 12)
2972+
get_nbeats = lambda note: 1/2 if '' in note else 1/4 if '' in note else 1
2973+
get_samples = lambda n: get_wave(get_hz(n), get_nbeats(n)) if n else get_pause(1/4)
2974+
samples_f = it.chain.from_iterable(get_samples(n) for n in notes.split(','))
2975+
samples_i = array.array('h', (int(fl * 5000) for fl in samples_f))
2976+
simpleaudio.play_buffer(samples_i, 1, 2, f).wait_done()
2977+
2978+
play_notes('83♩,81♪,,83♪,,78♪,,74♪,,78♪,,71♪,,,,83♪,,81♪,,83♪,,78♪,,74♪,,78♪,,71♪,,,,'
2979+
'83♩,85♪,,86♪,,85♪,,86♪,,83♪,,85♩,83♪,,85♪,,81♪,,83♪,,81♪,,83♪,,79♪,,83♪,,,,')
29802980
```
29812981

29822982

‎index.html

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656

5757
<body>
5858
<header>
59-
<aside>March 21, 2025</aside>
59+
<aside>March 25, 2025</aside>
6060
<a href="https://gto76.github.io" rel="author">Jure Šorn</a>
6161
</header>
6262

@@ -2415,8 +2415,7 @@ <h3 id="format-2">Format</h3><div><h4 id="forstandardtypesizesandmanualalignment
24152415
<div><h4 id="playsthewavfile">Plays the WAV file:</h4><pre><code class="python language-python hljs"><span class="hljs-comment"># $ pip3 install simpleaudio</span>
24162416
<span class="hljs-keyword">from</span> simpleaudio <span class="hljs-keyword">import</span> play_buffer
24172417
<span class="hljs-keyword">with</span> wave.open(<span class="hljs-string">'test.wav'</span>) <span class="hljs-keyword">as</span> file:
2418-
p = file.getparams()
2419-
frames = file.readframes(<span class="hljs-number">-1</span>)
2418+
frames, p = file.readframes(<span class="hljs-number">-1</span>), file.getparams()
24202419
play_buffer(frames, p.nchannels, p.sampwidth, p.framerate).wait_done()
24212420
</code></pre></div>
24222421

@@ -2428,20 +2427,21 @@ <h3 id="format-2">Format</h3><div><h4 id="forstandardtypesizesandmanualalignment
24282427
</code></pre></div>
24292428

24302429
<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>
2431-
<span class="hljs-keyword">import</span> array, itertools <span class="hljs-keyword">as</span> it, math, simpleaudio
2432-
2433-
F = <span class="hljs-number">44100</span>
2434-
P1 = <span class="hljs-string">'71♩,69♪,,71♩,66♪,,62♩,66♪,,59♩,,,71♩,69♪,,71♩,66♪,,62♩,66♪,,59♩,,,'</span>
2435-
P2 = <span class="hljs-string">'71♩,73♪,,74♩,73♪,,74♪,,71♪,,73♩,71♪,,73♪,,69♪,,71♩,69♪,,71♪,,67♪,,71♩,,,'</span>
2436-
get_pause = <span class="hljs-keyword">lambda</span> seconds: it.repeat(<span class="hljs-number">0</span>, int(seconds * F))
2437-
sin_f = <span class="hljs-keyword">lambda</span> i, hz: math.sin(i * <span class="hljs-number">2</span> * math.pi * hz / F)
2438-
get_wave = <span class="hljs-keyword">lambda</span> hz, seconds: (sin_f(i, hz) <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(int(seconds * F)))
2439-
get_hz = <span class="hljs-keyword">lambda</span> note: <span class="hljs-number">440</span> * <span class="hljs-number">2</span> ** ((int(note[:<span class="hljs-number">2</span>]) - <span class="hljs-number">69</span>) / <span class="hljs-number">12</span>)
2440-
get_sec = <span class="hljs-keyword">lambda</span> note: <span class="hljs-number">1</span>/<span class="hljs-number">4</span> <span class="hljs-keyword">if</span> <span class="hljs-string">'♩'</span> <span class="hljs-keyword">in</span> note <span class="hljs-keyword">else</span> <span class="hljs-number">1</span>/<span class="hljs-number">8</span>
2441-
get_samples = <span class="hljs-keyword">lambda</span> note: get_wave(get_hz(note), get_sec(note)) <span class="hljs-keyword">if</span> note <span class="hljs-keyword">else</span> get_pause(<span class="hljs-number">1</span>/<span class="hljs-number">8</span>)
2442-
samples_f = it.chain.from_iterable(get_samples(n) <span class="hljs-keyword">for</span> n <span class="hljs-keyword">in</span> (P1+P2).split(<span class="hljs-string">','</span>))
2443-
samples_i = array.array(<span class="hljs-string">'h'</span>, (int(f * <span class="hljs-number">30000</span>) <span class="hljs-keyword">for</span> f <span class="hljs-keyword">in</span> samples_f))
2444-
simpleaudio.play_buffer(samples_i, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, F).wait_done()
2430+
<span class="hljs-keyword">import</span> itertools <span class="hljs-keyword">as</span> it, math, array, simpleaudio
2431+
2432+
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">play_notes</span><span class="hljs-params">(notes, bpm=<span class="hljs-number">132</span>, f=<span class="hljs-number">44100</span>)</span>:</span>
2433+
get_pause = <span class="hljs-keyword">lambda</span> n_beats: it.repeat(<span class="hljs-number">0</span>, int(n_beats * <span class="hljs-number">60</span>/bpm * f))
2434+
sin_f = <span class="hljs-keyword">lambda</span> i, hz: math.sin(i * <span class="hljs-number">2</span> * math.pi * hz / f)
2435+
get_wave = <span class="hljs-keyword">lambda</span> hz, n_beats: (sin_f(i, hz) <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(int(n_beats * <span class="hljs-number">60</span>/bpm * f)))
2436+
get_hz = <span class="hljs-keyword">lambda</span> note: <span class="hljs-number">440</span> * <span class="hljs-number">2</span> ** ((int(note[:<span class="hljs-number">2</span>]) - <span class="hljs-number">69</span>) / <span class="hljs-number">12</span>)
2437+
get_nbeats = <span class="hljs-keyword">lambda</span> note: <span class="hljs-number">1</span>/<span class="hljs-number">2</span> <span class="hljs-keyword">if</span> <span class="hljs-string">'♩'</span> <span class="hljs-keyword">in</span> note <span class="hljs-keyword">else</span> <span class="hljs-number">1</span>/<span class="hljs-number">4</span> <span class="hljs-keyword">if</span> <span class="hljs-string">'♪'</span> <span class="hljs-keyword">in</span> note <span class="hljs-keyword">else</span> <span class="hljs-number">1</span>
2438+
get_samples = <span class="hljs-keyword">lambda</span> n: get_wave(get_hz(n), get_nbeats(n)) <span class="hljs-keyword">if</span> n <span class="hljs-keyword">else</span> get_pause(<span class="hljs-number">1</span>/<span class="hljs-number">4</span>)
2439+
samples_f = it.chain.from_iterable(get_samples(n) <span class="hljs-keyword">for</span> n <span class="hljs-keyword">in</span> notes.split(<span class="hljs-string">','</span>))
2440+
samples_i = array.array(<span class="hljs-string">'h'</span>, (int(fl * <span class="hljs-number">5000</span>) <span class="hljs-keyword">for</span> fl <span class="hljs-keyword">in</span> samples_f))
2441+
simpleaudio.play_buffer(samples_i, <span class="hljs-number">1</span>, <span class="hljs-number">2</span>, f).wait_done()
2442+
2443+
play_notes(<span class="hljs-string">'83♩,81♪,,83♪,,78♪,,74♪,,78♪,,71♪,,,,83♪,,81♪,,83♪,,78♪,,74♪,,78♪,,71♪,,,,'</span>
2444+
<span class="hljs-string">'83♩,85♪,,86♪,,85♪,,86♪,,83♪,,85♩,83♪,,85♪,,81♪,,83♪,,81♪,,83♪,,79♪,,83♪,,,,'</span>)
24452445
</code></pre></div></div>
24462446

24472447

@@ -2944,7 +2944,7 @@ <h3 id="format-2">Format</h3><div><h4 id="forstandardtypesizesandmanualalignment
29442944

29452945

29462946
<footer>
2947-
<aside>March 21, 2025</aside>
2947+
<aside>March 25, 2025</aside>
29482948
<a href="https://gto76.github.io" rel="author">Jure Šorn</a>
29492949
</footer>
29502950

0 commit comments

Comments
 (0)