• R/O
  • HTTP
  • SSH
  • HTTPS

sample-DELPHI: コミット

開発終了しました
クロスフェードをかける方法がよく用いられているように感じました、pyaudioでも簡単にできそうです。実際にPythonで書かれたコードもウェブで見つかりました。
自分のやってることにあんまり価値がなかったのでほどほどでほかのことに映ります。


コミットメタ情報

リビジョンb8f7562f1460fd27c98d91749ef0f44c403c7227 (tree)
日時2018-05-13 18:52:58
作者yamat0jp <yamat0jp@yaho...>
コミッターyamat0jp

ログメッセージ

chapter 9-2

とりあえずできた

変更サマリ

差分

--- a/spWav.pas
+++ b/spWav.pas
@@ -41,7 +41,9 @@ type
4141 channels: Byte;
4242 bytesPerSec: LongWord;
4343 posOfData: LongInt;
44- startpos, endpos: LongInt;
44+ startpos: LongInt;
45+ endpos: LongInt;
46+ cycleuSec: LongInt;
4547 end;
4648
4749 const
--- a/wav_proj.dpr
+++ b/wav_proj.dpr
@@ -6,87 +6,100 @@ program wav_proj;
66 uses
77 System.SysUtils,
88 System.Classes,
9- wav in 'wav.pas',
10- WriteHeader in 'WriteHeader.pas',
119 spWav in 'spWav.pas';
1210
13-function checkRange(var sp: SpParam): integer;
14-begin
15- result := 0;
16- if sp.startpos * sp.bytesPerSec > sp.sizeOfData then
17- begin
18- Writeln('開始位置がファイルサイズを超えています');
19- result := -1;
20- end
21- else if (sp.endpos + 1) * sp.bytesPerSec > sp.sizeOfData then
22- begin
23- Writeln('終了位置がファイルサイズを超えています');
24- Writeln('終了をファイルの最後に調整しました');
25- sp.endpos := (sp.sizeOfData div sp.bytesPerSec) - 1;
26- end;
27-end;
28-
29-function wavDataWrite(fpIn, fpOut: TFileStream; const sp: SpParam): integer;
11+function wavDataWrite(fpOut: TFileStream; const sp: SpParam): integer;
3012 var
31- Buffer: array of ShortInt;
13+ i: integer;
14+ s, tempsamplePerCycle, deltaAdd, curLevel: Single;
15+ curSampling, samplePerCycle: LongInt;
16+ c: array [0..1] of ShortInt;
3217 begin
33- result := 0;
34- fpIn.Position := sp.posOfData;
35- try
36- GetMem(Pointer(Buffer), sp.sizeOfData);
37- except
38- Writeln('メモリが確保できません');
39- result := -1;
40- end;
41- if fpIn.Read(Pointer(Buffer)^, sp.sizeOfData) = -1 then
18+ tempsamplePerCycle:=sp.samplePerSec*sp.cycleuSec div 1000000;
19+ samplePerCycle:=Trunc(tempsamplePerCycle);
20+ if samplePerCycle <= 0 then
4221 begin
43- Writeln('読み込みに失敗');
44- result := -1;
22+ Writeln('周波数が高すぎ');
23+ result:=-1;
24+ Exit;
4525 end;
46- if fpOut.Write(Pointer(Buffer)^, sp.sizeOfData) = -1 then
26+ deltaAdd:=65535/samplePerCycle;
27+ curLevel:=0;
28+ curSampling:=0;
29+ i:=0;
30+ s:=sp.sizeOfData/SizeOf(@c);
31+ while i < s do
4732 begin
48- Writeln('書き込みに失敗');
49- result := -1;
33+ inc(i);
34+ c[0]:=ShortInt(Trunc(curLevel-32788));
35+ c[1]:=c[0];
36+ fpOut.WriteBuffer(c,SizeOf(@c));
37+ curLevel:=curLevel+deltaAdd;
38+ inc(curSampling);
39+ if curSampling > samplePerCycle then
40+ begin
41+ curLevel:=0;
42+ curSampling:=0;
43+ end;
5044 end;
51- FreeMem(Pointer(Buffer));
5245 end;
5346
54-function wavWrite(inFile, outFile: PChar; var sp: SpParam): integer;
47+function wavWrite(outFile: PChar; const wHdr: WrSWaveFileHeader;
48+ var sp: SpParam): integer;
5549 var
5650 fpIn, fpOut: TFileStream;
5751 begin
52+ result := 0;
5853 try
59- fpIn := TFileStream.Create(inFile, fmOpenRead);
6054 fpOut := TFileStream.Create(outFile, fmCreate);
61- sp.sizeOfData := (sp.endpos - sp.startpos + 1) * sp.bytesPerSec;
62- if waveHeaderWrite(fpOut, sp) > 44 then
63- raise EWriteError.Create('ヘッダを書き込めません');
64- if wavDataWrite(fpIn, fpOut, sp) = -1 then
65- raise EWriteError.Create('エラー発生');
55+ fpOut.WriteBuffer(wHdr, SizeOf(WrSWaveFileHeader));
56+ if wavDataWrite(fpOut, sp) = -1 then
57+ raise EWriteError.Create('');
6658 except
6759 on EFOpenError do
68- Writeln(inFile, 'をオープンできません');
69- on EFOpenError do
70- fpIn.Free;
71- else
72-
7360 begin
74- fpIn.Free;
75- fpOut.Free;
61+ Writeln(outFile, 'をオープンできません');
62+ result := -1;
63+ end;
64+ on EWriteError do
65+ begin
66+ Writeln('ヘッダを書き込めません');
67+ result := -1;
7668 end;
77- result := -1;
78- Exit;
7969 end;
80- result := 0;
70+ fpOut.Free;
8171 end;
8272
8373 procedure usage;
8474 begin
85- Writeln('引数<入力ファイル名><出力ファイル名><速度倍率>');
75+ Writeln('のこぎり波');
76+ Writeln('例:effect.wav 100 2000');
77+end;
78+
79+procedure setupHeader(var wHdr: WrSWaveFileHeader; var sp: SpParam);
80+var
81+ bytes: Byte;
82+begin
83+ wHdr.hdrRiff := STR_RIFF;
84+ wHdr.sizeOfFile := sp.sizeOfData + SizeOf(WrSWaveFileHeader) - 8;
85+ wHdr.hdrWave := STR_WAVE;
86+ wHdr.hdrFmt := STR_fmt;
87+ wHdr.sizeOfFmt := SizeOf(tWaveFormatPcm);
88+ wHdr.stWaveFormat.formatTag := 1;
89+ wHdr.stWaveFormat.channels := sp.channels;
90+ wHdr.stWaveFormat.sampleParSec := sp.samplePerSec;
91+ bytes := sp.bitsPerSample div 8;
92+ wHdr.stWaveFormat.bytesPerSec := bytes * sp.channels * sp.samplePerSec;
93+ wHdr.stWaveFormat.blockAlign := bytes * sp.channels;
94+ wHdr.stWaveFormat.bitsPerSample := sp.bitsPerSample;
95+ wHdr.hdrData := STR_data;
96+ wHdr.sizeOfData := sp.sizeOfData;
8697 end;
8798
8899 var
89100 sp: SpParam;
101+ totalLength: integer;
102+ hdrHeader: WrSWaveFileHeader;
90103
91104 begin
92105 try
@@ -96,10 +109,15 @@ begin
96109 usage;
97110 Exit;
98111 end;
99- if wavHdrRead(PChar(ParamStr(1)), sp) = -1 then
100- Exit;
101- sp.samplePerSec := StrToInt(ParamStr(3)) * sp.samplePerSec;
102- if wavWrite(PChar(ParamStr(1)), PChar(ParamStr(2)), sp) = -1 then
112+ totalLength := StrToInt(ParamStr(2));
113+ sp.cycleuSec := StrToInt(ParamStr(3));
114+ sp.channels := WAV_STEREO;
115+ sp.samplePerSec := 44100;
116+ sp.bitsPerSample := 16;
117+ sp.sizeOfData := sp.bitsPerSample * sp.channels * sp.samplePerSec *
118+ totalLength div 8;
119+ setupHeader(hdrHeader, sp);
120+ if wavWrite(PChar(ParamStr(1)), hdrHeader, sp) = -1 then
103121 Exit;
104122 Writeln('完了');
105123 except
--- a/wav_proj.dproj
+++ b/wav_proj.dproj
@@ -127,7 +127,7 @@
127127 <DCC_RemoteDebug>true</DCC_RemoteDebug>
128128 </PropertyGroup>
129129 <PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
130- <Debugger_RunParams>toujyo.wav effect.wav 2</Debugger_RunParams>
130+ <Debugger_RunParams>effect.wav 100 2000</Debugger_RunParams>
131131 <DCC_RemoteDebug>false</DCC_RemoteDebug>
132132 </PropertyGroup>
133133 <PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
@@ -146,8 +146,6 @@
146146 <DelphiCompile Include="$(MainSource)">
147147 <MainSource>MainSource</MainSource>
148148 </DelphiCompile>
149- <DCCReference Include="wav.pas"/>
150- <DCCReference Include="WriteHeader.pas"/>
151149 <DCCReference Include="spWav.pas"/>
152150 <BuildConfiguration Include="Release">
153151 <Key>Cfg_2</Key>
--- a/wav_proj.dproj.local
+++ b/wav_proj.dproj.local
@@ -9,23 +9,23 @@
99 <Transaction>2017/10/19 20:48:10.000.837,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
1010 <Transaction>2017/10/19 20:48:11.000.893,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
1111 <Transaction>2017/10/19 20:49:15.000.988,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
12- <Transaction>2017/10/19 20:49:16.000.218,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
1312 <Transaction>2017/10/19 20:49:16.000.125,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
13+ <Transaction>2017/10/19 20:49:16.000.218,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
1414 <Transaction>2017/10/19 20:49:45.000.913,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
1515 <Transaction>2017/10/19 20:49:45.000.816,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
1616 <Transaction>2017/10/19 20:50:18.000.999,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
1717 <Transaction>2017/10/19 20:50:19.000.049,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
18- <Transaction>2017/10/19 21:37:00.000.271,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
1918 <Transaction>2017/10/19 21:37:00.000.652,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
19+ <Transaction>2017/10/19 21:37:00.000.271,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
2020 <Transaction>2017/10/19 21:37:00.000.365,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
2121 <Transaction>2017/10/28 22:58:31.000.296,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
2222 <Transaction>2017/10/29 14:44:00.000.024,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
23- <Transaction>2017/10/29 16:13:37.000.809,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
2423 <Transaction>2017/10/29 16:13:37.000.037,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
2524 <Transaction>2017/10/29 16:13:37.000.174,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
25+ <Transaction>2017/10/29 16:13:37.000.809,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
2626 <Transaction>2017/10/29 16:55:16.000.244,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
27- <Transaction>2017/10/29 16:55:16.000.109,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
2827 <Transaction>2017/10/29 16:55:16.000.343,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
28+ <Transaction>2017/10/29 16:55:16.000.109,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
2929 <Transaction>2017/10/30 15:04:38.000.106,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
3030 <Transaction>2017/11/01 16:00:52.000.956,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
3131 <Transaction>2017/11/01 16:00:53.000.058,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
@@ -34,23 +34,23 @@
3434 <Transaction>2017/11/01 18:12:24.000.771,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
3535 <Transaction>2017/11/01 18:21:25.000.947,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
3636 <Transaction>2017/11/01 18:21:26.000.254,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
37+ <Transaction>2017/11/01 18:23:22.000.440,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
3738 <Transaction>2017/11/01 18:23:22.000.193,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\FormUnit1.pas</Transaction>
3839 <Transaction>2017/11/01 18:23:22.000.344,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
39- <Transaction>2017/11/01 18:23:22.000.440,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
40- <Transaction>2017/11/01 18:33:21.000.032,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
4140 <Transaction>2017/11/01 18:33:21.000.133,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerContainerUnit1.pas</Transaction>
41+ <Transaction>2017/11/01 18:33:21.000.032,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\ServerMethodsUnit1.pas</Transaction>
4242 <Transaction>2017/11/01 18:33:39.000.795,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
4343 <Transaction>2017/11/01 19:08:03.000.193,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\WebModuleUnit1.pas</Transaction>
4444 <Transaction>2017/11/30 19:11:41.000.772,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
4545 <Transaction>2018/01/01 12:40:34.000.125,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
4646 <Transaction>2018/01/01 12:40:55.000.044,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
4747 <Transaction>2018/05/07 18:00:45.000.726,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
48- <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>
49- <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>
48+ <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>
49+ <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>
5050 <Transaction>2018/05/07 21:20:21.000.796,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas</Transaction>
51- <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>
51+ <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>
5252 <Transaction>2018/05/09 21:56:39.000.226,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\Unit1.pas</Transaction>
53- <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>
53+ <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>
5454 <Transaction>2018/05/13 12:45:57.000.431,=C:\Users\yamat\Documents\Embarcadero\Studio\Projects\myapp\wav\spWav.pas</Transaction>
5555 </Transactions>
5656 </BorlandProject>
旧リポジトリブラウザで表示