Высота звука задаётся в виде значения, подаваемого на порт спикера 42H (на IBM PC-железе), перед запихиванием в порт умножаемого на 6. Точнее я вам не скажу.
Частоту я почти расколол, формула для первого звука, которая переводит частоту fr в значение HL для процедуры #3B5 выглядит очень просто: (fr+1)*35Код:void snd (unsigned fr, unsigned ln) {{ unsigned timing = get_timer (); long LN = ln; LN *= fr *= 6; // вот тут частота умножается на 6 // а длительность, заметьте, умножается на частоту, умноженную на 6 outportb (0x43, 0xB6); outportb (0x42, ((unsigned char *)&fr)[0]); outportb (0x42, ((unsigned char *)&fr)[1]);
С длительностью всё гораздо сложнее. Не пойму зачем Мутель варьирует длительность звука в зависимости от его частоты (умножает на fr*6). Впрочем, может так устроена генерация звука в БК-0010, с которого был перенесён болдердаш? Вот тут я уступлю своим принципам и сделаю на Спеке длительность звуков другую. Упрощу. Впрочем, на слух это не очень заметно, даже, я бы сказал, вообще незаметно.





Ответить с цитированием