(57)【特許請求の範囲】
【請求項１】
複数の楽音データを対応するタイミングデータと共に第１記憶手段に記憶する第１のステップと、
前記第１記憶手段に記憶された楽音データを読み出して、該楽音データに対応する楽音波形を生成するための音源パラメータを生成し、該音源パラメータを対応するタイミングデータと共に第２記憶手段に記憶する第２のステップと、
前記第２記憶手段に記憶された前記音源パラメータと対応するタイミングデータに基づいて前記楽音波形を生成し、生成された前記楽音波形を第３記憶手段に記憶する第３のステップと、
前記第３記憶手段に記憶されている楽音波形を順次再生する第４のステップと、
前記タイミングデータに基づく発音タイミングに先行し、かつ該発音タイミングに応じて第１のタイミングを発生し、該第１のタイミングで前記第３のステップを起動する第５のステップと、
前記発音タイミングに先行し、かつ該発音タイミングとは独立した第２のタイミングを発生し、該第２のタイミングで前記第２のステップを起動する第６のステップとを備え、
前記第２のタイミングを前記第１のタイミングに先行して発生するようにしたことを特徴とする楽音生成方法。
【請求項２】
前記第６のステップは、前記楽音生成方法を実行する演算装置の使用状況を判定し、演算装置に空き時間が検出されたタイミングあるいは一定期間経過したことが検出されたタイミングで前記第２のタイミングを発生することを特徴とする請求項１記載の楽音生成方法。
【請求項３】
前記第６のステップは、前記楽音生成方法を実行する演算装置がソフトウェア的に検出する所定時間ごとに前記第２のタイミングを発生することを特徴とする請求項１記載の楽音生成方法。
【請求項４】
前記第２のステップが１回起動される毎に、１つの楽音データに対応した音源パラメータが生成されるようにしたことを特徴とする請求項１記載の楽音生成方法。
【請求項５】
前記第２のステップが複数回起動された結果、１つの楽音データに対応した音源パラメータが生成されるようにしたことを特徴とする請求項１記載の楽音生成方法。
【請求項６】
前記第３のステップが起動されたときに、前記第１記憶手段に記憶された前記楽音データのうち、前記楽音波形の生成範囲に含まれるタイミングデータに対応した楽音データの音源パラメータが生成済みであるか否かを判定し、生成済みでない場合には未生成の楽音データに対応する音源パラメータを発生してから楽音波形を生成するようにしたことを特徴とする請求項１記載の楽音生成方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、マイクロプロセッサに楽音生成処理プログラムを実行させることにより音源波形を生成する場合に好適な楽音生成方法に関するものである。
【０００２】
【従来の技術】
従来の楽音生成装置は、通常、楽譜通りのタイミングでＭＩＤＩ（Musical Instrument Digital Interface）イベントを送出するプレーヤ（自動演奏プログラム）、ＭＩＤＩイベントが入力される毎に入力されたＭＩＤＩイベントに応じた音源パラメータを発生する音源ドライバ、発生された音源パラメータに基づいて楽音波形を生成する音源から構成されている。なお音源ドライバは、入力されたＭＩＤＩイベントに応じて、チャンネルアサイン、音源パラメータ変換等の音源ドライバ処理を実行し、当該イベントに割り当てられたチャンネルに、変換した音源パラメータと発音開始指示（ノートオン）を供給する。
音源は、専用のＬＳＩ（Large Scale Integrated circuit）やＤＳＰ（Digital Signal Processor）等のハードウェアで構成（ハードウェア音源）されたり、楽音生成処理手順を記述したプログラムをＣＰＵに実行させるソフトウェア音源により構成されている。
【０００３】
このように楽音生成装置は、プレーヤ、音源ドライバ、音源により構成されているが、これらの処理負荷は一定ではなく時間の経過と共に大きく変動しているのが一般的である。
たとえば、ＭＩＤＩイベントが多いときにはプレーヤおよび音源ドライバで処理すべき負荷が大きくなる。特に、音源ドライバでは、ノートオンイベントが多いときに処理負荷が大きくなる。これは、ノートオンイベント時では、空きチャンネルをサーチして、ノートオンされた楽音を発生するチャンネルの発音割当処理が行われるが、この際に行われるサーチ処理およびトランケート処理は時間のかかる負荷の大きい処理であるからである。さらに、ノートオンイベント時には、キータッチに応じた音色設定処理等も行われる。このように、ノートオンイベントが多いときには音源ドライバ処理の負荷が大きくなるのである。
また、音源がソフトウェア音源で構成されている場合には、同時発音数が多いときに音源における処理の負荷が大きくなる。
【０００４】
ここで、プレーヤ、音源ドライバ、および音源における処理のタイミングチャートを例示して具体的に説明する。図９は楽音生成装置の各処理タイミングを示すタイミングチャートの例であり、ＭＩＤＩ入力と記されているＭ１〜Ｍ４はＭＩＤＩイベントであり下向きの矢印で示すタイミングで入力されている。このＭＩＤＩイベントは、たとえば、プレーヤがＭＩＤＩファイル等を読み出して楽譜通りのタイミングで送出したＭＩＤＩイベントである。このＭＩＤＩイベントＭ１〜Ｍ４が受信される毎にＭＩＤＩ処理を起動する優先度の高い割り込みが発生し、起動されたＭＩＤＩ処理においてＭＩＤＩイベントＭ１〜Ｍ４は、受信された時刻と共に入力バッファに格納される。
【０００５】
音源ドライバと記されている処理ａ，ｂは、入力バッファに格納されたＭＩＤＩイベントを音源ドライバが受け取り、該ＭＩＤＩイベントに応じてチャンネルアサイン、音源パラメータの発生等を行う。ここで発生された音源パラメータは音源パラメータバッファに格納される。
また、波形生成と記されている処理Ａ，Ｂ，・・・，Ｅは、時刻ｔ１，ｔ２，・・・，ｔ５，・・の一定周期で起動されて音源で実行される波形生成処理のタイミングであり、音源パラメータバッファから読み出された音源パラメータに基づいて楽音波形サンプルを生成している。なお、一定周期の単位を１フレームとしている。この波形生成処理では、たとえば、時刻ｔ１から時刻ｔ２のフレームにおいて発生された音源パラメータに基づいて、次のフレームである時刻ｔ２から時刻ｔ３のフレームにおいて１フレーム周期に対応するサンプル数の楽音波形サンプルが波形生成処理で生成されて出力バッファに格納される。この場合、波形生成処理において、継続音の楽音波形サンプルも生成される。そして、各発音チャンネルの楽音波形サンプルが足し込まれて、ＤＡＣ（デジタル・アナログコンバータ）等の再生デバイスに再生予約される。
【０００６】
さらに、波形再生と記されているのは、再生デバイスが出力バッファからサンプリング周期毎に楽音波形サンプルを読み出して再生するタイミングを示している。たとえば、時刻ｔ２から時刻ｔ３のフレームにおいて波形生成された楽音波形サンプルは、次のフレームである時刻ｔ３から時刻ｔ４のフレームにおいて再生される。
従って、ＭＩＤＩイベントが入力されてから実際に発音されるまでの発音遅れ時間Δｔは２フレーム以内となり、楽音波形の生成は次のフレームで再生する楽音波形を、現時点のフレームの期間内に生成し終えるようにしなければならない。なお、１フレームは数ｍｓｅｃの周期とされている。
【０００７】
【発明が解決しようとする課題】
ところで、一般に音源ドライバはＣＰＵに音源ドライバプログラムを実行させることにより実現されており、音源ドライバ処理は、基本的にノートオンイベント，ノートオフイベント，プログラムチェンジ等のイベント発生時に起動される。このため、図９にイベントＭ１〜Ｍ３として示すようにイベントが同時刻に集中して入力されると、音源ドライバ処理が急激に増加する。従って、イベントの集中時には、音源ドライバ処理を実行するＣＰＵに大きな負担がかかり、同時にＣＰＵが実行している自動演奏プログラム、ゲームプログラム、あるいは、画像処理等の実行を行えなくなるおそれが生じる。
【０００８】
特に、音源がソフトウェア音源で構成されており、ソフトウェア音源で演算すべき発音数が多いときには、生成する楽音波形サンプル数が増加するためソフトウェア音源の負荷が多いことは当然であるが、発音数が多いことからイベントの発生も多く、音源ドライバおよびプレーヤで処理すべき負荷が大きくなることになる。従って、ソフトウェア音源において演算すべき発音数が多い時には、他の楽音生成のための処理も増加し演算可能な発音数が低下してしまうおそれがあった。
たとえば、ソフトウェア音源において通常３２音発音可能な場合でも、ノートオンイベントが集中して発生した際には、音源ドライバで実行されるノートオンイベント処理のためにＣＰＵの演算能力の大部分が費やされるようになり（図９ＭＩＤＩ入力および音源ドライバの処理タイミング参照）、ソフトウェア音源に割り当てられるＣＰＵの演算能力が減少し、３２音の楽音波形をソフトウェア音源で生成することができなくなる。
【０００９】
これを解決するために、ＣＰＵに余裕のあるときに音源ドライバの生成した音源パラメータに基づいて、発音タイミングより事前に楽音波形を音源において先行生成しておき、生成した音源波形を波形バッファに記憶しておくようにする。そして、発音タイミング時に波形バッファから音源波形を読み出して発音するようにする方法が提案されている。
しかしながらこの方法では、先行生成した音源波形を記憶するために大容量の波形バッファが必要になる。また、曲データの演奏途中において音量制御、パン制御、効果制御等の操作が行われた際には、すでに先行生成された楽音波形の各パートの楽音波形が合成されていることから、楽音波形を修正するのが困難となる。修正するには、たとえば１６パートの各パート別に独立して波形バッファに記憶させなければならず、さらに多くの波形バッファが必要となる。
【００１０】
そこで、本発明はノートオンイベントのようなＣＰＵ負荷が急激に増加するイベントが集中して発生しても、演算可能な発音数が低下することがないと共に、各パート別に音量制御可能な楽音生成方法を提供することを目的としている。
【００１１】
【課題を解決するための手段】
前記目的を解決するために、本発明の楽音生成方法は、複数の楽音データを対応するタイミングデータと共に第１記憶手段に記憶する第１のステップと、前記第１記憶手段に記憶された楽音データを読み出して、該楽音データに対応する楽音波形を生成するための音源パラメータを生成し、該音源パラメータを対応するタイミングデータと共に第２記憶手段に記憶する第２のステップと、前記第２記憶手段に記憶された前記音源パラメータと対応するタイミングデータに基づいて前記楽音波形を生成し、生成された前記楽音波形を第３記憶手段に記憶する第３のステップと、前記第３記憶手段に記憶されている楽音波形を順次再生する第４のステップと、前記タイミングデータに基づく発音タイミングに先行し、かつ該発音タイミングに応じて第１のタイミングを発生し、該第１のタイミングで前記第３のステップを起動する第５のステップと、前記発音タイミングに先行し、かつ該発音タイミングとは独立した第２のタイミングを発生し、該第２のタイミングで前記第２のステップを起動する第６のステップとを備え、前記第２のタイミングを前記第１のタイミングに先行して発生するようにしている。
この楽音生成方法によれば、楽音データの演奏されるタイミングとは独立したタイミングで楽音データに応じた音源パラメータの生成が行われるので、演奏データのタイミングが密となってもそのために音源パラメータの生成処理がきつくなることを防止することができる。
【００１２】
また、前記楽音生成方法において、前記第６のステップは、前記楽音生成方法を実行する演算装置の使用状況を判定し、演算装置に空き時間が検出されたタイミングあるいは一定期間経過したことが検出されたタイミングで前記第２のタイミングを発生している。
この楽音生成方法によれば、楽音パラメータの生成処理を、演算装置の負荷が軽いタイミングに分散して処理することができる。
さらに、前記楽音生成方法において、前記第６のステップは、前記楽音生成方法を実行する演算装置がソフトウェア的に検出する所定時間ごとに前記第２のタイミングを発生している。
この楽音生成方法によれば、楽音パラメータの生成処理をソフトウェアタイマに設定された時間に応じた密度で分散して行うことができる。また、ソフトウェアタイマであれば、演算装置の処理が込んでいる時に検出落ちとなるので処理の集中を防止することができる。
【００１３】
さらにまた、前記楽音生成方法において、前記第２のステップが１回起動される毎に、１つの楽音データに対応した音源パラメータが生成されている。
この楽音生成方法によれば、複数の楽音データが短時間のうちに演奏された場合でも、対応する音源パラメータの生成を各楽音データ毎に分散したタイミングで行うことができる。
さらにまた、前記楽音生成方法において、前記第２のステップが複数回起動された結果、１つの楽音データに対応した音源パラメータが生成されている。
この楽音生成方法によれば、楽音データの種類に応じて音源パラメータの生成処理にかかる処理の大きさが異なるが、処理の大きい楽音データの場合でも、１つの楽音データに応じた音源パラメータの生成処理を複数の部分に分けて実行するので、処理量の時間的な集中を防止することができる。
【００１４】
さらにまた、前記楽音生成方法において、前記第３のステップが起動されたときに、前記第１記憶手段に記憶された前記楽音データのうち、前記楽音波形の生成範囲に含まれるタイミングデータに対応した楽音データの音源パラメータが生成済みであるか否かを判定し、生成済みでない場合には未生成の楽音データに対応する音源パラメータを発生してから楽音波形を生成するようにしている。
この楽音生成方法によれば、分散処理による音源パラメータの生成が完了しないまま楽音生成のタイミングとなった場合でも、その完了していない処理を先に終了してから楽音生成を行うようにしているので、生成する楽音に悪影響を与えない。また、その場合にも一部の音源パラメータは分散的に処理されるようになる。
【００１５】
このように本発明によれば、受け取った楽音データをバッファに記憶しておき、音源ドライバがバッファに記憶された楽音データを非同期で分散処理することにより音源パラメータを発生するようにしている。従って、イベントが集中して発生しても、音源ドライバの処理は分散して実行されるため、ＣＰＵ負荷が急激に増加することがなく、一時的な処理の集中による発音数の減少を防止することができる。
特に、ソフトウェア音源における楽音波形の生成には安定した演算能力を必要としているが、音源ドライバにおける処理は、イベント単位で瞬間的に計算パワーを必要とするだけで長時間でその負荷を平均すると数パーセント程度であるため、音源ドライバ処理を分散して実行する効果は非常に大きいものとなる。
また、音源ドライバまでの処理を先行して実行し、波形生成は発音タイミングになったときに実行するようにしているので、生成する楽音に対し、パート別の音量制御やパン制御等の処理をリアルタイムで行うことができる。
【００１６】
【発明の実施の形態】
本発明の楽音生成方法を実行することのできる処理装置の構成例を図１に示す。ただし、図１に示す処理装置は、パソコン、ワークステーション等の汎用の処理装置と同等であり、それらの上で本発明の楽音発生方法を実施することができる。
この図において、１はアプリケーションプログラム等を実行してファイルから読み出した演奏データに基づいて自動演奏を行うための各種演算処理を行うマイクロプロセッサ（ＣＰＵ）、２はＣＰＵ１の動作プログラムやプリセット音色データ等が記憶されているリードオンリメモリ（ＲＯＭ）、３はＣＰＵ１のワークメモリエリアや入力バッファエリア（Ｍバッファ）、音源パラメータエリア（Ｐバッファ）、パート設定データエリア、音源レジスタエリア、出力バッファエリア等の記憶エリアを有するランダムアクセスメモリ（ＲＡＭ）、４は時刻を指示すると共に、タイマ割り込み処理のタイミングをＣＰＵ１に指示するタイマ、５はＭＩＤＩイベントが入力されると共に、生成されたＭＩＤＩイベントを出力するＭＩＤＩインターフェースである。
【００１７】
６は楽音波形サンプルを生成するために使用する楽音波形データ等やオペレーションシステム（ＯＳ）、本発明の楽音生成方法にかかるプログラムや各種アプリケーションプログラム等が格納されるハードディスクであり、ＣＰＵ１による実行時に楽音生成方法にかかるプログラムはＲＡＭ３にロードされる。７は楽音波形サンプルを生成するために使用する楽音波形データ等やＯＳ、各種アプリケーションプログラム等が格納される光ディスクやハードディスク等の差し替え可能な記憶媒体がセットされるリムーバブルディスク、８はユーザが楽音生成装置と対話するためのディスプレイ（モニタ）、９は英字、かな、数字、記号などのキーを備えるいわゆるパソコン用のキーボードおよびポインティングデバイスの一種であるマウス、１０はＤＳＰ等が搭載されたサウンドボード等のハードウェア音源であり、ソフトウェア音源を有している場合は、必ずしも必要なものではない。１１はデータのやりとりを行うＣＰＵバスである。
なお、プログラムは、図示しないネットワークインターフェースを介して、外部のネットワークからダウンロードすることもできる。
【００１８】
前記したようにＲＡＭ３は種々のデータが記憶されるエリアを有しているが、そのエリアの内容の例を図２（ａ）に、そのうちのＰバッファエリアの内容の例を図２（ｂ）に、そのうちのＭバッファの内容の例を図２（ｃ）に示す。
図２（ａ）に示すようにＲＡＭ３には、Ｍバッファ、Ｐバッファ、パート設定データ、音源レジスタ、音源ワークエリアの各エリアが存在している。ただし、出力バッファのエリアは示されていないが、必ずしもＲＡＭ３に設定される必要はなく、ハードディスク６やリムーバブルディスク７に出力バッファのエリアを設定するようにしてもよい。
【００１９】
Ｍバッファには、ハードディスク６やリムーバブルディスク７に格納されているＭＩＤＩファイルから読み出されたＭＩＤＩのフォームの曲データや、ＭＩＤＩインターフェース５を介して入力されるノートオン、ノートオフやプログラムチェンジ等の各種ＭＩＤＩイベントが、その受信時刻と共に書き込まれる。受信時刻はタイマ４の値を用いることができる。イベントが書き込まれたＭバッファの状態を図２（ｃ）に示しているが、デュレーションと受信されたＭＩＤＩイベントが組として書き込まれている。このデュレーションはその直前に受信されたＭＩＤＩイベントの受信時刻と、今回受信されたＭＩＤＩイベントの受信時刻との時間間隔を示している。なお、この図に示す例では、データ数を示す位置にデータ数が「２」と示されており、デュレーションとイベントとの組が２組分Ｍバッファに格納されていることが示されている。
【００２０】
また、Ｍバッファはリングバッファとして使用されており、その読出ポインタのアドレスと書込ポインタのアドレスとがＭバッファ内の所定位置に格納されている。これにより、音源ドライバがＭバッファから音源ドライバ処理が未完のイベントデータを読み出して、音源ドライバ処理を実行できるようになる。すなわち、Ｍバッファの読出ポインタアドレスを読み出して、Ｍバッファの当該アドレス位置からデュレーションとイベントの組のデータを読み出して、そのイベントデータに応じた音源パラメータを発生する音源ドライバ処理を実行することができる。さらに、受信したＭＩＤＩイベントをＭバッファに書き込むＭＩＤＩ入力処理時には、Ｍバッファの書込ポインタアドレスを読み出して、Ｍバッファの当該アドレス位置からデュレーションとイベントの組のデータを書き込むようにすればよい。
【００２１】
Ｐバッファには、音源ドライバ処理により発生された音源パラメータがデュレーションデータと組とされて格納されている。このＰバッファの状態を図２（ｂ）に示しているが、このデュレーションの値はＭバッファに格納されていた時に音源ドライバ処理が行われたイベントと組とされていたデュレーションと同じ値である。なお、この図に示す例では、データ数を示す位置にデータ数が「３」と示されており、デュレーションとイベントとの組が３組分Ｐバッファに格納されていることが示されている。
また、Ｐバッファもリングバッファとして使用されており、その読出ポインタのアドレスと書込ポインタのアドレスとがＰバッファ内の所定位置に格納されている。これにより、発音タイミングとなったか否かを読出ポインタ位置のデュレーションをみて判定し、発音タイミングとなったときに、当該音源パラメータを音源レジスタに送ることができ、音源ドライバ処理に発生された音源パラメータのＰバッファへの格納は、書込ポインタ位置から書き込むことにより行えるようになる。
【００２２】
また、パート設定データエリアには、パート別の音色選択データ、音量データ、定位位置（パン）データ等が格納されている。発音開始時には、該音色選択データで指定された音色データ（図示せず）に基づいて楽音生成に使用する波形データ（図示せず）のアドレスパラメータや音量エンベロープの各種ＥＧパラメータ等が生成されると共に、該音量データや該定位位置データに基づいて音量パラメータが生成される。これらのパラメータは、これから発音を開始するチャンネルに対応した音源レジスタエリアの記憶領域に格納される。
【００２３】
次に、本発明の楽音生成方法を図３に示すタイミングチャートに基づいて、図１に示す構成の処理装置が実行する場合の説明を行う。なお、図３（ａ）はＭＩＤＩ入力処理、音源ドライバ処理、波形生成処理、波形再生処理のタイミングを示しており、図３（ｂ）はＭＩＤＩ入力に応じた従来と本発明における音源ドライバ処理量、および、波形生成処理量の変化を示している。
まず、図３（ａ）のＭＩＤＩ入力に示すように時刻ｔ１から時刻ｔ２までのフレームの期間内において、集中したＭＩＤＩイベントＭ１，Ｍ２，Ｍ３が連続して受信されたとする。このＭＩＤＩイベントＭ１，Ｍ２，Ｍ３は、順次受信時刻に応じたデュレーションと組とされてＭバッファに書き込まれる。
【００２４】
そして、図３（ａ）の音源ドライバに示すように時刻ｔ２から始まる次のフレーム以降の期間において、ＭバッファからデュレーションとＭＩＤＩイベントの組からなるデータが読み出されてイベントに応じた音源ドライバ処理が分散して実行される。図示する例では、ＭＩＤＩイベントＭ１，Ｍ２，Ｍ３に対応した音源ドライバ処理は、処理ａないし処理ｇの７回に分散されて実行されて、処理が実行される毎に発生された音源パラメータがＰバッファに書き込まれるようになる。そして、波形生成処理で生成する楽音波形サンプルの時刻がＰバッファに格納された音源パラメータと組とされているデュレーションの時刻に達したときに、Ｐバッファから音源レジスタに当該音源パラメータが送られ、その音源パラメータに基づいて音源において楽音波形生成処理が実行される。図示する例では、時刻ｔｎ−１から始まるフレームの期間内において、実行される楽音波形生成処理Ｂにおいて、ＭＩＤＩイベントＭ１，Ｍ２，Ｍ３に応じて生成されＰバッファに記憶されている音源パラメータが、それぞれ対応するデュレーションで指定される時刻位置で音源レジスタに導入され、そのタイミングで変化する音源レジスタの内容に応じて楽音波形サンプルが生成される。各波形生成処理Ａ、Ｂ・・・の終わりには、生成した１フレーム分の複数楽音波形サンプルを収納した出力バッファが再生デバイスに再生予約される。
【００２５】
そして、時刻ｔｎから始まる次のフレームにおいて、サンプリング周期毎に１サンプルづつ出力バッファから読み出され、ＤＡＣでアナログの楽音波形とされて発音される波形再生処理が行われるようになる。
従って、この際の制御遅れ時間Δｔは時刻ｔ１と時刻ｔｎとの時間間隔となる。たとえば、制御遅れ時間Δｔは１ｓｅｃ程度とすることができる。なお、１フレームは数ｍｓｅｃの周期とされている。
また、時刻ｔ３から時刻ｔ４までのフレームの期間中において、ＭＩＤＩイベントＭ４が入力されているが、この場合も同様にＭＩＤＩイベントＭ４は受信時刻に応じたデュレーションと組とされてＭバッファに書き込まれる。
【００２６】
そして、図３（ａ）の音源ドライバに示すように時刻ｔ４から始まる次のフレーム以降の期間において、ＭバッファからデュレーションとＭＩＤＩイベントの組からなるデータが読み出されてイベントに応じた音源ドライバ処理が分散して実行される。図示する例では、ＭＩＤＩイベントＭ４に対応した音源ドライバ処理は、処理ｈ，ｉの２回に分散されて実行されて、処理が実行される毎に発生された音源パラメータがＰバッファに書き込まれるようになる。そして、波形生成処理で生成する楽音波形サンプルの時刻がＰバッファに格納された音源パラメータと組とされているデュレーションの時刻に達したときに、Ｐバッファから音源レジスタに当該音源パラメータが送られ、音源パラメータに基づいて楽音波形生成処理が音源で実行される。この結果、生成処理Ｃでは、時刻ｔｎ＋１から始まるフレームの途中で、ＭＩＤＩイベントＭ４に対応して変化をする楽音波形サンプルが生成され、再生デバイスに再生予約される。
【００２７】
ところで、従来の楽音生成方法ではＭＩＤＩイベントが入力されると、リアルタイムで音源ドライバ処理が実行されるため、ＭＩＤＩイベントが集中して入力された際に音源ドライバ処理の負荷が急激に増加するようになる。この様子を図３（ｂ）に示すが、ＭＩＤＩイベントＭ１，Ｍ２，Ｍ３が集中して入力されたときは、急激に負荷が増加することが破線で示されている音源ドライバ処理量Ｊｄ’１となる。また、ＭＩＤＩイベントＭ４が入力されたときは、瞬間的に負荷が増加することが破線で示されている音源ドライバ処理量Ｊｄ’２となる。
このように、従来では音源ドライバの処理量が急激に増大するために、音源に割り当てられる処理量が減少し発音数に影響を与えるが、本発明の楽音生成方法では、音源ドライバ処理は分散して実行されるため、その音源ドライバ処理量は、図３（ｂ）に示すように少量づつ分散された処理量Ｊｄ１から処理量Ｊｄ６となる。
【００２８】
このように本発明の楽音生成方法において、ＭＩＤＩイベントＭ１，Ｍ２，Ｍ３が集中して入力されたときは、図３（ｂ）に示す処理量Ｊｄ１から処理量Ｊｄ４の少量づつ分散された音源ドライバ処理量となり、音源ドライバ処理量が急激に増加しないことからイベントが集中して入力されても、音源処理には十分な処理量が割り当てられ、発音数に影響を与えないことが理解される。また、ＭＩＤＩイベントＭ４が入力されたときは、図３（ｂ）に示す処理量Ｊｄ５、Ｊｄ６に少量づつ分散された音源ドライバ処理量となり、音源ドライバ処理量は急激に増加せず発音数に影響を与えない。
なお、音源で実行される波形生成の処理量Ｊｗは、発音数に応じて変動するが、音の持続性から急激に変動することはなく、その処理量は大きいが図３（ｂ）に示すように緩やかに変動するようになる。
【００２９】
次に、本発明の楽音生成方法が自動演奏のアプリケーションソフト（音楽ソフト）として、図１に示す処理装置で実行される場合のフローチャートを図４に示す。
音楽ソフト処理が起動されると、まず、ステップＳ１において各種レジスタのクリアや、表示器８に表示する画面の準備処理などの初期設定が行われる。ついで、ステップＳ２において起動要因が存在するか否かのチェックが行われる。起動要因としては、（１）再生中の曲データのイベントタイミングとなったこと、（２）ＭＩＤＩイベントが入力されたタイミングであること、（３）ＣＰＵ１の能力に余裕ができたこと（空き時間）が検出された、あるいは、一定期間、例えば１フレーム分の時間の経過がソフトウェアタイマにより検出されたこと、（４）１フレームが終了したタイミングであること、（５）曲データの再生ボタンのダブルクリック、パート音量制御操作のされたタイミングであること、（６）終了ボタンがダブルクリックされたタイミングであることの６通りの要因が存在している。
なお、起動要因（３）において、「空き時間の検出」の方法を採用すれば、ＣＰＵ１の負荷が重くないときに音源ドライバ処理を分散して実行することができる。また、「一定期間の経過検出」の方法を採用すれば、音源ドライバ処理を一定期間を単位として分散することができる。該一定期間の長さをパラメータで変化すれば、処理の分散の程度を制御することができる。
【００３０】
そこで、ステップＳ２において前記６通りのうちの１つでも起動要因があるか否かがステップＳ３で判定され、起動要因が発生していることが検出されたときにはステップＳ４に進み、起動要因が１つも検出されないときにはステップＳ２に戻って、起動要因の発生を待つようになる。
ステップＳ４では、前記起動要因（１）が検出されたときに、ステップＳ５にて自動演奏処理が実行されて、ステップＳ２に戻る。この自動演奏処理では、ＭＩＤＩファイルから読み出された曲データに応じて楽譜通りのタイミングでＭＩＤＩのフォームのイベントを発生する処理が行われる。なお、起動要因（１）に応じて発生したＭＩＤＩフォームのイベントも、入力イベントとして起動要因（２）の要因となる。
【００３１】
また、前記要因（２）が検出されたときは、ステップＳ４からステップＳ６に進みＭＩＤＩ入力処理が行われ、ステップＳ２に戻る。このＭＩＤＩ入力処理のフローチャートを図５に示すが、ＭＩＤＩ入力処理が起動されるとステップＳ２１にて発生されてＭＩＤＩイベントが受け取られる。ついで、ステップＳ２２にて受け取ったＭＩＤＩイベントを、受信時刻と共にＭバッファに書き込む処理が行われる。これにより、入力されたＭＩＤＩイベントは順次Ｍバッファに書き込まれていくようになる。
さらに、起動要因（３）が検出されたときには、ステップＳ４からステップＳ７に進み音源ドライバ処理１が実行され、ステップＳ２に戻る。この音源ドライバ処理１のフローチャートを図６に示すが、音源ドライバ処理１が起動されると、ステップＳ３１にてＭバッファ内に音源ドライバ処理が終了していない未完のイベントがあるか否かが判定される。ここで、音源ドライバ処理が未完のイベントが検出されると、ステップＳ３２に分岐して所定演算量の部分的な音源ドライバ処理（図３（ｂ）音源ドライバ処理量Ｊｄ１〜Ｊｄ６参照）が行われる。また、未完のイベントが検出されない場合は、音源ドライバ処理１では何も行われない。
【００３２】
この際の未完のイベントの検出は、前記図２（ｃ）に示すＭバッファ内の格納データ数が１以上であることを検出すればよい。すなわち、格納データ数が書かかれている部分をアクセスすることにより未完のイベントの有無を検出することができ、未完のイベントがあるときは、その読出ポインタ位置からデータを読み出して音源ドライバ処理を施せばよい。なお、格納データ数は音源ドライバ処理が終了していない未完のデータ数であり、このデータ数は書込ポインタと読出ポインタとの間のデータ数に相当し、イベントの音源ドライバ処理が終了する毎に読み出しポインタは次のイベントのデュレーションのアドレス位置に移動されて、データ数は「１」だけデクリメントされる。
【００３３】
次に、ステップＳ３２にて行われる音源ドライバ処理の一例としてイベントがノートオンの際に行われる音源ドライバ処理（ノートオン）のフローチャートを図７に示す。
音源ドライバ処理（ノートオン）が起動されると、ステップＳ４１にて発音開始の準備を行うためにイベント中に含まれているパートナンバ情報、ノートコード情報、および、ベロシティ情報を受け取る。ついで、ステップＳ４２にて発音すべきチャンネルの発音割当が後着優先で行われる。この際、分散された音源ドライバ処理が先行されて行われるため、音源ドライバ処理は終了しているが、未だ発音されていない発音チャンネルが存在していることがある。このため、空きチャンネルがないときには、最も早く入力されたノートオンイベントに割り当てられているチャンネルをトランケート処理するようにする。ただし、ベース音の音色選択データが設定されているパートについては後着優先処理の対象とせず最後まで発音させるのが好適である。
【００３４】
ついで、ステップＳ４３にて指定パートの音色に従って、音源パラメータを発生すると共に、発生された音源パラメータをＰバッファに書き込む処理が行われる。
なお、図７に示す例ではステップＳ４２及びステップＳ４３の処理を、１回の音源ドライバ処理（ノートオン）で実行するようにしているが、１回の音源ドライバ処理（ノートオン）において、ステップＳ４２の処理あるいはステップＳ４３の処理のいずれかの処理を行うようにして、２回の音源ドライバ処理（ノートオン）で２つの処理を行うようにしてもよい。また、ステップＳ４３において発生する全音源パラメータの１／ｎづつを、１回毎の音源ドライバ処理（ノートオン）において発生するようにしてもよい。
【００３５】
図４に示すフローチャートに戻り、前記起動要因（４）が検出されたときは、ステップＳ４からステップＳ８に進み楽音波形サンプルを生成する音源エンジン処理が行われステップＳ２に戻る。この音源エンジン処理のフローチャートを図８（ａ）に示すが、各フレームの開始時に音源エンジン処理が起動され、ステップＳ５１にて音源パラメータ再生が行われ、発音タイミングが到来した音源パラメータが、Ｐバッファから音源レジスタに送られる。ついで、ステップＳ５２にて、波形生成すべき楽音波形のフレーム（現フレーム）の時刻範囲に関し、Ｍバッファに格納されているイベントの音源ドライバ処理が未完か否かが判定される。これは、音源ドライバ処理が分散して行われるため、発音タイミングに達しているにもかかわらず、音源ドライバ処理が終了しておらず波形生成のためのすべての音源パラメータが揃っていないことを検出するために行われる。
【００３６】
ここで、当該イベントに対する音源ドライバ処理が未完と検出された場合は、ステップＳ５３に分岐して前記時刻範囲の未完のイベントに対応する音源パラメータを発生するための音源ドライバ処理２が行われ、発生された音源パラメータは音源レジスタに送られる。これにより、楽音波形を生成するためのすべての音源パラメータが用意されたことになる。また、音源ドライバ処理が未完のイベントはないと検出されたときは、ステップＳ５３の処理はスキップされる。そして、ステップＳ５４にて音源レジスタに格納されている音源パラメータに基づいて、発音中とされているチャンネル毎の楽音波形サンプルが所定サンプル数生成されて、それらの混合した１フレーム分の楽音波形サンプルが出力バッファに格納される。ついで、ステップＳ５５にて出力バッファに格納された各チャンネルの楽音波形サンプルが足し込まれた楽音波形サンプルに、エフェクト処理が施されて再度出力バッファに格納される。そして、ステップＳ５６にて出力バッファの楽音波形サンプルが再生デバイスに再生予約される。
これにより、次フレームにおいてサンプリング周期毎に出力バッファから１サンプルづつ読み出されて、ＤＡＣ等の再生デバイスによりアナログの楽音信号に変換されて発音されるようになる。
【００３７】
図４に示すフローチャートに戻り、前記起動要因（５）が検出されたときは、ステップＳ４からステップＳ９に進みその他の処理が行われステップＳ２に戻る。その他の処理としては、曲データの再生ボタンがダブルクリックされて再生が指示されたときに行われる再生処理、あるいは、パート別の音量を設定する操作子が操作されてパート別音量設定が行われたとき行われるパート音量制御処理等がある。再生処理は、曲データの再生ボタンがダブルクリックされて再生が指示されたときに起動され、指定された曲データをハードディスク６やリムーバブルディスク７等に記憶されているＭＩＤＩファイルにアクセスする処理等の、再生にかかる処理が行われ、前記ステップＳ５に関して説明された自動演奏がスタートされる。また、パート別の音量を設定する操作子が操作された時は、図８（ｂ）に示すフローチャートのパート音量制御処理が起動されて、パート別の音量制御処理が実行される。
【００３８】
図８（ｂ）に示すフローチャートにおいて、パート音量制御処理が起動されると、ステップＳ６１にて音量操作されたパートのパートナンバと、そのパートに設定された音量データを受け取る。ついで、ステップＳ６２にて音量操作された指定パートの音量の設定データが、ユーザが操作した操作子の操作量に応じて書き換えられる。この設定データは、前記図２（ａ）に示すＲＡＭ３のパート設定データエリアに格納されている。続いて、ステップＳ６３にて指定パートの発音中あるいは待機中のチャンネルがあるか否かが判定される。ここで、発音中のチャンネル、あるいは、まだＰバッファに音源パラメータが格納されている待機中のチャンネルが検出されたときは、ステップＳ６４に進む。
【００３９】
このステップＳ６４にて、発音中のチャンネルが検出されたときは、音源レジスタ内の検出されたチャンネルに対応する音量データが操作子の操作量に応じて書き換えられる。また、待機中のチャンネルが検出されたときには、Ｐバッファ内の検出されたチャンネルに対応する音量データが操作子の操作量に応じて書き換えられる。なお、指定されたパートの発音中あるいは待機中のチャンネルが検出されないときは、ステップＳ６４の処理はスキップされる。
なお、図３（ａ）に示す時間Δｔが１ｓｅｃ以内に設定されているときは、待機中のチャンネルの音量データの書き換えを行わず、Δｔが１ｓｅｃを越えて設定されているときだけ音量データの書き換えを行うようにしてもよい。その場合、新たに設定された音量データは、その後に発生するＭＩＤＩイベントのみに対して作用する。
このように、音源パラメータを発音タイミングより先行して分散生成するようにしても、楽音波形は発音タイミングとなるまで生成しないためリアルタイムでパート別の音量制御を行うことができる。
【００４０】
図４に示すフローチャートに戻って起動要因（６）が検出されたときは、ステップＳ４からステップＳ１０に進み、音源ソフト処理を終了させるための関連する画面の表示を消去する等の所定の終了処理が行われ、音楽ソフト処理が終了される。
なお、前記起動要因において、起動要因（１）および（２）の優先度が一番高く、ついで起動要因（４）の優先度とされ、ついで起動要因（５）の優先度が高く、最も優先度の低い起動要因は起動要因（３）および（６）とされる。
【００４１】
以上の説明では、ＭバッファはＲＡＭ３に設定されていたが、必ずしもＲＡＭ３に設定することなく、すでにハードディスク６やリムーバブルディスク７に記憶されている再生中の曲データ上の、再生位置の少し先の領域をＭバッファと見なすようにしてもよい。また、Ｐバッファに格納されている音源パラメータは、組とされたデュレーションの時刻に達したときに音源レジスタに転送されたが、デュレーションの時刻に達したときに音源がＰバッファ上の音源パラメータに基づいて楽音波形サンプルを生成することにより、Ｐバッファを音源レジスタとして使用するようにしてもよい。
また、図３に示す「制御遅れ時間Δｔ」は、時間フレーム単位の遅れではなく「ａフレーム（ａは０を含む正の整数）と３分の２」等の遅れでもよい。
さらに、以上の説明では楽音データはＭＩＤＩフォームで表されるとしたが、これに限らず楽音の発生／停止、音色、音量等を指示することのできるデータであればいかなるデータで楽音データを表わすようにしてもよい。
【００４２】
さらに、本発明においては、音源エンジンを起動する楽音生成タイミングとして起動要因（４）１フレーム毎の例が示されているが、１フレーム毎に限ることはなく２フレームに１回とか１フレームに３回とかとしてもよい。さらにまた、音源エンジンが１回起動される毎に生成する楽音波形データの量も、１フレーム分に限ることはない。
さらにまた、本発明においては、音源エンジンが起動されたとき、まずステップＳ５２で音源パラメータの生成が完了しているか否か判定して生成できていない音源パラメータを生成するようにしていたが、この処理を省略するようにしてもよい。その場合、該起動の時点で生成されていた音源パラメータだけが楽音生成に使用され、未生成の音源パラメータは無視される。音源パラメータが分散生成できないのは全体として処理が重くなっている場合であり、この省略により処理の削減を図ることができる。
また、本発明の楽音生成方法を、Windows （米マイクロソフト社のパソコン用ＯＳ）やその他のオペレーティングシステムの動作する汎用コンピュータ上で、１つのアプリケーションプログラムとして、ゲームソフトやカラオケソフト等の他のアプリケーションプログラムと並列実行させてもよい。
【００４３】
【発明の効果】
本発明は以上のように構成されているので、受け取ったＭＩＤＩのフォームとされた楽音データをバッファに記憶しておき、音源ドライバがバッファに記憶された楽音データを非同期で分散処理することにより音源パラメータを発生することができるようにしている。従って、イベントが集中して発生しても、音源ドライバの処理は分散して実行されるため、ＣＰＵ負荷が急激に増加することがなく、一時的な処理の集中による発音数の減少を防止することができる。
特に、ソフトウェア音源における楽音波形の生成には安定した演算能力を必要としているが、音源ドライバにおける処理は、イベント単位で瞬間的に計算パワーを必要とするだけで長時間でその負荷を平均すると数パーセント程度であるため、音源ドライバ処理を分散して実行する効果は非常に大きなものとなる。
また、音源ドライバまでの処理を先行して実行し、波形生成は発音タイミングになったときに実行するようにしているので、生成する楽音に対し、パート別の音量制御やパン制御等の処理をリアルタイムで行うことができる。
【図面の簡単な説明】
【図１】  本発明の楽音生成方法が実行される処理装置の構成例を示すブロック図である。
【図２】  本発明のＲＡＭ上に設定された各種バッファエリアを示す図である。
【図３】  本発明の楽音生成方法の各処理を行うタイミングを示すタイミングチャート、および、本発明と従来の音源ドライバ処理量と波形生成処理量の変動を示す図である。
【図４】  本発明の楽音生成方法における音楽ソフト処理のフローチャートである。
【図５】  本発明の楽音生成方法におけるＭＩＤＩ入力処理のフローチャートである。
【図６】  本発明の楽音生成方法における音源ドライバ処理１のフローチャートである。
【図７】  本発明の楽音生成方法における音源ドライバ処理（ノートオン）のフローチャートである。
【図８】  本発明の楽音生成方法における音源エンジン処理、および、パート音量制御処理のフローチャートである。
【図９】  従来の楽音生成装置におけるタイミングチャートを示す図である。
【符号の説明】
１  ＣＰＵ、２  ＲＯＭ、３  ＲＡＭ、４  タイマ、５  ＭＩＤＩインターフェース、６  ハードディスク、７  リムーバブルディスク、８  表示器、９  キーボード＆マウス、１０  音源、１１  ＣＰＵバス
【図１】
0003637577.tif 000002
【図２】
0003637577.tif 000003
【図３】
0003637577.tif 000004
【図４】
0003637577.tif 000005
【図５】
0003637577.tif 000006
【図６】
0003637577.tif 000007
【図７】
0003637577.tif 000008
【図８】
0003637577.tif 000009
【図９】
0003637577.tif 000010