Работа с WAVE файлами. [PAS, Speaker]
Проговаривает (проигрывает) файл типа WAV. Работает на Internal Speaker или Covox. Размер файлов не больше 64500 байт (остальное игнорируется). Если не лень, то размер можете увеличить, текст программы на Паскале прилагается. Звучание не зависит от скорости процессора (или почти не зависит), т.к. производится синхронизация по таймеру. Проигрывание других файлов (например "сонгов" от Scream Tracker) не гарантируется ввиду отсутствия в заголовке информации о скорости проигрывания.
Кстати, любой WAV после удаления (или обнуления) 44 байт заголовка можно использовать как "сонг" к Scream Tracker.
program tst; uses crt; var f : file; b : array [1..64500] of byte; i : word; i1: word; t : byte; b1: byte; covox: word; c : string[2]; spd : word; begin if paramcount = 0 then begin writeln('Test program for *.WAV (Windows) files.'); writeln; writeln('Usage:'); writeln(' TST[C#]'); writeln; writeln(' - .WAV File Name,'); writeln(' C# - Covox port number.'); writeln; writeln('If C# parameter is not specified Internal PC Speaker will be use.'); halt; end; if (paramcount > 1) and ((copy(paramstr(2),1,1) = 'C') or (copy(paramstr(2),1,1) = 'c')) then begin c:=copy(paramstr(2),2,1); if c[1] in ['1'..'4'] then begin covox:=memw[0:$408+((byte(c[1]) and $f)-1)*2]; end else covox:=0; end else covox:=0; sound(20000); nosound; t:=port[$61]; assign(f,paramstr(1)); {$I+} reset(f,1); blockread(f,b,64500,i); close(f); spd:=b[25]+(word(b[26]) shl 8); spd:=$fffffff div longint(spd); if covox = 0 then begin spd:=spd shr 7; port[$43]:=0; for i1:=44 to i do begin b1:=b[i1]; asm mov al,b1 shr al,6 and al,2 out 61h,al in al,40h xchg al,ah in al,40h xchg al,ah mov dx,ax @m1: xor al,al out 43h,al in al,40h xchg al,ah in al,40h xchg al,ah push dx sub dx,ax cmp dx,spd pop dx jb @m1 end; end; end else begin spd:=spd shr 7; port[$43]:=0; for i1:=44 to i do asm lea bx,b mov dx,covox add bx,i1 dec bx mov al,[bx] out dx,al in al,40h xchg al,ah in al,40h xchg al,ah mov dx,ax @m1: xor al,al out 43h,al in al,40h xchg al,ah in al,40h xchg al,ah push dx sub dx,ax cmp dx,spd pop dx jb @m1 end; end; port[$61]:=t; end.
Оставить комментарий
Комментарии
1.
29 октября 2006, 16:32:00
there are two mistakes:
1)sound(20000); nosound;
2) shr al,6
1)sound(20000); nosound;
2) shr al,6
2.
18 августа 2006, 15:44:33
Классная статья.
3.
20 марта 2005, 19:47:39
> Кстати, любой WAV после удаления (или обнуления) 44 байт заголовка можно использовать как "сонг" к Scream Tracker.
Ничего подобного!
Во-первых WAV - это контейнер, соответсвенно он может содержать несколько chunk'ов.
Во-вторых, каждый chunk может быть закодирован своим собственным методом (в том числе и отличным от PCM).
Ничего подобного!
Во-первых WAV - это контейнер, соответсвенно он может содержать несколько chunk'ов.
Во-вторых, каждый chunk может быть закодирован своим собственным методом (в том числе и отличным от PCM).