5 uses System.Classes, System.SysUtils, Math, spWav;
7 function effect8BitWav(const sp: SpParam): integer;
8 function effect16BitWav(const sp: SpParam): integer;
9 function sinc(x: Single): Single;
11 function effectwav(const sp: SpParam): integer;
15 function effect8BitWav(const sp: SpParam): integer;
19 i, a, b, pmin, pmax, temp_size, offset0, offset1, p, q: integer;
20 k, m, ma, pitch, rate: Single;
21 pMem, pCpy: array of SmallInt;
26 s := TMemoryStream.Create;
28 SetLength(pCpy, sp.sizeOfData);
29 s.Write(sp.pWav^, sp.sizeOfData);
31 s.Read(Pointer(pCpy)^, sp.sizeOfData);
33 temp_size := trunc(sp.samplePerSec * sp.bitsPerSample * sp.channels * 0.01);
34 pmin := trunc(sp.samplePerSec * sp.bitsPerSample * sp.channels * 0.005);
35 pmax := trunc(sp.samplePerSec * sp.bitsPerSample * sp.channels * 0.02);
36 SetLength(r, pmax - pmin);
37 offset0 := sp.posOfData;
38 offset1 := sp.posOfData;
40 while offset0 + pmax * 2 < sp.sizeOfData do
44 for b := 0 to pmax - pmin - 1 do
47 for a := sp.posOfData to sp.posOfData + temp_size do
48 r[b] := r[b] + pCpy[a] * pCpy[a + b];
55 for i := 0 to p - 1 do
57 pMem[offset1 + i] := pCpy[offset0 + i];
58 pMem[offset1 + i + p] := trunc(pCpy[offset0 + p + i] * (p - i) / p +
59 pCpy[offset0 + i] * i / p);
61 q := trunc(rate * p / Abs(1.0 - rate) + 0.5);
62 for i := p to q - 1 do
64 if offset0 + i >= sp.sizeOfData then
66 pMem[offset1 + p + i] := pCpy[offset0 + i];
72 for i := sp.posOfData to sp.sizeOfData do
76 for a := q - j div 2 to q + j div 2 do
77 if (m >= sp.posOfData) and (m < sp.sizeOfData) then
78 pMem[a] := trunc(pMem[a + 0] + pCpy[a + 0] * sinc(pi * (m - a)));
88 function effect16BitWav(const sp: SpParam): integer;
92 i, k, a, b, pmin, pmax, temp_size, offset0, offset1, p, q: integer;
93 m, ma, pitch, rate: Single;
94 pMem, pCpy: array of SmallInt;
99 s := TMemoryStream.Create;
101 SetLength(pCpy, sp.sizeOfData);
102 s.Write(sp.pWav^, sp.sizeOfData);
104 s.Read(Pointer(pCpy)^, sp.sizeOfData);
106 temp_size := trunc(sp.samplePerSec * sp.bitsPerSample * sp.channels * 0.01);
107 pmin := trunc(sp.samplePerSec * sp.bitsPerSample * sp.channels * 0.005);
108 pmax := trunc(sp.samplePerSec * sp.bitsPerSample * sp.channels * 0.02);
109 SetLength(r, pmax - pmin);
110 offset0 := sp.posOfData;
111 offset1 := sp.posOfData;
113 k := (sp.sizeOfData - sp.posOfData) div sp.channels;
114 for b := 0 to pmax - pmin - 1 do
117 for a := sp.posOfData to sp.posOfData + temp_size do
118 r[b] := r[b] + pCpy[a] * pCpy[a + b];
125 while offset1 + 2 * pmax < k do
131 pMem[offset1 + i] := pCpy[offset0 + i];
132 pMem[offset1 + i + p] := trunc(pCpy[offset0 + p + i] * (p - i) / p +
133 pCpy[offset0 + i] * i / p);
135 q := trunc(rate * p / (1.0 - rate) + 0.5);
136 for i := p to q - 1 do
138 if offset1 + i + p >= k then
140 pMem[offset1 + p + i] := pCpy[offset0 + i];
146 for i := sp.posOfData to k - 1 do
150 for a := q - j div 2 to q + j div 2 do
151 if (a >= sp.posOfData) and (a < k) then
152 pMem[i] := pMem[a] + pCpy[a] * trunc(sinc(pi * (m - a)))
164 function sinc(x: Single): Single;
169 result := sin(x) / x;
174 Writeln('
\82Ì
\82±
\82¬
\82è
\94g');
175 Writeln('
\97á
\81Feffect.wav 100 2000');
178 function effectwav(const sp: SpParam): integer;
180 if sp.channels = 1 then
182 Writeln('
\83X
\83e
\83\8c\83I
\83t
\83@
\83C
\83\8b\82É
\82µ
\82Ä
\82
\82¾
\82³
\82¢');
185 if sp.bitsPerSample = 8 then
186 result := effect8BitWav(sp)
188 result := effect16BitWav(sp);