OSDN Git Service

3b9e69972507ecdb18e5356354e3329bc871b5fe
[sample-delphi/sample-DELPHI.git] / effect.pas
1 unit effect;
2
3 interface
4
5 uses System.Classes, System.SysUtils, Math, spWav;
6
7 function effect8BitWav(const sp: SpParam): integer;
8 function effect16BitWav(const sp: SpParam): integer;
9 procedure usage;
10 function effectwav(const sp: SpParam): integer;
11
12 implementation
13
14 function effect8BitWav(const sp: SpParam): integer;
15 const
16   depth = 1.0;
17   rate = 170.0;
18 var
19   i, delayStart: integer;
20   k, m: Single;
21   pMem, pCpy: array of Byte;
22   s: TMemoryStream;
23 begin
24   result := 0;
25   try
26     s := TMemoryStream.Create;
27     s.ReadBuffer(sp.pWav^, sp.sizeOfData);
28     pMem := sp.pWav;
29     pCpy := s.Memory;
30     i := sp.posOfData;
31     k := 8 * sp.sizeOfData / sp.bitsPerSample;
32     while i < k do
33     begin
34       m := depth * sin(2 * pi * rate / sp.samplePerSec);
35       pMem[i + 0] := trunc(m * pMem[i + 0]) + 128;
36       pMem[i + 1] := trunc(m * pMem[i + 1]) + 128;
37       inc(i, 2);
38     end;
39   except
40     result := -1;
41   end;
42 end;
43
44 function effect16BitWav(const sp: SpParam): integer;
45 const
46   depth = 1.0;
47   rate = 170.0;
48 var
49   i: integer;
50   k, m: Single;
51   pMem, pCpy: array of SmallInt;
52   s: TMemoryStream;
53 begin
54   result := 0;
55   s := TMemoryStream.Create;
56   try
57     SetLength(pCpy, sp.sizeOfData);
58     s.Write(sp.pWav^, sp.sizeOfData);
59     s.Position := 0;
60     s.Read(Pointer(pCpy)^, sp.sizeOfData);
61     pMem := sp.pWav;
62     i := sp.posOfData;
63     k := 8 * sp.sizeOfData / sp.bitsPerSample;
64     while i < k do
65     begin
66       m := depth * sin(2 * rate * pi * i / sp.samplePerSec);
67       pMem[i + 0] := trunc(m * pMem[i + 0]);
68       pMem[i + 1] := trunc(m * pMem[i + 1]);
69       inc(i, 2);
70     end;
71   except
72     result := -1;
73   end;
74   s.Free;
75   Finalize(pCpy);
76 end;
77
78 procedure usage;
79 begin
80   Writeln('\82Ì\82±\82¬\82è\94g');
81   Writeln('\97á\81Feffect.wav 100 2000');
82 end;
83
84 function effectwav(const sp: SpParam): integer;
85 begin
86   if sp.channels = 1 then
87   begin
88     Writeln('\83X\83e\83\8c\83I\83t\83@\83C\83\8b\82É\82µ\82Ä\82­\82¾\82³\82¢');
89     result := -1;
90   end;
91   if sp.bitsPerSample = 8 then
92     result := effect8BitWav(sp)
93   else
94     result := effect16BitWav(sp);
95 end;
96
97 end.