OSDN Git Service

chapter 14-7
authoryamat0jp <yamat0jp@yahoo.co.jp>
Mon, 14 May 2018 13:34:11 +0000 (22:34 +0900)
committeryamat0jp <yamat0jp@yahoo.co.jp>
Mon, 14 May 2018 13:34:11 +0000 (22:34 +0900)
effect.pas
spWav.pas
wav_proj.dpr
wav_proj.dproj
wav_proj.dproj.local
wav_proj.identcache

index 85113cb..b538904 100644 (file)
@@ -2,48 +2,76 @@ 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;
+  pMem, pCpy: array of Byte;
+  s: TMemoryStream;
+  L, R, DuetL, DuetR: SmallInt;
 begin
-  i := sp.posOfData div SizeOf(Byte);
-  j := sp.sizeOfData div SizeOf(Byte) - 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;
+    for i := delayStart to sp.sizeOfData div (sp.bitsPerSample *
+      SizeOf(Byte)) 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);
+      pMem[i+0]:=L;
+      pMem[i+1]:=R;
+    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: array of SmallInt;
+  i, delayStart: integer;
+  pMem, pCpy: array of SmallInt;
+  s: TMemoryStream;
+  L, R, DuetL, DuetR: SmallInt;
 begin
-  pInMem := InInMem.Memory;
-  pOutMem := InOutMem.Memory;
-  i := sp.posOfData div SizeOf(SmallInt);
-  j := sp.sizeOfData div SizeOf(SmallInt) - 1;
-  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;
+    for i := delayStart to sp.sizeOfData div (sp.bitsPerSample *
+      SizeOf(SmallInt)) 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 := SmallInt(max(-32768, min(32767, L)));
+      R := SmallInt(max(-32768, min(32767, R)));
+      pMem[i + 0] := L;
+      pMem[i + 1] := R;
+    end;
+  except
+    result := -1;
   end;
 end;
 
@@ -58,12 +86,12 @@ 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;
+    result := -1;
   end;
   if sp.bitsPerSample = 8 then
-    result:=effect8bitWav(sp)
+    result := effect8BitWav(sp)
   else
-    result:=effect16bitWav(sp);
+    result := effect16BitWav(sp);
 end;
 
 end.
index 878e362..bb7eb79 100644 (file)
--- a/spWav.pas
+++ b/spWav.pas
@@ -44,6 +44,8 @@ type
     startpos: LongInt;
     endpos: LongInt;
     cycleuSec: LongInt;
+    pWav: Pointer;
+    cyclicSec: Single;
   end;
 
 const
index 9051482..4f52bda 100644 (file)
@@ -9,13 +9,24 @@ uses
   MMSystem,
   spWav in 'spWav.pas',
   wav in 'wav.pas',
-  selectFile in 'selectFile.pas';
+  selectFile in 'selectFile.pas',
+  effect in 'effect.pas';
 
 var
   sp: SpParam;
   pMem: TMemoryStream;
   fileName: string;
-  hdrHeader: WrSWaveFileHeader;
+
+function getPara(var sp: SpParam): integer;
+var
+  i: integer;
+begin
+  sp.pWav:=pMem.Memory;
+  Writeln('\82Q\8fd\8f¥\82Ì\8e\9e\8aÔ\8d·');
+  Readln(i);
+  sp.cyclicSec:=i;
+  result:=0;
+end;
 
 begin
   try
@@ -25,10 +36,19 @@ begin
       Exit;
     if readWav(ParamStr(1), pMem) = false then
       Exit;
-    PlaySound(pMem.Memory, 0, SND_ASYNC or SND_NODEFAULT or SND_MEMORY);
-    Readln;
-    PlaySound(nil, 0, SND_PURGE);
+    if getPara(sp) = -1 then
+    begin
+      pMem.Free;
+      Exit;
+    end;
+    if effectWav(sp) = 0 then
+    begin
+      PlaySound(pMem.Memory, 0, SND_ASYNC or SND_NODEFAULT or SND_MEMORY);
+      Readln;
+      PlaySound(nil, 0, SND_PURGE);
+    end;
     pMem.Free;
+    Finalize(sp.pWav);
   except
     on E: Exception do
       Writeln(E.ClassName, ': ', E.Message);
index 8ca95eb..9a990e9 100644 (file)
         <DCCReference Include="spWav.pas"/>
         <DCCReference Include="wav.pas"/>
         <DCCReference Include="selectFile.pas"/>
+        <DCCReference Include="effect.pas"/>
         <BuildConfiguration Include="Release">
             <Key>Cfg_2</Key>
             <CfgParent>Base</CfgParent>
index e05b710..04ed60a 100644 (file)
     <Transaction>2017/10/19 20:49:15.000.988,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
     <Transaction>2017/10/19 20:49:16.000.218,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <Transaction>2017/10/19 20:49:16.000.125,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
-    <Transaction>2017/10/19 20:49:45.000.816,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
     <Transaction>2017/10/19 20:49:45.000.913,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
+    <Transaction>2017/10/19 20:49:45.000.816,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
     <Transaction>2017/10/19 20:50:18.000.999,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
     <Transaction>2017/10/19 20:50:19.000.049,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
+    <Transaction>2017/10/19 21:37:00.000.271,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
     <Transaction>2017/10/19 21:37:00.000.652,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <Transaction>2017/10/19 21:37:00.000.365,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
-    <Transaction>2017/10/19 21:37:00.000.271,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
     <Transaction>2017/10/28 22:58:31.000.296,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
     <Transaction>2017/10/29 14:44:00.000.024,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
-    <Transaction>2017/10/29 16:13:37.000.174,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
     <Transaction>2017/10/29 16:13:37.000.037,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
+    <Transaction>2017/10/29 16:13:37.000.174,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
     <Transaction>2017/10/29 16:13:37.000.809,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
-    <Transaction>2017/10/29 16:55:16.000.343,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <Transaction>2017/10/29 16:55:16.000.109,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
+    <Transaction>2017/10/29 16:55:16.000.343,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <Transaction>2017/10/29 16:55:16.000.244,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
     <Transaction>2017/10/30 15:04:38.000.106,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
     <Transaction>2017/11/01 16:00:52.000.956,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
@@ -34,8 +34,8 @@
     <Transaction>2017/11/01 18:12:24.000.771,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
     <Transaction>2017/11/01 18:21:25.000.947,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
     <Transaction>2017/11/01 18:21:26.000.254,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
-    <Transaction>2017/11/01 18:23:22.000.193,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\FormUnit1.pas</Transaction>
     <Transaction>2017/11/01 18:23:22.000.344,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
+    <Transaction>2017/11/01 18:23:22.000.193,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\FormUnit1.pas</Transaction>
     <Transaction>2017/11/01 18:23:22.000.440,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
     <Transaction>2017/11/01 18:33:21.000.133,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <Transaction>2017/11/01 18:33:21.000.032,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
     <Transaction>2018/01/01 12:40:34.000.125,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
     <Transaction>2018/01/01 12:40:55.000.044,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
     <Transaction>2018/05/07 18:00:45.000.726,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
-    <Transaction>2018/05/07 18:01:10.000.795,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\wav.pas</Transaction>
-    <Transaction>2018/05/07 18:01:39.000.274,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Project1.dproj=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\wav_proj.dproj</Transaction>
+    <Transaction>2018/05/07 18:01:10.000.795,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\wav.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
+    <Transaction>2018/05/07 18:01:39.000.274,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\wav_proj.dproj=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Project1.dproj</Transaction>
     <Transaction>2018/05/07 21:20:21.000.796,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas</Transaction>
-    <Transaction>2018/05/07 21:20:27.000.646,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\spWave.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas</Transaction>
+    <Transaction>2018/05/07 21:20:27.000.646,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\spWave.pas</Transaction>
     <Transaction>2018/05/09 21:56:39.000.226,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas</Transaction>
-    <Transaction>2018/05/09 21:56:54.000.027,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\WriteHeader.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas</Transaction>
+    <Transaction>2018/05/09 21:56:54.000.027,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\WriteHeader.pas</Transaction>
     <Transaction>2018/05/13 12:45:57.000.431,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\spWav.pas</Transaction>
     <Transaction>2018/05/13 21:58:37.000.377,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas</Transaction>
-    <Transaction>2018/05/13 21:58:48.000.578,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\effect.pas</Transaction>
+    <Transaction>2018/05/13 21:58:48.000.578,C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\effect.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas</Transaction>
     <Transaction>2018/05/13 22:29:03.000.282,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\WriteHeader.pas</Transaction>
     <Transaction>2018/05/13 22:46:16.000.228,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\wav.pas</Transaction>
     <Transaction>2018/05/14 20:20:05.000.202,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\selectFile.pas</Transaction>
+    <Transaction>2018/05/14 21:42:27.000.589,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\effect.pas</Transaction>
   </Transactions>
 </BorlandProject>
index 4684080..5c1e072 100644 (file)
Binary files a/wav_proj.identcache and b/wav_proj.identcache differ