Yamaha S-YXG50 Portable VSTi v1.0.0 [2016/04/25] (программный MIDI-синтезатор)

Программный MIDI-синтезатор для Windows, который работает как VSTi-плагин. Поддерживает расширения Yamaha XG и Roland GS, что является уникальной особенностью S-YXG50. Основан на пробной версии из пакета Yamaha SOL2. Yamaha так и не выпустила полную версию данного VSTi, прекратив поддержку всех своих программных синтезаторов в 2003 году. К счастью, пробная версия содержит полную версию движка S-YXG50, что позволило создать полноценную версию S-YXG50 VSTi своими силами. Помимо снятых ограничений пробной версии, этот патч предлагает полную переносимость (не требуется установка и ключи в реестре), а также использует зашитую в ресурсы DLL-файла 4MB-версию официального wavetable, лучше которого для S-YXG50 не выпускалось.

Скачать: yamaha_syxg50_vsti.7z (3.0MB).

Что нового в этом патче?

  • Не требуется установка. SYXG50.DLL теперь всегда читает файлы из своей директории.
  • Файлы таблиц звуковых данных расшифрованы и сохранены в ресурсах DLL-файла.
  • Если же их удалить из ресурсов, то VSTi будет искать их в своей директории (SXGBIN41.TBL, SXGWAVE4.TBL).
  • Полностью удалён антиотладочный код, код проверки серийного номера и код trial-режима.
  • Скрытые настройки читаются из ini-файла с именем, аналогичным имени dll-файла, но с расширением ini.
  • По умолчанию лимит полифонии равен 128.
  • Более частые обновления информации в GUI.
  • Кнопка Help будет спрятана, если нет файла SYXG.CHM.
  • Мета-информация VST находится в ресурсах (String Table), поэтому при необходимости её можно легко изменить.
  • GUI может быть выключено и ресурсы GUI могут быть удалены, в результате чего этот VSTi будет работать как SGP.DLL.

Как использовать

Для проигрывания MIDI при помощи этого синтезатора необходимо настроить какой-нибудь VST-хост. В качестве него может выступать ваш любимый плеер, только нужно найти соответствующий плагин. В качестве примера ниже приведено несколько инструкций. Для проверки корректности настройки послушайте bi2_polkovnik.mid (35KB) — он должен звучать идентично записи bi2_polkovnik_syxg50.ogg (2.0MB).

VST MIDI Driver (как системный MIDI-синтезатор)

VST MIDI Driver позволяет использовать любой VSTi как глобальный системный MIDI-синтезатор. В данном случае каждая игра или MIDI-плеер, которые используют стандартный системный MIDI-синтезатор, будут использовать Yamaha S-YXG50 VSTi.

  1. Скачайте и установите VST MIDI Driver с этой страницы.
  2. Скопируйте syxg50.dll из yamaha_syxg50_vsti.7z в любой каталог.
  3. Откройте настройки VST MIDI Driver, нажмите кнопку Load VSTi и выберите syxg50.dll.
  4. Во вкладке Advanced выберите VST MIDI synth в выпадающем списке Default MIDI synth.
  5. Готово! Сейчас Yamaha S-YXG50 VSTi будет использоваться как системный MIDI-синтезатор по умолчанию.

Yamaha S-YXG50 WDM (официальный драйвер только для Windows XP)

VST MIDI Driver поддерживает Windows XP/Vista/7+, но на Windows XP лучше использовать официальный Yamaha S-YXG50 WDM-драйвер, который можно скачать с серверов Microsoft Windows Update: 4MB-версия (лучше качество, расходует больше ресурсов), 2MB-версия (хуже качество, расходует меньше ресурсов). Установка этого WDM-драйвера производится вручную при помощи мастера установки оборудования в панели управления. Не забудьте выбрать Yamaha S-YXG50 как синтезатор MIDI по умолчанию в системных настройках звука. Когда используется Yamaha S-YXG50 WDM, в VSTi версии этого синтезатора нет необходимости.

foobar2000 (лучший плеер для тех, кто влюблён в музыку)

foobar2000 не использует системный MIDI-синтезатор, но это не является недостатком. Это позволяет использовать Yamaha S-YXG50 VSTi без установки драйверов в систему, что более надёжно.

  1. Скачайте и установите плагин foo_midi с сайта foobar2000.
  2. Создайте в каталоге foobar2000 подкаталог с именем vsti и скопируйте в него файл syxg50.dll из yamaha_syxg50_vsti.7z.
  3. Откройте в плеере настройки, Advanced → Playback → MIDI Decoder → VSTi search patch, укажите в этом поле полный путь до созданного вами подкаталога vsti, после чего примените изменения и перезайдите в окно настроек.
  4. Перейдите в Playback → Input → MIDI synthesizer host. В выпадающем списке plug-in выберите Yamaha S-YXG50, примените изменения.
  5. Готово! Теперь MIDI в foobar2000 будут воспроизводиться при помощи Yamaha S-YXG50.

Ссылки

  • yamaha_syxg50_vsti.7z (3.0MB) — версия со встроенным 4MB wavetable, для обычного использования.
  • yamaha_syxg50_vsti_ext.7z (4.0MB) — версия с внешними 2MB и 4MB wavetable, для экспериментов.
  • bi2_polkovnik.mid (35KB) и bi2_polkovnik_syxg50.ogg (2.0MB) — MIDI и пример его корректного звучания для проверки работы.

531 комментарий

  1. VEG Автор записи

    Wlad, если вас интересует чтение семплов и их разрядность — то я вам уже указывал, где находится соответствующий код.

    Внешняя частота дисктеризации задаётся хостом VSTi, и S-YXG50 умеет обрабатывать фиксированный список из частот дискретизации. Его можно увидеть в этой функции. А вот в этой функции можно увидеть, что для 11025 и кратных какой-то коэффициент возвращается как 44100*32=1411200, а для 48000 и кратных возвращается просто 48000. Если честно, без понятия что за оно. Но отчётливо видно, что 48000 среди поддерживаемых частот дискретизации, и он заявлен среди поддерживаемых в документации. А самое главное — 48000 вообще является стандартной частотой дискретизации в цифровом звуке. 44100 был введён Sony для CD Audio, но как правило все остальные ориентируются всё равно на 48000. У меня даже современные колонки Edifier R28000 работают ощутимо лучше, если их ресиверу отдавать звук в 48000 вместо 44100. Хотя признаю, я не знаю на какую именно частоту дискретизации ориентировалась Yamaha, это просто догадка. Разницы между 44100 и 48000 в S-YXG50 не слышу — сконвертировал MIDI в WAV с разной частотой дискретизации и провёл ABX-тест, который это показал. В спектрограмме можно увидеть, что при 48000 используются частоты со всего доступного спектра, то есть синтезатор честно синтезирует звук сразу с частотой дискретизации 48000 Гц, речи о том что это передискретизация с 44100 нет. Однако, также могу сказать, что в то же время 96000 поддерживается с ошибкой — это отчётливо слышно на bi2_polkovnik.mid, звук становится слишком глухим. Возможно, в коде для 96000 устанавливается какой-то неправильный коэффициент. Думаю как-нибудь поиграться с этим.

    Возможно, мне просто медведь на ухо наступил, поэтому и не слышу разницы между отрендерёнными MIDI в 44100 и в 48000. Если вы слышите разницу — почему вы считаете, что именно в 48000 у вас вышло «получил кучу пересчётов, из за того что тон синта как раз и нарушался»?

    Рекомендую отрендерить один и тот же трек с частотами дисктеризации 44100 и 48000, а потом сравнить полученные файлы на слух при помощи слепого ABX-теста, чтобы выяснить, действительно ли вы слышите между ними разницу. Чтобы избежать возможной разницы в воспроизведении звука с разной частотой дискретизации вашей аудиокартой, можно файл с частотой дискретизации 44100 дополнительно перегнать в 48000 хорошим ресемплером (например, при помощи foobar2000), и сравнивать уже два этих файла с частотой дискретизации 48000, один из которых изначально был отрендерён при помощи S-YXG50 с частотой дискретизации 44100.

    упакован UPX ультра глубоким сжатием

    Не рекомендуемая техника. Уменьшается занимаемый объём на диске в установленном виде (размер скачиваемого из интернета архива остаётся почти тем же), но замедляется загрузка и увеличивается расход оперативной памяти. Например, если конвертировать при помощи foobar2000 MIDI в WAV в 8 потоков, при использовании распакованной DLL в память реально будет загружена одна копия (Windows умеет загружать одну и ту же DLL единожды для всех процессов), плюс при необходимости сбросить какие-то страницы памяти, принадлежащие этому файлу, они не будут записаны почём зря в своп, ОС их просто прочитает из исходного файла когда понадобится. В случае же с использованием упаковщиков типа UPX все эти преимущества сходят на нет. Объёмы жёстких дисков и SSD сейчас достаточно велики, чтобы не заниматься подобной экономией ценой производительности. Тем более, что файловые системы поддерживают сжатие на лету, и если кому-то важно сэкономить пространство на диске ценой процессорного времени, могут просто включить сжатие в файловой системе ОС (под виндой поддерживается в NTFS).

  2. Wlad

    Здравствуйте VEG.
    По поводу упаковки файлов, я с вами согласен, я признаться не знал что Windows умеет загружать одну и ту же DLL единожды
    для всех процессов, поэтому если кому нужен Sound Canvas VA v1.0.3 Portable с распакованными DLL, вот ссылка :
    https://yadi.sk/d/Lqra5OOG3GPATJ
    К архиву с распакованными DLL я добавил в конце букву "u", т.е. Unpack, - Sound Canvas VA v1.0.3 Portable u

    VEG, хочу вас поблагодарить за подсказку с частотой дискретизации, лучше и не нужно, мне многое стало понятно, спасибо вам.
    По поводу :

    что именно в 48000 у вас вышло «получил кучу пересчётов, из за того что тон синта как раз и нарушался»?

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

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

    Дело в том, что меня могут резко и неожиданно в любой момент забрать в командировку, приблизительно на пару месяцев,
    и у меня на вряд ли будет пока возможность заниматься полноценно проектом, поэтому я хочу приобрести планшет на Windows
    или какой нибудь нетбук, и на нём если будет свободное время, заниматься изучением движка, думаю начну сразу с подсказок,
    которыми с нами поделился VEG.

    Так же хочу выложить проект, на основе Ymf-724, который и будет дальше развиваться не меняя своего курса, и не будет больше
    переименовываться. В этом проекте готовы практически все таблицы, и все они разделены по категориям, осталось закончить
    совсем не много, и займусь схематическим представлением структуры.
    В этом проекте, мы с Alexysем уже добавили три новые бас бочки и один рабочий барабан Snare H в Standart kit, так же заменил
    Saw OSC (пилообразный осциллятор), на более качественный, а так же заменил и синусоиду.

    Список инструментов относящихся к Saw OSC.
    AnaBrs1, AnaBrs2, AnaVelBrs, JumpBrss*, PolyBrss, RezSynBr, SoftBrs, SynBras1*, SynBras3*, SynBras4*, Trmbone2, VelBras2
    Bass+Lead, BigFive*, Big+Low, DigiSaw*, Dr.Lead*, DunaSaw, FifthLead*, HeavySyn, PulseSaw*, Saw2, SawLead, SeqAna, SquareLd*
    ThickSaw*, VeloLead*, WaspySyn, PolySyPd*, EchoPan, EchoBell*, Hichriki, AcidBass, ClaviBass, FastResBass, Hammer, MelloSB1,
    ModularBass, RubberBass, SeqBass, SynBass2, SynBa1Dk, SynBa2Dk, TeknoBass.

    *- Это микш Saw OSC с другим слоем.

  3. Wlad 2

    Wlad, хочу найти планку оперативки ддр2 на 4 гига. Стоит ли это делать? Я про б/у вариант. Какие тут могут быть подводные камни?

  4. Wlad

    Wlad 2, 4гб одной планкой не советую ставить, просто ставить ее одну нет смысла, т.к. получится одноканальный режим, а для
    активации двухканального режима, нужно ставить оперативку парами, например 2х2гб или 2х4гб, да и не каждая материнка
    поддерживает 4-х гиговую планку, может получится так что из 4гб материнка увидит 2гб, это в лучшем случае, а в худшем
    вообще не стартанёт. Так же советую устанавливать озу одной фирмы с одинаковыми таймингами (например 4-4-4-12 и т.п),
    а то из за разношерстной памяти могут иногда получится довольно серьёзные глюки, например комп самопроизвольно будет
    перезагружатьса не с того не с сего, появляться синий экран смерти (DSOD), а также "Память не может быть read\written"

  5. Wlad 2

    Wlad, значит две планки по 4 гб. В Минске нашёл только одной фирмы предложение за 150 рублей новые, где-то так. А вот б/у дешевле можно найти?

  6. Wlad

    Wlad 2, на счёт цен ничего сказать не могу, т.к. сам живу в России, а так в общем советую брать новые и одной серии , да, дороже,
    но так в любом случае надёжнее и спокойнее будет. Раньше по дешевле брал пачками DDR2 бу из за выгодных предложений,
    но увы, часть слотов долго не проработало, и в итоге себе дороже вышло, к тому же DDR2 менее надёжная чем скажем DDR3,
    и тут ещё зависит от конкретной серии и производителя, в общем решать конечно тебе, но по своему опыту с DDR2 могу сказать,
    что скупой платит дважды !

  7. Wlad 2

    Да, конечно, я с тобой согласен.

    Wlad, было появилось немного свободного времени, тестировал тот банк, где ты добавил Дэнс кит (28). По-началу я не заметил, а теперь вылезло. Хэт открытый (нота си бемоль) не регулируется по высоте. Иными словами, где-то ошибка по питчю и по громкости. Эти параметры выставляются в систем эксклюзив. Но, в других миди, вроде всё нормально. Я думаю, что где-то там ошибка, именно в посыле команд синтезатору.

    И ещё. У друга есть спаленая ХГ карта, модель уточню в бижайшее время. Можно ли снят дапм в таком случае7

  8. Wlad

    Wlad 2, будет время, покопаюсь в Дэнс кит, постараюсь отыскать где там собака зарыта, скорее всего это где то в настройках конфига самого открытого хэта. Что касается XG карты по поводу снятия дампа, если это Ymf 724, Ymf 740, Ymf 744, или Ymf 754, то дамп с неё сделать не выйдет, т.к. вся эта серия плат использует внешний банк и все остальные потроха, которые уже перенесены на софтсинт, а вот если DB50XG или SW60XG, или их аналоги, тогда конечно с этих плат дамп сделать можно, даже я бы сказал нужно, т.к. в них другой банк и настройки которые можно так же перенести на софтсинтезатор. Ну а SW1000XG, думаю на вряд ли у кого нибудь сгорит.

  9. VEG Автор записи

    Wlad, сопоставил вот это:

    Если посмотреть в WF_STRUCTURE.BIN самый первый конфиг семпла инструмента, значение 080h (в квадратных скобках)
    указывает на 22050, а если поставить 00h, то на 44100, следующее значение 00h не на что не влияет.
    01--3C00--00--0000--00--00DC--937D06--[80]00--00FF
    В табличке DRW_STRUCTURE.BIN, также, самый первый конфиг семпла барабана, также значение 080h указывает на 22050,
    а 00h на 44100, а здесь следующее значение 00h используется для подстройки барабана только в режиме GS.
    3C706603335F5F7F0000017F1F5E4040FFFF51--0E86--00--0DCC--4F26D6--[80]0006

    с вот этим:

    а при конвертировании в 44100/8bit работает всё отлично и качество супер , только вот появляется небольшой шум.

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

    Подумалось вот что: если взять PCM 8-bit, и начать воспроизводить его как PCM 16-bit, то мы как раз услышим, что скорость воспроизведения увеличилась в 2 раза и появился некоторый шум, поскольку каждый нечётный байт 8-битного семпла у нас будет попадать в младший байт 16-битного семпла, что и будет создавать шум. Может быть именно этот факт, что если читать 8-битный звук как 16-битный, то он будет разборчивым, но с шумом, сбил вас с толку, и вы решили, что меняется частота дискретизации? Кстати, откуда вы взяли именно 22050 и 44100 здесь, или эти цифры вы просто привели для примера, просто исходя из факта, что воспроизведение становится в 2 раза быстрее, если этот байт равен нулю?

  10. Wlad

    Доброго вам вечера VEG.

    Кстати, откуда вы взяли именно 22050 и 44100

    Дело в том, что если в табличках поставить код 00h вместо 80h, то увеличится скорость чтения семпла ровно в двое, за счёт того
    что синтезатор начинает читать семплы по два байта (не путать с 16-бит), но воспроизводит всё равно последовательно по одному
    байту (8-бит), именно отсюда и получается скорость 8-ми разрядных данных вдвое выше. Соответственно разрешение семпла
    всё равно составляет один байт, который равен 255-ти единицам информации, и при этом размер банка увеличивается ровно
    в двое, 22050-8 *2 = 44100-8.

    В случае с 16-ти бит, синтезатор должен читать семпл по два байта (что он сейчас и делает), и воспроизводить также
    с разрешением в два байта (уже в 65535 единиц информации). Если сейчас синтезатору указать на 16-битный семпл, то он
    воспроизведёт двухбайтное разрешение семпла последовательно по одному байту, т.к. он думает что это 8бит, что и приводит
    к страшным искажением в звуке из за не правильного воспроизведения (интерпретации данных). Здесь также размер файла
    увеличивается ровно в двое, но ч.д. остаётся прежней, 22050-8 * 2 = 22050-16.

    Меня всё это натолкнуло на мысль, что если это не тот кусок кода который читает семплы, а нужен тот кусок кода который их
    воспроизводит. Дело в том, что у Андрея Ревво две эти таблички конфигов семплов абсолютно идентичные моим
    (т.к. это один и тот же синтезатор), а другие таблицы им не затронуты, т.е. он указал синтезатору в таблицах двухбайтное чтение
    семплов (как и я), и где то в коде указал синтезатору воспроизводить семплы по два байта (с разрешением в 16-бит
    в 65535 единиц информации), а в данном случае синтезатор воспроизводит всё в однобайтном разрешении в 255 единиц
    информации, не зависимо от того по сколько байт он читает семплы.

    Здесь https://yadi.sk/d/YIBy3KRJ3GXSg9 находится банк EXTENDED Андрея Ревво.

    EXTENDED.YB0 - это и есть сам 16-ти битный банк, который идентично подходит к синтезатору YMF 724 44100
    ( https://yadi.sk/d/eDhLoXlJ3EERyK ) согласно таблицам, и размер у этих банков так же идентичен (44100-8 = 22050-16), его смело
    можно переименовать в YmF724.smp, и услышать в синтезаторе, что семплы позиционируются правильно, также как и их циклы,
    и скорость, а звук интерпретируется не правильно.
    (пока это писал, вспомнил что Андрей Ревво на своём сайте пишет в FAQ, что проигрывание 8/16-бит семпла в режиме Loop.)
    EXTENDED.YB1 - Он же WF_STRUCTURE (WaveForm Structure), абсолютно идентичен тому который находится в YmF724.tbl
    (достаточно сравнить)
    EXTENDED.YB2 - Он же DRW_STRUCTURE (DrumWave Structure), так же абсолютно был идентичен тому который находится
    в YmF724.tbl, только в каждом конфиге я поставил значения фильтра 7F, а резонатора 11, что бы улучшить барабаны, это и всё
    отличие от EXTENDED.YB2.
    EXTENDED.YB3 - Предположительно использовался программой Power Ymf для распаковки, а также при сборке банка
    (эта таблица в драйверах и в синтезаторе отсутствует)

  11. Wlad

    Всем привет !
    Выкладываю обновлённый проект, исправил в нём некоторые ошибки, и для пробы создал пять новых инструментов в новом
    банке на основе заменённых осцилляторов. https://yadi.sk/d/SEYy9oCW3GYf3t

    В общем, заменён Saw OSC, Pulse OSC, и Digi saw OSC.
    Saw OSC:
    AnaBrs1, AnaBrs2, AnaVelBrs, JumpBrss*, PolyBrss, RezSynBr, SoftBrs, SynBras1*, SynBras3*, SynBras4*, Trmbone2,VelBras2,Bass+Lead,
    BigFive*, Big+Low, DigiSaw*, Dr.Lead*, DunaSaw, FifthLead*, HeavySyn, PulseSaw*, Saw2, SawLead, SeqAna, SquareLd*,ThickSaw*,
    VeloLead*, WaspySyn, PolySyPd*, EchoPan, EchoBell*, Hichriki, AcidBass, ClaviBass, FastResBass, Hammer, MelloSB1, ModularBass,
    RubberBass, SeqBass, SynBass2, SynBa1Dk, SynBa2Dk, TeknoBass.

    Pulse OSC:
    SqrBass, Big+Low*, Dr.lead*, Hollow, LMSquare, SoftWurl*, Square2, SquareLd*, SquarPad, SinePad, Round Glockenspiel,

    Digi saw OSC:
    Digital Sawtooth, Tine Pad, Bell Harp

    Новые инструменты находятся в банке 123, создавал исключительно для пробы осцилляторов.
    38=Synth Bass Dig, 39=Rubber Bass pulse, Digi synth Brass, Lead Pulse w, и Saw lead Ett.

    P.S. Напомню, что всё считается от нуля, как банки так и патчи.

  12. Wlad

    Всем доброго времени суток.
    Разобрался я наконец с движком, а также и модифицировал его. Нашёл наконец то те места где включается разрядность,
    оказывается для инструментов одна подпрограмма чтения семплов, а для барабанов другая, всё это делается совместно с
    64-х разрядными регистрами MMX, теперь синтезатор стал 16-бит ! Прощайте искажения и шум ! :)
    Также в этих же подпрограммах меняется и частота дискретизации, например movd mm0,[edx+edi*2], здесь видно что семплы
    читаются по два байта, и при 16-ти битах ч.д. равна 22050, а если эту команду изменить на movd mm0,[edx+edi*4], то синт начинает
    читать семплы по четыре байта, из за чего и увеличится скорость чтения/воспроизведения семпла, и в итоге мы получаем
    44100 16-бит (проверено), и ко всему этому также увеличивается и длинна волны семпла ровно вдвое.

    Также мне удалось увеличить размер банка до 1,5гб ,и это отличный результат для этого синтезатора, более 1,5гб движок
    отказывается загружать в память, я даже смотреть не стал почему, т.к. больше и не надо. Чтобы добиться такого обьёма, пришлось
    сдвинуть некоторые значения в табличках, и использовать неиспользуемые значения, при этом немного дописать код в двух
    подпрограммах, что бы расширить эти два счётчика, всё это делалось в Ollybdg 2.01
    Примеры изменения в таблицах :
    Instrument table
    00--2DF7--00--292A--00--1A7C--[2C6D72]--8000--0022 ;oreg
    00--2DF7--00--292A--00--1A7C--[002C6D72]--80--0022 ;new
    Drums table
    3C706603335F5F7F0000017F105E4040FFFF51--0FCF--00--0C84--[242B80]--000006 ; oreg
    3C706603335F5F7F0000017F105E4040FFFF51--0FCF--0C84--[00242B80]--000006 ;new
    Как видно в квадратных скобках, адресация на семплы расширилась на один байт, из за чего и был перешагнут порог в 16мб.

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

    По адресу : 1AD60h - подпрограмма чтения семпла инструментов, если код в табличке равен 00h (чтение семпла по два байта)
    По адресу : 1AE30h - подпрограмма чтения семпла барабанов, если код в табличке равен 00h (чтение семпла по два байта)
    В этих двух подпрограммах есть команда : mov eax,80008000h, её нужно заменить на mov eax,00000000h, и тогда ограничение
    разрядности в 8-бит будет убрано. Чуть ниже будет команда : movd mm0, [edx+edi*2], которая отвечает за количество читаемых
    байт.
    Если код в таблице равен 80h, то уже другие две подпрограммы читают семплы которые находятся по адресам : 1ABB0h и 1AC90h,
    по сути они практически идентичные предыдущим, только чтение происходит по одному байту.

    Также привожу адреса где обрабатываются конфиги семплов, для инструментов и барабанов.
    Чтение таблиц конфигов инструментов : 15620h
    Чтение таблиц конфигов барабанов : 138F0h

    По этой ссылке находится синтезатор моего проекта : https://yadi.sk/d/KoAblPkv3GtnH3
    Сейчас он работает в режиме 22050-16бит, и у него заменена Дистошн гитара (бета), и Finger Bass, подробнее :
    00-(33)=Electric Bass finger
    18-(33)=Finger dark
    27-(33)=Flange Bass
    40-(33)=Bass & Distorted E.Gtr
    41-(25)=SteelGtr with BodySound
    43-(33)=Finger Slap Bass
    45-(33)=Finger Bass 2
    65-(33)=Modulated Bass
    96-(35)=Synth Fretless

    У меня есть вопрос к VEGу. VEG, подскажите пожалуйса, как мне на Flat Assemblere написать программку, которая бы умножала
    на два трёхбайтные значения в таблице, которые находятся с шагом 0Fh как на скриншоте : 16 Wave Structure.png помеченые
    красным цветом : https://yadi.sk/i/IwwLG_fH3Gtpjd
    дело в том, чтобы конвертировать банк в более качественный, он увеличивается в размере, и эти значения также нужно
    увеличивать в двое, т.к. это указатели на семплы, но у меня не получается с этим разобраться, и приходится всё это считать
    вручную :(, на что уходит много времени, сил, а также допускаются ошибки. Напишите пример для 16 Wave Structure ?
    https://yadi.sk/d/Fq26l0CD3GtpGe если согласитесь, буквально на днях выложу синт Ymf-44100-16 (родной), т.к. это
    единственный недостающий инструмент в проекте без которого как без рук, а для таблицы барабанов (05 Drums Samples),
    на основе вашего примера, я пойму как это делается, и сам переделаю его для второй таблицы.

  13. VEG Автор записи

    более 1,5гб движок отказывается загружать в память

    Адресное пространство у 32-разрядных процессов по умолчанию ограничено 2 гигабайтами. Какие-то адреса занимает код синтезатора. Слишком большой непрерывный участок адресного пространства система просто не может предоставить синтезатору. В вашем случае система нашла непрерывный участок в 1.5 гигабайта. У кого-то другого может быть меньше в зависимости от VST-хоста (VST-хост тоже ведь находится в этом же адресном пространстве и тоже какую-то его часть занимает). То есть на полном серьёзе больше чем на гигабайт лучше не рассчитывать, чтобы с особо толстыми VST-хостами не было проблем.

    В этих двух подпрограммах есть команда : mov eax,80008000h, её нужно заменить на mov eax,00000000h, и тогда ограничение разрядности в 8-бит будет убрано.

    Оно просто отнимает от 16-битных семплов число 0x8000. Для 8-битных семплов оно тоже отнимает 0x80. Просто конвертирует из unsigned PCM в signed PCM (или наоборот). Если у вас работало неправильно — значит вы подавали PCM не в том формате, в котором ожидал синтезатор. Например, синтезатору нужен 16-bit unsigned (беззнаковый) PCM, а вы подавали 16-bit signed (знаковый) PCM. То есть достаточно сохранить семплы в правильном формате и правок в коде не понадобится. Тем более, что 8-битные семплы хранятся так же, как и 16-битные, и к ним применяется то же преобразование.

    Возможно, вас ввёл в заблуждение формат WAV, в котором наблюдается неконсистентность в этом вопросе — для 8-битного звука там используется unsigned, а для 16-битного звука там используется signed. Если вы брали сырые данные из WAV, то понятно, почему возникла проблема. Просто из-за того что WAV использует не тот формат чисел для 16 битов.

    Кстати, как я уже говорил, в 4-мегабайтном банке в файле семплов, если его прослушивать напрямую, некоторые семплы, судя по всему, в 16-битном виде. Потому что при прослушивании в 8 битах там беспорядочный шум, а при прослушивании в 16 битах там появляются узнаваемые семплы. Посмотрите во второй половине файла, почти сразу после середины один участок, и в конце файла — второй участок.

    Также в этих же подпрограммах меняется и частота дискретизации, например movd mm0,[edx+edi*2], здесь видно что семплы читаются по два байта, и при 16-ти битах ч.д. равна 22050

    И опять же, откуда вы взяли цифру 22050? Её в коде здесь нигде нет. Да, читаются семплы по 2 байта, но нет ни одного указания на частоту дискретизации (сколько раз в секунду берётся новый семпл).

    Чуть ниже будет команда : movd mm0, [edx+edi*2], которая отвечает за количество читаемых байт.

    *2 здесь не задаёт количество байт, оно задаёт лишь смещение, начиная с которого будет читаться байт. В edi находится номер нужного семпла откуда читаем, в edx находится начальное смещение. Добавляем к начальному смещению (edx) номер нужного семпла умноженный на два (edi*2) — и получаем смещение откуда нужно читать следующие семплы. Функция movd всегда читает по 32 байта. Просто версия функции с MMX для оптимизации обрабатывает семплы парами. Именно поэтому оно загружает и значение 0x80008000 а не просто 0x8000 — чтобы за одну инструкцию отнять это число сразу от двух семплов. В версии функции без MMX вы увидите идентичный алгоритм, но который обрабатывает семплы по одному.

    а если эту команду изменить на movd mm0,[edx+edi*4], то синт начинает читать семплы по четыре байта, из за чего и увеличится скорость чтения/воспроизведения семпла, и в итоге мы получаем 44100 16-бит (проверено), и ко всему этому также увеличивается и длинна волны семпла ровно вдвое.

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

    По адресу : 1AD60h - подпрограмма чтения семпла инструментов, если код в табличке равен 00h (чтение семпла по два байта)
    По адресу : 1AE30h - подпрограмма чтения семпла барабанов, если код в табличке равен 00h (чтение семпла по два байта)

    Как я уже говорил, они не одни. В зависимости от возможностей процессора и настройки Process выбирается один из трёх наборов функций. Вы исследовали только один набор, который активируется при наличии MMX и выключенном Process. Если вносить правки в эти функции, то надо вносить их и в дублирующие эту функциональность функции. Однако, возможно что здесь правки и не нужны по описанным выше причинам.

    Если я не ошибся насчёт знакового (signed) и беззнакового (unsigned) PCM, то здесь прям напрашивается доработка, которая позволила бы из tbl-файла выбирать не только разрядность (8bit/16bit), но и наличие знака (signed/unsigned). Чтобы движок сам по себе был более универсален. Запишу это себе в блокнот с хотелками.

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

    буквально на днях выложу синт Ymf-44100-16 (родной)

    И опять возникает вопрос, почему вы считаете, что оригинальные семплы там с частотой дискретизации 22050? Я слушаю файл семплов и слышу, что многие из них звучат с нормальной скоростью только при 11025 или 12000. Обратите внимание, например, на звук вертолёта, зажигания, тормозов, пролетающей гоночной машины или смех — тут вы можете быть уверены в том, как оно должно звучать в жизни, чтобы прикинуть, какая там реально частота дискретизации.

    Где будут взяты семплы с частотой дискретизации в 2 (и более) раза выше оригинальной? Если это будет конвертация из оригинальных семплов — то смысла в этом немного. После того как качество семплов было урезано в 1996 году при создании этого набора звуков, вернуть назад его без наличия оригинальных семплов не получится.

    VEG, подскажите пожалуйса, как мне на Flat Assemblere написать программку, которая бы умножала на два трёхбайтные значения в таблице, которые находятся с шагом 0Fh как на скриншоте : 16 Wave Structure.png помеченые красным цветом

    Я думаю лучше всё же это дело оформить в виде «скрипта» на FASM, который будет собирать из кучи файлов один большой tbl-файл с конфигом и семплами. Для этого надо написать скрипт, который разобьёт файл с семплами на кучу мелких файлов (каждому семплу отдельный файл) и сгенерирует файл для сборки этих файлов обратно, но только чтобы все смещения там вычислялись автоматически. То есть замените один файл семпла — и все нужные значения в табличке пересчитаются в соответствии с его новым размером, адреса всех семплов что за ним соответствующим образом сдвинутся. Я могу это сделать. Не на FASM, писать такие вещи на таком низкоуровневом инструменте — это лишняя трата времени. Я напишу сам себе небольшой скриптик на C# Script, который разобьёт оригинальные файлы семплов на кучу маленьких и сделаю файл сборки всего этого, уже на FASM (то есть собирать обратно можно будет им). Только мне нужна точная информация где в tbl-файле находится таблица семплов и описание всех байт в каждой записи для одного семпла.

    Instrument table: 00--2DF7--00--292A--00--1A7C--[2C6D72]--8000--0022
    Drums table: 3C706603335F5F7F0000017F105E4040FFFF51--0FCF--00--0C84--[242B80]--000006

    Я так понимаю, так выглядят записи для каждого инструмента или барабана. Мне нужно знать где находятся таблицы этих инструментов и барабанов в маленьком tbl-файле (номер секции, как я понимаю) и описание смысл каких байт вам известен. Эта информация поможет мне сгенерировать удобный для редактирования FASM-файл, где каждый осмысленный параметр будет удобно менять. Например, оно может выглядеть как «drumcfg 25, 80h, ...» где 25 — это номер семпла барабана (каким по счёту он подключён в файл семплов), и соответствующий макрос автоматом в нужные места подставит смещение и размер семпла, а дальше перечисляются какие-то другие параметры, связанные с этим семплом, которые тоже автоматически подставятся в нужные места.

    P.S. Если не секрет, чем вызвано то, что у вас все переносы в сообщении расставлены вручную? При изменении ширины текста на сайте поплывёт же всё =( Например, сделайте размер окна браузера меньше — и вы увидите, что ваш текст из-за этого неправильно переносится. Может быть, вы для набора сообщения используете notepad.exe, и это он шалит?

  14. Wlad

    Доброго вам вечера VEG.
    Понятно насчёт 1,5гб ,на вряд ли конечно столько понадобится :).

    То есть достаточно сохранить семплы в правильном формате и правок в коде не понадобится.

    Кажется я понял где допустил эти две грубые ошибки. Знать бы конечно ещё на чём конвертировать этот 16-bit unsigned формат..., в любом случае я стремился к 16-bit signed, и наконец то нашёл то что нужно, а в случае с movd mm0, [edx+edi*2], это многое обьясняет, теперь мне ясно за счёт чего появлялась увеличение скорости семпла :).

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

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

    почему вы считаете, что оригинальные семплы там с частотой дискретизации 22050?

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

    Если не секрет, чем вызвано то, что у вас все переносы в сообщении расставлены вручную?

    Я даже и не знал об этом, что же вы раньше не сказали, просто у меня монитор 27дюймов https://market.yandex.ru/product--asus-vg278he/8429215 и я думал если выровнять текст, то так будет лучше, а оказалось наоборот. :), даа, я действительно часто использую блокнот, спасибо за ссылку, буду исправлять также эту ошибку.

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

  15. VEG Автор записи

    Знать бы конечно ещё на чём конвертировать этот 16-bit unsigned формат...

    Там по сути дела у каждого семпла нужно просто инвертировать самый старший бит для конвертации. Получить чистый RAW-файл без заголовков в таком формате можно при помощи декодера FLAC. То есть сразу кодируете семпл в FLAC (это преобразование происходит без потерь), а затем при помощи flac.exe его можно декодировать обратно напрямую в RAW с нужным вариантом PCM. Вам нужны будут эти параметры командной строки (впрочем, запустите flac --help и там будет справка):

    format options:
          --force-raw-format       Treat input or output as raw samples
    raw format options:
          --endian={big|little}    Set byte order for samples
          --channels=#             Number of channels
          --bps=#                  Number of bits per sample
          --sample-rate=#          Sample rate in Hz
          --sign={signed|unsigned} Sign of samples
          --input-size=#           Size of the raw input in bytes

    Если возникнут трудности, напишу пример. Этот способ можно использовать для автоматической конвертации через bat-файл.

    Вручную через GUI можно это же сделать при помощи Wavosaur. Там можно как импортировать из сырых файлов (с гибкими настройками), так и экспортировать в сырые файлы без заголовков также с указанием нужных параметров.

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

    Действительно, я тоже слышу некоторый фоновой шум. А вы знаете какие инструменты используют эти семплы? Если эти инструменты использовать из синтезатора, слышен ли этот шум? Если нет, то возможно, мы упускаем какой-то нюанс и читаем семплы не совсем верно.

    Я даже и не знал об этом, что же вы раньше не сказали, просто у меня монитор 27дюймов и я думал если выровнять текст, то так будет лучше, а оказалось наоборот. :)

    А я всё гадал чем может быть вызвано такое странное форматирование. Потом вспомнил про эту статью про блокнот — решил, может это как раз и есть результат этого форматирования :) Кстати, если нужно использовать моноширный текст — можно использовать теги <code>код в строке</code> или <pre>код отдельным блоком с сохранением пробелов</pre>. Выше я как раз сделал блок при помощи <pre>. Это по сути стандартный набор тегов HTML (некоторые из них разрешены в комментариях: a, b, i, blockquote, code, pre). Надо будет как-нибудь к форме комментирования кнопки прикрутить для удобной вставки этих тегов. Если честно, никогда раньше не думал, что тут в комментариях вдруг развернётся такая большая дискуссия :)

  16. Alexys

    Надо будет как-нибудь к форме комментирования кнопки прикрутить для удобной вставки этих тегов. Если честно, никогда раньше не думал, что тут в комментариях вдруг развернётся такая большая дискуссия :)

    Да, сделайте кнопки !! Думаю, все будут довольны.

  17. VEG Автор записи

    Alexys, готово =)

    Wlad, можете также заодно указать в каком порядке логичнее всего было бы указывать эти параметры в человеческом виде, и какой формат для каких из параметров более подходящий — 16-ричный, 10-тичный и т.д. Я макросами сделаю чтобы оно автоматом преобразовывалось в записи с байтами в нужном порядке. Учтите только, что я не музыкант, и какие-то названия параметров мне могут быть не ясны (но я в этом случае просто спрошу что непонятно). Задача такая — сгенерировать подробный FASM-файл, который было бы более удобно редактировать, при этом он (если без внесения изменений) должен собираться обратно в идентичный исходному tbl-файлу (или tbl-файлам).

  18. Wlad

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

    VEG, Помогите пожалуйста найти, в коде ниже считывается из таблички счётчик из трёх байт, который находится в табличке под заголовками 6-,7-, и 8-, как видно по коду, считываются все три байта, но работают в синтезаторе реально только два, 7- и 8-, а самый старший байт 6- где то отсекается похоже в виде ограничения (длинны волны LOOP региона семпла), дело в том что сформированный счётчик из ECX перемещается куда то в память в [edx+000001D4h], и я ни как не могу понять где это (из за недостатка знаний), с 3-,4-,5- та же история, т.е. старший байт хоть и я и заполняю каким нибудь значением, но он не работает. Первый счётчик (3-4-5-) отвечает за длину первой части семпла, который читает семпл от самого начала, и до начала второго счётчика, а второй счётчик уже читает эту область семпла по кругу (LOOP регион), (я сейчас как раз работаю над этим описанием)
    т.е. если убрать это ограничение, расширится длинна семпла, даже таблицы конвертировать не придётся т.к. два этих старших байта всегда в табличках равны нулю :).

    0- 1-2-    3- 4-5-    6- 7-8-   9-a-b-   c-d- e-f-
    00 2DF7    00 292A    00 1A7C   2C6D72   8000 0022  ; Acoustic Grand Piano 1
    
    15627:	movzx	ecx,[eax+06h]
      	movzx	edx,[eax+07h]
      	shl	ecx,08h
      	add	ecx,edx
      	movzx	edx,[eax+08h]
      	shl	ecx,08h
      	add	ecx,edx
      	mov	edx,[esp+04h]
      	mov	[edx+000001D4h],ecx
    ...
    1566D:	movzx	ecx,[eax+03h]
      	movzx	esi,[eax+04h]
      	movzx	eax,[eax+05h]
      	shl	ecx,08h
      	add	ecx,esi
      	mov	esi,[esp+0Ch]
      	shl	ecx,08h
      	add	ecx,eax
    
  19. VEG Автор записи

    Wlad, судя по коду, считываются действительно тройки байт и преобразуются в int32. Записываются в какие-то внутренние структуры синтезатора. Причин, почему старший байт не учитывается, не вижу. А если в старший байт поставить единичку (минимальное осмысленное значение) — оно даже в таком смысле не учтётся? Возможно, там первый байт используется, просто ограничение что-то типа 0x01FFFF, например.

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

  20. Wlad

    Спасибо большое VEG, будет время ещё покапаюсь, да, этот байт даже с единичкой не учитывается :(.

    1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.   K.   L. M.    N.        O.P.R. 
    3C706603335F5F7F0000017F105E4040FFFF51   0FCF 00 0C84  1215C0    800006   ;Surdo
    

    Это конфиг одного семпла барабана, он равен всегда 30 байт, и все конфиги в табличке идут последовательно друг за другом без пробелов (нулей), находится эта табличка в секции № 5 (от нуля), у меня в проекте она называется как 05 Drums Samples.
    Чтобы определить где находится семпл на примере родного банка 22050 8-бит dsxgwave.tbl, вот что нужно сделать :
    Значение под заголвком N. это указатель на семпл (обычно он указывает куда нибудь на середину нужного семпла), т.е. это адрес который является истинным 1215C0h, далее определяем начало семпла, берём указатель N. и отнимаем от него значение под заголовком K. (0FCFh) , и получаем адрес начала семпла 1205F1h (1215C0h - 0FCFh = 1205F1h) , далее определяем конец семпла, берём указатель N. и теперь прибавляем к нему M. и получаем конец семпла 122244h (1215C0h + 0C84h = 122244h). (он же LOOP регион от указателя)

    Vl Tone      Strt    Loop Pointr
    01 3C00 00   0000 00 052B 0809F5   8000 00FF     ; Синусоида
    

    Это конфиг одного семпла инструмента, он равен ровно 10 байт, здесь также все конфиги в табличке идут последовательно друг за другом без пробелов (нулей), находится эта табличка в секции № 16 (самая последняя), у меня в проекте она называется как 16 Wave Structure.
    Здесь всё тоже самое, указатель это значение под заголовком Pointr, что бы получить начало семпла нужно от Pointr (0809F5h) отнять значение Strt (0000), так же и конец семпла, к Pointr прибавить Loop (052Bh) и получаем конец семпла.

    VEG, если есть какие то вопросы, отвечу сразу и на любой, я сегодня столько написал в блокноте (кстати исправил баг, за что вам спасибо за ссылку), для того что бы ответить сразу на всё, и в итоге только запутался, поэтому всё остальное напишу позже. Банки я перерыл абсолютно все, нет там таких мест где я бы не побывал, поэтому отвечу на любой вопрос, а также могу выдернуть с них абсолютно любую деталь если вдруг вам понадобится, и если я могу чем то вам помочь, я к вашим услугам. Единственное что я не совсем понял, вам расшифровку всех байт в конфигах описать ,или только те которые касаются семплов ?

    Забыл написать, что в режиме чтения синтезатором семпла по два байта, высчитывается семпл немного по другому, т.е. Pointr остаётся также истинным адресом, а значения Strt и Loop (и для барабанов K. и M.) нужно вначале умножить их на два, а после отнимать от Pointr, и прибавлять к Pointr.

  21. VEG Автор записи

    Спасибо за инфу. Этой информации хватит чтобы начать работу. Но описания остальных байтов тоже не помешает добавить, чтобы я смог адекватно их вывести для удобного редактирования в FASM-файле. И ещё я помню вы писали, что какие-то другие таблицы ссылаются на эти таблицы с описанием семплов — это тоже можете описать. Возможно, я смогу сделать и так, чтобы эти адреса тоже автоматически подставлялись, а вы могли вставлять новые записи в таблицы с конфигами семплов. Например, по коду я заметил, что, судя по всему, в 15-й таблице таблица двухбайтовых смещений в 16-й таблице. Но в чём смысл этого? :)

    Вообще жалко что тут начальный адрес указывает не на начало семпла, а на его середину. Придётся думать в каком виде лучше снаружи хранить семпл. Возможно, каждый семпл стоит разбивать на 2 куска: часть до loop и собственно сам loop. Вы говорили что в WAV-файле каким-то образом может быть сохранена информация о loop. Где можно прочитать спецификации по этой части, как оно хранится в WAV-файле, и какой софт умеет эту инфу в него писать? Рассмотрю возможность парсить WAV-файл напрямую макросами, возможно не слишком сложно будет. Оно то точно можно так сделать (особенно если в WAV-файле есть вся нужная инфа, включая смещение откуда начинается зацикленный звук), чтобы напрямую из WAV-файлов читало, даже конвертацию из signed в unsigned для 16 бит можно сделать. Но это несколько нетривиальный макрос будет, то есть может оказаться всё же сильно проще подсовывать по 2 кусочка каждого семпла раздельно, ну и автоматом я сейчас в таком случае все семплы разобью в такой же вид с двумя файлами на семпл.

  22. Wlad

    Доброй ночи вам VEG.
    Да табличка 15 Wave Number, собирает несколько конфигов в категорию, из которых состоит целый инструмент и эта категория имеет номер, я завтра всё опишу, т.к. денёк у меня сегодня очень тяжёлый был, у меня плохо уже голова соображает, я как раз это с 15 Wave Number и планировал описать завтра.
    Также я кажется знаю как маленькому Wav файлу прикрутить метаданные которые описывают регионы семплов, согласно табличкам, к тому же эти метаданные являются стандартом для всех Wav файлов, которые открываются редактором, и кстати Wavosaur их распознает, у автора программы Power ymf, при распаковки банка программой, эти метаданные генерировались согласно табличкам (добавлялись в конец файла), и в редакторе было видно, где и какие регионы находятся, завтра всё обязательно сделаю.

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

     SUB_L1001A6E0:
      		mov	eax,[ecx+24h]
      		mov	edx,[eax+48h]
      		mov	[ecx+68h],edx
      		mov	edx,[eax+04h]
    1A6ECh:	and	edx,0000FFFFh   <-Start region  заменить на and	edx,00FFFFFFh (В конфиге инструмента он помечен как : Strt)
      		mov	[ecx+6Ch],edx
      		mov	edx,[eax+50h]
    1A6F8h:	and	edx,0000FFFFh   <-Loop region заменить на AND EDX,00FFFFFF (А этот помечен как : Loop)
      		mov	[ecx+70h],edx
      		mov	edx,[eax+44h]
      		and	edx,0000003Fh
      		shl	edx,09h
      		mov	[ecx+74h],edx
    

    Если заблокированные байты задействовать, то расширятся значения Strt и Loop, т.е. перед ними заработают старшие байты, которые во всех табличках всегда равны нулю.
    Пример:

    Vl Tone      Strt    Loop   Pointr
    01 3C00     000000  00052B  0809F5   8000 00FF     ; Синусоида
    
  23. Wlad

    Доброго всем вечера.
    VEG, я разобрался с метаданными, которые находятся в Wav файле, и указывают на регионы. В этом архиве Meta data.zip находятся два Wav файла, один я сам создал, а другой взял из распакованного банка, который распаковал при помощи программы Power Ymf, скриншоты к файлам прилагаются. Что бы увидеть маркеры регионов, можно воспользоваться редактором Wavosaur. Значения в метаданных (в коде) читаются с конца в начало, а если их перевести в десятичное представление, то эти цифры совпадут с маркерами в редакторе, для этого нужно в редакторе шкалу отображение времени перевести в семплы (в Wavosaur щелкаем по шкале времени которая находится над окном семпла правой кнопкой мыши, и выбираем Sample).

    Теперь 16 Wave Structure
    Рассмотрим к примеру Дистошн гитару.

    ;Distorted Guitar
    Vl Tone      Strt    Loop Pointr   Bt-- ОтДо   Adr   №   Name
    01 3600 00   11EE 00 FF34 EC692A   0000 002E  ;1B60  4D  Distorted Guitar 1
    01 3B00 00   7007 00 DDCA EA89B6   0000 2F35  ;1B70   -  Distorted Guitar 2
    02 4100 00   3807 00 B6DE E83BE8   0000 363A  ;1B80   -  Distorted Guitar 3
    02 4700 00   24A4 00 D5FF E61FDa   0000 3B3F  ;1B90   -  Distorted Guitar 4
    00 4e00 00   5792 00 9126 E4B442   0000 4046  ;1BA0   -  Distorted Guitar 5
    00 5300 00   1EE7 00 85AB E2F99A   0000 474C  ;1BB0   -  Distorted Guitar 6
    00 5900 00   4469 00 17AB E28C72   0000 4D52  ;1BC0   -  Distorted Guitar 7
    00 4904 00   0A83 00 04FC EE7C9C   0000 5B5F  ;1BD0   -  Distorted Guitar 8
    00 4900 00   0000 00 0637 FF6568   0000 6065  ;1BE0   -  Distorted Guitar 9
    0A 53EB 00   0000 00 01B9 FF6176   0000 66FF  ;1BF0   -  Distorted Guitar 10
    

    Vl - Velocity семпла, 0-Максимум 7F-Минимум (используется в качестве регулятора громкости данного семпла)
    Tone - Истинная нота семпла, первое значение это ТОН, а второе Центы (полутон 0-FF)
    Strt, Loop,и Pointr, - это уже известно.
    Bt - Этот байт переключает разрядность (00h, или 80h.)
    -- - В коде ни где не используется (резерв)
    № - Это уникальный код сырого инструмента, который формируется из группы или одного семпла, от 00h-FFh, где 00h это начало а FFh это конец формирования инструмента, т.е. эти семплы раскладываются по регионам клавиатуры, от какой до какой клавиши воспроизводится конкретный семпл, это можно увидеть под заголовком - ОтДо, я так же привожу таблицу, в которой можно увидеть какое шеснадцатеричное значение, какой ноте соответствует синтезатору Yamaha.

    ----------------------------------------------------
    10-E1    20-G#2   30-C4    40-E5    50-G#6    60-C8
    11-F1    21-A2    31-Db4   41-F5    51-A6     61-Db8
    12-F#1   22-Bb2   32-D4    42-F#5   52-Bb6    62-D8
    13-G1    23-B2    33-Eb4   43-G5    53-B6     63-Eb8
    14-G#1   24-C3    34-E4    44-G#5   54-C7     64-E8
    15-A1    25-Db3   35-F4    45-A5    55-Db7    65-F8
    16-Bb1   26-D3    36-F#4   46-Bb5   56-D7     66-F#8
    17-B1    27-Eb3   37-G4    47-B5    57-Eb7    67-G8
    18-C2    28-E3    38-G#4   48-C6    58-E7     68-G#8
    19-Db2   29-F3    39-A4    49-Db6   59-F7     69-A8
    1A-D2    2A-F#3   3A-Bb4   4A-D6    5A-F#7    6A-Bb8
    1B-Eb2   2B-G3    3B-B4    4B-Eb6   5B-G7     6B-B8
    1C-E2    2C-G#3   3C-C5    4C-E6    5C-G#7    6C-C9
    1D-F2    2D-A3    3D-Db5   4D-F6    5D-A7     6D-Db9
    1E-F#2   2E-Bb3   3E-D5    4E-F#6   5E-Bb7    6E-D9
    1F-G2    2F-B3    3F-Eb5   4F-G6    5F-B7     6F-Eb9
    ----------------------------------------------------
    

    В самом первом конфиге ;1B60 4D Distorted Guitar 1, после точки с запятой находится истинный адрес данного конфига в секции tbl.
    Смыл таблички 15 Wave Number , это указатель адреса на категорию конфигов из которых состоит (сырой(без обработки)) инструмент из семплов,
    т.е. Дистошн гитара у нас равна коду 4Dh, значит в табличке 15 Wave Number по адресу 4Dh, будет указан адрес который указывает на категорию семплов Distorted Guitar. (я в табличке пометил адрес квадратными скобками) (в табличке в адресе вначале стоит младшее значение, а после старшее)

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

    Сам код потом используется при синтезе инструмента, в 13 Instrument XG и в 14 Instrument GS.

    ; 0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    --------------------------------------------------------------------------------+
    0000 1000 9004 A004 2009 3009 4009 5009 6009 7009 8009 9009 A009 B009 C009 D009 ; 0
    E009 F009 000A 100A 200A 300A 400A 500A 600A 700A 800A 900A A00A B00A C00A D00A ; 1
    E00A F00A 000B 100B 200B 300B 100C F00C D00D 600E A00E 000F 600F B00F 0010 3010 ; 2
    9010 2011 8011 2012 7012 F012 8013 D013 1014 5014 C014 1015 6015 A015 2016 4016 ; 3
    9016 B016 C016 0017 8017 C017 D017 2018 A018 4019 A019 301A B01A[601B]001C 401C ; 4
    801C B01C 301D B01D E01D 201E 901F D01F 1020 C020 7021 E021 3022 B022 1023 9023 ; 5
    0024 1024 4024 9024 D024 E024 F024 3025 4025 6025 9025 B025 E025 1026 3026 6026 ; 6
    9026 C026 A027 0028 8028 E028 4029 9029 C029 802A 502B 602B 102C 202C 302C 402C ; 7
    702C 802C 902C A02C B02C C02C D02C E02C F02C 002D 102D 202D 302D 402D 502D 602D ; 8
    702D 802D 902D B02D C02D D02D E02D F02D 002E 102E 202E 302E 402E 502E 602E 702E ; 9
    802E 902E A02E B02E C02E D02E E02E F02E 002F 102F 202F 302F 402F 0030 1030 2030 ; A
    3030 F030 C031 D031 8032 0033 1033 C033 6034 2035 3035 4035 5035 9035 C035 9036 ; B
    C036 D036 E036 F036 0037 1037 7037 8037 E037 4038 B038 1039 5039 A039 B039 003A ; C
    503A A03A 503B 003C A03C B03C 203D 903D F03D 003E 103E 603E 703E D03E 303F 803F ; D
    903F C03F F03F 5040 9040 0041 1041 5041 9041 A041 B041 C041 D041 3042 9043 A043 ; E
    B043 D043 1044 5044 8044 9044 A044                                              ; F
    ================================================================================+
    

    Хочу также сообщить интересную новость, VEG, вы были правы, в синтезаторе нет указания на частоту дискретизации, потому что синтезатор всегда работал в 44100 ! Просто Yamaha взяла банк 22050, и каждому конфигу семпла указала ноту на октаву выше, из за чего скорость чтения семпла стала в два раза медленней. Это можно увидеть на примере дистошн гитары как и любого другого семпла : 01 [36]00 00 11EE 00 FF34 EC692A 0000 00[2E], что мы видим, что семплу указывается нота выше, это 36-F#4, а регион воспроизведения от 00-2E (С0-Bb3), я по началу не понял, думал что у Yamahи это так надо, но всё же пробовал поставить нормальную ноту, и при этом скорость семпла возрастала, но я сразу не догадался, пока вы не сказали что в синте нет указания на ч.д., и тут мея осенило. Теперь синт читает семплы 44100 16-бит, я попробовал в ручную конвертировать пару инструментов, и всё работает отлично !

    VEG, всё таки конвертер очень нужен, из одного формата таблиц в другой, руками это нереально долго, напишите пожалуйста хотя бы пример для конвертирования одной таблицы, а для другой, исходя из вашего примера я сам справлюсь, если это не сложно то можно на Fasm как сборщик табличек. По сути я уже многое выяснил, и нашёл, а вот проверить пока не могу т.к. следующий мой шаг, это конвертация таблиц, поэтому стою пока на месте, надеюсь что вы поможете, я был бы вам за это очень благодарен, а если по каким то причинам не захотите помочь, то сразу скажите, я что бы не терять время начну в ручную всё высчитывать. Сейчас по сути нужен готовый и рабочий образец, для теста и эксперимента.
    В этих примерах я показал формат старых таблиц, и новых.

    Drums                                -C    *2     <-*2     *2
    3C706603335F5F7F0000017F105E4040FFFF 51   0FCF 00 0C84    242B80   000006 ;old
    3C706603335F5F7F0000017F105E4040FFFF 51   0FCF    0C84  00242B80   000006 ;new config
    в табличке 05 Drums Samples, под заголовком -C (адр 12h), нужно отнять у всех конфигов 0Ch, что бы снизить ноту на октаву, 0FCF нужно умножить на два, LOOP регион сместить на один байт вперёд и также умножить на два, а следующее значение обнулить, т.к. это теперь старшее значение указателя, и сам указатель также нужно умножить на два.
    
    С инструментами почти тоже самое, только здесь код разрядности (80h), я сдвинул на один байт, т.к. следующий байт ни где не используется, указатель на семплы также сдвинул на один байт, что бы получить старшее значение.
    Instrument    *2         *2        *2
    Vl Tone      Strt        Loop     Pointr   Рз
    00 2DF7     00292A      001A7C   2C6D72    80 00 0022  ;old
    00 2DF7     00292A      001A7C   002C6D72  80    0022  ;new config
    

    Если интересно, вот сам модифик движка : https://yadi.sk/d/XQVid9zI3GyrsP

    Таблица расшифровки кодов конфига барабана.

    1.2.3.4.5.6.7.8.9.A.B.C.D.E.F.G.H.I.J.   K.   L. M.    N.        O.P.R.
    3C706603335F5F7F0000017F105E4040FFFF51   0FCF 00 0C84  242B80    000006   ;  Surdo mute
    

    1. - ??? по умолчанию 3Ch, используется от 20h по 4Ch, Не было замечено ни какого изменения в звуке.
    2. - Pitch (Fine) по умолчанию 40H, и это 00H (тонкая подстройка полутоном)
    3. - Volume 64h=100, 7Fh=127 max,и по умолчанию
    4. - Alternate group, барабаны которые перекрывают друг-друга, Hi-hat open, pedal,closed = 1 (категория), Surdo open-close другая категория = 3
    5. - Pan (40h = середина) если 00 то включается рандомность панорамы
    6. - Reverb регулируется от 00 до FF
    7. - Хорус регулируется от 00 до FF
    8. - Variation (Всегда 7Fh)
    9. - Key assign: Single-Multi Всегда =00 (Single)
    A. - Note off (00 - при отпускании клавиши звук продолжается, а 01 - останавливается)
    B. - Note on (Всегда и везде единица) если 00, то эта нота отключается
    C. - Cuttof filter
    D. - Resonator
    E. - Attack time (7F - нет среза, а 00 - максимальный срез)
    F. - Decay Врема звучания середины 00 - максимальная длина звучания, 7F - минимальная
    G. - Release time 00 - максимальная длина звучания, 7F - минимальная
    H. - пока меняется на 00h, в паре связан с Sf FFh=выкл (возможно это старшее значение Sf)
    I. - Заена на другой звук (sfx) от 00h до 56h, FFh=выкл ,соответствует таблице 07
    J. - Истинная нота семпла
    K. - Размер Start региона семпла
    L. - Резерв
    M. - Размер Loop региона семпла
    N. - Поинтер указывающий на семпл
    O. - 80h = 8-бит, 00h = 16-бит.
    P. - ????? Предпологаю, свазано с R. в GS числа рокеруются с R. Также замечено что число относится скорее к неким категориям
    R. - Pitch (Coarse) По умолчанию = FCh
    VEG, если что то не понятно, или есть какие то вопросы, я всегда на них отвечу.

  24. Wlad

    Доброго дня VEG.
    VEG, я создал картинку, которая показывает как работают функция : E. - Attack time, F. - Decay, и G. - Release time, https://yadi.sk/i/2sjmZwsN3GzaKq
    можете как нибудь в виде ссылки на неё, туда прикрутить, а этот комментарий удалить, и в F. - Decay Врема, исправить опечатку.
    А также : H. - пока меняется на 00h, в паре связан с Sf FFh=выкл (возможно это старшее значение Sf), на H. - Всегда 00h, включается в паре с I. FFh=выкл (возможно это старшее значение I.)

  25. VEG Автор записи

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

  26. Wlad

    Всем доброго времени суток.
    VEG, огромнейшее вам спасибо, за то что откликнулись, и согласились помочь в этом не лёгком, но очень полезном деле, а также за очень полезные подсказки, и верные замечания.
    Недавно вспомнил, что у меня есть программа-эмулятор старого компьютера Вектор-06ц, к счастью я ещё не совсем забыл язык Ассемблера процессора К580ВМ80 из за того что он довольно прост, и когда то вместо начального загрузчика у этого компа я прошивал в ПЗУ монитор отладчик, и эта прошивка чудом у меня сохранилась, благо таблички оказались не большого размера, и мне всё же удалось конвертировать эти две таблички в нём.
    VEG, это я должен у вас просить прощение за те неудобства, которые доставил вам своей просьбой, простите за это. Т.к. таблички удалось конвертировать и работать уже можно, прога не горит, как появится у вас свободное время и настроение на неё, тогда допишите, но узнать о том что эта прога всё же выйдет в свет, это просто радует на все 5+, спасибо ещё раз вам огромное !

    Хотелось бы также проинформировать всех о том, что движок успешно модифицирован !, ниже привожу его новые возможности :
    Читает семплы 44100 16-бит (Signed)
    Банк может быть размером до 1.5гб !
    Длинна волны одного семпла 16мб+16мб (Start регион + Loop регион)

    Теперь на этот движок есть возможность перенести любой засемплированый инструмент, например Ketron SD, из KONTAKT, также из VSampler, SF2, DLS, в общем практически всё из любого семплера.
    Старый синтезатор Ymf-724 я решил всё же оставить (в виде семплов и таблиц как дополнение к новому), он будет включатся Sysexом. Мне также удалось выдернуть из памяти расшифрованный банк Edirol VSC Vsti v1.6 (88pro) при помощи OlyDbg вместе с таблицами, теперь появилась возможность перенести настоящий GS, на Yamahу. Также мне удалось расшифровать банк синтезатора XG2006Le, с этим оказалось правда не так просто как с VSC, он ещё был и в памяти зашифрован XOR кодом 5Ah, благо в Win HEX можно это легко исправить.
    Банк Edirol VSC Vsti v1.6 : VSC.bin - полностью банк с табличками и семплами в cборке, а VSC.Wav - просто семплы, они 22050 8-бит
    Банк Yamaha XG2006Le - Имеет формат 22050 16-бит

    Есть у меня также ко всем такой вопрос, может кто нибудь сталкивался с таким : https://yadi.sk/i/SmZ8OlJl3HBtao
    В общем клавиатура у YAMAHи может делится на несколько частей, как видно на картинке от точке к точке, и в виде огибающей (Envelope) плавно регулировать громкость, т.е. регулирует таким образом громкость самих клавиш, и эта громкость плавно переходит от одной точке к другой, и эта функция используется при синтезе любого инструмента в YAMAHе, кто нибудь видел подобное ? ,или может знает как это называется ?
    Ещё это может работать так, если на ноту C0 указать громкость Vol=127, а C10 Vol=0, то громкость инструмента на клавиатуре будет плавно понижаться от C0 до С10, как на этой картинке : https://yadi.sk/i/wAs0lhwu3HDF3K

    Также хочу выложить образец проекта синтезатора, в котором семплы конвертированы в 44100-16бит, и добавлено несколько новых инструментов.
    Finger bass, а также к нему относятся инструменты:
    00-(33)=Electric Bass finger
    18-(33)=Finger dark
    27-(33)=Flange Bass
    40-(33)=Bass & Distorted E.Gtr
    41-(25)=SteelGtr with BodySound
    43-(33)=Finger Slap Bass
    45-(33)=Finger Bass 2
    65-(33)=Modulated Bass
    96-(35)=Synth Fretless
    Так же импортировал новый Acoustic Grand Piano, который состоит из 39 семплов, к нему относятся также инструменты:
    Bright Acoustic Piano
    Grand piano KSP
    Bright piano KSP
    Mellow grand piano
    Piano Strings
    Dream

  27. Wlad

    Всем привет !
    Выкладываю обновление проекта. Заменил на более качественный 53-Voice Oohs, он состоит из 19-ти качественных семплов, также к нему относятся следующие инструменты :
    (85)=Lead 6 Voice
    (91)=Pad 4 Choir
    16-(52)=Choir Aahs 2
    40-(54)=Synth Voice 2
    41-(54)=Choral
    64-(91)=CC Pad
    68-(101)=To Heaven
    sfx(msb64)-(54)=Ghost

  28. Wlad

    Доброго всем дня.
    Прошу меня простить за битую ссылку от 2017/04/21 в 16:19 в образец проекта синтезатора, в следующем комментарии в обновление проекта, тот же самый синтезатор 44100 16-бит, только заменён ещё один инструмент, к сожалению из за замены файла на яндекс диске, ссылка меняется.

  29. YAMAHA User

    Имеются ошибки в Loop-ах некоторых инстурментов. На мой возгляд лучше всего взвучит вот эта версия : https://yadi.sk/d/SEYy9oCW3GYf3t?force_show=1 , однако в ней есть небольшие недочёты. В Loop регионах... можете послушать , если есть желание.
    https://yadi.sk/d/TgcGPlUi3HG3GT , обратите внимание что не кооректно работают луп регионы в самом начале.
    То что оно Roland , не обращайте внимание , просто переведите ямаху в GS и послушайте.
    Вот пример ошибок : https://yadi.sk/d/PW5Fb2O93HG4Xt