(57)【特許請求の範囲】
【請求項１】
発音すべき音高とその発音タイミングとを表す曲データを、連弾演奏に対応した左右パート別に記憶する曲データ記憶手段と、
この曲データ記憶手段に記憶される左右パートの曲データの内、一方のパートの曲データを読み出し、当該読み出された一方のパートの曲データの音高に基づいて左右パートの分割位置を表すスプリットポイントを表す音高を抽出して時系列順に並べた制御トラックを生成する制御トラック生成手段と、
前記制御トラックに格納されるスプリットポイントを表す音高とトランスポーズ設定された他方のパートの曲データの音高とを順次比較して他方のパートの曲データの音高が前記スプリットポイントを表す音高を超える際の最大侵入幅を検出し、その最大侵入幅に応じて他方のパートに設定されたトランスポーズ値をシフトするトランスポーズ調整手段と
を具備することを特徴とする演奏案内装置。
【請求項２】
発音すべき音高とその発音タイミングとを表すデータであって、連弾演奏に対応した左右パート別の曲データを曲データ記憶手段に記憶しておき、これら左右パートの曲データの内、一方のパートの曲データを読み出し、当該読み出された一方のパートの曲データの音高に基づいて左右パートの分割位置を表すスプリットポイントを表す音高を抽出して時系列順に並べた制御トラックを生成する制御トラック生成過程と、
この制御トラック生成過程にて生成された制御トラックに格納されるスプリットポイントを表す音高とトランスポーズ設定された他方のパートの曲データの音高とを順次比較して他方のパートの曲データの音高が前記スプリットポイントを表す音高を超える際の最大侵入幅を検出し、その最大侵入幅に応じて他方のパートに設定されたトランスポーズ値をシフトするトランスポーズ調整過程と
を具備することを特徴とする演奏案内方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、電子楽器に用いて好適な演奏案内装置および演奏案内方法に関する。
【０００２】
【従来の技術】
従来より、鍵盤の各鍵下部に発光手段を対向配置しておき、発音すべき音高とその発音タイミングとを表す曲データの再生に同期して、押鍵すべき鍵に対応して配設される発光手段を点灯させてユーザーに弾くべき鍵を案内する演奏案内装置が知られている。
【０００３】
【発明が解決しようとする課題】
ところで、従来の演奏案内装置では、左鍵域の演奏を表す左パートの曲データと右鍵域の演奏を表す右パートの曲データとを備えておけば、これら左右両パートの曲データの再生に同期して連弾演奏を案内し得るようになる。
しかしながら、連弾演奏を練習する際に、一方のパートを担う演奏者が鍵操作に不慣れな場合には、なるべく黒鍵操作が少なくなるように該当パートの曲データをトランスポーズ（移調）させるが、そのようにすると左右パート間で鍵域競合して連弾演奏し難くなる、という問題がある。
そこで本発明は、このような事情に鑑みてなされたもので、左右パート間の鍵域競合を生じさせることなく連弾演奏を練習することができる演奏案内装置および演奏案内方法を提供することを目的としている。
【０００４】
【課題を解決するための手段】
上記目的を達成するため、請求項１記載の発明では、発音すべき音高とその発音タイミングとを表す曲データを、連弾演奏に対応した左右パート別に記憶する曲データ記憶手段と、この曲データ記憶手段に記憶される左右パートの曲データの内、一方のパートの曲データを読み出し、当該読み出された一方のパートの曲データの音高に基づいて左右パートの分割位置を表すスプリットポイントを表す音高を抽出して時系列順に並べた制御トラックを生成する制御トラック生成手段と、前記制御トラックに格納されるスプリットポイントを表す音高とトランスポーズ設定された他方のパートの曲データの音高とを順次比較して他方のパートの曲データの音高が前記スプリットポイントを表す音高を超える際の最大侵入幅を検出し、その最大侵入幅に応じて他方のパートに設定されたトランスポーズ値をシフトするトランスポーズ調整手段とを具備することを特徴とする。
【０００５】
請求項２に記載の発明では、発音すべき音高とその発音タイミングとを表すデータであって、連弾演奏に対応した左右パート別の曲データを曲データ記憶手段に記憶しておき、これら左右パートの曲データの内、一方のパートの曲データを読み出し、当該読み出された一方のパートの曲データの音高に基づいて左右パートの分割位置を表すスプリットポイントを表す音高を抽出して時系列順に並べた制御トラックを生成する制御トラック生成過程と、この制御トラック生成過程にて生成された制御トラックに格納されるスプリットポイントを表す音高とトランスポーズ設定された他方のパートの曲データの音高とを順次比較して他方のパートの曲データの音高が前記スプリットポイントを表す音高を超える際の最大侵入幅を検出し、その最大侵入幅に応じて他方のパートに設定されたトランスポーズ値をシフトするトランスポーズ調整過程とを具備することを特徴とする。
【０００６】
本発明では、連弾演奏に対応した左右パート別の曲データの内、一方のパートの曲データを読み出し、当該読み出された一方のパートの曲データの音高に基づいて左右パートの分割位置を表すスプリットポイントを表す音高を抽出して時系列順に並べた制御トラックを生成し、この制御トラックに格納されるスプリットポイントを表す音高とトランスポーズ設定された他方のパートの曲データの音高とを順次比較して他方のパートの曲データの音高が前記スプリットポイントを表す音高を超える際の最大侵入幅を検出し、その最大侵入幅に応じて他方のパートに設定されたトランスポーズ値をシフトするので、左右パート間の鍵域競合を防止することが可能になっている。また、左右パート間の鍵域競合を防止することによって、演奏者は自己担当のパートをトランスポーズしても、スプリットポイントを意識せずに自然な演奏を違和感なく練習し得るようになる。
【０００７】
【発明の実施の形態】
以下、本発明の実施の一形態による演奏案内装置を搭載した電子楽器を実施例に挙げ、これについて図面を参照して説明する。
Ａ．構成
図１は、本発明の一実施例による電子楽器の全体構成を示すブロック図である。この図において、１は押離鍵操作（演奏操作）に応じたキーオン／キーオフイベントやキーコード等の演奏情報を発生する鍵盤である。
２はＣＰＵ５の制御の下に、押鍵すべき鍵を案内表示する押鍵ガイド部である。押鍵ガイド部２は、半透明樹脂材等で形成された各鍵下部に対向配置される発光手段２ａ（図示略）と、これら各鍵毎に配設される発光手段２ａを点灯駆動するドライバ２ｂ（図示略）とから構成され、ＣＰＵ５から供給される点灯制御信号に従って、対応する発光手段２ａについて点灯駆動して押鍵すべき鍵を案内する。
【０００８】
３は各種スイッチを有し、操作されたスイッチに応じたスイッチイベントを発生するパネルスイッチ群である。このパネルスイッチ群３には、図示していないが、電源をオンオフする電源スイッチの他、演奏案内用の曲データを選択する曲選択スイッチ、演奏案内の開始を指示するスタートスイッチ等が設けられている。４はＬＣＤパネル等から構成される表示部であり、後述するＣＰＵ５から供給される表示制御信号に応じて楽器各部の動作モードなどを表示する。
【０００９】
ＣＰＵ５は鍵盤１から供給される演奏情報に応じて、音源８に楽音発生を指示したり、選択された曲データに基づき演奏案内するものであり、本発明の要旨に係わる特徴的な処理動作については追って詳述する。
ＲＯＭ６は、上記ＣＰＵ５にロードされる各種制御プログラムの他、演奏案内用の曲データを記憶する。ここで、図２（イ）を参照してＲＯＭ６に格納される曲データＫＤの構成について説明する。ＲＯＭ６には、複数の曲データＫＤ（１）〜ＫＤ（ｎ）が格納されており、これら曲データＫＤ（１）〜ＫＤ（ｎ）は曲選択スイッチの操作に応じて選択される。
【００１０】
曲データＫＤは、右パート開始アドレスＲＰＡ、左パート開始アドレスＬＰＡ、テンポＴＭＰおよび演奏データＰＤから構成される。演奏データＰＤは、上記右パート開始アドレスＲＰＡおよび左パート開始アドレスＬＰＡにより指定されるアドレス領域にそれぞれ格納される左右パートの演奏データＰＤＲ、ＰＤＬからなる。演奏データＰＤＲ、ＰＤＬは、所謂相対時間形式で形成されており、発音／消音すべき音高を表すイベント（ノートオンイベント・ノートナンバ／ノートオフイベント・ノートナンバ）、その発音タイミングを表す次イベントまでのステップタイムΔｔおよび曲の終わりを表すＥＮＤマークからなる。
【００１１】
ＲＡＭ７は、図２（ロ）に示すように、各種レジスタ・フラグデータを一時記憶するワークエリアＷＥ、演奏データＰＤＲ、ＰＤＬを一時記憶するノートバッファエリアＮＢＥおよびイベント毎の鍵域分割鍵（以下、スプリットポイントと記す）が時系列順に格納される制御トラックエリアＣＴＥを備える。なお、このＲＡＭ７が備えるノートバッファエリアＮＢＥおよび制御トラックエリアＣＴＥが意図する点については追って述べる。
【００１２】
音源８は周知の波形メモリ読み出し方式によって構成され、時分割動作する複数の発音チャンネルを備える。この音源８は、各種音色の波形データを記憶しており、これらの内、ＣＰＵ５が指定する波形データを読み出し、それを演奏情報や曲データに応じて波形修飾してなる楽音波形Ｗを形成する。
９はＤ／Ａ変換回路であり、上記音源８の出力をアナログ波形信号に変換して次段のサウンドシステム１０に供給する。サウンドシステム１０は、例えば、前段から供給されるアナログ波形信号に対して不要ノイズを除去する等のフィルタリングを施した後、これを増幅してスピーカＳＰから発音する。
【００１３】
Ｂ．動作
次に、図３〜図１７を参照して実施例の動作について説明する。
（１）メインルーチンの動作
電源投入に応じて、ＣＰＵ５はＲＯＭ６から所定の制御プログラムを読み出して自身にロードすると、図３に示すメインルーチンを実行してステップＳＡ１に処理を進め、ＲＡＭ７のワークエリアＷＥに設けられる各種レジスタ・フラグを初期化したり、音源８に初期値を設定する等のイニシャライズ処理を行う。この後、ステップＳＡ２に進み、操作されたスイッチが発生するスイッチイベントに対応したスイッチ処理を実行する。
【００１４】
続いて、ステップＳＡ３では、演奏案内の開始を指示するスタートスイッチがオン操作されていれば、曲選択スイッチ操作に応じて選択された曲番号の曲データを再生しつつ演奏案内する曲データ再生処理を実行する。
そして、ステップＳＡ４では、押離鍵操作に応じて音源８に対して発音／消音を指示する鍵盤処理を実行する。そしてこの後、ステップＳＡ２に処理を戻し、以後、電源スイッチがオフされる迄、ステップＳＡ２〜ＳＡ４を繰り返す。
【００１５】
（２）タイマ割込み処理ルーチンの動作
次に、図４を参照してタイマ割込み処理ルーチンの動作について説明する。ＣＰＵ５は上述したメインルーチンと並列的に一定周期毎にタイマ割込み処理を実行する。一定周期毎にタイマ割込みがかかると、ＣＰＵ５は図４に示すステップＳＢ１に処理を進め、曲データ再生中であるか否かを判断する。
曲データ再生中でなければ、判断結果は「ＮＯ」となり、何も処理せずに本ルーチンを完了させるが、曲データ再生中であると判断結果が「ＹＥＳ」となり、次のステップＳＢ２に進み、テンポカウンタＴＭＰＣの値をインクリメントして歩進させる。
【００１６】
次いで、ステップＳＢ３では、歩進したテンポカウンタＴＭＰＣの値が再生中にある曲のテンポＴＭＰの値と一致したか否かを判断する。一致していなければ、判断結果は「ＮＯ」となり、本ルーチンを完了させるが、一致すると、判断結果が「ＹＥＳ」となり、ステップＳＢ４に処理を進める。ステップＳＢ４では、テンポカウンタＴＭＰＣをゼロリセットし、続くステップＳＢ５では各パートの経過時間をインクリメントして歩進させてから本ルーチンを完了する。なお、ここで言う各パートとは、左右パートおよび後述する制御トラックからなる。
【００１７】
このように、タイマ割込み処理ルーチンでは、曲データ再生中であると、一定周期毎にテンポカウンタＴＭＰＣを歩進させ、歩進させたテンポカウンタＴＭＰＣが曲のテンポＴＭＰに一致すると、テンポカウンタＴＭＰＣをゼロリセットして各パート（左右パートおよび制御トラック）の経過時間をインクリメントして曲再生を進行させるようになっている。
【００１８】
（３）スイッチ処理ルーチンの動作
次に、図５〜図１３を参照してスイッチ処理ルーチンの動作について説明する。上述のメインルーチン（図３参照）のステップＳＡ２を介してスイッチ処理ルーチンが実行されると、操作されたスイッチ種類に応じたスイッチ処理を実行する。以下、発明の要旨に係わる代表的なスイッチ処理として、「曲選択スイッチ処理」および「スタートスイッチ処理」の各動作について述べる。
【００１９】
▲１▼曲選択スイッチ処理ルーチンの動作
曲選択スイッチが操作されると、図５に示す曲選択スイッチ処理ルーチンが実行され、ＣＰＵ５はステップＳＣ１〜ＳＣ３を介して、スイッチ操作に応じて選択された曲番号ｎに対応した曲データＫＤ（ｎ）の曲テンポＴＭＰや左右パートの各開始アドレスＲＰＡ，ＬＰＡを読み出し、それらをＲＡＭ７のワークエリアＷＥにセットする。
【００２０】
この後、ステップＳＣ４では、左パートの演奏データＰＤＬに基づき、イベント毎のスプリットポイントを探し出して時系列順に並べて制御トラックエリアＣＴＥに格納する制御トラック生成処理を実行し、続くステップＳＣ５では、上記ステップＳＣ４にて探し出したスプリットポイントに基づき、左右パート間の鍵域競合を生じさせないトランスポーズ値を求めるトランスポーズ処理を実行する。
なお、本実施例では、右パート優先としている為、上記ステップＳＣ４においては左パートの演奏データＰＤに基づき制御トラックを生成するようにしているが、これに替えて左パート優先とするには、右パートの演奏データＰＤに基づき制御トラックを生成すれば良い。
【００２１】
（ａ）制御トラック生成処理ルーチンの動作
次に、図６を参照して制御トラック生成処理ルーチンの動作について説明する。上述のステップＳＣ４を介して本ルーチンが実行されると、ＣＰＵ５はステップＳＤ１に処理を進め、ＲＡＭ７に設けられる制御トラックエリアＣＴＥの書き込みアドレスを初期化し、続くステップＳＤ２では、ワークエリアＷＥに設けられるレジスタＳＰＮＴに「１」を、レジスタｔｉｍｅをゼロリセットして初期化する。
【００２２】
なお、このレジスタｔｉｍｅにはステップタイムΔｔがストアされる。レジスタＳＰＮＴにはスプリットポイントに相当する左パートの最高音のノートナンバ（後述するｍａｘノート）がストアされる。したがって、本実施例では、後述のｍａｘノートに対応する鍵までが左鍵域となり、ｍａｘノート＋１に対応する鍵より右鍵域とされる。
【００２３】
さて、初期化が完了すると、ＣＰＵ５はステップＳＤ３に処理を進め、曲選択スイッチ操作により選択された曲の左パート演奏データＰＤＬを読み出す。次いで、ステップＳＤ４では、読み出した演奏データＰＤＬが曲終端を表すＥＮＤマークであるか否かを判断するが、ここでは先頭イベントの読み出しであるから、判断結果は「ＮＯ」となり、ステップＳＤ５に進む。
ステップＳＤ５では、読み出したイベントがノートオンイベントであるか否かを判断する。ノートオンイベントであれば、判断結果は「ＹＥＳ」となり、ステップＳＤ６に処理を進め、ノートＢＵＦ  ＯＮ処理を実行する。一方、ノートオフイベントであれば、判断結果は「ＮＯ」となり、ステップＳＤ７に処理を進め、ノートＢＵＦ  ＯＦＦ処理を実行する。
【００２４】
ノートＢＵＦ  ＯＮ処理およびノートＢＵＦ  ＯＦＦ処理とは、ＲＡＭ７のノートバッファエリアＮＢＥに格納されたノートオンイベントあるいはノートオフイベントの内から最高音のノートナンバ（ｍａｘノート）を探し出す処理である。これら処理の詳細については追って述べる。
【００２５】
ノートＢＵＦ  ＯＮ処理あるいはノートＢＵＦ  ＯＦＦ処理が完了すると、ＣＰＵ５はステップＳＤ８に処理を進め、これら処理にて得られるｍａｘノートがレジスタＳＰＮＴにストアされる値と一致するか、つまり、スプリットポイントが確定したかどうかを判断する。スプリットポイントが確定した場合には、判断結果が「ＹＥＳ」となり、後述のステップＳＤ１１に処理を進めるが、そうでない場合には判断結果が「ＮＯ」となり、ステップＳＤ９に進む。
【００２６】
ステップＳＤ９では、制御トラックアドレスに応じて、現在得られたＳＰＮＴ＋１を制御トラックエリアＣＴＥに書き込む。次いで、ステップＳＤ１０では、後述するノートＢＵＦ  ＯＮ処理あるいはノートＢＵＦ  ＯＦＦ処理にて得られるｍａｘノートをレジスタＳＰＮＴにストアすると共に、レジスタｔｉｍｅをゼロリセットし、続くステップＳＤ１１では、制御トラックアドレスをインクリメントして歩進させる。この後、ステップＳＤ１２に進み、左パート読み出しアドレスをインクリメントして歩進させて上述のステップＳＤ３に処理を戻す。
【００２７】
そして、ステップＳＤ３にて読み出される左パート演奏データＰＤＬがステップタイムΔｔであると、ステップＳＤ５を介してステップＳＤ１３に処理を進め、更新された制御トラックアドレスに従い、ｔｉｍｅ＋Δｔを制御トラックエリアＣＴＥにストアする。この後、ステップＳＤ１２に進み、左パート読み出しアドレスをインクリメントして歩進させて上述のステップＳＤ３に処理を戻す。
【００２８】
このように、制御トラック生成処理では、左パート演奏データＰＤＬを順次読み出してイベント毎のスプリットポイント（左鍵域での最高音のノートナンバ（ｍａｘノート））を探し出し、探し出したイベント毎のスプリットポイントと、それに対応するステップタイムΔｔとを時系列順に並べて制御トラックエリアＣＴＥに書き込んで行く。
そして、読み出した演奏データＰＤＬがＥＮＤマークになると、ステップＳＤ１４に進み、制御トラックの内容を補正する制御トラック補正処理（後述する）を実行する。
【００２９】
（ｂ）ノートＢＵＦ  ＯＮ処理ルーチンの動作
次に、図７を参照してノートＢＵＦ  ＯＮ処理ルーチンの動作について説明する。前述のステップＳＤ６（図６参照）を介して本処理ルーチンが実行されると、ＣＰＵ５は図７に示すステップＳＥ１，ＳＥ２にてノートバッファアドレスおよびレジスタｍｉｎＮＯＴＥを初期化する。次いで、ステップＳＥ３に進むと、ノートバッファアドレスがＥＮＤ＋１に達したか、つまりノートバッファ終端を超えたかどうかを判断する。
【００３０】
バッファ終端を超えていなければ、判断結果は「ＮＯ」となり、次のステップＳＥ４に進む。ステップＳＥ４では、現アドレスに応じてノートバッファエリアＮＢＥを読み出す。続いて、ステップＳＥ５では、読み出した値が「０」、つまりノートバッファに空きがあるか否かを判断する。
【００３１】
ノートバッファに空きが無ければ、ステップＳＥ５の判断結果は「ＮＯ」となり、ステップＳＥ６に進む。ステップＳＥ６では、ノートバッファから読み出したノートナンバがレジスタｍｉｎＮＯＴＥに格納されるノートナンバより小さいか否かを判断する。このレジスタｍｉｎＮＯＴＥとは、ノートバッファに格納されるノートナンバの内、最も低い音高のノートナンバ（以下、最小ノートと記す）を保持するものである。
【００３２】
ノートバッファから読み出したノートナンバが最小ノートより高ければ、判断結果は「ＮＯ」となり、後述するステップＳＥ９に処理を進めるが、最小ノートより低ければ、判断結果が「ＹＥＳ」となり、ステップＳＥ７に進む。ステップＳＥ７では、読み出したノートナンバを最小ノートとしてレジスタｍｉｎＮＯＴＥにストアし、続くステップＳＥ８では、この最小ノートが格納されるノートバッファのアドレス値をレジスタｍｉｎＮＯＴＥａｄｒに保持する。
【００３３】
この後、ステップＳＥ９に処理を進め、ノートバッファアドレスを歩進させてステップＳＥ３に処理を戻す。そして、バッファ終端を超えていなければ、上述したステップＳＥ４を介してノートバッファを読み出し、そこが空き領域でなければ、ステップＳＥ５の判断結果が「ＹＥＳ」となり、ステップＳＥ１０に進み、前述の制御トラック生成処理ルーチンから与えられるノートオンイベント中のノートナンバ（以下、これをオンノートと記す）を、その空き領域に書き込む。こうして、ノートバッファに新たなオンノートを書き込むと、ＣＰＵ５はステップＳＥ１１を介して後述するｍａｘノートサーチ処理を実行し、ノートバッファに格納されるオンノートの内から最も高い音高のノートナンバを検索する。
【００３４】
さて一方、ノートバッファに空きが無く、ノートバッファアドレスがバッファ終端を超えた場合には、ステップＳＥ３の判断結果が「ＹＥＳ」となり、ステップＳＥ１２に進む。ステップＳＥ１２では、制御トラック生成処理ルーチンから与えられるオンノートがレジスタｍｉｎＮＯＴＥに格納される最小ノートより高い音高であるかどうかを判断する。
最小ノートより低ければ、判断結果は「ＮＯ」となり、ステップＳＥ１１のｍａｘノートサーチ処理に進むが、最小ノートより高い場合には、レジスタｍｉｎＮＯＴＥａｄｒに保持されたアドレスに従い、ノートバッファにオンノートを書き込む。
【００３５】
このように、ノートＢＵＦ  ＯＮ処理ルーチンでは、ノートバッファに空きがあれば、制御トラック生成処理ルーチンから与えられるオンノートをその空き領域に書き込んだ後、ｍａｘノートサーチ処理を実行してノートバッファに格納されるオンノートの内から最も高い音高のノートナンバを検索する。
一方、ノートバッファに空きが無い場合には、ノートバッファ中の最小ノートとオンノートとを比較し、そのオンノートが最小ノートより高ければ、ノートバッファ中の最小ノートをオンノートに更新した後、ｍａｘノートサーチ処理を実行してノートバッファに格納されるオンノートの内から最も高い音高のノートナンバを検索する。
したがって、左パート演奏データＰＤＬに含まれるノートオンイベントの内で最高音のノートナンバを検索し、これをスプリットポイントとなるｍａｘノートとして抽出するようになっている。
【００３６】
（ｃ）ｍａｘノートサーチ処理ルーチンの動作
次に、図８を参照してｍａｘノートサーチ処理ルーチンの動作について説明する。上述したノートＢＵＦ  ＯＮ処理ルーチンのステップＳＥ１１（図７参照）を介して本処理ルーチンが実行されると、ＣＰＵ５は図８のステップＳＦ１に処理を進め、ノートバッファアドレスを初期化し、続くステップＳＦ２では、レジスタｍａｘＮＯＴＥをゼロリセットする。
【００３７】
次いで、ステップＳＦ３に進むと、ノートバッファアドレスがＥＮＤ＋１に達したか、つまりノートバッファ終端を超えたかどうかを判断する。ここで、バッファ終端を超えていなければ、判断結果は「ＮＯ」となり、次のステップＳＦ４に進み、現アドレスに応じてノートバッファエリアＮＢＥを読み出す。
【００３８】
そして、ステップＳＦ５に進み、読み出したノートナンバがレジスタｍａｘＮＯＴＥの値より大きいか否かを比較する。ここで、読み出したノートナンバがレジスタｍａｘＮＯＴＥの値より大きければ、判断結果は「ＹＥＳ」となり、次のステップＳＦ６に処理を進め、その読み出したノートナンバをレジスタｍａｘＮＯＴＥにストアした後、ステップＳＦ７に進む。
一方、読み出したノートナンバがレジスタｍａｘＮＯＴＥの値より小さければ、上記ステップＳＦ５の判断結果は「ＮＯ」となり、ステップＳＦ７に進み、ノートバッファアドレスを歩進させてステップＳＦ３に処理を戻す。
【００３９】
以後、ノートバッファアドレスがバッファ終端を超える迄、順次ノートバッファからノートナンバを読み出し、読み出したノートナンバとレジスタｍａｘＮＯＴＥに格納されるノートナンバとを大小比較し、読み出したノートナンバがレジスタｍａｘＮＯＴＥの値より大きければ、その読み出したノートナンバをレジスタｍａｘＮＯＴＥにストアすることによって、ノートバッファに格納されるノートナンバの内、最も高い音高のノートナンバがレジスタｍａｘＮＯＴＥに格納される。そして、ノートバッファアドレスがバッファ終端を超えると、ステップＳＦ３の判断結果が「ＹＥＳ」となり、本処理ルーチンを完了させる。
【００４０】
（ｄ）ノートＢＵＦ  ＯＦＦ処理ルーチンの動作
次に、図９を参照してノートＢＵＦ  ＯＦＦ処理ルーチンの動作について説明する。前述のステップＳＤ７（図６参照）を介して本処理ルーチンが実行されると、ＣＰＵ５は図９に示すステップＳＧ１にてノートバッファアドレスを初期化し、続くステップＳＧ２では、レジスタｍａｘＮＯＴＥをゼロリセットする。
次いで、ステップＳＧ３に進むと、ノートバッファアドレスがバッファ終端を超えたかどうかを判断する。バッファ終端を超えていなければ、判断結果は「ＮＯ」となり、ステップＳＧ４に進み、現アドレスに応じてノートバッファエリアＮＢＥを読み出す。
【００４１】
続いて、ステップＳＧ５では、前述の制御トラック生成処理ルーチンから与えられるノートオフイベント中のノートナンバ（以下、これをオフノートと記す）が、読み出したノートナンバと一致するか否かを判断する。一致しなければ、判断結果は「ＮＯ」となり、ステップＳＧ６に処理を進め、ノートバッファアドレスを歩進させてステップＳＧ３に処理を戻す。
【００４２】
一方、ノートバッファ中にオフノートと一致するノートナンバがあると、上記ステップＳＧ５の判断結果は「ＹＥＳ」となり、ステップＳＧ７に進む。ステップＳＧ７では、オフノートに一致したノートナンバを読み出したノートバッファアドレスに応じてノートバッファに「０」を書き込み、空き状態に設定する。この後、ステップＳＧ８に進み、上述したｍａｘノートサーチ処理ルーチン（図８参照）を実行し、ノートバッファに格納されるノートナンバの内、最も高い音高のノートナンバを抽出する。
【００４３】
このように、ノートＢＵＦ  ＯＦＦ処理ルーチンでは、ノートバッファ中にオフノートと一致するノートナンバがあると、そのノートナンバを「０」に書き換えて空き状態にしてから、ノートバッファ中に格納されるノートオンイベントの内で最高音のノートナンバを検索し、これをスプリットポイントとなるｍａｘノートとして抽出するようになっている。
【００４４】
（ｅ）制御トラック補正処理ルーチンの動作
次に、図１０を参照して制御トラック補正処理ルーチンの動作について説明する。前述した制御トラック生成処理ルーチンのステップＳＤ１４（図６参照）を介して本処理ルーチンが実行されると、ＣＰＵ５は図１０に示すステップＳＨ１に処理を進め、制御トラックアドレスを初期化する。次いで、ステップＳＨ２では、制御トラックアドレスに応じて制御トラックエリアＣＴＥを読み出す。以下、イベント、ステップタイムΔｔおよびＥＮＤマークを読み出した場合の各動作について述べる。
【００４５】
＜イベントを読み出した場合＞
この場合、ステップＳＨ３，ＳＨ４の判断結果がいずれも「ＮＯ」となり、ステップＳＨ５に進み、次イベントとそのステップタイムΔｔとを読み出す。その際、ＥＮＤマークを読み出すと、ステップＳＨ６の判断結果が「ＹＥＳ」となり、本ルーチンを完了させるが、そうでなければ、判断結果が「ＮＯ」となり、ステップＳＨ７に進む。
【００４６】
ステップＳＨ７では、次のイベントノートが先のイベントノートよりも大きいか否か、つまり先のスプリットポイントより次のスプリットポイントの方が高いかどうかを判断する。先のスプリットポイントの方が高い場合には、判断結果が「ＮＯ」となり、ステップＳＨ１１に処理を進めて制御トラックアドレスを歩進させるが、次のスプリットポイントの方が高ければ、判断結果は「ＹＥＳ」となり、ステップＳＨ８に処理を進める。
【００４７】
ステップＳＨ８では、先のイベントに対応したステップタイムΔｔが所定値より大きいか否かを判断する。所定値より小さければ、判断結果は「ＮＯ」となり、ステップＳＨ１１に処理を進めるが、所定値より大きければ、判断結果が「ＹＥＳ」となり、ステップＳＨ９に進む。
ステップＳＨ９では、先のイベントに対応したステップタイムΔｔから所定値αを減算し、続くステップＳＨ１０では、次のイベントに対応したステップタイムΔｔに所定値αを加算する。この後、ステップＳＨ１１にて制御トラックアドレスを歩進させた後、ステップＳＨ２に処理を戻す。
【００４８】
このように、制御トラックエリアＣＴＥからイベントを読み出した場合には、、先のスプリットポイントより次のスプリットポイントが高くなるイベントを探し出し、そうしたイベントでは押鍵タイミングを前倒しするよう時間調整（ステップＳＨ９，ＳＨ１０）しており、このようにすることで実際の押鍵タイミングよりも早いタイミングで押鍵されても適正に発音し得るようにしている。
【００４９】
＜ステップタイムΔｔを読み出した場合＞
この場合、ステップＳＨ３の判断結果が「ＮＯ」となり、ステップＳＨ４に進む。ステップＳＨ４では、読み出したステップタイムΔｔが「０」であるか否かを判断する。「０」でなければ判断結果は「ＮＯ」となり、上述したステップＳＨ５以降の処理を実行するが、「０」であると判断結果が「ＹＥＳ」となり、ステップＳＨ１２に処理を進め、ステップタイムΔｔが「０」のイベントを削除し、これに応じて制御トラックにおける次イベント以降を順次１イベント分シフトさせる。
【００５０】
＜ＥＮＤマークを読み出した場合＞
上述したイベント読み出しもしくはステップタイム読み出しが行われている過程で、曲終端を表すＥＮＤマークが読み出されると、ステップＳＨ３あるいはステップＳＨ６の判断結果が「ＮＯ」となり、本ルーチンを完了させる。
【００５１】
（ｆ）トランスポーズ処理ルーチンの動作
次に、図１１〜図１２を参照してトランスポーズ処理ルーチンの動作について説明する。前述した曲選択スイッチ処理ルーチンのステップＳＣ５（図５参照）を介して本処理ルーチンが実行されると、ＣＰＵ５は図１１に示すステップＳＪ１に進み、右パートアドレスを初期化する。右パートアドレスとは、ＲＯＭ６から右パート演奏データＰＤＲを読み出すためのアドレスを指す。
次いで、ステップＳＪ２では、制御トラックアドレスを初期化する。制御トラックアドレスとは、左パート演奏データＰＤＬに基づき、イベント毎のスプリットポイントを探し出して時系列順に並べた制御トラックエリアＣＴＥを読み出すアドレスである。
【００５２】
続いて、ステップＳＪ３〜ＳＪ５では、レジスタｍａｘα、レジスタＯＣＴおよびレジスタＳＰＮＴをそれぞれゼロリセットする。なお、これらレジスタに格納される値が意図するところについては追って述べる。次に、ステップＳＪ６〜ＳＪ９では、右パートおよび制御トラックの各経過時間をゼロリセットすると共に、右パートおよび制御トラックの各イベント間の時間をゼロリセットする。
こうして、ステップＳＪ１〜ＳＪ９を介した各種初期化が完了すると、ＣＰＵ５は実際に曲データを再生するタイミングとは異なる早送りタイミングに従い、ステップＳＪ１０〜ＳＪ１８では制御トラックを読み出し、ステップＳＪ１９〜ＳＪ３０では右パート演奏データＰＤＲを読み出す。
【００５３】
すなわち、ステップＳＪ１０〜ＳＪ１８では、制御トラックの読み出しタイミングになる毎に制御トラックからイベントもしくはステップタイムΔｔを読み出し、イベントを読み出した場合にはそれに含まれるノートナンバをスプリットポイントとしてレジスタＳＰＮＴにストアした後、制御トラックアドレスおよび経過時間をインクリメントして歩進させる。
【００５４】
次に、ステップＳＪ１９〜ＳＪ３０では、右パート演奏データＰＤＲの読み出しタイミングになる毎に右パートのイベントもしくはステップタイムΔｔを読み出す。読み出したイベントがノートオンイベントである場合、そのノートナンバを右パート側に設定されるトランスポーズ値に加算し、加算した結果がレジスタＳＰＮＴに格納されるスプリットポイントより低音側にあるか、つまり、左パート側に侵入しているかどうかを判断する。侵入している場合には、侵入幅αを算出する。侵入幅αは、レジスタｍａｘαの値と大小比較され、α＞ｍａｘαであれば、その侵入幅αがレジスタｍａｘαに最大侵入幅として格納される。
【００５５】
このように、ステップＳＪ１０〜ＳＪ３０では、制御トラックと右パートとを交互に読み出し、トランスポーズされた右パートのノートオンイベント（ノートナンバ）がスプリットポイントを超えて左パート側に侵入する際の最大侵入幅をレジスタｍａｘαに確保する。なお、レジスタｍａｘαに格納される最大侵入幅は半音数で表される。
【００５６】
そして、制御トラックと右パートとを読み出し終えると、ステップＳＪ３１〜ＳＪ３３を実行し、レジスタｍａｘαに格納される最大侵入幅をオクターブ数に変換してレジスタＯＣＴにストアする。
次いで、ステップＳＪ３４では、右パートに設定されたトランスポーズ値を、レジスタＯＣＴにストアしたオクターブ数分シフトさせて本ルーチンを完了させる。これにより、右パート側がスプリットポイントを超えてしまう左右パート間の鍵域競合を防止するようになっている。
【００５７】
▲２▼スタートスイッチ処理ルーチンの動作
次に、図１３を参照してスタートスイッチ処理ルーチンの動作について説明する。スタートスイッチがオン操作されると、ＣＰＵ５はメインルーチンのステップＳＡ２（図３参照）を介して図１３に示すステップＳＫ１に処理を進め、先ずテンポカウンタＴＭＰＣをゼロリセットする。
次いで、ステップＳＫ２に進むと、各パートの先頭アドレスを、それぞれ対応するパートの現在アドレスとしてセットする。そして、ステップＳＫ３，ＳＫ４では、各パートの次イベントまでの時間および各パートの経過時間をそれぞれゼロリセットする。
【００５８】
（４）曲データ再生処理ルーチンの動作
次に、図１４を参照して曲データ再生処理ルーチンの動作について説明する。前述したメインルーチン（図３参照）のステップＳＡ３を介して曲データ再生処理ルーチンが実行されると、ＣＰＵ５はステップＳＬ１に処理を進め、パート番号を初期化する。なお、ここで言うパート番号とは、左右パートおよび制御トラックを識別する番号である。続いて、ステップＳＬ２では左右パートの演奏データおよび制御トラックを再生し終えたかどうかを判断する。
再生し終えたならば、判断結果が「ＹＥＳ」となり、本ルーチンを完了させるが、再生終了していなければ判断結果は「ＮＯ」となり、次のステップＳＬ３に進み、現在設定されているパートの演奏データもしくは制御トラックを、現在アドレスに応じて読み出す。
【００５９】
次いで、ステップＳＬ４では、イベントタイミングに達したどうかを判断し、イベントタイミングに達していなければ、判断結果は「ＮＯ」となり、ステップＳＬ９に進み、次パートの演奏データもしくは制御トラックの読み出しを進めるべく、パート番号を更新してステップＳＬ２に処理を戻す。
一方、イベントタイミングに達すると、ステップＳＬ４の判断結果が「ＹＥＳ」となり、ステップＳＬ５に進み、経過時間をゼロリセットする。そして、ステップＳＬ６では、演奏データが読み出された場合にはそのイベント内容に応じてノートオンあるいはノートオフを音源８に指示し、制御トラックが読み出された場合には読み出したノートナンバをスプリットポイントとしてレジスタＳＰＮＴにストアするイベント処理を実行する。次に、ステップＳＬ７では、次イベント迄の待ち時間をワークエリアにセットした後、ステップＳＬ８にて読み出しアドレスをインクリメントして歩進させてからステップＳＬ３に処理を戻す。
【００６０】
（５）イベント処理ルーチンの動作
次に、図１５〜図１６を参照してイベント処理ルーチンの動作について説明する。上述したステップＳＬ６を介してイベント処理が実行されると、ＣＰＵ５は処理すべきイベントがノートオンイベントであればステップＳＭ１にて音源８に発音を指示するノートオン処理ルーチンを実行し、処理すべきイベントがノートオフイベントであればステップＳＭ２にて音源８に消音を指示するノートオフ処理ルーチンを実行する。そして、ステップＳＭ３では、制御トラックからノートナンバが読み出された場合に、それをスプリットポイントとしてレジスタＳＰＮＴにストアする。
【００６１】
上記ステップＳＭ１を介してノートオン処理ルーチンが実行されると、ＣＰＵ５は図１６に示すステップＳＮ１に処理を進め、通常再生モードであるかどうかを判断する。ここで、通常再生モードであれば、判断結果は「ＹＥＳ」となり、ステップＳＮ２に進む。ステップＳＮ２では、ノートオンイベントに含まれるノートナンバの楽音を発音するよう音源８に指示した後、ステップＳＮ４に処理を進める。
【００６２】
一方、通常再生モードでない場合、すなわち、演奏案内するガイドモード下にあると、上記ステップＳＮ１の判断結果が「ＮＯ」となり、ステップＳＮ３に進み、ノートオンイベントに含まれるノートナンバに対し、現在再生中のパート側に設定されているトランスポーズ値を加算する。
そして、ステップＳＮ４では、通常再生モード下であれば、ノートナンバに対応する鍵の発光手段２ａを点灯駆動して押鍵案内し、一方、演奏案内モード下にあると、ノートナンバに対し現在再生中のパート側に設定されているトランスポーズ値を加算した結果に対応する鍵の発光手段２ａを点灯駆動して押鍵案内して本ルーチンを完了する。
【００６３】
（６）鍵盤処理ルーチンの動作
次に、図１７を参照して鍵盤処理ルーチンの動作について説明する。前述したメインルーチン（図３参照）のステップＳＡ４を介して鍵盤処理ルーチンが実行されると、ＣＰＵ５はステップＳＰ１に処理を進め、キーオンイベントの有無を判断する。ここで、押鍵操作に応じて発生するキーオンイベントを検出すると、判断結果が「ＹＥＳ」となり、ステップＳＰ２〜ＳＰ８の押鍵時処理を実行する。
押鍵操作に応じてステップＳＰ２に進むと、演奏案内するガイドモード下にあるか否かを判断する。ガイドモード下になければ、判断結果は「ＮＯ」となり、ステップＳＰ３に進み、押鍵操作に応じて発生するキーオンイベントおよびキーコードを音源８に送出して発音指示するノートオン処理を実行する。
【００６４】
ガイドモード下であると、上記ステップＳＰ２の判断結果は「ＹＥＳ」となり、ステップＳＰ４に進み、押鍵された鍵のキーコードがレジスタＳＰＮＴに格納されるスプリットポイントより小さいか否か、すなわち、左パート鍵域の押鍵であるかどうかを判断する。
【００６５】
左パート鍵域の押鍵であると、判断結果は「ＹＥＳ」となり、ステップＳＰ５に処理を進め、押鍵された鍵のキーコードを、左パート側に設定されるトランスポーズ値分シフトさせ、続くステップＳＰ６では、そうして音高シフトされた鍵の楽音を発音するよう音源８に指示する左側パートノートオン処理を実行する。これに対し、右パート鍵域の押鍵であると、上記ステップＳＰ４の判断結果が「ＮＯ」となり、ステップＳＰ７に処理を進め、押鍵された鍵のキーコードを、右パート側に設定されるトランスポーズ値分シフトさせ、続くステップＳＰ８では、そうして音高シフトされた鍵の楽音を発音するよう音源８に指示する右側パートノートオン処理を実行する。
【００６６】
さて一方、キーオンイベントが検出されない場合には、上記ステップＳＰ１の判断結果は「ＮＯ」となり、ステップＳＰ９に進み、キーオフイベントの有無を判断する。ここで、押鍵操作に応じて発生するキーオフイベントを検出すると、判断結果が「ＹＥＳ」となり、ステップＳＰ１０〜ＳＰ１６の離鍵時処理を実行する。
離鍵操作に応じてステップＳＰ１０に進むと、演奏案内するガイドモード下にあるか否かを判断する。ガイドモード下になければ、判断結果は「ＮＯ」となり、ステップＳＰ１１に進み、離鍵操作に応じて発生するキーオフイベントおよびキーコードを音源８に送出して消音指示するノートオフ処理を実行する。
【００６７】
ガイドモード下であると、上記ステップＳＰ１０の判断結果が「ＹＥＳ」となり、ステップＳＰ１２に進み、離鍵された鍵のキーコードがレジスタＳＰＮＴに格納されるスプリットポイントより小さいか否か、すなわち、左パート鍵域の離鍵であるかどうかを判断する。
左パート鍵域の離鍵であると、判断結果は「ＹＥＳ」となり、ステップＳＰ１３に処理を進め、離鍵された鍵のキーコードを、左パート側に設定されるトランスポーズ値分シフトさせ、続くステップＳＰ６では、そうして音高シフトされた鍵の楽音を消音するよう音源８に指示する左側パートノートオフ処理を実行する。
【００６８】
これに対し、右パート鍵域の離鍵であると、上記ステップＳＰ１２の判断結果が「ＮＯ」となり、ステップＳＰ１５に処理を進め、離鍵された鍵のキーコードを、右パート側に設定されるトランスポーズ値分シフトさせ、続くステップＳＰ１６では、そうして音高シフトされた鍵の楽音を消音するよう音源８に指示する右側パートノートオフ処理を実行する。
なお、キーオン／キーオフイベントが共に検出されない場合、つまり鍵操作されない場合には、上記ステップＳＰ１，ＳＰ９の各判断結果がいずれも「ＮＯ」となり、何も処理せずに本ルーチンを完了させる。
【００６９】
以上のように、本実施例によれば、連弾演奏を練習する曲データを選択すると、その曲データを構成する左右パートの演奏データの内、左パート演奏データＰＤＬを順次読み出してイベント毎のスプリットポイントを探し出し、探し出したイベント毎のスプリットポイントと、それに対応するステップタイムΔｔとを時系列順に並べて制御トラックを生成する。
そして、右パートにトランスポーズ設定されている場合、そのトランスポーズ設定を加味した右パートの演奏データＰＤＲと制御トラックに格納されるスプリットポイントとを順次比較して右パートのノートオンイベントがスプリットポイントを超えて鍵域競合する際の最大侵入幅を検出してオクターブ数に変換し、その分、右パートに設定されたトランスポーズ値をシフトさせて左右パートの演奏データＰＤＬ，ＰＤＲに応じて連弾演奏を案内するので、右パート側がスプリットポイントを超えてしまう左右パート間の鍵域競合を防止することが可能になっている。
また、左右パート間の鍵域競合を防止する為、演奏者は自己担当パートをトランスポーズしても、スプリットポイントを意識せずに自然な演奏を違和感なく練習し得るようになっている。
【００７０】
請求項１、２記載の発明によれば、連弾演奏に対応した左右パート別の曲データの内、一方のパートの曲データを読み出し、当該読み出された一方のパートの曲データの音高に基づいて左右パートの分割位置を表すスプリットポイントを表す音高を抽出して時系列順に並べた制御トラックを生成し、この制御トラックに格納されるスプリットポイントを表す音高とトランスポーズ設定された他方のパートの曲データの音高とを順次比較して他方のパートの曲データの音高が前記スプリットポイントを表す音高を超える際の最大侵入幅を検出し、その最大侵入幅に応じて他方のパートに設定されたトランスポーズ値をシフトするので、左右パート間の鍵域競合を防止することができる。
また、左右パート間の鍵域競合を防止することによって、演奏者は自己担当のパートをトランスポーズしても、スプリットポイントを意識せずに自然な演奏を違和感なく練習することができる。
【図面の簡単な説明】
【図１】本発明による一実施例の構成を示すブロック図である。
【図２】ＲＯＭ６に記憶される曲データの構成およびＲＡＭ７の構成を示す図である。
【図３】メインルーチンの動作を示すフローチャートである。
【図４】タイマ割込み処理ルーチンの動作を示すフローチャートである。
【図５】曲選択スイッチ処理ルーチンの動作を示すフローチャートである。
【図６】制御トラック生成処理ルーチンの動作を示すフローチャートである。
【図７】ノートＢＵＦ  ＯＮ処理ルーチンの動作を示すフローチャートである。
【図８】ｍａｘノートサーチ処理ルーチンの動作を示すフローチャートである。
【図９】ノートＢＵＦ  ＯＦＦ処理ルーチンの動作を示すフローチャートである。
【図１０】制御トラック補正処理ルーチンの動作を示すフローチャートである。
【図１１】トランスポーズ処理ルーチンの動作を示すフローチャートである。
【図１２】トランスポーズ処理ルーチンの動作を示すフローチャートである。
【図１３】スタートスイッチ処理ルーチンの動作を示すフローチャートである。
【図１４】曲データ再生処理ルーチンの動作を示すフローチャートである。
【図１５】イベント処理ルーチンの動作を示すフローチャートである。
【図１６】ノートオン処理ルーチンの動作を示すフローチャートである。
【図１７】鍵盤処理ルーチンの動作を示すフローチャートである。
【符号の説明】
１  鍵盤
２  押鍵ガイド部
２ａ  発光手段
２ｂ  ドライバ
３  パネルスイッチ群
４  表示部
５  ＣＰＵ
６  ＲＯＭ
７  ＲＡＭ
８  音源
９  Ｄ／Ａ変換回路
１０  サウンドシステム
【図１】
0003809789.tif 000002
【図２】
0003809789.tif 000003
【図３】
0003809789.tif 000004
【図４】
0003809789.tif 000005
【図５】
0003809789.tif 000006
【図６】
0003809789.tif 000007
【図７】
0003809789.tif 000008
【図８】
0003809789.tif 000009
【図９】
0003809789.tif 000010
【図１０】
0003809789.tif 000011
【図１１】
0003809789.tif 000012
【図１２】
0003809789.tif 000013
【図１３】
0003809789.tif 000014
【図１４】
0003809789.tif 000015
【図１５】
0003809789.tif 000016
【図１６】
0003809789.tif 000017
【図１７】
0003809789.tif 000018