『サンプラー』ってご存知でしょうか。音を登録(サンプリング)しておいて、ボタンを押すとその音が鳴る道具。例えばこんな感じのものです。
Roland ローランド コンパクトサンプラー SP-404SX
もちろんPC用などのソフトウェアでも、探せば数多くあります。会社の忘年会などで「ドラムロールやファンファーレを流したことがある」という方もいるかもしれません。
このサンプラー、実は簡易的なものならAutoHotkeyで作ることができます。
今回はSoundPlayコマンドを使って、mp3などの音源を再生する方法を見ていきましょう。最終的には前回作成したシンプルタイマーにこの機能を応用し、時間が経過すると音で知らせてくれるタイマーに仕立ててみたいと思います。
音を鳴らしてみる
最初に単純なコードを試してみましょう。キーを押すと、指定された音源が流れるスクリプトです。
!F14::SoundPlay, *16
今回はAlt+F14をトリガーとして使用しています。いつものことですが、トリガーキーは好きなものを指定してください。
キーを押すとWindowsの一般的な警告音が流れるはず。今回の主役は、このSoundPlay
です。
SoundPlay
SoundPlay, Filename [, wait]
;メディアファイルを再生する
SoundPlay
はFilename、waitという引数を取り、Filenameで指定したメディアファイルを再生するコマンド。
引数
このコマンドは最低1つ、最大でも2つの引数しか取りません。
仮引数名 | 値 | 例 |
---|---|---|
Filename (必須) | メディアファイルのパスや、「*数値」 | *16 | some.mp3 |
wait | SoundPlayコマンドの後のコードを実行するか | (無し) | 1 |
このうちFilename引数は必須であり、ファイルへのパスや「*」(アスタリスク)+数値が入ります。アスタリスク+数値の場合は、Windowsのシステムサウンドが流れます。
数値 | サウンド |
---|---|
*-1 | 警告 |
*16 | 問い合わせ |
*48 | 警告 (Windows10の環境では、*-1と同じ) |
*64 | 情報 (Windows10の環境では、*-1と同じ) |
上のサンプルコードではこのシステムサウンドを再生しました。
mp3ファイルを再生する
次にFilename引数にパスを指定して、音源ファイルを再生してみましょう。お手持ちのmp3ファイルや、またはwavファイルでかまいません。
僕は今回こちらのサイトから短時間のmp3ファイルをダウンロードして、タイマーのアラームとして使用しました。
様々な音源が視聴できるので、ジングルやファンファーレなどの音源を探している方にもおすすめ。
ダウンロードしたファイルの名前を「jingle01.mp3」として、現在起動しているahkファイル(ここではmain.ahk)と同じディレクトリに置きます。
ご自分のmp3ファイルを使う場合は、そのファイル名に合わせてください。
AutoHotkeyのフォルダ
├── main.ahk
└── jingle01.mp3
そして最初のコードをこんな風に書き換えます。
!F14::SoundPlay, jingle01.mp3
リロードして実行すると、指定した音源が再生されるはずです。
このようにFilenameにファイルのパスを指定することで、任意のメディアファイルを再生することができます。
相対パスで正しく動作しない場合は絶対パスを指定するか、%A_WorkingDir%のパスを確認してください。
タイマーをカスタマイズ
ではこの機能を、前回作成したシンプルタイマーに応用したいと思います。このタイマーのコードもメインファイルとは別のファイル。詳細は以下を確認してください。
カスタマイズ後のコード全体はこうなります。
InputBox, Min, 簡易タイマー, 時間を設定してください, , , , , , , , 5
Timer := Min * 60000
If(ErrorLevel == 0){
MsgBox, , タイマー開始, %Min%分カウントします..., 2
Sleep, %Timer%
SoundPlay, jingle01.mp3
ExitApp
}else{
ExitApp
}
7行目、Sleepの後にはToolTip
の代わりにSoundPlay
を置き、音で時間経過を知らせてくれるよう変更しました。これで思った通りの動作になるでしょうか? 一度試してみましょう。
音、鳴りましたか? 鳴りませんよね。
これでは音は鳴りません。鳴るはずがないんです。なぜならSoundPlay
が実行された瞬間、ExitApp
によってタイマー自体が終了してしまうからです。
waitを指定してスレッドを停止する
ここで登場するのがSoundPlay
のwait引数です。7行目に「, 1」を追加しましょう。
SoundPlay, jingle01.mp3, 1
リロードして実行すると、今度はきちんと再生されます。
このwait引数は「1」や「Wait」と指定することで、ファイルの再生が終了するまで次の行に移らず、処理の流れを一旦停止するという働きがあります。
これがWikiにも書いてある「現在のスレッドは停止する」の意味です。