OSDN Git Service

完成
[sample-delphi/sample-DELPHI.git] / effect.pas
index 7e8ad42..14b6b32 100644 (file)
@@ -2,48 +2,89 @@ unit effect;
 
 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;
@@ -52,4 +93,17 @@ begin
   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.