Loading prj_c_03_waves...
[ ]) sur le pointeur samples, pour accéder aux éléments du tableau dynamique qu'il désigne, est similaire à l'écriture employée avec le tableau initial. Vérifiez que vous parvenez toujours, avec ce nouveau programme, à produire le fichier sonore que vous obteniez à cette étape.
count: 3 values: •~~>[ 1.2 | 2.3 | 3.4 ]et que nous invoquons RealArray_resize() sur cette structure avec 5 comme nouveau nombre de réels, alors cette structure aura ce nouvel état :
count: 5 values: •~~>[ 1.2 | 2.3 | 3.4 | 0.0 | 0.0 ]Pour tester a minima les fonctionnalités de ce nouveau module, nous pouvons nous contenter d'une très légère modification du programme prog_waves.c :
./prog_waves python samples_to_wav.py output_sound.samples
#!/usr/bin/env python # -*- coding: utf-8 -*- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
import sys import os import struct
def txt(fmt, *args, **kw): return fmt.format(*args, **kw)
def out(fmt, *args, **kw): sys.stdout.write(txt(fmt, *args, **kw))
def err(fmt, *args, **kw): sys.stderr.write(txt(fmt, *args, **kw))
if len(sys.argv)!=2: err('usage: {} sample_file\n', sys.argv[0]) sys.exit(1)
input_name=sys.argv[1] output_name=txt('{}.wav', os.path.splitext(input_name)[0])
words=iter(word for line in open(input_name, 'r') for word in line.strip().split())
try: sample_rate=float(next(words)) except: err('sample_rate expected\n') sys.exit(1) out('sample_rate: {}\n', sample_rate)
try: sample_count=int(next(words)) except: err('sample_count expected\n') sys.exit(1) out('sample_count: {}\n', sample_count)
try: samples=[float(next(words)) for i in range(sample_count)] except: err('{} samples expected\n', sample_count) sys.exit(1)
sample_size=2 # 16 bits channel_count=1 # monophonic size=channel_count*sample_count*sample_size chunk_size=36+size bits_per_sample=8*sample_size byte_rate=sample_rate*channel_count*bits_per_sample/8.0 output=open(output_name, 'wb') output.write(b'RIFF'+ struct.pack('<I', chunk_size)+ b'WAVE'+ b'fmt '+ struct.pack('<I', 16)+ # subchunk1size struct.pack('<H', 1)+ # pcm struct.pack('<H', channel_count)+ struct.pack('<I', int(sample_rate))+ struct.pack('<I', int(byte_rate))+ struct.pack('<H', 4)+ # block-align struct.pack('<H', bits_per_sample)+ b'data'+ struct.pack('<I', size)) i16_max=(1<<15)-1 for s in samples: clamped=max(-1.0, min(1.0, s)) output.write(struct.pack('<h', int(clamped*i16_max))) out('{} translated to {}\n', input_name, output_name)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~