DEMO.DESIGN
Frequently Asked Questions
 
оглавление | demo party в ex-СССР | infused bytes e-mag | новости от ib/news | другие проекты | письмо | win koi lat

следующий фpагмент (2)
- Various nice sources (2:5030/84) ----------------------------- NICE.SOURCES - Msg : 2040 of 2069 From : Serguei Shtyliov 2:5020/157.59 14 May 97 10:03:37 To : Yura Ilyaev 16 May 97 05:46:38 Subj : Sound Blaster ------------------------------------------------------------------------------- @GC: G!>CS d-(pu) s+:- a- C++$ UB P L+ E- W+ N++(*) o? K w+(---) O- M- V? @GC: PS- PE Y PGP- t 5+ X? R tv+ b+>++ DI? D--(+) G(-) e h-- !r y? Hail thou o Yura! Once upon a time thou didst write unto All: YI> У кого нибудь есть сыpец (желательно на Пасквиле) YI> об том как заставить сабж игpать оцифpовки паpаллельно событиям, YI> или хотя бы пpосто пpоигpывать? - - - - 8<- - - - - 8<- - - - - 8<- - - - - 8<- - - - - 8<- - - - - 8<- - - - - uses DOS,CRT; type WAVHeader = record Str1 : array[1..4] of char; { ='RIFF'} FLen : longint; { Длина файла от следующего поля} Str2 : array[1..8] of char; { ='WAVEfmt '} InfoLen : longint; { Обычно = 16} Tag : word; { 1- Linear PCM} ChanNum : word; { 1 - моно, 2 - стерео, 4 - квадро} SamFreq : longint; { Частота сэмплинга} BytePerSec : longint; { Байт в секунду} BlockSize : word; { Байт на полный сэмпл} BitPerSamp : word; { Разрядность оцифровки } Str3 : array[1..4] of char; { ='data'} DataLen : longint; end; {Фрагмент} TWaveItem = record Buffer : pointer; Length : word; end; {Массив для загрузки данных длиной более 64К} PWaveArray = ^TWaveArray; TWaveArray = array[1..255] of TWaveItem; const {Длина одного загружаемого фрагмента} PartLength = $FF00; {Коды устройств воспроизведения} dvCoVox = 0; dvSB = 1; dvPC = 2; { Таблица сэмплинга для PC Speaker} PCTable : array[byte] of byte = (1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2, 2,2,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4, 4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5, 5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,7, 7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8, 8,8,8,8,8,8,9,9,9,9,9,9,9,10,10,10,10, 11,11,12,12,13,14,14,15,16,17,17,18,19,20,21,22,23, 24,26,27,28,29,30,31,33,34,35,36,38,39,40,41,43,44, 45,46,48,49,50,51,52,53,54,55,57,58,58,59,60,61,62, 63,64,64,65,66,66,67,67,67,67,67,67,68,68,68,68,68, 68,68,68,68,68,68,68,68,69,69,69,69,69,69,69,69,69, 69,69,70,70,70,70,70,70,70,70,70,70,70,70,70,71,71, 71,71,71,71,71,71,71,71,71,72,72,72,72,72,72,72,72, 72,72,72,72,72,73,73,73,73,73,73,73,73,73,73,73,74, 74,74,74,74,74,74,74,74,74,74,74,74,75,75,75,75,75,75); {Константы, измняемые из командной строки} const BasePort : word = $378; {Порт данных LPT1} BlasterPort : word = $220; {Порт SB} QuietMode : boolean = false; {"Тихий" режим} PlayLoop : boolean = false; {Циклический режим} Device : byte = dvCoVox; {Устройство - SB,CoVox или Speaker} DumpOnly : boolean = false; {Информация из заголовка} LptN : word = 1; {Hомер LPT} {Внутренние переменные - внести в implementation} var WHeader : WAVHeader; CurrentPart : byte; NSample : word; IsPlaying : boolean; Data : PWaveArray; {Переменные для сохранения исходных установок системы} var OldInt08 : pointer; LastShape : word; {$F+} {Собственно процедура воспроизведения сэмпла} procedure Player; assembler; asm push ds push es push dx push bx push ax mov ax,SEG @Data mov ds,ax mov al,CurrentPart dec al mov ah,06h mul ah les bx,Data add bx,ax push bx push es les bx,es:[bx] mov ax,es mov dx,bx or ax,dx jz @TheEnd add bx,NSample mov al,byte ptr es:[bx] cmp Device,dvPC je @PCSpeaker cmp Device,dvSB je @Blaster mov dx,BasePort out dx,al (*add dx,2h {Вроде бы положено, но работает и так} mov al,0fdh out dx,al*) jmp @EndSample @PCSpeaker: mov bx,SEG @Data mov es,dx mov bx,offset PCTable xlat out 42h,al jmp @EndSample @Blaster: mov ah,al mov dx,BlasterPort add dx,0Ch @Wait1: in al,dx and al,80h jnz @Wait1 mov al,10h out dx,al @Wait2: in al,dx and al,80h jnz @Wait2 mov al,ah out dx,al @EndSample: pop es pop bx inc NSample mov ax,NSample cmp ax,word ptr es:[bx+4] jbe @EndInt @NextPart: mov ax,0 mov NSample,ax inc CurrentPart jmp @EndInt @TheEnd: pop es pop bx mov al,false mov IsPlaying,al @EndInt: mov al,20h out 20h,al pop ax pop bx pop dx pop es pop ds iret end; {$F-} {Установка системных параметров} procedure SetupPlayer; begin asm cli end; {Можно InLine, но так понятнее} GetIntVec($08,OldInt08); SetIntVec($08,Addr(Player)); asm mov al,36h out 43h,al mov cx,WHeader.SamFreq.word[0] mov ax,34DCh mov dx,0012h div cx {DX:AX = делитель частоты} out 40h,al xchg al,ah out 40h,al sti cmp Device,dvSB je @Blaster cmp Device,dvPC je @PCSpeaker jmp @Exit @Blaster: mov dx,BlasterPort add dx,0Ch @Wait: in al,dx and al,80h jnz @Wait mov al,0D1h {Инициализация SB} out dx,al jmp @Exit @PCSpeaker: {Выставление режима работы динамика} mov al,0B0h out 43h,al mov al,1 out 42h,al mov al,0 out 42h,al in al,61h or al,3 out 61h,al mov al,90h out 43h,al @Exit: end; end; {Восстановление предыдущих установок} procedure ResetPlayer; begin asm cli end; SetIntVec($08,OldInt08); asm mov al,36h out 43h,al xor al,al out 40h,al out 40h,al sti end; OldInt08:=nil; end; {Спрятать курсор - см. TechHelp} procedure HideCursor; assembler; asm mov ah,03h int 10h mov LastShape,cx mov ch,20h mov ah,01h int 10h end; {Восстановить курсор - см. там же} procedure ShowCursor; assembler; asm mov cx,LastShape mov ah,01h int 10h end; {Можно использовать KeyPressed из CRT, но придется читать значения клавиши} function GetKey:word; assembler; asm mov ah,01h int 16h mov ax,0 jz @Quit int 16h @Quit: end; {Простая и в то же время незаменимая процедура - см. HelpCompiler из TV} procedure FixName(var Name:PathStr;Ext:ExtStr;Change:boolean); var N : NameStr; D : DirStr; E : ExtStr; begin FSplit(Name,D,N,E); if Change or (E='') or (E='.') then E:=Ext; Name:=D+N+E; end; {Комментарии излишни...} procedure Error(What:string); begin if OldInt08<>nil then ResetPlayer; WriteLn(What); Halt(1); end; {Резервирование в памяти места для звуковых данных - возможно длиннее 64К} function NewArray(Len:longint):PWaveArray; var Arr : PWaveArray; N,I : byte; begin NewArray:=nil; N:=(Len div PartLength); GetMem(Arr,(N+2)*6); for I:=1 to N do begin if MemAvail<PartLength then Exit; GetMem(Arr^[I].Buffer,PartLength); Arr^[I].Length:=PartLength; end; if MemAvail<(Len mod PartLength) then Exit; GetMem(Arr^[N+1].Buffer,(Len mod PartLength)); Arr^[N+1].Length:=(Len mod PartLength); Arr^[N+2].Buffer:=nil; NewArray:=Arr; end; {Освобождение памяти} procedure DisposeArray(Arr:PWaveArray); var N : byte; begin N:=1; while Arr^[N].Buffer<>nil do begin FreeMem(Arr^[N].Buffer,Arr^[N].Length); Inc(N); end; FreeMem(Arr,N*6); end; {Загрузка данных из .WAV-файла} function LoadWave(FName:string):PWaveArray; var F : file; D : PWaveArray; DataL : longint; N : byte; begin LoadWave:=nil; Assign(F,FName); Reset(F,1); BlockRead(F,WHeader,SizeOf(WHeader)); if (WHeader.Str1<>'RIFF') or (WHeader.Str2<>'WAVEfmt ') or (WHeader.Str3<>'data') then Exit; DataL:=WHeader.DataLen; D:=NewArray(DataL); if D=nil then Error('Not enough memory to load wave: '+FName); N:=1; while DataL>PartLength do begin BlockRead(F,D^[N].Buffer^,PartLength); Inc(N); Dec(DataL,PartLength); end; BlockRead(F,D^[N].Buffer^,DataL); Close(F); LoadWave:=D; end; {Показать подсказку - а то сами не поняли!} procedure ShowHelp; begin WriteLn('Usage: WavePlay <filename[.WAV]> [/options]'); WriteLn('Where options are:'); WriteLn(' /q - quiet mode (No display output)'); WriteLn(' /s[XXX] - play through SoundBlaster (base port XXX),0x220 by default'); WriteLn(' /c[X] - play through CoVox (DAC) at LPT port X, LPT1 (port 0x378) by default'); WriteLn(' /p - play through PC Speaker'); WriteLn(' /l - loop cyclic play'); WriteLn(' /d,/x - dump WAV file header'); WriteLn(' /h,/? - this help message'); Halt(0); end; procedure WriteDump(FName:string); var F : file; begin Assign(F,FName); Reset(F,1); BlockRead(F,WHeader,SizeOf(WHeader)); if (WHeader.Str1<>'RIFF') or (WHeader.Str2<>'WAVEfmt ') or (WHeader.Str3<>'data') then Error('Invalid WAV file...'); with WHeader do begin WriteLn('File: ',FName); WriteLn('Number of channels: ',ChanNum); WriteLn('Bits per sample: ',BitPerSamp); WriteLn('Sampling frequency: ',SamFreq); WriteLn('Playing time: ',DataLen/BytePerSec:6:2,' sec.'); end; Halt(0); end; var ProgressBar : string[60]; Done : longint; FileName : PathStr; HaveName : boolean; procedure ReadParams; var N : byte; S : string; function ConvertHex(S:string;OldValue:word):word; var W : word; B : byte; Con : word; const HexByte : string[16]='0123456789ABCDEF'; begin ConvertHex:=OldValue; if byte(S[0])=0 then Exit; Con:=1; W:=0; for B:=byte(S[0]) downto 1 do begin if Pos(UpCase(S[B]),HexByte)=0 then begin WriteLn('Can'#$27't convert to value - '+S+'...'); ConvertHex:=OldValue; Exit; end else W:=W+Con*(Pos(UpCase(S[B]),HexByte)-1); Con:=Con*16; end; ConvertHex:=W; end; begin if ParamCount=0 then begin WriteLn('Usage: WavePlay <filename[.WAV]> [/options]'); WriteLn('WavePlay /h for online help'); Halt(1); end; HaveName:=false; for N:=1 to ParamCount do begin S:=ParamStr(N); if S[1] in['/','-'] then case UpCase(S[2]) of 'H','?':ShowHelp; 'Q':QuietMode:=true; 'L':PlayLoop:=true; 'P':Device:=dvPC; 'S':begin Device:=dvSB; BlasterPort:=ConvertHex(Copy(S,3,255),BlasterPort); end; 'C':begin Device:=dvCoVox; LPTN:=ConvertHex(Copy(S,3,255),LPTN); end; 'D','X':DumpOnly:=true; else WriteLn('Unknown switch '+S); end else begin FileName:=S; FixName(FileName,'.WAV',false); HaveName:=true; end; end; if not HaveName then begin WriteLn('No valid filename given...'); Halt(1); end; end; var Percent : word; begin OldInt08:=nil; WriteLn; WriteLn('WAVEPlayer version 1.0 Copyright (C) 1995 by Serge Aksenov'); WriteLn; ReadParams; if DumpOnly then WriteDump(FileName); if (LPTN>0) and (LPTN<5) then BasePort:=MemW[Seg0040:8+(LPTN-1)*2] else WriteLn('Invalid LPT number: ',LPTN); if BasePort=0 then Error('Invalid LPT number'); Data:=LoadWave(FileName); if Data=nil then Error('File '+FileName+' is invalid!'); if not QuietMode then begin WriteLn; WriteLn; end; HideCursor; repeat FillChar(ProgressBar[1],60,'-'); byte(ProgressBar[0]):=60; if not QuietMode then begin WriteLn; WriteLn; end; CurrentPart:=1; IsPlaying:=true; NSample:=0; SetupPlayer; GoToXY(WhereX,WhereY-2); while IsPlaying do begin if GetKey<>0 then begin IsPlaying:=false; PlayLoop:=False; Break; end; Delay(50); if (not QuietMode) and (IsPlaying) then begin Done:=CurrentPart; Done:=(Done-1)*PartLength+NSample; Percent:=longint(Done*100) div WHeader.DataLen; FillChar(ProgressBar[1],60*Percent div 100,'-'); GoToXY(10,WhereY-2); WriteLn('Playing: ',FileName,Percent:4,'% done.'); GoToXY(10,WhereY); WriteLn(ProgressBar); end; end; ResetPlayer; if not (QuietMode) then begin FillChar(ProgressBar[1],60,'-'); GoToXY(10,WhereY-2); WriteLn('Playing: ',FileName,' 100% done.'); GoToXY(10,WhereY); WriteLn(ProgressBar); end; Delay(100); until not PlayLoop; ShowCursor; DisposeArray(Data); end. - - - - 8<- - - - - 8<- - - - - 8<- - - - - 8<- - - - - 8<- - - - - 8<- - - - - Fare thee well o Yura!
следующий фpагмент (3)|пpедыдущий фpагмент (1)
- [46] Various nice sources (2:5030/84) ------------------------- NICE.SOURCES - Msg : 73 of 91 From : Andrew Alexeenko 2:5020/293.3 04 Dec 96 18:51:00 To : Oleg Ryabov Subj : Sound Blaster programming -------------------------------------------------------------------------------- Hi Oleg, replying to a message of Oleg Ryabov to All: OR> Hарод, подкиньте идею, как соорудить такую функцию OR> SB_Sound(double Freq, int Dur); - IMHO из названия ясно - выжать из OR> бластера звук требуемой частоты и требуемой длительности, именно OR> частоты, никакие ноты и хроматические шкалы не нужны, частота должна OR> меняться достаточно плавно ! Подскажите, куда копать - _IMHO_ тут DSP OR> не обойдешься, а FM я еще программировать не умею 8((((( P.S. А IMO обойдешься : void SB_Sound(double Freq, int Dur) { char *buffer=new char[Dur*Rate]; for (int i=0; i<Dur*Rate; i++) buffer[i]=Apmlitude*sin(2*PI*Freq*i/(Dur*Rate)); Play(buffer, Dur, Dur*Rate); } типа того. доступно ? Andrew
следующий фpагмент (4)|пpедыдущий фpагмент (2)
- [46] Various nice sources (2:5030/84) ------------------------- NICE.SOURCES - Msg : 77 of 91 From : Dmitry Naghin 2:5020/468.610 04 Dec 96 13:58:00 To : Oleg Ryabov Subj : Sound Blaster programming -------------------------------------------------------------------------------- В пятницу, 29 ноября 96 Oleg Ryabov(2:5030/167.14) > All: OR> Hарод, подкиньте идею, как соорудить такую функцию OR> SB_Sound(double Freq, int Dur); - IMHO из названия ясно - выжать из бластера OR> звук требуемой частоты и требуемой длительности, именно частоты, OR> никакие ноты и хроматические шкалы не нужны, частота должна меняться OR> достаточно Что значит, "частота должна меняться плавно"? Если тебе просто надо получить чатоту, то. OR> плавно ! Подскажите, куда копать - _IMHO_ тут DSP не обойдешься, Const PlayBackFreq = 11000; MaxBytes = 32768; Var Buffer:array[0..MaxBytes-1] of byte; For I:=0 to MaxBytes-1 do Buffer:=round( 127*sin( 2 * pi * Freq * I /PlaybackFreq))+$80; SBPlay(@Buffer,PlayBackFreq, Dur*PlayBackFreq); ;) OR> а FM я еще программировать не умею 8((((( Могу научить. ;) OR> P.S. Интересует идея(алгоритм), язык реализации не очень принципиален, для OR> SB/SB16, _не_ AWE-фичи & GUS. Long Live Rock'n'Roll! Дмитрий (АКА DAN Login(TM)) ---------------------------------------------------------------------------- {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X-} {$M $400,0,0} Var SB_Present : Boolean; SB_Address : Word; Function Word2HEX(i:Word):String; Const HEX : Array[$00..$0F] of Char = '0123456789ABCDEF'; Var j : String[4]; Begin j[0]:=#4; j[1]:=HEX[i shr 12]; j[2]:=HEX[i and $0FFF shr 8]; j[3]:=HEX[i and $00FF shr 4]; j[4]:=HEX[i and $000F]; Word2HEX:=j; End; Procedure SB_Detect(Var _SB_Present:Boolean;Var _SB_Address:Word); Var i : Boolean; j : Word; Begin Asm mov bx,200h mov cx,10 @SBD1: push cx mov dx,bx add dx,06h mov al,1 out dx,al in al,dx in al,dx in al,dx in al,dx mov al,0 out dx,al mov cx,100 mov dx,bx add dx,0Ah @SBD2: in al,dx cmp al,0AAh loopnz @SBD2 pop cx jz @SBD_Found add bx,10h loop @SBD1 @SBD_Not_Found: mov i,0 jmp @SBD_Quit @SBD_Found: mov i,1 mov j,bx @SBD_Quit: End; _SB_Present:=i; _SB_Address:=j; End; Begin WriteLn('The Sound Blaster Detector, version 1.00 1995-Jan-05'); WriteLn('ARA Copyright (C) 1995'); WriteLn('Agababyan Robert Assotiation'); WriteLn; SB_Detect(SB_Present,SB_Address); if SB_Present then WriteLn('Sound Blaster found at port ',Word2HEX(SB_Address),'h') else WriteLn('Sound Blaster not found'); End.
следующий фpагмент (5)|пpедыдущий фpагмент (3)
- [55] Digital sound and music problems (2:5030/84) ---------------- RU.STRACK - Msg : 39 of 43 From : Victor Ivashin 2:5030/103.24 12 Feb 95 14:16:00 To : kim@santek.msk.su Subj : Где найти описание HARDWARE SoundBlaster16? -------------------------------------------------------------------------------- Hi kim@santek.msk.su! Yamaha 3812: Register address map ------T-------T--------T--------T-------T--------T--------T--------T--------¬ ¦ REG ¦ D7 ¦ D6 ¦ D5 ¦ D4 ¦ D3 ¦ D2 ¦ D1 ¦ D0 ¦ +-----+-------+--------+--------+-------+--------+--------+--------+--------+ ¦ 01 ¦ ¦ ¦ Test Register ¦ +-----+----------------+--------+-------------------------------------------+ ¦ 02 ¦ Timer 1 Count (80 цsec resolution) ¦ +-----+---------------------------------------------------------------------+ ¦ 03 ¦ Timer 2 Count (320 цsec resolution) ¦ +-----+-------T-----------------T-------------------------T-----------------+ ¦ 04 ¦IRQ ¦ Mask ¦ ¦ Start/Stop ¦ ¦ ¦Reset ¦ T1 ¦ T2 ¦ ¦ T2 ¦ T1 ¦ +-----+-------+--------+--------+-------------------------+--------+--------+ ¦ 08 ¦ CSM ¦ SEL ¦ ¦ +-----+-------+--------+--------T-------T-----------------------------------+ ¦20-35¦ AM ¦ Vibr ¦ EG ¦ KSR ¦ Multiple ¦ +-----+-------+--------+--------+-------+-----------------------------------+ ¦40-55¦ Key Scale Level¦ Total Level ¦ +-----+----------------+----------------T-----------------------------------+ ¦60-75¦ Attack Rate ¦ Decay Rate ¦ +-----+---------------------------------+-----------------------------------+ ¦80-95¦ Sustain Level ¦ Release Rate ¦ +-----+---------------------------------+-----------------------------------+ ¦A0-A8¦ Frequency Number ( Lower 8 bits ) ¦ +-----+----------------T--------T-------------------------T-----------------+ ¦B0-B8¦ ¦ KEY-ON ¦ Block Number ¦ F-Num (hi bits) ¦ +-----+----------------+--------+-------T--------T--------+--------T--------+ ¦ BD ¦ Depth ¦ Rhythm ¦ Bass ¦ Snare ¦ Tom- ¦ Top ¦ Hi ¦ ¦ ¦ AM ¦ Vibr ¦ ¦ Drum ¦ Drum ¦ Tom ¦ Cym ¦ Hat ¦ +-----+-------+--------+--------+-------+--------+--------+--------+--------+ ¦C0-C8¦ ¦FeedBack Modulation Factor¦ Con ¦ L-----+---------------------------------+--------------------------+--------- I/O Port Address г========T===============T=======================================¬ ¦ ¦ ¦ Sound Blaster`s ¦ ¦ Base ¦ I/O Addresses +--------T------T------------T----------¦ ¦Address ¦ Used ¦ 1.5 и ¦ 2.0 ¦Microchannel¦ PRO ¦ ¦ ¦ ¦ старше ¦ ¦ version ¦ ¦ ¦========+===============+========+======+============+==========¦ ¦ 210h ¦ 210h to 21Fh ¦ + ¦ - ¦ + ¦ - ¦ ¦ 220h ¦ 220h to 22Fh ¦ + ¦ + ¦ + ¦ + ¦ ¦ 230h ¦ 230h to 23Fh ¦ + ¦ - ¦ + ¦ - ¦ ¦ 240h ¦ 240h to 24Fh ¦ + ¦ + ¦ + ¦ + ¦ ¦ 250h ¦ 250h to 25Fh ¦ + ¦ - ¦ + ¦ - ¦ ¦ 260h ¦ 260h to 26Fh ¦ + ¦ - ¦ + ¦ - ¦ L========¦===============¦========¦======¦============¦==========- Прерывания г========T=======================================¬ ¦ ¦ Sound Blaster`s ¦ ¦ омер +--------T------T------------T----------¦ ¦прерыва-¦ 1.5 и ¦ 2.0 ¦Microchannel¦ PRO ¦ ¦ ния ¦ старше ¦ ¦ version ¦ ¦ ¦========+========+======+============+==========¦ ¦ 2 ¦ + ¦ + ¦ + ¦ + ¦ ¦ 3 ¦ + ¦ + ¦ + ¦ - ¦ ¦ 5 ¦ + ¦ + ¦ + ¦ + ¦ ¦ 7 ¦ + ¦ + ¦ + ¦ + ¦ ¦ 10 ¦ - ¦ - ¦ - ¦ + ¦ L========¦========¦======¦============¦==========- Port Registers x - в соответствии с предыдущей таблицей г==========T=======================================T=====T=======¬ ¦ ¦ ¦ ¦ ¦ ¦ 200h-207h¦ Analog Joystick port ¦ r/w ¦ 1SMP ¦ ¦ ¦ ¦ ¦ ¦ ¦ 2x0h ¦ CMS Music Voice 1-6 Data port ¦ w ¦ 1SM ¦ ¦ 2x1h ¦ CMS Music Voice 1-6 Register port ¦ w ¦ 1SM ¦ ¦ 2x2h ¦ CMS Music Voice 7-12 Data port ¦ w ¦ 1SM ¦ ¦ 2x3h ¦ CMS Music Voice 7-12 Register port ¦ w ¦ 1SM ¦ ¦ ¦ ¦ ¦ ¦ ¦ 2x0h ¦ Left FM Music Status port ¦ r ¦ P ¦ ¦ 2x0h ¦ Left FM Music register address port ¦ w ¦ P ¦ ¦ 2x1h ¦ Left FM Music Data port ¦ w ¦ P ¦ ¦ 2x2h ¦ Right FM Music Status port ¦ r ¦ P ¦ ¦ 2x2h ¦ Right FM Music register address port ¦ w ¦ P ¦ ¦ 2x3h ¦ Right FM Music Data port ¦ w ¦ P ¦ ¦ ¦ ¦ ¦ ¦ ¦ 2x8h ¦ FM Music Status port (mono) ¦ r ¦ 1SMP ¦ ¦ 2x8h ¦ FM Music register address port (mono) ¦ w ¦ 1SMP ¦ ¦ 2x9h ¦ FM Music Data port (mono) ¦ w ¦ 1SMP ¦ ¦ ¦ ¦ ¦ ¦ ¦ 2x4h ¦ Mixer Chip register address port ¦ w ¦ P ¦ ¦ 2x5h ¦ Mixer Chip Data port ¦ r/w ¦ P ¦ ¦ ¦ ¦ ¦ ¦ ¦ 2x6h ¦ DSP Reset port ¦ w ¦ 1SMP ¦ ¦ 2xAh ¦ DSP Read Data port ¦ r ¦ 1SMP ¦ ¦ 2xCh ¦ DSP Write Data or Command port ¦ w ¦ 1SMP ¦ ¦ 2xCh ¦ DSP Write Buffer Status port bit 7 ¦ r ¦ 1SMP ¦ ¦ 2xEh ¦ DSP Data Available Status port bit 7 ¦ r ¦ 1SMP ¦ ¦ ¦ ¦ ¦ ¦ ¦ 2x0+10h ¦ CD-ROM Data register ¦ r ¦ P ¦ ¦ 2x0+10h ¦ CD-ROM Command register ¦ w ¦ P ¦ ¦ 2x0+11h ¦ CD-ROM Status register ¦ r ¦ P ¦ ¦ 2x0+12h ¦ CD-ROM Reset register ¦ w ¦ P ¦ ¦ 2x0+13h ¦ CD-ROM Enable register ¦ w ¦ P ¦ ¦ ¦ ¦ ¦ ¦ ¦ 388h ¦ FM Address ¦ w ¦ 1SMPA ¦ ¦ 388h ¦ FM Status ¦ r ¦ 1SMPA ¦ ¦ 389h ¦ FM Data ¦ w ¦ 1SMPA ¦ L==========¦=======================================¦=====¦=======- 1 - Sound Blaster 1.0, 1.5 S - Sound Blaster 2.0 M - Sound Blaster Microchannel version ( PS2 ) P - Sound Blaster Pro A - AdLib FM синтез может быть также, доступен по I/O адресам 388h и 389h. Эти адреса предназначены для совместимости с FM синтезом AdLib карты. Victor :)=
следующий фpагмент (6)|пpедыдущий фpагмент (4)
- [46] Various nice sources (2:5030/84) ------------------------- NICE.SOURCES - Msg : 73 of 91 From : Andrew Alexeenko 2:5020/293.3 04 Dec 96 18:51:00 To : Oleg Ryabov Subj : Sound Blaster programming -------------------------------------------------------------------------------- Hi Oleg, replying to a message of Oleg Ryabov to All: OR> Hарод, подкиньте идею, как соорудить такую функцию OR> SB_Sound(double Freq, int Dur); - IMHO из названия ясно - выжать из OR> бластера звук требуемой частоты и требуемой длительности, именно OR> частоты, никакие ноты и хроматические шкалы не нужны, частота должна OR> меняться достаточно плавно ! Подскажите, куда копать - _IMHO_ тут DSP OR> не обойдешься, а FM я еще программировать не умею 8((((( P.S. А IMO обойдешься : void SB_Sound(double Freq, int Dur) { char *buffer=new char[Dur*Rate]; for (int i=0; i<Dur*Rate; i++) buffer[i]=Apmlitude*sin(2*PI*Freq*i/(Dur*Rate)); Play(buffer, Dur, Dur*Rate); } типа того. доступно ? Andrew
следующий фpагмент (7)|пpедыдущий фpагмент (5)
- [46] Various nice sources (2:5030/84) ------------------------- NICE.SOURCES - Msg : 77 of 91 From : Dmitry Naghin 2:5020/468.610 04 Dec 96 13:58:00 To : Oleg Ryabov Subj : Sound Blaster programming -------------------------------------------------------------------------------- В пятницу, 29 ноября 96 Oleg Ryabov(2:5030/167.14) > All: OR> Hарод, подкиньте идею, как соорудить такую функцию OR> SB_Sound(double Freq, int Dur); - IMHO из названия ясно - выжать из бластера OR> звук требуемой частоты и требуемой длительности, именно частоты, OR> никакие ноты и хроматические шкалы не нужны, частота должна меняться OR> достаточно Что значит, "частота должна меняться плавно"? Если тебе просто надо получить чатоту, то. OR> плавно ! Подскажите, куда копать - _IMHO_ тут DSP не обойдешься, Const PlayBackFreq = 11000; MaxBytes = 32768; Var Buffer:array[0..MaxBytes-1] of byte; For I:=0 to MaxBytes-1 do Buffer:=round( 127*sin( 2 * pi * Freq * I /PlaybackFreq))+$80; SBPlay(@Buffer,PlayBackFreq, Dur*PlayBackFreq); ;) OR> а FM я еще программировать не умею 8((((( Могу научить. ;) OR> P.S. Интересует идея(алгоритм), язык реализации не очень принципиален, для OR> SB/SB16, _не_ AWE-фичи & GUS.
следующий фpагмент (8)|пpедыдущий фpагмент (6)
- [97] Talks about assembler (2:5030/84) --------------------------- TALKS.ASM - Msg : 14 of 30 From : Serguey Zefirov 2:5020/509.601 05 Mar 96 15:49:00 To : Dmitry Katonov Subj : SB - shutup -------------------------------------------------------------------------------- Zdorovenki bulji,(Hi! in other words) Dmitry! DK> Hарод , скажите , как заткнуть взбесившийся subj ? DK> (Завис и гудит по мозгам) DK> (Вариантов вроде Three Fingers Salute не надо) DSPReset: -------------------------------8<------------------------------------ [это...] ; -- initSBDSP ------------------------------------------------- ; proc initSBDSP mov dx,[sbReset] ; 2x0+06. Если база 220 - 226. mov al,1 out dx,al REPT 8 in al,dx ; Ждем! ENDM mov al,0 out dx,al mov dx,[sbDataAvail] mov ecx,131072 @@wait: in al,dx test al,80h jnz @@gotbyte dec ecx jnz @@wait @@gotbyte: stc jz @@end mov dx,[sbRData] in al,dx sub al,0aah cmp al,1 cmc @@end: ret endp initSBDSP [..., это...] ; -- writeDSP -------------------------------------------------- ; proc FUNC writeDSP uses dx mov dx,[sbWBStat] @@loop: in al,dx test al,80h jnz @@loop mov dx,[sbCommand] mov al,ah out dx,al ret endp writeDSP [..., также это...] ; -- sbSpeakerOff ---------------------------------------------- ; proc sbSpeakerOff mov ah,0d3h call writeDSP ret endp sbSpeakerOff [...и это тебе пока не нужно ;)] -------------------------------8<------------------------------------ Buy! Сеpега. [Team Serioga:/sergueyz@goldnet.ru]

Всего 7 фpагмент(а/ов) |пpедыдущий фpагмент (7)

Если вы хотите дополнить FAQ - пожалуйста пишите.

design/collection/some content by Frog,
DEMO DESIGN FAQ (C) Realm Of Illusion 1994-2000,
При перепечатке материалов этой страницы пожалуйста ссылайтесь на источник: "DEMO.DESIGN FAQ, http://www.enlight.ru/demo/faq".