home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2001 December (DVD)
/
VPR0112A.ISO
/
OLS
/
WAVKNIFE
/
wavknife.lzh
/
src.lzh
/
wkfrm.pas
< prev
Wrap
Pascal/Delphi Source File
|
2001-02-19
|
56KB
|
1,632 lines
unit wkfrm;
///////////////////////////////////////////////////////////////
// waveファイルの録音・切り出し・結合ツール
// リアルタイム切り出しを断念したので、その代替品
//
// susumuk@fa.mbn.or.jp
// http://www14.big.or.jp/~kawamura/
//
// ソースコードともに、改変・再配布は自由です。
// 何かありましたら上のアドレスまで。
//
// バージョン履歴
// v0.1 1997.11.25 WinDAT(非公開,リアルタイム)がよく
// エラーで止まるので、ついに作成
// v0.2 1997.11.30 Excel VBAからのSendKeyが使えるように、
// キーボードショートカットを追加
// (早速研究用として活躍開始!!)
// v0.3 1997.12.4 遅い機種でどうしても動かないので、
// MediaPlayer(MCI)を使うよう変更
// ただ、やはりMCIでは役不足な機能(複数のサウンドカード)
// があるので、
// /expert オプションを付けておいた。
// (このコマンドラインオプションで、従来の利用が可能)
// v0.4 1997.12.10 開発再開 12.14 公開
// MediaPlayerを使った場合の機能を充実。
// 切り出し時に、0点補正の機能を利用できるようにした。
// (あまり想定していないが)CDプレーヤが起動できるようにした。
// v0.3のとき発見していたバグを忘れていて、非常に手間取る。
// v0.5 1997.12.14 録音時間の制限が小さすぎる不具合を修正
// v0.6 1998.2.11 録音時間表示の不具合修正
// 2G以上のドライブ(FAT or NTFS)で正しい空き容量が取得できるようにした
// ただし、今のところネットワークドライブに関しては空き容量を
// 正しく取得することはできません(NetBIOSの制限)
// 1998.3.22 OSR2以前のバージョンでは利用できないことが判明
// v0.7 1998.5.6 時刻表示のバグを修正
// OSR2専用ルーチンを作った(OSR2Func)
// v0.8 2001.1.17 Delphi5に移植。
// OSR2専用ルーチンを外す。
// MCIの制限で4G以上のWAVEファイルは作れないこと、
// FileSystemによっては4G以上のファイルが正しく扱えないことがあるので、
// 4G以上のファイルは生成できないようにした。
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin, shlabout, BrowsDlg, Buttons, ComCtrls,
ExtCtrls, Menus, mmsystem, SHELLAPI, MPlayer,Math;
const
MAX_BUFFERS=2; // 2重バッファ
DATABLOCK_SIZE=8192; // データブロックサイズ
USR_INBLOCK=WM_USER+101; // ブロックがいっぱいになったメッセージ
MSG_LEN=255;
HEAP_ZERO_MEMORY=$8;
trigdelay=512;
type ULARGE_INTEGER = record
Part:array[0..2] of WORD;
PartHi:SmallInt;
end;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
Help1: TMenuItem;
KR1: TMenuItem;
KC1: TMenuItem;
KA1: TMenuItem;
Exit1: TMenuItem;
KF1: TMenuItem;
KS1: TMenuItem;
KS2: TMenuItem;
KS3: TMenuItem;
K1: TMenuItem;
K2: TMenuItem;
About1: TMenuItem;
Panel1: TPanel;
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
TabSheet3: TTabSheet;
Panel2: TPanel;
Panel4: TPanel;
Image1: TImage;
Label1: TLabel;
Panel3: TPanel;
Panel5: TPanel;
Label2: TLabel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
CheckBox1: TCheckBox;
BrowseDialog1: TBrowseDialog;
ShellAboutDialog1: TShellAboutDialog;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
ListBox1: TListBox;
Label6: TLabel;
Edit1: TEdit;
Button1: TButton;
ComboBox2: TComboBox;
SpinEdit1: TSpinEdit;
Label8: TLabel;
SpinEdit2: TSpinEdit;
SpinEdit3: TSpinEdit;
Label9: TLabel;
Label10: TLabel;
Button2: TButton;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Button3: TButton;
Label15: TLabel;
Edit2: TEdit;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Button8: TButton;
Button9: TButton;
Button10: TButton;
SaveDialog1: TSaveDialog;
OpenDialog1: TOpenDialog;
GroupBox1: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Button11: TButton;
Edit3: TEdit;
Label11: TLabel;
Button12: TButton;
Label16: TLabel;
SpinEdit4: TSpinEdit;
SpinEdit5: TSpinEdit;
SpinEdit6: TSpinEdit;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
Label20: TLabel;
ComboBox3: TComboBox;
Label21: TLabel;
ComboBox4: TComboBox;
Label22: TLabel;
SpinEdit7: TSpinEdit;
Label23: TLabel;
SpinEdit8: TSpinEdit;
Label24: TLabel;
Label25: TLabel;
Label26: TLabel;
Edit4: TEdit;
Button13: TButton;
Label27: TLabel;
OpenDialog2: TOpenDialog;
OpenDialog3: TOpenDialog;
CheckBox4: TCheckBox;
BrowseDialog2: TBrowseDialog;
Button14: TButton;
Timer1: TTimer;
N1: TMenuItem;
KV1: TMenuItem;
Label33: TLabel;
Label34: TLabel;
Timer2: TTimer;
GroupBox2: TGroupBox;
Label30: TLabel;
Label32: TLabel;
Label31: TLabel;
Label29: TLabel;
CheckBox5: TCheckBox;
CheckBox6: TCheckBox;
MediaPlayer1: TMediaPlayer;
Label35: TLabel;
Label36: TLabel;
Label37: TLabel;
Label38: TLabel;
Label39: TLabel;
Label40: TLabel;
Label41: TLabel;
CDPlayerC1: TMenuItem;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
TrackBar951: TTrackBar;
procedure About1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button13Click(Sender: TObject);
procedure Button12Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Exit1Click(Sender: TObject);
procedure KF1Click(Sender: TObject);
procedure KS2Click(Sender: TObject);
procedure K1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure Edit1Change(Sender: TObject);
procedure CheckBox4Click(Sender: TObject);
procedure Button14Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure KV1Click(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure KS3Click(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Button10Click(Sender: TObject);
procedure SpinEdit5Change(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure KS1Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure CDPlayerC1Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
private
{ Private 宣言 }
waveinDevID:integer;
Fzeroadjdata:array [1..2] of integer; //左 or 右チャンネル
waveinfs:TFileStream;
tempms:TMemoryStream;
ch,freq,bits:integer;
_breakflag:integer;
recordingstatus:integer;
procedure DiskFreeCalcProc;
procedure WaveStopProc;
procedure HeaderCreate(fs:TFileStream;FmtComboBox:TComboBox);
procedure HeaderCorrect(fs:TFileStream);
procedure cuttingproc;
procedure SetCutFileName(s:string);
procedure SetCmbFiles(StringList:TStrings);
procedure recordingbuttonclick;
function Getzeroadjdata(i:integer):integer;
procedure Setzeroadjdata(i,value:integer);
// エクスプローラからのDrag&Dropを許可する
procedure WMDropFiles(var msg: TWMDROPFILES); {メソッドの宣言}
message WM_DROPFILES; {受け取るメッセージ}
public
{ Public 宣言 }
property breakflag: integer read _breakflag write _breakflag;
property zeroadjdata[i:integer]: integer read Getzeroadjdata write Setzeroadjdata;
protected
procedure CreateParams(var Params: TCreateParams); override;
end;
var
Form1: TForm1;
implementation
uses adjfrm, cbfrm, cutfrm;
{$R *.DFM}
procedure TForm1.About1Click(Sender: TObject);
begin
ShellAboutDialog1.Execute;
end;
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
begin
BrowseDialog1.Directory:=Edit1.Text;
if BrowseDialog1.Execute then
begin
s:=BrowseDialog1.Directory;
if s[length(s)]='\' then Delete(s,length(s),1);
Edit1.Text:=s;
end;
end;
procedure TForm1.Button13Click(Sender: TObject);
var s:string;
begin
BrowseDialog2.Directory:=Edit4.Text;
if BrowseDialog2.Execute then
begin
s:=BrowseDialog2.Directory;
if s[length(s)]='\' then Delete(s,length(s),1);
Edit4.Text:=s;
end;
end;
procedure TForm1.Button12Click(Sender: TObject);
begin
if OpenDialog2.Execute then
SetCutFileName(OpenDialog2.FileName);
end;
procedure TForm1.SetCutFileName(s:string);
var fs:TFileStream;
k:integer;
ckid:array[0..3] of Char;
waveformatrec1:TWAVEFORMATEX;
begin
// Waveファイルの形式をチェックし、
// 「形式」を変更する
if UpperCase(ExtractFileExt(s))='.WAV' then
begin
fs:=TFileStream.Create(s,fmOpenRead);
try
// waveファイルの読み取りには本来mmio関数を使うべきだが
// これを使うと面倒なので、ここでは4バイトずつ読んで、
// 'fmt 'チャンクを探す
fs.Seek(0,soFromBeginning);
k:=0;
ckid:=' ';
while not (ckid='fmt ') and (k<200) do
begin
fs.Read(ckid,4);
inc(k);
end;
// 200バイトも探したのに、見つからなかった(壊れてる??)
if k=200 then
begin
Application.MessageBox('サポートできない形式です。',
'Error',mb_IconHand or mb_Ok);
exit;
end;
fs.Seek(4,soFromCurrent);
fs.Read(waveformatrec1,sizeof(TWAVEFORMATEX));
with waveformatrec1 do
begin
if (wFormatTag<>WAVE_FORMAT_PCM) then
begin
Application.MessageBox('サポートできない形式です。',
'Error',mb_IconHand or mb_Ok);
exit;
end;
case (nSamplesPerSec) of
48000: k:=1;
44100: k:=2;
32000: k:=3;
22050: k:=4;
11025: k:=5;
5000: k:=6;
else
Application.MessageBox('サポートできない形式です。',
'Error',mb_IconHand or mb_Ok);
exit;
end;
if (nChannels=1) then k:=6+k;
if (wBitsPerSample=8) then k:=12+k;
end;
ComboBox3.ItemIndex:=k-1;
finally
fs.Free;
end;
end;
Edit3.Text:=s;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if SaveDialog1.Execute then
Edit2.Text:=SaveDialog1.FileName;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if OpenDialog3.Execute then
SetCmbFiles(OpenDialog3.Files);
end;
procedure TForm1.SetCmbFiles(StringList:TStrings);
var fs:TFileStream;
k,i:integer;
ckid:array[0..3] of Char;
waveformatrec1:TWAVEFORMATEX;
begin
begin
for i:=0 to StringList.Count-1 do
begin
// Waveファイルの形式をチェックし、
// 「形式」を変更する
if UpperCase(ExtractFileExt(StringList.Strings[i]))='.WAV' then
begin
fs:=TFileStream.Create(StringList.Strings[i],fmOpenRead);
try
// waveファイルの読み取りには本来mmio関数を使うべきだが
// これを使うと面倒なので、ここでは4バイトずつ読んで、
// 'fmt 'チャンクを探す
fs.Seek(0,soFromBeginning);
k:=0;
ckid:=' ';
while not (ckid='fmt ') and (k<200) do
begin
fs.Read(ckid,4);
inc(k);
end;
// 200バイトも探したのに、見つからなかった(壊れてる??)
if k=200 then
begin
Application.MessageBox('サポートできない形式です。',
'Error',mb_IconHand or mb_Ok);
exit;
end;
fs.Seek(4,soFromCurrent);
fs.Read(waveformatrec1,sizeof(TWAVEFORMATEX));
with waveformatrec1 do
begin
if (wFormatTag<>WAVE_FORMAT_PCM) then
begin
Application.MessageBox('サポートできない形式です。',
'Error',mb_IconHand or mb_Ok);
exit;
end;
case (nSamplesPerSec) of
48000: k:=1;
44100: k:=2;
32000: k:=3;
22050: k:=4;
11025: k:=5;
5000: k:=6;
else
Application.MessageBox('サポートできない形式です。',
'Error',mb_IconHand or mb_Ok);
exit;
end;
if (nChannels=1) then k:=k+6;
if (wBitsPerSample=8) then k:=k+12;
end;
if (i>1) and (ComboBox4.ItemIndex<>k-1) then
begin
if Application.MessageBox('形式の異なるWaveファイルですが、結合しますか?',
'警告',mb_IconWarning or mb_YesNo)=IDYes then
ComboBox4.ItemIndex:=k-1
else exit;
end
else ComboBox4.ItemIndex:=k-1;
finally
fs.Free;
end;
end;
ListBox1.Items.Add(StringList.Strings[i]);
end;
end;
end;
procedure TForm1.Exit1Click(Sender: TObject);
begin
close;
end;
procedure TForm1.KF1Click(Sender: TObject);
begin
PageControl1.ActivePage:=TabSheet1;
end;
procedure TForm1.KS2Click(Sender: TObject);
begin
PageControl1.ActivePage:=TabSheet2;
end;
procedure TForm1.K1Click(Sender: TObject);
begin
PageControl1.ActivePage:=TabSheet3;
end;
procedure TForm1.FormCreate(Sender: TObject);
var path:array[0..259] of Char;
s:string;
ii,i:integer;
wc:TWAVEINCAPS;
StringList1:TStringList;
begin
// テンポラリディレクトリの取得設定
GetTempPath(259,path);
s:=string(path);
if s[length(s)]='\' then Delete(s,length(s),1);
Edit4.Text:=s;
Edit1.Text:=s;
Edit3.Text:=s+'\wavkntmp.wav';
// 録音デバイスの情報を取得設定
ComboBox3.ItemIndex:=1;
ComboBox4.ItemIndex:=1;
ii:=WaveInGetNumDevs;
if ii=0 then
begin
Application.MessageBox('録音デバイスが見つかりません。録音はできません。','デバイスエラー',
mb_IconHand or mb_Ok);
TabSheet1.Visible:=false;
exit;
end;
// 録音デバイスの録音可能な範囲を設定
waveinDevID := WAVE_MAPPER;
waveInGetDevCaps(waveinDevID,@wc,sizeof(TWAVEINCAPS));
StringList1:=TStringList.Create;
try
StringList1.Sorted:=true;
with wc do
begin
if dwFormats and WAVE_FORMAT_1M08<>0 then StringList1.Add('8bit, Mono, 11kHz');
if dwFormats and WAVE_FORMAT_1S08<>0 then StringList1.Add('8bit, Stereo, 11kHz');
if dwFormats and WAVE_FORMAT_1M16<>0 then StringList1.Add('16bit, Mono, 11kHz');
if dwFormats and WAVE_FORMAT_1S16<>0 then StringList1.Add('16bit, Stereo, 11kHz');
if dwFormats and WAVE_FORMAT_2M08<>0 then StringList1.Add('8bit, Mono, 22kHz');
if dwFormats and WAVE_FORMAT_2S08<>0 then StringList1.Add('8bit, Stereo, 22kHz');
if dwFormats and WAVE_FORMAT_2M16<>0 then StringList1.Add('16bit, Mono, 22kHz');
if dwFormats and WAVE_FORMAT_2S16<>0 then StringList1.Add('16bit, Stereo, 22kHz');
if (dwFormats and WAVE_FORMAT_2M08<>0) and (dwFormats and WAVE_FORMAT_4M08<>0)
then StringList1.Add('8bit, Mono, 32kHz');
if (dwFormats and WAVE_FORMAT_2S08<>0) and (dwFormats and WAVE_FORMAT_4S08<>0)
then StringList1.Add('8bit, Stereo, 32kHz');
if (dwFormats and WAVE_FORMAT_2M16<>0) and (dwFormats and WAVE_FORMAT_4M16<>0)
then StringList1.Add('16bit, Mono, 32kHz');
if (dwFormats and WAVE_FORMAT_2S16<>0) and (dwFormats and WAVE_FORMAT_4S16<>0)
then StringList1.Add('16bit, Stereo, 32kHz');
if dwFormats and WAVE_FORMAT_4M08<>0 then
begin
StringList1.Add('8bit, Mono, 44.1kHz');
StringList1.Add('8bit, Mono, 48kHz');
end;
if dwFormats and WAVE_FORMAT_4S08<>0 then
begin
StringList1.Add('8bit, Stereo, 44.1kHz');
StringList1.Add('8bit, Stereo, 48kHz');
end;
if dwFormats and WAVE_FORMAT_4M16<>0 then
begin
StringList1.Add('16bit, Mono, 44.1kHz');
StringList1.Add('16bit, Mono, 48kHz');
end;
if dwFormats and WAVE_FORMAT_4S16<>0 then
begin
StringList1.Add('16bit, Stereo, 44.1kHz');
StringList1.Add('16bit, Stereo, 48kHz');
end;
end;
ComboBox2.Items.AddStrings(StringList1);
finally
StringList1.Free;
end;
ComboBox2.ItemIndex:=0;
// ディスクの空き容量を取得
DiskFreeCalcProc;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
if ListBox1.ItemIndex>0 then
begin
ListBox1.Items.Exchange(0,ListBox1.ItemIndex);
ListBox1.ItemIndex:=0;
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
var i:integer;
begin
if ListBox1.ItemIndex>0 then
begin
i:=ListBox1.ItemIndex;
ListBox1.Items.Exchange(i-1,i);
ListBox1.ItemIndex:=i-1;
end;
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
if ListBox1.ItemIndex>0 then
begin
ListBox1.Items.Exchange(ListBox1.Items.Count-1,ListBox1.ItemIndex);
ListBox1.ItemIndex:=ListBox1.Items.Count-1;
end;
end;
procedure TForm1.Button6Click(Sender: TObject);
var i:integer;
begin
if (ListBox1.ItemIndex>0) and
(ListBox1.ItemIndex<ListBox1.Items.Count-1) then
begin
i:=ListBox1.ItemIndex;
ListBox1.Items.Exchange(i+1,i);
ListBox1.ItemIndex:=i+1;
end;
end;
procedure TForm1.Button8Click(Sender: TObject);
var i:integer;
begin
if ListBox1.ItemIndex>0 then
begin
i:=ListBox1.ItemIndex;
ListBox1.Items.Delete(i);
if (i<ListBox1.Items.Count) then ListBox1.ItemIndex:=i
else if (i>0) then ListBox1.ItemIndex:=i-1;
end;
end;
procedure TForm1.Button9Click(Sender: TObject);
begin
ListBox1.Items.Clear;
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
begin
Label22.Enabled:=false;
Label23.Enabled:=false;
Label24.Enabled:=false;
Label25.Enabled:=false;
SpinEdit7.Enabled:=false;
SpinEdit8.Enabled:=false;
Label16.Enabled:=true;
Label17.Enabled:=true;
Label18.Enabled:=true;
Label19.Enabled:=true;
SpinEdit4.Enabled:=true;
SpinEdit5.Enabled:=true;
SpinEdit6.Enabled:=true;
end;
procedure TForm1.RadioButton1Click(Sender: TObject);
begin
Label22.Enabled:=true;
Label23.Enabled:=true;
Label24.Enabled:=true;
Label25.Enabled:=true;
SpinEdit7.Enabled:=true;
SpinEdit8.Enabled:=true;
Label16.Enabled:=false;
Label17.Enabled:=false;
Label18.Enabled:=false;
Label19.Enabled:=false;
SpinEdit4.Enabled:=false;
SpinEdit5.Enabled:=false;
SpinEdit6.Enabled:=false;
end;
procedure TForm1.DiskFreeCalcProc;
var df,df1,df2,df3,cb,cb1,cb2,cb3:comp;
b:integer;
path:array[0..259] of Char;
begin
// 1秒の録音に費やすwaveファイルの大きさを計算
b:=1;
if Pos('16bit',ComboBox2.Text)>0 then b:=2;
if Pos('Stereo',ComboBox2.Text)>0 then b:=b*2;
if Pos('11kHz',ComboBox2.Text)>0 then b:=b*11025
else if Pos('22kHz',ComboBox2.Text)>0 then b:=b*22050
else if Pos('32kHz',ComboBox2.Text)>0 then b:=b*32000
else if Pos('44.1kHz',ComboBox2.Text)>0 then b:=b*44100
else if Pos('5kHz',ComboBox2.Text)>0 then b:=b*5000
else b:=b*48000;
// MediaPlayerコンポーネントを利用
// MediaPlayerコンポーネントでは、
// いったんテンポラリファイルを作るので、
// 制限時間は次のうち、一番小さい値に依存
// (waveファイルの保存ドライブの空き容量)
// (テンポラリファイルのドライブの空き容量)
// (もし、両方同じドライブを利用するときは、空き容量の半分の値)
// ネットワークドライブは空き容量が取得できないので、
// とりあえず2Gbに設定。
// waveファイルを保存するドライブの空き容量を取得
if Copy(Edit1.Text,1,1)='\'
then df1:=6442450944
else
begin
df1:=DiskFree(ord(UpCase(Edit1.text[1]))-64);
end;
// テンポラリディレクトリの取得設定
GetTempPath(260,path);
// テンポラリファイルを保存するドライブの空き容量を取得
if path[0]='\'
then df2:=6442450944
else
begin
df2:=DiskFree(ord(UpCase(path[0]))-64);
end;
// 切り出したファイルを保存するドライブの空き容量を取得
if Copy(Edit4.Text,1,1)='\'
then df3:=6442450944
else
begin
df3:=DiskFree(ord(UpCase(Edit4.text[1]))-64);
end;
// 同じドライブを利用するときは、それらの1/3または半分の値
// 切り出す場合 (ver 0.5バグフィックス)
if CheckBox1.Checked then
begin
if ((UpperCase(Copy(Edit1.text,1,1))=string(UpCase(path[0]))) and
(UpperCase(Copy(Edit4.text,1,1))=string(UpCase(path[0])))) then
df1:=df1/3
else if ((UpperCase(Copy(Edit1.text,1,1))=string(UpCase(path[0]))) or
(UpperCase(Copy(Edit4.text,1,1))=string(UpCase(path[0])))) then
df1:=df1/2
else if (UpperCase(Copy(Edit4.Text,1,1))=string(UpCase(path[0]))) then
df2:=df2/2
else if (UpperCase(Copy(Edit1.text,1,1))=UpperCase(Copy(Edit4.text,1,1))) then
df3:=df3/2;
if df1<df2 then df:=df1 else df:=df2;
if df3<df then df:=df3;
end
// 切り出さない場合
else
begin
if (UpperCase(Copy(Edit1.text,1,1))=string(UpCase(path[0]))) then
df1:=df1/2;
if df1<df2 then df:=df1 else df:=df2;
end;
// もし4G以上なら4Gに固定する。
if df>4294967296 then df := 4294967296;
cb:=df/b; // 秒数
cb1:=int(cb/60/60);
SpinEdit1.MaxValue:=trunc(cb1);
if SpinEdit1.Value>SpinEdit1.MaxValue then SpinEdit1.Value:=SpinEdit1.MaxValue;
cb2:=int((cb-cb1*60*60)/60);
if SpinEdit1.MaxValue=SpinEdit1.Value then SpinEdit2.MaxValue:=trunc(cb2)
else SpinEdit2.MaxValue:=59;
if (SpinEdit1.MaxValue=SpinEdit1.Value) and
(SpinEdit2.Value>SpinEdit2.MaxValue) then
SpinEdit2.Value:=SpinEdit2.MaxValue;
cb3:=int(cb-((cb1*60)+cb2)*60);
if SpinEdit2.MaxValue=SpinEdit2.Value then SpinEdit3.MaxValue:=trunc(cb3)
else SpinEdit3.MaxValue:=59;
if (SpinEdit1.MaxValue=SpinEdit1.Value) and
(SpinEdit2.MaxValue=SpinEdit2.Value) and
(SpinEdit3.Value>SpinEdit3.MaxValue) then
SpinEdit3.Value:=SpinEdit3.MaxValue;
if SpinEdit1.MaxValue=0 then SpinEdit1.Enabled:=false
else SpinEdit1.Enabled:=true;
if (SpinEdit1.MaxValue=0) and
(SpinEdit2.MaxValue=0) then SpinEdit2.Enabled:=false
else SpinEdit2.Enabled:=true;
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
DiskFreeCalcProc;
end;
procedure TForm1.CheckBox4Click(Sender: TObject);
begin
if CheckBox4.Checked then
begin
Button14.Enabled:=true;
GroupBox2.Enabled:=true;
Label29.Enabled:=true;
Label30.Enabled:=true;
Label31.Enabled:=true;
Label32.Enabled:=true;
Label35.Enabled:=true;
Label36.Enabled:=true;
Label37.Enabled:=true;
Label38.Enabled:=true;
Label39.Enabled:=true;
Label40.Enabled:=true;
Label41.Enabled:=true;
end
else
begin
Button14.Enabled:=false;
GroupBox2.Enabled:=false;
Label29.Enabled:=false;
Label30.Enabled:=false;
Label31.Enabled:=false;
Label32.Enabled:=false;
Label35.Enabled:=false;
Label36.Enabled:=false;
Label37.Enabled:=false;
Label38.Enabled:=false;
Label39.Enabled:=false;
Label40.Enabled:=false;
Label41.Enabled:=false;
end;
end;
procedure TForm1.Button14Click(Sender: TObject);
var path:array[0..259] of Char;
filename:array[0..255] of Char;
fs:TFileStream;
begin
GetTempPath(260,path);
GetTempFileName(path,'wav',0,filename);
fs:=TFileStream.Create(string(filename),fmCreate);
headercreate(fs,ComboBox2);
headercorrect(fs);
fs.Free;
MediaPlayer1.FileName:=string(filename);
MediaPlayer1.DeviceType:=dtWaveAudio;
MediaPlayer1.Open;
MediaPlayer1.StartRecording;
Form2.IsMP:=true;
Timer1.Enabled:=true;
with Form2 do
begin
DevID:=WAVE_MAPPER;
if Pos('Stereo',ComboBox2.Text)>0 then channel:=2 else channel:=1;
if Pos('11kHz',ComboBox2.Text)>0 then freq:=11025
else if Pos('22kHz',ComboBox2.Text)>0 then freq:=22050
else if Pos('32kHz',ComboBox2.Text)>0 then freq:=32000
else if Pos('44.1kHz',ComboBox2.Text)>0 then freq:=44100
else if Pos('48kHz',ComboBox2.Text)>0 then freq:=48000
else if Pos('5kHz',ComboBox2.Text)>0 then freq:=5000;
if Pos('8bit',ComboBox2.Text)>0 then bits:=8 else bits:=16;
ProgressBar1.Position:=0;
ShowModal;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Form2.ProgressBar1.Position:=Form2.ProgressBar1.Position+Form2.ProgressBar1.Step;
if Form2.ProgressBar1.Position=100 then
begin
Timer1.Enabled:=false;
Screen.Cursor:=crHourGlass;
Update;
Form2.ModalResult:=mrOk;
Screen.Cursor:=crDefault;
end;
end;
procedure TForm1.KV1Click(Sender: TObject);
begin
WinExec('sndvol32.exe',SW_SHOW);
end;
// 録音開始
procedure TForm1.BitBtn5Click(Sender: TObject);
begin
recordingbuttonclick;
end;
procedure TForm1.recordingbuttonclick;
var i:integer;
procedure createzerowaveform(filename:string;
channel,frequency,bit:integer);
// 大きさ0のwaveファイルを作る
var fs:TFileStream;
WaveFormat1:TWAVEFORMATEX;
ck:array [0..3] of Char;
cksize:longint;
begin
fs:=TFileStream.Create(filename,fmCreate);
try
ck:='RIFF';
fs.WriteBuffer(ck,4);
cksize:=34;
fs.WriteBuffer(cksize,4);
ck:='WAVE';
fs.WriteBuffer(ck,4);
ck:='fmt ';
fs.WriteBuffer(ck,4);
ckSize:=16;
fs.WriteBuffer(cksize,4);
with waveformat1 do
begin
wFormatTag:=WAVE_FORMAT_PCM;
nChannels:=channel;
nSamplesPerSec:=frequency;
wBitsPerSample:=bit;
nAvgBytesPerSec:=frequency*channel*(bit div 8);
nBlockAlign:=channel*(bit div 8);
cbSize:=0;
end;
fs.WriteBuffer(waveformat1,18);
fs.Seek(-2,soFromCurrent);
ck:='data';
fs.WriteBuffer(ck,4);
ckSize:=0;
fs.WriteBuffer(cksize,4);
finally
fs.free;
end;
end;
// 画面を録音状態にセット
procedure RecordingDisplaySetting;
begin
// 他のコンポーネントの操作を禁止
BitBtn5.Enabled:=false; // 録音ボタン
Button1.Enabled:=false; // Waveの保存フォルダの参照
Button14.Enabled:=false; // 今すぐ補正
SpinEdit1.Enabled:=false; // 録音時間(hour)
SpinEdit2.Enabled:=false; // 録音時間(min)
SpinEdit3.Enabled:=false; // 録音時間(sec)
ComboBox2.Enabled:=false; // 形式
CheckBox1.Enabled:=false; // 録音後すぐに切り出す
CheckBox4.Enabled:=false; // 0点補正
TabSheet2.Enabled:=false; // 切り出しツール
TabSheet3.Enabled:=false; // 結合ツール
KS1.Caption:='録音終了'; // 録音開始
KC1.Enabled:=false; // 切り出しツールメニュー
KA1.Enabled:=false; // 結合ツールメニュー
BitBtn4.Enabled:=true; // 停止ボタン
TrackBar951.Max:=(SpinEdit1.Value*60+SpinEdit2.Value)*60+SpinEdit3.Value;
TrackBar951.Min:=0;
TrackBar951.Position:=0;
// 時刻表示のバグを直した(ver 0.8)
Label34.Caption:=FormatDateTime('hh:nn:ss',TrackBar951.Max/60/60/24);
Timer2.Enabled:=true;
end;
// ファイルを録音状態にセット
procedure RecordingSetting;
begin
if Edit1.Text='' then exit;
if (FileExists(Edit1.Text+'\wavkntmp.wav')) then
begin
if Application.MessageBox('テンポラリファイルがすでに存在しますが、上書きしますか?',
'ファイルの上書きの確認',mb_YesNo)=IDNo then Exit;
end;
RecordingDisplaySetting;
if Pos('Stereo',ComboBox2.Text)>0 then ch:=2 else ch:=1;
if Pos('11kHz',ComboBox2.Text)>0 then freq:=11025
else if Pos('22kHz',ComboBox2.Text)>0 then freq:=22050
else if Pos('32kHz',ComboBox2.Text)>0 then freq:=32000
else if Pos('44.1kHz',ComboBox2.Text)>0 then freq:=44100
else if Pos('48kHz',ComboBox2.Text)>0 then freq:=48000
else if Pos('5kHz',ComboBox2.Text)>0 then freq:=5000;
if Pos('8bit',ComboBox2.Text)>0 then bits:=8 else bits:=16;
createzerowaveform(Edit1.Text+'\wavkntmp.wav',ch,freq,bits);
end;
begin
RecordingSetting;
MediaPlayer1.FileName:=Edit1.Text+'\wavkntmp.wav';
MediaPlayer1.Open;
MediaPlayer1.StartRecording;
end;
// Waveファイルのヘッダを書く
procedure TForm1.HeaderCreate(fs:TFileStream;FmtComboBox:TComboBox);
var WaveFormat1:TWAVEFORMATEX;
ck:array[0..3] of Char;
cksize:longint;
begin
ck:='RIFF';
fs.WriteBuffer(ck,4);
cksize:=0;
fs.WriteBuffer(cksize,4);
ck:='WAVE';
fs.WriteBuffer(ck,4);
ck:='fmt ';
fs.WriteBuffer(ck,4);
ckSize:=16;
fs.WriteBuffer(cksize,4);
with waveformat1 do
begin
if Pos('Stereo',FmtComboBox.Text)>0 then nchannels:=2 else nchannels:=1;
if Pos('11kHz',FmtComboBox.Text)>0 then nSamplesPerSec:=11025
else if Pos('22kHz',FmtComboBox.Text)>0 then nSamplesPerSec:=22050
else if Pos('32kHz',FmtComboBox.Text)>0 then nSamplesPerSec:=32000
else if Pos('44.1kHz',FmtComboBox.Text)>0 then nSamplesPerSec:=44100
else if Pos('48kHz',FmtComboBox.Text)>0 then nSamplesPerSec:=48000
else if Pos('5kHz',FmtComboBox.Text)>0 then nSamplesPerSec:=5000;
if Pos('8bit',FmtComboBox.Text)>0 then wbitsPerSample:=8 else wbitsPerSample:=16;
wFormatTag:=WAVE_FORMAT_PCM;
nAvgBytesPerSec:=nSamplesPerSec*nchannels*(wbitsPerSample div 8);
nBlockAlign:=nchannels*(wbitsPerSample div 8);
cbSize:=0;
end;
fs.WriteBuffer(waveformat1,18);
fs.Seek(-2,soFromCurrent);
ck:='data';
fs.WriteBuffer(ck,4);
ckSize:=0;
fs.WriteBuffer(cksize,4);
end;
// Waveファイルのヘッダを修正する
procedure TForm1.HeaderCorrect(fs:TFileStream);
var ckSize:longint;
begin
fs.Seek(4,soFromBeginning);
ckSize:=fs.Size-8;
fs.WriteBuffer(ckSize,4);
ckSize:=fs.Size-44;
fs.Seek(32,soFromCurrent);
fs.WriteBuffer(ckSize,4);
end;
procedure TForm1.WaveStopProc;
var k:integer;
begin
Screen.Cursor := crHourglass; // 砂時計型カーソルを表示します
try
Timer2.Enabled:=false;
MediaPlayer1.Stop;
MediaPlayer1.Save;
MediaPlayer1.Close;
// 他のコンポーネントの操作を禁止
BitBtn5.Enabled:=true; // 録音ボタン
Button1.Enabled:=true; // Waveの保存フォルダの参照
if CheckBox4.Checked then Button14.Enabled:=true; // 今すぐ補正
SpinEdit1.Enabled:=true; // 録音時間(hour)
SpinEdit2.Enabled:=true; // 録音時間(min)
SpinEdit3.Enabled:=true; // 録音時間(sec)
ComboBox2.Enabled:=true; // 形式
CheckBox1.Enabled:=true; // 録音後すぐに切り出す
CheckBox4.Enabled:=true; // 0点補正
TabSheet2.Enabled:=true; // 切り出しツール
TabSheet3.Enabled:=true; // 結合ツール
KS1.Caption:='録音開始'; // 録音開始
KC1.Enabled:=true; // 切り出しツールメニュー
KA1.Enabled:=true; // 結合ツールメニュー
BitBtn4.Enabled:=false; // 停止ボタン
TrackBar951.Position:=0;
finally
Screen.Cursor := crDefault; // 必ず通常のカーソルに戻ります
end;
if CheckBox1.Checked then
begin
Edit3.Text:=Edit1.Text+'\wavkntmp.wav';
if Pos('48kHz',ComboBox2.Text)>0 then k:=1
else if Pos('44.1kHz',ComboBox2.Text)>0 then k:=2
else if Pos('32kHz',ComboBox2.Text)>0 then k:=3
else if Pos('22kHz',ComboBox2.Text)>0 then k:=4
else if Pos('11kHz',ComboBox2.Text)>0 then k:=5
else if Pos('5kHz',ComboBox2.Text)>0 then k:=6;
if Pos('Mono',ComboBox2.Text)>0 then k:=k+6;
if Pos('8bit',ComboBox2.Text)>0 then k:=k+12;
ComboBox3.ItemIndex:=k-1;
cuttingproc;
end
else
Application.MessageBox('録音は正常に終了しました。',
'録音終了',mb_IconInformation or mb_Ok);
end;
procedure TForm1.BitBtn4Click(Sender: TObject);
begin
WaveStopProc;
end;
procedure TForm1.KS3Click(Sender: TObject);
begin
cuttingproc;
end;
procedure TForm1.cuttingproc;
var i,ii,iii:integer;
fs,fs2:TFileStream;
ms:TMemoryStream;
ckid:array[0..3] of char;
k:integer;
cksize:longint;
ch,freq,bit:integer;
bufsize:integer;
mutesize:integer;
trigerlevel,trigertime:integer;
cuttime:longint;
tracknum,loopnum2:integer;
startpos,flag:integer;
ls:byte;
l:array [1..2] of smallint;
orgpos:longint;
zpos:array[1..2] of smallint;
ll:longint;
nextfile:boolean;
begin
PageControl1.ActivePage:=TabSheet2;
// 閾値
trigerlevel:=SpinEdit7.Value;
trigertime:=SpinEdit8.Value;
// 同じ時間での切り取り
cuttime:=(SpinEdit4.Value*60+SpinEdit5.Value)*60+SpinEdit6.Value;
if Edit3.Text='' then exit;
if (FileExists(Edit4.Text+'\wk??????.wav')) then
begin
if Application.MessageBox('ファイルがすでに存在しますが、上書きしますか?',
'ファイルの上書きの確認',mb_YesNo)=IDNo then Exit;
end;
Form1.Enabled:=false;
try
if Pos('Stereo',ComboBox3.Text)>0 then ch:=2 else ch:=1;
if Pos('11kHz',ComboBox3.Text)>0 then freq:=11025
else if Pos('22kHz',ComboBox3.Text)>0 then freq:=22050
else if Pos('32kHz',ComboBox3.Text)>0 then freq:=32000
else if Pos('44.1kHz',ComboBox3.Text)>0 then freq:=44100
else if Pos('48kHz',ComboBox3.Text)>0 then freq:=48000
else if Pos('5kHz',ComboBox3.Text)>0 then freq:=5000;
if Pos('8bit',ComboBox3.Text)>0 then bit:=8 else bit:=16;
Form4.show;
fs:=TFileStream.Create(Edit3.Text,fmOpenRead);
try
// waveファイルの読み取りには本来mmio関数を使うべきだが
// これを使うと面倒なので、ここでは4バイトずつ読んで、
// 'data'チャンクを探す
if UpperCase(ExtractFileExt(Edit3.Text))='.WAV' then
begin
fs.Seek(0,soFromBeginning);
k:=0;
ckid:=' ';
while not (ckid='fmt ') and (k<200) do
begin
fs.Read(ckid,4);
inc(k);
end;
// 200バイトも探したのに、見つからなかった(壊れてる??)
if k=200 then
begin
Application.MessageBox('サポートできない形式です。',
'Error',mb_IconHand or mb_Ok);
exit;
end;
fs.Read(cksize,4);
k:=0;
ckid:=' ';
fs.Seek(ckSize,soFromCurrent);
while not (ckid='data') and (k<200) do
begin
fs.Read(ckid,4);
inc(k);
end;
// 200バイトも探したのに、見つからなかった(壊れてる??)
if k=200 then
begin
Application.MessageBox('サポートできない形式です。',
'Error',mb_IconHand or mb_Ok);
exit;
end;
fs.Read(cksize,4);
end
else cksize:=fs.Size;
orgpos:=fs.Position;
Form4.Label1.Caption:='1曲目を生成しています';
Application.ProcessMessages;
///////////////////////////////////////////////////////////
//
// 閾値による切り出し
if RadioButton1.Checked then
begin
// バッファサイズは8192
bufsize:=SpinEdit8.value;//8192;
if (CheckBox4.Checked) then
begin
zpos[1]:=StrToInt(Label29.Caption);
zpos[2]:=StrToInt(Label30.Caption);
end
else
begin
zpos[1]:=0;
zpos[2]:=0;
end;
tracknum:=1;
mutesize:=0;
_breakflag:=0;
nextfile:=false;
fs2:=TFileStream.Create(Edit4.Text+'\wk000001.wav',fmCreate);
try
headercreate(fs2,ComboBox3);
ms:=TMemoryStream.Create;
try
loopnum2:=ckSize div ((bit div 8)*ch*bufsize);
for i:=1 to loopnum2 do
begin
// バッファに読み込みます
ms.Clear;
ms.CopyFrom(fs,bufsize*ch*(bit div 8));
ms.Seek(0,soFromBeginning);
startpos:=0;
// 閾値を探す
flag:=0;
ii:=0;
while (flag=0) do
begin
l[2]:=0;
case bit of
8:
begin
for iii:=1 to ch do
begin
ms.Read(ls,1);
ls:=ls-zpos[iii];
l[iii]:=ls-128;
if (l[iii]>128) then ls:=255
else if (l[iii]<-128) then ls:=0;
ms.Seek(-1,soFromCurrent);
ms.Write(ls,1);
end;
end;
16:
begin
for iii:=1 to ch do
begin
ms.Read(l[iii],2);
ll:=l[iii]-zpos[iii];
if (ll>32767) then l[iii]:=32767
else if (ll<-32768) then l[iii]:=-32768
else l[iii]:=ll;
ms.Seek(-2,soFromCurrent);
ms.Write(l[iii],2);
end;
end;
end;
if (abs(l[1])<trigerlevel) and
(abs(l[2])<trigerlevel) then
begin
inc(mutesize);
if mutesize>trigertime then
begin
nextfile:=true;
startpos:=ii;
end;
end
else
begin
if nextfile then
begin
if startpos-trigdelay>0 then startpos:=startpos-trigdelay
else startpos:=0;
ms.seek(0,soFromBeginning);
fs2.CopyFrom(ms,ch*(bit div 8)*startpos);
// ファイルをクローズ
headercorrect(fs2);
fs2.Free;
// トラック番号
inc(tracknum);
Form4.Label1.Caption:=Format('%d',[tracknum])+'曲目を検出しました。';
Application.ProcessMessages;
// バッファから最終的に書き込むファイル
// 新しいファイルを作る
fs2:=TFileStream.Create(Edit4.Text+'\wk'+Format('%6.6d',[tracknum])+'.wav',fmCreate);
headercreate(fs2,ComboBox3);
fs2.CopyFrom(ms,ms.Size-ms.Position);
mutesize:=0;
startpos:=0;
flag:=1;
nextfile:=false;
end
// 閾値以下の点が短すぎたら、
// 曲の切れ目ではないと判断
else
begin
mutesize:=0;
nextfile:=false;
end;
end;
inc(ii);
if ii=bufsize then flag:=2;
end;
if flag=2 then
begin
ms.seek(0,soFromBeginning);
fs2.CopyFrom(ms,ms.Size);
end;
Form4.ProgressBar1.Position:=trunc(i/loopnum2*100);
Application.ProcessMessages;
if _breakflag=-1 then exit;
end;
finally
ms.Free;
end;
// 最後の残りをコピー
fs.Seek(orgpos+loopnum2*(bit div 8)*ch*bufsize,soFromBeginning);
ckSize:=ckSize-loopnum2*(bit div 8)*ch*bufsize;
if ckSize<>0 then
begin
for i:=0 to ckSize div ((bit div 8)*ch) do
begin
case bit of
8:
begin
for iii:=1 to ch do
begin
fs.Read(ls,1);
ls:=ls-zpos[iii];
l[iii]:=ls-128;
if (l[iii]>128) then ls:=255
else if (l[iii]<-128) then ls:=0;
fs2.Write(ls,1);
end;
end;
16:
begin
for iii:=1 to ch do
begin
fs.Read(l[iii],2);
ll:=l[iii]-zpos[iii];
if (ll>32767) then l[iii]:=32767
else if (ll<-32768) then l[iii]:=-32768
else l[iii]:=ll;
fs2.Write(l[iii],2);
end;
end;
end;
end;
end;
headercorrect(fs2);
finally
fs2.Free;
end;
end
///////////////////////////////////////////////////////////
//
// 同じ長さのwaveに分割
else
begin
bufsize:=cuttime*(bit div 8)*ch*freq;
loopnum2:=cksize div bufsize;
_breakflag:=0;
for i:=1 to loopnum2 do
begin
Form4.Label1.Caption:=Format('%d',[i])+'曲目の生成中です。';
Application.ProcessMessages;
fs2:=TFileStream.Create(Edit4.Text+'\wk'+Format('%6.6d',[i])+'.wav',fmCreate);
try
headercreate(fs2,ComboBox3);
fs2.CopyFrom(fs,bufsize);
headercorrect(fs2);
finally
fs2.Free;
end;
Form4.ProgressBar1.Position:=trunc(i/loopnum2*100);
Application.ProcessMessages;
if _breakflag=-1 then exit;
end;
fs2:=TFileStream.Create(Edit4.Text+'\wk'+Format('%6.6d',[loopnum2+1])+'.wav',fmCreate);
try
headercreate(fs2,ComboBox3);
fs2.CopyFrom(fs,cksize-loopnum2*bufsize);
headercorrect(fs2);
finally
fs2.Free;
end;
end;
finally
fs.Free;
Form4.Label1.Caption:='';
Form4.Hide;
end;
Form1.Enabled:=true;
Application.MessageBox('切り出しは正常に終了しました。',
'切り出し終了',mb_IconInformation or mb_Ok);
// 結合前のファイルを消去
if CheckBox6.Checked then
begin
if DeleteFile(Edit3.Text) then
Edit3.Text:='';
end;
finally
Form1.Enabled:=true;
end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
TrackBar951.Position:=TrackBar951.Position+1;
// 時刻表示のバグを直した(ver 0.7)
Label33.Caption:=FormatDateTime('hh:nn:ss',TrackBar951.Position/60/60/24);
if TrackBar951.Position=TrackBar951.Max then
begin
Timer2.Enabled:=false;
wavestopproc;
end;
end;
procedure TForm1.Button10Click(Sender: TObject);
var i:integer;
fs,fs2:TFileStream;
ckid:array[0..3] of char;
k:integer;
cksize:longint;
begin
if ListBox1.Items.Count=0 then exit;
if Edit2.Text='' then Exit;
Form1.Enabled:=false;
try
Form3.Show;
_breakflag:=0;
fs:=TFileStream.Create(Edit2.Text,fmCreate);
try
headercreate(fs,ComboBox4);
for i:=0 to ListBox1.Items.Count-1 do
begin
Form3.Label1.Caption:=ListBox1.Items[i]+'を結合しています...';
Application.ProcessMessages;
fs2:=TFileStream.Create(ListBox1.Items[i],fmOpenRead);
try
// waveファイルの読み取りには本来mmio関数を使うべきだが
// これを使うと面倒なので、ここでは4バイトずつ読んで、
// 'data'チャンクを探す
if UpperCase(ExtractFileExt(ListBox1.Items[i]))='.WAV' then
begin
fs2.Seek(0,soFromBeginning);
k:=0;
ckid:=' ';
while not (ckid='fmt ') and (k<200) do
begin
fs2.Read(ckid,4);
inc(k);
end;
// 200バイトも探したのに、見つからなかった(壊れてる??)
if k=200 then
begin
Application.MessageBox('サポートできない形式です。',
'Error',mb_IconHand or mb_Ok);
exit;
end;
fs2.Read(cksize,4);
k:=0;
ckid:=' ';
fs2.Seek(ckSize,soFromCurrent);
while not (ckid='data') and (k<200) do
begin
fs2.Read(ckid,4);
inc(k);
end;
// 200バイトも探したのに、見つからなかった(壊れてる??)
if k=200 then
begin
Application.MessageBox('サポートできない形式です。',
'Error',mb_IconHand or mb_Ok);
exit;
end;
fs2.Read(cksize,4);
end
else cksize:=fs2.Size;
fs.CopyFrom(fs2,cksize);
Application.ProcessMessages;
if _breakflag=-1 then exit;
finally
fs2.Free;
end;
// 結合前のファイルを消去
if CheckBox5.Checked then
DeleteFile(ListBox1.Items[i]);
Form3.ProgressBar1.Position:=trunc((i+1)/ListBox1.Items.Count*100);
end;
headercorrect(fs);
finally
fs.Free;
Form3.Label1.Caption:='';
Form3.Hide;
end;
Form1.Enabled:=true;
Application.MessageBox('結合は正常に終了しました。',
'結合終了',mb_Ok);
if CheckBox5.Checked then
ListBox1.Items.Clear;
finally
Form1.Enabled:=true;
end;
end;
procedure TForm1.SpinEdit5Change(Sender: TObject);
begin
if (SpinEdit4.Value=0) and
(SpinEdit5.Value=0) then
begin
SpinEdit6.Value:=1;
SpinEdit6.MinValue:=1;
SpinEdit6.MaxValue:=59;
end
else
begin
SpinEdit6.MinValue:=0;
SpinEdit6.MaxValue:=59;
end;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
// 録音中であった
if BitBtn4.Enabled then
begin
if Application.MessageBox('録音を中断して終了しますか?',
'録音中',mb_IconWarning or mb_YesNo)=IDYes then
begin
CheckBox1.Checked:=false;
WaveStopProc;
end
else CanClose:=false;
end;
end;
// エクスプローラからのDrag&Dropを許可する
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := Params.EXStyle or WS_EX_ACCEPTFILES;
end;
// エクスプローラからのDrag&Drop
procedure TForm1.WMDropFiles(var msg: TWMDROPFILES);
var m:integer;
buf:array[0..260] of Char;
i:integer;
s:string;
StringList1:TStringList;
begin
msg.Result := 0;
if PageControl1.ActivePage=TabSheet2 then
begin
DragQueryFile(msg.Drop, 0, buf, 260);
s:=string(buf);
if (UpperCase(ExtractFileExt(s))='.RAW') or
(UpperCase(ExtractFileExt(s))='.WAV') then
SetCutFileName(s);
end
else if PageControl1.ActivePage=TabSheet3 then
begin
// Drag&Dropされたファイルの数
m:=DragQueryFile(msg.Drop, Cardinal(-1), NIL, 0);
StringList1:=TStringList.Create;
try
for i:=0 to m-1 do
begin
// i番目のファイル名
DragQueryFile(msg.Drop, i, buf, 260);
s:=string(buf);
if (UpperCase(ExtractFileExt(s))='.RAW') or
(UpperCase(ExtractFileExt(s))='.WAV') then
begin
StringList1.Add(s);
end;
end;
if StringList1.Count>0 then SetCmbFiles(StringList1);
finally
StringList1.Free;
end;
end;
end;
procedure TForm1.KS1Click(Sender: TObject);
begin
if KS1.Caption='録音開始(&S)' then
recordingbuttonclick
else WaveStopProc;
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
DiskFreeCalcProc;
end;
procedure TForm1.CDPlayerC1Click(Sender: TObject);
begin
WinExec('cdplayer.exe',SW_SHOW);
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Label29.Caption:='0';
Label30.Caption:='0';
Fzeroadjdata[1]:=0;
Fzeroadjdata[2]:=0;
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
Label37.Caption:='0';
Label38.Caption:='0';
end;
procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
Label40.Caption:='0';
Label41.Caption:='0';
end;
function TForm1.Getzeroadjdata(i:integer):integer;
begin
Result:=Fzeroadjdata[i];
end;
procedure TForm1.Setzeroadjdata(i,value:integer);
begin
Fzeroadjdata[i]:=value;
end;
procedure TForm1.ComboBox2Change(Sender: TObject);
var i, oldCB3Index : integer;
begin
oldCB3Index := ComboBox3.ItemIndex;
i := 0;
ComboBox3.ItemIndex := i;
while (i<ComboBox3.Items.Count) and
(ComboBox2.Items[ComboBox2.ItemIndex] <> ComboBox3.Items[ComboBox3.ItemIndex]) do
begin
ComboBox3.ItemIndex := i;
inc(i);
end;
if i = ComboBox3.Items.Count then
ComboBox3.ItemIndex := oldCB3Index;
DiskFreeCalcProc;
end;
end.