From: yamat0jp Date: Sun, 13 May 2018 01:37:39 +0000 (+0900) Subject: chapter6 X-Git-Url: http://git.osdn.net/view?p=sample-delphi%2Fsample-DELPHI.git;a=commitdiff_plain;h=d582d5869337db7ec2b844a624667a28dbdad501 chapter6 大分できてきました chapter3以降で無視した単元があります --- diff --git a/WriteHeader.pas b/WriteHeader.pas index 97b3b1b..f222e2b 100644 --- a/WriteHeader.pas +++ b/WriteHeader.pas @@ -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; diff --git a/spWav.pas b/spWav.pas index f0410cd..c52222b 100644 --- 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 --- 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‚Ì’·‚³:', sizeOfData, '[bytes]'); - posOfData := fp.Position; + sp.sizeOfData := chank.sizeOfFmtData; + Writeln('data‚Ì’·‚³:', 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, '‚Ì’·‚³[bytes]', len); fPos := fp.Position; - fp.Seek(len,soFromCurrent); + fp.Seek(len, soFromCurrent); end; end; fp.Free; diff --git a/wav_proj.dpr b/wav_proj.dpr index efda255..a93819b 100644 --- a/wav_proj.dpr +++ b/wav_proj.dpr @@ -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('ŠJŽnˆÊ’u‚ªƒtƒ@ƒCƒ‹ƒTƒCƒY‚ð’´‚¦‚Ä‚¢‚Ü‚·'); + result := -1; + end + else if (sp.endpos + 1) * sp.bytesPerSec > sp.sizeOfData then + begin + Writeln('I—¹ˆÊ’u‚ªƒtƒ@ƒCƒ‹ƒTƒCƒY‚ð’´‚¦‚Ä‚¢‚Ü‚·'); + Writeln('I—¹‚ðƒtƒ@ƒCƒ‹‚̍Ōã‚É’²®‚µ‚Ü‚µ‚½'); + 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('ƒwƒbƒ_‚ð‘‚«ž‚ß‚Ü‚¹‚ñ'); - if wavDataWrite(fpIn, fpOut, posOfData, sizeOfData, bytesPerSingleCh) = -1 - then + if wavDataWrite(fpIn, fpOut, sp) = -1 then raise EWriteError.Create('ƒGƒ‰[”­¶'); 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 ƒƒCƒ“ : ‚±‚±‚ɃR[ƒh‚ð‹Lq‚µ‚Ä‚­‚¾‚³‚¢ } - 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('ŠJŽn•b‚͏I—¹•b‚ð’´‚¦‚Ä‚Í‚È‚è‚Ü‚¹‚ñ'); + Exit; + end; + if wavHdrRead(PChar(ParamStr(1)), sp) = -1 then + Exit; + if wavWrite(PChar(ParamStr(1)), PChar(ParamStr(2)), sp) = -1 then + Exit; Writeln('Š®—¹'); except on E: Exception do diff --git a/wav_proj.dproj b/wav_proj.dproj index a426c71..bfacd9b 100644 --- a/wav_proj.dproj +++ b/wav_proj.dproj @@ -127,7 +127,7 @@ true - toujyo.wav effect.wav + toujyo.wav effect.wav 5 10 false diff --git a/wav_proj.dproj.local b/wav_proj.dproj.local index 6b8a0be..74aa953 100644 --- a/wav_proj.dproj.local +++ b/wav_proj.dproj.local @@ -11,8 +11,8 @@ 2017/10/19 20:49:15.000.988,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas 2017/10/19 20:49:16.000.125,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas 2017/10/19 20:49:16.000.218,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas - 2017/10/19 20:49:45.000.816,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas 2017/10/19 20:49:45.000.913,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas + 2017/10/19 20:49:45.000.816,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas 2017/10/19 20:50:18.000.999,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas 2017/10/19 20:50:19.000.049,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas 2017/10/19 21:37:00.000.271,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas @@ -21,11 +21,11 @@ 2017/10/28 22:58:31.000.296,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas 2017/10/29 14:44:00.000.024,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas 2017/10/29 16:13:37.000.037,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas - 2017/10/29 16:13:37.000.174,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas 2017/10/29 16:13:37.000.809,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas - 2017/10/29 16:55:16.000.109,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas - 2017/10/29 16:55:16.000.343,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas + 2017/10/29 16:13:37.000.174,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas 2017/10/29 16:55:16.000.244,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas + 2017/10/29 16:55:16.000.343,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas + 2017/10/29 16:55:16.000.109,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas 2017/10/30 15:04:38.000.106,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas 2017/11/01 16:00:52.000.956,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas 2017/11/01 16:00:53.000.058,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas @@ -35,8 +35,8 @@ 2017/11/01 18:21:25.000.947,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas 2017/11/01 18:21:26.000.254,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas 2017/11/01 18:23:22.000.440,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas - 2017/11/01 18:23:22.000.344,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas 2017/11/01 18:23:22.000.193,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\FormUnit1.pas + 2017/11/01 18:23:22.000.344,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas 2017/11/01 18:33:21.000.133,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas 2017/11/01 18:33:21.000.032,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas 2017/11/01 18:33:39.000.795,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas @@ -45,11 +45,11 @@ 2018/01/01 12:40:34.000.125,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas 2018/01/01 12:40:55.000.044,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas 2018/05/07 18:00:45.000.726,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas - 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 - 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 + 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 + 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 2018/05/07 21:20:21.000.796,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas - 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 + 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 2018/05/09 21:56:39.000.226,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas - 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 + 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