Важная информация
  • Статья на HYPE: Vortex Tracker. Моды и форки.

    Источник: HYPE
    Автор: mr287cc

    Уже не раз мы обсуждали на канальчике телеграмчика 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 inShiftthen
    begin
    ifTracks.CursorXin[22..34]thenTracks.CursorX:=8;
    ifTracks.CursorXin[36..48]thenTracks.CursorX:=22;
    end

    else
    begin
    ifTracks.CursorXin[22..34]thenTracks.CursorX:=36;
    ifTracks.CursorXin[8..22]thenTracks.CursorX:=22;
    ifTracks.CursorXin[0..7]thenTracks.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
    ifMDIChildCount=0thenexit;
    ifIsPlayingthen
    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
    ifMDIChildCount=0thenexit;
    ifIsPlayingthen
    begin
    StopPlaying;
    RestoreControls
    end;
    PlayMode:=PMPlayPattern;
    DisableControls;
    CheckSecondWindow;
    PlayingWindow[1].ValidatePattern2(PlayingWindow[1].PatNum);
    PlayingWindow[1].Tracks.RemoveSelection(0,False);
    for i :=1 to NumberOfSoundChipsdo
    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.
    В идеале хочется выкинуть оттуда текстовую реализацию треков и запилить нормальный шестиканальный турбосаунд вместо двух трехканальных окошек, но сделать это [быстро] обещать не стану, поскольку довольно геморно.