(58)【調査した分野】(Int.Cl.,DB名)
前記ユーザ端末が備える再生手段は、再生対象となる演奏データ中に含まれるイベント発生時刻の差分時間に応じて、当該演奏データの再生を遅延させることを特徴とする請求項1又は2記載の演奏通信装置。
前記ユーザ端末が備える再生手段は、再生対象となる演奏データ中に含まれるイベント発生時刻の差分時間に応じて、当該演奏データの再生を遅延させることを特徴とする請求項4又は5記載のユーザ端末。
【発明を実施するための形態】
【0011】
以下、図面を参照して本発明の実施形態について説明する。
A.全体構成
図1は、実施の一形態による演奏通信装置10の全体構成を示すブロック図である。この図に示す演奏通信装置10は、例えばインターネットなどのネットワークNWを介してサーバ100に接続する複数のクライアント200−UPN(1)〜200−UPN(n)から構成される公知のサーバ・クライアントシステムである。なお、ネットワークNWは、インターネットに限定されず、LANやWANであっても構わない。
【0012】
サーバ100は、ネットワークNWを介して接続するクライアント200に対し、ユーザ識別番号UIDと、当該ユーザ識別番号UIDに対応付けたユーザポート番号UPNとを割り当てる。ユーザ識別番号UIDは、例えばサーバ立ち上げ時刻を開始値として連続するユニークな番号である。ユーザ識別番号UIDに対応付けて割り当てられるユーザポート番号UPNとは、「0」から最大クライアント数(接続可能なクライアントの数)の内、現在使われていない空きポート番号(資源番号)となる。
【0013】
サーバ100は、クライアント200−UPN(1)〜200−UPN(n)の各ユーザポート番号UPN(1)〜UPN(n)にそれぞれ対応するバッファ領域から構成されるイベントバッファ101を具備する。
【0014】
サーバ100は、ネットワークNWを介してクライアント200からユーザ識別番号UID、要求コマンドPUTEVENTおよび送出データを受信すると、イベントバッファ101の内、ユーザ識別番号UIDに対応付けて割り当てたユーザポート番号UPNのバッファ領域にその受信した送出データをバッファデータとしてストアすると共に、ユーザ識別番号UIDに対応付けて割り当てたユーザポート番号UPNを、要求コマンドPUTEVENTを送信したクライアント200へ返信する。
【0015】
クライアント200からサーバ100へ送信する送出データは、イベント発生時刻の差分時間が付加された一連のMIDIイベントから構成される。一連のMIDIイベントとは、演奏操作に応じてクライアント200側で発生するMIDIイベント(チャンネルメッセージ又はエクスクルーシブメッセージ)を指す。MIDIイベントにイベント発生時刻の差分時間を付加する意図については追って説明する。
【0016】
サーバ100は、ネットワークNWを介してクライアント200から要求コマンドGETEVENTを受信すると、イベントバッファ101の各バッファ領域からユーザポート番号UPN毎のバッファデータを読み出して要求コマンドGETEVENTを送信したクライアント200へ返信する。これにより、サーバ100が各クライアント200−UPN(1)〜200−UPN(n)の共通の記憶手段として機能することよって各クライアント200同士で互いのイベントバッファEBの内容を共有可能としている。
【0017】
クライアント200−UPN(1)〜200−UPN(n)は、ネットワークNWを介してサーバ100に接続するユーザ端末であり、その構成については後述する。クライアント200では、演奏操作に応じて発生するMIDIイベント(チャンネルメッセージ又はエクスクルーシブメッセージ)に、イベント発生時刻の差分時間を付加してイベントバッファEBにストアする。
【0018】
具体的には、MIDIイベントの発生時刻の差分時間が所定時間(例えば255ティック)未満の場合には、イベントバイトの次に差分時間を付加してイベントバッファEBにストアする。差分時間が所定時間の場合には、イベントバイトの次に同期キャラクタとして扱われるデータ「0xFF」、データ「0xFF」を連続付加してイベントバッファEBにストアする。差分時間が所定時間(例えば255ティック)を超える場合には、イベントバイトの次に同期キャラクタとして扱われるデータ「0xFF」、データ「0xFF」を複数回繰り返し付加してイベントバッファEBにストアする。
【0019】
クライアント200では、ユーザ識別番号UIDおよび要求コマンドPUTEVENTをサーバ100に送信すると共に、イベントバッファEBの内容を送出データ(イベント発生時刻の差分時間が付加された一連のMIDIイベント)として送信する。サーバ100では、上述したように、イベントバッファ101の内、ユーザ識別番号UIDに対応付けて割り当てたユーザポート番号UPNのバッファ領域にその受信した送出データをバッファデータとしてストアすると共に、ユーザ識別番号UIDに対応付けて割り当てたユーザポート番号UPNを、要求コマンドPUTEVENTを送信したクライアント200へ返信する。
【0020】
クライアント200では、要求コマンドGETEVENTをサーバ100に送信すると、その要求コマンドGETEVENTに応じてサーバ100が送信するユーザポート番号UPN毎のバッファデータを受信してイベントバッファEBにストアする。クライアント200では、イベントバッファEBにストアしたユーザポート番号UPN毎のバッファデータを読み出して再生(自動演奏)する。この動作の詳細については追って詳述する。
【0021】
B.クライアント200の構成
次に、
図2〜
図3を参照してクライアント200の構成を説明する。
図2は、クライアント200の構成を示すブロック図である。ユーザ端末であるクライアント200は、具体的にはネットワーク通信機能を備えたDTM装置であり、CPU20、ROM21、RAM22、操作部23、表示部24、通信制御部25、MIDIインタフェース部26、音源27およびサウンドシステム28から構成される。
【0022】
CPU20は、操作部23が発生する操作イベントに応じて各部を制御すると共に、ネットワークNWを介して接続したサーバ100に対し、ユーザ識別番号UID、要求コマンドPUTEVENTおよびRAM22の記録用イベントバッファEB1の内容(イベント発生時刻の差分時間が付加された一連のMIDIイベントからなる送出データ)を送信したり、要求コマンドGETEVENTに応じてサーバ100から受信したユーザポート番号UPN毎のバッファデータをRAM22の再生用イベントバッファEB2にストアするクライアント処理を実行する。このクライアント処理の詳細については追って詳述する。
【0023】
ROM21には、CPU20にロードされる各種の制御プログラムが記憶される。各種の制御プログラムとは、後述するクライアント処理、当該クライアント処理からコールされる記録処理および再生処理を含む。RAM22は、
図3に図示するように、ワークエリアWEおよびイベントバッファEBを備える。RAM22のワークエリアWEには、CPU20の処理に使用される各種レジスタ・フラグデータが一時記憶される他、サーバ100から割り当てられるユーザ識別番号UIDおよびユーザポート番号UPNを一時記憶する。
【0024】
RAM22のイベントバッファEBは、記録用イベントバッファEB1と再生用イベントバッファEB2とから構成される。記録用イベントバッファEB1には、イベント発生時刻の差分時間が付加された一連のMIDIイベントがストアされる。一連のMIDIイベントとは、ユーザが外部のMIDI楽器30を演奏した場合に、そのMIDI楽器30から出力されるMIDIイベントを、MIDIインタフェース26を介して取り込んだものを指す。また、MIDIインタフェース26を介して取り込んだMIDIイベントには、CPU20がイベント発生時刻の差分時間を付加する。
【0025】
すなわち、前述したように、イベント発生時刻の差分時間が所定時間(例えば255ティック)未満であれば、イベントバイトの次に差分時間を付加し、差分時間が所定時間ならば、イベントバイトの次に同期キャラクタとして扱われるデータ「0xFF」、データ「0xFF」を連続付加し、差分時間が所定時間(例えば255ティック)を超えるならば、イベントバイトの次に同期キャラクタとして扱われるデータ「0xFF」、データ「0xFF」を複数回繰り返し付加するようになっている。
【0026】
再生用イベントバッファEB2には、要求コマンドGETEVENTに応じてサーバ100から受信したユーザポート番号UPN毎のバッファデータがストアされる。言い換えれば、再生用イベントバッファEB2には、自己を含む全てのクライアント200が各々発生した送出データ(イベント発生時刻の差分時間が付加された一連のMIDIイベント)がストアされる。これにより、各クライアント200同士で互いのイベントバッファEBの内容を共有可能にしている。
【0027】
操作部23は、操作されるスイッチ種に対応した操作イベントを発生する。表示部24は、LCDパネル等から構成され、CPU20から供給される表示制御信号に応じて、各部の動作状態や設定状態などを画面表示する。通信制御部25は、CPU20の制御の下に、所定のプロトコルに従ってネットワークNWを介して接続されるサーバ100とデータ授受する。
【0028】
MIDIインタフェース部26は、CPU20の制御の下に、外部のMIDI楽器30から出力されるMIDIイベントを取り込む。なお、MIDI楽器30は、ユーザの演奏操作に応じたMIDIイベント(チャンネルメッセージ又はエクスクルーシブメッセージ)を出力する。MIDIインタフェース部26により取り込まれたMIDIイベントは、RAM22の記録用イベントバッファEB1(
図3参照)にストアされる。
【0029】
なお、MIDIインタフェース部26は、CPU20の制御の下に、RAM22の再生用イベントバッファEB2(
図3参照)から読み出されるバッファデータ中のMIDIイベントから形成されるMIDIシーケンスデータを外部のMIDI楽器30へ出力する機能も備える。この機能によりMIDI楽器30は、受信したMIDIシーケンスデータに基づき自動演奏する。
【0030】
音源27は、周知の波形メモリ読み出し方式によって構成され、サーバ100に接続可能なクライアント200の数を超える同時発音チャンネルを備える。音源27では、CPU20がRAM22の再生用イベントバッファEB2(
図3参照)から読み出すMIDIイベントに応じた楽音データを生成して出力したり、MIDIインタフェース部26を介して外部のMIDI楽器30から入力されるMIDIイベントに応じた楽音データを生成して出力したりする。サウンドシステム28は、音源27から出力される楽音データをアナログ形式の楽音信号に変換した後、その楽音信号から不要ノイズを除去する等のフィルタリングを施してからレベル増幅してスピーカより発音させる。
【0031】
B.動作
次に、
図4〜
図8を参照して上記構成による演奏通信装置10の動作を説明する。以下では、サーバ100が実行するサーバ処理と、クライアント200のCPU20が実行するクラインアント処理とに分けて動作の説明を進める。なお、クライアント処理は、記録処理および再生処理を含む。
【0032】
(1)サーバ処理の動作
図4は、演奏通信装置10を構成するサーバ100が実行するサーバ処理の動作を示すフローチャートである。サーバ100では、先ずステップSA1において、ネットワークNWを介して接続したクライアント200から送信されるユーザ識別番号UIDおよびメッセージを取得する。メッセージとは、後述するように、クライアント200が送信する要求コマンドPUTEVENTおよびRAM22の記録用イベントバッファEB1の内容(イベント発生時刻の差分時間が付加された一連のMIDIイベントからなる送出データ)である。
【0033】
続いて、ステップSA2では、上記ステップSA1にて取得したユーザ識別番号UIDが既にサーバ100側に登録済みの場合、その取得したユーザ識別番号UIDに対応付けて割り当て済みのユーザポート番号UPNを取得する。次いで、ステップSA3では、取得したユーザ識別番号UIDが未定義であるか否かを判断する。
【0034】
ユーザ識別番号UIDが未定義であると、上記ステップSA3の判断結果は「YES」となり、ステップSA4に進み、新規のユーザ識別番号UIDと、その新規のユーザ識別番号UIDに対応付けたユーザポート番号UPNとの割り当てを試みる。
【0035】
次いで、ステップSA5では、新規割り当てを試みてもまだ未定義であるか否か、すなわち上記ステップSA4で行われた新規割り当てにおいて接続可能なクライアントの数を超え、ユーザ識別番号UIDが売り切れの状態であるかどうかを判断する。ユーザ識別番号UIDの売り切れにより新規割り当て出来ずに未定義のままであると、判断結果は「YES」となり、ステップSA6に進み、ユーザ識別番号UIDが未定義なクライアント200との通信を切断してセッションを終了させる切断処理を実行して本処理を終える。
【0036】
一方、上記ステップSA2で取得したユーザ識別番号UIDが未定義でない場合や、上記ステップSA4で新規割り当てされたユーザ識別番号UIDが未定義でない場合には、上記ステップSA3あるいは上記ステップSA5の判断結果が「NO」になり、ステップSA7に進む。ステップSA7では、クライアント200から要求コマンドPUTEVENTと共に受信した送出データ(クライアント200のRAM22の記録用イベントバッファEB1の内容)を、イベントバッファ101の内、ユーザ識別番号UIDに対応付けて割り当てたユーザポート番号UPNのバッファ領域にバッファデータとしてストアする。
【0037】
続いて、ステップSA8では、クライアント200から要求コマンドGETEVENTを受信したか否かを判断する。要求コマンドGETEVENTを受信していなければ、要求コマンドPUTEVENTを送信したクライアント200に対し、ユーザ識別番号UIDと当該ユーザ識別番号UIDに対応付けて割り当てたユーザポート番号UPNとを返信して本処理を終える。
【0038】
これに対し、クライアント200から要求コマンドGETEVENTを受信すると、上記ステップSA8の判断結果は「YES」になり、ステップSA10に進み、イベントバッファ101の各バッファ領域からユーザポート番号UPN毎のバッファデータを読み出して要求コマンドGETEVENTを送信したクライアント200へ返信して本処理を終える。
【0039】
(2)クライアント処理の動作
次に、
図5を参照してクライアント処理の動作を説明する。クライアント200のCPU20は、ネットワークNWを介してサーバ100に接続する為の通信制御を終えると、本処理を実行してステップSB1に進み、ユーザ識別番号UIDを初期化して未定義状態にする。
【0040】
続いて、ステップSB2では、記録処理を実行する。記録処理では、後述するように、現在時刻と最後にデータ出力した時刻との差分時間が一定時間LONGTIME未満になる迄、同期キャラクタデータ「0xFF」、「0xFF」をサーバ100へ出力し続け、現在時刻と最後にデータ出力した時刻との差分時間が一定時間LONGTIME未満になると、外部のMIDI楽器30からMIDI INイベントが入力されなくなる迄の間、取り込んだMIDIイベント毎に前イベント発生からの経過時間(差分時間)を付加してRAM22の記録用イベントバッファEB1に記録する処理を続ける。
【0041】
そして、MIDI INイベントの入力が途絶えると、ユーザ識別番号UIDおよび要求コマンドPUTEVENTをサーバ100へ送信すると共に、RAM22の記録用イベントバッファEB1からイベント発生時刻の差分時間が付加された一連のMIDIイベントを読み出し、これを送出データとしてサーバ100へ送信し、これに応じてサーバ100から返信されるユーザ識別番号UIDおよびユーザポート番号UPNを取得する。
【0042】
次いで、ステップSB3では、ユーザ識別番号UIDが定義されたか否か、すなわち上記ステップSB2の記録処理において、サーバ100からユーザ識別番号UIDを受領したかどうかを判断する。サーバ100からユーザ識別番号UIDを受領していない未定義状態であると、判断結果は「NO」になり、ステップSB10に進み、一定時間待機した後、再び上述のステップSB2に処理を戻して記録処理を実行する。
【0043】
一方、サーバ100からユーザ識別番号UIDを受領した場合には、上記ステップSB3の判断結果が「YES」になり、ステップSB4に進み、サーバ100に要求コマンドGETEVENTを送信する。なお、要求コマンドGETEVENTを受信したサーバ100は、前述したように、イベントバッファ101の各バッファ領域からユーザポート番号UPN毎のバッファデータを読み出し、要求コマンドGETEVENTを送信したクライアント200に返信する。
【0044】
要求コマンドGETEVENTに応じて、サーバ100からユーザポート番号UPN毎のバッファデータを受信すると、ステップSB5に進み、受信したユーザポート番号UPN毎のバッファデータを、RAM22の再生用イベントバッファEB2にストアし、続くステップSB6では、最初のユーザポート番号UPNを指定する。
【0045】
次に、ステップSB7では、再生処理を実行する。再生処理では、後述するように、現在時刻と再生処理時刻との比較結果に基づき現在時刻が処理タイミングと判定され、かつRAM22の再生用イベントバッファEB2に記憶されるユーザポート番号UPN毎のバッファデータの内、現在指定されているユーザポート番号UPNのバッファデータにおいて、処理タイミングに該当するデータが存在すると、その該当データを現在指定されているユーザポート番号UPNのバッファデータ中から読み出す。
【0046】
そして、動作モードがEVENTモードと判別された場合には、読み出したデータ(イベントバイト)を音源27のバッファ(不図示)に転送し、そのバッファ転送されたイベントバイトが蓄積してMIDIシーケンスデータを形成すると、音源27が自動演奏を開始する。
【0047】
なお、音源27を自動演奏させず、MIDI楽器30を用いて自動演奏させるケースでは、読み出したデータ(イベントバイト)をMIDIインタフェース部26のバッファに転送し、バッファに転送されたイベントバイトが蓄積してMIDIシーケンスデータを形成すると、MIDIインタフェース部26を介してMIDI楽器30に出力する。
【0048】
動作モードがTIMEモードと判別された場合には、読み出したデータ(イベント発生時刻の差分時間)を再生処理時刻に加算して更新し、更新された再生処理時刻が「0xFF」になると、動作モードをLONGモードに遷移させ、一方、更新された再生処理時刻が「0xFF」でなければ、動作モードをEVENTモードに遷移させる。動作モードがLONGモードと判別された場合には、動作モードをTIMEモードに遷移させる。
【0049】
こうして、現在指定されているユーザポート番号UPNのバッファデータに基づく再生処理が完了すると、ステップSB8に進み、指定するユーザポート番号UPNをインクリメントして歩進させる。そして、ステップSB9では、歩進させたユーザポート番号UPNが最後に達したか、つまりRAM22の再生用イベントバッファEB2に記憶されるユーザポート番号UPN毎のバッファデータの全てについて再生処理を実行し終えたかどうかを判断する。ユーザポート番号UPN毎のバッファデータの全てについて再生処理を実行し終えていなければ、判断結果は「NO」となり、上述のステップSB7に処理を戻し、次のユーザポート番号UPNのバッファデータに基づく再生処理を実行する。
【0050】
以後、歩進させたユーザポート番号UPNが最後に達する迄、ステップSB7の再生処理を繰り返し実行し、RAM22の再生用イベントバッファEB2に記憶されるユーザポート番号UPN毎のバッファデータの全てについて再生処理を実行し終えると、上記ステップSB9の判断結果が「YES」となり、ステップSB10に進む。そして、ステップSB10では、一定時間待機した後、上述のステップSB2に処理を戻す。
【0051】
(3)記録処理の動作
次に、
図6を参照して記録処理の動作を説明する。上述したクライアント処理のステップSB2(
図5参照)を介して本処理が実行されると、CPU20は
図6に図示するステップSC1に処理を進め、時刻をインクリメントして現在時刻を更新する。続いて、ステップSC2では、現在時刻とサーバ100に対して最後にデータ出力した時刻との差分時間が、一定時間LONGTIME(例えば255ティック)を超えているか否かを判断する。
【0052】
現在時刻と最後にデータを記憶した時刻との差分時間が一定時間LONGTIMEを超えていると、判断結果は「YES」になり、ステップSC3に進み、同期キャラクタデータ「0xFF」、「0xFF」を記憶して上記ステップSC2に処理を戻す。以後、現在時刻と最後に記憶した時刻との差分時間が一定時間LONGTIME未満になる迄、上記ステップSC2〜SC3を繰り返して同期キャラクタデータ「0xFF」、「0xFF」を記憶し続ける。
【0053】
そして、現在時刻と最後にデータを記憶した時刻との差分時間が一定時間LONGTIME未満になると、上記ステップSC2の判断結果が「NO」になり、ステップSC4に進む。ステップSC4では、MIDI INイベントの有無、すなわちユーザの演奏操作に応じて外部のMIDI楽器30が出力するMIDIイベントを、MIDIインタフェース部26を介して取り込んだかどうかを判断する。
【0054】
MIDI楽器30が出力するMIDIイベントを取り込むと、判断結果は「YES」となり、ステップSC5に進み、取り込んだMIDIイベントをRAM22の記録用イベントバッファEB1にストアする。次いで、ステップSC6では、前回MIDIイベントを取り込んだ時刻と今回MIDIイベントを取り込んだ時刻との差分に相当するイベント発生時刻の差分時間を、今回取り込んだMIDIイベントに付加した後、上記ステップSC4に処理を戻す。なお、最初に取り込んだMIDIイベントには、「0」のイベント発生時刻の差分時間を付加する。
【0055】
以後、外部のMIDI楽器30から入力されるMIDI INイベントが無くなる迄、上記ステップSC4〜SC6を繰り返し、取り込んだMIDIイベントにイベント発生時刻の差分時間を付加してRAM22の記録用イベントバッファEB1に記録する処理を続ける。そして、ユーザの演奏操作が終わり、MIDI INイベントが途絶えると、上記ステップSC4の判断結果が「NO」になり、ステップSC7に進む。
【0056】
そして、ステップSC7では、ユーザ識別番号UIDおよび要求コマンドPUTEVENTをサーバ100へ送信すると共に、RAM22の記録用イベントバッファEB1からイベント発生時刻の差分時間が付加された一連のMIDIイベントを読み出し、これを送出データとしてサーバ100へ送信する。次いで、ステップSC8では、サーバ100から返信されるユーザ識別番号UIDおよびユーザポート番号UPNを取得してRAM22のワークエリアWEに保存して本処理を終える。
【0057】
このように、記録処理では、現在時刻と最後にデータ出力した時刻との差分時間が一定時間LONGTIME未満になる迄、同期キャラクタデータ「0xFF」、「0xFF」をサーバ100へ出力し続け、現在時刻と最後にデータ出力した時刻との差分時間が一定時間LONGTIME未満になると、外部のMIDI楽器30からMIDI INイベントが入力されなくなる迄の間、取り込んだMIDIイベント毎に前イベント発生からの経過時間(差分時間)を付加してRAM22の記録用イベントバッファEB1に記録する処理を続ける。
【0058】
MIDI INイベントの入力が途絶えると、ユーザ識別番号UIDおよび要求コマンドPUTEVENTをサーバ100へ送信すると共に、RAM22の記録用イベントバッファEB1からイベント発生時刻の差分時間が付加された一連のMIDIイベントを読み出し、これを送出データとしてサーバ100へ送信し、これに応じてサーバ100から返信されるユーザ識別番号UIDおよびユーザポート番号UPNを取得する。
【0059】
(4)再生処理の動作
次に、
図7を参照して再生処理の動作を説明する。前述したクライアント処理のステップSB6(
図5参照)を介して本処理が実行されると、CPU20は
図7に図示するステップSD1に処理を進め、時刻をインクリメントして現在時刻を更新する。次いで、ステップSD2では、ユーザが任意に設定可能な遅延時間を加算した再生処理時刻と、上記ステップSD1で更新された現在時刻とを比較し、続くステップSD3ではその比較の結果に基づき処理タイミングである否かを判断する。
【0060】
再生処理時刻に対して現在時刻が処理タイミングでなければ、判断結果は「NO」になり、一旦本処理を終えるが、再生処理時刻に対して現在時刻が処理タイミングになると、判断結果が「YES」になり、ステップSD4に進む。ステップSD4では、RAM22の再生用イベントバッファEB2に記憶されるユーザポート番号UPN毎のバッファデータの内、現在指定されているユーザポート番号UPNのバッファデータにおいて、処理タイミングに該当するデータの有無を判断する。
【0061】
処理タイミングに該当するデータが無ければ、判断結果は「NO」になり、一旦本処理を終えるが、処理タイミングに該当するデータが有ると、判断結果が「YES」になり、ステップSD5に進む。ステップSD5では、RAM22の再生用イベントバッファEB2において、現在指定されているユーザポート番号UPNのバッファデータ中から該当するデータを読み出す。
【0062】
次いで、ステップSD6では、現在の動作モードがEVENTモード、TIMEモードおよびLONGモードの何れであるかを判別する。初回のモード判別は、読み出したデータの種別に基づき判別する。具体的には、読み出したデータ(1バイト分)がイベントバイトならばEVENTモード、イベント発生時刻の差分時間ならばTIMEモード、データ「0xFF」(同期キャラクタ)ならばLONGモードと判別する。
【0063】
上記ステップSD6においてEVENTモードと判別されると、ステップSD7に進み、読み出したデータ(イベントバイト)を音源27のバッファに転送し、バッファ転送されるイベントバイトを蓄積してMIDIシーケンスデータを形成する。続いて、ステップSD8では、イベントバイトを蓄積して形成したMIDIシーケンスデータに基づく自動演奏を音源27に指示する。この後、ステップSD9に進み、動作モードをTIMEモードに遷移させてから上述のステップSD2に処理を戻す。
【0064】
上記ステップSD6においてTIMEモードと判別されると、ステップSD10に進み、読み出したデータ(イベント発生時刻の差分時間)を再生処理時刻に加算し、当該再生処理時刻を更新する。次いで、ステップSD11では、更新された再生処理時刻が「0xFF」であるかどうかを判断する。更新された再生処理時刻が「0xFF」になると、判断結果は「YES」となり、ステップSD12に進み、動作モードをLONGモードに遷移させてから上述のステップSD2に処理を戻す。これに対し、更新された再生処理時刻が「0xFF」でなければ、上記ステップSD11の判断結果は「NO」になり、ステップSD13に進み、動作モードをEVENTモードに遷移させてから上述のステップSD2に処理を戻す。
【0065】
上記ステップSD6においてLONGモードと判別されると、ステップSD14に進み、動作モードをTIMEモードに遷移させてから上述のステップSD2に処理を戻す。
【0066】
このように、再生処理では、現在時刻と再生処理時刻との比較結果に基づき現在時刻が処理タイミングと判定され、かつRAM22の再生用イベントバッファEB2に記憶されるユーザポート番号UPN毎のバッファデータの内、現在指定されているユーザポート番号UPNのバッファデータにおいて、処理タイミングに該当するデータが存在すると、その該当データを現在指定されているユーザポート番号UPNのバッファデータ中から読み出す。
【0067】
そして、動作モードがEVENTモードと判別された場合には、読み出したデータ(イベントバイト)を音源27のバッファに転送し、バッファ転送されるイベントバイトを蓄積して形成したMIDIシーケンスデータに基づく自動演奏を音源27に指示する。
【0068】
動作モードがTIMEモードと判別された場合には、読み出したデータ(イベント発生時刻の差分時間)を再生処理時刻に加算して更新し、更新された再生処理時刻が「0xFF」になると、動作モードをLONGモードに遷移させ、一方、更新された再生処理時刻が「0xFF」でなければ、動作モードをEVENTモードに遷移させる。動作モードがLONGモードと判別された場合には、動作モードをTIMEモードに遷移させる。
【0069】
C.具体的な動作
次に、
図8を参照して演奏通信装置10の具体的な動作を説明する。
図8は、演奏遅延の概念を含む具体的な動作を説明するための図である。まず例えばクライアント200−UPN(1)のユーザがドラムのソロパートを演奏したとする。そうすると、その演奏に応じて発生するMIDIイベント(以下、ドラム[Tddddd]と記す)が前述の記録処理によりサーバ100に送信される(
図8(a)参照)。サーバ100では受信したクライアント200−UPN(1)のドラム[Tddddd]を、イベントバッファ101におけるユーザポート番号UPN(1)のバッファ領域にストアする。
【0070】
そして、クライアント200−UPN(2)のユーザAが、前述の再生処理によりサーバ100から受信したクライアント200−UPN(1)のドラム[Tddddd]を自動演奏させると、
図8(b)に図示するように、5単位分の遅延時間(図中の「−」記号が1単位の遅延時間を示す)を経てからドラム[Tddddd]が再生される。
【0071】
なお、ここで言う遅延時間とは、クライアント200−UPN(1)のドラム[Tddddd]の遅延時間をゼロと仮定した場合に、クライアント200−UPN(2)がサーバ100から受信したクライアント200−UPN(1)のドラム[Tddddd]の自動演奏開始を指示してから発音開始するまでの相対的な遅延時間を指す。
【0072】
クライアント200−UPN(2)のユーザAが、上述のように5単位分の遅延時間を経て再生されるドラム[Tddddd]に合わせてピアノ演奏したとする。そうすると、この場合、5単位分の遅延時間が付加されたピアノ[Tppppp]がサーバ100に送信され(
図8(b)参照)、イベントバッファ101におけるユーザポート番号UPN(2)のバッファ領域にストアされる。
【0073】
さて一方、クライアント200−UPN(3)のユーザCが、前述の再生処理によりサーバ100から受信したクライアント200−UPN(1)のドラム[Tddddd]と、クライアント200−UPN(2)のピアノ[Tppppp]とを自動演奏させた場合、
図8(c)に図示するように、クライアント200−UPN(1)のドラム[Tddddd]が2単位分の遅延時間を経て再生され、クライアント200−UPN(2)のピアノ[Tppppp]も更に2単位分の遅延時間が加わって都合7単位分の遅延時間を経て再生される。この場合、ドラム[Tddddd]とピアノ[Tppppp]が同期せず正しい演奏にはならない。
【0074】
そこで、クライアント200−UPN(3)のユーザCは、
図8(d)に図示するように、前述の再生処理によりクライアント200−UPN(1)のドラム[Tddddd]に5単位分の遅延時間(図中の「+」記号が1単位の遅延時間を示す)を加算する。こうすることでクライアント200−UPN(1)のドラム[Tddddd]とクライアント200−UPN(2)のピアノ[Tppppp]とが同期した正しい演奏として再生される。
【0075】
次に、クライアント200−UPN(4)のユーザBが、前述の再生処理によりサーバ100から受信したクライアント200−UPN(1)のドラム[Tddddd]を自動演奏させると、
図8(e)に図示するように、3単位分の遅延時間を経てからドラム[Tddddd]が再生され、これに合わせてピアノ演奏すると、3単位分の遅延時間が付加されたピアノ[Tppppp]がサーバ100に送信され、イベントバッファ101におけるユーザポート番号UPN(4)のバッファ領域にストアされる。
【0076】
そして、クライアント200−UPN(1)のドラム[Tddddd]に合わせてクライアント200−UPN(4)が弾いたピアノ[Tppppp]を、クライアント200−UPN(3)のユーザCが自動演奏させたとする。そうすると、
図8(f)に図示するように、クライアント200−UPN(1)のドラム[Tddddd]が2単位分の遅延時間を経て再生され、クライアント200−UPN(4)のピアノ[Tppppp]も更に2単位分の遅延時間が加わって都合5単位分の遅延時間を経て再生される。
【0077】
この場合、ドラム[Tddddd]とピアノ[Tppppp]が同期せず正しい演奏として再生されない為、クライアント200−UPN(3)では、
図8(g)に図示するように、前述の再生処理によりクライアント200−UPN(1)のドラム[Tddddd]に3単位分の遅延時間(図中の「+」記号が1単位の遅延時間を示す)を加算する。
【0078】
すると、クライアント200−UPN(3)のユーザCは、クライアント200−UPN(1)のドラム[Tddddd]とクライアント200−UPN(4)のピアノ[Tppppp]とが同期した正しい演奏として聴くことが出来る。つまり、ネットワークを介して複数のユーザ同士が互いの演奏データを共有し、他のユーザと合奏したり、その合奏を他のユーザに聴かせたりすることができる。
【0079】
D.変形例
次に、
図9〜
図11を参照して変形例による再生処理の動作を説明する。以下では、ユーザポート番号UPN毎の遅延を自動的に調整する変形例の再生処理について説明する。なお、この変形例による再生処理では、前述した記録処理において、各ユーザポート番号UPN毎のクライアント200が演奏に影響しない頻度で定期的に絶対時刻を表すMIDIイクスクルーシブメッセージを時刻マーカSとして送信することを前提としている。
【0080】
さて、こうした前提の下で前述した実施形態と同様、クライアント処理のステップSB6(
図5参照)を介して本処理が実行されると、CPU20は
図9に図示するステップSE1に処理を進め、時刻をインクリメントして現在時刻を更新する。続いて、ステップSE2では、RAM22の再生用イベントバッファEB2の内、現在指定されているユーザポート番号UPNのバッファデータの中から現在時刻近傍にある時刻マーカS(MIDIイクスクルーシブメッセージ)を抽出し、抽出した時刻マーカSから時刻Cを取得する。
【0081】
次いで、ステップSE3では、RAM22の再生用イベントバッファEB2から現在時刻近傍にあるユーザポート番号UPN毎の時刻マーカSの各時刻を取得し、続くステップSE4では、取得したユーザポート番号UPN毎の時刻マーカSの各時刻の中で最も遅い時刻を最遅延時刻CMとする。そして、ステップSE5では、上記ステップSE4で取得した最遅延時刻CMと、上記ステップSE3で取得した現在指定されているユーザポート番号UPNの時刻Cとの差分を現在時刻に加算して再生処理時刻を算出する。
【0082】
こうして、再生処理時刻が算出されると、ステップSE6に進み、上記ステップSE1で更新された現在時刻とを比較し、続くステップSE7(
図10参照)では、その比較の結果に基づき処理タイミングである否かを判断する。再生処理時刻に対して現在時刻が処理タイミングでなければ、判断結果は「NO」になり、一旦本処理を終えるが、再生処理時刻に対して現在時刻が処理タイミングになると、判断結果が「YES」になり、ステップSE8に進む。
【0083】
ステップSE8では、RAM22の再生用イベントバッファEB2に記憶されるユーザポート番号UPN毎のバッファデータの内、現在指定されているユーザポート番号UPNのバッファデータにおいて、処理タイミングに該当するデータの有無を判断する。処理タイミングに該当するデータが無ければ、判断結果は「NO」になり、一旦本処理を終えるが、処理タイミングに該当するデータが有ると、判断結果が「YES」になり、ステップSE9に進み、RAM22の再生用イベントバッファEB2において、現在指定されているユーザポート番号UPNのバッファデータ中から該当するデータを読み出す。
【0084】
次いで、ステップSE10では、現在の動作モードがEVENTモード、TIMEモードおよびLONGモードの何れであるかを判別する。初回のモード判別は、読み出したデータの種別に基づき判別する。具体的には、読み出したデータ(1バイト分)が、MIDIイクスクルーシブ以外のイベントバイトならばEVENTモード、イベント発生時刻の差分時間ならばTIMEモード、データ「0xFF」(同期キャラクタ)ならばLONGモードと判別する。
【0085】
上記ステップSE10においてEVENTモードと判別されると、ステップSE11に進み、、読み出したデータ(イベントバイト)を音源27のバッファに転送し、バッファ転送されるイベントバイトを蓄積してMIDIシーケンスデータを形成する。続いて、ステップSE12では、イベントバイトを蓄積して形成したMIDIシーケンスデータに基づく自動演奏を音源27に指示する。この後、ステップSE13に進み、動作モードをTIMEモードに遷移させてから上述のステップSE2(
図9参照)に処理を戻す。
【0086】
上記ステップSE10においてTIMEモードと判別されると、ステップSE14に進み、読み出したデータ(イベント発生時刻の差分時間)を再生処理時刻に加算し、当該再生処理時刻を更新する。次いで、ステップSE15では、更新された再生処理時刻が「0xFF」であるかどうかを判断する。更新された再生処理時刻が「0xFF」になると、判断結果は「YES」となり、ステップSE16に進み、動作モードをLONGモードに遷移させてから上述のステップSE2(
図9参照)に処理を戻す。
【0087】
これに対し、更新された再生処理時刻が「0xFF」でなければ、上記ステップSE15の判断結果は「NO」になり、ステップSE17に進み、動作モードをEVENTモードに遷移させてから上述のステップSE2に処理を戻す。上記ステップSE10においてLONGモードと判別されると、ステップSE18に進み、動作モードをTIMEモードに遷移させてから上述のステップSE2(
図9参照)に処理を戻す。
【0088】
このように、変形例による再生処理では、例えば
図11(a)に図示するように、ユーザポート番号Aの時刻マーカS(MIDIイクスクルーシブメッセージ)を受信した3クロック後(図中の「=」は1クロックを示す)にユーザポート番号Bの時刻マーカSを受信し、さらに3クロック後にユーザポート番号Cの時刻マーカSを受信したとする。
【0089】
ここで、ユーザポート番号Aの時刻マーカSが時刻TA、ユーザポート番号Bの時刻マーカSが時刻TB、ユーザポート番号Cの時刻マーカSが時刻TCとすると、この中で最も遅い時刻TCが最遅延時刻とるので、ユーザポート番号Aの再生処理時刻を現在時刻+(TC−TA)、ユーザポート番号Bの再生処理時刻を現在時刻+(TC−TB)およびユーザポート番号Cの再生処理時刻を現在時刻とする遅延調整を行えば、
図11(b)に図示するように、ユーザポート番号A〜Cの再生処理時刻を同期させることができる。
【0090】
こうした遅延調整が為された後、現在時刻と再生処理時刻との比較結果に基づき現在時刻が処理タイミングと判定され、かつRAM22の再生用イベントバッファEB2に記憶されるユーザポート番号UPN毎のバッファデータの内、現在指定されているユーザポート番号UPNのバッファデータにおいて、処理タイミングに該当するデータが存在すると、その該当データを現在指定されているユーザポート番号UPNのバッファデータ中から読み出す。
【0091】
そして、動作モードがEVENTモードと判別された場合には、読み出したデータ(イベントバイト)を音源27のバッファに転送し、バッファ転送されるイベントバイトを蓄積して形成したMIDIシーケンスデータに基づく自動演奏を音源27に指示する。
【0092】
動作モードがTIMEモードと判別された場合には、読み出したデータ(イベント発生時刻の差分時間)を再生処理時刻に加算して更新し、更新された再生処理時刻が「0xFF」になると、動作モードをLONGモードに遷移させ、一方、更新された再生処理時刻が「0xFF」でなければ、動作モードをEVENTモードに遷移させる。動作モードがLONGモードと判別された場合には、動作モードをTIMEモードに遷移させる。
【0093】
以上のように、本実施形態では、サーバ100と、当該サーバ100にネットワークNWを介して接続する複数のクライアント200から構成される演奏通信装置10において、演奏操作に応じて発生する演奏データを、ユーザ識別番号UIDおよび要求コマンドPUTEVENTと共にクライアント200からサーバ100に送信すると、サーバ100では受信した演奏データを、イベントバッファ101の内、ユーザ識別番号UIDに対応付けて割り当てたユーザポート番号UPNのバッファ領域にストアする。
【0094】
そして、クライアント200からサーバ100に要求コマンドGETEVENTを送信すると、サーバ100ではイベントバッファ101の各バッファ領域からユーザポート番号UPN毎の演奏データを読み出してクライアント200に返信する。そして、クライアント200では、サーバ100から受領したユーザポート番号UPN毎の演奏データの内、所望のユーザポート番号UPNの演奏データを再生し、それに合わせた演奏操作に応じて演奏データを発生するので、ネットワークを介して複数のユーザ同士が互いの演奏データを共有し、他のユーザと合奏したり、その合奏を他のユーザに聴かせたりすることが可能になる。
【0095】
以上、本発明の実施の一形態について説明したが、本発明はそれに限定されるものではなく、本願出願の特許請求の範囲に記載された発明とその均等の範囲に含まれる。以下では、本願出願当初の特許請求の範囲に記載された各発明について付記する。
【0096】
(付記)
[請求項1]
割り当てられたユーザ識別番号と共に、演奏操作に応じて発生する演奏データを送信する演奏データ送信手段と、送信されて来る演奏データを受信する演奏データ受信手段と、前記演奏データ受信手段により受信された演奏データを再生する再生手段と、を有する複数のユーザ端末をネットワークを介して接続された演奏通信サーバであって、
前記複数のユーザ端末毎に、前記ユーザ識別番号および当該ユーザ識別番号に対応付けたユーザポート番号を割り当てる割り当て手段と、
前記割り当て手段により割り当てられたユーザポート番号毎の記憶領域を有する演奏データ記憶手段と、
前記ユーザ端末からユーザ識別番号と共に送信されて来る演奏データを受信する受信手段と、
前記演奏データ記憶手段が有する記憶領域の内、前記受信手段が受信したユーザ識別番号に対応付けられたユーザポート番号の記憶領域に、前記受信手段が当該ユーザ識別番号と共に受信した演奏データを書き込む書き込み手段と、
前記演奏データ記憶手段が有する各記憶領域からユーザポート番号毎の演奏データを読み出して前記受信手段が受信したユーザ識別番号の前記ユーザ端末に送信する送信手段と
を具備することを特徴とする演奏通信サーバ。
【0097】
[請求項2]
サーバと、当該サーバにネットワークを介して接続する複数のユーザ端末とから構成され、
前記サーバは、
ネットワークを介して接続する前記複数のユーザ端末毎に、ユーザ識別番号および当該ユーザ識別番号に対応付けたユーザポート番号を割り当てる割り当て手段と、
前記割り当て手段により割り当てられたユーザポート番号毎の記憶領域を有する演奏データ記憶手段と、
ネットワークを介して接続する前記ユーザ端末からユーザ識別番号と共に送信されて来る演奏データを受信する受信手段と、
前記演奏データ記憶手段が有する記憶領域の内、前記受信手段が受信したユーザ識別番号に対応付けられたユーザポート番号の記憶領域に、前記受信手段が当該ユーザ識別番号と共に受信した演奏データを書き込む書き込み手段と、
前記演奏データ記憶手段が有する各記憶領域からユーザポート番号毎の演奏データを読み出して前記受信手段が受信したユーザ識別番号の前記ユーザ端末に送信する送信手段とを具備し、
前記ユーザ端末は、
前記サーバが備える割り当て手段により割り当てられたユーザ識別番号と共に、演奏操作に応じて発生する演奏データを前記サーバに送信する演奏データ送信手段と、
前記サーバから送信されて来るユーザポート番号毎の演奏データを受信する演奏データ受信手段と、
前記演奏データ受信手段により受信されたユーザポート番号毎の演奏データを再生する再生手段と
を具備することを特徴とする演奏通信装置。
【0098】
[請求項3]
前記ユーザ端末が備える演奏データ送信手段は、演奏操作に応じて発生するMIDIイベントに、イベント発生時刻の差分時間を付加した演奏データを送信することを特徴とする請求項2記載の演奏通信装置。
【0099】
[請求項4]
前記ユーザ端末が備える演奏データ送信手段は、MIDIイベントの発生時刻の差分時間が所定時間未満の場合には、MIDIイベントに差分時間を付加し、差分時間が所定時間の場合には、MIDIイベントに同期キャラクタデータを付加し、差分時間が所定時間を超える場合には、MIDIイベントに同期キャラクタデータを複数付加することを特徴とする請求項3記載の演奏通信装置。
【0100】
[請求項5]
前記ユーザ端末が備える再生手段は、再生対象となる演奏データ中に含まれるイベント発生時刻の差分時間に応じて、当該演奏データの再生を遅延させることを特徴とする請求項2記載の演奏通信装置。
【0101】
[請求項6]
前記ユーザ端末が備える演奏データ送信手段は、演奏に影響しない頻度で定期的に絶対時刻を表す時刻マーカを演奏データに付加する時刻マーカ付加手段を更に備え、
前記前記ユーザ端末が備える再生手段は、受信したユーザポート番号毎の演奏データにそれぞれ付加される時刻マーカの中で最も遅い時刻に同期するようにユーザポート番号毎の演奏データの再生タイミングをそれぞれ遅延調整する遅延調整手段を更に備えることを特徴とする請求項2記載の演奏通信装置。
【0102】
[請求項7]
ユーザ識別番号に対応付けたユーザポート番号を割り当てる割り当て手段と、前記割り当て手段により割り当てられたユーザポート番号毎の記憶領域を有する演奏データ記憶手段と、ネットワークを介して送信されて来るユーザ識別番号及び演奏データを受信する受信手段と、前記演奏データ記憶手段が有する記憶領域の内、前記受信手段が受信したユーザ識別番号に対応付けられたユーザポート番号の記憶領域に、前記受信手段が当該ユーザ識別番号と共に受信した演奏データを書き込む書き込み手段と、前記演奏データ記憶手段が有する各記憶領域からユーザポート番号毎の演奏データを読み出すとともに、当該読み出された演奏データを、前記受信手段が受信したユーザ識別番号に基づいて送信する送信手段と、を有するサーバにネットワークを介して複数接続され、夫々前記ユーザ識別番号が割り当てられたユーザ端末であって、
前記ユーザ識別番号と共に、演奏操作に応じて発生する演奏データを前記サーバに送信する演奏データ送信手段と、
前記サーバから送信されて来るユーザポート番号毎の演奏データを受信する演奏データ受信手段と、
前記演奏データ受信手段により受信されたユーザポート番号毎の演奏データを再生する再生手段と
を具備することを特徴とするユーザ端末。
【0103】
[請求項8]
前記ユーザ端末が備える演奏データ送信手段は、演奏操作に応じて発生するMIDIイベントに、イベント発生時刻の差分時間を付加した演奏データを送信することを特徴とする請求項7記載の演奏通信装置。
【0104】
[請求項9]
前記ユーザ端末が備える演奏データ送信手段は、MIDIイベントの発生時刻の差分時間が所定時間未満の場合には、MIDIイベントに差分時間を付加し、差分時間が所定時間の場合には、MIDIイベントに同期キャラクタデータを付加し、差分時間が所定時間を超える場合には、MIDIイベントに同期キャラクタデータを複数付加することを特徴とする請求項8記載の演奏通信装置。
【0105】
[請求項10]
前記ユーザ端末が備える再生手段は、再生対象となる演奏データ中に含まれるイベント発生時刻の差分時間に応じて、当該演奏データの再生を遅延させることを特徴とする請求項7記載の演奏通信装置。
【0106】
[請求項11]
前記ユーザ端末が備える演奏データ送信手段は、演奏に影響しない頻度で定期的に絶対時刻を表す時刻マーカを演奏データに付加する時刻マーカ付加手段を更に備え、
前記前記ユーザ端末が備える再生手段は、受信したユーザポート番号毎の演奏データにそれぞれ付加される時刻マーカの中で最も遅い時刻に同期するようにユーザポート番号毎の演奏データの再生タイミングをそれぞれ遅延調整する遅延調整手段を更に備えることを特徴とする請求項7記載の演奏通信装置。
【0107】
[請求項12]
割り当てられたユーザ識別番号と共に、演奏操作に応じて発生する演奏データを送信する演奏データ送信手段と、送信されて来る演奏データを受信する演奏データ受信手段と、前記演奏データ受信手段により受信された演奏データを再生する再生手段と、を有する複数のユーザ端末を複数ネットワークを介して接続された演奏通信サーバとして用いられるコンピュータに、
前記複数のユーザ端末毎に、前記ユーザ識別番号および当該ユーザ識別番号に対応付けたユーザポート番号を割り当てる割り当てステップと、
前記ユーザ端末からユーザ識別番号と共に送信されて来る演奏データを受信する受信ステップと、
演奏データ記憶手段が有する前記ユーザポート番号毎の記憶領域の内、前記受信したユーザ識別番号に対応付けられたユーザポート番号の記憶領域に、前記ユーザ識別番号と共に受信された演奏データを書き込む書き込みステップと、
前記演奏データ記憶手段が有する各記憶領域からユーザポート番号毎の演奏データを読み出して前記受信されたユーザ識別番号の前記ユーザ端末に送信する送信ステップと、
を実行させることを特徴とするプログラム。
【0108】
[請求項13]
サーバと、当該サーバにネットワークを介して接続する複数のユーザ端末とから構成される演奏通信装置で実行されるプログラムであって、
前記サーバに搭載されるコンピュータに、
ネットワークを介して接続する前記複数のユーザ端末毎に、ユーザ識別番号および当該ユーザ識別番号に対応付けたユーザポート番号を割り当てる割り当てステップと、
ネットワークを介して接続する前記ユーザ端末からユーザ識別番号と共に送信されて来る演奏データを受信する受信ステップと、
前記割り当てステップで割り当てられたユーザポート番号毎の記憶領域を有し、これら記憶領域の内、前記受信ステップで受信したユーザ識別番号に対応付けられたユーザポート番号の記憶領域に、前記受信ステップにおいて当該ユーザ識別番号と共に受信した演奏データを書き込む書き込みステップと、
前記割り当てステップで割り当てられたユーザポート番号毎の記憶領域のそれぞれから読み出したユーザポート番号毎の演奏データを、前記受信ステップで受信したユーザ識別番号の前記ユーザ端末に送信する送信ステップとを実行させ、
前記ユーザ端末に搭載されるコンピュータに、
前記サーバの割り当てステップで割り当てられたユーザ識別番号と共に、演奏操作に応じて発生する演奏データを前記サーバに送信する演奏データ送信ステップと、
前記サーバから送信されて来るユーザポート番号毎の演奏データを受信する演奏データ受信ステップと、
前記演奏データ受信ステップで受信されたユーザポート番号毎の演奏データを再生する再生ステップと
を実行させることを特徴とするプログラム。
【0109】
[請求項14]
ユーザ識別番号に対応付けたユーザポート番号を割り当てる割り当て手段と、前記割り当て手段により割り当てられたユーザポート番号毎の記憶領域を有する演奏データ記憶手段と、ネットワークを介して送信されて来るユーザ識別番号及び演奏データを受信する受信手段と、前記演奏データ記憶手段が有する記憶領域の内、前記受信手段が受信したユーザ識別番号に対応付けられたユーザポート番号の記憶領域に、前記受信手段が当該ユーザ識別番号と共に受信した演奏データを書き込む書き込み手段と、前記演奏データ記憶手段が有する各記憶領域からユーザポート番号毎の演奏データを読み出すとともに、当該読み出された演奏データを、前記受信手段が受信したユーザ識別番号に基づいて送信する送信手段と、を有するサーバにネットワークを介して複数接続され、夫々前記ユーザ識別番号が割り当てられたユーザ端末として用いられるコンピュータに、
前記ユーザ識別番号と共に、演奏操作に応じて発生する演奏データを前記サーバに送信する演奏データ送信ステップと、
前記サーバから送信されて来るユーザポート番号毎の演奏データを受信する演奏データ受信ステップと、
前記受信されたユーザポート番号毎の演奏データを再生する再生ステップと
を実行させることを特徴とするプログラム。