Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11855
Последний выпуск: 19.06.2015

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

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
22K
14 октября 2006 года
OTO_777
0 / / 14.10.2006
Мне нравитсяМне не нравится
29 октября 2006, 16:32:00
there are two mistakes:

1)sound(20000); nosound;
2) shr al,6
2.
7.6K
07 июля 2006 года
Eternal Man
59 / / 07.07.2006
Мне нравитсяМне не нравится
18 августа 2006, 15:44:33
Классная статья.
3.
Аноним
Мне нравитсяМне не нравится
20 марта 2005, 19:47:39
> Кстати, любой WAV после удаления (или обнуления) 44 байт заголовка можно использовать как "сонг" к Scream Tracker.

Ничего подобного!
Во-первых WAV - это контейнер, соответсвенно он может содержать несколько chunk'ов.
Во-вторых, каждый chunk может быть закодирован своим собственным методом (в том числе и отличным от PCM).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог