Просмотр полной версии : GeneralSound и сэмплы
Пытаюсь разобраться с GS.
Есть вопрос по сэмплам.
Допустим есть такой сэмпл: 76395
В GS грузится, тут с этим нет проблем. Вопрос в том какую ноту устанавливать при проигрывании. Спецификацию на чанки смотрел. Но либо я дурак, либо не вижу там ноты на которой его надо проигрывать.
Более/менее приличный звук выходит при установке ноты 71.
P.S. И еще вопрос. Реально ли совместить выполнение пользовательского кода в GS и проигрывание сэмплов?
Допустим есть такой сэмпл:
В аттаче iff-файл, у них нужно отрезать заголовок, насколько помню. Текст из описания GS:
наиболее распространенные на 32-x разрядных компах виды сэмплов - это файлы с расширением .IFF, .SMP, .SND, .WAV и др. Два последних файла - это голые оцифровки с микрофона или CD, а два первых - сэмплы, состоящие из двух частей: заголовка и блока данных (сам звук). GS-у нужен только блок данных, а заголовок надо обрезать. В файле .IFF заголовок занимает первые 104 байта, в других сэмплах заголовок может иметь другую длину и данные. Рекомендую брать файлы только с расширением .IFF, (т.е. самый что ни на есть обычный сэмпл от MOD-ов) из заголовка которого можно вытащить некоторые характеристики сэмпла:
Смещение от начала сэмпла:
+22,+23 - старт loop'а в сэмпле (здесь и далее сначала идет старший байт, затем - младший)
+26,+27 - длина loop'а
+102,+103 - длина самого сэмпла без заголовка
чтобы сэмпл формата .IFF можно было использовать в "GS", надо провести три следующие операции:
1) Отрезать заголовок: первые 104 байта.
"GS"у он не нужен, и "GS" воспримет его как часть сэмпла, что скажется на самом звуке.
2) В оставшемся сэмпле прибавить к каждому байту число 128 - это необходимо для смены знака.
3) Записать модифицированный сэмпл на диск - он готов к дальнейшему использованию.
Насчёт высоты нот сэмпла:
В GS грузится, тут с этим нет проблем. Вопрос в том какую ноту устанавливать при проигрывании.
Да, помню, тоже думал, как заставить GS играть сэмпл на той же ноте, что и wav на РС. В итоге сохранял wav как моно 8 бит с частотой дискретизации 8 КГц (именно для эффектов, а не музыки, этого за глаза), а GS ставил ноту ДО третьей октавы, но могу ошибаться, дело было ооочень давно.
Реально ли совместить выполнение пользовательского кода в GS и проигрывание сэмплов?
В теории - да, если писать свою процедуру вывода звука, висящую целиком на прерываниях, чтобы основной код мог работать параллельно. Вмонтированный плеер, как понимаю, по прерываниям лишь берет данные из буфера, который ему готовится основным кодом. Поэтому чем больше жрут прерывания, тем меньше остаётся на основную задачу, что и так понятно, но 37 КГц это не 50 Гц =) Там нужно очень постараться.
Если же нужен только код, без проигрывания эффектов, прерывания логично вообще запрещать, дабы не тратить процессорное время.
у них нужно отрезать заголовок
заголовок отрезал
а GS ставил ноту ДО третьей октавы
т.е. по нумерации GS 0..35 ?
В теории - да
да я и сам понимаю, что 320 тактов на прерывание маловато будет, но может у кого есть практика.
т.е. по нумерации GS 0..35 ?
Не совсем... там мудреная нумерация нот, вернее, есть ограничение на нижние октавы. Цитируя руководство:
#40 Set FX Sample Playing Note
Установка ноты по умолчанию для текущего эффекта.
SD Note [0..95]
SC #40
WC
Note=
0 C-0
1 C#0
12 C-1
24 C-2
36 C-3 (C-1 в Амиге)
48 C-4 (C-2 в Амиге)
60 C-5 (C-3 в Амиге)
72 C-6
84 C-7
В данной версии Sound Generators Wave 2, 3 могут воспроизвести октавы 3, 4 и 5,
поэтому допустимым значением параметра Note является диапазон от 36 до 71.
Соответственно, нота До третьей октавы это 36. Вроде ее и задавал, но много лет прошло, точно не скажу.
Пока что с железным GS ковыряться нет возможности, а в эмуляторе что-либо кодить это не мое =) Не перевариваю PC-клаву совершенно.
а GS ставил ноту ДО третьей октавы
сорри. воспринял ДО как предлог :)
С нотами разобрался, спасибо.
А как лучше определять наличие/отсутствие GS?
как лучше определять наличие/отсутствие GS?
Наиболее правильным считается (ну, когда-то считался) посыл команды сброса с последующим ожиданием в порту данных числа страниц памяти.
Т.е. давалась команда полного сброса #F4, выжидалось время и читалось значение из порта #B3, там должно было быть или 3 (112К) или 14 (512К).
Однако время шло, были выпущены модели с увеличенным объемом памяти (2МБ и больше), и данный тест не сработает.
Более верным решением считаю определение через команды работы с внутренними портами либо памятью: засылаем внутрь GS байт данных и потом читаем его обратно.
Проделав энное число раз этот процесс и получая одинаковые байты, можно утверждать, что GS присутствует.
Разумеется, сперва тоже стоит выполнить сброс, можно и неполный (#F3), что быстрее, ибо мало ли чем GS был занят в момент начала теста.
Команды работы с внутренними портами и памятью лежат в диапазоне #10-#1D, думаю, больше подойдет пара команд #16-#17 либо #1C-#1D.
Ну, и самое главное: в пассивном состоянии из порта статуса (#BB) должны читаться нулевыми биты 0 и 7, т.е. число 126 (#7E).
Если из них читается всякая фигня, либо они всегда равны 1 (после сброса), то GS с большой долей вероятности не установлен, а читаем мы шину.
Evgeny Muchkin
11.11.2021, 21:56
А как лучше определять наличие/отсутствие GS?
- сброс #F3
- ждем немного
- командой #10 пишем во внутренний порт #03 GS значение, например #AA
- читаем #B3
- сравниваем с #AA, не равно - нет GS
- командой #10 пишем во внутренний порт #03 GS значение, например #55
- читаем #B3
- сравниваем с #55, не равно - нет GS.
- GS есть
При подаче команд вместо ожиданий сбросов Command bit и Data bit делать небольшие задержки, разумеется.
вместо ожиданий сбросов Command bit и Data bit делать небольшие задержки, разумеется.
Примерно то же и писал, просто если готовность ГС проверяется из битов регистра статуса - стоит предусмотреть "аварийное" завершение долгого цикла ожидания. Мало ли, ГС завис (особенно закачанная программа юзера) или его вообще нет. Это разумно делать на всём протяжении работы с ним, иначе повиснет уже основной комп.
- командой #10 пишем во внутренний порт #03 GS значение, например #AA
- читаем #B3
- сравниваем с #AA, не равно - нет GS
- командой #10 пишем во внутренний порт #03 GS значение, например #55
- читаем #B3
- сравниваем с #55, не равно - нет GS.
Я так понимаю в режиме эмуляции GSType=BASS данная конструкция не сработает?
Evgeny Muchkin
16.11.2021, 00:55
LW, верно.
Басс это не эмуляция. Это хрень какая-то, которая только пару наиболее употребляемых команд понимает.
Не стОит на этот басс ориентироваться.
Может ли GS сам зацикливать сэмпл, если при загрузке не устанавливались метки начала и конца цикла?
Если сформулировать по другому, могут ли быть прописаны в сэмпле начало и конец цикла? Заголовок сэмпла отрезан.
Насколько помню - нет. GS жует набор данных (сэмпл), сам делает для него заголовок, а по дефолту проигрывает целиком один раз.
Все изменения (зацикливание, его смещение и пр.) вносятся командами работы с уже загруженным сэмплом вручную.
Разумеется, это не касается сэмплов внутри MOD-файлов, там заголовки свои.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot