OSDN Git Service

Create README.md
[sample-delphi/sample-DELPHI.git] / wav_proj.dpr
index 17bfa24..1d65e61 100644 (file)
@@ -6,116 +6,119 @@ program wav_proj;
 uses
   System.SysUtils,
   System.Classes,
-  wav in 'wav.pas',
-  WriteHeader in 'WriteHeader.pas';
+  spWav in 'spWav.pas';
 
-function effect8BitWav(fpIn, fpOut: TFileStream; sizeOfData: Word): integer;
+function wavDataWrite(fpOut: TFileStream; const sp: SpParam): integer;
 var
   i: integer;
-  s: Single;
-  c: array [0 .. 1] of Byte;
+  s, tempsamplePerCycle, deltaAdd, curLevel: Single;
+  curSampling, samplePerCycle: LongInt;
+  c: array [0..1] of ShortInt;
 begin
-  result := 0;
-  i := 0;
-  s := sizeOfData / SizeOf(c);
-  while i < s do
+  tempsamplePerCycle:=sp.samplePerSec*sp.cycleuSec div 1000000;
+  samplePerCycle:=Trunc(tempsamplePerCycle);
+  if samplePerCycle <= 0 then
   begin
-    try
-      fpIn.ReadBuffer(c, SizeOf(c));
-      c[0] := 128;
-      fpOut.WriteBuffer(c, SizeOf(c));
-    except
-      result := -1;
-      break;
-    end;
-    Writeln(c[0], ' : ', c[1]);
-    inc(i);
+    Writeln('\8eü\94g\90\94\82ª\8d\82\82·\82¬');
+    result:=-1;
+    Exit;
   end;
-end;
-
-function effect16BitWav(fpIn, fpOut: TFileStream; sizeOfData: Word)
-  : integer;
-var
-  i: integer;
-  s: Single;
-  c: array [0 .. 1] of ShortInt;
-begin
-  result := 0;
-  i := 0;
-  s := sizeOfData / SizeOf(c);
+  deltaAdd:=65535/samplePerCycle;
+  curLevel:=0;
+  curSampling:=0;
+  i:=0;
+  s:=sp.sizeOfData/SizeOf(@c);
   while i < s do
   begin
-    try
-      fpIn.ReadBuffer(c, SizeOf(c));
-      c[0] := 0;
-      fpOut.WriteBuffer(c, SizeOf(c));
-    except
-      result := -1;
-      break;
-    end;
-    Writeln(c[0], ' : ', c[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;
 end;
 
-function wavDataWrite(fpIn, fpOut: TFileStream; posOfData, sizeOfData: LongInt;
-  bytesPerSingleCh: SmallInt): integer;
-begin
-  fpIn.Seek(posOfData, soFromCurrent);
-  if bytesPerSingleCh = 1 then
-    result := effect8BitWav(fpIn, fpOut, sizeOfData)
-  else
-    result := effect16BitWav(fpIn, fpOut, sizeOfData);
-end;
-
-function wavWrite(inFile, outFile: PChar; sampRate: LongWord; sampBits: Word;
-  posOfData, sizeOfData: integer): integer;
+function wavWrite(outFile: PChar; const wHdr: WrSWaveFileHeader;
+  var sp: SpParam): integer;
 var
-  bytesPerSingleCh: Word;
   fpIn, fpOut: TFileStream;
 begin
+  result := 0;
   try
-    if FileExists(inFile) = true then
-      fpIn := TFileStream.Create(inFile, fmOpenRead)
-    else
-    begin
-      result := -1;
-      Writeln(inFile, '\82ð\83I\81[\83v\83\93\82Å\82«\82Ü\82¹\82ñ');
-      Exit;
-    end;
     fpOut := TFileStream.Create(outFile, fmCreate);
-    bytesPerSingleCh := sampBits div 8;
-    if waveHeaderWrite(fpOut, sizeOfData, bytesPerSingleCh, sampRate, sampBits)
-      = -1 then
+    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;
-      Writeln('\83w\83b\83_\82ð\8f\91\82«\8d\9e\82ß\82Ü\82¹\82ñ');
-      Exit;
     end;
-    if wavDataWrite(fpIn, fpOut, posOfData, sizeOfData, bytesPerSingleCh) = -1
-    then
+    on EWriteError do
     begin
+      Writeln('\83w\83b\83_\82ð\8f\91\82«\8d\9e\82ß\82Ü\82¹\82ñ');
       result := -1;
-      Write('\83G\83\89\81[\94­\90¶');
-      Exit;
     end;
-  finally
-    fpIn.Free;
-    fpOut.Free;
   end;
-  result:=0;
+  fpOut.Free;
+end;
+
+procedure usage;
+begin
+  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
-  sampRate, sampBits: SmallInt;
-  posOfData, sizeOfData: LongWord;
+  sp: SpParam;
+  totalLength: integer;
+  hdrHeader: WrSWaveFileHeader;
 
 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);
+    if ParamCount <> 3 then
+    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
+      Exit;
     Writeln('\8a®\97¹');
   except
     on E: Exception do