以下、本発明を実施するための形態(以下「本実施形態」と記載する)について図面を参照しながら詳細に説明する。本実施形態は、例えば電子鍵盤楽器に適用される、音高(鍵域)や音量(ベロシティ:打鍵の速さ)などの演奏情報によって音色が変化するのを再現するために、大容量の一次記憶装置(例えばフラッシュメモリ)から二次記憶装置(例えばRAMによる波形メモリ)に、音高又は音量ごとの波形データ(以下これを「スプリット波形」と呼ぶ)を読み込む楽音発生装置を対象とする。本実施形態は、このような楽音発生装置において、二次記憶装置上に波形が存在しない音色が選択されて新たな音色波形データを一次記憶装置から二次記憶装置に読み込む際に、確実に新しい波形を読込み可能となり、読み込みたい波形の容量よりもはるかに大きな空きエリアがありながら読み込めないという非効率な状態を回避することができる電子楽器を実現するものである。
図1は、本発明による電子鍵盤楽器の実施形態の外観図である。本実施形態は、電子鍵盤楽器100として実施される。電子鍵盤楽器100は、演奏操作子としての複数の鍵からなる鍵盤101と、音色選択操作子としての音色選択を行うための音色選択ボタン102及び音色以外の各種機能選択を行う機能選択ボタン103からなるスイッチ・パネルと、ピッチベンドやトレモロ、ビブラート等の各種モジュレーション(演奏効果)を付加するベンダ/モジュレーション・ホイール104、音色や音色以外の各種設定情報を表示するLCD(Liquid Crystal Display:液晶ディスプレイ)105等を備える。また、電子鍵盤楽器100は、特には図示しないが、演奏により生成された楽音を放音するスピーカを裏面部、側面部、又は背面部等に備える。
音色選択ボタン102は、図1に示されるように、ピアノ(図中「Piano」)、エレクトリックピアノ(図中「E.piano」)、オルガン(図中「Organ」)、ギター(図中「Guitar)等の各種音色のカテゴリを選択するためのボタン群である。ユーザは、この音色選択ボタン102を押下することにより、例えば16音色のうちの何れかを選択することができる。
図2は、図1の電子鍵盤楽器100の実施形態のハードウェア構成例を示す図である。図2において、電子鍵盤楽器100は、CPU(中央演算処理装置)201、ROM(リードオンリーメモリ)202、RAM(ランダムアクセスメモリ)203、大容量フラッシュ(Flash)メモリ204、波形メモリ206が接続される音源LSI(大規模集積回路)205、図1の鍵盤101と図1の音色選択ボタン102及び機能選択ボタン103からなるスイッチ・パネルとが接続されるキー・スキャナ207、図1のベンダ/モジュレーション・ホイール104が接続されるA/Dコンバータ208、図1のLCD105が接続されるLCDコントローラ209、及びMIDI(Musical Instrument Digital Interface)入力を受け付けるMIDI I/F(インタフェース)213が、それぞれシステムバス214に接続される構成を備える。また、音源LSI205から出力されるデジタル楽音波形データは、D/Aコンバータ208によりアナログ楽音波形信号に変換され、アンプ211で増幅された後に、特には図示しないスピーカ又は出力端子から出力される。
CPU201は、RAM203をワークメモリとして使用しながらROM202に記憶された制御プログラムを実行することにより、図1の電子鍵盤楽器100の制御動作を実行する。また、ROM202は、上記制御プログラム及び各種固定データを記憶する。
大容量フラッシュメモリ204(一次記憶装置)は、複数の音色を構成する波形データ等の大容量データの格納領域であり、シーケンシャルアクセスにより順次アクセスされる。一方、音源LSI205には、波形データを展開するRAMで構成される波形メモリ206(二次記憶装置)が接続され、発音される楽音の波形データは必ず、この波形メモリ206上に配置されている必要がある。CPU201は、ユーザが図1の音色選択ボタン102を操作することにより指定した音色に対応する1組以上の波形データを大容量フラッシュメモリ204からシーケンシャルに読みだし、それを音源LSI205経由で波形メモリ206に転送することで、音色データを入れ替えることができる。
LCDコントローラ209は、LCD105を制御するIC(集積回路)である。キー・スキャナ207は、鍵盤101や音色選択ボタン102又は機能選択ボタン103等のスイッチ・パネルの状態を走査して、CPU201に通知するICである。A/Dコンバータ208は、ベンダ/モジュレーション・ホイール104の操作位置を検出する集積回路である。
以上の構成を有する電子鍵盤楽器100の実施例における動作仕様の概要についてまず説明する。
まず、ユーザインタフェースについて説明する。本実施形態における電子鍵盤楽器100では、ユーザが図1の音色選択ボタン102を押下することで、例えば16の音色のうち、いずれかを選択して演奏することができる。
次に、波形データの読込み転送動作について説明する。図3は、本実施形態における波形データセグメントの概念を説明する図である。波形メモリ(RAM)上でセグメント管理がされない従来の電子鍵盤楽器では、データ配置301として示されるように、波形データの読込が繰り返されると、使用領域と空き領域が無秩序な配置になり、たとえ合計では十分な空き領域があったとしても、連続性が無いばかりに読み込むエリアが確保できないというケースが起こりえていた。
これに対して本実施形態では、302として示されるデータ配置を有する。このデータ配置においては、波形メモリ206の記憶領域において、一定の間隔で跨ぐことができない境界線が設けられる。本実施形態において、この隣り合う境界線と境界線の間の領域をセグメントと呼ぶ。この1セグメントのデータサイズは、全て同じであり、各音色を構成する1つ以上の波形データの中で最もサイズが大きいものよりも下回らないように設定される。本実施形態では、大容量フラッシュメモリ204から波形メモリ206への波形データの読込みは、このセグメントを単位として実行される。本実施形態において、1つの音色は1つ又は複数の波形データを持つ。1つの音色の1つ以上の波形データの読込みにおいては、1つ又は複数のセグメント単位で波形メモリ206の記憶領域が確保され、読込が実行される。この場合に、確保された複数のセグメントは、連続して配置されている必要はない。また、1つのセグメントには、同じ音色の波形データを複数読み込むことができるが、異なる音色の波形データが混在して読み込まれないように、制御が実行される。
大容量フラッシュメモリ20上には例えば全16音色分の波形データ群が記録されており、その中からユーザが指定した音色を構成する1つ以上の波形データを音源LSI205の波形メモリ206に読み込むことで、発音が可能となる。この音色情報は、図2のROM202に記憶されるフラッシュメモリ音色情報テーブルによって管理される。図4(a)は、フラッシュメモリ音色情報テーブルのデータ構成例を示す図である。図4(a)の表として例示されるフラッシュメモリ音色情報テーブルの2行目以降の各行として示される各音色のエントリには、図4(a)の表の1行目に示されるように、音色番号を示す「番号」項目値と、「音色名」項目値と、大容量フラッシュメモリ204の波形記憶領域の先頭からの記憶アドレスのオフセット(16進数)を示す「波形アドレスオフセット」項目値と、その音色に含まれる波形データ群の合計の波形サイズ(16進数)を示す「波形サイズ」項目値と、それらの波形データ群が使用する「使用セグメント数」項目値とが記憶されている。
上記16音色の各々は、1音色あたり最大で例えば64種類の波形データから構成され、大容量フラッシュメモリ204に連続的に格納されている。音色内の各波形データのうち、波形メモリ206内の1つのセグメント内に転送される1つ以上の波形データは1つのグループにグルーピングされる。波形メモリ206内の1つのセグメント内に転送される波形データは、大容量フラッシュメモリ204上でも必ず連続している。1つの音色の各波形データの情報は、図2のROM202に記憶される音色波形情報テーブルによって管理される。図4(b)は、1音色あたり最大で64の波形データを管理する音色波形情報テーブルのデータ構成例を示す図である。図4(b)の表として例示される音色波形情報テーブルの2行目以降の各行として示される各波形データのエントリには、図4(b)の表の1行目に示されるように、0から63までの「波形番号」項目値が記憶される。またこのエントリには、演奏時に演奏されたキーやベロシティ(強度)によってどの波形を読みだして発音させるかを判断するための情報(スプリットゾーンパラメータ)として、「最低ベロシティ」項目値、「最高ベロシティ」項目値、「最低キー番号」項目値、及び「最高キー番号」項目値が記憶される。またこのエントリには、その波形データが転送先の波形メモリ206のセグメントのどのアドレスから記憶されているかを示す「セグメント先頭からのアドレス」項目値と、その波形データのサイズを示す「波形サイズ」項目値が記憶される。なお、値の左端に付与されている記号「H」は、その値が16進数であることを示す。更にこのエントリには、その波形データが含まれるグループを示す「セグメントグループ」項目値が記憶される。
本実施形態においては、ユーザによって指定された音色を構成する波形データ群が波形メモリ206上に記憶されていない場合には、次の制御処理が実行される。まず、セグメントを単位として、大容量フラッシュメモリ204から波形メモリ206に新たに読み込まれる音色を構成する1つ以上の波形データ群が必要とする数のセグメントの空き領域が、波形メモリ206上で探索されて確保される。必要なセグメント数は、ROM202に記憶されている図4(a)に例示されるフラッシュメモリ音色情報テーブルにおいて、指定された音色に対応するエントリの「使用セグメント数」項目値が参照されることにより決定される。波形メモリ206上で必要な数の空きセグメントが無い場合には、必要なセグメント数が確保されるまで、古い順に使用されていた音色に対応するセグメントが順次開放されて確保される。
次に、大容量フラッシュメモリ204に記憶されている指定された音色に対応する波形データ群が、波形メモリ206上で確保された空きセグメントに順次転送される。このとき、指定された音色に対応するROM202に記憶されている図4(b)に例示される音色波形情報テーブルにおいて、「セグメントグループ」項目値が(0から)小さい順に同じ値を有する波形データ群は、波形メモリ206上の(番号が小さい順の)1つの空きセグメントに転送される。図5は、音色ごとの波形データの大容量フラッシュメモリ204から波形メモリ206への転送動作を説明する図である。例えば図5(a)に示されるGuitar音色を構成する大容量フラッシュメモリ204上の0番から10番の波形データ群が図5(b)の波形メモリ206に転送される場合、「セグメントグループ」項目値=0である0番から2番までの連続する3組の波形データ群は図5(b)の波形メモリ206上の空きセグメント=Seg0に転送され、「セグメントグループ」項目値=1である3番から5番までの連続する3組の波形データ群は波形メモリ206上の空きセグメント=Seg4に転送され、「セグメントグループ」項目値=2である6番から8番までの連続する3組の波形データ群は波形メモリ206上の空きセグメント=Seg6に転送され、「セグメントグループ」項目値=3である9番と10番の連続する2組の波形データ群は波形メモリ206上の空きセグメント=Seg63に転送される。一方例えば、例えば図5(c)に示されるSaxophone音色を構成する大容量フラッシュメモリ204上の0番から8番の波形データ群が図5(b)の波形メモリ206に転送される場合、「セグメントグループ」項目値=0である0番から2番までの連続する3組の波形データ群は図5(b)の波形メモリ206上の空きセグメント=Seg2に転送され、「セグメントグループ」項目値=1である3番から5番までの連続する3組の波形データ群は波形メモリ206上の空きセグメント=Seg3に転送され、「セグメントグループ」項目値=2である6番と7番の連続する2組の波形データ群は波形メモリ206上の空きセグメント=Seg5に転送され、「セグメントグループ」項目値=3である8番の1組の波形データ群は波形メモリ206上の空きセグメント=Seg7に転送される。転送先のセグメントに対応付けて、そのセグメントに転送された波形データに対応する「セグメントグループ」項目値が、例えばRAM203(図2)に記憶される。
各セグメントは、前述したように最もサイズが大きい波形データに合わせた、例えば100000H(「H」は16進数を示す)バイト=1MB(メガバイト)のサイズを有する。従って、1つの波形データは必ず、1つのセグメント内の記憶領域に連続して転送することが可能となる。合計で例えば1MB以下になる同じ「セグメントグループ」項目値を有する連続する複数の波形データも、1つのセグメントに転送することができる。これにより、偶然性に依存して空き容量よりも遥かに小さいサイズの波形データが読み込めないということは起こらなくなる。
ユーザによって指定された音色を構成する波形データ群が波形メモリ206上に記憶されている場合には、それらの波形データ群は大容量フラッシュメモリ204からあらためて読み込む必要は無いので、そのまま発音処理に使用することができる。この際、読込みは発生しないものの、履歴上は最新の音色として記録される。
図6は、押鍵が発生した場合の発音処理時の波形スプリットの説明図である。本実施形態では、図6に例示されるように、演奏時のキー番号とベロシティ(演奏強さ)が最大で64領域に2次元的に分割され、それぞれの分割された領域(スプリットエリア)に、上述のように波形メモリ206に転送された1音色あたり1組以上最大で64組の波形データがそれぞれ割り当てられる。図2において、CPU201は、キー・スキャナ207を介して鍵盤101における押鍵の発生を検出すると、現在演奏中の音色に対応するROM202(図2)内の図4(b)に例示される音色波形情報テーブルのエントリのうち、押鍵発生時のキー番号値が「最低キー番号」項目値から「最高キー番号」項目値までの範囲に含まれ、押鍵発生時のベロシティが「最低ベロシティ」項目値から「最高ベロシティ」項目値までの範囲に含まれるエントリが検索される。そして、検索された当該エントリの「セグメントグループ」項目値と同じセグメントグループの値が対応付けられている波形メモリ206上のセグメント内の、当該エントリの「セグメント先頭からのアドレス」項目値に対応するアドレスから、当該エントリの「波形サイズ」項目値に対応する波形サイズ分だけの波形データが、押鍵発生時のキー番号に対応する速度で読み出されて押鍵発生時のベロシティに対応する強度で発音される。
CPU201は、ユーザによって指定された音色を構成する波形データ群が波形メモリ206上に記憶されていない場合には、これらの波形データ群が大容量フラッシュメモリ204から波形メモリ206に転送されるが、この波形転送はバックグラウンド処理として1組の波形データごとに分割して実行される。従って、押鍵発生時にCPU201がスプリットエリアを判別してそのエリアに対応する波形データの波形メモリ206からの読出しを音源LSI205に指示したときに、該当する波形データが大容量フラッシュメモリ204から波形メモリ206への転送の最中である場合には、まだ波形データが波形メモリ206上に揃っていないため、音源LSI205は発音を行わない。
ROM202(図2)に記憶される図4(a)の例のフラッシュメモリ音色情報テーブル及び図4(b)の例の音色波形情報テーブルは、CPU201(図2)が実行する制御プログラム上からは、構造体の定数データとしてアクセスすることができる。図7は、ROM202に記憶される構造体の定数データの例を示す図である。
まず、図4(a)に例示されるフラッシュメモリ音色情報テーブルは、図7に示される、構造体TONE_INF[16]([]内の数字は配列数を示す)と、その構造体を構成するメンバ定数である配列定数NAME[16]([]内の数字は配列数を示す)、定数WAVE_TOTAL_SIZE、及び定数NUM_SEGとによって構成される。構造体TONE_INF[16]は例えば、RAM203(図2)上の変数Tによって、TONE_INF[T]としてアクセスされる。変数Tが例えば0から15までの値域をとることにより、図4(a)のフラッシュメモリ音色情報テーブルにおける「番号」項目値が0から15までの各音色のエントリが指定される。メンバ定数NAME[16]は、図4(a)の例の「音色名」項目値に対応する16文字までの音色表示名を格納する。このメンバ定数へは例えば、RAM203上の変数iによって、TONE_INF[T].NAME[i]というフォーマットでアクセスされる。変数iが例えば0から15までの値域をとることにより、変数Tの値に対応する音色の音色表示名(0〜15文字目)が表される。メンバ定数WAVE_TOTAL_SIZEは、図4(a)の「波形サイズ」項目値に対応する音色内の波形データの合計サイズを格納する。このメンバ定数へは例えば、TONE_INF[T].WAVE_TOTAL_SIZEというフォーマットでアクセスされる。これは、変数Tの値に対応する音色の波形データの合計サイズを示す。メンバ定数NUM_SEGは、図4(a)の「使用セグメント数」項目値に対応する音色内の波形データが使用するセグメント数を格納する。このメンバ定数へは例えば、TONE_INF[T].NUM_SEGというフォーマットでアクセスされる。これは、変数Tの値に対応する音色の使用セグメント数を示す。
次に、図4(b)に例示される音色波形情報テーブルは、図7に示される、上位構造体TONE_INF[16]([]内の数字は配列数を示す)と、その構造体を構成するメンバ構造体である中位構造体WAVE[64]([]内の数字は配列数を示す)と、その中位構造体を構成するメンバ定数である定数VEL_LO、VEL_HI、KEY_LO、KEY_HI、FLASH_ADRS、SEG_ADRS、SIZE、SEG_GROUP、及び下位構造体TG_INFとによって構成される。上位構造体TONE_INF[16]については前述した通りである。中位構造体WAVE[64]は例えば、RAM203(図2)上の変数wによって、WAVE[w]としてアクセスされる。変数wが例えば0から63までの値域をとることにより、図4(b)の音色波形情報テーブルにおける「波形番号」項目値が0から63までの各波形データのエントリが指定される。メンバ定数VEL_LOおよびVEL_HIは、図4(b)の「最低ベロシティ」項目値及び「最高ベロシティ」項目値にそれぞれ対応し、波形データが発音する範囲の本来の最低ベロシティ及び最高ベロシティの各値を格納する。これらのメンバ定数へは例えば、TONE_INF[T].WAVE[w].VEL_LO又はTONE_INF[T].WAVE[w].VEL_HIというフォーマットでアクセスされる。これは、変数Tの値に対応する音色の、変数wの値に対応する波形データの、最低ベロシティ又は最高ベロシティを示す。メンバ定数KEY_LOおよびKEY_HIは、図4(b)の「最低キー番号」項目値及び「最高キー番号」項目値にそれぞれ対応し、波形データが発音する範囲の本来の最低キー番号及び最高キー番号の各値を格納する。これらのメンバ定数へは例えば、TONE_INF[T].WAVE[w].KEY_LO又はTONE_INF[T].WAVE[w].KEY_HIというフォーマットでアクセスされる。これは、変数Tの値に対応する音色の、変数wの値に対応する波形データの、最低キー番号又は最高キー番号を示す。メンバ定数FLASH_ADRSは、図4(b)には明示されていないが、波形データの先頭の大容量フラッシュメモリ204上でのアドレスを格納する。このメンバ定数へは例えば、TONE_INF[T].WAVE[w].FLASH_ADRSというフォーマットでアクセスされる。これは、変数Tの値に対応する音色の、変数wの値に対応する波形データの、先頭の大容量フラッシュメモリ204上でのアドレスを示す。メンバ定数SEG_ADRSは、図4(b)の「セグメント先頭からのアドレス」項目値に対応し、波形データが波形メモリ206上で読み込まれるべきセグメントの先頭からのアドレスオフセットを格納する。このメンバ定数へは例えば、TONE_INF[T].WAVE[w].SEG_ADRSというフォーマットでアクセスされる。これは、変数Tの値に対応する音色の、変数wの値に対応する波形データの、波形メモリ206上で読み込まれるべきセグメントの先頭からのアドレスオフセットを示す。メンバ定数SIZEは、図4(b)の「波形サイズ」項目値に対応し、波形データのサイズを格納する。このメンバ定数へは例えば、TONE_INF[T].WAVE[w].SIZEというフォーマットでアクセスされる。これは、変数Tの値に対応する音色の、変数wの値に対応する波形データのサイズを示す。TONE_INF[T].WAVE[w].SIZE=0のときは、波形データが存在しないことを示す。メンバ定数SEG_GROUPは、図4(b)の「セグメントグループ」項目値に対応し、波形データが波形メモリ206上の1つのセグメントに転送されるときに、そのセグメントに付与されるセグメントグループの値を格納する。このメンバ定数へは例えば、TONE_INF[T].WAVE[w].SEG_GROUPというフォーマットでアクセスされる。これは、変数Tの値に対応する音色の、変数wの値に対応する波形データの、セグメントグループ値を示す。TONE_INF[T].WAVE[w].SEG_GROUPの値が同じ波形データは、波形メモリ206上の同じセグメントに転送される。メンバ構造体TG_INFは、音源LSI205(図2)が波形メモリ206上の1つのセグメントに転送された波形データに対して発音処理を実行する場合における各種パラメータを、その構造体のメンバ定数(図5では省略)として記憶する。それらのパラメータは例えば、波形データの読出しのスタートアドレス、繰返し位置を示すループアドレス、終了位置を示すエンドアドレス、音量、チューニング情報等である。
図8は、CPU201(図2)が実行する制御処理において使用するRAM203に記憶8される主要な変数の一覧を示す図である。変数TIMESTAMPは、ユーザが音色選択ボタン102(図1)を操作することにより発生する音色選択イベントごとに1ずつインクリメントする履歴番号を格納する。セグメントが割り当てられる際に、後述する構造体メンバ変数SEG_INF[s].TIMESTAMPに格納される。変数CUR_TONEは、現在演奏のために選択されている音色番号を格納する。この値が「−1」の場合は該当無し、即ち現在演奏が行われていないことを示す。変数READING_WAVEは、現在バックグラウンド処理において波形転送中の波形データの波形番号を格納する。この値が「−1」の場合は、全て読込み済みであることを示す。
次に、波形メモリ206中のセグメントごとの情報が、構造体SEG_INF[64]([]内の数字は配列数を示す)と、その構造体を構成するメンバ変数TONE、SEG_GROUP、及びTIMESTAMPとによって保持される。構造体SEG_INF[64]は例えば、RAM203(図2)上の変数sによって、SEG_INF[s]としてアクセスされる。変数sが例えば0から63までの値域をとることにより、波形メモリ206上の0から63までの64セグメントの各々が指定される。メンバ変数TONEは、当該セグメントが割り当てられている音色番号を格納する。この値が「−1」の場合は、そのセグメントが空状態(未使用)であることを示す。このメンバ変数へは例えば、SEG_INF[s].TONEというフォーマットでアクセスされる。これは、変数sの値に対応するセグメントに割り当てられている音色番号を示す。メンバ変数TONEには、このセグメントへの波形転送が実行されたときの音色番号を保持するRAM203上の変数T値がコピーされる。メンバ変数SEG_GROUPは、当該セグメントに割り当てられている音色のセグメントグループ値を格納する。このメンバ変数へは例えば、SEG_INF[s].SEG_GROUPというフォーマットでアクセスされる。これは、変数sの値に対応するセグメントに割り当てられている音色のセグメントグループの値を示す。メンバ変数SEG_GROUPには、このセグメントに転送される波形データに対応する、ROM202に記憶されている図4(b)の音色波形情報テーブル中の「セグメントグループ」項目値、すなわち図7のTONE_INF[T].WAVE[w].SEG_GROUPの値がコピーされる。メンバ変数TIMESTAMPは、当該セグメントが使用された履歴番号を格納する。このメンバ変数へは例えば、SEG_INF[s].TIMESTAMPというフォーマットでアクセスされる。これは、変数sの値に対応するセグメントが使用された履歴番号を示す。ユーザが音色選択ボタン102(図1)を操作することにより発生する音色選択イベントごとに、そのタイミングで1ずつインクリメントされる変数TIMESTAMPの値がコピーされる。同じタイミングで割り当てられたセグメントは、同じTIMESTAMP値を有する。
次に、波形メモリ206中の各セグメント内に格納される1組以上の波形データに関する情報が、上位構造体SEG_INF[64]([]内の数字は配列数を示す)と、その構造体を構成するメンバ構造体である中位構造体WAVE_INF[64]([]内の数字は配列数を示す)と、その中位構造体を構成するメンバ変数WAVE、WAVE_NUM、SEG_ADRS、及びSIZEとによって保持される。上位構造体SEG_INF[64]については前述した通りである。中位構造体WAVE_INF[64]は例えば、RAM203(図2)上の変数iによって、WAVE_INF[i]としてアクセスされる。変数iが例えば0から63までの値域をとることにより、1つのセグメント内の0から63までの各波形データが指定される。メンバ変数WAVEは、当該セグメント中の当該波形データの有無を格納し、この値が0のときは波形データは無しであり、この値が1のときは波形データは有り(読込み済み)であることを示す。このメンバ変数へは例えば、SEG_INF[s].WAVE_INF[i].WAVEというフォーマットでアクセスされる。これは、変数sの値に対応するセグメントの、変数iの値に対応する波形データの、有無を示す。メンバ変数WAVEの値は、当該セグメントへの当該波形データの転送が指示されたときに値0に、その後のバックグラウンド転送により当該セグメントへの当該波形データの転送が完了したときに値1に、それぞれセットされる。メンバ変数WAVE_NUMは、当該セグメント中の当該波形データの音色中の波形番号を格納し、この値が「−1」であれば波形データの割当てが無いことを示す。このメンバ変数へは例えば、SEG_INF[s].WAVE_INF[i].WAVE_NUMというフォーマットでアクセスされる。これは、変数sの値に対応するセグメントの、変数iの値に対応する波形データの、音色中での波形番号を示す。メンバ変数SEG_ADRSは、当該セグメント中での当該波形データのアドレスオフセットを格納する。このメンバ変数へは例えば、SEG_INF[s].WAVE_INF[i].SEG_ADRSというフォーマットでアクセスされる。メンバ変数SEG_ADRSには、このセグメントに転送される波形データに対応する、ROM202に記憶されている図4(b)の音色波形情報テーブル中の「セグメント先頭からのアドレス」項目値、すなわち図7のTONE_INF[T].WAVE[w].SEG_ADRSの値がコピーされる。メンバ変数SIZEは、当該セグメント中での当該波形データのサイズを格納する。このメンバ変数へは例えば、SEG_INF[s].WAVE_INF[i].SIZEというフォーマットでアクセスされる。メンバ変数SIZEには、このセグメントに転送される波形データに対応する、ROM202に記憶されている図4(b)の音色波形情報テーブル中の「波形サイズ」項目値、すなわち図7のTONE_INF[T].WAVE[w].SIZEの値がコピーされる。
以下に、上述の動作を実現するためにCPU201が実行する制御処理の詳細例について説明する。
図9は、CPU201が実行する制御処理の全体処理の例を示すメインルーチンのフローチャートである。この処理例は、CPU201がROM202に記憶された制御プログラムを実行する処理例である。
CPU201は、まずRAM203の内容を初期化した後(ステップS901)、ステップS902からS911の一連の処理で示される定常ループ処理に入る。
定常ループ処理では、CPU201はまず、ユーザインタフェース処理(図中「ユーザI/F」と表示)を実行する(ステップS902)。ここでは、CPU201は、図2のキー・スキャナ207を介して図1の音色選択ボタン102の状態を取得する。
次に、CPU201は、ステップS902の処理の結果、ユーザが音色選択ボタン102を操作することにより音色選択イベントが発生したか否かを判定する(ステップS903)。
そして、CPU201は、音色選択イベントが発生した場合(ステップS903の判定がYesの場合)は、音色切替え処理を実行する(ステップS904)。ステップS903の判定がNoならば、CPU201は、ステップS904の処理はスキップする。
次に、CPU201は、波形読込み処理を実行する(ステップS905)。ここでは、CPU201は、図2の大容量フラッシュメモリ204から波形メモリ206へのバックグラウンド処理による波形転送を実行する。
次に、CPU201は、鍵盤読込み処理を実行する(ステップS906)。ここでは、CPU201は、図2のキー・スキャナ207を介して図1の鍵盤101の押鍵状態を取得する。
次に、CPU201は、ステップS906の処理の結果、ユーザが鍵盤101上の何れかの鍵を押鍵することにより押鍵イベントが発生したか否かを判定する(ステップS907)。
そして、CPU201は、押鍵イベントが発生した場合(ステップS907の判定がYesの場合)は、押鍵処理を実行する(ステップS908)。ステップS907の判定がNoならば、CPU201は、ステップS908の処理はスキップする。
続いて、CPU201は、ステップS906の処理の結果、ユーザが鍵盤101上の何れかの押鍵中の鍵を離鍵することにより離鍵イベントが発生したか否かを判定する(ステップS909)。
そして、CPU201は、離鍵イベントが発生した場合(ステップS909の判定がYesの場合)は、離鍵処理を実行する(ステップS910)。ステップS909の判定がNoならば、CPU201は、ステップS910の処理はスキップする。
その後、CPU201は、音源定常サービス処理を実行する(ステップS911)。ここでは、例えば図1の機能選択ボタン103が押された場合に対応する処理や、図1のベンダ/モジュレーション・ホイール104が操作された場合に対応する処理等の、電子鍵盤楽器100に対する一般的な処理が実行される。
その後、CPU201は、ステップS902の定常ループ処理の先頭に戻る。
図10は、図9のステップS901の初期化処理の詳細例を示すフローチャートである。
まず、CPU201は、RAM203上の図8に示される変数の値を、全て「0」にする(ステップS1001)。
次に、CPU201は、現在演奏のために選択されている音色番号を格納するRAM203上の変数CUR_TONE(図8参照)に、該当無しを示す値「−1」を格納する(ステップS1002)。
次に、CPU201は、現在バックグラウンド処理において波形転送中の波形データの波形番号を格納するRAM203上の変数READING_WAVEに、全て読込み済みであることを示す値「−1」を格納する(ステップS1003)。
次に、CPU201は、セグメントをカウントするためのRAM203上の変数sについて、ステップS1004において値「0」に初期設定した後、ステップS1011で+1ずつインクリメントしながら、ステップS1010で値「63」に達したと判定するまで、ステップS1005からステップS1009までの処理を繰り返し実行する。
この繰返し処理において、CPU201はまず、変数sの値に対応するセグメントに割り当てられている音色番号を示す変数SEG_INF[s].TONEに、そのセグメントが空状態(未使用)であることを示す値「−1」を格納する(ステップS1005)。
次に、CPU201は、セグメント内の波形データの順番をカウントするためのRAM203上の変数wについて、ステップS1006において値「0」に初期設定した後、ステップS1009で+1ずつインクリメントしながら、ステップS1008で値「63」に達したと判定するまで、ステップS1007の処理を繰り返し実行する。即ち、CPU201は、このステップS1007において、変数sの値に対応するセグメント内のi番目(変数iが示す値)の波形データの音色中の波形番号を格納する変数SEG_INF[s].WAVE_INF[i].WAVE_NUMに、波形データの割当てが無いことを示す値「−1」を格納する。
以上の繰返し処理の後、ステップS1010の判定がYesになると、CPU201は、CPU201は、図10のフローチャートで示される図9のステップS901の初期化処理を終了する。
図11は、図9の音色選択イベント発生時(ステップS903の判定がYesのとき)のステップS904の音色切替え処理の、詳細例を示すフローチャートである。この処理の実行時には、RAM203上の音色番号変数Tの値が引き渡される。音色番号変数Tには、図10のステップS1001の実行時には前述したように初期値「0」が格納され、図9のステップS904の実行時には、ユーザによる図1の音色選択ボタン102の操作に基づいて図9のステップS902のユーザインタフェース処理で取り込まれたユーザが選択した音色の音色番号が格納される。
図11の音色切替え処理のフローチャートにおいて、CPU201はまず、現在演奏のために選択されている音色番号を格納する変数CUR_TONEの値が、RAM203の変数Tに格納されている、ユーザにより新たに指定された音色番号の値に等しいか否かを判定する(ステップS1101)。
ステップS1101の判定がYesならば、既に選択音色として選択済み又は現在大容量フラッシュメモリ204から波形メモリ206に該当する音色の波形データを転送中であるため、図11のフローチャートで示される図9のステップS904の音色切替え処理をそのまま終了する。
ステップS1101の判定がNoならば、CPU201は、履歴番号を格納する変数TIMESTAMPの値を+1インクリメントする(ステップS1102)。
次に、CPU201は、現在演奏のために選択されている音色番号を格納する変数CUR_TONEに、RAM203の変数Tに格納されている、ユーザにより新たに指定された音色番号の値を格納する(ステップS1103)。
次に、CPU201は、RAM波形データ調査ルーチンの処理を実行する(ステップS1104)。CPU201は、RAM203上の変数Tに格納されている新たに指定された音色番号を引数としてこのルーチンに引き渡す。CPU201は、このルーチンの処理の結果、RAM203上の変数Rに、指定された音色番号に対応する音色の波形データが波形メモリ206上に有るか否かを示す戻り値(値0ならば無し、値1ならば有り)を得る(ステップS1104)。この処理の詳細については後述する。
CPU201は、変数Rの値が1であるか否かを判定する(ステップS1105)。
ステップS1105の判定がYesならば、指定された音色番号に対応する音色の波形データを新たに波形メモリ206に転送する必要はないため、CPU201は、図11のフローチャートで示される図9のステップS904の音色切替え処理をそのまま終了する。
ステップS1105の判定がNoならば、CPU201は、波形領域確保ルーチンの処理を実行する(ステップS1106)。CPU201は、RAM203上の変数Tに格納されている新たに指定された音色番号を引数としてこのルーチンに引き渡す。CPU201は、このルーチンの処理の結果、指定された音色番号に対応する音色の波形データを大容量フラッシュメモリ204から転送するのに必要な数の空きセグメントを波形メモリ206上に確保する。この処理の詳細については後述する。
その後、CPU201は、波形読込み指示ルーチンの処理を実行する(ステップS1107)。CPU201は、RAM203上の変数Tに格納されている新たに指定された音色番号を引数としてこのルーチンに引き渡す。CPU201は、このルーチンの処理において、指定された音色番号に対応する音色の波形データを、図9のステップS905の波形読込み処理によって大容量フラッシュメモリ204から波形メモリ206に転送するための準備処理を実行する。
図12(a)は、図11のステップS1104のRAM波形データ調査ルーチンの詳細例を示すフローチャートである。
まず、CPU201は、調査するセグメントをカウントするためのRAM203上の変数sを0にリセットする(ステップS1201)。
次に、CPU201は、変数sの値に対応するセグメントに割り当てられている音色番号が格納されているRAM203上の変数SEG_INF[s].TONE(図8参照)の値が、引数として引き渡された新たに指定された音色番号の値が格納されているRAM203上の変数Tの値に等しいか否かを判定する(ステップS1202)。
ステップS1202の判定がNoならば、CPU201は、ステップS1203で変数sの値を+1ずつインクリメントしながら、ステップS1204で変数sの値が64に達したと判定するまで、変数sにより指定される各セグメントについて、ステップS1202の判定処理を繰り返す(ステップS1203→S1204の判定がNo→S1202→S1203の処理の繰返し)。
上記ステップS1202からS1204の処理の繰返しにおいて、ステップS1202の判定がYesになると、CPU201はまず、変数sの値に対応するセグメントが使用された履歴番号を示す変数SEG_INF[s].TIMESTAMPに、今回の音色選択イベントに基づいてインクリメントされたRAM203上の変数TIMESTAMPの値(図11のステップS1102参照)を格納して、当該セグメントの履歴番号を更新する(ステップS1205)。
続いて、変数sに対応するセグメントに指定された音色番号に対応する音色の波形データが格納されていることが判明したため、CPU201は、RAM203上の変数Rに、指定された音色番号に対応する音色の波形データが波形メモリ206上に有ることを示す戻り値1を格納する(ステップS1206)。その後、CPU201は、図12のフローチャートで示される図11のステップS1104のRAM波形データ調査ルーチンの処理を終了する。
ステップS1202からS1204の処理の繰返しにおいて、変数sによるセグメントの指定が末尾まで達してステップS1204の判定がYesになると、指定された音色番号に対応する音色の波形データはどのセグメントにも格納されていないことが判明したため、CPU201は、RAM203上の変数Rに、指定された音色番号に対応する音色の波形データが波形メモリ206上に無いことを示す戻り値0を格納する(ステップS1207)。その後、CPU201は、図12のフローチャートで示される図11のステップS1104のRAM波形データ調査ルーチンの処理を終了する。
図12(b)は、図11のステップS1106の波形領域確保ルーチンの詳細例を示すフローチャートである。このルーチンは、前述したように、図11のステップS1104のRAM波形データ調査ルーチンにより指定された音色番号に対応する音色の波形データが波形メモリ206上のどのセグメントにも無いことが判明した場合に実行される。
CPU201はまず、引数として引き渡された、指定された音色番号が格納されているRAM203上の変数Tの値に対応する音色の使用セグメント数を保持するROM202上の定数値TONE_INF[T].NUM_SEG(図7参照)を、RAM203上の変数uに格納する(ステップS1210)。
次にCPU201は、空きセグメント数調査ルーチンを実行する。このルーチンでは波形メモリ206上で使用されていない空きセグメントの数が取得される。CPU201は、このルーチンの処理の結果、RAM203上の変数Rに、空きセグメント数の値を得る(ステップS1211)。この処理の詳細については後述する。
CPU201は、変数Rに得られた空きセグメント数が、ステップS1210で変数uに格納された指定された音色番号に対応する音色における使用セグメント数以上となっているか否かを判定する(ステップS1212)。
ステップS1212の判定がNoならば、CPU201は、波形領域開放ルーチンを実行する(ステップS1213)。このルーチンでは、波形メモリ206上で最も古い履歴番号を有する音色のセグメントが開放される。この処理の詳細については後述する。
その後、CPU201は、ステップS1211に戻って、空きセグメント数調査ルーチンを再度実行し、変数Rに得られた空きセグメント数が、ステップS1210で変数uに格納された使用セグメント数以上となったか否かを判定する(ステップS1212)。
以上のステップS1211からステップS1213までの処理の繰返しの結果、変数Rに得られた空きセグメント数が指定された音色番号に対応する音色における使用セグメント数以上となることによりステップS1212の判定がYesになると、必要な空きセグメントが確保できたため、CPU201は、図12のフローチャートで示される図11のステップS1106の波形領域確保ルーチンを終了する。
図13は、図12のステップS1211の空きセグメント数調査ルーチンの詳細例を示すフローチャートである。前述したようにこのルーチンでは、波形メモリ206上での空きセグメントの数が取得される。
CPU201はまず、セグメントをカウントするためのRAM203上の変数sを0にリセットすると共に、戻り値である空きセグメント数を格納するRAM203上の変数Rの値を0にリセットする(ステップS1301)。
次に、CPU201は、ステップS1304で変数sの値を+1ずつインクリメントしながら、ステップS1305で変数sの値が64に達したと判定するまで、変数sの値によって指定されるセグメントごとに、ステップS1302とS1303の処理を繰り返し実行する。
上述の繰返し処理において、CPU201はまず、変数sの値に対応するセグメントに割り当てられている音色番号が格納されている変数SEG_INF[s].TONEの値が、そのセグメントが空状態(未使用)であることを示す値「−1」に等しいか否かを判定する(ステップS1302)。
そのセグメントが空状態であることによりステップS1302の判定がYesならば、CPU201は、戻り値である空きセグメント数を格納するRAM203上の変数Rの値を+1インクリメントする(ステップS1303)。
ステップS1302の判定がNoならば、CPU201は、ステップS1303の処理をスキップする。
以上の繰返し処理の後、ステップS1305の判定がYesになると、CPU201は、図13のフローチャートで示される図11のステップS1211の空きセグメント数調査ルーチンの処理を終了する。この結果、RAM203上の変数Rに、波形メモリ206上での空きセグメントの数が得られる。
図14は、図12のステップS1213の波形領域開放ルーチンの詳細例を示すフローチャートである。前述したようにこのルーチンでは、波形メモリ206上で最も古い履歴番号を有する音色のセグメントが開放される。
CPU201はまず、セグメントをカウントするためのRAM203上の変数sを0にリセットすると共に、比較用の履歴番号を格納するRAM203上の変数tに十分大きな値、例えばFFFFFFFFH(末尾の「H」はその左側が16進数であることを示す)をセットする(ステップS1401)。
次に、CPU201は、ステップS1405で変数sの値を+1ずつインクリメントしながら、ステップS1406で変数sの値が64に達したと判定するまで、変数sの値によって指定されるセグメントごとに、ステップS1402からS1404の一連の処理を繰り返し実行する。
上述の繰返し処理において、CPU201はまず、変数sの値に対応するセグメントに割り当てられている音色番号が格納されている変数SEG_INF[s].TONEの値が、そのセグメントが空状態(未使用)であることを示す値「−1」に等しいか否かを判定する(ステップS1402)。
ステップS1402の判定がYesならば、CPU201は、ステップS1405に移行して、次のセグメントの繰返し処理に移る。
ステップS1402の判定がNoならば、CPU201は、変数sの値に対応するセグメントが使用された履歴番号を示す変数SEG_INF[s].TIMESTAMPの値が、比較用の履歴番号を格納するRAM203上の変数tの値よりも小さいか否かを判定する(ステップS1403)。
ステップS1403の判定がYesならば、CPU201は、比較用の履歴番号を格納するRAM203上の変数tに、変数sの値に対応するセグメントが使用された履歴番号を示す変数SEG_INF[s].TIMESTAMPの値を格納する(ステップS1404)。この結果、現時点で、変数sの値に対応するセグメントが音色指定により使用された履歴番号が、最も古い履歴番号として変数tに保持される。
ステップS1403の判定がNoならば、CPU201は、ステップS1404の処理はスキップして、現在の変数tの値を維持する。
以上の繰返し処理の結果、全てのセグメントの履歴番号との比較が完了してステップS1406の判定がYesになると、変数tに最も小さい即ち最も古い履歴番号が得られる。
次に、CPU201は、ステップS1407でセグメントをカウントするための変数sの値を0にリセットした後、ステップS1410で変数sの値を+1ずつインクリメントしながら、ステップS1411で変数sの値が64に達したと判定するまで、変数sの値によって指定されるセグメントごとに、ステップS1408とS1409の繰返し処理として、変数tに得られた最も古い履歴番号を有するセグメントを開放する処理を実行する。
上述の繰返し処理において、CPU201はまず、変数sの値に対応するセグメントが使用された履歴番号を示す変数SEG_INF[s].TIMESTAMPの値が変数tに格納されている最も古い履歴番号の値に等しいか否かを判定する(ステップS1408)。
ステップS1408の判定がYesならば、CPU201は、変数sの値に対応するセグメントに割り当てられている音色番号が格納されている変数SEG_INF[s].TONEに、そのセグメントが空状態(未使用)であることを示す値「−1」を格納する(ステップS1409)。これにより、そのセグメントが開放される。
ステップS1408の判定がNoならば、CPU201は、ステップS1409の判定をスキップして、変数sの値に対応するセグメントは開放しない。
以上の繰返し処理の結果、ステップS1411の判定がYesになると、CPU201は、図14のフローチャートで示される図12ステップS1213の波形領域開放ルーチンを終了する。この結果、最も古い履歴番号を有する1つ以上のセグメントが開放される。
図15は、図11のステップS1107の波形読込み指示ルーチンの詳細例を示すフローチャートである。前述したようにこのルーチンでは、指定された音色番号に対応する音色の波形データを、図9のステップS905の波形読込み処理によって大容量フラッシュメモリ204から波形メモリ206に転送するための準備処理が実行される。この準備処理は、大容量フラッシュメモリ204から波形データが転送される波形メモリ206上の空きセグメントに対応するRAM203上のSEG_INF構造体を構成する各メンバ変数(図8参照)に必要な情報をセットし、また転送を制御するRAM203上の変数READING_WAVEが示す波形番号を初期値0にセットする処理である。
CPU201はまず、転送される波形データのセグメントグループをカウントするためのRAM203上の変数gの値と、転送される波形データの新たに指定される音色中での波形番号をカウントするためのRAM203の変数wの値と、波形メモリ206上でのセグメントをカウントするためのRAM203上の変数sの値を、それぞれ0にリセットする(ステップS1501)。
次に、CPU201は、ステップS1511で変数sの値を+1ずつインクリメントしながら、ステップS1512で変数sの値が64に達したと判定するまで、変数sの値によって指定されるセグメントごとに、ステップS1502からS1510の一連の処理を繰り返し実行する。
上述の繰返し処理において、CPU201はまず、変数sの値に対応するセグメントに割り当てられている音色番号が格納されている変数SEG_INF[s].TONEの値が、そのセグメントが空状態(未使用)であることを示す値「−1」に等しいか否かを判定する(ステップS1502)。
ステップS1502の判定がYesならば、そのセグメントは空きセグメントではないため、CPU201は、ステップS1511に移行して、次のセグメントの繰返し処理に移る。
ステップS1502の判定がNoならば、CPU201は、変数sの値に対応する空きセグメントに対応して音色番号を保持するRAM203上の変数SEG_INF[s].TONEに、引数として引き渡されたRAM203上の変数Tに格納されている新たに指定された音色番号の値を格納する。また、CPU201は、変数sの値に対応する空きセグメントに対応してセグメントが使用された履歴番号を保持する変数SEG_INF[s].TIMESTAMPに、今回の音色選択イベントに基づいてインクリメントされたRAM203上の変数TIMESTAMPの値(図11のステップS1102参照)を格納して、当該セグメントの履歴番号を更新する。更に、CPU201は、変数sの値に対応する空きセグメントに対応する音色のセグメントグループ値を格納する変数SEG_INF[s].SEG_GROUPに、変数gに格納されている現在転送を行っている波形データのセグメントグループ値を格納する(以上、ステップS1503)。
その後、CPU201は、変数sの値に対応する現在のセグメントに転送される波形データをカウントするRAM203上の変数iの値を0にリセットする(ステップS1504)。
次に、CPU201は、ステップS1506で、変数sの値に対応する現在のセグメントに転送される波形データをカウントする変数iの値と、転送される波形データの新たに指定される音色中での波形番号をカウントするための変数wの値を、それぞれ+1ずつインクリメントしながら、ステップS1507及びS1508によりセグメントグループが変化したと判定されるまで、ステップS1505の処理を繰返し実行する。即ち、ステップS15005において、CPU201はまず、変数sの値に対応する現在のセグメント中のi番目(=変数iの値)の波形データに対応する、波形データが読込み済みであるか否かを示す変数SEG_INF[s].WAVE_INF[i].WAVEに、まだ波形が読み込まれていないことを示す値0をセットする。次に、CPU201は、変数sの値に対応する現在のセグメント中のi番目の波形データに対応する、指定された音色中の波形番号を示す変数SEG_INF[s].WAVE_INF[i].WAVE_NUMに、RAM203上の変数wが示す現在転送中の波形データの指定された音色中の波形番号をセットする。続いて、CPU201は、変数sの値に対応する現在のセグメント中のi番目の波形データに対応する、当該セグメント中での当該波形データのアドレスオフセットを格納する変数SEG_INF[s].WAVE_INF[i].SEG_ADRSに、このセグメントに転送される音色番号T(=変数Tの値)の音色中のw番目(=変数wの値)の波形データに対応する、ROM202中の定数TONE_INF[T].WAVE[w].SEG_ADRS(図7参照)のアドレスオフセット値をセットする。更に、CPU201は、変数sの値に対応する現在のセグメント中のi番目の波形データのサイズを格納する変数SEG_INF[s].WAVE_INF[i].SIZEに、このセグメントに転送される音色番号T(=変数Tの値)の音色中のw番目(=変数wの値)の波形データに対応する、ROM202中の定数TONE_INF[T].WAVE[w].SIZE(図7参照)のサイズ値をセットする(以上、ステップS1505)。
上記ステップS1505のセット処理の後、CPU201は、変数sの値に対応する現在のセグメントに転送される波形データをカウントする変数iの値と、転送される波形データの新たに指定される音色中での波形番号をカウントするための変数wの値を、それぞれ+1ずつインクリメントする(ステップS1506)。
その後、CPU201は、このセグメントに転送される音色番号T(=変数Tの値)の音色中の新たに指定されたw番目(=変数wの値)の波形データに対応する、ROM202中の定数TONE_INF[T].WAVE[w].SEG_GROUPのセグメントグループ値をRAM203上の変数aにセットする。また、CPU201は、このセグメントに転送される音色番号T(=変数Tの値)の音色中の1つ前のw−1番目(=変数wの値−1)の波形データに対応する、ROM202中の定数TONE_INF[T].WAVE[w−1].SEG_GROUPのセグメントグループ値をRAM203上の変数bにセットする(以上、ステップS1507)。
そして、CPU201は、変数aが示す新たに指定された音色中のw番目の波形データのセグメントグループの値が、変数bが示す1つ前のw−1番目の波形データのセグメントグループの値と等しいか否かを判定する(ステップS1508)。
ステップS1508の判定がYesならば、同じセグメントに更に波形データを転送できるため、ステップS1505の処理に戻って新たな波形データに対応するセット処理を続行する。
ステップS1508の判定がNoならば、CPU201は、変数gに格納されているセグメントグループの値を+1インクリメントする(ステップS1509)。
その後、CPU201は、変数gの値が、音色番号T(=変数Tの値)に対応する定数TONE_INF[T].NUM_SEGの使用セグメント数の値に達したか否かを判定する(ステップS1510)。
ステップS1510の判定がNoならば、CPU201は、ステップS1511の処理に移行し、次の空きセグメントに対する転送処理を続行する。
ステップS1510の判定がYesになると、指定された音色番号T(=変数Tの値)に対応する全ての使用セグメント数分の波形データの転送処理が完了したため、CPU201は、現在転送中の波形番号を示すRAM203上の変数READING_WAVEに、初期値0にセットする(ステップS1513)。その後、CPU201は、図15のフローチャートで示される図11のステップS1107の波形読込み指示ルーチンの処理を終了する。
図16は、図9のステップS905の波形読込み処理の詳細例を示すフローチャートである。前述したようにここでは、CPU201は、図2の大容量フラッシュメモリ204から波形メモリ206へのバックグラウンド処理による波形転送が実行される。
CPU201はまず、RAM203上の変数READING_WAVEの値が、全て読込み済みであることを示す値「−1」であるか否かを判定する(ステップS1601)。
ステップS1601の判定がYesならば、波形読込み処理を実行する必要はないため、CPU201は、図16のフローチャートで示される図9のステップS905の波形読込み処理をそのまま終了する。
ステップS1601の判定がNoならば、CPU201は、変数READING_WAVEが示す指定された音色中で次に転送されるべき波形番号の値を、RAM203上の現在転送中の音色中の波形番号を示す変数wに格納する(ステップS1602)。
次に、CPU201は、セグメントをカウントするRAM203上の変数sの値を、ステップS1603で0にリセットした後、ステップS1605で+1ずつインクリメントしながら、ステップS1604の判定による探索処理を実行する。ステップS1604で、CPU201は、変数sに対応するセグメントが割り当てられている音色番号を示す変数SEG_INF[s].TONEの値が、RAM203上の変数CUR_TONEに格納されている現在演奏のために選択されている音色番号(図11のステップS1103参照)に等しく、かつ、変数SEG_INF[s].SEG_GROUPにセットされている変数sに対応するセグメントが割り当てられているセグメントグループの値が、ROM202上の定数TONE_INF[CUR_TONE].WAVE[w].SEG_GROUPに格納されている変数CUR_TONEに対応する音色の変数wが示す現在転送中の音色中の波形番号に対応する波形データのセグメントグループの値に等しいか否かを判定する。
前述した波形読込み指示ルーチン内のステップS1503の処理が予め実行されていることにより、ステップS1604とステップS1605の繰返し処理においてステップS1604の判定は必ずYesになる。CPU201は、ステップS1604の判定がYesになると、変数sの値が示すセグメント内の波形データの順番をカウントするRAM203上の変数iの値を、ステップS1606で0にリセットした後、ステップS1608で+1ずつインクリメントしながら、ステップS1607の判定による探索処理を実行する。ステップS1607で、CPU201は、変数SEG_INF[s].WAVE_INF[i].WAVE_NUMに格納されている、変数sの値が示すセグメント内のi番目(=変数iの値)の波形データの指定された音色中の波形番号が、変数wが示す現在転送中の波形データの指定された音色中の波形番号と等しいか否かを判定する。
前述した波形読込み指示ルーチン内のステップS1505の処理が予め実行されていることにより、ステップS1607とステップS1608の繰返し処理においてステップS1607の判定は必ずYesになる。ステップS1607の判定がYesになると、CPU201は、大容量フラッシュメモリ204中の変数CUR_TONEの値が示す音色中の変数wの値が示す波形番号の波形データを、波形メモリ206中の変数sの値が示すセグメント内のi番目(=変数iが示す値)の波形データとして転送する波形転送ルーチンを実行する(ステップS1609)。このとき、CPU201は、引数として、RAM203上の変数FA、SA、L、及びSをそれぞれセットする。CPU201は、変数FAには、転送される波形データの転送元の大容量フラッシュメモリ204上のアドレスとして、変数CUR_TONEと変数wとで参照されるROM202上の定数TONE_INF[CUR_TONE].WAVE[w].SEG_ADRSの値をセットする。また、CPU201は、変数SAには、波形データが転送される転送先の波形メモリ206中のアドレスオフセットとして、変数sと変数iとで参照されるRAM203上の変数SEG_INF[s].WAVE_INF[i].SEG_ADRSの値をセットする。さらに、CPU201は、変数Lには、転送される波形データのサイズとして、変数sと変数iとで参照されるRAM203上の変数SEG_INF[s].WAVE_INF[i].SIZEの値をセットする。そして、CPU201は、変数Sには、変数sの値をセットする。波形転送ルーチンの詳細については、後述する。
ステップS1609の波形転送ルーチンの処理の後、CPU201は、変数sの値に対応する現在のセグメント中のi番目(=変数iの値)の波形データに対応する、波形データが読込み済みであるか否かを示す変数SEG_INF[s].WAVE_INF[i].WAVEに、波形が読み込まれたことを示す値1をセットする(ステップS1610)。
更に、CPU201は、音色中で次に転送されるべき波形番号の値を示す変数READING_WAVEの値を+1インクリメントする(ステップS1611)。
その後、CPU201は、変数CUR_TONEが示す音色中の変数wが示す波形番号の波形データに対応する定数TONE_INF[CUR_TONE].WAVE[w].SEG_GROUPのセグメントグループの値が、変数CUR_TONEが示す音色に対応する定数TONE_INF[CUR_TONE].NUM_SEGに格納された使用セグメント数に達したか否かを判定する(ステップS1612)。
ステップS1612の判定がNoならば、CPU201は、変数READING_WAVEの値をステップS1611でインクリメントされた値に維持して、図16のフローチャートで示される図9のステップS905の波形読込み処理を終了する。この結果、次に、ステップS905の波形読込み処理が実行されるタイミングで、変数READING_WAVEの新たな値に対する波形番号の波形データの転送が実行される。
一方、ステップS1612の判定がNoになったならば、新たに指定された音色の波形データの全ての転送が完了したため、CPU201は、変数READING_WAVEに、全て読込み済みであることを示す値「−1」を格納する。その後、CPU201は、図16のフローチャートで示される図9のステップS905の波形読込み処理を終了する。
図17は、図16のステップS1609の波形転送ルーチンの詳細例を示すフローチャートである。
まず、CPU201は、大容量フラッシュメモリ204の読出しアドレスを指定するRAM203上の変数rp(リードポインタ)に、図16のステップS1609の開始時にRAM203上の変数FAとして引き渡された転送される波形データの転送元の大容量フラッシュメモリ204上のアドレスをセットする(ステップS1701)。
次に、CPU201は、波形メモリ206への書込みアドレスを指定するRAM203上の変数wp(ライトポインタ)に、図16のステップS1609の開始時にRAM203上の変数S及びSAとしてそれぞれ引き渡されたセグメント番号及びセグメント内アドレスに基づいて、次式により計算される内容をセットする(ステップS1702)。
wp=100000H×S+SA
この式において、1セグメントのサイズは前述したように例えば100000Hバイトであるため、変数Sが示すセグメント番号のセグメントの先頭のバイトアドレスは、波形メモリ206上において、100000H×Sとなる。更に、今回の波形データが転送されるアドレスは、このアドレスに、変数SAとして引き渡されるセグメント内アドレスだけオフセットしたアドレスとなる。
その後、CPU201は、転送されるバイトデータ数を指定するRAM203上の変数cの値を、ステップS1703で0にリセットした後、ステップS1706で1サンプルずつインクリメントしながら、ステップS1707でRAM203上の変数Lとして引き渡されるデータサイズに達したと判定されるまで、ステップS1704とS1705の処理を繰返し実行する。
まず、CPU201は、大容量フラッシュメモリ204上の、変数rpの値と変数cの値を加算して得たアドレスから、波形データのサンプル(バイト値)を読み出してRAM203上の変数aにセットする(ステップS1704)。
そして、CPU201は、波形メモリ206上の、変数wpの値と変数cの値を加算して得たアドレスに、変数aに格納されているデータを書き込む(ステップS1705)。
以上の繰返し処理の結果、ステップS1707の判定がYesになると、CPU201は、図17のフローチャートで示される図16のステップS1609の波形転送ルーチンの処理を終了する。
図18は、図9のステップS908の押鍵処理の詳細例を示すフローチャートである。
まずCPU201は、RAM203上の変数CUR_TONEに音色が選択されていないことを示す無効値「−1」が格納されているか否かを判定する(ステップ1801)。
ステップS1801の判定がYesならば、CPU201は、図18のフローチャートで示される図9のステップS908の押鍵処理を終了し、発音処理を実行しない。
ステップS1801の判定がNoならば、CPU201は、RAM203上の変数READING_WAVEの値が波形転送を完了した事を示す値「−1」になっているか否かを判定する(ステップS1802)。
ステップS1802の判定がNoならば、CPU201は、図18のフローチャートで示される図9のステップS908の押鍵処理を終了し、発音処理を実行しない。即ち、CPU201は、波形転送が完了して変数READING_WAVEの値が「−1」になるまで、発音処理を実行しない。
ステップS1802の判定がYesならば、CPU201は、スプリット波形検索ルーチンを実行する(ステップS1803)。この場合、CPU201は、引数として、図9のステップS902で取得しているキー番号とベロシティをそれぞれ、RAM203上の変数K及びVに格納する。このルーチンの処理により、例えば図6のスプリットエリア内の1つが判別され、RAM203上の変数TWに、現在の音色内の波形番号が戻り値として得られる。なお、変数TWの戻り値として「−1」がセットされている場合は、該当するスプリットエリアが無い場合である。
次に、CPU201は、変数TWの戻り値が「−1」であるか否かを判定する(ステップS1804)。
ステップS1804の判定がYesならば、CPU201は、図18のフローチャートで示される図9のステップS908の押鍵処理を終了し、発音処理を実行しない。
ステップS1804の判定がNoならば、CPU201は、セグメント内波形検索ルーチンを実行する(ステップS1805)。このとき、CPU201は、引数として、変数TWに格納されている音色内の波形番号を引き渡す。このルーチンの処理により、RAM203上の変数Sに、セグメント番号が戻り値として得られる。この変数Sの戻り値が64の場合は該当する波形データが存在しない場合である。また、RAM203上の変数SWに、セグメント内の波形番号が戻り値として得られる。
ステップS1805のセグメント内波形検索ルーチンの処理の後、CPU201は、変数Sの戻り値が64であるか否かを判定する(ステップS1806)。
ステップS1806の判定がYesならば、CPU201は、図18のフローチャートで示される図9のステップS908の押鍵処理を終了し、発音処理を実行しない。
ステップS1806の判定がNoならば、CPU201は、音源LSI205に通知する波形データのアドレスとして、RAM203上の変数aに、次式により計算されるアドレスをセットする(ステップS1807)。
a=S×10000H
+SEG_INF[S].WAVE_INF[SW].SEG_ADRS
図17のステップS1702の場合と同様に、変数Sが示すセグメント番号のセグメントの先頭のバイトアドレスは、波形メモリ206上において、100000H×Sとなる。この値に、定数SEG_INF[S].WAVE_INF[SW].SEG_ADRSに格納されている変数Sが示すセグメントの変数SWが示す波形番号の波形データのセグメント内オフセットアドレスの値を加算した値が、音源LSI205が読み出すべき波形メモリ206中の先頭アドレスとなる。
その後、CPU201は、音源LSI205に対して発音ルーチンを実行する(ステップS1808)。このとき、CPU201は、変数Kに格納されたキー番号と、変数Vに格納されたベロシティと、変数aに格納されたアドレス値を、引数として音源LSI205に引き渡す。また、CPU201は、その他波形情報として、定数TONE_INF[CUR_TONE].WAVE[SW].TG_INFによって示されるパラメータ群(図7参照)を、引数として音源LSI205に引き渡す。音源LSI205の処理は、既存の処理であるためその詳細については省略するが、上記引数に基づいて、波形メモリ206から波形データを読み出して発音処理を実行する。
図19は、図18のステップS1803のスプリット波形検索ルーチンの詳細例を示すフローチャートである。
CPU201は、音色内の波形番号を示すRAM203上の変数wの値を、ステップS1901で0にリセットした後、ステップS1906で+1ずつインクリメントしながら、ステップS1907で64に達したと判定されるまで、ステップS1902からS1905の一連の判定処理を繰返し実行する。
上述の繰返し処理において、CPU201はまず、変数Vとして引き渡されたベロシティが、変数CUR_TONEと変数wとで参照されるROM202上の定数TONE_INF[CUR_TONE].WAVE[w].VEL_LOによる最低ベロシティ値以上であるか否かを判定する(ステップS1902)。
ステップS1902の判定がNoならば、ステップS1906の処理に移行して次の波形番号の処理に移る。
ステップS1902の判定がYesならば、次にCPU201は、変数Vとして引き渡されたベロシティが、変数CUR_TONEと変数wとで参照されるROM202上の定数TONE_INF[CUR_TONE].WAVE[w].VEL_HIによる最高ベロシティ値以下であるか否かを判定する(ステップS1903)。
ステップS1903の判定がNoならば、ステップS1906の処理に移行して次の波形番号の処理に移る。
ステップS1903の判定がYesならば、次にCPU201は、変数Kとして引き渡されたキー番号が、変数CUR_TONEと変数wとで参照されるROM202上の定数TONE_INF[CUR_TONE].WAVE[w].KEY_LOによる最低キー番号以上であるか否かを判定する(ステップS1904)。
ステップS1903の判定がNoならば、ステップS1906の処理に移行して次の波形番号の処理に移る。
ステップS1904の判定がYesならば、次にCPU201は、変数Kとして引き渡されたキー番号が、変数CUR_TONEと変数wとで参照されるROM202上の定数TONE_INF[CUR_TONE].WAVE[w].KEY_HIによる最高キー番号以下であるか否かを判定する(ステップS1905)。
ステップS1904の判定がNoならば、ステップS1906の処理に移行して次の波形番号の処理に移る。
ステップS1905の判定がYesならば、CPU201は、変数wの値を、音色内波形番号の戻り値として変数TWにセットする。その後、CPU201は、図19のフローチャートで示される図18のステップS1803のスプリット波形検索ルーチンを終了する。
ステップS1905の判定がNoならば、ステップS1906の処理に移行して次の波形番号の処理に移る。
ステップS1902からS1907の繰返し処理の結果、ステップS1907の判定がYesになると、CPU201は、変数TWに、該当無しを示す値「−1」をセットする。その後、CPU201は、図19のフローチャートで示される図18のステップS1803のスプリット波形検索ルーチンを終了する。
図20は、図18のステップS1805のセグメント内波形検索ルーチンの詳細例を示すフローチャートである。
CPU201は、セグメントをカウントするRAM203上の変数sの値を、ステップS2001で0にリセットした後、ステップS2009で+1ずつインクリメントしながら、ステップS2010で64に達したと判定されるまで、ステップS2002からS2008の一連の処理を繰返し実行する。
上述の繰返し処理において、CPU201はまず、RAM203上の変数SEG_INF[S].TONE(図8参照)の値として変数Sの値に対応するセグメントに設定されている音色番号が、RAM203上の変数CUR_TONE(図8参照)の値として現在選択されている音色番号に等しいか否かを判定する(ステップS2002)。
ステップS2002の判定がNoならば、CPU201は、ステップS2009の処理に移行して次のセグメンに対する処理に移る。
ステップS2002の判定がYesならば、CPU201は、セグメント内の波形番号を保持するRAM203上の変数SWの値を、ステップS2003で0にリセットした後、ステップS2007で+1ずつインクリメントしながら、ステップS2008で64に達したと判定されるまで、ステップS2004からS2007の一連の処理を繰返し実行する。
上述の繰返し処理において、CPU201はまず、変数S及び変数SWに基づいて変数SEG_INF[S].WAVE_INF[SW].WAVE_NUMの値として参照される変数Sの値に対応するセグメント内のSW番目(=変数SWの値)の波形データの音色内での波形番号を、RAM203上の変数wに格納する(ステップS2004)。
次に、CPU201は、変数wの値が、引数として引き渡されたRAM203上の変数TWが示す音色内の波形番号に等しいか否かを判定する(ステップS2005)。
ステップS2005の判定がNoならば、変数TWの値が「−1」であるか否かを判定する(ステップS2006)。
ステップS2006の判定がNoならば、CPU201は、ステップS2007に移行して、次のセグメント内波形番号の波形データに対する処理に移る。
ステップS2006の判定がYesならば、CPU201は、ステップS2009に移行して、次のセグメントに対する処理に移る。
上述の繰返し処理において、ステップS2005の判定がYesになると、CPU201は、そのときの変数Sの値と変数SWの値をそれぞれ、セグメントの戻り値及びセグメント内波形番号の戻り値としてセットし、図20のフローチャートで示される図18のステップS1805のセグメント内波形検索ルーチンの処理を終了する。
上述の繰返し処理において、ステップS2010の判定がYesになると、CPU201は、変数Sの戻り値が該当無しを示す値にセットして、図20のフローチャートで示される図18のステップS1805のセグメント内波形検索ルーチンの処理を終了する。
以上説明した実施形態により、波形メモリ上に波形が存在しない音色が選択されて新たな音色波形データを波形メモリに読み込む際に、セグメントが同じ使用数の音色を開放すれば、確実に新しい波形を読み込むことが可能となる。例えば、3セグメント使用している音色波形を選択した際には、3セグメント以上使用している音色に上書きを行えば良い。
これにより読み込みたい波形の容量よりもはるかに大きな空きエリアがありながら読み込めないという非効率な状態を回避できるので、演奏に支障をあたえるような時間のかかるガベージコレクションなどのメモリ整理をする必要から開放される。
また、波形メモリ上に読み込まれた音色の組み合わせが同じであるなら、選択された音色の波形を読み込むための条件、例えばその状態で読み込める、ある音色を上書きすれば読み込める等は、過去に波形を読み込んだ順序に関係なく予想ができるので、管理がし易い電子楽器を実現することが可能となる。
以上の実施形態に関して、更に以下の付記を開示する。
(付記1)
複数のグループに分割された複数の波形データを有する音色波形データを複数種記憶した一次記憶装置から、前記複数種の音色波形データのいずれかを指定する指定処理と、
夫々が予め定められたサイズの記憶領域からなる複数のセグメントを有し、前記セグメントのそれぞれに前記波形データが記憶可能な二次記憶装置に、前記指定された音色波形データが記憶されているか否かを判別する判別処理と、
前記指定された音色波形データが記憶されていないと判別された場合に、前記指定された音色波形データ内の複数のグループの数に対応する数のセグメントを前記二次記憶装置内で確保するセグメント確保処理と、
前記確保された数のセグメントの領域に、前記一次記憶装置に記憶されている前記指定された音色波形データを読み込む読込み処理と、
を実行する処理部を備えた波形読込み装置。
(付記2)
前記音色波形データ内のグループそれぞれに含まれる波形データのサイズは、前記二次記憶装置の前記各セグメントのサイズを越えない、付記1記載の波形読込み装置。
(付記3)
前記処理装置はさらに、前記二次記憶装置が有する複数のセグメントのうち、空きのセグメントの数を取得する取得処理を実行し、
前記セグメント確保処理は、前記取得された空きのセグメント数が前記指定された音色波形データのグループ数と同じあるいはそれ以上の場合は、前記指定された音色波形データのグループ数と同じ数の空きのセグメントを確保し、前記取得された空きのセグメント数が前記指定された音色波形データのグループ数より少ない場合は、前記空きのセグメントと、前記空いていないセグメントの中で予め定められた条件を満たすセグメントとを確保する処理を実行する、付記1又は2記載の波形読込み装置。
(付記4)
前記予め定められた条件を満たすセグメントは、前記二次記憶装置に記憶されている音色波形データのうち、記憶されている期間が最も長い音色波形データを記憶しているセグメントである、付記1乃至3の何れかに記載の波形読込み装置。
(付記5)
前記一次記憶装置は、フラッシュメモリを備え、二次記憶装置は、一次記憶装置より容量の小さいランダムアクセスメモリを備えた、付記1乃至4のいずれかに記載の波形読込み装置。
(付記6)
波形読込み装置に用いられる波形読込み方法であって、前記波形読込み装置が、
複数のグループに分割された複数の波形データを有する音色波形データを複数種記憶した一次記憶装置から、前記複数種の音色波形データのいずれかを指定し、
夫々が予め定められたサイズの記憶領域からなる複数のセグメントを有し、前記セグメントのそれぞれに前記波形データが記憶可能な二次記憶装置に、前記指定された音色波形データが記憶されているか否かを判別し、
前記指定された音色波形データが記憶されていないと判別された場合に、前記指定された音色波形データ内の複数のグループの数に対応する数のセグメントを前記二次記憶装置内で確保し、
前記確保された数のセグメントの領域に、前記一次記憶装置に記憶されている前記指定された音色波形データを読み込む、波形読み込み方法。
(付記7)
波形読込み装置として用いられるコンピュータに、
複数のグループに分割された複数の波形データを有する音色波形データを複数種記憶した一次記憶装置から、前記複数種の音色波形データのいずれかを指定する指定ステップと、
夫々が予め定められたサイズの記憶領域からなる複数のセグメントを有し、前記セグメントのそれぞれに前記波形データが記憶可能な二次記憶装置に、前記指定された音色波形データが記憶されているか否かを判別する判別ステップと、
前記指定された音色波形データが記憶されていないと判別された場合に、前記指定された音色波形データ内の複数のグループの数に対応する数のセグメントを前記二次記憶装置内で確保するセグメント確保ステップと、
前記確保された数のセグメントの領域に、前記一次記憶装置に記憶されている前記指定された音色波形データを読み込む読込みステップと、
を実行させるプログラム。
(付記8)
付記1に記載の波形読込み装置と、
前記一次記憶装置と、
前記二次記憶装置と、
演奏情報を供給する演奏操作子と、
音色を指定する音色指定操作子と、
前記演奏情報の供給に応答して、前記演奏情報と前記指定された音色とに基づいて、前記一次記憶装置から読み出された前記波形データに対応する楽音を生成する音源と、
を備えた電子楽器。
(付記9)
前記音色波形データ内のグループそれぞれに含まれる波形データのサイズは、前記二次記憶装置の前記各セグメントのサイズを越えない、付記8に記載の電子楽器。