JP3533481B2 - シーケンスデータの挿入処理装置 - Google Patents

シーケンスデータの挿入処理装置

Info

Publication number
JP3533481B2
JP3533481B2 JP23313395A JP23313395A JP3533481B2 JP 3533481 B2 JP3533481 B2 JP 3533481B2 JP 23313395 A JP23313395 A JP 23313395A JP 23313395 A JP23313395 A JP 23313395A JP 3533481 B2 JP3533481 B2 JP 3533481B2
Authority
JP
Japan
Prior art keywords
event data
sequence data
value
event
data
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
JP23313395A
Other languages
English (en)
Other versions
JPH0981130A (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 JP23313395A priority Critical patent/JP3533481B2/ja
Publication of JPH0981130A publication Critical patent/JPH0981130A/ja
Application granted granted Critical
Publication of JP3533481B2 publication Critical patent/JP3533481B2/ja
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、電子楽器の自動演
奏装置のメモリに格納された楽曲データなどのシーケン
スデータの挿入処理技術に関する。
【0002】
【従来の技術】従来、楽曲を電子楽器などに自動演奏さ
せるための自動演奏装置において、楽曲データは、その
種類を示すデータと、それに対応する演奏操作の発生タ
イミングと発生時間長を示すタイミングデータとを少な
くとも含むシーケンスデータとして記憶手段に記憶され
る。そして、現在の自動演奏装置においては、それらの
シーケンスデータをディスプレイに表示させながら任意
のシーケンスデータに対して、挿入、削除、変更等の編
集操作を実行することができる。
【0003】ここで、和音等を表わすための、同一の発
生タイミングに位置する複数のイベントデータで構成さ
れるシーケンスデータ群に、それらと同じ発生タイミン
グを有する新たなシーケンスデータ(和音の新たな構成
音を示すノートイベントデータ等)が挿入される場合に
は、従来、次のような処理が行われている。
【0004】即ち、対象となる小節の末尾のイベントデ
ータ(小節終了イベントデータ以外のイベントデータ)
の記憶位置の次の記憶位置に、対象となるシーケンスデ
ータが挿入された後に、その小節内のシーケンスデータ
が、発生タイミング順にソートされる。
【0005】
【発明が解決しようとする課題】ここで、上述の従来技
術では、シーケンスデータ群のソートはそれぞれのイベ
ントの発生タイミングのみに基づいて行われる。このた
め、同一の発生タイミングに位置するシーケンスデータ
群がノートイベントデータによって構成され、それらと
同じ発生タイミングを有する新たに挿入されるシーケン
スデータもノートイベントデータである場合には、ソー
ト後にそれらのシーケンスデータ群がディスプレイに表
示させられた場合、ソートのされ方によってそれらの表
示順が各ノートイベントデータの音高の高低と一致しな
くなり、視覚上好ましくない場合が発生することがある
という問題点を有している。なお、音高の代わりに、ベ
ロシティ等であっても同様の問題が発生する。
【0006】また、同一の発生タイミングに位置する各
イベントデータは、その記憶順に処理される。このた
め、同一の発生タイミングに位置するシーケンスデータ
群がノートイベントデータによって構成され、それらと
同じ発生タイミングを有する新たに挿入されるシーケン
スデータが例えば音色の変更を指示するためのプログラ
ムチェンジイベントデータであって、ソート後にそのプ
ログラムチェンジイベントデータが上記各ノートイベン
トデータの記憶位置の後方に記憶し直されたような場合
には、上記ノートイベントデータにより発音が開始され
た楽音群が、その直後の同じタイミングに実行されるプ
ログラムチェンジイベントデータの処理によってハイリ
リース(急速に消音)されることになり、聴感上好まし
くない場合が発生することがあるという問題点を有して
いる。
【0007】更に、上述のプログラムチェンジイベント
データの挿入処理におけるソート処理が、処理速度の速
いことで知られるコムソートアルゴリズムに基づいて実
行された場合、挿入処理前と挿入処理後とで、挿入され
るプログラムチェンジイベントデータを除く他の同じタ
イミングのシーケンスデータ群の記憶順が、変更されて
しまうことがあり、視覚上好ましくない場合が発生する
ことがあるという問題点を有している。
【0008】本発明の課題は、同一の発生タイミングに
位置するシーケンスデータ群にそれらと同じ発生タイミ
ングを有するシーケンスデータが挿入される場合のソー
ト処理を、適切に実行可能とすることにある。
【0009】
【課題を解決するための手段】本発明は、シーケンスデ
ータ記憶手段内の所定範囲(例えば挿入対象小節内)の
シーケンスデータ群と新たに挿入されたシーケンスデー
タである挿入シーケンスデータとで、シーケンスデータ
群及び挿入シーケンスデータに含まれる発生タイミング
(例えば小節先頭からのクロック値、以下「第 1 のパラ
メータ」とも記述)についてソート処理を実行するシー
ケンスデータの挿入処理装置を前提とする。
【0010】まず、本発明の第1の態様について説明す
る。本発明の第1の態様は、所定範囲のシーケンスデー
タ群に含まれ、挿入シーケンスデータに含まれる第1の
パラメータの値と同じ値の第1のパラメータを有するシ
ーケンスデータと、挿入シーケンスデータとが、それら
に含まれる特定パラメータ(以下「第2のパラメータ」
とも記述)について所定の順に並ぶようにソートする第
1のソート手段と、第1のソート手段によるソート後の
シーケンスデータ群を表示する表示手段を有する。より
具体的には、この第1のソート手段は、次のような第1
の制御手段、第1のソート処理実行手段、及び第2の制
御手段を有する。
【0011】即ち、第1の制御手段は、所定範囲のシー
ケンスデータ群に含まれ、挿入シーケンスデータに含ま
れる第1のパラメータの値と同じ値の第1のパラメータ
を有するシーケンスデータのうち、それらのシーケンス
データに含まれる第2のパラメータ(例えば音高番号)
の値が挿入シーケンスデータに含まれる第2のパラメー
タの値よりも大きな所定シーケンスデータについて、所
定シーケンスデータに含まれる第1のパラメータの値を
所定値だけ増加させる。
【0012】次に、第1のソート処理実行手段は、その
後、少なくとも所定シーケンスデータと挿入シーケンス
データとで、第1のパラメータについてソート処理を実
行する。
【0013】そして、第2の制御手段は、その後、所定
シーケンスデータに含まれる第1のパラメータの値を前
述の所定値だけ減少させる。上述した本発明の第1の態
様の構成により、第1のパラメータの値が同じであるシ
ーケンスデータ群が、第2のパラメータ(例えば音高番
号)について例えば小さい順にソートされる。このた
め、例えばシーケンサ装置において、同一の発生タイミ
ングに位置するシーケンスデータ群がノートイベントデ
ータによって構成され、それらと同じ発生タイミングを
有する新たに挿入されるシーケンスデータもノートイベ
ントデータである場合に、ソート後にそれらのシーケン
スデータ群がディスプレイに表示させられた場合、ソー
トのされ方によってそれらの表示順が各ノートイベント
データの音高の高低の順に並ぶように表示させることが
でき、視覚上好ましくないという事態を回避させること
ができる。
【0014】次に、本発明の第2の態様について説明す
る。本発明の第2の態様は、所定範囲のシーケンスデー
タ群に含まれ、挿入シーケンスデータに含まれる第1の
パラメータの値と同じ値の第1のパラメータを有するシ
ーケンスデータのうちノートイベントのシーケンスデー
タ(ノートイベントデータ、以下「特定種類のシーケン
スデータ」とも記述)よりも前に、挿入シーケンスデー
タが並び替えられるようにソートする第2のソート手段
を有する。より具体的には、この第2のソート手段は、
次のような第3の制御手段、第2のソート処理実行手
段、及び第4の制御手段を有する。
【0015】即ち、第3の制御手段は、所定範囲のシー
ケンスデータ群に含まれ、挿入シーケンスデータに含ま
れる第1のパラメータの値と同じ値の第1のパラメータ
を有するシーケンスデータのうち特定種類のシーケンス
データについて、それら特定種類のシーケンスデータに
含まれる第1のパラメータの値を所定値だけ増加させ
る。
【0016】次に、第2のソート処理実行手段は、その
後、少なくとも特定種類のシーケンスデータと挿入シー
ケンスデータとで、第1のパラメータについてソート処
理を実行する。
【0017】そして、第4の制御手段は、その後、特定
種類のシーケンスデータに含まれる第1のパラメータの
値を前述した所定値だけ減少させる。上述した本発明の
第2の態様の構成により、挿入シーケンスデータに含ま
れる第1のパラメータの値と同じ値の第1のパラメータ
を有するシーケンスデータのうち特定種類のシーケンス
データは、挿入シーケンスデータよりも後になるように
ソートされる。このため、例えばシーケンサ装置におい
て、同一の発生タイミングに位置するシーケンスデータ
群がノートイベントデータによって構成され、それらと
同じ発生タイミングを有する新たに挿入されるシーケン
スデータが例えば音色の変更を指示するためのプログラ
ムチェンジイベントデータである場合に、ソート後にそ
のプログラムチェンジイベントデータが上記各ノートイ
ベントデータの記憶位置の前方に並び替えられる。この
結果、上記ノートイベントデータにより発音が開始され
た楽音群が、その直後の同じタイミングに実行されるプ
ログラムチェンジイベントデータの処理によってハイリ
リース(急速に消音)され聴覚上好ましくないという事
態を回避することができる。
【0018】次に、本発明の第3の態様について説明す
る。本発明の第3の態様は、所定範囲のシーケンスデー
タ群に含まれ、挿入シーケンスデータに含まれる第1の
パラメータの値と同じ値の第1のパラメータを有するシ
ーケンスデータのうち特定種類のシーケンスデータより
も前に、挿入シーケンスデータが並び替えられ、かつ特
定種類のシーケンスデータの並び順が変更されないよう
にソートする第3のソート手段と、第3のソート手段に
よるソート後のシーケンスデータ群を表示する表示手段
を有する。より具体的には、この第3のソート手段は、
次のような第5の制御手段、第3のソート処理実行手
段、及び第6の制御手段を有する。
【0019】即ち、第5の制御手段は、所定範囲のシー
ケンスデータ群に含まれ、挿入シーケンスデータに含ま
れる第1のパラメータの値と同じ値の第1のパラメータ
を有するシーケンスデータのうち特定種類のシーケンス
データについて、それら特定種類のシーケンスデータに
含まれる第1のパラメータの値を、それら特定種類のシ
ーケンスデータの並び順に応じて順次増加するカウンタ
値だけ増加させる。
【0020】次に、第3のソート処理実行手段は、その
後、少なくとも特定種類のシーケンスデータと挿入シー
ケンスデータとで、第1のパラメータについてソート処
理を実行する。
【0021】その後、第6の制御手段は、特定種類のシ
ーケンスデータに含まれる第1のパラメータの値を前述
の順次増加するカウンタ値だけ減少させる。上述した本
発明の第3の態様の構成により、ソート処理が処理速度
の速いことで知られるコムソートアルゴリズム等に基づ
いて実行された場合であっても、特定種類のシーケンス
データの並び順が変更されないようにソートさせること
ができる。
【0022】
【発明の実施の形態】以下、図面を参照しながら本発明
の実施の形態につき詳細に説明する。本実施の形態の構成 図1は、本発明の実施の形態に係るシーケンサ装置の外
観図である。
【0023】このシーケンサ装置101は、家庭用テレ
ビ102に接続される。シーケンサ装置101内に記憶
される自動演奏用のシーケンスデータは、家庭用テレビ
102に表示することが可能である。
【0024】ユーザは、カーソルキー105によって家
庭用テレビ102の場面上でカーソル106を任意に移
動させながら、そのカーソル106により指示される任
意の記憶位置に、スイッチ103又は104によりイベ
ントデータを挿入することができる。スイッチ103は
ノートイベントデータを挿入するためのスイッチ、スイ
ッチ104はプログラムチェンジイベントデータを挿入
するためのスイッチである。なお、ユーザは、家庭用テ
レビ102における表示形式を、図1(a) に示される形
式と図1(b) に示される形式とで、任意に切り替えるこ
とができる。
【0025】家庭用テレビ102上での表示内容の示す
意味は図2(a) に示されるとおりである。“PRGCH
G”はプログラムチェンジイベントデータを、“NOT
E”はノートイベントを、それぞれ示す。
【0026】例えば、ノートイベントデータが挿入され
ると、家庭用テレビ102の表示内容は、図2(b) に示
されるような内容になる。次に、図3は、本発明の実施
の形態に係るシーケンサ装置101の全体構成図であ
る。
【0027】CPU303は、ROM304に記憶され
ている制御プログラムに基づいて、システム全体の動作
を制御する。そして、楽曲データの記録時には、特には
図示しない電子楽器から出力された演奏情報が、例えば
MIDI(Musical Instrument Digital Interface)規格に基
づいて転送され、その演奏情報が演奏情報入力部301
によって受信される。CPU303は、この演奏情報を
取り込み、その演奏情報を示すイベントデータを、必要
に応じてその入力タイミングと共に、RAM305の楽
曲データ記録領域上の記録対象トラックに順次記録す
る。記録対象トラックは、ユーザが予めシステム操作子
群307を操作して指定する。このシステム操作子群3
07には、図1のスイッチ103及び104が含まれ
る。
【0028】楽曲データの編集時には、CPU303
は、ユーザがシステム操作子群307において指定した
内容に従って、RAM305の楽曲データ記録領域上の
所望のトラックに記録されている楽曲データを読み出し
て、表示部302を介して、図1(a) 又は(b) に示され
る形式で、図1の家庭用テレビ102に表示する。ユー
ザは、システム操作子群307を用いて、家庭用テレビ
102に表示されている楽曲データに対し、楽曲データ
の挿入、削除、移動、複写などを行うことができる。こ
の編集結果は、RAM305の楽曲データ記録領域の楽
曲データの内容に反映される。
【0029】楽曲データの再生時には、RAM305の
楽曲データ記録領域上の再生対象トラックから、イベン
トデータが順次読み出され、各イベントデータに対応す
る演奏情報が、例えばMIDI規格に基づいて演奏情報出力
部306から外部の電子楽器又は音源装置に出力され、
これらの装置によってその演奏情報に対応する自動演奏
が行われる。本実施の形態のデータフォーマット 図4〜図7は、RAM305に記憶される楽曲データの
データフォーマットを示す図である。
【0030】本実施の形態では、楽曲データは、各小節
のイベントデータと、連続する128小節分のイベント
データを単位とする小節ブロックと、最大で8個の小節
ブロックを含むトラック、16トラックを単位とする楽
曲という各単位を用いて、階層的に管理される点が特徴
である。
【0031】まず、図4に示されるトラック使用状況デ
ータSNG_TRK_USEは、16ビットのデータで
あって、各楽曲毎に設定される。各データには、トラッ
ク0〜15の各トラックが楽曲の自動演奏において使用
されるか否かが、“1”又は“0”のフラグによって設
定される。このデータの、最下位ビットがトラック0に
対応し、最上位ビットがトラック15に対応する。
【0032】図5(a) に示される配列SNG_BAR_
TBLには、楽曲毎及び各楽曲内のトラック毎に、第0
小節〜第1023小節の1024小節を128小節ずつ
分割して得られる8つの小節ブロックのそれぞれに対応
する、図5(b) に示される配列SNG_BAR_PTR
内の128個ずつの配列データ群の各先頭要素情報が記
憶される。配列SNG_BAR_PTRに定義可能な小
節ブロックの数は、例えば最大で32である。その場
合、配列SNG_BAR_TBLには、小節ブロック先
頭要素情報として、0x00〜0x1f(10進数の0
〜31に対応)の何れかの値が記憶される。この小節ブ
ロック先頭要素情報の値を128倍して得られる値が、
その小節ブロックに対応する配列SNG_BAR_PT
R内の128個の配列データ群の先頭要素番号となる。
但し、未使用のトラックのそれぞれの小節ブロックの先
頭要素情報及び使用トラック内の未使用の小節ブロック
の先頭要素情報としては、値0xffが設定される。
【0033】図5(b) に示される配列SNG_BAR_
PTRには、上述の小節ブロック毎に、各小節ブロック
内の128小節のそれぞれに対応する、図5(c) に示さ
れる配列SNG_SONG内のイベントデータ群の各先
頭要素番号が記憶される。配列SNG_SONGに定義
可能なイベントデータの数は、例えば最大で16384
イベントである。その場合、配列SNG_BAR_PT
Rには、各小節に対応するイベントデータ群の先頭要素
番号として、0x0000〜0x3fff(10進数の
0〜16383に対応)の何れかの値が記憶される。但
し、全休符の小節に対応する先頭要素番号としては、値
0xffffが設定される。
【0034】図5(c) に示される配列SNG_SONG
には、上述したように小節単位で連続したイベントデー
タが記憶される。1つのイベントデータは、後述するよ
うに3ワードのデータとして構成される。但し、配列S
NG_SONGは、512個のイベントデータを単位と
する32個のイベントデータブロック(16384イベ
ントデータ分)に分割される。ここで、1つの小節内の
イベントデータ群が2つのイベントデータブロックに分
割される場合には、第1番目のイベントデータブロック
の末尾に後述するジャンプイベントデータが記憶され、
また、第2番目のイベントデータブロックの先頭に後述
するジャンプソースイベントデータが記憶される。
【0035】図6は、図5(c) の配列SNG_SONG
に記憶されるイベントデータ群を構成するノートイベン
トデータとコントロールイベントデータのデータフォー
マットを示す図であり、各イベントデータは3ワードの
データとして構成される。
【0036】図6(a) に示されるノートイベントデータ
は、楽譜の音符に対応するものであり、単音の発音処理
に必要な複数の情報を含む。即ち、ノートイベントデー
タの第1ワードは、上位7ビットが音高番号、下位7ビ
ットがベロシティを表わす。ノートイベントデータの第
2ワードは、そのノートイベントデータに対応する音符
について、それが含まれる小節の先頭からの時間位置
を、適当な単位(例えば480分の1拍のクロック)で
カウントした値である。そして、ノートイベントデータ
の第3ワードは、そのノートイベントデータに対応する
音符の発音時間を前述の適当な単位でカウントしたゲー
トタイムである。
【0037】図6(b) に示されるコントロールイベント
データは、楽曲の再生を制御するために必要な、上述の
ノートイベントデータ以外のイベントデータであり、第
1ワードの最上位ビットが1であることによって、ノー
トイベントデータと区別される。このコントロールイベ
ントデータは、更に、メタイベントデータ群、ジャンプ
イベントデータ群、及びコマンドイベントデータ群の3
つに分類される。メタイベントデータ群は、楽曲全体の
テンポ、拍子、調に関する情報を含む。ジャンプイベン
トデータ群は、図7で後述するように、トラック終了、
小節終了、次処理データへのジャンプ等の、イベントデ
ータの位置制御に関する情報を含む。更に、コマンドイ
ベントデータ群は、音量、プログラムチェンジ(音
色)、ベンダー等の、楽音に対する修飾的な効果を付加
するための情報を含む。コントロールイベントデータの
第1ワードの下位7ビットはコントロールコードを示
し、このコードによって制御内容が決定される。例え
ば、メタイベントデータ群のテンポイベントデータに対
応する第1ワードの値は0xff00、ジャンプイベン
トデータ群の小節終了イベントデータに対応する第1ワ
ードの値は0xff11(図7(b) 参照)、コマンドイ
ベントデータ群のプログラムチェンジイベントデータに
対応する第1ワードの値は0xff20となる。コント
ロールイベントデータの第2ワードは、そのコントロー
ルイベントデータに対応する制御が実行される小節の先
頭からの時間位置を、前述した適当な単位でカウントし
た値である。コントロールイベントデータの第3ワード
には、コントロールコード以外に必要なコントロール値
が格納される。例えばメタイベントデータ群のテンポイ
ベントデータの第3ワードにはテンポ番号、ジャンプイ
ベントデータ群のジャンプイベントデータの第3ワード
には配列SNG_SONG(図5(c) )内でのジャンプ
先のイベントデータの要素番号、コマンドイベントデー
タ群のプログラムチェンジイベントデータの第3ワード
には音色番号が格納される。
【0038】次に、上述したコントロールイベントデー
タのうちのジャンプイベントデータ群を構成する4種類
のイベントデータについて説明する。図7は、これら4
種類のイベントデータのそれぞれのデータフォーマット
を示す図である。
【0039】まず、図7(a) のトラック終了イベントデ
ータは、各トラックのイベントデータ群の終了位置にそ
のトラックの最終のイベントデータとして挿入される。
次に、図7(b) の小節終了イベントデータは、各小節の
イベントデータ群の終了位置にその小節の最終イベント
データとして挿入される。
【0040】更に、図7(c) のジャンプイベントデータ
と図7(d) のジャンプソースイベントデータは、図5
(c) の配列SNG_SONGにおいて、1つの小節内の
イベントデータ群が512イベントずつの2つのイベン
トデータブロックに分割される場合に、それぞれ、第1
番目のイベントデータブロックの末尾と第2番目のイベ
ントデータブロックの先頭に記憶される。この場合、ジ
ャンプイベントデータの第3ワードには配列SNG_S
ONG内でのジャンプ先のイベントデータの要素番号が
格納され、ジャンプソースイベントデータの第3ワード
には同じくジャンプ元のイベントデータの要素番号が格
納される。
【0041】なお、図7(a) 〜(d) に示される4種類の
イベントデータについて、イベントデータの編集処理及
び再生処理においては、第1ワードにより現在処理イベ
ントデータがジャンプイベントデータ群に属するイベン
トであることが認識された時点で、各々のイベントデー
タに対応した処理が即座に実行される。従って、これら
各イベントデータの第2ワードは任意の値でよい。ま
た、トラック終了イベントデータと小節終了イベントデ
ータの第3ワードも任意の値でよい。
【0042】以上説明した図4〜図7の楽曲データのデ
ータフォーマットが採用されることにより、自動演奏に
関する制御を非常に効率的に実行することが可能とな
る。この効果について、以下に説明する。
【0043】まず、イベントデータの再生処理時(楽曲
の自動演奏時)の動作について説明する。ユーザが図3
のシステム操作子群307を操作することにより再生開
始が指示されると、図3のCPU303は、RAM30
5に記憶されている再生される楽曲に対応する図4に示
されるトラック使用状況データSNG_TRK_USE
の内容を調べる。CPU303は、トラック使用状況デ
ータSNG_TRK_USEにおいて値1が設定されて
いるビットに対応するトラックの処理タイミングで、そ
のトラックのイベントデータを再生させるために、ま
ず、図5(a) に示される配列SNG_BAR_TBLを
探索する。この結果、CPU303は、現在再生中の小
節に対応する図5(b) に示される配列SNG_BAR_
PTR内のの要素番号を得る。次に、配列SNG_BA
R_PTR内の該当データの値が0xffffでなけれ
ば(全休符小節でなければ)、CPU303は、配列S
NG_BAR_PTRの該当データの値が指す要素番号
の配列SNG_SONG中のイベントデータを読み込
む。そして、その第2ワードに格納されている小節先頭
からのクロックの値が現在のクロックの値以下であれ
ば、CPU303は、そのイベントデータを再生するた
めに、そのイベントデータの第1ワードのデータに従っ
た演奏情報を、図3の演奏情報出力部306から出力さ
せる。以下、上述の一連の処理が繰り返し実行され、現
在小節の現在クロックに従ったイベントデータの再生処
理が実行される。
【0044】上述のイベントデータの再生処理におい
て、小節単位の早送り再生又は巻き戻し再生が実行され
る場合を考える。この動作を実現するためには、図5
(a) に示される配列SNG_BAR_TBL内の小節ブ
ロックに対する現在処理ポインタ値、又は図5(b) に示
される配列SNG_BAR_PTR内の小節に対する現
在処理ポインタ値をインクリメント又はデクリメントす
るだけでよい。この結果、非常に高速な1又は複数小節
単位の早送り再生又は巻き戻し再生を簡単な制御で実現
することができる。
【0045】次に、イベントデータの編集処理が実行さ
れる場合を考える。例えば小節単位の移動を行うために
は、図5(a) の配列SNG_BAR_TBL又は図5
(b) の配列SNG_BAR_PTRの配列データの要素
を入れ替えるのみでよい。この場合、図5(c) の配列S
NG_SONG内のイベントデータに記憶されているク
ロックデータは小節の先頭からのクロックであるため
(図6等参照)、時間データを編集し直す必要もない。
更に、例えば既存の小節に新たなイベントデータを追加
するためには、図5(c) の配列配列SNG_SONGの
末尾にイベントデータ群を追加し、ジャンプイベントデ
ータとジャンプソースイベントデータ(図7参照)を用
いて、そのイベントデータ群を所望の小節のイベントデ
ータ群に連結するだけでよい。その他、イベントデータ
の挿入、削除等も、簡単なデータ操作で実現できる。な
お、イベントデータの挿入処理は、本発明に特に関連す
る処理であり、これについては後述する。
【0046】このように、楽曲データが階層的に管理さ
れることにより、イベントデータの再生処理、編集処理
等の制御を簡単に実行することができる。ここで、上述
の楽曲データの階層構造が採用される場合におけるイベ
ントデータの編集処理において、例えば、小節内でイベ
ントデータの挿入が実行された場合、図5(c) の配列S
NG_SONG内の1つの小節内のイベントデータ群に
おいて、図7に示されるジャンプイベントデータ群以外
のイベントデータの第2ワードに設定されている小節の
先頭からのクロックの値の大小関係が逆転している状況
が発生することがある。例えば、所望の小節内の任意の
時間位置に新たなイベントデータが追加される場合、配
列SNG_SONGの末尾に、ジャンプソースイベント
データと、それに続いて、第2ワードに所望のクロック
値が設定された所望のイベントデータと、更にそれに続
いて、小節終了イベントデータが追加されると共に、上
記所望の小節の最終イベントの小節終了イベントデータ
が、第3ワードに上記ジャンプソースイベントデータの
要素番号が設定されたジャンプイベントデータに置き換
えられ、最後に、上記ジャンプソースイベントデータの
第3ワードに上記ジャンプイベントデータの要素番号が
設定される。この場合、上記挿入イベントデータは、上
記所望の小節内のイベントデータ群の最後に単純に追加
されただけであるため、その挿入イベントデータが上記
所望の小節内の他のイベントデータ群との間で正しい時
間関係を有するように、その挿入イベントデータを含む
上記所望の小節内のイベントデータ群が、各イベントデ
ータの第2ワードのクロック値に関して並び換えられる
(時間ソートされる)。この場合、その小節内のイベン
トデータ群に含まれ得る図7に示されるジャンプイベン
トデータ群は、適切に処理される。
【0047】このようなイベントデータの挿入処理にお
いて、和音等を表わすための、同一の発生タイミングに
位置する複数のイベントデータ群に、それらと同じ発生
タイミングを有する新たなシーケンスデータが挿入され
る場合には、「発明が解決しようとする課題」で説明し
たような各種の問題を考慮する必要がある。
【0048】そこで、本実施の形態においては、以下に
説明するような各種イベントデータの挿入処理が実行さ
れる。本実施の形態の全体動作 図8は、本実施の形態において図3のCPU303が実
行するメインフローを示す図である。このフローは、C
PU303が、RAM305とワークメモリとして使用
しながら、ROM304に記憶された制御プログラムを
実行する動作として実現される。
【0049】装置の電源がオンされると、ステップ80
1で、RAM305の記憶内容等がイニシャライズされ
た後、ステップ802のスイッチ処理とステップ803
のその他の処理が繰り返し実行される。ステップ802
のスイッチ処理では、システム操作子群307の各スイ
ッチが操作されたか否かが判定され、それぞれのスイッ
チ操作に対応する処理が実行される。ステップ803の
その他の処理では、演奏情報入力部301からの演奏情
報の取り込みの処理や、楽曲データの再生処理等が実行
される。
【0050】図9は、図8のステップ802のスイッチ
処理を示す動作フローチャートである。まず、ステップ
901で、システム操作子群307の図1に示されるス
イッチ103がオンされたか否かが判定される。
【0051】この判定がYESの場合は、ステップ90
2で、ノートイベント挿入処理が実行される。ステップ
901の判定がNOの場合は、ステップ903で、シス
テム操作子群307の図1に示されるスイッチ104が
オンされたか否かが判定される。
【0052】この判定がYESの場合は、ステップ90
4で、プログラムチェンジイベント挿入処理が実行され
る。ステップ903の判定がNOの場合、又はステップ
902若しくは904の処理の後に、ステップ905
で、その他のスイッチ処理が実行される。ここでは、挿
入されるイベントの選択処理や、カーソルスイッチの操
作に対応する家庭用テレビ102の表示画面上でのカー
ソルの移動処理、ノートイベント挿入処理及びプログラ
ムチェンジイベント挿入処理以外のイベントデータの編
集処理のためのスイッチ操作に対応する処理等が実行さ
れる。ノートイベント挿入処理 図10は、図9のステップ902のノートイベント挿入
処理の動作フローチャートである。
【0053】この処理においては、本発明に特に関連す
る特徴として、和音の構成音等のように、第2ワードの
値(小節の先頭からのクロック値)が同一であるノート
イベントデータ群と同じ第2ワードの値を有するノート
イベントデータが挿入される場合には、それらのノート
イベントデータがそれぞれのピッチの高低に従って記憶
されるようにソートされる。
【0054】まず、図10の動作フローチャートの詳細
について説明する前に、上記ソート処理を実現するため
の概略動作について以下に説明する。今、RAM305
に記憶されている図5の配列SNG_SONG内の各小
節内のイベントデータは、ジャンプイベントデータ及び
ジャンプソースイベントデータ群(図7参照)を除い
て、第2ワードの値、即ち小節の先頭からのクロック値
が小さい順に記憶されている。
【0055】この状態において、対象となる小節の末尾
に新たなノートイベントデータが挿入される。次に、そ
の小節内において、挿入ノートイベントデータと同じ第
2ワードの値を有し、挿入ノートイベントデータの第1
ワードの上位7ビットに記憶されている音高番号(図6
(a) 参照)より高い音高番号を有するノートイベントデ
ータのうち、配列SNG_SONG内での要素番号が最
も若いものが検索される。
【0056】次に、小節の末尾に挿入された挿入ノート
イベントデータの第2ワードの値が+1される。また、
検索されたノートイベントデータからその小節の末尾に
挿入された挿入ノートイベントデータの1つ前のイベン
トデータまでの各イベントデータの第2ワードの値が+
2される。ここで、これらの各イベントデータの第2ワ
ードの元々の値は、挿入ノートイベントデータの第2ワ
ードの値と同じであるかそれよりも大きい値である。従
って、これら各イベントデータの第2ワードの値が+2
され、一方、挿入ノートイベントデータの第2ワードの
値が+1されることにより、この挿入ノートイベントデ
ータの第2ワードの値は、上記各イベントデータの第2
ワードの値よりも必ず小さくなる。
【0057】その後、検索されたノートイベントデータ
からその小節の末尾に挿入された挿入ノートイベントデ
ータまでの各イベントデータを、それぞれの第2ワード
の値が小さい順に並び替えるための、バブルソート処理
(時間ソート処理)が実行される。
【0058】この時間ソート処理の結果、挿入ノートイ
ベントデータは、ソート範囲の先頭に並び替えられる。
その後、挿入ノートイベントデータの第2ワードの値が
−1されて元の第2ワードの値に戻され、また、挿入ノ
ートイベントデータの次のイベントデータから小節の末
尾のイベントデータまでの各イベントデータの第2ワー
ドの値が−2されて元の各第2ワードの値に戻される。
【0059】上述の動作を実現するための図10の動作
フローチャートの詳細について、以下に説明する。ま
ず、ステップ1001で、所望の小節(以下、挿入対象
小節という)の末尾に新たなノートイベントデータが挿
入される。具体的には、まず、RAM305上の配列S
NG_SONG(図5参照)の末尾に、ジャンプソース
イベントデータが追加される。それに続き、第1ワード
に所望の音高番号とベロシティ(図6(a) 参照)が設定
され、第2ワードに所望のクロック値が設定された所望
のノートイベントデータが追加される。更に続いて、小
節終了イベントデータが追加される。次に、挿入対象小
節の最終イベントの元々記憶されている小節終了イベン
トデータが、第3ワードに上記ジャンプソースイベント
データの要素番号が設定されたジャンプイベントデータ
に置き換えられる。この元々記憶されている小節終了イ
ベントデータは、まず、RAM305内の配列SNG_
BAR_TBL及び配列SNG_BAR_PTRが参照
されることによって配列SNG_SONG内での挿入対
象小節の先頭要素番号が参照され、その先頭要素番号か
ら要素番号が順次インクリメントされながら各要素番号
のイベントデータの第1ワードの値が0xff11(図
7(b) 参照)であるか否かが判定されることによって、
検索される。最後に、上記追加されたジャンプソースイ
ベントデータの第3ワードに上記元々の小節終了イベン
トデータから置き換えられたジャンプイベントデータの
要素番号が設定される。
【0060】次に、ステップ1002で、挿入対象小節
内に、挿入ノートイベントデータの第2ワードの値と同
じ値を第2ワードに有するイベントデータが存在するか
否かが検索される。具体的には、RAM305内の配列
SNG_BAR_TBL及び配列SNG_BAR_PT
Rが参照されることによって配列SNG_SONG内で
の挿入対象小節の先頭要素番号が参照され、その先頭要
素番号から要素番号が順次インクリメントされながら、
小節終了イベントデータ(図7(b) 参照)が現れるま
で、各要素番号のイベントデータの第2ワードの値が挿
入ノートイベントデータの第2ワードの値と比較され
る。
【0061】ステップ1002の判定がNOの場合は、
ステップ1021で、挿入対象小節内のイベントデータ
群に対し、通常の時間ソート処理が実行される。即ち、
挿入ノートイベントデータは、挿入対象小節内のイベン
トデータ群の最後に単純に追加されただけであるため、
その挿入ノートイベントデータが挿入対象小節内の他の
イベントデータ群との間で正しい時間関係を有するよう
に、その挿入ノートイベントデータを含む挿入対象小節
内のイベントデータ群が、各イベントデータの第2ワー
ドのクロック値に関して並び換えられる。この場合、そ
の小節内のイベントデータ群に含まれ得る図7に示され
るジャンプイベントデータ群は適切に処理される。この
時間ソート処理については、後述する(図13以降を参
照)。
【0062】ステップ1021の処理の後、図9のステ
ップ902のノートイベント挿入処理を終了する。ステ
ップ1002の判定がYESの場合には、ステップ10
03で、挿入対象小節内に、挿入ノートイベントデータ
の第2ワードの値と同じ値を第2ワードに有し、かつ大
きな音高番号を有する(ピッチが高い)ノートイベント
データが存在するか否かが検索される。具体的には、R
AM305内の配列SNG_SONG内で、ステップ1
002で検索された要素番号から順に、第2ワードの値
が挿入ノートイベントデータの第2ワードの値と等し
く、かつ第1ワードの上位7ビット(図6(a) 参照)に
記憶されている音高番号が挿入ノートイベントデータの
音高番号よりも大きいノートイベントデータが検索され
る。
【0063】ステップ1003の判定がNOの場合は、
挿入対象小節内のイベントデータ群に対し、前述したス
テップ1021の時間ソート処理が実行され、その後、
図9のステップ902のノートイベント挿入処理を終了
する。
【0064】ステップ1003の判定YESの場合に
は、ステップ1004で、 current_element 値(CP
U303内又はRAM305に確保される特には図示し
ないレジスタの値)が、ステップ1003で検索された
イベントデータ(目的イベントデータ)の配列SNG_
SONG内での要素番号にセットされる。
【0065】その後、ステップ1005〜1011で
は、上述の current_element 値が順次インクリメント
されながら、前述したように、上記目的イベントデータ
からその小節の末尾に挿入された挿入ノートイベントデ
ータの1つ前のイベントデータまでの各イベントデータ
の第2ワードの値が+2されると共に、上記挿入ノート
イベントデータの第2ワードの値が+1される。
【0066】即ち、まず、ステップ1005では、配列
SNG_SONG内で、 current_element 値に対応す
る要素番号のイベントデータ(現在イベントデータ)の
種類が判定される(図6及び図7参照)。
【0067】ステップ1005で、現在イベントデータ
の種類が、ジャンプイベントデータ、ジャンプソースイ
ベントデータ、及び挿入ノートイベントデータ以外のイ
ベントデータであると判定された場合には、まず、ステ
ップ1006で、配列SNG_SONG内の上記現在イ
ベントデータの第2ワードの値が+2される。次に、ス
テップ1007で、 current_element 値が+1され
る。その後、ステップ1005の処理に戻る。
【0068】ステップ1005で、現在イベントデータ
の種類が、ジャンプイベントデータであると判定された
場合には、ステップ1008で、上記現在イベントデー
タの第3ワードに記憶されている、配列SNG_SON
G内でのジャンプ先のイベントデータの要素番号(図7
(c) 参照)が、 current_element 値としてセットされ
る。その後、ステップ1005の処理に戻る。
【0069】ステップ1005で、現在イベントデータ
の種類が、ジャンプソースイベントデータであると判定
された場合には、そのジャンプソースイベントデータは
無視され、ステップ1009で、 current_element 値
が+1される。その後、ステップ1005の処理に戻
る。
【0070】ステップ1005で、現在イベントデータ
の種類が、挿入ノートイベントデータであると判定され
た場合には、まず、ステップ1010で、配列SNG_
SONG内の上記挿入ノートイベントデータの第2ワー
ドの値が+1される。次に、ステップ1011で、 cur
rent_element 値が+1される。その後、ステップ10
05の処理に戻る。
【0071】ステップ1005で、現在イベントデータ
の種類が、小節終了イベントデータ又はトラック終了イ
ベントデータであると判定された場合には、ステップ1
005〜1011のループ処理を終了し、ステップ10
12の処理に移る。
【0072】ステップ1012では、目的イベントデー
タからその小節の末尾に挿入された挿入ノートイベント
データまでの各イベントデータを、それぞれの第2ワー
ドの値が小さい順に並び替えるための、バブルソート処
理(時間ソート処理)が実行される。この時間ソート処
理については、後述する(図13以降を参照)。この時
間ソート処理の結果、前述したように、挿入ノートイベ
ントデータは、ソート範囲の先頭に並び替えられる。
【0073】次に、ステップ1013では、ステップ1
012での時間ソート処理後の挿入ノートイベントデー
タの配列SNG_SONG内における要素番号が、 cur
rent_element 値としてセットされる。この要素番号
は、後述するように、時間ソート処理において特には図
示しないレジスタにセットされる。
【0074】そして、まず、ステップ1014では、配
列SNG_SONG内で、 current_element 値に対応
する要素番号の挿入ノートイベントデータの第2ワード
の値が−1されて、元の第2ワードの値に戻される。次
に、ステップ1015において、 current_element 値
が+1される。
【0075】続いて、ステップ1016〜1020で
は、上述の current_element 値が順次インクリメント
されながら、前述したように、挿入ノートイベントデー
タの次のイベントデータから小節の末尾のイベントデー
タまでの各イベントデータの第2ワードの値が−2され
て元の各第2ワードの値に戻される。
【0076】即ち、まず、ステップ1016では、ステ
ップ1005の場合と同様にして、配列SNG_SON
G内で、 current_element 値に対応する要素番号のイ
ベントデータ(現在イベントデータ)の種類が判定され
る。
【0077】ステップ1016で、現在イベントデータ
の種類が、ジャンプイベントデータ及びジャンプソース
イベントデータ以外のイベントデータであると判定され
た場合には、まず、ステップ1017で、配列SNG_
SONG内の上記現在イベントデータの第2ワードの値
が−2される。次に、ステップ1018で、 current_
element 値が+1される。その後、ステップ1016の
処理に戻る。
【0078】ステップ1016で、現在イベントデータ
の種類が、ジャンプイベントデータであると判定された
場合には、ステップ1019で、上記現在イベントデー
タの第3ワードに記憶されている、配列SNG_SON
G内でのジャンプ先のイベントデータの要素番号(図7
(c) 参照)が、 current_element 値としてセットされ
る。その後、ステップ1016の処理に戻る。
【0079】ステップ1016で、現在イベントデータ
の種類が、ジャンプソースイベントデータであると判定
された場合には、そのジャンプソースイベントデータは
無視され、ステップ1020で、 current_element 値
が+1される。その後、ステップ1016の処理に戻
る。
【0080】ステップ1016で、現在イベントデータ
の種類が、小節終了イベントデータ又はトラック終了イ
ベントデータであると判定された場合には、ステップ1
016〜1020のループ処理を終了し、図9のステッ
プ902のノートイベント挿入処理を終了する。プログラムチェンジイベント挿入処理(その1) 図11は、図9のステップ904のプログラムチェンジ
イベント挿入処理のその1の動作フローチャートであ
る。
【0081】この処理においては、本発明に特に関連す
る特徴として、和音の構成音等のように、第2ワードの
値(小節の先頭からのクロック値)が同一であるノート
イベントデータ群と同じ第2ワードの値を有するプログ
ラムチェンジイベントデータが挿入される場合には、プ
ログラムチェンジイベントデータがノートイベントデー
タ群の手前に記憶されるようにソートされる。
【0082】まず、図11の動作フローチャートの詳細
について説明する前に、上記ソート処理を実現するため
の概略動作について以下に説明する。今、RAM305
に記憶されている図5の配列SNG_SONG内の各小
節内のイベントデータは、ジャンプイベントデータ及び
ジャンプソースイベントデータ群(図7参照)を除い
て、第2ワードの値、即ち小節の先頭からのクロック値
が小さい順に記憶されている。
【0083】この状態において、対象となる小節の末尾
に新たなプログラムチェンジイベントデータが挿入され
る。次に、その小節内において、挿入プログラムチェン
イベントデータと同じ第2ワードの値を有するノート
イベントデータのうち、配列SNG_SONG内での要
素番号が最も若いものが検索される。
【0084】次に、小節の末尾に挿入された挿入プログ
ラムチェンジイベントデータの第2ワードの値が+1さ
れる。また、検索されたノートイベントデータからその
小節の末尾に挿入された挿入プログラムチェンジイベン
トデータの1つ前のイベントデータまでの各イベントデ
ータの第2ワードの値が+2される。ここで、これらの
各イベントデータの第2ワードの元々の値は、挿入プロ
グラムチェンジイベントデータの第2ワードの値と同じ
であるかそれよりも大きい値である。従って、これら各
イベントデータの第2ワードの値が+2され、一方、挿
入プログラムチェンジイベントデータの第2ワードの値
が+1されることにより、この挿入プログラムチェンジ
イベントデータの第2ワードの値は、上記各イベントデ
ータの第2ワードの値よりも必ず小さくなる。
【0085】その後に、検索されたノートイベントデー
タからその小節の末尾に挿入された挿入プログラムチェ
ンジイベントデータまでの各イベントデータを、それぞ
れの第2ワードの値が小さい順に並び替えるための、コ
ムソート処理(時間ソート処理)が実行される。
【0086】この時間ソート処理の結果、挿入プログラ
ムチェンジイベントデータは、ソート範囲の先頭に並び
替えられる。その後、挿入プログラムチェンジイベント
データの第2ワードの値が−1されて元の第2ワードの
値に戻され、また、挿入プログラムチェンジイベントデ
ータの次のイベントデータから小節の末尾のイベントデ
ータまでの各イベントデータの第2ワードの値が−2さ
れて元の各第2ワードの値に戻される。
【0087】上述の動作を実現するための図11の動作
フローチャートの詳細について、以下に説明する。ま
ず、ステップ1101で、所望の小節(以下、挿入対象
小節という)の末尾に新たなプログラムチェンジイベン
トデータが挿入される。具体的には、まず、RAM30
5上の配列SNG_SONG(図5参照)の末尾に、ジ
ャンプソースイベントデータが追加される。それに続
き、第2ワードに所望のクロック値が設定された所望の
プログラムチェンジイベントデータが追加される。更に
続いて、小節終了イベントデータが追加される。次に、
挿入対象小節の最終イベントの元々記憶されている小節
終了イベントデータが、第3ワードに上記ジャンプソー
スイベントデータの要素番号が設定されたジャンプイベ
ントデータに置き換えられる。この元々記憶されている
小節終了イベントデータは、まず、RAM305内の配
列SNG_BAR_TBL及び配列SNG_BAR_P
TRが参照されることにより配列SNG_SONG内で
の挿入対象小節の先頭要素番号が参照され、その先頭要
素番号から要素番号が順次インクリメントされながら各
要素番号のイベントデータの第1ワードの値が0xff
11(図7(b) 参照)であるか否かが判定されることに
よって、検索される。最後に、上記追加されたジャンプ
ソースイベントデータの第3ワードに上記元々の小節終
了イベントデータから置き換えられたジャンプイベント
データの要素番号が設定される。
【0088】次に、ステップ1102で、挿入対象小節
内に、挿入プログラムチェンジイベントデータの第2ワ
ードの値と同じ値を第2ワードに有するノートイベント
データが存在するか否かが検索される。具体的には、R
AM305内の配列SNG_BAR_TBL及び配列S
NG_BAR_PTRが参照されることにより配列SN
G_SONG内での挿入対象小節の先頭要素番号が参照
され、その先頭要素番号から要素番号が順次インクリメ
ントされながら、小節終了イベントデータ(図7(b) 参
照)が現れるまで、ノートイベントデータに対応する要
素番号の第2ワードの値が挿入プログラムチェンジイベ
ントデータの第2ワードの値と比較される。
【0089】ステップ1102の判定がNOの場合は、
ステップ1120で、挿入対象小節内のイベントデータ
群に対し、通常の時間ソート処理が実行される。即ち、
挿入プログラムチェンジイベントデータは、挿入対象小
節内のイベントデータ群の最後に単純に追加されただけ
であるため、その挿入プログラムチェンジイベントデー
タが挿入対象小節内の他のイベントデータ群との間で正
しい時間関係を有するように、その挿入プログラムチェ
ンジイベントデータを含む挿入対象小節内のイベントデ
ータ群が、各イベントデータの第2ワードのクロック値
に関して並び換えられる。この場合、その小節内のイベ
ントデータ群に含まれ得る図7に示されるジャンプイベ
ントデータ群は適切に処理される。この時間ソート処理
については、後述する(図13以降を参照)。
【0090】ステップ1120の処理の後、図9のステ
ップ904のプログラムチェンジイベント挿入処理を終
了する。ステップ1102の判定がYESの場合には、
ステップ1103で、 current_element 値(CPU3
03内又はRAM305に確保される特には図示しない
レジスタの値)が、ステップ1102で検索されたイベ
ントデータ(目的イベントデータ)の配列SNG_SO
NG内での要素番号にセットされる。
【0091】その後、ステップ1104〜1110で
は、上述の current_element 値が順次インクリメント
されながら、前述したように、上記目的イベントデータ
からその小節の末尾に挿入された挿入プログラムチェン
ジイベントデータの1つ前のイベントデータまでの各イ
ベントデータの第2ワードの値が+2されると共に、上
記挿入プログラムチェンジイベントデータの第2ワード
の値が+1される。
【0092】即ち、まず、ステップ1104では、配列
SNG_SONG内で、 current_element 値に対応す
る要素番号のイベントデータ(現在イベントデータ)の
種類が判定される(図6及び図7参照)。
【0093】ステップ1104で、現在イベントデータ
の種類が、ジャンプイベントデータ、ジャンプソースイ
ベントデータ、及び挿入プログラムチェンジイベントデ
ータ以外のイベントデータであると判定された場合は、
まず、ステップ1105で、配列SNG_SONG内の
上記現在イベントデータの第2ワードの値が+2され
る。次に、ステップ1106で、 current_element 値
が+1される。その後、ステップ1104の処理に戻
る。
【0094】ステップ1104で、現在イベントデータ
の種類が、ジャンプイベントデータであると判定された
場合には、ステップ1107で、上記現在イベントデー
タの第3ワードに記憶されている、配列SNG_SON
G内でのジャンプ先のイベントデータの要素番号(図7
(c) 参照)が、 current_element 値としてセットされ
る。その後、ステップ1104の処理に戻る。
【0095】ステップ1104で、現在イベントデータ
の種類が、ジャンプソースイベントデータであると判定
された場合には、そのジャンプソースイベントデータは
無視され、ステップ1108で、 current_element 値
が+1される。その後、ステップ1104の処理に戻
る。
【0096】ステップ1104で、現在イベントデータ
の種類が、挿入プログラムチェンジイベントデータであ
ると判定された場合には、まず、ステップ1109で、
配列SNG_SONG内の上記挿入プログラムチェンジ
イベントデータの第2ワードの値が+1される。次に、
ステップ1110で、 current_element 値が+1され
る。その後、ステップ1104の処理に戻る。
【0097】ステップ1104で、現在イベントデータ
の種類が、小節終了イベントデータ又はトラック終了イ
ベントデータであると判定された場合には、ステップ1
104〜1110のループ処理を終了し、ステップ11
11の処理に移る。
【0098】ステップ1111では、目的イベントデー
タからその小節の末尾に挿入された挿入プログラムチェ
ンジイベントデータまでの各イベントデータを、それぞ
れの第2ワードの値が小さい順に並び替えるための、コ
ムソート処理(時間ソート処理)が実行される。この時
間ソート処理については、後述する(図13以降を参
照)。この時間ソート処理の結果、前述したように、挿
入プログラムチェンジイベントデータは、ソート範囲の
先頭(元々の第2ワードの値が同一であるノートイベン
トデータ群よりも手前)に並び替えられる。
【0099】次に、ステップ1112では、ステップ1
111での時間ソート処理後の挿入プログラムチェンジ
イベントデータの配列SNG_SONG内における要素
番号が、 current_element 値としてセットされる。こ
の要素番号は、後述するように、時間ソート処理におい
て特には図示しないレジスタにセットされる。
【0100】そして、まず、ステップ1113では、配
列SNG_SONG内で、 current_element 値に対応
する要素番号の挿入プログラムチェンジイベントデータ
の第2ワードの値が−1されて、元の第2ワードの値に
戻される。次に、ステップ1114において、 current
_element 値が+1される。
【0101】続いて、ステップ1115〜1119で
は、上述の current_element 値が順次インクリメント
されながら、前述したように、挿入プログラムチェンジ
イベントデータの次のイベントデータから小節の末尾の
イベントデータまでの各イベントデータの第2ワードの
値が−2されて元の各第2ワードの値に戻される。
【0102】即ち、まず、ステップ1115では、ステ
ップ1104の場合と同様にして、配列SNG_SON
G内で、 current_element 値に対応する要素番号のイ
ベントデータ(現在イベントデータ)の種類が判定され
る。
【0103】ステップ1115で、現在イベントデータ
の種類が、ジャンプイベントデータ及びジャンプソース
イベントデータ以外のイベントデータであると判定され
た場合には、まず、ステップ1116で、配列SNG_
SONG内の上記現在イベントデータの第2ワードの値
が−2される。次に、ステップ1117で、 current_
element 値が+1される。その後、ステップ1115の
処理に戻る。
【0104】ステップ1115で、現在イベントデータ
の種類が、ジャンプイベントデータであると判定された
場合には、ステップ1118で、上記現在イベントデー
タの第3ワードに記憶されている、配列SNG_SON
G内でのジャンプ先のイベントデータの要素番号(図7
(c) 参照)が、 current_element 値としてセットされ
る。その後、ステップ1115の処理に戻る。
【0105】ステップ1115で、現在イベントデータ
の種類が、ジャンプソースイベントデータであると判定
された場合には、そのジャンプソースイベントデータは
無視され、ステップ1119で、 current_element 値
が+1される。その後、ステップ1115の処理に戻
る。
【0106】ステップ1115で、現在イベントデータ
の種類が、小節終了イベントデータ又はトラック終了イ
ベントデータであると判定された場合には、ステップ1
115〜1119のループ処理を終了し、図9のステッ
プ904のプログラムチェンジイベント挿入処理を終了
する。プログラムチェンジイベント挿入処理(その2) 図12は、図9のステップ904のプログラムチェンジ
イベント挿入処理のその2の動作フローチャートであ
る。
【0107】この処理においては、本発明に特に関連す
る特徴として、和音の構成音等のように、第2ワードの
値(小節の先頭からのクロック値)が同一であるノート
イベントデータ群と同じ第2ワードの値を有するプログ
ラムチェンジイベントデータが挿入される場合であっ
て、コムソートアルゴリズムに基づく時間ソート処理が
実行された場合に、プログラムチェンジイベントデータ
がノートイベントデータ群の手前に記憶されるようにソ
ートされ、かつ、挿入処理前と挿入処理後とで、挿入さ
れるプログラムチェンジイベントデータを除く他の同じ
タイミングのノートイベントデータ群の記憶順が変更さ
れないようにソートされる。
【0108】まず、図12の動作フローチャートの詳細
について説明する前に、上記ソート処理を実現するため
の概略動作について以下に説明する。今、RAM305
に記憶されている図5の配列SNG_SONG内の各小
節内のイベントデータは、ジャンプイベントデータ及び
ジャンプソースイベントデータ群(図7参照)を除い
て、第2ワードの値、即ち小節の先頭からのクロック値
が小さい順に記憶されている。
【0109】この状態において、対象となる小節の末尾
に新たなプログラムチェンジイベントデータが挿入され
る。次に、その小節内において、挿入プログラムチェン
イベントデータと同じ第2ワードの値を有するノート
イベントデータのうち、配列SNG_SONG内での要
素番号が最も若いものが検索される。
【0110】次に、検索されたノートイベントデータか
らその小節の末尾に挿入された挿入プログラムチェンジ
イベントデータの1つ前のイベントデータまでの各イベ
ントデータの第2ワードに、それぞれ+1ずつ増加する
カウンタ値が加算される。ここで、これらの各イベント
データの第2ワードの元々の値は、挿入プログラムチェ
ンジイベントデータの第2ワードの値と同じであるかそ
れよりも大きい値である。従って、上述の加算処理によ
り、この挿入プログラムチェンジイベントデータの第2
ワードの値は、上記各イベントデータの第2ワードの値
よりも必ず小さくなると共に、上記範囲における現在の
各イベントデータの第2ワードの値は、その並び順に応
じて大きくなる。
【0111】この状態で、検索されたノートイベントデ
ータからその小節の末尾に挿入された挿入プログラムチ
ェンジイベントデータまでの各イベントデータを、それ
ぞれの第2ワードの値が小さい順に並び替えるための、
コムソート処理(時間ソート処理)が実行される。
【0112】この時間ソート処理の結果、挿入プログラ
ムチェンジイベントデータは、ソート範囲の先頭に並び
替えられると共に、その後に、元の並び順と同じ並び順
のイベントデータが配置される。その後、挿入プログラ
ムチェンジイベントデータの次のイベントデータから小
節の末尾のイベントデータまでの各イベントデータの第
2ワードから、それぞれ+1ずつ増加するカウンタ値が
減算されることによって、上記各イベントデータの第2
ワードの値が、元の各第2ワードの値に戻される。
【0113】上述の動作を実現するための図12の動作
フローチャートの詳細について、以下に説明する。ま
ず、ステップ1201で、所望の小節(以下、挿入対象
小節という)の末尾に新たなプログラムチェンジイベン
トデータが挿入される。具体的には、まず、RAM30
5上の配列SNG_SONG(図5参照)の末尾に、ジ
ャンプソースイベントデータが追加される。それに続
き、第2ワードに所望のクロック値が設定された所望の
プログラムチェンジイベントデータが追加される。更に
続いて、小節終了イベントデータが追加される。次に、
挿入対象小節の最終イベントの元々記憶されている小節
終了イベントデータが、第3ワードに上記ジャンプソー
スイベントデータの要素番号が設定されたジャンプイベ
ントデータに置き換えられる。この元々記憶されている
小節終了イベントデータは、まず、RAM305内の配
列SNG_BAR_TBL及び配列SNG_BAR_P
TRが参照されることにより配列SNG_SONG内で
の挿入対象小節の先頭要素番号が参照され、その先頭要
素番号から要素番号が順次インクリメントされながら各
要素番号のイベントデータの第1ワードの値が0xff
11(図7(b) 参照)であるか否かが判定されることに
よって、検索される。最後に、上記追加されたジャンプ
ソースイベントデータの第3ワードに上記元々の小節終
了イベントデータから置き換えられたジャンプイベント
データの要素番号が設定される。
【0114】次に、ステップ1202で、挿入対象小節
内に、挿入プログラムチェンジイベントデータの第2ワ
ードの値と同じ値を第2ワードに有するノートイベント
データが存在するか否かが検索される。具体的には、R
AM305内の配列SNG_BAR_TBL及び配列S
NG_BAR_PTRが参照されることにより配列SN
G_SONG内での挿入対象小節の先頭要素番号が参照
され、その先頭要素番号から要素番号が順次インクリメ
ントされながら、小節終了イベントデータ(図7(b) 参
照)が現れるまで、ノートイベントデータに対応する要
素番号の第2ワードの値が挿入プログラムチェンジイベ
ントデータの第2ワードの値と比較される。
【0115】ステップ1202の判定がNOの場合は、
ステップ1221で、挿入対象小節内のイベントデータ
群に対し、通常の時間ソート処理が実行される。この時
間ソート処理については、後述する(図13以降を参
照)。
【0116】ステップ1221の処理の後、図9のステ
ップ904のプログラムチェンジイベント挿入処理を終
了する。ステップ1202の判定がYESの場合には、
ステップ1203で、 current_element 値(CPU3
03内又はRAM305に確保される特には図示しない
レジスタの値)が、ステップ1202で検索されたイベ
ントデータ(目的イベントデータ)の配列SNG_SO
NG内での要素番号にセットされる。
【0117】続いて、counter 値(CPU303内又は
RAM305に確保される特には図示しないレジスタの
値)が、初期値1にセットされる。その後、ステップ1
205〜1210では、上述の current_element 値が
順次インクリメントされながら、前述したように、上記
目的イベントデータからその小節の末尾に挿入された挿
入プログラムチェンジイベントデータの1つ前のイベン
トデータまでの各イベントデータの第2ワードに、それ
ぞれ+1ずつ増加するカウンタ値であるcounter 値が加
算される。
【0118】即ち、まず、ステップ1205では、配列
SNG_SONG内で、 current_element 値に対応す
る要素番号のイベントデータ(現在イベントデータ)の
種類が判定される(図6及び図7参照)。
【0119】ステップ1205で、現在イベントデータ
の種類が、ジャンプイベントデータ、ジャンプソースイ
ベントデータ、及び挿入プログラムチェンジイベントデ
ータ以外のイベントデータであると判定された場合は、
まず、ステップ1206で、配列SNG_SONG内の
上記現在イベントデータの第2ワードに、counter 値が
加算される。次に、ステップ1207において、 curre
nt_element 値が+1される。更に、ステップ1208
において、counter 値が+1される。その後、ステップ
1205の処理に戻る。
【0120】ステップ1205で、現在イベントデータ
の種類が、ジャンプイベントデータであると判定された
場合には、ステップ1209で、上記現在イベントデー
タの第3ワードに記憶されている、配列SNG_SON
G内でのジャンプ先のイベントデータの要素番号(図7
(c) 参照)が、 current_element 値としてセットされ
る。その後、ステップ1205の処理に戻る。
【0121】ステップ1205で、現在イベントデータ
の種類が、ジャンプソースイベントデータ又は挿入プロ
グラムチェンジイベントデータであると判定された場合
は、それらのイベントデータは無視され、ステップ12
10で、 current_element値が+1される。その後、
ステップ1205の処理に戻る。
【0122】ステップ1205で、現在イベントデータ
の種類が、小節終了イベントデータ又はトラック終了イ
ベントデータであると判定された場合には、ステップ1
205〜1210のループ処理を終了し、ステップ12
11の処理に移る。
【0123】ステップ1211では、目的イベントデー
タからその小節の末尾に挿入された挿入プログラムチェ
ンジイベントデータまでの各イベントデータを、それぞ
れの第2ワードの値が小さい順に並び替えるための、コ
ムソート処理(時間ソート処理)が実行される。この時
間ソート処理については、後述する(図13以降を参
照)。この時間ソート処理の結果、前述したように、挿
入プログラムチェンジイベントデータは、ソート範囲の
先頭(元々の第2ワードの値が同一であるノートイベン
トデータ群よりも手前)に並び替えられると共に、その
ソート範囲における他のイベントデータ群の元の並びが
保存される。
【0124】次に、ステップ1212では、ステップ1
211での時間ソート処理後の挿入プログラムチェンジ
イベントデータの配列SNG_SONG内における要素
番号が、 current_element 値としてセットされる。こ
の要素番号は、後述するように、時間ソート処理におい
て特には図示しないレジスタにセットされる。
【0125】続いて、ステップ1213では、counter
値が1に初期設定される。また、ステップ1214で
は、 current_element 値が+1されて、挿入プログラ
ムチェンジイベントデータがスキップされる。
【0126】続いて、ステップ1215〜1220にお
いては、上述の current_element値が順次インクリメ
ントされながら、前述したように、挿入プログラムチェ
ンジイベントデータの次のイベントデータから小節の末
尾のイベントデータまでの各イベントデータの第2ワー
ドから、それぞれ+1ずつ増加するカウンタ値であるco
unter 値が減算されることによって、上記各イベントデ
ータの第2ワードの値が、元の各第2ワードの値に戻さ
れる。
【0127】即ち、まず、ステップ1215では、ステ
ップ1205の場合と同様にして、配列SNG_SON
G内で、 current_element 値に対応する要素番号のイ
ベントデータ(現在イベントデータ)の種類が判定され
る。
【0128】ステップ1215で、現在イベントデータ
の種類が、ジャンプイベントデータ及びジャンプソース
イベントデータ以外のイベントデータであると判定され
た場合は、まず、ステップ1216で、配列SNG_S
ONG内の上記現在イベントデータの第2ワードから
counter 値が減算される。次に、ステップ1217にお
いて、 current_element 値が+1される。更に、ステ
ップ1218において、counter 値が+1される。その
後、ステップ1215の処理に戻る。
【0129】ステップ1215で、現在イベントデータ
の種類が、ジャンプイベントデータであると判定された
場合には、ステップ1219で、上記現在イベントデー
タの第3ワードに記憶されている、配列SNG_SON
G内でのジャンプ先のイベントデータの要素番号(図7
(c) 参照)が、 current_element 値としてセットされ
る。その後、ステップ1215の処理に戻る。
【0130】ステップ1215で、現在イベントデータ
の種類が、ジャンプソースイベントデータであると判定
された場合は、そのイベントデータは無視され、ステッ
プ1220で、 current_element 値が+1される。そ
の後、ステップ1215の処理に戻る。
【0131】ステップ1215で、現在イベントデータ
の種類が、小節終了イベントデータ又はトラック終了イ
ベントデータであると判定された場合には、ステップ1
215〜1220のループ処理を終了し、図9のステッ
プ904のプログラムチェンジイベント挿入処理を終了
する。時間ソート処理 次に、図10に示されるノートイベント挿入処理のステ
ップ1012及び1021、図11に示されるプログラ
ムチェンジイベント挿入処理(その1)のステップ11
11及び1120、並びに、図12に示されるプログラ
ムチェンジイベント挿入処理(その2)のステップ12
11及び1221として実行される時間ソート処理につ
いて説明する。
【0132】これらの時間ソート処理においては、RA
M305内の配列SNG_SONG上で、挿入対象とな
る小節の先頭又は前述した目的イベントデータからその
小節の末尾までのイベントデータについて、各イベント
データの第2ワードの値が小さい順に並ぶように、ソー
ト処理が実行される。この場合、1つの小節内には1組
以上のジャンプイベントデータとジャンプソースイベン
トデータの組が含まれ得るため、これらをまたいでソー
ト処理が適切に実行される必要がある。
【0133】以下に、小節内のイベントデータ群の時間
ソート処理の詳細を説明する。図13は、時間ソート処
理の全体動作フローチャートである。まず、時間ソート
処理終了フラグ(CPU303内のレジスタ又はRAM
305に確保される)は、その値が0であるときに時間
ソート処理が終了していないことを示し、その値が1で
あるときに時間ソート処理が終了したことを示す。
【0134】始めに、ステップ1301において、時間
ソート処理終了フラグの値が0にセットされる。次に、
ステップ1302で時間ソート処理終了フラグの値が0
であると判定される間、ステップ1303〜1305の
一連の処理が繰り返し実行される。
【0135】ステップ1303では時間ソート処理終了
フラグの値が1にセットされる。ステップ1304で
は、配列SNG_SONGに記憶されている時間ソート
処理の対象とされるイベントデータ群に含まれ、ジャン
プイベントデータ及びジャンプソースイベントデータに
よって区切られる全てのイベントデータのグループ(以
下、イベントデータフラグメント又は単にフラグメント
と呼ぶ)のそれぞれの内部において閉じた時間ソート処
理であるフラグメント内ソート処理が実行される。
【0136】続いて、ステップ1305では、配列SN
G_SONGに記憶されている上記時間ソート処理の対
象とされるイベントデータ群が含まれる隣接するフラグ
メント同士で、それらの接続部に位置するイベントデー
タ(ジャンプイベントデータの直前に位置するイベント
データとそのジャンプイベントデータに対応するジャン
プソースイベントデータの直後に位置するイベントデー
タ)についての時間ソート処理であるフラグメント間ソ
ート処理が実行される。
【0137】そして、上述のステップ1304のフラグ
メント内ソート処理とステップ1305のフラグメント
間ソート処理が繰り返し実行され、両方の処理において
実際にイベントデータの入替えが発生しなくなった時点
で、配列SNG_SONGに記憶されている対象小節内
のイベントデータ群に対する時間ソート処理が完了す
る。具体的には、ステップ1304又は1305におい
て実際にイベントデータの入替えが発生した場合は、ス
テップ1304又は1305内において後述するように
時間ソート処理終了フラグの値が0にセットされる。従
って、この場合にはステップ1302の判定がYESと
なるため、時間ソート処理が続行される。一方、ステッ
プ1304及び1305の両方で実際にイベントデータ
の入替えが発生しなくなった場合は、ステップ1304
及び1305の何れにおいても時間ソート処理終了フラ
グの値を0にセットする処理が実行されなくなる。従っ
て、この場合には時間ソート処理終了フラグの値はステ
ップ1303で1にセットされたままとなるため、ステ
ップ1302の判定がNOとなり、時間ソート処理が終
了する。
【0138】図14は、図13のステップ1304のフ
ラグメント内ソート処理の動作フローチャートである。
まず、フラグメント内ソート処理終了フラグ(CPU3
03内のレジスタ又はRAM305に確保される)は、
フラグメント内ソート処理を、終了させるべきでない場
合に値0となり、終了させるべきである場合に値1とな
る。このフラグの値は、ステップ1401で、0に初期
化される。
【0139】サーチ状態フラグ(CPU303内のレジ
スタ又はRAM305に確保される)は、配列SNG_
SONGに記憶されている対象小節に含まれる現在処理
中のフラグメント内において、ジャンプソースイベント
データ以外の先頭のイベントデータをサーチする処理
が、終了していない場合に値0となり、終了している場
合に値1となる。このフラグの値は、ステップ1402
で0に初期化される。
【0140】サーチイベント(CPU303内のレジス
タ又はRAM305に確保される)は、配列SNG_S
ONGに記憶されている対象小節に含まれる現在処理中
のフラグメント内において、現在処理中のイベントデー
タを指示するものである。このサーチイベントの値は、
ステップ1403で、所定の初期値に設定される。この
初期値は、図10に示されるノートイベント挿入処理の
ステップ1021、図11に示されるプログラムチェン
ジイベント挿入処理(その1)のステップ1120、又
は図12に示されるプログラムチェンジイベント挿入処
理(その2)のステップ1221として実行される時間
ソート処理の実行時には、配列SNG_SONGに記憶
される挿入対象小節内の先頭のイベントデータの要素番
号にセットされる。この番号は、図5の配列SNG_B
AR_TBL及び配列SNG_BAR_PTRから容易
に検索できる。また、この初期値は、図10に示される
ノートイベント挿入処理のステップ1012、図11に
示されるプログラムチェンジイベント挿入処理(その
1)のステップ1111、及び図12に示されるプログ
ラムチェンジイベント挿入処理(その2)のステップ1
211として実行される時間ソート処理の実行時には、
それぞれ、図10に示されるノートイベント挿入処理の
ステップ1003、図11に示されるプログラムチェン
ジイベント挿入処理(その1)のステップ1102、又
は図12に示されるプログラムチェンジイベント挿入処
理(その2)のステップ1202において検索された目
的イベントデータの要素番号にセットされる。
【0141】続いて、初期状態では、ステップ1404
と1405の判定が共にYESとなった後に、ステップ
1406〜1413において、配列SNG_SONGに
記憶されている挿入対象小節に含まれる現在処理中のフ
ラグメント内において、ジャンプソースイベントデータ
以外の先頭のイベントデータをサーチする処理が実行さ
れる。なお、図10に示されるノートイベント挿入処理
のステップ1012、図11に示されるプログラムチェ
ンジイベント挿入処理(その1)のステップ1111、
及び図12に示されるプログラムチェンジイベント挿入
処理(その2)のステップ1211として実行される時
間ソート処理の実行時には、ステップ1403で所定の
目的イベントデータの要素番号にセットされているた
め、後述するステップ1408の判定の後すぐにステッ
プ1411の処理が実行される。
【0142】まず、サーチイベントによって指示される
現在イベントデータ(フロー中では現在イベントと記述
する)が、RAM305内の配列SNG_SONGから
読み出される。
【0143】そして、現在イベントデータがジャンプソ
ースイベントデータである場合は、ステップ1406の
判定の後にステップ1407が実行され、サーチイベン
トが指示する配列SNG_SONGの要素番号がインク
リメントされる。これらのステップ1406とステップ
1407の処理の繰返しによって、現在処理中のフラグ
メント内の先頭のジャンプソースイベントデータが無視
される。
【0144】現在イベントデータがジャンプソースイベ
ントデータ以外のイベントデータとなった場合は、ステ
ップ1408でそのイベントデータの種類が判定され
る。ステップ1408で現在イベントデータがトラック
終了イベントデータ又は小節終了イベントデータ(図7
参照)であると判定された場合には、ステップ1409
で、フラグメント内ソート処理終了フラグの値が1にセ
ットされる。即ち、この場合は、現在処理中のフラグメ
ント内にはソート処理を実行すべき有効なイベントデー
タは存在せず、かつ現在処理中のフラグメント以降に対
象小節のイベントデータ群が存在しないため、ステップ
1409の処理の後にステップ1404が実行された時
点でその判定がNOとなり、フラグメント内ソート処理
を終了する。
【0145】また、ステップ1408で現在イベントデ
ータがジャンプイベントデータ(図7(c) 参照)である
と判定された場合には、ステップ1410で、そのジャ
ンプイベントデータの第3ワードに格納されているジャ
ンプ先要素番号が、サーチイベントの値としてセットさ
れる。即ち、この場合には、現在処理中のフラグメント
内にはソート処理を実行すべき有効なイベントデータは
存在せず、かつ現在処理中のフラグメント以降に対象小
節のイベントデータ群が存在する。このため、ステップ
1410の処理によってサーチイベントに新たなフラグ
メントの先頭のイベントデータの要素番号が設定された
後に、再びステップ1404と1405の判定が共にY
ESとなった後、ステップ1406〜1413におい
て、配列SNG_SONGに記憶されている対象小節に
含まれる新たなフラグメント内において、ジャンプソー
スイベントデータ以外の先頭のイベントデータをサーチ
する処理が再度実行される。
【0146】更に、ステップ1408で、現在イベント
データがトラック終了イベントデータ、小節終了イベン
トデータ、及びジャンプイベントデータ以外のイベント
データであると判定された場合には、ステップ1411
で、サーチイベントの値がフラグメント先頭イベントの
値としてセットされる。この値が、現在処理中のフラグ
メント内で最初に見つかったジャンプソースイベントデ
ータ以外の先頭のイベントデータの要素番号となる。続
いて、ステップ1412で、サーチイベントが指示する
配列SNG_SONGの要素番号がインクリメントされ
た後、サーチ処理を終了させるべく、ステップ1413
で、サーチ状態フラグの値が1にセットされる。
【0147】この結果、ステップ1413に続いてステ
ップ1404の判定がYESとなった後に、ステップ1
405の判定がNOとなって、ステップ1414〜14
16が実行される。ステップ1414〜1416では、
配列SNG_SONGに記憶されている挿入対象小節に
含まれる現在処理中のフラグメント内で、トラック終了
イベントデータ、小節終了イベントデータ、及びジャン
プイベントデータ以外の末尾のイベントデータをサーチ
する処理が実行される。
【0148】まず、サーチイベントによって指示される
現在イベントデータが、RAM305内の配列SNG_
SONGから読み出される。そして、現在イベントデー
タがトラック終了イベントデータ、小節終了イベントデ
ータ、及びジャンプイベントデータ以外のイベントデー
タである場合には、ステップ1414の判定の後にステ
ップ1415が実行され、サーチイベントが指示する配
列SNG_SONGの要素番号がインクリメントされ
る。これらのステップ1414とステップ1415の処
理の繰返しによって、現在処理中のフラグメント内のイ
ベントデータが末尾に向かって順次サーチされる。
【0149】現在イベントデータがトラック終了イベン
トデータ、小節終了イベントデータ、又はジャンプイベ
ントデータの何れかのイベントデータとなった場合に
は、ステップ1416で、サーチイベントが指示する要
素番号から−1して得られる値が、フラグメント終了イ
ベントの値としてセットされる。この値が、現在処理中
のフラグメント内における、トラック終了イベントデー
タ、小節終了イベントデータ、及びジャンプイベントデ
ータ以外の末尾のイベントデータである。
【0150】以上の処理により、現在処理中のフラグメ
ント内でソート処理が実行されるべき先頭のイベントデ
ータと末尾のイベントデータが、フラグメント先頭イベ
ント及びフラグメント終了イベントとして算出される。
【0151】続いて、ステップ1417では、上記フラ
グメント先頭イベントとフラグメント終了イベントが指
示する要素番号が一致しているか否かが判定される。ス
テップ1417の判定がYESの場合は、現在処理中の
フラグメント内でソート処理が実行されるべきイベント
データの数が1であり、実質的にソート処理を実行する
必要はないため、ステップ1418のソート処理は実行
されずに、ステップ1419以降が実行される。ステッ
プ1419以降の処理については後述する。
【0152】ステップ1417の判定がNOの場合は、
ステップ1418で、配列SNG_SONGに記憶され
ている対象小節に含まれる現在処理中のフラグメント内
で、フラグメント先頭イベントとフラグメント終了イベ
ントにより指示される範囲のイベントデータ群が、各イ
ベントデータの第2ワードのクロック値に関しソートさ
れる。この処理については、後述する。なお、後述する
ように、ステップ1418において実際にイベントデー
タの入替えが発生した場合は、ステップ1418内にお
いて時間ソート処理終了フラグの値が0にセットされ
る。従って、この場合は図13のステップ1302の処
理に戻った時点でその判定がYESとなるため、時間ソ
ート処理が続行される。
【0153】ステップ1418の処理の後又はステップ
1417の判定がYESとなった後に、ステップ141
9で、ステップ1414で判定されている現在イベント
データの種類が判定される。
【0154】ステップ1419で現在イベントデータが
トラック終了イベントデータ又は小節終了イベントデー
タであると判定された場合は、ステップ1420で、フ
ラグメント内ソート処理終了フラグの値が1にセットさ
れる。即ち、この場合は、現在処理中のフラグメント以
降に挿入対象小節のイベントデータ群が存在しないた
め、ステップ1420の処理の後にステップ1404が
実行された時点でその判定がNOとなり、フラグメント
内ソート処理を終了する。
【0155】また、ステップ1419で現在イベントデ
ータがジャンプイベントデータであると判定された場合
には、ステップ1421で、そのジャンプイベントデー
タの第3ワードに格納されているジャンプ先要素番号
が、サーチイベントの値としてセットされ、また、サー
チ状態フラグの値が0にセットされる。即ち、この場合
は、現在処理中のフラグメント以降に対象小節のイベン
トデータ群が存在する。このため、ステップ1421の
処理によってサーチイベントに新たなフラグメントの先
頭のイベントデータの要素番号が設定された後に、再び
ステップ1404と1405の判定が共にYESとなっ
た後、ステップ1406以降において、配列SNG_S
ONGに記憶されている挿入対象小節に含まれる新たな
フラグメントに対してフラグメント内ソート処理が実行
される。
【0156】以上説明した図14の動作フローチャート
の処理により、配列SNG_SONGに記憶されている
挿入対象小節内の全てのフラグメントのそれぞれに対
し、図13のステップ1304のフラグメント内ソート
処理が1回ずつ実行される。
【0157】続いて、図15〜図19は、図13のステ
ップ1305のフラグメント間ソート処理の動作フロー
チャートである。まず、フラグメント間ソート処理終了
フラグ(CPU303内のレジスタ又はRAM305に
確保される)は、フラグメント間ソート処理を、終了さ
せるべきでない場合に値0となり、終了させるべきであ
る場合に値1となる。このフラグの値は、ステップ15
01で、0に初期化される。
【0158】サーチイベント(CPU303内のレジス
タ又はRAM305に確保される)は、現在処理中のイ
ベントデータを指示するものである。このサーチイベン
トの値は、ステップ1502で、所定の初期値に設定さ
れる。この初期値は、図10に示されるノートイベント
挿入処理のステップ1021、図11に示されるプログ
ラムチェンジイベント挿入処理(その1)のステップ1
120、又は図12に示されるプログラムチェンジイベ
ント挿入処理(その2)のステップ1221として実行
される時間ソート処理の実行時には、配列SNG_SO
NGに記憶される挿入対象小節内の先頭のイベントデー
タの要素番号にセットされる。また、この初期値は、図
10に示されるノートイベント挿入処理のステップ10
12、図11に示されるプログラムチェンジイベント挿
入処理(その1)のステップ1111、及び図12に示
されるプログラムチェンジイベント挿入処理(その2)
のステップ1211として実行される時間ソート処理の
実行時には、それぞれ、図10に示されるノートイベン
ト挿入処理のステップ1003、図11に示されるプロ
グラムチェンジイベント挿入処理(その1)のステップ
1102、又は図12に示されるプログラムチェンジイ
ベント挿入処理(その2)のステップ1202において
検索された目的イベントデータの要素番号にセットされ
る。
【0159】第1フラグメント最終イベント要素番号
(CPU303内のレジスタ又はRAM305に確保さ
れる)は、フラグメント間ソート処理が実行されるべき
現在処理中の2つのフラグメントのうちの第1番目のフ
ラグメントにおける、トラック終了イベントデータ、小
節終了イベントデータ、ジャンプソースイベントデー
タ、及びジャンプイベントデータ以外の末尾のイベント
データの要素番号を指示するものである。この値は、ス
テップ1503で、配列SNG_SONG内の要素番号
として出現し得ない値0xffffにセットされる。
【0160】次に、初期状態においては、ステップ15
04の判定がYESとなった後に、ステップ1505で
F1フラグ(CPU303内のレジスタ又はRAM30
5に確保される)の値が0にセットされる。F1フラグ
は、配列SNG_SONGに記憶されている挿入対象小
節に含まれる現在処理中の2つのフラグメントのうちの
第1番目のフラグメントにおいて、トラック終了イベン
トデータ、小節終了イベントデータ、ジャンプソースイ
ベントデータ、及びジャンプイベントデータ以外の末尾
のイベントデータをサーチする処理が、終了していない
場合に値0となり、終了している場合に値1となる。
【0161】続いて、図16のステップ1506の判定
がYESとなった後、図16のステップ1507〜15
14で、配列SNG_SONGに記憶されている挿入対
象小節に含まれる現在処理中の2つのフラグメントのう
ちの第1番目のフラグメントにおいて、トラック終了イ
ベントデータ、小節終了イベントデータ、ジャンプソー
スイベントデータ、及びジャンプイベントデータ以外の
末尾のイベントデータをサーチする処理が実行される。
【0162】まず、ステップ1507で、サーチイベン
トにより指示される現在イベントデータが、RAM30
5内の配列SNG_SONGから読み出される。そし
て、そのイベントデータの種類が判定される。
【0163】ステップ1507で現在イベントデータが
トラック終了イベントデータ又は小節終了イベントデー
タであると判定された場合には、ステップ1508で、
F1フラグとフラグメント間ソート処理終了フラグの値
が共に1にセットされる。即ち、この場合は、現在処理
中の第1番目のフラグメント内にはソート処理を実行す
べき有効な最終イベントデータは存在せず、かつ第1番
目のフラグメント以降に挿入対象小節のイベントデータ
群が存在しないため、ステップ1508の処理の後にス
テップ1506が実行された時点でその判定がNOとな
り、後述する図17のステップ1515が実行された
後、ステップ1516に対応する後述する図18の動作
フローチャートが実行される時点でステップ1801の
判定がNOとなり、更に、図17のステップ1517の
判定がNO、図15のステップ1504の判定がNOと
なって、フラグメント間ソート処理を終了する。
【0164】また、図16のステップ1507で現在イ
ベントデータがジャンプイベントデータであると判定さ
れた場合は、ステップ1509で、第1フラグメント最
終イベント要素番号の値がステップ1503で初期設定
されたままの値0xffffであるか否かが判定され
る。
【0165】今、配列SNG_SONG内の現在処理中
の2つのフラグメントのうちの第1番目のフラグメント
内に、トラック終了イベントデータ、小節終了イベント
データ、ジャンプソースイベントデータ、及びジャンプ
イベントデータ以外のイベントデータが1つも存在して
いなければ、第1フラグメント最終イベント要素番号の
値は初期設定値0xffffのままとなり、ステップ1
509の判定がYESとなる。この場合には、ステップ
1511で、そのジャンプイベントデータの第3ワード
に格納されている新たなフラグメントを示すジャンプ先
要素番号が、サーチイベントの値としてセットされる。
その後、再びステップ1506の判定がYESとなるこ
とにより、ステップ1507〜1514において、配列
SNG_SONGに記憶されている挿入対象小節に含ま
れる新たなフラグメントが現在処理中の2つのフラグメ
ントのうちの第1番目のフラグメントとされて、処理が
続行される。
【0166】更に、ステップ1507で現在イベントデ
ータがトラック終了イベントデータ、小節終了イベント
データ、及びジャンプイベントデータ以外のイベントデ
ータであると判定された場合において、更にステップ1
512で現在イベントデータがジャンプソースイベント
データであると判定された場合には、ステップ1514
で、単純にサーチイベントが指示する配列SNG_SO
NGの要素番号がインクリメントされた後に、再びステ
ップ1506からステップ1507の処理に戻る。
【0167】また、ステップ1507で、現在イベント
データがトラック終了イベントデータ、小節終了イベン
トデータ、及びジャンプイベントデータ以外のイベント
データであると判定された場合において、更にステップ
1512で現在イベントデータがジャンプソースイベン
トデータ以外の通常のイベントデータであると判定され
た場合には、ステップ1513で、サーチイベントの値
が第1フラグメント最終イベント要素番号としてセット
される。そして、ステップ1514で、サーチイベント
が指示する配列SNG_SONGの要素番号がインクリ
メントされた後に、再びステップ1506からステップ
1507の処理に戻る。
【0168】以上のように第1フラグメント最終イベン
ト要素番号がインクリメントされてゆき、最後にステッ
プ1507でジャンプイベントデータが検出された時点
において第1フラグメント最終イベント要素番号にセッ
トされている要素番号が、配列SNG_SONGに記憶
されている挿入対象小節に含まれる現在処理中の2つの
フラグメントのうちの第1番目のフラグメントにおいて
見つかった、トラック終了イベントデータ、小節終了イ
ベントデータ、ジャンプソースイベントデータ、及びジ
ャンプイベントデータ以外の末尾のイベントデータの要
素番号となる。その後、ステップ1509の判定がNO
となって、第1番目のフラグメントにおけるサーチ処理
を終了させるべく、ステップ1510で、F1フラグの
値が1にセットされる。そして、ステップ1511で、
そのジャンプイベントデータの第3ワードに格納されて
いる新たなフラグメントを示すジャンプ先要素番号が、
サーチイベントの値としてセットされる。
【0169】この結果、ステップ1511に続いて実行
されるステップ1506の判定がNOとなり、図17の
ステップ1515でF2フラグ(CPU303内のレジ
スタ又はRAM305に確保される)の値が0にセット
される。F2フラグは、配列SNG_SONGに記憶さ
れている挿入対象小節に含まれる現在処理中の2つのフ
ラグメントのうちの第2番目のフラグメントにおいて、
トラック終了イベントデータ、小節終了イベントデー
タ、ジャンプソースイベントデータ、及びジャンプイベ
ントデータ以外の先頭のイベントデータをサーチする処
理が、終了していない場合に値0となり、終了している
場合に値1となる。
【0170】続いて、図17のステップ1516で、配
列SNG_SONGに記憶されている挿入対象小節に含
まれる現在処理中の2つのフラグメントのうちの第2番
目のフラグメントにおいて、トラック終了イベントデー
タ、小節終了イベントデータ、ジャンプソースイベント
データ、及びジャンプイベントデータ以外の先頭のイベ
ントデータをサーチする処理が実行される。
【0171】図18は、図17のステップ1516の処
理の詳細を示す動作フローチャートである。まず、最初
はステップ1801の判定がYESとなる。
【0172】次に、ステップ1802で、サーチイベン
トにより指示される現在イベントデータが、RAM30
5内の配列SNG_SONGから読み出される。そし
て、そのイベントデータの種類が判定される。
【0173】ステップ1802で現在イベントデータが
トラック終了イベントデータ又は小節終了イベントデー
タであると判定された場合には、ステップ1803で、
フラグメント間ソート処理終了フラグの値が1にセット
される。即ち、この場合は、現在処理中の2つのフラグ
メントのうちの第2番目のフラグメント内にはソート処
理を実行すべき有効な先頭イベントデータは存在せず、
かつ第2番目のフラグメント以降に挿入対象小節のイベ
ントデータ群が存在しないため、ステップ1803の処
理の後にステップ1801が実行された時点でその判定
がNOとなり、図18の動作フローチャートによって示
される図17のステップ1516の処理を終了する。
【0174】また、ステップ1802で現在イベントデ
ータがジャンプイベントデータであると判定された場合
には、ステップ1804で、そのジャンプイベントデー
タの第3ワードに格納されているジャンプ先要素番号
が、サーチイベントの値としてセットされる。即ち、こ
の場合には、現在処理中の2つのフラグメントのうちの
第2番目のフラグメント内にはソート処理を実行すべき
有効なイベントデータは存在せず、かつその第2番目の
フラグメント以降に挿入対象小節のイベントデータ群が
存在する。このため、ステップ1804の処理によって
サーチイベントに新たなフラグメントの先頭のイベント
データの要素番号が設定される。その後、再びステップ
1801の判定がYESとなることにより、ステップ1
802〜1808において、配列SNG_SONGに記
憶されている挿入対象小節に含まれる新たなフラグメン
トが現在処理中の2つのフラグメントのうちの第2番目
のフラグメントとされて、処理が続行される。
【0175】更に、ステップ1802において現在イベ
ントデータがトラック終了イベントデータ、小節終了イ
ベントデータ、及びジャンプイベントデータ以外のイベ
ントデータであると判定された場合において、更にステ
ップ1805で現在イベントデータがジャンプソースイ
ベントデータであると判定された場合には、ステップ1
808で、単純にサーチイベントが指示する配列SNG
_SONGの要素番号がインクリメントされた後に、再
びステップ1801からステップ1802の処理に戻
る。
【0176】また、ステップ1802で現在イベントデ
ータがトラック終了イベントデータ、小節終了イベント
データ、及びジャンプイベントデータ以外のイベントデ
ータであると判定された場合において、更にステップ1
805で現在イベントデータがジャンプソースイベント
データ以外の通常のイベントデータであると判定された
場合には、ステップ1806で、サーチイベントの値が
第2フラグメント先頭イベント要素番号としてセットさ
れる。この値が、配列SNG_SONGに記憶されてい
る挿入対象小節に含まれる現在処理中の2つのフラグメ
ントのうちの第2番目のフラグメントにおいて最初に見
つかった、トラック終了イベントデータ、小節終了イベ
ントデータ、ジャンプソースイベントデータ、及びジャ
ンプイベントデータ以外の先頭のイベントデータの要素
番号となる。続いて、第2番目のフラグメントにおける
サーチ処理を終了させるべく、ステップ1807で、F
2フラグの値が1にセットされた後、ステップ1808
で、サーチイベントが指示する配列SNG_SONGの
要素番号がインクリメントされる。そして、ステップ1
806〜1808が実行された後にステップ1801が
再び実行される時点で、その判定がNOとなり、図18
によって示される図17のステップ1516の処理を終
了する。
【0177】以上のようにして、配列SNG_SONG
に記憶されている挿入対象小節に含まれる現在処理中の
2つのフラグメントにつき、図16のステップ1507
〜1514で、第1番目のフラグメントの末尾のイベン
トデータをサーチする処理が成功し、かつ、図18によ
って示される図17のステップ1516で、第2番目の
フラグメントの先頭のイベントデータをサーチする処理
に成功すると、ステップ1517の判定がYESとなっ
た後、ステップ1518で、第1番目のフラグメントの
末尾のイベントデータと第2番目のフラグメントの先頭
のイベントデータについて、イベント移動処理が実行さ
れる。
【0178】図19は、図17のステップ1518のイ
ベント移動処理の動作フローチャートである。まず、ス
テップ1901で、RAM305内の配列SNG_SO
NGから、第1フラグメント最終イベント要素番号によ
って指示される要素番号のイベントデータが読み出され
ると共に、第2フラグメント先頭イベント要素番号によ
って指示される要素番号のイベントデータが読み出され
る。そして、第1フラグメント最終イベント要素番号に
対応するイベントデータの第2ワードの値が、第2フラ
グメント先頭イベント要素番号に対応するイベントデー
タの第2ワードの値より大きいか否か、即ち、第1フラ
グメント最終イベント要素番号に対応するイベントデー
タが第2フラグメント先頭イベント要素番号に対応する
イベントデータよりも後ろに配置されるべきか否かが判
定される。
【0179】ステップ1901の判定がYESの場合に
は、ステップ1902で、第1フラグメント最終イベン
ト要素番号に対応するイベントデータと第2フラグメン
ト先頭イベント要素番号に対応するイベントデータの記
憶位置が入れ替えられる。その後、ステップ1903及
び1904で、フラグメント間ソート処理終了フラグ及
び時間ソート処理終了フラグの値が、共に0にセットさ
れる。このように、実際にイベントデータの入替えが発
生した場合には、時間ソート処理終了フラグの値が0に
セットされるため、前述した図13のステップ1304
のフラグメント内ソート処理とステップ1305のフラ
グメント間ソート処理が終了した後にステップ1302
の判定に戻った時点で、その判定が再びYESとなり、
時間ソート処理が続行される。
【0180】なお、上述の入替えが発生した場合におい
て、入替えの対象となるイベントデータに前述した図1
0のノートイベント挿入処理、図11のプログラムチェ
ンジイベント挿入処理(その1)、又は図12のプログ
ラムチェンジイベント挿入処理(その2)において挿入
されたイベントデータが含まれている場合には、その挿
入イベントデータの入替え後の要素番号が特には図示し
ないレジスタに記憶される。このレジスタの値は、前述
した図10のステップ1013、図11のステップ11
12、又は図12のステップ1212において使用され
る。
【0181】一方、ステップ1901の判定がNOの場
合には、第1フラグメント最終イベント要素番号に対応
するイベントデータと第2フラグメント先頭イベント要
素番号に対応するイベントデータの入替えは実行され
ず、ステップ1905で、フラグメント間ソート処理終
了フラグの値が0にセットされる。
【0182】以上のようにして、配列SNG_SONG
に記憶される挿入対象小節に含まれる現在処理中の2つ
のフラグメントについて、フラグメント間ソート処理が
実現される。
【0183】ステップ1904又は1905の処理の
後、再び図15のステップ1504の処理に戻り、その
判定がYESとなることによって、ステップ1505以
降で、配列SNG_SONGに記憶されている挿入対象
小節に含まれる新たな2つのフラグメントについて、第
1番目のフラグメントの末尾のイベントデータをサーチ
する処理と、第2番目のフラグメントの先頭のイベント
データをサーチする処理と、サーチされた2つのイベン
トデータに対するイベント移動処理の実行が試みられ
る。この場合、サーチイベントの値は今まで第2番目で
あったフラグメントの先頭のイベントデータを指示して
いるため、今まで第2番目として処理されたフラグメン
トが新たな第1番目のフラグメントとして処理される。
そして、それに続く挿入対象小節内のフラグメントが第
2番目のフラグメントとして処理される。
【0184】以上の処理が繰返される結果、挿入対象小
節の末尾のフラグメントが第1番目のフラグメントとし
て処理される過程で、ステップ1507でトラック終了
イベントデータ又は小節終了イベントデータが検出され
る。これにより、ステップ1508で、F1フラグとフ
ラグメント間ソート処理終了フラグの値が共に1にセッ
トされる。即ち、この場合は、現在処理中の第1番目の
フラグメント内にはソート処理を実行すべき有効な最終
イベントデータは存在せず、かつ第1番目のフラグメン
ト以降に挿入対象小節のイベントデータ群が存在しない
ため、ステップ1508の処理の後にステップ1506
が実行された時点でその判定がNOとなり、後述する図
17のステップ1515が実行された後、ステップ15
16に対応する後述する図18の動作フローチャートが
実行される時点でステップ1801の判定がNOとな
り、更に、図17のステップ1517の判定がNO、図
15のステップ1504の判定がNOとなって、フラグ
メント間ソート処理を終了する。
【0185】最後に、図14のステップ1418におい
て実行される、配列SNG_SONGに記憶されている
挿入対象小節に含まれる現在処理中のフラグメント内
の、フラグメント先頭イベントとフラグメント終了イベ
ントによって指示される範囲のイベントデータ群に対す
る時間ソート処理について説明する。
【0186】ここでは、フラグメント先頭イベントとフ
ラグメント終了イベントにより指示される範囲のイベン
トデータ群が、各イベントデータの第2ワードのクロッ
ク値に関してソートされる。
【0187】まず、ソート処理のアルゴリズムについて
は、文献「バブル・ソートが簡単な手直しで劇的に速く
なる」(スティーブン・レイシー、リチャード・ボック
ス)(日経BP社発行、日経バイト/1991年11月
号、p.305〜p.312)に記載されている。
【0188】ソートアルゴリズムの最も代表的なものと
して、バブルソートアルゴリズムが知られている。この
アルゴリズムにおいては、例えば昇べきの順にソートが
行われる場合には、まず、第1番目のイベントデータ値
(第2バイトの値)と第2番目のイベントデータ値の大
小関係が比較され、第1番目のイベントデータ値の方が
大きければ両者のイベントデータが入れ替えられる。次
に、新たな第2番目のイベントデータ値と第3番目のイ
ベントデータ値の大小関係が同様に比較され入替えが実
行される。このようにして、最終イベントデータまで同
様の比較・入替え処理が実行される。この最終データま
での1回の処理単位を、ストロークと呼ぶ。続いて、再
び、第1番目のイベントデータから最終イベントデータ
に向かって第2ストローク目の処理が繰り返される。そ
して、このストローク処理が、イベントデータの入替え
が発生しなくなるまで繰り返される。
【0189】図10に示されるノートイベント挿入処理
のステップ1012と1021、図11に示されるプロ
グラムチェンジイベント挿入処理(その1)のステップ
1120、又は図12に示されるプログラムチェンジイ
ベント挿入処理(その2)のステップ1221として実
行される時間ソート処理の実行時には、図14のステッ
プ1418の処理に、上述のバブルソートアルゴリズム
が適用される。このアルゴリズムは、周知のアルゴリズ
ムであるため、その詳細は省略する。
【0190】なお、このアルゴリズムの適用の過程で、
イベントデータの入替えが発生した場合において、入替
えの対象となるイベントデータに前述した図10のノー
トイベント挿入処理、図11のプログラムチェンジイベ
ント挿入処理(その1)、又は図12のプログラムチェ
ンジイベント挿入処理(その2)において挿入されたイ
ベントデータが含まれている場合には、その挿入イベン
トデータの入替え後の要素番号が特には図示しないレジ
スタに記憶される。このレジスタの値は、前述した図1
0のステップ1013等において使用される。
【0191】また、上述のバブルソートアルゴリズムの
適用の過程で、イベントデータの入替えが発生した場合
は、時間ソート処理終了フラグの値が、0にセットされ
る。このように、実際にイベントデータの入替えが発生
した場合は、時間ソート処理終了フラグの値が0にセッ
トされるため、前述した図13のステップ1304のフ
ラグメント内ソート処理とステップ1305のフラグメ
ント間ソート処理が終了した後にステップ1302の判
定に戻った時点で、その判定が再びYESとなり、時間
ソート処理が続行される。
【0192】更に、上述のバブルソートアルゴリズム
は、隣り同士のイベントデータ値の比較・入替え処理の
繰返しによって実現されるため、バブルソート処理の前
と後とで、同じ第2ワードの値を有するイベントデータ
の並び順は変更されない。
【0193】また、上述のバブルソートアルゴリズム
は、隣り同士のイベントデータ値の比較・入替え処理の
繰返しによって実現されるため、処理プログラムが簡単
に実現できる反面、イベントデータは1回の比較・入替
え処理によって1アドレス分だけしか移動できないた
め、例えばフラグメントの後部に位置するイベントデー
タがフラグメントの先頭付近に移動させられる場合には
処理時間が長くなってしまう。
【0194】そこで、そのようなバブルソートアルゴリ
ズムの欠点を改良するアルゴリズムとして、コムソート
アルゴリズムが知られている。このアルゴリズムでは、
バブルソートアルゴリズムのように隣接したイベントデ
ータ値同士について比較・入替えが実行されるのではな
く、1以上離れた間隔(以下、この間隔をギャップとい
う)のイベントデータ値同士について、比較・入替えが
実行される。
【0195】具体的には、次のようなコムソートアルゴ
リズムが最適であることが実験的に確かめられている。
即ち、まず、最初のストローク処理(第1番目のイベン
トデータから最終イベントデータまでの1回の処理)に
おけるギャップの値は、ソート処理されるイベントデー
タの要素数を1.3で割って得られる値とされる。以
下、ストロークが進む毎に、前回のギャップの値を1.
3で割って得られる値が新たなギャップの値とされる。
この過程で、ギャップの値が9又は10となった時点
で、ギャップの値が強制的に11に置き換えられて処理
が続行される。商が1未満になると、それ以降のギャッ
プの値は1とされる。そして、ギャップの値が1とな
り、かつストローク処理においてイベントデータの入替
えが発生しなくなった時点で、ソート処理が終了する。
【0196】以上のコムソートアルゴリズムが、最も高
速なソートアルゴリズムとして知られている。しかし、
上述のコムソートアルゴリズムでは、ストロークが進む
毎にソート処理されるべき要素数又は前回のギャップ値
を1.3で割ることにより新たなギャップの値を算出す
る処理が必要となる。このことは、上記除算処理のため
に小数演算用コプロセッサが必要になるということを意
味するため、ハードウエア規模が大きくなってしまうと
いう欠点がある。
【0197】そこで、本実施の形態では、図11に示さ
れるプログラムチェンジイベント挿入処理(その1)の
ステップ1111及び図12に示されるプログラムチェ
ンジイベント挿入処理(その2)のステップ1211と
して実行される時間ソート処理の実行時に、図14のス
テップ1418の処理に、以下のようなコムソートアル
ゴリズムが適用される。
【0198】以下に説明するコムソートアルゴリズムに
おいて、上述のコムソートアルゴリズムを基本として、
値1.3による除算処理を、値3の乗算処理と値4の除
算処理で置き換えたアルゴリズムが採用される。即ち、
値1.3による除算処理が値(4/3)による除算処理
に置き換えられたことになる。これにより、小数演算用
コプロセッサが不要となり、ハードウエア規模の増大を
抑えることができる。なお、このようにギャップ値が代
用されても、ソート時間の増大はそれほど大きくならな
い。
【0199】図20は、図11に示されるプログラムチ
ェンジイベント挿入処理(その1)のステップ1111
及び図12に示されるプログラムチェンジイベント挿入
処理(その2)のステップ1211として実行される時
間ソート処理の実行時における、上述のアルゴリズムに
基づく図14のステップ1418の処理の詳細な動作フ
ローチャートである。
【0200】図20の動作フローチャートにおいて、ま
ず、SIZE(CPU303内のレジスタ又はRAM3
05に確保される)には、ソート処理の対象となるフラ
グメントの要素数がセットされる。この数は、(フラグ
メント終了イベント−フラグメント先頭イベント+1)
として算出できる。
【0201】次に、GAP(CPU303内のレジスタ
又はRAM305に確保される)には、前述のギャップ
の値がセットされる。また、TOP(CPU303内の
レジスタ又はRAM305に確保される)には、後述す
るイベント移動ループ処理時の上限のイベントの要素値
がセットされる。
【0202】更に、COUNTER(CPU303内の
レジスタ又はRAM305に確保される)には、後述す
る移動イベントカウンタ値がセットされる。図20の動
作フローチャートにおいて、まず、ステップ2001
で、GAPにSIZEの値がセットされる。次に、前述
した除算処理の簡略化原理に基づき、ステップ2002
において、GAPの値に整数値3を乗算する整数乗算処
理が実行され、更に、その乗算結果を整数値4で除算す
る整数除算処理が実行される。この除算処理は、実際に
は、2ビット右シフト演算として実現できる。この演算
結果が新たなGAPの値としてセットされる。
【0203】次に、ステップ2003で新たに算出され
たGAPの値が判定され、GAPの値が9又は10の場
合には、前述した最適なコムソートアルゴリズムの原理
に基づいて、ステップ2004で、GAPの値が11に
修正される。また、GAPの値が0となってしまった場
合には、やはり前述したコムソートアルゴリズムの原理
に基づき、ステップ2005で、GAPの値が1に修正
される。GAPの値が9、10、又は0の何れでもない
場合には、GAPの値の修正は行われない。
【0204】次に、ステップ2006で、COUNTE
Rの値が0にセットされる。続いて、ステップ2007
で、第1イベント要素番号(CPU303内のレジスタ
又はRAM305に確保される)に、図14の動作フロ
ーチャートにおいて求まっているフラグメント先頭イベ
ントにセットされている要素番号がセットされる。この
第1イベント要素番号は、後述するイベント移動ループ
処理において比較される2つのイベントデータのうち要
素番号が小さい方のイベントデータに対応する。
【0205】次に、TOPの値が、次の数1式により算
出されセットされる。
【0206】
【数1】 TOP=フラグメント先頭イベント+SIZE−GAP このTOPの値は、次に説明するイベント移動ループ処
理においてインクリメントすることのできる第1イベン
ト要素番号の上限値に対応する。
【0207】続いて、ステップ2009〜2014→2
015→2009のイベント移動ループ処理が実行され
る。ここでは、1ストローク分のイベントデータの比較
・入替え処理が実行される。
【0208】まず、ステップ2009では、第2イベン
ト要素番号(CPU303内のレジスタ又はRAM30
5に確保される)の値が、次の数2式によって算出され
セットされる。
【0209】
【数2】 第2イベント要素番号=第1イベント要素番号+GAP この第2イベント要素番号は、イベント移動ループ処理
において比較される2つのイベントデータのうち要素番
号が大きい方のイベントデータに対応する。
【0210】ステップ2010では、RAM305の配
列SNG_SONG(図5(c) )に記憶される第1イベ
ント要素番号に対応するイベントデータの第2ワードの
小節先頭からのクロック値が、同じく第2イベント要素
番号に対応するイベントデータの第2ワードの小節先頭
からのクロック値よりも大きいか否か、即ち、第1イベ
ント要素番号に対応するイベントデータが第2イベント
要素番号に対応するイベントデータよりも後ろに配置さ
れるべきか否かが判定される。
【0211】ステップ2010の判定がYESの場合
は、ステップ2011で、第1イベント要素番号に対応
するイベントデータと第2イベント要素番号に対応する
イベントデータの記憶位置が入れ替えられる。その後、
ステップ2012で、COUNTERの値がインクリメ
ントされる。更に、ステップ2013で、時間ソート処
理終了フラグの値が、0にセットされる。このように、
実際にイベントデータの入替えが発生した場合は、時間
ソート処理終了フラグの値が0にセットされるため、前
述した図13のステップ1304のフラグメント内ソー
ト処理とステップ1305のフラグメント間ソート処理
が終了した後にステップ1302の判定に戻った時点
で、その判定が再びYESとなり、時間ソート処理が続
行される。
【0212】なお、上述の入替えが発生した場合におい
て、入替えの対象となるイベントデータに前述した図1
1のプログラムチェンジイベント挿入処理(その1)又
は図12のプログラムチェンジイベント挿入処理(その
2)において挿入されたイベントデータが含まれている
場合には、その挿入イベントデータの入替え後の要素番
号が特には図示しないレジスタに記憶される。このレジ
スタの値は、前述した図11のステップ1112又は図
12のステップ1212で使用される。
【0213】一方、ステップ2010の判定がNOの場
合には、ステップ2011〜2013の処理は実行され
ない。続いて、ステップ2014で、第1イベント要素
番号の値がTOPの値より小さいか否かが判定される。
【0214】ステップ2014の判定がYESなら、ス
テップ2015で第1イベント要素番号の値がインクリ
メントされた後、ステップ2009で第1イベント要素
番号からGAPの値分だけ離れた新たな第2イベント要
素番号の値が算出され、ステップ2010〜2013
で、両者に対する比較・入替えの処理が実行される。
【0215】以上のステップ2009〜2015の処理
がステップ2014の判定がNOとなるまで繰り返され
ることにより、1ストローク分のイベントデータの比較
・入替え処理が実行される。
【0216】次に、ステップ2014の判定がNOとな
り1ストローク分のイベントデータの比較・入替え処理
が終了すると、ステップ2016で、COUNTERの
値が0でないか(即ち、直前にイベントデータの入替え
が行われたか)、又はGAPの値が1より大きいかが判
定される。
【0217】ステップ2016の判定がYESなら、ス
テップ2002〜2005に戻って新たなストロークの
ためのGAPの値が算出され、ステップ2006〜20
08の処理の後、前述したステップ2009〜2015
のイベント移動ループ処理によって、新たなストローク
に対するイベントデータの比較・入替え処理が繰り返さ
れる。
【0218】GAPの値が1となり、かつ前述したイベ
ント移動ループ処理によってイベントデータの入替えが
発生しなくなり、ステップ2016の判定がNOとなっ
た時点で、図20によって示される図14のステップ1
418のフラグメント内のソート処理が終了する。
【0219】
【発明の効果】本発明の第1の態様の構成によれば、第
1のパラメータの値が同じであるシーケンスデータ群
が、第2のパラメータ(例えば音高番号)について例え
ば小さい順にソートされる。このため、例えばシーケン
サ装置において、同一の発生タイミングに位置するシー
ケンスデータ群がノートイベントデータによって構成さ
れ、それらと同じ発生タイミングを有する新たに挿入さ
れるシーケンスデータもノートイベントデータである場
合に、ソート後にそれらのシーケンスデータ群がディス
プレイに表示させられた場合、ソートのされ方によって
それらの表示順が各ノートイベントデータの音高の高低
の順に並ぶように表示させることが可能となり、視覚上
好ましくないという事態を回避させることが可能とな
る。
【0220】本発明の第2の態様によれば、挿入シーケ
ンスデータに含まれる第1のパラメータの値と同じ値の
第1のパラメータを有するシーケンスデータのうち特定
種類のシーケンスデータは、挿入シーケンスデータより
も後になるようにソートされる。このため、例えばシー
ケンサ装置において、同一の発生タイミングに位置する
シーケンスデータ群がノートイベントデータによって構
成され、それらと同じ発生タイミングを有する新たに挿
入されるシーケンスデータが例えば音色の変更を指示す
るためのプログラムチェンジイベントデータである場合
に、ソート後にそのプログラムチェンジイベントデータ
が上記各ノートイベントデータの記憶位置の前方に並び
替えられる。この結果、上記ノートイベントデータによ
り発音が開始された楽音群が、その直後の同じタイミン
グに実行されるプログラムチェンジイベントデータの処
理によってハイリリース(急速に消音)され聴覚上好ま
しくないという事態を回避することが可能となる。
【0221】本発明の第3の態様によれば、ソート処理
が処理速度の速いことで知られるコムソートアルゴリズ
ム等に基づいて実行された場合であっても、特定種類の
シーケンスデータの並び順が変更されないようにソート
させることが可能となる。
【図面の簡単な説明】
【図1】本発明の実施の形態の外観図(その1)であ
る。
【図2】本発明の実施の形態の外観図(その2)であ
る。
【図3】本発明の実施の形態に係るシーケンサ装置の構
成図である。
【図4】RAM305に記憶される楽曲データのデータ
フォーマットを示す図(その1)である。
【図5】RAM305に記憶される楽曲データのデータ
フォーマットを示す図(その2)である。
【図6】ノートイベントデータとコントロールイベント
データのデータフォーマットを示す図である。
【図7】ジャンプイベントデータ群のデータフォーマッ
トを示す図である。
【図8】メインフローを示す図である。
【図9】スイッチ処理の動作フローチャートである。
【図10】ノートイベント挿入処理の動作フローチャー
トである。
【図11】プログラムチェンジイベント挿入処理の動作
フローチャート(その1)である。
【図12】プログラムチェンジイベント挿入処理の動作
フローチャート(その2)である。
【図13】時間ソート処理の全体動作フローチャートで
ある。
【図14】フラグメント内ソート処理の動作フローチャ
ートである。
【図15】フラグメント間ソート処理の動作フローチャ
ート(その1)である。
【図16】フラグメント間ソート処理の動作フローチャ
ート(その2)である。
【図17】フラグメント間ソート処理の動作フローチャ
ート(その3)である。
【図18】第2フラグメント先頭イベントサーチ処理の
動作フローチャートである。
【図19】イベント移動処理の動作フローチャートであ
る。
【図20】フラグメント内のイベントソート処理を示す
動作フローチャートである。
【符号の説明】
101 シーケンサ装置 102 家庭用テレビ 103、104 スイッチ 105 カーソルキー 106 カーソル 301 演奏情報入力部 302 表示部 303 CPU 304 ROM 305 RAM 306 演奏情報出力部 307 システム操作子群

Claims (6)

    (57)【特許請求の範囲】
  1. 【請求項1】 シーケンスデータ記憶手段内の所定範囲
    のシーケンスデータ群と新たに挿入されたシーケンスデ
    ータである挿入シーケンスデータとで、前記シーケンス
    データ群及び前記挿入シーケンスデータに含まれる発生
    タイミングについてソート処理を実行するシーケンスデ
    ータの挿入処理装置において、 前記所定範囲のシーケンスデータ群に含まれ、前記挿入
    シーケンスデータに含まれる発生タイミングの値と同じ
    値の発生タイミングを有するシーケンスデータと、前記
    挿入シーケンスデータとが、それらに含まれる特定パラ
    メータについて所定の順に並ぶようにソートする第1の
    ソート手段と、 前記第1のソート手段によるソート後のシーケンスデー
    タ群を表示する表示手段 を有する、 ことを特徴とするシーケンスデータの挿入処理装置。
  2. 【請求項2】 前記第1のソート手段は、前記所定範囲
    のシーケンスデータ群に含まれ、前記挿入シーケンスデ
    ータに含まれる発生タイミングの値と同じ値の発生タイ
    ミングを有するシーケンスデータのうち、該シーケンス
    データに含まれる特定パラメータの値が前記挿入シーケ
    ンスデータに含まれる特定パラメータの値よりも大きな
    所定シーケンスデータについて、該所定シーケンスデー
    タに含まれる発生タイミングの値を所定値だけ増加させ
    る第1の制御手段と、 その後、少なくとも前記所定シーケンスデータと前記挿
    入シーケンスデータとで、発生タイミングについてソー
    ト処理を実行する第1のソート処理実行手段と、 その後、前記所定シーケンスデータに含まれる発生タイ
    ミングの値を前記所定値だけ減少させる第2の制御手段
    と、 を有することを特徴とする請求項1に記載のシーケンス
    データの挿入処理装置。
  3. 【請求項3】 シーケンスデータ記憶手段内の所定範囲
    のシーケンスデータ群と新たに挿入されたシーケンスデ
    ータである挿入シーケンスデータとで、前記シーケンス
    データ群及び前記挿入シーケンスデータに含まれる発生
    タイミングについてソート処理を実行するシーケンスデ
    ータの挿入処理装置において、 前記所定範囲のシーケンスデータ群に含まれ、前記挿入
    シーケンスデータに含まれる発生タイミングの値と同じ
    値の発生タイミングを有するシーケンスデータのうち
    ートイベントのシーケンスデータよりも前に、前記挿入
    シーケンスデータが並び替えられるようにソートする第
    2のソート手段を有する、 ことを特徴とするシーケンスデータの挿入処理装置。
  4. 【請求項4】 前記第2のソート手段は、 前記所定範囲のシーケンスデータ群に含まれ、前記挿入
    シーケンスデータに含まれる発生タイミングの値と同じ
    値の発生タイミングを有するシーケンスデータのうち
    ートイベントのシーケンスデータについて、該ノートイ
    ベントのシーケンスデータに含まれる発生タイミング
    値を所定値だけ増加させる第3の制御手段と、 その後、少なくとも前記ノートイベントのシーケンスデ
    ータと前記挿入シーケンスデータとで、発生タイミング
    についてソート処理を実行する第2のソート処理実行手
    段と、 その後、前記ノートイベントのシーケンスデータに含ま
    れる発生タイミングの値を前記所定値だけ減少させる第
    4の制御手段と、 を有することを特徴とする請求項3に記載のシーケンス
    データの挿入処理装置。
  5. 【請求項5】 シーケンスデータ記憶手段内の所定範囲
    のシーケンスデータ群と新たに挿入されたシーケンスデ
    ータである挿入シーケンスデータとで、前記シーケンス
    データ群及び前記挿入シーケンスデータに含まれる発生
    タイミングについてソート処理を実行するシーケンスデ
    ータの挿入処理装置において、 前記所定範囲のシーケンスデータ群に含まれ、前記挿入
    シーケンスデータに含まれる発生タイミングの値と同じ
    値の発生タイミングを有するシーケンスデータのうち
    ートイベントのシーケンスデータよりも前に、前記挿入
    シーケンスデータが並び替えられ、かつ前記ノートイベ
    ントのシーケンスデータの並び順が変更されないように
    ソートする第3のソート手段と、 前記第3のソート手段によるソート後のシーケンスデー
    タ群を表示する表示手段 を有する、 ことを特徴とするシーケンスデータの挿入処理装置。
  6. 【請求項6】 前記第3のソート手段は、 前記所定範囲のシーケンスデータ群に含まれ、前記挿入
    シーケンスデータに含まれる発生タイミングの値と同じ
    値の発生タイミングを有するシーケンスデータのうち
    ートイベントのシーケンスデータについて、該ノートイ
    ベントのシーケンスデータに含まれる発生タイミング
    値を、該ノートイベントのシーケンスデータの並び順に
    応じて順次増加するカウンタ値だけ増加させる第5の制
    御手段と、 その後、少なくとも前記ノートイベントのシーケンスデ
    ータと前記挿入シーケンスデータとで、発生タイミング
    についてソート処理を実行する第3のソート処理実行手
    段と、 その後、前記ノートイベントのシーケンスデータに含ま
    れる発生タイミングの値を前記順次増加するカウンタ値
    だけ減少させる第6の制御手段と、 を有することを特徴とする請求項5に記載のシーケンス
    データの挿入処理装置。
JP23313395A 1995-09-11 1995-09-11 シーケンスデータの挿入処理装置 Expired - Fee Related JP3533481B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP23313395A JP3533481B2 (ja) 1995-09-11 1995-09-11 シーケンスデータの挿入処理装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP23313395A JP3533481B2 (ja) 1995-09-11 1995-09-11 シーケンスデータの挿入処理装置

Publications (2)

Publication Number Publication Date
JPH0981130A JPH0981130A (ja) 1997-03-28
JP3533481B2 true JP3533481B2 (ja) 2004-05-31

Family

ID=16950261

Family Applications (1)

Application Number Title Priority Date Filing Date
JP23313395A Expired - Fee Related JP3533481B2 (ja) 1995-09-11 1995-09-11 シーケンスデータの挿入処理装置

Country Status (1)

Country Link
JP (1) JP3533481B2 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP5995343B2 (ja) 2011-03-11 2016-09-21 ローランド株式会社 電子楽器

Also Published As

Publication number Publication date
JPH0981130A (ja) 1997-03-28

Similar Documents

Publication Publication Date Title
JP2580720B2 (ja) 自動演奏装置
JPH11341350A (ja) マルチメディア情報編集および再生装置、マルチメディア情報再生プログラムを記録した記録媒体ならびにシーケンス情報を記録した記録媒体
KR100252399B1 (ko) 음악 정보 기록 및 재생 방법, 재생 장치
US6635816B2 (en) Editor for musical performance data
JP3838353B2 (ja) 楽音生成装置および楽音生成用コンピュータプログラム
US5672837A (en) Automatic performance control apparatus and musical data storing device
JP3448928B2 (ja) 楽譜認識装置
US7323630B2 (en) Automatic performance system
JP3533481B2 (ja) シーケンスデータの挿入処理装置
JPH0820872B2 (ja) 波形発生装置
JP4211709B2 (ja) 自動演奏装置および同装置に適用されるコンピュータプログラム
US6956161B2 (en) Musical performance data search system
JPH0766265B2 (ja) 演奏情報処理装置の割込処理制御部
JP3489236B2 (ja) シーケンスデータのソート処理装置/方法
JPH08185164A (ja) 自動演奏制御装置及びそれに使用する楽曲データ記憶装置
JP2743808B2 (ja) 自動演奏装置
JPH0981368A (ja) シーケンスデータのソート処理装置/方法
JP3346187B2 (ja) 演奏データ編集装置および演奏データ編集プログラムを記憶した媒体
JP3604513B2 (ja) 演奏データ編集装置
JPH10124075A (ja) 歌詞ワイプ情報入力装置および記録媒体
JP3219150B2 (ja) 演奏情報圧縮方法
JP3460524B2 (ja) 曲データ加工方法、加工後曲データ再生方法および記憶媒体
JP3873872B2 (ja) 演奏情報記録装置及びプログラム
JPH06203534A (ja) 電子楽器のファイル管理システム
JP3873871B2 (ja) 演奏情報記録装置及びプログラム

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20031209

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20040116

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

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20040223

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

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

Free format text: PAYMENT UNTIL: 20090319

Year of fee payment: 5

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

Free format text: PAYMENT UNTIL: 20090319

Year of fee payment: 5

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

Free format text: PAYMENT UNTIL: 20100319

Year of fee payment: 6

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

Free format text: PAYMENT UNTIL: 20110319

Year of fee payment: 7

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

Free format text: PAYMENT UNTIL: 20110319

Year of fee payment: 7

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

Free format text: PAYMENT UNTIL: 20120319

Year of fee payment: 8

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

Free format text: PAYMENT UNTIL: 20130319

Year of fee payment: 9

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

Free format text: PAYMENT UNTIL: 20130319

Year of fee payment: 9

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

Free format text: PAYMENT UNTIL: 20140319

Year of fee payment: 10

LAPS Cancellation because of no payment of annual fees