OSDN Git Service

8a2c13545a8febf6d744188d59024c94f6ccc4b1
[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 var
16   i, delayStart: integer;
17   k: Single;
18   pMem, pCpy: array of Byte;
19   s: TMemoryStream;
20   L, R, DuetL, DuetR: SmallInt;
21 begin
22   result := 0;
23   try
24     s := TMemoryStream.Create;
25     s.ReadBuffer(sp.pWav^, sp.sizeOfData);
26     pMem := sp.pWav;
27     pCpy := s.Memory;
28     delayStart := sp.samplePerSec * sp.cycleuSec;
29     i := delayStart + sp.posOfData;
30     k := 8 * sp.sizeOfData / sp.bitsPerSample;
31     while i < k do
32     begin
33       L := pMem[i + 0];
34       R := pMem[i + 1];
35       DuetL := pCpy[i + 0 - delayStart];
36       DuetR := pCpy[i + 1 - delayStart];
37       inc(L, DuetL);
38       inc(R, DuetR);
39
40       pMem[i + 0] := L;
41       pMem[i + 1] := R;
42       inc(i, 2);
43     end;
44   except
45     result := -1;
46   end;
47 end;
48
49 function effect16BitWav(const sp: SpParam): integer;
50 var
51   i, delayStart: integer;
52   k: Single;
53   pMem, pCpy: array of SmallInt;
54   s: TMemoryStream;
55   L, R, DuetL, DuetR: SmallInt;
56 begin
57   result := 0;
58   s := TMemoryStream.Create;
59   try
60     SetLength(pCpy, sp.sizeOfData);
61     s.Write(sp.pWav^, sp.sizeOfData);
62     s.Position := 0;
63     s.Read(Pointer(pCpy)^, sp.sizeOfData);
64     pMem := sp.pWav;
65     delayStart := sp.posOfData + sp.samplePerSec * sp.cyclicSec;
66     i := delayStart + sp.posOfData;
67     k := 8 * sp.sizeOfData / sp.bitsPerSample;
68     while i < k do
69     begin
70       L := pMem[i + 0];
71       R := pMem[i + 1];
72       DuetL := pCpy[i + 0 - delayStart];
73       DuetR := pCpy[i + 1 - delayStart];
74       inc(L, DuetL);
75       inc(R, DuetR);
76       L := max(-32768, min(32767, L));
77       R := max(-32768, min(32767, R));
78       pMem[i + 0] := L;
79       pMem[i + 1] := R;
80       inc(i, 2);
81     end;
82   except
83     result := -1;
84   end;
85   s.Free;
86   Finalize(pCpy);
87 end;
88
89 procedure usage;
90 begin
91   Writeln('\82Ì\82±\82¬\82è\94g');
92   Writeln('\97á\81Feffect.wav 100 2000');
93 end;
94
95 function effectwav(const sp: SpParam): integer;
96 begin
97   if sp.channels = 1 then
98   begin
99     Writeln('\83X\83e\83\8c\83I\83t\83@\83C\83\8b\82É\82µ\82Ä\82­\82¾\82³\82¢');
100     result := -1;
101   end;
102   if sp.bitsPerSample = 8 then
103     result := effect8BitWav(sp)
104   else
105     result := effect16BitWav(sp);
106 end;
107
108 end.