LINUX.ORG.RU

Чтение звукового файла с «правильной» скоростью

 


1

1

Добрый вечер.

Мне нужно сэмулировать в рамках одной программы весь аудиостек: считать звуковой файл (для определённости несжатый, т. е. WAV PCM или как оно там) и «воспроизвести» с корректной скоростью, т. е. 1 сэмпл в 1/F секунд, где F — частота дискретизации. Под воспроизведением понимается вызов некоторой функции на каждый сэмпл, т. е. это не воспроизведение через звуковую карту.

Если считать, что «воспроизведение» одного сэмпла уже написано, как реализовать считывание и нужные задержки между сэмплами? Временем обработки одного сэмпла, насколько понимаю, пренебречь нельзя, т. е. sleep(1/f) не сработает.

(На самом деле не воспроизвести, а моргать лампочками через USB-реле.)

★★★★★

Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от Harald

Ну вот мне нужно сэмулировать всё, включая звуковую карту.

intelfx ★★★★★
() автор топика

Опирайся на «время».

// глобальная переменная с отсчётом времени
// меняется по прерыванию
int time = 0;

// Макрос перевода секунд в тики (если таймер не соответствует реальным часам)
#define Second(X) (X * 45987)

char timeout(int & timer, int delay) {
  if (time > timer) {
    timer = time + delay;
    return 1;
  } else {
    return 0;
  }
}

// использование
int blink = time;
while(true) {
  if (timeout(blink, Second(1)) {
    switch_led();
  }
}
ziemin ★★
()

Ты на 232 сделал с мосфетами? А как там с латентностью? А мосфеты-то эти вообще со звуковыми частотами умеют работать?

Если все ОК, то все равно у тебя будет проблема реального времени. Но, если можно пренебречь всякими лагами, то вполне можешь просто завести демона, который будет по таймеру (достаточно точный таймер можно сделать при помощи select) плевать в USB нужные данные из кольцевого буфера, пополняемого из файла. Или можно даже mmap запилить, если не боишься за 12309 какой-нибудь.

Eddy_Em ☆☆☆☆☆
()

Ты бы хоть сказал, что за задача-то! Может, там есть другое решение?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

FT232 -> маломощные мосфеты -> пятивольтовые реле -> бытовые лампы накаливания. :)

Там звуковых частот не будет. Я хочу просто нарисовать в Audacity нужный непериодический прямоугольный сигнал (когда включать лампочки) и сохранить его в WAV. Так что звуковой файл просто ради контейнера. Да, на все возникающие лаги кладём.

по таймеру

В этом весь вопрос. select? Суть вопроса в том, чтобы задержка между двумя плевками была ровно 1/F, а не 1/F + время обработки одного сэмпла.

intelfx ★★★★★
() автор топика

Нужно отсчитывать абсолютное время, а не относительное. ~

1.начал отсчёт времени (условный 0), сделал первое воспроизведение. Уснул на 1/f.

2. Сделал второе воспроизведение. Посмотрел время, оценил насколько отходишь от нужного (N * 1/f). Получится какая-то дельта = now - (N * 1/f), дальше спишь на (1/f - дельта).

И так далее, на каждом шаге будет какая-то своя дельта. Чтобы не было рывков на случайных лагах дельты нужно усреднять, как-то так

эффект_дельта (N) = q * дельта(N) + (1 - q) * эффект_дельта(N-1)

q принадлежит (0, 1), определяет глубину усреднения.

mashina ★★★★★
()
Ответ на: комментарий от intelfx

А не проще тупо записать длительности в обычный текстовый файл, считывать их и в нужные моменты времени дергать лампочки? А то ведь для длительных периодов тебе придется уж слишком жирный wav делать. Конечно, его зипануть можно, но как-то это нерационально все же.

Маны говорят, что select — лучше всего для мелких задержек. Но раз у тебя так, то лучше тупо таймер завести (по системному времени).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от intelfx

Тогда оптимизируй время обработки. Кэш, например (если память позволяет).

UPD: И, кстати, Я имел в виду подобрать задержку. В моей формуле частота дискретизации это F_требуемое

ziemin ★★
()
Последнее исправление: ziemin (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

А то ведь для длительных периодов тебе придется уж слишком жирный wav делать

А тебя никто не заставляет воспроизводить его с ненужной частотой дескритизации, можно сделать ровно как нужно, с любым масштабом по времени.

mashina ★★★★★
()
Ответ на: комментарий от Eddy_Em

Если он использует FT232 в режиме bitbang, то она сама сможет обеспечить нужную частоту. У неё же baudrate задаётся, а все данные с компьютера она сохраняет в буфер и выплёвывает на пины уже исходя из заданной скорости. Главное успевать класть и не успевать переполнять его.

KivApple ★★★★★
()
Ответ на: комментарий от Eddy_Em

Визуально редактировать хочется (открыть в Audacity дорожку барабанов, под ней пустую дорожку и зафигачить туда нужные периоды). На размер файла вообще наплевать, это всё на локалхосте и на коленке делается.

Да, таймер. А чем, собственно? У alarm точность секундная.

UPD: timer_create и компания сработают?

intelfx ★★★★★
() автор топика
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от KivApple

Хм. А это хорошая идея.

// Не хотел создавать из этого XY-проблему, но всё равно так и получилось.

intelfx ★★★★★
() автор топика
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

localtime для точного определения времени (там вполне себе лучше миллисекунды получается), select или даже usleep для задержек.

На МК проще реализовать — там прерывания по таймеру есть, а на компе придется извращаться.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Помню, не забылось ещё внутреннее устройство AVR... Но разбираться с микроконтроллерами сейчас никакого времени не хватит.

Отлично. Значит, попробую так и ещё посмотрю, можно ли сделать через буфер самой FT232 (как сказал KivApple).

intelfx ★★★★★
() автор топика
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от KivApple

Вот, кстати, про bitbang на 232-м я и не знал! Я думал, что ТС через стандартные доп. ноги RS-232 релюшки щелкает...

Что-то у меня поверхностный гуглеж ничего дельного про bitbang не дал. Для этого специальный модуль ядра нужно компилять или через libusb можно сработать?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

libusb и интерфейсная либа (специально для микрухи FT232).

intelfx ★★★★★
() автор топика
Последнее исправление: intelfx (всего исправлений: 1)

Моргать лампочками - это задача MIDI. MIDI создан для этого, он управляет всем сценическим оборудованием: занавес, поворот сцены, освещение, спецэффекты - лампочки, туман, пиротехника.

Вот похожий на твой случай: Christmas lights.

Здесь использован Raspberry Pi и реле, подключенные к GPIO. Преобразует midi-команды в GPIO-сигналы программа light organ. У тебя реле подключено к usb. Значит нужно заменить все GPIO-инструкции (библиотека wiringPi) на USB-инструкции (библиотека libusb).

Используя MIDI, ты сбережешь кучу времени и получишь богатый набор уже готовых инструментов: редакторы, контроллеры, секвенсоры.

fopen ★★
()
Ответ на: комментарий от fopen

То же самое, что и по ссылке, которую ты дал. Только музыка не в MIDI, система без GPIO и моргать лампочками нужно не на каждой ноте.

intelfx ★★★★★
() автор топика
Ответ на: комментарий от fopen

Моргать лампочками - это задача MIDI

Ты ошибся, MIDI создан именно для передачи нотных и «мензурных» команд, таких как тремоло, громкость, дилей, миди-эхо, транспонирования, подтяжек и много чего еще.

А светом управляет DMX. Это программируемые пульты которые посылают синхронные команды всем устройствам, дыммашинам, стробоскопам, лазерам и пр.. В пульт можно пошагово впилить любую последовательность и задержку команд, а затем крутить эти «программы». У каждого светоприбора есть свои адреса для обращения к их лампочке, моторчику и т.д., вобщем там целый протокол, я последний раз с ними имел дело лет десять назад. Но внешне там все просто - три провода для передачи сигнала, можно лепить и параллельно несколько голов на один выход.

deep-purple ★★★★★
()
Ответ на: комментарий от intelfx

Лампами управляет не музыка. Для них пишут отдельную партию.

Я так понял, что ты «музыку» для ламп составил из сэмплов. Замени сэмплы, на ноты или midi-команды. Посмотри на ютубе «midi light show», как «играя» на обычном «фортепиано» (midi-клавиатуре) управляют светом. Посмотри как это записывают, редактируют и воспроизводят на компьютере.

Или я тебя не понимаю, или ты велосипедостроитель.

fopen ★★
()
Ответ на: комментарий от intelfx

Тебе вообще WAV тут не нужен. Сделай свой формат протокол, выше правильно написали - текстовый файл. Хочешь визуально? Не вопрос:

1:___П__ПП___П__ПП_П_П___П___
2:______П____П_____П_____П___
Первое что пришло в голову для двух каналов. Горизонтально - время, а на каждой линии своя программа для какой-то независимой группы лампочек. Читаешь файл в память при старте своей проги, определяешься с usleep() для задержек между командами и можешь крутить их бесконечно.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

MIDI + DMX512 + исполнительные механизмы = show must go on! Конечно, можно и без MIDI обойтись, но полная связка с конвертерами midi-mdx дает большие возможности.

У ТС роль DMX512 исполняет usb-реле. Теперь перед ним задача - как им управлять? Я предлагаю midi.

fopen ★★
()
Ответ на: комментарий от deep-purple

midi light show

костыли же

Возможность синхронизироваться с исполнителем? Возможность управлять светом с midi-синтезатора?

fopen ★★
()
Ответ на: комментарий от fopen

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

Конечно, велосипедостроитель. Всё делается очень на коленке, потому что осталась пара дней буквально до физического дедлайна (а железо ещё изготовить надо).

intelfx ★★★★★
() автор топика
Ответ на: комментарий от fopen

Возможность синхронизироваться с исполнителем?

Никто ничего не синхронизирует. Максимум устанавливается темп для проигрывания DMX-программы. Все остальное - костыли и извращения. Никто вменяемый в муз-индустрии не использует миди-то-дмх, у дмх бывает миди вход для синхры по темпу, и этого достаточно с головой.

Вся эта миди-цветомузыка - местечковые эксперименты с лишними телодвижениями.

Возможность управлять светом с midi-синтезатора?

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

Конечно, можно и без MIDI

Нужно! С мидями, возможно, извращался только Жан Мишель Жарр на своих представлениях. Остальным оно нафик не нужно, есть готовые решения, о которых я писал выше.

deep-purple ★★★★★
()
Ответ на: комментарий от intelfx

Ага. Значит я понял тебя правильно.

Тебе решать. И время здесь самый значимый фактор, остальное не важно.

fopen ★★
()
Ответ на: комментарий от intelfx

Ладно, давай про WAV. У него есть заголовок длиной 44 байта, в заголовке хранится инфа о частоте дискретизации, битности, кол-ве каналов и прочая пурга. Парсишь заголовок (ищи примеры на SO), получаешь инфу с какой скоростью его воспроизводить, например для 44.1 кГц это 44100 фреймов в секунду. Какого размера фрейм - узнаешь из заголовка. Тока не читай файл пофреймово, читай кусками в буфер и отыгрывай. Ну а как эти уровни ты будешь отдавать в усб - это уже твой личный гемор.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

midi-клавиатура для Васи и Пети будет иметь привычный для них вид, а не фортепианный. Жмякать они будут также, как на dmx. миди-то-дмх вменяемые не используют, конечно, они используют MIDI Show Control без всяких костылей типа DMX512.

В пользу DMX512 только один довод - распространенность, наличие в соседнем ларьке.

В пользу MIDI - наличие свободного ПО, DIY устройств. Для самопальщика - это весомый аргумент.

fopen ★★
()
Ответ на: комментарий от fopen

midi-клавиатура для Васи и Пети будет иметь привычный для них вид, а не фортепианный.

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

В пользу DMX512 только один довод - распространенность, наличие в соседнем ларьке

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

В пользу MIDI - наличие свободного ПО, DIY устройств

Не убедил, для дмх тоже имеется: http://www.youtube.com/watch?v=3Ohsc0PDXn8

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Это всё понятно, со стороны чтения я просто возьму libsndfile. Вопрос был в том, как посылать на выход ровно один фрейм в 1/44100 секунды (при F=44.1 kHz) без накапливающейся ошибки.

intelfx ★★★★★
() автор топика
Ответ на: комментарий от intelfx

Так это все можно было бы сделать на аппаратном уровне, без компьютера.

А еще можно просто подцепить своего демона, который будет "писать" с выхода "mix": делаешь БПФ, считаешь, чем надо мыргнуть, и отправляешь соответствующие команды на гирлянду. И никакой дополнительной ручной работы.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от intelfx

как посылать на выход ровно один фрейм в 1/44100 секунды

Ты же сначала обратное говорил, что тебе нафиг не нужно с такой бешеной скоростью лупасить... Ничего не понимаю!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

БПФ

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

intelfx ★★★★★
() автор топика

А вообще, если это для более-менее профессионального применения, то лучше уж было бы взять готовые ШИМ-модули для прожекторов, управляющиеся по DMX. А этот самый DMX преспокойненько себе генерировать на компьютере.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Фреймы большую часть времени будут одинаковыми, но это свойство входного файла. Софт работает обобщённо. Ну и да, я возьму F поменьше.

intelfx ★★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

Нет, это самодеятельность на школьном выпускном. Говорю же — всё на коленке, по велосипеду на каждый чих.

intelfx ★★★★★
() автор топика
Ответ на: комментарий от intelfx

Какое, нафиг, железо? БПФ ты делаешь на компьютере, а железяке лишь сигналы посылаешь.

Выигрыш очевиден: ничего нового паять не придется, никакой дополнительной ручной работы, никаких проблем с таймерами (тупо "в реальном времени" делаешь БПФ да отправляешь нужные сигналы). Думаю, частоты БПФ в 10Гц будет предостаточно.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от intelfx

Тогда не занимайся велосипедостроением, а сделай просто.

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

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

Вариант 2 (на том, что у тебя уже есть) я выше озвучил.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Так это и есть наиболее просто. Никакой обработки данных, только передача из одного слоя в другой.

intelfx ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.