cls 1 ;背景白が眩しいので灰色 titl="BEEP音タイマー v1.00" title titl ;タイトル名を表示 #uselib "KERNEL32.DLL" #func Beep "Beep" int,int ;beep で音が出るように指定 test=0 ;テスト時=1 / EXE作成時には必ず=0に ;ベル指定1 syu=600 ;周波数を指定 long=200 ;音の長さを指定 kai=1 ;鳴らす回数を指定 time=0 ;タイマー設定時間 dlog=0 ;ベル鳴った後にダイアログでお知らせ =1 *dataload_001 ;ベル指定2 beep1.txtの内容を読み込みます、ベル指定1より優先される dat="" ;初期化 exist dir_exe+"\\beep1.txt" ;dir_exe→exeのあるフォルダのbeep1.txtの容量を検索 ;exist→容量の検索 if strsize=-1 : goto *dataload_999 ;if→もしもstrsize=-1なら *dataload_999へ移動 ;strsize→容量の検索結果、ファイルが無い場合は-1 sdim dat,strsize+4 ;sdim→データを格納する容量の確保 bload dir_exe+"\\beep1.txt",dat,strsize ;bload→ファイルからデータを読み込む ;beep1.txtの内容をstrsizeの分だけdatに読み込み repeat 5,0 ;5回ループ cntの初期値=0 a="" : notesel dat : noteget a,cnt ;datの内容を一行ずつ読む、cntはループする度に数値が+1 if a!"" : a=int(a) : { ;aに内容があるなら文字型のデータを数値型に変更 if cnt=0 : syu=a ;cnt=0→ループ0回目 値を数値に変換、 syuに代入 if cnt=1 : long=a ;cnt=1→ループ1回目 値を数値に変換、longに代入 if cnt=2 : kai=a ;cnt=2→ループ2回目 値を数値に変換、 kaiに代入 if cnt=3 : time=a ;cnt=3→ループ3回目 値を数値に変換、timeに代入 if cnt=4 : dlog=a ;cnt=3→ループ4回目 値を数値に変換、dlogに代入 } loop ;指定されている回数分 repeat に戻る ; dialog ""+syu+" / "+long+" / "+kai+" / "+time+" / "+dlog gosub *datachk_001 ;読み込まれたデータに異常がないかチェック *dataload_999 if test=1 : goto *beep_001 ;goto→ *beep_001 へ移動 if dir_cmdline="" : goto *beep_010 ;dir_cmdline→コマンドラインオプションがない場合 *beep_100 へ *beep_001 ;ラベル、goto *beep_001 とする事でここに戻れる ;ここでコマンドラインの数値を分解します sdim data,100 : data=""+dir_cmdline ;コマンドライン文字をdataに格納 if test=1 : data=" /700 /300 /4 /3" ;test時のコマンドライン文字を指定 a="" ;雑用a lod=instr(data,0,"/") ;instr→dataに内に/があるかどうか0文字目から検索、結果はlodに ;コマンドラインがあるかどうかの簡易調査 if lod=-1 : goto *beep_100 ;なければ *beep_100 へ repeat 4,0 ;周波数、音の長さ、回数、タイマー設定時間を取得する為に4回ループ a="" : lod=instr(data,0,"/") ;数値を取得する為、先頭の/を検索 if lod=-1 : goto *beep_100 ;/が無い場合はエラー扱い、 *beep_100 へ siz=instr(data,lod," ") ;数値を取得する為、後ろ空白(スペース)を検索 if siz=-1 : siz=strlen(data) : siz+ ;空白(スペース)が無い場合は全体の長さを取得 a=strmid(data,lod+1,siz-1) ;aに/から空白(スペース)までの文字を抜き出す a=int(a) ;文字型のデータを数値型に変更 ;ベル指定3 コマンドラインが最優先 if cnt=0 : syu=a ;cnt=0→ループ0回目 値を数値に変換、 syuに代入 if cnt=1 : long=a ;cnt=1→ループ1回目 値を数値に変換、longに代入 if cnt=2 : kai=a ;cnt=2→ループ2回目 値を数値に変換、 kaiに代入 if cnt=3 : time=a ;cnt=3→ループ3回目 値を数値に変換、timeに代入 max=strlen(data) ;dataの文字の長さをmaxに代入 data=strmid(data,siz+1,max-(siz+1)) ;上で取得した部分を切り落とす ; /700 /300 /4 /3 ループ1回目↓ ; /300 /4 /3 ループ2回目↓ ; /4 /3 ループ3回目↓ ; /3 ループ4回目 loop ;ループ gosub *datachk_001 ;読み込まれたデータに異常がないかチェック if time=0 : goto *beep_100 ;コマンドラインでタイマー指定無い=0 音を鳴らして終了 if time!0 : goto *beep_020_cmdline ;コマンドラインでタイマー指定あり *beep_020_cmdline へ ; if test=1 : dialog "以下の設定で鳴らします\n\n周波数 "+syu+"\n長さ "+long+"\n回数 "+kai *beep_010 ;タイマー使用時の注意書き表示と設定 title titl width 120,75 : cls 1 ;ウィンドウの大きさ 120横幅,75縦幅 font "MS ゴシック",14 ;使用文字フォントと大きさの指定 pos 05,05 : mes "タイマーの時間を\nキーボードで入力" ;pos→表示の座標指定 右5,下5 pos 18,40 : mes "Enterで開始\nESCでやり直し" ;mes→文字を表示 \n は改行 if (dat="") & (dir_cmdline="") : { ;コマンドラインオプションがない場合 syu=600 ;音の音色を変えます、鳴る回数は3回 long=200 kai=3 ;{ → if で条件の分岐をした場合 } ;一行で書くと長くなるばあいは括弧で囲んで ;複数列で書き込んだ方が見やすい ;最終行は } で閉じるのを忘れずに a="" ;キーボードで入力した数値の一時格納先 z=0 ;雑用z gsel 0,1 ;ウィンドウID=0をアクティブ onkey *inkey ;キーボードを押すと *inkey へ飛ぶ stop ;動作停止 *inkey ;押されたキーボードのキーを取得 if lparam>>30 : goto *beep_999 ;Error用? ;iparam→onkey命令により押されたキー番号が格納 if iparam=27 : a="" : title "0" ;ESCキー(27)が押された場合、タイマー値aを初期化 if iparam=13 : goto *beep_020 ;ENTERキー(13)が押された場合、タイマー実行 ;押すキーと番号はgetkeyのhelp参照 z=-1 ;数値が押されたかの判別用 if (iparam>47) & (iparam<58) : z=iparam-48 ;キーボードの数値0-9 が押された場合 if (iparam>95) & (iparam<106) : z=iparam-96 ;キーボードの数値0-9 テンキー 〃 ;onkey命令後にキーボードの 0を押すと結果は48 ;1を押すと結果は49となります、よって0を取得する場合48を引く ;詳しくはgetkey参照 if z=-1 : stop ;押されたのが数値じゃない場合、停止 a+=""+z ;aに入力された数値を加える title ""+a ;aをタイトルバーに stop ;停止、キー入力待ち *beep_020 ;キーボード入力待機の後始末 if (a="") | (a="0") : stop ;タイマー設定時間がない場合停止 onkey 0 ;キーボードを押すと*inkeyへ飛ぶの停止 a=int(a) : time=a : a="" ;文字型を数値型に、タイマー設定時間へ代入 *beep_020_cmdline ;タイマー設定時間がコマンドラインで指定してある場合ここまで飛んでくる if time=0 : goto *beep_100 ;タイマー指定時間が 0 ならただ鳴らして終了 ;**ここからタイマー開始動作** setm=gettime(5) ;gettime→時間の取得 ;開始分の取得 sets=gettime(6) ;開始秒 〃 width 120,25 ;ウィンドウが邪魔にならないようさらに小さく font "MS ゴシック",14 gosub *color_set001 ;gosub→*color_set001に飛び returnでここに戻ってくる gsel 0,1 : mode=1 ;mode=1の場合はタイマー使用中 *beep_030 ;タイマー本体 wait 1 ;一時停止、入れないとCPUごっそり持って行かれます if ten=100 : title "." ;秒を表示しない簡易タイマーなので if ten=200 : title ".." ;動いているかどうかの表示 if ten=300 : title "..." : ten=0 ;tenに 1 増加していって 100-300で文字を変化 ten+ act = ginfo(2) ;ウィンドウがアクティブになっているか if act=0 : { ;なっていたら getkey key,27 ;getkey→特定のキーが押されているか 27→ESC if key=1 : goto *stoptime_001 ;ESCが押されていたらタイマー終了 } m=gettime(5) ;現在分取得 if setm=m : goto *beep_030 ;前に取得した時間(分)と同じなら戻る s=gettime(6) ;現在秒取得 if sets>=s : goto *beep_030 ;タイマー開始した時間(秒)より同じか小さいなら戻る time- ;一分経過したのでtimeの値を -1 if time<1 : gosub *color_set001 : goto *beep_100; ; ;残り時間timeが1未満ならベルを鳴らす setm=m ;前に取得した分を現在の分に ;これがないと一気に残り時間が減ります *beep_040 gosub *color_set001 ;色指定 *color_set001 へ飛びここに戻る redraw 1 ;画面更新 goto *beep_030 ;*beep_030へ *beep_100 ;音を鳴らすメイン部分 repeat kai,0 ;repeat→kaiで指定した回数分loopまで繰り返す beep syu,long ;beep→上で指定した数値syuとlongで音を鳴らします wait 5 ;wait→数値の分だけ一時待機 getkey key1,16 ;getkey→特定のキーが押されているか getkey key2,17 ;押されていたら key(数値)に1が代入される ;後ろの数値はどのキーか。16→[SHIFT]、17→[CTRL] if (key1=1) & (key2=1) : break ;上のgetkeyで取得したSHIFTとCTRLが押されているかの判断 ;key1とkey2の数値が両方1なら(SHIFTとCTRLが押されてる)後の条件を実行 ;break→繰り返す回数が残っていてもrepeatのループより抜け出す loop ;loop→上にあるrepeatまで戻ります if mode=1 : { ;タイマーを使用中ならお知らせダイアログ if dlog=1 : dialog "時間です。" goto *beep_010 ;タイマー設定画面へ } goto *beep_999 ;終了 *color_set001 ;色指定場所 pos 0,-100 : mes "あと <"+time+"分>" ;画面外にタイマーの残り時間を表示し lod=ginfo(14) ;文字の長さ long をとります x=(ginfo_winx-lod)/2 ;ginfo_winx→画面の描写幅から文字の長さを引き2で割る ;表示する文字を中央に if x<1 : x=0 ;文字が多すぎてはみ出す場合は座標X:0 redraw ;redraw→画面がチラチラしないよう停止 color 192,192,192 : boxf : color ;color→色を灰色(192,192,192)に指定 ;指定した色で画面を塗りつぶす ;最後尾のcolorは黒色(0,0,0)、指定し忘れると背景と文字色が同じで見えない pos x,5 : mes "あと <"+time+"分>" ; redraw 1 ;画面がチラチラしないよう停止したのを解除 return ;gosub で呼び出された箇所に戻る *stoptime_001 ;タイマーを途中で停止 ESCキー押した場合 repeat 2 ;2回ループ beep syu,long ;停止の音を鳴らす wait 5 loop if dlog=1 : dialog "停止しました。" ;お知らせダイアログ goto *beep_010 *datachk_001 ;変な数値が入力されていた場合の修正 if syu<50 : syu=50 ;syuが50未満(50より少ない)なら50に if long<30 : long=30 ;以下略 if kai<1 : kai=1 ; if time<0 : time=0 ; if dlog<0 : dlog=0 ; return *beep_999 end ;終了