pt3 must die?

Музыка

Postby WBC » Sat, 13.05.2017 23:35:33

всем снова привет! :)

Как-то однажды в январе-феврале зашла речь о том, чем можно заменить формат .pt3 (Pro Tracker 3.x), чтобы не упираться больше в его ограничения (максимум 31 инструмент\15 орнаментов, принудительный рестарт огибающей, особенности (не)поддержки нескольких чипов, завязанность на 1.75мгц\50гц и т.д.), да и AYX-32 с его панорамами, скважностями и четырьмя аигреками поджимает; а уж тема на гф окончательно подбила меня в этом направлении Я немножко пораскинул мозгами (благо все равно делать нечего :) и решил накидать черновик формата на замену, назвав его (предварительно) pt3md, что означает...ну вы поняли XD

Написав конвертер pt3->pt3md и начав писать psg-экспортер, все как-то заглохло, и вот на майских я вспомнил о проекте, допилил недостающие части и в итоге что-то даже получилось ;)

Сразу оговорюсь - для highperfomance проигрывания (в демы), ясное дело, есть psg, в качестве рабочего формата есть вортексовский txt, а pt3md задумывается как бинарный формат для тех случаев, когда пихать пачку псг-шек просто нецелесообразно, например в патисборники\музикдиски\компо\etc :)

Собственно, что задумывается:
Code: Select all
Общая информация:

 - Скорость проигрывания - 1..255
 - Кол-во паттернов      - до 255
 - Кол-во инструментов   - до 127 (теоретически до 255)
 - Кол-во орнаментов     - до 255 (+ пустой нулевой орнамент)
 - Кол-во чипов          - до 8
 - Длина паттерна        - 1..256 строк
 - Длина инструмента     - до 256
 - Длина орнамента       - до 256
 - Максимальный размер   - до 64 кб
 в планах:
 - Поддержка синхронного (sync) и асинхронного (async) режима проигрывания
 - Поддержка расширенных возможностей AYX-32
 
 Возможности по сравнению с PT3:
 - возможность изменения периода огибающей без рестарта
 - независимое управление смещениями шума\огибающей в инструменте
 - sustain-циклы в инструментах
 - полностью настраиваемая табличка периодов нот (тоновая табличка)
 - свободная частота чипа и прерываний, доступная в свойствах модуля
 - поля для дополнительной информации свободного формата
 - автоскорость - автоматическое изменение скорости для ломаных ритмов и т.д.
 - более плотная упаковка модулей
 в планах:
 - управление приоритетами обработки каналов
 - возможность записи периода огибающей как ноты + наложение орнаментов
 - возможность синхронизации с модулем и callback'ов из коробки, без доработок,
   а также реализация кастомных команд
 
 Недостатки по сравнению с PT3:
 - неоптимальность внутреннего формата для обработки Z80, как следствие -
   возможно низкая скорость работы плеера


Что уже есть:
  • все более-менее работающие фичи pt3 (инструменты\орнаменты\паттерны\команды)
  • кастомные таблички нот
  • отвязаны смещения шума и огибы в инструменте
  • поля с частотами клока и инта (которые все равно никто не читает)
  • sustain-циклы
  • envelope as note (since 0.3)
  • степень упаковки на уровне pt3 (меньше пт3 на 5-7% в среднем)
  • автоскорость (0.3, но будет выпилена из-за своей глюкавости)
  • ~90% треков из pt3 уже играют один в один
  • ну и еще по мелочи
а также собственно конвертер из pt3 и конвертер в psg.

Что точно еще не работает либо поглюкивает:
  • многочиповость
  • запилены пока что только те команды, которые есть в pt3
  • мелкие проблемы с тремором (однако в pt3 он и так косячный)
  • фундаментальное ограничение в 64кб (не думаю что прям критично, но как запилим многочиповость, то вылезет сразу)
  • вангую тормознутость z80-плеера
  • возможно, еще что-то

В общем, во вложении - архив с черновиком формата и тестовыми конвертерами (pmdconv - pt3->pmd, pmd2psg - pmd->psg), также - исходники и тестовые модули.

буду очень рад предложениям и фидбеку! :)
Attachments
pt3md!.zip
(349.89 KiB) Downloaded 606 times
Last edited by WBC on Mon, 05.06.2017 15:21:36, edited 4 times in total.
--wbcbz7
User avatar
WBC
 
Posts: 302
Joined: Fri, 19.09.2014 10:23:23
LOCATION: omsk XOR nsk

Postby introspec » Sun, 14.05.2017 01:51:27

Т.к. я не музыкант, оценить музыкальные инновации не могу. Вопрос номер раз: дополнительные "простые" фичи, типа числа орнаментов, в чём-то уже поддержаны? по идее, вортекс должен бы допиливаться в этом плане без особых проблем - у него же есть внутренний формат.
User avatar
introspec
 
Posts: 579
Joined: Sun, 14.07.2013 15:36:47

Postby WBC » Sun, 14.05.2017 11:11:54

introspec wrote:Вопрос номер раз: дополнительные "простые" фичи, типа числа орнаментов, в чём-то уже поддержаны?

уже должны работать. во внутренний формат вортекса как раз можно добавить поддержку, правда вид строки паттерна придется менять - 255 инструментов/орнаментов (а по факту pmd2psg уже тянет столько) в один символ не лезут :)

p.s. кстати, как раз надо бы сделать конверсию из вортексовского текстовика
--wbcbz7
User avatar
WBC
 
Posts: 302
Joined: Fri, 19.09.2014 10:23:23
LOCATION: omsk XOR nsk

Postby introspec » Sun, 14.05.2017 11:55:33

Смотри, у тебя это проект будет надолго. Потому что сразу же всё само не заработает.

Я согласен что pt3 must die. Но прямо сейчас от него избавиться не получится.

У меня в первую очередь интерес к твоему пониманию pt3. Мне нужен адекватный плейер pt3 и я надеюсь использовать твои наработки на си как детальное рабочее руководство по формату pt3. Код Бульбы, со всеми их исключениями и особыми случаями мне малоинтересен. В будущем, когда у тебя начнёт что-то вырисовываться в плане полного тулчейна, я надеюсь что смогу помочь тебе с новым плейером.
User avatar
introspec
 
Posts: 579
Joined: Sun, 14.07.2013 15:36:47

Postby WBC » Sun, 14.05.2017 12:23:40

introspec wrote:Смотри, у тебя это проект будет надолго. Потому что сразу же всё само не заработает.

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

с тулчейном, конечно, беда - писать треки в pmd нечем, обходиться конвертерами - не вариант, а для добавления поддержки в Vortex требуется перелопатить интерфейс и не сломать совместимость. Идеальным вариантом было бы написание нового трекера, да вот о попытках ничего не слышно :(
--wbcbz7
User avatar
WBC
 
Posts: 302
Joined: Fri, 19.09.2014 10:23:23
LOCATION: omsk XOR nsk

Postby introspec » Sun, 14.05.2017 13:24:30

Я видел одно обсуждение трекеров и выглядело оно примерно как конец света.
Если бы я понимал нормальный процесс работы в трекере, я бы, возможно, подумал взяться с кем-то за компанию.
Но так как я не понимаю ни сустейны, ни аррпеджиаторы, я хорошо осознаю, что из этого может выйти только ещё один кодерский трекер.
Как будто их и без нас достаточно не наделали...
User avatar
introspec
 
Posts: 579
Joined: Sun, 14.07.2013 15:36:47

Postby TS-Labs » Sun, 14.05.2017 16:07:57

Я уже говорил в чатике, но повторюсь: сразу после обсуждения фич формата нужно продумать feasibility имплементации на з80 3.5МГц.
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby VBI » Sun, 14.05.2017 18:45:34

TS-Labs паца уже в коворкинге стартапа, ты чо
User avatar
VBI
 
Posts: 1965
Joined: Mon, 03.06.2013 09:20:29

Postby WBC » Sun, 14.05.2017 19:31:10

VBI wrote:TS-Labs паца уже в коворкинге стартапа, ты чо

нене, про скорость плеера тоже нужно не забывать ;)
--wbcbz7
User avatar
WBC
 
Posts: 302
Joined: Fri, 19.09.2014 10:23:23
LOCATION: omsk XOR nsk

Postby VBI » Sun, 14.05.2017 21:02:19

шучу я, извините
User avatar
VBI
 
Posts: 1965
Joined: Mon, 03.06.2013 09:20:29

Postby WBC » Tue, 16.05.2017 20:19:41

выложу вдогонку еще маленькую утильку для просмотра psg-дампов в удобном текстовом формате. выводит в stdout, если нужно записать в файл, просто перенаправляем поток.
Из косячков - псгшки, сконверченные из pt3\pmd содержат лишний нулевой тик, но это пока что фича :)
p.s. показывает только реги 0-15 (можно и больше, но пока нет смысла)
Attachments
psgtxt.zip
(199.62 KiB) Downloaded 563 times
--wbcbz7
User avatar
WBC
 
Posts: 302
Joined: Fri, 19.09.2014 10:23:23
LOCATION: omsk XOR nsk

Postby WBC » Wed, 17.05.2017 17:44:28

Нашелся странный и интересный баг в обработке периодических команд в PT3 (глиссы\портаменто\тремор) - их обработка запаздывает на такт, причем изредка еще и поглюкивает. Нашелся случайно, когда после написания конвертеров обнаружил глюки со слайдами в run without scissors!, которая, ясен пень, писалась в вортексе и подгонялась под пт3 ;)
Пофиксил побырому задержкой команд на один фрейм, помогло, но не везде - остался глючок в 27-м паттерне (где-то на 1:41). Стал копать дальше и вот что нашлось....
Первый пример - вот такой паттерн на 12-й скорости:
Code: Select all
Vortex Tracker II v1.0 Pattern
...C|..|C-2 1F.F ....|C-3 1F.A 1110|C-4 2A.F 91.1 ; слайд тона в B вниз и огибающей туда же
....|..|--- .... ....|--- .... ....|--- .... ....
....|..|--- .... 6.41|--- .... 2110|--- .... A1.1 ; а теперь обратно плюс тремор в A
....|..|--- .... ....|--- .... ....|--- .... .... ; 4 фрейма канал включен, один - выключен
....|..|--- .... 6.25|--- .... ....|--- .... .... ; поменяем патерн тремора (2 on, 5 off)
....|..|--- .... ....|--- .... 1110|--- .... 91.1 ; вновь слайды тона в B и огибы вниз
....|..|--- .... 6.13|--- .... ....|--- .... .... ; ещё раз меняем тремор
....|..|--- .... ....|--- .... ....|--- .... ....
....|..|--- .... 6.23|--- .... ....|--- .... .... ; и ещё раз...
....|..|--- .... ....|--- .... ....|--- .... ....
....|..|--- .... 6.12|--- .... ....|--- .... .... ; и ещёёёёёё рааааааз...
....|..|--- .... ....|--- .... ....|--- .... ....
....|..|--- .... 6...|--- .... ....|--- .... .... ; и наконец отключаем
....|..|--- .... ....|--- .... ....|--- .... ....
....|..|--- .... ....|--- .... ....|--- .... ....
....|..|--- .... ....|--- .... ....|--- .... ....

и инструменты:
Code: Select all
[Sample1]
TnE +000_ +00_ F_ L
[Sample2]
tnE +000_ +00_ 0_ L

то есть первый - голый тон на громкости 15, второй - голая огибающая.
Берем AyEmul, конвертим в psg, затем то же самое через pmdconv+pmd2psg и сравниваем дампы:

cmd_lag_pt3.plog (выхлоп бульбоэмуля из пт3):
Code: Select all
регистры: 00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F
------------------------------------------------------------------------
00000000: 00* 00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  ; тот самый левый 0-й тик, но на него забиваем
00000001: 88* 06* 44* 03* A2* 01* 00  3C* 0F* 0A* 10* 0C* 00  0A* 00  00  ; 00|...C|..|C-2 1F.F ....|C-3 1F.A 1110|C-4 2A.F 91.1
00000002: 88  06  54* 03  A2  01  00  3C  0F  0A  10  0D* 00  0A  00  00  ; на этом фрейме начались слайды - задержка на фрейм
00000003: 88  06  64* 03  A2  01  00  3C  0F  0A  10  0E* 00  0A  00  00  ; в принципе, фиг бы с ним, но...
...ничего интересного
00000011: 88  06  E4* 03  A2  01  00  3C  0F  0A  10  16* 00  0A  00  00 
00000012: 88  06  F4* 03  A2  01  00  3C  0F  0A  10  17* 00  0A  00  00 
00000013: 88  06  04* 04* A2  01  00  3C  0F  0A  10  18* 00  0A  00  00  ; 01|....|..|--- .... ....|--- .... ....|--- .... ....
00000014: 88  06  14* 04  A2  01  00  3C  0F  0A  10  19* 00  0A  00  00 
00000015: 88  06  24* 04  A2  01  00  3C  0F  0A  10  1A* 00  0A  00  00 
00000016: 88  06  34* 04  A2  01  00  3C  0F  0A  10  1B* 00  0A  00  00 
00000017: 88  06  44* 04  A2  01  00  3C  0F  0A  10  1C* 00  0A  00  00 
...опять ничего интересного
00000023: 88  06  A4* 04  A2  01  00  3C  0F  0A  10  22* 00  0A  00  00 
00000024: 88  06  B4* 04  A2  01  00  3C  0F  0A  10  23* 00  0A  00  00 
00000025: 88  06  C4* 04  A2  01  00  3C  0F  0A  10  24* 00  0A  00  00  ; 02|....|..|--- .... 6.41|--- .... 2110|--- .... A1.1
                                                                          ; новый фрейм, новые параметры команд,
                                                                          ; но старые продолжают действовать!
00000026: 88  06  B4* 04  A2  01  00  3C  0F  0A  10  23* 00  0A  00  00 
00000027: 88  06  A4* 04  A2  01  00  3C  0F  0A  10  22* 00  0A  00  00 
00000028: 88  06  94* 04  A2  01  00  3C  0F  0A  10  21* 00  0A  00  00 
00000029: 88  06  84* 04  A2  01  00  34* 00* 0A  10  20* 00  0A  00  00  ; начало тремора в канале A - 4 фрейма включен
00000030: 88  06  74* 04  A2  01  00  3C* 0F* 0A  10  1F* 00  0A  00  00  ; один фрейм выключен, все нормально
00000031: 88  06  64* 04  A2  01  00  3C  0F  0A  10  1E* 00  0A  00  00  ; и так циклически (т.е. тремор не запаздывает!)
00000032: 88  06  54* 04  A2  01  00  3C  0F  0A  10  1D* 00  0A  00  00 
00000033: 88  06  44* 04  A2  01  00  3C  0F  0A  10  1C* 00  0A  00  00 
00000034: 88  06  34* 04  A2  01  00  34* 00* 0A  10  1B* 00  0A  00  00 
00000035: 88  06  24* 04  A2  01  00  3C* 0F* 0A  10  1A* 00  0A  00  00 


cmd_lag.plog (это от pmd2psg):
Code: Select all
00000000: 00* 00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  ; тот самый левый 0-й тик, но на него забиваем
00000001: 88* 06* 44* 03* A2* 01* 00  3C* 0F* 0A* 10* 0C* 00  0A* 00  00  ; 00|...C|..|C-2 1F.F ....|C-3 1F.A 1110|C-4 2A.F 91.1
00000002: 88  06  54* 03  A2  01  00  3C  0F  0A  10  0D* 00  0A  00  00  ; запаздывание на фрейм, как в пт3
00000003: 88  06  64* 03  A2  01  00  3C  0F  0A  10  0E* 00  0A  00  00 
...здесь ничего интересного
00000011: 88  06  E4* 03  A2  01  00  3C  0F  0A  10  16* 00  0A  00  00 
00000012: 88  06  F4* 03  A2  01  00  3C  0F  0A  10  17* 00  0A  00  00 
00000013: 88  06  04* 04* A2  01  00  3C  0F  0A  10  18* 00  0A  00  00  ; 01|....|..|--- .... ....|--- .... ....|--- .... ....
00000014: 88  06  14* 04  A2  01  00  3C  0F  0A  10  19* 00  0A  00  00 
00000015: 88  06  24* 04  A2  01  00  3C  0F  0A  10  1A* 00  0A  00  00 
00000016: 88  06  34* 04  A2  01  00  3C  0F  0A  10  1B* 00  0A  00  00 
...аналогично, ничего интересного
00000023: 88  06  A4* 04  A2  01  00  3C  0F  0A  10  22* 00  0A  00  00 
00000024: 88  06  B4* 04  A2  01  00  3C  0F  0A  10  23* 00  0A  00  00 
00000025: 88  06  B4  04  A2  01  00  3C  0F  0A  10  23  00  0A  00  00  ; 02|....|..|--- .... 6.41|--- .... 2110|--- .... A1.1
                                                                          ; команды отключаются! - следствие костыля с задержкой
00000026: 88  06  A4* 04  A2  01  00  3C  0F  0A  10  22* 00  0A  00  00  ; и со следующего фрейма возобновляются
00000027: 88  06  94* 04  A2  01  00  3C  0F  0A  10  21* 00  0A  00  00  ; уже с новыми параметрами
00000028: 88  06  84* 04  A2  01  00  3C  0F  0A  10  20* 00  0A  00  00  ; но уже идет "опережение" на фрейм против пт3
00000029: 88  06  74* 04  A2  01  00  3C  00* 0A  10  1F* 00  0A  00  00  ; тремор пока аналогичен пт3
00000030: 88  06  64* 04  A2  01  00  3C  0F* 0A  10  1E* 00  0A  00  00 
00000031: 88  06  54* 04  A2  01  00  3C  0F  0A  10  1D* 00  0A  00  00 
00000032: 88  06  44* 04  A2  01  00  3C  0F  0A  10  1C* 00  0A  00  00 
00000033: 88  06  34* 04  A2  01  00  3C  0F  0A  10  1B* 00  0A  00  00 
00000034: 88  06  24* 04  A2  01  00  3C  00* 0A  10  1A* 00  0A  00  00 
00000035: 88  06  14* 04  A2  01  00  3C  0F* 0A  10  19* 00  0A  00  00 


То есть если во время хода команды 1\2\3\6\9\A приходит с новой строкой новая команда с другими параметрами, то в тот фрейм, с которого началась новая строка, еще продолжает действовать старая команда, а уже со следующего - новая. В pt3md (пока что) во фрейм начала новой строки все команды приостанавливаются и возобновляются со следующего с новыми параметрами.
Казалось бы, ставим задержку принятия новых параметров команд на фрейм? а это еще не все! :)
теперь смотрим на тремор:

cmd_lag_pt3.plog:
Code: Select all
00000043: 88  06  A4* 03  A2  01  00  3C  0F  0A  10  12* 00  0A  00  00  ; конец фазы on тремора
00000044: 88  06  94* 03  A2  01  00  34* 00* 0A  10  11* 00  0A  00  00  ; и начало фазы off
00000045: 88  06  84* 03  A2  01  00  3C* 0F* 0A  10  10* 00  0A  00  00  ; и снова on
00000046: 88  06  74* 03  A2  01  00  3C  0F  0A  10  0F* 00  0A  00  00 
00000047: 88  06  64* 03  A2  01  00  3C  0F  0A  10  0E* 00  0A  00  00 
00000048: 88  06  54* 03  A2  01  00  3C  0F  0A  10  0D* 00  0A  00  00 
; а теперь следим за руками - начинается новая строка с тремором с параметрами 2 on, 5 off
00000049: 88  06  44* 03  A2  01  00  34* 00* 0A  10  0C* 00  0A  00  00  ; 03|....|..|--- .... 6.25|--- .... ....|--- .... ....
                                                                          ; фаза off, старый параметр?!
00000050: 88  06  34* 03  A2  01  00  34  00  0A  10  0B* 00  0A  00  00  ; все еще off, хотя по логике пора запускать
                                                                          ; тремор с новыми параметрами!
00000051: 88  06  24* 03  A2  01  00  3C* 0F* 0A  10  0A* 00  0A  00  00  ; фух, вроде щас норм (фаза 2 on)
00000052: 88  06  14* 03  A2  01  00  3C  0F  0A  10  09* 00  0A  00  00  ; ...продолжается
00000053: 88  06  04* 03  A2  01  00  34* 00* 0A  10  08* 00  0A  00  00  ; и началась фаза 5 off
00000054: 88  06  F4* 02* A2  01  00  34  00  0A  10  07* 00  0A  00  00 
00000055: 88  06  E4* 02  A2  01  00  34  00  0A  10  06* 00  0A  00  00 
00000056: 88  06  D4* 02  A2  01  00  34  00  0A  10  05* 00  0A  00  00 
00000057: 88  06  C4* 02  A2  01  00  34  00  0A  10  04* 00  0A  00  00 
00000058: 88  06  B4* 02  A2  01  00  3C* 0F* 0A  10  03* 00  0A  00  00  ; и снова on, все верно, но лаг в 2 фрейма!
00000059: 88  06  A4* 02  A2  01  00  3C  0F  0A  10  02* 00  0A  00  00 
00000060: 88  06  94* 02  A2  01  00  34* 00* 0A  10  01* 00  0A  00  00 
00000061: 88  06  84* 02  A2  01  00  34  00  0A  10  00* 00  0A  00  00  ; 04|....|..|--- .... ....|--- .... 1110|--- .... 91.1
                                                                          ; старые глиссы в действии
00000062: 88  06  94* 02  A2  01  00  34  00  0A  10  01* 00  0A  00  00  ; а теперь уже новые
00000063: 88  06  A4* 02  A2  01  00  34  00  0A  10  02* 00  0A  00  00 
00000064: 88  06  B4* 02  A2  01  00  34  00  0A  10  03* 00  0A  00  00 
00000065: 88  06  C4* 02  A2  01  00  3C* 0F* 0A  10  04* 00  0A  00  00


cmd_lag.plog (это от pmd2psg):
Code: Select all
00000043: 88  06  94* 03  A2  01  00  3C  0F  0A  10  11* 00  0A  00  00  ; фаза on
00000044: 88  06  84* 03  A2  01  00  3C  00* 0A  10  10* 00  0A  00  00  ; off
00000045: 88  06  74* 03  A2  01  00  3C  0F* 0A  10  0F* 00  0A  00  00  ; и снова on
00000046: 88  06  64* 03  A2  01  00  3C  0F  0A  10  0E* 00  0A  00  00 
00000047: 88  06  54* 03  A2  01  00  3C  0F  0A  10  0D* 00  0A  00  00 
00000048: 88  06  44* 03  A2  01  00  3C  0F  0A  10  0C* 00  0A  00  00 
00000049: 88  06  34* 03  A2  01  00  3C  0F  0A  10  0B* 00  0A  00  00  ; 03|....|..|--- .... 6.25|--- .... ....|--- .... ....
                                                                          ; здесь уже тремор с новыми параметрами
00000050: 88  06  24* 03  A2  01  00  3C  0F  0A  10  0A* 00  0A  00  00  ; продолжение фазы on
00000051: 88  06  14* 03  A2  01  00  3C  00* 0A  10  09* 00  0A  00  00  ; и фаза off, всё как задумано, без лагов
00000052: 88  06  04* 03  A2  01  00  3C  00  0A  10  08* 00  0A  00  00 
00000053: 88  06  F4* 02* A2  01  00  3C  00  0A  10  07* 00  0A  00  00 
00000054: 88  06  E4* 02  A2  01  00  3C  00  0A  10  06* 00  0A  00  00 
00000055: 88  06  D4* 02  A2  01  00  3C  00  0A  10  05* 00  0A  00  00 
00000056: 88  06  C4* 02  A2  01  00  3C  0F* 0A  10  04* 00  0A  00  00 
00000057: 88  06  B4* 02  A2  01  00  3C  0F  0A  10  03* 00  0A  00  00 
00000058: 88  06  A4* 02  A2  01  00  3C  00* 0A  10  02* 00  0A  00  00 
00000059: 88  06  94* 02  A2  01  00  3C  00  0A  10  01* 00  0A  00  00 
00000060: 88  06  84* 02  A2  01  00  3C  00  0A  10  00* 00  0A  00  00 
00000061: 88  06  84  02  A2  01  00  3C  00  0A  10  00  00  0A  00  00  ; 04|....|..|--- .... ....|--- .... 1110|--- .... 91.1
                                                                          ; вновь остановка глиссов
00000062: 88  06  94* 02  A2  01  00  3C  00  0A  10  01* 00  0A  00  00  ; и перезапуск
00000063: 88  06  A4* 02  A2  01  00  3C  0F* 0A  10  02* 00  0A  00  00 
00000064: 88  06  B4* 02  A2  01  00  3C  0F  0A  10  03* 00  0A  00  00 
00000065: 88  06  C4* 02  A2  01  00  3C  00* 0A  10  04* 00  0A  00  00


думаю, теперь яснее стоит масштаб косяков с тремором - в пт3 он работает весьма своеобразно. На слух, кстати, услышать это затруднительно, мне не удалось :) в отличие от кривых глиссов, заворот которых (особенно в случае огибающей) слышен просто прекрасно.
Что делать с глиссами и портаменто? да ничего, просто запись новых значений задержать на фрейм и проблема исчезнет. Я думал, что pt3 делает точно так же, но, расковыряв бульбоплеер, я обнаружил, что с приходом новой строки (которая обрабатывается до обновления инструментов и команд) команды меняют параметры и, следовательно, лага во фрейм быть не должно! %)

На закуску - дамп run without scissors! в 27-м паттерне, тот самый глюк с глиссами (номера фреймов левые):
rwsk_test_pt3.psg:
Code: Select all
00157: 3B* 00* 27* 00  BE* 04* 0F* 10* 1F* 1B* 0F* 00  00  08* 00  00  ; 3E|....|1F|C-7 28.. 21.1|--- .... B..E|C-3 5... 91.5
00158: 3A* 00  77* 00  BE  05* 1F* 30* 1E* 1C* 0F  05* 00  08  00  00  ; огибающая где попало, но это не важно
00159: 39* 00  78* 00  3E* 04* 1F  18* 1D* 1C  0F  0A* 00  08  00  00 
00160: 38* 00  77* 00  3E  05* 0F* 10* 1D  1A* 0F  0F* 00  08  00  00 
...неинтересно
00168: 30* 00  78* 00  BE* 05* 1F* 10* 19  19  0F  37* 00  08  00  00 
00169: 2F* 00  27* 00  BE  06* 0F* 18* 18* 17* 0F  3C* 00  08  00  00 
00170: 2E* 00  77* 00  BE  07* 1F* 30* 18  18* 0F  41* 00  08  00  00 
00171: 2D* 00  78* 00  3E* 06* 1E* 18* 17* 18  0F  46* 00  08  00  00  ; 3F|....|1E|--- .... 1110|--- .... B.24|--- .... A1.2
                                                                        ; задержки нет, но на этом фрейме идут старые глиссы
00172: 3D* 00  77* 00  3E  07* 0E* 10* 17  16* 0F  44* 00  08  00  00  ; а здесь уже новые
00173: 4D* 00  27* 00  3E  08* 0E  38* 16* 17* 0F  42* 00  08  00  00 
00174: 5D* 00  78* 00  BE* 06* 1E* 10* 16  17  0F  40* 00  08  00  00 
00175: 6D* 00  77* 00  BE  07* 0E* 18* 15* 15* 0F  3E* 00  08  00  00 
00176: 7D* 00  77  00  BE  08* 1E* 30* 15  16* 0F  3C* 00  08  00  00 
...неинтересно, да и строка бегает здесь 36 фреймов!
00202: 1D* 02  77* 00  3E  0C* 0E* 10* 10  10  0F  08* 00  08  00  00 
00203: 2D* 02  77  00  3E  0D* 0E  38* 10  10  0F  06* 00  08  00  00 
00204: 3D* 02  78* 00  BE* 0B* 1E* 10* 10  10  0F  04* 00  08  00  00 
00205: 4D* 02  27* 00  BE  0C* 0E* 18* 10  10  0F  02* 00  08  00  00 
00206: 5D* 02  77* 00  BE  0D* 1E* 30* 10  10  0F  00* 00  08  00  00  ; заворота нет
00207: 3E* 01* 4F* 00  EF* 00* 10* 00* 0F* 0F* 0F  FE* FF* 08  00  00  ; новый паттерн, огибающая здесь не нужна :)
00208: BE* 03* 4F  00  9F* 00  10  08* 0E* 0E* 0D* FC* FF  08  00  00 
00209: BF* 03  EF* 00  C8* 00  10  18* 0E  0D* 0D  FA* FF  08  00  00 
00210: BE* 03  EF  00  77* 00  10  08* 0C* 0D  0A* F8* FF  08  00  00 
00211: BE  03  4F* 00  EF* 00  10  18* 0D* 0C* 0A  F6* FF  08  00  00 
00212: BF* 03  EF* 00  9F* 00  10  08* 0D  0C  0A  F4* FF  08  00  00


rwsk_test.psg
Code: Select all
00157: 3B* 00* 27* 00  BE* 04* 0F* 10* 1F* 1B* 0F* 00  00  08* 00  00  ; 3E|....|1F|C-7 28.. 21.1|--- .... B..E|C-3 5... 91.5
00158: 3A* 00  77* 00  BE  05* 1F* 30* 1E* 1C* 0F  05* 00  08  00  00  ; огибающая где попало, но это не важно
00159: 39* 00  78* 00  3E* 04* 1F  18* 1D* 1C  0F  0A* 00  08  00  00 
00160: 38* 00  77* 00  3E  05* 0F* 10* 1D  1A* 0F  0F* 00  08  00  00 
...неинтересно
00168: 30* 00  78* 00  BE* 05* 1F  10* 19  19  0F  37* 00  08  00  00 
00169: 2F* 00  27* 00  BE  06* 0F* 18* 18* 17* 0F  3C* 00  08  00  00 
00170: 2E* 00  77* 00  BE  07* 1F* 30* 18  18* 0F  41* 00  08  00  00 
00171: 2E  00  78* 00  3E* 06* 1E* 18* 17* 18  0F  41  00  08  00  00  ; 3F|....|1E|--- .... 1110|--- .... B.24|--- .... A1.2
                                                                        ; задержка!
00172: 3E* 00  77* 00  3E  07* 0E* 10* 17  16* 0F  3F* 00  08  00  00  ; и рестарт
00173: 4E* 00  27* 00  3E  08* 1E* 38* 16* 17* 0F  3D* 00  08  00  00 
00174: 5E* 00  78* 00  BE* 06* 1E  10* 16  17  0F  3B* 00  08  00  00 
00175: 6E* 00  77* 00  BE  07* 0E* 18* 15* 15* 0F  39* 00  08  00  00 
00176: 7E* 00  77  00  BE  08* 1E* 30* 15  16* 0F  37* 00  08  00  00 
...неинтересно, да и строка бегает здесь 36 фреймов!
00202: 1E* 02  77* 00  3E  0C* 0E* 10* 10  10  0F  03* 00  08  00  00 
00203: 2E* 02  77  00  3E  0D* 1E* 38* 10  10  0F  01* 00  08  00  00 
00204: 3E* 02  78* 00  BE* 0B* 1E  10* 10  10  0F  FF* FF* 08  00  00  ; заворот!!1!!1!
00205: 4E* 02  27* 00  BE  0C* 0E* 18* 10  10  0F  FD* FF  08  00  00 
00206: 5E* 02  77* 00  BE  0D* 1E* 30* 10  10  0F  FB* FF  08  00  00 
00207: 3E* 01* 4F* 00  EF* 00* 10* 00* 0F* 0F* 0F  F9* FF  08  00  00  ; новый паттерн, огибающая здесь не нужна :)
00208: BE* 03* 4F  00  9F* 00  10  08* 0E* 0E* 0D* F7* FF  08  00  00 
00209: BF* 03  EF* 00  C8* 00  10  18* 0E  0D* 0D  F5* FF  08  00  00 
00210: BE* 03  EF  00  77* 00  10  08* 0C* 0D  0A* F3* FF  08  00  00 
00211: BE  03  4F* 00  EF* 00  10  18* 0D* 0C* 0A  F1* FF  08  00  00 
00212: BF* 03  EF* 00  9F* 00  10  08* 0D  0C  0A  EF* FF  08  00  00


В общем, как-то так =)

p.s. да, я стравнивал выхлоп pt3->psg только от бульбоэмуля, конверсию в zxtune я героически ниасилил (точнее, забыл как она делается, но, с другой стороны, зхтунец играет в точности аналогично бульбоплееру и вортексу)
Attachments
rwsk_test.zip
(16.64 KiB) Downloaded 526 times
cmd_lag.zip
(4.76 KiB) Downloaded 546 times
--wbcbz7
User avatar
WBC
 
Posts: 302
Joined: Fri, 19.09.2014 10:23:23
LOCATION: omsk XOR nsk

Postby TS-Labs » Wed, 17.05.2017 18:54:17

Прикольно. Я тока неасилел - этот глюк есть в каких плеерах?
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby introspec » Wed, 17.05.2017 21:03:34

Если я всё понял верно - существуют разночтения между тем как играет стандартный плейер в AYEMUL от Бульбы и стандартным Z80 плейером Vortex Tracker, который почти все используют. Осталось понять, есть ли различия между плейером в AYEMUL и встроенным плейером Vortex Tracker.

Скажу честно, не удивлён. Плейер Vortex Tracker - это чудовищное нагромождение кода, унаследованного ещё от pt2 и, видимо, более ранних трекеров, с попыткой сохранения +- совместимости со всеми промежуточными версиями. Удивительно не то, что в нём баги, удивительно то, что багов так немного.
User avatar
introspec
 
Posts: 579
Joined: Sun, 14.07.2013 15:36:47

Postby WBC » Wed, 17.05.2017 21:12:57

TS-Labs wrote:этот глюк есть в каких плеерах?

в бульбоплеере точно есть, пт3.7 ведет себя так же (в трекере точно, про плеер не скажу, ибо почему-то если выбрать compile, то выгружается голый модуль :dontknow:)
в общем, склоняюсь к тому что это фича, да и поймать баг на слух трудновато (но если инструмент сложный, то намного легче). Задержка глиссов на фрейм - 90% норма, имхо (тем более и в MOD есть эффекты, которые на первом фрейме строки не обрабатываются)

p.s. с вортексом вообще веселье - ставишь частоту инта в меню около 1 гц (чтобы на слух глянуть) - стабильно один фрейм на строку пропускается, на нормальных 50 гц не замечал
--wbcbz7
User avatar
WBC
 
Posts: 302
Joined: Fri, 19.09.2014 10:23:23
LOCATION: omsk XOR nsk

Postby WBC » Thu, 18.05.2017 21:11:38

недопост раскалывания бульбоплеера и ayemul (исходники здесь):
  • плеер для z80 явно писался на основе сырцов ayemul, много совпадений по структуре кода, так что, возможно, и приколы у них общие.
  • обнаружилось, что плеер (как и пт3.72) сбрасывает базу шума в начале нового паттерна - по этой причине некоторые сконверченные из pt2 в pt3 треки немного не так звучат в плане шума (пример, сравните в вортексе\пт3 и пт2 на 0:50 и 1:25)
  • если закончился канал А, то считается, что остальные каналы тоже закончились - вполне логично, но если каналы B и\или C закончатся раньше (к примеру, если модуль битый, в реале, разумеется, такое вряд ли возможно), то до конца A они будут брать данные за пределами паттерна со всеми вытекающими
  • команды обрабатываются все-таки в перовом фрейме новой строки, но...
  • слайды запилены таким образом, что они обновляются уже после вычисления периода тона\огибающей, посему и отстают на фрейм ;)
  • логика тремора до сих пор не ясна :)

пост постоянно обновляется... :)
Last edited by WBC on Fri, 19.05.2017 20:44:47, edited 3 times in total.
--wbcbz7
User avatar
WBC
 
Posts: 302
Joined: Fri, 19.09.2014 10:23:23
LOCATION: omsk XOR nsk

Postby TS-Labs » Fri, 19.05.2017 01:42:55

Следим с напряжением )
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby VBI » Fri, 19.05.2017 09:15:34

WBC ты монстр!
User avatar
VBI
 
Posts: 1965
Joined: Mon, 03.06.2013 09:20:29

Postby WBC » Fri, 19.05.2017 21:04:09

ахахахаха, с тремором все настолько ужасно, что я даже не могу подобрать слов!
кусок сырца бульбоэмуля:
Code: Select all
// функция PT3_GetRegisters::PatternInterpreter, (Formats.pas, строки 9060-9069)

      else if counter = Flag5 then // wbcbz7 note - 0x5 - ивент для команды 6.xy - а это и есть тремор
       begin
        OnOff_Delay := Index[Address_In_Pattern]; // ок (параметр x)
        Inc(Address_In_Pattern);
        OffOn_Delay := Index[Address_In_Pattern]; // ок (параметр y)
        Current_OnOff := OnOff_Delay; // эээ! а как же направление тремора? D:
        Inc(Address_In_Pattern);
        Ton_Slide_Count := 0;
        Current_Ton_Sliding := 0
       end


Где-то в дебрях структур данных для канала есть переменная Enabled, которая как раз и задает направление тремора (вкл(true)\выкл(false)), и при этом она нифига не сбрасывается. Если по приходу команды Enabled=true, то все корректно, канал включен на x феймов, но если приходит новая команда 6.xy и Enabled == false, то не только направление не сбросится, но и канал будет выключен на протяжении x (не y!) фреймов, т.е. как для случая Enabled==true!
к счастью, со сменой направления правильные параметры все же начинают действовать:

Code: Select all
// функция PT3_GetRegisters::ChangeRegisters, (Formats.pas, строки 9177-9186)

     if Current_OnOff > 0 then
     begin
      dec(Current_OnOff);
      if Current_OnOff = 0 then
       begin
        Enabled := not Enabled;
        if Enabled then Current_OnOff := OnOff_Delay // все верно, при смене направления юзаем верные параметры
        else Current_OnOff := OffOn_Delay
       end;
     end


тайна тремора разгадана! (или нет?)

upd: таки да! во время фазы "выкл" инструмент\орнамент не обрабатывается (т.е. не переходит на следующую строку и т.д.)
Last edited by WBC on Mon, 12.06.2017 14:21:45, edited 2 times in total.
--wbcbz7
User avatar
WBC
 
Posts: 302
Joined: Fri, 19.09.2014 10:23:23
LOCATION: omsk XOR nsk

Postby WBC » Fri, 19.05.2017 21:50:52

ну и до кучи - две очевидные вещи:
  • бульбоплеер (про родной пт3шный не знаю) читает некоторые таблички стеком. nuff said.
    к счастью, есть фикс
  • тот же бульбоплеер пишет в реги AY после всей обработки фрейма, а так как время, сжираемое плеером, непостоянно, то трек будет еееееле-еееееле, тактов на 500-1000, но все же плыть по темпу :) посему здесь полностью удваиваю псто TSL
--wbcbz7
User avatar
WBC
 
Posts: 302
Joined: Fri, 19.09.2014 10:23:23
LOCATION: omsk XOR nsk

Postby VBI » Sat, 20.05.2017 18:37:21

WBC Image
ПРОДОЛЖАЙ!

ЗЫ: интересно как там номера инструментов и орнаментов хранятся
User avatar
VBI
 
Posts: 1965
Joined: Mon, 03.06.2013 09:20:29

Postby WBC » Sat, 20.05.2017 21:23:41

вова, не тралируй XD
VBI wrote:ЗЫ: интересно как там номера инструментов и орнаментов хранятся

ты про внутри паттернов? там все вообще просто, вот выдержка из ptdoc.txt:
Code: Select all
#10, smp*2 - выключить огибающую, поставить 0-й орнамент и
 изменить номер сэмпла.
#1x, Henv, Lenv, smp*2 - изменить номер сэмпла, поставить 0-й
 орнамент и включить огибающую типа x (NB: в оригинале ошибка!) с периодом
 Lenv+256*Henv. При включении огибающей она инициализируется,
 т.е. начинается новый период!
#20-#3f - указать смещение шума (бывает только в канале B)
#4x - указать орнамент номер x.
 (огибающая не выключается)
...
#D1-#Ef - указать номер сэмпла. (NB: в младших 5 битах)
#Fx, smp*2 - указать номер орнамента (x) и номер сэмпла.
 (огибающая выключается)


кстати вот да, раздумываю написать нормальное и адекватное описание pt3, а то задолбался ходить за сырцами бульбоплеера и в хекс-редактор :)
--wbcbz7
User avatar
WBC
 
Posts: 302
Joined: Fri, 19.09.2014 10:23:23
LOCATION: omsk XOR nsk

Postby WBC » Sat, 20.05.2017 23:51:07

а теперь про pt3md:
заработали обещанные sustain-циклы! :)
Собственно, работают они как описано в pt3md_fmt.txt, т.е сначала играет sustain-цикл, пока не встретится нота note off (S-- или ==, NN = 97), тогда играется уже обычный цикл. Заодно добавил фичу в конвертер в psg (+исправил слайды) и обновил архив в первом псто.
Attachments
sustain.zip
(1.82 KiB) Downloaded 526 times
--wbcbz7
User avatar
WBC
 
Posts: 302
Joined: Fri, 19.09.2014 10:23:23
LOCATION: omsk XOR nsk

Postby TS-Labs » Tue, 30.05.2017 22:55:16

Присоединяюсь к расследованию.
Внезапно, на АУХ32 криво играет приаттаченный модуль.
В самых первых фреймах тон+шум играют очень грубо.

Дебаг вот такой:
(timestamp: reg<-value)
38365: 00<-00
38366: 01<-00
38367: 02<-00
38368: 03<-00
38369: 04<-07
38370: 05<-01
38371: 06<-60
38372: 07<-00
38374: 08<-00
38375: 09<-00
38376: 0A<-06
38377: 0B<-00
38378: 0C<-00


Ну, все поняли, что у меня не делается маска на регистр периода шума, но сам факт.
Attachments
its_life.zip
(3.36 KiB) Downloaded 518 times
User avatar
TS-Labs
 
Posts: 5398
Joined: Thu, 26.07.2012 01:29:56

Postby WBC » Sat, 03.06.2017 23:20:21

еще немного про пт3, конкретно - про портаменто и переполнения в орнаментах.

WARNING: примеры кода могут быть ошибочными, я хочу спать :)

Портаменто в PT3 - одна из самых глючных команд, имхо, однако по большей части (когда надо перейти от одной ноте к другой) она работает корректно. В PT 3.5 и ниже команда работает корректно только в том случае, если слайд идет от одной ноты к другой, и между ними нет команд 1/2 (т.е. глиссов):
Code: Select all
--- .... ....                           
--- .... ....                           
C-4 .... ....                           
--- .... ....                           
--- .... ....                             
--- .... ....                           
--- .... ....                           
--- .... ....                           
C-5 .... 3110 <- глиссов между командами нет, все нормально                           
--- .... ....                           
--- .... 2120 <- а вот и глисс - до портаменто он работает как положено....                           
--- .... ....   
--- .... ....                           
--- .... ....                           
C-4 .... 3110 <- а здесь он игнорируется - на слух как скачок
--- .... ....                           


то есть предельное отклонение вычисляется как
Code: Select all
chan[i].cmd.slide.limit = notetab[chan[i].newnote] - notetab[chan[i].oldnote]
chan[i].cmd.slide.add   = ((chan[i].cmd.slide.limit) < 0 ? -parm : parm); // здесь parm - шаг портаменто
сhan[i].cmd.slide.acc = 0; // сбрасываем предыдущее накопление от глиссов
chan[i].portanote = chan[i].newnote; chan[i].note = chan[i].oldnote; // на время портаменто действует старая нота!


В файле, кстати, предел посчитан заранее и хранится вместе с шагом (или скоростью, кому как - параметры 3-4, т.е. 3110 - портаменто с задержкой в 1 фрейм и шагом 10 периодов за...кхм...фрейм обработки команды :)) для быстроты плеера, однако это приводит к ошибкам ограничения портаменто, если эта команда стоит в начале паттерна, на чем и спотыкается родной pt3-плеер (бульбовский пересчитывает пределы на лету)

В PT 3.6 и выше портаменто учитывает смещения от глиссов, поэтому выше приведенный пример будет работать правильно, а предел считается как:
Code: Select all
chan[i].cmd.slide.limit = notetab[chan[i].newnote] - notetab[chan[i].oldnote]
chan[i].cmd.slide.add   = ((chan[i].cmd.slide.limit - chan[i].cmd.slide.acc) < 0 ? -parm : parm);
chan[i].portanote = chan[i].newnote; chan[i].note = chan[i].oldnote; // на время портаменто действует старая нота!
// nb: chan[i].cmd.slide.acc не обнуляется!


небольшая закуска из мануала к Vortex Tracker II:
Code: Select all
Музыканты ожидают более гибкого поведения команды 3. Здравый смысл подсказывает,
что скольжение должно начинаться не от частоты предыдущей ноты, а от текущей
частоты, которая могла быть сдвинута до этого предыдущими командами 1,2 и 3.
Например, в такой ситуации

          D-5 1F.F ....
          --- .... 11.1
          D-5 .... 31.1

в первой строке устанавливается нота D-5, во второй строке запускается команда
понижения частоты, а в третьей строке опять устанавливается нота D-5;
устанавливая при этом команду 3, музыкант надеется, что частота постепенно
выправится, однако в Pro Tracker 3.5 и более старых этого не происходит. Не
зависимо от наличия или отсутствия там команды 3 эти версии Pro Tracker 3 сразу
же (без всякого постепенного перехода), начинает играть ноту D-5. Pro Tracker
3.6 и выше данную ситуацию обрабатывает правильно, однако он не может правильно
это откомпилировать: такая команда портаменто просто удаляется (маскируется
соответствующая ошибка в стандартном плеере).

wbcbz7 note: справедливости ради, в PT 3.7 проблемы с удалением команды нет, и все играется как надо, но эта версия ВНЕЗАПНО не имеет компилятора, поэтому как её будет играть плеер - загадка


Да, на время портаменто действует старая нота, и орнаменты считаются от нее ;)

Конец портаменто обрабатывается так (код взят из pmd2psg, pt3md совместим по портаменто с pt3.6+ вортексом, но модули от pt3.6+ тоже играются верно):
Code: Select all
   if (chan[ch].cmd.slide.active) {
      if (!(--chan[ch].cmd.slide.count)) {
         // update
         chan[ch].cmd.slide.count = chan[ch].cmd.slide.delay;
         chan[ch].cmd.slide.acc += chan[ch].cmd.slide.add;
         if  ((chan[ch].cmd.slide.porta) &&
            (((chan[ch].cmd.slide.add >= 0) && (chan[ch].cmd.slide.acc >= chan[ch].cmd.slide.limit)) ||
             ((chan[ch].cmd.slide.add <  0) && (chan[ch].cmd.slide.acc <= chan[ch].cmd.slide.limit)))) {
            // disable portamento
            chan[ch].note = chan[ch].cmd.slide.portanote; // в portanote - новая нота, сохраненная для
            chan[ch].cmd.slide.active = false; //  восстановления в конце портаменто
            chan[ch].cmd.slide.acc    = 0;
         }
      }
   }


Здесь есть еще одна хитрость - если портаменто шло от оооочень "далекой" ноты I к другой II и, не успев закончиться, началось портаменто к третьей ноте III, то в качестве oldnote выступает I-я, а как newnote - III-я, и при этом накопление от старого портаменто не отбрасываем! Хороший детектор ошибок в реализации команды - олежин aquatic - я три для бился над тем, чтобы этот музон заиграл как надо, в то время как остальные и так играли корректно.

Портаменто без ноты в протрекерах всех версий вообще игнорируется напрочь, играет только Vortex и бульбоплеер (инструмент не сбрасывается, происодит переход к той ноте, что была раньше). Со случаями вроде "портаменто к той же ноте" всё вообще не ясно - вортекс играет все корректно, а вот pt3 - как повезет (выдержка из мануала к PT 3.71:)
Code: Select all
PT3.69:
*при компиляции убивается 3xxx на ту же ноту
*в компиляции возвращен старый алгоритм поиска исходной ноты
при 3xxx в начале паттерна (независимо от отсортированности
паттернов в позициях). Поясню на примере. Трек из интро к ADV13
не играется плейерами PT36x из-за 3xxx с ноты A-5 на одноименную
ноту (44-я и 54-я секунды). Паттерн #14 (в котором эта команда)
на самом деле используется дважды (второй раз 3xxx имеет смысл),
но в оригинале глисс никогда не звучит, т.к. PT35x занёс в саму
команду, что двигаться не надо. В PT36x аналогичное достигается
только полным убиванием 3xxx. Но для этого PT должен знать,
какая нота была предыдущей. В модуле паттерны не отсортированы,
и старые PT36x, пользуясь последней нотой в предыдущем ПО НОМЕРУ
паттерне, портили звук не только в этом месте, но и на первых
секундах. Сейчас трек без всякой сортировки выгрузится правильно
(но нельзя играть плейером от PT36x старый вариант модуля!
Плейер PT36x не играет 3xxx на ту же ноту!)

p.s. тот упомянутый трек http://zxart.ee/eng/authors/m/miguel/adventurer13-01/, pt3.5 в трекере играет вторую команду, в плеере игнорирует обе упомянутые команды, 3.7 в трекере - аналогично 3.5


Теперь по переполнениям в орнаментах. PT 3.5 и ниже в случае выхода итоговой ноты за пределы C-1..B-8 пожимают плечами и сваливаются в undefined behavior (у меня в 3.5 при выходе за C-1 звук просто отключался, а за B-8 читались левые данные из тоновой таблички, соответственно нота играла как попало). PT 3.6 и выше при переходе ниже C-1 подставляют C-1, если уйти выше C-8, то опять-таки поведение не определено. Vortex Tracker и его плеер просто режут ноту по границе C-1..B-8 и дальше не парятся. Пример - portalim.pt3

tl;dr: в pt3.6+ и вортексе орнаментом L-96 можно заставить любую ноту звучать как C-1 и, к примеру, сделать в инструменте типа независимые смещения тона

вроде на сегодня всё XD

p.s. напоследок - примеры в пт3 (пока что, pt3md 0.3 еще не готов)
Attachments
test.zip
(519 Bytes) Downloaded 524 times
Last edited by WBC on Sun, 04.06.2017 20:56:56, edited 2 times in total.
--wbcbz7
User avatar
WBC
 
Posts: 302
Joined: Fri, 19.09.2014 10:23:23
LOCATION: omsk XOR nsk

Next

Return to Music

Who is online

Users browsing this forum: No registered users and 1 guest

cron

x