以下、添付図面を参照して、本発明の実施の形態について説明する。図1は、本実施の形態にかかる演奏練習支援システムのハードウェア構成を示すブロックダイヤグラムである。図1に示すように、演奏練習支援システムのハードウェアは、CPU12、RAM14、ROM16、入力装置18、表示装置20、MIDIインタフェース(I/F)22、24、鍵盤26、楽音生成回路28およびサウンドシステム40を含む。
図1の例では、CPU12、RAM14、ROM16、入力装置18、表示装置20およびMIDI_I/F22は、通常のパーソナルコンピュータにより実現され得る。また、MIDI_I/F24、鍵盤26、楽音生成回路28およびサウンドシステム30は、通常の電子鍵盤楽器により実現され得る。したがって、本実施の形態では、パーソナルコンピュータと電子鍵盤楽器とをMIDIケーブルで接続することにより、演奏練習支援システムを構成することができる。
CPU14は、演奏練習支援システムの制御、後述する音符データ等の読み出し、演奏支援情報の生成、MIDI_I/F22から出力すべきMIDIデータの生成などの処理を実行する。ROM16は、プログラムやプログラムの実行の際に使用される定数などを記憶する。RAM14は、プログラムの実行の過程で必要な変数、入力データ、出力データなどを一時的に記憶する。
入力装置18は、キーボードやマウスを含み、演奏者により入力装置18に入力された情報をCPU12に与える。表示装置12の画面上には、楽譜や鍵盤を描いた画像データが表示され得る。
楽音生成回路28は、いわゆる音源であり、CPU12からMIDI_I/F24を介して与えられたMIDIデータに基づいて、所定の音高でかつ所定の音量(ベロシティ)の楽音データを生成する。鍵盤26は、演奏者が押鍵した鍵の情報を押鍵情報として、また、離鍵した件の情報を離鍵情報として出力する。押鍵情報は、MIDI_I/F22、24を介して、CPU12に伝達される。
サウンドシステム30は、増幅器、スピーカなどを含み、楽音生成回路28により生成された楽音データに基づく音響信号を出力する。
図2は、本実施の形態にかかる演奏練習支援システムの概要を示すブロックダイヤグラムである。図2に示すように、本実施の形態にかかる演奏練習支援システムにおいては、後述する発音中データや音符データのうち、演奏者が演奏すべきパートのデータ(演奏データ)が、演奏支援情報生成部32により取得される。演奏支援情報生成部32は、演奏データに基づいて、演奏者が押鍵すべき指を指定する運指情報、および、演奏者の指の位置を示す指座標情報を生成する(符号201参照)。
また、鍵盤26からは、前述したように押鍵情報および離鍵情報(符号202参照)が与えられる。演奏動作正誤判定部34は、運指情報・指座標情報201と、押鍵情報・離鍵情報202に基づいて、演奏の正誤を判定する。また、楽曲データのうち伴奏パートのデータ(伴奏データ)は、再生処理部36により取得される。演奏の正誤の情報とは、押鍵すべきタイミングで、押鍵すべき鍵が押鍵されたか否かを示す情報、ずれが生じている場合には、タイミングのずれの程度および音高のずれの程度を示す情報などを含む。
再生処理部36は、演奏の正誤情報にしたがって、演奏パートのデータのうち所定の条件を満たすデータに対応する楽音を再生し、或いは、タイミングのずれや音高のずれにしたがってベロシティを変化させた楽音を再生する。また、伴奏データについては、当該伴奏データに示される音高およびベロシティの楽音を再生する。
図2に示す演奏支援情報生成部32および演奏動作正誤判定部34は、図1に示すCPU12により実現される。また、図2に示す再生処理部36は、図1に示すCPU12および楽音生成回路28により実現される。
概略的に、本実施の形態にかかる演奏練習支援システムにおいては、
第1の検索手段が、後述する発音中データバッファに格納された発音中データの中から、発音が行われていないことを示す発音保留フラグを有し、かつ当該発音中データにより特定される音符データの発音開始タイミングと、入力手段による音高情報の入力タイミングとの差が所定時間内の発音中データを検索し、
第1の判定手段が、第1の検索手段により検索された発音中データにより特定される音符データの音高と音高情報の音高との差が所定範囲内であるか否か判定し、
第1の発音指示手段が、第1の判定手段により所定範囲内と判定された音符データの音高に基づいた楽音の発音を接続された音源に指示するとともに、当該音符データに対応する発音中データに含まれる発音保留フラグを消去する。
また、第2の検索手段が、音符データバッファに格納された音符データの中から、発音開始タイミングが音高情報の入力タイミングより後でかつ両タイミングの差が所定時間内の音符データを検索し、
第2の判定手段が、第2の検索手段により検索された音符データの音高と前記音高情報の音高との差が所定範囲内であるか否か判定し、
第2の発音指示手段が、第2の判定手段により所定範囲内と判定された音符データの音高に基づいた楽音の発音を接続された音源に指示する。
また、支援情報生成手段は、音符データの鍵の座標および押鍵すべき指を示す情報に基づいて、当該押鍵すべき指で押鍵した場合に他の指の鍵盤上の位置を示す指座標情報を生成し、当該生成された指座標情報を前記音符データバッファに格納する。
第1および第2の検索手段、第1および第2の発音指示手段は、図2の再生処理部36にほぼ相当する。第1および第2の判定手段は、図2の演奏動作性誤判定部34に相当する。また、支援情報生成手段は、図2の演奏支援情報生成部32に相当する。
図3(a)は、トラックごとの属性を示すトラックデータを説明する図である。図3(a)に示すように、トラックデータバッファ300には、トラックごとのデータ(トラックデータ)を含む。トラックデータのレコードは、項目としてトラックの種類を示すiplayType、トラック先頭の音符データのポインタであるpFirstME、および、出力チャンネルを示すiChannelを有している。トラック種類iPlayTypeの値「0」はそのトラックが右手パートであることを示し、「1」は左手パートであることを示し、また、「2」は伴奏パートであることを示す。したがって、あるチャンネルについて、トラック種類iPlayTypeが「0」または「1」である場合、そのトラックの音符データは「演奏データ」を構成する。また、トラック種類iPlayTypeが「2」である場合には、そのトラックの音符データは「伴奏データ」を構成する。
図4は、音符データの構成を示す図である。図4に示すように、音符データバッファ400には、ミディイベント(MidiEvent)ごとのデータ(音符データ)が含まれる。音符データのレコードは、発音開始時刻ITime、発音時間IGate、発音開始時刻(絶対時刻)ITmsec、音高(ピッチ)Pitch、ベロシティiVel、鍵盤の座標iPosX、再生時の状態iPlayStatus、割り振られた運指情報cfig、右手左手何れかのパート情報iHand、各指の横方向の座標sfigPosX[0]〜sfigPosX[4]、手の横方向の座標sHandPosX、和音構成音フラグcIsHarm、和音の先頭音(最下音)へのポインタpHTop、和音の終端音(最高音)へのポインタpHTail、次の音符データへのポインタprev、および、前の音符データへのポインタnextを有する。
発音開始時刻ITime、発音時間IGateは、システムのクロックにしたがった単位での時刻(システム時刻)、時間であり、その一方、発音開始時刻(絶対時刻)ITmsecはミリ秒を単位とする絶対時刻である。
鍵盤座標iPosXは以下のような値となる。低音側の鍵から高音側の鍵に向けて、各白鍵には、0、2、4、6、というように増大する偶数が割り当てられる。その一方、黒鍵には、隣接する2つの白鍵の座標の値の中間の奇数が割り当てられる。
たとえば、C1を最低音とする鍵盤であれば、以下のような鍵盤座標となる。
C1:0
C#1:1
D1:2
D#1:3
E1:4
F1:6
F#1:7
G1:8
G#1:9
A1:10
A#1:11
B1:12
C2:14
:
再生時の状態iPlayStatusは、「0」〜「3」の値をとり、それぞれ、以下のような意味を示す。「0」であれば消音状態であること、「1」であれば、ミディイベントが存在し、かつ、ノートオンが実行されていること、「2」であれば、ミディイベントが存在しているが、ノートオンがまだ実行されていないこと、「3」であれば、ノートオンのみが実行されていること、を示す。
ここに、ミディイベントが存在することは、発音開始時刻に到達していることを意味する。その一方、ノートオンが実行されていることは、演奏者によりそのミディイベントに対応する押鍵がされていることを意味する。
運指情報cfigは、このレコードに対応する鍵を押鍵すべき指を示す。また、パート情報iHandは、右手の指で押鍵すべきか、或いは、左手の指で押鍵すべきかを示す。横方向の座標sfigPosX[0]〜sfigPosX[4]は、このレコードに対応する押鍵をする際に、それぞれの指(0:親指〜4:小指)がどの位置(座標)にいるかを示す。
手の横方向の座標sHandPosXは、手の位置を示す。
なお、ここにいう座標とは、上述した鍵盤座標に相当する。つまり、iHandが左手を示し、かつ、sfigPosX[4]=14であれば、左手の小指が鍵C2に位置すべきことを示す。
和音構成音フラグclsHarmは、当該レコードで特定される音符が和音構成音かを示す。clsHarmが「0」であることは、その音符が、和音構成音ではないことを示す。その一方、clsHarmが「1」であることは、その音符が和音構成音であることを意味する。
なお、図4において、符号401および402で示す一群のデータ項目が演奏支援情報を構成する。
図3(b)および図3(c)は、本実施の形態にかかる再生制御データを示す図である。再生制御データは、再生処理時の制御のためのデータ構造体である。
図3(b)は、基本データバッファを示し、図3(c)は、発音中の音符データの格納バッファ(発音中データバッファ)を示す。図3(b)に示すように、基本データバッファ301には基本データが格納される。基本データは、現在時刻INowTick、各トラックの次の音符データへのポインタMidiEvents[0]〜[n]、演奏状態iPStatus、テンポiNowTempo、最後に上記現在時刻INowTickが更新されたシステム時刻ITickUpdate、途中停止用フラグinterruption、および、発音中の音符データmePlaying[0]〜[N]が含まれる。次の音符データへのポインタMidiEvents[0]〜[n]は、それぞれ、音符データバッファ400の音符データを特定するポインタである。
発音中の音符データmePlaying[0]〜[N]については、それぞれ発音中データバッファ302にさらに必要な情報が格納される。図3(c)に示すように、発音中データのレコードは、各MidiEventについて、音符データ(MidiEvent[])へのポインタpME、および、発音保留フラグiStatusを含む。
基本データの演奏状態iPStatusが「0」であることは、停止されている状態を示し、「1」であることは再生中であることを示す。また、iPStatusが「2」であることは、待機中であることを示す。
また、発音中データの発音保留フラグiStatusが「0」であることは、発音保留中であることを示し、「1」であることは、ミディアウト(MIDI−OUT)済であることを示す。
なお、図3および図4に示すトラックデータバッファ、音符データバッファ、基本データバッファおよび発音中データバッファは、RAM14およびROM16に設けられる。予め定められたデータは、ROM16に記憶され、処理により生成されたデータは、RAM14に記憶される。
図5は、本実施の形態にかかる演奏練習支援システムにて実行されるメインフローの例を示す図である。図1に示すように、CPU12は、RAM14に記憶された、処理において使用されるパラメータやフラグを初期化する(ステップ501)。次いで、CPU12は、ROM16やRAM14から、音符データなどを読み込み(ステップ502)、演奏支援情報を生成し、RAM14に記憶する(ステップ503)。
ここに、ステップ502においては、図3や図4に示す、トラックデータ、発音中データ、基本データも、RAM14やROM16から必要に応じて読み出される。演奏支援情報の生成(ステップ503)については後に詳述する。
CPU12は、演奏者による入力装置18の操作によって終了指示を受け付けていない場合には(ステップ504でNo)、入力装置18の操作による再生指示を受け付けたか否かを判断する(ステップ505)。ステップ505でYesと判断された場合には、CPU12は、再生処理を起動させ(ステップ506)、また、MIDI−IN処理を起動させる(ステップ507)。再生処理およびMIDI−IN処理については後に詳述する。
再生中で、かつ、停止指示を受け付けた場合には(ステップ508でYes)、CPU12は、図3(b)の基本データ中の途中停止用フラグinterruptionを「TRUE」にセットする(ステップ509)。
ステップ505〜509は、終了指示が受け付けられる(ステップ504でYes)まで繰り返される。
図5のステップ503の演奏支援情報生成処理についてより詳細に説明する。図6は、演奏支援情報生成処理の例を示すフローチャートである。演奏支援情報生成部32(図2参照)は、処理で使用する変数を初期化して(ステップ601)、音符データごとに(つまり音符ごとに)、押鍵する指の座標を算出して、座標を示す情報等を音符データのレコード中、演奏支援情報としてRAM14に格納する(ステップ602)。また、演奏支援情報生成部32は、上記押鍵している状況(現在の状況)を考慮して他の指の座標を算出し、当該座標を示す情報等を、RAM14中の音符データバッファに、演奏支援情報として格納する(ステップ603)。
次に、ステップ602の押鍵する指の座標設定処理について図7を参照して説明する。図7に示すように、演奏支援情報生成部32は、処理対象の音符データを特定するポインタmeを音符データの先頭レコードに設定する(ステップ701)。演奏支援情報生成部32は、全ての音符データについて処理が終了するまで(ステップ702でYes)、ステップ703以下の処理を実行する。
まず、演奏支援情報生成部32は、指を使っている否か、つまり、押鍵しているか否かを示すフラグiFigOn[0]〜[4]、同時に押鍵する鍵の中に黒鍵があるか否かを示すフラグiBK[0]〜[4]、および、処理対象となる指を特定するパラメータifigをそれぞれ初期化する(ステップ703)。
演奏支援情報生成部32は、処理対象となる指を示すパラメータifigが5以上である場合、つまり、5つの指のそれぞれについての処理が終了していれば(ステップ704でNo)、ポインタmeを次の音符データに移動させる(ステップ705)。
これに対して、パラメータifigが5より小さい場合(ステップ704でYes)には、演奏支援情報生成部32は、当該音符データについて、ifigで示される指の横方向の座標sfigPosX[ifig]の初期値として「−1」を与える(ステップ706)。次いで、演奏支援情報生成部32は、ifigが、処理対象となるレコードに割符振られた運指cfigと一致する場合には(ステップ707でYes)、処理対象となる指ifigの横方向の座標sfigPosX[ifig]として、当該音符データの鍵盤の座標iPosXをセットする(ステップ708)。
次いで、演奏支援情報生成部32は、当該音符データについて、和音フラグcIsHarmが0より大きい場合、つまり当該音符データにより特定される音符が和音構成音である場合には(ステップ709でYes)、同じタイミングで押鍵する指の座標、つまり、和音として押鍵する指の座標の設定処理を実行する(ステップ710)。
次いで、演奏支援情報生成部32は、指を特定するパラメータifigをインクリメントする(ステップ711)。
図8は、ステップ708の同じタイミングで押鍵する指の座標の設定処理の例を示すフローチャートである。図8に示すように、演奏支援情報生成部32は、ポインタmehとして、処理対象となっている音符データにおける和音の先頭音へのポインタpHTopをセットする(ステップ801)。
また、演奏支援情報生成部32は、パラメータcfigHとして、当該音符データについて割り振られた運指cfigをセットする(ステップ802)とともに、パラメータiFigOn[cfigH]として「1」をセットする(ステップ803)。
次いで、演奏支援情報生成部32は、当該音符データについて、指cfigHに関する指の座標sfigPosX[cfigH]について、上記ポインタmehで特定される音符データについての鍵盤の座標iPosXをセットする(ステップ804)。これらセットされた値は、RAM14に記憶される。
演奏支援情報生成部32は、ポインタmehが、処理対象となっている音符データの和音の終端音へのポインタpHTailと一致するか否かを判断し(ステップ805)、ステップ805でYesと判断される場合には、ステップ711に進む。ステップ805でNoと判断された場合には、ポインタmehを次の音符データを示すように移動させて(ステップ806)、ステップ802に戻る。
図8の処理は以下のような意味を有する。先に述べたようにiFigOn[0]〜[4]は、それぞれ、指を使っているかどうかを示すフラグである。図8の処理によって、処理対象の音符データにおいて、和音構成音を押鍵すべき指の横方向の座標sfigPosX[cfigH]として、当該和音構成音の音符データのレコード中の、割り振られた運指cfigがセットされることになる。
図7および図8の処理によって、ある音符データに対応する音符、および、当該音符が和音構成音であった場合には、当該和音構成音の音符に基づいて、その音符を押鍵する際における押鍵している指の横方向の座標sfigPosXが決定され、決定された値が、RAM14に記憶される。
次に、図6のステップ603についてより詳細に説明する。図9〜図11は、現在の状況を考慮した座標設定処理の例を示すフローチャートである。図9に示すように、演奏支援情報生成部32は、処理対象の音符データを特定するポインタmeを音符データの先頭レコードに設定する(ステップ901)。演奏支援情報生成部32は、全ての音符データについて処理が終了するまで(ステップ902でYes)、ステップ903以下の処理を実行する。
まず、演奏支援情報生成部32は、図7のステップ703と同様に、指を使っている否かを示すフラグiFigOn[0]〜[4]、同時に押鍵する鍵の中に黒鍵があるか否かを示すフラグiBK[0]〜[4]、および、処理対象となる指を特定するパラメータifigをそれぞれ初期化する(ステップ903)。
演奏支援情報生成部32は、ポインタmehとして、処理対象となっている音符データの和音の先頭音へのポインタpHTopをセットする(ステップ904)。
演奏支援情報生成部32は、パラメータcfigHとして、当該音符データについて割り振られた運指cfigをセットする(ステップ905)とともに、パラメータiFigOn[cfigH]として「1」をセットする(ステップ906)。
演奏支援情報生成部32は、ポインタmehが、処理対象となっている音符データの和音の終端音へのポインタpHTailと一致するか否かを判断し(ステップ907)、ステップ907でYesと判断される場合には、ステップ1001に進む。ステップ907でNoと判断された場合には、ポインタmehを次の音符データを示すように移動させて(ステップ908)、ステップ905に戻る。
ステップ905〜ステップ908においては、和音構成音cfigHについて、iFigOn[cfigH]に初期値「−1」を格納している。
図10に示すように、演奏支援情報生成部32は、パラメータifigを「0」に初期化する(ステップ1001)。次いで、演奏支援情報生成部32は、パラメータifigが「5」より小さいか否かを判断する(ステップ1002)。ステップ1002でYesと判断される場合には、演奏支援情報生成部32は、処理対象となる音符データにおいて、フラグiFigOn[ifig]が「0」であるか否かを判断する(ステップ1003)。
ステップ906においては、フラグiFigOn[cfigH]として「1」がセットされている。つまり、和音構成音については、指が使われていることを示すフラグ「1」がセットされている。したがって、ステップ1003でYesと判断されることは、パラメータifigで示される指が、押鍵のために使われていないことを意味している。
ステップ1003でYesと判断された場合には、演奏支援情報生成部32は、指の横方向の座標の高い側の候補値sfigHおよび低い側の候補値sfigLに、初期値「−1」を与える(ステップ1004)。演奏支援情報生成部32は、パラメータifgを、ifig+1と設定して(ステップ1005)、パラメータifgが、0以上5未満であるか否かを判断する(ステップ1006)。
ステップ1006でYesと判断された場合には、演奏支援情報生成部32は、iFigOn[ifg]が「1」であるか否かを判断する(ステップ1007)。ここでは、パラメータifgで特定される指が押鍵しているか否かが判断されている。
ステップ1007でYesと判断された場合には、演奏支援情報生成部32は、sFigHとして、処理対象となる音符データにおけるsfigPosX[ifg]に、2*(ifig−ifg)を加えた値をセットする(ステップ1008)。
次いで、演奏支援情報生成部32は、パラメータifgをインクリメントして(ステップ1009)、ステップ1006に戻る。
ステップ1007〜ステップ1009の処理においては、パラメータifigで特定される指の右側に押鍵している指があるか否かが判断され、指が存在する場合には、その指ifgについての横方向の座標sfigPosX[ifg]より白鍵1つだけ右側の鍵に相当する座標値を、sfigHとしてセットしている。
ステップ1006でNoと判断されると、演奏支援情報生成部32は、図11に示すように、パラメータifgを、「ifig−1」と設定して(ステップ1101)、パラメータifgが、0以上5未満であるか否かを判断する(ステップ1102)。ステップ1102でYesと判断された場合には、演奏支援情報生成部32は、演奏支援情報生成部32は、iFigOn[ifg]が「1」であるか否かを判断する(ステップ1103)。ここでは、パラメータifgで特定される指が押鍵しているか否かが判断されている。
ステップ1103でYesと判断された場合には、演奏支援情報生成部32は、sFigHとして、処理対象となる音符データにおけるsfigPosX[ifg]に、2*(ifig−ifg)を加えた値をセットする(ステップ1104)。
次いで、演奏支援情報生成部32は、ifgをデクリメントして(ステップ1105)、ステップ1102に戻る。
ステップ1103〜ステップ1105の処理においては、パラメータifigで特定される指の右側に押鍵している指があるか否かが判断され、指が存在する場合には、その指ifgについての横方向の座標sfigPosX[ifg]より白鍵1つ分だけ左側の鍵に相当する座標値を、sfigLとしてセットしている。
その後、演奏支援情報生成部32は、処理対象となる音符データのsfigPosX[ifig]、つまり、当該音符データのパラメータifigで特定される指の横方向の座標として、sfigHおよびsfigLの双方が存在すれば、その平均値(sfigH+sfigL)/2をセットし、sfigHのみが存在すれば、sfigHをセットし、或いは、sfigLのみが存在すればsfigLをセットする(ステップ1106)。
また、演奏支援情報生成部32は、sfMaxおよびsfMinを更新して、RAM14に一時的に記憶する(ステップ1107)。sfMaxは、sfigHの最高値であり、新たに算出されたsfigH>sfMaxであれば、新たなsfMaxとしてsfigHがセットされる。同様に、sfMinは、sfigLの最小値であり、sfigL<sfMinであれば、新たなsfMinとしてsfigLがセットされる。
ステップ1107の処理の後、演奏支援情報生成部32は、パラメータifigをインクリメントして(ステップ1108)、ステップ1002に戻る。
図10のステップ1002でNoと判断された場合、つまり、パラメータifigが5以上である場合には、演奏支援情報生成部32は、処理対象である音符データにおける手の横方向の座標sHandPosXとして、sfMaxおよびsfMinの平均値(sfMmax+sfMin)/2をセットする(ステップ1010)。その後、演奏支援情報生成部32は、処理対象となる音符データを特定するポインタを次のレコードに移動して(ステップ1011)、ステップ902に戻る。
図9〜図11の処理によって、押鍵していない指の横方向の座標も、その時点で押鍵している他の指の座標に基づいて算出され、音符データの項目としてRAM14に記憶される。
次に、ステップ506において起動される再生処理について説明する。図12および図13は、再生処理の例を示すフローチャートである。再生処理部36は、図12に示すように、RAM14に記憶された、再生処理において使用されるパラメータやフラグを初期化する(ステップ1201)。次いで、再生処理部36は、基本データバッファ(図3(b)参照)の基本データ中の現在時刻INowTickとして、システム時刻に基づく再生開始時刻をセットし(ステップ1202)、次いで、トラックを示すパラメータiTrを「0」に初期化する(ステップ1203)。
再生処理部36は、全てのトラックについての処理が終了する(ステップ1204でNo)まで、ステップ1205以下の処理を実行する。再生処理部36は、処理対象となる音符データを特定するポインタmeとして、Track[iTr]で特定されるトラックデータ(図3(a)参照)中のトラック最初の音符データpFirstMEをセットする(ステップ1205)。
次いで、再生処理部36は、ポインタmeにより特定される音符データの発音開始時刻ITime<基本データの現在時刻INowTickであるか否かを判断する(ステップ1206)。ステップ1206においては、現在時刻が、音符データ中の発音開始時刻に達しているか否かが判断される。
ステップ1206でNoと判断された場合には、再生処理部36は、トラックを示すパラメータiTrをインクリメントして(ステップ1209)、ステップ1204に戻る。
ステップ1206でYesと判断された場合には、再生処理部36は、トラックデータにおいて、トラックiTrの次の音符データへのポインタMidiEvents[iTr]として、meをセットする(ステップ1207)。次いで、再生処理部36は、音符データを特定するポインタmeを、次の音符データを指定するように移動させる(ステップ1208)。
ステップ1204でNoと判断された場合には、再生処理部36は、基本データの現在時刻INowTickが、最後の音符データに基づく、音符を消音すべき時間より大きいか否かを判断する(ステップ1301)。上記音符を消音すべき時間とは、末尾の音符データの発音開始時刻ITime+発音時間IGateに相当する。
ステップ1301でYesと判断された場合には、再生処理は終了する。その一方、ステップ1301でNoと判断された場合には、再生処理部36は、時刻計算処理(ステップ1302)、発音処理(ステップ1303)および消音処理(ステップ1304)を実行する。ステップ1302〜1304の各処理については後述する。
また、基本データの途中停止フラグinterruptionが「FALSE」であれば(ステップ1305でYes)、ステップ1301に戻る。その一方、途中停止フラグinterruptionが「TRUE」であれば(ステップ1305でNo)、発音中の音符データの全てについて消音処理を実行する(ステップ1306)。
図14は、本実施の形態にかかる時刻計算処理の例を示すフローチャートである。再生処理部36は、基本データの演奏状態iPStatusが「1」であるか否か、つまり再生中を示しているか否かを判断する(ステップ1401)。ステップ1401でYesと判断された場合には、再生処理部36は、ISysGateとして、コンピュータから取得したおおもとのシステム時刻と、基本データバッファ中の更新されたシステム時刻ITickUpdateとの差をセットする(ステップ1402)。ステップ1402においては、前回の時刻計算処理からどのくらいのシステム時刻が経過しているかを算出する。
次いで、再生処理部36は、ITickTmpとして、(60*1000/INowTempo)/Resoloution/ISysGateをセットし(ステップ1403)、セットされたITickTmpが「0」より大きいか否かを判断する(ステップ1404)。
ここに、INowTempoは、基本データバッファに格納されているテンポ値である。また、Resolutionは、解像度であり、たとえば、1/480秒に相当する値である。
ステップ1404でYesと判断された場合には、再生処理部36は、基本データのITickUpdateとして、システム時刻をセットし(ステップ1405)かつ、基本データのINowTickとして、INowTick+ITickTmpをセットする(ステップ1406)。これにより、基本データにおける時刻の情報が更新される。
図15および図16は、本実施の形態にかかる発音処理の例を示すフローチャートである。再生処理部36は、再生制御データの基本データを検索する(ステップ1501)。再生処理部36は、全てのトラックについての検索が終了していなければ(ステップ1502でNo)、当該処理対象となるトラックについて、次の音符データへのポインタを参照して、音符データを特定して、当該音符データを取得する(ステップ1503)。また、再生処理部36は、トラックデータ(図3(a))を参照して、処理対象となるトラック種類iPlayTypeから、当該トラックが演奏データであるか否かを判断する(ステップ1504)。
ステップ1504でNoと判断された場合には、再生処理部36は、音符データの発音開始時刻ITimeが、現在時刻INowTickを経過しているか否かを判断する(ステップ1505)。
ステップ1505でNoと判断された場合には、再生処理部36は、処理対象を次のトラックとする(ステップ1510)。
ステップ1505でYesと判断された場合には、再生処理部36は、発音中データバッファに、当該音符データを特定するためのポインタpMEを格納する(ステップ1506)。次いで、再生処理部36は、発音中データバッファに格納したポインタpMEにより示される音符データの発音を楽音生成回路28に対して指示する(ステップ1507)。
再生処理部36は、基本データにおいて、処理対象となっているトラックの音符データとして、次の音符データを示すポインタを格納する(ステップ1508)。その後、当該処理対象を次の音符データとする(ステップ1509)。
ステップ1504でNoと判断された場合には、再生処理部36は、音符データにおいて、再生時の状態iPlayStatusが「1」であるか否かを判断する(ステップ1601)。ステップ1601でYesと判断された場合には、再生処理部36は、発音中データバッファに、当該音符データを示すポインタを追加する(ステップ1602)。
その一方、ステップ1601でNoと判断された場合には、再生処理部36は、音符データの発音開始時刻ITimeが、現在時刻INowTickを経過しているか否かを判断する(ステップ1603)。ステップ1603でNoと判断された場合には、再生処理部36は、検索すべきトラックを次のトラックとする(ステップ1510)。
ステップ1603でYesと判断された場合には、再生処理部36は、発音中データバッファに、当該音符データを特定するためのポインタpMEを格納する(ステップ1604)。次いで、再生処理部36は、発音中データバッファの発音中データにおいて、発音保留フラグiStatusに「0」をセットする(ステップ1605)
その後、再生制御データの基本データにおいて、処理対象となっているトラックの音符データとして、次の音符データを示すポインタを格納する(ステップ1606)。その後、当該次の音符データについての処理に移行する(ステップ1607)。
ステップ1601において、再生時の状態iPlayStatusが「1」であることは、ミディイベントが存在し、かつ、ノートオンが実行されていることを意味しており、本来の発音開始時刻よりも早いタイミングで演奏者により押鍵されていることを意味している。この場合には、後述するMIDI−IN処理において対応がされるため、発音処理においては特に何もしない。
その一方、ステップ1601において、再生時の状態iPlayStatusが「1」以外であることは、少なくとも早いタイミングでの押鍵はなかったことを意味している。この場合には、発音開始時間より遅く押鍵される場合もあるし、押鍵されない場合もある。したがって、ステップ1605において、発音データバッファの対応する発音中データにおいて、発音保留フラグiStatusを「0」にセットしておくことで、後述するように、発音開始時間より遅いタイミングであっても、許容時間内に押鍵があれば、発音できるようにする。
次に、消音処理について説明する。図17は、本実施の形態にかかる消音処理の例を示すフローチャートである。再生処理部36は、発音中データバッファの発音中データを検索する(ステップ1701)。
再生処理部36は、全ての発音中データについての検索が終了していなければ(ステップ1702でNo)、発音中データバッファに格納された音符データへのポインタpMEを参照して、音符データを特定して、データを取得する(ステップ1703)。
再生処理部36は、音符データの消音時刻(該当トラックの発音開始時刻ITime+発音時間IGate)が、現在時刻INowTickを経過しているか否かを判断する(ステップ1704)。
ステップ1704でNoと判断された場合には、再生処理部36は、処理対象を次の発音中データとする(ステップ1707)。
ステップ1704でYesと判断された場合には、再生処理部36は、発音中データバッファの発音中データをクリアする(ステップ1705)。次いで、再生処理部36は、発音中データバッファに格納されていたポインタpMEにより示される音符データの消音を楽音生成回路28に対して指示する(ステップ1706)。次いで、再生処理部36は、処理対象を次の発音中データとする(ステップ1707)。
次に、本実施の形態にかかるMIDI−IN処理について説明する。図18は、本実施の形態にかかるMIDI−IN処理の例を示すフローチャートである。図18に示すように、再生処理部36が、演奏者による鍵盤26の押鍵に基づく押鍵情報(ノートオンメッセージ)を受け入れている場合には(ステップ1801でYes)、ノートオンメッセージに含まれる音高およびベロシティ(PitchおよびiVel)を取得する(ステップ1802)。
次いで、ポインタmePlayを無し(NULL)とする(ステップ1804)。次いで、発音中データバッファからの検索処理(ステップ1804)および音符データからの検索処理(ステップ1805)が実行される。
ステップ1801でNoと判断された場合、および、ステップ1805が終了した後に、基本データバッファの途中停止フラグinterruptionが「FALSE」であり(ステップ1806でYes)、つまり、途中停止ではない状態であり、かつ、基本データの演奏状態iPStatusが「0」でなければ(ステップ1807でNo)、つまり、停止状態でなければ、ステップ1801に戻る。その一方、ステップ1806でNo、或いは、ステップ1807でYesと判断された場合には処理を終了する。
以下、発音中データバッファからの検索処理(ステップ1804)および音符データからの検索処理(ステップ1805)についてより詳細に説明する。発音中データバッファからの検索処理は、音符データにおいて既に発音開始時刻ITimeが経過しており、当該音符データへのポインタが発音中データバッファに格納されているが、演奏者による押鍵がないため発音保留フラグが「0」となっているような音符について押鍵があった場合に実行される処理である。すなわち、発音開始時刻より遅れて押鍵された場合の発音処理である。
図19は、本実施の形態にかかる発音中データバッファからの検索処理の例を示すフローチャートである。図19に示すように、再生処理部36は、発音中データバッファ中の発音中データを検索する(ステップ1901)。
再生処理部36は、全ての発音中データについての検索が終了していなければ(ステップ1902でNo),処理対象となる発音中データについて、発音保留フラグiStatusが「0」、すなわち、発音保留中であるか否かを判断する(ステップ1903)。
ステップ1903でNoと判断された場合には、再生処理部36は、処理対象を、発音中データバッファの次の発音中データに移動させる(ステップ1910)。
ステップ1903でYesと判断された場合には、再生処理部36は、当該発音中データのポインタpMeを参照して、音符データを取得する(ステップ1904)。
次いで、演奏データ正誤判定部34は、現在時刻INowTickと、音符データの発音開始時刻ITimeとを比較して、INowTick−ITimeが、許容時間を示す所定の閾値より小さいか否かを判断する(ステップ1905)。
ステップ1905でYesと判断された場合には、演奏データ正誤判定部34は、押鍵された鍵の座標iPitを取得し(ステップ1906)、取得した座標iPitが、音符データ中の、親指の横方向の座標および小指の横方向の座標の範囲内に含まれるか否か(sfigPosX[0]<iPit<sfigPosX[4])であるか否かを判断する(ステップ1907)。
ステップ1907でYesと判断された場合には、再生処理部36は、当該音符データにより示される楽音の発音を、楽音生成回路28に対して指示する(ステップ1908)。
再生処理部36は、発音中データバッファにおいて、発音中データの発音保留フラグiStatusを「1」にセットする(ステップ1909)。
その後、再生処理部36は、処理対象を、発音中データバッファの次の発音中データに移動させる(ステップ1910)。
発音中データバッファからの検索処理においては、発音開始時刻より遅れて押鍵された場合であっても、押鍵された時間が本来の発音開始時刻より許容時間内の遅れであり、かつ、押鍵された鍵の座標が、押鍵すべき手の親指の座標と小指の座標との間にあれば、本来発音させるべき音高(つまり、音符データのピッチPitch)の楽音を発音する。
音符データからの検索処理は、音符データによれば、まだ発音開始時刻ITimeが経過していないにもかかわらず、演奏者により押鍵がされてしまったような音符についての処理である。すなわち、発音開始時刻よりも早く押鍵された場合の発音処理である。
図20および図21は、本実施の形態にかかる音符データからの検索処理の例を示すフローチャートである。図20に示すように、再生処理部36は、再生制御データの基本データバッファを検索する(ステップ2001)。再生処理部36は、全てのトラックについての検索が終了していなければ(ステップ2002でNo)、トラックデータ(図3(a))を参照して、処理対象となるトラック種類iPlayTypeから、当該トラックが演奏データであるか否かを判断する(ステップ2003)。
ステップ2003でNoと判断された場合には、再生処理部36は、処理対象を次のトラックに移動する(ステップ2005)。
ステップ2003でYesと判断された場合には、再生処理部36は、当該処理対象となるトラックについて、次の音符データへのポインタを参照して、音符データを特定して、データを取得する(ステップ2004)。再生処理部36および演奏データ正誤判定部34は、処理対象となっているトラックについて音符データの検索が終了する(音符データの末尾のレコードとなる:ステップ2101でYes)まで、ステップ2102以下の処理を実行する。
ステップ2101でNoと判断された場合には、演奏データ正誤判定部34は、現在時刻INowTickと、音符データ中の発音開始時刻ITimeとを比較して、ITime−INowTickが、許容時間を示す所定の閾値以上であるか否かを判断する(ステップ2102)。ステップ2102でYesと判断された場合には、ステップ2005に進む。
その一方、ステップ2102でNoと判断された場合には、演奏データ正誤判定部34は、0<ITime−INowTick<所定の閾値であるか否かを判断する(ステップ2103)。
ステップ2103でYesと判断された場合には、演奏データ正誤判定部34は、押鍵された鍵の座標iPitを取得し(ステップ2104)、取得した座標iPitが、音符データ中の、親指の横方向の座標および小指の横方向の座標の範囲内に含まれるか否か(sfigPosX[0]<iPit<sfigPosX[4])であるか否かを判断する(ステップ2105)。
ステップ2105でYesと判断された場合には、再生処理部36は、当該音符データにより示される楽音の発音を、楽音生成回路28に対して指示する(ステップ2106)。
再生処理部36は、発音中データバッファにおいて、発音中データの発音保留フラグiStatusを「1」にセットする(ステップ2107)。
その後、再生処理部36は、処理対象を、処理対象を次の音符データに移動させる(ステップ2108)。
音符データからの検索処理においては、発音開始時刻より先に押鍵された場合であっても、押鍵された時間が本来の発音開始時刻より許容時間内の先行であり、かつ、押鍵された鍵の座標が、押鍵すべき手の親指の座標と小指の座標との間にあれば、本来発音させるべき音高(つまり、音符データのピッチPitch)の楽音を発音する。
本実施の形態によれば、音符データのレコードに含まれる、ある音符の発音開始時刻より押鍵が先行し、或いは、遅れた場合であっても、その先行或いは押鍵が、許容時間内であれば、対応する音符データにより示される音高の楽音を発音する。すなわち、所定の時間的条件が満たされる場合には、押鍵タイミングのずれを許容する。
また、本実施の形態では、その音符を押鍵する際の親指の位置に対応する鍵と、小指の位置に対応する鍵との間の鍵が押鍵されていれば、音符データにより示される音高の楽音を発音する。すなわち、所定の押鍵位置に関する条件が満たされる場合には、押鍵におけるミスタッチを許容する。
これにより、一定範囲内の時間のずれや押鍵する鍵のずれがあった場合にも発音を許容することで、正しい押鍵タイミングおよび正しい鍵位置の押鍵を認識するための中間的な段階を設けることが可能となる。
特に、本実施の形態においては、押鍵時のそれぞれの指の位置(座標)を算出して、音符データの項目として記憶し、押鍵された鍵の座標が、特定の指の座標の間に位置する場合には、発音を許容している。すなわち、手を開いて指の間隔が広くなっている状態でのミスタッチについては、発音を許容する範囲を大きくし、その一方、手が閉じていて指の間隔が狭い状態でのミスタッチについては、発音を許容する範囲を小さくしている。手の動きが大きいと思われるときにミスタッチをより許容することで、曲の中での難易にしたがって、ミスタッチの許容範囲を変化させることができる。
たとえば、本実施の形態においては、鍵の座標および押鍵すべき指を示す情報に基づいて、隣接する指が、それぞれ、隣接する白鍵に位置するように、指の鍵盤上の位置を示す指座標情報が生成される。これにより、押鍵される指以外の他の指の位置(座標)を適切に算出することができる。
さらに、本実施の形態においては、和音構成音を構成する他の音符の音符データを参照して、和音構成音を押鍵している指については、前記押鍵している鍵の座標を指座標情報としている。これにより、押鍵されている他の指も考慮した音符データにおける指の位置(座標)を算出することが可能となる。
次に、本発明の第2の実施の形態について説明する。第1の実施の形態においては、一定範囲内の時間のずれや押鍵する鍵のずれがあった場合にも発音を許容している。第2の実施の形態においても、発音を許容しているが、発音開始時刻と実際の押鍵タイミングとのずれの度合いに応じてそのベロシティを制御している。
第2の実施の形態にかかる演奏練習支援システムの構成は、図1および図2に示すものであり、また、演奏練習支援システムにおいて実行される処理も、発音中データバッファからの検索処理および音符データからの検索処理を除き、第1の実施の形態のものと同様である。
図22および図23は、第2の実施の形態にかかる発音中データバッファからの検索処理の例を示すフローチャートである。図22に示すように、再生処理部36は、発音中データバッファ中の発音中データを検索する(ステップ2201)。
再生処理部36は、全ての発音中データについての検索が終了していなければ(ステップ2202でNo),処理対象となる発音中データについて、発音保留フラグiStatusが「0」、すなわち、発音保留中であるか否かを判断する(ステップ2203)。ステップ2202でYesと判断された場合には、ステップ2301に進む。なお、図22において、処理対象となっている発音中データにより特定される音符データを示すパラメータをmepと称する。
ステップ2203でNoと判断された場合には、再生処理部36は、処理対象を、発音中データバッファの次の発音中データに移動させる(ステップ2210)。
ステップ2203でYesと判断された場合には、再生処理部36は、当該発音中データのポインタpMeを参照して、音符データのレコードを取得する(ステップ2204)。なお、ステップ2204で取得される音符データは、上記ポインタmepにより示される音符データである。
次いで、演奏データ正誤判定部34は、現在時刻INowTickと、前記ポインタmepにより示される音符データの発音開始時刻ITimeとを比較して、INowTick−ITimeが、許容時間を示す所定の閾値より小さいか否かを判断する(ステップ2205)。ステップ2205でNoと判断された場合には、ステップ2301に進む。
ステップ2205でYesと判断された場合には、演奏データ正誤判定部34は、押鍵された鍵の座標iPitを取得し(ステップ2206)、取得した座標iPitが、音符データ中の、親指の横方向の座標および小指の横方向の座標の範囲内に含まれるか否か(sfigPosX[0]<iPit<sfigPosX[4])であるか否かを判断する(ステップ2207)。
ステップ2207でYesと判断された場合には、演奏データ正誤判定部34は、さらに、ポインタmepにより示される音符データのピッチPitchと押鍵された鍵の座標iPitとの差の絶対値、および、後述するポインタmePlayにより示される音符データのピッチPitchと押鍵された鍵の座標iPitとの差の絶対値を比較する(ステップ2208)。
ステップ2208において、前者(ポインタmepにより示される音符データのピッチPitchと押鍵された鍵の座標iPitとの差の絶対値)の方が小さかった場合には、ポインタmePlayとして、ポインタmepをセットする(ステップ2209)。
その後、再生処理部36は、処理対象を、発音中データバッファの次の発音中データに移動させる(ステップ2210)。
ステップ2208および2209について以下に説明する。発音中データバッファには、複数の発音中データが格納されている可能性がある。そこで、発音中データバッファ中の発音中データで、所定の条件をみたす(iStatusが「0」で、かつ、発音開始時刻とのずれおよび音高のずれが所定の許容範囲であること)ものの中で、その音高が、最も押鍵された音高に近いものを見出し、その音符データを示すポインタmePlayを保存し、当該meplayにおり示される音符データの発音を行わせている。音符データの発音については、図23を参照して説明する。
図23に示すように、再生処理部36は、ポインタmePlayが存在するか否かを判断する(ステップ2301)。ステップ2301でYesと判断された場合には、再生処理部36は、発音すべき楽音のベロシティiVel*=1−{abs(INowTick−ITime)/(2・許容時間)}を算出する(ステップ2302)。
ステップ2302においては、本来の音符データの発音開始時刻ITimeと、押鍵された時刻である現在時刻INowTickとの差に応じて、ベロシティを調整している。本実施の形態においては、上記差が大きくなるのにしたがって、一次関数に基づいて、ベロシティが小さくなる。
次いで、再生処理部36は、ポインタmePlayにより示される音符データに基づく楽音の発音を、楽音生成回路28に対して指示する(ステップ2303)。
再生処理部36は、ポインタmePlayにより示される音符データにおいて、再生時の状態iPlayStatusを「1(ミディイベントおよびノートオンの双方あり)」にセットする(ステップ2304)。
次に、第2の実施の形態にかかる音符データからの検索処理について説明する。図24〜図26は、第2の実施の形態にかかる音符データからの検索処理の例を示すフローチャートである。
図24に示すように、再生処理部36は、ポインタmePlayが存在するか否かを判断し(ステップ2401)、存在しない場合には(ステップ2401でNo)、処理を終了する。
ステップ2401でYesと判断された場合には、再生処理部36は、再生制御データの基本データバッファを検索する(ステップ2402)。再生処理部36は、全てのトラックについての検索が終了していなければ(ステップ2403でNo)、トラックデータ(図3(a))を参照して、処理対象となるトラックデータのトラック種類iPlayTypeから、当該トラックが演奏データであるか否かを判断する(ステップ2404)。
ステップ2404でNoと判断された場合には、再生処理部36は、処理対象を次のトラックに移動する(ステップ2405)。
ステップ2404でYesと判断された場合には、再生処理部36は、当該処理対象となるトラックについて、次の音符データへのポインタを参照して、ポインタmepとして、上記次の音符データへのポインタをセットする(ステップ2406)。
再生処理部36および演奏データ正誤判定部34は、処理対象となっているトラックについて音符データの検索が終了する(音符データの末尾のレコードとなる:ステップ2501でYes)まで、ステップ2502以下の処理を実行する。
ステップ2501でNoと判断された場合には、演奏データ正誤判定部34は、現在時刻INowTickと、音符データ中の発音開始時刻ITimeとを比較して、ITim−INowTickが、許容時間を示す所定の閾値以上であるか否かを判断する(ステップ2502)。ステップ2502でYesと判断された場合には、ステップ2601に進む。
その一方、ステップ2502でNoと判断された場合には、演奏データ正誤判定部34は、0<ITime−INowTick<所定の閾値であるか否かを判断する(ステップ2503)。
ステップ2503でYesと判断された場合には、演奏データ正誤判定部34は、押鍵された鍵の座標iPitを取得し(ステップ2504)、取得した座標iPitが、音符データ中の、親指の横方向の座標および小指の横方向の座標の範囲内に含まれるか否か(sfigPosX[0]<iPit<sfigPosX[4])であるか否かを判断する(ステップ2505)。
ステップ2505でYesと判断された場合には、演奏データ正誤判定部34は、さらに、ポインタmepにより示される音符データ中のピッチPitchと押鍵された鍵の座標iPitとの差の絶対値、および、ポインタmePlayにより示される音符データ中のピッチPitchと押鍵された鍵の座標iPitとの差の絶対値を比較する(ステップ2506)。
ステップ2506において、前者(ポインタmepにより示される音符データ中のピッチPitchと押鍵された鍵の座標iPitとの差の絶対値)の方が小さかった場合には、ポインタmePlayとして、ポインタmepをセットする(ステップ2507)。
その後、再生処理部36は、処理対象を次の音符データに移動する(ステップ2508)。
ステップ2502でYesと判断された場合には、再生処理部36は、発音すべき楽音のベロシティiVel*=1−{abs(INowTick−ITime)/(2・許容時間)}を算出する(ステップ2602)。
ステップ2302においては、本来の音符データの発音開始時刻ITimeと、押鍵された時刻である現在時刻INowTickとの差に応じて、ベロシティを調整している。本実施の形態においては、上記差が大きくなるのにしたがって、一次関数に基づいて、ベロシティが小さくなる。
次いで、再生処理部36は、ポインタmePlayにより示される音符データの楽音の発音を、楽音生成回路28に対して指示する(ステップ2603)。
再生処理部36は、ポインタmePlayにより示される音符データ中、再生時の状態iPlayStatusを「3(ノートオンあり)」にセットする(ステップ2604)。
第2の実施の形態においても、第1の実施の形態と同様に、音符データのレコードに含まれる、ある音符の発音開始時刻より押鍵が先行し、或いは、遅れた場合であっても、その先行或いは押鍵が、許容時間内であれば、その先行或いは押鍵が、許容時間内であれば、対応する音符データにより示される音高の楽音を発音する。すなわち、所定の時間的条件が満たされる場合には、押鍵タイミングのずれを許容する。
特に、第2の実施の形態においては、その発音の際に、本来の発音開始時刻と、実際の押鍵時刻との差にしたがって、楽音のベロシティを制御している。これにより、演奏者は、押鍵タイミングのずれの度合いを認識することが可能となる。
また、第2の実施の形態においては、前記親指の座標と小指の座標との間に位置するような鍵の座標と、音符データにおける鍵盤の座標との差の絶対値が最も小さいような音符データを特定し、特定された音符データの発音が、楽音生成回路に指示される。これにより、ミスタッチがあった場合でも、押鍵された鍵ともっとも近い音高の音符データを発音させることができる。
次に、本発明の第3の実施の形態について説明する。第2の実施の形態においては、発音開始時刻と実際の押鍵タイミングとのずれの度合いに応じて発音すべき楽音のベロシティを制御している。第3の実施の形態においては、本来の音高と、実際に押鍵された鍵の音高とのずれの度合いに応じて発音すべき楽音のベロシティを制御している。
第3の実施の形態にかかる演奏練習支援システムの構成は、図1および図2に示すものであり、また、演奏練習支援システムにおいて実行される処理も、発音中データバッファからの検索処理および音符データからの検索処理を除き、第1の実施の形態のものと同様である。
第3の実施の形態にかかる発音中データバッファからの検索処理において、図22は、第2の実施の形態に示すものと同様であり、図27は、発音中データバッファからの検索処理の後半の例を示すフローチャートである。図27における処理も、一部を除き、図23の処理と同様である。
第3の実施の形態において、図22のステップ2205でNoであった場合には、再生処理部36は、ポインタmePlayが存在するか否かを判断する(ステップ2701)。
ステップ2701でYesと判断された場合には、再生処理部36は、発音すべき楽音のベロシティiVel*=1−{abs(mePlayにより示される音符データ中のiPitch−iPit)/abc(mePlayにより示される音符データ中のsfigPosX[0]−sfigPosX[4])を算出する(ステップ2702)。
ステップ2702においては、本来押鍵すべき鍵の位置(座標)と実際に押鍵された鍵の位置(座標)との差に応じて、ベロシティを調整している。本実施の形態においては、単なる差ではなく、上記差を、親指の位置(座標)と小指の位置(座標)との距離で割ることで、相対的な差を出して、当該相対的な差を用いてベロシティを調整している。
次いで、再生処理部36は、ポインタmePlayにより示される音符データの楽音の発音を、楽音生成回路28に対して指示する(ステップ2703)。
再生処理部36は、ポインタmePlayにより示される音符データ中、再生時の状態iPlayStatusを「1(ミディイベントおよびノートオンの双方あり)」にセットする(ステップ2704)。
第3の実施の形態にかかる音符データからの検索処理においては、図24および図25は、第2の実施の形態に示すものと同様である。図28は、音符データからの検索処理の後半の例を示すフローチャートである。図28における処理も、一部を除き、図26の処理と同様である。
第3の実施の形態において、図25のステップ2502でYesと判断された場合には、再生処理部36は、ポインタmePlayが存在するか否かを判断する(ステップ2801)。
ステップ2801でYesと判断された場合には、再生処理部36は、発音すべき楽音のベロシティiVel*=1−{abs(mePlayにより示される音符データ中のiPitch−iPit)/abc(mePlayにより示される音符データ中のsfigPosX[0]−sfigPosX[4])を算出する(ステップ2802)。
ステップ2802においては、本来押鍵すべき鍵の位置(座標)と実際に押鍵された鍵の位置(座標)との差に応じて、ベロシティを調整している。本実施の形態においては、単なる差ではなく、上記差を、親指の位置(座標)と小指の位置(座標)との距離で割ることで、相対的な差を出して、当該相対的な差を用いてベロシティを調整している。
次いで、再生処理部36は、ポインタmePlayにより示される音符データの楽音の発音を、楽音生成回路28に対して指示する(ステップ2803)。
再生処理部36は、ポインタmePlayにより示される音符データ中、再生時の状態iPlayStatusを「3(ノートオンあり)」にセットする(ステップ2804)。
第3の実施の形態においても、第1の実施の形態や第2の実施の形態と同様に、音符データのレコードに含まれる、ある音符の発音開始時刻より押鍵が先行し、或いは、遅れた場合であっても、その先行或いは押鍵が、許容時間内であれば、対応する音符データにより示される音高の楽音を発音する。
また、第3の実施の形態においては、その音符を押鍵する際の親指の位置に対応する鍵と、小指の位置に対応する鍵との間の鍵が押鍵されていれば、対応する音符データに示される音高の楽音を発音し、押鍵におけるある程度のミスタッチを許容する。
第3の実施の形態においては、その発音の際に、本来押鍵すべき鍵の位置(座標)と、実際に押鍵された鍵の位置(座標)との差にしたがって、楽音のベロシティを制御している。これにより、演奏者は、押鍵位置のずれの度合いを認識することが可能となる。
特に、第3の実施の形態においては、発音データに含まれる鍵の座標と、押鍵された鍵の座標との差の絶対値、および、親指の座標および小指の座標の差の絶対値の比に基づいて、ベロシティが制御される。これにより、手の開き具合に対する相対的なミスタッチの度合いにしたがって、ベロシティを調整することが可能となる。
本発明は、以上の実施の形態に限定されることなく、特許請求の範囲に記載された発明の範囲内で、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。
たとえば、第2の実施の形態および第3の実施の形態では、前記親指の座標と小指の座標との間に位置するような鍵の座標と、音符データにおける鍵盤の座標との差の絶対値が最も小さいような音符データを特定し、特定された音符データの発音が、楽音生成回路に指示される。このような構成を、第1の実施の形態に適用しても良い。
また、第1ないし第3の実施の形態においては、押鍵情報にしたがって、当該押鍵された鍵の音高が、音符データの音高と一致しない場合にも、一定の条件が満たされれば、音符データにしたがった楽音が発音されている。しかしながら、これに限定されず、音高は、音符データ中のものではなく、実際された鍵のものであっても良い。これにより、演奏者は、ミスタッチをしたこと自体を認識することができる。