JP4096751B2 - 楽音発生装置及び楽音発生処理のプログラム - Google Patents
楽音発生装置及び楽音発生処理のプログラム Download PDFInfo
- Publication number
- JP4096751B2 JP4096751B2 JP2003036679A JP2003036679A JP4096751B2 JP 4096751 B2 JP4096751 B2 JP 4096751B2 JP 2003036679 A JP2003036679 A JP 2003036679A JP 2003036679 A JP2003036679 A JP 2003036679A JP 4096751 B2 JP4096751 B2 JP 4096751B2
- Authority
- JP
- Japan
- Prior art keywords
- task
- waveform
- generation
- musical sound
- tasks
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Electrophonic Musical Instruments (AREA)
Description
【発明の属する技術分野】
本発明は、楽音発生装置及び楽音発生処理のプログラムに関する。
【0002】
【従来の技術】
従来の楽音発生装置の中には、ハードウェアによって楽音を生成するハードウェア音源の代わりに、コンピュータのオペレーションシステム(OS)上で動作するソフトウェアによって楽音を生成するソフトウェア音源を用いたものがある。ソフトウェア音源は、楽音発生処理を実行するアプリケーションプログラム(以下、「楽音発生処理のプログラム」という)をコンピュータのハードディスク等にインストールして、CPU等の演算処理装置がその楽音発生処理のプログラムを実行することにより、鍵盤演奏による押鍵情報、シーケンス情報、又はMIDI情報等からなる楽音イベントのデータが入力された場合に、その楽音イベントに応じて簡単に楽音を発生できるので、ハードウェア音源よりも安価に楽音発生装置を実現できるという利点がある。
【0003】
従来の具体的な楽音発生装置における楽音発生方法は、(1)アプリケーションプログラムから演奏情報が出力されたときに発生する第1の割込(ソフトウェア割込)に応じて起動され、その演奏情報に対応した発音制御情報を生成する第1のステップ、(2)バッファに記憶されている波形サンプル数の減少を検出したときに発生される第2の割込(ハードウェア割込)により起動され、(第1のステップによって生成された)発音制御情報に基づいて複数の波形サンプルを一括して生成し、その生成された波形サンプルをバッファに記憶する第2のステップ、及び、(3)バッファに記憶された波形サンプルを各サンプリング周期毎に1サンプルずつ読み出してデジタルアナログ変換器に順次出力する第3のステップを含む構成になっている。また、第1のステップ及び第2のステップは、所定のオペレーティングシステムにおける仮想デバイスドライバであり、さらに、第2の割込は、デジタルアナログ変換器に送出された波形サンプル数が所定数に達したことを検出したときに発生される構成になっている。
【0004】
すなわち、楽音情報処理や波形生成処理等からなる上記第1〜第3のステップを含むような楽音発生処理のプログラムをコンピュータのCPUが実行する構成になっている。ところが、楽音発生処理のプログラムを実行するためにCPUの動作を占有することはできない。したがって、CPUが楽音発生処理のプログラムを実行するために割り当てられた期間内に、まとめて楽音情報処理や波形生成処理を行うために、一定レートのデータストリームが必要なデジタルアナログ変換器の前段に、リングバッファやダブルバッファ等からなる記憶手段であるFIFO(先入れ先出し)バッファが配置されている(例えば、特許文献1参照)。
【0005】
【特許文献1】
特許第2904088号公報(段落番号「0011」「0012」、図4〜図7)
【0006】
【発明が解決しようとする課題】
しかしながら、上記従来の楽音発生装置、及びその装置において実行される楽音発生処理のプログラムによる楽音発生方法においては、FIFOバッファの容量が大きいと、コストアップの要因になるばかりでなく、楽音イベントのデータがコンピュータに入力されてから、その楽音イベントに対する楽音波形が生成されて出力されるまでに時間がかかり過ぎて、入力される楽音イベントに対する楽音の出力応答が遅くなることになる。このため、鍵盤演奏等のように、リアルタイムで楽音イベントが入力される場合には、演奏よりも遅れて楽音が発生されるので、演奏者ばかりでなく演奏を聴いている人にも違和感を与えてしまう。
【0007】
一方、出力応答を速くするためにFIFOバッファの容量を小さくした場合には、CPUによる楽音波形生成の演算負荷が大きくなったときに、FIFOバッファへの書込処理が遅くなり、FIFOバッファが空(新しい楽音波形のデータが書き込まれない状態)になって、読み出すべき楽音波形データがなくなる状態、すなわちバッファ・アンダー・フローの状態が発生してしまう。この場合には、ノイズを発生したり、以前に読み出した古い楽音波形データを出力することになるので、発生する楽音の音質が著しく劣化してしまう。
【0008】
例えば、上記特許文献1においては、段落番号「0056」、「0057」及び図7の(b)に記載されているように、MIDI演奏入力に対応する波形生成演算が所定時間である1フレーム内に終了しない場合がある。例えば、マルチメディアソフト等のリアルタイム性を要求される処理を並行して実行している場合には、そのためにCPUパワーが割かれてソフトウェア音源を実行するための時間が割り当てられないことがある。この場合には、演算の終了しなかったフレーム時間については、波形生成をキャンセルしてDMA処理(再生処理)を中断することになる。
【0009】
また、この再生中断は、段落番号「0058」及び図8の(a)、並びに、「0059」及び図8の(b)に記載された第1及び第2の変形例においても解消されていない。第1の変形例においては、1フレームの再生が終了するタイミングよりもTj時間だけハードウェア割込を早くしているが、波形生成演算が1フレーム内に終了しない場合には、波形生成をキャンセルして再生処理を中断することは避けられない。また、第2の変形例においては、ソフトウェア割込の優先順位をハードウェア割込よりも高い優先順位にしているが、その分だけ波形生成演算が遅れてしまうので、この場合も波形生成をキャンセルして再生処理を中断することは避けられない。したがって、従来の楽音発生装置においては、このような再生中断に起因するノイズの発生や以前に読み出した古い楽音波形データを出力することを回避することは困難であった。
【0010】
本発明の課題は、デジタルアナログ変換器の前段に配置する記憶手段であるバッファの容量を小さくした場合でも、ノイズの発生や古い楽音波形データを出力することを回避して、高い音質の楽音を発生するような楽音発生装置及び楽音発生処理のプログラムを提供することである。
【0011】
【課題を解決するための手段】
請求項1に記載の楽音発生装置は、楽音波形データを生成する処理を行なう波形生成タスクおよび他のタスクからなる所定数のタスクを各タスク単位で繰り返し実行する際に予め規定された制限時間内に実行可能な数のタスクを実行するタスク実行手段と、前記波形生成タスクによって生成された楽音波形データを書込アドレスで指定される記憶手段のエリアに書き込む波形書込手段と、読出アドレスで指定される前記記憶手段のエリアから楽音波形データを読み出す波形読出手段と、前記読出アドレスから前記書込アドレスまでのアドレス差が所定範囲より小さい場合には前記波形生成タスクを前記他のタスクよりも優先的に実行する指令を前記タスク実行手段に与える指令発生手段と、を備えたことを特徴とする。
【0012】
この場合において、請求項2に記載したように、指令発生手段は、アドレス差が所定範囲より大きい場合には他のタスクを波形生成タスクよりも優先的に実行する指令(実施形態においては、図10のステップF7に相当する)をタスク実行手段に与えるような構成にしてもよい。
【0013】
また、請求項3に記載したように、指令発生手段は、アドレス差が所定範囲内である場合には波形生成タスクと他のタスクとを優劣なく平等に実行する指令(実施形態においては、図10のステップF6に相当する)をタスク実行手段に与えるような構成にしてもよい。
【0014】
また、請求項4に記載したように、指令発生手段は、優先的に実行するタスクの優先度を高く設定する指令(実施形態においては、図10のステップF6、F7、およびF8に相当する)をタスク実行手段に与えるような構成にしてもよい。
【0015】
また、請求項5に記載したように、指令発生手段は、優先的に実行するタスク以外のタスクの優先度を低く設定する指令(実施形態の変形例に相当する)をタスク実行手段に与えるような構成にしてもよい。
【0016】
請求項6に記載の楽音発生処理のプログラムは、コンピュータに、楽音波形データを生成する処理を行なう波形生成タスクおよび他のタスクからなる所定数のタスクを各タスク単位で繰り返し実行する際に予め規定された制限時間内に実行可能な数のタスクを実行するタスク実行ステップと、前記波形生成タスクによって生成された楽音波形データを書込アドレスで指定される記憶手段のエリアに書き込む波形書込ステップと、読出アドレスで指定される前記記憶手段のエリアから楽音波形データを読み出す波形読出ステップと、前記読出アドレスから前記書込アドレスまでのアドレス差が所定範囲より小さい場合には前記波形生成タスクを前記他のタスクよりも優先的に実行する指令を前記タスク実行手段に与える指令発生ステップと、を実行させることを特徴とする。
【0017】
【発明の実施の形態】
以下、本発明による楽音発生装置の実施形態について、図を参照して説明する。
図1は、ソフトウェア音源の機能を具備した楽音発生装置の構成を示すブロック図である。この図において、CPU1は、システムバス2を介してROM3、RAM4、操作部5、表示部6、CODEC7に接続され、これら各部との間においてデータやコマンドを授受してこの装置全体を制御する。CPU1はまた、外部の鍵盤装置やシーケンサ等から入力される楽音イベントのデータ(以下、「イベントデータ」という)であるMIDIデータを処理する。
【0018】
ROM3は、楽音発生処理のプログラムや初期データ等を記憶している。RAM4は、半導体メモリやハードディスク等の記憶手段で構成れたCPU1のワークエリアであり、楽音発生処理のプログラムその他のアプリケーションソフトを起動するためのオペレーションシステム(OS)のソフトウェアを記憶している。また、RAM4には、楽音発生処理のプログラムの実行に必要な各種のレジスタ、フラグ、ポインタのエリア、及び、楽音波形データを一時的にストアするFIFOバッファとしてのリングバッファのエリア、及び、ソフトウェア音源で楽音波形データを生成するための波形テーブルが設けられている。
【0019】
操作部5は、キーボードやマウス等のポインティングデバイスで構成され、操作に応じてデータやコマンドをCPU1に入力する。表示部6は、楽音発生処理に関連する各種の情報やこの装置の状態を示すその他の情報を表示する。CODEC7は、デジタルアナログ変換器、DMAC(ダイレクト・メモリ・アクセス・コントローラ)、サンプリングパルス発生器等(図示せず)で構成され、デジタルの楽音波形データをアナログの楽音信号に変換して、外部のサウンドシステムに出力する。
【0020】
図2は、楽音発生処理のプログラムを実行するのために、RAM4に設定されるタスク群および各タスクに対する優先度を設定するプライオリティ(PRIORITY)データ群を示す図である。この図に示すように、タスク群には、楽音波形データを生成する波形生成タスク(0)、および、その他のタスクであるタスク(1)ないしタスク(N)からなる複数のタスクで構成されている。また、プライオリティデータ群は、各タスク(0)ないしタスク(N)にたいする優先度であるプライオリティ(0)ないしプライオリティ(N)で構成されている。プライオリティデータ群に設定される優先度には、高い優先度を表す「High」、各タスクに優先度がない通常の状態を表す「Normal」、低い優先度を表す「Low」がある。
【0021】
その他のタスクとしては、例えば、操作部5のキーボードからの演奏データや外部からのMIDIデータを入力するデータ入力処理、表示部6に対して文字や図形情報をドット(画素)に分解して1画面のビットマップデータを生成する画像データ生成処理、発生する楽音に対してリバーブなどのエフェクトを付加するエフェクト処理などがある。
【0022】
なお、CPU1がタスク(0)ないしタスク(N)を各タスク単位で連続して実行する際には制限時間があり、CPU1を構成するデバイスの処理速度に応じて、制限時間の所定値が規定されている。タスク処理ルーチンの開始からカウントアップされる時間が所定値に達したときは、次のタスクを実行することはできず、改めてタスク処理ルーチンを開始することになる。
【0023】
次に、この楽音発生装置の動作について、図3〜図10に示すCPU1のフローチャートおよび図11に示すリングバッファにおける書込アドレスと読出アドレスとの関係を示す図に基づいて詳細に説明する。
図3ないし図5は、タスク処理ルーチンのメインフローチャートである。所定のイニシャライズ処理(ステップA1)においては、レジスタやフラグをクリアするとともに、プライオリティ(0)ないしプライオリティ(N)を「Normal」に設定する。次に、レジスタTIMERに「0」をストアしてクリアする(ステップA2)。TIMERのカウント値は、一定時間ごとのタイマインタラプトに応じてカウントアップ(インクリメント)される。
【0024】
次に、タスク群およびプライオリティデータ群を指定するポインタnを「0」にセットして(ステップA3)、nの値をインクリメントしながら、各タスクの優先度を判定する。すなわち、タスク(n)のプライオリティ(n)が「High」であるか否かを判別し(ステップA4)、「High」である場合には、タスク(n)処理を実行する(ステップA5)。そして、TIMERのカウント値が所定値に達したか否かを判別する(ステップA6)。所定値に達していない場合には、nの値をインクリメントして(ステップA7)、次のタスクを指定する。このとき、インクリメントしたnの値が最大タスク数を超えたか否かを判別する(ステップA8)。最大タスク数を超えていない場合には、ステップA4からの処理を繰り返す。
【0025】
ステップA6において、TIMARのカウント値が所定値に達したときは、ステップA2に移行して、TIMARのカウント値を「0」にリセットして、ステップA3以後の処理を繰り返す。すなわち、プライオリティが「High」のタスクをすべて処理する前に、TIMERのカウント値が所定値に達したときは、あらためてタスク処理ルーチンの最初から処理を繰り返す。
【0026】
ステップA8において、nの値が最大タスク数を超えたとき、すなわち、プライオリティが「High」のタスクをすべて処理した後は、図4のフローにおいて、ポインタnを「0」にセットして(ステップA9)、nの値をインクリメントしながら、各タスクの優先度を判定する。すなわち、タスク(n)のプライオリティ(n)が「Normal」であるか否かを判別し(ステップA10)、「Normal」である場合には、タスク(n)処理を実行する(ステップA11)。そして、TIMERのカウント値が所定値に達したか否かを判別する(ステップA12)。所定値に達していない場合には、nの値をインクリメントして(ステップA13)、次のタスクを指定する。このとき、インクリメントしたnの値が最大タスク数を超えたか否かを判別する(ステップA14)。最大タスク数を超えていない場合には、ステップA10からの処理を繰り返す。
【0027】
ステップA12において、TIMARのカウント値が所定値に達したときは、図3のステップA2に移行して、TIMARのカウント値を「0」にリセットして、ステップA3以後の処理を繰り返す。すなわち、プライオリティが「Normal」のタスクをすべて処理する前に、TIMERのカウント値が所定値に達したときは、あらためてタスク処理ルーチンの最初から処理を繰り返す。
【0028】
ステップA14において、nの値が最大タスク数を超えたとき、すなわち、プライオリティが「Normal」のタスクをすべて処理した後は、図5のフローにおいて、ポインタnを「0」にセットして(ステップA15)、nの値をインクリメントしながら、各タスクの優先度を判定する。すなわち、タスク(n)のプライオリティ(n)が「Low」であるか否かを判別し(ステップA16)、「Low」である場合には、タスク(n)処理を実行する(ステップA17)。そして、TIMERのカウント値が所定値に達したか否かを判別する(ステップA18)。所定値に達していない場合には、nの値をインクリメントして(ステップA19)、次のタスクを指定する。このとき、インクリメントしたnの値が最大タスク数を超えたか否かを判別する(ステップA20)。最大タスク数を超えていない場合には、ステップA16からの処理を繰り返す。
【0029】
ステップA18において、TIMARのカウント値が所定値に達したときは、図3のステップA2に移行して、TIMARのカウント値を「0」にリセットして、ステップA3以後の処理を繰り返す。すなわち、プライオリティが「Low」のタスクをすべて処理する前に、TIMERのカウント値が所定値に達したときは、あらためてタスク処理ルーチンの最初から処理を繰り返す。
また、ステップA20において、nの値が最大タスク数を超えたとき、すなわち、プライオリティが「Low」のタスクをすべて処理した後は、図3のステップA2に移行して、TIMARのカウント値を「0」にリセットして、ステップA3以後の処理を繰り返す。
【0030】
図6は、図3におけるステップA5、図4におけるステップA11、又は、図5におけるステップA17のタスク処理(n)のうち、タスク処理(0)すなわち楽音波形を生成する波形生成タスク処理のフローチャートである。
このフローでは、MIDIデータを入力する入力処理(ステップB1)、そのMIDIデータに応じて楽音波形データを生成する生成処理(ステップB2)、生成した楽音波形データをCODEC7に出力する出力処理(ステップB3)、RAM4のリングバッファをチェックするバッファチェック処理(ステップB4)を実行する。
【0031】
図7は、図6におけるステップB1の入力処理のフローである。
まず、MIDI入力があるか否かを判別し(ステップC1)、MIDI入力がなければこのフローを終了するが、MIDI入力があったときは、そのイベントデータの内容を判別する(ステップC2)。イベントデータがノートオンである場合には、発音チャンネルにアサインが可能であるかを示すフラグEnableが「1(アサイン可能)」であるか否かを判別する(ステップC3)。Enableが「0(アサイン不可)」である場合には、入力されたイベントデータを無視する。すなわち、発音チャンネルにノートオンの新たなイベントデータをアサインする処理を停止する。そして、メインフローに戻る。一方、Enableが「1」である場合には、発音チャンネルを指定するポインタCHに「0」をセットして(ステップC4)、CHの値をインクリメントしながら、イベントデータがアサイン可能な発音チャンネルを捜す。
【0032】
すなわち、CHで指定する発音フラグONF(CH)が「0(消音)」であるか否かを判別し(ステップC5)、このフラグが「1(発音)」である場合には、イベントデータをアサインできないので、次の発音チャンネルを指定するためにCHの値をインクリメントする(ステップC6)。そしてインクリメントしたCHの値が発音チャンネルの最大数より大きくなったか否かを判別する(ステップC7)。CHの値が最大数より大きい場合には、すべての発音チャンネルが発音中で空きチャンネルがないので、このフローを終了する。CHの値が最大数以下である場合には、ステップC5に移行して消音中の発音チャンネルを捜す。ステップC5において、発音フラグONF(CH)が「0」である場合には、そのフラグを「1」にセットして(ステップC8)、イベントデータのノートすなわち音高をレジスタNOTE(CH)にストアする(ステップC9)。そして、図6のフローに戻る。
【0033】
ステップC2において、イベントデータがノートオフである場合には、発音チャンネルを指定するポインタCHに「0」をセットして(ステップC10)、CHの値をインクリメントしながら、そのイベントデータについて発音中の発音チャンネルを捜す。
すなわち、CHで指定する発音フラグONF(CH)が「1(発音中)」であるか否かを判別する(ステップC11)。このフラグが「1」である場合には、ノートオフのイベントデータのノートがレジスタNOTE(CH)のノートと一致するか否かを判別する(ステップC12)。ONF(CH)が「0」である場合、又は、ノートオフのイベントデータのノートがNOTE(CH)のノートと異なる場合には、CHの値をインクリメントする(ステップC13)。そしてインクリメントしたCHの値が発音チャンネルの最大数より大きくなったか否かを判別する(ステップC14)。
【0034】
CHの値が最大数以下である場合には、ステップC14からステップC11に移行して対応する発音チャンネルを捜す。その発音チャンネルが見つかった場合、すなわち、ステップC12においてノートオフのイベントデータのノートがNOTE(CH)のノートと一致した場合には、その発音チャンネルのフラグONF(CH)を「0(消音)」にリセットして(ステップC15)、図6のフローに戻る。
ステップC2において、イベントデータがノートオン及びノートオフ以外のデータ、例えばプログラムチェンジのデータである場合には、その楽音イベントに対応するその他の処理を行う(ステップC16)。そして、図6のフローに戻る。
【0035】
図8は、図6におけるステップB2の生成処理のフローである。このフローでは、ノートオンのイベントデータのノート(音高)、音色及びベロシティ等に基づいて、所定のサンプリング周期毎にRAM4の波形テーブルからノートに対応する読出レートでデータを読み出して、音色及びベロシティ等に応じてアンプ処理及びフィルタ処理等を行って楽音波形データを生成する。
【0036】
まず、波形生成に用いる5個のレジスタW、WL、WR、WHL、WHRをクリアするために、それぞれに「0」をストアする(ステップD1)。Wは、生成した楽音波形データをストアするレジスタである。WL及びWRは、各発音チャンネルごとにパンデータ(左右分離比率データ)によって左チャンネル及び右チャンネルに分離した楽音波形データをストアするレジスタである。WHL及びWHRは、左チャンネル及び右チャンネルの各々において複数の発音チャンネルの楽音波形データを合成してストアするレジスタである。
【0037】
次に、発音チャンネルを指定するポインタCHに「0」をセットして(ステップD2)、CHの値をインクリメントしながら楽音波形データを生成する。すなわち、CHで指定した発音フラグONF(CH)が「1」であるか否かを判別する(ステップD3)。このフラグが「1」である場合には、その発音チャンネルにアサインされたイベントデータに基づいて波形生成を行う(ステップD4)。そして、生成した楽音波形データをレジスタWにストアする(ステップD5)。次に、Wの楽音波形データに左チャンネルのパンデータPANL(CH)の値を乗算してレジスタWLにストアする(ステップD6)。同様に、Wの楽音波形データに右チャンネルのパンデータPANR(CH)の値を乗算してレジスタWRにストアする(ステップD7)。
【0038】
次に、レジスタWHLにレジスタWLの楽音波形データを累算し(ステップD8)、レジスタWHRにレジスタWRの楽音波形データを累算する(ステップD9)。すなわち、各発音チャンネルの楽音波形データを合成するための累算を行う。この後、CHの値をインクリメントする(ステップD10)。このとき、インクリメントしたCHの値が発音チャンネルの最大数より大きいか否かを判別し(ステップD11)、CHの値が最大数以下である場合には、ステップD3に移行してONF(CH)の値を判別する。そして、CHの値が最大数に達するまで、ステップD3からステップD11までの処理を繰り返す。
【0039】
ステップD11においてCHの値が最大数より大きくなった場合、すなわち、ノートオンのイベントデータをアサインしたすべての発音チャンネルについて楽音波形データを生成し、レジスタWHL及びWHRに楽音波形データにおける累算が終了した場合には、レジスタWHLの楽音波形データにレジスタMaster Volumeの音量データを乗算し(ステップD12)、レジスタWHLの楽音波形データにMaster Volumeの音量データを乗算する(ステップD13)。そして、図6のフローに戻る。
【0040】
図9は、図6におけるステップB3の出力処理のフローである。このフローでは、生成して累算した楽音波形データをRAM4のリングバッファにストアし、サンプリング周期毎の出力タイミングに応じて、ストアした楽音波形データを出力する。リングバッファは、図11に示すように、最小値のアドレスから最大値のアドレスまでのエリアで構成され、このリングバッファ内において、循環的に図の矢印の方向に順次進行する書込アドレスAW及び読出アドレスARによって対応するエリアが指定される。すなわち、最大値のアドレスの次には最小値のアドレスに戻って、リング状にアドレスが進行する。
【0041】
図9のフローにおいて、まず、書込アドレスAWで指定されるリングバッファのエリアBUFFER(AW)に、レジスタWHL及びWHRの合成された楽音波形データをストアする(ステップE1)。そして、書込アドレスAWをインクリメントして(ステップE2)、次の書込エリアを指定する。このときAWが最大値よりも大きくなったか否かを判別し(ステップE3)、最大値より大きくなった場合はAWを最小値にする(ステップE4)。
【0042】
次に、サンプリング周期毎の出力タイミングになったか否かを判別する(ステップE5)。出力タイミングでない場合にはこのフローを終了するが、出力タイミングになったときは、読出アドレスARで指定されるリングバッファのエリアBUFFER(AR)より、楽音波形データを読み出してCODEC7に出力する(ステップE6)。そして、読出アドレスARをインクリメントして(ステップE7)、次の読出エリアを指定する。このときARが最大値よりも大きくなったか否かを判別し(ステップE8)、最大値より大きくなった場合はARを最小値にする(ステップE9)。そして、図6のフローに戻る。
【0043】
図10は、図6におけるステップB4のバッファチェック処理のフローである。このフローにおいては、まず、書込アドレスAWのアドレス位置が読出アドレスARのアドレス位置よりも大きいか否かを判別する(ステップF1)。書込アドレスAWが読出アドレスARよりも大きい場合には、書込アドレスAWから読出アドレスARを減算したアドレス差をレジスタM1にストアする(ステップF2)。
一方、読出アドレスARが書込アドレスAWよりも大きい場合には、書込アドレスAWと最大値のアドレスから読出アドレスARを減算した値とを加算した値をレジスタM1にストアする(ステップF3)。すなわち、リングバッファの書込アドレスAWが最大値のアドレスを過ぎて最小値のアドレスに戻った後には、書込アドレスAWのほうが読出アドレスARより先行していても、アドレス値は読出アドレスARのほうが大きいので、ステップF3のように、書込アドレスAWと最大値のアドレスから読出アドレスARを減算した値とを加算した値をレジスタM1にストアする。
ステップF2又はステップF3のいずれにおいても、先に進行する書込アドレスAWのアドレス位置に対して、後から進行する読出アドレスARのアドレス位置がどれだけ近いかを表すアドレス差がレジスタM1にストアされることになる。
【0044】
次に、レジスタM1にストアした値(以下、「M1」という)と第1の所定数のサンプリング周期値M2とを比較する(ステップF4)。例えば、M2は5サンプリング周期である。M1がM2よりも大きい場合には、新たなノートオンのイベントデータが入力された場合でも、読出アドレスARが書込アドレスAWに追いつくまでの間に、そのイベントデータの波形生成処理を完了することができる。この場合には、波形生成タスクを他のタスクよりも優先的に実行する必要はない。
【0045】
この場合には、さらに、M1と第2の所定数のサンプリング周期値M3とを比較する(ステップF5)。例えば、M3は10サンプリング周期である。M1がM3以下である場合には、他のタスクを波形生成タスクより優先的に実行する余裕はない。したがって、この場合には、波形生成タスクと他のタスクとを優劣なく平等に処理するために、プライオリティ(0)を「Normal」にセットする(ステップF6)。
これに対して、M1がM3よりも大きい場合には、新たなノートオンのイベントデータが入力された場合でも、読出アドレスARが書込アドレスAWに追いつくまでの間に、十分過ぎるな余裕で新たなイベントデータの波形生成タスクを完了することができる。この場合には、他のタスク(1)ないし(N)を波形生成タスクよりも優先的に処理しても差し支えない。したがって、プライオリティ(0)を「Low」にセットする(ステップF7)。
【0046】
ステップF4において、M1がM2以下である場合には、新たなノートオンのイベントデータが入力された場合には、読出アドレスARが書込アドレスAWに追いつくまでの間に、そのイベントデータの波形生成処理を完了できないおそれがある。この場合には、波形生成タスクを他のタスクよりも優先的に実行する必要がある。したがって、プライオリティ(0)を「High」にセットする(ステップF8)。
【0047】
この場合において、所定値の制限時間内に他のタスクであるタスク(1)ないしタスク(N)のすべてが実行できないことがある。すなわち、キーボードからの演奏データや外部からのMIDIデータのイベントデータを入力するデータ入力処理、表示すべき1画面のビットマップデータを生成する画像データ生成処理、リバーブなどのエフェクトを付加するエフェクト処理などのタスクが実行できないことがある。しかしながら、これらのタスクが犠牲になったとしても、ノイズの発生や古い楽音波形データを出力するという不具合を回避するほうが、楽音発生装置の機能としては重要である。
【0048】
例えば、イベントデータを入力できなかったり、表示された画像に多少のちらつきがあったり、リバーブが軽くなるような状態が一時的にあった場合でも、聴く人に特別に違和感を与えることは少ないが、ノイズが発生したり、同じ楽音が重なった場合には、その不具合が目立つので、聴く人に大きな違和感を与えてしまう。
【0049】
以上のように、上記実施形態の楽音発生装置によれば、CPU1は、楽音波形データを生成する処理を行なう波形生成タスク(0)およびタスク(1)ないしタスク(N)を各タスク単位で繰り返し実行する際に、予め規定された制限時間である所定値内に実行可能な数のタスクを実行する。また、波形生成タスクによって生成した楽音波形データを書込アドレスAWで指定されるRAM4のリングバッファのエリアに書き込み、読出アドレスARで指定されるリングバッファのエリアから楽音波形データを読み出す。この場合において、読出アドレスARから書込アドレスAWまでのアドレス差M1がM2より小さい場合には、所定値内において波形生成タスク(0)を他のタスク(1)ないしタスク(N)よりも優先的に実行するので、デジタルアナログ変換器であるCODEC7の前段に配置するRAM4のリングバッファの容量を小さくした場合でも、ノイズの発生や古い楽音波形データを出力することを回避して、高い音質の楽音を発生できる。
【0050】
この場合において、アドレス差M1がM3より大きい場合には、他のタスク(1)ないしタスク(N)を波形生成タスク(0)よりも優先的に実行するので、データ入力処理、画像データ生成処理、エフェクト処理などを円滑に行なうことにより、より高い音質の楽音を発生できる。
【0051】
また、アドレス差M1がM2からM3までの範囲内である場合には、波形生成タスク(0)と他のタスク(1)ないしタスク(N)とを優劣なく平等に実行するので、CPU1のデバイスの処理速度に適応した本来のプログラムの設計通りの高い音質の楽音を発生できる。
【0052】
なお、上記実施形態においては、優先的に実行する波形生成タスク(0)の優先度を他のタスク(1)ないし(N)よりも高く設定するように構成にしたが、実施形態の変形例として、優先的に実行する波形生成タスク(0)以外のタスク(1)ないし(N)の優先度を低く設定するように構成してもよい。
【0053】
なおまた、上記実施形態においては、楽音発生処理のプログラムをROM3に記憶する構成にしたが、例えば、フレキシブルディスク(FD)又はCD−ROMなどの外部記憶媒体に記憶されている楽音発生処理のプログラム、又は、インターネット等の通信網を介して接続されたサーバに記憶されている楽音発生処理のプログラムを、汎用のコンピュータシステムにおける書き換え可能なハードディスクやフラッシュメモリで構成されたメモリにインストールして、その楽音発生処理のプログラムをコンピュータによって実行するような構成にしてもよい。この場合には、プログラムの発明を実現できる。
【0054】
すなわち、その楽音発生処理のプログラムは、楽音波形データを生成する処理を行なう波形生成タスクおよび他のタスクからなる所定数のタスクを各タスク単位で繰り返し実行する際に、あらかじめ規定された制限時間内に実行可能な数のタスクを実行するコンピュータを用いて楽音を発生する楽音発生装置のプログラムであって、
波形生成タスクによって生成された楽音波形データを書込アドレスで指定される記憶手段のエリアに書き込む第1のステップと、読出アドレスで指定される記憶手段のエリアから楽音波形データを読み出す第2のステップと、読出アドレスから書込アドレスまでのアドレス差が所定範囲より小さい場合には制限時間内において波形生成タスクを他のタスクよりも優先的に実行するようにコンピュータに指令する第3のステップとを実行する。
したがって、デジタルアナログ変換器の前段に配置するリングバッファなどの記憶手段の容量を小さくした場合でも、ノイズの発生や古い楽音波形データを出力することを回避して、高い音質の楽音を発生できる。
【0055】
なおまた、上記実施形態においては、ソフトウェアによって楽音を発生させるソフトウェア音源の楽音発生装置を例に採って本発明を説明したが、本発明の適用範囲はソフトウェア音源に限定されるものではない。DSP(デジタル・シグナル・プロセッサ)等のようにハードウェア音源を用いた楽音発生装置においても、本発明を適用することは可能である。例えば、波形メモリに記憶されているPCM波形データを読み出すタスクを優先的に実行することにより、ノイズの発生や古い楽音波形データを出力することを回避して、高い音質の楽音を発生できる。
【0056】
【発明の効果】
本発明によれば、複数のタスクのうち楽音波形を生成する波形生成タスクを優先して実行するので、デジタルアナログ変換器の前段に配置する記憶手段であるバッファの容量を小さくした場合でも、ノイズの発生や古い楽音波形データを出力することを回避して、高い音質の楽音を発生できるという効果が得られる。
【図面の簡単な説明】
【図1】本発明の実施形態における楽音発生装置の構成を示すブロック図。
【図2】図1のRAMに設定されるタスク群および各タスクに対する優先度を設定するプライオリティデータ群を示す図。
【図3】図1のCPUによって実行されるタスク処理ルーチンのメインフローチャート。
【図4】図3に続くタスク処理ルーチンのメインフローチャート。
【図5】図4に続くタスク処理ルーチンのメインフローチャート。
【図6】図3ないし図5における波形生成のタスク処理のフローチャート。
【図7】図6のタスク処理における入力処理のフローチャート。
【図8】図6のタスク処理における生成処理のフローチャート。
【図9】図6のタスク処理における出力処理のフローチャート。
【図10】図6のタスク処理におけるバッファチェック処理のフローチャート。
【図11】図1のRAMのリングバッファにおける書込アドレスおよび読出アドレスの位置関係を示す図。
【符号の説明】
1 CPU
3 ROM
4 RAM
5 操作部
6 表示部
7 CODEC
Claims (6)
- 楽音波形データを生成する処理を行なう波形生成タスクおよび他のタスクからなる所定数のタスクを各タスク単位で繰り返し実行する際に予め規定された制限時間内に実行可能な数のタスクを実行するタスク実行手段と、
前記波形生成タスクによって生成された楽音波形データを書込アドレスで指定される記憶手段のエリアに書き込む波形書込手段と、
読出アドレスで指定される前記記憶手段のエリアから楽音波形データを読み出す波形読出手段と、
前記読出アドレスから前記書込アドレスまでのアドレス差が所定範囲より小さい場合には前記波形生成タスクを前記他のタスクよりも優先的に実行する指令を前記タスク実行手段に与える指令発生手段と、
を備えた楽音発生装置。 - 前記指令発生手段は、前記アドレス差が前記所定範囲より大きい場合には前記他のタスクを前記波形生成タスクよりも優先的に実行する指令を前記タスク実行手段に与えることを特徴とする請求項1記載の楽音発生装置。
- 前記指令発生手段は、前記アドレス差が前記所定範囲内である場合には前記波形生成タスクと前記他のタスクとを優劣なく平等に実行する指令を前記タスク実行手段に与えることを特徴とする請求項1記載の楽音発生装置。
- 前記指令発生手段は、優先的に実行するタスクの優先度を高く設定する指令を前記タスク実行手段に与えることを特徴とする請求項1ないし3のいずれか1項記載の楽音発生装置。
- 前記指令発生手段は、優先的に実行するタスク以外のタスクの優先度を低く設定する指令を前記タスク実行手段に与えることを特徴とする請求項1ないし3のいずれか1項記載の楽音発生装置。
- コンピュータに、
楽音波形データを生成する処理を行なう波形生成タスクおよび他のタスクからなる所定数のタスクを各タスク単位で繰り返し実行する際に予め規定された制限時間内に実行可能な数のタスクを実行するタスク実行ステップと、
前記波形生成タスクによって生成された楽音波形データを書込アドレスで指定される記憶手段のエリアに書き込む波形書込ステップと、
読出アドレスで指定される前記記憶手段のエリアから楽音波形データを読み出す波形読出ステップと、
前記読出アドレスから前記書込アドレスまでのアドレス差が所定範囲より小さい場合には前記波形生成タスクを前記他のタスクよりも優先的に実行する指令を前記タスク実行手段に与える指令発生ステップと、
を実行させることを特徴とする楽音発生処理のプログラム。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2003036679A JP4096751B2 (ja) | 2003-02-14 | 2003-02-14 | 楽音発生装置及び楽音発生処理のプログラム |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP2003036679A JP4096751B2 (ja) | 2003-02-14 | 2003-02-14 | 楽音発生装置及び楽音発生処理のプログラム |
Publications (2)
| Publication Number | Publication Date |
|---|---|
| JP2004246145A JP2004246145A (ja) | 2004-09-02 |
| JP4096751B2 true JP4096751B2 (ja) | 2008-06-04 |
Family
ID=33021700
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP2003036679A Expired - Fee Related JP4096751B2 (ja) | 2003-02-14 | 2003-02-14 | 楽音発生装置及び楽音発生処理のプログラム |
Country Status (1)
| Country | Link |
|---|---|
| JP (1) | JP4096751B2 (ja) |
Families Citing this family (2)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JP6904141B2 (ja) | 2017-07-28 | 2021-07-14 | カシオ計算機株式会社 | 楽音発生装置、方法、プログラム、及び電子楽器 |
| JP6922614B2 (ja) * | 2017-09-27 | 2021-08-18 | カシオ計算機株式会社 | 電子楽器、楽音発生方法、及びプログラム |
-
2003
- 2003-02-14 JP JP2003036679A patent/JP4096751B2/ja not_active Expired - Fee Related
Also Published As
| Publication number | Publication date |
|---|---|
| JP2004246145A (ja) | 2004-09-02 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| JPH09179556A (ja) | 楽音生成方法および装置 | |
| JP3637578B2 (ja) | 楽音生成方法 | |
| JP3293474B2 (ja) | 楽音発生方法 | |
| CN1363083A (zh) | 乐音产生装置 | |
| TW300298B (ja) | ||
| JP3744440B2 (ja) | ミキシング装置及び楽音発生装置並びにミキシング用の大規模集積回路 | |
| JP4096751B2 (ja) | 楽音発生装置及び楽音発生処理のプログラム | |
| CN103531193B (zh) | 乐音产生装置以及乐音产生方法 | |
| JP2004093732A (ja) | 楽音発生装置及び楽音発生処理のプログラム | |
| JP2011197552A (ja) | 楽音生成装置 | |
| JP3637577B2 (ja) | 楽音生成方法 | |
| JP5510813B2 (ja) | 楽音生成装置 | |
| JP5029898B2 (ja) | 音源装置および音源処理プログラム | |
| JP3799711B2 (ja) | 楽音発生方法および楽音発生装置 | |
| JP3723973B2 (ja) | 音源装置 | |
| JP3137043B2 (ja) | 波形メモリ音源装置および楽音発生装置 | |
| JP3285137B2 (ja) | 楽音発生装置および楽音発生方法、並びに該方法に係るプログラムを記憶した記憶媒体 | |
| JP2576617B2 (ja) | 処理装置 | |
| JP3654257B2 (ja) | 楽音発生装置 | |
| JP2576613B2 (ja) | 処理装置 | |
| JP3516470B2 (ja) | 信号処理装置 | |
| JP2956550B2 (ja) | 楽音発生装置および楽音発生方法 | |
| JP2003108142A (ja) | 楽音発生装置及び楽音発生処理のプログラム | |
| JP3148803B2 (ja) | 音源装置 | |
| JP3693046B2 (ja) | 楽音発生装置 |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20051228 |
|
| RD02 | Notification of acceptance of power of attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7422 Effective date: 20060208 |
|
| RD04 | Notification of resignation of power of attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7424 Effective date: 20060405 |
|
| A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20070926 |
|
| A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20071009 |
|
| A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20071126 |
|
| TRDD | Decision of grant or rejection written | ||
| A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20080219 |
|
| A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20080303 |
|
| R150 | Certificate of patent or registration of utility model |
Ref document number: 4096751 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110321 Year of fee payment: 3 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110321 Year of fee payment: 3 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120321 Year of fee payment: 4 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130321 Year of fee payment: 5 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130321 Year of fee payment: 5 |
|
| FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20140321 Year of fee payment: 6 |
|
| LAPS | Cancellation because of no payment of annual fees |