OSDN Git Service

chapter 13
authoryamat0jp <yamat0jp@yahoo.co.jp>
Sun, 13 May 2018 13:38:37 +0000 (22:38 +0900)
committeryamat0jp <yamat0jp@yahoo.co.jp>
Sun, 13 May 2018 13:38:37 +0000 (22:38 +0900)
WriteHeader.pas
effect.pas [new file with mode: 0644]
wav_proj.dpr
wav_proj.dproj
wav_proj.dproj.local

index 4e6dd1b..c97f8fa 100644 (file)
@@ -2,12 +2,16 @@ unit WriteHeader;
 
 interface
 
-uses System.Classes, spWav;
+uses System.Classes, System.SysUtils, spWav;
 
 function waveHeaderWrite(fp: TFileStream; const sp: SpParam): integer;
+function wavWrite(inFile, outFile: PChar; const wHdr: WrSWaveFileHeader;
+  var sp: SpParam): integer;
 
 implementation
 
+uses effect;
+
 function waveHeaderWrite(fp: TFileStream; const sp: SpParam): integer;
 var
   bytes: Byte;
@@ -33,4 +37,61 @@ begin
   result := fp.Position;
 end;
 
+function wavDataWrite(fpIn, fpOut: TFileStream; const sp: SpParam): integer;
+var
+  pInMem, pOutMem: TMemoryStream;
+begin
+  result := 0;
+  fpIn.Position := sp.sizeOfData;
+  pInMem := TMemoryStream.Create;
+  pOutMem := TMemoryStream.Create;
+  try
+    if pInMem.CopyFrom(fpIn, sp.sizeOfData) = -1 then
+    begin
+      result := -1;
+      Exit;
+    end;
+    if sp.bitsPerSample = 8 then
+      result := effect8BitWav(pInMem, pOutMem, sp)
+    else
+      result := effect16BitWav(pInMem, pOutMem, sp);
+    if fpOut.CopyFrom(pOutMem, sp.sizeOfData) = 0 then
+    begin
+      result := -1;
+      Writeln('\8f\91\82«\8d\9e\82Ý\8e¸\94s');
+    end;
+  finally
+    pInMem.Free;
+    pOutMem.Free;
+  end;
+end;
+
+function wavWrite(inFile, outFile: PChar; const wHdr: WrSWaveFileHeader;
+  var sp: SpParam): integer;
+var
+  fpIn, fpOut: TFileStream;
+begin
+  result := 0;
+  try
+    fpIn:=TFileStream.Create(inFile,fmOpenRead);
+    fpOut := TFileStream.Create(outFile, fmCreate);
+    fpOut.WriteBuffer(wHdr, SizeOf(WrSWaveFileHeader));
+    if wavDataWrite(fpIn, fpOut, sp) = -1 then
+      raise EWriteError.Create('');
+  except
+    on EFOpenError do
+    begin
+      Writeln(outFile, '\82ð\83I\81[\83v\83\93\82Å\82«\82Ü\82¹\82ñ');
+      result := -1;
+    end;
+    on EWriteError do
+    begin
+      Writeln('\83w\83b\83_\82ð\8f\91\82«\8d\9e\82ß\82Ü\82¹\82ñ');
+      result := -1;
+    end;
+  end;
+  fpIn.Free;
+  fpOut.Free;
+end;
+
 end.
diff --git a/effect.pas b/effect.pas
new file mode 100644 (file)
index 0000000..774cf79
--- /dev/null
@@ -0,0 +1,52 @@
+unit effect;
+
+interface
+
+uses System.Classes, System.SysUtils, spWav;
+
+function effect8BitWav(InInMem, InOutMem: TMemoryStream; sp: SpParam): integer;
+function effect16BitWav(InInMem, InOutMem: TMemoryStream; sp: SpParam): integer;
+procedure usage;
+
+implementation
+
+function effect8BitWav(InInMem, InOutMem: TMemoryStream; sp: SpParam): integer;
+var
+  i, j: Integer;
+  pInMem, pOutMem: TBytes;
+begin
+  j:=sp.sizeOfData-2;
+  pInMem:=InInMem.Memory;
+  pOutMem:=InOutMem.Memory;
+  for i := 0 to sp.sizeOfData div 2 do
+  begin
+    pOutMem[2*i]:=pInMem[j];
+    pOutMem[2*i+1]:=pInMem[j+1];
+    dec(j,2);
+  end;
+end;
+
+function effect16BitWav(InInMem, InOutMem: TMemoryStream; sp: SpParam): integer;
+var
+  i, j, k: Integer;
+  pInMem, pOutMem: TBytes;
+begin
+  pInMem:=InInMem.Memory;
+  pOutMem:=InOutMem.Memory;
+  k:=sp.sizeOfData div 2;
+  while i < k do
+  begin
+    pOutMem[i]:=pInMem[j];
+    pOutMem[i+1]:=pInMem[j+1];
+    inc(i,2);
+    dec(j,2);
+  end;
+end;
+
+procedure usage;
+begin
+  Writeln('\82Ì\82±\82¬\82è\94g');
+  Writeln('\97á\81Feffect.wav 100 2000');
+end;
+
+end.
index 1d65e61..e42794d 100644 (file)
@@ -6,75 +6,9 @@ program wav_proj;
 uses
   System.SysUtils,
   System.Classes,
-  spWav in 'spWav.pas';
-
-function wavDataWrite(fpOut: TFileStream; const sp: SpParam): integer;
-var
-  i: integer;
-  s, tempsamplePerCycle, deltaAdd, curLevel: Single;
-  curSampling, samplePerCycle: LongInt;
-  c: array [0..1] of ShortInt;
-begin
-  tempsamplePerCycle:=sp.samplePerSec*sp.cycleuSec div 1000000;
-  samplePerCycle:=Trunc(tempsamplePerCycle);
-  if samplePerCycle <= 0 then
-  begin
-    Writeln('\8eü\94g\90\94\82ª\8d\82\82·\82¬');
-    result:=-1;
-    Exit;
-  end;
-  deltaAdd:=65535/samplePerCycle;
-  curLevel:=0;
-  curSampling:=0;
-  i:=0;
-  s:=sp.sizeOfData/SizeOf(@c);
-  while i < s do
-  begin
-    inc(i);
-    c[0]:=ShortInt(Trunc(curLevel-32788));
-    c[1]:=c[0];
-    fpOut.WriteBuffer(c,SizeOf(@c));
-    curLevel:=curLevel+deltaAdd;
-    inc(curSampling);
-    if curSampling > samplePerCycle then
-    begin
-      curLevel:=0;
-      curSampling:=0;
-    end;
-  end;
-end;
-
-function wavWrite(outFile: PChar; const wHdr: WrSWaveFileHeader;
-  var sp: SpParam): integer;
-var
-  fpIn, fpOut: TFileStream;
-begin
-  result := 0;
-  try
-    fpOut := TFileStream.Create(outFile, fmCreate);
-    fpOut.WriteBuffer(wHdr, SizeOf(WrSWaveFileHeader));
-    if wavDataWrite(fpOut, sp) = -1 then
-      raise EWriteError.Create('');
-  except
-    on EFOpenError do
-    begin
-      Writeln(outFile, '\82ð\83I\81[\83v\83\93\82Å\82«\82Ü\82¹\82ñ');
-      result := -1;
-    end;
-    on EWriteError do
-    begin
-      Writeln('\83w\83b\83_\82ð\8f\91\82«\8d\9e\82ß\82Ü\82¹\82ñ');
-      result := -1;
-    end;
-  end;
-  fpOut.Free;
-end;
-
-procedure usage;
-begin
-  Writeln('\82Ì\82±\82¬\82è\94g');
-  Writeln('\97á\81Feffect.wav 100 2000');
-end;
+  spWav in 'spWav.pas',
+  effect in 'effect.pas',
+  WriteHeader in 'WriteHeader.pas';
 
 procedure setupHeader(var wHdr: WrSWaveFileHeader; var sp: SpParam);
 var
@@ -109,15 +43,7 @@ begin
       usage;
       Exit;
     end;
-    totalLength := StrToInt(ParamStr(2));
-    sp.cycleuSec := StrToInt(ParamStr(3));
-    sp.channels := WAV_STEREO;
-    sp.samplePerSec := 44100;
-    sp.bitsPerSample := 16;
-    sp.sizeOfData := sp.bitsPerSample * sp.channels * sp.samplePerSec *
-      totalLength div 8;
-    setupHeader(hdrHeader, sp);
-    if wavWrite(PChar(ParamStr(1)), hdrHeader, sp) = -1 then
+    if wavWrite(PChar(ParamStr(1)), PChar(ParamStr(2)), hdrHeader, sp) = -1 then
       Exit;
     Writeln('\8a®\97¹');
   except
index 2f7214e..a20da81 100644 (file)
             <MainSource>MainSource</MainSource>
         </DelphiCompile>
         <DCCReference Include="spWav.pas"/>
+        <DCCReference Include="effect.pas"/>
+        <DCCReference Include="WriteHeader.pas"/>
         <BuildConfiguration Include="Release">
             <Key>Cfg_2</Key>
             <CfgParent>Base</CfgParent>
index 3381825..795a4ee 100644 (file)
@@ -9,19 +9,19 @@
     <Transaction>2017/10/19 20:48:10.000.837,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
     <Transaction>2017/10/19 20:48:11.000.893,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <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.125,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.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.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.652,=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.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.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.037,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.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.244,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
     <Transaction>2017/10/29 16:55:16.000.343,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.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: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: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>2017/11/01 18:33:21.000.133,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
     <Transaction>2017/11/01 18:33:39.000.795,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
     <Transaction>2017/11/01 19:08:03.000.193,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
     <Transaction>2017/11/30 19:11:41.000.772,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.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.377,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas</Transaction>
+    <Transaction>2018/05/13 21:58:48.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.282,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\WriteHeader.pas</Transaction>
   </Transactions>
 </BorlandProject>