2009-07-13 2 views
0

Я пытаюсь создать в python способ преобразования списка целых значений между 0-255 в репрезентативные эквивалентные тона с 1500-2200 Гц. Информация о времени (на частоте 1200 Гц) задается значениями (-1), (- 2) и (-3). Я создал функцию, которая генерирует WAV-файл, а затем вызывает эту функцию с параметрами каждого тона. Мне нужно создать «поток», объединив множество отдельных тонов в один выходной файл или создав какой-то способ работы по всему списку и создав отдельный файл. Или какой-либо другой безумной функцией, о которой я не знаю .... Информация о времени будет меняться по длительности, но информационные биты (0-255) будут фиксированными.Список значений звукового файла

Образец списка показан ниже:

[-2, 3, 5, 7, 7, 7, 16, 9, 10, 21, 16, -1, 19, 13, 8, 8, 0, 5, 9, 21, 19, 11, -1, 11, 16, 19, 5, 21, 34, 39, 46, 58, 50, -1, 35, 46, 17, 28, 23, 19, 8, 2, 13, 12, -1, 9, 6, 8, 11, 2, 3, 2, 13, 14, 42, -1, 35, 41, 46, 55, 73, 69, 56, 47, 45, 26, -1, -3]

Текущее решение, о котором я думаю, связано с открытием файла, проверяя следующее значение в списке с помощью оператора «if», чтобы проверить, является ли бит временем (-ve), а если нет: запустите алгоритм, чтобы узнать, какая частота должна быть сгенерирована, и добавьте тон в выходной файл. Продолжайте до -3 или конец списка.

Может ли кто-нибудь руководствоваться тем, как можно создать полный выходной файл или какие-либо предложения ... Я новичок в программировании, поэтому, пожалуйста, будьте осторожны. Заранее спасибо

+0

Если вы хотите обработать несколько списков в цикле (объедините их вместе внутри одного большого итерабельного объекта), лучший способ - использовать itertools.chain(), но так как вам нужно выполнить определенные операции перед обработкой списка, это может не лучший вариант. – Josip

+0

Что значит «Информация о времени (на частоте 1200 Гц)»? – endolith

ответ

2

Похоже, вы пытаетесь изобрести колесо, будьте осторожны ... Если вы хотите сгенерировать музыку из массивов, вы можете взглянуть на pyaudiere, простую обертку в библиотеке audiere. Смотрите также документацию о том, как открыть массив, но он выглядит хотел бы это:

import audiere 
d = audiere.open_device() 
s = d.open_array(buff,fs) 
s.play() 

документация для этого вызова:

open_array (буфер, фс):

Открывает звук буфер для воспроизведения и возвращает для него объект OutputStream. Буфер должен быть массивом NumPy Float32 с одним или двумя столбцами для монофонического воспроизведения. Второй параметр - частота дискретизации. Значения вне диапазона + -1 будут обрезаны.

0

Все, что вам нужно сделать, это просто добавить новые данные в конец вашего wav-файла. Поэтому, если вы не закрыли свой файл, просто продолжайте писать, или если у вас есть, откройте его в режиме добавления (w = open(myfile, 'ba')) и напишите новые данные.

Для того, чтобы это звучало разумно, без щелчков и т. Д., Трюк будет заключаться в том, чтобы преобразовать осциллограмму с одной частоты на другую. Предполагая, что вы используете синусоидальные волны той же амплитуды, вам нужно запустить каждую синусоидальную волну с той же фазой, что и вы закончили предыдущую. Вы можете сделать это либо путем игры с длиной волны, чтобы убедиться, что вы всегда заканчиваете, скажем, нулевую фазу, а затем всегда начинаете с нулевой фазы или явно включаете фазу в синусоидальной волне.

0

Я не уверен, что я точно понимаю, что вы просите, но я постараюсь ответить.

Я бы не стал возиться с низкоуровневым WAV-форматом, если бы мне этого не нужно. Для этого используйте Audiolab.

  1. Инициализировать пустой song NumPy 1-D массив
  2. Открыть файл чисел
  3. Используйте if заявление, как вы сказали, чтобы обнаружить, если это отрицательное или положительное число
  4. Сформировать «сниппет «тон в соответствии с вашей формулой (что я не понимаю из описания).
    1. Сначала генерировать развертку с чем-то вроде t = linspace(0,1,num=48000)
    2. Затем генерировать тон с чем-то вроде a = sin(2*pi*f*t)
  5. сцепить сниппета на остальной части массива с чем-то вроде song = concatenate((song,a))
  6. Loop через файл для создания и конкатенации каждого фрагмента
  7. Напишите в WAV-файл, используя что-то вроде wavwrite(song, 'filename.wav', fs, enc)

Вы придумали этот формат тонов и времени самостоятельно или это что-то создано другими?

Смежные вопросы