RPGプログラムからサウンドを再生する
表示装置ファイルでイベントが発生したときに、オーディオ サウンドが再生されるようにしたいという依頼を受けることになりました。それまでに行ったことはありませんでしたが、やり方が分かったら面白いだろうと思いました。多くのタスクでもそうであるように、これを行う方法も複数あることが分かりました。目標は、プロセスをできるだけシームレスにする方法を選ぶこととしました。
最初に求められたのは、2種類のサウンドを再生することでした。すなわち、ポジティブなイベントを知らせるサウンドと、ネガティブなイベントを知らせるサウンドです。しかし、プロジェクトに取り掛かってみると、音が鳴ると有用かもしれない状況が他にもあるように思われました。2種類のサウンドが何を表すかは覚えやすいのですが、さらに種類が増えるとどのようなことを警告しているのかは覚えておきづらくなるかもしれません。そのことを踏まえて、プログラムが言葉を話すようにして、起こっていることをエンド ユーザーに対して言葉で説明させることができたらよいのではと考えました。テキストを音声に変換するソリューションを実現することはできなかったので、エンド ユーザーに聞かせたい言葉を自分の声で.wavファイルに録音しました。録音は、オンラインで利用可能なフリー サービスがあったので、それを利用して行いました。.wavファイルを作成できたので、必要なときにRPGプログラムからそのファイルを再生することができるようになりました。では、どのように行ったのか、詳しく見てみましょう。
IBM i からWindowsコマンドを実行できることは以前から知っていたので、そこから始めました。まずは、「 PCコマンドの開始(STRPCCMD)」コマンドを使用しました。このコマンドは、以前に、特に Excel および Word 文書を開くのに使用したことがありました。こうした知識があったので、 Windows Media Player などのプログラムも開くことができるだろうし、そのプログラムで.wavファイルを再生できるだろうと考えました。
このコマンドを使用するときは、実行ファイルのパスを知っている必要があります。パスが分かったら、そのプログラムを起動することができるはずです。 Google で少し検索してみたところ、 Windows プログラムの実行ファイルがどこに置かれているかが分かりました。
Windows Media Player で再生することはできたのですが、サウンドの再生が終了したときに閉じて非表示にしやすいことから、 SoundPlayer の方がニーズに合うように思われました。そうした方が、エンド ユーザーにとって使い勝手が良くなると考えたからです。
では、作成したプログラムを見てみましょう。ここではプログラムの一部のみを示して説明するつもりですが、ソース全体が利用可能です。
まずは、PCオーガナイザーを開始(STRPCO)するのに必要となる、QCMDEXCプロトタイプを定義します(図1)。PCコマンドを実行するには、PCオーガナイザーが稼働している必要があります。PCオーガナイザーは、PCコマンドが実行されるジョブで一度開始する必要があるだけです。
次に、PCオーガナイザーを開始します(図2)。
PCオーガナイザーが開始されたので、PC上のコマンドを実行できるようになりました。再生する可能性があるサウンドが3種類あるため、どのサウンドを再生するかを決定するための Select ステートメントを作成しました(図3)。これはサンプル プログラムであるので、説明を簡単にするために値をハードコーディングしています。本番プログラムでは、これはプログラムに渡されるパラメーターになるでしょう。
では、ここからは、 PowerShell スクリプトで行われる処理について説明しようと思います。これらのスクリプトはほとんど同じ(再生されるサウンドを除いて)なので、それらの1つについて詳しく説明します。説明する各部分は行番号で参照します。
56行目で、PowerShellコマンドを実行することを宣言しています( -cによって指示)。また、 SoundPlayer の新しいインスタンスを作成しています。
57行目で、再生したいサウンドのパスを指定し、そのサウンドを再生することを指定します。それらのサウンドのうちの2つ(windowsCriticalStop および windowsDing )は、通常はシステムにデフォルトでインストールされている標準の Windows サウンドです。ただし、プログラムが実行されることになるどのPCでも、それらのサウンドがその場所にあることを確認しておく必要があります。ちなみに、本番プログラムでは、プログラムの柔軟性を高めるためにパスをソフトコーディングしました。
58行目で、 Start-Sleep コマンドレット を使用して、コマンドを1秒間実行(-s 1によって指示)した後に、 SoundPlayer を終了することを指定しています。このケースでは、使用するサウンドは1秒以内に再生が終了することが分かっています。使用するサウンドがもっと長く再生される必要がある場合は、 SoundPlayer の実行秒数を増やすことができます。
これらのサウンドのうちの2つは標準のWindowsサウンドであり、それらはPC上にすでに存在しているはずです。しかし、私は記事前半で、カスタム サウンドを作成すると述べました。この場合、プログラム内のパスが、そのサウンドの場所を示していることを確認する必要あります。標準のWindowsサウンドではないため、カスタム サウンドは、このRPGプログラムを実行する予定のすべてのPCで、同じ場所に置かれるように注意する必要があります。
最後に、1つ指摘しておくべきことがあります。52行目および57行目で、サウンド名の中でバッククォート記号を指定していることに気付かれたでしょうか。こうする必要があるのは、サウンド名の中に含まれているスペースをエスケープするためです。そうすることで、PowerShellスクリプトはサウンド名を正しく解釈することができます。
短いコードで、RPGからサウンドを再生することができました。このプログラムは、エンド ユーザーの評判も上々で、今後のプロジェクトでも使用できる可能性が広がっています。
