JP3489236B2 - シーケンスデータのソート処理装置/方法 - Google Patents

シーケンスデータのソート処理装置/方法

Info

Publication number
JP3489236B2
JP3489236B2 JP33936494A JP33936494A JP3489236B2 JP 3489236 B2 JP3489236 B2 JP 3489236B2 JP 33936494 A JP33936494 A JP 33936494A JP 33936494 A JP33936494 A JP 33936494A JP 3489236 B2 JP3489236 B2 JP 3489236B2
Authority
JP
Japan
Prior art keywords
event data
fragment
event
value
sort
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
JP33936494A
Other languages
English (en)
Other versions
JPH08185311A (ja
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.)
Casio Computer Co Ltd
Original Assignee
Casio Computer Co Ltd
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 Casio Computer Co Ltd filed Critical Casio Computer Co Ltd
Priority to JP33936494A priority Critical patent/JP3489236B2/ja
Priority to US08/576,481 priority patent/US5672837A/en
Publication of JPH08185311A publication Critical patent/JPH08185311A/ja
Application granted granted Critical
Publication of JP3489236B2 publication Critical patent/JP3489236B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Landscapes

  • Electrophonic Musical Instruments (AREA)

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明は、電子楽器の自動演奏装
置のメモリに格納された楽曲データなどのシーケンスデ
ータのソート処理技術に関する。
【0002】
【従来の技術】シーケンスデータのソート処理は、様々
な分野で使用されており、そのアルゴリズムも種々のも
のが提案されている。
【0003】ここで、シーケンスデータが、複数の連続
するシーケンスデータ群を単位として管理される場合が
ある(以下、この単位をフラグメントと呼ぶ)。例え
ば、電子楽器などのための自動演奏装置において、自動
演奏を制御する楽曲データが、メモリに、楽曲データ
が、時間的に連続する楽曲データ群であるフラグメント
を単位として記憶され、1つのフラグメントとそれと離
れたメモリ内のアドレスに記憶されている他のフラグメ
ントとが、ジャンプ制御用のデータで連結されることに
より、複数のフラグメント間で楽曲データの時間的な連
続性が保たれるように、楽曲データが記憶される形態が
考えられる。このような形態において、新たな楽曲デー
タ群のフラグメントがメモリに追加され、そのフラグメ
ントがメモリ内の他の既存のフラグメントに連結される
ような場合には、新たなフラグメント内の楽曲データ群
と既存のフラグメント内の楽曲データ群との間で時間的
な連続性が保たれるように、それらの楽曲データに対し
てソート処理を実行する必要が生じる。
【0004】
【発明が解決しようとする課題】しかし、従来、複数の
連続するシーケンスデータ群からなるフラグメントが複
数連結されている場合において、それらのフラグメント
内のシーケンスデータに対して適切なソート処理を実行
する技術はなかった。
【0005】本発明の課題は、複数のフラグメント内の
シーケンスデータに対する適切なソート処理を実現する
ことにある。
【0006】
【課題を解決するための手段】本発明は、複数の連続す
るシーケンスデータ群(楽曲データ群)から構成される
フラグメントを単位としてシーケンスデータを記憶する
メモリ(配列SNG_SONGを記憶するRAM10
5)を有し、そのメモリに記憶される所定の複数のフラ
グメントに属するシーケンスデータ全体に対し、シーケ
ンスデータが有する所定の属性に関してソート処理を実
行するソート処理装置を前提とする。
【0007】そして、まず、所定の複数のフラグメント
のそれぞれについて、その各フラグメントに属するシー
ケンスデータに対して、所定の属性に関してその各フラ
グメント内で閉じたソート処理を実行するフラグメント
内ソート処理手段(フラグメント内ソート処理を実行す
るCPU103)を有する。
【0008】次に、そのフラグメント内ソート処理手段
による処理に続いて、所定の複数のフラグメント中の隣
接するフラグメント同士で、それらの接続部に位置する
シーケンスデータに対して、所定の属性に関してソート
処理を実行するフラグメント間ソート処理手段(フラグ
メント間ソート処理を実行するCPU103)を有す
る。
【0009】そして、フラグメント内ソート処理手段に
よる処理とフラグメント間ソート処理手段による処理
を、ソート処理の対象となったシーケンスデータの入替
えが発生しなくなるまで繰り返させる制御手段(CPU
103)を有する。
【0010】なお、本発明は、上述のシーケンスデータ
のソート処理装置が有する機能と同じ機能を実現するシ
ーケンスデータのソート処理方法として実現することも
できる。
【0011】
【作用】複数のフラグメントに属するシーケンスデータ
全体に対するソート処理が、フラグメント内ソート処理
とフラグメント間ソート処理の繰返しという処理構造に
単純化される。この結果、フラグメント内ソート処理に
対して、従来からある通常のシーケンスデータに対する
高速ソート処理アルゴリズムを適用することができる。
【0012】
【実施例】以下、図面を参照しながら本発明の実施例に
つき詳細に説明する。図1は、本発明の実施例の全体構
成図である。この実施例は、シーケンサ装置として実現
されている。
【0013】CPU103は、ROM104に記憶され
ている制御プログラムに基づいて、システム全体の動作
を制御する。そして、楽曲データの記録時には、特には
図示しない電子楽器から出力された演奏情報が、例えば
MIDI(Musical Instrument Digital Interface)規格に基
づいて転送され、その演奏情報が演奏情報入力部101
によって受信される。CPU103は、この演奏情報を
取り込み、その演奏情報を示すイベントデータを、必要
に応じてその入力タイミングと共に、RAM105の楽
曲データ記録領域上の記録対象トラックに順次記録す
る。記録対象トラックは、ユーザが予めシステム操作子
群107を操作して指定する。
【0014】楽曲データの編集時には、CPU103
は、ユーザがシステム操作子群107において指定した
内容に従って、RAM105の楽曲データ記録領域上の
所望のトラックに記録されている楽曲データを読み出し
て、例えば5線譜の形式で表示部102に表示する。ユ
ーザは、システム操作子群107を用いて、表示部10
2に表示されている楽曲データに対して、楽曲データの
挿入、削除、移動、複写などを行うことができる。この
編集結果は、RAM105の楽曲データ記録領域の楽曲
データの内容に反映される。
【0015】楽曲データの再生時には、RAM105の
楽曲データ記録領域上の再生対象トラックから、イベン
トデータが順次読み出され、各イベントデータに対応す
る演奏情報が、例えばMIDI規格に基づいて演奏情報出力
部106から外部の電子楽器又は音源装置に出力され、
これらの装置によってその演奏情報に対応する自動演奏
が行われる。
【0016】図2〜図5は、RAM105に記憶される
楽曲データのデータフォーマットを示す図である。本実
施例では、楽曲データは、各小節のイベントデータと、
連続する128小節分のイベントデータを単位とする小
節ブロックと、最大で8個の小節ブロックを含むトラッ
ク、16トラックを単位とする楽曲という各単位を用い
て、階層的に管理される点が特徴である。
【0017】まず、図2に示されるトラック使用状況デ
ータSNG_TRK_USEは、16ビットのデータで
あって、各楽曲毎に設定される。各データには、トラッ
ク0〜15の各トラックが楽曲の自動演奏において使用
されるか否かが、“1”又は“0”のフラグによって設
定される。このデータの、最下位ビットがトラック0に
対応し、最上位ビットがトラック15に対応する。
【0018】図3(a) に示される配列SNG_BAR_
TBLには、楽曲毎及び各楽曲内のトラック毎に、第0
小節〜第1023小節の1024小節を128小節ずつ
分割して得られる8つの小節ブロックのそれぞれに対応
する、図3(b) に示される配列SNG_BAR_PTR
内の128個ずつの配列データ群の各先頭要素情報が記
憶される。配列SNG_BAR_PTRに定義可能な小
節ブロックの数は、例えば最大で32である。その場
合、配列SNG_BAR_TBLには、小節ブロック先
頭要素情報として、0x00〜0x1f(10進数の0
〜31に対応)の何れかの値が記憶される。この小節ブ
ロック先頭要素情報の値を128倍して得られる値が、
その小節ブロックに対応する配列SNG_BAR_PT
R内の128個の配列データ群の先頭要素番号となる。
但し、未使用のトラックのそれぞれの小節ブロックの先
頭要素情報及び使用トラック内の未使用の小節ブロック
の先頭要素情報としては、値0xffが設定される。
【0019】図3(b) に示される配列SNG_BAR_
PTRには、上述の小節ブロック毎に、各小節ブロック
内の128小節のそれぞれに対応する、図3(c) に示さ
れる配列SNG_SONG内のイベントデータ群の各先
頭要素番号が記憶される。配列SNG_SONGに定義
可能なイベントデータの数は、例えば最大で16384
イベントである。その場合、配列SNG_BAR_PT
Rには、各小節に対応するイベントデータ群の先頭要素
番号として、0x0000〜0x4000(10進数の
0〜16383に対応)の何れかの値が記憶される。但
し、全休符の小節に対応する先頭要素番号としては、値
0xffffが設定される。
【0020】図3(c) に示される配列SNG_SONG
には、上述したように小節単位で連続したイベントデー
タが記憶される。1つのイベントデータは、後述するよ
うに3ワードのデータとして構成される。但し、配列S
NG_SONGは、512個のイベントデータを単位と
する32個のイベントデータブロック(16384イベ
ントデータ分)に分割される。ここで、1つの小節内の
イベントデータ群が2つのイベントデータブロックに分
割される場合には、第1番目のイベントデータブロック
の末尾に後述するジャンプイベントデータが記憶され、
また、第2番目のイベントデータブロックの先頭に後述
するジャンプソースイベントデータが記憶される。
【0021】図4は、図3(c) の配列SNG_SONG
に記憶されるイベントデータ群を構成するノートイベン
トデータとコントロールイベントデータのデータフォー
マットを示す図であり、各イベントデータは3ワードの
データとして構成される。
【0022】図4(a) に示されるノートイベントデータ
は、楽譜の音符に対応するものであり、単音の発音処理
に必要な複数の情報を含む。即ち、ノートイベントデー
タの第1ワードは、上位7ビットが音高番号、下位7ビ
ットがベロシティを表わす。ノートイベントデータの第
2ワードは、そのノートイベントデータに対応する音符
について、それが含まれる小節の先頭からの時間位置
を、適当な単位(例えば480分の1拍のクロック)で
カウントした値である。そして、ノートイベントデータ
の第3ワードは、そのノートイベントデータに対応する
音符の発音時間を前述の適当な単位でカウントしたゲー
トタイムである。
【0023】図4(b) に示されるコントロールイベント
データは、楽曲の再生を制御するために必要な、上述の
ノートイベントデータ以外のイベントデータであり、第
1ワードの最上位ビットが1であることによって、ノー
トイベントデータと区別される。このコントロールイベ
ントデータは、更に、メタイベントデータ群、ジャンプ
イベントデータ群、及びコマンドイベントデータ群の3
つに分類される。メタイベントデータ群は、楽曲全体の
テンポ、拍子、調に関する情報を含む。ジャンプイベン
トデータ群は、図5で後述するように、トラック終了、
小節終了、次処理データへのジャンプ等の、イベントデ
ータの位置制御に関する情報を含む。更に、コマンドイ
ベントデータ群は、音量、プログラムチェンジ(音
色)、ベンダー等の、楽音に対する修飾的な効果を付加
するための情報を含む。コントロールイベントデータの
第1ワードの下位7ビットはコントロールコードを示
し、このコードによって制御内容が決定される。例え
ば、メタイベントデータ群のテンポイベントデータに対
応する第1ワードの値は0xff00、ジャンプイベン
トデータ群の小節終了イベントデータに対応する第1ワ
ードの値は0xff11(図5(b) 参照)、コマンドイ
ベントデータ群のプログラムチェンジイベントデータに
対応する第1ワードの値は0xff20となる。コント
ロールイベントデータの第2ワードは、そのコントロー
ルイベントデータに対応する制御が実行される小節の先
頭からの時間位置を、前述した適当な単位でカウントし
た値である。コントロールイベントデータの第3ワード
には、コントロールコード以外に必要なコントロール値
が格納される。例えばメタイベントデータ群のテンポイ
ベントデータの第3ワードにはテンポ番号、ジャンプイ
ベントデータ群のジャンプイベントデータの第3ワード
には配列SNG_SONG(図3(c) )内でのジャンプ
先のイベントデータの要素番号、コマンドイベントデー
タ群のプログラムチェンジイベントデータの第3ワード
には音色番号が格納される。
【0024】次に、上述したコントロールイベントデー
タのうちのジャンプイベントデータ群を構成する4種類
のイベントデータについて説明する。図5は、これら4
種類のイベントデータのそれぞれのデータフォーマット
を示す図である。
【0025】まず、図5(a) のトラック終了イベントデ
ータは、各トラックのイベントデータ群の終了位置にそ
のトラックの最終のイベントデータとして挿入される。
次に、図5(b) の小節終了イベントデータは、各小節の
イベントデータ群の終了位置にその小節の最終イベント
データとして挿入される。
【0026】更に、図5(c) のジャンプイベントデータ
と図5(d) のジャンプソースイベントデータは、図3
(c) の配列SNG_SONGにおいて、1つの小節内の
イベントデータ群が512イベントずつの2つのイベン
トデータブロックに分割される場合に、それぞれ、第1
番目のイベントデータブロックの末尾と第2番目のイベ
ントデータブロックの先頭に記憶される。この場合、ジ
ャンプイベントデータの第3ワードには配列SNG_S
ONG内でのジャンプ先のイベントデータの要素番号が
格納され、ジャンプソースイベントデータの第3ワード
には同じくジャンプ元のイベントデータの要素番号が格
納される。
【0027】なお、図5(a) 〜(d) に示される4種類の
イベントデータについて、イベントデータの編集処理及
び再生処理においては、第1ワードにより現在処理イベ
ントデータがジャンプイベントデータ群に属するイベン
トであることが認識された時点で、各々のイベントデー
タに対応した処理が即座に実行される。従って、これら
各イベントデータの第2ワードは任意の値でよい。ま
た、トラック終了イベントデータと小節終了イベントデ
ータの第3ワードも任意の値でよい。
【0028】以上説明した図2〜図5の楽曲データのデ
ータフォーマットが採用されることにより、自動演奏に
関する制御を非常に効率的に実行することが可能とな
る。この効果について、以下に説明する。
【0029】まず、イベントデータの再生処理時(楽曲
の自動演奏時)の動作について説明する。ユーザが図1
のシステム操作子群107を操作することにより再生開
始が指示されると、図1のCPU103は、RAM10
5に記憶されている再生される楽曲に対応する図2に示
されるトラック使用状況データSNG_TRK_USE
の内容を調べる。CPU103は、トラック使用状況デ
ータSNG_TRK_USEにおいて値1が設定されて
いるビットに対応するトラックの処理タイミングで、そ
のトラックのイベントデータを再生させるために、ま
ず、図3(a) に示される配列SNG_BAR_TBLを
探索する。この結果、CPU103は、現在再生中の小
節に対応する図3(b) に示される配列SNG_BAR_
PTR内のの要素番号を得る。次に、配列SNG_BA
R_PTR内の該当データの値が0xffffでなけれ
ば(全休符小節でなければ)、CPU103は、配列S
NG_BAR_PTRの該当データの値が指す要素番号
の配列SNG_SONG中のイベントデータを読み込
む。そして、その第2ワードに格納されている小節先頭
からのクロックの値が現在のクロックの値以下であれ
ば、CPU103は、そのイベントデータを再生するた
めに、そのイベントデータの第1ワードのデータに従っ
た演奏情報を、図1の演奏情報出力部106から出力さ
せる。以下、上述の一連の処理が繰り返し実行され、現
在小節の現在クロックに従ったイベントデータの再生処
理が実行される。
【0030】上述のイベントデータの再生処理におい
て、小節単位の早送り再生又は巻き戻し再生が実行され
る場合を考える。この動作を実現するためには、図3
(a) に示される配列SNG_BAR_TBL上の小節ブ
ロックに対する現在処理ポインタ値、又は図3(b) に示
される配列SNG_BAR_PTR上の小節に対する現
在処理ポインタ値をインクリメント又はデクリメントす
るだけでよい。この結果、非常に高速な1又は複数小節
単位の早送り再生又は巻き戻し再生を簡単な制御で実現
することができる。
【0031】次に、イベントデータの編集処理が実行さ
れる場合を考える。例えば小節単位の移動を行うために
は、図3(a) の配列SNG_BAR_TBL又は図3
(b) の配列SNG_BAR_PTRの配列データの要素
を入れ替えるのみでよい。この場合、図3(c) の配列S
NG_SONG内のイベントデータに記憶されているク
ロックデータは小節の先頭からのクロックであるため
(図4等参照)、時間データを編集し直す必要もない。
更に、例えば既存の小節に新たなイベントデータを追加
するためには、図3(c) の配列SNG_SONGの末尾
にイベントデータ群を追加し、ジャンプイベントデータ
とジャンプソースイベントデータ(図5参照)を用い
て、そのイベントデータ群を所望の小節のイベントデー
タ群に連結するだけでよい。その他、イベントデータの
挿入、削除等も、簡単なデータ操作で実現できる。
【0032】このように、楽曲データが階層的に管理さ
れることにより、イベントデータの再生処理、編集処理
等の制御を簡単に実行することができる。ここで、上述
の楽曲データの階層構造が採用される場合におけるイベ
ントデータの編集処理において、小節内でイベントデー
タの挿入、削除、移動等の編集作業が実行された場合、
図3(c) の配列SNG_SONG内の1つの小節内のイ
ベントデータ群において、図5に示されるジャンプイベ
ントデータ群以外のイベントデータの第2ワードに設定
されている小節の先頭からのクロックの値の大小関係が
逆転している状況が発生することがある。例えば、所望
の小節内の任意の時間位置に新たなイベントデータが追
加される場合、配列SNG_SONGの末尾に、ジャン
プソースイベントデータと、それに続いて、第2ワード
に所望のクロック値が設定された所望のイベントデータ
と、更にそれに続いて、小節終了イベントデータが追加
されると共に、上記所望の小節の最終イベントの小節終
了イベントデータが、第3ワードに上記ジャンプソース
イベントデータの要素番号が設定されたジャンプイベン
トデータに置き換えられ、最後に、上記ジャンプソース
イベントデータの第3ワードに上記ジャンプイベントデ
ータの要素番号が設定される。この場合、上記追加イベ
ントデータは、上記所望の小節内のイベントデータ群の
最後に単純に追加されただけであるため、その追加イベ
ントデータが上記所望の小節内の他のイベントデータ群
との間で正しい時間関係を有するように、その追加イベ
ントデータを含む上記所望の小節内のイベントデータ群
が、各イベントデータの第2ワードのクロック値に関し
て並び換えられる(ソートする)必要がある。
【0033】この場合に、小節内のイベントデータ群に
含まれ得る図5に示されるジャンプイベントデータ群が
適切に処理される必要がある。そこで、本実施例におい
ては、小節内のイベントデータ群の時間ソート処理が次
のようにして実行される。以下に、小節内のイベントデ
ータ群の時間ソート処理の詳細を説明する。
【0034】図6は、図1に示されるCPU103がR
OM104に記憶された制御プログラムを実行する動作
として実現される時間ソート処理の全体動作フローチャ
ートである。
【0035】まず、時間ソート処理終了フラグ(CPU
103内のレジスタ又はRAM105に確保される)
は、その値が0であるときに時間ソート処理が終了して
いないことを示し、その値が1であるときに時間ソート
処理が終了したことを示す。
【0036】まず、ステップ601において、時間ソー
ト処理終了フラグの値が0にセットされる。次に、ステ
ップ602で時間ソート処理終了フラグの値が0である
と判定される間、ステップ603〜605の一連の処理
が繰り返し実行される。
【0037】ステップ603では、時間ソート処理終了
フラグの値が1にセットされる。ステップ604では、
配列SNG_SONGに記憶されている時間ソート処理
の対象とされる小節内のイベントデータ群に含まれ、ジ
ャンプイベントデータ及びジャンプソースイベントデー
タによって区切られる全てのイベントデータのグループ
(以下、イベントデータフラグメント又は単にフラグメ
ントと呼ぶ)のそれぞれの内部で閉じた時間ソート処理
であるフラグメント内ソート処理が実行される。
【0038】続いて、ステップ605では、配列SNG
_SONGに記憶されている上記対象小節に含まれる隣
接するフラグメント同士で、それらの接続部に位置する
イベントデータ(ジャンプイベントデータの直前に位置
するイベントデータとそのジャンプイベントデータに対
応するジャンプソースイベントデータの直後に位置する
イベントデータ)についての時間ソート処理であるフラ
グメント間ソート処理が実行される。
【0039】そして、上述のステップ604のフラグメ
ント内ソート処理とステップ605のフラグメント間ソ
ート処理が繰り返し実行され、両方の処理において実際
にイベントデータの入替えが発生しなくなった時点で、
配列SNG_SONGに記憶されている対象小節内のイ
ベントデータ群に対する時間ソート処理が完了する。具
体的には、ステップ604又は605において実際にイ
ベントデータの入替えが発生した場合は、ステップ60
4又は605内において後述するように時間ソート処理
終了フラグの値が0にセットされる。従って、この場合
にはステップ602の判定がYESとなるため、時間ソ
ート処理が続行される。一方、ステップ604及び60
5の両方で実際にイベントデータの入替えが発生しなく
なった場合は、ステップ604及び605の何れにおい
ても時間ソート処理終了フラグの値を0にセットする処
理が実行されなくなる。従って、この場合には時間ソー
ト処理終了フラグの値はステップ603で1にセットさ
れたままとなるため、ステップ602の判定がNOとな
り、時間ソート処理が終了する。
【0040】図7は、図6のステップ604のフラグメ
ント内ソート処理の動作フローチャートである。まず、
フラグメント内ソート処理終了フラグ(CPU103内
のレジスタ又はRAM105に確保される)は、フラグ
メント内ソート処理を、終了させるべきでない場合に値
0となり、終了させるべきである場合に値1となる。こ
のフラグの値は、ステップ701で、0に初期化され
る。
【0041】サーチ状態フラグ(CPU103内のレジ
スタ又はRAM105に確保される)は、配列SNG_
SONGに記憶されている対象小節に含まれる現在処理
中のフラグメント内において、ジャンプソースイベント
データ以外の先頭のイベントデータをサーチする処理
が、終了していない場合に値0となり、終了している場
合に値1となる。このフラグの値は、ステップ702
で、0に初期化される。
【0042】サーチイベント(CPU103内のレジス
タ又はRAM105に確保される)は、配列SNG_S
ONGに記憶されている対象小節に含まれる現在処理中
のフラグメント内において、現在処理中のイベントデー
タを指示するものである。このサーチイベントの値は、
ステップ703で、配列SNG_SONGに記憶される
対象小節内の先頭のイベントデータの要素番号にセット
される。この番号は、図3の配列SNG_BAR_TB
L及び配列SNG_BAR_PTRから容易に検索でき
る。
【0043】続いて、初期状態では、ステップ704と
705の判定が共にYESとなった後、ステップ706
〜713において、配列SNG_SONGに記憶されて
いる対象小節に含まれる現在処理中のフラグメント内に
おいて、ジャンプソースイベントデータ以外の先頭のイ
ベントデータをサーチする処理が実行される。
【0044】まず、サーチイベントによって指示される
現在イベントデータ(フロー中では現在イベントと記述
する)が、RAM105内の配列SNG_SONGから
読み出される。
【0045】そして、現在イベントデータがジャンプソ
ースイベントデータである場合は、ステップ706の判
定の後にステップ707が実行され、サーチイベントが
指示する配列SNG_SONGの要素番号がインクリメ
ントされる。これらのステップ706とステップ707
の処理の繰返しによって、現在処理中のフラグメント内
の先頭のジャンプソースイベントデータが無視される。
【0046】現在イベントデータがジャンプソースイベ
ントデータ以外のイベントデータとなった場合は、ステ
ップ708で、そのイベントデータの種類が判定され
る。ステップ708で現在イベントデータがトラック終
了イベントデータ又は小節終了イベントデータ(図5参
照)であると判定された場合には、ステップ709で、
フラグメント内ソート処理終了フラグの値が1にセット
される。即ち、この場合は、現在処理中のフラグメント
内にはソート処理を実行すべき有効なイベントデータは
存在せず、かつ現在処理中のフラグメント以降に対象小
節のイベントデータ群が存在しないため、ステップ70
9の処理の後にステップ704が実行された時点でその
判定がNOとなり、フラグメント内ソート処理を終了す
る。
【0047】また、ステップ708で現在イベントデー
タがジャンプイベントデータ(図5(c) 参照)であると
判定された場合には、ステップ710で、そのジャンプ
イベントデータの第3ワードに格納されているジャンプ
先要素番号が、サーチイベントの値としてセットされ
る。即ち、この場合には、現在処理中のフラグメント内
にはソート処理を実行すべき有効なイベントデータは存
在せず、かつ現在処理中のフラグメント以降に対象小節
のイベントデータ群が存在する。このため、ステップ7
10の処理によってサーチイベントに新たなフラグメン
トの先頭のイベントデータの要素番号が設定された後
に、再びステップ704と705の判定が共にYESと
なった後、ステップ706〜713において、配列SN
G_SONGに記憶されている対象小節に含まれる新た
なフラグメント内において、ジャンプソースイベントデ
ータ以外の先頭のイベントデータをサーチする処理が再
度実行される。
【0048】更に、ステップ708で現在イベントデー
タがトラック終了イベントデータ、小節終了イベントデ
ータ、及びジャンプイベントデータ以外のイベントデー
タであると判定された場合には、ステップ711で、サ
ーチイベントの値がフラグメント先頭イベントの値とし
てセットされる。この値が、現在処理中のフラグメント
内で最初に見つかったジャンプソースイベントデータ以
外の先頭のイベントデータの要素番号となる。続いて、
ステップ712で、サーチイベントが指示する配列SN
G_SONGの要素番号がインクリメントされた後、サ
ーチ処理を終了させるべく、ステップ713で、サーチ
状態フラグの値が1にセットされる。
【0049】この結果、ステップ713に続いてステッ
プ704の判定がYESとなった後に、ステップ705
の判定がNOとなって、ステップ714〜716が実行
される。ステップ714〜716では、配列SNG_S
ONGに記憶されている対象小節に含まれる現在処理中
のフラグメント内で、トラック終了イベントデータ、小
節終了イベントデータ、及びジャンプイベントデータ以
外の末尾のイベントデータをサーチする処理が実行され
る。
【0050】まず、サーチイベントによって指示される
現在イベントデータが、RAM105内の配列SNG_
SONGから読み出される。そして、現在イベントデー
タがトラック終了イベントデータ、小節終了イベントデ
ータ、及びジャンプイベントデータ以外のイベントデー
タである場合には、ステップ714の判定の後にステッ
プ715が実行され、サーチイベントが指示する配列S
NG_SONGの要素番号がインクリメントされる。こ
れらのステップ714とステップ707の処理の繰返し
によって、現在処理中のフラグメント内のイベントデー
タが末尾に向かって順次サーチされる。
【0051】現在イベントデータがトラック終了イベン
トデータ、小節終了イベントデータ、又はジャンプイベ
ントデータの何れかのイベントデータとなった場合は、
ステップ716で、サーチイベントが指示する要素番号
から−1して得られる値が、フラグメント終了イベント
の値としてセットされる。この値が、現在処理中のフラ
グメント内における、トラック終了イベントデータ、小
節終了イベントデータ、及びジャンプイベントデータ以
外の末尾のイベントデータである。
【0052】以上の処理により、現在処理中のフラグメ
ント内でソート処理が実行されるべき先頭のイベントデ
ータと末尾のイベントデータが、フラグメント先頭イベ
ント及びフラグメント終了イベントとして算出される。
【0053】続いて、ステップ717では、上記フラグ
メント先頭イベントとフラグメント終了イベントが指示
する要素番号が一致しているか否かが判定される。ステ
ップ717の判定がYESの場合は、現在処理中のフラ
グメント内でソート処理が実行されるべきイベントデー
タの数が1であり、実質的にソート処理を実行する必要
はないため、ステップ718のソート処理は実行されず
に、ステップ719以降が実行される。ステップ719
以降の処理については後述する。
【0054】ステップ717の判定がNOの場合は、ス
テップ718で、配列SNG_SONGに記憶されてい
る対象小節に含まれる現在処理中のフラグメント内で、
フラグメント先頭イベントとフラグメント終了イベント
により指示される範囲のイベントデータ群が、各イベン
トデータの第2ワードのクロック値に関してソートされ
る。この処理については、図13の動作フローチャート
を用いて後述する。なお、後述するように、ステップ7
18において実際にイベントデータの入替えが発生した
場合は、ステップ718内において時間ソート処理終了
フラグの値が0にセットされる。従って、この場合には
図6のステップ602の処理に戻った時点でその判定が
YESとなるため、時間ソート処理が続行される。
【0055】ステップ718の処理の後又はステップ7
17の判定がYESとなった後に、ステップ719で、
ステップ714で判定されている現在イベントデータの
種類が判定される。
【0056】ステップ719で現在イベントデータがト
ラック終了イベントデータ又は小節終了イベントデータ
であると判定された場合には、ステップ720で、フラ
グメント内ソート処理終了フラグの値が1にセットされ
る。即ち、この場合は、現在処理中のフラグメント以降
に対象小節のイベントデータ群が存在しないため、ステ
ップ720の処理の後にステップ704が実行された時
点でその判定がNOとなり、フラグメント内ソート処理
を終了する。
【0057】また、ステップ719で現在イベントデー
タがジャンプイベントデータであると判定された場合に
は、ステップ721で、そのジャンプイベントデータの
第3ワードに格納されているジャンプ先要素番号が、サ
ーチイベントの値としてセットされ、また、サーチ状態
フラグの値が0にセットされる。即ち、この場合は、現
在処理中のフラグメント以降に対象小節のイベントデー
タ群が存在する。このため、ステップ721の処理によ
ってサーチイベントに新たなフラグメントの先頭のイベ
ントデータの要素番号が設定された後に、再びステップ
704と705の判定が共にYESとなった後、ステッ
プ706以降において、配列SNG_SONGに記憶さ
れている対象小節に含まれる新たなフラグメントに対し
てフラグメント内ソート処理が実行される。
【0058】以上説明した図7の動作フローチャートの
処理によって、配列SNG_SONGに記憶されている
対象小節内の全てのフラグメントのそれぞれに対して、
図6のステップ604のフラグメント内ソート処理が1
回ずつ実行される。
【0059】続いて、図8〜図12は、図6のステップ
605のフラグメント間ソート処理の動作フローチャー
トである。まず、フラグメント間ソート処理終了フラグ
(CPU103内のレジスタ又はRAM105に確保さ
れる)は、フラグメント間ソート処理を、終了させるべ
きでない場合に値0となり、終了させるべきである場合
に値1となる。このフラグの値は、ステップ801で、
0に初期化される。
【0060】サーチイベント(CPU103内のレジス
タ又はRAM105に確保される)は、現在処理中のイ
ベントデータを指示するものである。このサーチイベン
トの値は、ステップ802で、配列SNG_SONGに
記憶される対象小節内の先頭のイベントデータの要素番
号にセットされる。
【0061】第1フラグメント最終イベント要素番号
(CPU103内のレジスタ又はRAM105に確保さ
れる)は、フラグメント間ソート処理が実行されるべき
現在処理中の2つのフラグメントのうちの第1番目のフ
ラグメントにおける、トラック終了イベントデータ、小
節終了イベントデータ、ジャンプソースイベントデー
タ、及びジャンプイベントデータ以外の末尾のイベント
データの要素番号を指示するものである。この値は、ス
テップ803で、配列SNG_SONG上の要素番号と
して出現し得ない値0xffffにセットされる。
【0062】次に、初期状態においては、ステップ80
4の判定がYESとなった後に、ステップ805でF1
フラグ(CPU103内のレジスタ又はRAM105に
確保される)の値が0にセットされる。F1フラグは、
配列SNG_SONGに記憶されている対象小節に含ま
れる現在処理中の2つのフラグメントのうちの第1番目
のフラグメントにおいて、トラック終了イベントデー
タ、小節終了イベントデータ、ジャンプソースイベント
データ、及びジャンプイベントデータ以外の末尾のイベ
ントデータをサーチする処理が、終了していない場合に
値0となり、終了している場合に値1となる。
【0063】続いて、図9のステップ806の判定がY
ESとなった後、図9のステップ807〜814で、配
列SNG_SONGに記憶されている対象小節に含まれ
る現在処理中の2つのフラグメントのうちの第1番目の
フラグメントにおいて、トラック終了イベントデータ、
小節終了イベントデータ、ジャンプソースイベントデー
タ、及びジャンプイベントデータ以外の末尾のイベント
データをサーチする処理が実行される。
【0064】まず、ステップ807で、サーチイベント
により指示される現在イベントデータが、RAM105
内の配列SNG_SONGから読み出される。そして、
そのイベントデータの種類が判定される。
【0065】ステップ807で現在イベントデータがト
ラック終了イベントデータ又は小節終了イベントデータ
であると判定された場合には、ステップ808で、F1
フラグとフラグメント間ソート処理終了フラグの値が共
に1にセットされる。即ち、この場合は、現在処理中の
第1番目のフラグメント内にはソート処理を実行すべき
有効な最終イベントデータは存在せず、かつ第1番目の
フラグメント以降に対象小節のイベントデータ群が存在
しないため、ステップ808の処理の後にステップ80
6が実行された時点でその判定がNOとなり、後述する
図10のステップ815が実行された後、ステップ81
6に対応する後述する図11の動作フローチャートが実
行される時点でステップ1101の判定がNOとなり、
更に、図10のステップ817の判定がNO、図8のス
テップ804の判定がNOとなって、フラグメント間ソ
ート処理を終了する。
【0066】また、図9のステップ807で現在イベン
トデータがジャンプイベントデータであると判定された
場合には、ステップ809で、第1フラグメント最終イ
ベント要素番号の値がステップ803で初期設定された
ままの値0xffffであるか否かが判定される。
【0067】今、配列SNG_SONG内の現在処理中
の2つのフラグメントのうちの第1番目のフラグメント
内に、トラック終了イベントデータ、小節終了イベント
データ、ジャンプソースイベントデータ、及びジャンプ
イベントデータ以外のイベントデータが1つも存在して
いなければ、第1フラグメント最終イベント要素番号の
値は初期設定値0xffffのままとなり、ステップ8
09の判定がYESとなる。この場合には、ステップ8
11で、そのジャンプイベントデータの第3ワードに格
納されている新たなフラグメントを示すジャンプ先要素
番号が、サーチイベントの値としてセットされる。その
後、再びステップ806の判定がYESとなることによ
り、ステップ807〜814において、配列SNG_S
ONGに記憶されている対象小節に含まれる新たなフラ
グメントが現在処理中の2つのフラグメントのうちの第
1番目のフラグメントとされて、処理が続行される。
【0068】更に、ステップ807で現在イベントデー
タがトラック終了イベントデータ、小節終了イベントデ
ータ、及びジャンプイベントデータ以外のイベントデー
タであると判定された場合において、更にステップ81
2で現在イベントデータがジャンプソースイベントデー
タであると判定された場合には、ステップ814で、単
純にサーチイベントが指示する配列SNG_SONGの
要素番号がインクリメントされた後に、再びステップ8
06からステップ807の処理に戻る。
【0069】また、ステップ807で現在イベントデー
タがトラック終了イベントデータ、小節終了イベントデ
ータ、及びジャンプイベントデータ以外のイベントデー
タであると判定された場合において、更にステップ81
2で現在イベントデータがジャンプソースイベントデー
タ以外の通常のイベントデータであると判定された場合
には、ステップ813で、サーチイベントの値が第1フ
ラグメント最終イベント要素番号としてセットされる。
そして、ステップ814で、サーチイベントが指示する
配列SNG_SONGの要素番号がインクリメントされ
た後に、再びステップ806からステップ807の処理
に戻る。
【0070】以上のようにして第1フラグメント最終イ
ベント要素番号がインクリメントされてゆき、最後にス
テップ807でジャンプイベントデータが検出された時
点において第1フラグメント最終イベント要素番号にセ
ットされている要素番号が、配列SNG_SONGに記
憶されている対象小節に含まれる現在処理中の2つのフ
ラグメントのうちの第1番目のフラグメントにおいて見
つかった、トラック終了イベントデータ、小節終了イベ
ントデータ、ジャンプソースイベントデータ、及びジャ
ンプイベントデータ以外の末尾のイベントデータの要素
番号となる。その後、ステップ809の判定がNOとな
って、第1番目のフラグメントにおけるサーチ処理を終
了させるべく、ステップ810で、F1フラグの値が1
にセットされる。そして、ステップ811で、そのジャ
ンプイベントデータの第3ワードに格納されている新た
なフラグメントを示すジャンプ先要素番号が、サーチイ
ベントの値としてセットされる。
【0071】この結果、ステップ811に続いて実行さ
れるステップ806の判定がNOとなり、図10のステ
ップ815でF2フラグ(CPU103内のレジスタ又
はRAM105に確保される)の値が0にセットされ
る。F2フラグは、配列SNG_SONGに記憶されて
いる対象小節に含まれる現在処理中の2つのフラグメン
トのうちの第2番目のフラグメントにおいて、トラック
終了イベントデータ、小節終了イベントデータ、ジャン
プソースイベントデータ、及びジャンプイベントデータ
以外の先頭のイベントデータをサーチする処理が、終了
していない場合に値0となり、終了している場合に値1
となる。
【0072】続いて、図10のステップ816で、配列
SNG_SONGに記憶されている対象小節に含まれる
現在処理中の2つのフラグメントのうちの第2番目のフ
ラグメントにおいて、トラック終了イベントデータ、小
節終了イベントデータ、ジャンプソースイベントデー
タ、及びジャンプイベントデータ以外の先頭のイベント
データをサーチする処理が実行される。
【0073】図11は、図10のステップ816の処理
の詳細を示す動作フローチャートである。まず、最初は
ステップ1101の判定がYESとなる。
【0074】次に、ステップ1102で、サーチイベン
トにより指示される現在イベントデータが、RAM10
5内の配列SNG_SONGから読み出される。そし
て、そのイベントデータの種類が判定される。
【0075】ステップ1102で現在イベントデータが
トラック終了イベントデータ又は小節終了イベントデー
タであると判定された場合には、ステップ1103で、
フラグメント間ソート処理終了フラグの値が1にセット
される。即ち、この場合は、現在処理中の2つのフラグ
メントのうちの第2番目のフラグメント内にはソート処
理を実行すべき有効な先頭イベントデータは存在せず、
かつ第2番目のフラグメント以降に対象小節のイベント
データ群が存在しないため、ステップ1103の処理の
後にステップ1101が実行された時点でその判定がN
Oとなり、図11の動作フローチャートによって示され
る図10のステップ816の処理を終了する。
【0076】また、ステップ1102で現在イベントデ
ータがジャンプイベントデータであると判定された場合
には、ステップ1104で、そのジャンプイベントデー
タの第3ワードに格納されているジャンプ先要素番号
が、サーチイベントの値としてセットされる。即ち、こ
の場合には、現在処理中の2つのフラグメントのうちの
第2番目のフラグメント内にはソート処理を実行すべき
有効なイベントデータは存在せず、かつその第2番目の
フラグメント以降に対象小節のイベントデータ群が存在
する。このため、ステップ1104の処理によってサー
チイベントに新たなフラグメントの先頭のイベントデー
タの要素番号が設定される。その後、再びステップ11
01の判定がYESとなることにより、ステップ110
2〜1108において、配列SNG_SONGに記憶さ
れている対象小節に含まれる新たなフラグメントが現在
処理中の2つのフラグメントのうちの第2番目のフラグ
メントとされて、処理が続行される。
【0077】更に、ステップ1102において現在イベ
ントデータがトラック終了イベントデータ、小節終了イ
ベントデータ、及びジャンプイベントデータ以外のイベ
ントデータであると判定された場合において、更にステ
ップ1105で現在イベントデータがジャンプソースイ
ベントデータであると判定された場合には、ステップ1
108で、単純にサーチイベントが指示する配列SNG
_SONGの要素番号がインクリメントされた後に、再
びステップ1101からステップ1102の処理に戻
る。
【0078】また、ステップ1102で現在イベントデ
ータがトラック終了イベントデータ、小節終了イベント
データ、及びジャンプイベントデータ以外のイベントデ
ータであると判定された場合において、更にステップ1
105で現在イベントデータがジャンプソースイベント
データ以外の通常のイベントデータであると判定された
場合には、ステップ1106で、サーチイベントの値が
第2フラグメント先頭イベント要素番号としてセットさ
れる。この値が、配列SNG_SONGに記憶されてい
る対象小節に含まれる現在処理中の2つのフラグメント
のうちの第2番目のフラグメントにおいて最初に見つか
った、トラック終了イベントデータ、小節終了イベント
データ、ジャンプソースイベントデータ、及びジャンプ
イベントデータ以外の先頭のイベントデータの要素番号
となる。続いて、第2番目のフラグメントにおけるサー
チ処理を終了させるべく、ステップ1107で、F2フ
ラグの値が1にセットされた後、ステップ1108で、
サーチイベントが指示する配列SNG_SONGの要素
番号がインクリメントされる。そして、ステップ110
6〜1108が実行された後にステップ1101が再び
実行される時点で、その判定がNOとなり、図11によ
って示される図10のステップ816の処理を終了す
る。
【0079】以上のようにして、配列SNG_SONG
に記憶されている対象小節に含まれる現在処理中の2つ
のフラグメントにつき、図9のステップ807〜814
で、第1番目のフラグメントの末尾のイベントデータを
サーチする処理が成功し、かつ、図11によって示され
る図10のステップ816で、第2番目のフラグメント
の先頭のイベントデータをサーチする処理に成功する
と、ステップ817の判定がYESとなった後、ステッ
プ818で、第1番目のフラグメントの末尾のイベント
データと第2番目のフラグメントの先頭のイベントデー
タについて、イベント移動処理が実行される。
【0080】図12は、図10のステップ818のイベ
ント移動処理の動作フローチャートである。まず、ステ
ップ1201で、RAM105内の配列SNG_SON
Gから、第1フラグメント最終イベント要素番号によっ
て指示される要素番号のイベントデータが読み出される
と共に、第2フラグメント先頭イベント要素番号によっ
て指示される要素番号のイベントデータが読み出され
る。そして、第1フラグメント最終イベント要素番号に
対応するイベントデータの第2ワードの値が、第2フラ
グメント先頭イベント要素番号に対応するイベントデー
タの第2ワードの値より大きいか否か、即ち、第1フラ
グメント最終イベント要素番号に対応するイベントデー
タが第2フラグメント先頭イベント要素番号に対応する
イベントデータよりも後ろに配置されるべきか否かが判
定される。
【0081】ステップ1201の判定がYESの場合に
は、ステップ1202で、第1フラグメント最終イベン
ト要素番号に対応するイベントデータと第2フラグメン
ト先頭イベント要素番号に対応するイベントデータの記
憶位置が入れ替えられる。その後、ステップ1203及
び1204で、フラグメント間ソート処理終了フラグ及
び時間ソート処理終了フラグの値が、共に0にセットさ
れる。このように、実際にイベントデータの入替えが発
生した場合には、時間ソート処理終了フラグの値が0に
セットされるため、前述した図6のステップ604のフ
ラグメント内ソート処理とステップ605のフラグメン
ト間ソート処理が終了した後にステップ602の判定に
戻った時点で、その判定が再びYESとなり、時間ソー
ト処理が続行される。
【0082】一方、ステップ1201の判定がNOの場
合には、第1フラグメント最終イベント要素番号に対応
するイベントデータと第2フラグメント先頭イベント要
素番号に対応するイベントデータの入替えは実行され
ず、ステップ1205で、フラグメント間ソート処理終
了フラグの値が0にセットされる。
【0083】以上のようにして、配列SNG_SONG
に記憶される対象小節に含まれる現在処理中の2つのフ
ラグメントについて、フラグメント間ソート処理が実現
される。
【0084】ステップ1204又は1205の処理の
後、再び図8のステップ804の処理に戻り、その判定
がYESとなることにより、ステップ805以降で、配
列SNG_SONGに記憶されている対象小節に含まれ
る新たな2つのフラグメントにつき、第1番目のフラグ
メントの末尾のイベントデータをサーチする処理と、第
2番目のフラグメントの先頭のイベントデータをサーチ
する処理と、サーチされた2つのイベントデータに対す
るイベント移動処理の実行が試みられる。この場合、サ
ーチイベントの値は今まで第2番目であったフラグメン
トの先頭のイベントデータを指示しているため、今まで
第2番目として処理されたフラグメントが新たな第1番
目のフラグメントとして処理される。そして、それに続
く対象小節内のフラグメントが第2番目のフラグメント
として処理される。
【0085】以上の処理が繰返される結果、対象小節の
末尾のフラグメントが第1番目のフラグメントとして処
理される過程において、ステップ807でトラック終了
イベントデータ又は小節終了イベントデータが検出され
る。これにより、ステップ808で、F1フラグとフラ
グメント間ソート処理終了フラグの値が共に1にセット
される。即ち、この場合は、現在処理中の第1番目のフ
ラグメント内にはソート処理を実行すべき有効な最終イ
ベントデータは存在せず、かつ第1番目のフラグメント
以降に対象小節のイベントデータ群が存在しないため、
ステップ808の処理の後にステップ806が実行され
た時点でその判定がNOとなり、後述する図10のステ
ップ815が実行された後、ステップ816に対応する
後述する図11の動作フローチャートが実行される時点
でステップ1101の判定がNOとなり、更に、図10
のステップ817の判定がNO、図8のステップ804
の判定がNOとなって、フラグメント間ソート処理を終
了する。
【0086】最後に、図13は、図7のステップ718
において実行される、配列SNG_SONGに記憶され
ている対象小節に含まれる現在処理中のフラグメント内
の、フラグメント先頭イベントとフラグメント終了イベ
ントにより指示される範囲のイベントデータ群に対する
時間ソート処理を示す動作フローチャートである。
【0087】ここでは、フラグメント先頭イベントとフ
ラグメント終了イベントにより指示される範囲のイベン
トデータ群が、各イベントデータの第2ワードのクロッ
ク値に関してソートされる。
【0088】以下の説明では、図13の動作フローチャ
ートについて説明する前に、ソートアルゴリズムの代表
例と、本実施例で採用する改良アルゴリズムの原理につ
いて簡単に説明する。なお、以下で説明するバブルソー
トアルゴリズムとコムソートアルゴリズムの詳細な原理
については、文献「バブル・ソートが簡単な手直しで劇
的に速くなる」(スティーブン・レイシー、リチャード
・ボックス)(日経BP社発行、日経バイト/1991
年11月号、p.305〜p.312)に記載されてい
る。
【0089】ソートアルゴリズムの最も代表的なものと
して、バブルソートアルゴリズムが知られている。この
アルゴリズムにおいては、例えば昇べきの順にソートが
行われる場合には、まず、第1番目のイベントデータ値
(第2バイトの値)と第2番目のイベントデータ値の大
小関係が比較され、第1番目のイベントデータ値の方が
大きければ両者のイベントデータが入れ替えられる。次
に、新たな第2番目のイベントデータ値と第3番目のイ
ベントデータ値の大小関係が同様に比較され入替えが実
行される。このようにして、最終イベントデータまで同
様の比較・入替え処理が実行される。この最終データま
での1回の処理単位を、ストロークと呼ぶ。続いて、再
び、第1番目のイベントデータから最終イベントデータ
に向かって第2ストローク目の処理が繰り返される。そ
して、このストローク処理が、イベントデータの入替え
が発生しなくなるまで繰り返される。
【0090】以上のバブルソートアルゴリズムは、隣り
同士のイベントデータ値の比較・入替え処理の繰返しに
よって実現されるため、処理プログラムが簡単に実現で
きる反面、イベントデータは1回の比較・入替え処理に
よって1アドレス分だけしか移動できないため、例えば
フラグメントの後部に位置するイベントデータがフラグ
メントの先頭付近に移動させられる場合には処理時間が
長くなってしまう。
【0091】そこで、そのようなバブルソートアルゴリ
ズムの欠点を改良するアルゴリズムとして、コムソート
アルゴリズムが知られている。このアルゴリズムでは、
バブルソートアルゴリズムのように隣接したイベントデ
ータ値同士について比較・入替えが実行されるのではな
く、1以上離れた間隔(以下、この間隔をギャップとい
う)のイベントデータ値同士について、比較・入替えが
実行される。
【0092】具体的には、次のようなコムソートアルゴ
リズムが最適であることが実験的に確かめられている。
即ち、まず、最初のストローク処理(第1番目のイベン
トデータから最終イベントデータまでの1回の処理)に
おけるギャップの値は、ソート処理されるイベントデー
タの要素数を1.3で割って得られる値とされる。以
下、ストロークが進む毎に、前回のギャップの値を1.
3で割って得られる値が新たなギャップの値とされる。
この過程で、ギャップの値が9又は10となった時点
で、ギャップの値が強制的に11に置き換えられて処理
が続行される。商が1未満になると、それ以降のギャッ
プの値は1とされる。そして、ギャップの値が1とな
り、かつストローク処理においてイベントデータの入替
えが発生しなくなった時点で、ソート処理が終了する。
【0093】以上のコムソートアルゴリズムが、最も高
速なソートアルゴリズムとして知られている。しかし、
上述のコムソートアルゴリズムでは、ストロークが進む
毎にソート処理されるべき要素数又は前回のギャップ値
を1.3で割ることにより新たなギャップの値を算出す
る処理が必要となる。このことは、上記除算処理のため
に小数演算用コプロセッサが必要になるということを意
味するため、ハードウエア規模が大きくなってしまうと
いう欠点がある。
【0094】そこで、本実施例では、コムソートアルゴ
リズムを基本とし、値1.3による除算処理を、値3の
乗算処理と値4の除算処理で置き換えたアルゴリズムが
採用される。即ち、値1.3による除算処理が値(3/
4)による除算処理に置き換えられたことになる。これ
により、小数演算用コプロセッサが不要となり、ハード
ウエア規模の増大を抑えることができる。なお、このよ
うにギャップ値が代用されても、ソート時間の増大はそ
れほど大きくならない。
【0095】図13は、上述のアルゴリズムに基づく図
7のステージ718の処理の詳細な動作フローチャート
である。図13の動作フローチャートにおいて、まず、
SIZE(CPU103内のレジスタ又はRAM105
に確保される)には、ソート処理の対象となるフラグメ
ントの要素数がセットされる。この数は、(フラグメン
ト終了イベント−フラグメント先頭イベント+1)とし
て算出できる。
【0096】次に、GAP(CPU103内のレジスタ
又はRAM105に確保される)には、前述のギャップ
の値がセットされる。また、TOP(CPU103内の
レジスタ又はRAM105に確保される)には、後述す
るイベント移動ループ処理時の上限のイベントの要素値
がセットされる。
【0097】更に、COUNTER(CPU103内の
レジスタ又はRAM105に確保される)には、後述す
る移動イベントカウンタ値がセットされる。図13の動
作フローチャートにおいて、まず、ステップ1301
で、GAPにSIZEの値がセットされる。次に、前述
した除算処理の簡略化原理に基づき、ステップ1302
において、GAPの値に整数値3を乗算する整数乗算処
理が実行され、更に、その乗算結果を整数値4で除算す
る整数除算処理が実行される。この除算処理は、実際に
は、2ビット右シフト演算として実現できる。この演算
結果が新たなGAPの値としてセットされる。
【0098】次に、ステップ1303で新たに算出され
たGAPの値が判定され、GAPの値が9又は10の場
合には、前述したコムソート11のアルゴリズムの原理
に基づいて、ステップ1304で、GAPの値が11に
修正される。また、GAPの値が0となってしまった場
合には、やはり前述したコムソート11のアルゴリズム
の原理に基づいて、ステップ1305で、GAPの値が
1に修正される。GAPの値が9、10、又は0の何れ
でもない場合には、GAPの値の修正は行われない。
【0099】次に、ステップ1306で、COUNTE
Rの値が0にセットされる。続いて、ステップ1307
で、第1イベント要素番号(CPU103内のレジスタ
又はRAM105に確保される)に、図7の動作フロー
チャートにおいて求まっているフラグメント先頭イベン
トにセットされている要素番号がセットされる。この第
1イベント要素番号は、後述するイベント移動ループ処
理において比較される2つのイベントデータのうち要素
番号が小さい方のイベントデータに対応する。
【0100】次に、TOPの値が、次の数1式により算
出されセットされる。
【0101】
【数1】 TOP=フラグメント先頭イベント+SIZE−GAP このTOPの値は、次に説明するイベント移動ループ処
理においてインクリメントすることのできる第1イベン
ト要素番号の上限値に対応する。
【0102】続いて、ステップ1309〜1314→1
315→1309のイベント移動ループ処理が実行され
る。ここでは、1ストローク分のイベントデータの比較
・入替え処理が実行される。
【0103】まず、ステップ1309では、第2イベン
ト要素番号(CPU103内のレジスタ又はRAM10
5に確保される)の値が、次の数2式によって算出され
セットされる。
【0104】
【数2】 第2イベント要素番号=第1イベント要素番号+GAP この第2イベント要素番号は、イベント移動ループ処理
において比較される2つのイベントデータのうち要素番
号が大きい方のイベントデータに対応する。
【0105】ステップ1310では、RAM105の配
列SNG_SONG(図3(c) )に記憶される第1イベ
ント要素番号に対応するイベントデータの第2ワードの
小節先頭からのクロック値が、同じく第2イベント要素
番号に対応するイベントデータの第2ワードの小節先頭
からのクロック値よりも大きいか否か、即ち、第1イベ
ント要素番号に対応するイベントデータが第2イベント
要素番号に対応するイベントデータよりも後ろに配置さ
れるべきか否かが判定される。
【0106】ステップ1310の判定がYESの場合に
は、ステップ1311で、第1イベント要素番号に対応
するイベントデータと第2イベント要素番号に対応する
イベントデータの記憶位置が入れ替えられる。その後、
ステップ1312で、COUNTERの値がインクリメ
ントされる。更に、ステップ1313で、時間ソート処
理終了フラグの値が、0にセットされる。このように、
実際にイベントデータの入替えが発生した場合には、時
間ソート処理終了フラグの値が0にセットされるため、
前述した図6のステップ604のフラグメント内ソート
処理とステップ605のフラグメント間ソート処理が終
了した後にステップ602の判定に戻った時点で、その
判定が再びYESとなり、時間ソート処理が続行され
る。
【0107】一方、ステップ1310の判定がNOの場
合には、ステップ1311〜1313の処理は実行され
ない。続いて、ステップ1314で、第1イベント要素
番号の値がTOPの値より小さいか否かが判定される。
【0108】ステップ1314の判定がYESなら、ス
テップ1315で第1イベント要素番号の値がインクリ
メントされた後、ステップ1309で第1イベント要素
番号からGAPの値分だけ離れた新たな第2イベント要
素番号の値が算出され、ステップ1310〜1313
で、両者に対する比較・入替えの処理が実行される。
【0109】以上のステップ1309〜1315の処理
がステップ1314の判定がNOとなるまで繰り返され
ることにより、1ストローク分のイベントデータの比較
・入替え処理が実行される。
【0110】次に、ステップ1314の判定がNOとな
り1ストローク分のイベントデータの比較・入替え処理
が終了すると、ステップ1315で、COUNTERの
値が0でないか(即ち、直前にイベントデータの入替え
が行われたか)、又はGAPの値が1より大きいかが判
定される。
【0111】ステップ1316の判定がYESなら、ス
テップ1302〜1305に戻って新たなストロークの
ためのGAPの値が算出され、ステップ1306〜13
08の処理の後、前述したステップ1309〜1315
のイベント移動ループ処理によって、新たなストローク
に対するイベントデータの比較・入替え処理が繰り返さ
れる。
【0112】GAPの値が1となり、かつ前述したイベ
ント移動ループ処理によってイベントデータの入替えが
発生しなくなり、ステップ1316の判定がNOとなっ
た時点で、図13によって示される図7のステップ71
8のフラグメント内のソート処理が終了する。
【0113】
【発明の効果】本発明によれば、複数のフラグメントに
属するシーケンスデータ全体に対するソート処理が、フ
ラグメント内ソート処理とフラグメント間ソート処理の
繰返しという処理構造に単純化される結果、フラグメン
ト内ソート処理に対して、従来からある通常のシーケン
スデータに対する高速ソート処理アルゴリズムを適用す
ることが可能となる。
【0114】これにより、複数のフラグメントに属する
シーケンスデータ全体に対する高速なソート処理を、単
純な制御で実現することが可能となる。
【図面の簡単な説明】
【図1】本発明の実施例の構成図である。
【図2】RAM105に記憶される楽曲データのデータ
フォーマットを示す図(その1)である。
【図3】RAM105に記憶される楽曲データのデータ
フォーマットを示す図(その2)である。
【図4】ノートイベントデータとコントロールイベント
データのデータフォーマットを示す図である。
【図5】ジャンプイベントデータ群のデータフォーマッ
トを示す図である。
【図6】時間ソート処理の全体動作フローチャートであ
る。
【図7】フラグメント内ソート処理の動作フローチャー
トである。
【図8】フラグメント間ソート処理の動作フローチャー
ト(その1)である。
【図9】フラグメント間ソート処理の動作フローチャー
ト(その2)である。
【図10】フラグメント間ソート処理の動作フローチャ
ート(その3)である。
【図11】第2フラグメント先頭イベントサーチ処理の
動作フローチャートである。
【図12】イベント移動処理の動作フローチャートであ
る。
【図13】フラグメント内のイベントソート処理を示す
動作フローチャートである。
【符号の説明】 101 演奏情報入力部 102 表示部 103 CPU 104 ROM 105 RAM 106 演奏情報出力部 107 システム操作子群

Claims (2)

    (57)【特許請求の範囲】
  1. 【請求項1】 複数の連続するシーケンスデータ群から
    構成されるフラグメントを単位として前記シーケンスデ
    ータを記憶するメモリを有し、該メモリに記憶される所
    定の複数のフラグメントに属するシーケンスデータ全体
    に対し、前記シーケンスデータが有する所定の属性に関
    してソート処理を実行するソート処理装置において、 前記所定の複数のフラグメントのそれぞれについて、該
    各フラグメントに属するシーケンスデータに対して、前
    記所定の属性に関して該各フラグメント内で閉じたソー
    ト処理を実行するフラグメント内ソート処理手段と、 該フラグメント内ソート処理手段による処理に続いて、
    前記所定の複数のフラグメント中の隣接するフラグメン
    ト同士で、それらの接続部に位置するシーケンスデータ
    に対して、前記所定の属性に関してソート処理を実行す
    るフラグメント間ソート処理手段と、 前記フラグメント内ソート処理手段による処理と前記フ
    ラグメント間ソート処理手段による処理を、ソート処理
    の対象となったシーケンスデータの入替えが発生しなく
    なるまで繰り返させる制御手段と、 を有することを特徴とするシーケンスデータのソート処
    理装置。
  2. 【請求項2】 複数の連続するシーケンスデータ群から
    構成されるフラグメントを単位としてメモリに記憶され
    る前記シーケンスデータについて、該メモリに記憶され
    る所定の複数のフラグメントに属するシーケンスデータ
    全体に対し、前記シーケンスデータが有する所定の属性
    に関してソート処理を実行するソート処理方法におい
    て、 前記所定の複数のフラグメントのそれぞれについて、該
    各フラグメントに属するシーケンスデータに対して、前
    記所定の属性に関して該各フラグメント内で閉じたソー
    ト処理を実行する処理であるフラグメント内ソート処理
    を実行し、 該フラグメント内ソート処理に続いて、前記所定の複数
    のフラグメント中の隣接するフラグメント同士で、それ
    らの接続部に位置するシーケンスデータに対して、前記
    所定の属性に関してソート処理を実行する処理であるフ
    ラグメント間ソート処理を実行し、 前記フラグメント内ソート処理及び前記フラグメント間
    ソート処理を、ソート処理の対象となったシーケンスデ
    ータの入替えが発生しなくなるまで繰り返させる、 ことを特徴とするシーケンスデータのソート処理方法。
JP33936494A 1994-12-29 1994-12-29 シーケンスデータのソート処理装置/方法 Expired - Fee Related JP3489236B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP33936494A JP3489236B2 (ja) 1994-12-29 1994-12-29 シーケンスデータのソート処理装置/方法
US08/576,481 US5672837A (en) 1994-12-29 1995-12-21 Automatic performance control apparatus and musical data storing device

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP33936494A JP3489236B2 (ja) 1994-12-29 1994-12-29 シーケンスデータのソート処理装置/方法

Publications (2)

Publication Number Publication Date
JPH08185311A JPH08185311A (ja) 1996-07-16
JP3489236B2 true JP3489236B2 (ja) 2004-01-19

Family

ID=18326774

Family Applications (1)

Application Number Title Priority Date Filing Date
JP33936494A Expired - Fee Related JP3489236B2 (ja) 1994-12-29 1994-12-29 シーケンスデータのソート処理装置/方法

Country Status (1)

Country Link
JP (1) JP3489236B2 (ja)

Also Published As

Publication number Publication date
JPH08185311A (ja) 1996-07-16

Similar Documents

Publication Publication Date Title
JP3163119B2 (ja) 記録再生装置
KR100252399B1 (ko) 음악 정보 기록 및 재생 방법, 재생 장치
US6635816B2 (en) Editor for musical performance data
US5672837A (en) Automatic performance control apparatus and musical data storing device
US7323630B2 (en) Automatic performance system
JP3700532B2 (ja) 演奏情報編集再生装置
JP3489236B2 (ja) シーケンスデータのソート処理装置/方法
JP3533481B2 (ja) シーケンスデータの挿入処理装置
JPH08185164A (ja) 自動演奏制御装置及びそれに使用する楽曲データ記憶装置
US6956161B2 (en) Musical performance data search system
JP2940129B2 (ja) リズム演奏装置
JPH0981368A (ja) シーケンスデータのソート処理装置/方法
JP2743808B2 (ja) 自動演奏装置
JPS58224387A (ja) 楽譜表示装置
JP3346187B2 (ja) 演奏データ編集装置および演奏データ編集プログラムを記憶した媒体
JPH06203534A (ja) 電子楽器のファイル管理システム
JP3604513B2 (ja) 演奏データ編集装置
JP3219150B2 (ja) 演奏情報圧縮方法
JP3460524B2 (ja) 曲データ加工方法、加工後曲データ再生方法および記憶媒体
JP3794299B2 (ja) 演奏情報編集装置及び演奏情報編集プログラム
JP3823464B2 (ja) 時系列イベントデータを含むデータの処理装置および方法、時系列イベントデータ処理用プログラムが記録された記録媒体ならびに時系列イベントデータを含むデータが記録された記録媒体
JPH0887271A (ja) 演奏情報圧縮方法及び演奏情報伸張方法
JP3823465B2 (ja) 時系列イベントデータを含むデータの処理装置および方法、時系列イベントデータ処理用プログラムが記録された記録媒体ならびに時系列イベントデータを含むデータが記録された記録媒体
JP3307598B2 (ja) 演奏記録再生装置
JP4456469B2 (ja) 演奏情報再生装置

Legal Events

Date Code Title Description
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20031007

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20071107

Year of fee payment: 4

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20081107

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20081107

Year of fee payment: 5

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20091107

Year of fee payment: 6

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20101107

Year of fee payment: 7

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20101107

Year of fee payment: 7

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20111107

Year of fee payment: 8

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20111107

Year of fee payment: 8

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20121107

Year of fee payment: 9

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20131107

Year of fee payment: 10

LAPS Cancellation because of no payment of annual fees