OSDN Git Service

chapter6
authoryamat0jp <yamat0jp@yahoo.co.jp>
Sun, 13 May 2018 01:37:39 +0000 (10:37 +0900)
committeryamat0jp <yamat0jp@yahoo.co.jp>
Sun, 13 May 2018 01:37:39 +0000 (10:37 +0900)
大分できてきました
chapter3以降で無視した単元があります

WriteHeader.pas
spWav.pas
wav.pas
wav_proj.dpr
wav_proj.dproj
wav_proj.dproj.local

index 97b3b1b..f222e2b 100644 (file)
@@ -5,33 +5,31 @@ interface
 uses System.Classes;
 
 {$INCLUDE spWav}
-function waveHeaderWrite(fp: TFileStream; sizeOfData: LongInt; ch: Byte;
-  sampRate: LongWord; sampBits: Byte): integer;
+function waveHeaderWrite(fp: TFileStream; sp: SpParam): integer;
 
 implementation
 
-function waveHeaderWrite(fp: TFileStream; sizeOfData: LongInt; ch: Byte;
-  sampRate: LongWord; sampBits: Byte): integer;
+function waveHeaderWrite(fp: TFileStream; sp: SpParam): integer;
 var
   bytes: Byte;
   wrWavHdr: WrSWaveFileHeader;
   s: tWaveFormatPCM;
 begin
   wrWavHdr.hdrRiff := STR_RIFF;
-  wrWavHdr.sizeOfFile := sizeOfData + SizeOf(WrSWaveFileHeader) - 8;
+  wrWavHdr.sizeOfFile := sp.sizeOfData + SizeOf(WrSWaveFileHeader) - 8;
   wrWavHdr.hdrWave := STR_WAVE;
   wrWavHdr.hdrFmt := STR_fmt;
   wrWavHdr.sizeOfFmt := SizeOf(tWaveFormatPCM);
   s.formatTag := 1;
-  s.channels := ch;
-  s.sampleParSec := sampRate;
-  bytes := sampBits div 8;
-  s.bytesPerSec := bytes * ch * sampRate;
-  s.blockAlign := bytes * ch;
-  s.bitsPerSample := sampBits;
+  s.channels := sp.channels;
+  s.sampleParSec := sp.samplePerSec;
+  bytes := sp.bitsPerSample div 8;
+  s.bytesPerSec := bytes * sp.channels * sp.samplePerSec;
+  s.blockAlign := bytes * sp.channels;
+  s.bitsPerSample := sp.bitsPerSample;
   wrWavHdr.stWaveFormat := s;
   wrWavHdr.hdrData := STR_data;
-  wrWavHdr.sizeOfData := sizeOfData;
+  wrWavHdr.sizeOfData := sp.sizeOfData;
   fp.WriteBuffer(wrWavHdr, SizeOf(WrSWaveFileHeader));
   result := fp.Position;
 end;
index f0410cd..c52222b 100644 (file)
--- a/spWav.pas
+++ b/spWav.pas
@@ -31,6 +31,16 @@ type
     sizeOfData: LongWord;
   end;
 
+  SpParam = record
+    samplePerSec: LongWord;
+    bitsPerSample: Byte;
+    sizeOfData: LongWord;
+    channels: Byte;
+    bytesPerSec: LongWord;
+    posOfData: LongInt;
+    startpos, endpos: LongInt;
+  end;
+
 const
   STR_RIFF = 'RIFF';
   STR_WAVE = 'WAVE';
diff --git a/wav.pas b/wav.pas
index e4827d3..35abac0 100644 (file)
--- a/wav.pas
+++ b/wav.pas
@@ -7,8 +7,7 @@ uses
 
 {$INCLUDE spWav}
 function readFmtChank(fp: TFileStream; out waveFmtPcm: tWaveFormatPcm): integer;
-function wavHdrRead(wavefile: PChar; var sampRate: LongWord; var sampBits: Byte;
-  var posOfData, sizeOfData: LongInt): integer;
+function wavHdrRead(wavefile: PChar; var sp: SpParam): integer;
 
 implementation
 
@@ -50,8 +49,7 @@ begin
   end;
 end;
 
-function wavHdrRead(wavefile: PChar; var sampRate: LongWord; var sampBits: Byte;
-  var posOfData, sizeOfData: LongInt): integer;
+function wavHdrRead(wavefile: PChar; var sp: SpParam): integer;
 var
   waveFileHeader: SWaveFileHeader;
   waveFmtPcm: tWaveFormatPcm;
@@ -113,15 +111,15 @@ begin
         fp.Free;
         Exit;
       end;
-      sampRate := waveFmtPcm.sampleParSec;
-      sampBits := waveFmtPcm.bytesPerSec;
+      sp.samplePerSec := waveFmtPcm.sampleParSec;
+      sp.bytesPerSec := waveFmtPcm.bytesPerSec;
       fp.Seek(fPos + len, soFromBeginning);
     end
     else if CompareStr(chank.hdrFmtData, STR_data) = 0 then
     begin
-      sizeOfData := chank.sizeOfFmtData;
-      Writeln('data\82Ì\92·\82³:', sizeOfData, '[bytes]');
-      posOfData := fp.Position;
+      sp.sizeOfData := chank.sizeOfFmtData;
+      Writeln('data\82Ì\92·\82³:', sp.sizeOfData, '[bytes]');
+      sp.posOfData := fp.Position;
       fp.Seek(fPos + len, soFromBeginning);
       break;
     end
@@ -130,7 +128,7 @@ begin
       len := chank.sizeOfFmtData;
       Writeln(chank.hdrFmtData, '\82Ì\92·\82³[bytes]', len);
       fPos := fp.Position;
-      fp.Seek(len,soFromCurrent);
+      fp.Seek(len, soFromCurrent);
     end;
   end;
   fp.Free;
index efda255..a93819b 100644 (file)
@@ -9,81 +9,45 @@ uses
   wav in 'wav.pas',
   WriteHeader in 'WriteHeader.pas';
 
-function effect8BitWav(fpIn, fpOut: TFileStream; sizeOfData: LongInt): integer;
-var
-  i, j: integer;
-  s: Single;
-  c: array [0 .. 1] of Byte;
-  mix: Byte;
+function cut(fpIn, fpOut: TFileStream; sp: SpParam): integer;
 begin
-  result := 0;
-  i := 0;
-  s := sizeOfData / SizeOf(@c);
-  while i < s do
-  begin
-    try
-      fpIn.ReadBuffer(c, SizeOf(@c));
-      j := (c[0] + c[1]) div 2;
-      mix := j;
-      fpOut.WriteBuffer(mix, SizeOf(@mix));
-    except
-      result := -1;
-      break;
-    end;
-    inc(i);
-  end;
+
 end;
 
-function effect16BitWav(fpIn, fpOut: TFileStream; sizeOfData: LongInt): integer;
-var
-  i, j: integer;
-  s: Single;
-  c: array [0 .. 1] of ShortInt;
-  mix: ShortInt;
+function checkRange(var sp: SpParam): integer;
 begin
   result := 0;
-  i := 0;
-  s := sizeOfData / SizeOf(@c);
-  while i < s do
+  if sp.startpos * sp.bytesPerSec > sp.sizeOfData then
   begin
-    try
-      fpIn.ReadBuffer(c, SizeOf(@c));
-      j := (c[0] + c[1]) div 2;
-      mix := j;
-      fpOut.WriteBuffer(mix, SizeOf(@mix));
-    except
-      result := -1;
-      break;
-    end;
-    inc(i);
+    Writeln('\8aJ\8en\88Ê\92u\82ª\83t\83@\83C\83\8b\83T\83C\83Y\82ð\92´\82¦\82Ä\82¢\82Ü\82·');
+    result := -1;
+  end
+  else if (sp.endpos + 1) * sp.bytesPerSec > sp.sizeOfData then
+  begin
+    Writeln('\8fI\97¹\88Ê\92u\82ª\83t\83@\83C\83\8b\83T\83C\83Y\82ð\92´\82¦\82Ä\82¢\82Ü\82·');
+    Writeln('\8fI\97¹\82ð\83t\83@\83C\83\8b\82Ì\8dÅ\8cã\82É\92²\90®\82µ\82Ü\82µ\82½');
+    sp.endpos := (sp.sizeOfData div sp.bytesPerSec) - 1;
   end;
 end;
 
-function wavDataWrite(fpIn, fpOut: TFileStream; posOfData, sizeOfData: LongInt;
-  bytesPerSingleCh: SmallInt): integer;
+function wavDataWrite(fpIn, fpOut: TFileStream; sp: SpParam): integer;
 begin
-  fpIn.Position := posOfData;
-  fpOut.Position := posOfData;
-  if bytesPerSingleCh = 1 then
-    result := effect8BitWav(fpIn, fpOut, sizeOfData)
-  else
-    result := effect16BitWav(fpIn, fpOut, sizeOfData);
+  fpIn.Position := sp.posOfData;
+ // fpOut.Position := sp.posOfData;
+  result:=cut(fpIn,fpOut,sp);
 end;
 
-function wavWrite(inFile, outFile: PChar; sampRate: LongWord; sampBits: Byte;
-  posOfData, sizeOfData: LongInt): integer;
+function wavWrite(inFile, outFile: PChar; sp: SpParam): integer;
 var
-  bytesPerSingleCh: Word;
   fpIn, fpOut: TFileStream;
 begin
   try
     fpIn := TFileStream.Create(inFile, fmOpenRead);
     fpOut := TFileStream.Create(outFile, fmCreate);
-    bytesPerSingleCh := sampBits div 8;
-    if waveHeaderWrite(fpOut, sizeOfData div 2, WAV_MONAURAL, sampRate, sampBits) <> 44 then
+    sp.sizeOfData := (sp.endpos - sp.startpos + 1) * sp.bytesPerSec;
+    if waveHeaderWrite(fpOut, sp) > 44 then
       raise EWriteError.Create('\83w\83b\83_\82ð\8f\91\82«\8d\9e\82ß\82Ü\82¹\82ñ');
-    if wavDataWrite(fpIn, fpOut, posOfData, sizeOfData, bytesPerSingleCh) = -1
-    then
+    if wavDataWrite(fpIn, fpOut, sp) = -1 then
       raise EWriteError.Create('\83G\83\89\81[\94­\90¶');
   except
     on EFOpenError do
@@ -97,21 +61,28 @@ begin
       fpOut.Free;
     end;
     result := -1;
+    Exit;
   end;
   result := 0;
 end;
 
 var
-  sampRate: LongWord;
-  sampBits: Byte;
-  posOfData, sizeOfData: LongInt;
+  sp: SpParam;
 
 begin
   try
     { TODO -oUser -cConsole \83\81\83C\83\93 : \82±\82±\82É\83R\81[\83h\82ð\8bL\8fq\82µ\82Ä\82­\82¾\82³\82¢ }
-    wavHdrRead(PChar(ParamStr(1)), sampRate, sampBits, posOfData, sizeOfData);
-    wavWrite(PChar(ParamStr(1)), PChar(ParamStr(2)), sampRate, sampBits,
-      posOfData, sizeOfData);
+    sp.startpos := LongInt(ParamStr(3));
+    sp.endpos := LongInt(ParamStr(4));
+    if sp.startpos > sp.endpos then
+    begin
+      Writeln('\8aJ\8en\95b\82Í\8fI\97¹\95b\82ð\92´\82¦\82Ä\82Í\82È\82è\82Ü\82¹\82ñ');
+      Exit;
+    end;
+    if wavHdrRead(PChar(ParamStr(1)), sp) = -1 then
+      Exit;
+    if wavWrite(PChar(ParamStr(1)), PChar(ParamStr(2)), sp) = -1 then
+      Exit;
     Writeln('\8a®\97¹');
   except
     on E: Exception do
index a426c71..bfacd9b 100644 (file)
         <DCC_RemoteDebug>true</DCC_RemoteDebug>
     </PropertyGroup>
     <PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
-        <Debugger_RunParams>toujyo.wav effect.wav</Debugger_RunParams>
+        <Debugger_RunParams>toujyo.wav effect.wav 5 10</Debugger_RunParams>
         <DCC_RemoteDebug>false</DCC_RemoteDebug>
     </PropertyGroup>
     <PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
index 6b8a0be..74aa953 100644 (file)
@@ -11,8 +11,8 @@
     <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: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/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.809,=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:13:37.000.174,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.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/10/29 16:55:16.000.109,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.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>
     <Transaction>2017/11/01 16:00:53.000.058,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
@@ -35,8 +35,8 @@
     <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.440,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.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.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:39.000.795,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.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\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 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 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\Unit1.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\spWave.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/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\Unit1.pas=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\WriteHeader.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>
   </Transactions>
 </BorlandProject>