以下、図面を参照して本発明の実施形態について説明する。
A.全体構成
図1は、本発明の実施の一形態による演奏練習装置100の全体構成を示すブロック図である。この図において、CPU10は、MIDIインタフェース15を介して外部のMIDI楽器20から入力される演奏情報(MIDIイベント)に基づき音源16に楽音発生を指示する通常の楽器機能の他に、演奏練習機能を具備する。演奏練習機能とは、演奏練習する曲の楽譜を表示すると共に、ユーザが演奏練習として弾いた音の正誤や弾いた音と楽譜中の音符との対応関係を、表示された楽譜上で一目瞭然にする機能を指す。こうした本発明の要旨に係わるCPU10の演奏練習機能については追って詳述する。
ROM11は、図2に図示するように、プログラムエリアPEおよび画像データエリアIEを備える。ROM11のプログラムエリアPEには、CPU10にロードされる各種の制御プログラムが記憶される。各種の制御プログラムとは、後述のメインルーチンおよび当該メインルーチンからコールされる描画処理を含む。
描画処理は、楽譜画像描画処理および押鍵状態描画処理から構成される。押鍵状態描画処理は、描画範囲取得処理、パート境界音取得処理、該当音検索処理および状態描画処理を含む。状態描画処理は、音高線描画処理を含む。音高線描画処理は、五線情報取得処理、五線座標取得処理および補助線描画処理を含む。補助線描画処理は、五線上部の補助線描画処理および五線下部の補助線描画処理を含む。
ROM11の画像データエリアIEには、例えば小節線や五線、ト音記号など楽譜表示に用いる各種画像データBitmap[0]〜Bitmap[N]が記憶される。1つの画像データBitmapは、ビットマップ形式の画像データ本体、当該画像データ本体の表示サイズを表す幅Wおよび高さHから構成される。
RAM13は、図3に図示するように、CPU10の処理に用いられる各種レジスタ・フラグデータを一時記憶するワークエリアWEの他、楽譜制御データエリアscoreCtrl、小節データエリアME、演奏データエリアPEおよび五線テーブルFTを備える。ワークエリアWEを除く上記各エリアに格納される主要なデータ構成については追って述べる。
操作部13は、装置動作を終了させる終了スイッチや、楽器機能又は演奏練習機能の何れかを選択して実行指示する機能選択スイッチ等を備え、各スイッチ操作に応じたスイッチイベントを発生してCPU10に供給する。表示部14は、CPU10の制御の下に、演奏練習する曲の楽譜を表示すると共に、ユーザが演奏練習として弾いた音の正誤や弾いた音と楽譜中の音符との対応関係を、楽譜上に表示する。
MIDIインタフェース部15は、ユーザの演奏操作に応じて、外部のMIDI楽器20から出力される演奏情報(MIDIイベント)を、CPU10の制御の下に取り込む。音源16は、公知の波形メモリ読み出し方式で構成され、CPU10の制御の下に、MIDIインタフェース部15を介して取り込まれた演奏情報(MIDIイベント)に応じた楽音データを発生する。サウンドシステム17は、音源16が生成した楽音データをアナログ形式の楽音信号に変換すると共に、その楽音信号に対してノイズ除去やレベル制御を施した後、スピーカから楽音として発音させる。
B.RAM13のデータ構成
次に、図4〜図7を参照してRAM12の楽譜制御データエリアscoreCtrl、小節データエリアME、演奏データエリアPEおよび五線テーブルFTにそれぞれ格納される各種データの構成について説明する。
(1)楽譜制御データエリアscoreCtrlの構成
図4は、RAM12が備える楽譜制御データエリアscoreCtrlのデータ構成を示すメモリマップである。図4において、レジスタnowPageには、画面に表示される楽譜のページ番号がストアされる。レジスタnowMeasには、小節番号で表されるカーソル位置がストアされる。レジスタscrXには、画面に表示される楽譜のx方向表示開始座標値がストアされる。なお、x方向とは、画面の横方向を指す。レジスタscrYには、画面に表示される楽譜のy方向表示開始座標値がストアされる。なお、y方向とは、画面の縦方向を指す。従って、座標値(scrX,scrY)により画面に表示される楽譜の表示開始位置が決まる。
レジスタscrSXには、画面に表示される楽譜の表示幅がストアされる。レジスタscrSYには、画面に表示される楽譜の表示長(表示高)がストアされる。レジスタPageCountには、楽譜の表示ページ数がストアされる。レジスタBitmap[PageCount]は、ROM11の画像データエリアIE(図2参照)に記憶される各種画像データBitmap[0]〜Bitmap[N]の中から、レジスタPageCountの表示ページに対応付けられた画像データ(元画像)を指定する。
レジスタScaleには、元画像に対する表示倍率がストアされる。レジスタxには、元画像のx方向表示開始座標値がストアされる。レジスタyには、元画像のy方向表示開始座標値がストアされる。ノートオンフラグNoteOn[0]〜[127]には、対応するノートナンバ(鍵番号)がノートオン(押鍵)された場合に「1」がセット、ノートオフ(離鍵)された場合にゼロリセットされるフラグである。
(2)小節データエリアMEの構成
図5は、RAM12が備える小節データエリアMEのデータ構成を示すメモリマップである。小節データエリアMEには、演奏練習に供する曲を構成する複数の小節データMeas[0]〜[N]がストアされる。小節データMeasは、レジスタPage、レジスタRect、レジスタShelf、レジスタKeySign、レジスタClef[2]およびレジスタLine[PART][INDEX]から構成される。
レジスタPageには、楽譜表示されるページ番号がストアされる。レジスタRectには、小節の範囲を規定する矩形座標値がストアされる。矩形座標値は、矩形の左端Left、上端Top、右端Rightおよび下端Bottomからなる。レジスタShelfには、段番号がストアされる。レジスタKeySignには、演奏練習に供する曲の調号を表す調号番号がストアされる。調号番号は、ハ長調を「0(調号無し)」とした場合に、シャープ♯の数(+1〜+7)およびフラット♭の数(−1〜−7)に基づき「−7」から「+7」までの都合15種で表す。
レジスタClef[2]には、「+1」でト音記号(通常)、「+2」でト音記号(オクターブ下げ)、「+3」でト音記号(オクターブ上げ)、「−1」でヘ音記号(通常)、「−2」でヘ音記号(オクターブ下げ)、「−3」でヘ音記号(オクターブ上げ)をそれぞれ表す音部番号がストアされる。なお、Clef[0]とClef[1]は、それぞれ右手パートと左手パート(大譜表の上段と下段)の五線の音部記号を表す音部番号がストアされる。
レジスタLine[PART][INDEX]には、元画像においてパートPARTおよび五線INDEXで指定される五線譜中の線のy座標値がストアされる。ここで、パートPARTは「0」の場合に右手パートを表し、「1」の場合に左手パートを表す。五線INDEXは、「0」で第5線、「1」で第4線、「2」で第3線、「3」で第2線、「4」で第1線をそれぞれ指定する。
したがって、図5に図示する一例の楽譜の場合、レジスタLine[0][0]には右手パート第5線のy座標値、レジスタLine[0][1]には右手パート第4線のy座標値、レジスタLine[0][2]には右手パート第3線のy座標値、レジスタLine[0][3]には右手パート第2線のy座標値、レジスタLine[0][4]には右手パート第1線のy座標値がそれぞれストアされる。
さらに、レジスタLine[1][0]には左手パート第5線のy座標値、レジスタLine[1][1]には左手パート第4線のy座標値、レジスタLine[1][2]には左手パート第3線のy座標値、レジスタLine[1][3]には左手パート第2線のy座標値、レジスタLine[1][4]には左手パート第1線のy座標値がそれぞれストアされる。
(3)演奏データエリアPEの構成
図6は、RAM12が備える演奏データエリアPEのデータ構成を示すメモリマップである。演奏データエリアPEには、演奏練習に供する曲の各音符を表す演奏データNote[0]〜[N]がストアされる。演奏データNoteは、発音開始時間Time、音長Gate(発音継続時間)、音高Pitch、パート番号Hand、小節番号Meas、玉座標xおよび玉座標yから構成される。
発音開始時間Timeは、曲頭からの経過時間で表現される。パート番号Handは、「0」の場合に右手パートの音符を表し、「1」の場合に左手パートの音符を表す。小節番号Measは、音符が含まれる小節の番号を表し、上述した小節データMeas[小節番号]を指定する。玉座標xおよび玉座標yは、元画像における音符の玉の座標位置を表す。
(3)五線テーブルFTの構成
図7は、RAM12が備える五線テーブルFTのデータ構成を示すメモリマップである。五線テーブルFTは、ノートナンバ(鍵番号)#48〜#71までの2オクターブ分の各音高についてト音記号表記した際の五線上の位置を、15種類の調号毎に定義したデータテーブルである。五線テーブルFTは、15種類の調号に対応付けられたデータbarline[0]〜[14]から構成される。なお、データbarline[7]はハ長調に相当する。
1つのデータbarlineは、ノートナンバ#48〜#71までの2オクターブ分の各音高の五線上の位置tonepos[0(#48)]〜[23(#71)]から構成される。さらに、五線上の位置toneposは、五線インデックスline、五線間フラグintervalおよび臨時記号accidentalを有する。
なお、五線インデックスlineは、五線譜の一番上の第5線を「0」として、対応する音高の五線位置を指定する。五線間フラグintervalは、「0」の場合に五線上を表し、「1」の場合に五線の間を表す。臨時記号accidentalは、「0」の場合に無し、「1」の場合にフラット♭、「2」の場合にダブルフラット♭♭、「3」の場合にナチュラル、「4」の場合にシャープ♯、「5」の場合にダブルシャープ♯♯をそれぞれ表す。
従って、例えば現在の曲の調がハ長調であるときにノートナンバ#60(C4音)の五線上の位置を求める場合には、五線テーブルFTからデータbarline[7]における位置tonepos[12]を読み出し、これにより五線インデックスlineが「5」、五線間フラグintervalが「0」、臨時記号accidentalが「0」となる。
C.動作
次に、図8〜図24を参照して上記構成による演奏練習装置100の動作について説明する。以下では、演奏練習装置100のCPU10が実行するメインルーチンおよび当該メインルーチンからコールされる描画処理の各動作を説明する。
なお、描画処理は、楽譜画像描画処理および押鍵状態描画処理から構成される。押鍵状態描画処理は、描画範囲取得処理、パート境界音取得処理、該当音検索処理および状態描画処理を含む。状態描画処理は、音高線描画処理を含む。音高線描画処理は、五線情報取得処理、五線座標取得処理および補助線描画処理を含む。補助線描画処理は、五線上部の補助線描画処理および五線下部の補助線描画処理を含む。
(1)メインルーチンの動作
図8は、メインルーチンの動作を示すフローチャートである。演奏練習装置100では、機能選択スイッチの操作により演奏練習装置100の機能を演奏練習機能に切り替えた場合にメインルーチンが実行される。メインルーチンが実行されると、CPU10は、図8に図示するステップSA1に処理を進め、RAM12のワークエリアWEに格納される各種レジスタやフラグデータをゼロリセットしたり初期値セットしたりする等のイニシャライズを行う。
イニシャライズが完了すると、ステップSA2に進み、終了スイッチの操作により終了指示されたか否かを判断する。終了指示されていなければ、判断結果は「NO」になり、ステップSA3に進む。ステップSA3では、ノートオン入力の有無、すなわちMIDIインタフェース15を介して外部のMIDI楽器20から押鍵操作に応じたノートオンイベントが入力されたかどうかを判断する。
押鍵操作に応じたノートオンイベントが入力されると、上記ステップSA3の判断結果は「YES」となり、ステップSA4に進み、その入力されたノートオンイベントに含まれるノートナンバ、つまり押鍵された鍵の音高をレジスタpにストアする。そして、続くステップSA5では、楽譜制御データエリアscoreCtrl(図4参照)のノートオンフラグNoteOn[0]〜[127]の内、レジスタpの音高に対応したノートオンフラグNoteOn[p]に「1」をセットした後、後述のステップSA9に処理を進める。
一方、押鍵操作に応じたノートオンイベントが入力されなければ、上記ステップSA3の判断結果は「NO」になり、ステップSA6に進む。ステップSA6では、ノートオフ入力の有無、すなわちMIDIインタフェース15を介して外部のMIDI楽器20から離鍵操作に応じたノートオフイベントが入力されたかどうかを判断する。離鍵操作に応じたノートオフイベントが入力されなければ、判断結果は「NO」になり、後述のステップSA9に処理を進める。
これに対し、離鍵操作に応じたノートオフイベントが入力されると、上記ステップSA6の判断結果は「YES」となり、ステップSA7に進み、その入力されたノートオフイベントに含まれるノートナンバ、つまり離鍵された鍵の音高をレジスタpにストアする。次いで、ステップSA8では、楽譜制御データエリアscoreCtrl(図4参照)のノートオンフラグNoteOn[0]〜[127]の内、レジスタpの音高に対応したノートオンフラグNoteOn[p]をゼロリセットした後、ステップSA9に処理を進める。
そして、ステップSA9では、描画処理を実行する。描画処理では、後述するように、現在表示すべき楽譜のページに相当する元画像(楽譜の画像データ)をROM11の画像データエリアIE(図2参照)から読み出し、読み出した元画像(楽譜の画像データ)を表示画面(ディスプレイ)の表示サイズに合わせて描画する。この後、現在の小節(表示された楽譜においてカーソルが位置する小節)の段番号を、RAM12の小節データエリアMEから取得し、取得した段番号と同じ段の開始小節番号および終了小節番号を描画範囲として取得する。
開始小節番号から終了小節番号までの描画範囲が定まると、その描画範囲内のパート境界音(右手パート最低音および左手パート最高音)を特定し、右手パート最低音が左手パート最高音より高く、かつ右手パート最低音と左手パート最高音との間(ギャップ)にノートナンバ#60(C4音)が含まれる場合であれば、右手パート最低音および左手パート最高音を「ノートナンバ#60(C4音)」に設定し、右手パート最低音が左手パート最高音より高く、かつ左手パート最高音がノートナンバ#60(C4音)以上もしくは右手パート最低音がノートナンバ#60(C4音)以下の場合であれば、右手パート最低音を左手パート最高音の一つ上の音に設定する。
続いて、RAM12の楽譜制御データエリアscoreCtrl(図4参照)のノートオンフラグNoteOn[0]〜[127]の中からノートオンフラグNoteOn[p]が「1」、つまり押鍵音のノートナンバを検索した後、描画範囲内の音符であって、かつ押鍵音と同じ音高(ノートナンバ)の演奏データNoteを探し出し、該当する演奏データNoteに対応する音符の玉を該当マーク(○印)で囲んで表示することで該当音として表現し、この該当音が右手パートに含まれる場合には右検知フラグをセットし、左手パートに含まれる場合には左検知フラグをセットする。
続いて、描画小節内に押鍵音と同じ音高の該当音が右手パート(又は左手パート)に含まれ、右検知フラグ(又は左検知フラグ)がセットされていれば、描画色を該当色に設定し、描画パートを右(又は左)に設定した後、描画音高(ポインタpで指定されるノートナンバ(鍵番号))を含む描画小節の小節データMeasから得た調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得し、取得した五線番号lnの音高座標yに基づいて補助線を描画する他、描画小節内に描画音高より半音下(又は半音上)であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音が存在する場合、その音の表示位置に半音下がるマーク「<」(又は半音上がるマーク「>」)を描画する。
一方、右/左検知フラグが何れも立っていなければ、描画色を非該当色に設定し、描画音高が右手パート最低音を上回れば描画パートを右手パートに設定し、描画音高が左手パート最高音を下回れば描画パートを左手パートに設定した後、描画音高(ポインタpで指定されるノートナンバ(鍵番号))を含む描画小節の小節データMeasから得た調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得し、取得した五線番号lnの音高座標yに基づいて補助線を描画する他、描画小節内に描画音高より半音下(又は半音上)であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音が存在する場合、その音の表示位置に半音下がるマーク「<」(又は半音上がるマーク「>」)を描画する。
さて、こうした描画処理を終えると、CPU10は前述のステップSA2に処理を戻す。そして、ユーザによる終了スイッチ操作で終了指示されると、上記ステップSA2の判断結果が「YES」になり、本メインルーチンを終える。
(2)描画処理の動作
次に、図9を参照して描画処理の動作を説明する。上述したメインルーチンのステップSA9(図8参照)を介して本処理が実行されると、CPU10は、図9に図示するステップSB1の楽譜画像描画処理を実行する。楽譜画像描画処理では、後述するように、現在表示すべき楽譜のページに相当する元画像(楽譜の画像データ)をROM11の画像データエリアIE(図2参照)から読み出し、読み出した元画像(楽譜の画像データ)を表示画面(ディスプレイ)の表示サイズに合わせて描画する。
そして、ステップSB2を介して押鍵状態描画処理を実行する。押鍵状態描画処理では、後述するように、現在の小節(表示された楽譜においてカーソルが位置する小節)の段番号を、RAM12の小節データエリアMEから取得し、取得した段番号と同じ段の開始小節番号および終了小節番号を描画範囲として取得する。そして、描画範囲内におけるパート境界音(右手パート最低音および左手パート最高音)を特定する。
右手パート最低音が左手パート最高音より高く、かつ右手パート最低音と左手パート最高音との間(ギャップ)にノートナンバ#60(C4音)が含まれる場合には、右手パート最低音および左手パート最高音を「ノートナンバ#60(C4音)」に設定する。右手パート最低音が左手パート最高音より高く、かつ左手パート最高音がノートナンバ#60(C4音)以上もしくは右手パート最低音がノートナンバ#60(C4音)以下の場合には、右手パート最低音を左手パート最高音の一つ上の音に設定する。
次に、RAM12の楽譜制御データエリアscoreCtrl(図4参照)のノートオンフラグNoteOn[0]〜[127]の中からノートオンフラグNoteOn[p]が「1」、つまり押鍵音のノートナンバを検索した後、描画範囲内の音符であって、かつ押鍵音と同じ音高の演奏データNoteを探し出し、該当する演奏データNoteに対応する音符の玉を該当マーク(○印)で囲んで該当音として表現し、この該当音が右手パートに含まれる場合には右検知フラグをセットし、左手パートに含まれる場合には左検知フラグをセットする。
続いて、描画小節内に押鍵音と同じ音高の該当音が右手パート(又は左手パート)に含まれ、右検知フラグ(又は左検知フラグ)がセットされていれば、描画色を該当色に設定し、描画パートを右(又は左)に設定した後、描画音高(ポインタpで指定されるノートナンバ(鍵番号))を含む描画小節の小節データMeasから得た調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得し、取得した五線番号lnの音高座標yに基づいて補助線を描画する他、描画小節内に描画音高より半音下(又は半音上)であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音が存在する場合、その音の表示位置に半音下がるマーク「<」(又は半音上がるマーク「>」)を描画する。
一方、右/左検知フラグが何れも立っていなければ、描画色を非該当色に設定し、描画音高が右手パート最低音を上回れば描画パートを右手パートに設定し、描画音高が左手パート最高音を下回れば描画パートを左手パートに設定した後、描画音高(ポインタpで指定されるノートナンバ(鍵番号))を含む描画小節の小節データMeasから得た調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得し、取得した五線番号lnの音高座標yに基づいて補助線を描画する他、描画小節内に描画音高より半音下(又は半音上)であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音が存在する場合、その音の表示位置に半音下がるマーク「<」(又は半音上がるマーク「>」)を描画する。
(3)楽譜画像描画処理の動作
次に、図10を参照して楽譜画像描画処理の動作を説明する。上述した描画処理のステップSB1(図9参照)を介して本処理が実行されると、CPU10は、図10に図示するステップSC1に処理を進め、楽譜制御データエリアscoreCtrl(図4参照)のレジスタnowPageにストアされる楽譜のページ番号を現在ページpgにセットする。
続いて、ステップSC2では、楽譜制御データエリアscoreCtrlのレジスタscrXにストアされるx方向表示開始座標値と、レジスタscrYにストアされるy方向表示開始座標値とをそれぞれ座標位置scrX、座標位置scrYにセットする。また、楽譜制御データエリアscoreCtrlのレジスタscrSXにストアされる楽譜の表示幅と、レジスタscrSYにストアされる楽譜の表示長とをそれぞれ表示幅scrSX、表示長scrSYにセットする。
次いで、ステップSC3では、楽譜制御データエリアscoreCtrlのレジスタxにストアされる元画像のx方向表示開始座標値を元画像表示開始位置xにセットし、レジスタyにストアされる元画像のy方向表示開始座標値を元画像表示開始位置yにセットする。
そして、ステップSC4では、現在ページpgに対応して楽譜制御データエリアscoreCtrlのレジスタBitmap[pg]により指定されるROM11の画像データエリアIE(図2参照)中の画像データBitmap[pg]の高さHに、楽譜制御データエリアscoreCtrlのレジスタScaleにストアされる表示倍率を乗算して画像領域の高さhを算出する。続いて、ステップSC5では、上記ステップSC4で算出した画像領域の高さhに、表示幅scrSX/表示長scrSYを乗算して画像領域の幅wを算出する。
次いで、ステップSC6では、元画像の矩形領域(x,y,x+w,y+h)を、ディスプレイの矩形領域(scrX,scrY,scrX+scrSX,scrY+scrSY)に表示する。なお、矩形領域(x,y,x+w,y+h)とは、対角座標(元画像表示開始位置x,元画像表示開始位置y)および対角座標(元画像表示開始位置x+画像領域の幅w,元画像表示開始位置y+画像領域の高さh)で定まる領域である。また、矩形領域(scrX,scrY,scrX+scrSX,scrY+scrSY)とは、対角座標(座標位置scrX,座標位置scrY)および対角座標(座標位置scrX+表示幅scrSX,座標位置scrY+表示長scrSY)で定まる領域である。
このように、楽譜画像描画処理では、現在表示すべき楽譜のページに相当する元画像(楽譜の画像データ)をROM11の画像データエリアIE(図2参照)から読み出し、読み出した元画像(楽譜の画像データ)を表示画面(ディスプレイ)の表示サイズに合わせて楽譜画像として描画する。
(4)押鍵状態描画処理の動作
次に、図11を参照して押鍵状態描画処理の動作を説明する。前述した描画処理のステップSB2(図9参照)を介して本処理が実行されると、CPU10は、図11に図示するステップSD1に処理を進め、描画範囲取得処理を実行する。描画範囲取得処理では、後述するように、現在の小節(表示された楽譜においてカーソルが位置する小節)の段番号を、RAM12が備える小節データエリアMEから取得し、取得した段番号と同じ段の開始小節番号および終了小節番号を描画範囲として取得する。
次いで、ステップSD2では、パート境界音取得処理を実行する。パート境界音取得処理では、後述するように、描画範囲取得処理で取得された描画範囲内における右手パート最低音および左手パート最高音を特定し、右手パート最低音が左手パート最高音より高く、かつ右手パート最低音と左手パート最高音との間(ギャップ)にノートナンバ#60(C4音)が含まれる場合には、右手パート最低音および左手パート最高音を「ノートナンバ#60(C4音)」に設定し、右手パート最低音が左手パート最高音より高く、かつ左手パート最高音がノートナンバ#60(C4音)以上もしくは右手パート最低音がノートナンバ#60(C4音)以下の場合には、右手パート最低音を左手パート最高音の一つ上の音に設定する。
そして、ステップSD3に進むと、ポインタpをゼロリセットし、続くステップSD4では、ポインタpが「128」より小さいか否か、すなわちRAM12の楽譜制御データエリアscoreCtrl(図4参照)のノートオンフラグNoteOn[0]〜[127]の全てについて検索し終えたかどうかを判断する。検索し終えていなければ、判断結果は「YES」になり、ステップSD5に進む。
ステップSD5では、ポインタpで指定する楽譜制御データエリアscoreCtrlのノートオンフラグNoteOn[p]が「1」、つまりポインタpで指定するノートナンバの鍵が押鍵中であるかどうかを判断する。ポインタpで指定するノートオンフラグNoteOn[p]が「0」(離鍵状態)ならば、判断結果は「NO」になり、ステップSD8に進み、ポインタpをインクリメントして歩進させた後、上記ステップSD4に処理を戻す。
そして、例えば歩進されたポインタpが指定するノートオンフラグNoteOn[p]が「1」(押鍵中)であると、上記ステップSD5の判断結果が「YES」になり、ステップSD6を介して該当音検索処理を実行する。
該当音検索処理では、後述するように、描画範囲内の音符であって、かつ押鍵音と同じ音高の演奏データNoteを探し出し、該当する演奏データNoteに対応する音符の玉を該当マーク(○印)で囲んで該当音として表現し、この該当音が右手パートに含まれる場合には右検知フラグをセットし、左手パートに含まれる場合には左検知フラグをセットする。
続いて、ステップSD7では、状態描画処理を実行する。状態描画処理では、後述するように、描画小節内に押鍵音と同じ音高の該当音が右手パート(又は左手パート)に含まれ、右検知フラグ(又は左検知フラグ)がセットされていれば、描画色を該当色(例えば青色)に設定し、描画パートを右(又は左)に設定した後、描画音高(ポインタpで指定されるノートナンバ(鍵番号))を含む描画小節の小節データMeasから得た調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得し、取得した五線番号lnの音高座標yに基づいて補助線を描画する他、描画小節内に描画音高より半音下(又は半音上)であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音が存在する場合、その音の表示位置に半音下がるマーク「<」(又は半音上がるマーク「>」)を描画する。
一方、右/左検知フラグが何れも立っていなければ、描画色を非該当色(例えば赤色)に設定し、描画音高が右手パート最低音を上回れば描画パートを右手パートに設定し、描画音高が左手パート最高音を下回れば描画パートを左手パートに設定した後、描画音高(ポインタpで指定されるノートナンバ(鍵番号))を含む描画小節の小節データMeasから得た調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得し、取得した五線番号lnの音高座標yに基づいて補助線を描画する他、描画小節内に描画音高より半音下(又は半音上)であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音が存在する場合、その音の表示位置に半音下がるマーク「<」(又は半音上がるマーク「>」)を描画する。
こうした状態描画処理が完了すると、ステップSD8に進み、ポインタpをインクリメントして歩進させた後、上述のステップSD4に処理を戻す。以後、歩進されたポインタpに応じて、RAM12の楽譜制御データエリアscoreCtrl(図4参照)のノートオンフラグNoteOn[0]〜[127]の全てについて検索し終える迄、上述したステップSD4〜SD8を繰り返す。そして、歩進されたポインタpが「128」を超え、ノートオンフラグNoteOn[0]〜[127]の全てについて検索し終えると、ステップSD4の判断結果が「NO」になり、本処理を終える。
以上のように、押鍵状態描画処理では、先ず現在の小節(表示された楽譜においてカーソルが位置する小節)の段番号を、RAM12が備える小節データエリアMEから取得し、取得した段番号と同じ段の開始小節番号および終了小節番号を描画範囲として取得する。
次に、取得した描画範囲内におけるパート境界音(右手パート最低音および左手パート最高音)を特定し、右手パート最低音が左手パート最高音より高く、かつ右手パート最低音と左手パート最高音との間(ギャップ)にノートナンバ#60(C4音)が含まれる場合には、右手パート最低音および左手パート最高音を「ノートナンバ#60(C4音)」に設定し、右手パート最低音が左手パート最高音より高く、かつ左手パート最高音がノートナンバ#60(C4音)以上もしくは右手パート最低音がノートナンバ#60(C4音)以下の場合には、右手パート最低音を左手パート最高音の一つ上の音に設定する。
続いて、RAM12の楽譜制御データエリアscoreCtrl(図4参照)のノートオンフラグNoteOn[0]〜[127]の中からノートオンフラグNoteOn[p]が「1」、つまり押鍵音のノートナンバを検索した後、描画範囲内の音符であって、かつ押鍵音と同じ音高の演奏データNoteを探し出し、該当する演奏データNoteに対応する音符の玉を該当マーク(○印)で囲んで該当音として表現し、この該当音が右手パートに含まれる場合には右検知フラグをセットし、左手パートに含まれる場合には左検知フラグをセットする。
次いで、描画小節内に押鍵音と同じ音高の該当音が右手パート(又は左手パート)に含まれ、右検知フラグ(又は左検知フラグ)がセットされていれば、描画色を該当色に設定し、描画パートを右(又は左)に設定した後、描画音高(ポインタpで指定されるノートナンバ(鍵番号))を含む描画小節の小節データMeasから得た調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得し、取得した五線番号lnの音高座標yに基づいて補助線を描画する他、描画小節内に描画音高より半音下(又は半音上)であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音が存在する場合、その音の表示位置に半音下がるマーク「<」(又は半音上がるマーク「>」)を描画する。
一方、右/左検知フラグが何れも立っていなければ、描画色を非該当色(例えば赤色)に設定し、描画音高が右手パート最低音を上回れば描画パートを右手パートに設定し、描画音高が左手パート最高音を下回れば描画パートを左手パートに設定した後、描画音高(ポインタpで指定されるノートナンバ(鍵番号))を含む描画小節の小節データMeasから得た調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得し、取得した五線番号lnの音高座標yに基づいて補助線を描画する他、描画小節内に描画音高より半音下(又は半音上)であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音が存在する場合、その音の表示位置に半音下がるマーク「<」(又は半音上がるマーク「>」)を描画する。
(5)描画範囲取得処理の動作
次に、図12を参照して描画範囲取得処理の動作を説明する。上述した押鍵状態描画処理のステップSD1(図11参照)を介して本処理が実行されると、CPU10は、図12に図示するステップSE1に処理を進め、(描画)開始小節番号および(描画)終了小節番号を検索用変数に設定する。
次いで、ステップSE2では、現在の小節(表示された楽譜においてカーソルが位置する小節)の段番号を、RAM12が備える小節データエリアMEから取得する。具体的には、カーソル位置を含む矩形座標値Rectを有する小節データMeasを検索し、該当する小節データMeasの段番号Shelfを取得する。
そして、ステップSE3では、検索用変数を現在の小節番号の一つ前に設定し、続くステップSE4では、設定された検索用変数(現在の小節番号−1)が曲先頭を超過していないかどうかを判断する。曲先頭を超過していなければ、判断結果は「YES」になり、ステップSE5に進む。ステップSE5では、検索中の小節の段番号が、上記ステップSE2で取得した現在の小節の段番号と一致するか否かを判断する。
検索中の小節の段番号が、現在の小節の段番号と一致する場合には、判断結果が「YES」となり、ステップSE6に進み、(描画)開始小節番号を検索用変数に更新する。そして、ステップSE7に進み、検索用変数をデクリメントした後、上述のステップSE7に処理を戻す。
以後、ステップSE4〜SE7では、検索中の小節(検索用変数で指定される小節)の段番号が現在の小節の段番号と一致する毎に、(描画)開始小節番号を検索用変数に更新すると共に、検索用変数をデクリメントする処理を、当該デクリメントされた検索用変数が曲先頭を超過するまで繰り返すことによって(描画)開始小節番号を探し出す。つまり、検索中の小節と同じ段の小節のうちで、最も先(楽譜で左)に位置する小節を、検索用変数を1づつデクリメントしながら、検索中の小節と同じ段であるか否かを判断して、(描画)開始小節番号を探しているものである。
さて一方、上記ステップSE4〜SE7の処理によって(描画)開始小節番号を探し終えると、検索用変数が曲先頭を超過するか、あるいは検索中の小節の段番号が現在の小節の段番号と不一致になり、これにより上記ステップSE4又はSE5の何れかの判断結果が「NO」になり、ステップSE8に進む。
ステップSE8では、検索用変数を現在の小節番号の一つ先に設定し、続くステップSE9では、設定された検索用変数(現在の小節番号+1)が曲末尾を超過していないかどうかを判断する。曲末尾を超過していなければ、判断結果は「YES」になり、ステップSE10に進む。ステップSE10では、検索中の小節の段番号が、上記ステップSE2で取得した現在の小節の段番号と一致するか否かを判断する。
検索中の小節の段番号が、現在の小節の段番号と一致する場合には、判断結果が「YES」となり、ステップSE11に進み、(描画)終了小節番号を検索用変数に更新する。そして、ステップSE12に進み、検索用変数をインクリメントした後、上述のステップSE9に処理を戻す。
以後、ステップSE9〜SE12では、検索中の小節(検索用変数で指定される小節)の段番号が現在の小節の段番号と一致する毎に、(描画)終了小節番号を検索用変数に更新すると共に、検索用変数をインクリメントする処理を、当該インクリメントされた検索用変数が曲末尾を超過するまで繰り返すことによって終了小節番号を探し出す。つまり、検索中の小節と同じ段の小節のうちで、最も後(楽譜で右)に位置する小節を、検索用変数を1づつインクリメントしながら、検索中の小節と同じ段であるか否かを判断して、(描画)終了小節番号を探しているものである。そして、終了小節番号を探し終えると、上記ステップSE9又はSE10の何れかの判断結果が「NO」になり、本処理を終える。
このように、描画範囲取得処理では、現在の小節(表示された楽譜においてカーソルが位置する小節)の段番号を、RAM12が備える小節データエリアMEから取得し、取得した段番号と同じ段の開始小節番号および終了小節番号を描画範囲として取得する。
(6)パート境界音取得処理の動作
次に、図13〜図14を参照してパート境界音取得処理の動作を説明する。上述した押鍵状態描画処理のステップSD2(図11参照)を介して本処理が実行されると、CPU10は、図13に図示するステップSF1に処理を進め、右手パート最低音のノートナンバを「128」に、左手パート最高音のノートナンバを「−1」に初期設定する。次いで、ステップSF2では、RAM12の演奏データエリアPE(図6参照)に格納される演奏データNote[0]〜[N]の内、最初(曲頭)の演奏データNote[0]を指定する。
続いて、ステップSF3では、全ての演奏データNote[0]〜[N]について検索し終えたか否かを判断する。全ての演奏データNote[0]〜[N]について検索し終えていなければ、判断結果は「NO」になり、ステップSF4に進む。ステップSF4では、検索対象の演奏データNoteが描画範囲内の音符、すなわち上述の描画範囲取得処理により取得された開始小節番号から終了小節番号までの各小節に含まれる音符であるかどうかを判断する。
検索対象の演奏データNoteが描画範囲内の音符でなければ、上記ステップSF4の判断結果は「NO」になり、ステップSF11に進み、次の演奏データNoteを指定して検索対象を更新させた後、上記ステップSF3に処理を戻す。
そして、例えば更新した検索対象の演奏データNoteが描画範囲内の音符であると、上記ステップSF4の判断結果が「YES」になり、ステップSF5に進む。ステップSF5では、検索対象の演奏データNoteに含まれるパート番号Handが「0」、つまり右手パートの音であるか否かを判断する。検索対象の演奏データNoteが、右手パートの音であれば、判断結果は「YES」になり、ステップSF6に進む。
ステップSF6では、検索対象の演奏データNoteの音高Pitchが、右手パート最低音のノートナンバより小さいか否かを判断する。最初の判断では、右手パート最低音のノートナンバが「128」に設定されている為、判断結果は「YES」になり、ステップSF7に進む。ステップSF7では、右手パート最低音を、現在検索対象となっている演奏データNoteの音高Pitchに更新する。
この後、ステップSF11に進み、次の演奏データNoteを指定して検索対象を更新させた後、上記ステップSF3に処理を戻す。そして、例えば更新した検索対象の演奏データNoteが描画範囲内の右手パートの音であって、その音高Pitchが右手パート最低音のノートナンバより大きければ、上記ステップSF6の判断結果は「NO」になり、ステップSF11に進み、次の演奏データNoteを指定して検索対象を更新させた後、上記ステップSF3に処理を戻す。
以後、全ての演奏データNote[0]〜[N]について検索し終える迄、上述したステップSF3〜SF7、SF11を繰り返すことによって、描画範囲内における右手パート最低音を特定する。
一方、検索対象の演奏データNoteが描画範囲内の左手パートの音であると、上述したステップSF5の判断結果が「NO」になり、ステップSF8に進む。ステップSF8では、検索対象の演奏データNoteに含まれるパート番号Handが「1」、つまり左手パートの音であるか否かを判断する。検索対象の演奏データNoteが、左手パートの音であれば、判断結果は「YES」になり、ステップSF9に進む。
ステップSF9では、検索対象の演奏データNoteの音高Pitchが、左手パート最高音のノートナンバより小さいか否かを判断する。最初の判断では、左手パート最高音のノートナンバが「−1」に設定されている為、判断結果は「YES」になり、ステップSF10に進み、左手パート最高音を、現在検索対象となっている演奏データNoteの音高Pitchに更新する。
この後、ステップSF11に進み、次の演奏データNoteを指定して検索対象を更新させた後、上記ステップSF3に処理を戻す。そして、例えば更新した検索対象の演奏データNoteが描画範囲内の左手パートの音であって、その音高Pitchが左手パート最高音のノートナンバより小さければ、上記ステップSF9の判断結果は「NO」になり、ステップSF11に進み、次の演奏データNoteを指定して検索対象を更新させた後、上記ステップSF3に処理を戻す。
以後、全ての演奏データNote[0]〜[N]について検索し終える迄、上述したステップSF3〜SF5、SF8〜SF11を繰り返すことによって、描画範囲内における左手パート最高音を特定する。
こうして、全ての演奏データNote[0]〜[N]の中から描画範囲内における右手パート最低音および左手パート最高音を特定すると、上述したステップSF3の判断結果が「YES」になり、図14に図示するステップSF12に進む。ステップSF12では、右手パート最低音が左手パート最高音より高いか否かを判断する。右手パート最低音が左手パート最高音より高くなければ、判断結果は「NO」となり、本処理を終えるが、右手パート最低音が左手パート最高音より高ければ、判断結果が「YES」になり、ステップSF13に進む。
ステップSF13では、右手パート最低音と左手パート最高音との間(ギャップ)にノートナンバ#60(C4音)が含まれるか否かを判断する。右手パート最低音と左手パート最高音との間(ギャップ)にノートナンバ#60(C4音)が含まれると、判断結果は「YES」になり、ステップSF14に進み、右手パート最低音および左手パート最高音を「ノートナンバ#60(C4音)」に設定して本処理を終える。
一方、右手パート最低音と左手パート最高音との間(ギャップ)にノートナンバ#60(C4音)が含まれなければ、上記ステップSF13の判断結果が「NO」になり、ステップSF15に進む。ステップSF15では、左手パート最高音がノートナンバ#60(C4音)以上であるか否かを判断する。左手パート最高音がノートナンバ#60(C4音)以上であると、判断結果は「YES」になり、ステップSF16に進み、右手パート最低音を左手パート最高音の一つ上の音に設定して本処理を終える。
これに対し、左手パート最高音がノートナンバ#60(C4音)以上でなければ、上記ステップSF15の判断結果が「NO」になり、ステップSF17に進む。ステップSF17では、右手パート最低音がノートナンバ#60(C4音)以下であるか否かを判断する。右手パート最低音がノートナンバ#60(C4音)以下であると、判断結果は「YES」となり、ステップSF18に進み、右手パート最低音を左手パート最高音の一つ上の音に設定して本処理を終える。一方、右手パート最低音がノートナンバ#60(C4音)以下でなければ、判断結果が「NO」となり、本処理を終える。
このように、パート境界音取得処理では、描画範囲内における右手パート最低音および左手パート最高音を特定し、右手パート最低音が左手パート最高音より高く、かつ右手パート最低音と左手パート最高音との間(ギャップ)にノートナンバ#60(C4音)が含まれる場合には、右手パート最低音および左手パート最高音を「ノートナンバ#60(C4音)」に設定し、右手パート最低音が左手パート最高音より高く、かつ左手パート最高音がノートナンバ#60(C4音)以上もしくは右手パート最低音がノートナンバ#60(C4音)以下の場合には、右手パート最低音を左手パート最高音の一つ上の音に設定する。
(7)該当音検索処理の動作
次に、図15を参照して該当音検索処理の動作を説明する。前述した押鍵状態描画処理のステップSD6(図11参照)を介して本処理が実行されると、CPU10は、図15に図示するステップSG1に処理を進め、右検知フラグおよび左検知フラグを初期化する。続いて、ステップSG2では、RAM12の演奏データエリアPE(図6参照)に格納される演奏データNote[0]〜[N]の内、最初(曲頭)の演奏データNote[0]を指定する。
次いで、ステップSG3では、全ての演奏データNote[0]〜[N]について検索し終えたか否かを判断する。全ての演奏データNote[0]〜[N]について検索し終えていなければ、判断結果は「NO」になり、ステップSG4に進む。ステップSG4では、検索対象の演奏データNoteが描画範囲内の音符、すなわち前述した描画範囲取得処理(図12参照)により取得された開始小節番号から終了小節番号までの何れかの小節に含まれる音符であるかどうかを判断する。
検索対象の演奏データNoteが描画範囲内の音符でなければ、上記ステップSG4の判断結果は「NO」になり、ステップSG13に進み、次の演奏データNoteを指定して検索対象を更新させた後、上記ステップSG3に処理を戻す。
そして、例えば更新した検索対象の演奏データNoteが描画範囲内の音符であると、上記ステップSG4の判断結果が「YES」になり、ステップSG5に進む。ステップSG5では、検索対象の演奏データNoteに含まれる音高Pitchと、ポインタpで指定されるノートナンバ(鍵番号)とが一致するか否かを判断する。つまり、検索対象の演奏データNoteが押鍵音と同じ音高であるかどうかを判断する。
検索対象の演奏データNoteが押鍵音と同じ音高でなければ、判断結果は「NO」になり、ステップSG13に進み、次の演奏データNoteを指定して検索対象を更新させた後、上記ステップSG3に処理を戻す。
そして、例えば更新した検索対象の演奏データNoteが描画範囲内の音符であって、かつ押鍵音と同じ音高であると、上記ステップSG5の判断結果が「YES」になり、ステップSG6に進む。ステップSG6では、その演奏データNoteから元画像における音符の玉座標xおよび玉座標yを取得する。
次いで、ステップSG7では、上記ステップSG6で取得した元画像上の音符の玉座標xおよび玉座標yを、表示状態に合わせて座標変換する。すなわち、前述した楽譜画像描画処理(図10参照)において、表示画面(ディスプレイ)に応じて元画像(楽譜の画像データ)の表示サイズを変更したのに合わせて音符の玉の位置(座標xおよび玉座標y)を変換する。
続いて、ステップSG8では、上記ステップSG7で変換された音符の玉の位置(座標xおよび玉座標y)を中心として楽譜上に該当マークを描画する。具体的には、例えば図25に図示する一例の楽譜において、描画範囲内で押鍵音と同じ音高の音符の玉を該当マーク(○印)で囲むように描画して該当音を示す。
そして、ステップSG9では、前述したパート境界音取得処理(図13〜図14参照)で設定された描画範囲内の右手パート最低音および左手パート最高音に基づき、該当音(押鍵音と同じ音高の音符)が右手パートの音であるか否かを判断する。該当音が右手パートの音であると、判断結果が「YES」になり、ステップSG10に進み、右検知フラグをセットした後、ステップSG13に進み、次の演奏データNoteを指定して検索対象を更新させた後、上記ステップSG3に処理を戻す。
一方、該当音が右手パートの音でなければ、上記ステップSG9の判断結果は「NO」になり、ステップSG11に進み、左手パートの音であるか否かを判断する。該当音が左手パートの音であると、判断結果は「YES」になり、ステップSG12に進み、左検知フラグをセットした後、ステップSG13に進み、次の演奏データNoteを指定して検索対象を更新させた後、上記ステップSG3に処理を戻す。
以後、ステップSG3〜SG13では、全ての演奏データNote[0]〜[N]の中から描画範囲内の音符であって、かつ押鍵音と同じ音高の演奏データNoteを探し出し、該当する演奏データNoteに対応する音符の玉を該当マーク(○印)で囲むように描画し、これにより描画範囲内で押鍵音と同じ音高の音符を該当音として表現すると共に、該当音が右手パートに含まれる音であれば、右検知フラグをセットし、一方、左手パートに含まれる音ならば、左検知フラグをセットする。そして、全ての演奏データNote[0]〜[N]について検索し終えると、上記ステップSG3の判断結果が「YES」になり、本処理を終える。
このように、該当音検索処理では、描画範囲内の音符であって、かつ押鍵音と同じ音高の演奏データNoteを探し出し、該当する演奏データNoteに対応する音符の玉を該当マーク(○印)で囲んで該当音として表現し、この該当音が右手パートに含まれる場合には右検知フラグをセットし、左手パートに含まれる場合には左検知フラグをセットする。
(8)状態描画処理の動作
次に、図16〜図17を参照して状態描画処理の動作を説明する。前述した押鍵状態描画処理のステップSD7(図11参照)を介して本処理が実行されると、CPU10は、図16に図示するステップSH1に処理を進め、描画小節を開始小節番号にセットする。なお、開始小節番号は、前述した描画範囲取得処理(図12参照)により取得される。
続いて、ステップSH2では、描画範囲内であるか否か、すなわち開始小節番号から終了小節番号まで状態描画し終えたかどうかを判断する。開始小節番号から終了小節番号まで状態描画し終えておらず、描画範囲内にあると、判断結果は「YES」になり、ステップSH3に進み、右検知フラグがセットされているか否か、つまり描画小節内に押鍵音と同じ音高の該当音が右手パートに含まれているかどうかを判断する。
上述した該当音検索処理(図15参照)において、描画小節内に押鍵音と同じ音高の該当音が右手パートに含まれ、右検知フラグがセットされると、上記ステップSH3の判断結果は「YES」になり、ステップSH4に進む。ステップSH4では、描画色を該当色(例えば青色)に設定し、続くステップSH5では、描画パートを右に設定した後、ステップSH6を介して音高線描画処理を実行した後、ステップSH7に進む。
ステップSH6の音高線描画処理では、後述するように、描画音高(ポインタpで指定されるノートナンバ(鍵番号))を含む描画小節の小節データMeasから得た調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得し、取得した五線番号lnの音高座標yに基づいて補助線を描画する他、描画小節内に描画音高より半音下(又は半音上)であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音が存在する場合、その音の表示位置に半音下がるマーク「<」(又は半音上がるマーク「>」)を描画する。
一方、右検知フラグがセットされなければ、上記ステップSH3の判断結果は「NO」になり、ステップSH7に処理を進める。ステップSH7では、左検知フラグがセットされているか否か、つまり描画小節内に押鍵音と同じ音高の該当音が左手パートに含まれているかどうかを判断する。
上述した該当音検索処理(図15参照)において、描画小節内に押鍵音と同じ音高の該当音が左手パートに含まれ、左検知フラグがセットされると、上記ステップSH7の判断結果は「YES」になり、ステップSH8に進む。ステップSH8では、描画色を該当色(例えば青色)に設定し、続くステップSH9では、描画パートを左に設定した後、ステップSH10を介して音高線描画処理を実行した後、図17に図示するステップSH11に進む。
ステップSH10の音高線描画処理では、上記ステップSH6と同様、描画音高(ポインタpで指定されるノートナンバ(鍵番号))を含む描画小節の小節データMeasから得た調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得し、取得した五線番号lnの音高座標yに基づいて補助線を描画する他、描画小節内に描画音高より半音下(又は半音上)であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音が存在する場合、その音の表示位置に半音下がるマーク「<」(又は半音上がるマーク「>」)を描画する。
これに対し、左検知フラグがセットされなければ、上記ステップSH7の判断結果は「NO」になり、図17に図示するステップSH11に処理を進める。ステップSH11では、右/左検知フラグが何れも立っていないかどうかを判断する。右検知フラグおよび左検知フラグの何れかが立っていれば、判断結果は「NO」になり、ステップSH19に進み、描画小節番号をインクリメントして歩進させた後、前述のステップSH2(図16参照)に処理を戻す。
一方、右/左検知フラグが何れも立っていなければ、上記ステップSH11の判断結果は「YES」になり、ステップSH12に進み、描画色を非該当色(例えば赤色)に設定する。次いで、ステップSH13では、描画音高(ポインタpで指定されるノートナンバ(鍵番号))が、右手パート最低音を上回るか否かを判断する。描画音高が右手パート最低音を上回らなければ、判断結果は「NO」になり、後述のステップSH16に進む。
これに対し、描画音高が右手パート最低音を上回ると、上記ステップSH13の判断結果が「YES」になり、ステップSH14に進み、描画パートを右手パートに設定する。そして、ステップSH15に進み、描画音高(ポインタpで指定されるノートナンバ(鍵番号))を含む描画小節の小節データMeasから得た調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得し、取得した五線番号lnの音高座標yに基づいて補助線を描画する他、描画小節内に描画音高より半音下(又は半音上)であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音が存在する場合、その音の表示位置に半音下がるマーク「<」(又は半音上がるマーク「>」)を描画する音高描画処理を実行した後、ステップSH16に進む。
ステップSH16では、描画音高が左手パート最高音を下回るか否かを判断する。描画音高が左手パート最高音を下回らなければ、判断結果は「NO」になり、ステップSH19に進み、描画小節番号をインクリメントして歩進させた後、前述のステップSH2(図16参照)に処理を戻す。
一方、描画音高が左手パート最高音を下回ると、上記ステップSH16の判断結果が「YES」になり、ステップSH17に進み、描画パートを左手パートに設定する。そして、ステップSH18に進み、描画音高(ポインタpで指定されるノートナンバ(鍵番号))を含む描画小節の小節データMeasから得た調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得し、取得した五線番号lnの音高座標yに基づいて補助線を描画する他、描画小節内に描画音高より半音下(又は半音上)であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音が存在する場合、その音の表示位置に半音下がるマーク「<」(又は半音上がるマーク「>」)を描画する音高描画処理を実行した後、ステップSH19に進み、描画小節番号をインクリメントして歩進させた後、前述のステップSH2(図16参照)に処理を戻す。
以後、開始小節番号から終了小節番号まで状態描画し終える迄、上述したステップSH2〜SH19を繰り返し、歩進された描画小節番号が終了小節番号を超えると、上記ステップSH2の判断結果が「NO」になり、本処理を終える。
このように、状態描画処理では、描画小節内に押鍵音と同じ音高の該当音が右手パート(又は左手パート)に含まれ、右検知フラグ(又は左検知フラグ)がセットされていれば、描画色を該当色(例えば青色)に設定し、描画パートを右手パート(又は左手パート)に設定した後、描画音高(ポインタpで指定されるノートナンバ(鍵番号))を含む描画小節の小節データMeasから得た調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得し、取得した五線番号lnの音高座標yに基づいて補助線を描画する他、描画小節内に描画音高より半音下(又は半音上)であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音が存在する場合、その音の表示位置に半音下がるマーク「<」(又は半音上がるマーク「>」)を描画する。
一方、右/左検知フラグが何れも立っていなければ、描画色を非該当色(例えば赤色)に設定し、描画音高が右手パート最低音を上回れば描画パートを右手パートに設定し、描画音高が左手パート最高音を下回れば描画パートを左手パートに設定した後、描画音高(ポインタpで指定されるノートナンバ(鍵番号))を含む描画小節の小節データMeasから得た調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得し、取得した五線番号lnの音高座標yに基づいて補助線を描画する他、描画小節内に描画音高より半音下(又は半音上)であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音が存在する場合、その音の表示位置に半音下がるマーク「<」(又は半音上がるマーク「>」)を描画する。
(9)音高線描画処理の動作
次に、図18〜図19を参照して音高線描画処理の動作を説明する。上述した状態描画処理のステップSH6又はステップSH10(図16参照)もしくはステップSH15又はステップSH18(図17参照)を介して本処理が実行されると、CPU10は、図18に図示するステップSJ1に処理を進め、RAM12の小節データエリアMEに格納される小節データMeas[0]〜[N]の内、描画小節に対応する小節データMeasから取得した調号番号KeySignを調号番号ksに設定し、続くステップSJ2では、描画小節に対応する小節データMeasから取得した音部番号Clefを音部番号clに設定する。
そして、ステップSJ3に進むと、描画音高の五線情報取得処理を実行する。描画音高の五線情報取得処理では、後述するように、描画音高(ポインタpで指定されるノートナンバ(鍵番号))を含む描画小節の調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得し、続くステップSj4では、取得した五線番号lnを補助線番号とする。
次いで、ステップSJ5では、補助線番号は五線の一番下で五線の間(五線間フラグintが「0」)であるか否かを判断する。五線の一番下で五線の間でなければ、判断結果は「NO」になり、後述のステップSJ7に進む。一方、五線の一番下で五線の間であれば、判断結果が「YES」になり、ステップSJ6に進み、補助線番号をインクリメントして歩進させた後、ステップSJ7に進む。
ステップSJ7では、補助線番号は五線外であるかどうかを判断する。五線外でなければ、判断結果は「NO」になり、後述のステップSJ9に進むが、五線外ならば、判断結果が「YES」になり、ステップSJ8を介して補助線描画処理を実行する。
ステップSJ8の補助線描画処理では、後述するように、補助線番号lineexが「0」より小さく、五線譜の第5線を超える場合には、ポインタlntmpの値を五線番号lnとして、その五線番号lnに対応して取得される音高座標yに基づいて描画小節における五線上部に補助線を描画し、描画し終える毎にデクリメントされるポインタlntmpの値が補助線番号lineexより小さくなるまで次の補助線の描画を繰り返す。
一方、補助線番号lineexが「4」より大きく、五線譜の第1線を超える場合には、ポインタlntmpの値を五線番号lnとして、その五線番号lnに対応して取得される音高座標yに基づいて描画小節における五線下部に補助線を描画し、描画し終える毎に歩進されるポインタlntmpの値が補助線番号lineexを超えるまで次の補助線の描画を繰り返す。
こうして、補助線を描画し終えると、ステップSJ9に進み、五線番号の五線座標取得処理を実行する。五線座標取得処理では、描画小節番号nb、パート番号handおよび五線番号lnに応じて、小節データMeas[nb]から読み出される五線譜中の線のy座標値Meas[nb].Line[hand][ln]に基づいて音高座標y(描画する音符の玉のy座標)を取得し、五線間フラグintが「1」(五線の間)の場合には、五線番号ln+1で指定される一つ下の線の音高座標との差分中央値gap/2を五線番号lnの音高座標yに加算する。
次いで、図19に図示するステップSJ10に進むと、縦幅を取得した五線座標に上下オフセットを持たせ、横座標を描画小節に合わせた矩形領域を設定する。次に、ステップSJ11では、その設定された矩形領域を表す矩形座標を、表示状態(表示倍率scale)に応じて座標の位置を変換し、続くステップSJ12では、表示状態(表示倍率scale)に応じて変換された矩形座標で示される矩形領域を楽譜背景となる所定色で塗り潰す。
そして、ステップSJ13を介して五線情報取得処理を実行する。この五線情報取得処理では、
描画音高(ポインタpで指定されるノートナンバ(鍵番号))より一つ低い音(半音下)を含む描画小節の調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得する。
続いて、ステップSJ14では、上述のステップSJ3で取得した描画音高の五線情報(五線番号lnおよび五線間フラグint)と、上記ステップSJ13で取得した描画音高より半音下の五線情報(五線番号lnおよび五線間フラグint)とが一致するか否かを判断する。描画音高の五線情報と描画音高より半音下の五線情報とが一致する場合、つまり描画音高より半音下であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音が存在する場合には、判断結果が「YES」となり、ステップSJ15に進む。
ステップSJ15では、RAM12の演奏データエリアPEに記憶される演奏データNote[0]〜[N]の中から描画小節内の描画音高(ポインタpで指定されるノートナンバ(鍵番号)の音)より一つ低い音(半音下)を検索し、該当する音の表示位置に半音下がるマーク「<」を描画して本処理を終える。なお、半音下がるマーク「<」とは、鍵盤上で描画音高に対応する鍵よりも一つ低い音(半音下)の鍵の押鍵をユーザにガイドする意味を持つ。
一方、描画音高の五線情報と描画音高より半音下の五線情報とが一致しない場合には、上記ステップSJ14の判断結果が「NO」になり、ステップSJ16を介して五線情報取得処理を実行する。この五線情報取得処理では、描画音高(ポインタpで指定されるノートナンバ(鍵番号))より一つ高い音(半音上)を含む描画小節の調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得する。
次に、ステップSJ17では、上述のステップSJ3で取得した描画音高の五線情報(五線番号lnおよび五線間フラグint)と、上記ステップSJ16で取得した描画音高より半音上の五線情報(五線番号lnおよび五線間フラグint)とが一致するか否かを判断する。描画音高の五線情報と描画音高より半音上の五線情報とが一致しない場合には、判断結果が「NO」になり、本処理を終える。
これに対し、描画音高の五線情報と描画音高より半音上の五線情報とが一致する場合、つまり描画音高より半音上であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音が存在する場合には、判断結果が「YES」となり、ステップSJ18に進む。
ステップSJ18では、RAM12の演奏データエリアPEに記憶される演奏データNote[0]〜[N]の中から描画小節内の描画音(ポインタpで指定されるノートナンバ(鍵番号)の音)より一つ高い音(半音上)を検索し、該当する音の表示位置に半音上がるマーク「>」を描画して本処理を終える。なお、半音上がるマーク「>」とは、鍵盤上で描画音高に対応する鍵よりも一つ高い音(半音上)の鍵の押鍵をユーザにガイドする意味を持つ。
このように、音高線描画処理では、描画音高(ポインタpで指定されるノートナンバ(鍵番号))を含む描画小節の小節データMeasから得た調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得し、取得した五線番号lnの音高座標yに基づいて補助線を描画する。
また、描画小節内に、描画音高より半音下であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音や、描画音高より半音上であるが、調号や臨時記号等の関係から楽譜上で描画音高と同じ五線上(又は五線間)に位置する音が存在する場合、描画音高より半音下の該当音の表示位置に半音下がるマーク「<」を描画し、一方、描画音高より半音上の該当音の表示位置に半音上がるマーク「>」を描画する。
(10)五線情報取得処理の動作
次に、図20を参照して五線情報取得処理の動作を説明する。上述した音高線描画処理のステップSJ3(図18参照)もしくはステップSJ13又はステップSJ16(図19参照)を介して本処理が実行されると、CPU10は、図20に図示するステップSK1に処理を進め、RAM12の五線テーブルFT(図6参照)からデータbarline[ks+7]を読み出してレジスタblにストアする。
ここで、調号番号ksは、音高線描画処理のステップSJ1(図18参照)で取得されたものであり、描画小節の調号を表す。したがって、レジスタblには、調号番号ksをハ長調「7」に加算した調号[ks+7]において、ノートナンバ(鍵番号)#48〜#71までの2オクターブ分の各音高についてト音記号表記した際の五線上の位置が格納される。
具体的には、レジスタblは[a][b]の2次元配列レジスタで構成され、[a]にはデータbarline[ks+7]におけるノートナンバ#48〜#71までの2オクターブ分の各音高の五線上の位置tonepos[0(#48)]〜[23(#71)]が格納される。[b]には対応する五線上の位置toneposの「五線インデックスline」(引数b=0で指定)、「五線間フラグinterval」(引数b=1で指定)および「臨時記号accidental」(引数b=2で指定)が格納される。
次いで、ステップSK2では、音高線描画処理のステップSJ2(図18参照)で取得された音部番号clの絶対値ABS(cl)が「2」(オクターブ下げ)であるか否かを判断する。音部番号clの絶対値ABS(cl)が「2」(オクターブ下げ)であると、判断結果は「YES」になり、ステップSK3に進み、ポインタpで指定されるノートナンバ(鍵番号)から「12」半音分を減算して1オクターブ下げた描画音高pcを算出した後、ステップSK7に進む。
一方、音部番号clの絶対値ABS(cl)が「2」(オクターブ下げ)でなければ、上記ステップSK2の判断結果は「NO」になり、ステップSK4に進む。ステップSK4では、音高線描画処理のステップSJ2(図18参照)で取得された音部番号clの絶対値ABS(cl)が「3」(オクターブ上げ)であるか否かを判断する。音部番号clの絶対値ABS(cl)が「3」(オクターブ上げ)ならば、判断結果は「YES」になり、ステップSK5に進み、ポインタpで指定されるノートナンバ(鍵番号)に「12」半音分を加算して1オクターブ上げた描画音高pcを算出した後、ステップSK7に進む。
これに対し、音部番号clの絶対値ABS(cl)が「3」(オクターブ上げ)でなければ、上記ステップSK4の判断結果は「NO」になり、ステップSK6に進み、ポインタpで指定されるノートナンバ(鍵番号)を描画音高pcに設定する。そして、ステップSK7に進むと、描画音高pcの「24」の剰余値piを算出する。
次に、ステップSK8では、剰余値piおよび引数「0」に応じて、レジスタbl[pi][0]から読み出した五線インデックスlineをレジスタlnにストアする。ステップSK9では、レジスタlnの五線インデックスlineから「7×(pc−BLSTART)/24」を減算して五線番号lnを算出する。なお、BLSTARTは五線テーブルの最低音(#48)である。
続いて、ステップSK10では、ポインタpで指定されるノートナンバ(鍵番号)が、五線テーブル最低音BLSTARTより小さく、かつポインタpで指定されるノートナンバ(鍵番号)の「24」の剰余値が「0」であるか否かを判断する。つまり、ポインタpで指定されるノートナンバ(鍵番号)が、五線テーブルFTの定義音域を外れているかどうかを判断する。
五線テーブルFTの定義音域を外れていなければ、判断結果は「NO」になり、ステップSK12に進むが、五線テーブルFTの定義音域を外れていると、上記ステップSK10の判断結果は「YES」になり、ステップSK11に進み、五線番号lnに「7」を加算して補正した後、ステップSK12に進む。
ステップSK12では、五線間フラグintをゼロリセットし、続くステップSK13では、剰余値piおよび引数「1」に応じて、レジスタbl[pi][1]から読み出した五線間フラグintervalが「1」、すなわち五線の間であるか否かを判断する。読み出した五線間フラグintervalが「1」(五線の間)であれば、判断結果は「YES」になり、ステップSK14に進み、五線間フラグintを「1」にセットして描画音高pcが五線の間に位置する旨を表して本処理を終える。これに対し、読み出した五線間フラグintervalが「0」(五線上)ならば、上記ステップSK13の判断結果は「NO」になり、この場合、五線間フラグintを「0」のままにして本処理を終える。
このように、五線情報取得処理では、描画音高(ポインタpで指定されるノートナンバ(鍵番号))を含む描画小節の調号番号ksおよび音部番号clに基づき五線テーブルFTを参照して五線情報(五線番号lnおよび五線間フラグint)を取得する。
(11)五線座標取得処理の動作
次に、図21を参照して五線座標取得処理の動作を説明する。前述した音高線描画処理のステップSJ9(図18参照)、五線上部の補助線描画処理のステップSN4(図23参照)あるいは五線上部の補助線描画処理のステップSP4(図24参照)の何れかを介して本処理が実行されると、CPU10は、図22に図示するステップSL1に処理を進め、五線番号lnが「0」以上で「4」より小さいか否かを判断する。
五線番号lnが「0」以上で「4」より小さければ、判断結果は「YES」になり、ステップSL2に進み、RAM12の小節データエリアME(図5参照)から描画小節番号nbで指定される小節データMeas[nb]において、パート番号handおよび五線番号lnで指定される五線譜中の線のy座標値(Meas[nb].Line[hand][ln])を読み出してレジスタyにストアする。また、ステップSL2では、五線番号ln+1で指定される一つ下の線のy座標値(Meas[nb].Line[hand][ln+1])も同様に読み出し、これとレジスタyにストアしたy座標値との差分から線間距離gapを算出する。
そして、ステップSL8に進み、五線間フラグintが「1」(五線の間)であるか否かを判断する。五線間フラグintが「0」(五線上)の場合には、判断結果は「NO」となり、上記ステップSL2でレジスタyにストアした値を、音高座標y(描画する音符の玉のy座標)として本処理を終える。
これに対し、五線間フラグintが「1」(五線の間)の場合には、上記ステップSL8の判断結果が「YES」になり、ステップSL9に進み、上記ステップSL2でレジスタyにストアした値に線間距離gapの半値gap/2を加算して得られる値(y+gap/2)を、音高座標y(描画する音符の玉のy座標)として本処理を終える。
五線番号lnが「0」以上で「4」より小さくなければ、上記ステップSL1の判断結果は「NO」になり、ステップSL3に進む。ステップSL3では、五線番号lnが「0」より小さいか否かを判断する。五線番号lnが「0」より小さいと、判断結果は「YES」となり、ステップSL4に進む。
ステップSL4では、RAM12の小節データエリアME(図5参照)から描画小節番号nbで指定される小節データMeas[nb]において、パート番号handおよび五線番号「0」で指定される第5線のy座標値(Meas[nb].Line[hand][0])を読み出してレジスタyにストアする。また、ステップSL4では、五線番号「1」で指定される一つ下の第4線のy座標値(Meas[nb].Line[hand][1])も同様に読み出し、これとレジスタyにストアしたy座標値との差分から第4線と第5線との線間距離gapを算出する。
そして、ステップSL5に進むと、第4線と第5線との線間距離gapと、五線番号lnとの乗算値に、上記ステップSL4でレジスタyにストアした値(第5線のy座標値)を加算する。この後、ステップSL8に進み、五線間フラグintが「1」(五線の間)であるか否かを判断し、五線間フラグintが「0」(五線上)であれば、判断結果は「NO」となり、上記ステップSL5でレジスタyにストアした値(y+gap×ln)を、音高座標y(描画する音符の玉のy座標)として本処理を終える。
これに対し、五線間フラグintが「1」(五線の間)ならば、上記ステップSL8の判断結果は「YES」になり、ステップSL9に進む。ステップSL9では、上記ステップSL5でレジスタyにストアした値に、第4線と第5線との線間距離gapの半値gap/2を加算して得られる値(y+gap/2)を、音高座標y(描画する音符の玉のy座標)として本処理を終える。
さて一方、五線番号lnが「4」より大きい場合、すなわち第1線より下であると、上記ステップSL3の判断結果が「NO」になり、ステップSL6に進む。ステップSL6では、RAM12の小節データエリアME(図5参照)から描画小節番号nbで指定される小節データMeas[nb]において、パート番号handおよび五線番号「4」で指定される第1線のy座標値(Meas[nb].Line[hand][4])を読み出してレジスタyにストアする。また、ステップSL6では、五線番号「3」で指定される第2線のy座標値(Meas[nb].Line[hand][3])も同様に読み出し、これとレジスタyにストアした値との差分から第1線と第2線との線間距離gapを算出する。
そして、ステップSL7に進み、五線番号lnから「4」を減算した値(ln−4)と、第1線と第2線との線間距離gapとの乗算値をレジスタyにストアした第1線のy座標値に加算する。この後、ステップSL8に進み、五線間フラグintが「1」(五線の間)であるか否かを判断し、五線間フラグintが「0」(五線上)であれば、判断結果は「NO」となり、上記ステップSL7でレジスタyにストアした値(y+gap×(ln−4))を、音高座標y(描画する音符の玉のy座標)として本処理を終える。
これに対し、五線間フラグintが「1」(五線の間)ならば、上記ステップSL8の判断結果は「YES」になり、ステップSL9に進む。ステップSL9では、上記ステップSL7でレジスタyにストアした値に、第1線と第2線との線間距離gapの半値gap/2を加算して得られる値(y+gap/2)を、音高座標y(描画する音符の玉のy座標)として本処理を終える。
このように、五線座標取得処理では、描画小節番号nb、パート番号handおよび五線番号lnに応じて、小節データMeas[nb]から読み出される五線譜中の線のy座標値Meas[nb].Line[hand][ln]に基づいて音高座標y(描画する音符の玉のy座標)を取得し、五線間フラグintが「1」(五線の間)の場合には、五線番号ln+1で指定される一つ下の線の音高座標との差分中央値gap/2を五線番号lnの音高座標yに加算する。
(12)補助線描画処理の動作
次に、図22を参照して補助線描画処理の動作を説明する。前述した音高線描画処理のステップSJ8(図18参照)を介して本処理が実行されると、CPU10は、図22に図示するステップSM1に処理を進め、補助線番号lineexが「0」より小さいか否かを判断する。補助線番号lineexが「0」より小さい場合、すなわち五線譜の第5線を超えていれば、判断結果は「YES」になり、ステップSM2に進み、五線上部の補助線描画処理を実行する。
五線上部の補助線描画処理では、後述するように、ポインタlntmpの値を五線番号lnとして、その五線番号lnに対応して取得される音高座標yに基づいて描画小節における五線上部に補助線を描画し、描画し終える毎にデクリメントされるポインタlntmpの値が補助線番号lineexより小さくなるまで次の補助線の描画を繰り返す。
一方、補助線番号lineexが「0」より大きければ、上記ステップSM1の判断結果は「NO」になり、ステップSM3に進む。ステップSM3では、補助線番号lineexが「4」より大きいか否かを判断する。補助線番号lineexが「4」より大きくなければ、判断結果は「NO」になり、本処理を終える。補助線番号lineexが「4」より大きい場合、すなわち五線譜の第1線を超えていれば、上記ステップSM3の判断結果は「YES」になり、ステップSM4を介して五線下部の補助線描画処理を実行した後、本処理を終える。
五線下部の補助線描画処理では、後述するように、ポインタlntmpの値を五線番号lnとして、その五線番号lnに対応して取得される音高座標yに基づいて描画小節における五線下部に補助線を描画し、描画し終える毎に歩進されるポインタlntmpの値が補助線番号lineexを超えるまで次の補助線の描画を繰り返す。
以上のように、補助線描画処理では、補助線番号lineexが「0」より小さく、五線譜の第5線を超える場合には、ポインタlntmpの値を五線番号lnとして、その五線番号lnに対応して取得される音高座標yに基づいて描画小節における五線上部に補助線を描画し、描画し終える毎にデクリメントされるポインタlntmpの値が補助線番号lineexより小さくなるまで次の補助線の描画を繰り返す。
一方、補助線番号lineexが「4」より大きく、五線譜の第1線を超える場合には、ポインタlntmpの値を五線番号lnとして、その五線番号lnに対応して取得される音高座標yに基づいて描画小節における五線下部に補助線を描画し、描画し終える毎に歩進されるポインタlntmpの値が補助線番号lineexを超えるまで次の補助線の描画を繰り返す。
(13)五線上部の補助線描画処理の動作
次に、図23を参照して五線上部の補助線描画処理の動作を説明する。上述した補助線描画処理のステップSM2(図22参照)を介して本処理が実行されると、CPU10は、図23に図示するステップSN1に処理を進め、ポインタlntmpに初期値「−1」をセットする。続いて、ステップSN2では、ポインタlntmpの値が補助線番号lineex以上であるか否かを判断する。
ポインタlntmpの値が補助線番号lineex以上であると、判断結果は「YES」となり、ステップSK3に進み、ポインタlntmpの値を五線番号lnとし、この五線番号lnおよび五線間フラグintからなる五線情報を設定する。次いで、ステップSN4では、五線座標取得処理を実行する。
五線座標取得処理では、描画する小節番号nb、パート番号handおよび上記ステップSK3で設定される五線情報(五線番号ln、五線間フラグint)が与えられると、描画する小節番号nbおよびパート番号handに対応付けられた小節データMeas[nb]から読み出される五線譜中の線のy座標値Meas[nb].Line[hand][ln]に基づいて音高座標y(描画する音符の玉のy座標)を取得し、五線間フラグintが「1」(五線の間)の場合には、五線番号ln+1で指定される一つ下の線の音高座標との差分中央値gap/2を五線番号lnの音高座標yに加算する。
次いで、ステップSN5では、上記ステップSN4の五線座標取得処理で得られる音高座標y(描画する音符の玉のy座標)をレジスタcにストアする。続いて、ステップSN6では、描画小節の最左座標lから元画像の表示開始位置bxを減算した値(l−bx)に表示倍率scaleを乗算して表示位置slを、描画小節の最右座標rから元画像の表示開始位置bxを減算した値(r−bx)に表示倍率scaleを乗算して表示位置srを、レジスタcの音高座標yから元画像の表示開始位置byを減算した値(c−by)に表示倍率scaleを乗算して表示位置scをそれぞれ取得する。
なお、描画小節の最左座標lおよび最右座標rは、小節データMeas[描画小節番号nb].Rect(小節の範囲を規定する矩形座標値)から読み出される左端Leftおよび右端Rightである。元画像の表示開始位置bx,byは、それぞれ楽譜制御データエリアscoreCtrlのレジスタx,レジスタyから読み出される。表示倍率scaleは、楽譜制御データエリアscoreCtrlのレジスタScaleから読み出される。
次に、ステップSN7では、座標(dx+sl,dy+sc)から座標(dx+sl+(sr−sl)/10,dy+sc)へ補助線を描画し、続くステップSN8では、座標(dx+sr−(sr−sl)/10,dy+sc)から座標(dx+sr,dy+sc)へ補助線を描画する。
そして、ステップSN9では、ポインタlntmpをデクリメントした後、前述のステップSN2に処理を戻す。以後、デクリメントされたポインタlntmpの値が補助線番号lineexより小さくなるまで上述したステップSN2〜SN9を繰り返し、デクリメントされたポインタlntmpの値が補助線番号lineexより小さくなると、上記ステップSN2の判断結果が「NO」になり、本処理を終える。
このように、五線上部の補助線描画処理では、ポインタlntmpの値を五線番号lnとして、その五線番号lnに対応して取得される音高座標yに基づいて描画小節における五線上部に補助線を描画し、描画し終える毎にデクリメントされるポインタlntmpの値が補助線番号lineexより小さくなるまで次の補助線の描画を繰り返す。
(14)五線下部の補助線描画処理の動作
次に、図24を参照して五線下部の補助線描画処理の動作を説明する。前述した補助線描画処理のステップSM4(図22参照)を介して本処理が実行されると、CPU10は、図24に図示するステップSP1に処理を進め、ポインタlntmpに初期値「5」をセットする。続いて、ステップSN2では、ポインタlntmpの値が補助線番号lineex以下であるか否かを判断する。
ポインタlntmpの値が補助線番号lineex以下であると、判断結果は「YES」となり、ステップSP3に進み、ポインタlntmpの値を五線番号lnとし、この五線番号lnおよび五線間フラグintからなる五線情報を設定する。次いで、ステップSP4では、五線座標取得処理を実行する。
五線座標取得処理では、描画する小節番号nb、パート番号handおよび上記ステップSP3で設定される五線情報(五線番号ln、五線間フラグint)が与えられると、描画する小節番号nbおよびパート番号handに対応付けられた小節データMeas[nb]から読み出される五線譜中の線のy座標値Meas[nb].Line[hand][ln]に基づいて音高座標y(描画する音符の玉のy座標)を取得し、五線間フラグintが「1」(五線の間)の場合には、五線番号ln+1で指定される一つ下の線の音高座標との差分中央値gap/2を五線番号lnの音高座標yに加算する。
次いで、ステップSP5では、上記ステップSP4の五線座標取得処理で得られる音高座標y(描画する音符の玉のy座標)をレジスタcにストアする。続いて、ステップSP6では、描画小節の最左座標lから元画像の表示開始位置bxを減算した値(l−bx)に表示倍率scaleを乗算して表示位置slを、描画小節の最右座標rから元画像の表示開始位置bxを減算した値(r−bx)に表示倍率scaleを乗算して表示位置srを、レジスタcの音高座標yから元画像の表示開始位置byを減算した値(c−by)に表示倍率scaleを乗算して表示位置scをそれぞれ取得する。
なお、描画小節の最左座標lおよび最右座標rは、小節データMeas[描画小節番号nb].Rect(小節の範囲を規定する矩形座標値)から読み出される左端Leftおよび右端Rightである。元画像の表示開始位置bx,byは、それぞれ楽譜制御データエリアscoreCtrlのレジスタx,レジスタyから読み出される。表示倍率scaleは、楽譜制御データエリアscoreCtrlのレジスタScaleから読み出される。
次に、ステップSP7では、座標(dx+sl,dy+sc)から座標(dx+sl+(sr−sl)/10,dy+sc)へ補助線を描画し、続くステップSP8では、座標(dx+sr−(sr−sl)/10,dy+sc)から座標(dx+sr,dy+sc)へ補助線を描画する。そして、ステップSP9では、ポインタlntmpをインクリメントして歩進させた後、前述のステップSP2に処理を戻す。
以後、歩進されたポインタlntmpの値が補助線番号lineexを超えるまで上述したステップSP2〜SP9を繰り返し、歩進されたポインタlntmpの値が補助線番号lineexより大きくなると、上記ステップSP2の判断結果が「NO」になり、本処理を終える。
このように、五線下部の補助線描画処理では、ポインタlntmpの値を五線番号lnとして、その五線番号lnに対応して取得される音高座標yに基づいて描画小節における五線下部に補助線を描画し、描画し終える毎に歩進されるポインタlntmpの値が補助線番号lineexを超えるまで次の補助線の描画を繰り返す。
(15)具体的な画面表示の一例
次に、図25〜図27を参照し、前述したメインルーチンの動作に基づく具体的な画面表示の一例について説明する。なお、図25は第1の画面表示例を、図26は第2の画面表示例を、図27は第3の画面表示例をそれぞれ示す図である。
a.第1の画面表示例
図25に図示する第1の画面表示例では、現在小節(カーソルが位置する小節)を含む描画範囲の楽譜において、例えば第1小節先頭の音符(右手パートのノートナンバ#79の音符および左手パートのノートナンバ#52の音符)を押鍵すべきところ、右手で#79の鍵と、左手で#48の鍵とを押鍵したとする。この場合、右手の押鍵#79は正しい押鍵であるが、左手の押鍵#48は間違った押鍵ということになる。そうすると、右手パートの#79の押鍵に対応した音高線(青線BL)が描画されると共に、押鍵音#79と同じ音高の該当音である第1小節第4音および第4小節第1音を○印で囲むマーク表示が為される。
一方、左手パートのノートナンバ#52の音符に対応する鍵を押鍵すべきところ間違えて#48の鍵を押鍵すると、押鍵音#48は描画範囲内で使われている音ではないので、音高線(赤線RL)のみ描画する。こうした楽譜表示形態によれば、右手パートでは適正な押鍵が為されたのに対し、左手パートでは弾くべき音高よりも低い音を間違って押鍵したことをユーザに対して一目瞭然にすることが出来る。これらの処理は、図11における、音高pを順次変化させながらのループ処理で、ステップSD5で押鍵されていると判断された各音につき、ステップSD6での該当音検索処理(図15)で、描画範囲内に右手若しくは左手で該当音があるか否かを検索し、その後ステップSD7での状態描画処理(図16〜)で、該当音と検知された音について描画色をセットした上で音高線描画処理(ステップSH6、SH10、SH15、SH18、図18)で音高線が描かれる事で実現している。また、ステップSG8における該当マークの描画処理により、該当音について○印で囲むマーク表示が行われる。また、これに限らず、相応の方法により、現在表示対象となっている描画範囲内で、押鍵された音と同じ音があるか否かを検索して、その有無により描画色を変えて五線上に音高線を表示すると共に、該当音を丸で囲む表示を行うことで実現できる。
b.第2の画面表示例
図26に図示する第2の画面表示例では、現在小節(カーソルが位置する小節)を含む描画範囲の楽譜において、ノートナンバ#60(C音)の鍵を押鍵している状態を示している。この場合、左手パートの#60の押鍵に対応した音高線(青線BL)が描画されると共に、同じ音高の該当音である第6小節第3音(C音)を○印で囲むマーク表示が為される。一方、押鍵音高と同じ五線位置にある第4小節第3音(C#音)には、臨時記号#が付加されている為、半音高い鍵の押鍵をガイドする半音上がるマーク「>」が描画される。この右矢印マークは、当該音について、ピアノの鍵盤上で、一つ右の鍵(C#の黒鍵)を押鍵すべきことを表している。こうした楽譜表示形態によれば、弾いた音と楽譜上の音符との対応関係を一目瞭然にすることが出来る。
c.第3の画面表示例
図27に図示する第3の画面表示例では、現在小節(カーソルが位置する小節)を含む描画範囲の楽譜において、ノートナンバ#61(C#音)の鍵を押鍵している状態を示している。この場合、左手パートの#61の押鍵に対応した音高線(青線BL)が描画されると共に、同じ音高の該当音である第4小節第3音(C#音)を○印で囲むマーク表示が為される。一方、押鍵音高と同じ五線位置にある第6小節第3音(C音)には、半音低い鍵の押鍵をガイドする半音下がるマーク「<」を描画する。この左矢印マークは、当該音について、ピアノの鍵盤上で、一つ左の鍵(Cの白鍵)を押鍵すべきことを表している。
こうした楽譜表示形態によれば、弾いた音と楽譜上の音符との対応関係を一目瞭然にすることが出来る。これらの第2および第3の画面表示例については、ステップSJ15およびステップSJ18で、半音上がる/下がるマークを表示することにより実現されている。また、これに限らず、相応の方法により、現在表示対象となっている描画範囲内で、押鍵された音と同じ五線上に表示されるものの、臨時記号等やミスタッチ等により、押鍵されている音より半音上または下の音があるか否かを検索して、かかる音が検索された場合には、半音上の場合に右矢印、半音下の場合に左矢印などの所定のマーク表示を当該音符に付すことで実現できる。この場合のマーク表示は、上記に限られず、それぞれの場合で所定の色で所定のマークを表示したり、「#」、「♭」、やナチュラルの記号などを表示したり、種々の方法が可能である。また、臨時記号の関係等から、同じ五線位置にあるものの、音高が2半音異なっている音の場合(例えば、押鍵音が♭音で、楽譜上の記譜音が#音の場合など)には、例えば、「>>」や「<<」のように、マークを2つ表示して、2半音違いであることを明示するようにしても良い。
以上説明したように、本実施形態では、元画像(楽譜の画像データ)をディスプレイ表示サイズに合わせて楽譜表示し、現在の小節(カーソルが位置する小節)を含む描画範囲内のパート境界音(右手パート最低音および左手パート最高音)を設定する。そして、ユーザの押鍵で生じる押鍵音と同じ音高の演奏データNoteに対応する描画範囲内の音符の玉を該当マーク(○印)で囲んで該当音として表示すると共に、パート境界音に基づき該当音が右手パート(又は左手パート)に含まれると判別された場合には、描画範囲内で押鍵音と同じ音高を示す音高線を該当色で描画し、その音高線と同じ五線上に位置するが押鍵音より半音下(又は半音上)の音符に半音下がるマーク「<」(又は半音上がるマーク「>」)を描画し、一方、該当音が左右両パートの何れにも含まれないと判別された場合には、描画範囲内で押鍵音と同じ音高を示す音高線を非該当色で描画し、その音高線と同じ五線上に位置するが押鍵音より半音下(又は半音上)の音符に半音下がるマーク「<」(又は半音上がるマーク「>」)を描画するので、弾いた音の正誤や弾いた音と楽譜中の音符との対応関係を楽譜上で一目瞭然にすることができる。また、弾いた音の正誤や弾いた音と楽譜中の音符との対応関係が楽譜上で一目瞭然になることから、楽譜を読み取る能力が向上するという効果も奏する。
なお、上述した実施形態では、描画範囲を決めるカーソル位置を固定としたが、これに限らず、例えば楽譜に表示される曲のテンポに同期してカーソル位置を移動制御したり、ユーザ設定される移動速度でカーソル位置を移動させたりする態様としても構わず、そのようにすればカーソル位置の移動に応じて描画範囲も移動する為、弾いた音の正誤や弾いた音と楽譜中の音符との対応関係が、曲の最初から最後まで楽譜上で一目瞭然となり演奏練習に好適となる。
以上、本発明の実施の一形態について説明したが、本発明はそれに限定されるものではなく、本願出願の特許請求の範囲に記載された発明とその均等の範囲に含まれる。以下では、本願出願当初の特許請求の範囲に記載された各発明について付記する。
(付記)
[請求項1]
楽譜を表示手段に表示させる楽譜表示手段と、
前記表示手段に表示された楽譜の所定範囲を指定する範囲指定手段と、
音高の指定が入力される音高入力手段と、
前記範囲指定手段により指定された楽譜の所定範囲において、前記音高入力手段により入力された音高に対応する楽譜表示上の位置に音高線を描画する状態描画手段と、
を具備することを特徴とする演奏練習装置。
[請求項2]
前記範囲指定手段は、前記表示手段に表示された楽譜において、カーソルが位置する小節を含む段の開始小節から終了小節まで範囲指定することを特徴とする請求項1記載の演奏練習装置。
[請求項3]
前記状態描画手段は、前記範囲指定手段により指定された楽譜の所定範囲において、前記音高線と同じ五線上に位置し、かつ前記音高入力手段により入力された音高と音階が異なる音符にマークを描画することを特徴とする請求項1または2に記載の演奏練習装置。
[請求項4]
前記状態描画手段は、前記範囲指定手段により指定された楽譜の所定範囲において、前記音高入力手段により入力された音高と同じ音高の音符を検索し、該当する音符を該当音として識別表示することを特徴とする請求項1から3のいずれかに記載の演奏練習装置。
[請求項5]
前記状態描画手段は、前記範囲指定手段により指定された楽譜の所定範囲において、前記入力された音高と同じ音高の音符が存在していた場合に第1の表示色で音高線を描画し、前記入力された音高と同じ音高の音符が存在していない場合に第2の表示色で音高線を描画することを特徴とする請求項1から4のいずれかに記載の演奏練習装置。
[請求項6]
前記状態描画手段は、前記入力された音と同じ五線上に位置し、かつ入力音高より高い音符に対して第1のマーク表示を描画し、前記入力された音と同じ五線上に位置し、かつ入力音高より低い音符に対して第2のマーク表示を描画することを特徴とする請求項3に記載の演奏練習装置。
[請求項7]
前記第1のマーク表示が右方向矢印表示であり、前記第2のマーク表示が左方向矢印表示であることを特徴とする請求項6記載の演奏練習装置。
[請求項8]
前記範囲指定手段により指定された楽譜の所定範囲においてパートを分別する境界音を取得する境界音取得手段を更に備えることを特徴とする請求項1から7のいずれかに記載の演奏練習装置。
[請求項9]
前記境界音取得手段は、
前記範囲指定手段により指定された楽譜の所定範囲において、パートを分別する境界音となる第1パート最低音および第2パート最高音を特定する特定手段と、
前記特定手段により特定された第1パート最低音が第2パート最高音より高く、かつ第1パート最低音と第2パート最高音との間にC4音が含まれる場合には、第1パート最低音および第2パート最高音をC4音に設定する第1の設定手段と、
前記特定手段により特定された第1パート最低音が第2パート最高音より高く、かつ第2パート最高音がC4音以上もしくは第1パート最低音がC4音以下の場合には、第1パート最低音を第2パート最高音の一つ上の音に設定する第2の設定手段と
を備えることを特徴とする請求項8記載の演奏練習装置。
[請求項10]
前記状態描画手段は、
前記境界音取得手段により取得された境界音に基づき前記該当音が何れかのパートに包含されると判別した場合に、前記範囲指定手段により指定された楽譜の所定範囲内で入力音高と同じ音高を示す音高線を第1の表示形態で描画すると共に、当該音高線と同じ五線上に位置し、かつ入力音高と半音差ある音符に対してガイド用マークを描画する第1の描画手段と、
前記境界音取得手段により取得された境界音に基づき前記該当音が何れのパートにも包含されないと判別した場合に、前記範囲指定手段により指定された楽譜の所定範囲内で入力音高と同じ音高を示す音高線を第2の表示形態で描画すると共に、当該音高線と同じ五線上に位置し、かつ入力音高と半音差ある音符に対してガイド用マークを描画する第2の描画手段と、
を備えることを特徴とする請求項8または9に記載の演奏練習装置。
[請求項11]
楽譜を表示手段に表示させる楽譜表示手段と、
前記表示手段に表示された楽譜の所定範囲を指定する範囲指定手段と、
音高の指定が入力される音高入力手段と、
前記範囲指定手段により指定された楽譜の所定範囲において、前記音高入力手段により入力された音高に対応する楽譜表示上の位置に音高線を描画する状態描画手段と、
を具備することを特徴とする楽譜表示装置。
[請求項12]
楽譜を表示手段に表示させる楽譜表示手段と、
前記表示手段に表示された楽譜の所定範囲を指定する範囲指定手段と、
音高の指定が入力される音高入力手段と、
前記範囲指定手段により指定された楽譜の所定範囲において、前記音高入力手段により入力された音高に対応する楽譜表示上の位置に音高線を描画する状態描画手段と、
を具備することを特徴とする電子楽器。
[請求項13]
楽譜を表示手段に表示させる楽譜表示ステップと、
前記楽譜表示ステップで表示された楽譜の所定範囲を指定する範囲指定ステップと、
音高の指定入力を受け付ける音高入力ステップと、
前記範囲指定ステップで指定された楽譜の所定範囲において、前記音高入力ステップで入力された音高に対応する楽譜表示上の位置に音高線を描画する状態描画ステップと、
を具備することを特徴とする演奏練習方法。
[請求項14]
楽譜を表示手段に表示させる楽譜表示ステップと、
前記楽譜表示ステップで表示された楽譜の所定範囲を指定する範囲指定ステップと、
音高の指定入力を受け付ける音高入力ステップと、
前記範囲指定ステップで指定された楽譜の所定範囲において、前記音高入力ステップで入力された音高に対応する楽譜表示上の位置に音高線を描画する状態描画ステップと、
を具備することを特徴とする楽譜表示方法。
[請求項15]
コンピュータに、
楽譜を表示手段に表示させる楽譜表示ステップと、
前記楽譜表示ステップで表示された楽譜の所定範囲を指定する範囲指定ステップと、
音高の指定入力を受け付ける音高入力ステップと、
前記範囲指定ステップで指定された楽譜の所定範囲において、前記音高入力ステップで入力された音高に対応する楽譜表示上の位置に音高線を描画する状態描画ステップと、
を実行させることを特徴とするプログラム。