Автор Тема: конвертация аудио сэмплов и планы на треккер  (Прочитано 5074 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2511
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #90 : 10 Апрель 2020, 06:57:21 »
не не. я написал что как-то по другому реагирует - я не имел ввиду что реально звук что-то как-то изменился. просто написал что реагирует по другому, типа жужжит, а эмуляторный не жужжит. это жжж не спроста. :) я на еще одном форуме тему создал с этим битом и скопировал эту ремарку про то, что сега типа не знала как это дело использовать и посему предала анафеме - illegal, но может там чо подскажут. причем жужжание меняет частоту. если запускать 019 жужжание одно, если 020 - другое. напоминает мне использование 4 - шумого канала для PSG. там 7 типов шумов и два по моему могут изменять частоту жужжания, а остальные одинаковые.

посему меня устраивает что без 7 бита не жжужит. пока не появилось какой-то новой архиважной информации по сему вопросу - предлагаю так и оставить :) а так по идее я могу сделать парсер всех FM инструментов и перепроверку именно этого параметра у всех игр, что у меня распакованы с целью выяснения где еще подобное используется.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2511
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #91 : 10 Апрель 2020, 13:16:19 »
он ответил, что 7 бит должен быть раз он есть. it just gets hidden by Kega Fusion in some way. я голосую фиг с ним :) без 7 бита хорошо - ну и хорошо.

по поводу 4.5 - говорит может где-то вылезти боком. тоже предлагаю забить. раз играет более менее близко к оригиналу - уже хорошо.

у меня теперь другой вопрос - можно ли читать указатель? в момент сборки банков GEMS в памяти - у меня происходит парсинг всего кода песни. то есть я там могу подсчитать итоговую длину песни, то есть общее количество delay. и типа если в песне нет loop 127 - то есть такая песня будет звучать бесконечно - определить её длительность. то есть лимит прогресс бара таким образом можно выставить на окне программы - но можно ли как-то получать указатель? или может не указатель, а количество тиков, то есть сколько единиц delay прошло за время звучания в данный момент? то есть таким образом сделать прогресс бар с отображением сколько проигралось.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5005
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #92 : 10 Апрель 2020, 15:04:07 »
Вы могли просто подсчитывать время от начала запуска проигрывания, если только есть проблемы с преобразованием длительности в секунды. Добавил int gemsplay_get_elapsed_time(void);, возвращает переменную PlayingTimer в кадрах (60 в секунде), которая используется для вывода времени в консоли.
Интересно, что в коде есть LoopStartSignal() и LoopEndSignal() для подсчёта повторов и даже их вывод, только эти функции не используются и повторы никогда не выведутся.
--------
Треки только с DAC сэмплами будут заканчиваться раньше, как я уже говорил.
« Последнее редактирование: 10 Апрель 2020, 15:10:39 от Sharpnull »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2511
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #93 : 10 Апрель 2020, 15:26:30 »
эээ неее... не пойдет :) рассказываю: в последовательности, то есть в мелодии, может быть переменная темп в любом месте. и её может быть несколько в течении трека. получается формула по расчету будет более сложная. типа от 0 до 124 делея темп был 100bpm, от 125 то 342 темп 120, а конце 150 bpm. например в Dune финальная песня, когда идет покраска планеты в тот цвет дома, за который играл игрок и победил в последней миссии. там изменяющийся темп. хотя это конечно больше исключение из правил. в основном темп в количестве 1 штука на весь трек в самом начале. а спецэффекты с флагом sfx всегда 150bpm и он не изменяются. а так с формулой я в старой версии проигрывателя что-то мудрил мудрил... вывел какой-то там коэфциент 16.6666 сколько-то... но он не точный, так как у меня миллисекунды в моем языке программирования. то есть 16.66666 миллисекунд, а чтоб было точнее нужно микросекунды 16 тыщ 666 микросекунд. поэтому если отслеживание тиков было бы в коде, который в цикле крутится внутри dll - было бы гораздо точнее, и не зависело бы от изменения темпа. а второй момент - помимо счетчика "сколько уже проиграло" - хотелось бы примерную логику понять отслеживания этого указателя "где играть" в коде, чтобы можно было понять можно ли им управлять - я в том плане, чтобы можно было передвигать ползунок прогресс бара и перематывать трек двигая мышкой. понятно что у дорожек может быть разная длительность без лупов, и каждая дорожка должна иметь свой указатель (или может быть счетчик точнее). ну это так... в порядке бреда. там будет очень сложно предусмотреть все нюансы.

Добавлено позже:
Треки только с DAC сэмплами будут заканчиваться раньше, как я уже говорил.
тут просто. (размер сэмпла - SKIP - END) / частота сэмпла = реальное время проигрывания. в случае если нет loop. если есть, то тогда получается оно будет слушаться duration и пока duration еще есть - крутить loop. впрочем если duration уже кончилось, а сам сэмпл хоть и имеет loop, но еще не проиграл первую часть до loop - видимо все-таки доиграет эту первую часть до конца, просто не будет делать loop.

Добавлено позже:
проверка тикнул ли 1 delay происходит тут?
static void CHECKTICK(void)
то есть я о чем:
глобальная переменная скажем DelayCounter. 32 бита наверное.

в CHECKTICK(void) : DelayCounter + 1
хотя нет. нужна проверка а не лупнутая ли на 127 эта песня? иначе бесконечность превысит лимит переменной даже 32 битную.
просто час если будет играть скажем один трек. переменную луп посылать в библиотеку из вне.
if GEMSLoop = 0
  DelayCounter + 1
endif


в Gems play : DelayCounter = 0


функция GetDelayCounter()
ProcedureReturn DelayCounter
то есть при посылании в библиотеку этой функции - возвращает текущий таймер в единицах Delay, что прошло после старта.

вобщем я тут насумбурил :) воспаленная фантазия разыгралась... делать не нужно, просто общий замысел о прогресс баре для проигрывания и замысел на тему перемотки трека путем елозивания мышкой по прогресс бару.
« Последнее редактирование: 10 Апрель 2020, 15:46:06 от SeregaZ »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2511
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #94 : 11 Апрель 2020, 04:28:19 »
по поводу тарахтения один товарищ подал интересную мыль - по окончании проигрывания брать и отсылать в этот регистр 0х27 значение с нулем. в теории прокатит - отрубит этот спецрежим так сказать. но на практике может быть доля секунды щелчка в конце проигрывания именно этого случая. в других по идее щелчка не будет. хотя еще не известно как это повлияет на звук соник танка. ведь по идее окончание проигрывания - это не совсем окончание. типа если пауза между событиями - delay и длительность звучания ноты - duration - одинаковые и сразу после этой ноты трек заканчивается, то нота как-бы оборвется не доиграв до конца, то есть фаза Relise Rate не сработает. потому что она начинает работу после окончания звучания ноты. то есть этот релиз рейт - параметр, так сказать, затухания после того, как клавиша синтезатора была отпущена.

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5005
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #95 : 11 Апрель 2020, 06:07:08 »
Я уже говорил, можно снимать биты (лучше просто 0x00), если оба бита установлены (маска 0xC0) при передаче. Тогда шум будет только когда кто-то реально используется CSM режим, а таких должно быть мало.
хотя еще не известно как это повлияет на звук соник танка.
А там тоже используется 7-й бит или 0xFF? Узнали как часто встречается реальное использование CSM режима, а не 0xFF, и сколько неправильных 0xFF (0xC0)? Хотя бы примерно, кроме Nightmare Circus.

Про тики, перемотку не понял. Вы наверно хотите полноценный редактор GEMS сделать. Если бы я делал графический плеер GEMS на основе этого (не редактор), то для промотки (seeking) загружал трек заново и в цикле пропускал нужное количество кадров:
for (int i = 0; i < frames_skip; i++) {
VBLINT();
gems_loop();
vgm_update();
for (loop = 0; loop < rateDACUpdate; loop++)
{
DACME();
}
PlayingTimer ++;
}
Это работает более менее быстро (не больше секунды для 2 минут перемотки), но возможно не точно из-за отсутствия ym2612_stream_update(), который заполняет буфер, с ним медленнее.
Для выяснения длины трека просто проматывал бы до конца, при этом пришлось бы учитывать зацикливание.

Кстати, заметил, что один и тот же короткий трек играл по-разному при разных запусках. Может там проблемы с потоком (с ними всегда проблемы, если не быть крайне осторожным и опытным), который отдельно играет музыку, или где-то используется неинициализированная память.
По-хорошему, для такого рода библиотеки должна быть возможность самому вызывать sound_update() с передачей буфера, тогда забота по воспроизведения ложится на пользователя библиотеки, зато можно лучше контролировать процесса.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2511
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #96 : 11 Апрель 2020, 07:04:22 »
ошибка проигрывания чуть по разному может заключается в ошибке музыкантов, что пилили трек. например сейчас у нас mastervolume сбрасывается только при инициализации. и этот мастерволум по идее должен быть идти практически первой командой в мелодии. но если мастер волум почему-то выставляется чуть позже старта нот в других дорожках, то первый запуск будет громкий - в смысле начальные ноты, повторные запуски - уже громкость будет одинаковая и не будет этого громкого вступления в начале.

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

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

по поводу проверки где этот бит используется еще - собираюсь собираюсь :) сделаю обязательно.

Добавлено позже:
« Последнее редактирование: 11 Апрель 2020, 09:52:01 от SeregaZ »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2511
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #97 : 13 Апрель 2020, 12:11:58 »
по тому специальному режиму товарищ нашел статью:
http://alyjameslab.blogspot.com/search/label/CSM%20Mode

Добавлено позже:
еще ссылку скинули:
http://gendev.spritesmind.net/forum/viewtopic.php?f=24&t=386&start=75
« Последнее редактирование: 13 Апрель 2020, 12:31:08 от SeregaZ »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2511
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #98 : 20 Апрель 2020, 05:43:09 »
библиотека вылетает при проигрывании этой "мелодии". точнее не так. старт этой мелодии, после старт любой другой и произойдет вылет. сама эта мелодия не играет. тишина. однако если собрать в ром и запустить в эмуляторе - звук есть.

в коде мелодии в принципе есть косяк:
duration 24
 note $33
 delay 24

то есть сначала длительность ноты, нота, потом пауза между событиями... но это вроде как не совсем верно, так как должно быть:
duration 24
 delay 24
 note $33

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

сама игра: Super Battle Tank - War in the Gulf. трек номер 038

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2511
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
конвертация аудио сэмплов и планы на треккер
« Ответ #99 : 30 Август 2020, 16:17:28 »
Sharpnull, тут еще момент. есть ли какой-то нюанс в коде библиотеки, по которому инициализация gemsplay_init должна происходить в родительском окне программы? по замыслу у меня открывается не совсем модальное - обычное окошко, просто парент у него - основное окно, но само основное выключается. фокус на втором. то есть на первое таким образом не переключится - оно всегда снизу. при инициализации в коде этого модального окна все к черту вылетает :) ежели делать инициализацию в основном окне - никаких проблем.

DisableWindow(#Window, 1) - эту убрал и поет, но вылетает при закрытии этого "модального" окна. вобщем как-то gemsplay_init привязывается к окну программы?

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2511
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
ради такого вопроса пришлось аж вернутся ненадолго... но прям животрепещущщий вопрос блин!

Sharpnull

*добавлено позже
мы победили! :) улетел.
« Последнее редактирование: 04 Май 2021, 19:13:17 от SeregaZ »