以下、添付の図面を参照しながら、本発明による楽音形成装置の実施の形態を詳細に説明する。
図1は、汎用のコンピュータ上でソフトウェアによって、本発明による楽音形成装置を含んだシンセサイザを構築するための、典型的な汎用のコンピュータのハードウェア構成を示すブロック図である。
この図1に示す汎用のコンピュータは、極めて一般的な構成を備えており、バス10を介して、CPU12と、RAMよりなるメモリ14と、ディスクコントローラ16と、ビデオカード18と、I/Oカード20と、サウンドカード22とが接続されており、さらに、ディスクコントローラ16にはハードディスク24が接続され、ビデオカード18にはディスプレイ装置26が接続され、I/Oカード20にはキーボード28およびマウス30が接続されている。そして、このコンピュータにおいては、サウンドカード22から楽音信号が出力される。
また、この汎用のコンピュータにおいては、本発明による楽音形成装置を含むシンセサイザを構築するためのプログラムの他に、シーケンサ(自動演奏装置)を構築するためのプログラムも同時に起動され、シーケンサから本発明の楽音形成装置を含むシンセサイザにMIDI情報が引き渡され、本発明の楽音形成装置を含むシンセサイザにおいては、引き渡されたMIDI情報に応じて楽音を形成して出力する処理が行われる。
図2は、本発明の楽音形成装置を含むシンセサイザを構築するためのプログラムの全体構成を示し、制御タスク、音源タスク、出力タスクおよび波形データロードタスクの各タスクとタイマーインターラプト処理より構成されている。
制御タスクは制御プログラムを実行し、シーケンサのプログラムとの間でMIDI情報のやりとりを行うとともに、音源タスク側へ発音制御メッセージおよび発音パラメータを引き渡し、音源タスク側からボイス情報を受け取ることにより、シーケンサのプログラムから受け取ったMIDI情報に従い音色変更や発音制御などを行う。
音源タスクは音源プログラムを実行し、複数のボイス(楽音生成チャンネル)ならびにエフェクトに関する処理を行い、生成した楽音信号を出力タスクへ引き渡す。即ち、音源タスクは複数のボイスのそれぞれの処理を行うものであって、制御タスクから引き渡された発音制御メッセージおよび発音パラメータに従ってシンセサイザの楽音信号を生成し、生成した楽音信号を出力タスクへ引き渡すことになる。
出力タスクは出力プログラムを実行し、発音タスクから引き渡された楽音信号を、出力用ハードウェア(DAC)の仕様にそってコントロールして出力する。
波形データロードタスクは波形データロードプログラムを実行し、制御タスクからデータロード要求を受け取り、データロード要求に応じて波形データをハードディスク24からメモリ14にロードする。なお、本明細書において、「ロード」とは、ハードディスク24に記憶された波形データなどのデータをメモリ14に読み込む処理を意味する。
タイマーインターラプト処理は所定時間間隔でタイマーインターラプトプログラムを実行し、制御タスクへタイマーイベントを発行する。
ところで、上記した制御タスク、音源タスク、出力タスクおよび波形データロードタスクには優先度(プライオリティ:priority)が設けられていて、他のタスクなどにより処理を中断されることが好ましくないタスクは、優先度を高くするようになされている。なお、この実施の形態においては、出力タスクの優先度が最も高く、次に音源タスクの優先度が高く、その次に制御タスクの優先度が高く、波形データロードタスクの優先度が最も低くなされている。
上記において説明した各タスクおよびタイマーインターラプト処理により、本発明の楽音形成装置を含むシンセサイザを構築することができるものであるが、以下においては、説明を簡略化して理解を容易にするために、本発明の楽音形成装置に関する構成ならびに作用を中心に説明するものとする。なお、本発明の楽音形成装置以外のシンセサイザ部分に関しては、従来より公知のソフトウェア技術により構築するようにしてよい。
本発明の楽音形成装置に関する構成ならびに作用の説明にあたっては、まず、ハードディスク24における波形データの記憶構造を、図3を参照しながら説明するものとする。
即ち、図3は、ハードディスク24上に構成された波形データを記憶したファイルたる波形データファイルを図表的に示したものであり、波形データファイルは、上記したシンセサイザの初期設定時(立ち上がり時)にロードされるデータを記憶するエリアたるプリロード部と、波形データを記憶したエリアたる波形データ部とから構成されている。
そして、プリロード部は音色情報を記憶したエリアたる複数の音色情報部(音色1情報部、音色2情報部、音色3情報部、・・・)を備え、これら各音色情報部は、波形データをアクセスするための情報たる波形データのオフセットやサイズなどの情報を記憶したエリアたるアクセスデータ部、音色使用履歴(実際にその音色が使用される度に1づつインクリメントされるCPU12に内蔵されたカウンターの値)を記憶したエリアである音色履歴部、メモリ14上に波形データがロードされたときにそのアドレスを記入するエリアたるアドレス部および音源タスクを制御するための各種のパラメータを記憶したエリアたるパラメータ部から構成されている。
また、ハードディスク24上には、図4に示すようにシンセサイザ制御用ファイルが設けられている。このシンセサイザ制御用ファイルは、前回のシンセサイザの処理の終了時にメモリ14の波形データ部用プール部(後述する)に読み込まれている波形データのリストたる波形データリストを記憶するエリアたる波形データリスト部と、制御タスク初期化モードがモード1に設定されているかモード2に設定されているかを記憶するエリアたるモード部と(制御タスク初期化モードとしてはモード1とモード2との2つのモードが設定されており、後述するようにモードによって制御タスクの処理内容が異なる。制御タスク初期化モードは、ディスプレイ装置26に表示され、キーボード28やマウス30などを操作することによって、ユーザーが任意に設定できるものとする。)、ある楽曲中において同時に使用される可能性が高い音色のリストの複数楽曲分の一覧であるジャンル別データベースを記憶するエリアたるジャンル別データベース部と(なお、同時に使用される可能性が高い音色は、予め設定されていてもよいし、ユーザーが任意に設定できるようにしてもよい。)、ユーザーが設定したシンセサイザの初期設定時に予めロードしておく音色のリストたる音色リストを記憶しておくエリアたる音色リスト部とから構成されている。
次に、メモリ14の構成を図5を参照しながら説明すると、MIDIのGSリセットなどでセットされるリセットフラグを記憶するエリアたるリセットフラグ部と、MIDIチャンネル(MIDIチャンネル1〜MIDIチャンネル16)に対応してそれぞれのチャンネルを制御するためのデータを記憶するエリアたるチャンネルコントロールデータ部と、ハードディスク24上に構成されたシンセサイザ制御用ファイルの波形データリスト部をロードするエリアたる波形データリストロード部と、ハードディスク24上に構成されたシンセサイザ制御用ファイルのジャンル別データベース部をロードするエリアたるジャンル別データベースロード部と、ハードディスク24上に構成されたシンセサイザ制御用ファイルの音色リスト部をロードするエリアたる音色リストロード部と、ハードディスク24上に構成された波形データファイルのプリロード部をロードするエリアたるプリロード部用ロード部と、ハードディスク24上に構成された波形データファイルの波形データ部に記憶された波形データをロードするエリアたる波形データ用プール部とより構成されている。
そして、チャンネルコントロールデータ部は各MIDIチャンネルに関する情報を記憶したチャンネル部(チャンネル1部、チャンネル2部、チャンネル3部、・・・、チャンネル16部)を備え、これら各チャンネル部は、音色番号を記憶するエリアたる音色番号部と、波形データがロード中にセットされるフラグを記憶するエリアたるロード中フラグ部と、波形データのロード中に実行できないMIDI情報を一時貯めておくFIFOのエリアたるFIFO部とより構成されている。
以上の構成において、図6を参照しながら、シンセサイザの初期設定時に制御プログラムにより実行される制御タスクの処理たる「初期設定処理ルーチン」を説明すると、まず、各種のバッファなどをクリアして初期化の処理(ステップS602)を行った後に、ハードディスク24上に構成された波形データファイルのプリロード部を、メモリ14のプリロード部用ロード部へロードする(ステップS604)。
次に、ハードディスク24上に構成されたシンセサイザ制御用ファイルのジャンル別データベース部を、メモリ14のジャンル別データベースロード部へロードする(ステップS606)。
そして、制御タスク初期化モードが、モード1に設定されているか、モード2に設定されているかを、ハードディスク24上に構成されたシンセサイザ制御用ファイルのモード部を参照して判断する(ステップS608)。
ステップS608において、制御タスク初期化モードがモード1に設定されていると判断された場合には、ハードディスク24上に構成されたシンセサイザ制御ファイルの波形データリスト部を、メモリ14の波形データリストロード部へロードし、この波形データリストロード部に記憶された波形データリストに示される波形データを、ハードディスク24上に構成された波形データファイルの波形データ部からメモリ14の波形データ用プール部にロードし、この初期設定処理ルーチンを終了する(ステップS610)。
従って、この場合には、初期設定時において、前回動作終了時にメモリ14に記憶されていた波形データが、ハードディスク24からメモリ14へロードされることになる。
一方、ステップS608において、制御タスク初期化モードがモード2に設定されていると判断された場合には、さらに、ハードディスク24上に構成されたシンセサイザ制御用ファイルの音色リスト部に音色リストが設定されているか否かを判断する(ステップS612)。
ステップS612において、ハードディスク24上に構成されたシンセサイザ制御用ファイルの音色リスト部に音色リストが設定されていないと判断された場合には、ステップS604でメモリ14のプリロード部用ロード部にロードされた、ハードディスク24上に構成された波形データファイルのプリロード部の音色履歴部を参照し、音色履歴の値の大きい音色の波形データから順に、メモリ14の波形データ部用プール部の使用上限になるまで、ハードディスク24上に構成された波形データファイルの波形データ部からメモリ14の波形データ部用プール部に波形データをロードし、この初期設定処理ルーチンを終了する(ステップS614)。
従って、この場合には、初期設定時において、過去に使用回数の多かった波形データが、ハードディスク24からメモリ14へロードされることになる。
一方、ステップS612において、ハードディスク24上に構成されたシンセサイザ制御用ファイルの音色リスト部に音色リストが設定されていると判断された場合には、ハードディスク24上に構成されたシンセサイザ制御ファイルの音色リスト部を、メモリ14の音色リストロード部へロードし、この音色リストロード部に記憶された音色リストに示される音色の波形データを、ハードディスク24上に構成された波形データファイルの波形データ部からメモリ14の波形データ用プール部にロードし、この初期設定処理ルーチンを終了する(ステップS616)。
従って、この場合には、初期設定時において、ユーザーが予めメモリ14に記憶させておきたい波形データが、ハードディスク24からメモリ14へロードされることになる。
なお、上記したステップS610、ステップS614およびステップS616においては、ハードディスク24上に構成された波形データファイルの波形データ部からメモリ14の波形データ用プール部に、指定された波形データをロードする処理が行われるが、この処理は、具体的には、図7に示す制御プログラムにより実行される制御タスクの処理たる「データロード要求発行処理ルーチン(1)」と、図8に示す波形データロードプログラムによって実行される波形データロードタスクの処理たる「波形データロードルーチン」とによって実現される。
即ち、処理ステップがステップS610、ステップS614およびステップS616に到達すると、図7に示すデータロード要求発行処理ルーチン(1)が起動され、制御タスクは波形データロードタスクに対してデータロード要求を発行する(ステップS702)。
それから、波形データロードタスクから制御タスクへデータロード完了通知が行われた否かを判断し(ステップS704)、波形データロードタスクから制御タスクへデータロード完了通知が行われるまで待ち、波形データロードタスクから制御タスクへデータロード完了通知が行われた場合には、このデータロード要求発行処理ルーチン(1)を終了する。
そして、ステップS702において、制御タスクが波形データロードタスクに対してデータロード要求を発行すると、図8に示す波形データロードタスクによる波形データロードルーチンが起動される。
この波形データロードルーチンにおいては、ロードすべき波形データのサイズ分の領域を、メモリ14の波形データ用プール部に取得できるか否かを判断する(ステップS802)。
ステップS802において、ロードすべき波形データのサイズ分の領域をメモリ14の波形データ用プール部に取得できないと判断された場合には、既に波形データ用プール部にロードされている波形データの中で、最も過去に使用された波形データから順に破棄して行き、波形データ用プール部にロードする波形データのサイズ分の領域を確保し(ステップS804)、ステップS802へ戻る。
一方、ステップS802において、ロードすべき波形データのサイズ分の領域をメモリ14の波形データ用プール部に取得できると判断された場合には、ハードディスク24上に構成された波形データファイルの波形データ部から、メモリ14の波形データ用プール部に、指定された波形データをロードする(ステップS806)。
それから、ステップS806でロードした波形データに対応する音色情報部のアドレス部に、ロードした波形データのアドレスを書き込む(ステップS808)。
そして、制御タスクにデータロード完了通知を発行し(ステップS810)、この波形データロードルーチンを終了する。
また、シーケンサのプログラムから制御タスクへMIDI情報が入力された場合、音源タスクから制御タスクへボイス情報が入力された場合、波形データロードタスクから制御タスクへのデータロード完了通知が発行された場合あるいはタイマーインターラプト処理により制御タスクへタイマーイベントが発行された場合には、図9に示す制御プログラムにより実行される制御タスクの処理たる「定常処理ルーチン」が起動される。
即ち、シーケンサのプログラムから制御タスクへMIDI情報が入力された場合には、MIDI情報処理ルーチン(ステップS902)が実行され、音源タスクから制御タスクへボイス情報が入力された場合には、ボイス情報処理ルーチン(ステップS904)が実行され、波形データロードタスクから制御タスクへデータロード完了通知が発行された場合には、データロード完了通知処理ルーチン(ステップS906)が実行され、後述するタイマーインターラプト処理により制御タスクへタイマーイベントが発行された場合には、タイマーイベント処理ルーチン(ステップS908)が実行され。
図10には、ステップS902のMIDI情報処理ルーチンのフローチャートが示されており、制御タスクへ入力されたMIDI情報がリセットメッセージであった場合には、リセットフラグをセットし(ステップS1002)、図9に示す制御タスクの定常処理ルーチンへリターンする。
また、制御タスクへ入力されたMIDI情報がプログラムチェンジであった場合には、リセットフラグがセットされているか否かを判断し(ステップS1004)、リセットフラグがセットされている場合には、CPU12に内蔵されたタイマーをスタートしてから(ステップS1006)、入力されたプログラムチェンジに基づいて、メモリ14のチャンネルコントロールデータ部の当該プログラムチェンジに対応するチャンネル部の音色番号部に、当該プログラムチェンジが示す音色番号をセットする(ステップS1008)。
一方、リセットフラグがセットされていない場合には、ステップS1006の処理をジャンプして、入力されたプログラムチェンジに基づいて、メモリ14のチャンネルコントロールデータ部の当該プログラムチェンジに対応するチャンネル部の音色番号部に、当該プログラムチェンジが示す音色番号をセットする(ステップS1008)。
それから、音色番号部にセットされた音色番号の音色に対応する波形データが、波形データ用プール部に存在するか否かを判断する(ステップS1010)。
そして、当該波形データが波形データ用プール部に存在しない場合には、上記プログラムチェンジに対応するチャンネル部のロード中フラグをセットし、データロード要求発行処理ルーチン(2)(図16)を起動し(ステップS1012)、図9に示す制御タスクの定常処理ルーチンへリターンする。
こうして、ステップS1012においてデータロード要求発行処理ルーチン(2)が起動されると、データロード要求発行処理ルーチン(2)によりデータロード要求が波形データロードタスクへ発行され、波形データロードタスクは波形データロードルーチンを実行して、入力されたプログラムチェンジに対応する波形データをメモリ14の波形データ用プール部へロードする。
一方、音色番号部にセットされた音色番号の音色に対応する波形データが波形データ用プール部に存在する場合には、ロード中フラグをクリアし(ステップS1014)、図9に示す制御タスクの定常処理ルーチンへリターンする。
また、制御タスクへ入力されたMIDI情報がリセットフラグでもプログラムチェンジでもないその他の場合には、制御タスクへ入力されたMIDI情報がノートメッセージであるか否かを判断し(ステップS1016)。
そして、制御タスクへ入力されたリセットフラグおよびプログラムチェンジ以外のMIDI情報がノートメッセージである場合には、リセットフラグがセットされているか否かを判断し(ステップS1018)、リセットフラグがセットされている場合には、タイマーイベント処理ルーチンを実行してから(ステップS1020)、ロード中フラグがセットされているか否かを判断する(ステップS1022)。
一方、制御タスクへ入力されたリセットフラグおよびプログラムチェンジ以外のMIDI情報がノートメッセージでない場合や、制御タスクへ入力されたリセットフラグおよびプログラムチェンジ以外のMIDI情報がノートメッセージであっても、リセットフラグがセットされていない場合には、タイマーイベント処理ルーチンを実行することなしに、上記入力されたMIDI情報が示すチャンネル部のロード中フラグがセットされているか否かを判断する(ステップS1022)。
そして、ロード中フラグがセットされている場合には、メモリ14のFIFO部に入力されたMIDI情報を書き込み(ステップS1024)、図9に示す制御タスクの定常処理ルーチンへリターンする。
従って、ハードディスク24からメモリ14へ波形データの転送中であり、ロード中フラグがセットされていてMIDI情報の処理が不可能な状態においては、当該MIDI情報はメモリ14のFIFO部に書き込まれることになる。
一方、ロード中フラグがセットされていない場合には、入力されたMIDI情報に対応した処理を行い(ステップS1026)、図9に示す制御タスクの定常処理ルーチンへリターンする。
図11には、ステップS904のボイス情報処理ルーチンのフローチャートが示されている。
このボイス情報処理ルーチンにおいては、入力されたボイス情報が示す発音終了したボイスに設定されていたデータをクリアして、新たな楽音を発音するためのデータを設定可能にし(ステップS1102)、図9に示す制御タスクの定常処理ルーチンへリターンする。
図12には、ステップS906のデータロード完了通知処理ルーチンのフローチャートが示されている。
このデータロード完了通知処理ルーチンにおいては、ステップS1204〜ステップS1214の処理をMIDIチャンネルの数(この実施の態様においては、カウンタchが1〜16の16)だけ繰り返される。
まず、MIDIチャンネルのカウンタchを1に初期設定する(ステップS1202)。
そして、ロード中フラグがセットされているか否かを判断し(ステップS1204)、ロード中フラグがセットされていない場合には、後述のステップS1214へ進むが、ロード中フラグがセットされている場合には、ロードが完了した波形データの番号と現在のMIDIチャンネルで発音する音色番号とが一致するか否かを判断する(ステップS1206)。
そして、ロードが完了した波形データの番号と音色番号とが一致しない場合には、ステップS1214へ進むが、ロードが完了した波形データの番号と音色番号とが一致する場合には、ロード中フラグをクリアする(ステップS1208)。
それから、メモリ14のFIFO部にMIDI情報が書き込まれているか否かを判断し(ステップS1210)、メモリ14のFIFO部にMIDI情報が書き込まれている場合には、FIFO部に書き込まれているMIDI情報に対してMIDI情報処理ルーチン(図10)の実行を行う(ステップS1212)。そして、このMIDI情報処理ルーチンの実行は、その処理中チャンネルのFIFO部に書き込まれている全てのMIDI情報に対しての実行が終了するまで繰り返し行われる。
一方、ステップS1210の判断において、メモリ14のFIFO部にMIDI情報が書き込まれていなかったり、メモリ14のFIFO部にMIDI情報が書き込まれていても、上記処理で書き込まれている全てのMIDI情報に対しての実行が終了した場合には、MIDIチャンネルのカウンタchを1だけインクリメントする(ステップS1214)。
そして、MIDIチャンネルのカウンタchが16チャンネル分の処理をしたかを判断し(ステップS1216)、16チャンネル分の処理を終了していない場合には、ステップS1204に戻って次のMIDIチャンネルについての処理を実行し、16チャンネル分の処理を終了した場合には、図9に示す制御タスクの定常処理ルーチンへリターンする。
図13には、タイマーイベント処理ルーチンのフローチャートが示されており、このタイマーイベント処理ルーチンにおいては、まず、CPU12に内蔵されたタイマーをストップさせ(ステップS1302)、リセットフラグがセットされているか否かを判断する(ステップS1304)。
リセットフラグがクリアされている場合には、そのまま図9に示す制御タスクの定常処理ルーチンへリターンする。
一方、リセットフラグがセットされている場合には、リセットフラグをクリアし(ステップS1306)、各MIDIチャンネルに設定されている音色とジャンル別データベースとから、各MIDIチャンネルに設定されている音色の使用頻度の高いジャンルを判定し、判定したジャンルで頻繁に使用される音色の波形データの中でまだロードしていない波形データを波形データ用プール部へロードするために、データロード要求発行処理ルーチン(2)(図16)を起動し(ステップS1308)、図9に示す制御タスクの定常処理ルーチンへリターンする。
こうして、ステップS1308においてデータロード要求発行処理ルーチン(2)が起動されると、データロード要求発行処理ルーチン(2)によりデータロード要求が波形データロードタスクへ発行され、波形データロードタスクは波形データロードルーチンを実行して、判定したジャンルで頻繁に使用される音色の波形データの中でまだロードしていない波形データを、ハードディスク24の波形データ部からメモリ14の波形データ用プール部へロードする。
従って、各MIDIチャンネルに設定された音色から、当該音色の使用頻度の高いジャンル(グループ)が判定され、判定されたジャンルの音色に対応する波形データが、ハードディスク24からメモリ14へロードされることになる。
なお、上記したように、タイマーイベントはタイマーインターラプト処理により制御タスクへ発行されるものであり、図14には、1msec毎に起動されるタイマーインターラプト処理ルーチンのフローチャートが示されている。
このタイマーインターラプト処理ルーチンにおいては、まず、タイマーフラグがスタートにセットされているか、あるいはストップにクリアされているかを判断する(ステップS1402)。なお、タイマーがスタートされたときに、タイマーフラグがスタートにセットされるとともに、タイマーカウンタにカウント値500がセットされ、タイマーがストップされたときに、タイマーフラグがストップにクリアされる。
そして、タイマーフラグがストップにクリアされている場合には、そのままタイマーインターラプト処理ルーチンを終了する。
一方、タイマーフラグがスタートにセットされている場合には、タイマーカウント値から1をデクリメントしてから(ステップS1404)、タイマーカウント値が0であるか否かを判断する(ステップS14106)。
タイマーカウント値が0である場合には、タイマーイベントを制御タスクへ発行した後に(ステップS1408)、このタイマーインターラプト処理ルーチンを終了する。
一方、タイマーカウント値が0でない場合には、そのままタイマーインターラプト処理ルーチンを終了する。
なお、本発明の楽音形成装置を含むシンセサイザの動作終了時には、図15に示す制御プログラムにより実行される制御タスクの処理たる「終了時処理ルーチン」が起動される。
この終了時処理ルーチンにおいては、現在メモリ14の波形データ用プール部にロードされている波形データのリストを作成し、これを波形データリストとして、ハードディスク24のシンセサイザ制御用ファイルの波形データリスト部へ書き込むことになる(ステップS1502)。
従って、ハードディスク24のシンセサイザ制御用ファイルの波形データリスト部を参照することにより、初期設定ルーチン(図6)のステップS610において、初期設定時に前回動作終了時にメモリ14に記憶されていた波形データをハードディスク24からメモリ14へロードすることができるようになる。