JP3636395B2 - Music generator - Google Patents

Music generator Download PDF

Info

Publication number
JP3636395B2
JP3636395B2 JP01279396A JP1279396A JP3636395B2 JP 3636395 B2 JP3636395 B2 JP 3636395B2 JP 01279396 A JP01279396 A JP 01279396A JP 1279396 A JP1279396 A JP 1279396A JP 3636395 B2 JP3636395 B2 JP 3636395B2
Authority
JP
Japan
Prior art keywords
service
task
time
voice
sound
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
Application number
JP01279396A
Other languages
Japanese (ja)
Other versions
JPH09204179A (en
Inventor
範生 松鹿
忍 片山
毅 坂田
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Roland Corp
Original Assignee
Roland Corp
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Roland Corp filed Critical Roland Corp
Priority to JP01279396A priority Critical patent/JP3636395B2/en
Publication of JPH09204179A publication Critical patent/JPH09204179A/en
Application granted granted Critical
Publication of JP3636395B2 publication Critical patent/JP3636395B2/en
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Images

Landscapes

  • Electrophonic Musical Instruments (AREA)

Description

【0001】
【発明の属する技術分野】
本発明は、音源を備え、楽音の発音指示を受けて音源に対し発音制御を行なうことにより楽音を生成する楽音生成装置に関する。
【0002】
【従来の技術】
音源に対する発音制御は大きく分けると2つの部分からなる。一つは「初期発音」、もう一つは「ボイスサービス」である。以下、「ボイスサービス」のことを単に「サービス」と称することもある。これらの初期発音、ボイスサービスの処理は、一般にCPUによって行なわれる。
【0003】
初期発音とは、発音要求(ノート・オン)に対応してアサインされた、いわゆるボイスに対して、その発音要求の示す音高(押鍵による発音キーナンバ)、強さ(押鍵ベロシティ)などに基づいて発音処理を施す(音高、音質、音量などの楽音の特質パラメータを求めて与える)ことである。ここで、「ボイス」とは一時に一つの楽音を生成するための楽音生成手段のことを指す。楽音生成回路には、複数の楽音を同時に生成可能なように複数のボイスが設けられている。発音要求に応じていずれかのボイスを選択しその選択したボイスに発音要求を割り当てることを「アサイン」と称する。また、そのアサインを行なう手段を「アサイナ」と称する。後述する本発明の実施形態ではアサイナタスクがアサインを行なうので、以後の説明ではアサイナタスクのことを単にアサイナと称することもある。
【0004】
サービスは、一定時間ごとに各ボイスの音高、音質、音量などの楽音の特質パラメータを変化させてボイスに供給し、そのボイスで生成中の楽音に時間的な特質の変化をもたらせる処理である。
【0005】
具体的には、これら初期発音およびサービスによってエンベロープやLFOを生成しこれに基づきボイスに対して楽音の特質パラメータを制御することになる。すなわち、サービスによってエンベロープやLFOの値が時間的に変化する。
【0006】
マルチタスク構成で複数のボイスを制御する場合、これら初期発音とサービスは異なるタスクに分割されて実装されることが多い。その理由は、
(1)サービスは、現在発音中の全てのボイスについて音高、音質、音量を求めてボイスに与える(通常、各ボイスあたり数ミリ秒〜十数ミリ秒間隔)ため、定常的な負荷が大きい。しかしある程度処理が遅れてもさほど不自然に聞こえない。
【0007】
(2)一方、初期発音処理は発音要求(ノート・オン)を受けた時のみ行なえばよいので、定常負荷は少なくて済むが、ノート・オンを受けてから発音開始までの時間が遅れると不自然であり、楽器として演奏困難になる。
という異なった性質によるものである。
【0008】
そこで、リアルタイム・モニタなどを実装してマルチタスク制御をすることが考えられる。その際は、サービス処理タスクは定期的にサービス処理を行ない、それよりも高い優先順位で初期発音を行なう発音タスクを実装する。そうすることでどんなにサービスの負荷が重いときでも初期発音が最優先で行なわれ、聴感上不自然さが少ない。
【0009】
尚、以後の説明では、初期発音を行なうタスクを「発音タスク」、定期的なサービスを行なうタスクを「サービスタスク」と称する。また、以後の説明では「リアルタイム・モニタ」のことを単に「モニタ」と称することもある。
【0010】
従来の方法について説明する。
【0011】
図17は、従来の発音タスクを示すフローチャートである。
【0012】
このフローチャート中、「発音ボイス番号」は、発音に使用するボイスの番号をいう。また、このフローチャート中の記号の意味は、以下のとおりである。尚、以下に説明する各フローチャート中にそれよりも前に説明したフローチャート中の記号と同一の記号があらわれたときは、同一の記号であっても意味が異なる場合を除き、重複説明は省略することがある。また、各タスク(発音タスクを含む全タスク)で使用される変数は電源投入時に初期化されるものとする。
【0013】
(a)voice:ボイス番号。発音タスクにおいてはアサイナタスクから与えられたボイス番号を示す。
【0014】
voice=0〜MAX_VOICE
但し、MAX_VOICEはボイス番号の最大値を指す。
【0015】
(b)counter[voice]:そのvoiceの初期発音以降の経過時間を表現する変数を示す。
【0016】
(c)serv_flag[voice]:そのvoiceが発音中であることを示すフラグである。
【0017】
実際には、発音タスクよりも上位にMIDI受信タスクまたは鍵盤スキャンタスクなどがあり、MIDI受信タスク、鍵盤スキャンタスクなどによって発音要求が検出された場合には、続いてアサイナタスクが起動され、ボイスアサインが行なわれる。または別タスクでなくとも、同様の処理がこの発音タスクの処理の前に行なわれる。ボイスアサインが行なわれた結果、アサイナタスクから発音イベントが発生し、これにより発音タスクが起動される。
【0018】
尚、MIDI(Musical Instrument Digital Interface)は、電子楽器の分野で広範囲に使用されている通信プロトコルである。
【0019】
図17に示す発音タスクは、与えられたノート・オン情報を上位タスクから受け取り(ステップ17_1)、それに応じた、発音時のエンベロープやLFOを生成し、それに応じた音量、音質、音高のパラメータを求める(ステップ17_2)。
【0020】
またアサイナから指定されたボイスにパラメータを与え、初期発音を行なう(ステップ17_3)。
【0021】
そのあとで、時間カウンタcounter[voice]を0で初期化し(ステップ17_3)、初期発音を終えたことをサービスタスクに知らせるためにフラグserv_flag[voice]を設定し(ステップ17_5)、再びアサイナタスクから発生される発音イベント待ち状態になる。
【0022】
図18は、従来のサービスタスクのフローチャートである。このフローチャート中の記号の意味は、以下のとおりである。
【0023】
(a)cnt_inc:サービスタスクの起動周期に対応する時間経過を表わす定数であり、例えば、8mSの時間経過を表す。
【0024】
実際には、例えば、8mSの周期で発生するタイマ・インタラプトに応じてモニタがタイマ・イベントを発生し、これによりサービスタスクが起動される。
【0025】
なおサービスタスクは処理終了後に再びタイマ・イベント待ち状態となる。
【0026】
図18のサービスタスクでは、serv_flagをスキャンすることで現在発音中のボイス番号がわかるので(ステップ18_1,18_2,18_7,18_8)、現在発音中のボイスすべてについて、前回サービスを行なった時刻よりタイマ時間(サービスタスク起動周期)後(ステップ18_3)のエンベロープやLFOを求め、これに基づき音高、音質、音量を求め、ボイスに供給する(ステップ18_4)。もしもある時点で求めた音量エンベロープの示す音量レベルが0であって、かつエンベロープの全てのフェーズ(アタック、ディケイ、サスティン、リリースなどのエンベロープの各区間)が終了していたら、言い換えると発音が終了したら(ステップ18_5)、そのボイスのserv_flagをクリアする(ステップ18_6)。
【0027】
尚、エンベロープは各フェーズ毎に時間やレベルの設定が異なるため、counterを初期発音以後の実経過時間に対応させて時間管理するのではなく、counterの最大値を決め、各フェーズ毎に指定された時間を経過することによりcounterがオーバーフローするようなcnt_inc値を、各フェーズ毎に計算で求めてもよい。すなわちこの場合、counterは初期発音以後の経過時間を表現するのではなく現フェーズ開始以後の相対的な経過時間を表現することになる。もちろんこの場合であっても新たなフェーズがアタックである場合にはcounterは初期発音以後の相対的な経過時間を表現することになる。この場合はcnt_incは定数ではなく、変数として、各ボイス毎に1フェーズ区間記憶しておく必要がある。
【0028】
counterをもとにエンベロープのレベル、フェーズを求めるには例えば以下のような処理を行なう。
【0029】
図19に示すように、あるフェーズにおいて、時間Tの間にエンベロープのレベルをレベルL1からレベルL2まで直線的に変化させる場合、フェーズが切換わった時点で時間Tからcnt_incを求める。具体的には、式
cnt_inc=service_time×counter_max/T
により、cnt_incを求める。但し、service_timeはサービスの周期を示す定数、counter_maxはcounterの最大値を示す定数である。ここで、
counter_max≧counter≧0
とする。これは「counterにcnt_incをサービスタイム毎に加算しつづけるとTの時間経過後にcounterがオーバーフローする。」ということを意味している。
【0030】
次にcounterを0クリアして、あとはサービスの度にcnt_incを加算し、counterのオーバーフローをチェックする。オーバーフローしていたらそのフェーズは終了したことを示すので次のフェーズに切換える。
【0031】
オーバーフローしなかった場合、counterをもとにエンベロープの現在レベルLを算出する。エンベロープを直線状に変化させる場合には、例えば以下のような処理を行なう。
【0032】
L=counter/counter_max*(L2−L1)+L1
また、エンベロープを曲線的に変化させる場合には、
L=F(counter/counter_max)*(L2−L1)+L1
但し、F(t)は任意の曲線を示す関数テーブル(1≧t≧0)、F(0)=0、F(1)=1とする。
あるいは、
L=F(counter/counter_max)*(L1−L2)+L2
但し、F(t)は任意のカーブを示す関数テーブル(1≧t≧0)、F(0)=1、F(1)=0とする。
のような処理を行なえばよい。
【0033】
【発明が解決しようとする課題】
上述した従来の手法では、発音タスクはノート・オンに同期して発音を開始させるが、サービスタスクはノート・オン・タイミングとは無関係に、一定間隔で起動される。そのため、初期発音から1回目のサービスまでの時間がまちまちである。すなわち、演算などの処理速度を無視したとしても、最大、サービスタスクのタイマ時間(サービス時間;サービスタスクの起動時間間隔)分だけ誤差が出る。
【0034】
ところがサービスタスクでは前回のサービスよりタイマ時間後のエンベロープやLFOを求め、音高、音質、音量を求めるようになっている。つまり初期発音から1回目のサービスまでの実際の経過時間と音高、音質、音量を求める上での経過時間とが異なることとなる。そのためエンベロープのアタック部やLFOのカーブが2回目以降のサービス部分に比べていびつになることが起こり得る。
【0035】
上記フローのようなアルゴリズムで実装された発音タスクとサービスタスクの間では、発音タスクと1回目のサービスとの時間間隔がまばらになり、そのばらつきは、
0 ≦ ばらつき < サービス間隔
になる。
【0036】
エンベロープを例にとって説明する。
【0037】
例えば今、サービス時間を8ミリ秒、発音開始時から16ミリ秒で最大レベルに到達し最大レベルを維持することとすると、発音タスクとサービスタスクは、図20のようになることを想定して、特質パラメータを求める。この図20の縦軸はエンベロープによって制御される音高、音質、音量などを表わしている。
【0038】
ところが、サービスタスクは、発音タスクとは無関係に8ミリ秒おきに起動されるため、実際には、図21に示すように初期発音のタイミングは、サービスの起動タイミングとは一致しない。その結果、例えば図21に示すタイミングで発音イベントが発生する場合には、エンベロープの形状は、図22に示すようないびつなものになる。
【0039】
楽音の、特にアタック部分は、その音色のイメージを決定する上で極めて重要な要素であるが、従来の手法では、上記のような時間誤差が出ることにより、アタックエンベロープの形状が変形してしまい、楽音の劣化が生じていた。尚、上記の説明では、楽音の劣化が顕著な例としてエンベロープを取り上げたが、LFOの場合も同様である。
【0040】
この劣化を少なくするためにはタイマ時間間隔を短くするという手法が考えられるが、単に短くするだけではタイマ時間内に全ボイスのサービス処理が間に合わなくなり、アタック以外のエンベロープ形状にも悪影響を与えてしまうという問題がある。高速に処理のできるCPUを使用すればその問題は回避できるが、その場合ハードウェアのコストが上がってしまうという問題が発生する。
【0041】
本発明は、上記事情に鑑み、比較的安価なCPUを用いても、従来と比べ処理遅れを少なく押えることができ、エンベロープの形状やLFOの形状をより忠実に発生することのできる楽音生成装置を提供することを目的とする。
【0042】
【課題を解決するための手段】
本発明の楽音生成装置は、
一時にはそれぞれ1つの楽音の生成を担当する、複数の楽音生成手段、
発音指示を受けて直ちに、発音指示がなされた楽音を、上記複数の楽音生成手段のうちのいずれかに対して発音開始時の特質で生成開始させる第1の発音制御を行なう楽音生成開始手段、
楽音生成中の楽音生成手段それぞれに対して、楽音生成手段で生成中の楽音の特質を変化させる第2の発音制御を行なうサービス手段、
所定のサービス周期毎に一周期の経過を通知するサービス周期通知手段、
楽音生成手段で生成中の楽音の特質が、その楽音生成手段に対して上記第1の発音制御が行なわれた時点以降最初に、上記サービス通知手段からの一周期の経過の通知を受けた1回目の時点では、上記サービス周期一周期の2分の1の時間が経過した時点の特質に変化し、その1回目の時点経過後は、上記サービス周期毎に順次一周期の特質に変化するように、上記サービス手段を制御するサービス制御手段
を備えたことを特徴とする。
【0043】
ここで、上記「直ちに」は、発音指示を受けた直後であってももちろん良いが、一般にディジタル制御の場合、所定のクロックに同期した制御を行なう場合が多く、本発明においても、そのようなクロックに同期した時点まで待って上述の第1の発音制御を行なう場合も含まれ、上記「直ちに」は、その程度の幅を持つ用語として解釈される。ただし、このクロックの周期(発音の遅れ)は、発音開始の遅れが許容される、上述のサービス周期よりも短い周期(遅れ時間)である必要がある。
【0044】
本発明の楽音生成装置によれば、発音指示を受けた場合には、直ちに、複数の楽音生成手段のうちのいずれかに対して、発音指示がなされた楽音を発音開始時の特質で生成開始するよう発音制御が行なわれる。また、本発明の楽音生成装置においては、楽音生成中の楽音生成手段について楽音の生成が開始された時点とは無関係に所定時間経過毎に生成中の楽音の特質が前回の発音制御から今回の発音制御までの経過時間に対応する時間後の特質に変化する。この時、楽音生成開始の発音制御がなされた時点から次の最初の発音制御までの時間はさまざまに変化することになるので、この時間を該所定時間の二分の一とみなすこととし、この最初の発音制御に関してはこの該所定時間の二分の一の時間に対応する分だけ楽音の特質を変化させるようにする。
【0045】
該所定時間の二分の一の時間は、楽音生成開始の発音制御から次の最初の発音制御までの時間の平均値に等しいので、この最初の発音制御は従来に比べ高い精度で行なえることとなり、楽音生成開始時の楽音の特質の変化の劣化を防ぐことができる。
【0046】
【発明の実施の形態】
以下、本発明の実施形態について説明する。
(実施形態1)
この実施形態1は、本発明の第1の楽音生成装置の一実施形態である。
【0047】
この実施形態1では、モニタがサービスタスクを起動する間隔を、ボイスサービスの間隔より細かく設定する。しかし、サービスタスクは、起動される度に全てのボイスに対して処理をするのではなく、ボイスをスキャンしモニタにより通知されたスロット番号に応じたボイスのみを処理する。これにより、CPUの負荷を極端に増加させることなしに、初期発音とサービスの同期精度を高めることができる。
【0048】
本実施形態でいうスロットとは、通常のサービスに必要な時間間隔をさらに短い時間に区分したものであり、一種の現在時刻を示す。本実施形態では、ボイスの実際のサービスの間隔を8ミリ秒、サービスタスク起動間隔(スロット時間)を1ミリ秒として、説明をする。
【0049】
図1は、実施形態1における、モニタの構成を示すフローチャートである。
【0050】
モニタ内ではタイマ割り込みは1ミリ秒の間隔で発生する。このときモニタは変数slotを1だけ増加し、8の剰余(%8)を求めてslotに書き戻し(ステップ1_1)、サービスタスクにイベントを発行する(ステップ1_2)。つまり変数slotは、1ミリ秒毎に、0,1,2,3,4,5,6,7,0,1,2,…のように繰り返す。なお、対象の数値の下位3ビットを取り出すことにより8の余剰を求めることができる。
【0051】
ある時間における変数slotの値を、その時点でのスロット番号と称することにする。
【0052】
図2は、実施形態1における発音タスクの構成を示すフローチャートである。このフローチャート中の記号の意味は以下のとおりである。
【0053】
(a)slot−voice_1st:スロット・ボイス・リストを示す。
【0054】
このスロット・ボイス・リストは、各スロット毎にそのスロットで発音開始された発音中のボイスのボイス番号を発音開始順に示すリストである。このリストを記憶する領域として、表1に示すように、各スロット毎にボイス数+1の大きさが確保されており、リスト全体では[スロット数*(ボイス数+1)]の大きさとなっている。
【0055】
【表1】

Figure 0003636395
【0056】
図2に示す、上から4つのステップ2_1〜2_4は、従来例(図17参照)と同様である。
【0057】
上から5つ目のステップ2_5における、「現在のスロット番号を取得する」にあたっては、発音タスクがモニタ変数slotを直接読んでもよいし、タスクからの書き込みを禁止するためにモニタ内に隠蔽し、取得のためにはタスクがモニタにシステムコールを発行しなくてはならないような仕様にしてもよい。
【0058】
ステップ2_6において、slot−voice_1st[p_slot][END]とあるのはスロット番号p_slotのリストのボイス番号が格納されている領域の終端(END)を意味している。
【0059】
表1の例ではスロット0にボイス番号5,3,6,1が記憶されており(−1はいずれのボイス番号も記憶されていないことを意味する)、スロット1にはボイス番号2,8,4,9,11,16が記憶されている。ここでは、スロット0のリストにはボイス5,3,6,1がつながれている、というように表現することにする。
【0060】
いま、さらにスロット0のタイミングでボイス19の発音があった場合、ステップ2_6ではこのリストを表2にように更新する。
【0061】
【表2】
Figure 0003636395
【0062】
つまり、スロット0のリストにボイス19をつなげたことになる。上記フローチャートでは、簡単のため「スロット・ボイス・リストに追加する」という一言の表現で記述したが、実際にはこの部分は、図3に示すようなフローで表現される。
【0063】
すなわち、図3に示すフローでは、そのスロットの終端をサーチし(ステップ3_1〜3_3)、その終端の部分にボイス番号をつなげ(ステップ3_4)、さらにその次に、終端を意味する−1をつなげる(ステップ3_5)。
【0064】
あるいは、図3に示すフローの中の、i+1を計算するステップ3_3で最大ボイス数との比較を行ない、ボイス数を越えた領域をアクセスすることがないようにすれば、スロット・ボイス・リストの大きさは スロット数×ボイス数で足りることになる。全ボイスが1つのスロットに集中した場合、−1は必要ない。
【0065】
図4は、サービスタスクの構成を示すフローチャートである。
【0066】
表2の例で、現在のスロット番号を取得した結果(ステップ4_1)、そのスロット番号が2だったなら、ボイス10,0,15,22,17についてサービスを行なうことになる(ステップ4_2〜4_7,4_9)。すなわち、サービス間隔よりも短い間隔で起動されるサービスタスクにおいて、各ボイスをスキャンし、現タイミングでサービスするボイスを選択しそのボイスについてサービスを行なう。その際、例えばボイス15がリリースステータスであって、なおかつレベル0であったら(ステップ4_7)、サービスタスクは、表3に示すように、スロット2のスロット・ボイス・リストからボイス15を削除する(ステップ4_8)。
【0067】
【表3】
Figure 0003636395
【0068】
このフローを図5に示す。
【0069】
図5に示すフローは、スロットSにつながれているi番目のボイスを削除する場合に、それよりも後ろにつながれているボイスを、−1が現われるまで(ステップ5_3)、順次1つずつ前に詰める(ステップ5_1,5_2,5_4)ことを意味している。
【0070】
尚、発音タスクのところで述べたように、slot−voice_lstを スロット数×ボイス数 の大きさに節約したければ、j+1を計算する前に最大ボイス数との比較を行ない、ボイス数を越えている場合には終了するような判定を行なえばよい。
【0071】
尚、実施形態中でサービスの時間カウンタは増加方向で計数したが、減少方向で計数してもよい。その場合、cnt_incをcounterに足し算するのではなく、引き算することで実現できる。
【0072】
以上のような処理を行なうことで、全てのボイスは8ミリ秒間隔でサービスされているにも関わらず、初期発音から初回サービスまでの時間は0〜1ミリ秒までの誤差に保てる。つまり初期発音から初回サービスまでの時間は7ミリ秒から8ミリ秒までの1ミリ秒の間に押え込むことが可能となる。
【0073】
なお、前記実施形態ではサービスを行なうボイスをスロット毎に管理するようにしたので、あるスロットのタイミングにおいてサービスすべきボイスを知るのに全てのスロットのボイス管理情報を調べなくても該当するスロットのボイス管理情報のみを調べるだけでよく、処理が高速に行なえる。
【0074】
尚、上記の説明では、説明の簡単のために、スロットとボイスとの関係を表1〜表3のような形式で記憶するようにしたが、この方法では多くの領域に無駄が生じる(上の表の…より右側の部分は意味を持たない)のと、ボイスリリース後にいくつものボイス番号をずらし込む必要があり低速になってしまうため、リンク構造にしてもかまわない。すなわち表3の例では、最大ボイス番号=29とすると、slot_top(各スロットの先頭のボイス番号)、slot_end(各スロットの終端のボイス番号)、slot_next(各ボイスの次のボイスのボイス番号)、およびslot_prev(各ボイスの前のボイスのボイス番号)は、それぞれ、表4,表5,表6,表7となる。
【0075】
【表4】
Figure 0003636395
【0076】
【表5】
Figure 0003636395
【0077】
【表6】
Figure 0003636395
【0078】
【表7】
Figure 0003636395
【0079】
この場合、slot_top、slot_endはそれぞれ8個のバッファ、slot_next、slot_prevはそれぞれボイス数と同じ数のバッファで収まるため、全体として(ボイス数×2+スロット数×2)の領域で済む。またリリース時のボイス番号のずらし込みも、前後のボイスのつながりを書換えるだけなので高速である。
【0080】
リンクの構造のしくみについては既に公知なので詳細は省略する。
【0081】
尚、ここではモニタの制御によるマルチタスクで音源制御がなされていることが前提になっているが、実際のマルチタスクではタスク間の競合が発生するため、上記slot−voice_lstの書換えなどには保護機能を付加する必要がある。これについてもsemaphoreなどの公知の技術を用いれば良い。
【0082】
なお、上記の説明ではスロットとボイスとの関係を表1〜表7に示すような手法で管理するようにしたが、いずれのスロットでいずれのボイスのサービスを行なうかを管理できれば上記に示した以外の方法でも構わない。例えば上記実施形態では各スロット毎に対応するボイスを管理するようにしたが、逆にボイス毎に対応するスロットを管理するようにしてもよい。
【0083】
また、上記実施形態では発音要求を受けた時にサービスタスクの起動タイミングとは非同期に初期発音処理を行なうようにしているが、初期発音処理を発音要求を受けた後の最初のサービスタスクの起動時に行なうようにし、以後は初期発音処理を行なったスロット毎にそのボイスに対するサービスを行なうようにしてもよい。この場合には初期発音から初回サービスまでの時間が正確に8ミリ秒となる。なおこの場合には発音要求から初期発音まで最大1ミリ秒かかることになるがこの程度の時間遅れは演奏上ほとんど問題とならない。
(実施形態2)
この実施形態2は、本発明の第1の楽音生成装置のもう1つの実施形態である。
【0084】
この実施形態2では、サービスタスクを、ボイスの数に応じた数の複数のタスクによって構成する。発音タスクからのイベントでサービスタスクが生成される。以降、サービスタスクは従来通りタイマ・イベントにより起動され、ボイス終了時(音量エンベロープの全フェーズを実行した後)にサービスタスクが自分自身を終了させる。
【0085】
サービスタスクは、自分自身を起動させるためのタイマ間隔を変更し、発音直後はサービス間隔を短くすることも可能である。これに関しては変形例として後述する。
【0086】
ここでは、先ず、モニタの、サービスタスクに関するマルチタスク制御をつかさどるタスク管理ブロック(以後「TCB」と略す)の説明をする。
【0087】
図6は、タスク管理ブロック(TCB)の構造図である。
【0088】
各タスクにはタスク番号が順番にふられており、TCBは1個のタスクに1個ずつ設けられる。[ ]内はタスク番号を示す。尚、Nはタスク番号の最大値である。本実施形態では、各ボイス毎にサービスタスクを設けるので、タスク番号はそのタスクに対応するボイスのボイス番号と同じである。
【0089】
「タスク状態フラグ」、「退避エリア」は一般のマルチタスクのプログラムにおいて使用されるものと同じであり、一方、「タイムアウト時刻」、「次のTCBへのポインタ」、「前のTCBへのポインタ」は本実施形態におけるサービスタスクに固有のものである。
【0090】
「タスク状態フラグ」はタスクの状態を示すものであり、RUN(実行権獲得)、READY(実行可能)、WAIT(イベント待ち)、DORMANT(休止)などの状態が設定される。
【0091】
「タスクを生成する」ということは、DORMANT状態にあるタスクをWAIT状態に遷移させることであり、「タスクを消滅させる」ということは、そのタスクをDORMANT状態に遷移させることである。WAIT状態のタスクは、待っている対象のイベントが発生した時にREADY状態にされる。尚、本発明によるサービスタスクにおいては、待っている対象のイベントは、所定時間の計時を行なうタイマによるイベントである。これらのタスク状態の遷移はモニタによって行なわれる。
【0092】
モニタはREADY状態のタスク中から最も優先順位の高いタスクを一つだけ決定し、RUN状態に遷移させ、そのタスクを起動し、実行させる。モニタの中のこのような処理を行なう部分を「スケジューラ」と呼ぶ。
【0093】
TCBの退避エリアには、タスクの実行中断後の再開のために、そのタスクの前回の実行時のスタックポインタ、プログラムカウンタ、レジスタなどの内容が退避される。スケジューラは、起動されていたタスクの処理が中断された場合には、そのタスクのスタックポインタ、プログラムカウンタ、レジスタなどの内容をそのタスクの退避エリアに退避させ、その中断されたタスクを再起動する場合には、退避エリアから、退避されていたスタックポインタ、プログラムカウンタ、レジスタなどの内容を読み出して処理用のエリアに転送する。このような、起動するタスクの切換えを「ディスパッチ」と呼ぶ。
【0094】
なお、スケジューラによってRUN状態に移行させるタスクとして選択されたタスクはモニタの処理終了後に直ちに実行される。
【0095】
以上のタスク状態の遷移、スケジューラ、ディスパッチなどは公知なので詳細は省略する。
【0096】
サービスタスクは所定の周期毎に起動されるものであり、「タイムアウト時刻」は、そのタスクが次に起動されるべき時刻を示している。「次のTCBへのポインタ」、「前のTCBへのポインタ」は、WAIT状態のタスクでのみ意味を持つものであり、WAIT状態のタスクの各サービスタスクが起動される時間的順番を示している。「次のTCBへのポインタ」はそのタスクの次に起動されるタスクの番号を、「前のTCBへのポインタ」はそのタスクの前に起動されるタスクの番号をそれぞれ示している。このように、各タスク間の時間順序(リンク状態)を示す2種類のポインタでつながれた一連のタスクを「タイマ・チェイン」と呼ぶ。従って、タイマ・チェインには、「タイムアウト時刻」の大きさに従った順番にWAIT状態のタスクが並んでいる。
【0097】
また、モニタには、図7に示すように、現在時刻を示す変数TM、タイマ・チェインにつながれているタスクのうち次に起動されるタスクを示すポインタTSK_PINTRが設けられている。
【0098】
モニタは、所定周期毎(本実施形態では1mS毎)に発生されるタイマ割り込みに従って、図8に示す処理を行なう。
【0099】
この図8に示すモニタ処理プログラム中の記号の意味は以下のとおりである。
【0100】
(a)hit:起動されるべきタスクが存在するか否かを示している。
【0101】
hit=1 : 存在する
hit=0 : 存在しない
まず、現在時刻TMを増加させ(ステップ8_1)、次に起動すべきタスクの起動タイミングになったかどうかを判断する(ステップ8_2)。尚、TMを増加した結果がTMの最大値を越えた場合には、その値から最大値を減算した値に対応する値がTMの新たな値とされる。例えばTMの最大値を127、増加量を1として、TMを0〜127の間で変化させるようにする。起動タイミングになっていればhit=1とし(ステップ8_3)、そのタスクをタイマ・チェインから外す(ステップ8_4)とともにREADY状態とし(ステップ8_5)、その次のタスクに関して(ステップ8_6)、同じ処理を行なう。
【0102】
起動すべきタスクが存在する場合には(ステップ8_7)、hit=0とした後(ステップ8_8)スケジューラを起動し(ステップ8_9)、存在しない場合には処理を終了する。その結果、その時刻で起動すべきタスクがREADY状態とされることになる。その後、スケジューラによって、READY状態のタスクが優先順位に従って起動される。
【0103】
すなわち、サービス間隔よりも短い間隔で実行されるモニタにおいて、各ボイスに対応するサービスタスクをスキャンし、現タイミングで起動するサービスタスクを選択しそのタスクを起動する。
【0104】
ここに示したように、タイマによる割込み処理において、そのタイミングにおいて起動すべきサービスタスクを知るのに全てのサービスタスクを調べなくても、チェインの先頭のサービスタスクのみを調べるだけでよいので処理が高速に行なえる。
【0105】
起動していたタスクが一通りの処理を終えた時には、モニタに対してモニタコールを行なう。サービスタスクからのモニタコールには、そのタスクがWAIT状態に移行する時の「WAITコール」、そのタスクがDORMANT状態に移行する時の「DORMANTコール」の2種類がある。
【0106】
サービスタスクからこれらのモニタコールが行なわれる時にはコールしたタスクのタスク番号(すなわちボイス番号)をモニタに知らせる。これらのモニタコールに対してモニタは以下の処理を行なう。
【0107】
図9は、WAITコールに対するモニタの処理を表わしたフローチャートである。
【0108】
尚、図9に示すフローチャート中の記号の意味は以下のとおりである。
【0109】
(a)srv_interval:サービスタスクの起動周期を示す定数である。
【0110】
このフローでは、そのタスクの状態がWAIT状態に変更され(ステップ9_1)、そのタスクが次に起動される時刻が設定され(ステップ9_2)、そのタスクがタイムアウト時刻に応じてタイマー・チェインに挿入され(ステップ9_3)、スケジューラが起動される(ステップ9_4)。
【0111】
図9に示すフローチャート中、TM_OUTは、TM同様、増加した結果がTM_OUTの最大値(TMの最大値と同じ)を越えた場合には、その値から最大値を減算した値に対応する値が新たな値とされる。前述のように、本実施形態ではタイマ割り込みの間隔を1mSとしたので、srv_intervalを8とした場合にはTM_OUTはサービスの度に8づつ増加し、8mS毎にサービスが行なわれることとなる。尚、TM、TM_OUTをともに0〜7の整数とした場合には、TM_OUTは、後述する発音時に設定される一定値で構わないため、ステップ9_2の処理は不要となる。
【0112】
また、ステップ9_3でタイマ・チェインに挿入するにあたっては、タイマ・チェインを辿り、前のタスクのTM_OUTがそのタスクのTM_OUT以下であって、後のタスクのTM_OUTがそのタスクのTM_OUTよりも大きい場所を探し、前後のタスクおよびそのタスクのNEXT_TSKおよびPREV_TSKを書き換えることにより、そのタスクをその場所に挿入する。
【0113】
図10は、DORMANTコールに対するモニタの処理を表わしたフローチャートである。
【0114】
図10に示すフローでは、そのタスクの状態がDORMANT状態に変更されて(ステップ10_1)、スケジューラが起動される(ステップ10_2)。
【0115】
前述の様に、WAIT状態のタスクは時間経過に伴って起動され、DORMANT状態とされたタスクは時間経過にかかわらず起動されなくなる。
【0116】
図11は、発音タスクのフローチャートである。
【0117】
ステップ11_1〜11_4は、従来技術(図17参照)と同様であり、最後の処理(ステップ11_5)およびモニタコール内容のみが従来と異なる。
【0118】
ステップ11_5に示すように、タイムアウト時刻TM_OUTは発音タスクの起動時の時刻TMの値で初期化される。
【0119】
また、従来技術ではサービスタスクは全ボイスに共通であったが、本実施形態では各ボイス毎にサービスタスクを設けるようにしたため、発音タスクからモニタに対して発音したボイスのサービスタスクを生成するように依頼する(TASK GENERATEコール)。モニタは、これに応じて、図9に示したWAITコール対する処理と類似の処理を行なう。具体的には、発音タスクを発音イベント待ち状態に遷移させるとともに、依頼されたボイスのサービスタスクをWAIT状態に遷移させ(ステップ9_1と同様)、そのサービスタスクのタイムアウト時刻を設定し(ステップ9_2と同様)、そのサービスタスクのタイムアウト時刻に応じてそのサービスタスクをタイマー・チェインに挿入し(ステップ9_3と同様)、そのサービスタスクの退避エリアを初期化し、スケジューラを起動する(ステップ9_4と同様)。タイムアウト時刻TM_OUTは発音タスク起動時の時刻TMの値にサービスタスクの起動周期srv_intervalが加算された値となるので、次回にそのボイスのサービスタスクが起動されるのはサービスタスクの起動周期srv_interval分の時間が経過した後となる。なお、TM、TM_OUTをもとに0〜7の範囲内の整数とした場合には、この処理は
TM_OUT=TM
とするだけで構わない。退避エリアの初期化は、レジスタの内容を所定の値とし、プログラムカウンタの内容をそのサービスタスクのプログラムの先頭位置とし、さらにこれらのレジスタおよびプログラムカウンタをスタックにプッシュしそれに応じてスタックポインタの値を設定することにより行なう。
【0120】
図12は、サービスタスクのフローチャートである。
【0121】
counter[voice]を更新し(ステップ12_1)、前回のサービスから所定時間経過後の音高、音質、音量を求め(ステップ12_2)、ボイスに供給し(ステップ12_3)、発音中の場合には(ステップ12_4)モニタからのタイマ・イベント待ち状態となる点に関しては、従来技術と本質的に同じであるが、本実施形態では各ボイス毎にサービスタスクを設けるようにしたため、発音が終了したら(ステップ12_4)そのボイスのサービスタスクをDORMANT状態とするようモニタに依頼する点が異なる。モニタはこのDORMANTコールに対して前述の処理を行ない、そのボイスのサービスタスクをDORMANT状態に遷移させる。DORMANT状態のボイスは、以後、新たに発音が割り当てられ、WAIT状態に遷移されるまではサービスタスクが起動されないようになる。このため、処理する必要のないサービスが起動されることがなくなりCPUの負荷が不必要に重くなるのを防ぐことができる。
【0122】
この手法を使うと、初期発音と初回サービスとの間隔が正確に保てるようになる。例えば、タイマからの割り込みの時間間隔を1ミリ秒、srv_intervalを8ミリ秒と設定したとすると、初期発音と初回サービスとの間隔は7ミリ秒ないし8ミリ秒となり、最大でも1ミリ秒以内の誤差で起動される。
【0123】
尚、本実施形態ではボイスの発音が終了した場合に、そのボイスのサービスタスクをDORMANT状態とすることにより起動しないようにしたが、別の手法を用いるようにしてもよい。例えば、各タスク毎にそのタスクが待っている(WAIT)対象のイベントを設定し、スケジューラは優先順位に従いタスクをスキャンし、個々のタスクがどのようなイベントを待って(WAIT)いるか、どのようなイベントが発生しているかを調べ、あるタスクの待っているイベントと発生しているイベントが合致した場合に、そのタスクを起動するするようにしてもよい。尚、この場合には、発音が終了したボイスのサービスタスクに関しては、タイマによるイベントを待つ対象から外すように設定すればよい。
【0124】
なお、上記の説明では各サービスタスクが起動されるタイミングを図6に示す各サービスタスク毎に設定したタイムアウト時刻およびタイマ・チェインによって管理するようにしたが、いずれのタイミングでいずれのサービスタスクを起動するかが管理できれば上記に示した以外の方法でも構わない。例えば、実施形態1で示したものと同様に、各タイミング毎に起動すべきサービスタスクをリスト化して管理するようにしてもよい。あるいはタイムアウト時刻の代りに実施形態1で示したものと同様に各スロット毎に起動すべきサービスタスクをリスト化して管理するようにしてもよい。
(実施形態2の変形例)
ところで、上述の実施形態2では、サービスタスクの起動周期は一定としたが、発音直後はより短い周期で発音タスクを起動するようにしてもよい。
【0125】
短い時間周期で木目細かくサービスを行なった方が楽音の品質が向上するが、CPUの負荷が重くなり現実には困難である。しかし、以下の点に着目して、発音直後の、楽音の品質に特に影響のある部分に関してのみサービスの周期を短くすることにより、CPUの負荷をほとんど重くせずに楽音の品質を大きく向上させることが可能となる。
【0126】
(1)木目細かなサービスが必要となるのは楽音の特質の変化が激しい部分である。
【0127】
(2)楽音のアタック部分は楽音の特質の変化が激しい。
【0128】
(3)楽音のアタック部分は楽音の特色を特に強く印象付ける部分である。
【0129】
(4)楽音のアタック部分は短時間である。サービス周期を短くすることによってCPUの負荷が増すことになり他のボイスに対するサービスの遅延が生じるおそれがあるが、アタック部分は短時間であるため負荷の増加期間が短く他のボイスに対するサービスへの影響が小さい。
【0130】
以下その処理例を示す。
【0131】
図13は、発音タスクのフローチャートである。
【0132】
この図13のフローチャート中の記号の意味は、以下のとおりである。
【0133】
(a)atack_counter[voice]:そのvoiceの発音後一定時間経過を認知するためのカウンタである。
【0134】
(b)srv_interval[voice]:そのvoiceのサービスタスクの起動周期を示す変数である。
【0135】
(c)srv_int_std:サービスタスクの標準起動周期を示す定数である。これは前記実施形態2のsrv_intervalと同じ値である。
【0136】
ステップ13_1〜13_4は、前記の実施形態2と同様であり、前記の実施形態2と異なるのは、発音後一定時間を認知するためのカウンタをボイス毎に設け0で初期化する処理(ステップ13_5)を追加した点と、サービスタスクが起動されるまでの時間を8分の1に短くした(ステップ13_6)点である。具体的には、前記実施形態2のsrv_intervalと同じ値の、サービスタスクの標準起動周期を示す定数srv_int_stdを設け、前記実施形態2で定数としたsrv_intervalをボイス毎に設けて変数とし、発音タスクにおいてsrv_int_stdの8分の1で初期化している。尚、モニタでは、WAITコール、TASK GENERATEコールに対応して、そのボイスに対応するsrv_interval[voice]を用いてそのタスクの次の起動時刻を設定する。従って、ボイス毎にサービスタスクの起動周期が異なるようになる。
【0137】
このため前記の実施形態2では発音タスクが起動してから8mS(正確には7〜8mS)後にサービスタスクが起動されたが、本実施形態では1mS(正確には0〜1mS)後にサービスタスクが起動される。
【0138】
図14は、サービスタスクのフローチャートである。
【0139】
この図14のフローチャート中の変数の意味は、以下のとおりである。
【0140】
(a)MAX_ITVL:発音後細かくサービスをする期間を意味する定数である。
【0141】
srv_intervalは発音タスクでサービスタスクの標準起動周期の8分の1とされているので、発音後一定時間はサービス周期は標準の8分の1となる。一定時間を計るのがatack_counterであり、MAX_ITVL回サービスが行なわれるまでは(ステップ14_1)サービス周期を標準の8分の1に保ち(ステップ14_2〜14_3)、それを過ぎたら標準に戻す(ステップ14_4〜14_5)。このため例えばサービスタスクの標準起動周期が8mSに設定されている場合には、発音直後の一定時間のみサービスタスクの起動周期は1mSとされる。尚、MAX_ITVLは楽音の特質の変化が激しい期間に対応して決めればよく、例えば20mSに対応する値とする。すなわち、発音直後に1mSでサービスタスクが起動される場合には例えば20とする。
【0142】
図14に示すフローにおけるステップ14_6〜14_8は、前述した実施形態2のフロー(図12のステップ12_2〜12_4)と同様である。
【0143】
尚、ここでは全てのボイス(サービスタスク)が同一優先順位であるかのように説明したが、srv_intervalの値が小さいボイスを優先的に処理するようにすれば、複数のボイスが発音中でCPU負荷が大きい場合においても、より精密なアタックが再現できる。そのためには、例えば、モニタのWAITコールに対応してサービスタスクをタイマ・チェインに挿入する処理において、挿入しようとするタスクのTM_OUTと同じ値のTM_OUTのタスクが既にタイマ・チェインにつながれている場合に、それらのタスクのsrv_intervalを比較し、小さい方のタスクが前になるように挿入すればよい。
【0144】
また、この実施形態ではサービス間隔を1ミリ秒もしくは8ミリ秒と2段階に設定したが、atack_counterあるいはcounterを段階的に判断し、その中間値やもっと長い間隔など、細かく変化するようにしてもかまわない。
【0145】
なお、この実施例では発音直後の部分に対してサービス間隔を短くしたが、これ以外の場合にも楽音の特質の変化が激しい部分等に関してサービス間隔を短くするようにしてもよい。また、逆に楽音の特質の変化があまりない部分等に関してサービス間隔を標準サービス間隔よりも長くしてもよい。この場合には楽音の品質にあまり影響を与えることなくサービス全体に対する負荷を低減させることが可能となる。
【0146】
なお、前記実施例1、2では各ボイスに対するサービスタイミングを管理するのにあたって、時間経過後に従って変化する時間スロット毎にボイスを管理したり(実施例1)、時間経過に従って変化する時刻に対応してボイス毎に次にサービスされる時刻を管理したり(実施例2)といった方法を使用したが、各ボイスに対するサービスタイミングが管理できれば別の方法を使用してもよい。
【0147】
例えば、ボイス毎に次にサービスされるまでの待ち時間を管理するようにし、サービスを行なう度に待ち時間をサービス周期に対応する値に初期化し所定時間毎に各ボイスの待ち時間を減少させ待ち時間が0になった場合にはそのボイスに対するサービスを行なうようにしたり、あるいは、ボイス毎に前回のサービスからの経過時間を管理するようにし、サービスを行なう度に経過時間を0に初期化し所定時間毎に各ボイスの経過時間を増加させ経過時間がサービス周期に対応する値になった場合にはそのボイスに対するサービスを行なうようにしてもよい。あるいは、次にサービスされるまでの待ち時間毎に対応するボイスを管理するようにし、サービスを行なう度にそのボイスをサービス周期に対応する待ち時間に登録し所定時間毎に各待ち時間を減少させ待ち時間が0になった場合にはその待ち時間に登録されていたボイスに対してサービスを行なうようにしたり、あるいは、前回のサービスからの経過時間毎に対応するボイスを管理するようにし、サービスを行なう度にそのボイスを0の経過時間に登録し所定時間毎に各経過時間を増加させ経過時間がサービス周期に対応する値になった場合にはその経過時間に登録されていたボイスに対してサービスを行なうようにしてもよい。
【0148】
あるいは、自動演奏装置における自動演奏データのタイミング管理記憶方法と同様に、ボイスのサービスされる順番及びボイス毎に前のボイスのサービスからそのボイスのサービスまでの時間間隔あるいはそのボイスのサービスから次のボイスのサービスまでの時間間隔を管理するようにし、自動演奏データの読み出し処理と同様に、これらのサービス管理情報を時間経過に従って読み出すようにしてもよい。この場合、ボイスの順番を管理するには実施例1で示したようなリンク構造とすればよい。またこの場合、発音要求に応じて新たにサービスするボイスが出現した場合あるいは発音終了に応じてサービスを取止めるボイスが出頭した場合にはそれに応じてボイスの順番および時間間隔を書換えるようにする。
【0149】
あるいは、前記実施例1、2ではタイマ割込みを行なうタイマを全ボイス共通に1つだけ設けるようにしたが、各ボイス毎にサービス周期を計測するタイマを設け、各タイマのタイマ割込みに応じて対応するボイスに対してサービスを行なうようにしてもよい。この場合、初期発音の処理時に次のタイマ割込みがサービス周期に対応する時間後にかかるようにそのタイマを初期かするようにする。あるいは実施例1と同様に各スロット毎にサービス周期を計測するタイマを設け、各タイマのタイマ割込みに応じてそのスロットに対応するボイスに対してサービスを行なうとともにサービス周期後に次のタイマ割込みがかかるようにそのタイマ初期化するようにしてもよい。
【0150】
さらに実施例1、2、これらを変形させた方法、および上記の方法を適宜組合せるようにしてもよい。実施例1、2を組合せた方法として例えば以下のようにしてもよい。実施例2に示したように各ボイス毎にサービスタスクを設け、各サービスタスクの起動タイミングの管理方法を実施例1に示した方法とする。すなわち時間を複数のスロットに分割し各スロット毎にそのスロットのタイミングにおいて起動すべきサービスタスクを登録し、各スロットタイミング毎にスロット番号に基づいてそのスロットに登録されているサービスタスクを起動するようにする。この場合、サービス周期を一定とし一サービス周期でスロットが一巡するようにスロット数を決めた場合にはスロットへのサービスタスクの登録は実施例1に示したように初期発音の処理時にのみ行なえばよい。また、実施例2に示したようにサービスタスクの標準起動周期よりも短い間隔でサービスタスクを起動させたい場合には、サービ毎にサービスタスクを次に起動すべきタイミングに対応するスロットへ登録するようにすればよい。さらにサービス周期をスロットの一巡する周期よりも長くしたい場合にはサービス毎にそのサービスタスクを次に起動すべきタイミングに対応するスロットへ登録するとともに、実施例2に示したようにサービスタスク毎に次に起動されるべき時刻を登録するようにすればよい。
【0151】
この場合、具体的には次のようにすればよい。モニタで現在時刻TMを1mS毎に1づつ増やし0〜127の間で変化するようにし、この現在時刻TMの下位3ビットの値を現在スロットとする。従ってスロットは0〜7で変化する。実施例2に示した処理方法で各サービスタスク毎に次回のサービス時刻を示すタイムアウト時刻TM_OUTを求めTCBに記憶しておくとともに、サービス時刻TM_OUTの下位3ビットに対応するスロットにそのサービスタスクを登録する。モニタは1mS毎に現在スロットに対応して登録されているサービスタスクのうち現在時刻TMと一致するタイムアウト時刻TM_OUTのサービスタスクをREADY状態とする。
【0152】
このようにすれば、現在スロットに対応して登録されているサービスタスクのみを検索するだけで現在時刻で起動すべきサービスタスクを見つけることができるので処理が高速に行なえるのみならず、サービスタスクを登録すべきスロットを見つける処理も高速に行なえ、さらにスロットへの登録処理も高速に行なえる。また、このようにすれば実施例2で示したように標準サービス周期よりも短い1mSなどのサービス周期が実現でき、さらに標準サービス周期よりも長い16mSや24mSなどのサービス周期も実現できる。
【0153】
なお、この場合、スロットへのサービスタスクの登録方法を1で示したようなリンク構造とした場合、サービスタスクを実施例1で示したように発音開始順に並べてもよいし、実施例2で示したようにタイムアウト時刻の順に並べてもよい。前者の場合には、起動すべきサービスタスクを見つける場合にそのスロットに登録されている全てのサービスタスクをチェックする必要があるがサービスタスクをつなげるリンク上の位置が決まっているのでサービスタスクを登録する処理が高速に行なうことができる。後者の場合には、サービスタスクをつなげるリンク上の位置を探す処理が必要となるが、起動すべきサービスタスクを見つける場合にはリンクの先頭をチェックするだけでよいので処理が高速に行なえる。
(実施例3)
この実施例3は、本発明の第2の楽音生成装置の一実施例である。
【0154】
この実施例3では、前述の実施例1,2とは異なり、初期発音が終了してから初回サービスが起動されるまでの時間を計測し、楽音の特質パラメータの変化のための時間情報に反映させる。すなわち実施例1,2が初期発音が終了してから初回サービスが起動されるまでの時間がなるべく一定となるようにして、その一定時間に応じた楽音の特質パラメータを求めるようにしていたのに対して、実施例3では、従来の技術と同様に、初期発音が終了してから初回サービスが起動されるまでの時間が変動するのを許し、その代りにその時間を計測し、計測された時間に応じた楽音の特質パラメータを求めるようにする。
【0155】
一般にサービスタスクが定期的にボイスサービスを行なう場合、各ボイスには必ず経過時間を示す時間情報が存在し、その時間情報に基づき楽音の特質の時間変化を求める。通常、ボイスサービスを行なう度にこの時間情報を一定量増加させることで時間管理を行なう。
【0156】
実施例3では発音タスクが発音を終えた時、サービスタスク起動用のタイマを読み、サービス起動間隔中のどの時点で発音が行なわれたかを示す情報を得る。この値を発音ボイスに対応したバッファにストアすることで、サービスタスクは、経過時間を、0からではなく実際に初期発音が終了してから初回サービスが起動されるまでの時間からスタートさせる。
【0157】
ここでは、一例として、ボイスサービスの間隔を8ミリ秒とする。この場合、初期発音と初回サービスの実間隔は0〜8ミリ秒の間で不定である。
【0158】
一般に、CPUのタイマ・インタラプトを用いる場合、比較レジスタに値を設定し、タイマ・カウンタをクロックによってカウントアップさせ、比較レジスタと値が等しくなった時点で割り込みがかかり、その時点でタイマ・カウンタをクリアするような処理を繰り返し行なう。
【0159】
いま比較レジスタの設定値をTsとすると、サービスを8ミリ秒で起動させるにはタイマ・カウンタを0からカウントアップしてTsに至るまでの時間が8ミリ秒になるよう、クロック周波数とTsを設定しておけば良いことになる。
【0160】
ここで、任意の時間におけるタイマ・カウンタの値Tcは、0〜Ts内にあることになるが、
Tc/Ts
を求めると、その値は8ミリ秒というサービス間隔内のどの時点(割合)に存在しているかという意味になる。ここでcnt_incをサービスタスクの起動周期に対応する時間経過を示す定数とすると、
Tc/Ts*cnt_inc
は前回のタイマ・インタラプトからの経過時間すなわち前回のサービスタイミングからの時間経過を示していることになる。従って、発音タスク起動時のタイマ・カウンタの値Tcに基づいて上記の値を負にした
−Tc/Ts*cnt_inc
で、初期発音以降の経過時間を表現する変数counterを初期化すれば、サービスタスクにおいて、初期発音以降の経過時間を表現する変数counterの値がサービスタスクの起動周期に対応する時間経過を示す定数cnt_incの分だけ増加された後に、その変数counterに基づいてサービスが行なわれるので、初期発音の後の初回のサービスの時にはcounter=(Ts−Tc)/Ts*cnt_incとなり、初期発音が終了してから初回サービスが起動されるまでの実際の経過時間に基づいて特質パラメータ(エンベロープ、LFOなど)を求めることができる。
【0161】
図15は、発音タスクのフローチャートである。このフローチャート中、ステップ15_1〜15_3、15_5は従来と同じであり、図7のステップ17_1〜17_3、17_5にそれぞれ対応している。
【0162】
上述の理由により、発音タスクでは、発音処理に伴い、−Tc/Ts*cnt_incを、発音ボイスに応じた初期発音からの経過時間を示すバッファcounter[voice]に記憶する(ステップ15_4)。
【0163】
尚、サービスタスクは従来技術と同じ処理を行なう(図18参照)。
【0164】
これにより、初期発音とサービスの同期をとらなくても、従来よりもはるかにいびつさのないエンベロープが形成できる。
【0165】
尚、初期発音が終了してから初回サービスが起動されるまでの実際の経過時間に基づいてcounterの値が補正されれば、上記実施例3の方法に限らず、他の処理方法をとってもよい。例えば、上述した実施例3ではサービスタスクでは経過時間パラメータcounterを増加させた後に特質パラメータを求めているが、特質パラメータを求めた後に経過時間パラメータcounterを増加させる場合には、発音タスクでは経過時間パラメータを(Ts−Tc)/Ts*cnt_incで初期化すればよい。あるいは発音タスクでは経過時間パラメータcounterを0で初期化し初回のサービスタスクのみ経過時間パラメータcounterを(Ts−Tc)/Ts*cnt_incだけ増加させてもよい。この場合はサービスタスクが初回サービスであることを認識する為の手段が必要となる。このため発音タスクは、初期発音を終了させると発音完了を示すフラグをセットするようにし、サービスタスクはこのフラグが立っていたらそのサービスはそのボイスにとって第1回目のサービスであると考え、時間管理のカウンタcounterに対し(Ts−Tc)/Ts*cnt_incを加算しそのフラグをリセットするようにすればよい。
(実施例4)
この実施例4は、本発明の第3の楽音生成装置の一実施例である。
【0166】
この実施例4では、実施例3と同様に初期発音が終了してから初回のサービスが起動されるまでの時間が変動するのを許し、その代りに初回のサービスはサービスタスク起動周期の半分の時間に基づいて特質パラメータ(音量、音質、音高など)を求める。すなわち、初回のサービスでは通常の半分だけ楽音の特質を変化させる。サービス起動周期の半分の時間というのは非同期で動いている発音タスクとサービスタスクの時間間隔の平均値に等しい。そのため自然なエンベロープ、LFOを描く可能性が最も高くなる。
【0167】
すなわち、前記実施例3では、発音タスクから初回のサービスタスクまでの実際の経過時間に基づく特質パラメータを求めたのに対し、本実施例4では発音タスクから初回のサービスタスクまでの平均経過時間に基づいて特質パラメータを求める、ということである。
【0168】
図16は、発音タスクのフローチャートである。
【0169】
ここでは、発音タスクで経過時間パラメータcounterをサービスタスク起動周期を示す定数cnt_incの−1/2で初期化し(ステップ16_4)、サービスタスクでは経過パラメータcounterを起動周期cnt_incの分だけ増加させた後に特質パラメータを求める。
【0170】
尚、サービスタスクは従来技術と同じ処理を行なう(図18参照)。
【0171】
これにより、初期発音とサービスの同期をとらなくても、従来よりもはるかに高い頻度でいびつさのないエンベロープが形成できる。
【0172】
尚、発音タスクから初回のサービスタスクまでの平均経過時間に基づいてcounterの値が補正されれば他の処理方法をとってもよく、実施例3で説明したのと同じバリエーションが使える。
【0173】
また、上記実施例1〜4では、サービスタスクにおいて、初期発音からの経過時間あるいは現フェーズ開始時からの経過時間を示すcounterに基づいて新たな特質パラメータ(エンベロープ、LFOなどの値)を求めているが、特質パラメータを時間経過に従ってサービス毎に変化させることができれば他の処理方法を用いてもよい。例えばその時点の特質パラメータの変化速度に応じてサービス周期に対応する時間経過毎の特質パラメータの変化量を求め、この分だけ前回のサービス時の特質パラメータを変化させる処理によって新たな特質パラメータを求めるようにしてもよい。すなわち、前回のサービス時の特質パラメータをL_old、今回のサービス時の特質パラメータをL_new、サービス周期に対応する時間経過毎の特質パラメータの変化量をL_incとして、
L_new=L_old+L_inc
を各サービス毎に行なうようにする。
【0174】
この場合、実施例3では上記式の処理を各サービス毎に行なうようにするが、初期発音後の初回サービスのみは結果的に
L_new=L_old+L_inc*(Ts−Tc)/Ts
が行なわれるようにする。実施例4では同様に初期発音後の初回サービスのみは結果的に
L_new=L_old+L_inc/2
が行なわれるようにする。
【0175】
尚、上述のいずれの実施例1〜4も、発音要求直後の処理に関して説明したが、消音要求(ノート・オフ)直後に関しても同様の処理を施すようにしてもよい。これによりノート・オン直後だけではなくノート・オフ直後のエンベロープ変化についても同様に正確に再現可能である。
【0176】
【発明の効果】
以上説明したように、本発明によれば、従来と比べ、楽音生成開始時の楽音の特質の変化の劣化を防ぐことができる。
【図面の簡単な説明】
【図1】 実施例1における、モニタの構成を示すフローチャートである。
【図2】 実施例1における発音タスクの構成を示すフローチャートである。
【図3】 図2に示す発音タスクの部分フローを示す図である。
【図4】 実施例1における、サービスタスクの構成を示すフローチャートである。
【図5】 図4に示すサービスタンクの部分フローを示す図である。
【図6】 タスク管理ブロック(TCB)の構造図である。
【図7】 モニタで用いられるレジスタの名称を示した図である。
【図8】 モニタ処理プログラムのフローチャートである。
【図9】 WAITコールに対するモニタの処理を表わしたフローチャートである。
【図10】 DORMANTコールに対するモニタの処理を表わしたフローチャートである。
【図11】 発音タスクのフローチャートである。
【図12】 サービスタスクのフローチャートである。
【図13】 発音タスクのフローチャートである。
【図14】 サービスタスクのフローチャートである。
【図15】 発音タスクのフローチャートである。
【図16】 発音タスクのフローチャートである。
【図17】 従来の発音タスクを示すフローチャートである。
【図18】 従来のサービスタスクのフローチャートである。
【図19】 エンベロープの変化の一例を示す模式図である。
【図20】 エンベロープによって制御される楽音の特質の、想定された変化状態を示す図である。
【図21】 初期発音のタイミングとサービスの起動タイミングとの関係の一例を示す図である。
【図22】 エンベロープによって制御される楽音の特質の、実際の変化状態の一例を示す図である。[0001]
BACKGROUND OF THE INVENTION
The present invention relates to a musical sound generation apparatus that includes a sound source and generates a musical sound by performing sound generation control on the sound source in response to a musical sound generation instruction.
[0002]
[Prior art]
The sound generation control for the sound source is roughly divided into two parts. One is “Initial Pronunciation” and the other is “Voice Service”. Hereinafter, “voice service” may be simply referred to as “service”. These initial pronunciation and voice service processes are generally performed by a CPU.
[0003]
The initial pronunciation refers to the so-called voice assigned in response to a pronunciation request (note-on), such as the pitch (pronunciation key number by key press) and strength (key press velocity) indicated by the pronunciation request. The sound generation process is performed on the basis of the sound (characteristic parameters such as pitch, sound quality, and volume are obtained and given). Here, “voice” refers to a musical sound generating means for generating one musical sound at a time. The musical sound generation circuit is provided with a plurality of voices so that a plurality of musical sounds can be generated simultaneously. Selecting one of the voices in response to the sound generation request and assigning the sound generation request to the selected voice is referred to as “assignment”. A means for performing the assignment is referred to as “assigner”. In an embodiment of the present invention to be described later, an assigner task assigns, and therefore, in the following description, the assigner task may be simply referred to as an assigner.
[0004]
The service changes the sound quality parameters such as pitch, sound quality, volume, etc. of each voice at regular intervals and supplies them to the voice. This process can change the time characteristics of the musical sound being generated by that voice. It is.
[0005]
Specifically, an envelope and LFO are generated by these initial pronunciations and services, and the characteristic parameters of the musical tone are controlled based on the generated envelope and LFO. That is, the envelope and LFO values change with time depending on the service.
[0006]
When controlling a plurality of voices in a multitask configuration, these initial pronunciations and services are often divided and implemented in different tasks. The reason is,
(1) Since the service obtains the pitch, sound quality, and volume of all voices that are currently sounding and gives them to the voices (usually at intervals of several milliseconds to several tens of milliseconds for each voice), the steady load is large. . However, even if processing is delayed to some extent, it does not sound so unnatural.
[0007]
(2) On the other hand, since the initial sound generation process only needs to be performed when a sound generation request (note-on) is received, the steady load can be reduced, but it is not possible if the time from the start of the note-on until the start of sound generation is delayed. Natural and difficult to play as a musical instrument.
This is due to the different nature.
[0008]
Therefore, it is conceivable to implement a multitask control by implementing a real-time monitor or the like. In that case, the service processing task periodically performs service processing and implements a pronunciation task that performs initial pronunciation with higher priority. By doing so, even if the service load is heavy, the initial pronunciation is given the highest priority, and there is little unnaturalness in hearing.
[0009]
In the following description, a task that performs initial pronunciation is referred to as a “sound generation task”, and a task that performs periodic service is referred to as a “service task”. In the following description, “real time monitor” may be simply referred to as “monitor”.
[0010]
A conventional method will be described.
[0011]
FIG. 17 is a flowchart showing a conventional pronunciation task.
[0012]
In this flowchart, “sounding voice number” refers to the number of a voice used for sounding. In addition, the meanings of symbols in this flowchart are as follows. In addition, when the same symbols as those in the flowcharts described earlier appear in each flowchart described below, duplicate descriptions are omitted unless the meanings of the same symbols are different. Sometimes. It is assumed that variables used in each task (all tasks including the sound generation task) are initialized when the power is turned on.
[0013]
(A) voice: Voice number. In the pronunciation task, the voice number given by the assigner task is shown.
[0014]
voice = 0 to MAX_VOICE
However, MAX_VOICE indicates the maximum value of the voice number.
[0015]
(B) counter [voice]: A variable representing the elapsed time since the initial sounding of the voice.
[0016]
(C) serv_flag [voice]: a flag indicating that the voice is being sounded.
[0017]
Actually, there is a MIDI reception task or keyboard scan task, etc. above the pronunciation task. When a pronunciation request is detected by the MIDI reception task, keyboard scan task, etc., the assigner task is subsequently activated and voice assignment is performed. Done. Or, even if it is not a separate task, the same processing is performed before the processing of the sound generation task. As a result of the voice assignment, a sound generation event is generated from the assigner task, thereby starting the sound generation task.
[0018]
Incidentally, MIDI (Musical Instrument Digital Interface) is a communication protocol widely used in the field of electronic musical instruments.
[0019]
The sound generation task shown in FIG. 17 receives the given note-on information from the higher-level task (step 17_1), generates an envelope and LFO at the time of sound generation according to the information, and parameters of volume, sound quality, and pitch according to it. Is obtained (step 17_2).
[0020]
Further, parameters are given to the voice designated by the assigner to perform initial pronunciation (step 17_3).
[0021]
After that, the time counter counter [voice] is initialized to 0 (step 17_3), the flag serv_flag [voice] is set to notify the service task that the initial pronunciation has been completed (step 17_5), and generated from the assigner task again. It will be in the state of waiting for the pronunciation event.
[0022]
FIG. 18 is a flowchart of a conventional service task. The meanings of the symbols in this flowchart are as follows.
[0023]
(A) cnt_inc: a constant representing the passage of time corresponding to the service task activation cycle, for example, representing the passage of time of 8 mS.
[0024]
In practice, for example, the monitor generates a timer event in response to a timer interrupt that occurs at a period of 8 ms, and thereby a service task is activated.
[0025]
Note that the service task again waits for a timer event after the processing is completed.
[0026]
In the service task of FIG. 18, since the serv_flag is scanned, the currently sounding voice number is known (steps 18_1, 18_2, 18_7, 18_8). For all the currently sounding voices, the timer time from the time when the previous service was performed. After the (service task activation cycle), the envelope and LFO are obtained (step 18_3), and the pitch, sound quality, and volume are obtained based on this and supplied to the voice (step 18_4). If the volume level indicated by the volume envelope obtained at a certain point in time is 0 and all phases of the envelope (envelope, attack, decay, sustain, release, etc.) have ended, in other words, the sound ends. Then (step 18_5), the serv_flag of the voice is cleared (step 18_6).
[0027]
Note that the envelope has different time and level settings for each phase, so the counter is not time-controlled to correspond to the actual elapsed time after the initial sounding, but the maximum value of the counter is determined and specified for each phase. A cnt_inc value that causes the counter to overflow as a result of elapse of time may be calculated for each phase. That is, in this case, the counter represents the relative elapsed time after the start of the current phase, not the elapsed time after the initial pronunciation. Of course, even in this case, if the new phase is an attack, the counter represents the relative elapsed time after the initial pronunciation. In this case, cnt_inc is not a constant, but must be stored as a variable for one voice section for each voice.
[0028]
In order to obtain the envelope level and phase based on the counter, for example, the following processing is performed.
[0029]
As shown in FIG. 19, in a certain phase, when the envelope level is linearly changed from level L1 to level L2 during time T, cnt_inc is obtained from time T when the phase is switched. Specifically, the formula
cnt_inc = service_time × counter_max / T
To obtain cnt_inc. However, service_time is a constant indicating the service period, and counter_max is a constant indicating the maximum value of the counter. here,
counter_max ≧ counter ≧ 0
And This means that “counter overflows after the elapse of time T if cnt_inc is continuously added to counter every service time”.
[0030]
Next, the counter is cleared to 0, and after that, cnt_inc is added every time the service is performed, and the counter overflow is checked. If it has overflowed, it indicates that the phase has been completed, so it switches to the next phase.
[0031]
If there is no overflow, the current level L of the envelope is calculated based on the counter. When the envelope is changed linearly, for example, the following processing is performed.
[0032]
L = counter / counter_max * (L2-L1) + L1
Also, when changing the envelope in a curve,
L = F (counter / counter_max) * (L2-L1) + L1
Here, F (t) is a function table (1 ≧ t ≧ 0) indicating an arbitrary curve, F (0) = 0, and F (1) = 1.
Or
L = F (counter / counter_max) * (L1-L2) + L2
However, F (t) is a function table (1 ≧ t ≧ 0) indicating an arbitrary curve, F (0) = 1, and F (1) = 0.
The following process may be performed.
[0033]
[Problems to be solved by the invention]
In the conventional method described above, the sound generation task starts sound generation in synchronization with the note-on, but the service task is activated at regular intervals regardless of the note-on timing. Therefore, the time from the initial pronunciation to the first service varies. In other words, even if the processing speed such as computation is ignored, an error is generated by the maximum of the timer time of the service task (service time; service task activation time interval).
[0034]
However, in the service task, the envelope and LFO after the timer time from the previous service are obtained, and the pitch, sound quality, and volume are obtained. That is, the actual elapsed time from the initial pronunciation to the first service is different from the elapsed time for obtaining the pitch, sound quality, and volume. For this reason, it is possible that the attack part of the envelope and the LFO curve become more distorted than the second and subsequent service parts.
[0035]
Between the pronunciation task and the service task implemented by the algorithm like the above flow, the time interval between the pronunciation task and the first service is sparse, and the variation is
0 ≦ Variation <Service interval
become.
[0036]
An explanation will be given using an envelope as an example.
[0037]
For example, assuming that the service level is 8 milliseconds and the maximum level is reached and maintained at 16 milliseconds from the start of sound generation, the sound generation task and the service task are assumed to be as shown in FIG. Find characteristic parameters. The vertical axis in FIG. 20 represents the pitch, sound quality, volume, etc. controlled by the envelope.
[0038]
However, since the service task is activated every 8 milliseconds irrespective of the sound generation task, in practice, the initial sounding timing does not coincide with the service activation timing as shown in FIG. As a result, for example, when a sound generation event occurs at the timing shown in FIG. 21, the shape of the envelope becomes insignificant as shown in FIG.
[0039]
The attack part of the musical sound, especially the attack part, is an extremely important element in determining the image of the timbre, but with the conventional method, the shape of the attack envelope is deformed due to the above time error. The sound was degraded. In the above description, the envelope is taken as an example in which the deterioration of the musical tone is remarkable, but the same applies to the case of LFO.
[0040]
In order to reduce this deterioration, a method of shortening the timer time interval can be considered, but simply shortening the time does not allow all voice service processing within the timer time, and adversely affects the envelope shape other than the attack. There is a problem of end. If a CPU capable of high-speed processing is used, the problem can be avoided, but in that case, a problem arises that the cost of hardware increases.
[0041]
In view of the above circumstances, the present invention can suppress a processing delay as compared with the prior art even when a relatively inexpensive CPU is used, and can generate an envelope shape and an LFO shape more faithfully. The purpose is to provide.
[0042]
[Means for Solving the Problems]
The musical sound generator of the present invention is
A plurality of musical sound generating means each responsible for generating one musical sound at a time,
Immediately upon receipt of the sound generation instruction, a sound generation start means for performing first sound generation control for starting generation of a musical sound for which sound generation is instructed with the characteristics at the time of sound generation for any one of the plurality of music sound generation means;
A service means for performing second sound generation control for changing a characteristic of a musical sound being generated by the musical sound generating means for each of the musical sound generating means being generated;
Service period notifying means for notifying the progress of one period for each predetermined service period;
The characteristic of the musical sound being generated by the musical sound generating means is that the first notice of one cycle has been received from the service notifying means after the first sound generation control is performed on the musical sound generating means. At the time of the first time, the characteristic changes to the characteristic at the time when one half of the period of the service cycle has elapsed, and after the first time, the characteristic changes to the characteristic of one period for each service period. Service control means for controlling the service means
It is provided with.
[0043]
Here, “immediately” may, of course, be immediately after receiving a sound generation instruction. However, in general, in the case of digital control, control in synchronization with a predetermined clock is often performed. This includes the case where the above-described first sound generation control is performed after a time point synchronized with the clock, and the term “immediately” is interpreted as a term having such a width. However, this clock cycle (sounding delay) needs to be a cycle (delay time) shorter than the above-described service cycle in which a sounding start delay is allowed.
[0044]
According to the musical sound generating device of the present invention, when a sound generation instruction is received, generation of the musical sound instructed to be generated immediately by any of the plurality of music sound generating means is started with the characteristics at the time of sound generation start. Sound generation control is performed. Further, in the musical sound generating device of the present invention, the characteristics of the musical sound being generated every predetermined time regardless of the time when the musical sound generation means is started for the musical sound generating means that is generating the musical It changes to the characteristic after the time corresponding to the elapsed time until the pronunciation control. At this time, since the time from the start of tone generation control to the next tone generation control varies in various ways, this time is regarded as one-half of the predetermined time. With respect to the sound generation control, the characteristic of the musical tone is changed by an amount corresponding to one half of the predetermined time.
[0045]
Since the half of the predetermined time is equal to the average value of the time from the sound generation start control to the next first sound generation control, this first sound generation control can be performed with higher accuracy than before. Therefore, it is possible to prevent the deterioration of the characteristics of the musical sound at the start of musical sound generation.
[0046]
DETAILED DESCRIPTION OF THE INVENTION
Hereinafter, embodiments of the present invention will be described.
(Embodiment 1)
The first embodiment is an embodiment of the first musical sound generating apparatus of the present invention.
[0047]
In the first embodiment, the interval at which the monitor activates the service task is set more finely than the interval of the voice service. However, the service task does not process all voices each time it is activated, but scans voices and processes only voices corresponding to the slot number notified by the monitor. As a result, the accuracy of synchronization between the initial sound generation and the service can be increased without extremely increasing the load on the CPU.
[0048]
The slot referred to in the present embodiment is a time interval required for normal service divided into shorter times, and indicates a kind of current time. In the present embodiment, the actual voice service interval is 8 milliseconds, and the service task activation interval (slot time) is 1 millisecond.
[0049]
FIG. 1 is a flowchart illustrating the configuration of a monitor according to the first embodiment.
[0050]
Within the monitor, timer interrupts occur at 1 millisecond intervals. At this time, the monitor increments the variable slot by 1, obtains a remainder of 8 (% 8), writes it back to the slot (step 1_1), and issues an event to the service task (step 1_2). That is, the variable slot repeats every 1 millisecond, such as 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2,. Note that the surplus of 8 can be obtained by extracting the lower 3 bits of the target numerical value.
[0051]
The value of the variable slot at a certain time is referred to as the slot number at that time.
[0052]
FIG. 2 is a flowchart showing the configuration of the pronunciation task in the first embodiment. The meanings of the symbols in this flowchart are as follows.
[0053]
(A) slot-voice_1st: indicates a slot voice list.
[0054]
This slot voice list is a list showing the voice numbers of the voices that are being sounded in each slot in the order of sound generation. As an area for storing this list, as shown in Table 1, the number of voices + 1 is secured for each slot, and the whole list is [number of slots * (number of voices + 1)]. .
[0055]
[Table 1]
Figure 0003636395
[0056]
The four steps 2_1 to 2_4 from the top shown in FIG. 2 are the same as in the conventional example (see FIG. 17).
[0057]
In the fifth step 2_5 from the top, “obtaining the current slot number”, the pronunciation task may directly read the monitor variable slot, or conceal it in the monitor in order to prohibit writing from the task, For acquisition, the specification may be such that the task must issue a system call to the monitor.
[0058]
In step 2_6, “slot-voice_1st [p_slot] [END]” means the end (END) of the area in which the voice numbers in the list of slot numbers p_slot are stored.
[0059]
In the example of Table 1, voice numbers 5, 3, 6, 1 are stored in slot 0 (-1 means that no voice number is stored), and slot 1 has voice numbers 2, 8 , 4, 9, 11, 16 are stored. Here, the list of slot 0 is expressed as voices 5, 3, 6, 1 being connected.
[0060]
If the voice 19 is further generated at the timing of slot 0, the list is updated as shown in Table 2 in step 2_6.
[0061]
[Table 2]
Figure 0003636395
[0062]
That is, the voice 19 is connected to the list of the slot 0. In the above flowchart, for the sake of simplicity, the expression “add to the slot voice list” is used. However, this portion is actually expressed by the flow shown in FIG.
[0063]
That is, in the flow shown in FIG. 3, the end of the slot is searched (steps 3_1 to 3_3), the voice number is connected to the end portion (step 3_4), and then -1 which means the end is connected. (Step 3_5).
[0064]
Alternatively, in step 3_3 for calculating i + 1 in the flow shown in FIG. 3, a comparison with the maximum number of voices is made so as not to access an area exceeding the number of voices. The size is enough for the number of slots x the number of voices. If all voices are concentrated in one slot, -1 is not necessary.
[0065]
FIG. 4 is a flowchart showing the configuration of the service task.
[0066]
In the example of Table 2, if the slot number is 2 as a result of obtaining the current slot number (step 4_1), the voices 10, 0, 15, 22, and 17 are serviced (steps 4_2 to 4_7). , 4_9). That is, in a service task activated at an interval shorter than the service interval, each voice is scanned, a voice to be serviced at the current timing is selected, and the service is performed for the voice. At this time, for example, if the voice 15 has a release status and is at level 0 (step 4_7), the service task deletes the voice 15 from the slot voice list of slot 2 as shown in Table 3 (step 3). Step 4_8).
[0067]
[Table 3]
Figure 0003636395
[0068]
This flow is shown in FIG.
[0069]
In the flow shown in FIG. 5, when the i-th voice connected to the slot S is deleted, the voices connected behind it are sequentially moved forward one by one until −1 appears (step 5_3). It means to pack (steps 5_1, 5_2, 5_4).
[0070]
As mentioned in the pronunciation task, if you want to save slot-voice_lst to the number of slots x number of voices, compare it with the maximum number of voices before calculating j + 1 and exceed the number of voices. In such a case, it may be determined that the process ends.
[0071]
In the embodiment, the service time counter is counted in the increasing direction, but may be counted in the decreasing direction. In this case, it can be realized by subtracting cnt_inc instead of adding to counter.
[0072]
By performing the processing as described above, although all voices are serviced at intervals of 8 milliseconds, the time from the initial pronunciation to the first service can be kept within an error of 0 to 1 milliseconds. In other words, the time from the initial pronunciation to the first service can be suppressed within 1 millisecond from 7 milliseconds to 8 milliseconds.
[0073]
In the above embodiment, since the voice to be serviced is managed for each slot, it is possible to know the voice to be serviced at a certain slot timing without checking the voice management information of all slots. It is only necessary to check the voice management information, and the processing can be performed at high speed.
[0074]
In the above description, for the sake of simplicity, the relationship between slots and voices is stored in the format shown in Tables 1 to 3, but this method wastes many areas (above) (The part on the right side of the table in the table above has no meaning)) It is necessary to shift several voice numbers after the voice release, and it will be slow, so it may be a link structure. That is, in the example of Table 3, if the maximum voice number is 29, slot_top (the first voice number in each slot), slot_end (the voice number at the end of each slot), slot_next (the voice number of the next voice after each voice), And slot_prev (voice numbers of voices before each voice) are shown in Table 4, Table 5, Table 6, and Table 7, respectively.
[0075]
[Table 4]
Figure 0003636395
[0076]
[Table 5]
Figure 0003636395
[0077]
[Table 6]
Figure 0003636395
[0078]
[Table 7]
Figure 0003636395
[0079]
In this case, slot_top and slot_end are each accommodated by eight buffers, and slot_next and slot_prev are each accommodated by the same number of buffers as the number of voices. Also, shifting the voice number at the time of release is fast because it only rewrites the connection between the previous and next voices.
[0080]
Since the structure of the link structure is already known, the details are omitted.
[0081]
Here, it is assumed that sound source control is performed by multitasking by monitor control. However, in actual multitasking, competition between tasks occurs, so that the above-described rewriting of slot-voice_lst is protected. It is necessary to add functions. Also for this, a known technique such as semaphore may be used.
[0082]
In the above description, the relationship between the slot and the voice is managed by the method shown in Tables 1 to 7. However, if the voice service in which slot can be managed, the above is shown. Other methods may be used. For example, in the above embodiment, the voice corresponding to each slot is managed, but conversely, the slot corresponding to each voice may be managed.
[0083]
In the above embodiment, the initial sound generation process is performed asynchronously with the start timing of the service task when a sound generation request is received. However, the initial sound generation process is performed when the first service task is started after receiving the sound generation request. After that, the service for the voice may be performed for each slot for which the initial sound generation process has been performed. In this case, the time from the initial pronunciation to the first service is exactly 8 milliseconds. In this case, it takes a maximum of 1 millisecond from the sound generation request to the initial sound generation, but such a time delay hardly causes a problem in performance.
(Embodiment 2)
The second embodiment is another embodiment of the first musical sound generating device of the present invention.
[0084]
In the second embodiment, the service task is configured by a plurality of tasks corresponding to the number of voices. A service task is generated by an event from the pronunciation task. Thereafter, the service task is activated by a timer event as usual, and the service task terminates itself when the voice ends (after executing all phases of the volume envelope).
[0085]
The service task can change the timer interval for starting itself and shorten the service interval immediately after sounding. This will be described later as a modified example.
[0086]
Here, first, a description will be given of a task management block (hereinafter abbreviated as “TCB”) that controls multi-task control related to service tasks in the monitor.
[0087]
FIG. 6 is a structural diagram of a task management block (TCB).
[0088]
Each task is assigned a task number in sequence, and one TCB is provided for each task. [] Indicates the task number. N is the maximum task number. In this embodiment, since a service task is provided for each voice, the task number is the same as the voice number of the voice corresponding to the task.
[0089]
The “task status flag” and “save area” are the same as those used in a general multitask program, while the “timeout time”, “pointer to the next TCB”, and “pointer to the previous TCB” "Is unique to the service task in this embodiment.
[0090]
The “task state flag” indicates the state of the task, and a state such as RUN (execution right acquisition), READY (executable), WAIT (waiting for event), DORMANT (pause), or the like is set.
[0091]
“Generating a task” means that a task in the DORMANT state is changed to the WAIT state, and “disabling the task” is changing the task to the DORANT state. A task in the WAIT state is brought into the READY state when the target event that has been waited for occurs. In the service task according to the present invention, the waiting target event is an event by a timer that measures a predetermined time. These task state transitions are performed by a monitor.
[0092]
The monitor determines only one task with the highest priority from among tasks in the READY state, makes a transition to the RUN state, and starts and executes the task. The part of the monitor that performs such processing is called a “scheduler”.
[0093]
In the TCB save area, the contents of the stack pointer, program counter, register, etc. at the previous execution of the task are saved in order to resume the task after execution interruption. When processing of a task that has been started is interrupted, the scheduler saves the contents of the task's stack pointer, program counter, registers, etc. to the save area for that task, and restarts the interrupted task In such a case, the contents of the saved stack pointer, program counter, register, etc. are read from the save area and transferred to the processing area. Such switching of tasks to be started is called “dispatching”.
[0094]
Note that the task selected as the task to be shifted to the RUN state by the scheduler is executed immediately after the end of the monitor processing.
[0095]
Since the above-described task state transition, scheduler, dispatch, and the like are well known, details thereof are omitted.
[0096]
The service task is activated at predetermined intervals, and the “timeout time” indicates the time at which the task should be activated next. The “pointer to the next TCB” and the “pointer to the previous TCB” are meaningful only for the task in the WAIT state, and indicate the time sequence in which each service task of the task in the WAIT state is activated. Yes. The “pointer to the next TCB” indicates the number of the task activated next to the task, and the “pointer to the previous TCB” indicates the number of the task activated before the task. In this way, a series of tasks connected by two types of pointers indicating the time order (link state) between each task is called a “timer chain”. Therefore, the tasks in the WAIT state are arranged in the timer chain in the order according to the size of the “timeout time”.
[0097]
Further, as shown in FIG. 7, the monitor is provided with a variable TM indicating the current time, and a pointer TSK_PINTR indicating a task to be activated next among tasks connected to the timer chain.
[0098]
The monitor performs the process shown in FIG. 8 in accordance with a timer interrupt that is generated every predetermined period (in this embodiment, every 1 mS).
[0099]
The meanings of symbols in the monitor processing program shown in FIG. 8 are as follows.
[0100]
(A) hit: indicates whether there is a task to be activated.
[0101]
hit = 1: exists
hit = 0: does not exist
First, the current time TM is increased (step 8_1), and it is determined whether or not the next task activation timing has come (step 8_2). When the result of increasing TM exceeds the maximum value of TM, a value corresponding to a value obtained by subtracting the maximum value from that value is set as a new value of TM. For example, assuming that the maximum value of TM is 127 and the amount of increase is 1, TM is changed between 0 and 127. If the start timing is reached, hit = 1 is set (step 8_3), the task is removed from the timer chain (step 8_4) and the READY state is set (step 8_5), and the next task is set (step 8_6). Do.
[0102]
When there is a task to be activated (step 8_7), after setting hit = 0 (step 8_8), the scheduler is activated (step 8_9), and when there is no task, the process is terminated. As a result, the task to be activated at that time is set to the READY state. Thereafter, the task in the READY state is activated by the scheduler according to the priority order.
[0103]
That is, in the monitor executed at intervals shorter than the service interval, the service task corresponding to each voice is scanned, the service task activated at the current timing is selected, and the task is activated.
[0104]
As shown here, in the interrupt processing by the timer, it is not necessary to check all the service tasks to know the service tasks to be started at that timing, so it is only necessary to check the first service task in the chain. It can be done at high speed.
[0105]
When the activated task finishes the process, a monitor call is made to the monitor. There are two types of monitor calls from a service task: “WAIT call” when the task shifts to the WAIT state, and “DORMANT call” when the task shifts to the DORMANT state.
[0106]
When these monitor calls are made from the service task, the task number (i.e., voice number) of the calling task is notified to the monitor. The monitor performs the following processing for these monitor calls.
[0107]
FIG. 9 is a flowchart showing monitor processing for a WAIT call.
[0108]
The meanings of symbols in the flowchart shown in FIG. 9 are as follows.
[0109]
(A) srv_interval: a constant indicating the service task activation cycle.
[0110]
In this flow, the state of the task is changed to the WAIT state (step 9_1), the time when the task is activated next is set (step 9_2), and the task is inserted into the timer chain according to the timeout time. (Step 9_3), the scheduler is activated (Step 9_4).
[0111]
In the flowchart shown in FIG. 9, TM_OUT, like TM, has a value corresponding to a value obtained by subtracting the maximum value from the value when the increased result exceeds the maximum value of TM_OUT (same as the maximum value of TM). It is a new value. As described above, since the timer interrupt interval is set to 1 mS in the present embodiment, when srv_interval is set to 8, TM_OUT increases by 8 for every service, and the service is performed every 8 mS. When TM and TM_OUT are both integers from 0 to 7, TM_OUT may be a constant value set at the time of sound generation, which will be described later, and therefore the process of step 9_2 is not necessary.
[0112]
In addition, when inserting into the timer chain in step 9_3, the timer chain is traced so that the TM_OUT of the previous task is equal to or less than the TM_OUT of the task and the TM_OUT of the subsequent task is larger than the TM_OUT of the task. Look for and insert the task at that location by rewriting the next and previous tasks and the NEXT_TSK and PREV_TSK of the task.
[0113]
FIG. 10 is a flowchart showing the monitoring process for the DORMANT call.
[0114]
In the flow shown in FIG. 10, the state of the task is changed to the DORMANT state (step 10_1), and the scheduler is started (step 10_2).
[0115]
As described above, the task in the WAIT state is activated as time elapses, and the task in the DORMANT state is not activated regardless of the elapse of time.
[0116]
FIG. 11 is a flowchart of the pronunciation task.
[0117]
Steps 11_1 to 11_4 are the same as in the prior art (see FIG. 17), and only the last process (step 11_5) and the contents of the monitor call are different from the conventional ones.
[0118]
As shown in step 11_5, the timeout time TM_OUT is initialized with the value of the time TM at the time of starting the sound generation task.
[0119]
In the prior art, the service task is common to all voices. However, in this embodiment, since a service task is provided for each voice, a service task for a voice that is pronounced on the monitor is generated from the pronunciation task. (TASK GENERATE call). In response to this, the monitor performs processing similar to the processing for the WAIT call shown in FIG. Specifically, the sound generation task is shifted to the sound event waiting state, the requested voice service task is shifted to the WAIT state (same as step 9_1), and the time-out time of the service task is set (step 9_2). Similarly, the service task is inserted into the timer chain according to the time-out time of the service task (similar to step 9_3), the save area of the service task is initialized, and the scheduler is started (same as step 9_4). Since the time-out time TM_OUT is a value obtained by adding the service task activation cycle srv_interval to the value of the time TM at the time of the sound generation task activation, the next time the voice service task is activated is the service task activation cycle srv_interval After time has passed. When TM and TM_OUT are used as integers in the range of 0 to 7, this processing is
TM_OUT = TM
Just do. The save area is initialized by setting the contents of the register to a predetermined value, the contents of the program counter as the start position of the program of the service task, and pushing these registers and the program counter onto the stack and the value of the stack pointer accordingly. This is done by setting.
[0120]
FIG. 12 is a flowchart of the service task.
[0121]
counter [voice] is updated (step 12_1), and the pitch, sound quality, and volume after a predetermined time have elapsed from the previous service (step 12_2) are supplied to the voice (step 12_3). Step 12_4) The state of waiting for the timer event from the monitor is essentially the same as in the prior art, but in this embodiment, a service task is provided for each voice. 12_4) The difference is that the monitor is requested to set the service task of the voice to the DORMANT state. The monitor performs the above-described processing for this DORMANT call, and transitions the voice service task to the DORMANT state. Thereafter, a voice is newly assigned to the voice in the DORMAN state, and the service task is not activated until the voice is shifted to the WAIT state. For this reason, services that do not need to be processed are not activated, and the load on the CPU can be prevented from becoming unnecessarily heavy.
[0122]
Using this method, the interval between the initial pronunciation and the first service can be accurately maintained. For example, if the time interval between interrupts from the timer is set to 1 millisecond and srv_interval is set to 8 milliseconds, the interval between the initial pronunciation and the first service is 7 milliseconds to 8 milliseconds, and the maximum is within 1 millisecond. Activated with error.
[0123]
In the present embodiment, when voice generation is finished, the voice service task is not activated by setting the voice service task to the DORMANT state. However, another method may be used. For example, for each task, an event that the task is waiting for (WAIT) is set, the scheduler scans the task according to the priority, and what kind of event each task is waiting for (WAIT). It is also possible to check whether a specific event has occurred, and to activate the task when a waiting event of a certain task matches the generated event. In this case, the service task of the voice that has been sounded may be set so as to be excluded from the target of waiting for the event by the timer.
[0124]
In the above description, the timing at which each service task is activated is managed by the time-out time and timer chain set for each service task shown in FIG. 6, but any service task is activated at any timing. Any method other than those described above may be used as long as it can be managed. For example, as in the case of the first embodiment, service tasks to be activated at each timing may be listed and managed. Alternatively, service tasks to be activated for each slot may be listed and managed instead of the timeout time as in the first embodiment.
(Modification of Embodiment 2)
By the way, in Embodiment 2 described above, the service task activation cycle is fixed, but the sound generation task may be activated at a shorter cycle immediately after sound generation.
[0125]
The quality of the musical tone is improved if the service is performed finely in a short time period, but the load on the CPU becomes heavy and it is difficult in reality. However, paying attention to the following points, the quality of the musical tone is greatly improved without increasing the CPU load by shortening the service cycle only for the part immediately affecting the musical tone quality immediately after the pronunciation. It becomes possible.
[0126]
(1) The need for fine-grained services is where the characteristics of musical sounds are changing rapidly.
[0127]
(2) In the attack part of the musical tone, the characteristics of the musical tone change drastically.
[0128]
(3) The attack part of the musical sound is a part that impresses the characteristics of the musical sound particularly strongly.
[0129]
(4) The attack part of the musical sound is a short time. Shortening the service cycle may increase the CPU load and cause a delay in service to other voices. However, the attack period is short, so the load increase period is short and the service to other voices is not serviced. The impact is small.
[0130]
The processing example is shown below.
[0131]
FIG. 13 is a flowchart of the pronunciation task.
[0132]
The meanings of the symbols in the flowchart of FIG. 13 are as follows.
[0133]
(A) attack_counter [voice]: a counter for recognizing the passage of a certain time after the voice is sounded.
[0134]
(B) srv_interval [voice]: This is a variable indicating the activation cycle of the service task of the voice.
[0135]
(C) srv_int_std: a constant indicating the standard activation cycle of the service task. This is the same value as srv_interval in the second embodiment.
[0136]
Steps 13_1 to 13_4 are the same as in the second embodiment. The difference from the second embodiment is that a counter for recognizing a certain time after sounding is provided for each voice and initialized with 0 (step 13_5). ) And a point that the time until the service task is activated is shortened to 1/8 (step 13_6). Specifically, a constant srv_int_std indicating the standard activation cycle of the service task having the same value as srv_interval in the second embodiment is provided, and the srv_interval set as a constant in the second embodiment is provided for each voice as a variable. It is initialized with 1/8 of srv_int_std. The monitor sets the next activation time of the task using srv_interval [voice] corresponding to the voice in response to the WAIT call and TASK GENERATE call. Therefore, the service task activation cycle differs for each voice.
[0137]
For this reason, in the second embodiment, the service task is started 8 mS (exactly 7 to 8 mS) after the sound generation task is activated, but in this embodiment, the service task is activated after 1 mS (exactly 0 to 1 mS). It is activated.
[0138]
FIG. 14 is a flowchart of a service task.
[0139]
The meanings of the variables in the flowchart of FIG. 14 are as follows.
[0140]
(A) MAX_ITVL: a constant that means a period of detailed service after sound generation.
[0141]
Since srv_interval is a sound generation task and is set to one-eighth of the standard activation cycle of the service task, the service cycle is one-eighth of the standard for a certain time after sound generation. It is attack_counter that measures a certain time, and keeps the service period to 1/8 standard (step 14_2 to 14_3) until MAX_ITVL times of service is performed (step 14_1), and returns to the standard after that (step 14_4). ~ 14_5). For this reason, for example, when the standard activation cycle of the service task is set to 8 mS, the activation cycle of the service task is set to 1 mS only for a certain time immediately after the sound generation. Note that MAX_ITVL may be determined in correspondence with a period in which the characteristic of the musical sound is drastically changed, for example, a value corresponding to 20 mS. That is, when the service task is activated at 1 mS immediately after sound generation, it is set to 20, for example.
[0142]
Steps 14_6 to 14_8 in the flow shown in FIG. 14 are the same as the above-described flow of the second embodiment (steps 12_2 to 12_4 in FIG. 12).
[0143]
Here, all the voices (service tasks) are described as if they have the same priority. However, if a voice with a small value of srv_interval is preferentially processed, a plurality of voices are sounding and the CPU is sounding. Even when the load is large, a more precise attack can be reproduced. For this purpose, for example, in a process of inserting a service task into the timer chain in response to a WAIT call of the monitor, a TM_OUT task having the same value as TM_OUT of the task to be inserted is already connected to the timer chain. Then, srv_intervals of those tasks are compared, and the smaller task may be inserted before.
[0144]
In this embodiment, the service interval is set to two stages of 1 millisecond or 8 milliseconds. However, it is also possible to determine the attack_counter or the counter stepwise so that the intermediate value or a longer interval changes finely. It doesn't matter.
[0145]
In this embodiment, the service interval is shortened with respect to the portion immediately after the sound generation. However, in other cases, the service interval may be shortened with respect to a portion or the like where the characteristic of the musical tone is drastically changed. On the contrary, the service interval may be longer than the standard service interval for a portion where there is not much change in the characteristics of the musical sound. In this case, the load on the entire service can be reduced without significantly affecting the quality of the musical sound.
[0146]
In the first and second embodiments, when managing the service timing for each voice, the voice is managed for each time slot that changes with the passage of time (Example 1), or corresponds to the time that changes with the passage of time. The method of managing the next service time for each voice (Example 2) is used, but another method may be used as long as the service timing for each voice can be managed.
[0147]
For example, the wait time until the next service is managed for each voice, and the wait time is initialized to a value corresponding to the service cycle every time the service is performed, and the wait time of each voice is decreased and waited at every predetermined time. When the time becomes 0, the service for the voice is performed, or the elapsed time from the previous service is managed for each voice, and the elapsed time is initialized to 0 every time the service is performed. If the elapsed time of each voice is increased every time and the elapsed time reaches a value corresponding to the service cycle, the service for the voice may be performed. Alternatively, the voice corresponding to each waiting time until the next service is managed, and the voice is registered in the waiting time corresponding to the service cycle every time the service is performed, and each waiting time is reduced every predetermined time. When the waiting time becomes 0, the service is performed for the voice registered in the waiting time, or the corresponding voice is managed for each elapsed time from the previous service, and the service is performed. The voice is registered at the elapsed time of 0 every time the time is performed, and each elapsed time is incremented every predetermined time, and when the elapsed time becomes a value corresponding to the service cycle, the voice registered at the elapsed time is Service may be provided.
[0148]
Alternatively, in the same way as the timing management storage method of automatic performance data in the automatic performance device, the order in which the voices are serviced and the time interval from the previous voice service to the voice service for each voice, or from the voice service to the next The time interval until the voice service may be managed, and the service management information may be read as time passes in the same manner as the automatic performance data reading process. In this case, in order to manage the order of voices, the link structure as shown in the first embodiment may be used. Also, in this case, when a new service voice appears in response to a pronunciation request, or when a voice that stops service appears in response to the end of pronunciation, the order of voices and the time interval are rewritten accordingly. .
[0149]
Alternatively, in the first and second embodiments, only one timer for interrupting the timer is provided for all voices. However, a timer for measuring the service period is provided for each voice, and the timer interrupts for each timer. You may make it service for the voice to perform. In this case, the timer is initialized so that the next timer interruption takes time after the time corresponding to the service cycle during the initial sounding process. Alternatively, as in the first embodiment, a timer for measuring the service period is provided for each slot, the voice corresponding to the slot is serviced according to the timer interrupt of each timer, and the next timer interrupt is applied after the service period. The timer may be initialized as described above.
[0150]
Further, the first and second embodiments, a method in which these are modified, and the above method may be appropriately combined. As a method of combining the first and second embodiments, for example, the following method may be used. As shown in the second embodiment, a service task is provided for each voice, and the method for managing the activation timing of each service task is the method shown in the first embodiment. In other words, the time is divided into a plurality of slots, a service task to be activated is registered for each slot at the timing of the slot, and the service task registered in the slot is activated based on the slot number for each slot timing. To. In this case, when the number of slots is determined so that the service period is constant and the slot makes one round in one service period, the registration of the service task to the slot is performed only at the time of the initial sounding process as shown in the first embodiment. Good. Also, as shown in the second embodiment, when a service task is to be activated at an interval shorter than the standard activation cycle of the service task, the service task is registered in a slot corresponding to the next timing to be activated for each service. What should I do? Further, when it is desired to make the service cycle longer than the cycle of one round of the slot, the service task is registered for each service in the slot corresponding to the timing to be activated next, and for each service task as shown in the second embodiment. What is necessary is just to register the time which should be started next.
[0151]
In this case, specifically, the following may be performed. The monitor increases the current time TM by 1 every 1 ms and changes between 0 and 127, and the value of the lower 3 bits of the current time TM is set as the current slot. Thus, the slot varies from 0-7. The time-out time TM_OUT indicating the next service time is obtained for each service task by the processing method shown in the second embodiment and stored in the TCB, and the service task is registered in the slot corresponding to the lower 3 bits of the service time TM_OUT. To do. The monitor sets the service task at the time-out time TM_OUT that matches the current time TM among the service tasks registered corresponding to the current slot every 1 mS to the READY state.
[0152]
In this way, it is possible to find a service task to be started at the current time by searching only the service task registered corresponding to the current slot, so that not only the processing can be performed at high speed but also the service task. The process for finding a slot to be registered can be performed at high speed, and the registration process for the slot can also be performed at high speed. In this way, a service cycle such as 1 mS shorter than the standard service cycle can be realized as shown in the second embodiment, and a service cycle such as 16 mS or 24 mS longer than the standard service cycle can be realized.
[0153]
In this case, when the service task registration method in the slot has the link structure as shown in 1, the service tasks may be arranged in the order of pronunciation as shown in the first embodiment, or as shown in the second embodiment. As shown, they may be arranged in the order of timeout times. In the former case, when finding a service task to be activated, it is necessary to check all the service tasks registered in the slot, but the service task is registered because the position on the link connecting the service tasks is determined. Can be performed at high speed. In the latter case, it is necessary to search for a position on the link to which the service task is connected. However, when finding the service task to be activated, it is only necessary to check the head of the link, so that the processing can be performed at high speed.
(Example 3)
The third embodiment is an embodiment of the second musical sound generating apparatus of the present invention.
[0154]
In the third embodiment, unlike the first and second embodiments, the time from the end of the initial sounding to the start of the first service is measured and reflected in the time information for the change in the characteristic parameter of the musical sound. Let That is, in the first and second embodiments, the time until the first service is started after the initial pronunciation is finished is made as constant as possible, and the characteristic parameter of the musical sound corresponding to the fixed time is obtained. On the other hand, in Example 3, like the conventional technique, the time from the end of the initial pronunciation until the first service is started is allowed to vary, and instead, the time is measured and measured. The characteristic parameter of the musical sound according to time is obtained.
[0155]
In general, when a service task periodically performs a voice service, each voice always has time information indicating an elapsed time, and a time change of the characteristic of a musical tone is obtained based on the time information. Normally, time management is performed by increasing this time information by a certain amount each time a voice service is performed.
[0156]
In the third embodiment, when the sound generation task finishes sounding, the service task activation timer is read to obtain information indicating at which time point during the service activation interval the sound generation was performed. By storing this value in the buffer corresponding to the pronunciation voice, the service task starts the elapsed time not from 0 but from the time until the initial service is activated after the initial pronunciation is actually finished.
[0157]
Here, as an example, the voice service interval is 8 milliseconds. In this case, the actual interval between the initial pronunciation and the initial service is indefinite between 0 and 8 milliseconds.
[0158]
In general, when using a CPU timer interrupt, a value is set in the comparison register, the timer counter is counted up by a clock, and an interrupt is generated when the value becomes equal to the comparison register. Repeat the process of clearing.
[0159]
Assuming that the setting value of the comparison register is Ts, in order to start the service in 8 milliseconds, the clock frequency and Ts are set so that the time from counting up from 0 to reaching Ts is 8 milliseconds. If you set it.
[0160]
Here, the value Tc of the timer counter at an arbitrary time is within 0 to Ts.
Tc / Ts
, The value means at which time point (ratio) within the service interval of 8 milliseconds. Here, if cnt_inc is a constant indicating the passage of time corresponding to the service task activation cycle,
Tc / Ts * cnt_inc
Indicates the elapsed time from the previous timer interrupt, that is, the elapsed time from the previous service timing. Therefore, the above value is made negative based on the value Tc of the timer / counter when the pronunciation task is activated.
-Tc / Ts * cnt_inc
Then, if the variable counter that represents the elapsed time after the initial pronunciation is initialized, the value of the variable counter that represents the elapsed time after the initial pronunciation in the service task indicates the time elapsed corresponding to the service task activation cycle. Since the service is performed based on the variable counter after being increased by cnt_inc, counter = (Ts−Tc) / Ts * cnt_inc at the first service after the initial sounding, and the initial sounding ends. The characteristic parameters (envelope, LFO, etc.) can be obtained based on the actual elapsed time from the start to the first service activation.
[0161]
FIG. 15 is a flowchart of the pronunciation task. In this flowchart, steps 15_1 to 15_3 and 15_5 are the same as those in the prior art, and correspond to steps 17_1 to 17_3 and 17_5 in FIG.
[0162]
For the above reason, in the sound generation task, -Tc / Ts * cnt_inc is stored in the buffer counter [voice] indicating the elapsed time from the initial sound corresponding to the sound to be generated (step 15_4).
[0163]
The service task performs the same processing as in the prior art (see FIG. 18).
[0164]
This makes it possible to form an envelope that is much less annoying than before without synchronizing the initial pronunciation and service.
[0165]
In addition, as long as the counter value is corrected based on the actual elapsed time from the end of the initial pronunciation until the first service is activated, other processing methods may be used in addition to the method of the third embodiment. . For example, in the above-described third embodiment, the characteristic parameter is obtained after increasing the elapsed time parameter counter in the service task. However, in the case where the elapsed time parameter counter is increased after obtaining the characteristic parameter, the elapsed time is used in the pronunciation task. The parameters may be initialized with (Ts−Tc) / Ts * cnt_inc. Alternatively, the elapsed time parameter counter may be initialized to 0 in the pronunciation task, and the elapsed time parameter counter may be increased by (Ts−Tc) / Ts * cnt_inc only for the first service task. In this case, a means for recognizing that the service task is the first service is required. For this reason, the pronunciation task sets a flag indicating the completion of pronunciation when the initial pronunciation is finished, and if this flag is set, the service task considers that the service is the first service for the voice and manages the time. (Ts−Tc) / Ts * cnt_inc may be added to the counter of the counter to reset the flag.
(Example 4)
The fourth embodiment is an embodiment of the third musical sound generating apparatus of the present invention.
[0166]
In the fourth embodiment, as in the third embodiment, the time until the first service is started after the end of the initial pronunciation is allowed to vary. Instead, the first service is half the service task start cycle. Characteristic parameters (volume, sound quality, pitch, etc.) are obtained based on time. That is, in the first service, the characteristics of the musical tone are changed by half of the normal level. The half of the service activation period is equal to the average value of the time interval between the pronunciation task and the service task that are moving asynchronously. Therefore, the possibility of drawing a natural envelope and LFO is the highest.
[0167]
That is, in the third embodiment, the characteristic parameter based on the actual elapsed time from the pronunciation task to the first service task is obtained, whereas in the fourth embodiment, the average elapsed time from the pronunciation task to the first service task is calculated. Based on this, the characteristic parameter is obtained.
[0168]
FIG. 16 is a flowchart of the pronunciation task.
[0169]
Here, the elapsed time parameter counter is initialized with -1/2 of the constant cnt_inc indicating the service task start cycle in the sound generation task (step 16_4), and the service task has the characteristics after increasing the elapsed parameter counter by the start cycle cnt_inc. Find the parameters.
[0170]
The service task performs the same processing as in the prior art (see FIG. 18).
[0171]
As a result, it is possible to form an envelope without annoyance at a much higher frequency than in the past without synchronizing the initial pronunciation with the service.
[0172]
Note that other processing methods may be used as long as the counter value is corrected based on the average elapsed time from the sound generation task to the first service task, and the same variation as described in the third embodiment can be used.
[0173]
In the first to fourth embodiments, in the service task, new characteristic parameters (values such as envelope and LFO) are obtained based on a counter indicating the elapsed time from the initial pronunciation or the elapsed time from the start of the current phase. However, other processing methods may be used as long as the characteristic parameter can be changed for each service over time. For example, the amount of change of the characteristic parameter for each lapse of time corresponding to the service period is obtained according to the change speed of the characteristic parameter at that time, and a new characteristic parameter is obtained by processing for changing the characteristic parameter at the previous service by this amount. You may do it. That is, the characteristic parameter at the time of the previous service is L_old, the characteristic parameter at the time of the current service is L_new, and the amount of change of the characteristic parameter for each elapsed time corresponding to the service cycle is L_inc.
L_new = L_old + L_inc
For each service.
[0174]
In this case, in the third embodiment, the processing of the above formula is performed for each service, but only the first service after the initial pronunciation results in the result.
L_new = L_old + L_inc * (Ts−Tc) / Ts
To be performed. Similarly, in Example 4, only the first service after the initial pronunciation results
L_new = L_old + L_inc / 2
To be performed.
[0175]
In any of the first to fourth embodiments described above, the processing immediately after the sound generation request has been described, but the same processing may be performed immediately after the mute request (note-off). As a result, not only immediately after note-on but also envelope change immediately after note-off can be accurately reproduced.
[0176]
【The invention's effect】
As described above, according to the present invention, it is possible to prevent the deterioration of the change in the characteristic of the musical sound at the start of the musical sound generation compared to the conventional case.
[Brief description of the drawings]
FIG. 1 is a flowchart illustrating a configuration of a monitor according to a first embodiment.
FIG. 2 is a flowchart showing a configuration of a pronunciation task in the first embodiment.
FIG. 3 is a diagram showing a partial flow of a sound generation task shown in FIG. 2;
FIG. 4 is a flowchart illustrating a service task configuration according to the first exemplary embodiment.
FIG. 5 is a diagram showing a partial flow of the service tank shown in FIG. 4;
FIG. 6 is a structural diagram of a task management block (TCB).
FIG. 7 is a diagram showing the names of registers used in the monitor.
FIG. 8 is a flowchart of a monitor processing program.
FIG. 9 is a flowchart showing a monitor process for a WAIT call.
FIG. 10 is a flowchart showing a monitor process for a DORMANT call.
FIG. 11 is a flowchart of a pronunciation task.
FIG. 12 is a flowchart of a service task.
FIG. 13 is a flowchart of a pronunciation task.
FIG. 14 is a flowchart of a service task.
FIG. 15 is a flowchart of a pronunciation task.
FIG. 16 is a flowchart of a pronunciation task.
FIG. 17 is a flowchart showing a conventional pronunciation task.
FIG. 18 is a flowchart of a conventional service task.
FIG. 19 is a schematic diagram illustrating an example of a change in an envelope.
FIG. 20 is a diagram showing an assumed change state of a characteristic of a musical tone controlled by an envelope.
FIG. 21 is a diagram illustrating an example of the relationship between the initial sounding timing and the service activation timing.
FIG. 22 is a diagram showing an example of an actual change state of the characteristic of a musical tone controlled by an envelope.

Claims (1)

一時にはそれぞれ1つの楽音の生成を担当する、複数の楽音生成手段と、
発音指示を受けて直ちに、発音指示がなされた楽音を、前記複数の楽音生成手段のうちのいずれかに対して発音開始時の特質で生成開始させる第1の発音制御を行なう楽音生成開始手段と、
楽音生成中の前記楽音生成手段それぞれに対して、該楽音生成手段で生成中の楽音の特質を変化させる第2の発音制御を行なうサービス手段と、
所定のサービス周期毎に一周期の経過を通知するサービス周期通知手段と、
前記楽音生成手段で生成中の楽音の特質が、当該楽音生成手段に対して前記第1の発音制御が行なわれた時点以降最初に、前記サービス通知手段からの一周期の経過の通知を受けた1回目の時点では、前記サービス周期一周期の2分の1の時間が経過した時点の特質に変化し、当該1回目の時点経過後は、前記サービス周期毎に順次一周期後の特質に変化するように、前記サービス手段を制御するサービス制御手段とを備えたことを特徴とする楽音生成装置。
A plurality of musical sound generating means each responsible for generating one musical sound at a time;
Immediately upon receiving a sound generation instruction, a sound generation start means for performing first sound generation control for starting generation of a musical sound for which sound generation has been instructed with any of the plurality of music sound generation means with characteristics at the time of sound generation start; ,
Service means for performing second sound generation control for changing the characteristics of the musical sound being generated by the musical sound generating means for each of the musical sound generating means that are generating musical sound;
Service period notifying means for notifying the progress of one period for each predetermined service period;
The characteristic of the musical sound being generated by the musical sound generating means is notified of the passage of one cycle from the service notifying means for the first time after the first sound generation control is performed on the musical sound generating means. At the first time, the characteristic changes to the characteristic at the time when one-half of the service cycle has elapsed, and after the first time, the characteristic changes to the characteristic after one period sequentially for each service period. As described above, a musical tone generation apparatus comprising service control means for controlling the service means.
JP01279396A 1996-01-29 1996-01-29 Music generator Expired - Fee Related JP3636395B2 (en)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP01279396A JP3636395B2 (en) 1996-01-29 1996-01-29 Music generator

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP01279396A JP3636395B2 (en) 1996-01-29 1996-01-29 Music generator

Publications (2)

Publication Number Publication Date
JPH09204179A JPH09204179A (en) 1997-08-05
JP3636395B2 true JP3636395B2 (en) 2005-04-06

Family

ID=11815283

Family Applications (1)

Application Number Title Priority Date Filing Date
JP01279396A Expired - Fee Related JP3636395B2 (en) 1996-01-29 1996-01-29 Music generator

Country Status (1)

Country Link
JP (1) JP3636395B2 (en)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2003108135A (en) * 2001-09-28 2003-04-11 Roland Corp Automatic playing device

Also Published As

Publication number Publication date
JPH09204179A (en) 1997-08-05

Similar Documents

Publication Publication Date Title
US5880386A (en) Musical information processing system with automatic data transfer
JP5134078B2 (en) Musical instrument digital interface hardware instructions
US6150599A (en) Dynamically halting music event streams and flushing associated command queues
JP4025501B2 (en) Music generator
JP3636395B2 (en) Music generator
US5714704A (en) Musical tone-generating method and apparatus and waveform-storing method and apparatus
EP0752697A2 (en) Tone waveform generating method and apparatus based on software
US6777606B2 (en) Automatic accompanying apparatus of electronic musical instrument
JP3572847B2 (en) Sound source system and method using computer software
JP3122661B2 (en) Electronic musical instrument
JP2626315B2 (en) Signal processing device
JP2009230610A (en) Instruction processing apparatus and instruction processing method
JP2004177893A (en) Musical sound playing apparatus and program for musical sound playing process
JP4497100B2 (en) Musical sound generation control device and sound generation control program
JP2007212491A (en) Sounding controller and sounding control program for musical sound
JP2933204B2 (en) Tone generator capable of scratch operation
JP3197620B2 (en) Performance information communication device
JP3583575B2 (en) Electronic musical instrument
JP3050473B2 (en) Performance information processing device
JPH1097258A (en) Waveform memory sound source device and musical sound producing device
JP3789358B2 (en) Electronic sound generation method and apparatus, and portable device using the same
JP2674476B2 (en) Electronic musical instrument
JP3067507B2 (en) Electronic musical instrument
KR960002131A (en) Code Change Processing Method for Automatic Accompaniment of Electronic Musical Instrument
JPH07210158A (en) Electronic instrument

Legal Events

Date Code Title Description
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20040624

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20040720

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20040917

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: 20041228

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20050104

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

S531 Written request for registration of change of domicile

Free format text: JAPANESE INTERMEDIATE CODE: R313531

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

S531 Written request for registration of change of domicile

Free format text: JAPANESE INTERMEDIATE CODE: R313532

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

LAPS Cancellation because of no payment of annual fees