Vortex Tracker. Моды и форки.

Уже не раз мы обсуждали на канальчике телеграмчика Vortex Tracker. Все pro и contra. Впрочем, каким бы не был VT неудобным, у него есть неоспоримое достоинство — это единственный трекер для AY/YM на PC. Поэтому выбирать не приходится.
Однако, сколько бы я не предпринимал попыток освоить AYшные чиптюны, все эти попытки разбивались об очень убогое юзабилити вортекс трекера. Я понимаю, что грех на это жаловаться, Сергей Бульба даже при таком подходе проделал большую работу, но тем не менее VT ещё слишком сырой, чтобы считаться качественным, удобным продуктом, на уровне, например, Famitracker'а.

Итак, ниже я перечислю некоторые недостатки трекера, которые подбешивают больше всего, и расскажу как их исправить и заточить под себя, ведь у нас есть исходные коды.

1. Неудобные горячие клавиши навигации. Нельзя, я считаю, проигрывание биндить на F5-F8 а остановку проигрывания на Escape. Зачем разбивать play song from current row и play pattern from current row на две отдельные клавиши — я не понимаю, достаточно оставить первое, второе не нужно.
Самой удобным я считаю реализацию в Impulse tracker. F5 — играть модуль. F6 — играть текущий паттерн. F7 — играть модуль с текущей позиции. F8 — стоп. Всё гениальное просто, под пятернёй вся навигация, и не нужно оголтело размахивать руками или раскорячивать пальцы, прыгая от F8 к Escape.

2. Неудобная навигация между треками паттерна. Классический подход — TAB и shift-TAB а не ctrl-right и ctrl-left.

3. В режиме turbo sound оба трека проигрываются вместе только в режиме «play song». Отдельно паттерн из двух модулей проиграть не получается — играет только один из них, текущий. Зачем — непонятно. Ведь отключить ненужные каналы можно соответствующими кнопками в окне модуля.

Вообще реализация режима turbo sound вызывает больше всего досады. Ведь куда удобнее было бы одно окно с шестью треками а не сцеплять джва трёхканальных модуля. Полагаю, это связано с классом TTracks (собственно, три трека для записи нот), который Бульба предпочел унаследовать от TWinControl и реализовать в виде текста (отсюда и требование только моноширинного шрифта в настройках) и сохранение модуля в txt формате. Похоже, что на тот момент автор еще не задумывался о режиме турбосаунда достаточно глубоко, и решил задачу «в лоб». В идеале было бы лучше создать потомка от TGraphicControl, но, понимаю, хотелось прежде всего поддержать множество трехканальных форматов, не хотелось много и нудно кодить, а о турбосаунде думалось в последнюю очередь. Именно поэтому режим TS и был реализован костылём, в виде «сцепки» двух обычных модулей.

Итак, далее расскажу как всё это поправить. Также могу в коментариях ознакомиться и с другими полезными предложениями, которых я мог не учесть.



Прежде всего, нам понадобится компилятор. На офсайте заявлено, что последняя версия трекера была подготовлена в Лазарусе, но я решил попробовать скомпилить тем, что было уже у меня установлено — Embarcadero Delphi XE5. Из-за несовместимости некоторых строковых типов переменных ничего хорошего после компиляции не вышло. Неверно сохранялись настройки в реестре, «плыл» нотный стан. В ход пошел другой инструмент — древний Borland Delphi 7. В нем всё скомпилилось и заработало с полтычка.

Скачаем архив с исходниками и откроем его (VT.dpr) в Borland Delphi 7.

1. Для начала разберемся с клавишами навигации.



Все они лежат в компоненте Actionlist1, я отмечу его на скриншоте цифрой 1. Кликнем на нём дважды, открыв окно редактирования (отметка 2). В левой колонке этого окна выберем категорию Play (отметка 3), и в правой колонке увидим все экшены, связанные с проигрыванием трека и паттерна. Кликнем на первом (Play1), в окне Object inspector найдем свойство ShortCut (отметка 4). Поменяем F6 на F5. В экшене PlayFromPos1 заменим F5 на F7. Stop1 забиндим на F8 вместо Esc. PlayPat выставим F6. И у нас остается PlayPatFromLine, совершенно, как по мне, бесполезная клавиша, я её выставлю на Ctrl+F6.

2. Теперь сделаем Tab и shift-Tab для переключения между колонками нот на треках.



В Delphi на уровне формы клавиша Tab обрабатывается операционной системой. Поэтому нам нужно переопределить процедуру CMDialogKey у формы с модулем. Для этого нам нужно открыть её исходник: View -> Project Manager или комбинацией клавиш Ctrl+Alt+F11 и в окне Project manager (отметка 1) дважды кликнем на модуле Childwin. После чего откроется его форма (отметка 2) и его код (отметка 3). Нам нужен код. Ищем в нем строку «TMDIChild = class(TForm)» и листаем ниже до директивы private, после которой допишем ещё пару строк:

procedure CMDialogKey( var msg: TCMDialogKey );
message CM_DIALOGKEY;


Теперь где-нибудь после ключевого слова implementation разместим код процедуры:

procedure TMDIChild.CMDialogKey(var msg: TCMDialogKey);
begin
  if msg.Charcode <> VK_TAB then
    inherited;
end;


Вот что вышло:




Теперь найдем идущие друг за другом строки «VK_RIGHT:» и «DoCursorRight;» и допишем после них:

VK_TAB:
 DoTabKey;


А где-нибудь после процедуры DoRemoveLine вкопипастим нашу процедуру:

procedure DoTabKey;
 begin
  RemSel;
    Tracks.ShowSelection(0);
    if ssShift in Shift then
    begin
         if Tracks.CursorX in [22..34] then Tracks.CursorX := 8;
         if Tracks.CursorX in [36..48] then Tracks.CursorX := 22;
    end

      else
    begin
      if Tracks.CursorX in [22..34] then Tracks.CursorX := 36;
      if Tracks.CursorX in [8..22] then Tracks.CursorX := 22;
      if Tracks.CursorX in [0..7] then Tracks.CursorX := 8;
    end;

    Tracks.RecreateCaret;
    SetCaretPos(Tracks.CelW * (3 + Tracks.CursorX),
                         Tracks.CelH * Tracks.CursorY);
     Tracks.RemoveSelection(0,True)
 end;






Всё, теперь мы можем переключаться между тремя «нотными» колонками каналов клавишами Tab и shift-Tab. Замечу, что ctrl+Вправо/Влево по-прежнему работают, перемещая курсор на следующую/предыдущую колонку треков.

3. Осталось поправить ситуацию с проигрыванием текущего паттерна в режиме Turbo Sound.
Для этого откроем код главного модуля (двойной щелчок в Project manager'e по модулю Main).

Найдем такой код:

procedure TMainForm.PlayPatExecute(Sender: TObject);
begin
if MDIChildCount = 0 then exit;
if IsPlaying then
 begin
  StopPlaying;
  RestoreControls
 end;
PlayMode := PMPlayPattern;
DisableControls;
PlayingWindow[1].ValidatePattern2(PlayingWindow[1].PatNum);
PlayingWindow[1].Tracks.RemoveSelection(0,False);
Module_SetPointer(PlayingWindow[1].VTMP,1);
Module_SetDelay(PlayingWindow[1].VTMP.Initial_Delay);
PlVars[1].CurrentPosition := 65535;
Module_SetCurrentPattern(PlayingWindow[1].PatNum);
InitForAllTypes(False);
StartWOThread
end;


И полностью заменим его на этот:

procedure TMainForm.PlayPatExecute(Sender: TObject);
var
  i: integer;
begin
if MDIChildCount = 0 then exit;
if IsPlaying then
 begin
  StopPlaying;
  RestoreControls
 end;
PlayMode := PMPlayPattern;
DisableControls;
CheckSecondWindow;
PlayingWindow[1].ValidatePattern2(PlayingWindow[1].PatNum);
PlayingWindow[1].Tracks.RemoveSelection(0,False);
for i := 1 to NumberOfSoundChips do
 begin
  Module_SetPointer(PlayingWindow[i].VTMP,i);
  Module_SetDelay(PlayingWindow[i].VTMP.Initial_Delay);
  PlVars[i].CurrentPosition := 65535;
  Module_SetCurrentPattern(PlayingWindow[i].PatNum);
 end;
InitForAllTypes(False);
StartWOThread
end;


Ну вот, мы и приблизили Vortex tracker ближе к трекеру своей мечты. Теперь жмём F9, проект скомпилируется и запустится. Исполняемый файл будет помещен в папку с исходниками.

Скомпилированный вариант с указанными доработками можно скачать здесь: www.dropbox.com/s/1buz1ygl5piyc7n/VT.zip?dl=0

UPD. Пересобрал на основе форка от oisee
Добавил альтернативный Stop на клавишу Esc. Хуже не будет.
Скачать: www.dropbox.com/s/ucb9zdo8soxcrxr/vti-init.rar?dl=0

Если не будет сильно лень, запилю на досуге настраиваемые горячие клавиши проигрывания модуля/паттерна. Чтобы больше не спорить что удобнее — Esc, F8 или вообще F1.
В идеале хочется выкинуть оттуда текстовую реализацию треков и запилить нормальный шестиканальный турбосаунд вместо двух трехканальных окошек, но сделать это [быстро] обещать не стану, поскольку довольно геморно.

26 комментариев

avatar
спасибо, а можно будет аналогичным образом версию от siril'а поправить?
рад, что такая тема возникла, надеюсь, интерес музыкантов подстегнет умельцев и мы модифицируем наш вортекс до предела, пока где-то там не будет дописан трекер мечты :)
avatar
Да, конечно, когда откомпилю, поправлю пост.
avatar
Было бы здорово прикрутить готовый парсер конфигов для Delphi и все хоткеи вынести в этот конфиг.
avatar
сколько лет я об этом мечтал :)
avatar
Я думаю, это более чем реально. И вряд ли это сложно. Тут главное бить себя по рукам, если возникает желание самому написать парсер конфига :)
avatar
как минимум, есть первоначальный импульс, ждем развития событий
avatar
А там проект под VCL заточен? Насколько жёстко код привязан к Win Api? Просто есть идея рискнуть переделать его на Firemonkey, чтобы скомпилировать под Macos.
avatar
Впрочем, это глупый вопрос. Проект старый и, конечно, он жёстко завязан на VCL… Если переписывать на Firemonkey, нужно 1/3 кода переписывать.
avatar
Более радикальный и при этом, конечно, более затратный вариант кроссбраузерности — это online-версия Vortex tracker :) Конечно Web Audio API, Audio workers и все эти модные штуки упростят процесс разработки, но, писать скорее всего придется практически с нуля.
avatar
Уж лучше тогда запилить под Linux, Mac и Windows, переделав GUI на Firemonkey. Я вот бы не стал юзать онлайн-версию, потому что меня бы преследовала постоянно мысль «А вдруг нужно будет, когда интернета не окажется под рукой».
avatar
Получится ли перетащить AY эмуляцию, вот в чем вопрос. А набросать интерфейс полбеды, это лучше вообще сделать с нуля, без костылей Бульбы. Чем и хотелось бы заняться при наличии времени и желания. Движок же есть, интерфейс уж больно груб, словно опенсорсники писали.
Линукс не нужен. Браузерные трекеры тоже, согласен.
avatar
Линукс не нужен. Браузерные трекеры тоже
Брависсимо.
avatar
Когда под линуксом заработает хотя бы один VST, без костылей и пердолинга, тогда можно оговорить о целесообразности в нем музыкальных утилит. Пока что этим там всё очень печально.
И да, минусуйте на здоровье, эти кнопочки — отличный индикатор боли)
avatar
Окей.
avatar
Меня постоянно теребит пара человек, чтобы я правил сборку под Linux в 1tracker, и они реально им там пользуются. В частности, utz, регулярно доставляющий работы в наши биперные компо. И тот же FamiTracker перепиливался героями с MFC в Qt форк, ради сборки в Linux.
avatar
Эмуляцию AY можно взять от TrueGlue (Пётр Советов), я проигрывание делал как под винду (Bass.dll), так и под макось (CoreAudio), там несложно совсем.
avatar
true-grue же :)
а чтобы не тащить кучку библиотек хвостом, можно взять PortAudio ;)
avatar
Ну я CoreAudio изучал, вот и на нем ваял, о кроссплатформенности не думал на тот момент) За ссылку спасибо, посмотрю на досуге
avatar
И в чем проблема, offline-приложения сейчас отлично работают и без интернета. LocalStorage и Service Workers отлично с этим справляются.
avatar
Сейчас веб-приложения легким движением превращаются в нативные оффлайн сразу для всех платформ: винда, линух, мак, айось, андроид. Другой вопрос, что с этим нужно отдельно разбираться.
avatar
Об том и речь. Если у трекерописателей-с-нуля есть достаточное количество времени на изобретение кроссплатформенного велосипеда, ну что ж, будет здорово. А пока что имеем то, что имеем. Так ведь и претензий-то нету. Работает здорово, интерфейс плоховат.
avatar
Кстати говоря, я пробовал начинать, но отложил до лучших времён. Там есть некоторые другие подводные камни (в частности, обработка звука происходит в одном потоке с рендером).
avatar
Справедливости ради, VTII всё же не единственный кросстрекер для AY/YM. Правильнее будет сказать, что это единственный клон православного PT3 для Windows. А другие трекеры скажем так, куда самобытнее, и некоторые изначально не для ZX. Навскидку вспомнил три, ещё было минимум два, но их за давностью лет не нашёл. Один изначально для ST, про другой помню, что было синее окошко и вроде автор немец.

Arkos Tracker — для Amstrad CPC, есть какая-то поддержка ZX
WYZ Tracker — для ZX, на нём делалась музыка в играх Mojon Twins
CHIPNSFX — совсем свежий для ZX, интерфейс не для слабонервных

Ну и касательно FamiTracker, в WIP версии 0.5.0 уже давно делается и работает поддержка YM, так как полноценный аналог YM2149F был встроен в маппер Sunsoft5B (Mr. Gimmick).
avatar
Сказать «самобытные» — это вообще ничего не сказать, да.
Про фамитрекер не знал, качал с сайта latest версию. Хотя чтобы звучать в Фами а ля AY, достаточно двух штатных каналов, где есть меандр, а расширив до VRC6, таких каналов будет уже 4.
avatar
А, ну и самое главное, конечно здесь: «это единственный клон православного PT3». Если после Arkos'a ещё можно выставиться в номинации ZX AY Music (и то не на всех пати), то про использование остальных для написания патитрека и речи быть не может)
avatar
хех, все же нашлись люди, решившие поковырять вортекс для улучшения (я ниасилил :), keep it! =)
Кстати, было бы классно еще добавить ползунок stereo separation для наушникоюзеров (я слегка редактировал константы в сырцах и пересобирал для себя вортекс, но добавлять контрол не стал)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.