(58)【調査した分野】(Int.Cl.,DB名)
前記再生速度制御手段は、前記有音での再生が開始される前は、前記無音での再生における再生速度を前記有音での再生における再生速度よりも速くし、前記有音での再生が開始された後は、前記無音での再生における再生速度を前記有音での再生における再生速度と同じ再生速度にする、請求項7に記載の情報処理プログラム。
前記音情報格納手段は、記憶装置の中に設定された一定容量の音情報記憶領域に前記音情報を格納し 前記音情報格納手段は、前記音情報記憶領域が満杯のときに当該音情報記憶領域に前記音情報を先入れ先出し方式で格納する、請求項7に記載の情報処理プログラム。
【発明を実施するための形態】
【0025】
以下、図面を参照して、本発明の種々の実施形態について説明する。
【0026】
まず、本発明を実施するためのハードウェア構成の一例を説明する。ここでは、本発明をゲームシステムに適用した例を説明する。
【0027】
(ゲームシステムの全体構成)
図1を参照して、本発明の一実施形態に係るゲーム装置を含むゲームシステム1について説明する。
図1は、ゲームシステム1の外観図である。以下、据置型のゲーム装置を一例にして、本実施形態のゲーム装置およびゲームプログラムについて説明する。
図1において、ゲームシステム1は、テレビジョン受像器(以下、単に「テレビ」と記載する)2、ゲーム装置3、光ディスク4、マーカ部6、およびコントローラ7を含む。本システムは、コントローラ7を用いたゲーム操作に基づいてゲーム装置3でゲーム処理を実行するものである。
【0028】
ゲーム装置3には、当該ゲーム装置3に対して交換可能に用いられる情報記憶媒体の一例である光ディスク4が脱着可能に挿入される。光ディスク4には、ゲーム装置3において実行されるためのゲームプログラムが記憶されている。ゲーム装置3の前面には光ディスク4の挿入口が設けられている。ゲーム装置3は、挿入口に挿入された光ディスク4に記憶されたゲームプログラムを読み出して実行することによってゲーム処理を実行する。
【0029】
ゲーム装置3には、表示装置の一例であるテレビ2が接続コードを介して接続される。テレビ2は、ゲーム装置3において実行されるゲーム処理の結果得られるゲーム画像を表示する。また、テレビ2の画面の周辺(
図1では画面の上側)には、マーカ部6が設置される。マーカ部6は、その両端に2つのマーカ6Rおよび6Lを備えている。マーカ6R(マーカ6Lも同様)は、具体的には1以上の赤外LEDであり、テレビ2の前方に向かって赤外光を出力する。マーカ部6はゲーム装置3に接続されており、ゲーム装置3はマーカ部6が備える各赤外LEDの点灯を制御することが可能である。
【0030】
コントローラ7は、自機に対して行われた操作の内容を示す操作データをゲーム装置3に与える入力装置である。コントローラ7とゲーム装置3とは無線通信によって接続される。本実施形態では、コントローラ7とゲーム装置3との間の無線通信には例えばBluetooth(ブルートゥース)(登録商標)の技術が用いられる。なお、他の実施形態においてはコントローラ7とゲーム装置3とは有線で接続されてもよい。
【0031】
(ゲーム装置3の内部構成)
次に、
図2を参照して、ゲーム装置3の内部構成について説明する。
図2は、ゲーム装置3の構成を示すブロック図である。ゲーム装置3は、CPU10、システムLSI11、外部メインメモリ12、ROM/RTC13、ディスクドライブ14、およびAV−IC15等を有する。
【0032】
CPU10は、光ディスク4に記憶されたゲームプログラムを実行することによってゲーム処理を実行するものであり、ゲームプロセッサとして機能する。CPU10は、システムLSI11に接続される。システムLSI11には、CPU10の他、外部メインメモリ12、ROM/RTC13、ディスクドライブ14およびAV−IC15が接続される。システムLSI11は、それに接続される各構成要素間のデータ転送の制御、表示すべき画像の生成、外部装置からのデータの取得等の処理を行う。システムLSIの内部構成について後述する。揮発性の外部メインメモリ12は、光ディスク4から読み出されたゲームプログラムや、フラッシュメモリ17から読み出されたゲームプログラム等のプログラムを記憶したり、各種データを記憶したりするものであり、CPU10のワーク領域やバッファ領域として用いられる。ROM/RTC13は、ゲーム装置3の起動用のプログラムが組み込まれるROM(いわゆるブートROM)と、時間をカウントするクロック回路(RTC:Real Time Clock)とを有する。ディスクドライブ14は、光ディスク4からプログラムデータやテクスチャデータ等を読み出し、後述する内部メインメモリ11eまたは外部メインメモリ12に読み出したデータを書き込む。
【0033】
また、システムLSI11には、入出力プロセッサ(I/Oプロセッサ)11a、GPU(Graphics Processor Unit)11b、DSP(Digital Signal Processor)11c、VRAM11d、および内部メインメモリ11eが設けられる。図示は省略するが、これらの構成要素11a〜11eは内部バスによって互いに接続される。
【0034】
GPU11bは、描画手段の一部を形成し、CPU10からのグラフィクスコマンド(作画命令)に従って画像を生成する。VRAM11dは、GPU11bがグラフィクスコマンドを実行するために必要なデータ(ポリゴンデータやテクスチャデータ等のデータ)を記憶する。画像が生成される際には、GPU11bは、VRAM11dに記憶されたデータを用いて画像データを作成する。
【0035】
DSP11cは、オーディオプロセッサとして機能し、内部メインメモリ11eや外部メインメモリ12に記憶されるサウンドデータや音波形(音色)データを用いて、音声データを生成する。
【0036】
上述のように生成された画像データおよび音声データは、AV−IC15によって読み出される。AV−IC15は、読み出した画像データをAVコネクタ16を介してテレビ2に出力するとともに、読み出した音声データを、テレビ2に内蔵されるスピーカ2aに出力する。これによって、画像がテレビ2に表示されるとともに音がスピーカ2aから出力される。
【0037】
入出力プロセッサ11aは、それに接続される構成要素との間でデータの送受信を実行したり、外部装置からのデータのダウンロードを実行したりする。入出力プロセッサ11aは、フラッシュメモリ17、無線通信モジュール18、無線コントローラモジュール19、拡張コネクタ20、およびメモリカード用コネクタ21に接続される。無線通信モジュール18にはアンテナ22が接続され、無線コントローラモジュール19にはアンテナ23が接続される。
【0038】
入出力プロセッサ11aは、無線通信モジュール18およびアンテナ22を介してネットワークに接続し、ネットワークに接続される他のゲーム装置や各種サーバと通信することができる。入出力プロセッサ11aは、定期的にフラッシュメモリ17にアクセスし、ネットワークへ送信する必要があるデータの有無を検出し、当該データが有る場合には、無線通信モジュール18およびアンテナ22を介してネットワークに送信する。また、入出力プロセッサ11aは、他のゲーム装置から送信されてくるデータやダウンロードサーバからダウンロードしたデータを、ネットワーク、アンテナ22および無線通信モジュール18を介して受信し、受信したデータをフラッシュメモリ17に記憶する。CPU10はゲームプログラムを実行することにより、フラッシュメモリ17に記憶されたデータを読み出してゲームプログラムで利用する。フラッシュメモリ17には、ゲーム装置3と他のゲーム装置や各種サーバとの間で送受信されるデータの他、ゲーム装置3を利用してプレイしたゲームのセーブデータ(ゲームの結果データまたは途中データ)が記憶されてもよい。
【0039】
また、入出力プロセッサ11aは、コントローラ7から送信される操作データをアンテナ23および無線コントローラモジュール19を介して受信し、内部メインメモリ11eまたは外部メインメモリ12のバッファ領域に記憶(一時記憶)する。
【0040】
さらに、入出力プロセッサ11aには、拡張コネクタ20およびメモリカード用コネクタ21が接続される。拡張コネクタ20は、USBやSCSIのようなインターフェースのためのコネクタであり、外部記憶媒体のようなメディアを接続したり、他のコントローラのような周辺機器を接続したり、有線の通信用コネクタを接続することによって無線通信モジュール18に替えてネットワークとの通信を行ったりすることができる。メモリカード用コネクタ21は、メモリカードのような外部記憶媒体を接続するためのコネクタである。例えば、入出力プロセッサ11aは、拡張コネクタ20やメモリカード用コネクタ21を介して、外部記憶媒体にアクセスし、データを保存したり、データを読み出したりすることができる。
【0041】
ゲーム装置3には、電源ボタン24、リセットボタン25、およびイジェクトボタン26が設けられる。電源ボタン24およびリセットボタン25は、システムLSI11に接続される。電源ボタン24がオンされると、ゲーム装置3の各構成要素に対して、図示しないACアダプタを経て電源が供給される。リセットボタン25が押されると、システムLSI11は、ゲーム装置3の起動プログラムを再起動する。イジェクトボタン26は、ディスクドライブ14に接続される。イジェクトボタン26が押されると、ディスクドライブ14から光ディスク4が排出される。
【0042】
図3および
図4を参照して、コントローラ7について説明する。なお、
図3は、コントローラ7の上面後方から見た斜視図である。
図4は、コントローラ7を下面前方から見た斜視図である。
【0043】
図3および
図4において、コントローラ7は、例えばプラスチック成型によって形成されたハウジング71を有しており、当該ハウジング71に複数の操作部72が設けられている。ハウジング71は、その前後方向を長手方向とした略直方体形状を有しており、全体として大人や子供の片手で把持可能な大きさである。
【0044】
ハウジング71上面の中央前面側に、十字キー72aが設けられる。この十字キー72aは、十字型の4方向プッシュスイッチであり、4つの方向(前後左右)に対応する操作部分が十字の突出片にそれぞれ90°間隔で配置される。プレイヤが十字キー72aのいずれかの操作部分を押下することによって前後左右いずれかの方向を選択される。例えばプレイヤが十字キー72aを操作することによって、仮想ゲーム世界に登場するプレイヤキャラクタ等の移動方向を指示したり、複数の選択肢から選択指示したりすることができる。
【0045】
なお、十字キー72aは、上述したプレイヤの方向入力操作に応じて操作信号を出力する操作部であるが、他の態様の操作部でもかまわない。例えば、十字方向に4つのプッシュスイッチを配設し、プレイヤによって押下されたプッシュスイッチに応じて操作信号を出力する操作部を設けてもかまわない。さらに、上記4つのプッシュスイッチとは別に、上記十字方向が交わる位置にセンタスイッチを配設し、4つのプッシュスイッチとセンタスイッチとを複合した操作部を設けてもかまわない。また、ハウジング71上面から突出した傾倒可能なスティック(いわゆる、ジョイスティック)を倒すことによって、傾倒方向に応じて操作信号を出力する操作部を上記十字キー72aの代わりに設けてもかまわない。さらに、水平移動可能な円盤状部材をスライドさせることによって、当該スライド方向に応じた操作信号を出力する操作部を、上記十字キー72aの代わりに設けてもかまわない。また、タッチパッドを、上記十字キー72aの代わりに設けてもかまわない。
【0046】
ハウジング71上面の十字キー72aより後面側に、複数の操作ボタン72b〜72gが設けられる。操作ボタン72b〜72gは、プレイヤがボタン頭部を押下することによって、それぞれの操作ボタン72b〜72gに割り当てられた操作信号を出力する操作部である。例えば、操作ボタン72b〜72dには、1番ボタン、2番ボタン、およびAボタン等としての機能が割り当てられる。また、操作ボタン72e〜72gには、マイナスボタン、ホームボタン、およびプラスボタン等としての機能が割り当てられる。これら操作ボタン72a〜72gは、ゲーム装置3が実行するゲームプログラムに応じてそれぞれの操作機能が割り当てられる。なお、
図3に示した配置例では、操作ボタン72b〜72dは、ハウジング71上面の中央前後方向に沿って並設されている。また、操作ボタン72e〜72gは、ハウジング71上面の左右方向に沿って操作ボタン72bおよび72dの間に並設されている。そして、操作ボタン72fは、その上面がハウジング71の上面に埋没しており、プレイヤが不意に誤って押下することのないタイプのボタンである。
【0047】
また、ハウジング71上面の十字キー72aより前面側に、操作ボタン72hが設けられる。操作ボタン72hは、遠隔からゲーム装置3の電源をオン/オフする電源スイッチである。この操作ボタン72hも、その上面がハウジング71の上面に埋没しており、プレイヤが不意に誤って押下することのないタイプのボタンである。
【0048】
また、ハウジング71上面の操作ボタン72cより後面側に、複数のLED702が設けられる。ここで、コントローラ7は、他のコントローラ7と区別するためにコントローラ種別(番号)が設けられている。例えば、LED702は、コントローラ7に現在設定されている上記コントローラ種別をプレイヤに通知するために用いられる。具体的には、コントローラ7から無線通信モジュール18へ送信データを送信する際、上記コントローラ種別に応じて複数のLED702のうち、種別に対応するLEDが点灯する。
【0049】
また、ハウジング71上面には、操作ボタン72bおよび操作ボタン72e〜72gの間に後述するスピーカ(
図5のスピーカ706)からの音を外部に放出するための音抜き孔が形成されている。
【0050】
一方、ハウジング71下面には、凹部が形成されている。ハウジング71下面の凹部は、プレイヤがコントローラ7の前面をマーカ6Lおよび6Rに向けて片手で把持したときに、当該プレイヤの人差し指や中指が位置するような位置に形成される。そして、上記凹部の後面側傾斜面には、操作ボタン72iが設けられる。操作ボタン72iは、例えばBボタンとして機能する操作部である。
【0051】
また、ハウジング71前面には、撮像情報演算部74の一部を構成する撮像素子743が設けられる。ここで、撮像情報演算部74は、コントローラ7が撮像した画像データを解析してその中で輝度が高い場所を判別してその場所の重心位置やサイズなどを検出するためのシステムであり、例えば、最大200フレーム/秒程度のサンプリング周期であるため比較的高速なコントローラ7の動きでも追跡して解析することができる。この撮像情報演算部74の詳細な構成については、後述する。また、ハウジング71の後面には、コネクタ73が設けられている。コネクタ73は、例えばエッジコネクタであり、例えば接続ケーブルと嵌合して接続するために利用される。
【0052】
ここで、以下の説明を具体的にするために、コントローラ7に対して設定する座標系について定義する。
図3および
図4に示すように、互いに直交するXYZ軸をコントローラ7に対して定義する。具体的には、コントローラ7の前後方向となるハウジング71の長手方向をZ軸とし、コントローラ7の前面(撮像情報演算部74が設けられている面)方向をZ軸正方向とする。また、コントローラ7の上下方向をY軸とし、ハウジング71の下面(操作ボタン72iが設けられた面)方向をY軸正方向とする。さらに、コントローラ7の左右方向をX軸とし、ハウジング71の左側面(
図3では表されずに
図4で表されている側面)方向をX軸正方向とする。
【0053】
次に、
図5および
図6を参照して、コントローラ7の内部構造について説明する。なお、
図5は、コントローラ7の上筐体(ハウジング71の一部)を外した状態を後面側から見た斜視図である。
図6は、コントローラ7の下筐体(ハウジング71の一部)を外した状態を前面側から見た斜視図である。ここで、
図6に示す基板700は、
図5に示す基板700の裏面から見た斜視図となっている。
【0054】
図5において、ハウジング71の内部には基板700が固設されており、当該基板700の上主面上に操作ボタン72a〜72h、加速度センサ701、LED702、およびアンテナ754等が設けられる。そして、これらは、基板700等に形成された配線(図示せず)によってマイコン751等(
図6、
図7参照)に接続される。また、無線モジュール753(
図7参照)およびアンテナ754によって、コントローラ7がワイヤレスコントローラとして機能する。なお、ハウジング71内部には図示しない水晶振動子703が設けられており、後述するマイコン751の基本クロックを生成する。また、基板700の上主面上に、スピーカ706およびアンプ708が設けられる。また、加速度センサ701は、操作ボタン72dの左側の基板700上(つまり、基板700の中央部ではなく周辺部)に設けられる。したがって、加速度センサ701は、コントローラ7の長手方向を軸とした回転に応じて、重力加速度の方向変化に加え、遠心力による成分の含まれる加速度を検出することができるので、所定の演算により、検出される加速度データからコントローラ7の回転を良好な感度でゲーム装置3等が判定することができる。
【0055】
一方、
図6において、基板700の下主面上の前端縁に撮像情報演算部74が設けられる。撮像情報演算部74は、コントローラ7の前方から順に赤外線フィルタ741、レンズ742、撮像素子743、および画像処理回路744によって構成されており、それぞれ基板700の下主面に取り付けられる。また、基板700の下主面上の後端縁にコネクタ73が取り付けられる。さらに、基板700の下主面上にサウンドIC707およびマイコン751が設けられている。サウンドIC707は、基板700等に形成された配線によってマイコン751およびアンプ708と接続され、ゲーム装置3から送信されたサウンドデータに応じてアンプ708を介してスピーカ706に音声信号を出力する。
【0056】
そして、基板700の下主面上には、バイブレータ704が取り付けられる。バイブレータ704は、例えば振動モータやソレノイドである。バイブレータ704は、基板700等に形成された配線によってマイコン751と接続され、ゲーム装置3から送信された振動データに応じてその作動をオン/オフする。バイブレータ704が作動することによってコントローラ7に振動が発生するので、それを把持しているプレイヤの手にその振動が伝達され、いわゆる振動対応ゲームが実現できる。ここで、バイブレータ704は、ハウジング71のやや前方寄りに配置されるため、プレイヤが把持している状態において、ハウジング71が大きく振動することになり、振動を感じやすくなる。
【0057】
次に、
図7を参照して、コントローラ7の内部構成について説明する。なお、
図7は、コントローラ7の構成を示すブロック図である。
【0058】
図7において、コントローラ7は、上述した操作部72、撮像情報演算部74、加速度センサ701、バイブレータ704、スピーカ706、サウンドIC707、およびアンプ708の他に、その内部に通信部75を備えている。
【0059】
撮像情報演算部74は、赤外線フィルタ741、レンズ742、撮像素子743、および画像処理回路744を含んでいる。赤外線フィルタ741は、コントローラ7の前方から入射する光から赤外線のみを通過させる。レンズ742は、赤外線フィルタ741を透過した赤外線を集光して撮像素子743へ出射する。撮像素子743は、例えばCMOSセンサやあるいはCCDのような固体撮像素子であり、レンズ742が集光した赤外線を撮像する。したがって、撮像素子743は、赤外線フィルタ741を通過した赤外線だけを撮像して画像データを生成する。撮像素子743で生成された画像データは、画像処理回路744で処理される。具体的には、画像処理回路744は、撮像素子743から得られた画像データを処理して高輝度部分を検知し、それらの位置座標や面積を検出した結果を示す処理結果データを通信部75へ出力する。なお、これらの撮像情報演算部74は、コントローラ7のハウジング71に固設されており、ハウジング71自体の方向を変えることによってその撮像方向を変更することができる。
【0060】
コントローラ7は、3軸(X、Y、Z軸)の加速度センサ701を備えていることが好ましい。この3軸の加速度センサ701は、3方向、すなわち、上下方向(
図3に示すY軸)、左右方向(
図3に示すX軸)、および前後方向(
図3に示すZ軸)で直線加速度を検知する。
【0061】
通信部75は、マイクロコンピュータ(Micro Computer:マイコン)751、メモリ752、無線モジュール753、およびアンテナ754を含んでいる。マイコン751は、処理の際にメモリ752を記憶領域として用いながら、送信データを無線送信する無線モジュール753を制御する。また、マイコン751は、アンテナ754を介して無線モジュール753が受信したゲーム装置3からのデータに応じて、サウンドIC707およびバイブレータ704の動作を制御する。サウンドIC707は、通信部75を介してゲーム装置3から送信されたサウンドデータ等を処理する。また、マイコン751は、通信部75を介してゲーム装置3から送信された振動データ(例えば、バイブレータ704をONまたはOFFする信号)等に応じて、バイブレータ704を作動させる。
【0062】
コントローラ7に設けられた操作部72からの操作信号(キーデータ)、加速度センサ701からの3軸方向の加速度信号(X、Y、およびZ軸方向加速度データ)、および撮像情報演算部74からの処理結果データは、マイコン751に出力される。マイコン751は、入力した各データ(キーデータ、X、Y、およびZ軸方向加速度データ、処理結果データ)を無線通信モジュール18へ送信する送信データとして一時的にメモリ752に格納する。ここで、通信部75から無線通信モジュール18への無線送信は、所定の周期毎に行われるが、ゲームの処理は1/60秒を単位として行われることが一般的であるので、それよりも短い周期で送信を行うことが必要となる。具体的には、ゲームの処理単位は16.7ms(1/60秒)であり、ブルートゥース(登録商標)で構成される通信部75の送信間隔は5msである。マイコン751は、無線通信モジュール18への送信タイミングが到来すると、メモリ752に格納されている送信データを一連の操作情報として出力し、無線モジュール753へ出力する。そして、無線モジュール753は、例えばBluetooth(ブルートゥース;登録商標)の技術を用いて、所定周波数の搬送波を用いて操作情報をその電波信号としてアンテナ754から放射する。つまり、コントローラ7に設けられた操作部72からのキーデータ、加速度センサ701からのX、Y、およびZ軸方向加速度データ、および撮像情報演算部74からの処理結果データがコントローラ7から送信される。そして、ゲーム装置3の無線通信モジュール18でその電波信号を受信し、ゲーム装置3で当該電波信号を復調や復号することによって、一連の操作情報(キーデータ、X、Y、およびZ軸方向加速度データ、および処理結果データ)を取得する。そして、ゲーム装置3のCPU10は、取得した操作情報とゲームプログラムとに基づいて、ゲーム処理を行う。なお、Bluetooth(登録商標)の技術を用いて通信部75を構成する場合、通信部75は、他のデバイスから無線送信された送信データを受信する機能も備えることができる。
【0063】
なお、上記のようなハードウェア構成は単なる一例に過ぎず、本発明は任意のコンピュータシステムに適用可能である。
【0064】
次に、本実施形態において実行される楽曲演奏処理の概要を説明する。
【0065】
本実施形態では、光ディスク4等から外部メインメモリ12(または内部メインメモリ11e)にロードされた楽曲演奏プログラムをCPU10が実行することによって、楽曲演奏処理が行われる。外部メインメモリ12のメモリマップの一例を
図8に示す。
図8のメモリマップで示されるプログラムやデータの詳細は、以下の説明により明らかになる。
【0066】
本実施形態では、MIDI(Musical Instruments Digital Interface)規格に則った楽曲データ(ここでは単にMIDIデータと称す)に基づいて楽曲の演奏が行われる。なお、標準的なMIDIデータの例として、SMF(標準MIDIファイル)がある。
【0067】
(MIDIデータ)
以下、MIDIデータ126について簡単に説明する。MIDIデータ126では、楽曲に含まれる複数の音が1以上のトラック(譜面に相当する)で管理されている。つまり、楽曲に含まれる各音は、いずれかのトラックに所属する。トラックの数は、ここでは最大で16とする。
【0068】
MIDIデータ126は、複数のMIDIイベントの集合体として表現される。MIDIイベントには、音を鳴らすための「ノートイベント」や、トラック単位で音のボリュームや音色を変えたりするための「コントロールチェンジイベント」をはじめ、「ピッチベンドイベント」、「プログラムチェンジイベント」など、種々のMIDIイベントが存在する。
【0069】
図9は、MIDIデータ126の一例を示している。なお
図9では、説明を簡単にするために、MIDIイベントのうちのノートイベントだけを示しているが、実際には上述したように、MIDIデータ126にはノートイベント以外のMIDIイベントも含まれている。
図9における各行が1つのノートイベントに相当する。
図9のMIDIデータ126は、
図10の譜面に対応している。「所属トラック」は、そのノートイベントによって鳴らされる音が、どのトラックに含まれる音かを示す情報である。「再生タイミング」は、音を鳴らすタイミングを示す情報であって、ティック(tick)という単位で表される。本実施形態では、1ティックは4分音符の長さの48分の1に相当する長さであるものとする。「ノート長(デュレーション)」は、音の長さを示す情報であり、ティックで表される。「音高(ノートナンバー)」は、文字通り、音の高さである音高を示す情報である。
図11は、MIDIデータ126における音高の値とピアノの鍵盤との対応関係を示している。「ベロシティ」は、音を鳴らす強さを示す情報である。なお、ノートイベントには、
図9に示したパラメータ以外の情報が含まれていても良い。
【0070】
MIDIデータ126は、MIDIプレイヤーと呼ばれるアプリケーションソフトウェアを用いて再生することができる。MIDIプレイヤーは、一般的に、MIDIデータ126に含まれるMIDIイベントを先頭から順番に処理することによって楽曲を再生する。なお、MIDIプレイヤーとしての機能を有する既存のプログラムライブラリ(ここでは、楽曲データ再生ライブラリと称す)を利用すれば、MIDIデータ126を再生するためのコンピュータプログラムを一から生成することなしに、MIDIデータ126に基づいて簡単に楽曲を再生することが可能となる。本実施形態でも、このような楽曲データ再生ライブラリ122を利用して楽曲を再生する。
【0071】
(本実施形態における楽曲演奏処理の概要)
ところで、楽曲データ再生ライブラリ122を用いてMIDIデータ126に基づいて楽曲を再生しているときに、現在鳴っている音よりも後に鳴る音(すなわち未来に鳴る音)に関する情報に基づいて、表示画像や出力音やゲーム内容等を変化させたいという要望がある。例えば、MIDIデータ126に基づいて楽曲を再生している最中に、現在の演奏位置から2小節先までの部分の譜面を画面に表示したいという要望がある。前述のように、ノートイベントは音の音高、長さ、再生タイミング等の情報を含むため、譜面の画像を別途用意することなく、MIDIデータ126に基づいて譜面の画像を生成することが可能である。しかしながら、現在の演奏位置から2小節先までの部分の譜面の画像を生成するためには、現在の演奏位置から2小節先までの部分に対応するノートイベントをMIDIデータから随時抽出して、抽出したノートイベントに基づいて譜面の画像を生成する必要がある。本実施形態では、このような複雑な処理を、非常に簡単なコンピュータプログラム(楽曲演奏プログラム121)によって実現している。
【0072】
本実施形態では、MIDIデータ126の有音での再生に先行して、楽曲データ再生ライブラリ122を用いて同一のMIDIデータ126を無音で再生し、この無音再生において発生したノートイベントに基づいてノートデータ(詳細は後述)を生成し、生成したノートデータを記憶領域に一時的に保持しておく。ここでは、前者の再生処理(有音での再生)を「本番再生」と称し、後者の再生処理(無音での再生)を「先読み再生」と称する。また、ノートデータを一時的に保持しておくための記憶領域を「ノートプール」と称する。ノートプール123は、例えば外部メインメモリ12に設定された一定容量の記憶領域であって、ノートデータを先入れ先出し方式で記憶する。
【0073】
図12〜
図14を参照して、本番再生における現在の再生位置と、その時点においてノートプール123に格納されているノートデータとの対応関係を説明する。ここでは、時刻T0に先読み再生が開始され、時刻T1に本番再生が開始されるものとする。
【0074】
まず、時刻T0で先読み再生が開始される。これは、楽曲データ再生ライブラリ122に対して、MIDIデータ126の再生を開始するように指示するとともに、音量を0にするように指示することによって行われる。先読み再生が開始されると、ノートイベントを含むMIDIイベントが順次発生するので、ノートイベントが発生する毎に、このノートイベントに基づいてノートデータを生成してノートプール123に順次記憶する。
【0075】
時刻T1では、本番再生が開始される。時刻T1においてノートプール123に格納されているノートデータを
図12に示す。時刻T1では、小節A〜小節Bに関連するノートデータがノートプール123に保持されているので、これらのノートデータに基づいて、まだ本番再生されていない小節A〜小節Bの譜面の画像を生成して、テレビ2の画面に表示することができる。
【0076】
時刻T1以降は、本番再生と先読み再生が同じ速度で併行して行われる。したがって、本番再生よりも常に2小節分だけ先行して先読み再生が行われることになる。
【0077】
時刻T2では、小節Bの本番再生が開始される。時刻T2においてノートプール123に格納されているノートデータを
図13に示す。時刻T2では、小節B〜小節Cに関連するノートデータがノートプール123に保持されているので、これらのノートデータに基づいて、まだ本番再生されていない小節B〜小節Cの譜面の画像を生成して、テレビ2の画面に表示することができる。なお、時刻T2では小節Aに関連するノートデータはノートプール123からすでに削除されていても構わない。
【0078】
時刻T3では、小節Cの本番再生が開始される。時刻T3においてノートプール123に格納されているノートデータを
図14に示す。時刻T3では、小節C〜小節Dに関連するノートデータがノートプール123に保持されているので、これらのノートデータに基づいて、まだ本番再生されていない小節C〜小節Dの譜面の画像を生成して、テレビ2の画面に表示することができる。なお、時刻T3では小節Bに関連するノートデータはノートプール123からすでに削除されていても構わない。
【0079】
このように、本実施形態によれば、MIDIデータ126を本番再生している間、ノートプール123には常に現在の再生位置(本番再生における再生位置)から少なくとも2小節先までのノートイベントに関連するノートデータが保持されているので、現在鳴っている音よりも後に鳴る音(すなわち未来に鳴る音)に関する情報に基づいて、表示画像や出力音やゲーム内容等を変化させることができる。特に、楽曲データ再生ライブラリ122を用いてMIDIデータ126を無音で再生し、この無音再生において発生したノートイベントに基づいてノートデータを生成しているので、現在の再生位置から少なくとも2小節先までのノートイベントをMIDIデータ126から随時抽出するためのコンピュータプログラムを一から作成する必要が無く、コンピュータプログラムの作成効率が向上する。また、ノートプール123には、現在の再生位置(本番再生における再生位置)から2小節先までのノートイベントに関連するノートデータを記憶できる容量さえあればよいので、MIDIデータ126に含まれる全てのノートイベントを予め抽出して記憶する場合と比較して、必要となる記憶領域は少なくて済む。
【0080】
なお、上記の例では、本番再生よりも2小節分だけ先行して先読み再生を行っているが、どれだけ先行して先読み再生すべきかは目的に応じて適宜に決定すべきである。
【0081】
ところで、
図12において、時刻T0(先読み再生の開始時刻)から時刻T1(本番再生の開始時刻)までの間は、MIDIデータ126に基づく音(有音)を鳴らすことができない。つまり、本実施形態の手法では、MIDIデータ126の再生開始指示が行われたときから一定期間(時刻T0〜T1の期間)はMIDIデータ126の本番再生を開始することができない。そこで、このような待ち時間をできるだけ少なくするために、
図15に示すように、本番再生が開始されるまでの間、先読み再生を通常よりも高速(例えば100倍など)で再生するのが好ましい。これは、先読み再生の開始時に、楽曲データ再生ライブラリ122に対して高速再生を指示することによって行われる。なお、この場合でも、本番再生の開始後はノートプール123が溢れないように本番再生と先読み再生を同じ速度で併行して行う必要があるため、本番再生の開始時に、先読み再生の再生速度を通常速度(より正確には本番再生と同じ速度)に戻す必要がある。
【0082】
なお、本番再生を特定のタイミング(例えば、プレイヤがコントローラ7に設けられた特定のスイッチを押したときなど)に開始したい場合には、
図16に示すように、その特定のタイミング(T5)よりも十分に前もって先読み再生を開始し、小節AおよびBの先読み再生が完了した時点(T4)で先読み再生を一時停止し、その後、特定のタイミングが到来した時点で一時停止を解除すればよい。これは、小節AおよびBの先読み再生が完了した時点で、楽曲データ再生ライブラリ122に対して先読み再生の一時停止を指示し、その後、本番再生を開始する時点で一時停止を解除(すなわち先読み再生の再開)を指示することによって行われる。これにより、ノートプール123が溢れるのを防止しつつ、特定のタイミングで本番再生を開始することができる。
【0083】
(ノートデータ)
次に、
図17を参照して、ノートデータの詳細を説明する。ノートデータは、個々の音(ノート)に関するデータである。ノートデータには、ノートイベントと同様に、「所属トラック」、「再生タイミング」、「ノート長」、「音高」、「ベロシティ」(図示省略)などの情報が含まれている。なお、
図17の「ノート番号」は、後述の説明を分かりやすくするために便宜上記載したものである。ノートデータには、必要に応じて、トラック毎のボリュームを示す「トラックボリューム」や、トラック内での相対的なボリュームを示す「エクスプレッション」や、リバーブなどのエフェクトのかかり具合を示す「エフェクトセンド」など、ノートイベントに含まれていない情報(他のMIDIイベントによって指定される情報)がさらに含まれていてもよい。また、ノートデータには、そのノートデータに対応する音がどの和音を構成しているかを示す「所属和音」の情報も含まれている。「所属和音」の実体は、後述する和音データへのポインタである。なお、本実施形態では、各トラックにおいてほぼ同時に発音される1以上の音の集まりを「和音」として扱う。すなわち、他のいずれの音ともほぼ同時に発音されないような音も、便宜上、1つの「和音」として扱う。例えば、
図17の例では、ノートN1とノートN2が和音W1を構成しており、ノートN3が単独で和音W2を構成している。
【0084】
本実施形態では、「和音」が連なったものとして楽曲を扱うことによって、例えば、現在鳴っている音(「和音」)の次に鳴る音(「和音」)の音高を取得したり、現在鳴っている音(「和音」)の2つ後になる音(「和音」)の音長を取得したりといった処理を容易にしている。「和音」に関する情報は、和音データとして記憶される。和音データの詳細は後述する。
【0085】
ノートデータは前述のようにノートプール123に一時的に記憶される。本実施形態ではノートプール123はリングバッファとなっており、ノートプール123においてノートデータが満杯になると、その後、新たなノートデータを記憶するときには、最も古いノートデータを削除して空き領域を確保した上で、その空き領域に新たなノートデータが記憶される。
【0086】
上記のように、先読み再生において発生した音に関する情報は、ノートデータとして、ある程度の時間保持される。よって、例えば現在の演奏位置から2小節先までの期間に鳴る音の情報を得ようとするときに、MIDIデータ126に含まれる複数のノートイベントの中から、それらの音に対応するノートイベントを再生タイミングに基づいて抽出するといった煩雑な処理を随時行う必要はなく、単にノートプール123からノートデータを読み出すだけでよい。
【0087】
(和音データ)
次に、
図18を参照して、和音データの詳細を説明する。和音データは、ノートデータと併行して生成され、ノートデータと同様に記憶領域に一時的に保持される。和音データを一時的に保持しておくための領域を「和音プール」と称する。和音プール124は、ノートプール123と同様に、例えば外部メインメモリ12に設定された一定容量の記憶領域であって、和音データを先入れ先出し方式で記憶する。和音プール124がリングバッファである点も、ノートプール123と同様である。
【0088】
和音データには、「所属トラック」、「再生タイミング」、「次の和音」、「前の和音」、「構成ノート」などの情報が含まれている。なお、
図18の「和音番号」は、後述の説明を分かりやすくするために便宜上記載したものである。和音データには、必要に応じて、その和音を構成しているノートの数を示す「構成ノート数」などの他の情報がさらに含まれていてもよい。「所属トラック」は、その和音が所属しているトラックを示す。「再生タイミング」は、その和音の発音タイミングを示す。「次の和音」は、同一トラックにおいて、その和音の直後に発音される和音を示している。なお、「次の和音」に対応する和音データが和音プール124に存在しない場合には、「次の和音」の値はNULLとなる。「前の和音」は、同一トラックにおいて、その和音の直前に発音される和音を示している。なお、「前の和音」に対応する和音データが和音プール124に存在しない場合には、「前の和音」の値はNULLとなる。「次の和音」および「前の和音」の実体は、対応する和音データへのポインタである。「構成ノート」は、その和音を構成している1つまたは複数のノートを示している。「構成ノート」の実体は、対応するノートデータへのポインタである。
【0089】
図18に示すような和音データを和音プール124に一時的に保持しておくことにより、例えば、本番再生の開始から5ティックが経過した時点で、トラック0において次に鳴る「和音」は和音W5であり、その次に鳴る「和音」は和音W8である、というようなことを簡単に知ることができる。また、和音データにおける「構成ノート」の情報に基づいてノートプール123内の対応するノートデータを参照することにより、例えば、和音W8を構成する各ノート(ここではノートN9およびノートN10)の音高やノート長などの情報を簡単に取得することができる。
【0090】
(トラックデータ)
本実施形態では、和音データを生成するために、
図19に示すように、トラック毎の「最新和音」を、トラックデータ125として記憶するようにしている。「最新和音」は、先読み再生において無音再生された和音のうち、最も新しい和音(すなわち一番最後に無音再生された和音)を示す。「最新和音」の実体は、対応する和音データへのポインタである。なお、
図19の例は、先読み再生において
図10の譜面に対応する楽曲の部分を再生し終えた直後のトラックデータ125を示している。トラックデータの具体的な利用方法については後述する。
【0091】
以上のように、本実施形態によれば、本番再生における現在の演奏位置よりも後に発生する音に関する情報を容易に得られるので、例えば、本番再生において、現在鳴らすべき音の音色を次に鳴る音の音高に応じて変化させたり、現在鳴らすべき音の長さを次の音までの時間間隔に応じて変化させたりというように、従来は困難だった処理も容易に可能となる。以下、本実施形態における楽曲演奏処理の種々の応用例について説明する。
【0092】
(応用例1)
応用例1は、MIDIデータ126に基づいて楽曲を再生している最中に、現在の演奏位置から2小節先までの部分の譜面を画面に表示する例である。以下、
図20〜
図24を参照して、応用例1における楽曲演奏プログラム121に基づくCPU10の処理の流れを説明する。
【0093】
図20において、応用例1のメイン処理が開始されると、ステップS10でCPU10は初期化処理を行う。具体的には、ノートプール123のクリア、和音プール124のクリアおよびトラックデータ125のクリアを行う。
【0094】
ステップS11ではCPU10は、高速テンポ(例えば通常テンポの10倍)でMIDIデータ126の先読み再生を開始する。先読み再生は無音で(すなわち音量0で)行われる。
【0095】
ステップS12ではCPU10は、音情報格納処理を行う。音情報格納処理とは、先読み再生においてノートイベントが発生する毎に、このノートイベントに対応するノートデータをノートプール123に追加する処理である。以下、
図21を参照して、この音情報格納処理の詳細を説明する。
【0096】
図21において、音情報格納処理が開始されると、ステップS30でCPU10は、先読み再生においてノートイベントが発生したかどうかを判断し、ノートイベントが発生した場合にはステップS31に進み、そうでない場合には音情報格納処理を終了する。
【0097】
ステップS31ではCPU10は、発生したノートイベントに基づいてノートデータを生成する。
【0098】
ステップS32ではCPU10は、ノートデータ格納処理を行う。ノートデータ格納処理とは、新規に生成したノートデータをノートプール123に格納するための処理である。以下、
図22を参照して、このノートデータ格納処理の詳細を説明する。
【0099】
図22において、ノートデータ格納処理が開始されると、ステップS40でCPU10は、ノートプール123が満杯かどうかを判断し、満杯である場合はステップS41に進み、そうでない場合はステップS45に進む。
【0100】
ステップS41ではCPU10は、ノートプール123に格納されているノートデータのうち最も古いノートデータに対応する和音データを削除対象和音データとして選択する。前述のように、本実施形態ではノートプール123はリングバッファであるので、新規に生成されたノートデータを書き込もうとしている領域に格納されているノートデータが最も古いノートデータということになる。その最も古いノートデータの「所属和音」で示されている和音データが、削除対象和音データとして選択される。
【0101】
ステップS42ではCPU10は、削除対象和音データに関連する他の和音データを更新する。具体的には、削除対象和音データの「次の和音」に示されている和音データの「前の和音」の値をNULLに変更する。例えば、
図18において、削除対象和音データに対応する和音が和音W1である場合には、和音W1の次の和音である和音W5に対応する和音データにおける「前の和音」の値を「W1」からNULLへと変更する。
【0102】
ステップS43ではCPU10は、削除対象和音データに関連するノートデータをノートプール123から削除する。具体的には、削除対象和音データの「構成ノート」に示されているノートデータをノートプール123から削除する。例えば、
図18において、削除対象和音データに対応する和音が和音W1である場合には、和音W1を構成しているノートN1およびノートN2に対応するノートデータをノートプール123から削除する。
【0103】
ステップS44ではCPU10は、和音プール124から削除対象和音データを削除する。
【0104】
ステップS45ではCPU10は、新規に生成されたノートデータ(すなわちステップS31で生成されたノートデータ)をノートプール123に格納し、ノートデータ格納処理を終了する。
【0105】
図21に戻り、ステップS32のノートデータ格納処理が終了すると、ステップS33に進む。
【0106】
ステップS33ではCPU10は、トラックデータ125として記憶されている、ノートプール123に新規に格納されたノートデータ(すなわちステップS31で生成されたノートデータ)と同一トラックの「最新和音」を参照する。
【0107】
ステップS34ではCPU10は、ノートプール123に新規に格納されたノートデータ(すなわちステップS31で生成されたノートデータ)の再生タイミングと、当該ノートデータと同一トラックの「最新和音」が示す和音データの再生タイミングとが同一かどうかを判断し、異なる場合はステップS35に進み、同一である場合はステップS38に進む。なお、これらの再生タイミングが僅かしか違わない場合(すなわち再生タイミングの差が所定ティック以下の場合)は、これらの再生タイミングを同一と見なしてもよい。
【0108】
ステップS35ではCPU10は、ノートプール123に新規に格納されたノートデータ(すなわちステップS31で生成されたノートデータ)に対応する和音データ(すなわち当該ノートデータに対応するノートを「構成ノート」とした和音データ)を新規に生成する。
【0109】
ステップS36ではCPU10は、和音データ格納処理を行う。和音データ格納処理とは、新規に生成した和音データを和音プール124に格納するための処理である。以下、
図23を参照して、この和音データ格納処理の詳細を説明する。
【0110】
図23において、和音データ格納処理が開始されると、ステップS50でCPU10は、和音プール124が満杯かどうかを判断し、満杯である場合はステップS51に進み、そうでない場合はステップS55に進む。
【0111】
ステップS51ではCPU10は、和音プール124に格納されている和音データのうち最も古い和音データを削除対象和音データとして選択する。前述のように、本実施形態では和音プール124はリングバッファであるので、新規に生成された和音データを書き込もうとしている領域に格納されている和音データが最も古い和音データということになる。
【0112】
ステップS52ではCPU10は、削除対象和音データに関連する他の和音データを更新する。この処理は、前述の
図22のステップS42と同じ処理である。
【0113】
ステップS53ではCPU10は、削除対象和音データに関連するノートデータをノートプール123から削除する。この処理は、前述の
図22のステップS43と同じ処理である。
【0114】
ステップS54ではCPU10は、和音プール124から削除対象和音データを削除する。この処理は、前述の
図22のステップS44と同じ処理である。
【0115】
ステップS55ではCPU10は、新規に生成された和音データ(すなわちステップS35で生成された和音データ)を和音プール124に格納し、和音データ格納処理を終了する。
【0116】
図21に戻り、ステップS36の和音データ格納処理が終了すると、ステップS37に進む。
【0117】
ステップS37ではCPU10は、トラックデータ125において、新規に生成された和音データ(すなわちステップS35で生成された和音データ)と同一トラックの「最新和音」を更新する。具体的には、新規に生成された和音データと同一トラックの「最新和音」が当該新規に生成された和音データを示すように、当該「最新和音」の値を変更する。そして、音情報格納処理を終了する。
【0118】
ステップS38ではCPU10は、トラックデータ125において、新規に生成されたノートデータ(すなわちステップS31で生成されたノートデータ)と同一トラックの「最新和音」が示す和音データを更新する。具体的には、新規に生成されたノートデータと同一トラックの「最新和音」が示す和音データの「構成ノート」が当該新規に生成されたノートデータを示すように、当該「構成ノート」の値を更新する。そして、音情報格納処理を終了する。
【0119】
図20に戻り、ステップS12の音情報格納処理が終了すると、ステップS13に進む。
【0120】
ステップS13ではCPU10は、先読み再生において2小節が経過したかどうかを判断し、2小節が経過した場合にはステップS14に進み、そうでない場合にはステップS12に戻る。
【0121】
ステップS14ではCPU10は、先読み再生を一時停止する。なお、ここでは先読み再生において2小節が経過した時点で先読み再生を一時停止しているが、記憶容量に余裕がある場合には、2小節よりも多くの時間(例えば3小節)が経過してから先読み再生を一時停止するようにしてもよい。さらには、ノートプール123または和音プール124が満杯になった時点で先読み再生を一時停止するようにしてもよい。
【0122】
ステップS15ではCPU10は、本番再生を開始すべきかどうかを判断し、本番再生を開始すべき場合はステップS16に進み、そうでない場合は、本番生成を開始すべきタイミングが来るまで待機する。ここで、「本番生成を開始すべきタイミング」とは、あらかじめ定められた条件を満たしたときであって、例えば、プレイヤがコントローラ7に設けられた特定のスイッチを押したときなどである。
【0123】
ステップS16ではCPU10は、一時停止中であったMIDIデータ126の先読み再生を、通常テンポ(すなわち本番再生と同じテンポ)で再開する。
【0124】
ステップS17ではCPU10は、MIDIデータ126の本番再生を開始する。これにより、MIDIデータ126の先読み再生と本番再生とが併行して行われる。
【0125】
ステップS18ではCPU10は、音情報格納処理を行う。この処理は、前述のステップS12と同じ処理である。
【0126】
ステップS19ではCPU10は、音情報利用処理を行う。音情報利用処理とは、和音プール124に記憶されている和音データおよびノートプール123に記憶されているノートデータを利用して所定の処理(ここでは譜面を表示する処理)を行うことである。以下、
図24を参照して、応用例1の音情報利用処理の詳細を説明する。
【0127】
図24において、音情報利用処理が開始されると、ステップS60でCPU10は、本番再生における現在の演奏位置から2小節先までの範囲に含まれる和音に対応する和音データを和音プール124から抽出する。該当する和音データは、和音データの「再生タイミング」を参照することによって抽出することができる。
【0128】
ステップS61ではCPU10は、抽出した和音データに関連するノートデータを参照して譜面の画像を生成する。具体的には、抽出した和音データの「構成ノート」が示すノートに対応するノートデータを参照して、譜面の画像を生成する。
【0129】
ステップS62ではCPU10は、生成した譜面の画像をテレビ2の画面に出力し、音情報利用処理を終了する。
【0130】
図20に戻り、ステップS19の音情報利用処理が終了すると、ステップS20に進む。
【0131】
ステップS20ではCPU10は、本番再生が終了したかどうかを判断し、本番再生が終了した場合には応用例1のメイン処理を終了し、そうでない場合にはステップS18に戻る。なお、先読み再生は、本番再生が終了するよりも先に終了する。
【0132】
このように、応用例1によれば、楽譜の画像を生成するための特別なデータを用意することなく、MIDIデータに基づいて譜面の画像を生成することが可能である。
【0133】
(応用例2)
応用例2は、MIDIデータ126に基づいて楽曲を再生するときに、プレイヤに一定のタイミング(ここでは小節の区切り)でコントローラ7上の所定のスイッチを押下させ、プレイヤが正しいタイミングでスイッチを押下できたときには楽曲を正常に再生し、プレイヤが正しいタイミングでスイッチを押下できなかった場合にはトラック間で互いにずらして楽曲を再生する例である。以下、
図25〜
図28を参照して、応用例2における楽曲演奏プログラム121に基づくCPU10の処理の流れを説明する。
【0134】
図25において、ステップS70〜S76の処理は、応用例1の
図20のステップS10〜S16の処理と同じであるため、説明は省略する。
【0135】
ステップS77ではCPU10は、MIDIデータ126の本番再生を開始する。ただし、ここでは先読み再生と同様に本番再生も音量0で行われる。応用例2では、後述する
図26のステップS95において音が発生される。
【0136】
ステップS78ではCPU10は、音情報格処理を行う。この処理は、ステップS72と同じ(すなわち応用例1の
図20のステップS12と同じ)処理である。
【0137】
ステップS79ではCPU10は、音情報利用処理を行う。音情報利用処理とは、和音プール124に記憶されている和音データおよびノートプール123に記憶されているノートデータを利用して所定の処理(ここではトラック毎に再生タイミングをずらして音を鳴らす処理)を行うことである。以下、
図26を参照して、応用例2の音情報利用処理の詳細を説明する。
【0138】
図26において、音情報利用処理が開始されると、ステップS90でCPU10は、コントローラ7から所定の信号(例えば、コントローラ7上の所定のスイッチが押下されたことを示す信号、またはコントローラ7が振られたことを示す信号)の入力があったかどうかを判断し、所定の信号の入力があった場合にはステップS91に進み、そうでない場合にはステップS93に進む。
【0139】
ステップS91ではCPU10は、理想の入力タイミング(ここでは、小節の区切り)と実際の入力タイミングのズレ幅(例えばティック数)を計算する。
【0140】
ステップS92ではCPU10は、本番再生における現在の演奏位置よりも後ろの小節に対応する和音データおよびノートデータの「再生タイミング」を、計算されたズレ幅に応じて変更する。以下、「再生タイミング」の変更方法の一例を
図27および
図28を参照して説明する。
【0141】
図27は、理想の入力タイミングを示している。応用例2では、プレイヤは、小節の区切りの位置(図における「第N入力タイミング」、「第(N+1)入力タイミング」および「第(N+2)入力タイミング」)でタイミング良く所定の操作(例えば、コントローラ7上の所定のスイッチを押す操作)を行うという課題を課せられている。例えば、プレイヤが第N小節の先頭の位置(すなわち第N入力タイミング)またはその周辺で所定の操作を行った場合には、理想の入力タイミングである第N入力タイミングと実際の入力タイミングとのズレ幅が計算され、このズレ幅に応じて、第(N+1)小節の各音の再生タイミングが
図28に示すようにトラック単位で前方または後方にずらされる。
【0142】
なお、再生タイミングが早められるか遅められるかは、トラック毎においてランダムに決定される。また、再生タイミングの変化量(絶対値)の上限値は、理想の入力タイミングと実際の入力タイミングとのズレ幅に応じて大きくなるように決定され、実際の変化量はトラック毎においてランダムに決定される。すなわち、第N入力タイミングとこれに対応する実際の入力タイミングとが完全に一致している場合には、第(N+1)小節が楽譜通りに正常に(すなわちトラック間で第(N+1)小節の再生タイミングが互いにずれることなく)演奏されるが、第N入力タイミングとこれに対応する実際の入力タイミングとのズレ幅が大きいほど、第(N+1)小節が変に(すなわちトラック間で第(N+1)小節の再生タイミングが互いに大きくずれて)演奏されることになる。
【0143】
他の小節についても同様である。例えば、第(N+1)入力タイミングとこれに対応する実際の入力タイミングとのズレ幅に応じて、第(N+2)小節の各音の再生タイミングが変更される。
【0144】
ステップS93ではCPU10は、和音プール124において、本番再生(無音)における現在の演奏位置(ティック数で示される)に対応する和音データ(すなわち「再生タイミング」が現在の演奏位置に一致している和音データ)が存在するかどうかを判断し、現在の演奏位置に対応する和音データが存在する場合にはステップS94に進み、そうでない場合には応用例2の音情報利用処理を終了する。
【0145】
ステップS94ではCPU10は、現在の演奏位置に対応する和音データ(1つまたは複数)に関連するノートデータをノートプール123から取得(すなわち抽出)する。具体的には、該当する和音データの「構成ノート」に示されているノートデータをノートプール123から取得する。
【0146】
ステップS95ではCPU10は、取得したノートデータに基づいて音を発生させ、応用例2の音情報利用処理を終了する。ここで発生される音は、ステップS92において必要に応じて「再生タイミング」の変更されたノートデータに基づく音である。
【0147】
図25に戻り、ステップS79の音情報利用処理が終了すると、ステップS80に進む。
【0148】
ステップS80ではCPU10は、本番再生が終了したかどうかを判断し、本番再生が終了した場合には応用例2のメイン処理を終了し、そうでない場合にはステップS78に戻る。なお、先読み再生は、本番再生が終了するよりも先に終了する。
【0149】
以上のように、応用例2では、プレイヤの操作等に応じて楽曲に含まれる各音の再生タイミングを変化させることができる。特に、従来技術においては、MIDIデータを再生するときに、一部のトラックの音だけを本来の再生タイミングよりも早いタイミングで鳴らすというようなことは非常に困難であったが、本実施形態によれば、上記のような処理によって簡単に可能となる。
【0150】
なお、応用例2においては、理想の入力タイミングと実際の入力タイミングとのズレ幅に応じて再生タイミングをずらしているが、変形例として、理想の入力タイミングと実際の入力タイミングとのズレ幅に応じて再生タイミング以外の楽曲パラメータ(例えば音高や音色など)を変更するようにしてもよい。さらなる変形例として、複数のプレイヤで遊ぶ場合には、プレイヤ間の入力タイミングのズレ幅に応じて再生タイミング等を変化させるようにしてもよい。
【0151】
また、応用例2においては、理想の入力タイミングと実際の入力タイミングとのズレ幅に応じて、楽曲の一部(1小節分)の再生タイミングをずらしているが、変形例として、ある時点における理想の入力タイミングと実際の入力タイミングとのズレ幅に応じて、それ以降の楽曲の残り全ての部分の音情報を変更する(すなわち、その時点ではまだノートプール123や和音プール124に格納されていないノートデータや和音データについては、それらのデータがノートプール123や和音プール124に格納された時点で随時変更する)ようにしてもよい。
【0152】
(応用例3)
応用例3は、MIDIデータ126に基づく楽曲の演奏中に、プレイヤがコントローラ7を振る強さに応じて、楽曲の各音の長さを変化させる例である。例えば、プレイヤがコントローラ7を比較的強く振っている場合には、各音の長さを「((その音の次の音の再生タイミング)−(その音の再生タイミング))×0.3」に変更し、比較的弱く振っている場合には、各音の長さを「((その音の次の音の再生タイミング)−(その音の再生タイミング))×0.6」に変更する。この場合も、本実施形態では「次の音の再生タイミング」をノートプール123および和音プール124を参照して簡単に取得することが可能である。
【0153】
なお、コントローラ7を振る強さについては、例えばコントローラ7に設けられた加速度センサ701の出力信号に基づいて検知することができる。コントローラ7を振る強さの替わりに、プレイヤによるコントローラ7の操作強度を示す他のパラメータ(例えば、コントローラを回す速さや、特定のスイッチを押す強さなど)を用いても構わない。
【0154】
(応用例4)
応用例4は、MIDIデータ126に基づく楽曲の演奏中に、プレイヤがコントローラ7上の所定のボタンを任意のタイミングで押したときに、直前に鳴った音と、次に鳴る音との中間の音高の音を発生させる例である。この場合も、本実施形態では「次に鳴る音の音高」をノートプール123および和音プール124を参照して簡単に取得することが可能である。
【0155】
なお、本実施形態ではMIDIデータ126に基づいて楽曲を演奏する例を説明したが、本発明はこれに限らず、MIDIデータ126と類似した性質を有する他のフォーマットの楽曲データにも本発明を応用できることは言うまでもない。
【0156】
また、本実施形態では先読み再生において発生したノートイベントに基づいて生成されたノートデータをノートプール123に記憶する例を説明したが、本発明はこれに限らず、先読み再生において発生したノートイベントをそのままノートプール123に格納するようにしても構わない。また、本実施形態では和音データを和音プール124に記憶する例を説明したが、本発明において、和音データを記憶することは必須ではない。
【0157】
また、本実施形態ではノートプール123および和音プール124がリングバッファである例を説明したが、本発明はこれに限らない。
【0158】
また、本実施形態では、異なるトラックのノートデータを同一のリングバッファ(ノートプール123)に格納する例を説明したが、本発明はこれに限らず、トラック毎にリングバッファを設けてもよい。ただし、楽曲に含まれる音の個数はトラック間で異なるため、トラック毎にリングバッファを設けた場合には、一部のリングバッファについてのみノートデータの追加頻度が極端に低いというような状況が生じ易く、記憶領域の利用効率が悪くなるという問題がある。したがって、記憶領域の利用効率を高めるという点では、本実施形態のように異なるトラックのノートデータを同一のリングバッファに格納するのが好ましい。和音プール124についても同様である。