OSDN Git Service

chapter 9-2 chapter_9-2
authoryamat0jp <yamat0jp@yahoo.co.jp>
Sun, 13 May 2018 09:52:58 +0000 (18:52 +0900)
committeryamat0jp <yamat0jp@yahoo.co.jp>
Sun, 13 May 2018 09:52:58 +0000 (18:52 +0900)
とりあえずできた

spWav.pas
wav_proj.dpr
wav_proj.dproj
wav_proj.dproj.local

index b465e72..878e362 100644 (file)
--- a/spWav.pas
+++ b/spWav.pas
@@ -41,7 +41,9 @@ type
     channels: Byte;
     bytesPerSec: LongWord;
     posOfData: LongInt;
-    startpos, endpos: LongInt;
+    startpos: LongInt;
+    endpos: LongInt;
+    cycleuSec: LongInt;
   end;
 
 const
index 026a8fe..1d65e61 100644 (file)
@@ -6,87 +6,100 @@ program wav_proj;
 uses
   System.SysUtils,
   System.Classes,
-  wav in 'wav.pas',
-  WriteHeader in 'WriteHeader.pas',
   spWav in 'spWav.pas';
 
-function checkRange(var sp: SpParam): integer;
-begin
-  result := 0;
-  if sp.startpos * sp.bytesPerSec > sp.sizeOfData then
-  begin
-    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; const sp: SpParam): integer;
+function wavDataWrite(fpOut: TFileStream; const sp: SpParam): integer;
 var
-  Buffer: array of ShortInt;
+  i: integer;
+  s, tempsamplePerCycle, deltaAdd, curLevel: Single;
+  curSampling, samplePerCycle: LongInt;
+  c: array [0..1] of ShortInt;
 begin
-  result := 0;
-  fpIn.Position := sp.posOfData;
-  try
-    GetMem(Pointer(Buffer), sp.sizeOfData);
-  except
-    Writeln('\83\81\83\82\83\8a\82ª\8am\95Û\82Å\82«\82Ü\82¹\82ñ');
-    result := -1;
-  end;
-  if fpIn.Read(Pointer(Buffer)^, sp.sizeOfData) = -1 then
+  tempsamplePerCycle:=sp.samplePerSec*sp.cycleuSec div 1000000;
+  samplePerCycle:=Trunc(tempsamplePerCycle);
+  if samplePerCycle <= 0 then
   begin
-    Writeln('\93Ç\82Ý\8d\9e\82Ý\82É\8e¸\94s');
-    result := -1;
+    Writeln('\8eü\94g\90\94\82ª\8d\82\82·\82¬');
+    result:=-1;
+    Exit;
   end;
-  if fpOut.Write(Pointer(Buffer)^, sp.sizeOfData) = -1 then
+  deltaAdd:=65535/samplePerCycle;
+  curLevel:=0;
+  curSampling:=0;
+  i:=0;
+  s:=sp.sizeOfData/SizeOf(@c);
+  while i < s do
   begin
-    Writeln('\8f\91\82«\8d\9e\82Ý\82É\8e¸\94s');
-    result := -1;
+    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;
-  FreeMem(Pointer(Buffer));
 end;
 
-function wavWrite(inFile, outFile: PChar; var sp: SpParam): integer;
+function wavWrite(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);
-    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, sp) = -1 then
-      raise EWriteError.Create('\83G\83\89\81[\94­\90¶');
+    fpOut.WriteBuffer(wHdr, SizeOf(WrSWaveFileHeader));
+    if wavDataWrite(fpOut, sp) = -1 then
+      raise EWriteError.Create('');
   except
     on EFOpenError do
-      Writeln(inFile, '\82ð\83I\81[\83v\83\93\82Å\82«\82Ü\82¹\82ñ');
-    on EFOpenError do
-      fpIn.Free;
-    else
-
     begin
-      fpIn.Free;
-      fpOut.Free;
+      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;
-    result := -1;
-    Exit;
   end;
-  result := 0;
+  fpOut.Free;
 end;
 
 procedure usage;
 begin
-  Writeln('\88ø\90\94<\93ü\97Í\83t\83@\83C\83\8b\96¼><\8fo\97Í\83t\83@\83C\83\8b\96¼><\91¬\93x\94{\97¦>');
+  Writeln('\82Ì\82±\82¬\82è\94g');
+  Writeln('\97á\81Feffect.wav 100 2000');
+end;
+
+procedure setupHeader(var wHdr: WrSWaveFileHeader; var sp: SpParam);
+var
+  bytes: Byte;
+begin
+  wHdr.hdrRiff := STR_RIFF;
+  wHdr.sizeOfFile := sp.sizeOfData + SizeOf(WrSWaveFileHeader) - 8;
+  wHdr.hdrWave := STR_WAVE;
+  wHdr.hdrFmt := STR_fmt;
+  wHdr.sizeOfFmt := SizeOf(tWaveFormatPcm);
+  wHdr.stWaveFormat.formatTag := 1;
+  wHdr.stWaveFormat.channels := sp.channels;
+  wHdr.stWaveFormat.sampleParSec := sp.samplePerSec;
+  bytes := sp.bitsPerSample div 8;
+  wHdr.stWaveFormat.bytesPerSec := bytes * sp.channels * sp.samplePerSec;
+  wHdr.stWaveFormat.blockAlign := bytes * sp.channels;
+  wHdr.stWaveFormat.bitsPerSample := sp.bitsPerSample;
+  wHdr.hdrData := STR_data;
+  wHdr.sizeOfData := sp.sizeOfData;
 end;
 
 var
   sp: SpParam;
+  totalLength: integer;
+  hdrHeader: WrSWaveFileHeader;
 
 begin
   try
@@ -96,10 +109,15 @@ begin
       usage;
       Exit;
     end;
-    if wavHdrRead(PChar(ParamStr(1)), sp) = -1 then
-      Exit;
-    sp.samplePerSec := StrToInt(ParamStr(3)) * sp.samplePerSec;
-    if wavWrite(PChar(ParamStr(1)), PChar(ParamStr(2)), sp) = -1 then
+    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
       Exit;
     Writeln('\8a®\97¹');
   except
index b7b391b..2f7214e 100644 (file)
         <DCC_RemoteDebug>true</DCC_RemoteDebug>
     </PropertyGroup>
     <PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
-        <Debugger_RunParams>toujyo.wav effect.wav 2</Debugger_RunParams>
+        <Debugger_RunParams>effect.wav 100 2000</Debugger_RunParams>
         <DCC_RemoteDebug>false</DCC_RemoteDebug>
     </PropertyGroup>
     <PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
         <DelphiCompile Include="$(MainSource)">
             <MainSource>MainSource</MainSource>
         </DelphiCompile>
-        <DCCReference Include="wav.pas"/>
-        <DCCReference Include="WriteHeader.pas"/>
         <DCCReference Include="spWav.pas"/>
         <BuildConfiguration Include="Release">
             <Key>Cfg_2</Key>
index ca04ac1..3381825 100644 (file)
@@ -9,23 +9,23 @@
     <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.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:16.000.218,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.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.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/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.809,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.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.244,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.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.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>
     <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.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:23:22.000.440,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.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: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>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\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>
     <Transaction>2018/05/13 12:45:57.000.431,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\spWav.pas</Transaction>
   </Transactions>
 </BorlandProject>