演奏動作表示装置、方法及びプログラム
【課題】演奏者にとって視認しやすい演奏動作の表示をすることができる演奏動作表示装置、方法及びプログラムを提供すること。
【解決手段】演奏動作表示装置1は、RAM13に記憶された演奏情報、動作情報及び構造データに基づいて、表示部16に演奏動作画像を描画するCPU11を備える。CPU11は、RAM13に記憶されているフラグに基づいて演奏テクニック動作の表示を行うか否かを判定し、当該演奏テクニック動作の表示を行うと判定した場合に、当該演奏テクニック動作に対応する画像の表示態様を、当該演奏テクニック動作を表示しない場合に対応する画像の表示態様に比べて変化させる。
【解決手段】演奏動作表示装置1は、RAM13に記憶された演奏情報、動作情報及び構造データに基づいて、表示部16に演奏動作画像を描画するCPU11を備える。CPU11は、RAM13に記憶されているフラグに基づいて演奏テクニック動作の表示を行うか否かを判定し、当該演奏テクニック動作の表示を行うと判定した場合に、当該演奏テクニック動作に対応する画像の表示態様を、当該演奏テクニック動作を表示しない場合に対応する画像の表示態様に比べて変化させる。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、電子楽器の演奏動作を表示する演奏動作表示装置、方法及びプログラムに関する。
【背景技術】
【0002】
従来、演奏の進行に応じて押鍵(操作)すべき鍵に対して、押鍵に使用する指をユーザに通知するナビゲーション機能を備えた演奏動作表示装置が提案されている。例えば、特許文献1には、演奏時に演奏動作として鍵盤に対する手指の位置を表示部に表示させることにより、押鍵に使用する指をユーザに通知するナビゲーション機能を備えた演奏動作表示装置が提案されている。また、特許文献1で提案される演奏動作表示装置では、演奏の各パートにおいて、演奏動作の表示方式の変更操作を受け付けたことに応じて、手指のサイズの拡大及び縮小、手指の透過表示、手指をワイヤーフレームとした表示、視点(表示角度)の変更等を実行することが提案されている。
【先行技術文献】
【特許文献】
【0003】
【特許文献1】特許第3528051号公報
【発明の概要】
【発明が解決しようとする課題】
【0004】
ところで、特許文献1で提案された演奏動作表示装置では、例えば、両手が離れて配置されるパートにおいて、鍵盤全体が表示される場合がある。鍵盤は横に長いことから、鍵盤全体が表示される場合には、押鍵に使用する指が表示部に小さく表示されてしまう。
【0005】
また、特許文献1で提案された演奏動作表示装置では、上述したように拡大及び縮小等の表示方式の変更操作を受け付けることも可能であるが、演奏時に演奏者が変更操作を行うことが困難である。また、特許文献1で提案された演奏動作表示装置では、自動的に視点を変更することができない。このため、演奏者は、指の細かい動作等の特定の演奏技術を確認する場合、演奏者自らが視点を変更する操作を行う必要がある。よって、特許文献1で提案された演奏動作表示装置では、ユーザが特定の演奏技術について演奏しながら確認することが、困難になる可能性がある。
【0006】
本発明は、このような状況に鑑みてなされたものであり、演奏者にとって視認しやすい演奏動作の表示をすることができる演奏動作表示装置、方法及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【0007】
上記目的を達成するため、本発明の一態様の演奏動作表示装置は、発音開始時間、発音継続時間、音高、使用する指、及び特定動作の表示を行うためのフラグを格納する演奏情報と、複数の構造データと、当該構造データ同士の関連性を記憶する構造データと、前記発音開始時間に対応して複数の前記構造データを表示させる場合の起点となる前記構造データの情報を示す動作情報と、を記憶する記憶手段と、前記記憶手段に記憶された前記演奏情報、前記動作情報及び前記構造データに基づいて、表示手段に演奏動作画像を描画する描画手段と、を備え、前記描画手段は、前記記憶手段に記憶されている前記演奏情報の前記フラグに基づいて前記特定動作の表示を行うか否かを判定し、当該特定動作の表示を行うと判定した場合に、当該特定動作に対応する画像の表示態様を、当該特定動作を表示しない場合に対応する画像の表示態様に比べて変化させることを特徴とする。
【発明の効果】
【0008】
本発明によれば、演奏者にとって視認しやすい演奏動作の表示をすることができる。
【図面の簡単な説明】
【0009】
【図1】演奏動作表示装置及び電子楽器のハードウェアの構成を示すブロック図である。
【図2】演奏動作表示の例を説明する図である。
【図3】表示部に演奏動作表示を行う場合における、それぞれの用語を説明する図である。
【図4】制御変数の構造を示す図である。
【図5】演奏情報の構造を示す図である。
【図6】構造データの構造を示す図である。
【図7】鍵盤データの構造を示す図である。
【図8】動作情報の構造を示す図である。
【図9】演奏動作表示のメイン処理の流れを示すフローチャートである。
【図10】再生処理の流れを示すフローチャートである。
【図11】動作情報検索処理の流れを示すフローチャートである。
【図12】演奏情報検索処理の流れを示すフローチャートである。
【図13】離鍵チェック処理の流れを示すフローチャートである。
【図14】レンダリング処理の流れを示すフローチャートである。
【図15】鍵盤描画処理の流れを示すフローチャートである。
【図16】腕描画処理の流れを示すフローチャートである。
【図17】手指描画処理の流れを示すフローチャートである。
【図18】拡大演奏動作表示において参照される動作情報の構造を示す図である。
【図19】視点移動時のレンダリング処理の流れを示すフローチャートである。
【図20】視点計算処理の流れを示すフローチャートである。
【図21】演奏テクニック表示を含む演奏動作表示を行う場合に参照される制御変数の構造を示す図である。
【図22】演奏テクニック表示を含む演奏動作表示を行う場合に参照される演奏情報の構造を示す図である。
【図23】演奏テクニック表示を含む演奏動作表示を行う場合に実行される演奏情報検索処理の流れを示すフローチャートである。
【図24】演奏テクニック表示を含む演奏動作表示を行う場合に実行される演奏テクニック検索処理の流れを示すフローチャートである。
【図25】演奏テクニック表示を含む演奏動作表示を行う場合に実行されるレンダリング処理の流れを示すフローチャートである。
【図26】演奏テクニック表示を含む演奏動作表示を行う場合に実行される視点変更計算処理の流れを示すフローチャートである。
【発明を実施するための形態】
【0010】
以下、本発明の実施形態について、図面を用いて説明する。
【0011】
図1は、本発明の一実施形態に係る演奏動作表示装置及び電子楽器のハードウェアの構成を示すブロック図である。
演奏動作表示装置1は、例えば表示部を備えて構成される。
【0012】
演奏動作表示装置1は、CPU(Central Processing Unit)11と、ROM(Read Only Memory)12と、RAM(Random Access Memory)13と、バス14と、入力部15と、表示部16と、MIDI(Musical Instrument Digital Interface)インターフェース17と、を備えている。
【0013】
CPU11は、演奏動作表示装置1の全体を制御し、ROM12に記憶されているプログラム、又は、ROM12からRAM13に読み出されたプログラムに従って各種の処理を実行する。
【0014】
ROM12は、CPU11の実行する各種処理の処理プログラムを格納する。また、RAM13は、ROM12から読み出されたプログラム等を格納する。
【0015】
CPU11、ROM12及びRAM13は、バス14を介して相互に接続されている。また、バス14には、入力部15、表示部16及びMIDIインターフェース17が接続されている。
【0016】
入力部15は、例えばボタン等により構成されており、ユーザからの操作指示に応じて各種情報の入力を受け付ける。
表示部16は、CPU11の制御に従って各種設定情報や演奏動作に係る情報等を表示する。
MIDIインターフェース17は、電子楽器2が接続されている。MIDIインターフェース17は、電子楽器2に対して模範演奏等に係る演奏データを送信する。
【0017】
電子楽器2は、MIDIインターフェース21と、鍵盤22と、音源・サウンドシステム23と、を備える。
MIDIインターフェース21は、演奏動作表示装置1から模範演奏等に係る演奏データを受信し、この演奏データに対応する演奏信号を音源・サウンドシステムに出力する。また、鍵盤22から楽器の操作入力を受け付け、この操作入力に対応した演奏信号を音源・サウンドシステムに出力する。
音源・サウンドシステム23は、MIDIインターフェース21と接続され、MIDIインターフェースから出力された信号に基づいて、楽器等の音を出力する。
【0018】
このような演奏動作表示装置1は、ユーザの演奏の上達を補助するために、演奏時の腕、手及び指の模範的な動作を表示部16に表示する。なお、以下、図2(a)に示すような演奏時の腕、手及び指の動作の表示部16への表示を通常演奏動作表示という。また、図2(b)に示すような演奏時の腕、手及び指の動作の表示部16への拡大表示を拡大演奏動作表示という。また、図2(c)に示すような演奏時の腕、手及び指を斜め方向からの拡大表示を演奏テクニック表示という。
【0019】
なお、以下の説明において、図2(a)に示すような鍵盤を正面から視認した場合の横方向(低音の鍵から高音の鍵に向かう方向)をx軸方向とし、鍵盤を正面から視認した場合に正面から鍵盤に向かって延びる方向をy軸方向とし、鍵盤を正面から視認した場合の上方向をz軸方向とする。
【0020】
図3は、表示部16に演奏動作表示を行う場合における、それぞれの用語を説明する図である。
まず、表示部16に表示される画像を視野Pとする。この視野Pの中心位置を視野の中心という。また、視野の中心からレンダリングを行う場合における視点に向かって延びるベクトルを目線ベクトルという。また、視点に向かって視野の上端及び下端における幅方向の中心に向かって線を引いた場合の、当該線が交差する角度を高さ方向視野角という。
【0021】
まず、通常演奏動作表示に必要な情報について説明する。この演奏動作表示に必要な情報は、ROM12に記憶されている。これらの情報は、演奏時において、CPU11によって、ROM12から適宜複写されてRAM13に一時的に記憶される。
【0022】
図4は、制御変数の構造を示す図である。この制御変数は、演奏動作表示装置1において通常演奏動作表示及び拡大演奏動作表示を行うために用いられる。
制御変数には、変数として、widthと、heightと、f0vyと、Center[3]と、Eye[3]と、EyeVector[3]と、NoteR[]と、StructR[]と、MotionR[]と、IndexRと、NoteL[]と、StructL[]と、MotionL[]と、IndexLと、が定義されている。
なお、構造を示す図において、末尾に添え字として[]が設けられている変数は、配列を示している。例えば、Center[3]は、3つの変数から構成される配列である。また、構造を示す図において、配列の要素数が空欄の配列は、演奏する曲によってそれぞれ異なることを示している。
【0023】
widthは、表示部16に表示する画面の幅を示す変数である。
heightは、表示部16に表示する画面の高さを示す変数である。
f0vyは、高さ方向視野角(図3参照)を示す変数である。
Center[3]は、表示部16に表示する画面における視界の中心座標を示す変数である。Center[3]には、それぞれの要素に対して、3次元座標系(x,y,z)における各座標値が含まれており、3次元座標系における位置を示している。
Eye[3]は、表示部16に表示する画面における視点を示す変数である。この変数Eyeも、Centerと同様に3次元座標系における位置を示している。
EyeVector[3]は、視線ベクトルを示す変数である。EyeVector[3]は、Eye[3]からCenter[3]を減算することで得られる。
【0024】
NoteR[]は、右手の演奏情報が格納される配列変数である。詳細は後述する。
StructR[]は、右手の構造データが格納される配列変数である。構造データとは、指、手及び腕の構造を示す図である。この構造データは、表示部16に表示する画面において、指、手及び腕をレンダリングする際に用いられる。
MotionR[]は、演奏時における右手の動作を示す動作情報が格納される配列変数である。
IndexRは、レンダリング対象の右手の動作情報のインデックスを示す変数である。
【0025】
NoteL[]は、左手の演奏情報が格納される配列変数である。NoteL[]に格納される変数は、NoteR[]と同一である。
StructL[]は、左手の構造データが格納される配列変数である。StructL[]に格納される変数は、StructR[]と同一である。
MotionL[]は、演奏時における左手の動作を示す動作情報が格納される配列変数である。MotionL[]に格納される変数は、MotionR[]と同一である。
IndexLは、レンダリング対象の左手の動作情報のインデックスを示す変数である。
【0026】
図5は、演奏情報の構造を示す図である。
演奏情報は、上述したように、右手の演奏情報を示すNoteR[]と、左手の演奏情報を示すNoteL[]と、から構成される。
NoteR[]と、NoteL[]とは構成が同一であるため、図5では、これらNoteR[]と、NoteL[]とをまとめて、Note[]として説明する。
【0027】
図5に示すように、Note[]におけるそれぞれの要素(Note[0]、Note[1]、・・・Note[N]、・・・)には、Timeと、Gateと、Pitchと、が定義されている。なお、以下の説明において、添え字のみ異なる配列変数には、特段の説明がない限り、同一の変数が定義されているものとする。例えば、図5では、Note[0]にのみ、Timeと、Gateと、Pitchとが定義されているが、他の変数(Note[1]、Note[N]等)においても、Note[0]と同様に、Timeと、Gateと、Pitchとが定義されているものとする。
【0028】
Timeは、発音を開始する時間を示す変数である。
Gateは、発音を継続する時間を示す変数である。
Pitchは、発音される音の音高(周波数)を示す変数である。
【0029】
図6は、構造データの構造を示す図である。
構造データは、上述したように、右手の構造データを示すStructR[]と、左手の構造データを示すStructL[]と、から構成される。
StructR[]と、StructL[]とは構成が同一であるため、図6では、これらStructR[]と、StructL[]とをまとめて、Struct[]として説明する。
【0030】
図6に示すように、Struct[]におけるそれぞれの要素には、Indexと、Parentと、Childrenと、Child[]と、Vertices[][3]と、Lengthと、Theta[]と、Phi[]と、Lambda[]と、が定義されている。
【0031】
Indexは、構造データのインデックスを示す変数である。
Parentは、親データとなる構造データのインデックスを示す変数である。例えば、Parentの値が2である場合には、インデックスが2である構造データが親データとなる。なお、Parentの値が−1である場合は、親データが無いことを示す。
Childrenは、親の構造に対して子となる構造物の数を示す変数である。
Vertices[][3]は、親の構造を示し、表示部16に表示されるポリゴンにおける各頂点の3次元座標を示す配列変数である。Vertices[][3]の[]は、ポリゴンにおける頂点の数に対応しており、この頂点の数だけが要素が定義される。また、Vertices[][3]の[3]は、それぞれの頂点の3次元座標に対応している。
Lengthは、親の構造の長さを示す変数である。
【0032】
Theta[]は、親の構造のx軸回転角を示す変数であり、後述の動作情報の要素数と同数の要素が定義される。
Phi[]は、親の構造のy軸回転角を示す変数であり、後述の動作情報の要素数と同数の要素が定義される。
Lambda[]は、親の構造のz軸回転角を示す変数であり、後述の動作情報の要素数と同数の要素が定義される。
【0033】
図7は、鍵盤データの構造を示す図である。
鍵盤データとしてのKey[]は、表示部16に表示される鍵盤を構成する白鍵及び黒鍵のそれぞれの情報を格納している。Key[]には、最も低音の鍵から順に、それぞれの鍵の情報が格納されている。例えば、Key[0]は、最も左に位置する白鍵に対応しており、この白鍵より半音高い鍵がKey[1]に対応している。
【0034】
図7に示すように、Key[]におけるそれぞれの要素には、Pitchと、isBlackと、Vertices[][3]と、Statusと、NoteOffと、が定義されている。
【0035】
Pitchは、発音される音の音高(周波数)を示す変数である。
isBlackは、黒鍵か白鍵かを示すフラグである。具体的には、isBlackは、0の場合に白鍵を示し、1の場合に黒鍵を示す。
Vertices[][3]は、鍵の構造データ(ポリゴンデータ)を示し、表示部16に表示されるポリゴンにおける各頂点の3次元座標を示す配列変数である。
Statusは、鍵の状態を示す変数である。例えば、Statusが0の場合に離鍵状態を示し、+の場合に押鍵状態を示し、−の場合に離鍵中を示す。
NoteOffは、発音されてから消音されるまでの時間である消音時間を示す変数である。
【0036】
図8は、動作情報の構造を示す図である。
動作情報は、上述したように、右手の動作情報を示すMotionR[]と、左手の動作情報を示すMotionL[]と、から構成される。
MotionR[]と、MotionL[]とは構成が同一であるため、図8では、これらMotionR[]と、MotionL[]とをまとめて、Motion[]として説明する。
【0037】
図8に示すように、Motion[]におけるそれぞれの要素には、Timeと、RootPos[3]と、が定義されている。
Timeは、演奏時における各フレームが開始される時間を示す変数である。
RootPos[3]は、表示部16に構造物を描画する際に起点となる構造物の3次元座標(起点関節の3次元座標)である。
【0038】
続いて、演奏動作表示の処理の流れについて説明する。
図9は、演奏動作表示のメイン処理の流れを示すフローチャートである。このメイン処理は、通常演奏動作表示、拡大演奏動画表示、及び演奏テクニック表示において共通する。
ステップS1において、CPU11は、データ初期化/読込処理を実行する。
すなわち、CPU11は、RAM13に一時的に記憶されているデータの初期化を行うとともに、ROM12に記憶されている各種情報を読み込み、その後、入力部15を介してユーザからの指示を受け付ける。各種情報としては、制御変数、演奏情報、構造データ、鍵盤データ、動作情報が挙げられる。
【0039】
ステップS2において、CPU11は、入力部15を介してユーザから終了指示を受け付けたか否かを判定する。CPU11は、この判定がYESの場合、メイン処理を終了し、この判定がNOの場合、ステップS3に処理を移す。
【0040】
ステップS3において、CPU11は、入力部15を介してユーザから楽曲の再生指示を受け付けたか否かを判定する。CPU11は、この判定がYESの場合、ステップS4に処理を移し、この判定がNOの場合、ステップS5に処理を移す。
【0041】
ステップS4において、CPU11は、ユーザから指示された楽曲の再生処理を実行する。再生処理の詳細は、図10で詳述する。CPU11は、ステップS4の処理が終了すると、ステップS2に処理を移す。
ステップS5において、CPU11は、入力部15を介してユーザから再生の停止指示を受け付けたか否かを判定する。CPU11は、この判定がYESの場合、ステップS6に処理を移し、この判定がNOの場合、ステップS2に処理を移す。
ステップS6において、CPU11は、演奏されている楽曲の再生を終了する。CPU11は、ステップS6の処理が終了すると、ステップS2に処理を移す。
【0042】
図10は、再生処理の流れを示すフローチャートである。
ステップS11において、CPU11は、初期化処理を実行する。
すなわち、CPU11は、再生処理が開始されたことに応じて、演奏情報の初期化を行う。演奏情報の初期化とは、制御変数、鍵盤データ、演奏情報、構造データ、動作情報をRAM13に記憶させることをいう。ここで、演奏情報、構造データ、及び動作情報は、図9のステップS3において再生指示された楽曲に対応しているものとする。また、CPU11は、初期化処理において、RAM13に再生終了フラグを記憶させる。この再生終了フラグの初期値は、OFFに設定されている。
【0043】
ステップS12において、CPU11は、図示しないタイマーからシステム時刻を取得する。
ステップS13において、CPU11は、RAM13に記憶されている再生終了フラグの状態を判定する。CPU11は、再生終了フラグがONである場合、再生処理を終了する。CPU11は、再生終了フラグがOFFである場合、ステップS14に処理を移す。
【0044】
ステップS14において、CPU11は、再生している楽曲における現在時刻(再生位置)を更新する。
ステップS15において、CPU11は、ステップS14において更新された現在時刻が、再生している楽曲の終了時刻を超過しているか否かを判定する。CPU11は、この判定がYESの場合、ステップS16に処理を移し、この判定がNOの場合、ステップS17に処理を移す。
【0045】
ステップS16において、CPU11は、RAM13に記憶されている再生終了フラグをONに更新する。CPU11は、ステップS16の処理が終了すると、ステップS13に処理を移す。
【0046】
ステップS17において、CPU11は、右手パートの動作情報の検索を行う処理である右手パート動作情報検索処理を実行する。右手パート動作情報検索処理の詳細は、図11で詳述する。
ステップS18において、CPU11は、左手パートの動作情報の検索を行う処理である左手パート動作情報検索処理を実行する。左手パート動作情報検索処理の詳細は、図11で詳述する。
【0047】
ステップS19において、CPU11は、右手パートの演奏情報の検索を行う処理である右手パート演奏情報検索処理を実行する。右手パート演奏情報検索処理の詳細は、図12で詳述する。
ステップS20において、CPU11は、左手パートの演奏情報の検索を行う処理である左手パート演奏情報検索処理を実行する。左手パート演奏情報検索処理の詳細は、図12で詳述する。
【0048】
ステップS21において、CPU11は、離鍵チェック処理を実行する。離鍵チェック処理の詳細は、図13で詳述する。CPU11は、ステップS21の処理が終了すると、ステップS13に処理を移す。
【0049】
図11は、動作情報検索処理の流れを示すフローチャートである。
なお、CPU11は、右手パート動作情報検索処理を実行する場合には、MotionR[]を検索し、左手パート動作情報検索処理を実行する場合には、MotionL[]を検索するものとする。なお、本フローチャートにおいて説明するMotion[]は、右手パート動作情報検索処理を実行する場合、MotionR[]に置き換えるものとし、左手パート動作情報検索処理を実行する場合、MotionL[]に置き換えるものとする。
【0050】
ステップS31において、CPU11は、RAM13に記憶されている制御変数(handCtrl)の描画対象動作情報インデックスを取得する。ここで、CPU11は、右手パート動作情報検索処理を実行する場合には、IndexRを取得し、左手パート動作情報検索処理を実行する場合には、IndexLを取得するものとする。
【0051】
ステップS32において、CPU11は、取得された描画対象動作情報インデックスに基づいて、全ての動作情報を取得したか否かを判定する。すなわち、CPU11は、描画対象動作情報インデックスが、Motion[]の添え字の最大値と等しいか否かを判定する。CPU11は、この判定がYESの場合、動画情報検索処理を終了し、この判定がNOの場合、ステップS33に処理を移す。
【0052】
ステップS33において、CPU11は、図10のステップS14において更新された現在時刻が、Motion[]のフレーム時間を経過したか否かを判定する。CPU11は、この判定がYESの場合、ステップS34に処理を移し、この判定がNOの場合、ステップS35に処理を移す。
【0053】
ステップS34において、CPU11は、RAM13に記憶されている制御変数(handCtrl)の描画対象動作情報インデックスを更新する。すなわち、CPU11は、ステップS31において取得した描画対象動作情報インデックスの値をインクリメントすることにより、描画対象動作情報インデックスを更新する。
【0054】
ステップS35において、CPU11は、次の動作情報を取得する。CPU11は、この処理が終了すると、ステップS32に処理を移す。
【0055】
図12は、演奏情報検索処理の流れを示すフローチャートである。
なお、本フローチャートにおいて説明するNote[]は、右手パート動作情報検索処理を実行する場合、NoteR[]に置き換えるものとし、左手パート動作情報検索処理を実行する場合、NoteL[]に置き換えるものとする。
【0056】
ステップS41において、CPU11は、RAM13に記憶されている制御変数(handCtrl)から、Note[]を描画対象の演奏情報として取得する。
【0057】
ステップS42において、CPU11は、ステップS41において取得された描画対象の演奏情報に基づいて、全ての演奏情報を取得したか否かを判定する。すなわち、CPU11は、Note[]の添え字が、ROM12に記憶されているNote[]の添え字の最大値と等しいか否かを判定する。CPU11は、この判定がYESの場合、演奏情報検索処理を終了し、この判定がNOの場合、ステップS43に処理を移す。
【0058】
ステップS43において、CPU11は、図10のステップS14において更新された現在時刻が、Note[]の発音開始時間に到達したか否かを判定する。CPU11は、この判定がYESの場合、ステップS45に処理を移し、この判定がNOの場合、ステップS44に処理を移す。
【0059】
ステップS44において、CPU11は、RAM13に記憶されている制御変数(handCtrl)に格納されている演奏情報を、次に発音する演奏情報に更新する。具体的には、CPU11は、ステップS41において取得されたNote[]の添え字をインクリメントし、添え字がインクリメントされたNote[]の情報をRAM13から取得する。そして、CPU11は、RAM13に記憶されている制御変数(handCtrl)を、取得されたNote[]の情報に書き換える。
【0060】
ステップS45において、CPU11は、図10のステップS14において更新された現在時刻に発音されているか否かを判定する。CPU11は、この判定がYESの場合、ステップS46に処理を移し、この判定がNOの場合、ステップS42に処理を移す。
【0061】
ステップS46において、CPU11は、RAM13に記憶されている鍵盤データ(Key[])において、該当する鍵の状態(Status)を“+”(押鍵状態)に更新するとともに、当該鍵盤データにおける消音時間(NoteOff)を更新する。ここで、CPU11は、制御変数に格納されている演奏情報のPitchを参照して、ステップS44において取得されたNote[]のPitchに対応するする鍵を特定する。
【0062】
ステップS47において、CPU11は、次の演奏情報を取得する。CPU11は、この処理が終了すると、ステップS42に処理を移す。
【0063】
図13は、離鍵チェック処理の流れを示すフローチャートである。
ステップS51において、CPU11は、RAM13に記憶されている鍵盤データ(Key[])から、最初の鍵の情報を取得する。ここで、最初の鍵の情報とは、例えば、最も低音の鍵の情報(Key[0])である。
【0064】
ステップS52において、CPU11は、全ての鍵の情報のチェックが完了したか否かを判定する。すなわち、CPU11は、Key[]の添え字が、ROM12に記憶されているKey[]の添え字の最大値と等しいか否かを判定する。CPU11は、この判定がYESの場合、離鍵チェック処理を終了し、この判定がNOの場合、ステップS53に処理を移す。
【0065】
ステップS53において、CPU11は、ステップS51又はステップS55において取得された鍵の情報に含まれる消音時間に時間が記憶されている場合、図10のステップS14において更新された現在時刻が、当該消音時間を経過しているか否かを判定する。CPU11は、この判定がYESの場合、ステップS54に処理を移し、この判定がNOの場合、ステップS55に処理を移す。
【0066】
ステップS54において、CPU11は、該当する鍵の状態(Status)を“−”(離鍵状態)に更新するとともに、当該鍵盤データにおける消音時間(NoteOff)を消去する。CPU11は、ステップS54の処理が終了すると、ステップS55に処理を移す。
【0067】
ステップS55において、CPU11は、次の鍵の情報を取得する。CPU11は、ステップS55の処理が終了すると、ステップS52に処理を移す。
【0068】
図14は、レンダリング処理の流れを示すフローチャートである。なお、レンダリング処理は、図9において説明したメイン処理のステップS1のデータの初期化/読込処理が完了した後に継続的に行われる。
ステップS61において、CPU11は、視点設定処理を実行する。
すなわち、CPU11は、RAM13に記憶されている制御変数(handCtrl)に格納されている高さ方向の視野角(f0vy)、視界の中心座標(Center[3])、及び視点(Eye[3])に基づいて、表示部16に表示する画面における視点を設定する。
ステップS62において、CPU11は、鍵盤描画処理を実行する。鍵盤描画処理の詳細は、図15で詳述する。
【0069】
ステップS63において、CPU11は、右腕描画処理を実行する。右腕描画処理の詳細は、図16で詳述する。
ステップS64において、CPU11は、左腕描画処理を実行する。左腕描画処理の詳細は、図16で詳述する。
【0070】
図15は、鍵盤描画処理の流れを示すフローチャートである。
ステップS71において、CPU11は、鍵盤を描画するために、鍵の構造データを行列スタックにプッシュする。
ステップS72において、CPU11は、鍵盤を回転させる際の中心点を原点とする座標系に移動する。
ステップS73において、RAM13に記憶されている鍵盤データ(Key[])から、最初の鍵の構造データを取得する。ここで、最初の鍵の構造データとは、例えば、最も低音の鍵の情報(Key[0])に対応する構造データ(Vertices[][3])である。
【0071】
ステップS74において、CPU11は、全ての鍵の描画が完了したか否かを判定する。CPU11は、この判定がYESの場合、ステップS82に処理を移し、この判定がNOの場合、ステップS75に処理を移す。
【0072】
ステップS75において、CPU11は、取得した鍵の構造データに対応する鍵の状態が、“+”(押鍵状態)又は“−”(離鍵状態)であるか否かを判定する。CPU11は、この判定がYESの場合、ステップS76に処理を移し、この判定がNOの場合、ステップS80に処理を移す。
【0073】
ステップS76において、CPU11は、ステップS73又はステップS81において取得された鍵の構造データを行列スタックにプッシュする。ここで、行列スタックとは、構造データの3Dのレンダリングを行うために用いられるデータ構造である。
【0074】
ステップS77において、CPU11は、ステップS76において行列スタックにプッシュされた構造データの座標系を所定角度だけ回転させる。この状態で描画されることにより、鍵の状態が、“+”(押鍵状態)又は“−”(離鍵状態)の鍵は、押鍵されているように表示される。
【0075】
ステップS78において、CPU11は、行列スタックにプッシュされている鍵の構造データをポリゴン描画する。
ステップS79において、CPU11は、ステップS76においてプッシュされた鍵の構造データをポップ(クリア)する。
ステップS80において、CPU11は、行列スタックにプッシュされている鍵の構造データをポリゴン描画する。
【0076】
ステップS81において、CPU11は、次の鍵の構造データを取得する。なお、CPU11は、直前に取得した鍵の構造データが、最後の鍵(最も高音の鍵)である場合、当該取得されている鍵の構造データを取得した状態を維持する。CPU11は、ステップS81の処理が終了すると、ステップS74に処理を移す。
ステップS82において、CPU11は、ステップS71においてプッシュされた鍵の構造データをポップ(クリア)する。
【0077】
図16は、腕描画処理の流れを示すフローチャートである。なお、本フローチャートにおいて説明するMotion[]は、右腕描画処理を実行する場合、MotionR[]に置き換えるものとし、左腕描画処理を実行する場合、MotionL[]に置き換えるものとする。
【0078】
ステップS91において、CPU11は、RAM13に記憶されている動作情報(Motion[])から、描画対象動作情報を取得する。すなわち、CPU11は、Motion[]に格納されているRootPos[3]から、表示部16に構造物を描画する際に起点となる構造物の3次元座標を取得する。
【0079】
ステップS92において、CPU11は、ステップS91において取得した起点となる構造物(右腕又は左腕)の構造データを取得して、行列スタックにプッシュする。
ステップS93において、CPU11は、肩位置から描画を行うために、肩位置を原点とする座標系に移動する。
【0080】
ステップS94において、CPU11は、RAM13に記憶されている構造データ(Struct[])のChild[]を参照して、下位の構造データを取得する。ここでは、CPU11は、右手又は左手の構造データを取得する。
ステップS95において、CPU11は、手指動画処理を実行する。手指動画処理の詳細は、図17で詳述する。
ステップS96において、CPU11は、行列スタックにプッシュされている構造物(右腕又は左腕)の構造データをポップする。
【0081】
図17は、手指描画処理の流れを示すフローチャートである。なお、本フローチャートにおいて説明するMotion[]は、右手に対応する手指描画処理を実行する場合、MotionR[]に置き換えるものとし、左手に対応する手指描画処理を実行する場合、MotionL[]に置き換えるものとする。
【0082】
ステップS101において、CPU11は、RAM13に記憶されている構造データ(Struct[])を参照して、Lambda[]の値(z軸回転角)を取得する。そして、CPU11は、取得したz軸回転角に基づいて、座標系においてz軸の描画角度を回転させる。
【0083】
ステップS102において、CPU11は、RAM13に記憶されている構造データ(Struct[])を参照して、Phi[]の値(y軸回転角)を取得する。そして、CPU11は、取得したy軸回転角に基づいて、座標系においてy軸の描画角度を回転させる。
【0084】
ステップS103において、CPU11は、図16のステップS84において取得された手の構造データを行列スタックにプッシュする。ここで、CPU11は、当該手の構造データに対して、既に図16のステップS92において腕の構造データの値を乗算し、その後、乗算した結果を行列スタックにプッシュする。この状態において手の構造データを描画すると、手が腕に連結された状態で描画される。
【0085】
ステップS104において、CPU11は、RAM13に記憶されている構造データ(Struct[])を参照して、Theta[]の値(x軸回転角)を取得する。そして、CPU11は、取得したx軸回転角に基づいて、座標系においてx軸の描画角度を回転させる。
【0086】
ステップS105において、CPU11は、行列スタックに格納されている手の構造データのポリゴン描画を行う。上述したように、手が腕に連結された状態で描画される。
ステップS106において、CPU11は、行列スタックから、手構造データをポップする。
【0087】
ステップS107において、CPU11は、RAM13に記憶されている構造データ(Struct[])から、Lengthの値(構造の長さ)を取得する。そして、CPU11は、座標系をx軸方向に構造の長さ分移動する。
【0088】
ステップS108において、CPU11は、RAM13に記憶されている構造データ(Struct[])のChildrenの値を参照して、子構造があるか判定する。ここで、子構造とは指である。CPU11は、この判定がYESの場合、ステップS109に処理を移し、この判定がNOの場合、手指描画処理を終了する。
【0089】
ステップS109において、CPU11は、RAM13に記憶されている構造データ(Struct[])のChild[]の値を参照して、最初の指構造データを取得する。例えば、指構造データを親指から小指に向かって順に取得する場合、CPU11は、最初の指構造データとして、親指の親構造データを取得する。
【0090】
ステップS110において、CPU11は、全ての指の描画が完了したか否かを判定する。CPU11は、この判定がYESの場合、手指描画処理を終了し、この判定がNOの場合、ステップS111に処理を移す。
【0091】
ステップS111において、CPU11は、ステップS109又はステップS114において取得された指構造データを行列スタックにプッシュする。ここで、CPU11は、当該指の構造データに対して、手の構造データの値を乗算し、その後、乗算した結果を行列スタックにプッシュする。この状態において指の構造データを描画すると、指が手に連結された状態で描画される。
【0092】
ステップS112において、CPU11は、ステップS111において行列スタックにプッシュされた構造データのポリゴン描画を行う。
ステップS113において、CPU11は、ステップS112においてポリゴン描画が行われた構造データを行列スタックからポップする。
ステップS114において、CPU11は、次の指構造データを取得する。例えば、直前に親指の構造データが取得されている場合、CPU11は、人差し指に対応する構造データを取得する。また、例えば、直前に小指の構造データが取得されている場合、CPU11は、小指に対応する構造データを再取得する。
【0093】
続いて、拡大演奏動作表示を行う際に参照されるデータの構造及び処理の流れについて説明する。なお、拡大演奏動画表示において、視点移動が行われるため、拡大演奏動作表示を行う場合を、「視点移動時」ともいう。
【0094】
図18は、拡大演奏動作表示において参照される動作情報の構造を示す図である。
動作情報は、上述したように、右手の動作情報を示すMotionR[]と、左手の動作情報を示すMotionL[]と、から構成される。
MotionR[]と、MotionL[]とは構成が同一であるため、図18では、これらMotionR[]と、MotionL[]とをまとめて、Motion[]として説明する。
【0095】
図18に示すように、拡大演奏動画表示を行う際に参照されるMotion[]におけるそれぞれの要素には、Timeと、RootPos[3]と、MaxHandPos[3]と、MinHandPos[3]と、WristPos[3]と、が定義されている。
Timeは、演奏時における各フレームが開始される時間を示す変数である。
RootPos[3]は、表示部16に表示される構造物における起点の3次元座標(起点関節の3次元座標)である。
MaxHandPos[3]は、視点移動時において、最も右側となる手関節の3次元座標を示す変数である。
MinHandPos[3]は、視点移動時において、最も左側となる手関節の3次元座標を示す変数である。
WristPos[3]は、視点移動時における手首関節の3次元座標を示す変数である。
【0096】
図19は、視点移動時のレンダリング処理の流れを示すフローチャートである。なお、レンダリング処理は、図9において説明したメイン処理のステップS1のデータの初期化/読込処理が完了した後に継続的に行われる。
【0097】
ステップS121において、CPU11は、視点計算処理を実行する。視点計算処理の詳細は、図20で詳述する。
ステップS122において、CPU11は、視点設定処理を実行する。
すなわち、CPU11は、RAM13に記憶されている制御変数に格納されている高さ方向の視野角(f0vy)、視界の中心座標(Center[3])、及び視点(Eye[3])に基づいて、表示部16に表示する画面における視点を設定する。
【0098】
ステップS123において、CPU11は、図15で詳述した鍵盤描画処理を実行する。
ステップS124において、CPU11は、図16で詳述した右腕描画処理を実行する。
ステップS125において、CPU11は、図16で詳述した左腕描画処理を実行する。
【0099】
図20は、視点計算処理の流れを示すフローチャートである。
ステップS131において、CPU11は、左右の描画対象の動画情報からx方向の最大値及び最小値を取得し、取得した最大値及び最小値の中間値を計算する。
ステップS132において、CPU11は、左右の構造データの最大幅、最小幅から、視界の中心と視点との距離を計算する。
【0100】
ステップS133において、CPU11は、左右の描画対象の動画情報の既定数前後を検索し、x方向の最大値及び最小値を取得し、中間値を計算する。
ステップS134において、CPU11は、視界の中心となるx座標を中間値に設定する。
【0101】
ステップS135において、CPU11は、視界の幅を計算する。
ステップS136において、ステップS131において取得したx方向の最大値及び最小値がステップS135において計算した視界の幅(視界内)に収まっているか否かを判定する。CPU11は、この判定がYESの場合、ステップS138に処理を移し、この判定がNOの場合、ステップS137に処理を移す。
【0102】
ステップS137において、CPU11は、視界の中心と視点との距離を再計算する。
ステップS138において、CPU11は、視界の幅を再計算する。
【0103】
続いて、演奏時に演奏テクニック表示を挿入する場合に参照されるデータの構造及び処理の流れについて説明する。なお、拡大演奏動画表示において、視点移動が行われるため、拡大演奏動作表示を行う場合を、「視点移動時」ともいう。
図21は、演奏テクニック表示を含む演奏動作表示を行う場合に参照される制御変数の構造を示す図である。なお、図21に示す制御変数を用いて演奏テクニック表示を含む演奏動作表示を行う場合、演奏途中において演奏テクニックを要するパートに差し掛かったときに、自動的に手指の詳細な動きが確認できるように手指が拡大され、斜視表示される。
【0104】
演奏テクニック表示を含む演奏動作表示を行う場合に参照される制御変数には、変数として、widthと、heightと、f0vyと、Center[3]と、Eye[3]と、EyeVector[3]と、Vertical[3]と、Horizonal[3]と、AutoAngleStatusと、Startと、Returnと、EyeVectorN[3]と、EyeAngleと、NoteR[]と、StructR[]と、MotionR[]と、IndexRと、NoteL[]と、StructL[]と、MotionL[]と、IndexLと、が定義されている。
【0105】
width、height、f0vyと、Center[3]と、Eye[3]と、EyeVector[3]とは、図4に示した制御変数と同一であるので、説明を省略する。
【0106】
Vertical[3]は、視界の縦(画面高さ)方向のベクトルを示す変数である。
Horizonal[3]は、視界の横(画面幅)方向のベクトルを示す変数である。
AutoAngleStatusは、視点移動状態を示す変数である。例えば、AutoAngleStatusが“0”の場合に視点移動が行われていない状態(停止)を示し、“+”の場合に移動中を示し、“−”の場合に復帰中を示す。
Startは、演奏テクニックの表示を開始する時刻である移動開始時刻を示す変数である。
Returnは、演奏テクニックが終了して通常の表示状態へ復帰する時刻である復帰開始時刻を示す変数である。
EyeVectorN[3]は、目線回転面の法線ベクトルを示す変数である。
EyeAngleは、目線回転角を示す変数である。
【0107】
NoteR[]と、StructR[]と、MotionR[]と、IndexRと、NoteL[]と、StructL[]と、MotionL[]と、IndexLとは、図4に示した制御変数と同一であるので、説明を省略する。
【0108】
図22は、演奏テクニック表示を含む演奏動作表示を行う場合に参照される演奏情報の構造を示す図である。
演奏情報は、上述したように、右手の演奏情報を示すNoteR[]と、左手の演奏情報を示すNoteL[]と、から構成される。
NoteR[]と、NoteL[]とは構成が同一であるため、図22では、これらNoteR[]と、NoteL[]とをまとめて、Note[]として説明する。
【0109】
図22に示すように、Note[]におけるそれぞれの要素には、Timeと、Gateと、Pitchと、Fingerと、FigTech[]が定義されている。
【0110】
Timeは、発音を開始する時間を示す変数である。
Gateは、発音を継続する時間を示す変数である。
Pitchは、発音される音の音高(周波数)を示す変数である。
Fingerは、指番号を示す変数である。指番号とは、演奏時において指を識別するための番号である。
FigTech[]は、演奏テクニックフラグを示す配列変数である。FigTech[]は、演奏テクニックにおいて定義されている動作ステップの数だけ要素数が設けられる。
【0111】
図23は、演奏テクニック表示を含む演奏動作表示を行う場合に実行される演奏情報検索処理の流れを示すフローチャートである。
なお、本フローチャートにおいて説明するNote[]は、右手パート動作情報検索処理を実行する場合、NoteR[]に置き換えるものとし、左手パート動作情報検索処理を実行する場合、NoteL[]に置き換えるものとする。
【0112】
ステップS141乃至ステップS143の処理は、図12において説明したステップS41乃至ステップS43の処理と同一であるので、説明を省略する。
ステップS144において、CPU11は、ステップS44における処理と同様に、RAM13に記憶されている制御変数(handCtrl)に格納されている演奏情報を、次に発音する演奏情報に更新する。
【0113】
ステップS145において、CPU11は、演奏テクニック検索処理を実行する。演奏テクニック検索処理は、図24で詳述する。CPU11は、この処理が終了すると、動作情報検索処理を終了する。
ステップS146乃至ステップS148の処理は、図12において説明したステップS45乃至ステップS47の処理と同一であるので、説明を省略する。
【0114】
図24は、演奏テクニック表示を含む演奏動作表示を行う場合に実行される演奏テクニック検索処理の流れを示すフローチャートである。なお、本フローチャートを実行するにあたり、RAM13には、図21に示される制御変数が記憶されているものとする。
【0115】
ステップS151において、CPU11は、RAM13に記憶されている制御変数(handCtrl)のAutoAngleStatusを参照し、視点移動するか否かを判定する。CPU11は、この判定がYESの場合、演奏テクニック検索処理を終了し、この判定がNOの場合、ステップS152に処理を移す。
【0116】
ステップS152において、CPU11は、演奏テクニック表示を行うか否かを判定するために検索対象とする時間(検索時間)を、現在時刻から所定時間後までに設定する。
ステップS153において、CPU11は、RAM13に記憶されている制御変数(handCtrl)から、Note[]を描画対象の演奏情報として取得する。
【0117】
ステップS154において、CPU11は、ステップS153又はステップS160において取得された描画対象の演奏情報に基づいて、全ての演奏情報を取得したか否かを判定する。すなわち、CPU11は、Note[]の添え字が、ROM12に記憶されているNote[]の添え字の最大値と等しいか否かを判定する。CPU11は、この判定がYESの場合、演奏テクニック検索処理を終了し、この判定がNOの場合、ステップS155に処理を移す。
【0118】
ステップS155において、CPU11は、発音時間が、ステップS152において設定された検索時間の範囲内であるか否かを判定する。CPU11は、この判定がYESの場合、ステップS156に処理を移し、この判定がNOの場合、演奏テクニック検索処理を終了する。
【0119】
ステップS156において、CPU11は、図22に示される演奏情報のFigTech[]を参照し、演奏テクニックフラグがONであるか否かを判定する。CPU11は、この判定がYESの場合、ステップS157に処理を移し、この判定がNOの場合、ステップS160に処理を移す。
【0120】
ステップS157において、CPU11は、現在の視点状態及び演奏テクニックに応じた視点状態から、回転角・回転軸を計算する。
ステップS158において、CPU11は、演奏テクニック表示を開始する時刻(移動開始時刻)を発音時刻の所定時間前に設定する。すなわち、CPU11は、RAM13に記憶されている制御変数のStartを設定する。
ステップS159において、CPU11は、演奏テクニック表示から通常演奏動作表示又は拡大演奏動作表示に戻る時刻(復帰開始時刻)を所定時間後に設定する。CPU11は、この処理が終了すると、演奏テクニック検索処理を終了する。すなわち、CPU11は、RAM13に記憶されている制御変数のReturnを設定する。
【0121】
ステップS160において、CPU11は、次の演奏データを取得し、ステップS154に処理を移す。
【0122】
図25は、演奏テクニック表示を含む演奏動作表示を行う場合に実行されるレンダリング処理の流れを示すフローチャートである。なお、このレンダリング処理は、図9において説明したメイン処理のステップS1のデータの初期化/読込処理が完了した後に継続的に行われる。また、このレンダリング処理を開始時に、CPU11は、図20に示す視点計算処理を実行することにより、演奏テクニック表示時において拡大して表示されるようにしてもよい。
【0123】
ステップS161において、CPU11は、視点変更計算処理を実行する。視点変更計算処理の詳細は、図26で詳述する。
ステップS162において、CPU11は、視点設定処理を実行する。
すなわち、CPU11は、RAM13に記憶されている制御変数に格納されている高さ方向の視野角(f0vy)、視界の中心座標(Center[3])、及び視点(Eye[3])に基づいて、表示部16に表示する画面における視点を設定する。
【0124】
ステップS163において、CPU11は、図15で詳述した鍵盤描画処理を実行する。
ステップS164において、CPU11は、図16で詳述した右腕描画処理を実行する。
ステップS165において、CPU11は、図16で詳述した左腕描画処理を実行する。
【0125】
図26は、演奏テクニック表示を含む演奏動作表示を行う場合に実行される視点変更計算処理の流れを示すフローチャートである。なお、このレンダリング処理は、図9において説明したメイン処理のステップS1のデータの初期化/読込処理が完了した後に継続的に行われる。
【0126】
ステップS171において、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusを参照して、視点が停止しているか否かを判定する。具体的には、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusの値が“0”である場合に視点停止であると判定する。CPU11は、この判定がYESの場合、ステップS172に処理を移し、この判定がNOの場合、ステップS178に処理を移す。
【0127】
ステップS172において、CPU11は、RAM13に記憶された制御変数のStart(移動開始時刻)を参照して、図10のステップS14において更新された現在時刻が、移動開始時刻を超過したか否かを判定する。CPU11は、この判定がYESの場合、ステップS173に処理を移し、この判定がNOの場合、ステップS175に処理を移す。
【0128】
ステップS173において、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusを“+”にすることにより、視点移動状態を移動中に設定する。また、CPU11は、移動開始時刻と復帰開始時刻とに基づいて、移動フレーム数を算出して、RAM13に記憶させる。さらに、CPU11は、状態変数の初期値を0として、RAM13に記憶させる。
ステップS174において、CPU11は、RAM13に記憶された制御変数のStart(移動開始時刻)を消去する。
【0129】
ステップS175において、CPU11は、RAM13に記憶された制御変数のReturn(復帰開始時刻)を参照して、図10のステップS14において更新された現在時刻が、復帰開始時刻を超過したか否かを判定する。CPU11は、この判定がYESの場合、ステップS176に処理を移し、この判定がNOの場合、視点変更処理を終了する。
【0130】
ステップS176において、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusを“−”にすることにより、視点移動状態を復帰中に設定する。また、CPU11は、状態変数の初期値をステップS173において算出した移動フレーム数として、RAM13に記憶させる。
ステップS177において、CPU11は、RAM13に記憶された制御変数のReturn(復帰開始時刻)を消去する。
【0131】
ステップS178において、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusを参照して、視点移動中であるか否かを判定する。具体的には、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusの値が“+”である場合に視点移動中であると判定する。CPU11は、この判定がYESの場合、ステップS179に処理を移し、この判定がNOの場合、ステップS183に処理を移す。
【0132】
ステップS179において、CPU11は、RAM13に記憶された状態変数が、RAM13に記憶された移動フレーム数を超過しているか否かを判定する。CPU11は、この判定がYESの場合、ステップS180に処理を移し、この判定がNOの場合、ステップS182に処理を移す。
ステップS180において、CPU11は、視線ベクトルを回転面上で所定量だけ回転移動させる。具体的には、CPU11は、RAM13に記憶された制御変数のEyeVector[3]を、回転移動するように演算する。
ステップS181において、CPU11は、RAM13に記憶された状態変数の値をインクリメントする。CPU11は、ステップS181の処理が終了すると、視点変更処理を終了する。
【0133】
ステップS182において、CPU11は、視点移動状態を視点停止に設定する。具体的には、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusを“0”にする。また、CPU11は、状態変数をRAM13から消去する。CPU11は、ステップS182の処理が終了すると、視点変更処理を終了する。
【0134】
ステップS183において、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusを参照して、視点復帰中であるか否かを判定する。具体的には、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusの値が“−”である場合に視点移動中であると判定する。CPU11は、この判定がYESの場合、ステップS184に処理を移し、この判定がNOの場合、視点変更処理を終了する。
【0135】
ステップS184において、CPU11は、視線ベクトルを回転面上で所定量だけ逆回転移動させる。具体的には、CPU11は、RAM13に記憶された制御変数のEyeVector[3]を、逆回転移動するように演算する。
ステップS185において、CPU11は、RAM13に記憶された状態変数の値をデクリメントする。CPU11は、ステップS185の処理が終了すると、視点変更処理を終了する。
【0136】
以上のような本実施形態の演奏動作表示装置1によれば、CPU11は、RAM13に記憶されている演奏情報の演奏テクニックフラグに基づいて演奏テクニックの表示を行うか否かを判定し、当該演奏テクニックの表示を行うと判定した場合に、当該演奏テクニックに対応する画像の表示態様を、当該演奏テクニックを表示しない場合に対応する画像の表示態様に比べて変化させる。
これにより、演奏動作表示装置1は、演奏テクニックを表示する場合において、表示態様を変化させることにより、演奏者にとって視認しやすい演奏動作の表示をすることが可能になる。
【0137】
特に、演奏動作表示装置1では、CPU11は、演奏テクニックの表示を行う場合に表示部16に表示する構造データを拡大して描画する。
これにより、演奏動作表示装置1は、演奏テクニックに対応する場面で手や指を拡大表示して、演奏テクニックの動作表示を演奏者にとってより認識しやすくすることができる。また、一連の演奏動作を再生する際に、視野を動作領域にあわせ可能な限り大きな表示にするため、より動作を視認しやすくすることが可能になる。
【0138】
特に、演奏動作表示装置1では、CPU11は、演奏テクニックの表示を行う場合に表示部16に表示する構造データを斜視状態で描画する。
これにより、演奏動作表示装置1は、演奏テクニックに対応する場面で手や指を斜視表示して、真上や真横から演奏テクニックの動作表示をする場合に比べて演奏者にとって認識しやすくすることができる。例えば、演奏テクニックの動作表示に対してアングル等の表示状態を変更するため、特に初心者にとって困難な動作も、視認しやすく、理解しやすい表示をすることが可能になる。
【0139】
なお、本発明は、上述の実施形態に限定されるものではなく、本発明の目的を達成できる範囲での変形、改良等は本発明に含まれるものである。
【0140】
また、上述の実施形態では、本発明が適用される演奏動作表示装置は、演奏動作表示装置1を例として説明したが、特にこれに限定されない。
例えば、本発明は、鍵盤と演奏動作表示機能とを有する電子楽器一般に適用することができる。具体的には、例えば、本発明は、電子ピアノ、電子オルガン等に適用可能である。
【0141】
上述した一連の処理は、ハードウェアにより実行させることもできるし、ソフトウェアにより実行させることもできる。
換言すると、図1の構成は例示に過ぎず、特に限定されない。すなわち、上述した一連の処理を全体として実行できる機能が演奏動作表示装置1に備えられていれば足り、この機能を実現するためにどのような構成を構築するのかは特に図1の例に限定されない。
【0142】
一連の処理をソフトウェアにより実行させる場合には、そのソフトウェアを構成するプログラムが、コンピュータ等にネットワークや記録媒体からインストールされる。
このコンピュータは、専用のハードウェアに組み込まれているコンピュータであってもよい。また、コンピュータは、各種のプログラムをインストールすることで、各種の機能を実行することが可能なコンピュータであってもよい。
【0143】
なお、本明細書において、記録媒体に記録されるプログラムを記述するステップは、その順序に沿って時系列的に行われる処理はもちろん、必ずしも時系列的に処理されなくとも、並列的或いは個別に実行される処理をも含むものである。
また、本明細書において、システムの用語は、複数の装置や複数の手段等より構成される全体的な装置を意味するものとする。
【0144】
以上、本発明の実施形態について説明したが、この実施形態は、例示に過ぎず、本発明の技術的範囲を限定するものではない。本発明はその他の様々な実施形態を取ることが可能であり、さらに、本発明の要旨を逸脱しない範囲で、省略や置換等種々の変更を行うことができる。これら実施形態やその変形は、本明細書等に記載された発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【0145】
以下に、本願の出願当初の特許請求の範囲に記載された発明を付記する。
[付記1]
発音開始時間、発音継続時間、音高、使用する指、及び特定動作の表示を行うためのフラグを格納する演奏情報と、
複数の構造データと、当該構造データ同士の関連性を記憶する構造データと、
前記発音開始時間に対応して複数の前記構造データを表示させる場合の起点となる前記構造データの情報を示す動作情報と、を記憶する記憶手段と、
前記記憶手段に記憶された前記演奏情報、前記動作情報及び前記構造データに基づいて、表示手段に演奏動作画像を描画する描画手段と、を備え、
前記描画手段は、前記記憶手段に記憶されている前記演奏情報の前記フラグに基づいて前記特定動作の表示を行うか否かを判定し、当該特定動作の表示を行うと判定した場合に、当該特定動作に対応する画像の表示態様を、当該特定動作を表示しない場合に対応する画像の表示態様に比べて変化させる、
ことを特徴とする演奏動作表示装置。
[付記2]
前記描画手段は、前記特定動作を行う場合に前記表示手段に表示する構造データを拡大して描画する、
ことを特徴とする付記1記載の演奏動作表示装置。
[付記3]
前記描画手段は、前記特定動作を行う場合に前記表示手段に表示する構造データを斜視状態で描画する、
ことを特徴とする付記1又は2記載の演奏動作表示装置。
[付記4]
演奏動作表示装置が、演奏動作表示を行う方法であって、
前記演奏動作表示装置は、発音開始時間、発音継続時間、音高、使用する指、及び特定動作の表示を行うためのフラグを格納する演奏情報、複数の構造データと、当該構造データ同士の関連性を記憶する構造データ、及び前記発音開始時間に対応して複数の前記構造データを表示させる場合の起点となる前記構造データの情報を示す動作情報を記憶する記憶手段と、を備え、
前記演奏動作表示装置が、前記記憶手段に記憶された前記演奏情報、前記動作情報及び前記構造データに基づいて、表示手段に演奏動作画像を描画する描画ステップを含み、
前記描画ステップにおいて、演奏情報記憶手段に記憶されている前記フラグに基づいて前記特定動作の表示を行うか否かを判定し、当該特定動作の表示を行うと判定した場合に、当該特定動作に対応する画像の表示態様を、当該特定動作を表示しない場合に対応する画像の表示態様に比べて変化させる、
ことを特徴とする方法。
[付記5]
発音開始時間、発音継続時間、音高、使用する指、及び特定動作の表示を行うためのフラグを格納する演奏情報、複数の構造データの関連性を記憶する構造データ、及び前記発音開始時間に対応して複数の前記構造データを表示させる場合の起点となる前記構造データの情報を示す動作情報を記憶する記憶手段と、を備えるコンピュータを、
前記記憶手段に記憶された前記演奏情報、前記動作情報及び前記構造データに基づいて、表示手段に演奏動作画像を描画させる描画手段であって、演奏情報記憶手段に記憶されている前記フラグに基づいて前記特定動作の表示を行うか否かを判定し、当該特定動作の表示を行うと判定した場合に、当該特定動作に対応する画像の表示態様を、当該特定動作を表示しない場合に対応する画像の表示態様に比べて変化させる描画手段、
として機能させることを特徴とするプログラム。
【符号の説明】
【0146】
1・・・演奏動作表示装置、2・・・電子楽器、11・・・CPU、12・・・ROM、13・・・RAM、14・・・バス、15・・・入力部、16・・・表示部、17、21・・・MIDIインターフェース、22・・・鍵盤、23・・・音源・サウンドシステム
【技術分野】
【0001】
本発明は、電子楽器の演奏動作を表示する演奏動作表示装置、方法及びプログラムに関する。
【背景技術】
【0002】
従来、演奏の進行に応じて押鍵(操作)すべき鍵に対して、押鍵に使用する指をユーザに通知するナビゲーション機能を備えた演奏動作表示装置が提案されている。例えば、特許文献1には、演奏時に演奏動作として鍵盤に対する手指の位置を表示部に表示させることにより、押鍵に使用する指をユーザに通知するナビゲーション機能を備えた演奏動作表示装置が提案されている。また、特許文献1で提案される演奏動作表示装置では、演奏の各パートにおいて、演奏動作の表示方式の変更操作を受け付けたことに応じて、手指のサイズの拡大及び縮小、手指の透過表示、手指をワイヤーフレームとした表示、視点(表示角度)の変更等を実行することが提案されている。
【先行技術文献】
【特許文献】
【0003】
【特許文献1】特許第3528051号公報
【発明の概要】
【発明が解決しようとする課題】
【0004】
ところで、特許文献1で提案された演奏動作表示装置では、例えば、両手が離れて配置されるパートにおいて、鍵盤全体が表示される場合がある。鍵盤は横に長いことから、鍵盤全体が表示される場合には、押鍵に使用する指が表示部に小さく表示されてしまう。
【0005】
また、特許文献1で提案された演奏動作表示装置では、上述したように拡大及び縮小等の表示方式の変更操作を受け付けることも可能であるが、演奏時に演奏者が変更操作を行うことが困難である。また、特許文献1で提案された演奏動作表示装置では、自動的に視点を変更することができない。このため、演奏者は、指の細かい動作等の特定の演奏技術を確認する場合、演奏者自らが視点を変更する操作を行う必要がある。よって、特許文献1で提案された演奏動作表示装置では、ユーザが特定の演奏技術について演奏しながら確認することが、困難になる可能性がある。
【0006】
本発明は、このような状況に鑑みてなされたものであり、演奏者にとって視認しやすい演奏動作の表示をすることができる演奏動作表示装置、方法及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【0007】
上記目的を達成するため、本発明の一態様の演奏動作表示装置は、発音開始時間、発音継続時間、音高、使用する指、及び特定動作の表示を行うためのフラグを格納する演奏情報と、複数の構造データと、当該構造データ同士の関連性を記憶する構造データと、前記発音開始時間に対応して複数の前記構造データを表示させる場合の起点となる前記構造データの情報を示す動作情報と、を記憶する記憶手段と、前記記憶手段に記憶された前記演奏情報、前記動作情報及び前記構造データに基づいて、表示手段に演奏動作画像を描画する描画手段と、を備え、前記描画手段は、前記記憶手段に記憶されている前記演奏情報の前記フラグに基づいて前記特定動作の表示を行うか否かを判定し、当該特定動作の表示を行うと判定した場合に、当該特定動作に対応する画像の表示態様を、当該特定動作を表示しない場合に対応する画像の表示態様に比べて変化させることを特徴とする。
【発明の効果】
【0008】
本発明によれば、演奏者にとって視認しやすい演奏動作の表示をすることができる。
【図面の簡単な説明】
【0009】
【図1】演奏動作表示装置及び電子楽器のハードウェアの構成を示すブロック図である。
【図2】演奏動作表示の例を説明する図である。
【図3】表示部に演奏動作表示を行う場合における、それぞれの用語を説明する図である。
【図4】制御変数の構造を示す図である。
【図5】演奏情報の構造を示す図である。
【図6】構造データの構造を示す図である。
【図7】鍵盤データの構造を示す図である。
【図8】動作情報の構造を示す図である。
【図9】演奏動作表示のメイン処理の流れを示すフローチャートである。
【図10】再生処理の流れを示すフローチャートである。
【図11】動作情報検索処理の流れを示すフローチャートである。
【図12】演奏情報検索処理の流れを示すフローチャートである。
【図13】離鍵チェック処理の流れを示すフローチャートである。
【図14】レンダリング処理の流れを示すフローチャートである。
【図15】鍵盤描画処理の流れを示すフローチャートである。
【図16】腕描画処理の流れを示すフローチャートである。
【図17】手指描画処理の流れを示すフローチャートである。
【図18】拡大演奏動作表示において参照される動作情報の構造を示す図である。
【図19】視点移動時のレンダリング処理の流れを示すフローチャートである。
【図20】視点計算処理の流れを示すフローチャートである。
【図21】演奏テクニック表示を含む演奏動作表示を行う場合に参照される制御変数の構造を示す図である。
【図22】演奏テクニック表示を含む演奏動作表示を行う場合に参照される演奏情報の構造を示す図である。
【図23】演奏テクニック表示を含む演奏動作表示を行う場合に実行される演奏情報検索処理の流れを示すフローチャートである。
【図24】演奏テクニック表示を含む演奏動作表示を行う場合に実行される演奏テクニック検索処理の流れを示すフローチャートである。
【図25】演奏テクニック表示を含む演奏動作表示を行う場合に実行されるレンダリング処理の流れを示すフローチャートである。
【図26】演奏テクニック表示を含む演奏動作表示を行う場合に実行される視点変更計算処理の流れを示すフローチャートである。
【発明を実施するための形態】
【0010】
以下、本発明の実施形態について、図面を用いて説明する。
【0011】
図1は、本発明の一実施形態に係る演奏動作表示装置及び電子楽器のハードウェアの構成を示すブロック図である。
演奏動作表示装置1は、例えば表示部を備えて構成される。
【0012】
演奏動作表示装置1は、CPU(Central Processing Unit)11と、ROM(Read Only Memory)12と、RAM(Random Access Memory)13と、バス14と、入力部15と、表示部16と、MIDI(Musical Instrument Digital Interface)インターフェース17と、を備えている。
【0013】
CPU11は、演奏動作表示装置1の全体を制御し、ROM12に記憶されているプログラム、又は、ROM12からRAM13に読み出されたプログラムに従って各種の処理を実行する。
【0014】
ROM12は、CPU11の実行する各種処理の処理プログラムを格納する。また、RAM13は、ROM12から読み出されたプログラム等を格納する。
【0015】
CPU11、ROM12及びRAM13は、バス14を介して相互に接続されている。また、バス14には、入力部15、表示部16及びMIDIインターフェース17が接続されている。
【0016】
入力部15は、例えばボタン等により構成されており、ユーザからの操作指示に応じて各種情報の入力を受け付ける。
表示部16は、CPU11の制御に従って各種設定情報や演奏動作に係る情報等を表示する。
MIDIインターフェース17は、電子楽器2が接続されている。MIDIインターフェース17は、電子楽器2に対して模範演奏等に係る演奏データを送信する。
【0017】
電子楽器2は、MIDIインターフェース21と、鍵盤22と、音源・サウンドシステム23と、を備える。
MIDIインターフェース21は、演奏動作表示装置1から模範演奏等に係る演奏データを受信し、この演奏データに対応する演奏信号を音源・サウンドシステムに出力する。また、鍵盤22から楽器の操作入力を受け付け、この操作入力に対応した演奏信号を音源・サウンドシステムに出力する。
音源・サウンドシステム23は、MIDIインターフェース21と接続され、MIDIインターフェースから出力された信号に基づいて、楽器等の音を出力する。
【0018】
このような演奏動作表示装置1は、ユーザの演奏の上達を補助するために、演奏時の腕、手及び指の模範的な動作を表示部16に表示する。なお、以下、図2(a)に示すような演奏時の腕、手及び指の動作の表示部16への表示を通常演奏動作表示という。また、図2(b)に示すような演奏時の腕、手及び指の動作の表示部16への拡大表示を拡大演奏動作表示という。また、図2(c)に示すような演奏時の腕、手及び指を斜め方向からの拡大表示を演奏テクニック表示という。
【0019】
なお、以下の説明において、図2(a)に示すような鍵盤を正面から視認した場合の横方向(低音の鍵から高音の鍵に向かう方向)をx軸方向とし、鍵盤を正面から視認した場合に正面から鍵盤に向かって延びる方向をy軸方向とし、鍵盤を正面から視認した場合の上方向をz軸方向とする。
【0020】
図3は、表示部16に演奏動作表示を行う場合における、それぞれの用語を説明する図である。
まず、表示部16に表示される画像を視野Pとする。この視野Pの中心位置を視野の中心という。また、視野の中心からレンダリングを行う場合における視点に向かって延びるベクトルを目線ベクトルという。また、視点に向かって視野の上端及び下端における幅方向の中心に向かって線を引いた場合の、当該線が交差する角度を高さ方向視野角という。
【0021】
まず、通常演奏動作表示に必要な情報について説明する。この演奏動作表示に必要な情報は、ROM12に記憶されている。これらの情報は、演奏時において、CPU11によって、ROM12から適宜複写されてRAM13に一時的に記憶される。
【0022】
図4は、制御変数の構造を示す図である。この制御変数は、演奏動作表示装置1において通常演奏動作表示及び拡大演奏動作表示を行うために用いられる。
制御変数には、変数として、widthと、heightと、f0vyと、Center[3]と、Eye[3]と、EyeVector[3]と、NoteR[]と、StructR[]と、MotionR[]と、IndexRと、NoteL[]と、StructL[]と、MotionL[]と、IndexLと、が定義されている。
なお、構造を示す図において、末尾に添え字として[]が設けられている変数は、配列を示している。例えば、Center[3]は、3つの変数から構成される配列である。また、構造を示す図において、配列の要素数が空欄の配列は、演奏する曲によってそれぞれ異なることを示している。
【0023】
widthは、表示部16に表示する画面の幅を示す変数である。
heightは、表示部16に表示する画面の高さを示す変数である。
f0vyは、高さ方向視野角(図3参照)を示す変数である。
Center[3]は、表示部16に表示する画面における視界の中心座標を示す変数である。Center[3]には、それぞれの要素に対して、3次元座標系(x,y,z)における各座標値が含まれており、3次元座標系における位置を示している。
Eye[3]は、表示部16に表示する画面における視点を示す変数である。この変数Eyeも、Centerと同様に3次元座標系における位置を示している。
EyeVector[3]は、視線ベクトルを示す変数である。EyeVector[3]は、Eye[3]からCenter[3]を減算することで得られる。
【0024】
NoteR[]は、右手の演奏情報が格納される配列変数である。詳細は後述する。
StructR[]は、右手の構造データが格納される配列変数である。構造データとは、指、手及び腕の構造を示す図である。この構造データは、表示部16に表示する画面において、指、手及び腕をレンダリングする際に用いられる。
MotionR[]は、演奏時における右手の動作を示す動作情報が格納される配列変数である。
IndexRは、レンダリング対象の右手の動作情報のインデックスを示す変数である。
【0025】
NoteL[]は、左手の演奏情報が格納される配列変数である。NoteL[]に格納される変数は、NoteR[]と同一である。
StructL[]は、左手の構造データが格納される配列変数である。StructL[]に格納される変数は、StructR[]と同一である。
MotionL[]は、演奏時における左手の動作を示す動作情報が格納される配列変数である。MotionL[]に格納される変数は、MotionR[]と同一である。
IndexLは、レンダリング対象の左手の動作情報のインデックスを示す変数である。
【0026】
図5は、演奏情報の構造を示す図である。
演奏情報は、上述したように、右手の演奏情報を示すNoteR[]と、左手の演奏情報を示すNoteL[]と、から構成される。
NoteR[]と、NoteL[]とは構成が同一であるため、図5では、これらNoteR[]と、NoteL[]とをまとめて、Note[]として説明する。
【0027】
図5に示すように、Note[]におけるそれぞれの要素(Note[0]、Note[1]、・・・Note[N]、・・・)には、Timeと、Gateと、Pitchと、が定義されている。なお、以下の説明において、添え字のみ異なる配列変数には、特段の説明がない限り、同一の変数が定義されているものとする。例えば、図5では、Note[0]にのみ、Timeと、Gateと、Pitchとが定義されているが、他の変数(Note[1]、Note[N]等)においても、Note[0]と同様に、Timeと、Gateと、Pitchとが定義されているものとする。
【0028】
Timeは、発音を開始する時間を示す変数である。
Gateは、発音を継続する時間を示す変数である。
Pitchは、発音される音の音高(周波数)を示す変数である。
【0029】
図6は、構造データの構造を示す図である。
構造データは、上述したように、右手の構造データを示すStructR[]と、左手の構造データを示すStructL[]と、から構成される。
StructR[]と、StructL[]とは構成が同一であるため、図6では、これらStructR[]と、StructL[]とをまとめて、Struct[]として説明する。
【0030】
図6に示すように、Struct[]におけるそれぞれの要素には、Indexと、Parentと、Childrenと、Child[]と、Vertices[][3]と、Lengthと、Theta[]と、Phi[]と、Lambda[]と、が定義されている。
【0031】
Indexは、構造データのインデックスを示す変数である。
Parentは、親データとなる構造データのインデックスを示す変数である。例えば、Parentの値が2である場合には、インデックスが2である構造データが親データとなる。なお、Parentの値が−1である場合は、親データが無いことを示す。
Childrenは、親の構造に対して子となる構造物の数を示す変数である。
Vertices[][3]は、親の構造を示し、表示部16に表示されるポリゴンにおける各頂点の3次元座標を示す配列変数である。Vertices[][3]の[]は、ポリゴンにおける頂点の数に対応しており、この頂点の数だけが要素が定義される。また、Vertices[][3]の[3]は、それぞれの頂点の3次元座標に対応している。
Lengthは、親の構造の長さを示す変数である。
【0032】
Theta[]は、親の構造のx軸回転角を示す変数であり、後述の動作情報の要素数と同数の要素が定義される。
Phi[]は、親の構造のy軸回転角を示す変数であり、後述の動作情報の要素数と同数の要素が定義される。
Lambda[]は、親の構造のz軸回転角を示す変数であり、後述の動作情報の要素数と同数の要素が定義される。
【0033】
図7は、鍵盤データの構造を示す図である。
鍵盤データとしてのKey[]は、表示部16に表示される鍵盤を構成する白鍵及び黒鍵のそれぞれの情報を格納している。Key[]には、最も低音の鍵から順に、それぞれの鍵の情報が格納されている。例えば、Key[0]は、最も左に位置する白鍵に対応しており、この白鍵より半音高い鍵がKey[1]に対応している。
【0034】
図7に示すように、Key[]におけるそれぞれの要素には、Pitchと、isBlackと、Vertices[][3]と、Statusと、NoteOffと、が定義されている。
【0035】
Pitchは、発音される音の音高(周波数)を示す変数である。
isBlackは、黒鍵か白鍵かを示すフラグである。具体的には、isBlackは、0の場合に白鍵を示し、1の場合に黒鍵を示す。
Vertices[][3]は、鍵の構造データ(ポリゴンデータ)を示し、表示部16に表示されるポリゴンにおける各頂点の3次元座標を示す配列変数である。
Statusは、鍵の状態を示す変数である。例えば、Statusが0の場合に離鍵状態を示し、+の場合に押鍵状態を示し、−の場合に離鍵中を示す。
NoteOffは、発音されてから消音されるまでの時間である消音時間を示す変数である。
【0036】
図8は、動作情報の構造を示す図である。
動作情報は、上述したように、右手の動作情報を示すMotionR[]と、左手の動作情報を示すMotionL[]と、から構成される。
MotionR[]と、MotionL[]とは構成が同一であるため、図8では、これらMotionR[]と、MotionL[]とをまとめて、Motion[]として説明する。
【0037】
図8に示すように、Motion[]におけるそれぞれの要素には、Timeと、RootPos[3]と、が定義されている。
Timeは、演奏時における各フレームが開始される時間を示す変数である。
RootPos[3]は、表示部16に構造物を描画する際に起点となる構造物の3次元座標(起点関節の3次元座標)である。
【0038】
続いて、演奏動作表示の処理の流れについて説明する。
図9は、演奏動作表示のメイン処理の流れを示すフローチャートである。このメイン処理は、通常演奏動作表示、拡大演奏動画表示、及び演奏テクニック表示において共通する。
ステップS1において、CPU11は、データ初期化/読込処理を実行する。
すなわち、CPU11は、RAM13に一時的に記憶されているデータの初期化を行うとともに、ROM12に記憶されている各種情報を読み込み、その後、入力部15を介してユーザからの指示を受け付ける。各種情報としては、制御変数、演奏情報、構造データ、鍵盤データ、動作情報が挙げられる。
【0039】
ステップS2において、CPU11は、入力部15を介してユーザから終了指示を受け付けたか否かを判定する。CPU11は、この判定がYESの場合、メイン処理を終了し、この判定がNOの場合、ステップS3に処理を移す。
【0040】
ステップS3において、CPU11は、入力部15を介してユーザから楽曲の再生指示を受け付けたか否かを判定する。CPU11は、この判定がYESの場合、ステップS4に処理を移し、この判定がNOの場合、ステップS5に処理を移す。
【0041】
ステップS4において、CPU11は、ユーザから指示された楽曲の再生処理を実行する。再生処理の詳細は、図10で詳述する。CPU11は、ステップS4の処理が終了すると、ステップS2に処理を移す。
ステップS5において、CPU11は、入力部15を介してユーザから再生の停止指示を受け付けたか否かを判定する。CPU11は、この判定がYESの場合、ステップS6に処理を移し、この判定がNOの場合、ステップS2に処理を移す。
ステップS6において、CPU11は、演奏されている楽曲の再生を終了する。CPU11は、ステップS6の処理が終了すると、ステップS2に処理を移す。
【0042】
図10は、再生処理の流れを示すフローチャートである。
ステップS11において、CPU11は、初期化処理を実行する。
すなわち、CPU11は、再生処理が開始されたことに応じて、演奏情報の初期化を行う。演奏情報の初期化とは、制御変数、鍵盤データ、演奏情報、構造データ、動作情報をRAM13に記憶させることをいう。ここで、演奏情報、構造データ、及び動作情報は、図9のステップS3において再生指示された楽曲に対応しているものとする。また、CPU11は、初期化処理において、RAM13に再生終了フラグを記憶させる。この再生終了フラグの初期値は、OFFに設定されている。
【0043】
ステップS12において、CPU11は、図示しないタイマーからシステム時刻を取得する。
ステップS13において、CPU11は、RAM13に記憶されている再生終了フラグの状態を判定する。CPU11は、再生終了フラグがONである場合、再生処理を終了する。CPU11は、再生終了フラグがOFFである場合、ステップS14に処理を移す。
【0044】
ステップS14において、CPU11は、再生している楽曲における現在時刻(再生位置)を更新する。
ステップS15において、CPU11は、ステップS14において更新された現在時刻が、再生している楽曲の終了時刻を超過しているか否かを判定する。CPU11は、この判定がYESの場合、ステップS16に処理を移し、この判定がNOの場合、ステップS17に処理を移す。
【0045】
ステップS16において、CPU11は、RAM13に記憶されている再生終了フラグをONに更新する。CPU11は、ステップS16の処理が終了すると、ステップS13に処理を移す。
【0046】
ステップS17において、CPU11は、右手パートの動作情報の検索を行う処理である右手パート動作情報検索処理を実行する。右手パート動作情報検索処理の詳細は、図11で詳述する。
ステップS18において、CPU11は、左手パートの動作情報の検索を行う処理である左手パート動作情報検索処理を実行する。左手パート動作情報検索処理の詳細は、図11で詳述する。
【0047】
ステップS19において、CPU11は、右手パートの演奏情報の検索を行う処理である右手パート演奏情報検索処理を実行する。右手パート演奏情報検索処理の詳細は、図12で詳述する。
ステップS20において、CPU11は、左手パートの演奏情報の検索を行う処理である左手パート演奏情報検索処理を実行する。左手パート演奏情報検索処理の詳細は、図12で詳述する。
【0048】
ステップS21において、CPU11は、離鍵チェック処理を実行する。離鍵チェック処理の詳細は、図13で詳述する。CPU11は、ステップS21の処理が終了すると、ステップS13に処理を移す。
【0049】
図11は、動作情報検索処理の流れを示すフローチャートである。
なお、CPU11は、右手パート動作情報検索処理を実行する場合には、MotionR[]を検索し、左手パート動作情報検索処理を実行する場合には、MotionL[]を検索するものとする。なお、本フローチャートにおいて説明するMotion[]は、右手パート動作情報検索処理を実行する場合、MotionR[]に置き換えるものとし、左手パート動作情報検索処理を実行する場合、MotionL[]に置き換えるものとする。
【0050】
ステップS31において、CPU11は、RAM13に記憶されている制御変数(handCtrl)の描画対象動作情報インデックスを取得する。ここで、CPU11は、右手パート動作情報検索処理を実行する場合には、IndexRを取得し、左手パート動作情報検索処理を実行する場合には、IndexLを取得するものとする。
【0051】
ステップS32において、CPU11は、取得された描画対象動作情報インデックスに基づいて、全ての動作情報を取得したか否かを判定する。すなわち、CPU11は、描画対象動作情報インデックスが、Motion[]の添え字の最大値と等しいか否かを判定する。CPU11は、この判定がYESの場合、動画情報検索処理を終了し、この判定がNOの場合、ステップS33に処理を移す。
【0052】
ステップS33において、CPU11は、図10のステップS14において更新された現在時刻が、Motion[]のフレーム時間を経過したか否かを判定する。CPU11は、この判定がYESの場合、ステップS34に処理を移し、この判定がNOの場合、ステップS35に処理を移す。
【0053】
ステップS34において、CPU11は、RAM13に記憶されている制御変数(handCtrl)の描画対象動作情報インデックスを更新する。すなわち、CPU11は、ステップS31において取得した描画対象動作情報インデックスの値をインクリメントすることにより、描画対象動作情報インデックスを更新する。
【0054】
ステップS35において、CPU11は、次の動作情報を取得する。CPU11は、この処理が終了すると、ステップS32に処理を移す。
【0055】
図12は、演奏情報検索処理の流れを示すフローチャートである。
なお、本フローチャートにおいて説明するNote[]は、右手パート動作情報検索処理を実行する場合、NoteR[]に置き換えるものとし、左手パート動作情報検索処理を実行する場合、NoteL[]に置き換えるものとする。
【0056】
ステップS41において、CPU11は、RAM13に記憶されている制御変数(handCtrl)から、Note[]を描画対象の演奏情報として取得する。
【0057】
ステップS42において、CPU11は、ステップS41において取得された描画対象の演奏情報に基づいて、全ての演奏情報を取得したか否かを判定する。すなわち、CPU11は、Note[]の添え字が、ROM12に記憶されているNote[]の添え字の最大値と等しいか否かを判定する。CPU11は、この判定がYESの場合、演奏情報検索処理を終了し、この判定がNOの場合、ステップS43に処理を移す。
【0058】
ステップS43において、CPU11は、図10のステップS14において更新された現在時刻が、Note[]の発音開始時間に到達したか否かを判定する。CPU11は、この判定がYESの場合、ステップS45に処理を移し、この判定がNOの場合、ステップS44に処理を移す。
【0059】
ステップS44において、CPU11は、RAM13に記憶されている制御変数(handCtrl)に格納されている演奏情報を、次に発音する演奏情報に更新する。具体的には、CPU11は、ステップS41において取得されたNote[]の添え字をインクリメントし、添え字がインクリメントされたNote[]の情報をRAM13から取得する。そして、CPU11は、RAM13に記憶されている制御変数(handCtrl)を、取得されたNote[]の情報に書き換える。
【0060】
ステップS45において、CPU11は、図10のステップS14において更新された現在時刻に発音されているか否かを判定する。CPU11は、この判定がYESの場合、ステップS46に処理を移し、この判定がNOの場合、ステップS42に処理を移す。
【0061】
ステップS46において、CPU11は、RAM13に記憶されている鍵盤データ(Key[])において、該当する鍵の状態(Status)を“+”(押鍵状態)に更新するとともに、当該鍵盤データにおける消音時間(NoteOff)を更新する。ここで、CPU11は、制御変数に格納されている演奏情報のPitchを参照して、ステップS44において取得されたNote[]のPitchに対応するする鍵を特定する。
【0062】
ステップS47において、CPU11は、次の演奏情報を取得する。CPU11は、この処理が終了すると、ステップS42に処理を移す。
【0063】
図13は、離鍵チェック処理の流れを示すフローチャートである。
ステップS51において、CPU11は、RAM13に記憶されている鍵盤データ(Key[])から、最初の鍵の情報を取得する。ここで、最初の鍵の情報とは、例えば、最も低音の鍵の情報(Key[0])である。
【0064】
ステップS52において、CPU11は、全ての鍵の情報のチェックが完了したか否かを判定する。すなわち、CPU11は、Key[]の添え字が、ROM12に記憶されているKey[]の添え字の最大値と等しいか否かを判定する。CPU11は、この判定がYESの場合、離鍵チェック処理を終了し、この判定がNOの場合、ステップS53に処理を移す。
【0065】
ステップS53において、CPU11は、ステップS51又はステップS55において取得された鍵の情報に含まれる消音時間に時間が記憶されている場合、図10のステップS14において更新された現在時刻が、当該消音時間を経過しているか否かを判定する。CPU11は、この判定がYESの場合、ステップS54に処理を移し、この判定がNOの場合、ステップS55に処理を移す。
【0066】
ステップS54において、CPU11は、該当する鍵の状態(Status)を“−”(離鍵状態)に更新するとともに、当該鍵盤データにおける消音時間(NoteOff)を消去する。CPU11は、ステップS54の処理が終了すると、ステップS55に処理を移す。
【0067】
ステップS55において、CPU11は、次の鍵の情報を取得する。CPU11は、ステップS55の処理が終了すると、ステップS52に処理を移す。
【0068】
図14は、レンダリング処理の流れを示すフローチャートである。なお、レンダリング処理は、図9において説明したメイン処理のステップS1のデータの初期化/読込処理が完了した後に継続的に行われる。
ステップS61において、CPU11は、視点設定処理を実行する。
すなわち、CPU11は、RAM13に記憶されている制御変数(handCtrl)に格納されている高さ方向の視野角(f0vy)、視界の中心座標(Center[3])、及び視点(Eye[3])に基づいて、表示部16に表示する画面における視点を設定する。
ステップS62において、CPU11は、鍵盤描画処理を実行する。鍵盤描画処理の詳細は、図15で詳述する。
【0069】
ステップS63において、CPU11は、右腕描画処理を実行する。右腕描画処理の詳細は、図16で詳述する。
ステップS64において、CPU11は、左腕描画処理を実行する。左腕描画処理の詳細は、図16で詳述する。
【0070】
図15は、鍵盤描画処理の流れを示すフローチャートである。
ステップS71において、CPU11は、鍵盤を描画するために、鍵の構造データを行列スタックにプッシュする。
ステップS72において、CPU11は、鍵盤を回転させる際の中心点を原点とする座標系に移動する。
ステップS73において、RAM13に記憶されている鍵盤データ(Key[])から、最初の鍵の構造データを取得する。ここで、最初の鍵の構造データとは、例えば、最も低音の鍵の情報(Key[0])に対応する構造データ(Vertices[][3])である。
【0071】
ステップS74において、CPU11は、全ての鍵の描画が完了したか否かを判定する。CPU11は、この判定がYESの場合、ステップS82に処理を移し、この判定がNOの場合、ステップS75に処理を移す。
【0072】
ステップS75において、CPU11は、取得した鍵の構造データに対応する鍵の状態が、“+”(押鍵状態)又は“−”(離鍵状態)であるか否かを判定する。CPU11は、この判定がYESの場合、ステップS76に処理を移し、この判定がNOの場合、ステップS80に処理を移す。
【0073】
ステップS76において、CPU11は、ステップS73又はステップS81において取得された鍵の構造データを行列スタックにプッシュする。ここで、行列スタックとは、構造データの3Dのレンダリングを行うために用いられるデータ構造である。
【0074】
ステップS77において、CPU11は、ステップS76において行列スタックにプッシュされた構造データの座標系を所定角度だけ回転させる。この状態で描画されることにより、鍵の状態が、“+”(押鍵状態)又は“−”(離鍵状態)の鍵は、押鍵されているように表示される。
【0075】
ステップS78において、CPU11は、行列スタックにプッシュされている鍵の構造データをポリゴン描画する。
ステップS79において、CPU11は、ステップS76においてプッシュされた鍵の構造データをポップ(クリア)する。
ステップS80において、CPU11は、行列スタックにプッシュされている鍵の構造データをポリゴン描画する。
【0076】
ステップS81において、CPU11は、次の鍵の構造データを取得する。なお、CPU11は、直前に取得した鍵の構造データが、最後の鍵(最も高音の鍵)である場合、当該取得されている鍵の構造データを取得した状態を維持する。CPU11は、ステップS81の処理が終了すると、ステップS74に処理を移す。
ステップS82において、CPU11は、ステップS71においてプッシュされた鍵の構造データをポップ(クリア)する。
【0077】
図16は、腕描画処理の流れを示すフローチャートである。なお、本フローチャートにおいて説明するMotion[]は、右腕描画処理を実行する場合、MotionR[]に置き換えるものとし、左腕描画処理を実行する場合、MotionL[]に置き換えるものとする。
【0078】
ステップS91において、CPU11は、RAM13に記憶されている動作情報(Motion[])から、描画対象動作情報を取得する。すなわち、CPU11は、Motion[]に格納されているRootPos[3]から、表示部16に構造物を描画する際に起点となる構造物の3次元座標を取得する。
【0079】
ステップS92において、CPU11は、ステップS91において取得した起点となる構造物(右腕又は左腕)の構造データを取得して、行列スタックにプッシュする。
ステップS93において、CPU11は、肩位置から描画を行うために、肩位置を原点とする座標系に移動する。
【0080】
ステップS94において、CPU11は、RAM13に記憶されている構造データ(Struct[])のChild[]を参照して、下位の構造データを取得する。ここでは、CPU11は、右手又は左手の構造データを取得する。
ステップS95において、CPU11は、手指動画処理を実行する。手指動画処理の詳細は、図17で詳述する。
ステップS96において、CPU11は、行列スタックにプッシュされている構造物(右腕又は左腕)の構造データをポップする。
【0081】
図17は、手指描画処理の流れを示すフローチャートである。なお、本フローチャートにおいて説明するMotion[]は、右手に対応する手指描画処理を実行する場合、MotionR[]に置き換えるものとし、左手に対応する手指描画処理を実行する場合、MotionL[]に置き換えるものとする。
【0082】
ステップS101において、CPU11は、RAM13に記憶されている構造データ(Struct[])を参照して、Lambda[]の値(z軸回転角)を取得する。そして、CPU11は、取得したz軸回転角に基づいて、座標系においてz軸の描画角度を回転させる。
【0083】
ステップS102において、CPU11は、RAM13に記憶されている構造データ(Struct[])を参照して、Phi[]の値(y軸回転角)を取得する。そして、CPU11は、取得したy軸回転角に基づいて、座標系においてy軸の描画角度を回転させる。
【0084】
ステップS103において、CPU11は、図16のステップS84において取得された手の構造データを行列スタックにプッシュする。ここで、CPU11は、当該手の構造データに対して、既に図16のステップS92において腕の構造データの値を乗算し、その後、乗算した結果を行列スタックにプッシュする。この状態において手の構造データを描画すると、手が腕に連結された状態で描画される。
【0085】
ステップS104において、CPU11は、RAM13に記憶されている構造データ(Struct[])を参照して、Theta[]の値(x軸回転角)を取得する。そして、CPU11は、取得したx軸回転角に基づいて、座標系においてx軸の描画角度を回転させる。
【0086】
ステップS105において、CPU11は、行列スタックに格納されている手の構造データのポリゴン描画を行う。上述したように、手が腕に連結された状態で描画される。
ステップS106において、CPU11は、行列スタックから、手構造データをポップする。
【0087】
ステップS107において、CPU11は、RAM13に記憶されている構造データ(Struct[])から、Lengthの値(構造の長さ)を取得する。そして、CPU11は、座標系をx軸方向に構造の長さ分移動する。
【0088】
ステップS108において、CPU11は、RAM13に記憶されている構造データ(Struct[])のChildrenの値を参照して、子構造があるか判定する。ここで、子構造とは指である。CPU11は、この判定がYESの場合、ステップS109に処理を移し、この判定がNOの場合、手指描画処理を終了する。
【0089】
ステップS109において、CPU11は、RAM13に記憶されている構造データ(Struct[])のChild[]の値を参照して、最初の指構造データを取得する。例えば、指構造データを親指から小指に向かって順に取得する場合、CPU11は、最初の指構造データとして、親指の親構造データを取得する。
【0090】
ステップS110において、CPU11は、全ての指の描画が完了したか否かを判定する。CPU11は、この判定がYESの場合、手指描画処理を終了し、この判定がNOの場合、ステップS111に処理を移す。
【0091】
ステップS111において、CPU11は、ステップS109又はステップS114において取得された指構造データを行列スタックにプッシュする。ここで、CPU11は、当該指の構造データに対して、手の構造データの値を乗算し、その後、乗算した結果を行列スタックにプッシュする。この状態において指の構造データを描画すると、指が手に連結された状態で描画される。
【0092】
ステップS112において、CPU11は、ステップS111において行列スタックにプッシュされた構造データのポリゴン描画を行う。
ステップS113において、CPU11は、ステップS112においてポリゴン描画が行われた構造データを行列スタックからポップする。
ステップS114において、CPU11は、次の指構造データを取得する。例えば、直前に親指の構造データが取得されている場合、CPU11は、人差し指に対応する構造データを取得する。また、例えば、直前に小指の構造データが取得されている場合、CPU11は、小指に対応する構造データを再取得する。
【0093】
続いて、拡大演奏動作表示を行う際に参照されるデータの構造及び処理の流れについて説明する。なお、拡大演奏動画表示において、視点移動が行われるため、拡大演奏動作表示を行う場合を、「視点移動時」ともいう。
【0094】
図18は、拡大演奏動作表示において参照される動作情報の構造を示す図である。
動作情報は、上述したように、右手の動作情報を示すMotionR[]と、左手の動作情報を示すMotionL[]と、から構成される。
MotionR[]と、MotionL[]とは構成が同一であるため、図18では、これらMotionR[]と、MotionL[]とをまとめて、Motion[]として説明する。
【0095】
図18に示すように、拡大演奏動画表示を行う際に参照されるMotion[]におけるそれぞれの要素には、Timeと、RootPos[3]と、MaxHandPos[3]と、MinHandPos[3]と、WristPos[3]と、が定義されている。
Timeは、演奏時における各フレームが開始される時間を示す変数である。
RootPos[3]は、表示部16に表示される構造物における起点の3次元座標(起点関節の3次元座標)である。
MaxHandPos[3]は、視点移動時において、最も右側となる手関節の3次元座標を示す変数である。
MinHandPos[3]は、視点移動時において、最も左側となる手関節の3次元座標を示す変数である。
WristPos[3]は、視点移動時における手首関節の3次元座標を示す変数である。
【0096】
図19は、視点移動時のレンダリング処理の流れを示すフローチャートである。なお、レンダリング処理は、図9において説明したメイン処理のステップS1のデータの初期化/読込処理が完了した後に継続的に行われる。
【0097】
ステップS121において、CPU11は、視点計算処理を実行する。視点計算処理の詳細は、図20で詳述する。
ステップS122において、CPU11は、視点設定処理を実行する。
すなわち、CPU11は、RAM13に記憶されている制御変数に格納されている高さ方向の視野角(f0vy)、視界の中心座標(Center[3])、及び視点(Eye[3])に基づいて、表示部16に表示する画面における視点を設定する。
【0098】
ステップS123において、CPU11は、図15で詳述した鍵盤描画処理を実行する。
ステップS124において、CPU11は、図16で詳述した右腕描画処理を実行する。
ステップS125において、CPU11は、図16で詳述した左腕描画処理を実行する。
【0099】
図20は、視点計算処理の流れを示すフローチャートである。
ステップS131において、CPU11は、左右の描画対象の動画情報からx方向の最大値及び最小値を取得し、取得した最大値及び最小値の中間値を計算する。
ステップS132において、CPU11は、左右の構造データの最大幅、最小幅から、視界の中心と視点との距離を計算する。
【0100】
ステップS133において、CPU11は、左右の描画対象の動画情報の既定数前後を検索し、x方向の最大値及び最小値を取得し、中間値を計算する。
ステップS134において、CPU11は、視界の中心となるx座標を中間値に設定する。
【0101】
ステップS135において、CPU11は、視界の幅を計算する。
ステップS136において、ステップS131において取得したx方向の最大値及び最小値がステップS135において計算した視界の幅(視界内)に収まっているか否かを判定する。CPU11は、この判定がYESの場合、ステップS138に処理を移し、この判定がNOの場合、ステップS137に処理を移す。
【0102】
ステップS137において、CPU11は、視界の中心と視点との距離を再計算する。
ステップS138において、CPU11は、視界の幅を再計算する。
【0103】
続いて、演奏時に演奏テクニック表示を挿入する場合に参照されるデータの構造及び処理の流れについて説明する。なお、拡大演奏動画表示において、視点移動が行われるため、拡大演奏動作表示を行う場合を、「視点移動時」ともいう。
図21は、演奏テクニック表示を含む演奏動作表示を行う場合に参照される制御変数の構造を示す図である。なお、図21に示す制御変数を用いて演奏テクニック表示を含む演奏動作表示を行う場合、演奏途中において演奏テクニックを要するパートに差し掛かったときに、自動的に手指の詳細な動きが確認できるように手指が拡大され、斜視表示される。
【0104】
演奏テクニック表示を含む演奏動作表示を行う場合に参照される制御変数には、変数として、widthと、heightと、f0vyと、Center[3]と、Eye[3]と、EyeVector[3]と、Vertical[3]と、Horizonal[3]と、AutoAngleStatusと、Startと、Returnと、EyeVectorN[3]と、EyeAngleと、NoteR[]と、StructR[]と、MotionR[]と、IndexRと、NoteL[]と、StructL[]と、MotionL[]と、IndexLと、が定義されている。
【0105】
width、height、f0vyと、Center[3]と、Eye[3]と、EyeVector[3]とは、図4に示した制御変数と同一であるので、説明を省略する。
【0106】
Vertical[3]は、視界の縦(画面高さ)方向のベクトルを示す変数である。
Horizonal[3]は、視界の横(画面幅)方向のベクトルを示す変数である。
AutoAngleStatusは、視点移動状態を示す変数である。例えば、AutoAngleStatusが“0”の場合に視点移動が行われていない状態(停止)を示し、“+”の場合に移動中を示し、“−”の場合に復帰中を示す。
Startは、演奏テクニックの表示を開始する時刻である移動開始時刻を示す変数である。
Returnは、演奏テクニックが終了して通常の表示状態へ復帰する時刻である復帰開始時刻を示す変数である。
EyeVectorN[3]は、目線回転面の法線ベクトルを示す変数である。
EyeAngleは、目線回転角を示す変数である。
【0107】
NoteR[]と、StructR[]と、MotionR[]と、IndexRと、NoteL[]と、StructL[]と、MotionL[]と、IndexLとは、図4に示した制御変数と同一であるので、説明を省略する。
【0108】
図22は、演奏テクニック表示を含む演奏動作表示を行う場合に参照される演奏情報の構造を示す図である。
演奏情報は、上述したように、右手の演奏情報を示すNoteR[]と、左手の演奏情報を示すNoteL[]と、から構成される。
NoteR[]と、NoteL[]とは構成が同一であるため、図22では、これらNoteR[]と、NoteL[]とをまとめて、Note[]として説明する。
【0109】
図22に示すように、Note[]におけるそれぞれの要素には、Timeと、Gateと、Pitchと、Fingerと、FigTech[]が定義されている。
【0110】
Timeは、発音を開始する時間を示す変数である。
Gateは、発音を継続する時間を示す変数である。
Pitchは、発音される音の音高(周波数)を示す変数である。
Fingerは、指番号を示す変数である。指番号とは、演奏時において指を識別するための番号である。
FigTech[]は、演奏テクニックフラグを示す配列変数である。FigTech[]は、演奏テクニックにおいて定義されている動作ステップの数だけ要素数が設けられる。
【0111】
図23は、演奏テクニック表示を含む演奏動作表示を行う場合に実行される演奏情報検索処理の流れを示すフローチャートである。
なお、本フローチャートにおいて説明するNote[]は、右手パート動作情報検索処理を実行する場合、NoteR[]に置き換えるものとし、左手パート動作情報検索処理を実行する場合、NoteL[]に置き換えるものとする。
【0112】
ステップS141乃至ステップS143の処理は、図12において説明したステップS41乃至ステップS43の処理と同一であるので、説明を省略する。
ステップS144において、CPU11は、ステップS44における処理と同様に、RAM13に記憶されている制御変数(handCtrl)に格納されている演奏情報を、次に発音する演奏情報に更新する。
【0113】
ステップS145において、CPU11は、演奏テクニック検索処理を実行する。演奏テクニック検索処理は、図24で詳述する。CPU11は、この処理が終了すると、動作情報検索処理を終了する。
ステップS146乃至ステップS148の処理は、図12において説明したステップS45乃至ステップS47の処理と同一であるので、説明を省略する。
【0114】
図24は、演奏テクニック表示を含む演奏動作表示を行う場合に実行される演奏テクニック検索処理の流れを示すフローチャートである。なお、本フローチャートを実行するにあたり、RAM13には、図21に示される制御変数が記憶されているものとする。
【0115】
ステップS151において、CPU11は、RAM13に記憶されている制御変数(handCtrl)のAutoAngleStatusを参照し、視点移動するか否かを判定する。CPU11は、この判定がYESの場合、演奏テクニック検索処理を終了し、この判定がNOの場合、ステップS152に処理を移す。
【0116】
ステップS152において、CPU11は、演奏テクニック表示を行うか否かを判定するために検索対象とする時間(検索時間)を、現在時刻から所定時間後までに設定する。
ステップS153において、CPU11は、RAM13に記憶されている制御変数(handCtrl)から、Note[]を描画対象の演奏情報として取得する。
【0117】
ステップS154において、CPU11は、ステップS153又はステップS160において取得された描画対象の演奏情報に基づいて、全ての演奏情報を取得したか否かを判定する。すなわち、CPU11は、Note[]の添え字が、ROM12に記憶されているNote[]の添え字の最大値と等しいか否かを判定する。CPU11は、この判定がYESの場合、演奏テクニック検索処理を終了し、この判定がNOの場合、ステップS155に処理を移す。
【0118】
ステップS155において、CPU11は、発音時間が、ステップS152において設定された検索時間の範囲内であるか否かを判定する。CPU11は、この判定がYESの場合、ステップS156に処理を移し、この判定がNOの場合、演奏テクニック検索処理を終了する。
【0119】
ステップS156において、CPU11は、図22に示される演奏情報のFigTech[]を参照し、演奏テクニックフラグがONであるか否かを判定する。CPU11は、この判定がYESの場合、ステップS157に処理を移し、この判定がNOの場合、ステップS160に処理を移す。
【0120】
ステップS157において、CPU11は、現在の視点状態及び演奏テクニックに応じた視点状態から、回転角・回転軸を計算する。
ステップS158において、CPU11は、演奏テクニック表示を開始する時刻(移動開始時刻)を発音時刻の所定時間前に設定する。すなわち、CPU11は、RAM13に記憶されている制御変数のStartを設定する。
ステップS159において、CPU11は、演奏テクニック表示から通常演奏動作表示又は拡大演奏動作表示に戻る時刻(復帰開始時刻)を所定時間後に設定する。CPU11は、この処理が終了すると、演奏テクニック検索処理を終了する。すなわち、CPU11は、RAM13に記憶されている制御変数のReturnを設定する。
【0121】
ステップS160において、CPU11は、次の演奏データを取得し、ステップS154に処理を移す。
【0122】
図25は、演奏テクニック表示を含む演奏動作表示を行う場合に実行されるレンダリング処理の流れを示すフローチャートである。なお、このレンダリング処理は、図9において説明したメイン処理のステップS1のデータの初期化/読込処理が完了した後に継続的に行われる。また、このレンダリング処理を開始時に、CPU11は、図20に示す視点計算処理を実行することにより、演奏テクニック表示時において拡大して表示されるようにしてもよい。
【0123】
ステップS161において、CPU11は、視点変更計算処理を実行する。視点変更計算処理の詳細は、図26で詳述する。
ステップS162において、CPU11は、視点設定処理を実行する。
すなわち、CPU11は、RAM13に記憶されている制御変数に格納されている高さ方向の視野角(f0vy)、視界の中心座標(Center[3])、及び視点(Eye[3])に基づいて、表示部16に表示する画面における視点を設定する。
【0124】
ステップS163において、CPU11は、図15で詳述した鍵盤描画処理を実行する。
ステップS164において、CPU11は、図16で詳述した右腕描画処理を実行する。
ステップS165において、CPU11は、図16で詳述した左腕描画処理を実行する。
【0125】
図26は、演奏テクニック表示を含む演奏動作表示を行う場合に実行される視点変更計算処理の流れを示すフローチャートである。なお、このレンダリング処理は、図9において説明したメイン処理のステップS1のデータの初期化/読込処理が完了した後に継続的に行われる。
【0126】
ステップS171において、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusを参照して、視点が停止しているか否かを判定する。具体的には、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusの値が“0”である場合に視点停止であると判定する。CPU11は、この判定がYESの場合、ステップS172に処理を移し、この判定がNOの場合、ステップS178に処理を移す。
【0127】
ステップS172において、CPU11は、RAM13に記憶された制御変数のStart(移動開始時刻)を参照して、図10のステップS14において更新された現在時刻が、移動開始時刻を超過したか否かを判定する。CPU11は、この判定がYESの場合、ステップS173に処理を移し、この判定がNOの場合、ステップS175に処理を移す。
【0128】
ステップS173において、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusを“+”にすることにより、視点移動状態を移動中に設定する。また、CPU11は、移動開始時刻と復帰開始時刻とに基づいて、移動フレーム数を算出して、RAM13に記憶させる。さらに、CPU11は、状態変数の初期値を0として、RAM13に記憶させる。
ステップS174において、CPU11は、RAM13に記憶された制御変数のStart(移動開始時刻)を消去する。
【0129】
ステップS175において、CPU11は、RAM13に記憶された制御変数のReturn(復帰開始時刻)を参照して、図10のステップS14において更新された現在時刻が、復帰開始時刻を超過したか否かを判定する。CPU11は、この判定がYESの場合、ステップS176に処理を移し、この判定がNOの場合、視点変更処理を終了する。
【0130】
ステップS176において、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusを“−”にすることにより、視点移動状態を復帰中に設定する。また、CPU11は、状態変数の初期値をステップS173において算出した移動フレーム数として、RAM13に記憶させる。
ステップS177において、CPU11は、RAM13に記憶された制御変数のReturn(復帰開始時刻)を消去する。
【0131】
ステップS178において、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusを参照して、視点移動中であるか否かを判定する。具体的には、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusの値が“+”である場合に視点移動中であると判定する。CPU11は、この判定がYESの場合、ステップS179に処理を移し、この判定がNOの場合、ステップS183に処理を移す。
【0132】
ステップS179において、CPU11は、RAM13に記憶された状態変数が、RAM13に記憶された移動フレーム数を超過しているか否かを判定する。CPU11は、この判定がYESの場合、ステップS180に処理を移し、この判定がNOの場合、ステップS182に処理を移す。
ステップS180において、CPU11は、視線ベクトルを回転面上で所定量だけ回転移動させる。具体的には、CPU11は、RAM13に記憶された制御変数のEyeVector[3]を、回転移動するように演算する。
ステップS181において、CPU11は、RAM13に記憶された状態変数の値をインクリメントする。CPU11は、ステップS181の処理が終了すると、視点変更処理を終了する。
【0133】
ステップS182において、CPU11は、視点移動状態を視点停止に設定する。具体的には、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusを“0”にする。また、CPU11は、状態変数をRAM13から消去する。CPU11は、ステップS182の処理が終了すると、視点変更処理を終了する。
【0134】
ステップS183において、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusを参照して、視点復帰中であるか否かを判定する。具体的には、CPU11は、RAM13に記憶された制御変数のAutoAngleStatusの値が“−”である場合に視点移動中であると判定する。CPU11は、この判定がYESの場合、ステップS184に処理を移し、この判定がNOの場合、視点変更処理を終了する。
【0135】
ステップS184において、CPU11は、視線ベクトルを回転面上で所定量だけ逆回転移動させる。具体的には、CPU11は、RAM13に記憶された制御変数のEyeVector[3]を、逆回転移動するように演算する。
ステップS185において、CPU11は、RAM13に記憶された状態変数の値をデクリメントする。CPU11は、ステップS185の処理が終了すると、視点変更処理を終了する。
【0136】
以上のような本実施形態の演奏動作表示装置1によれば、CPU11は、RAM13に記憶されている演奏情報の演奏テクニックフラグに基づいて演奏テクニックの表示を行うか否かを判定し、当該演奏テクニックの表示を行うと判定した場合に、当該演奏テクニックに対応する画像の表示態様を、当該演奏テクニックを表示しない場合に対応する画像の表示態様に比べて変化させる。
これにより、演奏動作表示装置1は、演奏テクニックを表示する場合において、表示態様を変化させることにより、演奏者にとって視認しやすい演奏動作の表示をすることが可能になる。
【0137】
特に、演奏動作表示装置1では、CPU11は、演奏テクニックの表示を行う場合に表示部16に表示する構造データを拡大して描画する。
これにより、演奏動作表示装置1は、演奏テクニックに対応する場面で手や指を拡大表示して、演奏テクニックの動作表示を演奏者にとってより認識しやすくすることができる。また、一連の演奏動作を再生する際に、視野を動作領域にあわせ可能な限り大きな表示にするため、より動作を視認しやすくすることが可能になる。
【0138】
特に、演奏動作表示装置1では、CPU11は、演奏テクニックの表示を行う場合に表示部16に表示する構造データを斜視状態で描画する。
これにより、演奏動作表示装置1は、演奏テクニックに対応する場面で手や指を斜視表示して、真上や真横から演奏テクニックの動作表示をする場合に比べて演奏者にとって認識しやすくすることができる。例えば、演奏テクニックの動作表示に対してアングル等の表示状態を変更するため、特に初心者にとって困難な動作も、視認しやすく、理解しやすい表示をすることが可能になる。
【0139】
なお、本発明は、上述の実施形態に限定されるものではなく、本発明の目的を達成できる範囲での変形、改良等は本発明に含まれるものである。
【0140】
また、上述の実施形態では、本発明が適用される演奏動作表示装置は、演奏動作表示装置1を例として説明したが、特にこれに限定されない。
例えば、本発明は、鍵盤と演奏動作表示機能とを有する電子楽器一般に適用することができる。具体的には、例えば、本発明は、電子ピアノ、電子オルガン等に適用可能である。
【0141】
上述した一連の処理は、ハードウェアにより実行させることもできるし、ソフトウェアにより実行させることもできる。
換言すると、図1の構成は例示に過ぎず、特に限定されない。すなわち、上述した一連の処理を全体として実行できる機能が演奏動作表示装置1に備えられていれば足り、この機能を実現するためにどのような構成を構築するのかは特に図1の例に限定されない。
【0142】
一連の処理をソフトウェアにより実行させる場合には、そのソフトウェアを構成するプログラムが、コンピュータ等にネットワークや記録媒体からインストールされる。
このコンピュータは、専用のハードウェアに組み込まれているコンピュータであってもよい。また、コンピュータは、各種のプログラムをインストールすることで、各種の機能を実行することが可能なコンピュータであってもよい。
【0143】
なお、本明細書において、記録媒体に記録されるプログラムを記述するステップは、その順序に沿って時系列的に行われる処理はもちろん、必ずしも時系列的に処理されなくとも、並列的或いは個別に実行される処理をも含むものである。
また、本明細書において、システムの用語は、複数の装置や複数の手段等より構成される全体的な装置を意味するものとする。
【0144】
以上、本発明の実施形態について説明したが、この実施形態は、例示に過ぎず、本発明の技術的範囲を限定するものではない。本発明はその他の様々な実施形態を取ることが可能であり、さらに、本発明の要旨を逸脱しない範囲で、省略や置換等種々の変更を行うことができる。これら実施形態やその変形は、本明細書等に記載された発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【0145】
以下に、本願の出願当初の特許請求の範囲に記載された発明を付記する。
[付記1]
発音開始時間、発音継続時間、音高、使用する指、及び特定動作の表示を行うためのフラグを格納する演奏情報と、
複数の構造データと、当該構造データ同士の関連性を記憶する構造データと、
前記発音開始時間に対応して複数の前記構造データを表示させる場合の起点となる前記構造データの情報を示す動作情報と、を記憶する記憶手段と、
前記記憶手段に記憶された前記演奏情報、前記動作情報及び前記構造データに基づいて、表示手段に演奏動作画像を描画する描画手段と、を備え、
前記描画手段は、前記記憶手段に記憶されている前記演奏情報の前記フラグに基づいて前記特定動作の表示を行うか否かを判定し、当該特定動作の表示を行うと判定した場合に、当該特定動作に対応する画像の表示態様を、当該特定動作を表示しない場合に対応する画像の表示態様に比べて変化させる、
ことを特徴とする演奏動作表示装置。
[付記2]
前記描画手段は、前記特定動作を行う場合に前記表示手段に表示する構造データを拡大して描画する、
ことを特徴とする付記1記載の演奏動作表示装置。
[付記3]
前記描画手段は、前記特定動作を行う場合に前記表示手段に表示する構造データを斜視状態で描画する、
ことを特徴とする付記1又は2記載の演奏動作表示装置。
[付記4]
演奏動作表示装置が、演奏動作表示を行う方法であって、
前記演奏動作表示装置は、発音開始時間、発音継続時間、音高、使用する指、及び特定動作の表示を行うためのフラグを格納する演奏情報、複数の構造データと、当該構造データ同士の関連性を記憶する構造データ、及び前記発音開始時間に対応して複数の前記構造データを表示させる場合の起点となる前記構造データの情報を示す動作情報を記憶する記憶手段と、を備え、
前記演奏動作表示装置が、前記記憶手段に記憶された前記演奏情報、前記動作情報及び前記構造データに基づいて、表示手段に演奏動作画像を描画する描画ステップを含み、
前記描画ステップにおいて、演奏情報記憶手段に記憶されている前記フラグに基づいて前記特定動作の表示を行うか否かを判定し、当該特定動作の表示を行うと判定した場合に、当該特定動作に対応する画像の表示態様を、当該特定動作を表示しない場合に対応する画像の表示態様に比べて変化させる、
ことを特徴とする方法。
[付記5]
発音開始時間、発音継続時間、音高、使用する指、及び特定動作の表示を行うためのフラグを格納する演奏情報、複数の構造データの関連性を記憶する構造データ、及び前記発音開始時間に対応して複数の前記構造データを表示させる場合の起点となる前記構造データの情報を示す動作情報を記憶する記憶手段と、を備えるコンピュータを、
前記記憶手段に記憶された前記演奏情報、前記動作情報及び前記構造データに基づいて、表示手段に演奏動作画像を描画させる描画手段であって、演奏情報記憶手段に記憶されている前記フラグに基づいて前記特定動作の表示を行うか否かを判定し、当該特定動作の表示を行うと判定した場合に、当該特定動作に対応する画像の表示態様を、当該特定動作を表示しない場合に対応する画像の表示態様に比べて変化させる描画手段、
として機能させることを特徴とするプログラム。
【符号の説明】
【0146】
1・・・演奏動作表示装置、2・・・電子楽器、11・・・CPU、12・・・ROM、13・・・RAM、14・・・バス、15・・・入力部、16・・・表示部、17、21・・・MIDIインターフェース、22・・・鍵盤、23・・・音源・サウンドシステム
【特許請求の範囲】
【請求項1】
発音開始時間、発音継続時間、音高、使用する指、及び特定動作の表示を行うためのフラグを格納する演奏情報と、
複数の構造データと、当該構造データ同士の関連性を記憶する構造データと、
前記発音開始時間に対応して複数の前記構造データを表示させる場合の起点となる前記構造データの情報を示す動作情報と、を記憶する記憶手段と、
前記記憶手段に記憶された前記演奏情報、前記動作情報及び前記構造データに基づいて、表示手段に演奏動作画像を描画する描画手段と、を備え、
前記描画手段は、前記記憶手段に記憶されている前記演奏情報の前記フラグに基づいて前記特定動作の表示を行うか否かを判定し、当該特定動作の表示を行うと判定した場合に、当該特定動作に対応する画像の表示態様を、当該特定動作を表示しない場合に対応する画像の表示態様に比べて変化させる、
ことを特徴とする演奏動作表示装置。
【請求項2】
前記描画手段は、前記特定動作を行う場合に前記表示手段に表示する構造データを拡大して描画する、
ことを特徴とする請求項1記載の演奏動作表示装置。
【請求項3】
前記描画手段は、前記特定動作を行う場合に前記表示手段に表示する構造データを斜視状態で描画する、
ことを特徴とする請求項1又は2記載の演奏動作表示装置。
【請求項4】
演奏動作表示装置が、演奏動作表示を行う方法であって、
前記演奏動作表示装置は、発音開始時間、発音継続時間、音高、使用する指、及び特定動作の表示を行うためのフラグを格納する演奏情報、複数の構造データと、当該構造データ同士の関連性を記憶する構造データ、及び前記発音開始時間に対応して複数の前記構造データを表示させる場合の起点となる前記構造データの情報を示す動作情報を記憶する記憶手段と、を備え、
前記演奏動作表示装置が、前記記憶手段に記憶された前記演奏情報、前記動作情報及び前記構造データに基づいて、表示手段に演奏動作画像を描画する描画ステップを含み、
前記描画ステップにおいて、演奏情報記憶手段に記憶されている前記フラグに基づいて前記特定動作の表示を行うか否かを判定し、当該特定動作の表示を行うと判定した場合に、当該特定動作に対応する画像の表示態様を、当該特定動作を表示しない場合に対応する画像の表示態様に比べて変化させる、
ことを特徴とする方法。
【請求項5】
発音開始時間、発音継続時間、音高、使用する指、及び特定動作の表示を行うためのフラグを格納する演奏情報、複数の構造データの関連性を記憶する構造データ、及び前記発音開始時間に対応して複数の前記構造データを表示させる場合の起点となる前記構造データの情報を示す動作情報を記憶する記憶手段と、を備えるコンピュータを、
前記記憶手段に記憶された前記演奏情報、前記動作情報及び前記構造データに基づいて、表示手段に演奏動作画像を描画させる描画手段であって、演奏情報記憶手段に記憶されている前記フラグに基づいて前記特定動作の表示を行うか否かを判定し、当該特定動作の表示を行うと判定した場合に、当該特定動作に対応する画像の表示態様を、当該特定動作を表示しない場合に対応する画像の表示態様に比べて変化させる描画手段、
として機能させることを特徴とするプログラム。
【請求項1】
発音開始時間、発音継続時間、音高、使用する指、及び特定動作の表示を行うためのフラグを格納する演奏情報と、
複数の構造データと、当該構造データ同士の関連性を記憶する構造データと、
前記発音開始時間に対応して複数の前記構造データを表示させる場合の起点となる前記構造データの情報を示す動作情報と、を記憶する記憶手段と、
前記記憶手段に記憶された前記演奏情報、前記動作情報及び前記構造データに基づいて、表示手段に演奏動作画像を描画する描画手段と、を備え、
前記描画手段は、前記記憶手段に記憶されている前記演奏情報の前記フラグに基づいて前記特定動作の表示を行うか否かを判定し、当該特定動作の表示を行うと判定した場合に、当該特定動作に対応する画像の表示態様を、当該特定動作を表示しない場合に対応する画像の表示態様に比べて変化させる、
ことを特徴とする演奏動作表示装置。
【請求項2】
前記描画手段は、前記特定動作を行う場合に前記表示手段に表示する構造データを拡大して描画する、
ことを特徴とする請求項1記載の演奏動作表示装置。
【請求項3】
前記描画手段は、前記特定動作を行う場合に前記表示手段に表示する構造データを斜視状態で描画する、
ことを特徴とする請求項1又は2記載の演奏動作表示装置。
【請求項4】
演奏動作表示装置が、演奏動作表示を行う方法であって、
前記演奏動作表示装置は、発音開始時間、発音継続時間、音高、使用する指、及び特定動作の表示を行うためのフラグを格納する演奏情報、複数の構造データと、当該構造データ同士の関連性を記憶する構造データ、及び前記発音開始時間に対応して複数の前記構造データを表示させる場合の起点となる前記構造データの情報を示す動作情報を記憶する記憶手段と、を備え、
前記演奏動作表示装置が、前記記憶手段に記憶された前記演奏情報、前記動作情報及び前記構造データに基づいて、表示手段に演奏動作画像を描画する描画ステップを含み、
前記描画ステップにおいて、演奏情報記憶手段に記憶されている前記フラグに基づいて前記特定動作の表示を行うか否かを判定し、当該特定動作の表示を行うと判定した場合に、当該特定動作に対応する画像の表示態様を、当該特定動作を表示しない場合に対応する画像の表示態様に比べて変化させる、
ことを特徴とする方法。
【請求項5】
発音開始時間、発音継続時間、音高、使用する指、及び特定動作の表示を行うためのフラグを格納する演奏情報、複数の構造データの関連性を記憶する構造データ、及び前記発音開始時間に対応して複数の前記構造データを表示させる場合の起点となる前記構造データの情報を示す動作情報を記憶する記憶手段と、を備えるコンピュータを、
前記記憶手段に記憶された前記演奏情報、前記動作情報及び前記構造データに基づいて、表示手段に演奏動作画像を描画させる描画手段であって、演奏情報記憶手段に記憶されている前記フラグに基づいて前記特定動作の表示を行うか否かを判定し、当該特定動作の表示を行うと判定した場合に、当該特定動作に対応する画像の表示態様を、当該特定動作を表示しない場合に対応する画像の表示態様に比べて変化させる描画手段、
として機能させることを特徴とするプログラム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26】
【公開番号】特開2013−97089(P2013−97089A)
【公開日】平成25年5月20日(2013.5.20)
【国際特許分類】
【出願番号】特願2011−238333(P2011−238333)
【出願日】平成23年10月31日(2011.10.31)
【出願人】(000001443)カシオ計算機株式会社 (8,748)
【Fターム(参考)】
【公開日】平成25年5月20日(2013.5.20)
【国際特許分類】
【出願日】平成23年10月31日(2011.10.31)
【出願人】(000001443)カシオ計算機株式会社 (8,748)
【Fターム(参考)】
[ Back to top ]