38:音楽ファイルを読み込もう

◆PROCESSINGで始めるゲーム作りとコンピュータ

Monster_1 38:音楽ファイルを読み込もう

今日の話題

 

11:音楽演奏ライブラリを追加しよう

前回は文字ファイルを読み込む処理と、文字列の表示を整える処理について学びました。

ケンジくんも徐々にPROCESSINGに慣れてきたようですが、みなさんはどうですか?。今回は2人と共に、音楽ファイルの読み込みをしてみましょう。

ケンジ
最後は音楽データを読み込む処理だね。この分なら楽勝だな。

ユカ
もう・・・すぐ調子に乗るんだから。

ヨウコ
そうね。残念だけど、音楽データの読み込みは画像や文字に比べると一番難しいかもしれないわね。

ケンジ
え。

ヨウコ
画像や文字データは、それを扱うための便利な命令が、PROCESSINGに最初から用意されていたんだけど

ヨウコ
音楽データについては、PROCESSINGの標準命令だけでは扱うことができないのよ。

ケンジ
でも、音が鳴らないゲームはつまらないしなぁ。

ヨウコ
そうね。でも心配はいらないわよ。音楽を演奏するためのライブラリを使えば、比較的簡単に音を鳴らすことができるの。

ケンジ
ライブラリ?。

ユカ
ライブラリって、いろいろな機能を詰め込んだ「便利な命令の集まり」でしたよね?。

%e3%83%a9%e3%82%a4%e3%83%96%e3%83%a9%e3%83%aa%e8%aa%ac%e6%98%8e(画像URL:illust-AC 様:Mino Kikakuさん)

ヨウコ
詳しくは授業で説明したと思うけど、ここは簡単におさらいしてみましょう。

.
PROCESSINGでは、有志の皆さんが様々なライブラリを公開してくれています。これらのライブラリを追加する事で、機能を拡張する事ができるのです。

今回は音楽を演奏するために、minimと呼ばれるライブラリを追加します。

ライブラリの追加は以下の手順で作業してください。

  • PROCESSINGの標準エディタを起動します。
  • メニューから「ライブラリをインポート」を選択します。
  • サブメニューから「ライブラリを追加」を選択します。
  • Contribution Manager画面で、左上のFilter欄に「minim」と入力します。
  • 「Minim | An audio library that …」と書かれた部分を選択し、Installボタンを押下します。

詳しく知りたい方は「32:音を鳴らす(準備編)」の記事を参照してみてください。

ヨウコ
2人とも出来たかしら?。ライブラリが追加できたら、プログラムの先頭に以下の1文を記述してね。

ケンジ
・・・なんでこんなのを記述するんだろ?。

ヨウコ
これはインポート文と呼ばれる命令なの。PROCESSINGに、追加したライブラリ(minim)を利用するように教えてあげる命令なのよ。

ヨウコ
これがないと、追加したライブラリが使えないから注意ね。

ユカ
ケンジったら・・・。後で「32:音を鳴らす(準備編)」の授業ノートを見せてあげるから、良く読んでおいてね。

ケンジ
・・・う、うん。

.
ライブラリを追加したら、必ずライブラリに対応したインポート文を記述する必要があります。インポート文を記述しないと、追加したライブラリを利用することができません。

インポート文は追加するライブラリによって書き方が異なります。

今回は minim の演奏用に
import ddf.minim.*;
というインポート文をプログラムの先頭に記述してください。

 

12:minimのインスタンスを作成しよう

ヨウコ
それじゃぁ音楽ファイルから音楽データを読み込んでみましょう。

ヨウコ
音楽データを扱うためには、Minimクラスのインスタンス変数を作成する必要があるの。まずは、以下のようにプログラミングしてくれるかしら?


ユカ
この「 Minim minim; 」と書かれた部分で、Minim型の変数を宣言しているんですよね?。

ケンジ
クラスって良くわかんないけど、変数の宣言のしかたは int や String と一緒なんですね。

ヨウコ
そうよ。違うのは クラス型の変数は宣言しただけでは使えないってことかしら。

ヨウコ
クラス型の変数は、利用する前に実態を生成する必要があるの。

ユカ
「 minim = new Minim( this ); 」と書かれた部分で、実態を作っているんですよね。

ケンジ
じ、実態・・・?。

ヨウコ
こんな風に考えてみてはどうかしら?。

(画像URL:illust-AC 様:よねぼー さん、acworksさん、JRおでかけネット 様)

ヨウコ
クラス型の変数を宣言するのは、ちょうど「チケットの予約」を行うみたいなものね。

ユカ
予約したチケットは購入しないと使えないように、クラス型の変数も実態を作らないと使えないんですね。

ケンジ
なるほど!

.
ここが初心者の方がつまずくポイントだと思います。

int や String などの変数は「宣言しただけ」でスグに使えましたが、クラス型の変数は(原則)「インスタンスを作ってからじゃないと使えない」のです。※

ここは大切なポイントですので、ぜひ覚えておいてください。

※少し専門的な話をすると、クラス内のstaticメソッドは、インスタンスを作成せずに利用可能です。でも初心者の方は、まずはインスタンスを作るものだと覚えてください。

 

13:クラスとは?

ケンジ
と、ところで、今さらなんだけどクラスってなんでしたっけ?

ヨウコ
え・・・。なにも言わないからわかっているものだと思ってたけど・・・。

ユカ
さすがケンジね。期待を裏切らないわ・・・。

ヨウコ
クラスとは「意味のある情報をまとめたもの」よ。例えば大学のゼミは、その教授の授業を受けるという「同じ目的を持った生徒の集まり」でしょ?。

ヨウコ
クラスも同じね。ある目的や意味をもった情報が集まったものがクラスなの。

ケンジ
なるほど・・・。

ヨウコ
このようにクラスを使ってプログラミングする方法を「オブジェクト指向プログラミング」と呼ぶんだけど

ヨウコ
「オブジェクト指向プログラミング」のクラスは、単なる情報の集まりじゃなくて「機能」を持っているのよ。

ケンジ
え・・・。どういう事ですか?。

ヨウコ
例えば・・・車がバラバラになった部品が詰まった袋(A)を想像してみてちょうだい。

ヨウコ
ある車を作るための部品(同じ目的の情報)が集まっているという事では、Aはクラスの1種と言えるわよね。

(画像URL:illust-AC 様:キラーT細胞さん、ねずみさん)

ケンジ
そうですね。

ヨウコ
それじゃぁ今度は、その部品が組み立てられて完成した車(B)を想像してみてくれるかしら?。これも車の部品が集まっているという事ではクラスなんだけど

(画像URL:illust-AC 様:ねずみさん)

ヨウコ
AとBでは大きな違いがあるわよね?。

ケンジ
そりゃぁそうですよ。Aは単なる部品だから動かないし、乗れないし、面白くないけど、Bなら楽しめるから。

ヨウコ
そうよね。つまりBはAと同じクラスなんだけど、Aに比べて「動く」とか「乗れる」という機能を持っているとは言えないかしら?

ユカ
そうか!。Bは単なる情報の集まりじゃなくて、情報(部品)を活かした動作が行えるんですね。

(画像URL:illust-AC 様:キラーT細胞さん)

ヨウコ
そうよ。オブジェクト指向プログラミングのクラスもいっしょなの。クラスの中に機能を持たせることができるよの。

ユカ
クラスが持っている機能を「メソッド」と呼ぶんでしたね。

.
クラスやオブジェクトという考え方は、初心者の方にはなかなか難しいものだと思います。でも上記のように考えれば、少しは理解ができるのではないでしょうか?。

クラスをひな形にして作成された実態をインスタンスと呼び、クラスやインスタンスの事をひっくるめて「オブジェクト」と呼ぶことがあります。

ケンジ
クラス型の変数は、インスタンスを作成しないと使えない事はわかったけど、「minim = new Minim( this );」って、やっぱりよく解らないんだよな。

ユカ
あら、どこが解らないの?。

ケンジ
「new」は「新しい」って意味の単語だから、なんとなくインスタンスを作る命令なんだろうなってのは想像ができるんだけど、「 Minim( this );」って所が引っかかるんだよね。

ケンジ
「 Minim( this );」って、「()」がついてるから関数・・・あ、クラスの場合はメソッドだっけか、なんだよね?。

ケンジ
クラスの中に、そのクラスと同じ名前のメソッドがあるって事だと思うんだけど、どういう事なんだろ?。

ヨウコ
あら、ケンジくんにしては良い疑問ね(笑)。

ケンジ
ブー。「ケンジにしては」は余計ですよ。

ヨウコ
ごめんごめん(笑)。

ヨウコ
Minim()というのは、Minimクラスが持っているコンストラクタなのよ。

ケンジ
こ、コントラスト?。

ユカ
・・・コンストラクタよ(汗)。クラスの実態を作る時に最初に動作する特別な役割を持ったメソッドの事。

ヨウコ
オブジェクト指向プログラミングでは、 クラスの中に必ず「そのクラスの作り方を定義したメソッド」を持たなければいけないという決まりがあるの。

ヨウコ
プラモデルに、必ず組み立て方を書いたマニュアルが付いていて、組み立てる前にそれを見るようなものね。

ケンジ
ふむふむ。

(画像URL:illust-AC 様:よねぼーさん、acworksさん)

ヨウコ
PROCESSINGでは、クラスの組み立て方を書いたマニュアルの事を、コンストラクタって呼ぶのよ。

ケンジ
でもそのコンストラクタの名前が、クラスの名前といっしょになっているのはどうしてなんですか?

ヨウコ
例えばケンジくんが国内で発売されている、いろいろなメーカーの車に乗るとするわよね?。

ヨウコ
その時A社とB社でハンドルやアクセルやブレーキの位置がバラバラだったら、どうなるかしら?。

ケンジ
ハンドルはともかく、アクセルやブレーキの位置が決まっていなかったら、やばいよね。

ヨウコ
そうよね。クラスでも「あるクラスA」を作成する命令はHOGEHOGE()で、BクラスはPAFUPASU()だったら、いろいろなクラスを使う人が困るのは想像できるでしょ?。

(画像URL:illust-AC 様:よねぼーさん、acworksさん)

ヨウコ
だからPROCESSINGでは、「クラスを作るためのメソッドは、クラスと同じ名前にして、クラスの中に含める事」というルールになっているのよ。

ケンジ
なるほど~。

ヨウコ
少しややこしいのは、プログラミング言語によってコンストラクタの名前をどうつけるかというルールが異なっている事かしら。


ヨウコ
とりあえず今はPROCESSINGの勉強をしているから、コンストラクタはクラスと同じ名前なんだと覚えておけば良いわよ。

ユカ
ところで、「 minim = new Minim( this ); 」に書いてある「 this 」って何なんですか?。

ヨウコ
this は「自分自身」を表す特別な命令なの。Minimクラスではインスタンスを作成する時、自分自身を渡す約束になっているのよ。

ケンジ
自分自身・・・?。

ヨウコ
そうね・・・。例えばチケットを購入する時に「購入者の名前」を記入する事があると思うけど、そんな感じかしら?。

ケンジ
そうか。作成するインスタンスの持ち主を教えているんですね!。

ヨウコ
そうよ。この辺りはクラスごとに考え方が違うから一概には言えないけど、Minimの場合はインスタンス生成時に自分自身を渡すように決まっているの。
ユカ
なるほど!。

.

オブジェクト指向プログラミング・・・なんだか難しいですよね(汗)。

でも身構えることはありません。まずはここに書かれた基礎的な事を理解しておくだけでも役に立ちます。

プログラミング言語によっては、コンストラクタを「クラス名とは異なる名前」で作成するものがあります。また、そもそもコンストラクタとは呼ばずにイニシャライザなどと呼ぶ言語もあります。

ただオブジェクト指向を標榜するプログラミング言語であれば、クラスには必ずコンストラクタに相当する「クラスの初期化を行う処理」が含まれていると考えて良いでしょう。※

※クラスには一見コンストラクタがないように見えるものがありますが、その場合でもデフォルトコンストラクタを持っています。デフォルトコンストラクタの説明は必要に応じて行います。

 

14:音楽ファイルを読み込もう

ヨウコ
それじゃぁ、いよいよ音楽ファイルを読み込んでみましょう。

ヨウコ
今回は効果音だから、Minimクラスが持つ loadSample() メソッドを利用してね。

ケンジ
loadSample() はMinimクラスのメソッドだから、Minimクラスが持っている機能なんだね。

ヨウコ
そうよ。

ヨウコ
あるクラスが持っているメソッドは、「インスタンス変数名 . メソッド名( 引数 ) ;」 と書いて使うから、覚えておいてね。

ユカ
あれ?・・・。確か「33:音を鳴らす(実践編)」の授業では loadFile() 命令を使っていませんでしたっけ?。

ヨウコ
よく覚えているわね。

ヨウコ
Minimでは効率的にデータを扱うため、効果音と音楽(演奏音)では、それぞれファイルを読み込む命令が異なっているのよ。

(画像URL:illust-AC 様:wakuwaku8 さん、acworksさん、kaccoさん)

ユカ
効果音の場合は loadSample()を、演奏音の場合はloadFile() を使うんですね。

ヨウコ
それぞれの命令で、データが格納される変数の型も異なっているから注意してね。

ケンジ
効果音がAudioSample型で、演奏音がAudioPlayer型か・・・。ややこしいなぁ。

ヨウコ
この辺りは慣れるしかないわね。

ヨウコ
画像や文字の時と同じように AudioSample型の変数を用意して、loadSample()命令で読み込むのよ。

ユカ
じゃぁ、読み込むプログラムはこんな感じでいいかしら?

ヨウコ
そうね。いいと思うわ。

.
どうでしたか?。理解できたでしょうか。

kick = minim.loadSample( DAON_NAME );
というたった1行の命令が書きたかったのですが、この1つの命令には実に奥深い技術的要素が詰まっていました。

PROCESSINGをはじめ、最近流行のプログラミング言語ではオブジェクト指向プログラミングは避けて通れない話題となっています。

あなたが、もしもITの世界でプロになる事を目指しているのであれば、ここで説明した基礎的な知識はぜひ覚えておいてくださいね。

※上記会話に登場する素敵な人物画像は、次のサイト様の画像を利用させて頂いております。ありがとうございます。

画像URL:とりのすみか

 

Forest今日の言葉

・なし

 

scroll今日の文法

 

・インポート文

ライブラリの利用を宣言する命令です。Minimなどの外部提供ライブラリだけではなく、Javaがサポートしているライブラリでも、インポート文が必要なものがあります。

 

・Minimのインスタンス作成

Minimクラスの実態を作成します。引数には自分自身(this)を渡します。

 

・効果音の読み込み

Minimクラスが持つ loadSample()メソッドで、効果音ファイルから音楽データを読み込みます。loadSample()は短い効果音専用ですので、演奏音(ミュージック)には向きません。

演奏音を読み込む場合は、Minimクラスが持つ loadFile()メソッドを利用してください。

 

 今日のまとめ

  • 音楽演奏ライブラリを追加する事で、演奏が行えるようになる
  • クラス型の変数は、実態(インスタンス)を生成してから利用する
  • クラスには、情報だけではなく機能を含める事ができる

39:フローチャートを理解しよう へ進む
37:文字ファイルを読み込もう へ戻る
目次へ戻る


本ページで利用している特に参照元記載のないアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。