PDA

Просмотр полной версии : Программирование AY - вопрос по огибающей



TmK
15.11.2010, 12:46
Период огибающая задается регистрами R11,12
Форма огибающей регистром R13

допустим мы задали R11=X, R12=Y, R13=Z,
задали тон канала А, включили тон и огибающую для канала А,
воспроизводится звук...

Что будет если (изменится ли звук и как):

1) Повторить запись R11=X, R12=Y
Ответ: ничего не произойдет, звук не измениться, никаких щелчков или шумов не поризойдет

2) Повторить запись R13=Z
Ответ: сбросится счетчик огибающей, генерация огибающей начнется сначала.

3) Сделать запись R13=N
Ответ: сбросится счетчик огибающей, генерация огибающей начнется сначала.

4) Записать последовательно R11=a, R12=b, R13=c
Ответ: сбросится счетчик огибающей, генерация огибающей начнется сначала с установленными значениями R11,R12

5) Записать последовательно R13=c, R11=a, R12=b
Ответ: сбросится счетчик огибающей, генерация огибающей начнется сначала с предыдущими значениями R11,R12. Новые значения задействуются когда счетчик огибающей обнулится

Вопрос: правильно ли все я понимаю?
(Если кто знает, подскажите, пишу плэйер, нехватает знаний по AY)

psb
15.11.2010, 15:08
вроде как все правильно.
только нужно взять на заметку, что если вот в 4) или 5) после записи R11 произойдет сброс счетчика огибающей (до записи в R12), то один период ее будет не верный. но с этим ниче не поделать, вроде бы...

TmK
15.11.2010, 20:56
Т.е. получается что счетчик огибающей должен сбрасываться в двух случаях:
1) Запись в регистры периода значения отличного от предыдущего
2) Запись любого значения в регистр формы огибающей
Так?

Sinus
15.11.2010, 23:44
1) Запись в регистры периода значения отличного от предыдущего
в этом случае не сбрасывается.

---------- Post added at 22:44 ---------- Previous post was at 22:38 ----------


Ответ: сбросится счетчик огибающей, генерация огибающей начнется сначала с предыдущими значениями R11,R12. Новые значения задействуются когда счетчик огибающей обнулится
чо то я не очень понял про что тут (выделил жирным).

огибалка всегда использует текущие значения R11 и R12, нет никаких предыдущих.
внутренний счётчик идёт с нуля и до значений R11/R12, типа:



internalEnvelopeCounter++;

if (internalEnvelopeCounter >= MakeWord(R11, R12)) {
internalEnvelopeCounter = 0;
DoSomeCoolEnvelopeThing();
}

---------- Post added at 22:44 ---------- Previous post was at 22:44 ----------

при записи в R13 -> internalEnvelopeCounter = 0

psb
16.11.2010, 10:53
Sinus, другими словами, ты хочешь сказать, что там нет промежуточного буфера? а это на реальном чипе подтверждено (что смена регистра МГНОВЕННО влияет на результат)?

Sinus
16.11.2010, 14:24
да, инфа верняк (кстати, это же относится и к счётчикам каналов A, B и C).
ребята из mame проводили исследования:



Careful studies of the chip output prove that the chip counts up from 0
until the counter becomes greater or equal to the period. This is an
important difference when the program is rapidly changing the period to
modulate the sound. This is worthwhile noting, since the datasheets
say, that the chip counts down.
Also, note that period = 0 is the same as period = 1. This is mentioned
in the YM2203 data sheets. However, this does NOT apply to the Envelope
period. In that case, period = 0 is half as period = 1.


(вообще жутко всё серьёзно у них там в mame, аж завидно немного :) )

BYTEMAN
19.05.2011, 16:29
Подскажите, а как сбросить счётчик огибающей в Vortex'е? А то получается что один и тот же паттерн звучит по-разному :(