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