Работа с 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).
