本ページには広告が含まれています。
Contents
サウンドを再生します。.wav,.mid,.avi,.mp3は再生できますが、.m4a,.oggは再生できません。音声ファイルが見つからない場合エラー音が鳴ります。
- 構文
- void = SOUND( ファイル名, 同期フラグ, WAV出力先 )
- 引数
- ファイル名 (String)必須
- 再生ファイル名(WAV, MID, AVI等, 'BEEP' 指定にてBEEP音)もしくはサウンドにて割り当てられたイベント名('LowBatteryAlarm', 'MailBeep', 'SystemAsterisk'等) (ファイル名を省略すると再生をストップ)
- 同期フラグ (Boolean = False)省略可
- FALSE
- 待たない (デフォルト)
- TRUE
- 終了を待つ
- WAV出力先 (Integer = 0)省略可
- WAVファイル時の再生デバイス (0から、デフォルト=0)
- 戻り値
同期フラグ
音声ファイルが終了してから処理を進める場合はTrueを指定します。
SOUND("D:\Music\sample.mp3", TRUE)
FOR i = 1 TO 100
FUKIDASI(i)
SLEEP(0.100)
NEXT
同期フラグにFalseを指定すると音声を再生してから終了を待たずに次の処理に進み、処理が終わると音声が止まります。
SOUND("D:\Music\sample.mp3", FALSE)
FOR i = 1 TO 100
FUKIDASI(i)
SLEEP(0.100)
NEXT
音声を繰り返し流す
スレッドを使いメインルーチンと別に音声を流す処理を組み込みます。
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文で無限ループにします。
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出力先の番号と一致していると思われます。
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を再生します。
SOUND("C:\Windows\Media\Windows Notify.wav", TRUE)
使用関数
フォルダ内の音声ファイルをすべて再生
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
使用関数
指定フォルダ内の曲をトラック番号順で再生
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
使用関数
解説
フラッシュ暗算
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音を鳴らす
SOUND("BEEP")
使用関数