Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Работа со звуком > Волны


Автор: tim8ska 29.1.2006, 21:09
Здравствуйте,

Я особе не программист, знаю только Java, Pascal, Flash и html. Возможно если надо то попробую разобраться и в остальном, но мне сейчас понадобилось сделать программу, которая берёт звук с микрофона и тут же передаёт этот звук в наушники, но только не в том виде в котором была волна а (как это сказать?) инвертированная. Это сэмпл простой волны из песни через Sony Sound Forge 8.0b

Автор: tim8ska 29.1.2006, 21:12
А это волна инвертированная. Она как бы должна быть к верх ногами.

Пожалуйста, кто знает, помогите создать такую программу.

P.S. я не знал куда засунуть эту тему, но раз эта со звуком, то сюда. smile

Автор: bilbobagginz 31.1.2006, 10:40
ищи в сети библиотеки DSP на тебе знакомом языке, выбери одну. вырежи из нее все кроме части работы с твоим форматом ( либо PCM,либо AIFF ) и оставь методы/функции работы с амплитудой.
пока.

Автор: tim8ska 1.2.2006, 15:43
Почему-то я уверен, что ни Java, ни Pascal не могут обработать звук. Но мне нужно чтобы волну переделывала программа тут же, без задумки. Потому, что времени на это нет.

Автор: bilbobagginz 1.2.2006, 21:43
тогда не вырезай ничего... используй какую то DSP библиотеку.
из-за того, что VST-SDK имеется на Delphi, имеет место быть предположение, что и на паскале то будет возможно.

а на самом деле, октой спецификацию формата волны, и читай ее. когда узнаешь как идет распределение амплитуд и A_max (максимально представляемая амплитуда ), то твое преобразование элементарно:
Код

// samples_block - блок самплов... поочередно расположенные левый/правый амплитуды каналов
//    вернуть след. сампл  get_next_pulse(начало блока);
for (int i=0;i<block_width;i++){
// типа, левый канал, правый канал..
   s_left[n]=max_ampl - s_left[n];
   s_right[n]=max_ampl-s_right[n];
   s_left[n++]=get_next_pulse(samples_block);
   s_right[n]=get_next_pulse(samples_block);
}

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

это что за файлы ? PCM ? AIFF ? читай их форматы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)