PDA

Просмотр полной версии : TurboSound на Windows Mobile



SMT
24.02.2007, 18:04
теперь можно слушать pt3, vtx и pt3-ts на телефонах и КПК, установив мой плагин для gsplayer 2.25

в архив также включен плагин для Winamp, проигрывающий ещё и PT2, в дополнение к VTX, PT3

последняя версия 2.3:
http://zx.pk.ru/attachment.php?attachmentid=19938&d=1281806044

страница на sourceforge:
http://sf.net/projects/zxssk/

newart
24.02.2007, 18:26
теперь можно слушать vtx и ts-vtx на телефонах и КПК, установив мой плагин для gsplayer 2.25. если открываем файл с именем <song>1.vtx, то плагин автоматически пытается подгрузить <song>2.vtx для ts-режима. не находит - играет обычный трёхканальный модуль
А может сделать новую версию VTX, для 6 каналов?
Тогда и в AY Emul будет чуть проще поддержать TS.

ch41ns4w
24.02.2007, 21:15
а для симбы?
ну вот, опять симбоводы остались с носом. 8(

SMT
25.02.2007, 08:40
кто-ж им виноват, что симбоводы сами себе ленивые буратины ))

SMT
25.02.2007, 09:12
А может сделать новую версию VTX, для 6 каналов?
Тогда и в AY Emul будет чуть проще поддержать TS.
была такая идея - в заголовок вместо ay/ym ставить ts (подразумевается 2 чипа ym, так на ay нет кажется ts). даже в плагине сначала зарегистрировал два расширения: vtx и tvx (для удобства отбора файлов). но потом стало лениво делать конвертор, это надо ж распаковать lha, перемешать каналы, запаковать lzw-методом. лишние 2 часа на написание/отладку, поэтому оно пошло ф топку. кстати, если надумаете делать такой формат, сделайте плиз дельта-кодирование данных перед сжатием (хранить не вывод в регистр AY, а разность с предыдущим значением). это улучшит сжатие. естественно, применять только для ts-vtx ради совместимости

Strunov
26.02.2007, 09:52
А есть ли версия плеера под Windows SmartPhone, те которые без стилуса. Везде под КПК. Он запускается, но рулить нечем.. :frown:

SMT
27.02.2007, 09:07
что было, под то и написал. зоопарка устройств у меня нет. вообще, в gsplayer можно назначить кнопки на все действия. вопрос только в том, что для этого нужен стилус. попробуй разобраться, где он хранит настройки (м.б. в реестре) и сразу прописать нужные

Crank79
27.02.2007, 11:17
плохо что в архиве нет jar-файла, было бы неплохо если бы на моем Motorola C650 можно было послушать AY

Strunov
27.02.2007, 14:13
плохо что в архиве нет jar-файла, было бы неплохо если бы на моем Motorola C650 можно было послушать AY

Jar файл это под яву.... А данный плеер под мобильную винду написан...

Strunov
12.05.2007, 08:50
Короче открыл недокументированную возможность данного Plugin-a.

Он подходит к музыкальному проигрывателю MiniLyrics Magic (MS Smartphone). Просто кидаем файл gsvtxs.dll в папку с программой.
Единственное, что проигрыватель файлы по маске *.vtx отсекает, поэтому нужно создавать плейлист чем нибудь другим. (я в блокноте сделал, можно WinAmp-ом). И вот его уже загружаем в проигрыватель..
Работает замечательно! :v2_thumb:

SMT
08.08.2010, 22:31
переписал Бульбовский pt3-плеер с паскаля на си. добавил в плагин поддержку форматов pt3 и pt3-TurboSound. turbo-sound в режиме двух vtx-файлов убрал, потому что изврат и все ts-мелодии и так выложены в виде pt3-исходников

изучается спрос на winamp-плагин с аналогичным функционалом (плюc pt2). мне не нужен из-за наличия AY_Emul, но написать несложно, потому что всё готово - только прикрутить winamp sdk

newart
09.08.2010, 16:23
переписал Бульбовский pt3-плеер с паскаля на си.
Поздравляю, ты третий человек, который сделал этот за последние два года... :v2_wink:

А вот сделать DLL с AY эмулятором внутри для написания своего софта (трекера в первую очередь) похоже никто не в состоянии.

EEA
09.08.2010, 19:14
изучается спрос на winamp-плагин с аналогичным функционалом (плюc pt2). мне не нужен из-за наличия AY_Emul, но написать несложно, потому что всё готово - только прикрутить winamp sdk

Среди меня спрос есть. Это было бы очень удобно.
В идеале плагин со всеми форматами, которые играет AY_Emul,
но плагин pt2, pt3 и pt3-TurboSound - тоже отлично.

SMT
10.08.2010, 00:24
Поздравляю, ты третий человек, который сделал этот за последние два года... :v2_wink:
а где ещё две попытки? ;)



А вот сделать DLL с AY эмулятором внутри для написания своего софта (трекера в первую очередь) похоже никто не в состоянии.
зачем DLL, если есть исходники?

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

SMT
10.08.2010, 00:28
Среди меня спрос есть. Это было бы очень удобно.


сделал.


В идеале плагин со всеми форматами, которые играет AY_Emul,

переписать всё на си слишком.. можно попробовать скомпилить весь ay_emul в DLL-файл с одной экспортируемой функцией - конвертировать в VTX или что-то подобное универсальное, а плагин играет уже только VTX из буфера в памяти

EEA
10.08.2010, 01:34
сделал.

Winamp плагин не видит.:v2_conf2:
Версия 5.572. Версия 2.76 тоже.

переписать всё на си слишком.. можно попробовать скомпилить весь ay_emul в DLL-файл с одной экспортируемой функцией - конвертировать в VTX или что-то подобное универсальное, а плагин играет уже только VTX из буфера в памяти
Это вариант. Промежуточным форматом может быть например WAV.

SMT
10.08.2010, 10:06
Winamp плагин не видит.:v2_conf2:
Версия 5.572. Версия 2.76 тоже.

я проверял на 5.32.
SDK с сайта скачана последняя, датирована версией 5.5

а в списке input плагинов есть строчка?



Это вариант. Промежуточным форматом может быть например WAV.

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

SMT
10.08.2010, 10:19
upd: скачал с сайта версию 5.581 - плагин в ней работает

единственное неудобство - если winamp установлен в program files (x86), то нужно копировать плагин в папку plugins, перейдя в режим администратора (иначе результат непредсказуем - от отказа в копировании до копирования в теневую roaming папку, файлы в которой видны только программе, выполнившей копирование

Strunov
10.08.2010, 10:38
Winamp 5.54
Замечательно работает...

elf/2
10.08.2010, 10:56
попробовал в AIMP 2.61.560, плагин видится, но играть файлы отказывается, говорит unsupported file format [Code: 41]

ps: файлики взял из папки bin/music

EEA
10.08.2010, 10:59
а в списке input плагинов есть строчка?



upd: скачал с сайта версию 5.581 - плагин в ней работает
единственное неудобство - если winamp установлен в program files (x86), то нужно копировать плагин в папку plugins, перейдя в режим администратора (иначе результат непредсказуем - от отказа в копировании до копирования в теневую roaming папку, файлы в которой видны только программе, выполнившей копирование

Так и знал, что такие вопросы возникнут.:v2_biggr:

По порядку (вдруг где ступил):
файл in_pt3ts.dll скопировал в папку C:\Program Files\Winamp\Plugins. Он скопировался именно туда. Я его там вижу среди других in_* плагинов.
Запустил winamp, Залез в Preferences->InputPlugins, его там нет.
Это и имел в виду под словами "winamp не видит".

Проверил права доступа этого файла. Они такие же, как и у остальных плагинов.

Может дело в том, что винамр не с нуля установленный, а новые версии много лет ставились поверх старых? Врядли. Попробую сегодня на работе на чистом winamp'e.

Конфликтует с другими плагинами? Тоже врядли. Убрал все in-плагины, кроме pt3ts. Пустой список.

Мистика прямо.:v2_conf2:


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

Я думал наоборот быстрее.

SMT
10.08.2010, 11:18
По порядку (вдруг где ступил):
файл in_pt3ts.dll скопировал в папку C:\Program Files\Winamp\Plugins. Он скопировался именно туда. Я его там вижу среди других in_* плагинов.


если windows 7, то попробуй запустить проводник windows (или far - что удобнее) с правами администратора и посмотреть наличие файла

я уже видел такой фокус - под одним юзером program files и system32 отличается от того, что видно под другим юзером

ну и универсальное решение - держать ходовой, часто меняющийся софт не в program files, а своей папке с программами

---------- Post added at 11:18 ---------- Previous post was at 11:08 ----------


попробовал в AIMP 2.61.560, плагин видится, но играть файлы отказывается, говорит unsupported file format [Code: 41]

скорее всего причина в том, что я сделал unicode-плагин (на случай, если у кого-то китайские буквы в названиях папок). плагин отмечается флажком IN_VER в заголовке структуры In_Module.

если очень хочется, убери #define UNICODE_INPUT_PLUGIN в исходнике плагина и MultiByteToWideChar в getfileinfo замени на strcpy. в остальном без изменений - библиотека плеера одинаково работает с unicode и ansi

EEA
10.08.2010, 11:18
если windows 7, то попробуй запустить проводник windows (или far - что удобнее) с правами администратора и посмотреть наличие файла

я уже видел такой фокус - под одним юзером program files и system32 отличается от того, что видно под другим юзером

ну и универсальное решение - держать ходовой, часто меняющийся софт не в program files, а своей папке с программами

WinServer2k3 (может в этом дело?). Скопировал под админом. Смотрю в TotalCmd. Запускаю тоже под админом. В папке файл есть, в списке плагинов - нет.

SMT
10.08.2010, 13:34
WinServer2k3 (может в этом дело?). Скопировал под админом. Смотрю в TotalCmd. Запускаю тоже под админом. В папке файл есть, в списке плагинов - нет.

да, вероятно.
я скомпилил с использованием crt из стандартной dll (msvcr90.dll).
для старых вендов надо установить Visual C++ 2008 redistributable:
http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en

EEA
10.08.2010, 15:59
Попробовал на работе. WinXP SP3.
Работает. :v2_thumb: Но есть глюки.
Для vtx в плейлисте не отображается длительность.
При попытке проигрывания файла Regret.pt3 из приложенной папки Music winamp вылетает с ошибкой (не каждый раз, а только если перед ним пару-тройку других файлов проиграть).

Можно пару пожеланий к плагину? :v2_rolley

SMT
10.08.2010, 17:13
При попытке проигрывания файла Regret.pt3 из приложенной папки Music winamp вылетает с ошибкой
это плохо. я надеялся, что всё отлажено. буду тестировать ещё

EEA
10.08.2010, 17:28
Для pt2 в плейлисте тоже не отображается длительность.
Только для pt3.

EEA
10.08.2010, 17:59
В этом файле лишние щелчки:

SMT
10.08.2010, 18:08
В этом файле лишние щелчки:
заметил и не только на этом. почему-то только в ts-режиме. первое подозрение - клиппирование при сложении каналов, когда каналов много. буду разбираться

падает если закрыть winamp, открыть заново (при этом остаётся прежний плейлист) и нажать "информация о файле", не запуская проигрывание никакого файла. вечером эту дыру заделаю

EEA
10.08.2010, 18:26
падает если закрыть winamp, открыть заново (при этом остаётся прежний плейлист) и нажать "информация о файле", не запуская проигрывание никакого файла. вечером эту дыру заделаю
Попробовал несколько раз. У меня не падает. Показывает инфу нормально.

А можно в "информацию о файле" добавить имя файла с путем?

elf/2
10.08.2010, 19:42
скорее всего причина в том, что я сделал unicode-плагин (на случай, если у кого-то китайские буквы в названиях папок). плагин отмечается флажком IN_VER в заголовке структуры In_Module.

если очень хочется, убери #define UNICODE_INPUT_PLUGIN в исходнике плагина и MultiByteToWideChar в getfileinfo замени на strcpy. в остальном без изменений - библиотека плеера одинаково работает с unicode и ansi
шаман! так оно и было... аимп теперь играет

EEA
10.08.2010, 21:42
для старых вендов надо установить Visual C++ 2008 redistributable:
http://www.microsoft.com/downloads/d...displaylang=en

Установил. Теперь и дома все заработало.

SMT, Огромное спасибо!!!

SMT
10.08.2010, 22:34
Для vtx в плейлисте не отображается длительность
исправил


Для pt2 в плейлисте тоже не отображается длительность.
Только для pt3.
pt2 играется Z80-плеером и чтобы посмотреть длительность, нужно эмулировать плеер до зацикливания. я посчитал, что слишком ресурсоёмкая операция, чтобы делать её для каждого файла в плейлисте. длина показывается только для того pt2, который начинаем играть


В этом файле лишние щелчки
нашёл опечатку (как и предполагал, в клиппировании), исправил


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


А можно в "информацию о файле" добавить имя файла с путем?
как не хотелось делать отдельный диалог для свойств файла, но пришлось :)

кто пользуется плагином для GSPlayer, обновляейтесь - убраны щелчки на turbosound песнях

elf/2
10.08.2010, 23:08
а можно маленькую просьбу? если еще будут апдейты, то строить еще и ansi версию плагина.

заранее спасибо

SMT
11.08.2010, 00:43
а можно маленькую просьбу? если еще будут апдейты, то строить еще и ansi версию плагина.

заранее спасибо

договорились ))

но winamp-плагин я развивать не хотел (из-за наличия ay_emul), он просто как бонус к GS-плагину. поэтому апдейты будут только в случае вылавливания/исправления глюков

---------- Post added 11.08.2010 at 00:43 ---------- Previous post was 10.08.2010 at 23:18 ----------

кстати, если кто-то использует GSPlayer на PocketPC, у меня есть собственная сборка этого плеера с одной интересной фичей ;)

newart
11.08.2010, 01:41
зачем DLL, если есть исходники?
Не все пишут на С.



а где ещё две попытки?
AY Fly и ZX Tune

EEA
11.08.2010, 02:27
Winamp'овский плагин работает отлично.:v2_thumb:
:v2_yahoo::v2_walkm::v2_yahoo:
Щелчков нет.
На файле Regret.pt3 не вылетает.
Длительность vtx есть.

длина показывается только для того pt2, который начинаем играть
Только в главном окне winamp'а. В плейлисте не показывается. Но это мелочи.

SMT
11.08.2010, 03:09
Не все пишут на С.
и чем тогда поможет DLL? к ActionScript или Java прикручивать сишную DLL - это бред



AY Fly и ZX Tune

любопытно. полазил по ихним темам, но не нашёл сишных исходников pt3-плеера :)

Vitamin
11.08.2010, 07:40
не нашёл сишных исходников pt3-плеера
Есть C++ исходник. Вполне себе. Или самоцель- именно сишный код со сваленными в кучу эмуляцией проца, аука и еще тыщи фич?

SMT
11.08.2010, 11:11
Есть C++ исходник. Вполне себе. Или самоцель- именно сишный код со сваленными в кучу эмуляцией проца, аука и еще тыщи фич?

чисто из любопытства, я бы посмотрел ;)

Vitamin
11.08.2010, 11:15
чисто из любопытства, я бы посмотрел
AYFly: http://code.google.com/p/ayfly/source/browse/trunk/src/libayfly/players/PT3Play.h
ZXTune: http://code.google.com/p/zxtune/source/browse/trunk/src/core/plugins/players/pt3_supp.cpp

Разумеется, там еще обвязка в обоих случаях имеется.

newart
11.08.2010, 17:57
и чем тогда поможет DLL?
C луны свалился?
Сегодня существует сотни различных языков, большинство могут юзать DLL.



это бред
Это (http://zxpress.ru/temp/ascii8_votepack_pc_src.zip) бред?

Vitamin
11.08.2010, 18:07
Сегодня существует сотни различных языков, большинство могут юзать DLL.
Ага. А на мой вопрос о желательном интерфейсе к этой библиотеке в ответ сначала получил молчание, а потом нечто вроде "Ну чтоб за%%ись делала".

И после всего этого, конечно

сделать DLL с AY эмулятором внутри для написания своего софта (трекера в первую очередь) похоже никто не в состоянии.
хотя есть уже тот же ayfly-dll-library

newart
11.08.2010, 18:35
хотя есть уже тот же ayfly-dll-library
AY FLY та функция которую можно было бы юзать в трекере ГЛЮЧИТ (сжирает весь проц или что-то в этом роде). Мы с Ande'ром пытались ее починить, но он в скорости отошел от дел и больше не возвращался.



Ага. А на мой вопрос о желательном интерфейсе к этой библиотеке
Что касается проигрывания - меня устраивает реализация AY Fly, там все варианты предусмотрены, и загрузка по имени файла и из памяти и тп.

---------- Post added at 18:30 ---------- Previous post was at 18:18 ----------

Вот тестовый код для AY Fly:




Global song, wnid, a_vol.c = 15

#Window_0 = 1

ProcedureC.l IM2()

Static first, adr

If first=0:

adr = GetFunction(1, "ay_writeay")
first = 1

EndIf

a_freq = 612
CallCFunctionFast(adr, song, 0 , a_freq & $0000FF00, 0)
CallCFunctionFast(adr, song, 1 , a_freq & $000000FF, 0)
CallCFunctionFast(adr, song, 8 , a_vol, 0)
CallCFunctionFast(adr, song, 7 , %00111000, 0)

If a_vol: a_vol - 1: EndIf

EndProcedure


OpenWindow(#Window_0, 387, 71, 256, 192, "retracker", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
wnid = WindowID(#Window_0)
OpenLibrary(1, "ayfly.dll")

song = CallCFunction(1, "ay_initemptysong", 44100, @IM2())
CallCFunction(1, "ay_sethwnd", song, wnid)
CallCFunction(1, "ay_startsong" ,song)


Repeat
Event = WaitWindowEvent()
Select Event

Case #WM_LBUTTONDOWN

a_vol = 15

Case #PB_Event_CloseWindow: End

EndSelect
ForEver



Насколько я сейчас понимаю IM2 это функция которую 50 раз в секунду вызывает AY Fly.

---------- Post added at 18:35 ---------- Previous post was at 18:30 ----------

Для современного трекера это маловато, нужна возможность проигрывать Didital и подмешивать Beeper. Как это реализовать в реалиях Windows я хз (звуковые буферы и т.п.)

SMT
11.08.2010, 18:37
C луны свалился?
Сегодня существует сотни различных языков, большинство могут юзать DLL.

imho, формат DLL как универсальный формат исполняемого кода своё отживает, потому что активно наступают динамические языки со сборщиками мусора, и они плохо дружат с сишными указателями на куски памяти



Это (http://zxpress.ru/temp/ascii8_votepack_pc_src.zip) бред?

маргинальный pb :)

Vitamin
11.08.2010, 18:53
AY FLY та функция которую можно было бы юзать в трекере ГЛЮЧИТ
Какая именно?

---------- Post added at 18:53 ---------- Previous post was at 18:51 ----------


imho, формат DLL как универсальный формат исполняемого кода своё отживает, потому что активно наступают динамические языки со сборщиками мусора, и они плохо дружат с сишными указателями на куски памяти
И какие есть альтернативы?

newart
11.08.2010, 19:05
Какая именно?
Откуда я знаю что именно там глючит? :)
Смотри код выше.
Как я уже сказал, относительно трекера это не совсем то что хотелось бы иметь.
(писать очередной Vortex с 50hz AY смысла нет)

Vitamin
11.08.2010, 19:07
Откуда я знаю что именно там глючит?
Еще раз вопрос перечитай, плиз)

newart
11.08.2010, 19:09
Еще раз вопрос перечитай, плиз)

ay_writeay

SMT
11.08.2010, 19:09
И какие есть альтернативы?

велосипедная куча библиотек вокруг каждой платформы. дотнетчики пишут своё, джависты - своё, питоновцы - своё и т.д.

я зачекаутил ayfly и zxtune и ужаснулся - сколько же всего понаписано, и я всё туда же, клепать велосипеды ))

так что будущее за избыточностью и велосипедами

newart
11.08.2010, 19:15
я зачекаутил ayfly и zxtune
Более того. Было еще минимум две версии переписанного AY Emul на C, делалось для Chiptune musicdisk и еще чего то.

SMT
11.08.2010, 19:19
Для современного трекера это маловато, нужна возможность проигрывать Didital и подмешивать Beeper. Как это реализовать в реалиях Windows я хз (звуковые буферы и т.п.)

согласен, для плеера, эмулятора и трекера нужны разные либы с разными АПИ. для трекера подойдёт что-то вроде BASS. то есть, манипуляция со звуком должна быть на уровне семплов, каналов и эффектов

создал семпл (цифровой или AY-like), поставил его играться в канал, и накладываешь эффекты прямо во время воспроизведения

Vitamin
11.08.2010, 19:50
ay_writeay
А как можно на основе работы только с регистрами сделать трекер?


согласен, для плеера, эмулятора и трекера нужны разные либы с разными АПИ. для трекера подойдёт что-то вроде BASS. то есть, манипуляция со звуком должна быть на уровне семплов, каналов и эффектов
ZXTune преобразовывает модули в полноценный трекерный формат, с семплами орнаментами и прочими паттернами.

newart
11.08.2010, 19:54
А как можно на основе работы только с регистрами сделать трекер?
Так же как это делалось на спектруме. ;)

Vitamin
11.08.2010, 19:55
Так же как это делалось на спектруме.
Понятно. Проблемы с терминологией. Тебе от библиотеки нужен был только эмулятор самого чипа, а не трекинг или еще что-то...

newart
11.08.2010, 20:00
Понятно. Проблемы с терминологией. Тебе от библиотеки нужен был только эмулятор самого чипа, а не трекинг или еще что-то...
Конечно.

SMT
11.08.2010, 20:56
Понятно. Проблемы с терминологией. Тебе от библиотеки нужен был только эмулятор самого чипа, а не трекинг или еще что-то...

а я тоже понял неправильно, из-за этой цитаты:


Для современного трекера это маловато, нужна возможность проигрывать Didital и подмешивать Beeper. Как это реализовать в реалиях Windows я хз (звуковые буферы и т.п.)

newart
11.08.2010, 21:03
а я тоже понял неправильно, из-за этой цитаты:
Совменные ZX кодеры не могут даже AY эмулятор оформить в виде DLL, что уж говорить про функции "трекинга"?

SMT
11.08.2010, 21:14
если я правильно понял newart, ему нужно именно то, что есть в моей библиотеке :v2_yahoo:

то есть,
1) функция out_reg(t, num_reg, value), которая симулирует вывод в регистр на точно заданной микросекунде (все t должны неубывать. в идеале - строго возрастать)
2) возможность спросить у чипа: эй, а сколько семплов у тебя уже готово с учётом последнего t, на котором была запись?
3) возможность получить N семплов из буфера. но не больше, чем уже готово

---------- Post added at 21:14 ---------- Previous post was at 21:06 ----------

... а может быь и нет. может, newart-у нужен "живой" AY. чтобы DLL сама крутила цикл в отдельном потоке, сама постоянно выводила звук, а код трекера в реальном времени писал в регистры и не заморачивался с буферами и звукокартами :confused:

Vitamin
11.08.2010, 21:26
Совменные ZX кодеры не могут даже AY эмулятор оформить в виде DLL
А каким боком умение написать DLL относится к кодингу на ZX?


... а может быь и нет. может, newart-у нужен "живой" AY. чтобы DLL сама крутила цикл в отдельном потоке, сама постоянно выводила звук, а код трекера в реальном времени писал в регистры и не заморачивался с буферами и звукокартами
...А может быть ворона, а может быть собака, а может быть корова! (что тоже хорошо :) )

У меня несколько частей в либе:
IO(read data) => Core{Process(search and convert raw data to track) => Tracking(interpret track data to device commands)} => Device(convert commands to sound dump) => Sound{Mixer(mix multichannel data to stereo)=>Backend(play sound)}

Эти части достаточно самостоятельны и отвязаны друг от друга. Путем адаптации любую из них можно юзать.

newart
11.08.2010, 22:22
... а может быь и нет. может, newart-у нужен "живой" AY. чтобы DLL сама крутила цикл в отдельном потоке, сама постоянно выводила звук, а код трекера в реальном времени писал в регистры и не заморачивался с буферами и звукокартами

Зависит от задачи:

1. если делаем аналог Vortex, то достаточно AY эмулятора, который все делает сам, единсвенное что делаю я это устанавливаю регистры AY раз в 1/50с через callback функцию либы.

2. Если хочется возможность смешивать звук с Beeper (а ведь хочется), то нужна еще одна callback функция, в которой я накладывал бы семпл Beeper'a (генерируя его сам) на семпл AY сгеренрированый либой и она бы уже все это выводила в карту.

3. Beeper'a мало, хочется из 3-х AY каналов иметь хотя бы один цифровой. Тогда вариант со смешиванием семплов уже не подходит. Нужна видимо вот такая функция "функция out_reg(t, num_reg, value), которая симулирует вывод в регистр на точно заданной микросекунде (все t должны неубывать. в идеале - строго возрастать)" вместе с функционалом первого варианта. Если либа знает что такое Beeper, то возможно второй вариант по уму надо реализовывать через out_reg(beeper).

SMT
11.08.2010, 22:36
Зависит от задачи:

2. Если хочется возможность смешивать звук с Beeper (а ведь хочется), то нужна еще одна callback функция, в которой я накладывал бы семпл Beeper'a (генерируя его сам) на семпл AY сгеренрированый либой и она бы уже все это выводила в карту.

а вот это может обернуться проблемами. "сэмпл бипера", сделанный отдельно, без синхронизации всех генераторов звука, может не совпадать с длиной семпла AY. или погрешности окрулений кол-ва семплов в пересчёте на тики Z80/AY будет набегать и щёлкать периодически. можно не ставить себе цель микшировать всё в один буфер, а выводить несколько звуков одновременно, отдав микширование на откуп венде



3. Beeper'a мало, хочется из 3-х AY каналов иметь хотя бы один цифровой. Тогда вариант со смешиванием семплов уже не подходит. Нужна видимо вот такая функция "функция out_reg(t, num_reg, value), которая симулирует вывод в регистр на точно заданной микросекунде (все t должны неубывать. в идеале - строго возрастать)" вместе с функционалом первого варианта. Если либа знает что такое Beeper, то возможно второй вариант по уму надо реализовывать через out_reg(beeper).

именно так я и сделал
например, вывод в sound_drive:
update(t, left_vol, right_vol)

причём эмулятор AY - на выходе тот же sound_drive. он говорит звуковому движку, на каком такте AY поменялись регистры ЦАПов и всё

самое вкусное - если выводить с частотой 200KHz, либа сама красиво переведёт в 44.1/48/96 или сколько ей сказали при старте

newart
11.08.2010, 23:19
именно так я и сделал
например, вывод в sound_drive:
update(t, left_vol, right_vol)

причём эмулятор AY - на выходе тот же sound_drive. он говорит звуковому движку, на каком такте AY поменялись регистры ЦАПов и всё

самое вкусное - если выводить с частотой 200KHz, либа сама красиво переведёт в 44.1/48/96 или сколько ей сказали при старте
Здорово.
Но посолько либы нет, остается только облизываться и смотреть как буржуи клепают очередной ретро[*****]трекер.

SMT
11.08.2010, 23:42
Здорово.
Но посолько либы нет, остается только облизываться и смотреть как буржуи клепают очередной ретро[*****]трекер.

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

если играет само, асинхронно, то и точность плюс-минус лапоть. единственный выход - трекерное АПИ аля BASS. ты точно задаёшь параметры семпла (например, для бипера - амплитуду, скважность и т.п. для цифрового AY-семпла - сами данные семпла и частоту дискретизации), а потом, когда захочешь, ставишь семпл в канал. но такой подход потребует существенного дописывания библиотек

---------- Post added at 23:42 ---------- Previous post was at 23:35 ----------

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

если есть желание этим пользоваться, могу на выходных попробовать завернуть в DLL

newart
12.08.2010, 00:11
хотя... не нужно делать метод "получить буффер", а нужно сделать метод "проиграть то, что накопилось в буфере". метод сделать синхронным: пока не доиграет - не возвращается. чтобы сами звуковые данные к тебе не приходили
C моей стороны это как будет выглядеть?

SMT
12.08.2010, 00:42
C моей стороны это как будет выглядеть?

как-то так:


hMixer = create_mixer(44100, 100000 /* размер буфера в семплах */);

hBeeper = create_render(hMixer, 3500000 /* тактовая частота, в которой меряется beeper_tick */ );
beeper_tick = 0;

hAY = create_ay(hMixer, 3500000);
ay_tick = 0;

// зададим какой-нибудь тон и пусть играет. больше регистры трогать не будем
set_reg(hAY, 1, 10);
set_reg(hAY, 8, 15);
set_reg(hAY, 7, 254);

begin:
// на бипере будем играть прерывистые гудки

// пошёл гудок
x=0
for i=0 to 1000000 step 500
update(hBeeper, beeper_tick);
set_volume(hBeeper, x, x); // ставим x в левый и правый канал
x = 5000-x; // инвертируем бит на бипере
beeper_tick = beeper_tick + 500; // 500 тактов между фронтами = 3.5khz
next i

// пошла пауза
beeper_tick = beeper_tick + 1000000
update(hBeeper, beeper_tick);

play(hMixer); // здесь play ничего не проиграет, потому что к миксеру привязано два устройства, а вывод прошёл только в одно (play играет семплы до минимального из update-тиков всех устройств на миксере)

// теперь играем AY
// поскольку мы договорились, что он будет играть ровный тон,
// пусть всё делает сам - регистры не трогаем
ay_tick = ay_tick + 2000000; // важно: со времененм не должно сильно отставать или убегать от beeper_tick
update(hAY, ay_tick);

play(hMixer); // выводим, сколько накопилось. в принципе, можно вызывать вообще после любого update() - хуже не будет

goto begin; // зацикливаем



beeper_tick и ay_tick - это 64-битные переменные. бейсик это поддерживает?

для использования в трекере тебе всё-таки придётся писать BASS-оподобный движок )) чтобы он сам крутился в цикле и делал нужные update() на девайсах, анализируя, какие семплы в каких каналах сейчас играют. всё это ещё должно быть интерактивным, играть от кнопок юзера. не пугает?

newart
12.08.2010, 01:08
set_volume(hBeeper, x, x); // ставим x в левый и правый канал
Откуда у 1-битного бипера левый и правый канал?

---------- Post added at 01:08 ---------- Previous post was at 01:07 ----------


beeper_tick и ay_tick - это 64-битные переменные. бейсик это поддерживает?
Конечно.

SMT
12.08.2010, 01:10
Откуда у 1-битного бипера левый и правый канал?

универсальная функция, для эмуляции любых девайсов с ЦАПами от бипера до стерео-ковокса, саунд-драйва и т.д.. для бипера L и R надо ставить одинаковые

newart
12.08.2010, 02:01
А что физически делают функции update и play?

SMT
12.08.2010, 07:27
А что физически делают функции update и play?

update(hDevice, t) эмулирует устройство от предыдущего такта t0 до текушего t. у каждого девайса есть свой указатель записи в буфер миксера. все семплы, сгенерированные за период от t0 до t записываются (точнее, выполняется операция сложения) в буфер миксера.

play(hMixer) смотрит указатели записи всех девайсов на миксере, выбирает из них минимальный. у миксера есть указатель чтения из буфера. в буфере проссумированы и готовы к выводу семплы всех устройств от указателя чтения до минимального из указателей записи. этот фрагмент извлекается из буфера и ставится в очередь WAV-плеера. указатель чтения увеличивается на число семплов, переданных плееру.

можно для удобства разделить play на 2 функции:
get_ready_samples(hMixer) - чтобы узнать, сколько семплов в буфере готовы и play_samples(hMixer, n), чтобы передать из буфера миксера в плеер n семплов начиная от позиции чтения и увеличить позицию чтения на n

SMT
14.08.2010, 21:14
обнаружена и исправлена ошибка в определении длины трека, из-за которой некоторые треки обрезались где-то в середине

добавлена не-юникодная сборка Winamp-плагина для использования с AIMP2