|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Alexei Frounze 2:5020/400 29 May 2001 22:46:11 To : Mihail Beliakoff Subject : WAV to SPEAKER ?!?!?!?!?!?!? --------------------------------------------------------------------------------
Tue May 29 2001 09:04, Mihail Beliakoff wrote to All:
MB> Hужен алгоpитм, чтобы выводить WAV-файл на динамик компьютеpа.
MB> Т.е. как pаботает пpогpамма PLAYWAVE от SYMAANTEC ???
MB> Или адpесок где можно найти подобную инфоpмацию.
алгоритм простой, поищи в инете объяснение широтно имппульсной модуляции (ШИМ)
или на инглише Pulse Width Duration.
есть у меня и пример, только мне было лень много писать для такой безделушки.
предполагается, что процессор - пень, система - ДОС/винды (не NT и не 2000),
файлик моно, 8-ми битный, частота сэмплов 11025Гц.
Компилять NASM'ом (http://www.cryogen.com/nasm/):
nasm spk.asm -o spk.com
запускать с параметром - именем файла.
пока не забыл... воспроизводит максимум около 60кб, если файл длиннее - всё не
услышишь, только часть.
bits 16
org 100h
main:
mov bx, 81h
cmp byte [bx], 0dh
jz .eopen
0:
cmp byte [bx], 0dh
jz .1
inc bx
jmp short .0
1:
mov byte [bx], 0
mov ax, 3d00h
mov dx, 82h
int 21h
jc .eopen
mov bx, ax
mov cx, 0ff00h
sub cx, samples
mov ah, 3fh
mov dx, samples
int 21h
jc .eread
mov [size], ax
mov ah, 3eh
int 21h
jmp .loaded
eopen:
eread:
mov dx, merr
mov ah, 9
int 21h
ret
loaded:
call get_cpu_freq
mov ebx, 11025
div ebx
mov edi, eax
in al, 61h
and al, 0fch
out 61h, al
cld
mov si, samples
mov bp, [size]
cycle:
or al, 2
out 61h, al
push ax
xor eax, eax
lodsb
;;;; start of amplifying
sub ax, 80h
shl ax, 3
cmp ax, -80h
jge .2
mov ax, -80h
jmp short .3
2:
cmp ax, 7fh
jle .3
mov ax, 7fh
3
add ax, 80h
;;;; end of amplifying (remove this stuff if too loud)
mul edi
shrd eax, edx, 8
mov ecx, eax
call delay
pop ax
and al, ~2
out 61h, al
push ax
sub ecx, edi
neg ecx
call delay
pop ax
dec bp
jnz .cycle
ret
delay:
push ecx
rdtsc
add eax, ecx
adc edx, 0
mov ebx, eax
mov ecx, edx
0:
rdtsc
sub eax, ebx
sbb edx, ecx
jc .0
pop ecx
ret
get_cpu_freq:
push byte 40h
pop es
mov ch, 9 ; 9 values for average of 8 periods
0:
mov ax, [es:6ch]
1:
cmp ax, [es:6ch]
je .1
rdtsc
push edx
push eax
dec ch
jnz .0
mov cx, 800h
xor eax, eax ; allocate cl:eax for the sum
pop ebx
pop edx
2:
pop esi
pop edi
sub ebx, esi
sbb edx, edi
add eax, ebx
adc cl, dl
mov ebx, esi
mov edx, edi
dec ch
jnz .2
; cl:eax = total sum of 8 values
shrd eax, ecx, 3 ; eax = average value
mov ebx, 1193180
mul ebx
shrd eax, edx, 16
shr edx, 16
ret
size dw 1
merr db "couldn't open or read a file",13,10,"$"
samples:
http://alexfru.chat.ru
--- ifmail v.2.15dev5
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/16679d7c2ff4b.html, оценка из 5, голосов 10
|