米国特許情報 | 欧州特許情報 | 国際公開(PCT)情報 | Google の米国特許検索
 
     特許分類
A 農業
B 衣類
C 家具
D 医学
E スポ−ツ;娯楽
F 加工処理操作
G 机上付属具
H 装飾
I 車両
J 包装;運搬
L 化学;冶金
M 繊維;紙;印刷
N 固定構造物
O 機械工学
P 武器
Q 照明
R 測定; 光学
S 写真;映画
T 計算機;電気通信
U 核技術
V 電気素子
W 発電
X 楽器;音響


  ホーム -> 楽器;音響 -> カシオ計算機株式会社

発明の名称 楽音発生装置、及びプログラム
発行国 日本国特許庁(JP)
公報種別 公開特許公報(A)
公開番号 特開2007−47293(P2007−47293A)
公開日 平成19年2月22日(2007.2.22)
出願番号 特願2005−229652(P2005−229652)
出願日 平成17年8月8日(2005.8.8)
代理人 【識別番号】100074099
【弁理士】
【氏名又は名称】大菅 義之
発明者 副島 淳一郎
要約 課題
半導体メモリの専有率を抑えつつ、ピッチ毎に用意された波形データを用いて楽音を発音できる楽音発生装置を提供する。

解決手段
ROM13には、楽音の波高値の時間変化を示す波形データがピッチ毎に格納されている。その波形データは、先頭波形データ、中間波形データ、最終波形データの3つの部分波形データに分割して用意されている。CPU11は、ピッチ毎の先頭波形データをRAM12に予め保存し、それ以外の部分波形データは、電子楽器20から入力したMIDIデータにより発音開始が指示された楽音の発音用のものに限定する。それにより、波形データがRAM12に占める割合を抑えつつ、ピッチ毎に用意された波形データを用いて楽音を発音させる。その発音は、波形データから生成したオーディオデータ(波高値)を音源システムに出力することで行われる。
特許請求の範囲
【請求項1】
楽音の波高値の時間変化を表す波形データを用いて発音させるべき楽音の波高値を順次、生成して該楽音を発音させる楽音発生装置において、
前記波形データを取得できるデータ取得手段と、
前記データ取得手段が取得した波形データを記憶する記憶手段と、
前記発音させるべき楽音の波高値の生成に該楽音のピッチ毎で異なる波形データを用いる場合に、該波形データを分割して得られる複数の部分波形データのなかで先頭に位置する第1の部分波形データを該波形データ毎に前記データ取得手段に取得させて予め前記記憶手段に記憶させ、該第1の部分波形データに続く部分波形データである第2の部分波形データは随時、該データ取得手段に取得させて該記憶手段に記憶させるデータ管理手段と、
を具備することを特徴とする楽音発生装置。
【請求項2】
前記データ管理手段は、前記発音させるべき楽音の波高値の生成に必要な前記第2の部分波形データを随時、前記データ取得手段に取得させて前記記憶手段に記憶させる、
ことを特徴とする請求項1記載の楽音発生装置。
【請求項3】
前記データ管理手段は、前記発音させるべき楽音のピッチを基に、該ピッチ近傍のピッチに対応する波形データの第2の部分波形データを前記データ取得手段に事前に取得させて前記記憶手段に記憶させる、
ことを特徴とする請求項2記載の楽音発生装置。
【請求項4】
前記ピッチ毎で異なる波形データが前記楽音を発音させる強さを示すベロシティ値に応じて複数、用意されている場合、前記データ管理手段は、前記第1の部分波形データを該波形データ毎に前記データ取得手段に取得させて予め前記記憶手段に記憶させ、前記第2の部分波形データは、前記発音させるべき楽音に対して指定されたベロシティ値に応じて該データ取得手段に随時、取得させて該記憶手段に記憶させる、
ことを特徴とする請求項1記載の楽音発生装置。
【請求項5】
楽音の波高値の時間変化を表す波形データを用いて発音させるべき楽音の波高値を順次、生成して該楽音を発音させる楽音発生装置に実行させるプログラムであって、
前記波形データを取得できる機能と、
前記取得できる機能により取得した波形データを記憶装置に記憶できる機能と、
前記発音させるべき楽音の波高値の生成に該楽音のピッチ毎で異なる波形データを用いる場合に、該波形データを分割して得られる複数の部分波形データのなかで先頭に位置する第1の部分波形データを該波形データ毎に前記取得できる機能により取得させて予め前記記憶できる機能により前記記憶装置に記憶させ、該第1の部分波形データに続く部分波形データである第2の部分波形データは随時、該取得できる機能により取得させて該記憶装置に該記憶できる機能により記憶させる機能と、
を実現させるためのプログラム。
発明の詳細な説明
【技術分野】
【0001】
本発明は、楽音の波高値の時間変化を表す波形データを用いて発音させるべき楽音の波高値を順次、生成しその楽音を発音させる楽音発生装置に関する。
【背景技術】
【0002】
楽音の発音は通常、予め定めた時間間隔で楽音の波高値を生成することで行われる。生成された波高値をD/A変換し、それによって得られたアナログ信号(オーディオ信号)を音声に変換することにより、その楽音が発音される。
【0003】
そのような波高値の生成を行う方式として、楽音の波高値の時間変化を表す波形データを用いて行うPCM音源方式が知られている(特許文献1〜4)。そのPCM音源方式では一般的に、楽音(波形)を予め定めたサンプリング周期でサンプリングして得られた波形データが用いられる。人工的に作り出した、或いは作り出せる楽音では、その波形データは直接、生成することができる(特許文献1)。
【0004】
大部分の楽音は、発音中に固有の時間変化をする。このため、波形データとしては、楽音の発音中の時間変化を再現できるものが用意されるのが普通である。そのような波形データは、多くのサンプリングデータ(波高値)から構成される。それにより、一部のサンプリングデータを繰り返し読み出すことで発音時間を制御することを想定した波形データ(特許文献3)であっても、そのデータ量は大きいのが実情である。
【0005】
その波形データは通常、楽音のピッチによって変化する。しかし、波形データの大きさから、PCM音源方式を採用した従来の楽音発生装置は、複数の波形データのみを用意し、波形データ毎にそれぞれ異なるピッチ範囲を割り当てていた。それにより、ピッチ範囲内の各ピッチの楽音は同じ波形データを用いて発音させていた。その場合、ピッチの相違は、波形データからサンプリングデータを読み出す速さ(歩進幅)を変化させることで実現される。
【0006】
より高音質の楽音を発音できるようにするには、波形データはピッチ毎に用意すべきと言える。楽音の発音に用いる波形データは、高速な処理を行う必要から、アクセス速度の速い半導体メモリ(記憶装置)に用意しておかなければならない。このため、ピッチ毎に用意した波形データを単に半導体メモリにコピー(展開)すると、半導体メモリに占める波形データの割合(専有率)が高くなってしまうことが考えられる。その割合が高くなると、他の処理のために半導体メモリのなかで利用可能な部分が少なくなるから、その処理を高速に行えないといった不具合が発生しやすくなる。このことから、大容量の半導体メモリが搭載されることも多くはなっているが、ピッチ毎に波形データを用意する場合には、半導体メモリの専有率を抑えることも重要であると考えられる。
【特許文献1】特許第2571559号
【特許文献2】特許第2585519号
【特許文献3】特開昭58−178395号公報
【特許文献4】特開平11−296174号公報
【発明の開示】
【発明が解決しようとする課題】
【0007】
本発明の課題は、半導体メモリの専有率を抑えつつ、ピッチ毎に用意された波形データを用いて楽音を発音できる楽音発生装置を提供することにある。
【課題を解決するための手段】
【0008】
本発明の楽音発生装置は、楽音の波高値の時間変化を表す波形データを用いて発音させるべき楽音の波高値を順次、生成して該楽音を発音させることを前提とし、波形データを取得できるデータ取得手段と、データ取得手段が取得した波形データを記憶する記憶手段と、発音させるべき楽音の波高値の生成に該楽音のピッチ毎で異なる波形データを用いる場合に、該波形データを分割して得られる複数の部分波形データのなかで先頭に位置する第1の部分波形データを該波形データ毎にデータ取得手段に取得させて予め記憶手段に記憶させ、該第1の部分波形データに続く部分波形データである第2の部分波形データは随時、該データ取得手段に取得させて該記憶手段に記憶させるデータ管理手段と、を具備する。
【0009】
なお、上記データ管理手段は、発音させるべき楽音の波高値の生成に必要な第2の部分波形データを随時、データ取得手段に取得させて記憶手段に記憶させる、ことが望ましい。また、発音させるべき楽音のピッチを基に、該ピッチ近傍のピッチに対応する波形データの第2の部分波形データをデータ取得手段に事前に取得させて記憶手段に記憶させる、ことが望ましい。更に、ピッチ毎で異なる波形データが楽音を発音させる強さを示すベロシティ値に応じて複数、用意されている場合、データ管理手段は、第1の部分波形データを該波形データ毎にデータ取得手段に取得させて予め記憶手段に記憶させ、第2の部分波形データは、発音させるべき楽音に対して指定されたベロシティ値に応じて該データ取得手段に随時、取得させて該記憶手段に記憶させる、ことが望ましい。
【0010】
本発明のプログラムは、楽音の波高値の時間変化を表す波形データを用いて発音させるべき楽音の波高値を順次、生成して該楽音を発音させる楽音発生装置に実行させることを前提とし、波形データを取得できる機能と、取得できる機能により取得した波形データを記憶装置に記憶できる機能と、発音させるべき楽音の波高値の生成に該楽音のピッチ毎で異なる波形データを用いる場合に、該波形データを分割して得られる複数の部分波形データのなかで先頭に位置する第1の部分波形データを該波形データ毎に取得できる機能により取得させて予め記憶できる機能により記憶装置に記憶させ、該第1の部分波形データに続く部分波形データである第2の部分波形データは随時、該取得できる機能により取得させて該記憶装置に該記憶できる機能により記憶させる機能と、を実現させる。
【発明の効果】
【0011】
本発明は、ピッチ毎に用意した楽音の波高値の時間変化を表す波形データを用いて、発音させるべき楽音の波高値を生成する場合に、その波形データを分割して得られる複数の部分波形データのなかで先頭に位置する第1の部分波形データを波形データ(ピッチ)毎に半導体メモリ等の記憶装置に記憶させ、その第1の部分波形データに続く部分波形データである第2の部分波形データは状況に応じて随時、動的にその記憶装置に記憶させる。そのため、波形データを全て記憶装置に記憶させる場合と比較して、波形データがその記憶装置に占める専有率を低く抑えることができる。それにより、記憶装置は多くの処理の実行用として、より適切な形で共有化することができる。楽音は、ピッチ毎に用意した波形データを用いて発音させるため、より高音質の楽音を発音できることとなる。
【発明を実施するための最良の形態】
【0012】
以下、本発明の実施の形態について、図面を参照しながら詳細に説明する。
<第1の実施の形態>
図1は、第1の実施の形態による楽音発生装置の構成を説明する図である。
【0013】
その楽音発生装置10は、図1に示すように、装置10全体の制御を行うCPU11と、そのCPU11がワークに用いるRAM12と、CPU11が実行するプログラムや各種制御用データ、及び波形データ等を格納したROM103と、例えばキーボードやポインティングデバイス(マウス等)、CD−ROMやDVD等の記録媒体にアクセスする媒体駆動装置、及びそれらのインターフェース等からなる入力部14と、表示装置に画像を表示させる表示部15と、外部装置との間でMIDIデータを送受信するためのMIDIインターフェース(I/F)16と、発音させる楽音のデジタルデータ(波高値)を外部装置に出力するためのオーディオインターフェース(I/F)17と、を備えた構成となっている。
【0014】
上記MIDI I/F16には、キーボード21、及びそれに対する操作内容を示すMIDIデータを生成して出力するMIDIインターフェース(I/F)22を備えた電子楽器20が接続され、上記オーディオI/F17には、波高値を入力して音声に変換できる音源システム30が接続されている。それにより、本実施の形態による楽音発生装置10は、電子楽器20のMIDI I/F22からMIDIデータを入力して、そのMIDIデータにより発音が指示された楽音の波高値を生成し、それを音源システム30に出力することにより楽音を発音させるようになっている。音源システム30は、例えばD/A変換器、アンプ、及びスピーカを少なくとも備えたものである。
【0015】
その楽音発生装置10は、例えばパーソナルコンピューター(PC)に、楽音発生装置10として動作させるためのアプリケーション・プログラム(以下「アプリケーション」)を搭載させることにより実現させている。そのアプリケーションは、例えば入力部14を構成する媒体駆動装置がアクセス可能な記録媒体に記録して提供するものである。そのアプリケーションは、インターネット等のネットワークを介して配信するようにしても良い。
【0016】
アプリケーションを搭載(インストール)できるように、ROM13としては書き込み可能なメモリ(例えばフラッシュメモリ)が採用されている。そのアプリケーションが記録された記録媒体には、楽音の波高値を生成するための各種波形データが多数、記録されている。その波形データのなかには、ピッチ毎に用意したものが存在する。楽音発生装置10を実現させるPCは、ROM13の他に、或いはその代わりにハードディスク装置等の補助記憶装置を搭載したものであっても良い。そのアプリケーションについては以降「楽音発生アプリケーション」と呼ぶことにする。
【0017】
ピッチ毎に用意した波形データは、ROM13に保存させることができるようになっている。また、必要に応じて、記録媒体からコピーすることもできるようにしている。ここでは説明上、便宜的にROM13に保存されている場合のみを想定する。楽音の発音に用いる波形データとしては、同様にピッチ毎に用意した波形データのみを想定する。
【0018】
ROM13に保存した波形データは、RAM12にコピーして使用している。これは、一般的にRAM12はROM13よりもアクセス速度が速いからである。それにより、より高速に、発音させるべき楽音の波高値を生成できるようにしている。
【0019】
波形データをピッチ毎に用意することにより、それを構成するサンプリングデータ(波高値)は単に順次、読み出せば良いようにしている。それにより、データを読み出す速さ(歩進幅)に応じた補間を行わなくとも良いようにしている。その補間演算を行う必要性を回避させたため、発音させるべき楽音の波高値はより簡単に生成することができる。
【0020】
本実施の形態では、各波形データは3つに分割して、つまり発音開始時に用いる部分の波形データ(第1の部分波形データ。以降「先頭波形データ」と呼ぶ)、その後の発音に用いる部分の波形データ(以降「中間波形データ」と呼ぶ)、及び更にその後の発音に用いる部分の波形データ(以降「最終波形データ」と呼ぶ)に分割して用意している(それらは共に第2の部分発音データに相当)。中間波形データ、及び最終波形データは、そのうちの一方による発音が終了した後、他方による発音を行うものとして用意している。それにより、先頭波形データによる発音が終了した後は、楽音の発音自体が終了するまでの間、中間波形データ→最終波形データ、最終波形データ→中間波形データ、のように交互に発音用の部分波形データの切り換えるようにしている。
【0021】
本実施の形態では、上記先頭波形データは波形データ(ピッチ)毎にRAM12に予めロード(コピー)する。その後は、ユーザーの電子楽器20への演奏操作によって入力するMIDIデータで発音開始が指示された楽音のピッチに対応する中間波形データをロードする。その後は、その楽音の発音を終了させるまでの間、最終波形データ、中間波形データを交互にロードし、それらのうちの一方は不必要になった段階で消去する。このことから、RAM12に保存される先頭波形データ以外の部分波形データは、楽音の発音開始を指示するMIDIデータの入力、発音開始から経過した時間、その消音を指示するMIDIデータの入力等による消音、といった状況に応じて変化することとなる。
【0022】
そのようにして、先頭波形データ以外の部分波形データは、必要なもののみを必要な間だけRAM12に保存させている。このため、RAM12に保存させた波形データがそれに占める割合(専有率)は、各部分波形データを波形データ毎に全て保存させた場合と比較して大幅に小さくさせることができる。それにより、楽音の発音に係わらない処理(上記楽音発生アプリケーション以外のプログラムの実行による処理)における速度の低下はより回避、或いはより抑えることができる。ピッチ毎に用意した波形データを用いて楽音を発音させるため、より高音質の楽音を発音させることができる。
【0023】
上述したような先頭波形データ以外の部分波形データのRAM12への保存を実現するために、本実施の形態では、図2〜図5に示す各種データを管理している。図2〜図5を参照して、それらのデータについて具体的に説明する。
【0024】
図2は、音色データの構成を説明する図である。その音色データは、波形データを音色単位で管理するために音色毎に用意されるデータである。図2に示すように、音色データは、対応するチャンネル番号を示すデータiID、発音中の楽音数を示すデータiNoteOnCnt、対応するピッチデータのなかで先頭ピッチ(例えば最低ピッチ)のピッチデータの格納場所を示すデータpTD、前の音色データの格納場所を示すデータpPrev、及び次の音色データの格納場所を示すデータpNext、を備えている。
【0025】
図3は、ピッチデータの構成を説明する図である。そのピッチデータは、音色毎、ピッチ毎に用意されるデータであり、上記データpTDとしては、対応する音色での先頭ピッチのピッチデータの格納場所を示すデータがそれぞれの音色データに格納される。図3に示すように、ピッチデータは、対応するピッチを示すデータiPitch(ピッチ番号:ノートナンバー)、そのピッチの楽音の状態を示すデータiStatus(0の値は消音中、1の値は発音中、2の値は消音処理中、をそれぞれ表す)、対応するソースデータの格納場所を示すデータpSD、前のピッチデータの格納場所を示すデータpPrev、及び次のピッチデータの格納場所を示すデータpNext、を備えている。
【0026】
図4は、ソースチデータの構成を説明する図である。そのソースデータは、波形データ毎に用意されるデータである。図4に示すように、ソースデータは、対応する波形データのRAM12にコピーされた先頭波形データの先頭アドレスを示すデータpDAta[0]、RAM12にコピーされた中間波形データの先頭アドレスを示すデータpDAta[1]、RAM12にコピーされた最終波形データの先頭アドレスを示すデータpDAta[2]、波形データのファイル名(オリジナルの格納場所)を示すデータfileName、その波形データ全体の長さを示すデータfLength、波高値生成用に参照中の部分波形データ(図中「バッファ」と表記)を示すデータiIndex、波形データが対応するベロシティ範囲の下限値を示すデータminVel、その上限値を示すデータmaxVel、前のピッチデータの格納場所を示すデータpPrev、及び次のピッチデータの格納場所を示すデータpNext、を備えている。
【0027】
図5は、発音データの構成を説明する図である。その発音データは、発音中の波形データ毎に用意されるデータである。図5に示すように、発音データは、識別情報であるデータiID、対応する音色データ(チャンネル)を示すデータiTone(例えば対応する音色データ中のデータiID)、楽音のピッチを示すデータiPitch、そのベロシティを示すデータiOnVel、そのピッチの楽音の状態を示すデータiStatus(0の値は消音中、1の値は発音中、2の値は消音処理中、をそれぞれ表す)、対応するソースデータの格納場所を示すデータpSD、発音開始時刻を示すデータlOnStart、その消音開始時刻を示すデータlOffStart、消音処理中での減衰率を示すデータfRelease、前の発音データの格納場所を示すデータpPrev、及び次のピッチデータの格納場所を示すデータpNext、を備えている。上記データiOnVelは電子楽器20から入力するMIDIデータ中から抽出したベロシティ値である。そのベロシティ値は、周知のように、押鍵時の速さ、つまり楽音を発音させる強さを表している。
【0028】
上記発音データ以外のデータ、つまり音色データ、ピッチデータ、及びソースデータは、例えば楽音発生アプリケーションの実行中、消去させないデータとしている。このことから、RAM12への先頭波形データ以外の部分波形データのロード(コピー)は、状況により、必要に応じて発音データの生成、或いは消去をしながら、存在する発音データを含む各種データを随時、更新していくことで行うようになっている。以降は図6〜図10に示す各種フローチャートを参照して、それらのデータを管理しながら必要な部分波形データをRAM12に保存させる楽音発生装置10の動作について詳細に説明する。
【0029】
図6は、全体処理のフローチャートである。これは、上記楽音発生アプリケーションを起動させてから終了させるまでの間に実行する処理を抜粋してその流れを示したものである。それにより、CPU11が、その楽音発生アプリケーションをROM13からRAM12に読み出して実行することで実現される。始めに図6を参照して、その全体処理について詳細に説明する。
【0030】
先ず、ステップ101では、MIDI I/F16用のドライバをROM13からRAM12にロードして起動させる。続くステップ102では、同様にオーディオI/F17用のドライバをロードして起動させる。以降は、発音させるべき楽音の波高値(オーディオデータ)をオーディオI/F17から出力するためのオーディオデータ出力スレッドを起動させ(ステップ103)、音色定義ファイルとしてROM13に保存されている図2〜図4に示す各種データを読み込んでRAM12に展開し(ステップ104)、波形データ毎にその先頭波形データ(図中「音色データ」と表記)をROM13から読み出してRAM12にロードする(ステップ105)。そのロードにより初期化が終了し、ステップ106に移行して、入力部14、或いはMIDI I/F16によるデータの入力を待つ。ここでは、入力部14を操作してのデータ入力については、楽音発生アプリケーションの終了指示のみを想定する。
【0031】
電子楽器20のキーボード21を構成するキー(鍵)をユーザーが押鍵、或いは離鍵すると、MIDI I/F22はその演奏操作の内容、及びその操作が行われたキーに応じたMIDIデータを生成して楽音発生装置10のMIDI I/F16に出力する。入力部14を構成するキーボード、或いはポインティングデバイスを操作すると、その操作内容が入力部14からCPU11に通知される。それにより、ステップ106からステップ107に移行し、入力が楽音発生アプリケーションの終了コマンドか否か判定する。そのアプリケーションを終了させるための操作をユーザーが入力部14に対して行った場合、判定はYESとなってステップ110に移行する。そうでない場合には、判定はNOとなってステップ108に移行する。
【0032】
ステップ108では、入力がMIDIデータか否か判定する。MIDI I/F16がMIDIデータを入力した場合、判定YESとなり、ステップ109に移行して、その入力に対応するためのMIDI IN処理を実行した後、上記ステップ106に戻る。一方、そうでない場合には、判定はNOとなり、そのステップ106に戻る。
【0033】
上記ステップ107の判定がYESとなって移行するステップ110では、オーディオデータ出力スレッドを終了させる。その終了は、例えばそのスレッド終了管理用の変数に、終了を指示する値を代入することで行う。以降は、RAM12に格納されている図2〜図5に示す各種データを消去し(ステップ111)、オーディオI/F17のドライバを終了(開放)させ(ステップ112)、MIDI I/F16のドライバを終了(開放)させる(ステップ113)。そのようにして各種ドライバやデータをRAM12から消去させた後、一連の処理を終了、つまり楽音発生アプリケーションを終了させる。
【0034】
図7は、上記ステップ109として実行されるMIDI IN処理のフローチャートである。次にそのIN処理について、図7に示すそのフローチャートを参照して詳細に説明する。
【0035】
このIN処理は、MIDI I/F17を介して入力したMIDIデータに対応するための処理である。そのMIDIデータの種類は多数、存在するが、ここでは本発明に特に係わるデータ、つまりノートオンメッセージ、ノートオフメッセージの2種類のMIDIデータのみにのみ注目して説明する。
【0036】
先ず、ステップ201では、入力したMIDIデータが楽音の発音開始を指示するノートオンメッセージか否か判定する。そのMIDIデータがノートオンメッセージでなかった場合、判定はYESとなってステップ206に移行する。そうでない場合には、判定はYESとなってステップ202に移行する。
【0037】
ステップ202では、入力したMIDIデータから、チャンネル番号、ノートナンバー(ピッチ)、及びベロシティ値を抽出し、それぞれ変数ich、iPit、及びiVelに代入する。続くステップ203では、変数ich、iPitの各値で指定されるピッチデータ、つまり新たに楽音の発音開始が指示されたチャンネル、そのピッチから対応するピッチデータを特定してそのインデクス値を変数tdに代入し、その変数tdの値で指定されるピッチデータを更新する。具体的にはデータiStatusの値を1に変更する。対応する音色データ中のデータiNoteOnCntは、その値をインクリメントして更新する。その後、ステップ204に移行する。
【0038】
ステップ204では、発音データの格納用にRAM12に確保した領域中から、発音データが格納されていない場所(位置)を特定し、その場所を示すインデクス値を変数ndに代入する。次に移行するステップ205では、変数ndの値で指定される場所に発音データを格納する。具体的には、データiTone(図中「nd.iTone」と表記)として変数ichの値、データiPitch(図中「nd.iPitch」と表記)として変数iPitの値、データiOnVel(図中「nd.iOnVel」と表記)として変数iVelの値、データiStatus(図中「nd.iStatus」と表記)として1、データpSD(図中「nd.pSD」と表記)として対応するピッチデータのデータpSD(図中「td.pSD」と表記)、データlOnStart(図中「nd.lOnStart」と表記)として現在時刻を示す値、をそれぞれ格納する。その後、一連の処理を終了する。
【0039】
このようにして、ノートオンメッセージのMIDIデータの入力により、そのMIDIデータから特定される音色データ、ピッチデータが更新され、発音データが新たに生成される。
【0040】
上記ステップ201の判定がNOとなって移行するステップ206では、入力したMIDIデータが楽音の発音終了を指示するノートオフメッセージか否か判定する。そのMIDIデータがノートオフメッセージだった場合、判定はYESとなってステップ207に移行する。そうでない場合には、判定はNOとなり、ここで一連の処理を終了する。
【0041】
ステップ207では、入力したMIDIデータから、チャンネル番号、及びノートナンバー(ピッチ)を抽出し、それぞれ変数ich、及びiPitに代入する。続くステップ208では、変数ich、iPitの各値で指定される発音データ(それら各値をデータiTone、iPitchとして格納している発音データ)を特定してそのインデクス値を変数tdに代入する。また、変数ich、iPitの各値で指定されるピッチデータを特定してそのインデクス値を変数tdに代入し、その変数tdの値で指定されるピッチデータのデータiStatusの値を2に変更する。その変更後は、ステップ209に移行して、変数ndの値で指定される発音データ中のデータiStatusとして2、データfRelease(図中「nd.fRelease」と表記)として1.0、データlOffStart(図中「nd.lOffStart」と表記)として現在時刻を示す値、をそれぞれ格納する。そのようにして、ノートオフメッセージのMIDIデータにより特定されるピッチデータ、及び発音データを更新した後、一連の処理を終了する。
【0042】
図8は、図6に示す全体処理内のステップ103で起動されるオーディオデータ出力スレッドの実行により実現される処理のフローチャートである。次に図8を参照して、その処理について詳細に説明する。この出力スレッドは、サンプリング周期でオーディオI/F17を介して出力する、発音させるべき楽音の波高値(オーディオデータ)を生成するためのものである。
【0043】
先ず、ステップ301では、各種変数に初期値を代入し、オーディオI/F17を介して出力するオーディオデータ一時格納用の領域(出力バッファ)をRAM12に確保するといった初期化を行う。次のステップ302では、終了が指示されたか否か判定する。上述したように、図6に示す全体処理のステップ110では、オーディオデータ出力スレッドの終了管理用の変数に、終了を指示する値を代入する。このことから、その変数にその値が代入されていた場合、判定はYESとなり、ここで一連の処理を終了する。そうでない場合には、判定はNOとなってステップ303に移行する。
【0044】
ステップ303では、発音させるべき楽音のオーディオデータを作成(生成)して出力バッファに格納するための出力データ作成処理を実行する。次に移行するステップ304では、出力バッファに格納されたオーディオデータをサンプリング周期で順次、出力するための処理を実行する。その実行後は上記ステップ302に戻る。それにより、楽音発生アプリケーションの起動中は、ステップ302〜304で形成される処理ループを繰り返し実行する。
【0045】
次に、上記ステップ303として実行される出力データ作成処理について、図9に示すそのフローチャートを参照して詳細に説明する。その作成処理では、複数のサンプリング周期分のオーディオデータを一度に作成し、出力バッファに保存するようにしている。図中の「lSamples」は一度に作成するオーディオデータ数を示す定数である。
【0046】
先ず、ステップ401では、変数iに0を代入する。続くステップ402では、変数iの値が定数lSamples未満か否か判定する。変数iの値は、1サンプリング周期分のオーディオデータを作成する度にインクリメントするようになっている。このため、一度に作成すべきオーディオデータを全て作成していない場合、変数iの値は定数lSamples未満の関係を満たすから、判定はYESとなってステップ402に移行する。そうでない場合には、つまり作成すべきオーディオデータを全て作成した場合には、判定はNOとなり、ここで一連の処理を終了する。
【0047】
ステップ403では、変数iの値を定数lSRで割った値を変数lTimeの値に加算して得られる値(=lTime+i/lSR)を変数lSTimeに代入する。変数lTimeに代入された値は、次のオーディオデータを出力すべき時刻を示す値であり、定数lSRは、出力バッファに格納したオーディオデータのサンプリングレートを示す値である。それにより、変数iの値を定数lSRで割った値は、変数iの値にサンプリング周期を掛けた値(時間を示す値)である。このことから、変数lSTimeには、対象とするオーディオデータを出力すべき時刻を示す値が代入される。その代入後はステップ404に移行する。
【0048】
ステップ404では、1サンプリング周期分のオーディオデータ作成用の変数iValueに0を代入する。次のステップ405では、変数ndに、発音データ格納用領域の先頭に位置する発音データの格納場所を指定するインデクス値を代入する。その次に移行するステップ406では、変数ndの値で指定される格納場所に発音データが存在するか否か判定する。その発音データが存在しない場合、判定はNOとなってステップ416に移行する。そうでない場合には、判定はYESとなってステップ407に移行する。
【0049】
ステップ407では、変数ndの値で指定される格納場所のデータiStatusの値が消音中を示す0でないか否か判定する。その値が0であった場合、判定はNOとなってステップ410に移行する。そうでない場合には、判定はYESとなってステップ408に移行する。
【0050】
ステップ407でのYESの判定は、現在、注目している発音データに対応する楽音は発音すべきものであることを意味する。このことから、ステップ409では、その楽音を発音させるためのサンプリングデータをRAM12から読み出すためのサンプリングデータ読み取り処理を実行する。その実行によって変数iVtmpには、そのサンプリングデータが代入される。
【0051】
ステップ408に続くステップ409では、そのデータiStatusの値が2か否か判定する。現在、注目している発音データに対応する楽音が消音処理中であった場合、判定はYESとなってステップ412に移行する。そうでない場合には、判定はNOとなり、変数iValueに、それまでの値に変数iVtmpの値を加算した値(=iValue+iVtmp)を代入し(ステップ410)、変数ndに次の発音データの格納場所を示すインデクス値を代入する(ステップ411)。その代入後は上記ステップ406に戻る。
【0052】
このように、消音処理中でない楽音では、ステップ408のサンプリングデータ読み取り処理の実行によって変数iVtmpに代入されたサンプリングデータは変数iValueのそれまでの値に加算される。それにより、消音処理を開始するまではサンプリングデータ(波形データ)に従って発音させている。
【0053】
上記ステップ409の判定のYESとなって移行するステップ412〜415では、消音したと見なせるまで、発音させる楽音の音量を徐々に小さくさせていくための処理が行われる。波形データを構成するサンプリングデータの値は大きく変化することから、消音したと見なせるか否かの判定は、消音処理中に更新していくデータfReleaseの値により行っている。図中の「RED_OFF」「RELEASE」はそれぞれ、その判定用に設定した定数、データfRelease更新用に設定した定数である。
【0054】
先ず、ステップ412では、変数iVtmpに、注目している発音データ中のデータfReleaseの値をそれまでの値に掛けて得られる値(=iVtmp*fRelease)を代入する。続くステップ413では、そのデータfReleaseの値が定数RED_OFF未満か否か判定する。その値が定数RED_OFF以上であった場合、判定はNOとなり、ステップ414でデータfReleaseをそれまでの値に定数RELEASEを掛けた値に更新した後、上記ステップ410に移行する。そうでない場合には、判定はYESとなってステップ415に移行し、データiStatusの値を0に、その他のデータをリセットする操作を行うことで該当する発音データを消去すると共に、他の対応する各種データの更新、及び楽音の発音用にRAM12にロードした部分波形データの消去(開放)を行う。その開放により、発音データを消去した楽音の発音用の部分波形データは先頭波形データのみとなる。発音データ以外の各種データの更新は、音色データではデータiNoteOnCntの値をデクリメントする更新、ピッチデータではデータiStatusの値を0にする更新、ソースデータでは先頭波形データを示す値にデータiIndexを変更する更新、をそれぞれ行う。そのような更新を行った後、上記ステップ410に移行する。
【0055】
上記ステップ415では、発音データの消去に併せて、その発音データの格納場所を示すインデクス値をデータpPrev、或いはpNextとして有する発音データはデータpPrev、或いはpNextを更新する。消去する発音データが最後に位置するもの、つまりその格納場所を示すインデクス値が最大のものでなければ、発音データを消去した格納場所に別の発音データを移動させて、発音データが先頭から連続するようにさせる。それにより、変数ndの値で指定される格納場所に発音データが存在しないことでステップ406の判定がNOとなった場合には、他に注目すべき発音データが存在しないようにさせている。他に注目すべき発音データが存在しないことは、1サンプリング周期分のオーディオデータの作成が終了したことを意味する。
【0056】
そのステップ406の判定がNOとなって移行するステップ416では、変数iValueの値を1サンプリング周期分のオーディオデータとして、変数lStimeの値と共に、出力バッファの変数iの値で指定される格納場所に格納する。その格納後は、ステップ417で変数iの値をインクリメントしてから上記ステップ402に戻る。
【0057】
図10は、上記ステップ408として実行されるサンプリングデータ読み取り処理のフローチャートである。最後に図10を参照して、そのデータ読み取り処理について詳細に説明する。
【0058】
上述したように、波形データはピッチ毎に用意しているから、波形データから抽出した(読み出した)サンプリングデータは基本的にそのまま楽音の発音に用いることができる。それにより、サンプリングデータ読み取り処理では、対象とする部分発音データ中のサンプリングデータを読み出すべきサンプリングデータの位置(アドレス)を特定し、その位置のサンプリングデータを読み出すようになっている。また、必要に応じて、次に参照すべき部分波形データのRAM12へのロード、及びロードした部分波形データの消去(開放)を行うようになっている。ここでは説明上、便宜的に全ての部分波形データは同じサイズ(同じサンプリングデータ数)として説明を行うこととする。図中に表記の「SIZE」はそのサイズを示す定数である。
【0059】
先ず、ステップ501では、変数lStimeの値から変数ndの値で指定された格納場所に格納されている発音データ中のデータlOnStartの値を引いた値、つまりその発音データにより発音中の楽音の発音を開始させてから経過した時間を示す値を変数lTに代入する。続くステップ502では、変数lPosに、変数lTの値に定数lSRを掛けた乗算結果を定数SIZEで割ったときに得られる余り(=(lT*lSR)%SIZE)を代入する。その後は、注目する発音データ中のデータpSDをステップ503で変数sdに代入し、ステップ504に移行する。
【0060】
ステップ504では、変数lPosの値が0か、つまりそれまで参照していた部分波形データからのサンプリングデータの読み出しが一通り終了したか否か判定する。その読み出しが一通り終了していない場合、判定はNOとなってステップ509に移行する。そうでない場合には、判定はYESとなってステップ505に移行する。
【0061】
ステップ505〜508では、サンプリングデータの一通りの読み出しが終了したことにより、次に読み出しを行うべき部分波形データを別のものに切り換えるための処理が行われる。
【0062】
先ず、ステップ505では、変数sdの値で指定されるソースデータ中のデータiIndexの値が0でないか否か、つまりそれまで参照していた部分波形データは先頭波形データでないか否か判定する。その部分波形データが先頭波形データであった場合、判定はNOとなり、ステップ506でそのデータiIndexの値を1に更新した後、ステップ509に移行する。そうでない場合には、判定はYESとなってステップ507に移行する。
【0063】
ステップ507では、データiIndexの値が示す部分波形データをRAM12から開放(消去)する。その次のステップ508では、そのデータiIndexの値を、それまでの値を2で割って得られる余りに1を加算した値(=(sd.iIndex)%2+1)に更新する。ステップ509には、その更新を行った後に移行する。
【0064】
データiIndexの値は0、1、或いは2である。ステップ507に移行する場合、その値は1、或いは2である。このため、その値が1であれば2、その値が2であれば1に更新されることになる。それにより、先頭波形データを参照した後は、楽音の発音を消音させるまでの間、中間波形データと最終波形データは交互に参照される。
【0065】
ステップ509では、データiIndexの値に対応する部分波形データを参照の対象に設定する。次のステップ510では、対象とする部分波形データ中の変数lPosの値で指定されるサンプリングデータ(先頭から変数lPosの値番目のデータ)を読み出して変数iVtmpに代入する。その次のステップ511では、変数iVtmpの値、即ち読み出したサンプリングデータに発音データ中のデータiOnVelの値(ベロシティ値)を反映させるために、そのサンプリングデータの値に対し、データiOnVelの値を対応するソースデータ中のデータmaxVelの値で割った値を乗算して得られる値を変数iVtmpに代入する。それにより、変数iVtmpに代入したサンプリングデータを、ユーザーが実際に押鍵したときのベロシティ値と波形データのベロシティ範囲の上限値の比に応じて更新してからステップ512に移行する。
【0066】
ステップ512では、変数lPosの値が定数SIZEに0.8を掛けた値以上か否か判定する。その大小関係が満たされている場合、判定はYESとなってステップ513に移行し、データiIndexの値を2で割って得られる余りに1を加算した値に対応する部分波形データをROM13から読み出してRAM12にロードした後、一連の処理を終了する。そうでない場合には、判定はNOとなり、ここで一連の処理を終了する。
【0067】
上記ステップ513でロードされる部分波形データは、データiIndexの値が0、或いは2であれば中間波形データであり、その値が1であれば最終波形データである。そのような部分波形データを、現在、対象としている部分波形データの80%以上、サンプリングデータを読み出した状況、つまりその部分波形データで読み出すべきサンプリングデータが残り20%以下となった状況となると事前にRAM12にロードさせている。それにより、参照すべき部分波形データを切り換えるタイミングでは次に参照すべき部分波形データをRAM12に確実に用意するようにしている。
【0068】
なお、本実施の形態では、発音させる楽音はユーザーが電子楽器20を操作して指定するようになっているが、その指定はスタンダードMIDIファイルといった再生データにより自動的に行わせても良い。波形データについては、それを3つの部分波形データに分割しているが、その分割数はそれより多くとも少なくとも良い。そのサンプリングデータは、圧縮処理を施したものであっても良い。
<第2の実施の形態>
上記第1の実施の形態では、先頭波形データ以外の部分波形データは、発音させるべき楽音のオーディオデータ作成に用いる部分波形データのみをRAM12にロードしている。これに対し、第2の実施の形態は、発音させるべき楽音とピッチが近い楽音の発音に用いられる部分波形データを事前にRAM12にロードするようにしたものである。これは、楽曲では、或るピッチの楽音を発音させた後、それと近いピッチの楽音を発音させることが比較的に多いためである。第2の実施の形態では、そのことに着目し、次に用いる可能性が高いと考えられる部分波形データを投機的にロードしておくことにより、発音させるべき楽音は常に確実にスムーズに発音できるようにさせている。投機的にロードする部分波形データは発音させる楽音とピッチの近い楽音用のものに限定しているため、波形データによるRAM12の専有率の上昇は僅かなものに抑えることができる。
【0069】
第2の実施の形態における楽音発生装置の構成は、基本的に第1の実施の形態におけるそれと同じである。動作も大部分は同じか、或いは基本的に同じである。このことから、第1の実施の形態で付した符号をそのまま用いて、第1の実施の形態から異なる部分についてのみ説明する。
【0070】
第2の実施の形態では、図6に示す全体処理内でステップ109として実行されるMIDI IN処理が第1の実施の形態から異なっている。このことから、その異なる部分について、図11、及び図12に示す各フローチャートを参照して詳細に説明する。
【0071】
図11は、第2の実施の形態におけるMIDI IN処理のフローチャートである。図11に示すように、第2の実施の形態では、ステップ205の処理を実行した後、ステップ601に移行して、そのステップ205で生成・格納した発音データが示す楽音とピッチが近い周辺ピッチの楽音発音用の部分波形データをROM13から読み込んでRAM12にロードするための周辺ピッチのデータ読み込み処理を実行する。一連の処理はその実行後に終了するようになっている。
【0072】
図12は、そのステップ601として実行される周辺ピッチのデータ読み込み処理のフローチャートである。次に図12を参照して、そのデータ読み込み処理について詳細に説明する。
【0073】
キーボード21への演奏操作は、両手を使って行うことがある。このことから、本実施の形態では、キーボード21を右手による演奏操作が行われると想定する高音域、その高音域以外の部分を左手による演奏操作が行われると想定する低音域に分け、音域毎に部分波形データの投機的なロードを行っている。図中に表記の「DIVPIT」は、それらの音域の境界となる鍵のピッチ(ノートナンバー)として設定した定数である。「RNGHIGH」「RNGLOW」はそれぞれ、部分波形データを投機的にロードする周辺ピッチ範囲として高音域、低音域で設定した定数である。
【0074】
先ず、ステップ701では、変数iRngに定数RNGHIGHを代入する。次のステップ702では、変数ndの値で指定される格納場所に新たに格納した発音データが示す楽音発音用の部分波形データとして、中間波形データをROM13か読み込んでRAM12にロードする。それにより、入力したMIDIデータにより発音開始が指示された楽音発音用の中間波形データを第1の実施の形態よりも早い段階でロードする。そのロード後はステップ703に移行する。
【0075】
ステップ703では、そのMIDIデータから抽出されたピッチ(ノートナンバー)を示すデータiPitの値が定数DVPIT未満か否か、つまりそのMIDIデータが発音開始を指示する楽音が低音域に属するピッチの楽音か否か判定する。その低音域に属するピッチの楽音であった場合、判定はYESとなり、ステップ704で変数iRngに定数RNGLOWを代入した後、ステップ705に移行する。そうでない場合には、判定はNOとなり、次にその0ステップ705の処理を実行する。
【0076】
ステップ705以降では、変数iの値を順次、インクリメントしながら、入力したMIDIデータが発音開始を指示する楽音より変数iの値分だけ高音、低音となっている楽音発音用の中間波形データを必要に応じてRAM12にロードするための処理が行われる。それにより、本実施の形態では、発音開始が指示された楽音より変数iRngの値分、ピッチが離れた高音、低音の楽音を対象にして、対象とする楽音(周辺ピッチの楽音)のなかで発音中でない楽音発音用の中間波形データをロードしている。
【0077】
先ず、ステップ705では、変数iに0を代入する。続くステップ706では、変数th、tlにそれぞれ、新たに格納した発音データに対応するピッチデータ中のデータpNext、pPrevを代入する。その次に移行するステップ707では、変数iの値が変数iRngの値未満か否か判定する。変数iの値が変数iRngの値以上であった場合、判定はNOとなり、投機的にロードすべき中間波形データは全てロードしたとして、ここで一連の処理を終了する。そうでない場合には、判定はYESとなってステップ708に移行する。
【0078】
ステップ708では、変数thの値で指定されるピッチデータ中のデータiStatusの値が0か否か、つまりそのピッチデータによって特定される楽音が消音中か否か判定する。その楽音が発音中であった場合、判定はNOとなってステップ710に移行する。そうでない場合には、判定はYESとなり、ステップ709でその楽音発音用の中間波形データをROM13から読み込んでRAM12にロードした後、そのステップ710に移行する。
【0079】
ステップ710では同様に、変数tlの値で指定されるピッチデータ中のデータiStatusの値が0か否か判定する。そのピッチデータによって特定される楽音が発音中であった場合、判定はNOとなってステップ712に移行する。そうでない場合には、判定はYESとなり、ステップ711でその楽音発音用の中間波形データをROM13から読み込んでRAM12にロードした後、そのステップ712に移行する。
【0080】
ステップ712では、変数th、tlにそれぞれ、それまでの値で指定される各ピッチデータ中のデータpNect、pPrevを代入する。それにより、着目するピッチデータを高音側ではノートナンバーで1だけ大きいピッチデータに、低音側ではノートナンバーで1だけ小さいピッチデータにそれぞれ変更する。次のステップ713では、変数iの値をインクリメントする。その後は上記ステップ707に戻る。
【0081】
このようにして、発音させるべきとなっていない楽音の発音用の中間波形データを事前に、つまり発音させるべきとなる前の段階でロードする。このため、特に詳細な説明は省略するが、図10に示すサンプリングデータ読み取り処理内のステップ512において、データiIndexの値を2で割って得られる余りに1を加算した値に対応する部分波形データが既にロードされているか否かを併せて判定するようになっている。それにより、変数lPosの値が定数SIZEに0.8を掛けた値以上であり、且つ次にロードすべき部分波形データがロードされていない場合に、その判定がYESとなるようにさせている。そのようにして、部分波形データの不必要なロードを行うことを回避させている。
【0082】
なお、本実施の形態(第1および第2の実施の形態)では、ピッチ毎に1種類の波形データ(3つの部分波形データから構成されている)を用意しているが(ここでは音色毎に用意していることは便宜的に無視している)、波形データはベロシティによっても異なるから、ピッチ毎に対象となるベロシティ範囲が異なる複数の波形データを用意しても良い。そのように対象となるベロシティ範囲が異なる複数の波形データを用意した場合には、例えばベロシティ範囲が異なる先頭波形データを事前に全てロードしておき、部分波形データは、発音させるべき楽音のベロシティ値に応じたものを必要に応じてロードするようにすれば良い。そのようにすることにより、ピッチ毎にベロシティ値に応じた波形データを用いて楽音を発音できるようになる。
【図面の簡単な説明】
【0083】
【図1】第1の実施の形態による楽音発生装置の構成を説明する図である。
【図2】音色データの構成を説明する図である。
【図3】ピッチデータの構成を説明する図である。
【図4】ソースデータの構成を説明する図である。
【図5】発音データの構成を説明する図である。
【図6】全体処理のフローチャートである。
【図7】MIDI IN処理のフローチャートである。
【図8】オーディオデータ出力スレッドの実行によって実現される処理のフローチャートである。
【図9】出力データ作成処理のフローチャートである。
【図10】サンプリングデータ読み取り処理のフローチャートである。
【図11】MIDI IN処理のフローチャートである(第2の実施の形態)。
【図12】周辺ピッチのデータ読み取り処理のフローチャートである。
【符号の説明】
【0084】
10 楽音発生装置
11 CPU
12 RAM
13 ROM
14 入力部
15 表示部
16、22 MIDIインターフェース(I/F)
17 オーディオインクリメント(I/F)
20 電子楽器
21 キーボード
30 音源システム




 

 


     NEWS
会社検索順位 特許の出願数の順位が発表

URL変更
平成6年
平成7年
平成8年
平成9年
平成10年
平成11年
平成12年
平成13年


 
   お問い合わせ info@patentjp.com patentjp.com   Copyright 2007-2013