Из газеты Born Dead #09, Самара, 32.05.1999 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +++|++|XXXXXXXXXXXXX|++|+++ CODING +++|++|XXXXXXXXXXXXX|++|+++ |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| (c) UnBEL!EVER^Speed co.^XTM Сегодня, продолжая массированную пропаганду MCC метода, мы публикуем новый вариант проигрывателя цифровых самплов, более простой для понимания и удобный в работе. Дело в том, что в погоне за минимизацией числа тактов на байт MONSTER использовал несколько нестандартный прием контроля окончания проигрывания звука. Предварительно нужно было преобразовать сампл с помощью специальной процедурки. Однако, это давало ощутимую прибавку во времени - исходник, опубликованный в приложении к BORN DEAD'у #5 мог легко воспроизводить звук с частотой вплоть до 26KHz. Однако, как показала практика, такая высокая частота воспроизведения практически никогда не нужна, а хитрый способ контроля конца сампла лишает проигрыватель определенной гибкости. Вот поэтому и был сделан другой player, более медленный (верхний предел всего 24KHz), но удобный в использовании. Теперь, как обычно, перед входом в проигрыватель задается длина и стартовый адрес сампла. Но не только player подвергся изменениям! Благодаря новым данным, полученным о музыкальном процессоре из литературы, удалось рассчитать действительно идеальную MCC таблицу, которая теперь имеет 108 уровней громокости. Да и общая громкость воспроизведения звука по сравнению со старой таблицей увеличилась. В этом исходнике таблица оформлена как текст ассемблера (DEFB), что несколько упрощает жизнь - не надо делать incbin'ов! Хотя, кому как нравится.... Для облегчения конечного использования проигрывателя были рассчитаны задержки, которые необходимо вставить в основной цикл для точного воспроизведения оцифровок на стандартных частотах 8,11,16KHz. Задержки были рассчитаны ALK'ом на PENTAGON'е по достаточно интересному принципу: частота воспроизведения звука кратна строчной развертке монитора. Возможно, эти задержки не идеальны и опытный математик сможет рассчитать что-то поточнее, но по крайней мере эти цифры больше соответствуют правде, чем подбор скорости воспроизведения "на слух". И еще, на некоторых совершенно глючных паталогах не срабатывает обращение к портам сопроцессора по схеме OUT (253),A. В таких тяжелых случаях (когда стандартный player молчит) рекомендуется использовать полную адресацию портов сопроцессора, _НО_ увлекаться этим (использовать по умолчанию в любых случаях) ни в коем случае нельзя. При использовании полной адресации увеличивается время между выдачей основного и корректирующего сигнала, а следовательно, ставится под сомнение сама концепция MCC метода. Ну и конечно, при использовании метода в конечном продукте нужно обязательно дать возможность пользователю выбрать центральный канал сопроцессора (тот, куда будет выдаваться корректирующий сигнал), то есть раскладку стерео на данной машине: ABC, ACB или BAC (и такое встречается)! Иначе, при неверном указании централього канала MCC метод просто теряет смысл, а звук получится совершенно ужасным :( ;Samples Player with MCC_metod (C)Monster/Sage Group ;24305.556 Hz Discretisation Frequency ;Freeware MCC_TBL EQU #6200 ;#200 SAMPLE EQU #8000 ;Sample Adress SIZE EQU #4000 ;Sample Size ORG #6400 DI LD BC,#FFFD ;Init AY LD A,#07 OUT (C),A LD A,B LD B,#BF OUT (C),A LD HL,SAMPLE ;Set Sample Adress LD BC,SIZE ;Set Size Sample LD D,'MCC_TBL+1 EXX LD BC,#FFFD LD DE,#080A ;Set Right_Left AY channel LD H,#09 ;Set Center AY cnannel EXX CALL MCC_PLY EI RET MCC_PLY LD E,(HL) ;E =8bit Sample Data LD A,(DE) ;A =Correction Data from table EX AF,AF' DEC D LD A,(DE) ;A'=Main Data INC D EXX OUT (C),D OUT (253),A ;Set Main Data in Right_Left OUT (C),E ;AY channels OUT (253),A EX AF,AF' OUT (C),H OUT (253),A ;Set Correction Data in Center EXX ;AY cannels INC HL ;next sample data DEC BC ;dec size sample ;-------------------------------------------------------------- ; LD A,4 ;80 tackts delay ;DELAY DEC A ;to use with 16khz samples ; JR NZ,DELAY ; OR 0 ; OR 0 ;-------------------------------------------------------------- ; LD A,11 ;182 tackts delay ;DELAY DEC A ;to use with 11KHz samples ; JR NZ,DELAY ; NOP ;-------------------------------------------------------------- ; LD A,18 ;304 tackts delay ;DELAY DEC A ;to use with 8KHz samples ; JR NZ,DELAY ; OR 0 ; OR 0 ;-------------------------------------------------------------- LD A,B ;All code takes OR C ; only JP NZ,MCC_PLY ;144 tackt per Sample Byte RET ORG MCC_TBL ;MCC Table with 108 syntesed levels for YM2149F ;and 52% mixed center channel DEFB #A0,#A1,#A1,#A2,#A3,#A3,#A4,#A4,#A4,#A5,#A5,#A5 DEFB #A6,#A6,#A6,#A6,#A6,#A7,#A7,#A7,#A7,#A7,#A7,#A7 DEFB #A8,#A8,#A8,#A8,#A8,#A8,#A8,#A8,#A9,#A9,#A9,#A9 DEFB #A9,#A9,#A9,#A9,#A9,#A9,#A9,#A9,#A9,#AA,#AA,#AA DEFB #AA,#AA,#AA,#AA,#AA,#AA,#AA,#AA,#AA,#AA,#AA,#AA DEFB #AB,#AB,#AB,#AB,#AB,#AB,#AB,#AB,#AB,#AB,#AB,#AB DEFB #AB,#AB,#AB,#AB,#AB,#AB,#AB,#AB,#AB,#AB,#AB,#AB DEFB #AB,#AB,#AC,#AC,#AC,#AC,#AC,#AC,#AC,#AC,#AC,#AC DEFB #AC,#AC,#AC,#AC,#AC,#AC,#AC,#AC,#AC,#AC,#AC,#AC DEFB #AC,#AC,#AC,#AC,#AC,#AC,#AC,#AC,#AD,#AD,#AD,#AD DEFB #AD,#AD,#AD,#AD,#AD,#AD,#AD,#AD,#AD,#AD,#AD,#AD DEFB #AD,#AD,#AD,#AD,#AD,#AD,#AD,#AD,#AD,#AD,#AD,#AD DEFB #AD,#AD,#AD,#AD,#AD,#AD,#AD,#AD,#AD,#AD,#AD,#AD DEFB #AD,#AD,#AD,#AD,#AD,#AD,#AD,#AD,#AD,#AE,#AE,#AE DEFB #AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE DEFB #AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE DEFB #AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE DEFB #AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE,#AE DEFB #AE,#AE,#AE,#AF,#AF,#AF,#AF,#AF,#AF,#AF,#AF,#AF DEFB #AF,#AF,#AF,#AF,#AF,#AF,#AF,#AF,#AF,#AF,#AF,#AF DEFB #AF,#AF,#AF,#AF,#AF,#AF,#AF,#AF,#AF,#AF,#AF,#AF DEFB #AF,#AF,#AF,#AF,#A0,#A0,#A1,#A1,#A0,#A1,#A0,#A1 DEFB #A3,#A1,#A2,#A3,#A0,#A1,#A2,#A3,#A4,#A0,#A1,#A3 DEFB #A4,#A5,#A5,#A6,#A0,#A1,#A2,#A3,#A4,#A5,#A6,#A6 DEFB #A0,#A1,#A2,#A3,#A4,#A5,#A6,#A6,#A6,#A7,#A7,#A7 DEFB #A8,#A0,#A0,#A1,#A2,#A3,#A4,#A5,#A6,#A6,#A6,#A7 DEFB #A7,#A7,#A8,#A8,#A0,#A0,#A1,#A2,#A3,#A4,#A5,#A5 DEFB #A6,#A6,#A7,#A7,#A7,#A8,#A8,#A8,#A8,#A9,#A9,#A9 DEFB #A9,#A9,#A9,#AA,#AA,#AA,#A0,#A0,#A0,#A1,#A2,#A3 DEFB #A4,#A5,#A6,#A6,#A6,#A7,#A7,#A7,#A8,#A8,#A8,#A8 DEFB #A9,#A9,#A9,#A9,#A9,#AA,#AA,#AA,#AA,#AA,#AA,#AA DEFB #A0,#A0,#A0,#A1,#A2,#A3,#A4,#A5,#A5,#A6,#A6,#A7 DEFB #A7,#A7,#A8,#A8,#A8,#A8,#A9,#A9,#A9,#A9,#A9,#A9 DEFB #AA,#AA,#AA,#AA,#AA,#AA,#AA,#AB,#AB,#AB,#AB,#AB DEFB #AB,#AB,#AB,#AB,#AB,#AB,#AC,#AC,#AC,#AC,#AC,#AC DEFB #AC,#A0,#A0,#A0,#A0,#A1,#A2,#A3,#A4,#A5,#A5,#A6 DEFB #A6,#A7,#A7,#A7,#A8,#A8,#A8,#A8,#A9,#A9,#A9,#A9 DEFB #A9,#A9,#AA,#AA,#AA,#AA,#AA,#AA,#AA,#AB,#AB,#AB DEFB #AB,#AB,#AB,#AB,#AB,#AB,#AB,#AB,#AC,#AC,#AC,#AC DEFB #AC,#AC,#AC,#AC,#AC,#AC,#AC,#A0,#A0,#A0,#A0,#A0 DEFB #A1,#A2,#A3,#A4,#A5,#A5,#A6,#A6,#A7,#A7,#A7,#A8 DEFB #A8,#A8,#A8,#A9,#A9,#A9,#A9,#A9,#A9,#AA,#AA,#AA DEFB #AA,#AA,#AA,#AA,#AA,#AB,#AB,#AB ORG #6400 Из газеты Born Dead #0G, Самара, 01.04.2000 ================================================================ фт+l|**|l+туфCODING СВОИМИ РУКАМИ-II фут+l|**|l+туф ================================================================ (c) MOn5+Er^Sa9e Супер-быстрый player with MCC Без вступлений и окончаний приведу самый распоследний вариант плейера для MCC метода! Теперь им можно воспроизводить ВСЕ - теорема Котельникова играет на нас! EI ;до запуска в порт AY n7 записать #FF! HALT LD SP,START-SAMPLE-ADRESS LD IX,LOOP LD DE,#08+256*('MCC_TBL+1) LD BC,#FFFD OUT (C),E ;вкл. 8 AY_порт (крайний канал) LOOP: POP HL LD E,L LD A,(DE) DEC D EX AF,AF' LD A,(DE) LD E,9 OUT (253),A EX AF,AF' OUT (C),E OUT (253),A LD E,H LD A,(DE) INC D EX AF,AF' LD A,(DE) LD E,8 OUT (253),A EX AF,AF' OUT (C),E OUT (253),A JP (IX) Обработчик INT'а: INT: POP IY ;взяли адр. возврата PUSH HL ;восстановили испорченный SAMPL LD HL,0 ADD HL,SP LD BC,END_SAMPLE_ADDRESS OR A SBC HL,BC JR NC,END_INT LD BC,#FFFD POP HL JP (IY) END_INT: выход из player'а 160 тактов на две выборки сэмпла. 80 тактов на выборку. Fдискрет.=3,5 МГц/80=43,75 кГц. Плеер использует только один крайний канал AY, можно и два для двойной громкости (на качество в принципе почти не влияет кол-во крайних каналов...) Единственный недостаток, можно слегка проскочить конец сэмпла, т.к. проверка раз в INT, но недостаток легко исправляется: в конце сэмпла (а он обязательно беззнаковый 0..#FF, а не -128 до +127) заполнен 896 байт "тишиной" - байтом #80 и всё. Почему 896 - т.к. в INT'е 71680 тактов (maximum на нетурбированной машине), а 71680/80=896!