interface
-uses System.Classes, System.SysUtils, spWav;
+uses System.Classes, System.SysUtils, Math, spWav;
-function effect8BitWav(InInMem, InOutMem: TMemoryStream; sp: SpParam): integer;
-function effect16BitWav(InInMem, InOutMem: TMemoryStream; sp: SpParam): integer;
+function effect8BitWav(const sp: SpParam): integer;
+function effect16BitWav(const sp: SpParam): integer;
procedure usage;
+function effectwav(const sp: SpParam): integer;
implementation
-function effect8BitWav(InInMem, InOutMem: TMemoryStream; sp: SpParam): integer;
+function effect8BitWav(const sp: SpParam): integer;
var
- i, j: integer;
- pInMem, pOutMem: TBytes;
+ i, delayStart: integer;
+ k: Single;
+ pMem, pCpy: array of Byte;
+ s: TMemoryStream;
+ L, R, DuetL, DuetR: SmallInt;
begin
- i := sp.posOfData;
- j := sp.sizeOfData - 1;
- pInMem := InInMem.Memory;
- pOutMem := InOutMem.Memory;
- while i < j do
- begin
- pOutMem[i] := pInMem[j];
- pOutMem[i + 1] := pInMem[j + 1];
- inc(i, 2);
- dec(j, 2);
+ result := 0;
+ try
+ s := TMemoryStream.Create;
+ s.ReadBuffer(sp.pWav^, sp.sizeOfData);
+ pMem := sp.pWav;
+ pCpy := s.Memory;
+ delayStart := sp.samplePerSec * sp.cycleuSec;
+ i := delayStart + sp.posOfData;
+ k := 8 * sp.sizeOfData / sp.bitsPerSample;
+ while i < k do
+ begin
+ L := pMem[i + 0];
+ R := pMem[i + 1];
+ DuetL := pCpy[i + 0 - delayStart];
+ DuetR := pCpy[i + 1 - delayStart];
+ inc(L, DuetL);
+ inc(R, DuetR);
+ L := max(-128, min(127, L));
+ R := max(-128, min(127, R));
+ pMem[i + 0] := L+128;
+ pMem[i + 1] := R+128;
+ inc(i, 2);
+ end;
+ except
+ result := -1;
end;
end;
-function effect16BitWav(InInMem, InOutMem: TMemoryStream; sp: SpParam): integer;
+function effect16BitWav(const sp: SpParam): integer;
var
- i, j: integer;
- pInMem, pOutMem: TBytes;
+ i, delayStart: integer;
+ k: Single;
+ pMem, pCpy: array of SmallInt;
+ s: TMemoryStream;
+ L, R, DuetL, DuetR: integer;
begin
- pInMem := InInMem.Memory;
- pOutMem := InOutMem.Memory;
- i := sp.posOfData;
- j := sp.sizeOfData - 1;
- while i < j do
- begin
- pOutMem[i] := pInMem[j];
- pOutMem[i + 1] := pInMem[j + 1];
- inc(i, 2);
- dec(j, 2);
+ result := 0;
+ s := TMemoryStream.Create;
+ try
+ SetLength(pCpy, sp.sizeOfData);
+ s.Write(sp.pWav^, sp.sizeOfData);
+ s.Position := 0;
+ s.Read(Pointer(pCpy)^, sp.sizeOfData);
+ pMem := sp.pWav;
+ delayStart := sp.posOfData + sp.samplePerSec * sp.cyclicSec;
+ i := delayStart + sp.posOfData;
+ k := 8 * sp.sizeOfData / sp.bitsPerSample;
+ while i < k do
+ begin
+ L := pMem[i + 0];
+ R := pMem[i + 1];
+ DuetL := pCpy[i + 0 - delayStart];
+ DuetR := pCpy[i + 1 - delayStart];
+ inc(L, DuetL);
+ inc(R, DuetR);
+ L := max(-32768, min(32767, L));
+ R := max(-32768, min(32767, R));
+ pMem[i + 0] := L;
+ pMem[i + 1] := R;
+ inc(i, 2);
+ end;
+ except
+ result := -1;
end;
+ s.Free;
+ Finalize(pCpy);
end;
procedure usage;
Writeln('\97á\81Feffect.wav 100 2000');
end;
+function effectwav(const sp: SpParam): integer;
+begin
+ if sp.channels = 1 then
+ begin
+ Writeln('\83X\83e\83\8c\83I\83t\83@\83C\83\8b\82É\82µ\82Ä\82\82¾\82³\82¢');
+ result := -1;
+ end;
+ if sp.bitsPerSample = 8 then
+ result := effect8BitWav(sp)
+ else
+ result := effect16BitWav(sp);
+end;
+
end.