![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
При кодировании в MP3 отсутствует звук
VoVan © (2008-03-25 05:16:00)Всем привет. Столкнулся с такой проблемкой: при попытке преобразования миди в мп3 отсутствует звук при воспроизведении полученного мп3-файла, причем если сжимать в мп3 вав-файлы со звуком все в порядке. Пользовался bass.dll, bassmidi.dll, lame_inc.dll.
Сергей М. (2008-03-28 00:22:00) [1]Ну и на десерт совсем полный ништяк - mid-файл содержит единственный трек с текстовой караоке-секвенцией, а басс его преобразует в мп3, и плейер умудряется на полном серьезе пробухтеть этот мп3)
Жесть !)
Сергей М. (2008-03-28 00:14:00) [2]
> нужно знать какие SoundFont использует bass
Да нихрена он никакие не использует - он не знает ни о каких SF вообще)
Чуть более сотни дерьмово семплированных "стандартных" GM-"балалаек" - вот печальный удел басса и печальный результат этого алгоритма)
Превратить же midi-конфетку в кучу wave-дерьма можно и безо всяких бассов.
Сергей М. (2008-03-28 00:08:00) [3]Так что не надо уже парить мозги ВоВанУ бассами и прочей иже с ней шнягой - челу для начала надо просто понять, что сама постановка вопроса не выдерживает никакой критики)
Efir (2008-03-28 00:07:00) [4]Скажу честно - незнаю. Для этого нужно знать какие SoundFont использует bass. С другой стороны если такого инструмента нет, то можно найти и загрузить соответствующий SoundFont.
p.s. Если я написал бред, сильно не ругайте )
Сергей М. (2008-03-28 00:01:00) [5]А вот еще пример : в mid-файле содержится SysEx-секвенция, известная лишь одной из моделей множества семейств множества midi-дивайсов.
Вопрос на засыпку - КАК твой "якобы работающий" алгоритм умудрится "конвертировать" не зная что не зная во что ?)
Сергей М. (2008-03-27 23:22:00) [6]
> Вопрос автора стоял в перекодировании MID файла в mp3
Сама постановка вопроса есть ахинея.
Потому и ответ на него в любом случае - такая же ахинея.
> Алгоритм я ему привёл, который у меня работает корректно
Что, твой алгоритм позволяет инструменту с GM-кодом, соответствующим grand piano, зазвучать в wav-ипостаси милицейским свистком ? Да еще и мгновенно ?
Да по тебе шнобелевская премия плачет !
Желаешь знать истину ?
Изволь)
Речь не пойдет ни о каком бассе и иже с ним поделках для формошлепов.
Речь пойдет об обязательныхэтапах достижения результата.
На огурцах он выглядит так:
1. Поток midi-данных поступает на вход указанного синтезирующего midi-устройства в реальномвремени.
2. midi-устройство, сконфигурированное в соответствии с конкретнымитребованиями пользователя, в реальномвремени генерирует (т.е. осуществляет синтез, или, если угодно, выполняет рендеринг) результирующий поток в формате, например, PCM.
3. Этот поток в реальномвремени м.б. захвачен средствами mixer-устройства и waveIn-устройства и сохранен в виде файла.
В упомянутом алгоритме реальнымвременем даже не пахнет, не говоря уже обо всем остальном.
Efir (2008-03-27 22:57:00) [7]
> Сергей М. © (27.03.08 22:46) [15]
Согласен, в теории и механизме я разбираюсь хреново.
Вопрос автора стоял в перекодировании MID файла в mp3. Алгоритм я ему привёл, который у меня работает корректно.
> Еще раз тебе говорю - я хочу, чтобы n-й трек некоей midi-
> композиции, хранящейся в mid-файле, в результирующем файле
> звучал так как я хочу, например, милицейским свистком, даже
> если пач там ссылается на Grand Piano в соответствии с GM.
>
>
> Вопрос тебе на засыпку - услышу ли я этот вожделенный свисток
> в результате работы твоего якобы "в принципе работающего"
> кода, который сгенерирует мне какой-то там якобы ожидаемый
> wav (или мп3 - монопенисуально в дан.контексте) и который
> я укажу к воспроизведению любому "в принципе работающему"
> плейеру ?
Это уже сложный вопрос. Откуда я знаю как работает BASS.
Я не гуру в этой области, но вопрос был и я ответил на него в силу своих знаний. Никто не мешает Вам меня поправить или привести свой вариант, в конце концов это форум.
Сергей М. (2008-03-27 22:49:00) [8]С тобой все ясно.
разговор закончен.
Efir (2008-03-27 22:48:00) [9]При получении хендла ф-цией BASS_StreamCreateFile, BASS сам сканирует файл и знает о нём всё.
Сергей М. (2008-03-27 22:47:00) [10]
> объясните мне почему алгоритм работает?
Оно мне надо, тебе объяснять, если ты уперся рогом ?)
Сергей М. (2008-03-27 22:46:00) [11]
> Efir (27.03.08 22:32) [12]
Я тебе пытаюсь объяснить, что не следует тупо тыкать якобы работающими (что-то там якобы делающими, но непонятно что) примерами, демонстрируя при этом полнейшее дилетантство в теории и механизме происходящего при этом.
Вот и все)
Еще раз тебе говорю - я хочу, чтобы n-й трек некоей midi-композиции, хранящейся в mid-файле, в результирующем файле звучал так как я хочу, например, милицейским свистком, даже если пач там ссылается на Grand Piano в соответствии с GM.
Вопрос тебе на засыпку - услышу ли я этот вожделенный свисток в результате работы твоего якобы "в принципе работающего" кода, который сгенерирует мне какой-то там якобы ожидаемый wav (или мп3 - монопенисуально в дан.контексте) и который я укажу к воспроизведению любому "в принципе работающему" плейеру ?
Efir (2008-03-27 22:43:00) [12]Тогда объясните мне почему алгоритм работает???
Сергей М. (2008-03-27 22:36:00) [13]
> непосредственно декодирование в PCM
А это вообще ахинея, если
> BASS_ChannelGetLength - размер данных (байт), но уже в виде
> PCM.
С какой луны свалился "размер", если "декодирование" еще и не начиналось ?
Да и само выражение "декодирование в PCM" есть ахинея, особенно когда речь идет об исходных данных в формате mid.
Efir (2008-03-27 22:32:00) [14]
> Сергей М. © (27.03.08 22:00) [11]
Чесно говоря я не могу понять, что Вы мне пытаетесь объяснить. Приведённый алгоритм в принципе рабочий, а Вы пытаетесь доказать что он работать не должен.
Ладно с самого начала.
BASS_Init(-1, 44100, 0, Handle, nil); инициализация BASS'a
hStream:=BASS_StreamCreateFile(false, PChar(InFile), 0, 0, BASS_STREAM_DECODE); - получаем хэндл потока с флагом BASS_STREAM_DECODE, то есть воспроизводить мы ничего не собираемся.
BASS_ChannelGetLength(BassChan); - длина потока в байтах. Так уж получилось но BASS выдаёт длину WAVE DATA, и не ко мне вопрос почему так, а к un4seen.
BASS_ChannelGetData(BassChan, BufMIDI, SizeOfRead); - эта функция заполняет BufMIDI или значением FFT или WAVE DATA (в зависимости от третьего флага). Если Вы и мне не верите, то посмотрите примеры, посталяемые с библиотекой (например SampleVis).
beEncodeChunk - кодирание.
Сергей М. (2008-03-27 22:00:00) [15]
> BASS_MIDI_StreamCreateFile - создание потока
Потока какихданных ? PCM ? MID ?
> BASS_ChannelGetLength - размер данных (байт), но уже в виде
> PCM
Они с какой луны свалятся ? Какой конкретно синтезатор сделал это чудесное превращение ? Как он умудрился сделать это мгновенно ?
> BASS_ChannelGetData - непосредственно декодирование в PCM
Откуда тогда взялся "размер данных (байт), но уже в виде
PCM", если "декодирование в PCM" начнется только сейчас ?
> beEncodeChunk - кодирование в mp3.
Да хрен бы с ним, с мп3)
тут дури и безо всяких мп3 по самое нехочу)
> При вызове BASS_ChannelPlay происходит воспроизведение,
Воспроизведение и есть процесс вывода на некий дивайс результатов синтеза.
> а нафих оно нам нужно, если происходит непосредственное
> кодирование
Какое такое "непосредственное" ?
У меня, к примеру, sf-совместимый чипсет, и я хочу получить результирующий поток, сгенерированный ЭТИМ чипсетом на основании КОНКРЕТНОГО саундфонта с КОНКРЕТНЫМИ его параметрами.
ОТКУДА ф-ции басса знают о том, какой саундфонт я выбрал и какие параметры синтеза мне нужны ?
Да ниоткуда !
Ни с какой луны он и в басс не свалятся !
Басс будет толкать миди-поток в указанный мной синтез-дивайс (или дифолтный миди-дивайс - не знаю, да и по барабану оно), который сможет выполнить интересующий меня рендеринг не иначе как в РЕАЛЬНОМ РЕЖИМЕ ВРЕМЕНИ !
Так что горбатого ты тут лепишь, любезный)
Efir (2008-03-27 21:21:00) [16]
> VoVan © (27.03.08 07:38) [7]
У меня нормально работает. Midi файлы я использовал те, которые в самой Windows XP есть.
> Сергей М. © (27.03.08 08:47) [8]
BASS_MIDI_StreamCreateFile - создание потока.
BASS_ChannelGetLength - размер данных (байт), но уже в виде PCM.
BASS_ChannelGetData - непосредственно декодирование в PCM.
beEncodeChunk - кодирование в mp3.
> Рендеринг (тот самый синтез) должен происходить при вызове
> BASS_ChannelPlay, а им здесь и не пахнет, как не пахнет
> и захватом стрима-результата рендеринга.
При вызове BASS_ChannelPlay происходит воспроизведение, а нафих оно нам нужно, если происходит непосредственное кодирование.
Прежде чем спорить, может просто проверить.
Сергей М. (2008-03-27 10:42:00) [17]Рендеринг (тот самый синтез) должен происходить при вызове BASS_ChannelPlay, а им здесь и не пахнет, как не пахнет и захватом стрима-результата рендеринга.
В то же время в строке
MIDILeng:=BASS_ChannelGetLength(BassChan);
полнаялажа.
Сергей М. (2008-03-27 08:47:00) [18]
> Efir (26.03.08 21:04) [6]
> это уже декодированные WAVE данные
Т.е. ты хочегь сказать, что синтез происходит при вызове ф-ции
BASS_MIDI_StreamCreateFile
?
В таком случае она должна работать по времени не меньше времени звучания всей midi-"композиции"..
VoVan (2008-03-27 07:38:00) [19]
> Efir (26.03.08 21:04) [6]
Посмотрите пожалуйста на вот такую программку
( выложил сюда: http://vovand.narod.ru/proga.rar)
не знаю где там можно было намудрить, но звука нет.
Efir (2008-03-26 21:04:00) [20]
> Сергей М. © (26.03.08 08:27) [5]
И что в ней не то? BufMIDI - это уже декодированные WAVE данные.
Вообще всё должно нормально работать, если только автор не намудрил где-то в других местах программы.