Список значений в звуковой файл - PullRequest
0 голосов
/ 13 июля 2009

Я пытаюсь разработать в python способ преобразования списка целочисленных значений от 0 до 255 в репрезентативные эквивалентные тоны от 1500 до 200 Гц. Информация о времени (при 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), а если нет: запустить алгоритм, чтобы увидеть, что Freq должен быть сгенерирован и добавить тон в выходной файл. Продолжайте до -3 или до конца списка.

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

Ответы [ 3 ]

2 голосов
/ 13 июля 2009

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

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

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

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

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

0 голосов
/ 10 ноября 2009

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

Я бы не стал возиться с низкоуровневым форматом 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. Перебрать файл для создания и объединения каждого фрагмента
  7. Запись в файл WAV, используя что-то вроде wavwrite(song, 'filename.wav', fs, enc)

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

0 голосов
/ 13 июля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...