SOUNDサウンド関数

本ページには広告が含まれています。

サウンドを再生します。.wav,.mid,.avi,.mp3は再生できますが、.m4a,.oggは再生できません。音声ファイルが見つからない場合エラー音が鳴ります。

構文
  1. void = SOUND( ファイル名, 同期フラグ, WAV出力先 )
引数
ファイル名 (String)必須
再生ファイル名(WAV, MID, AVI等, 'BEEP' 指定にてBEEP音)もしくはサウンドにて割り当てられたイベント名('LowBatteryAlarm', 'MailBeep', 'SystemAsterisk'等) (ファイル名を省略すると再生をストップ)
同期フラグ (Boolean = False)省略可
FALSE
待たない (デフォルト)
TRUE
終了を待つ
WAV出力先 (Integer = 0)省略可
WAVファイル時の再生デバイス (0から、デフォルト=0)
戻り値

同期フラグ

音声ファイルが終了してから処理を進める場合はTrueを指定します。

UWSC
SOUND("D:\Music\sample.mp3", TRUE)

FOR i = 1 TO 100
	FUKIDASI(i)
	SLEEP(0.100)
NEXT

同期フラグにFalseを指定すると音声を再生してから終了を待たずに次の処理に進み、処理が終わると音声が止まります。

UWSC
SOUND("D:\Music\sample.mp3", FALSE)

FOR i = 1 TO 100
	FUKIDASI(i)
	SLEEP(0.100)
NEXT

音声を繰り返し流す

スレッドを使いメインルーチンと別に音声を流す処理を組み込みます。

UWSC
THREAD musicPlay("D:\Music\sound.mp3", 100)

FOR i = 1 TO 100
	FUKIDASI(i)
	SLEEP(0.100)
NEXT

//////////////////////////////////////////////////
// 【引数】
//   path:再生する音声ファイルのパス、times:繰り返す回数
// 【戻り値】
//   
//////////////////////////////////////////////////
PROCEDURE musicPlay(path, times)
	FOR i = 1 TO times
		SOUND(path, TRUE)
	NEXT
FEND

メインルーチンが終わるまで音声を流し続けるにはSOUND関数をWHILE文で無限ループにします。

UWSC
THREAD musicPlay("D:\Music\sound.mp3")

FOR i = 1 TO 100
	FUKIDASI(i)
	SLEEP(0.100)
NEXT

PROCEDURE musicPlay(path)
	WHILE TRUE
		SOUND(path, TRUE)
	WEND
FEND

WAV出力先取得

[スタート]-[設定]-[システム]-[サウンド]にある出力デバイスの項目を取得しています。タスクトレイのスピーカーを右クリック-[サウンドの設定を開く]でも開けます。接続しているスピーカー・Blutoothイヤホンなどが表示されます。この順番がおそらくWAV出力先の番号と一致していると思われます。

UWSC
DOSCMD("start ms-settings:sound")

DIM ID = GETID("設定", "ApplicationFrameWindow")

FOR i = 0 TO GETITEM(ID, ITM_LIST, 2) - 1
	PRINT i + "<#TAB>" + ALL_ITEM_LIST[i]
NEXT

CTRLWIN(ID, CLOSE)
結果
プレーンテキスト
0	スピーカー (SoundMAX Integrated Digital HD Audio)
1	ヘッドホン (SR9001 Stereo)

プログラム実行例

Windows通知のwavファイルを再生する

C:\Windows\Media\Windows Notify.wavを再生します。

UWSC
SOUND("C:\Windows\Media\Windows Notify.wav", TRUE)
使用関数

フォルダ内の音声ファイルをすべて再生

UWSC
HASHTBL iColumn

DIM Shell = CREATEOLEOBJ("Shell.Application")
DIM Folder = Shell.NameSpace("C:\Windows\Media")

FOR i = 0 TO 350
	iColumn[Folder.GetDetailsOf(EMPTYPARAM, i)] = i
NEXT

DIM FolderItems = Folder.Items
DIM extensions[] = ".wav", ".mid", ".avi", ".mp3"

FOR FolderItem IN FolderItems
	DIM path = FolderItem.Path
	IF inArray(Folder.GetDetailsOf(FolderItem, iColumn["ファイル拡張子"]), extensions) = FALSE THEN CONTINUE
	FUKIDASI(path)
	SOUND(path, TRUE)
NEXT

//////////////////////////////////////////////////
// 【引数】
//   needle : 探す値 
//   haystack : 配列 
//   strict : 型も同じかチェックします 
// 【戻り値】
//   TRUE : 配列中に指定した値が存在する、FALSE : 配列中に指定した値が存在しない 
//////////////////////////////////////////////////
FUNCTION inArray( needle, haystack[], strict = FALSE)
	DIM res = FALSE
	FOR item IN haystack
		IFB needle = item THEN
			IFB strict THEN
				IFB VARTYPE(needle) = VARTYPE(item) THEN
					res = TRUE
					BREAK
				ENDIF
			ELSE
				res = TRUE
				BREAK
			ENDIF
		ENDIF
	NEXT
	RESULT = res
FEND
使用関数

指定フォルダ内の曲をトラック番号順で再生

UWSC
DIM Shell = CREATEOLEOBJ("Shell.Application")
DIM folderspec = "F:\Music\sample"
DIM Folder = Shell.NameSpace(folderspec)
DIM FolderItems = Folder.Items

HASHTBL iColumn

FOR i = 0 TO 350
	iColumn[Folder.GetDetailsOf(EMPTYPARAM, i)] = i
NEXT

DIM filename[-1]
DIM track[-1]

FOR i = 0 TO FolderItems.Count - 1
	DIM FolderItem = FolderItems.Item(i)
	IF FolderItem.isFolder THEN CONTINUE
	IF Folder.GetDetailsOf(FolderItem, iColumn["ファイル拡張子"]) <> ".wav" THEN CONTINUE
	arrayPush(filename, Folder.GetDetailsOf(FolderItem,iColumn["名前"]))
	arrayPush(track, Folder.GetDetailsOf(FolderItem, iColumn["トラック番号"]))
NEXT

QSORT(track, QSRT_NATURALA, filename)

FOR i = 0 TO UBound(filename)
	DIM path = folderspec + "\" + filename[i]
	FUKIDASI(filename[i])
	SOUND(path, TRUE)
NEXT

//////////////////////////////////////////////////
// 【引数】
//   array : 要素を追加する配列(参照引数) 
//   values : 追加する要素をvalue1から指定 
// 【戻り値】
//   処理後の配列の要素の数 
//////////////////////////////////////////////////
FUNCTION arrayPush(var array[], value1 = EMPTY, value2 = EMPTY, value3 = EMPTY, value4 = EMPTY, value5 = EMPTY, value6 = EMPTY, value7 = EMPTY, value8 = EMPTY, value9 = EMPTY, value10 = EMPTY, value11 = EMPTY, value12 = EMPTY, value13 = EMPTY, value14 = EMPTY, value15 = EMPTY, value16 = EMPTY)
    DIM i = 1
    WHILE EVAL("value" + i) <> EMPTY
	  DIM res = RESIZE(array, UBound(array) + 1)
	  array[res] = EVAL("value" + i)
	  i = i + 1
	WEND
	RESULT = LENGTH(array)
FEND

//////////////////////////////////////////////////
// 【引数】
//   inputs : 繰り返す文字列 
//   multiplier : inputsを繰り返す回数 
// 【戻り値】
//   inputsをmultiplier回を繰り返した文字列を返します 
//////////////////////////////////////////////////
FUNCTION strRepeat(inputs, multiplier)
	DIM res = ""
	FOR n = 1 TO multiplier
		res = res + inputs
	NEXT
	RESULT = res
FEND

//////////////////////////////////////////////////
// 【引数】
//   arrayname : 上限値を求める配列の名前 
//   dimension : 返す次元を示す整数 
// 【戻り値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(arrayname[], dimension = 1)
	RESULT = EVAL("RESIZE(arrayname" + strRepeat("[0]", dimension - 1) + ")")
FEND
使用関数
解説

フラッシュ暗算

UWSC
SETHOTKEY(VK_ESC, EMPTYPARAM, "forceQuit")

DIM grades[] = "20級(初級)", "19級(初級)", "18級(初級)", "17級(初級)", "16級(初級)", "15級(初級)", "14級(初級)", "13級(初級)", "12級(初級)", "11級(初級)", _
				"10級(中級)", "9級(中級)", "8級(中級)", "7級(中級)", "6級(中級)", "5級(中級)", "4級(中級)", "3級(中級)", "2級(中級)", "1級(中級)", _
				"初段(上級)", "2段(上級)", "3段(上級)", "4段(上級)", "5段(上級)", "6段(上級)", "7段(上級)", "8段(上級)", "9段(上級)", "10段(上級)", _
				"11段(超上級)", "12段(超上級)", "13段(超上級)", "14段(超上級)", "15段(超上級)", "16段(超上級)", "17段(超上級)", "18段(超上級)", "19段(超上級)", "20段(超上級)"
DIM keta[] = 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, _
				2, 2, 2, 2, 2, 2, 2, 2, 2, 2, _ 
				2, 3, 3, 3, 3, 3, 3, 3, 3, 3, _ 
				3, 3, 3, 3, 3, 3, 3, 3, 3, 3
DIM num[] = 3, 3, 5, 8, 10, 12, 15, 20, 10, 15, _
				2, 3, 4, 5, 6, 7, 8, 10, 12, 15, _
				15, 4, 6, 8, 10, 12, 15, 15, 15, 15, _
				15, 15, 15, 15, 15, 15, 15, 15, 15, 15
DIM time[] = 5, 5, 7, 10, 12, 15, 15, 15, 10, 15, _
				4, 6, 7, 8, 9, 10, 11, 12, 12, 13, _
				10, 4, 5, 6, 7, 8, 8, 6, 4.5, 3, _
				2.8, 2.6, 2.4, 2.2, 2.0, 1.9, 1.8, 1.7, 1.6, 1.5
DIM grade = SLCTBOX(SLCT_CMB OR SLCT_NUM, 60, "レベルを選択", grades)
DIM sum = 0
DIM fontsize = 80
DIM fontname = "abacus2"
DIM fontcolor = $00aa00
DIM bgcolor = 1

FOR i = 1 TO num[grade]
	DIM n = POWER(10, keta[grade] - 1) + RANDOM(POWER(10, keta[grade]) - POWER(10, keta[grade] - 1))
	sum = sum + n
	DIM msg = " " + n + " "
	FUKIDASI(msg, G_SCREEN_W, G_SCREEN_H,, fontsize, fontname, fontcolor, bgcolor)
	DIM ID = GETID(GET_FUKIDASI_WIN)
	FUKIDASI(msg, (STATUS(ID, ST_X) - STATUS(ID, ST_WIDTH))/2, (STATUS(ID, ST_Y) - STATUS(ID, ST_HEIGHT))/2,, fontsize, fontname, fontcolor, bgcolor)
	SOUND("BEEP")
	SLEEP(time[grade])
	FUKIDASI()
NEXT

DIM ans = INPUT("答えは?")

IFB ans = sum THEN
	MSGBOX("正解です!(ans." + sum + ")")
ELSE
	MSGBOX("残念でした、正解は " + sum + " です。")
ENDIF

PROCEDURE forceQuit()
	EXITEXIT
FEND
使用関数
解説

BEEP音を鳴らす

UWSC
SOUND("BEEP")
使用関数