(57)【特許請求の範囲】
【請求項１】
時系列イベントデータを含むデータの処理装置であって、
前記時系列イベントデータを含むデータは、一本のトラックに、時系列イベントデータ列のみからなる第１のフォーマットのデータと、該第１のフォーマットのデータ中に第２のフォーマットのデータであることを示す識別情報を付して第１のフォーマットの形式で散在された第２のフォーマットのデータとが格納されたデータであり、
前記第２のフォーマットのデータは、時系列イベントデータ列と該時系列イベントデータ列を書き換える書き換え手順を示すスクリプトとで構成されたシーケンスからなるものであり、
前記スクリプトは、そのシーケンスの時系列イベントデータ列中の書き換え対象となるイベントデータを特定し、該書き換え対象となるイベントデータに対して施す処理の内容を記述したものであり、
前記一本のトラックから前記識別情報に基づいて前記第２のフォーマットのデータのみを抽出する抽出手段と、
抽出された前記第２のフォーマットのデータのシーケンスの内容が参照される際に、そのシーケンスに含まれる前記スクリプトを実行して、そのシーケンスの時系列イベントデータ列を書き換えるスクリプト実行手段と
を備えることを特徴とする時系列イベントデータを含むデータの処理装置。
【請求項２】
時系列イベントデータを含むデータの処理装置であって、
前記時系列イベントデータを含むデータは、第１のトラックないし第Ｎのトラックに格納された時系列イベントデータ列のみからなる第１のフォーマットのデータと、第Ｎ＋１のトラックに第２のフォーマットのデータであることを示す識別情報を付して第１のフォーマットの形式で格納された第２のフォーマットのデータとが一組のデータとされているものであり、
前記第２のフォーマットのデータは、時系列イベントデータ列と該時系列イベントデータ列を書き換える書き換え手順を示すスクリプトとで構成されたシーケンスからなるものであり、
前記スクリプトは、そのシーケンスの時系列イベントデータ列中の書き換え対象となるイベントデータを特定し、該書き換え対象となるイベントデータに対して施す処理の内容を記述したものであり、
前記一組のデータから前記識別情報に基づいて前記第Ｎ＋１トラックに格納された前記第２のフォーマットのデータのみを抽出する抽出手段と、
抽出された前記第２のフォーマットのデータのシーケンスの内容が参照される際に、そのシーケンスに含まれる前記スクリプトを実行して、そのシーケンスの時系列イベントデータ列を書き換えるスクリプト実行手段と
を備えることを特徴とする時系列イベントデータを含むデータの処理装置。
【請求項３】
時系列イベントデータを含むデータを処理する方法であって、
前記時系列イベントデータを含むデータは、一本のトラックに、時系列イベントデータ列のみからなる第１のフォーマットのデータと、該第１のフォーマットのデータ中に第２のフォーマットのデータであることを示す識別情報を付して第１のフォーマットの形式で散在された第２のフォーマットのデータとが格納されたデータであり、
前記第２のフォーマットのデータは、時系列イベントデータ列と該時系列イベントデータ列を書き換える書き換え手順を示すスクリプトとで構成されたシーケンスからなるものであり、
前記スクリプトは、そのシーケンスの時系列イベントデータ列中の書き換え対象となるイベントデータを特定し、該書き換え対象となるイベントデータに対して施す処理の内容を記述したものであり、
前記一本のトラックから前記識別情報に基づいて前記第２のフォーマットのデータを抽出するステップと、
抽出された前記第２のフォーマットのデータのシーケンスの内容が参照される際に、そのシーケンスに含まれる前記スクリプトを実行して、そのシーケンスの時系列イベントデータ列を書き換えるステップと
を備えることを特徴とする時系列イベントデータを含むデータの処理方法。
【請求項４】
時系列イベントデータを含むデータを処理する方法であって、
前記時系列イベントデータを含むデータは、第１のトラックないし第Ｎのトラックに格納された時系列イベントデータ列のみからなる第１のフォーマットのデータと、第Ｎ＋１のトラックに第２のフォーマットのデータであることを示す識別情報を付して第１のフォーマットの形式で格納された第２のフォーマットのデータとが一組のデータとされているものであり、
前記第２のフォーマットのデータは、時系列イベントデータ列と該時系列イベントデータ列を書き換える書き換え手順を示すスクリプトとで構成されたシーケンスからなるものであり、
前記スクリプトは、そのシーケンスの時系列イベントデータ列中の書き換え対象となるイベントデータを特定し、該書き換え対象となるイベントデータに対して施す処理の内容を記述したものであり、
前記一組のデータから前記識別情報に基づいて前記第Ｎ＋１トラックに格納された前記第２のフォーマットのデータを抽出するステップと、
抽出された前記第２のフォーマットのデータのシーケンスの内容が参照される際に、そのシーケンスに含まれる前記スクリプトを実行して、そのシーケンスの時系列イベントデータ列を書き換えるステップと
を備えることを特徴とする時系列イベントデータを含むデータの処理方法。
【請求項５】
処理装置に時系列イベントデータを含むデータを処理させるためのプログラムが記録されたコンピュータ読み取り可能な記録媒体であって、
前記時系列イベントデータを含むデータは、一本のトラックに、時系列イベントデータ列のみからなる第１のフォーマットのデータと、該第１のフォーマットのデータ中に第２のフォーマットのデータであることを示す識別情報を付して第１のフォーマットの形式で散在された第２のフォーマットのデータとが格納されたデータであり、
前記第２のフォーマットのデータは、時系列イベントデータ列と該時系列イベントデータ列を書き換える書き換え手順を示すスクリプトとで構成されたシーケンスからなるものであり、
前記スクリプトは、そのシーケンスの時系列イベントデータ列中の書き換え対象となるイベントデータを特定し、該書き換え対象となるイベントデータに対して施す処理の内容を記述したものであり、
前記プログラムは、前記処理装置に、
前記一本のトラックから前記識別情報に基づいて前記第２のフォーマットのデータのみを抽出する機能と、
抽出された前記第２のフォーマットのデータのシーケンスの内容が参照される際に、そのシーケンスに含まれる前記スクリプトを実行して、そのシーケンスの時系列イベントデータ列を書き換える機能と
を実行させるようになされているものであることを特徴とする時系列イベントデータ処理用プログラムが記録されたコンピュータ読み取り可能な記録媒体。
【請求項６】
処理装置に時系列イベントデータを含むデータを処理させるためのプログラムが記録されたコンピュータ読み取り可能な記録媒体であって、
前記時系列イベントデータを含むデータは、第１のトラックないし第Ｎのトラックに格納された時系列イベントデータ列のみからなる第１のフォーマットのデータと、第Ｎ＋１のトラックに第２のフォーマットのデータであることを示す識別情報を付して第１のフォーマットの形式で格納された第２のフォーマットのデータとが一組のデータとされているものであり、
前記第２のフォーマットのデータは、時系列イベントデータ列と該時系列イベントデータ列を書き換える書き換え手順を示すスクリプトとで構成されたシーケンスからなるものであり、
前記スクリプトは、そのシーケンスの時系列イベントデータ列中の書き換え対象となるイベントデータを特定し、該書き換え対象となるイベントデータに対して施す処理の内容を記述したものであり、
前記プログラムは、前記処理装置に、
前記一組のデータから前記識別情報に基づいて前記第Ｎ＋１トラックに格納された前記第２のフォーマットのデータのみを抽出する機能と、
抽出された前記第２のフォーマットのデータのシーケンスの内容が参照される際に、そのシーケンスに含まれる前記スクリプトを実行して、そのシーケンスの時系列イベントデータ列を書き換える機能と
を実行させるようになされているものであることを特徴とする時系列イベントデータ処理用プログラムが記録されたコンピュータ読み取り可能な記録媒体。
【請求項７】
時系列イベントデータを含むデータが記録されたコンピュータ読み取り可能な記録媒体であって、
前記時系列イベントデータを含むデータは、一本のトラックに、時系列イベントデータ列のみからなる第１のフォーマットのデータと、該第１のフォーマットのデータ中に第２のフォーマットのデータであることを示す識別情報を付して第１のフォーマットの形式で散在された第２のフォーマットのデータとが格納されたデータであり、
前記第２のフォーマットのデータは、時系列イベントデータ列と該時系列イベントデータ列を書き換える書き換え手順を示すスクリプトとで構成されたシーケンスからなるものであり、
前記スクリプトは、そのシーケンスの時系列イベントデータ列中の書き換え対象となるイベントデータを特定し、該書き換え対象となるイベントデータに対して施す処理の内容を記述したものであり、
前記一本のトラックから前記識別情報に基づいて前記第２のフォーマットのデータが抽出され、該抽出された第２のフォーマットのデータのシーケンスの内容が参照されたときに、そのシーケンスに含まれる前記スクリプトが実行されることによりそのシーケンスの時系列イベントデータが書き換えられるものである
ことを特徴とする時系列イベントデータを含むデータが記録されたコンピュータ読み取り可能な記録媒体。
【請求項８】
時系列イベントデータを含むデータが記録されたコンピュータ読み取り可能な記録媒体であって、
前記時系列イベントデータを含むデータは、第１のトラックないし第Ｎのトラックに格納された時系列イベントデータ列のみからなる第１のフォーマットのデータと、第Ｎ＋１のトラックに第２のフォーマットのデータであることを示す識別情報を付して第１のフォーマットの形式で格納された第２のフォーマットのデータとが一組のデータとされているものであり、
前記第２のフォーマットのデータは、時系列イベントデータ列と該時系列イベントデータ列を書き換える書き換え手順を示すスクリプトとで構成されたシーケンスからなるものであり、
前記スクリプトは、そのシーケンスの時系列イベントデータ列中の書き換え対象となるイベントデータを特定し、該書き換え対象となるイベントデータに対して施す処理の内容を記述したものであり、
前記一組のデータから前記識別情報に基づいて前記第Ｎ＋１トラックに格納された前記第２のフォーマットのデータが抽出され、該抽出された第２のフォーマットのデータのシーケンスの内容が参照される際に、そのシーケンスに含まれる前記スクリプトが実行されることによりそのシーケンスの時系列イベントデータ列が書き換えられるものである
ことを特徴とする時系列イベントデータを含むデータが記録されたコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、時系列イベントデータと、該時系列イベントデータを書き換える書き換え手順を示すスクリプトとで構成されたシーケンスが少なくとも含まれるデータを処理する処理装置および方法、時系列イベントデータ処理用プログラムが記録された記録媒体ならびに時系列イベントデータを含むデータが記録された記録媒体に関するものである。
【０００２】
【従来の技術】
従来、時系列イベントデータのフォーマットしてAIFFが知られている。例えば、音楽分野ではこれを応用したスタンダードＭＩＤＩファイル（以下、ＳＭＦと記す。）が知られている。ＭＩＤＩとはMusical Instrument Digital Interfaceの略であり、異なる楽器間やシーケンサ、コンピュータ、ライティングコントロール、ミキサーなどを相互に結合し、情報の交換を可能にするために制定された規格である。そしてＳＭＦとは、ＭＩＤＩ上で実時間で交換されるイベント情報を、タイムスタンプを付加してファイルに記録・保存するために考案されたフォーマットである。
【０００３】
【発明が解決しようとする課題】
しかしながら、現在普及しているＳＭＦでは、保存したりやりとりできるのは低レベルのＭＩＤＩイベント列だけであり、演奏データの音楽的な構造や時間的に変化する量などの情報をやりとりすることは困難であった。これらの情報は、シーケンサソフト固有の形式で保存されることしかできないものであった。
したがって、従来はイベントデータの時間的配置や時変データ等の高次の情報をやりとりすることができないという問題点があった。
これを解決するために高次の情報をやりとりすることのできる新規なフォーマットが考えられるが、従来のフォーマットとは異なるフォーマットになるため、データの互換性がなくなるという問題点が生じてしまうことになる。
【０００４】
そこで、本発明は従来のフォーマットのデータと、高次の情報をやりとりすることのできる新規なフォーマットのデータとの間で互換性を実現した時系列イベントを含むデータを処理する処理装置および方法、時系列イベントデータ処理用プログラムが記録された記録媒体、ならびに、そのデータが記録されている記録媒体を提供することを目的としている。
【０００５】
【課題を解決するための手段】
上記目的を達成するために、本発明の時系列イベントデータを含むデータの処理装置は、時系列イベントデータを含むデータの処理装置であって、前記時系列イベントデータを含むデータは、一本のトラックに、時系列イベントデータ列のみからなる第１のフォーマットのデータと、該第１のフォーマットのデータ中に第２のフォーマットのデータであることを示す識別情報を付して第１のフォーマットの形式で散在された第２のフォーマットのデータとが格納されたデータであり、前記第２のフォーマットのデータは、時系列イベントデータ列と該時系列イベントデータ列を書き換える書き換え手順を示すスクリプトとで構成されたシーケンスからなるものであり、前記スクリプトは、そのシーケンスの時系列イベントデータ列中の書き換え対象となるイベントデータを特定し、該書き換え対象となるイベントデータに対して施す処理の内容を記述したものであり、前記一本のトラックから前記識別情報に基づいて前記第２のフォーマットのデータのみを抽出する抽出手段と、抽出された前記第２のフォーマットのデータのシーケンスの内容が参照される際に、そのシーケンスに含まれる前記スクリプトを実行して、そのシーケンスの時系列イベントデータ列を書き換えるスクリプト実行手段とを備えている。
【０００６】
また、本発明の他の時系列イベントデータを含むデータの処理装置は、時系列イベントデータを含むデータの処理装置であって、前記時系列イベントデータを含むデータは、第１のトラックないし第Ｎのトラックに格納された時系列イベントデータ列のみからなる第１のフォーマットのデータと、第Ｎ＋１のトラックに第２のフォーマットのデータであることを示す識別情報を付して第１のフォーマットの形式で格納された第２のフォーマットのデータとが一組のデータとされているものであり、前記第２のフォーマットのデータは、時系列イベントデータ列と該時系列イベントデータ列を書き換える書き換え手順を示すスクリプトとで構成されたシーケンスからなるものであり、前記スクリプトは、そのシーケンスの時系列イベントデータ列中の書き換え対象となるイベントデータを特定し、該書き換え対象となるイベントデータに対して施す処理の内容を記述したものであり、前記一組のデータから前記識別情報に基づいて前記第Ｎ＋１トラックに格納された前記第２のフォーマットのデータのみを抽出する抽出手段と、抽出された前記第２のフォーマットのデータのシーケンスの内容が参照される際に、そのシーケンスに含まれる前記スクリプトを実行して、そのシーケンスの時系列イベントデータ列を書き換えるスクリプト実行手段とを備えている。
【０００７】
さらに、本発明の時系列イベントデータを含むデータの処理方法は、時系列イベントデータを含むデータを処理する方法であって、前記時系列イベントデータを含むデータは、一本のトラックに、時系列イベントデータ列のみからなる第１のフォーマットのデータと、該第１のフォーマットのデータ中に第２のフォーマットのデータであることを示す識別情報を付して第１のフォーマットの形式で散在された第２のフォーマットのデータとが格納されたデータであり、前記第２のフォーマットのデータは、時系列イベントデータ列と該時系列イベントデータ列を書き換える書き換え手順を示すスクリプトとで構成されたシーケンスからなるものであり、前記スクリプトは、そのシーケンスの時系列イベントデータ列中の書き換え対象となるイベントデータを特定し、該書き換え対象となるイベントデータに対して施す処理の内容を記述したものであり、前記一本のトラックから前記識別情報に基づいて前記第２のフォーマットのデータを抽出するステップと、抽出された前記第２のフォーマットのデータのシーケンスの内容が参照される際に、そのシーケンスに含まれる前記スクリプトを実行して、そのシーケンスの時系列イベントデータ列を書き換えるステップとを備えている。
さらにまた、本発明の他の時系列イベントデータを含むデータの処理方法は、時系列イベントデータを含むデータを処理する方法であって、前記時系列イベントデータを含むデータは、第１のトラックないし第Ｎのトラックに格納された時系列イベントデータ列のみからなる第１のフォーマットのデータと、第Ｎ＋１のトラックに第２のフォーマットのデータであることを示す識別情報を付して第１のフォーマットの形式で格納された第２のフォーマットのデータとが一組のデータとされているものであり、前記第２のフォーマットのデータは、時系列イベントデータ列と該時系列イベントデータ列を書き換える書き換え手順を示すスクリプトとで構成されたシーケンスからなるものであり、前記スクリプトは、そのシーケンスの時系列イベントデータ列中の書き換え対象となるイベントデータを特定し、該書き換え対象となるイベントデータに対して施す処理の内容を記述したものであり、前記一組のデータから前記識別情報に基づいて前記第Ｎ＋１トラックに格納された前記第２のフォーマットのデータを抽出するステップと、抽出された前記第２のフォーマットのデータのシーケンスの内容が参照される際に、そのシーケンスに含まれる前記スクリプトを実行して、そのシーケンスの時系列イベントデータ列を書き換えるステップとを備えている。
【０００８】
さらにまた、本発明の時系列イベントデータ処理用プログラムを記録したコンピュータ読み取り可能な記録媒体は、処理装置に、上記本発明の時系列イベントデータの処理方法を実行させるためのプログラムが記録されているものである。
さらにまた、本発明の時系列イベントデータを含むデータが記録されたコンピュータ読み取り可能な記録媒体は、時系列イベントデータを含むデータが記録されたコンピュータ読み取り可能な記録媒体であって、前記時系列イベントデータを含むデータは、一本のトラックに、時系列イベントデータ列のみからなる第１のフォーマットのデータと、該第１のフォーマットのデータ中に第２のフォーマットのデータであることを示す識別情報を付して第１のフォーマットの形式で散在された第２のフォーマットのデータとが格納されたデータであり、前記第２のフォーマットのデータは、時系列イベントデータ列と該時系列イベントデータ列を書き換える書き換え手順を示すスクリプトとで構成されたシーケンスからなるものであり、前記スクリプトは、そのシーケンスの時系列イベントデータ列中の書き換え対象となるイベントデータを特定し、該書き換え対象となるイベントデータに対して施す処理の内容を記述したものであり、前記一本のトラックから前記識別情報に基づいて前記第２のフォーマットのデータが抽出され、該抽出された第２のフォーマットのデータのシーケンスの内容が参照されたときに、そのシーケンスに含まれる前記スクリプトが実行されることによりそのシーケンスの時系列イベントデータが書き換えられるものである。
さらにまた、本発明の他の時系列イベントデータを含むデータが記録されたコンピュータ読み取り可能な記録媒体は、時系列イベントデータを含むデータが記録されたコンピュータ読み取り可能な記録媒体であって、前記時系列イベントデータを含むデータは、第１のトラックないし第Ｎのトラックに格納された時系列イベントデータ列のみからなる第１のフォーマットのデータと、第Ｎ＋１のトラックに第２のフォーマットのデータであることを示す識別情報を付して第１のフォーマットの形式で格納された第２のフォーマットのデータとが一組のデータとされているものであり、前記第２のフォーマットのデータは、時系列イベントデータ列と該時系列イベントデータ列を書き換える書き換え手順を示すスクリプトとで構成されたシーケンスからなるものであり、前記スクリプトは、そのシーケンスの時系列イベントデータ列中の書き換え対象となるイベントデータを特定し、該書き換え対象となるイベントデータに対して施す処理の内容を記述したものであり、前記一組のデータから前記識別情報に基づいて前記第Ｎ＋１トラックに格納された前記第２のフォーマットのデータが抽出され、該抽出された第２のフォーマットのデータのシーケンスの内容が参照される際に、そのシーケンスに含まれる前記スクリプトが実行されることによりそのシーケンスの時系列イベントデータ列が書き換えられるものである。
【０００９】
このような本発明によれば、第１のフォーマットのデータに第２のフォーマットのデータを異なるフォーマットで埋め込むようにしたので、第１のフォーマットのデータしか再生することのできない再生手段においては、第２のフォーマットのデータが無視されて第１のフォーマットのデータが再生される。また、第２のフォーマットのデータを再生することのできる再生手段においては、第２のフォーマットのデータのみを抽出して再生することができるようにしている。
従って、高次の情報をやりとりすることのできる新規な第２のフォーマットとしても、従来のフォーマット（第１のフォーマット）とのデータ互換性を実現することができる。
【００１０】
【発明の実施の形態】
本発明の実施の形態例であるＭＩＤＩシーケンサ等の時系列データを含むデータの処理装置の構成の概略を図１に示す。ここで扱われているデータのデータフォーマットは本発明により新たに定義されるものである。
ここでは、この新規なデータフォーマットをHyper Media File（以下、ＨＭＦという。）と称呼するものとする。
ＨＭＦでは、高次の情報を記述できる一般的なデータモデルが与えられる。このデータモデルは、データの静的な構造および動的な機構の２つの側面から定義され、Hyper Media Data Model（以下、ＨＭＤＭという。）と称呼するものとする。シーケンサソフトに、内部の固有データ構造とＨＭＤＭとの相互変換を実装させることにより、高次の情報を互いにやりとりすることができるようになる。
【００１１】
すなわち、ＨＭＦは、ＨＭＤＭをファイル形式で保存するフォーマットとして定義される。ＨＭＦは、例えば、ＭＩＤＩイベントによる音楽記述を対象として、ＳＭＦをベースにして構成することができるが、ＭＩＤＩイベントデータに限られるものではなく、音声や画像等の時系列イベントデータに適用することもできるものである。
【００１２】
次に、ＨＭＦを音楽演奏に適用した場合の本発明の処理装置の実施の形態の一例を図１を参照しながら説明する。
図１において、符号１で示す処理装置Ａは、音楽演奏データを生成しており、生成された演奏データはバッファメモリ１−１に格納される。そして、バッファメモリ１−１に格納されている演奏データの構造はＨＭＤＭとされており、ＨＭＤＭの詳細は後述するが、ＨＭＤＭには、たとえば図３（ａ）に示すように複数のパッケージ１０〜１３が納められている。ＨＭＦエンコーダ１−２は、ＨＭＤＭのデータ構造とされた音楽演奏データを、パッケージ単位でＨＭＦ形式に変換して出力する。この場合の、ＨＭＦ形式に変換されるパッケージの例がバッファメモリ１−１内に破線で図示されている。パッケージの詳細は後述するが、パッケージは、たとえば図３（ｂ）に示すように複数のシーケンスが納められている。
【００１３】
処理装置Ａから出力されたパッケージ単位のＨＭＦ形式の音楽演奏データは伝送路７を介して処理装置Ｂあるいは記録媒体４に送られる。
記録媒体４には音楽演奏データがパッケージを単位としてＨＭＦ形式で記憶される。ここで、記録媒体４としては、ハードディスク、フロッピーディスク、磁気カード、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等、各種の記録媒体を使用することができる。また、１つのパッケージをエンコードしてファイルに格納することを、特に「セーブする」ともいう。
ここで、符号２で示す処理装置Ｂが記録媒体４から読み出した、あるいは、伝送路７を介して処理装置Ａから送出されたＨＭＦ形式のデータを受け取るときは、処理装置ＢはＨＭＦ形式のデータをパッケージ単位ごとに受け取る。受け取ったパッケージはＨＭＦデコーダ２−１においてＨＭＤＭのデータ構造のパッケージに変換されて、バッファメモリ２−２に保持される。ファイルに読み込んでデコードし、１つのパッケージとしてＨＭＤＭに格納することを、特に「ロードする」ともいう。
【００１４】
また、図３（ｂ）に示すようにパッケージには複数のシーケンスが納められており、シーケンスの詳細は後述するが、図３（ｃ）に示すようにシーケンスは、それぞれイベントデータ３０とスクリプト（script）３１との組から構成されている。
スクリプトはＨＭＦを特徴づけているものであって、データ変更の手順を示すプログラムであり、スクリプトつきのイベントデータは、このスクリプトを実行することで最終的なＭＩＤＩイベント列に変換される。
すなわち、処理装置Ｂで受け取った音楽演奏データを演奏しようとする場合は、バッファメモリ２−２内に格納されているＨＭＤＭが、データ展開部３により展開されるようになる。
【００１５】
データ展開部３では、必要なシーケンスが順次送り込まれイベントデータ／スクリプト分離部２−３においてイベントデータとスクリプトとに分離される。分離されたスクリプトはスクリプト解釈部２−５において解釈され、この解釈に基づいてイベントデータ書き換え部２−４において、イベントデータを書き換える処理が実行される。これにより、最終的な時系列イベントデータが得られる。この時系列イベントデータは、ＭＩＤＩイベントの出力部２−６を介してＭＩＤＩ信号としてＭＩＤＩ音源５に送られ、サウンドシステム６から放音される。あるいは、そのままＳＭＦ形式でファイルとすることもできる。
【００１６】
なお、ＳＭＦを用いた場合、例えば処理装置Ａと処理装置Ｂとがやりとりできる演奏データは、生のＭＩＤＩデータ（raw MIDI Data）の集まりであり、低レベルのデータしかやりとりすることができない。
本発明においては定義されたＨＭＦを用いて処理装置Ａと処理装置Ｂとの間で演奏データをやりとりすることができる。この場合、処理装置Ａにおいて使用している音源に最適なように表情づけされている時系列演奏データから、それらの情報を含むＨＭＤＭを作成してＨＭＦ形式で処理装置Ｂに送ることができる。処理装置ＢはＨＭＦ形式のデータを受け取ってＨＭＤＭを復元し、自分の使用している音源に最適な演奏データとなるように、ＨＭＤＭを展開して時系列イベントデータ列とされる演奏データを得るようにする。このときの展開は、予め処理装置Ｂに記憶させてある音源補正スクリプトを実行することにより行われる。
このように、高度な情報を含むシーケンス情報をＨＭＦでは流通させることができる。
なお、図示されていないが処理装置Ａと処理装置Ｂとは同様の構成とされており、上記説明では処理装置Ａから処理装置Ｂにデータを送るようにしたが、処理装置Ｂから処理装置Ａにデータを送ることも可能である。
【００１７】
前記した図１においては処理装置Ａおよび処理装置Ｂを機能ブロックにより表したが、処理装置Ａおよび処理装置Ｂのハードの構成を示すブロック図を図２に示す。
この図において、ＣＰＵ６１は動作プログラムを実行して種々の処理を行う中央処理ユニット（ＣＰＵ）であり、ＲＯＭ６２はＣＰＵ６１の動作プログラム等が格納されているリード・オンリ・メモリ（ＲＯＭ）であり、ＲＡＭ６３はＣＰＵ６１がプログラム実行時にワークメモリとして使用するランダム・アクセス・メモリ（ＲＡＭ）である。
【００１８】
ＨＤＤ（ハード・ディスク・ドライブ）６５およびＦＤＤ（フロッピー・ディスク・ドライブ）６６は動作プログラムや各種データを記憶しておく記憶装置であり、ＲＯＭ６２に動作プログラムが記憶されていない場合、このＨＤＤ６５あるいはＦＤＤ６６内のハード・ディスクあるいはフロッピー・ディスクに動作プログラムを記憶させておいて、記憶された動作プログラムをＲＡＭ６３に読み込むようにする。ＣＰＵ６１はＲＡＭ６３から動作プログラムを読み出して実行することにより、ＲＯＭ６２に動作プログラムが記憶されている場合と同様の動作をＣＰＵ６１に実行させることができる。なお、ＨＤＤ６５は書き込み／読み出しを自由に行うことができるので、動作プログラムの追加や、バージョンアップ等を容易に行うことができる。
【００１９】
また、スイッチ６７は操作パネルに設けられている操作指示用のスイッチであり、スイッチ６７の操作はスイッチ検出回路６８により検出されてＣＰＵ６１に知らされる。表示装置６９にはメニューや操作情報等が表示され、この表示を参照しながらユーザはスイッチ６７等を操作する。
ＣＤ−ＲＯＭドライブ７０は、ＣＤ−ＲＯＭに記憶されている動作プログラムや各種データを読み出す装置である。ＣＤ−ＲＯＭドライブ７０から読み出された動作プログラムや各種データは、ＨＤＤ６５内のハードディスクに書き込まれて記憶される。従って、動作プログラムの新規インストールやバージョンアップ等を容易に行うことができる。
【００２０】
ＭＩＤＩインタフェース（ＭＩＤＩ  Ｉ／Ｆ）７１はＭＩＤＩデータを送出あるいは受信するためのインタフェースであり、他のＭＩＤＩ機器７２が接続される。
通信インターフェース７３は、ＬＡＮ（Local Area Network）やインターネット、電話回線等の通信ネットワーク７４に接続されており、この通信ネットワーク７４を介して、サーバコンピュータ７５と接続される。ここで、ＨＤＤ６５内に動作プログラムや各種データが記憶されていない場合は、通信インタフェース７３を用いてサーバコンピュータ７５から動作プログラムや各種データをＨＤＤ６５にダウンロードする。
【００２１】
具体的には、クライアントとなる本発明の処理装置は、通信インターフェース７３および通信ネットワーク７４を介してサーバコンピュータ７５へ動作プログラムや各種データのダウンロードを要求するコマンドを送信する。サーバコンピュータ７５は、このコマンドを受け、要求された動作プログラムや各種データを、通信ネットワーク７４を介して、処理装置へ配信し、処理装置が通信インターフェース７３を介して、これら動作プログラムや各種データを受信してＨＤＤ６５に蓄積することにより、ダウンロードが完了する。
【００２２】
本発明は、前記したＨＭＦデータの処理装置および処理方法にかかるものであり、特に、従来のＳＭＦのフォーマットとは異なる図３（ａ）（ｂ）に示すようなＨＭＦ形式のパッケージを、従来のＳＭＦデータに収めるようにして従来のＳＭＦデータとの互換性を実現している。
すなわち、ＨＭＦ形式のパッケージを、例えばテキスト形式で記述されたメタイベントとしてＭＩＤＩデータを格納するトラック内に散在させたり、ＳＭＦデータを格納するトラックとは別のトラックに格納したりしている。このように、一組のデータの中に従来のＳＭＦデータと、ＨＭＦ形式のパッケージとが格納されており、従来の再生手段ではメタイベントとされたＨＭＦ形式のパッケージは無視されるため、格納されているＭＩＤＩデータのみを再生するようになる。また、ＨＭＦ形式のフォーマットのデータを再生することのできる再生手段では、メタイベントとされたＨＭＦ形式のフォーマットのデータのみを抽出して再生するようにする。これにより、ＨＭＦ形式のフォーマットのデータとＳＭＦデータとの互換性を実現することができる。
【００２３】
次に、本発明の詳細な説明を行うが、本発明のＨＭＦデータの処理装置はコンピュータに適用するソフトウェアで実現することも可能である。
まず、本発明の処理装置において処理が行われるＨＭＤＭの静的データ構造の典型的な全体像を図３（ａ）に示し、同図（ｂ）にＨＭＤＭに納められている典型的なパッケージの構造を示し、同図（ｃ）にパッケージに納められている典型的なシーケンスの構造を示す。
図３（ａ）に示すように、ＨＭＤＭは複数のパッケージ１１〜１３から構成される。パッケージには、通常一曲の演奏データを格納しているパフォーマンスパッケージ（Performance Package）１０と、利用頻度の高い便利なフレーズ断片やサブルーチン定義等を集めたプラグインパッケージ（Plug In Package）１１，１２と、基本的なデータ／サブルーチン定義を格納しているシステムパッケージ（System Package）１３の種類がある。また、同図（ｂ）に示すパッケージにはパッケージスクリプト３２と、３つのシーケンス２１，２２，２３が納められている。
なお、パッケージは、０または１つのパッケージスクリプトと、０以上のシーケンスからなる。すなわち、パッケージスクリプトや、シーケンスのいずれかが省略されたパッケージとすることもできる。
【００２４】
また、シーケンス（Sequence）は同図（ｃ）に示すようにイベントリスト（event list）３０と、このイベントリスト３０に対する変更を記述するスクリプト(Script)３１とを対にした構造とされており、ＨＭＦにおいて重要なデータ構造とされている。
さらに、スクリプト３１はイベントリスト３０に対して、「このイベントはもっとこうである」というような変更を加える手順を示すプログラムである。そして、同図（ｃ）に示すようにイベントリスト３０と対をなしているスクリプト３１がシーケンススクリプトと呼ばれ、同図（ｂ）に示すようにパッケージ内に単独で存在するスクリプト３２がパッケージスクリプトと呼ばれる。
【００２５】
さらにまた、イベントリストは複数のＭＩＤＩイベントを時刻つきで保持するものである。ＨＭＦでは、ここに後述するリンクイベントというものを置くことができ、リンクイベントにより、複数の演奏パートを複数のトラックにより表しているＳＭＦのトラックモデルに比べ、より柔軟な音楽演奏データ構造の記述を実現することができる。
なお、シーケンスに対して再生の指示やイベントに基づくデータ表示の指示など、その内容を要求すると、保持しているイベントリストに対してシーケンススクリプトを適用し、その結果を与えるようにしている。このように、イベントリスト部に演奏データの実体をおき、スクリプトで実体の内容の変更を記述するようにしている。
【００２６】
次に、ＨＭＦからどのようにしてＨＭＤＭ中の一つのパッケージが生成されるかについて述べる。
ＨＭＤＭの処理では、約２００の基本的な命令（命令セット）が定義されている。ＨＭＤＭは、これらの命令や数値を一列に格納した「実行コード」を受け取って、命令を順次実行することができる。命令には、ＨＭＤＭの内容を参照したり、変更するものなどがある。
この実行コードをテキストで記述する規則が定義されている。具体的には、命令・数値のテキスト表記やそれらの命令に引数を与える表記の規則などである。この規則で定義されるプログラミング言語を”Hyper Media Executable（ＨＭＥ）”と称呼するものとする。
【００２７】
ＨＭＤＭの処理を行うときは、ＨＭＥで書かれたテキストを読みとり、実行コードを生成してそれを実行する機能を持たせるようにする。このＨＭＤＭの内容を変更するプログラムは、ＨＭＥテキストを直接書く方法、あるいは、高級言語を使用してプログラムを書く方法により生成することができる。さらに、グラフィカルなインターフェースにより、ユーザに意識させずにシステムが自動的に生成してもよい。
いずれの方法で書かれたプログラムでもＨＭＤＭを処理する際は、テキストの内容を調べ、ＨＭＥであれば直接読みとって実行コードが実行される。あるいは、テキスト内で指定されているコンパイラを起動してそのテキストをＨＭＥテキストに変換し、変換されたＨＭＥを読みとって実行コードを実行する。なお、形式の判別のため、テキストの１行目にはコンパイラの名称をおくようにしているが、他の方法により形式を判別してもよい。
【００２８】
ＨＭＥは、ＨＭＤＭに対してあらゆる変更操作ができるように設計してあり、全く内容のない新規のパッケージから出発して、それに対して次々と変更操作を加えれば、どのような内容のパッケージでも作り上げることができる。そして、ＨＭＥはテキストで表記することができるので、容易にファイルに格納することができる。単純にテキストファイルとしてもよいし、あるいはＳＭＦ形式のファイルに、適当なＳＭＦメタイベントを用いて格納してもよい。
従って、ＨＭＥを用いて保存しようとするパッケージに含まれるすべての要素を順次登録していくような変更操作の並びを作成し、それをテキスト形式でファイルに保存すれば、パッケージの内容をファイルに記録することができることになる。
【００２９】
ところで、ＨＭＦはＨＭＤＭ中の一つのパッケージの内容を記述したファイルであり、この記述の方法としてＨＭＥを用い、パッケージの内容の記述を行うようにしている。以下、例を用いてテキスト記述からパッケージを復元できることを説明する。
テキスト記述は次のような構成となっているが、説明の都合上実際のＨＭＥそのものではなく、大まかな内容を示している。また、左端の番号も、説明の都合上付したものであり実際にはこの番号はテキストには含まれない。
【００３０】
”ＨＭＥ”language 1.00 Version
１．空のパッケージを作成し、それをｐとする。
２．空のパートシーケンスを作成し、それをｓとする。
３．イベントｅを作る；ｅの時刻は１００とする；ｅの内容は”９１  ４０  ４０”とする；ｅをｓに格納
４．イベントｅを作る；ｅの時刻は１５０とする；ｅの内容は”８１  ４０  ００”とする；ｅをｓに格納
５．ｓをｐに”seq_A”という名前で格納する
６．空のパートシーケンスを作成しそれをｓとする
７．イベントｅを作る；ｅの時刻は３００とする；ｅの内容は”９１  ５１  ４０”とする；ｅをｓに格納
８．イベントｅを作る；ｅの時刻は４５０とする；ｅの内容は”８１  ５１  ００”とする；ｅをｓに格納
９．ｓをｐに”seq_B”という名前で格納する
１０．ｐを出力する
【００３１】
なお、イベントｅの内容を表す３組の１バイトのデータにおいて、最初に位置するデータ”９１”はノートオン、データ”８１”はノートオフを表し、２番目に位置する１バイトのデータは１６進数でノートナンバを表し、３番目に位置する１バイトのデータは１６進数でベロシティを表している。
次に、ＨＭＤＭの処理時にこのテキストを読み込み、実行コードに変換して実行する様子を以下に示す。
ＨＭＤＭの処理時に、まず冒頭の”ＨＭＥ”を認識して、これはＨＭＥのテキストであると判断し、実行コードに変換する。ここで、別の言語が指定されており、それをＨＭＥテキストに変換する外部ソフトウェアが指定されていれば、その外部ソフトウェアを起動し、そのテキスト本体部分を処理させてその結果を受け取るようにする。
【００３２】
実行コードに変換して実行する様子を述べると、上記１で、新規の空のパッケージが作成される。このパッケージはメモリには確保されることになるが、また、ＨＭＤＭ中のパッケージの一つとしては登録されない。変数ｐでそれを参照する。
上記２で、空のパートシーケンスをメモリ上に用意する。
上記３および４で、用意したイベントに、必要なパラメータを設定し、パートシーケンスに格納する。実際には、イベントの数だけこれを並べればよい。この結果、パートシーケンスには、イベントが並んだ状態が作り出される。
上記５で、作り上げたパートシーケンスｓに名前を付けて、パッケージｐに登録する。
上記６，７，８，９では同様のことを繰り返し、新たなパートシーケンスを作り上げてパッケージｐに登録する。
【００３３】
以上で、新規のパッケージに、二つのパートシーケンス”seq_A””seq_B”が、内容が復元された状態で登録されたことになる。以下同様にパートシーケンスやカーブシーケンスを作成しては登録するという手順を記述していけばよい。パッケージスクリプトを表現するテキストの登録も同様に記述することができる。最後に作り上げたパッケージをＨＭＤＭのパッケージ列の末尾に追加する。あるいは、どこに挿入するかをユーザの指定に任せてもよい。このようにしてパッケージを組み上げてパッケージ列に組み込んだ後、さらにパッケージスクリプトを実行することになる。
以上の例で示したように、ＨＭＥでの記述を「実行」することにより、任意の内容を持ったパッケージを、ＨＭＦからＨＭＤＭの中に復元することができる。逆に、ＨＭＤＭのあるパッケージの内容を、ＨＭＥで記述し、テキスト形式でファイル化することが可能である。
【００３４】
次に、パッケージの詳細を前記図３および図４を参照しながら説明する。図４には”song1”と名付けられたパッケージが示されており、その中には、１つのパッケージスクリプトと、”root”，”bass-trk”，”bass-intro”，”bass-1”，”bass-2”，・・・，”drums-A”，”melody-cresc”と名付けられたシーケンス群が収められている。
このように、１つのパッケージは、０または１つのパッケージスクリプトと０以上のシーケンスからなっている。ただし、シーケンスは、図示するように一列にならべて管理されるわけではない。
【００３５】
パッケージは、以下に示すような役目をもっている。
まず、ＨＭＦのデータ流通の単位とされている。すなわち、ファイルのセーブ、ロードはパッケージ単位とされており、通常一曲の音楽演奏データを一つのパッケージとして流通させる。このようなパッケージをパフォーマンスパッケージ１０と呼ぶ。
一方、便利なフレーズ断片やサブルーチン定義をパッケージスクリプト中に集めたパッケージもあり、これをプラグインパッケージ１１，１２と呼ぶ。なお、一つのシーケンスをやりとりする場合でも、パッケージに入れて行なう。ただし、スクリプトのソースだけをテキストファイルとして交換することも可能である。
また、パッケージには、ＨＭＦシステムにはじめから提供される基本的なデータ／サブルーチン定義を格納することができ、このためのパッケージがシステムパッケージ１３である。
【００３６】
また、パッケージにはロード時の初期化スクリプトをおくことができる。これが、パッケージスクリプト３２であり、音楽演奏データごとの初期設定は、パッケージスクリプトを実行することにより行われる。
なお、パッケージ内の任意のシーケンスを指定するために、ＨＭＤＭでは名前を用いている。パッケージの中のシーケンスは名前を一つ持つことができ、これをシーケンス名と呼ぶ。シーケンス名は、それを含むパッケージをファイルにセーブし、その後でロードされた場合も保存される。ただし、一つのパッケージ内に、同名のシーケンスが複数存在することはない。すでに存在するものと同名のシーケンスをパッケージに登録すると、古い内容は捨てられ、新しいものに置き換えられる。
【００３７】
パフォーマンスパッケージの場合、パッケージ中のいずれかのシーケンスが「ルートシーケンス」となる。ルートシーケンスとは参照関係の起点となるシーケンスである。すなわち、外部からルートシーケンスの内容を要求すると、パッケージ内に含まれる他のシーケンスが参照され、その結果、例えば音楽演奏の全体のデータが得られる。パフォーマンスパッケージ中のあるシーケンスがルートシーケンスであることを示すには、シーケンス名を”root”とする。
ルートシーケンスも通常のシーケンスであるから、他のものと同様に作成される。なお、一般に、ルートシーケンスのスクリプトおよびイベントリストにはデータ全体に関する設定がおかれる。
【００３８】
パフォーマンスパッケージにおけるパッケージスクリプトには、その音楽演奏データを構成するための共通サブルーチンをおくことができる。また、その曲のための初期設定もここにスクリプトとして置くことができる。
なお、シーケンススプリクトを作成して、イベントリストに対し任意の変更を加えることが可能とされる。
【００３９】
プラグインパッケージは、便利なフレーズ断片やサブルーチン定義を集めたものである。一般のユーザは、完成品のプラグインパッケージをブラックボックスとしてＨＭＤＭにロードすることにより、あらかじめ仕上げられたシーケンスやサブルーチンを利用することができるようになる。ユーザがスクリプトの内容を変更、あるいは新規作成することも可能である。
プラグインパッケージには、ルートシーケンスは存在しない。パッケージスクリプト中に１つまたは複数のサブルーチン定義を格納しておくことにより、”サブルーチン集”とすることができる。たとえば、”slide”というサブルーチンが提供されていて、あるシーケンス内のイベントを２つ指定して、この”slide”というサブルーチンを呼ぶとそれらをギターのスライド奏法により演奏された状態のイベント書き換えることができるようになる。
【００４０】
また、プラグインパッケージは、例えば、“伴奏スタイル集”とすることができる。すなわち、ある伴奏パターンのシーケンスが定義されており、引数としてコードを指定して内容を要求すると、そのコードに応じて音高が変換された伴奏パターンのイベントリストを得ることができるようになる。
また、シーケンスを用いて、フレーズ集やカーブデータ集等を提供することができる。この場合、シーケンススクリプトがそれらの修飾の方法を提供しており、例えばフレーズ集のシーケンスに対して引数をつけて、該シーケンスの内容を要求すると、いろいろに変化したフレーズを得ることができる。
【００４１】
システムパッケージは、システム機能の付加的な部分を実現するためのパッケージであり、システムのプリミティブな機能の上に実装される。
システムパッケージには、ルートシーケンスは存在せず、パッケージスクリプトを用いて、基本的なサブルーチンが提供されたり、シーケンスを用いて、代表的な伴奏パターン等の基本的なデータなどが提供される。
【００４２】
次に、シーケンスについて説明すると、シーケンスはＨＭＦの核となるデータ構造の単位であり、イベントリストとスクリプトの組という形で構成され、パートシーケンスとカーブシーケンスとの２種類がある。このうちパートシーケンスには、シーケンスであって、保持するイベントが0-255の８ビットの並びであるバイト列、ＭＩＤＩの音高，オンベロシティ，オフベロシティを有しているノートイベント、および、後述するリンクイベントが納められている。また、カーブシーケンスにはシーケンスであって、保持するイベントが数値であるものが納められている。
なお、カーブシーケンス中にはリンクイベントは含まれない。
【００４３】
シーケンスは、内容を要求されると、保持しているイベントリストの写しを作り、スクリプトを実行してイベントリストを修飾する。そして、修飾されたイベントリストを出力する。すなわち、保持しているイベントリスト自体は書き換えられない。
例えば、図５に示すシーケンスに内容を要求（reference）すると、シーケンス中のスクリプトに記述された”melody notes harder ...”、および、”exaggerate tenuto”が実行されて、図示するようにメロディの各イベントのベロシティが増大（図ではイベントを示すバーの幅が太く表されている）されると共に、持続時間も長くされて、メロディが強めにされると共に、そのテヌートが強調されることになる。そして、このようにして書き換えられたイベントリストが返される（response）ことになる。また、必要に応じて引数を与えることもでき、たとえば「メロディノートを”１０％強く”」というように指定することも可能である。
【００４４】
また、シーケンスを構成するイベントリストとスクリプトは、静的にも動的にも独立した存在である。データ構造としても分離された形になっており、スクリプトの実行とイベントリストの演奏進行も全く別の過程となっている。すなわち、イベントリストの中にスクリプトがまじっていて演奏の進行と共にスクリプトが実行されるのではない。
このように、ＨＭＦでは元となる演奏の断片をＭＩＤＩイベントの形でイベントリストに保持しておき、スクリプトの引数を調節したりスクリプト自体を差し替えることにより、様々に変化させることができるのである。これにより、テンプレートの変更も容易に行うことができる。
なお、スクリプトはイベントリストに適用するコマンドを保持するものなので、スクリプトをみるとそのイベントリストの編集過程を知ることができる。すなわち、シーケンスは自己の編集過程を保持している演奏データともいえる。
【００４５】
ここで、シーケンスの指定方法について説明すると、ＨＭＤＭ内の特定のシーケンスを指定するには、パッケージ名とそこでのシーケンス名を合わせて指定するようにする。これは、パッケージ名はＨＭＤＭ内で一意的であると共に、シーケンス名はパッケージ内で一意的であるからである。
さらに、ＨＭＤＭでは、シーケンスの識別法として、前記名前による方法に加え、ＩＤ番号による方法でもよい。
ＩＤ番号は、あるパッケージのロードでＨＭＤＭに新たなシーケンスが加わると、ＨＭＤＭ中で一意性が保証される「ＩＤ番号」をＩＤマネージャが各シーケンスに与える。以後ＨＭＤＭでは、このＩＤ番号で任意のシーケンスを直接指定することができる。このように、ＩＤ番号は、パッケージではなくＨＭＤＭで一意的なものである。
【００４６】
このＩＤ番号は整数値であるが、通し番号とは限らない。従って、シーケンスを一つ削除しても他のシーケンスのＩＤ番号が変化するということはない。また、いったんＨＭＤＭに登録されれば、ＨＭＤＭから削除されるまでの間、シーケンスのＩＤ番号は不変とされる。
ただし、パッケージをＨＭＦ形式でエンコードする際にはＩＤ番号は記録されず、そのパッケージを後刻ＨＭＤＭにロードしたときに、各シーケンスに新しいＩＤ番号が与えられる。すなわち、新シーケンスの登録として扱われる。
【００４７】
つぎに、イベントリストの詳細を説明する。イベントリストは、イベントを時刻順に任意の数保持するようにしたデータ保持構造である。また、イベントは、開始時刻、持続時間、後述するラベルの３つの情報を次に示すいずれかのデータをあわせて保持するデータ単位である。
・バイト列・・・0-255の８ビットの並び
・ノートイベント・・・ＭＩＤＩの音高、オンベロシティ、オフベロシティを有しているイベント
・リンクイベント・・・リンクを保持しており、パートリンクイベントとカーブリンクイベントがある
・数値
【００４８】
このようなイベントを保持するイベントリストでは次のような特徴点がある。
１．各イベントに１つ以上のラベルをつけることができる。この時、各イベントにＩＤ番号がついていてもよい。
２．リンクイベントが用意されている。（これについては後述する。）
３．時変カーブ（折れ線）データの実体の保持にも用いることができる。（これについても後述する。）
【００４９】
ラベルは、イベントリスト中のイベントの識別を行うために付与されるもので、ユーザが任意に付与することができる。また、イベントの識別をＩＤ番号によって識別するようにしてもよい。
ラベルのついたイベントリストの例を図６に示すが、イベントリスト中の各イベントは、任意の文字列からなるラベルを任意の数持つことができる。また、ラベルのないイベントがあってもよい。
例えば図６では、左上のイベントに、”melody”，”tenuto”，”first”，という３つのラベルがつけられている。ＨＭＤＭにおいては、このラベルを用いてイベントを指定することができる。
【００５０】
ラベルづけは、従来のシーケンサソフトの対象イベント選択操作に対応している。従来のシーケンサソフトでは、対象となるイベントをマウスなどで任意の数指定し、それに対して編集を行なうようにしていた。イベントにラベルをつけることは、その「選択」を記録することに相当する。したがって、ラベルを指定すればその選択パターンを再現することができ、それに対して何らかの処理を施すことを容易に行うことができるようになる。
例えば図６において、「”melody”というラベルのついたイベント」と指定すると、上の破線で囲ったイベントをマウス等で選択するのと同様の効果を持つようになる。また、「”chord”というラベルのついたイベント」を指定すると、下の破線で囲ったイベントを選択することになる。なお、”melody”or”tenuto”というように複数のラベルを指定することも可能である。
【００５１】
また、ラベルは、ＨＭＦ形式にエンコードし後刻デコードした場合にも保存される。
ここで、図６ではピアノの両手の演奏が１つのシーケンスに入っている。そして、各イベントには、”melody”、”chord”、”bass”といったラベルが、それぞれあてはまるノートオンイベントに付与されている。したがって、スクリプトにおいて「”melody”というラベルのついたイベントは強めに」「”bass”というラベルのついたイベントは強めに」などという記述が可能となる。
【００５２】
次に、ラベルが付与されたイベントの選択的なイベント書き換え処理のフローチャートを図７（ａ）に示し、同図（ｂ）に示すイベントリストを参照しながらその説明を行う。
ここでは、ラベル”ｘｘｘｘ”を持つイベントの書き換えにおいて、ラベル”ｘｘｘｘ”がラベル”melody”の場合を例に挙げて説明する。イベント書き換え処理がスタートされると、ステップＳ１においてイベントリストにイベントが残っているか否かが判断される。この場合、処理が開始された直後であるので図７（ｂ）に示すイベントリストのすべてのイベントが残っており、ＹＥＳ（ｙ）と判断されてステップＳ２に進む。ステップＳ２ではイベントが一つ選択される。この場合、EventA1が選択され、ステップＳ３にてイベントに指定されたラベル”melody”が付与されているか否かが判断される。この場合、EventA1にはラベル”melody”が図７（ｂ）に示すように付与されているので、ＹＥＳ（ｙ）と判断されてステップＳ４に進む。ステップＳ４では、イベントに対し、強めにする等の指定された処理を実行し、ステップＳ１に戻る。
【００５３】
そして、ステップＳ１ないしステップＳ４の処理が再度行われるが、この場合は、EventC1が選択されるが、EventC1にはラベル”melody”が付与されていないのでステップＳ３にてＮＯ（ｎ）と判断されてステップＳ１に再度戻るようになる。
ついで、ステップＳ１ないしステップＳ４の処理が順次選択された図７（ｂ）に示すイベントに対して実行され、図７（ｂ）に示すイベントリストのすべてのイベントに対して処理が実行されると、ステップＳ１にてＮＯ（ｎ）と判断されてイベント書き換え処理は終了する。この結果、この場合はラベル”melody”が付与されているEventA1，EventA2に対してイベント書き換え処理が実行されることになる。
【００５４】
また、ＨＭＦは、イベントリスト中のイベントを識別するため補助的にＩＤ番号も用いることがある。
この補助的な機構は、スクリプト言語との兼ね合いのためのものである。スクリプトの処理速度や複雑さとのトレードオフのため、ラベルによるイベント識別のための十分な機構（連想配列など）が言語に提供できない可能性もある。この場合、もっとも基本的なデータである整数でイベントを識別する必要が生じる。このため、ＩＤ番号が補助的に用いられるのである。
【００５５】
図８に、ＩＤ番号をイベントに付与する機構の一例を示す。
ユーザ入力などでイベントリストに新たなイベントが加わる際、イベントリスト中で一意性が保証される「ＩＤ番号」が各イベントに与えられる。以後、このＩＤ番号で、任意のイベントを直接指定することができるようになる。
例えば、図８では、”NoteOn a3 64”というイベントを時刻０に印加している。このイベントの登録の際、ＩＤ manager４０は、その時点でほかのどのイベントにも使われていない数値「１」をこのイベントに与える。以後、このイベントリストの中では、ｉｄ＝１とすれば必ずこの時刻０の”NoteOn a3 64”のイベントが指定されることになる。
【００５６】
なお、ＩＤ番号は整数値であり、通し番号とする必要はない。従って、イベントを一つ削除しても、他のイベントのＩＤ番号が変化することはない。また、いったんイベントリストに登録されれば、削除されるまで、イベントのＩＤ番号は不変である。
例えば図８においてｉｄ＝１６のイベントを削除しても、他のどのイベントのＩＤ番号も変化しない。
ただし、あるイベントをイベントリストから削除し、ふたたび同一イベントを登録した場合、はじめのＩＤ番号は保存されず、新しいＩＤ番号が与えられる。すなわち、イベントリストへの新イベントの登録として扱われるようになる。
【００５７】
次に、スクリプトの説明を行う。スクリプトは、前述したようにイベントリストを修飾する手順を記したプログラムである。
スクリプトの内容は、対象となるイベントを設定し、設定されたイベントに対して行う操作を示すことの繰り返しとされている。対象となるイベントの設定方法としては、前記したようにイベントに付与されているラベル、あるいはＩＤ番号を指定することにより設定する方法や、時刻範囲を指定してその時刻範囲に含まれるイベントを指定する方法がある。
図９にスクリプトの内容の一例をイベントリストと対応づけて示す。この図に示すスクリプトの一行目では、”melody”というラベルの付いたイベントについてベロシティを１０増加する処理がプログラムされている。また、２行目では、ＩＤが３６であるイベントの音高をＣ３と設定している。さらに、３行目では、”slur”で始まるラベルの付いたイベントについてスラー処理をしている。
なお、３行目の”slur”に付された＊印はワイルドカードであり、これには”slur１”、”slur２”、”slur３”等のラベルが該当する。
【００５８】
なお、図９に示すスクリプトの表記は概念的なものであり、本発明における前述した実際のプログラミング言語とは異なるものである。
設定されたイベントに対するスクリプトの操作としては、イベント内容の読み出し、イベント種類の判別、値の変更、イベント自体の消去、新たなイベントの追加、ラベルの追加／削除／改名等の操作がある。
スクリプト言語としては、アセンブラ等の低水準の言語を用いることができる。この場合、直接この言語でスクリプトを記述してもよいし、高級言語を設計し、この言語へのコンパイラを用意するようにしてもよい。
【００５９】
また、各シーケンスが内蔵するスクリプトを、シーケンススクリプトと呼ぶ。
シーケンススクリプトには、対応するイベントリストの内容と密接に関連した記述がなされている。
一般にシーケンススクリプトは、「このようなイベントに対して、このような変更を施す」というイベントリスト編集コマンドが、反復や条件分岐をまじえて多数書かれている。
なお、シーケンススクリプト中でサブルーチンを定義することは可能である。
【００６０】
さらに、各パッケージ毎に登録されるスクリプトをパッケージスクリプトと呼ぶ。
パッケージスクリプトは、前記図４の最上段に示されているが、パッケージをロードする際にパッケージスクリプトは一度実行される。そこで、このパッケージスクリプトで汎用サブルーチンの定義を記述しておけば、パッケージをロードするだけで新たなサブルーチンを利用することが可能となる。
このことから、パッケージスクリプトは、そのパッケージを使う上で必要な初期設定と、汎用サブルーチンの定義とで占められている。ここでのサブルーチンの定義は、外部からも利用可能となる。
【００６１】
次に、本発明の特徴点の一つであるカーブデータについて説明する。
ピッチベンドや音量等を変化させる変化カーブは、連続的に変化する量のデータとされており、ＳＭＦにおいて変化カーブのデータは、具体的なイベントの離散的な列で表現されている。例えば、図１０（ａ）のＡに示す離散的なイベントデータ列により本来連続的に変化する量が表されている。すると、このＡに示すイベントデータ列と、図１０（ａ）のＢに示すイベントデータ列とを加算して新たな変化カーブの変化特性を作成しようとしたとき、単純に混合すると、図１０（ａ）のA，Bmixに示すように個々の変化カーブを正しく加算した変化特性とはならない。
【００６２】
そこで、ＨＭＦでは、カーブデータ（折れ線データ）を定義し、図１０（ｂ）に示すように操作する枠組みを与えるようにする。このように定義すると、図１０（ｂ）のＡに示す折れ線のカーブデータと、同図のＢに示す折れ線のカーブデータとを加算することにより、同図のA，Bmixに示すように新たなカーブデータを得ることができるようになる。
これにより、ボリュームやテンポ、その他あらゆる時変パラメータを抽象化することが可能となる。また、このカーブデータはそのままで処理装置間でやりとりすることができるようになる。
【００６３】
このカーブデータは、例えば、前記図４に示すcurve”melody-cresc”に示すシーケンスに保持されているように、シーケンスの一種として管理され、これをカーブシーケンスと称呼する。すなわち、カーブシーケンスとはシーケンスを使用してカーブを実際に表したシーケンスである。このカーブシーケンスを図１１に示す。パートシーケンスでは、図示するようにイベントリストにＭＩＤＩイベント列が時刻順で保持されるが、カーブシーケンスでは、イベントリストを使用してカーブの変化点の時刻と値の組を格納している。なお、イベントとイベントの間の任意の時刻のカーブデータの値は適切な内挿法、例えば直線補間法等を用いることにより得るようにしている。
カーブの内容の参照には、後述するリンクイベントを用いる。パートシーケンス中の任意の時刻に、シーケンスの一種であるカーブシーケンスの内容を要求するイベント（カーブリンクイベント）をおくようにする。このカーブリンクイベントでは、カーブの名前等のカーブの識別情報や、このカーブを音量あるいはピッチに適用する等の適用先の情報を含ませることができる。
【００６４】
また、特定のイベントにカーブが固定されることがなく、例えばピッチベンド用のカーブデータをボリュームを変化させるカーブデータに書き換えて用いることができるようになる。
なお、カーブデータは時刻から値への変換関数となっている。これに基づき、「ある時刻での値を得る」、「カーブから適切な間隔のＭＩＤＩイベントを生成する」、「既存のＭＩＤＩイベント列からカーブシーケンスを逆生成する」といったことが可能となる。また、カーブどうしの加算なども定義されており、カーブによる表現を重ねていくことが可能となる。
カーブシーケンスの変形操作は、実際にはパートシーケンスにおけるイベントリストの編集と同様に行うことができる。
【００６５】
次に、ピッチベンドの表現づけにカーブデータを利用する例を図１２を参照しながら説明する。
図１２は、ユーザが、”curve−a1”というカーブデータをピッチベンドのストリップチャートに取り込んだところを示しており、システムは、このカーブから適切な間隔のピッチベンドイベントを自動的に生成して発生すべきＭＩＤＩイベント列内に挿入する。この場合、ユーザがカーブデータ”curve−a1”の形状を変更すると、システムはピッチべンドのイベントを生成し直すようになる。
【００６６】
なお、カーブシーケンスに対してスクリプトを付加するようにして、参照時にスクリプトを実行することにより、元の折れ線を書き換え、書き換え後のイベント間を内挿して最終的なカーブデータを得るようにしてもよい。また、カーブリンクイベントによってカーブを参照する際に、カーブリンクイベントを含むシーケンスのスクリプトを実行して、折れ線を書き換えてもよい。さらに、カーブデータの各点に対してラベルをつけることにより、各点のデータを選択的に書き換えるようにしてもよい。これにより、カーブの変化特性を容易に変更することができる。
なお、折れ線のカーブデータにおいて、任意の時刻の値は適切な内挿を行うことにより得るようにする。これにより、折れ線データから適切な間隔の離散的イベント列を生成することができる。
【００６７】
次にシーケンスリンクイベントについて説明する。
シーケンスにおいては、パートシーケンスのイベントリスト中に「シーケンスリンクイベント」を置くことができる。シーケンスリンクイベントは、他のあるシーケンス（パートシーケンスやカーブシーケンス）を指定する。そして、該シーケンスリンクイベントの時刻以降にそのリンクイベントが指定するシーケンスを取り込むべきであるということを示す役目をもっている。
例えば図１３（ａ）では、”melody”というパートシーケンスのイベントリストの時刻ｔの位置に“chord”というパートシーケンスへのシーケンスリンクイベントが置かれている。スクリプトを実行して最終的なパートシーケンス”melody”を得る時に、パートシーケンス”melody”のスクリプトが実行されてイベントリストが修飾される。スクリプトの実行が終了すると、シーケンスリンクイベントの解決が図られ、パートシーケンス”chord”の取り込みが起きる。こうして、図１３（ｂ）に示すように、パートシーケンス”chord”を取り込んだパートシーケンス”melody”が得られる。この処理は、演奏が進むにつれて実行されるのではなく、パートシーケンス”melody”の内容を得ようとしたときに実行される。
【００６８】
本来イベントリストは時刻付きＭＩＤＩイベントの集合であり、イベントリスト中のＭＩＤＩイベントは必ずＭＩＤＩ出力されるものである。シーケンスリンクイベントは、イベントリスト中に置かれながら、ＭＩＤＩ出力には送出されず、シーケンス間の関連を表示するだけのものである。
なお、前記したようにリンクは、再生時に解決されるものではない。リンクイベントで示されるリンクは、シーケンス間の関連を静的に示しているだけであり、リンク解決のプロセスは、演奏のプロセスとは無関係にパートシーケンスの内容が参照された時に進行するのである。
なお、シーケンスの内容を要求する際、引数を渡すことができる。
【００６９】
このリンク機構により、現在の一般的なシーケンサソフトが採用しているトラックモデルの音楽演奏データ構造を表現することができる。従って、トラックモデルと同様の音楽演奏データ構造を表現しながらも、複数のシーケンサソフト間で音楽演奏データを、その階層構造の情報までも含めて交換することが可能となる。これはＳＭＦによるトラックモデルを用いた従来ではできなかったことである。
例えば、図１４（ａ）に示すtrack１ないしtrack５の５つのトラックからなるデータを、同図（ｂ）に示すルートシーケンスの時刻０にｓｅｑ１からｓｅｑ５までの５つのシーケンスを取り込むというリンク構造で表現している。
【００７０】
また、同図（ａ）に示すトラックモデルにおいて各トラック内にフレーズ断片が配置される構造は、同図（ｂ）に示すように子シーケンスの適切な時刻にリンクイベントを置いて表現するようにする。例えば、図１４（ａ）において、track１にpart a，part b，part cが置かれている状態は、同図（ｂ）に示すようにseq1の適切な時刻にseq a，seq b，seq cへのリンクイベントを置くことで表現することができる。
さらに、一部のシーケンサソフトに見られるような、シーケンスが階層的になった構造も、同様にして表現することができる。
【００７１】
ルートシーケンス以外のシーケンスは、リンクしない限りＭＩＤＩ出力に寄与しない。したがって、典型的表現パターンを一つずつ入れたシーケンスを多数用意しておき、好きなものをリンクして利用することができる。このため、リンクの枠組は、典型的表現パターンの利用にも都合がよいものである。
また、一つのシーケンスが、任意数の他のシーケンスを参照することができ、さらに、複数のシーケンスが、システムのどこかに存在するある一つのシーケンスを参照することもできる。ただし、参照がループを構成することは禁止される。このループとは、シーケンスＡがシーケンスＢを、シーケンスＢがシーケンスＣを、そしてシーケンスＣがシーケンスＡを参照しているように、参照がループ状とされている状況をいう。
なお、リンクイベントにおいてシーケンスを指定するばあいは、リンクイベントも、ＩＤ番号でなくパッケージ名とシーケンス名で参照対象を保持するようにしている。
【００７２】
次に、ＨＭＦの静的なデータ構造が、外からの要求に対してどのような動的な振る舞いをするのかについて説明する。
図１５に示すように、例えば、ファイルシステムの記録媒体４に格納されているＨＭＦファイルから一つのパッケージをロードすると、パッケージのロード時にパッケージスクリプトが実行されて、サブルーチンの定義があれば、パッケージディクショナリを用意してそこにサブルーチン定義が格納される。
ここでディクショナリについて説明すると、ディクショナリはスクリプトで出現する変数／サブルーチンを保持するものであり、パッケージごとにあるパッケージディクショナリと、スクリプト実行中だけ存在するデータ保持用のディクショナリスタックとの２種類がある。
【００７３】
たとえば、図１５に示すように、（１）ＨＭＦ形式のパッケージ”GMbasicExpr2”をロードすると、ユーザが指定した位置にパッケージ”GMbasicExpr2”をロードした内容がおかれる。ついで、（２）パッケージスクリプトの実行が行われ、（３）パッケージ”GMbasicExpr2”内のサブルーチン定義”cresc1”が、パッケージ”GMbasicExpr2”に対応する位置に作成されたディクショナリ５０に格納される。パッケージ内のシーケンススクリプトは実行形式にコンパイルしておくが、まだ実行はしない。
図１５では、ＨＭＦ形式のパッケージ”song１”をロードしたときに、そのパッケージスクリプトが実行されその中のサブルーチン定義”b72vol”が、パッケージ”song１”に対応する位置に作成されたディクショナリ５１に格納されており、パッケージ”basicExpr１”をロードしたときに、そのパッケージスクリプトが実行され、サブルーチン定義”cresc1”が、パッケージ”basicExpr１”に対応する位置に作成されたディクショナリ５２に格納されている。
ただし、ディクショナリスタック”dict. stack”はまだ作成されていない。
【００７４】
つぎに、ＨＭＦ形式のデータがロードされた状態において、ユーザが音楽演奏データを構成する一つのシーケンスの内容を参照したときの振る舞いを説明する。
ユーザが、音楽演奏データを構成する一つのシーケンスの内容を参照しようとしたときのシーケンス参照処理を図１６ないし図１８を参照しながら説明する。なお、図１６はシーケンス参照処理を模式的に示す図であり、図１７、図１８はシーケンス参照処理のフローチャートを示す図である。
【００７５】
図１７（ａ）に示すシーケンス参照処理のフローチャートにおいて、シーケンス参照処理がスタートされると、ステップＳ１０にて図１６（ａ）に示すようにイベントリストＬの複製イベントリストＬ’を作る処理が行われる。このステップＳ１０の処理が図１７（ｂ）に示すフローチャートに示されており、イベントリストＬの複製作成処理がスタートされると、ステップＳ２０にて空の複製イベントリストＬ’が生成される。ついで、ステップＳ２１にてイベントリストＬにイベントが残っているか否かが判断され、残っている場合はＹＥＳ（ｙ）と判断されてステップＳ２２に進みイベントを一つ複製しイベントリストＬ’へ登録する。ステップＳ２０およびステップＳ２１の処理はイベントがイベントリストＬに残っている間循環して行われ、イベントが残っていないときにＮＯ（ｎ）と判断されてイベントリストＬの複製作成処理が終了する。
【００７６】
ステップＳ１０の処理が終了すると、ステップＳ１１にて複製されたイベントリストＬ’に対して図１６（ｂ）に示すようにシーケンススクリプトを適用する処理が行われる。このステップＳ１１の処理が図１７（ｃ）に示すフローチャートに示されており、シーケンススクリプト適用処理がスタートされると、ステップＳ３０にてスクリプトに命令が残っているか否かが判断される。この処理の開始直後には命令が残っているので、ＹＥＳ（ｙ）と判断されてステップＳ３１に進み、命令が一つ実行され、ステップＳ３０に戻る。ステップＳ３０とステップＳ３１の処理はスクリプトに命令が残っている間循環して行われて、命令が１つづつ実行されていく。そして、スクリプト内の命令がすべて実行されると、ステップＳ３０にてＮＯ（ｎ）と判断されてシーケンススクリプト適用処理が終了する。
【００７７】
ステップＳ１１の処理が終了すると、ステップＳ１２にて複製されたイベントリストＬ’のパートリンクが図１６（ｃ）に示すように解決される処理が実行される。このパートリンク処理のフローチャートを図１８（ａ）に示すが、パートリンク処理がスタートされると、ステップＳ４０にてイベントリストＬ’にパートリンクが残っているか否かが判断される。イベントリストＬ’にパートリンクが残っている場合は、ＹＥＳ（ｙ）と判断されてステップＳ４１に進む。ステップＳ４１ではリンクすべきパートが所定の順序で探索され、ステップＳ４２にて対象パートが発見されたと判断（ｙ）された場合には、ステップＳ４３にてそのパートの内容が参照される。ついで、ステップＳ４４にて得られたイベントリストの内容をイベントリストＬ’にマージし、さらにステップＳ４５にて処理したリンクイベントを削除して、ステップＳ４０に戻る。
【００７８】
なお、ステップＳ４２にて対象パートが発見されないと判断（ｎ）された場合は、ステップＳ４５にジャンプしてそのリンクイベントが削除される。また、ステップＳ４０ないしステップＳ４５の処理はイベントリストＬ’にパートリンクが残っている間循環して実行され、順次パートリンク処理が実行される。そして、イベントリストＬ’に残ったパートリンクがなくなると、ステップＳ４０にてＮＯ（ｎ）と判断されてパートリンク処理が終了する。
【００７９】
ステップＳ１２の処理が終了すると、ステップＳ１３にて複製されたイベントリストＬ’のカーブリンクを図１６（ｄ）に示すように解決する処理が実行される。このカーブリンク処理のフローチャートを図１８（ｂ）に示すが、カーブリンク処理がスタートされると、ステップＳ５０にてイベントリストＬ’にカーブリンクが残っているか否かが判断される。イベントリストＬ’にカーブリンクが残っている場合は、ＹＥＳ（ｙ）と判断されてステップＳ５１に進む。ステップＳ５１ではリンクすべきカーブが所定の順序で探索され、ステップＳ５２にて対象カーブが発見されたと判断（ｙ）された場合には、ステップＳ５３にてそのリンクのパッケージ指定を確定して、ステップＳ５０に戻る。
【００８０】
なお、ステップＳ５２にて対象カーブが発見されないと判断（ｎ）された場合は、ステップＳ５０にそのまま戻る。また、ステップＳ５０ないしステップＳ５３の処理はイベントリストＬ’にカーブリンクが残っている間循環して実行され、順次カーブリンク処理が実行される。そして、イベントリストＬ’に残ったカーブリンクがなくなると、ステップＳ５０にてＮＯ（ｎ）と判断されてカーブリンク処理が終了する。
これにより、シーケンス参照処理は終了する。
【００８１】
ここで、パートリンクおよびカーブリンクがどのように解決されていくかを、図２８を参照して説明する。
図２８は、パートシーケンス”synth_track”から他のパートシーケンス”synth_bridge”へとパートリンクがはられ、さらにそのパートシーケンス”synth_bridge”からさらに他のパートシーケンス”synth_1_measure”へとパートリンクがはられている状態を示している。また、パートシーケンス”synth_track”からはカーブシーケンス”synth_total_pb”へとカーブリンクがはられ、パートシーケンス”synth_bridge”からカーブシーケンス”synth_bridge_pb”へとカーブリンクがはられ、パートシーケンス”synth_1_measure”からカーブシーケンス”synth_pb_1”へとカーブリンクがはられている。
【００８２】
このような状態において、パートシーケンス”synth_track”の内容を参照すると、そこにはパートリンクイベントが存在するので、図１８（ａ）に示したフローチャートにしたがって、リンクすべきパートシーケンスが検索され、見つかったリンク先のパートシーケンス”synth_bridge”の内容が参照される。
なお、リンクすべきパートシーケンスの検索は、後述するサーチパスによって実行される。
そして、パートシーケンス”synth_bridge”の内容を参照すると、そこにもパートリンクイベントが存在するので、リンクすべきパートシーケンスが検索され、見つかったリンク先のパートシーケンス”synth_1_measure”の内容が参照される。
【００８３】
パートシーケンス”synth_1_measure”からは、他のパートシーケンスへのリンクがはられていないので、この時点で、パートシーケンス”synth_1_measure”の内容が、パートシーケンス”synth_bridge”にマージされ、パートシーケンス”synth_bridge”内に存在していたパートリンクイベントは削除される。
なお、パートシーケンス”synth_1_measure”内にはカーブリンクイベントが存在しているので、パートシーケンス”synth_bridge”内には、このカーブリンクイベントもあわせてマージされ、その結果、パートシーケンス”synth_bridge”内には２つのカーブリンクイベントが存在するようになる。その後、パートシーケンス”synth_bridge”の内容がパートシーケンス”synth_track”へとマージされ、パートシーケンス”synth_track”内に存在していたパートリンクイベントは削除される。
【００８４】
なお、パートシーケンス”synth_track”内には、パートシーケンス”synthbridge”内に存在していた２つのカーブリンクイベントもあわせてマージされる。その結果、パートシーケンス”synth_track”内には、３つのカーブリンクイベントが存在するようになる。そして、パートシーケンス”synth_track”内に存在していたパートリンクイベントは削除されたので、図１８（ａ）に示すフローチャートの処理は終了する。
次いで、図１８（ｂ）に示したフローチャートに従って、パートシーケンス”synth_track”内に集められた３つのカーブリンクイベントが解決される。リンクすべきカーブシーケンスが１つづつ検索され、それぞれのカーブシーケンスが確定される。
【００８５】
カーブシーケンスが確定された後、各カーブシーケンスの内容に基づいて実際のイベント、たとえばピッチベンドイベントに展開され、最終的にパートシーケンス”synth_track”内にイベントデータが取り込まれる。このとき、３つのカーブリンクイベントのうち、いずれか２つあるいは３つのカーブリンクイベントの存在する位置が近接していると、カーブシーケンス同士が部分的に重なることがある。このように、複数のカーブシーケンスが重なった部分については、後述するような手法によって合成処理が施され、１つのカーブシーケンスが形成される。
【００８６】
また、カーブリンクイベント自体も、合成された複数のカーブシーケンスに対応するもののうちの最も前方に位置するもののみが残され、他のカーブリンクイベントは削除される。なお、はじめから１つのパートシーケンス内に複数のカーブリンクイベントが存在し、それらカーブリンクイベントによってパートシーケンス内に取り込まれるカーブシーケンス同士が重なる場合についても、上記と同様に合成される。
【００８７】
このようなシーケンス参照処理を、図１９に示すパフォーマンスパッケージ”song１”のシーケンス“root”の内容が参照されて実行される場合を例にあげて説明する。
まず、シーケンス参照処理に先立ち（ａ）パフォーマンスパッケージ”song１”のシーケンス“root”の内容の要求が入ってくる。ついで、（ｂ）シーケンス“root”のシーケンススクリプトの実行が始まる。この実行中に、（ｃ）シーケンススクリプト中にある一時サブルーチン定義“fz”を作成したディクショナリスタック”dict. stack”に置く。さらに、（ｄ）シーケンススクリプトを実行することにより、シーケンス“root”のイベントリストの内容が修飾される。
【００８８】
シーケンススクリプトの実行が終了すると、（ｅ）イベントリスト中のシーケンスリンクイベントの解決が行なわれる。すなわち、参照先のシーケンスの内容を要求し、返ってきた結果のイベントリストを、リンクイベントのあった位置にマージする。図示する場合は、“basicExpr１”内のあるシーケンスの内容が要求されているとする。図示するように、（ｆ）下位のシーケンスの内容参照が再帰的に深さ優先で進むようになる。
以上のプロセスで、（ｇ）最終結果のイベントリストを得ることができる。一連の参照実行が終ると、デイクショナリスタックの”fz”という一時サブルーチン定義はクリアされる。
【００８９】
このように再帰的に深さ優先で進むシーケンス内容参照処理のフローチャートを図２０に示す。このフローチャートにおいて、シーケンス内容参照処理がスタートされると、ステップＳ６０にてイベントリストの複製を書き換える。ついで、ステップＳ６１にて書き換え結果をスタックに積み、さらにステップＳ６２にて他パートシーケンスへのリンクがあるか否かが判断される。ここで、他パートシーケンスへのリンクがある場合は、ＹＥＳ（ｙ）と判断されてステップＳ６３に進み、対象パートシーケンスの内容が参照される。ついで、ステップＳ６４にて参照結果（スタック上）を、自己の書き換え結果に取り込み、ステップＳ６２に戻る。ステップＳ６２ないしステップＳ６４の処理は、他パートシーケンスへのリンクがある間循環して実行され、リンクがなくなるとＮＯ（ｎ）と判断されてシーケンス内容参照処理は終了する。
【００９０】
このシーケンス内容参照処理が、図２１（ａ）に示すように他パートシーケンスへのリンクを持つシーケンス群に実行される場合の、スタックの変化を同図（ｂ）に示す。
図２１（ａ）に示すようにシーケンスＡはシーケンスＢおよびシーケンスＣへのリンクを持っており、シーケンスＢはシーケンスＤに、シーケンスＤはシーケンスＧおよびシーケンスＨへのリンクを持っている。さらに、シーケンスＣはシーケンスＥおよびシーケンスＦへのリンクを持っており、シーケンスＦはシーケンスＩへのリンクを持っている。
【００９１】
この場合、図２０に示すシーケンス内容参照処理が実行されると、図２１（ｂ）に示すように、シーケンスＡの内容が参照され、シーケンスＢがスタックされる。ついで、シーケンスＢの内容が参照され、シーケンスＤがスタックされ、さらに、シーケンスＤの内容が参照され、シーケンスＧがスタックされる。シーケンスＧはリンクを持っていないので、書き換え結果を下矢印で示すようにシーケンスＤに返す。シーケンスＤはさらにシーケンスＨへのリンクを持っているので、シーケンスＨがスタックされる。シーケンスＨはリンクを持っていないので、書き換え結果を下矢印で示すようにシーケンスＤに返す。
シーケンスＤはこれ以上のリンクを持っていないので、書き換え結果をシーケンスＢに返す。さらにシーケンスＢは書き換え結果をシーケンスＡに返す。このような処理がシーケンスＣ，Ｅ，Ｆ，Ｉにも同様に行われて、スタックは図２１（ｂ）に示すように変化していく。
【００９２】
ところで、スクリプト内では、シーケンスリンクを解決するサブルーチン（システムレベルで提供されている）を明示的に呼びだすことができる。この場合、その時点でイベントリスト内のシーケンスリンクが解決される。同様に、カーブリンクの解決サブルーチンも呼び出し可能である。これらのサブルーチン呼び出しを実行すると、スクリプトのその後の部分では、下位シーケンスの内容を処理対象に含めることが可能となる。
【００９３】
また、スクリプト中でリンクイベントを書き換えたり削除してしまう記述も可能である。これを実行した場合、つづくリンク解決では、書き換えたあとのリンクイベントが処理される。
この仕様により、何もスクリプトを書かないと、上位シーケンスでの表情づけが下位シーケンスのイベントには及ばないという動作となる。したがって、スクリプトを書くことによって、上位シーケンスでの表情づけを下位シーケンスのイベントにも及ぼすという動作を実現することができるようになる。
【００９４】
次に、パッケージおよびディクショナリのサーチパスについて説明する。
まず、サーチの必要性について説明すると、リンクイベントにより参照されるシーケンスは、該リンクイベントが含まれるパッケージ以外のパッケージ中に存在してもよい。また、スクリプトの中には、サブルーチンを呼び出すための命令が含まれることが普通であるが、そのサブルーチンの実体がそのスクリプトと同一のパッケージ中に含まれているとは限らない。そこで、パッケージやサブルーチンのサーチが必要となる。
ＨＭＤＭのデータ構造では、概念上パッケージを一列に並べて保持している。また、各パッケージが定義するサブルーチンは、前記したようにパッケージごとに「ディクショナリ」が用意されてそこに格納される。このパッケージおよびディクショナリの並びをサーチパスとよび、この並び順にパッケージやディクショナリをサーチするようにしている。
【００９５】
また、ＨＭＤＭのデータ構造では、パッケージおよびディクショナリの順序すなわちサーチパスは次のように規定されている。
１番目は、ディクショナリについてはディクショナリスタックであり、つづいて、２番目はパフォーマンスパッケージに対応するディクショナリである。また、パッケージについては、１番目がパフォーマンスパッケージである。この場合、パフォーマンスパッケージおよびそれらに対応するディクショナリは複数存在してもよく、その順序はユーザが自由に変更することができる。
【００９６】
ディクショナリの３番目は、プラグインパッケージに対応するディクショナリであり、パッケージの２番目はプラグインパッケージである。これらも複数存在してもよく、その順序はユーザが自由に変更することができる。サブルーチンをサーチする場合、サーチパスにより規定された順にディクショナリをチェックしていくので同名のサブルーチンが存在する場合、先に見つかったサブルーチンが優先される。これにより、サブルーチンのオーバライドが実現される。
ディクショナリの４番目は、システムパッケージに対応するディクショナリであり、パッケージの３番目はシステムパッケージである。これらは最初からサーチパスの端に組み込まれており、ユーザが位置を変更することはできない。
【００９７】
図１９に示す例では、ディクショナリスタック”dict. stack”、“song１”のパフォーマンスパッケージおよび対応するディクショナリ、”basicExpr1”のプラグインパッケージおよび対応するディクショナリ、”GMbasicExpr2”のプラグインパッケージおよび対応するディクショナリ、そして“sys1.00”のシステムパッケージおよび対応するディクショナリという順序でサーチパスが構成されることになり、リンクイベント解決時にこの順でシーケンス名がサーチされ、スクリプトの実行時にこの順でサブルーチン名がサーチされることになる。
【００９８】
次に、このサーチパス探索機構について説明する。
シーケンス名の探索においては、シーケンス名が単独で現れる場合は、以下の手順で探索し、最初に該当したものを選択する。
１．属するパッケージの中で、そのシーケンス名を探す。
２．サーチパスの順序に従い、その次のパッケージに移ってシーケンス名を探す。
３．最後のパッケージ（システムパッケージ）にもシーケンスが見当たらなければ、「シーケンスが見当たらない」旨の表示を行う等のしかるべき処置に移る。
また、パッケージ名も組み合わせてシーケンスが指定される場合は、指定したパッケージの中で、そのシーケンス名を探しそこに見当たらなければ、「シーケンスが見当たらない」旨の表示を行う等のしかるべき処置に移る。
【００９９】
次に、サブルーチン名の探索において、サブルーチン名が単独で現れる場合は、次のように探索する。
１．ディクショナリスタックの中で、そのサブルーチン名を探す。
２．属するパッケージに対応するテイクショナリの中で、そのサブルーチン名を探す。
３．サーチパスの順序に従い、次のデイクショナリに移ってサブルーチン名を探す。
４．最後のディクショナリ（システム）にも見当たらなければ、「サブルーチンが見当たらない」旨の表示を行う等のしかるべき処置に移る。
さらに、パッケージ名も組み合わせてサブルーチン名が指定される場合は、指定したパッケージの中で、そのサブルーチン名を探す。そこに見当たらなければ、「サブルーチンが見当たらない」旨の表示を行う等のしかるべき処置に移る。
【０１００】
つぎに、パッケージの順序によるサブルーチンのオーバーライドの実現について説明する。
プラグインパッケージで定義したサブルーチンが、パッケージ名と組み合わせて指定された場合は、他のパッケージの同じ名前のサブルーチンと混同されることはない。この場合は、どのような順序でプラグインパッケージを置いても動作に影響はない。
そこで、パッケージを明示せずサブルーチン名だけで指定しておき、同名のサブルーチンを含む別のパッケージをサーチパスの前の方に置くようにすると、そのパッケージを差し込むことにより、別のサブルーチンを実行させることができる。これによりオーバーライドを実現することができる。この場合、サーチパス中のパッケージの順序が動作に影響を与えることになる。
【０１０１】
次に、カーブデータの加算について図２２ないし図２６を参照しながら説明する。
カーブデータの加算とは、シーケンスリンクを解決する過程で、下位シーケンス内のカーブデータを上位シーケンスにおいて一つに合成、集約する機能のことである。
例えば、階層をなす複数のシーケンスのそれぞれで、ＭＩＤＩピッチベンドという同種のパラメータの時間変化が設定されていたとする。このとき、各シーケンスでカーブを多数のＭＩＤＩピッチベンドイベントに展開してそれを取り込む、という方法では離散イベント同士をミックスすることになり、前記図１０の説明において説明したように個々の変化が正しく加算されないことになる。ここで述べるカーブ加算アルゴリズムは、これを正しく処理するためのものである。
【０１０２】
まず、図２２を参照してカーブデータの構造を詳細に説明する。カーブＡのイベントリストを図２２（ａ）にカーブＢのイベントリストを同図（ｃ）に示す。このようにカーブデータは時刻とそのときの値との組で表され、この組が節点とされて、隣り合う節点の間は直線で結ばれる。すなわち、カーブＡは同図（ｂ）に示すように、カーブＢは同図（ｄ）に示すように折れ線で表されるようになる。なお、節点は、「時刻の値が同じか大きくなること」として順序づけられており、カーブをたどるときには、時間をさかのぼることはない。
【０１０３】
また、同じ時刻に複数個の点があってもよい。これは図２２（ｂ）に示すように折れ線の不連続点を表している。この場合においても点の順序は保存される。なお、同じ時刻の点のうち、図２２（ｂ）に示すように最初の点のことを「左値」、最後の点のことを「右値」と呼ぶ。さらに、同一の時刻に３つ以上の点がある場合は、最初と最後の点以外の値は無視される。
さらにまた、カーブのある時刻をとったとき、多くの場合値は唯一に定まる。すなわち、一つの節点が存在する時刻ならその節点の値となり、二つの節点の間の時刻ならば両者の値を内挿した値となる。また、複数の節点が存在する時刻についてだけ、異なりうる左値と右値とが存在するようになる。
【０１０４】
このようなカーブデータの加算を行う場合に、加算される場合の節点の相互関係は図２３に示すように８通りに分類される。この図の（ａ）（ｂ）に示す場合は、注目する時刻において一方のカーブだけが節点とされている場合であり、同図（ｃ）は注目する時刻において両方のカーブが節点とされている場合であり、同図（ｄ）（ｅ）は注目する時刻において、一方のカーブだけが不連続点とされている場合であり、同図（ｆ）（ｇ）は注目する時刻において、一方のカーブが不連続点とされており、他方が節点とされている場合であり、同図（ｈ）は注目する時刻において両方のカーブが不連続点とされている場合である。
なお、カーブの左端の数字は注目する時刻での節点数を表している。
【０１０５】
次に、カーブ加算のアルゴリズムを前記カーブＡおよびカーブＢとを加算することを例に挙げて図２４ないし図２６を参照しながら説明する。カーブ加算アルゴリズムは、図２３に示すようないずれの節点の相互関係があっても、正しく加算が行えるものである。
まず、カーブＡおよびカーブＢのそれぞれについて端の節点の値が０でない場合は、値０の節点を図２４（ａ）（ｃ）に示すように付加する。これは、値が規定されていない時刻においては、カーブの値を０としているからである。
ついで、カーブＡのオリジナルを複製し、複製したカーブを図２５（ａ）に示すようにカーブＡ０とする。
【０１０６】
次に、カーブＡの各節点について、その時刻のカーブＢの値（不連続点の場合は左値をとる。）を求め、カーブＡの節点の値に加算する。ただし、カーブＡにおいて同一の時刻に複数の節点があり、さらにカーブＢにも同一時刻に節点が存在する場合は、カーブＡの最初の接点以外を削除し、最初の節点だけについて加算を行う。この加算演算が図２４（ｂ）のカーブＡのイベントリストに示されており、加算量が同図（ａ）に破線で示されている。
このカーブＡのイベントリストにおいて、たとえば、時刻７０における元の値７０に加算される値６４は、カーブＢにおける時刻６０の右値６０と時刻１１０における値８０を直線補間して求めた値である。同様に、時刻１４０において加算されている値６０、および時刻２４０で加算されている値１２０も直線補間により求めた値である。また、カーブＢの時刻１９０においては不連続点とされているので、左値１００がカーブＡの時刻１９０の接点に加算されている。
【０１０７】
次に、カーブＢの各接点について、カーブＡ０の、その時刻の値（不連続点の場合は右値をとる。）を求め、カーブＢの節点の値に加算する。ただし、カーブＢにおいて同一の時刻に複数の節点があり、さらにカーブＡ０にも同一時刻に節点が存在する場合は、カーブＢの最後の節点以外を削除し、最後の節点だけについて加算を行う。この加算演算が図２５（ｄ）のカーブＢのイベントリストに示されており、加算量が同図（ｃ）に破線で示されている。
このカーブＢのイベントリストにおいて、たとえば、時刻６０における元の値７０に加算される値７３は、カーブＡ０における時刻１０の右値４０と時刻７０における値８０を直線補間して求めた値である。同様に、時刻１３０において加算されている値４７、および時刻１７０で加算されている値１０８、時刻２２０で加算されている値８０も直線補間により求めた値である。また、時刻１９０ではカーブＢが不連続点とされていると共に、同一時刻にカーブＡ０に接点があるので、カーブＢの左値が削除されると共に、右値１４０にカーブＡの接点の値１４０の加算が行われている。
【０１０８】
次に、カーブＢの処理のすんだ接点について時刻の順に、修正した図２４（ａ）（ｂ）に示すカーブＡに追加する。この際、カーブＡに同一時刻の接点がなければ単に追加するようにし、同一時刻に接点がすでにある場合は、値が異なる場合のみカーブＡの接点の後に右値として挿入する。これにより、図２６（ａ）に示すようなカーブＡとカーブＢとを加算した新たなカーブを得ることができる。このカーブのイベントリストが同図（ｂ）に示されている。
たとえば、時点１１０では修正後のカーブＡおよび修正後のカーブＢに共に接点があるが、その値は同一なのでカーブＢの値は挿入されていない。また、時点１９０でも修正後のカーブＡおよび修正後のカーブＢに共に接点があるが、その値が異なる値とされているので、カーブＡの接点の値が左値とされ、カーブＢの接点の値が右値とされている。
このようなカーブ加算のアルゴリズムが、カーブリンクの解決時に行われることにより、正しくカーブデータ同士を加算して新たなカーブデータを生成することができる。
【０１０９】
次に、本発明の特徴を説明するために、既存のＳＭＦ再生装置、ＳＭＦ編集装置、ＨＭＦ対応処理装置のそれぞれを用いて、ＨＭＦ形式のデータを処理する場合について説明する。
従来のＳＭＦ形式の一つのファイルに、一つのＨＭＦ形式のパッケージを埋め込むことにより、ＳＭＦとＨＭＦとの間でデータの互換性を有させるようにすることができる。ＨＭＦでは、ＳＭＦフォーマット０または１を使用するが、フォーマット０の場合は、一つのＳＭＦのトラックの中に、ＨＭＦデータを後述するテキスト形式で記述したＳＭＦメタイベントを散在させ、それらを用いてＨＭＦ記述を格納する。
また、フォーマット１の場合、図２７（ａ）に示すように最初のＮ本のトラックに通常の表情つきＳＭＦデータを格納し、Ｎ＋１本目のトラックにＨＭＦデータをテキスト形式で記述したＳＭＦメタイベントだけをおくことによりＨＭＦ記述を格納する。
【０１１０】
このＳＭＦメタイベントをデコードすることにより、ＨＭＤＭのデータ構造の一つのパッケージを得ることができ、このパッケージには、たとえば図２７（ｂ）に示すようにパッケージスクリプト３２と、複数のシーケンス２１〜２４が納められる。各シーケンス２１〜２４には、表情つきのイベントリスト２１−１〜２４−１、および、white化スクリプト２１−２〜２４−２と表情づけスクリプト２１−３〜２４−３の対が納められている。white化スクリプト２１−２〜２４−２は、それぞれ実行されることにより各々の表情付きイベントリスト２１−１〜２４−１につけられている表情を除去してホワイト化（無表情化）するものである。そして、表情づけスクリプト２１−３〜２４−３は、その実行により表情の除去されたイベントリスト２１−１〜２４−１に所望の表情をつけることができるものである。
【０１１１】
このようにすることで、一般に広く流通している表情つきＭＩＤＩデータをそのまま用いてＨＭＦ形式のデータとして利用することができる。
従って、新規に作曲する曲データであれば表情付きイベントリスト２１−１〜２４−１とwhite化スクリプト２１−２〜２４−２に替えて、無表情（ホワイト）イベントリストとしてもよい。
【０１１２】
各種処理装置で、このようなＨＭＦ形式のデータを内蔵したデータをロードする場合は、つぎのようになる。
従来のＨＭＦ未対応のＳＭＦプレーヤでＨＭＦ形式のデータを読み込んだ場合、テキスト形式で記述されたＨＭＦデータのＳＭＦメタイべントはすべて無視されるので、格納された表情つきＳＭＦデータはそのまま再生されるようになる。
ただし、ＨＭＦ記述を読みとることはできないので、パラメータを与えて異なる展開結果を生成することはできない。しかし、ＨＭＦデータ作成の際、あらかじめＨＭＦの展開結果の一例をＳＭＦ部分に格納しておけば、それを再生することはできる。
【０１１３】
ＨＭＦ対応の処理装置でロードされる場合は、まず、ＳＭＦデータにＨＭＦデータをテキストで記述したＳＭＦメタイベントが含まれているかどうかを調べる。ＳＭＦメタイベントには該イベントが何のイベントであるかを識別するための識別情報が含まれている。この識別情報に基づいてＨＭＦデータをテキストで記述したＳＭＦメタイベントの有無を調べる。一つでもそのようなＳＭＦメタイべントを検出するとＨＭＦ形式と判断し、逆に一つもなければＳＭＦ形式と判断する。
ロードされたデータがＳＭＦ形式と判断されたときは、従来方式でロードを行なう。すなわち、フォーマット０ならば１本のトラックに、フォーマット１ならばＮ本のトラックに、ＳＭＦデータを格納する。
また、ロードされたデータがＨＭＦ形式と判断された場合は、通常のＳＭＦデータはすべて無視し、含まれているＳＭＦメタイベントだけを集め、それらのデコードに入る。この結果、テキストで記述されたＨＭＦデータが読み込まれるようになる。
【０１１４】
ＨＭＦ未対応のＳＭＦ編集装置においては、イベントリスト画面でＳＭＦメタイベントの内容を編集することで、原理的にはＨＭＦデータを作成することができる。しかしながら、作業が繁雑となると共に、作成した結果をＳＭＦ部分へ反映することはできない。
また、ＳＭＦ編集装置でＳＭＦメタイべントを編集しセーブすることはできるが、その記述内容をＳＭＦ部分に反映させることはできない。反映させるには、いったんＨＭＦ対応処理装置に読み込んでセーブするか、ツールを使用する必要がある。
【０１１５】
ＨＭＦ対応処理装置でセーブする場合は、まず、ＳＭＦとの互換をとるために、編集・作成されたＨＭＦ全体の内容を評価して、結果をＳＭＦ形式でトラックに格納する。
パフォーマンスパッケージの場合は、”root”シーケンスを評価し、一曲分全体がどう演奏されるかが計算され、ＳＭＦとして格納されることになる。プラグインパッケージの場合は、”root”シーケンスがないので、ＳＭＦとしては空のデータが格納されることになる。
【０１１６】
続いて、ＨＭＤＭの一つのパッケージの内容をＨＭＦ記述形式に変換し、それを複数のＳＭＦメタイベントに分割・格納する。なお、複数のメタイベントに分割するのは、ＳＭＦにおいてはメタイベントの最大長さが２５６バイトであるという制約があるからである。つまり、２５６バイトを越えることがないように分割する。格納するときは、「イベント間の時間＋メタイベント」という通常のＳＭＦと同じ形式になるが、「イベント間の時間」については意味を持たないため任意の値を与えてよい。
この場合、オプションによって、通常のＳＭＦ形式のデータだけをセーブするようにしてもよい。
なお、ＳＭＦメタイベントにテキストで記述したＨＭＦデータを埋め込むのは一例であって、テキストで記述したＨＭＦデータを別に独立してセーブするようにしてもよい。
【０１１７】
次に、スクリプトが変更された場合の動作を説明する。スクリプトはユーザが書き換えることができるが、ユーザがスクリプトを書き換えた場合、システムは新しいスクリプトソースを登録する。必要ならコンパイルも行なう。
そして、パッケージスクリプトが書き換えられたならばただちに新たなパッケージスクリプトを実行する。通常パッケージスクリプトにはサブルーチン定義が書かれているので、実行の結果、サブルーチンが定義し直されることになる。この新しい定義は、対応するディクショナリに格納される。
シーケンススクリプトの場合は、実行形式を記憶して終了される。実行形式はただちには実行されない。次にそのシーケンスの内容が要求されたとき、はじめて実行されることになる。
なお、コンパイルがエラーとなる場合、実行形式は更新されないが、ソーステキストは保存される。これは、書きかけのソースの状態でもセーブを可能にするためである。
【０１１８】
ところで、ＨＭＦは、あるシーケンスの内容を参照しようとすると、前記したようにリンク先のシーケンスの内容を再帰的に参照し、最終的な結果を出力する仕組みになっている。これには大量の計算が必要であって、その計算には時間がかかることになる。
そこで、必要のないシーケンス参照をなるべく行なわない効率的なシーケンス更新管理手法について説明する。まず、機構として、各シーケンスは「前回の参照の結果」を保持することにする。また、自分が最近変化したかどうかのフラグも保持するものとする。次に、シーケンス更新管理の手順を示す。
【０１１９】
１．あるシーケンスに内容を要求すると、そのシーケンスは、自分が前回の評価以後何も変わる要因がないかどうか調べ始める。
２．まず、自分からリンクをはっている全シーケンスに対し、最新の結果を要求する。すべての子シーケンスが「私は最近変化していません」という返事を返してきた場合は、自分のリンクやスクリプトの実行をやり直す必要はない。この場合は、「私は最近変化していません」と返事して、前回の結果を返せばよい。
３．一つでも「変化しました」という返事があった場合、あるいは自分自身が「最近変化した」とわかっている場合は、リンクとスクリプト実行をやり直す。この場合は、「私は最近変化しました」という返事とともに処理結果を返し、同時に「前回の結果」として記憶しておく。
４・シーケンスのイベントリストまたはスクリプトが変更された場合、「自分は最近変化した」というフラグを立てておく。
以上の手順により、不要な再計算をおさえることができる。
【０１２０】
ＨＭＦで特徴的な点は、スクリプトの実行およびリンクの解決は、演奏の進行とはまったく関係がないということである。それらは、データモデル内で時系列ＭＩＤＩデータを記号的に組み立ててゆく過程で実行されるのである。すなわち、ＨＭＦデータの中のあるシーケンスの内容を参照しようとしたときに、瞬時に実行されて、結果のＭＩＤＩデータ列が得られるのである。
ＨＭＦデータに対応する処理装置（アプリケーションソフトであってもよい。）は、ＨＭＤＭ処理部（データ処理部）とシーケンサ部という２つのユニットを備えている。
また、このシーケンサ部に特徴を持たせ、ｏｌｄとｎｅｗという２つのＭＩＤＩデータを持てるようにする。そして、一方を演奏しつつ、矛盾なく他方のＭＩＤＩデータへ移行することができるようにする。
【０１２１】
この機能にもとづき、ＨＭＦ処理装置（アプリケーションソフト）は次のように動作する。
１．演奏中に音楽演奏データを変更すると、ただちにＨＭＤＭ（データ部）で新しいＭＩＤＩデータの生成が始まる。
２．その間、シーケンサ部は、データ変更前の古いＭＩＤＩデータによる演奏を続けている。
３．ＨＭＤＭの新データ生成が完了すると、それがシーケンサ部へ渡される。
４．シーケンサ部は、古いＭＩＤＩデータから、新しいＭＩＤＩデータヘと、演奏を巧妙に切替えていく。たとえば、クロスフェードする、あるいは、小節線の区切りにおいて切り替え、切り替えた後は、新しいＭＩＤＩデータの演奏を続ける。
このように、演奏しながらデータ変更を行なうと、しばらくするといつのまにか演奏も変化したものになる。
【０１２２】
ＨＭＤＭを修正する場合、ｕｐｄａｔｅの計算量はかなり多く、全体の再計算時間が膨大になるおそれがある。そこで、負荷が軽い時にアプリケーションがバックグラウンドでＨＭＤＭのアップデートおよびシーケンサ部のＭＩＤＩデータの入れ換えを行なっておくようにしてもよい。
さらに加えて、例えば、音楽演奏データのエンディングの部分だけを修正した場合には、前半の部分のＭＩＤＩデータは、当分の間差し替える必要はないので、余裕のない場合は差し替えはすぐに行なわない。また、ＨＭＤＭの変更の影響が、限られたＭＩＤＩデータにしか及ばない場合は、すべてのＭＩＤＩデータの再生成を行なうのでなく、前のＭＩＤＩデータに対する部分修正を施して、計算量を少なくするようにする。
【０１２３】
また、本発明では、ＨＭＦパッケージをテキスト形式で記述されたメタイベントとしてＳＭＦデータを格納するトラック内に散在させたり、ＳＭＦデータを格納するトラックとは別のトラックに格納したりしている。
この場合、ＳＭＦデータのメタイベントやエクスクルーシブは２５６バイト以下という制約があるので、ＨＭＦ記述の長大なテキストは適宜分割して格納するようにする。
【０１２４】
なお、以上の説明では時系列イベントデータ列を音楽演奏データとして説明したが、本発明はこれに限るものではなく、音声データや画像データの時系列イベントデータとしてもよいものである。この場合、音声データとすると音楽と同様に音声の音質や音量等を任意に変化および変更することができる。また、画像データの場合は、シャープネスやビューの変化および変更を任意に行うことができるようになる。
【０１２５】
【発明の効果】
本発明は以上のように、ＨＭＦパッケージをテキスト形式で記述されたメタイベントとしてＳＭＦデータを格納するトラック内に散在させたり、ＳＭＦデータを格納するトラックとは別のトラックに格納したりしている。このように、一組のデータの中に従来のＳＭＦデータとＨＭＦパッケージとを格納すると、従来の再生手段ではメタイベントとされたＨＭＦパッケージは無視されるため、格納されているＳＭＦデータのみを再生するようになる。また、ＨＭＦフォーマットのデータを再生することのできる再生手段では、メタイベントとされたＨＭＦフォーマットのデータのみを抽出して再生することができる。
これにより、ＨＭＦフォーマットのデータにＳＭＦデータとの互換性を有させることができるようになる。
【図面の簡単な説明】
【図１】  本発明の時系列データを含むデータの処理装置の機能ブロック図の概略である。
【図２】  本発明の時系列データを含むデータの処理装置のハードの構成のブロック図である。
【図３】  本発明で定義されるＨＭＤＭ、パッケージ、シーケンスのデータ構造を示す図である。
【図４】  本発明の時系列データを含むデータの処理装置におけるＨＭＤＭのパッケージのデータ構造を示す図である。
【図５】  本発明の時系列データを含むデータの処理装置におけるＨＭＤＭのイベントリストとスクリプトにより構成されるシーケンスを説明するための図である。
【図６】  本発明の時系列データを含むデータの処理装置におけるＨＭＦのラベル付きイベントを有するイベントリストを説明するための図である。
【図７】  本発明の時系列データを含むデータの処理装置におけるイベント書き換え処理のフローチャートおよびイベントリストの例を示す図である。
【図８】  本発明の時系列データを含むデータの処理装置におけるＨＭＦのイベントにＩＤ番号を付与する機構を説明するための図である。
【図９】  本発明の時系列データを含むデータの処理装置におけるＨＭＦのスクリプトとイベントリストとの関係を説明するための図である。
【図１０】  ＳＭＦと本発明の時系列データを含むデータの処理装置におけるＨＭＦのカーブ情報の違いを説明するための図である。
【図１１】  本発明の時系列データを含むデータの処理装置におけるＨＭＦにおいてカーブデータを保持する構造を示す図である。
【図１２】  本発明の時系列データを含むデータの処理装置におけるＨＭＦのカーブデータのピッチベンドづけへの利用例を示す図である。
【図１３】  本発明の時系列データを含むデータの処理装置におけるＨＭＦのリンク機構を説明するための図である。
【図１４】  ＳＭＦのトラックモデルと本発明の時系列データを含むデータの処理装置におけるＨＭＦのリンクモデルとを対比させて説明するための図である。
【図１５】  本発明の時系列データを含むデータの処理装置におけるＨＭＦのパッケージロード時の振る舞いを説明するための図である。
【図１６】  本発明の時系列データを含むデータの処理装置におけるシーケンス参照処理を説明するための図である。
【図１７】  本発明の時系列データを含むデータの処理装置におけるシーケンス参照処理のフローチャートを示す図である。
【図１８】  本発明の時系列データを含むデータの処理装置におけるシーケンス参照処理のフローチャートを示す図である。
【図１９】  本発明の時系列データを含むデータの処理装置における再帰的なシーケンスの内容参照時の振る舞いを説明するための図である。
【図２０】  本発明の時系列データを含むデータの処理装置における再帰的なシーケンスの内容参照処理のフローチャートを示す図である。
【図２１】  本発明の時系列データを含むデータの処理装置における再帰的なシーケンスの内容参照処理を説明するための図である。
【図２２】  本発明の時系列データを含むデータの処理装置におけるカーブデータの加算を説明するための図のその１である。
【図２３】  本発明の時系列データを含むデータの処理装置におけるカーブデータの加算を説明するための図のその２である。
【図２４】  本発明の時系列データを含むデータの処理装置におけるカーブデータの加算を説明するための図のその３である。
【図２５】  本発明の時系列データを含むデータの処理装置におけるカーブデータの加算を説明するための図のその４である。
【図２６】  本発明の時系列データを含むデータの処理装置におけるカーブデータの加算を説明するための図のその５である。
【図２７】  本発明の時系列データを含む処理装置におけるＨＭＦ形式のデータとＳＭＦ形式のデータとの互換性の説明をするための図である。
【図２８】  本発明の時系列データを含む処理装置におけるパートリンクおよびカーブリンクの解決態様を説明をするための図である。
【符号の説明】
１  処理装置Ａ、１−１  バッファメモリ、１−２  エンコーダ、２  処理装置Ｂ、２−１  デコーダ、２−２  バッファメモリ、２−３  イベントデータ／スクリプト分離部、２−４  イベントデータ書き換え部、２−５  スクリプト解釈部、２−６  出力部、３  データ展開部、４  記録媒体、５  ＭＩＤＩ音源、６サウンドシステム、１０  パフォーマンスパッケージ、１１,１２  プラグインパッケージ、１３  システムパッケージ、１５，１５−１，１６，１７  カーブデータのシーケンス、２０,２１，２２，２３，２４  シーケンス、２１−１〜２４−１  表情つきイベントリスト、２１−２〜２４−２  white化スクリプト、２１−３〜２４−３  表情づけスクリプト、３０  イベントリスト、３１  シーケンススクリプト、３２  パッケージスクリプト、４０  ＩＤマネージャ、５０，５１，５２  ディクショナリ、６１  ＣＰＵ、６２  ＲＯＭ、６３  ＲＡＭ、６４  タイマ、６５  ＨＤＤ、６６  ＦＤＤ、６７  スイッチ、６８  スイッチ検出回路、６９  表示回路、７０  ＣＤ−ＲＯＭ、７１  ＭＩＤＩ  Ｉ／Ｆ、７２  他のＭＩＤＩ機器、７３  通信インターフェース、７４  通信ネットワーク、７５  サーバコンピュータ
【図１】
0003823466.tif 000002
【図２】
0003823466.tif 000003
【図３】
0003823466.tif 000004
【図４】
0003823466.tif 000005
【図５】
0003823466.tif 000006
【図６】
0003823466.tif 000007
【図７】
0003823466.tif 000008
【図８】
0003823466.tif 000009
【図９】
0003823466.tif 000010
【図１０】
0003823466.tif 000011
【図１１】
0003823466.tif 000012
【図１２】
0003823466.tif 000013
【図１３】
0003823466.tif 000014
【図１４】
0003823466.tif 000015
【図１５】
0003823466.tif 000016
【図１６】
0003823466.tif 000017
【図１７】
0003823466.tif 000018
【図１８】
0003823466.tif 000019
【図１９】
0003823466.tif 000020
【図２０】
0003823466.tif 000021
【図２１】
0003823466.tif 000022
【図２２】
0003823466.tif 000023
【図２３】
0003823466.tif 000024
【図２４】
0003823466.tif 000025
【図２５】
0003823466.tif 000026
【図２６】
0003823466.tif 000027
【図２７】
0003823466.tif 000028
【図２８】
0003823466.tif 000029