Работа с 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.
Теги:
WAVE, файл, PAS, Speaker
Добавлено: 22 Сентября 2013 09:17:26 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...