Создайте aiff-файл в Python и воспроизведите его с помощью звукового файла и звукового устройства - PullRequest
0 голосов
/ 18 января 2020

Я успешно использовал звуковой файл с файлами aiff, но я хотел бы генерировать звуки с определенными компонентами Фурье.

Я собрал несколько кодов онлайн и соединил их вместе, чтобы создать файл aiff и попытаться прочитать его обратно. Код, к которому я пришел, показан ниже. Я знаю, что я очень близок, но, похоже, я заблудился в двоичном кодировании aiff-файла. Я пробовал много способов, используя h (короткое целое с переменной амплитудой 32767 для функции синуса и взятие int ()) и с f (float), который дает что-то вроде звука, который я ищу, но с большим количеством искажений. Любая помощь приветствуется! (Я работаю над macosx catalina и python 3.8, кодировка имеет младший порядок, поэтому я использовал <в выражении struct). </p>

import aifc,struct
import numpy as np
import soundfile as sf
import sounddevice as sd

sampleRate = 44100 # hertz
seconds = 3 # seconds
frequency = 440.0 # hertz

obj = aifc.open('sound.aif','w')
obj.setnchannels(1) # mono
obj.setsampwidth(2)
obj.setframerate(sampleRate)

t = np.linspace(0, seconds, seconds * sampleRate, False)
value=[]
for i in t:
    value.append(np.sin(i*frequency*2*np.pi))

# This is the line that troubles me...
data = struct.pack('<'+'f'*len(value), *value)

plt.figure()
plt.plot(t[0:100],value[0:100])
plt.show()

obj.writeframes( data )
obj.close()

obj = aifc.open('sound.aif','r')
print( "Number of channels",obj.getnchannels())
print ( "Sample width",obj.getsampwidth())
print ( "Frame rate.",obj.getframerate())
print ("Number of frames",obj.getnframes())
print ( "parameters:",obj.getparams())
obj.close()

data, fs = sf.read('sound.aif')
sd.play(data, fs, blocking=True)
...