54
54
55
55
< body >
56
56
< header >
57
- < aside > October 2 , 2024</ aside >
57
+ < aside > October 3 , 2024</ aside >
58
58
< a href ="https://gto76.github.io " rel ="author "> Jure Šorn</ a >
59
59
</ header >
60
60
@@ -2340,7 +2340,7 @@ <h3 id="format-2">Format</h3><div><h4 id="forstandardtypesizesandmanualalignment
2340
2340
< 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
2341
2341
</ code > </ pre > </ div >
2342
2342
2343
- < pre > < code class ="python language-python hljs "> <Wave> = wave.open(< span class ="hljs-string "> '<path>'</ span > , < span class =" hljs-string " > 'rb' </ span > ) < span class ="hljs-comment "> # Opens the WAV file.</ span >
2343
+ < pre > < code class ="python language-python hljs "> <Wave> = wave.open(< span class ="hljs-string "> '<path>'</ span > ) < span class ="hljs-comment "> # Opens the WAV file for reading .</ span >
2344
2344
<int> = <Wave>.getframerate() < span class ="hljs-comment "> # Returns number of frames per second.</ span >
2345
2345
<int> = <Wave>.getnchannels() < span class ="hljs-comment "> # Returns number of samples per frame.</ span >
2346
2346
<int> = <Wave>.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
2351
2351
<Wave>.setframerate(<int>) < span class ="hljs-comment "> # Pass 44100 for CD, 48000 for video.</ span >
2352
2352
<Wave>.setnchannels(<int>) < span class ="hljs-comment "> # Pass 1 for mono, 2 for stereo.</ span >
2353
2353
<Wave>.setsampwidth(<int>) < span class ="hljs-comment "> # Pass 2 for CD, 3 for hi-res sound.</ span >
2354
- <Wave>.setparams(<tuple>) < span class ="hljs-comment "> # Sets all parameters.</ span >
2354
+ <Wave>.setparams(<tuple>) < span class ="hljs-comment "> # Tuple must contain all parameters.</ span >
2355
2355
<Wave>.writeframes(<bytes>) < span class ="hljs-comment "> # Appends frames to the file.</ span >
2356
2356
</ code > </ pre >
2357
2357
< ul >
@@ -2372,26 +2372,26 @@ <h3 id="format-2">Format</h3><div><h4 id="forstandardtypesizesandmanualalignment
2372
2372
2373
2373
< 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 >
2374
2374
< 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 ()
2379
2379
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
2382
2382
</ code > </ pre > </ div >
2383
2383
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 >
2385
2385
< 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 >
2386
2386
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 > )
2390
2392
< 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))
2395
2395
</ code > </ pre > </ div >
2396
2396
2397
2397
< 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
2400
2400
</ code > </ pre > </ div > </ div >
2401
2401
2402
2402
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 )
2407
2407
</ code > </ pre > </ div >
2408
2408
2409
2409
< 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
2931
2931
2932
2932
2933
2933
< footer >
2934
- < aside > October 2 , 2024</ aside >
2934
+ < aside > October 3 , 2024</ aside >
2935
2935
< a href ="https://gto76.github.io " rel ="author "> Jure Šorn</ a >
2936
2936
</ footer >
2937
2937
0 commit comments