(57)【特許請求の範囲】
【請求項１】
音響信号を符号化して得られた２つの独立した符号データに対して両者の差分を表す１つの差分符号データを作成する方法であって、
前記符号データは時系列に配置されたイベントデータで構成され、各イベントデータには、発音開始または発音終了のイベントの識別、当該イベントの時刻、音の高さ、チャンネル番号、音の強さの属性情報を備え、
前記２つの符号データの各イベントデータに対して互いに異なるチャンネル番号を付与しながら、前記時刻が早い順にソートして、２つのチャンネル番号を有する１つの時系列な符号データに統合し、２チャンネル符号データを作成する符号データ統合段階と、
発音開始のイベントデータと、当該イベントデータと同一の音の高さをもつ発音終了のイベントデータとの２つのイベントデータの対で構成される区間を発音区間としたとき、前記２チャンネル符号データの中で、一方のチャンネルの発音区間が、同一の音の高さをもつ他方のチャンネルの発音区間と時間的に全てまたは一部が重複する場合に、両発音区間が重複する区間を、両発音区間の音の強さの差分値を新たな音の強さとする新たな発音区間を重複区間として生成し、前記重複する両発音区間のうち、一方のチャンネルにのみノートオン区間が存在する区間については、当該一方のチャンネルの音の強さを有する発音区間を生成する重複発音区間差分処理段階と、
前記重複発音区間差分処理段階にて更新された発音区間の各々の発音開始のイベントデータと発音終了のイベントデータを時系列にソートし、
所定の形式で符号化する差分符号データ符号化段階と、
を有することを特徴とする差分符号データの作成方法。
【請求項２】
請求項１において、
前記重複発音区間差分処理段階は、前記重複区間の音の強さが０の場合、前記音の強さを０以外の１〜１２７の範囲で小さな値に変更することを特徴とする差分符号データの作成方法。
【請求項３】
請求項１において、
前記重複発音区間差分処理段階は、前記重複区間の音の強さが０の場合、前記重複区間を符号化対象から削除することを特徴とする差分符号データの作成方法。
【請求項４】
請求項１から請求項３のいずれかにおいて、
前記符号データ統合段階は、前記２つの符号データのいずれか一方の全ての発音開始、発音終了のイベントデータの時刻に対して複数通りのオフセット値を一律に加えるようにし、
前記複数通りのオフセット値に基づいて、前記差分符号データ符号化段階までを複数回実行して複数通りの差分符号データを符号化するようにし、
前記差分符号データ符号化段階にて符号化された複数通りの各差分符号データに対して、発音開始のイベントデータとそれに対応する同一の音の高さをもつ発音終了の２つのイベントデータの対で構成される発音区間を抽出し、前記抽出された全ての発音区間の音の強さと発音区間の時間間隔（発音終了のイベントデータの時刻と発音開始のイベントデータの時刻との差）との積の総和値を算出し、前記総和値が最小となる差分符号データを選別する差分符号データ選別段階を、前記差分符号データ符号化段階の後に有することを特徴とする差分符号データの作成方法。
【請求項５】
請求項１から請求項４のいずれかにおいて、
前記差分符号データ符号化段階は、前記重複発音区間差分処理段階により得られた発音区間として、発音開始と発音終了の時刻が同一のものがある場合に、当該発音区間を構成するイベントデータを削除する処理をさらに行うことを特徴とする差分符号データの作成方法。
【請求項６】
請求項１から請求項５のいずれかにおいて、
前記差分符号データ符号化段階により得られた差分符号データを表示手段に画面表示する段階、および／または前記差分符号データを音響再生手段により音響再生する段階をさらに有することを特徴とする差分符号データの作成方法。
【請求項７】
請求項１から請求項６のいずれかにおいて、
前記符号データは、ＭＩＤＩデータであり、前記発音開始の識別はノートオン、前記発音終了の識別はノートオフ、前記時刻はデルタタイム、前記音の高さはノートナンバー、前記音の強さはベロシティ、前記発音区間はノートオン区間で表現されることを特徴とする差分符号データの作成方法。
【請求項８】
音響信号を符号化して得られた２つの独立した符号データに対して両者の差分を表す１つの差分符号データを作成する装置であって、
前記符号データは時系列に配置されたイベントデータで構成され、各イベントデータには、発音開始または発音終了のイベントの識別、当該イベントの時刻、音の高さ、チャンネル番号、音の強さの属性情報を備え、
前記２つの符号データの各イベントデータに対して互いに異なるチャンネル番号を付与しながら、前記時刻が早い順にソートして、２つのチャンネル番号を有する１つの時系列な符号データに統合し、２チャンネル符号データを作成する符号データ統合手段と、
発音開始のイベントデータと、当該イベントデータと同一の音の高さをもつ発音終了のイベントデータとの２つのイベントデータの対で構成される区間を発音区間としたとき、前記２チャンネル符号データの中で、一方のチャンネルの発音区間が、同一の音の高さをもつ他方のチャンネルの発音区間と時間的に全てまたは一部が重複する場合に、両発音区間が重複する区間を、両発音区間の音の強さの差分値を新たな音の強さとする新たな発音区間を重複区間として生成し、前記重複する両発音区間のうち、一方のチャンネルにのみノートオン区間が存在する区間については、当該一方のチャンネルの音の強さを有する発音区間を生成する重複発音区間差分処理手段と、
前記重複発音区間差分処理手段にて更新された発音区間の各々の発音開始のイベントデータと発音終了のイベントデータを時系列にソートし、所定の形式で符号化する差分符号データ符号化手段と、
を有することを特徴とする差分符号データの作成装置。
【請求項９】
請求項８において、
前記重複発音区間差分処理手段は、前記重複区間の音の強さが０の場合、前記音の強さを０以外の１〜１２７の範囲で小さな値に変更することを特徴とする差分符号データの作成装置。
【請求項１０】
請求項８において、
前記重複発音区間差分処理手段は、前記重複区間の音の強さが０の場合、前記重複区間を符号化対象から削除することを特徴とする差分符号データの作成装置。
【請求項１１】
請求項８から請求項１０のいずれかにおいて、
前記符号データ統合手段は、前記２つの符号データのいずれか一方の全ての発音開始、発音終了のイベントデータの時刻に対して複数通りのオフセット値を一律に加えるようにし、
前記複数通りのオフセット値に基づいて、前記差分符号データ符号化手段までを複数回実行して複数通りの差分符号データを符号化するようにし、
前記差分符号データ符号化手段にて符号化された複数通りの各差分符号データに対して、発音開始のイベントデータとそれに対応する同一の音の高さをもつ発音終了の２つのイベントデータの対で構成される発音区間を抽出し、前記抽出された全ての発音区間の音の強さと発音区間の時間間隔（発音終了のイベントデータの時刻と発音開始のイベントデータの時刻との差）との積の総和値を算出し、前記総和値が最小となる差分符号データを選別する差分符号データ選別手段を、さらに有することを特徴とする差分符号データの作成装置。
【請求項１２】
請求項８から請求項１１のいずれかにおいて、
前記差分符号データ符号化手段は、前記重複発音区間差分処理手段により得られた発音区間として、発音開始と発音終了の時刻が同一のものがある場合に、当該発音区間を構成するイベントデータを削除する処理をさらに行うことを特徴とする差分符号データの作成装置。
【請求項１３】
請求項８から請求項１２のいずれかにおいて、
前記差分符号データ符号化手段により得られた差分符号データを画面表示する表示手段、および／または前記差分符号データを音響再生する音響再生手段をさらに有することを特徴とする差分符号データの作成装置。
【請求項１４】
請求項８から請求項１３のいずれかにおいて、
前記符号データは、ＭＩＤＩデータであり、前記発音開始の識別はノートオン、前記発音終了の識別はノートオフ、前記時刻はデルタタイム、前記音の高さはノートナンバー、前記音の強さはベロシティ、前記発音区間はノートオン区間で表現されることを特徴とする差分符号データの作成装置。
【請求項１５】
請求項１から請求項７のいずれかに記載の差分符号データの作成方法をコンピュータに実行させるためのプログラム。
【請求項１６】
請求項８から請求項１４のいずれかに記載の差分符号データの作成装置としてコンピュータを機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、音響信号を符号化して得られるＭＩＤＩ形式等の符号データの作成に関し、特に、２つの音響信号を比較する用途に好適な差分符号データの作成技術に関する。
【背景技術】
【０００２】
従来、楽曲や音声を記録した音響信号をＭＩＤＩ等の形式に符号化したり、音響信号に電子透かし埋め込みを行ったりという加工を行った場合には、原音との比較評価が行われている。音響信号の場合、画像のように複数を同時に提示したり、重ねて提示したりすることが困難であるため、時間差を置いた比較評価が行われる。時間差を置いた比較評価の場合、人間は、直前に聞いた音脈を記憶してしまうため、提示する順序に依存して評価結果が変わってしまい、同時刻で同一環境条件で評価することが難しかった。
【０００３】
そこで、２つの波形形式の音響信号の差分波形を作成して波形的に両者の相違を評価する手法が考えられる。また、出願人は、ＭＩＤＩ符号化された復号信号と原音との比較を定量化するため、積算スペクトルデータとエンベロープデータを作成して比較する技術を提案している（特許文献１参照）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００２−３７２９６８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、差分波形を作成する手法では、互いに位相が変化してしまうと、本来実質的に差がないのに、非常に振幅の大きい差分波形になってしまう。例えば、２つの波形が本来同一波形であっても、位相が互いに１８０度反転している場合、差分波形は原信号の２倍の振幅になってしまう。逆に、高周波領域の信号成分が大きく異なっている場合、差分波形上は顕著な差が発生しないことがあり、差分波形上の視覚上の差と各々を再生して比較する聴覚上の差との間に矛盾が生じることがある。また、特許文献１に記載の技術では、視覚的に提示することだけを目的としているため、聴覚的に評価することは困難である。
【０００６】
そこで、本発明は、符号化された２種の音響信号を視覚的かつ聴覚的に評価することができる差分符号データを得ることが可能な差分符号データの作成方法および装置を提供することを課題とする。
【課題を解決するための手段】
【０００７】
上記課題を解決するため、本発明第１の態様では、音響信号を符号化して得られた２つの独立した符号データに対して両者の差分を表す１つの差分符号データを作成するにあたり、前記符号データは時系列に配置されたイベントデータで構成され、各イベントデータには、発音開始または発音終了のイベントの識別、当該イベントの時刻、音の高さ、チャンネル番号、音の強さの属性情報を備え、前記２つの符号データの各イベントデータに対して互いに異なるチャンネル番号を付与しながら、前記時刻が早い順にソートして、２つのチャンネル番号を有する１つの時系列な符号データに統合し、２チャンネル符号データを作成し、発音開始のイベントデータ、当該イベントデータと同一の音の高さをもつ発音終了のイベントデータとの２つのイベントデータの対で構成される区間を発音区間としたとき、前記２チャンネル符号データの中で、一方のチャンネルの発音区間が、同一の音の高さをもつ他方のチャンネルの発音区間と時間的に全てまたは一部が重複する場合に、両発音区間が重複する区間を、両発音区間の音の強さの差分値を新たな音の強さとする新たな発音区間を重複区間として生成し、前記重複する両発音区間のうち、一方のチャンネルにのみノートオン区間が存在する区間については、当該一方のチャンネルの音の強さを有する発音区間を生成し、前記更新された発音区間の各々の発音開始のイベントデータと発音終了のイベントデータを時系列にソートし、所定の形式で符号化するようにしたことを特徴とする。
【０００８】
本発明第１の態様によれば、２つの符号データを１つの２チャンネル符号データに統合し、２つのチャンネルで発音時間が重複する同一ノートナンバーの発音区間を重複区間と非重複区間に分割し、重複区間のベロシティを差分値に更新し、各発音区間を特定するノートオンのイベントデータとノートオフのイベントデータを時系列にソートし、差分符号データとして符号化するようにしたので、符号化された２種の音響信号を視覚的かつ聴覚的に評価することができる差分符号データを得ることが可能となる。
【０００９】
また、本発明第２の態様では、本発明第１の態様において、前記重複発音区間の差分演算をする際、前記重複区間の音の強さが０の場合、前記音の強さを０以外の１〜１２７の範囲で小さな値に変更することを特徴とする。
【００１０】
また、本発明第３の態様では、本発明第１の態様において、前記重複発音区間の差分演算をする際、前記重複区間の音の強さが０の場合、前記重複区間を符号化対象から削除することを特徴とする。
【００１１】
本発明第２、第３の態様によれば、音の強さとして最終的に０が与えられることがなくなり、差分演算前から０であった区間と区別することが可能となる。
【００１２】
また、本発明第４の態様では、本発明第１から第３のいずれかの態様において、  前記符号データの統合は、前記２つの符号データのいずれか一方の全ての発音開始、発音終了のイベントデータの時刻に対して複数通りのオフセット値を一律に加えるようにし、前記複数通りのオフセット値に基づいて、前記差分符号データ符号化段階までを複数回実行して複数通りの差分符号データを符号化するようにし、前記差分符号データの符号化にて符号化された複数通りの各差分符号データに対して、発音開始のイベントデータとそれに対応する同一の音の高さをもつ発音終了の２つのイベントデータの対で構成される発音区間を抽出し、前記抽出された全ての発音区間の音の強さと発音区間の時間間隔（発音終了のイベントデータの時刻と発音開始のイベントデータの時刻との差）との積の総和値を算出し、前記総和値が最小となる差分符号データを選別するようにしたことを特徴とする。
【００１３】
本発明第４の態様によれば、オフセット値を変化させて発音開始、発音終了のイベントデータの時刻に追加し、オフセット値の変化に応じて複数通りの差分符号データを作成し、発音区間の音の強さと発音区間の時間間隔との積の総和値が最小となる差分符号データを選別するようにしたので、位相を考慮し、時間軸方向の位置ずれを補正した差分符号データの作成が可能となる。
【００１４】
また、本発明第５の態様では、本発明第１から第４のいずれかの態様において、前記差分符号データの符号化は、前記重複発音区間の差分処理により得られた発音区間として、発音開始と発音終了の時刻が同一のものがある場合に、当該発音区間を構成するイベントデータを削除する処理をさらに行うことを特徴とする。
【００１５】
本発明第５の態様によれば、重複発音区間の差分処理後に、発音開始と発音終了の時刻が同一のものがある場合に、発音区間を構成するイベントデータを削除するようにしたので、誤作動を生ずるようなイベントの発生を防ぐことが可能となる。
【００１６】
また、本発明第６の態様では、本発明第１から第５のいずれかの態様において、前記差分符号データの符号化により得られた差分符号データを表示手段に画面表示、および／または前記差分符号データを音響再生手段により音響再生することを特徴とする。
【００１７】
本発明第６の態様によれば、差分符号データを表示手段に画面表示、および／または差分符号データを音響再生手段により音響再生するようにしたので、２種の音響信号を視覚的かつ聴覚的に評価することが可能となる。
【発明の効果】
【００１８】
本発明によれば、符号化された２種の音響信号を視覚的かつ聴覚的に評価することができる差分符号データを得ることが可能となるという効果を有する。
【図面の簡単な説明】
【００１９】
【図１】本発明に係る差分符号データ作成装置の一実施形態を示す機能ブロック図である。
【図２】本実施形態に係る差分符号データの作成方法の概要を示すフローチャートである。
【図３】ＭＩＤＩデータ統合処理の詳細を示すフローチャートである。
【図４】重複ノートオン区間差分処理の概要を説明するための図である。
【図５】重複ノートオン区間差分処理の詳細を示すフローチャートである。
【図６】チャンネル０に対する重複ノートオン区間差分処理の詳細を示すフローチャートである。
【図７】０デュレーションイベント削除処理の詳細を示すフローチャートである。
【図８】差分処理時の位相ずれの様子を示す図である。
【発明を実施するための形態】
【００２０】
＜装置構成＞
以下、本発明の好適な実施形態について、図面を参照して詳細に説明する。図１は、本発明に係る差分符号データ作成装置の一実施形態を示す機能ブロック図である。本実施形態における差分符号データ作成装置は、図１に示すように、データ入力部１１、演算処理部１２、表示部１３、音響出力部１４、データ出力部１５を有すると共に、図示しないハードディスク等の記憶装置、指示入力を行うキーボード、マウス等の入力機器等を有しており、入出力機器が接続された汎用のコンピュータに専用のプログラムを組み込むことにより実現される。
【００２１】
図１において、データ入力部１１は、ＭＩＤＩデータ等の符号データを入力するためのものである。演算処理部１２は、ＣＰＵ、メモリを有し、記憶装置から専用のプログラムをメモリ上に読み込んで実行し、本発明の差分符号データ作成装置の主要な機能を実現するものである。表示部１３は、液晶ディスプレイ等の表示装置により実現され、演算処理部１２により作成された差分符号データを表示する。音響出力部１４は、アンプおよびスピーカにより実現され、演算処理部１２により作成された差分符号データを音響出力する。データ出力部１５は、ＭＩＤＩデータ等の符号データをデータ形式で出力するためのものである。
【００２２】
＜処理概要＞
図２は、本実施形態に係る差分符号データの作成方法の概要を示すフローチャートである。本実施形態に係る差分符号データの作成方法は、図２に示した各ステップ（各段階）の詳細な手順を記録したプログラムを、図１に示した差分符号データ作成装置が実行することにより行われる。
【００２３】
本発明で用いる符号データとしては、各音を、その音の強度、高さ、時間情報で表現した形式のものであれば、どのようなものであっても良い。時間情報に関しては、開始時刻と終了時刻で特定する形式であっても、開始時刻と発音時間で特定する形式であっても、何らかの手法により開始時刻、終了時刻、発音時間が特定できるものであれば良い。本実施形態では、符号データとして、発音開始時にノートオン、発音終了時にノートオフのイベントデータを設定し、音の強さとしてベロシティ、音の高さとしてノートナンバーを設定したＭＩＤＩを採用している。したがって、以下においても、ＭＩＤＩデータを例にとって説明していく。
【００２４】
差分符号データの作成方法としては、まず、コンピュータ本体である演算処理部１２が、２つのＭＩＤＩデータをデータ入力部１１から読み込む。ここでは、２つのＭＩＤＩデータＭ１、Ｍ２を読み込むものとする。２つのＭＩＤＩデータＭ１、Ｍ２を読み込んだら、演算処理部１２は、読み込んだ２つのＭＩＤＩデータＭ１、Ｍ２を、１つの時系列な２チャンネルＭＩＤＩデータに統合する（Ｓ１）。
【００２５】
統合に際して、演算処理部１２は、読み込んだ２つのＭＩＤＩデータＭ１、Ｍ２それぞれのＭＩＤＩイベント配列を、Ｅｖｅｎｔ１[]、Ｅｖｅｎｔ２[]とする。２つのＭＩＤＩイベント配列の総ノートイベント数は各々Ｎｅ１、Ｎｅ２とし、各イベント配列には属性として［ｔｉｍｅ，ｃｈａｎｎｎｅｌ，ｎｏｔｅ−ｎｕｍｂｅｒ，ｖｅｌｏｃｉｔｙ］の４つの値をもつものとする。ｔｉｍｅにはノートイベントの絶対値を与え、デルタタイムという相対時刻で指示される値を先頭時刻からの累積値に変換する。絶対時刻の単位は、デルタタイムと同様にユーザ指定の整数値である。ｃｈａｎｎｎｅｌはＭＩＤＩ規格上０〜１５の値をとり得るが、Ｅｖｅｎｔ１[]は０、Ｅｖｅｎｔ２[]は１とする。ｎｏｔｅ−ｎｕｍｂｅｒとｖｅｌｏｃｉｔｙは０〜１２７の値をとり、ノートオンの場合は、ｖｅｌｏｃｉｔｙとして１以上の値を与え、ノートオフの場合は、ｖｅｌｏｃｉｔｙとして０を与える。
【００２６】
そして、統合先とする配列ＥｖｅｎｔＷ[]を用意する。さらに、Ｅｖｅｎｔ１[]、Ｅｖｅｎｔ２[]、ＥｖｅｎｔＷ[]へのポインタをｐ１、ｐ２、ｐｗとし、初期状態ではｐ１＝ｐ２＝ｐｗ＝０と設定する。ＥｖｅｎｔＷ[]の総ノートイベント数をＮｗとすると、Ｎｗ＝Ｎｅ１＋Ｎｅ２となる。また、位相合わせのため、Ｅｖｅｎｔ１[]、Ｅｖｅｎｔ２[]のｔｉｍｅにｏｆｆｓｅｔ１[ｈ]、ｏｆｆｓｅｔ２[ｈ]を加え、ｈの初期値を０とする。例えば前記２つのＭＩＤＩデータが２つの音響信号に対して最小フレーム間隔が６４（６４／１５３６ｓｅｃ）で周波数解析が行われ各々ＭＩＤＩデータに変換されている場合、Ｈ＝１２通りで、−５１２／１５３６〜＋５１２／１５３６ｓｅｃの範囲で位相ずれ補正を行うとして、ｏｆｆｓｅｔ１[ｈ]＝｛０，０，０，０，０，０，０，６４，１２８，３８４，４４８，５１２｝、ｏｆｆｓｅｔ２[ｈ] ＝｛０，６４，１２８，３８４，４４８，５１２，０，０，０，０，０，０｝が用意される。なお、後述するように、本発明では、位相補正を行わないようにすることも可能であるが、その場合は、Ｈ＝１、ｏｆｆｓｅｔ１[ｈ]＝０、ｏｆｆｓｅｔ２[ｈ] ＝０にセットする。
【００２７】
＜ＭＩＤＩデータ統合＞
配列の準備ができたら、演算処理部１２はＭＩＤＩデータ統合処理を開始する。  Ｓ１におけるＭＩＤＩデータ統合処理の詳細を図３のフローチャートを用いて説明する。まず、演算処理部１２は、ポインタｐ２が総ノートイベント数Ｎｅ２より小さいかどうかを判断する（Ｓ１０１）。後述するように、ｐ２は配列Ｅｖｅｎｔ２[]内のノートイベントが処理される度に１加算されるため、ｐ２がＮｅ２より小さいことは未処理のノートイベントが配列Ｅｖｅｎｔ２[]内に残っていることを意味する。すなわち、Ｓ１０１では、配列Ｅｖｅｎｔ２[]内のノートイベントの処理を終えたかどうかを判断している。
【００２８】
ポインタｐ２が総ノートイベント数Ｎｅ２より小さい場合は、Ｅｖｅｎｔ２[]．ｔｉｍｅがＥｖｅｎｔ１[]．ｔｉｍｅより小さいかどうかを判断する（Ｓ１０２）。これは、ポインタｐ２で特定されるＥｖｅｎｔ２[]内のノートイベントの絶対時刻がポインタｐ１で特定されるＥｖｅｎｔ１[]内のノートイベントの絶対時刻よりも早いかどうかを判断している。そして、Ｅｖｅｎｔ２[]．ｔｉｍｅがＥｖｅｎｔ１[]．ｔｉｍｅより小さい場合は、Ｅｖｅｎｔ２[]についての処理を行い（Ｓ１０３）、Ｅｖｅｎｔ２[]．ｔｉｍｅがＥｖｅｎｔ１[]．ｔｉｍｅ以上の場合は、Ｅｖｅｎｔ１[]についての処理を行う（Ｓ１０５）。なお、Ｓ１０１において、ポインタｐ２が総ノートイベント数Ｎｅ２以上である場合は、配列Ｅｖｅｎｔ２[]内のノートイベントの処理を全て終えたことを意味するので、この場合にも、Ｓ１０５に進んで、Ｅｖｅｎｔ１[]についての処理を行う。
【００２９】
Ｓ１０３のＥｖｅｎｔ２[]についての処理では、演算処理部１２は、以下の〔数式１〕に従った処理を実行する。
【００３０】
〔数式１〕
ＥｖｅｎｔＷ[ｐｗ]．ｔｉｍｅ←Ｅｖｅｎｔ２[ｐ２]．ｔｉｍｅ＋ｏｆｆｓｅｔ２[ｈ]
ＥｖｅｎｔＷ[ｐｗ]．ｃｈａｎｎｅｌ←１
ＥｖｅｎｔＷ[ｐｗ]．ｎｏｔｅ−ｎｕｍｂｅｒ←Ｅｖｅｎｔ２[ｐ２]．ｎｏｔｅ−ｎｕｍｂｅｒ
ＥｖｅｎｔＷ[ｐｗ]．ｖｅｌｏｃｉｔｙ←Ｅｖｅｎｔ２[ｐ２]．ｖｅｌｏｃｉｔｙ
ｐｗ←ｐｗ＋１
ｐ２←ｐ２＋１
【００３１】
上記〔数式１〕の６つの式のうち、第１式、第３式、第４式では、Ｅｖｅｎｔ２[ｐ２]のノートイベントのｔｉｍｅ、ｎｏｔｅ−ｎｕｍｂｅｒ、ｖｅｌｏｃｉｔｙをＥｖｅｎｔＷ[ｐｗ]のノートイベントのｔｉｍｅ、ｎｏｔｅ−ｎｕｍｂｅｒ、ｖｅｌｏｃｉｔｙとして与えている。また、第２式では、ＥｖｅｎｔＷ[ｐｗ]のノートイベントのｃｈａｎｎｅｌを１に設定している。この４つの式により、ＭＩＤＩデータＭ２に存在していたノートイベントが、統合ＭＩＤＩデータのチャンネル１のノートイベントとして移行されたことになる。第５式、第６式は、ポインタの加算である。
【００３２】
Ｓ１０５のＥｖｅｎｔ１[]についての処理では、演算処理部１２は、以下の〔数式２〕に従った処理を実行する。
【００３３】
〔数式２〕
ＥｖｅｎｔＷ[ｐｗ]．ｔｉｍｅ←Ｅｖｅｎｔ１[ｐ１]．ｔｉｍｅ＋ｏｆｆｓｅｔ１[ｈ]
ＥｖｅｎｔＷ[ｐｗ]．ｃｈａｎｎｅｌ←０
ＥｖｅｎｔＷ[ｐｗ]．ｎｏｔｅ−ｎｕｍｂｅｒ←Ｅｖｅｎｔ１[ｐ１]．ｎｏｔｅ−ｎｕｍｂｅｒ
ＥｖｅｎｔＷ[ｐｗ]．ｖｅｌｏｃｉｔｙ←Ｅｖｅｎｔ１[ｐ１]．ｖｅｌｏｃｉｔｙ
ｐｗ←ｐｗ＋１
ｐ１←ｐ１＋１
【００３４】
上記〔数式２〕は、上記〔数式１〕におけるｐ２の代わりにｐ１が用いられており、ｃｈａｎｎｅｌが０に設定されている。上記〔数式２〕では、第１式〜第４式により、ＭＩＤＩデータＭ１に存在していたノートイベントが、統合ＭＩＤＩデータのチャンネル０のノートイベントとして移行されたことになる。第５式、第６式は、ポインタの加算である。
【００３５】
Ｓ１０５におけるＥｖｅｎｔ１[]についての処理後は、ポインタｐ１が総ノートイベント数Ｎｅ１より小さいかどうかを判断する（Ｓ１０６）。判断の結果、ポインタｐ１が総ノートイベント数Ｎｅ１より小さい場合は、Ｓ１０１に戻る。逆に、ポインタｐ１が総ノートイベント数Ｎｅ１以上の場合は、配列Ｅｖｅｎｔ１[]内のノートイベントの処理を全て終えたことを意味するので、Ｓ１０３に進んで、Ｅｖｅｎｔ２[]についての処理を行う。
【００３６】
Ｓ１０３におけるＥｖｅｎｔ２[]についての処理後は、ポインタｐ２が総ノートイベント数Ｎｅ２より小さいかどうかを判断する（Ｓ１０４）。判断の結果、ポインタｐ２が総ノートイベント数Ｎｅ２より小さい場合は、Ｓ１０３に戻って、Ｅｖｅｎｔ２[]についての処理を行う。逆に、ポインタｐ２が総ノートイベント数Ｎｅ２以上の場合は、配列Ｅｖｅｎｔ２[]内のノートイベントの処理を全て終えたことを意味するので、統合処理を終了する。
【００３７】
＜重複ノートオン区間差分処理＞
統合処理が終了したら、演算処理部１２は、重複ノートオン区間差分処理を実行する（図２のＳ２）。ノートオン区間（発音区間）とは、ノートオンのイベントデータとそれに対応する同一ノートナンバーをもつノートオフの２つのイベントデータの対で構成される区間である。また、重複ノートオン区間とは、他方のチャンネルのノートオン区間と時間的に全てまたは一部が重複するノートオン区間である。上記Ｓ１の統合処理の結果、ＥｖｅｎｔＷ[]は、２チャンネルのＭＩＤＩイベントで構成されることになり、これに対して、単一チャンネルのＭＩＤＩイベント配列ＥｖｅｎｔＳ[]に変換する処理を行う。ただし、ＥｖｅｎｔＷ[]は、同一時間に同一ノートナンバーのノートオン区間が重複してしまう可能性がある。重複ノートオン区間差分処理では、ノートオン区間が重複する部分について強度値（ベロシティ）の差分演算を行い、１つのチャンネルに統一することにより、単一チャンネルのＭＩＤＩイベント配列ＥｖｅｎｔＳ[]に変換する。
【００３８】
ここで、重複ノートオン区間差分処理の概要を図４を用いて説明する。図４（ａ）は２つのＭＩＤＩデータ統合後の１つの２チャンネルＭＩＤＩデータを示し、図４（ｂ）は重複ノートオン区間差分処理後の１チャンネルＭＩＤＩデータを示している。説明の便宜上、図４においては、１つのノートナンバーについてだけ示している。また、各矩形は、左端がノートオンイベントの時刻、右端がノートオフイベントの時刻であり、左右方向の幅がノートオン区間を示している。また、各矩形の上下方向がベロシティを示している。図４（ａ）の例では、全てのノートオン区間が他方のチャンネルのノートオン区間と時間的に全てまたは一部が重複しているため、全てが重複ノートオン区間である。また、ノートオン区間０２のように、その一部が他方のチャンネルのノートオン区間１２と重複している場合は、重複している区間を重複区間、重複していない区間を非重複区間と呼ぶことにする。
【００３９】
図４（ａ）の例では、チャンネル０(図中、ｃｈ：０で示す。)のノートオン区間０１とチャンネル１(図中、ｃｈ：１で示す。)のノートオン区間１１が重複しているため、差分演算処理が行われ、図４（ｂ）に示すように、チャンネル０に新ノートオン区間が得られる。新ノートオン区間のベロシティは、ノートオン区間０１のベロシティとノートオン区間１１のベロシティの差分となる。ノートオン区間０１とノートオン区間１１は、ノートオンイベントの時刻、ノートオフイベントの時刻が同一であり、ノートオン区間が完全に重複しているため、差分演算処理後の新ノートオン区間のノートオンイベントの時刻、ノートオフイベントの時刻は、ノートオン区間０１、ノートオン区間１１と同一となる。
【００４０】
ノートオン区間０２とノートオン区間１２のように一部が重複している場合、重複している一部についてだけ、差分演算処理が行われる。ノートオン区間０２とノートオン区間１２のベロシティは同じであるので、ノートオン区間０２とノートオン区間１２が重複している区間については、ノートオン区間が存在しなくなる。また、ノートオン区間０２には、チャンネル１のノートオン区間と重複していない部分があるので、重複していない部分については、チャンネル０に新ノートオン区間が得られる。新ノートオン区間のベロシティは、ノートオン区間０２のベロシティがそのまま与えられる。また、新ノートオン区間のノートオン時刻は、ノートオン区間１２のノートオフ時刻が与えられ、新ノートオン区間のノートオフ時刻は、ノートオン区間０２のノートオフ時刻がそのまま与えられる。
【００４１】
重複ノートオン区間差分処理に際して、演算処理部１２は、ＥｖｅｎｔＷ[]、ＥｖｅｎｔＳ[]の各配列へのポインタをｐｗ、ｐｓとし、初期状態ではｐｗ＝ｐｓ＝０に設定する。また、ＥｖｅｎｔＳ[]のＣｈａｎｎｅｌ値は全て０に設定する。さらに、演算処理部１２は、０〜１２７のノートナンバーに対応してノートオン時にＭＩＤＩイベント配列へのポインタを格納するノートオンテーブルをＥｖｅｎｔＷ[]のチャンネル０とチャンネル１に対応してｔａｂｌｅＷ０[]、ｔａｂｌｅＷ１[]を定義し、ＥｖｅｎｔＳ[]に対応してｔａｂｌｅＳ[]を定義する。そして、ｔａｂｌｅＷ０[]、ｔａｂｌｅＷ１[]、ｔａｂｌｅＳ[]の全ての初期値を−１に設定する。また、生成されるＭＩＤＩイベント配列ＥｖｅｎｔＳ[]の総ノートイベント数をＮｓとする。
【００４２】
配列の準備ができたら、演算処理部１２は、重複ノートオン区間差分処理を開始する。この重複ノートオン区間差分処理の詳細を図５のフローチャートを用いて説明する。まず、演算処理部１２は、ポインタｐｗを特定した後、以下の〔数式３〕に従った処理を実行し、処理対象のノートナンバーｎｎ、ベロシティをｖｅｌを決定する。
【００４３】
〔数式３〕
ｎｎ←ＥｖｅｎｔＷ[ｐｗ]．ｎｏｔｅ−ｎｕｍｂｅｒ
ｖｅｌ←ＥｖｅｎｔＷ[ｐｗ]．ｖｅｌｏｃｉｔｙ
【００４４】
そして、ＥｖｅｎｔＷ[ｐｗ]．ｃｈａｎｎｅｌが０か１かを判断する（Ｓ２０１）。ＥｖｅｎｔＷ[ｐｗ]．ｃｈａｎｎｅｌが１の場合、Ｓ２０２〜Ｓ２０７においてチャンネル１についての処理を行い、ＥｖｅｎｔＷ[ｐｗ]．ｃｈａｎｎｅｌが０の場合、Ｓ２０８〜Ｓ２１３においてチャンネル０についての処理を行う。
【００４５】
ＥｖｅｎｔＷ[ｐｗ]．ｃｈａｎｎｅｌが１の場合、まず、ｔａｂｌｅＷ０[ｎｎ]が０以上であるかどうかの判断を行う（Ｓ２０２）。すなわち、チャンネル０に同一ノートナンバーのノートオンになっているイベントが存在するかどうかの判断を行う。ｔａｂｌｅＷ０[ｎｎ]が０以上である場合は、同一ノートナンバーのノートオンイベントが少なくともチャンネル０側に存在していることになるので、時間的に重複する部分が存在する場合は、強制的にノートオフイベントを発行してノートオン区間を中断させる処理を行う（Ｓ２０３）。
【００４６】
具体的には、ｔａｂｌｅＳ[ｎｎ]が０以上であるかどうかを判断し、ｔａｂｌｅＳ[ｎｎ]が０以上である場合は、演算処理部１２は、以下の〔数式４〕に従った処理を実行する。
【００４７】
〔数式４〕
ＥｖｅｎｔＳ[ｐｓ]．ｔｉｍｅ←ＥｖｅｎｔＷ[ｐｗ]．ｔｉｍｅ
ＥｖｅｎｔＳ[ｐｓ]．ｃｈａｎｎｅｌ←０
ＥｖｅｎｔＳ[ｐｓ]．ｎｏｔｅ−ｎｕｍｂｅｒ←ｎｎ
ＥｖｅｎｔＳ[ｐｓ]．ｖｅｌｏｃｉｔｙ←０
ｔａｂｌｅＳ[ｎｎ]←−１
ｐｓ←ｐｓ＋１
【００４８】
上記〔数式４〕の６つの式のうち、第１式、第３式では、ＥｖｅｎｔＷ[ｐｗ]のノートイベントのｔｉｍｅ、ｎｏｔｅ−ｎｕｍｂｅｒをＥｖｅｎｔＳ[ｐｓ]のノートイベントのｔｉｍｅ、ｎｏｔｅ−ｎｕｍｂｅｒとして与えている。第２式では、ＥｖｅｎｔＳ[ｐｓ]のノートイベントのｃｈａｎｎｅｌを０に設定している。ＥｖｅｎｔＳ[]内のノートイベントは１つのチャンネルに納められるため、全てチャンネル０に設定される。第４式では、ＥｖｅｎｔＳ[ｐｓ]のノートイベントのｖｅｌｏｃｉｔｙを０に設定している。これは、ノートオフイベントであることを示すものである。この４つの式により、ＥｖｅｎｔＳ[]内に強制的にノートオフが設定される。これにより、概念上は、他方のチャンネルの同一ナンバーのノートオン区間が、他方のチャンネルの同一ノートナンバーのノートオンまたはノートオフイベントにより重複区間と非重複区間とに分割されることになる。（この段階では、２つのチャンネルが当該ノートナンバーで時間的にどのように重複するかがわからない）。第５式は、ノートナンバーｎｎについてのノートオン区間が終了したことを示すための処理である。第６式は、ポインタの加算である。
【００４９】
〔数式４〕に従った処理を実行したら、演算処理部１２は、ｖｅｌが０より大きいかどうかを判断する（Ｓ２０４）。なお、Ｓ２０３において、ｔａｂｌｅＳ[ｎｎ]が０より小さい場合は、〔数式４〕に従った処理を実行せずにＳ２０４に進む。Ｓ２０４において、ｖｅｌが０より大きいと判断された場合には、２つのチャンネルが当該ノートイベントを起点に時間的に重複すると判断され、演算処理部１２は、以下の〔数式５〕に従った処理を実行する（Ｓ２０５）。
【００５０】
〔数式５〕
ｖｅｌ←｜ｖｅｌ−ＥｖｅｎｔＷ［ｔａｂｌｅＷ０［ｎｎ］］．ｖｅｌｏｃｉｔｙ｜
ｔａｂｌｅＷ１［ｎｎ］←ｐｗ
【００５１】
上記〔数式５〕の２つの式のうち、第１式では、チャンネル０の同一ノートナンバーのノートイベントとのベロシティの差分を演算し、その差分をｖｅｌとしている。この第１式により重複区間の差分演算処理が行われたことになる。なお、この結果である差分ｖｅｌが０の場合は、ｖｅｌ←１とする処理を行う。第２式は、処理したノートナンバーがノートオン区間に入り、何番目のノートイベントでオンになったかを特定する処理である。
【００５２】
Ｓ２０４において、ｖｅｌ＝０であると判断された場合には、２つのチャンネルで時間的に重複していた区間が終了すると判断され、演算処理部１２は、以下の〔数式６〕に従った処理を実行する（Ｓ２０６）。
【００５３】
〔数式６〕
ｖｅｌ←ＥｖｅｎｔＷ［ｔａｂｌｅＷ０［ｎｎ］］．ｖｅｌｏｃｉｔｙ
ｔａｂｌｅＷ１［ｎｎ］←−１
【００５４】
Ｓ２０４においてｖｅｌ＝０と判断された場合、チャンネル１のノートイベントは、既にノートオン状態になっていて本イベントでノートオフになったと考えられるため、上記〔数式６〕の第１式では、チャンネル０のノートイベントのベロシティをｖｅｌに与える。第２式は、チャンネル１におけるノートナンバーｎｎについてノートオン区間が終了したことを示すための処理である。
【００５５】
一方、Ｓ２０２において、ｔａｂｌｅＷ０[ｎｎ]が０より小さい場合は、同一ノートナンバーでチャンネル０側はノートオン状態ではなくチャンネル１側がノートオンになってもノートオフになっても、重複処理を行う必要がないため、ｔａｂｌｅＷ１[ｎｎ]の処理に進む（Ｓ２０７）。Ｓ２０７では、ｖｅｌ＞０でノートオンの場合、演算処理部１２は、ｔａｂｌｅＷ１[ｎｎ]←ｐｗとし、ｖｅｌ＝０でノートオフの場合、ｔａｂｌｅＷ１[ｎｎ]←−１とする処理を実行する。
【００５６】
上記Ｓ２０２〜Ｓ２０７の処理は、Ｓ２０１においてＥｖｅｎｔＷ[ｐｗ]．ｃｈａｎｎｅｌが１であると判断された場合のチャンネル１に対する処理であるが、上述のように、Ｓ２０１においてＥｖｅｎｔＷ[ｐｗ]．ｃｈａｎｎｅｌが０であると判断された場合は、Ｓ２０８〜Ｓ２１３においてチャンネル０についての処理を行う。ここで、チャンネル０に対する処理のフローチャートを図６に示す。Ｓ２０８〜Ｓ２１３における処理は、処理対象のチャンネルが異なるだけであり、基本的にはＳ２０２〜Ｓ２０７における処理と同一である。
【００５７】
まず、Ｓ２０８においては、ｔａｂｌｅＷ１[ｎｎ]が０以上であるかどうかの判断を行う（Ｓ２０２）。すなわち、チャンネル１に同一ノートナンバーのノートがオンになっているかの判断を行う。ｔａｂｌｅＷ１[ｎｎ]が０以上である場合は、少なくとも同一ノートナンバーでオンになっているノートがチャンネル１側に存在していることになるので、時間的に重複する部分が存在する場合は、その処理を行う（Ｓ２０９）。
【００５８】
具体的には、ｔａｂｌｅＳ[ｎｎ]が０以上であるかどうかを判断し、ｔａｂｌｅＳ[ｎｎ]が０以上である場合は、ノートオン区間になっているため、演算処理部１２は、上記〔数式４〕に従った処理を実行しノートオン区間を強制的に終了する。
【００５９】
〔数式４〕に従った処理を実行したら、演算処理部１２は、ｖｅｌが０より大きいかどうかを判断する（Ｓ２１０）。なお、Ｓ２０９において、ｔａｂｌｅＳ[ｎｎ]が０より小さい場合は、〔数式４〕に従った処理を実行せずにＳ２１０に進む。Ｓ２１０において、ｖｅｌが０より大きいと判断された場合には、同一ノートナンバーのノートイベントが重複してノートオンになるため、演算処理部１２は、以下の〔数式７〕に従った処理を実行する（Ｓ２１１）。
【００６０】
〔数式７〕
ｖｅｌ←｜ｖｅｌ−ＥｖｅｎｔＷ［ｔａｂｌｅＷ１［ｎｎ］］．ｖｅｌｏｃｉｔｙ｜
ｔａｂｌｅＷ０［ｎｎ］←ｐｗ
【００６１】
上記〔数式７〕は、上記〔数式５〕におけるｔａｂｌｅＷ１とｔａｂｌｅＷ０が置き換えられたものである。２つの式のうち、第１式では、チャンネル１の同一ノートナンバーのノートイベントとのベロシティの差分を演算し、その差分をｖｅｌとしている。この第１式により重複区間の差分演算処理が行われたことになる。なお、この結果である差分ｖｅｌが０の場合は、ｖｅｌ←−１とする処理を行う。以降の処理では、ｖｅｌ＝０の場合はノートオフとして扱い、それ以外の場合は、ｖｅｌ＝−１のような負値も含めノートオンとして扱う。第２式は、チャンネル０でノートオンになったノートナンバーが何番目のノートイベントであるかを特定する処理である。
【００６２】
Ｓ２１０において、ｖｅｌ＝０であると判断された場合には、演算処理部１２は、以下の〔数式８〕に従った処理を実行する（Ｓ２１２）。
【００６３】
〔数式８〕
ｖｅｌ←ＥｖｅｎｔＷ［ｔａｂｌｅＷ１［ｎｎ］］．ｖｅｌｏｃｉｔｙ
ｔａｂｌｅＷ０［ｎｎ］←−１
【００６４】
上記〔数式８〕は、上記〔数式６〕におけるｔａｂｌｅＷ１とｔａｂｌｅＷ０が置き換えられたものである。Ｓ２１０においてｖｅｌ＝０と判断された場合、チャンネル０のノートイベントは、ノートオフイベントであったと考えられるため、上記〔数式８〕の第１式では、チャンネル１のノートイベントのベロシティをそのままｖｅｌに与える。第２式は、チャンネル０におけるノートナンバーｎｎについてノートオン区間が終了したことを示すための処理である。
【００６５】
一方、Ｓ２０８において、ｔａｂｌｅＷ０[ｎｎ]が０より小さい場合は、同一ノートナンバーがチャンネル０側でノートオフになっていることになるので、重複処理を行う必要がないため、ｔａｂｌｅＷ０[ｎｎ]の処理に進む（Ｓ２１３）。Ｓ２１３では、ｖｅｌ＞０の場合、演算処理部１２は、ｔａｂｌｅＷ０[ｎｎ]←ｐｗとし、ｖｅｌ＝０の場合、ｔａｂｌｅＷ０[ｎｎ]←−１とする処理を実行する。
【００６６】
チャンネル１に対して、Ｓ２０５、Ｓ２０６、Ｓ２０７のいずれの処理を行った場合でも、チャンネル０に対して、Ｓ２１１、Ｓ２１２、Ｓ２１３のいずれの処理を行った場合でも、処理が終了した場合には、ノートオン／オフ処理を実行する（Ｓ２１４）。Ｓ２１４では、まず、ｔａｂｌｅＳ[ｎｎ]＝−１かつｖｅｌ＞０、またはｔａｂｌｅＳ[ｎｎ] ＞０かつｖｅｌ＝０の場合、以下の〔数式７〕に従った処理を実行し、出力用の配列ＥｖｅｎｔＳ[]にノートオンイベントまたはノートオフイベントを生成する。ここで、条件となるｔａｂｌｅＳ[ｎｎ]＝−１かつｖｅｌ＞０は、そのノートナンバーｎｎがノートオフ状態であって、現在処理中のノートイベントが、ノートオンイベントであることを示している。また、もう一方の条件であるｔａｂｌｅＳ[ｎｎ] ＞０かつｖｅｌ＝０は、既にそのノートナンバーｎｎがノートオン状態であって、現在処理中のノートイベントが、ノートオフイベントであることを示している。
【００６７】
〔数式９〕
ＥｖｅｎｔＳ[ｐｓ]．ｔｉｍｅ←ＥｖｅｎｔＷ[ｐｗ]．ｔｉｍｅ
ＥｖｅｎｔＳ[ｐｓ]．ｃｈａｎｎｅｌ←０
ＥｖｅｎｔＳ[ｐｓ]．ｎｏｔｅ−ｎｕｍｂｅｒ←ｎｎ
ＥｖｅｎｔＳ[ｐｓ]．ｖｅｌｏｃｉｔｙ←ｖｅｌ
ｖｅｌ＞０の場合ｔａｂｌｅＳ[ｎｎ]←ｐｓ、ｖｅｌ＝０の場合ｔａｂｌｅＳ[ｎｎ]←−１
ｐｓ←ｐｓ＋１
【００６８】
上記〔数式９〕の６つの式のうち、第１式、第２式、第３式、第６式は、上記〔数式４〕と同一である。〔数式４〕との違いは、ｖｅｌの値によりノートオフまたはノートオンの双方の場合があるため、第４式において、ＥｖｅｎｔＳ[ｐｓ]のノートイベントのｖｅｌｏｃｉｔｙに現在処理中のベロシティまたは〔数式５〕〜〔数式８〕で補正したベロシティを代入している点である。これは、ノートオンまたはノートオフのいずれの可能性もあり、かつベロシティ値が補正される場合があるためである。第５式では、ｖｅｌの値に応じてｔａｂｌｅＳ[ｎｎ]に設定する値が異なっている。ｖｅｌ＝０の場合は、〔数式４〕と同様、−１を設定するが、ｖｅｌ＞０の場合は、ｐｓの値を設定する。
【００６９】
Ｓ２１４におけるノートオン処理が終わったら、入力側のＥｖｅｎｔＷ[]の格納されている全てのノートイベントの処理が終わったかどうかを判断する（Ｓ２１５）。具体的には、ｐｗ←ｐｗ＋１とした後、ｐｗ＜Ｎｗの場合、全てのノートイベントの処理が終わっていないため、Ｓ２０１に戻って次のノートイベントについての処理を実行する。ｐｗ≧Ｎｗの場合、全てのノートイベントの処理が終わったことになるため、Ｎｓ←ｐｓとして、重複ノートオン区間処理を終了する。
【００７０】
＜０デュレーションイベント削除処理＞
重複ノートオン区間処理が終了したら、演算処理部１２は、０デュレーションイベント削除処理を行う（図２のＳ３）。重複ノートオン区間についての処理が終了すると、統合された単一チャンネルのＭＩＤＩイベント配列ＥｖｅｎｔＳ[]には、同一ノートナンバーで時間的にノートオン区間が重複するようなノートイベントが存在しなくなる。しかし、ＥｖｅｎｔＳ[]には、ノートオンとノートオフが同一時刻となる０デュレーションのノートイベントが含まれている可能性がある。そこで、次に、０デュレーションのノートイベントを削除する処理を行う。
【００７１】
０デュレーションイベント削除処理に際して、演算処理部１２は、削除処理後の出力する差分ＭＩＤＩイベント配列をＥｖｅｎｔＤ[ｈ，]として用意し、総ノートイベント数をＮｄ[ｈ]とし、ＥｖｅｎｔＳ[]、ＥｖｅｎｔＤ[ｈ，]の各配列へのポインタをｐｓ、ｐｄとし、初期状態ではｐｓ＝ｐｄ＝０に設定する。また、ＥｖｅｎｔＤ[ｈ，]のＣｈａｎｎｅｌ値は全て０に設定する。さらに、コンピュータ（符号化装置）は、０〜１２７のノートナンバーに対応してノートオン時にＭＩＤＩイベント配列へのポインタを格納するノートオンテーブルｔａｂｌｅＳ[]を定義する。そして、ｔａｂｌｅＳ[]の全ての初期値を−１に設定する。
【００７２】
配列の準備ができたら、演算処理部１２は、０デュレーションイベント削除処理を開始する。この０デュレーションイベント削除処理の詳細を図７のフローチャートを用いて説明する。まず、演算処理部１２は、ポインタｐｓを特定した後、以下の〔数式１０〕に従った処理を実行し、処理対象のノートナンバーｎｎ、ベロシティをｖｅｌを決定する。
【００７３】
〔数式１０〕
ｎｎ←ＥｖｅｎｔＳ[ｐｓ]．ｎｏｔｅ−ｎｕｍｂｅｒ
ｖｅｌ←ＥｖｅｎｔＳ[ｐｓ]．ｖｅｌｏｃｉｔｙ
【００７４】
そして、ｖｅｌが０より大きいか否かを判断する（Ｓ３０１）。ｖｅｌが０より大きいと判断された場合には、以下の〔数式１１〕に従った処理を実行する（Ｓ３０２）。
【００７５】
〔数式１１〕
ｔａｂｌｅＳ［ｎｎ］←ｐｓ
【００７６】
一方、Ｓ３０１において、ｖｅｌ＝０であると判断された場合には、まず、ＥｖｅｎｔＳ[ｔａｂｌｅＳ［ｎｎ］]．ｔｉｍｅとＥｖｅｎｔＳ[ｐｓ]．ｔｉｍｅが一致するかどうかを判断し、両者が一致する場合に限り、以下の〔数式１２〕に従った処理を実行する（Ｓ３０３）。
【００７７】
〔数式１２〕
ＥｖｅｎｔＳ[ｔａｂｌｅＳ［ｎｎ] ]．ｎｏｔｅ−ｎｕｍｂｅｒ←−１
ＥｖｅｎｔＳ[ｐｓ]．ｎｏｔｅ−ｎｕｍｂｅｒ←−１
ｔａｂｌｅＳ［ｎｎ］←−１
【００７８】
ＥｖｅｎｔＳ[ｔａｂｌｅＳ［ｎｎ］]．ｔｉｍｅとＥｖｅｎｔＳ[ｐｓ]．ｔｉｍｅが一致する場合は、デュレーションが０であることを意味するので、そのノートイベントを削除する。本実施形態では、上記〔数式１２〕の第１式、第２式に示すように、そのノートイベントにノートナンバーとしては無効な負の値（−１）を設定している。Ｓ３０３において、ＥｖｅｎｔＳ[ｔａｂｌｅＳ［ｎｎ］]．ｔｉｍｅとＥｖｅｎｔＳ[ｐｓ]．ｔｉｍｅが一致しないと判断された場合には、上記〔数式１２〕に従った処理は実行しない。
【００７９】
また、Ｓ３０１において、ｖｅｌ＜０であると判断された場合には、上記〔数式７〕においてｖｅｌに“−１”が設定されたことになり、これは、重複区間のベロシティの差分が“０”であったことを意味する。この場合、事前の設定に従って以下の２通りの処理のいずれか一方を実行する。１つ目は、ｖｅｌの値を０以外の１〜１２７の範囲で小さな値に変更する処理である。本実施形態では、ｖｅｌ←１としている。“０以外の１〜１２７の範囲で小さな値”としては、必ずしも“１”である必要はなく、ＭＩＤＩデータに記録された音響信号の特性に応じて適宜設定しておくことが可能である。
【００８０】
２つ目は、重複区間を符号化対象から削除する処理である。具体的には、対応するノートオフイベントを探索し、上記〔数式１２〕に従った処理を実行して、無効化する。この無効化により、後の処理において符号化対象から削除されることになる。
【００８１】
Ｓ３０２、Ｓ３０３のいずれの処理を行った場合でも、次に、エネルギー値の更新処理を実行する（Ｓ３０４）。具体的には、以下の〔数式１３〕に従った処理を実行する。
【００８２】
〔数式１３〕
Ｅｎｅｒｇｙ[ｈ]←Ｅｎｅｒｇｙ[ｈ]＋ＥｖｅｎｔＳ[ｔａｂｌｅＳ［ｎｎ]]．ｖｅｌｏｃｉｔｙ・（ＥｖｅｎｔＳ[ｐｓ]．ｔｉｍｅ−ＥｖｅｎｔＳ[ｔａｂｌｅＳ［ｎｎ］]．ｔｉｍｅ）
ｐｓ←ｐｓ＋１
【００８３】
上記〔数式１３〕の第１式では、ノートオン区間のベロシティにデュレーションを乗じてエネルギー値を算出し、それまでに算出されている総エネルギー値に加算することにより、総エネルギー値Ｅｎｅｒｇｙ[ｈ]を更新している。総エネルギー値Ｅｎｅｒｇｙ[ｈ]を更新したら、上記〔数式１３〕の第２式によりｐｓの値をインクリメントする。そして、ｐｓ＜Ｎｓであるかどうかを判断する（Ｓ３０５）。ｐｓ＜Ｎｓである場合は、Ｓ３０１に戻る。一方、ｐｓ≧Ｎｓである場合は、全てのノートイベントについて処理したことを意味するので、出力イベント配列の生成に進む。結局、Ｓ３０１〜Ｓ３０５のループにおいては、デュレーションが０のノートイベントを削除し、総エネルギー値を算出する処理を実行していることになる。
【００８４】
全てのノートイベントに対する処理を実行し、デュレーション０のノートイベントの削除、総エネルギー値の算出が行われたら、出力イベント配列の生成を行う（Ｓ３０６）。まず、ｐｓ＝ｐｄ＝０に設定する。続いて、ＥｖｅｎｔＳ[ｐｓ]．ｎｏｔｅ−ｎｕｍｂｅｒ≧０であるかどうかを判断する。そして、ＥｖｅｎｔＳ[ｐｓ]．ｎｏｔｅ−ｎｕｍｂｅｒ≧０である場合は、無効化されていないノートイベントであることを意味するので、以下の〔数式１４〕に従った処理を実行し、出力イベント配列ＥｖｅｎｔＤ[ｈ，ｐｄ]に値を出力する。
【００８５】
〔数式１４〕
ＥｖｅｎｔＤ[ｈ，ｐｄ]．ｔｉｍｅ←ＥｖｅｎｔＳ[ｐｓ]．ｔｉｍｅ
ＥｖｅｎｔＤ[ｈ，ｐｄ]．ｃｈａｎｎｅｌ←０
ＥｖｅｎｔＤ[ｈ，ｐｄ]．ｎｏｔｅ−ｎｕｍｂｅｒ←ＥｖｅｎｔＳ[ｐｓ]．ｎｏｔｅ−ｎｕｍｂｅｒ
ＥｖｅｎｔＤ[ｈ，ｐｄ]．ｖｅｌｏｃｉｔｙ←ＥｖｅｎｔＳ[ｐｓ]．ｖｅｌｏｃｉｔｙ
ｐｄ←ｐｄ＋１
ｐｓ←ｐｓ＋１
【００８６】
上記〔数式１４〕により、１つのノートイベントについての出力イベント配列ＥｖｅｎｔＤ[ｈ，ｐｄ]への出力が終わったら、ｐｓ＜Ｎｓであるかどうかを判断する（Ｓ３０７）。ｐｓ＜Ｎｓである場合は、Ｓ３０６に戻る。一方、ｐｓ≧Ｎｓである場合は、位相ｈに対して全てのノートイベントについて処理したことを意味するので、処理を終了する。
【００８７】
本発明では、位相ずれを考慮しない処理を行うことも可能である。位相ずれを考慮しない場合は、上記図７の終了をもって全て処理を終了とし、図２のＳ１〜Ｓ３の処理により得られた出力イベント配列ＥｖｅｎｔＤ[]が差分ＭＩＤＩデータとして得られる。しかし、位相ずれを考慮しない場合、ＭＩＤＩデータＭ１とＭＩＤＩデータＭ２の位相ずれ（時間的な位置ずれ）が生じた場合に、両者の差異が実際よりも大きくなるという問題がある。ここで、この差分処理時の位相ずれの様子を図８に示す。
【００８８】
図８（ａ）、（ｂ）、（ｃ）はそれぞれＭＩＤＩデータＭ１、ＭＩＤＩデータＭ２、差分ＭＩＤＩデータを示している。いずれも左右方向は時間軸を示している。上下方向は、音高（ノートナンバー）を示すが、各矩形の上下方向の幅は、音の強さ（ベロシティ）を示している。また、網掛けされた部分はノートオン区間を示している。図８（ａ）、（ｂ）を比較するとわかるように、ＭＩＤＩデータＭ１とＭ２は、全く同じＭＩＤＩデータが、時間軸方向に位置ずれしたものである。
【００８９】
図８（ａ）に示したＭＩＤＩデータＭ１と図８（ｂ）に示したＭＩＤＩデータＭ２の差分演算を行うと、図８（ｃ）に示すような差分ＭＩＤＩデータが得られる。図８（ｃ）において網掛けされた部分がベロシティの差分が０とならなかった部分である。このように、本来全く同じＭＩＤＩデータであっても、位置ずれが生じていると、図８（ｃ）のような擬似差分が生じることになる。本実施形態では、このような擬似差分をなくすため、ＭＩＤＩデータＭ１、Ｍ２のいずれか一方を時間軸方向に移動させることにより時間を合わせ、差分を得るようにしている。現実には、時間を完全に合わせることは不可能であるので、移動させる時間を変化させながら差分演算を行い、差分が最小となったときを、時間的な位置が合っているものとみなして、その差分を出力する。
【００９０】
位相ずれを考慮する場合、図７の０デュレーションイベント削除処理または図２のＳ３の処理が終了したら、図２でＮｄ[ｈ]←ｐｄ、ｈ←ｈ＋１とした後、ｈ≧Ｈであるかどうかを判断する（Ｓ４）。すなわち、全ての位相についてＳ１〜Ｓ３の処理を終えたかどうかを判断する。ｈ＜Ｈの場合、未処理の位相が残っているため、繰り返し、Ｓ１〜Ｓ３の処理を実行する。ｈ≧Ｈの場合、全ての位相について処理を終えたことになるので、差分ＭＩＤＩデータの選別を行う（Ｓ５）。
【００９１】
具体的には、ｈ＝０，・・・，Ｈ−１において算出されたノートイベントの総エネルギー値Ｅｎｅｒｇｙ[ｈ]を最小とするｈをｈｍとして、ＭＩＤＩイベント配列ＥｖｅｎｔＤ[ｈｍ，]を求める差分ＭＩＤＩデータとして採用し、それをＭＩＤＩ符号として出力する。
【００９２】
差分ＭＩＤＩデータは、様々な形式で出力することができる。表示用のデータに変換して、表示部１３に画面出力することも可能であるし、音響信号に変換して音響出力部１４に音響出力することも可能であるし、そのまま記憶媒体等のデータ出力部１５にデータ出力することも可能である。表示部１３に画面出力するに際しては、ノートオンおよびノートオフをノートオン区間に変換して左右幅を決定し、ベロシティに対応する上下方向の幅を決定して矩形を生成し、対応するノートナンバーの位置に配置することにより、表示用データを生成し、表示部１３に出力する。すなわち、図８に示したような形式で表示されることになる。表示部１３と音響出力部１４に同時に出力した場合には、２種の音響信号を視覚的かつ聴覚的に評価することができる。
【産業上の利用可能性】
【００９３】
本発明は、各種符号化技術の開発や、電子透かし埋め込み技術の開発など音響信号に対して何らかの改変を加え、その信号劣化度を評価する産業に利用することができる。また、その開発成果は、ＰＣＭ等により得られた音響信号を、ＭＩＤＩ符号等の符号コードに変換する技術を用い、放送メディア（地上・ＢＳなどによるデジタルラジオ・テレビ放送など）、通信メディア（ＣＳ放送、インターネット・ストリーミング放送、携帯電話サービス、携帯音楽配信サービスなど）、パッケージメディア（ＣＤ、ＤＶＤ、ＢｌｕｅＲａｙ、メモリＩＣカードなど）向けのオーディオコンテンツ制作産業に利用することができる。
【符号の説明】
【００９４】
１１  データ入力部
１２  演算処理部
１３  表示部
１４  音響出力部
１５  データ出力部
【図１】
0005609281.tif 000002
【図２】
0005609281.tif 000003
【図３】
0005609281.tif 000004
【図４】
0005609281.tif 000005
【図５】
0005609281.tif 000006
【図６】
0005609281.tif 000007
【図７】
0005609281.tif 000008
【図８】
0005609281.tif 000009