(57)【特許請求の範囲】
【請求項１】
演奏情報としてのイベントデータとその発生時刻を特定する時間データを記録するためのトラックを複数有する自動演奏装置であって、
前記複数のトラックの中から少なくとも２つのトラックを指定するトラック指定手段と、
前記トラック指定手段により指定された一方のトラックに記録されている各イベントデータの発生時刻に近い他方のトラックのイベントデータを検索する検索手段と、
前記一方のトラックの１つのイベントデータの発生時刻に近い前記他方のトラックの１つのイベントデータを選択して組指定する選択手段と、
２つのイベントデータに共通する発生時刻の修正目標値を規定する第１の目標パラメータを設定する第１の設定手段と、
前記選択手段にて組指定された２つのイベントデータについて、前記第１の目標パラメータにて規定された発生時刻の修正目標値に接近するように、それぞれの発生時刻を修正する修正手段と、
を備えたことを特徴とする自動演奏装置。
【請求項２】
２つのイベントデータに共通するベロシティの修正目標値を規定する第２の目標パラメータを設定する第２の設定手段をさらに備えるとともに、
前記修正手段は、前記選択手段にて組指定された２つのイベントデータについて、前記第２の目標パラメータにて規定されたベロシティの修正目標値に接近するように、それぞれのベロシティを修正することを特徴とする請求項１記載の自動演奏装置。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、電子楽器の演奏データを記録再生する自動演奏装置に関する。
【０００２】
【従来の技術】
従来、自動演奏装置には演奏データのタイミングを所定の分解能（例えば１６分音符、８分音符）に収束させる所謂クオンタイズと呼ばれる機能が設けられている。このクオンタイズ機能は、ある時間範囲を指定してその範囲内のデータの時刻を指定された分解能に収束させるものである。言い換えれば、ある時間範囲内のデータの時刻を一定間隔の時刻にする、もしくは近づけるというものである。
【０００３】
【発明が解決しようとする課題】
ところで、上述した従来の自動演奏装置にあっては、そのクオンタイズ機能があくまでも一定間隔の時刻を基準にしているので、単純な時間的操作しかできない。また、トラックのデータをコピーする機能を使用してあるトラックのデータをそのまま別のトラックにコピーし、音色のみ異なるものにしてユニゾン演奏を行なうことはできるが、タイミングが完全に一致してしまうので、人間的な微妙なズレやノリといったものを表現することができないという問題点があった。
【０００４】
そこで本発明は、ユニゾン演奏等に適したイベントデータの時間修正等が可能な自動演奏装置を提供することを目的としている。
【０００５】
【課題を解決するための手段】
上記目的達成のため、本発明による自動演奏装置は、演奏情報としてのイベントデータとその発生時刻を特定する時間データを記録するためのトラックを複数有する自動演奏装置であって、前記複数のトラックの中から少なくとも２つのトラックを指定するトラック指定手段と、前記トラック指定手段により指定された一方のトラックに記録されている各イベントデータの発生時刻に近い他方のトラックのイベントデータを検索する検索手段と、前記一方のトラックの１つのイベントデータの発生時刻に近い前記他方のトラックの１つのイベントデータを選択して組指定する選択手段と、２つのイベントデータに共通する発生時刻の修正目標値を規定する第１の目標パラメータを設定する第１の設定手段と、前記選択手段にて組指定された２つのイベントデータについて、前記第１の目標パラメータにて規定された発生時刻の修正目標値に接近するように、それぞれの発生時刻を修正する修正手段とを備えたことを特徴とする。
【０００６】
また、好ましい態様として、２つのイベントデータに共通するベロシティの修正目標値を規定する第２の目標パラメータを設定する第２の設定手段をさらに備えるとともに、前記修正手段は、前記選択手段にて組指定された２つのイベントデータについて、前記第２の目標パラメータにて規定されたベロシティの修正目標値に接近するように、それぞれのベロシティを修正することを特徴とする。
【０００７】
【作用】
本発明では、複数のトラックの中から少なくとも２つのトラックが選択され、これらのトラックに記憶されているイベントデータの時間情報や付随する情報（例えばベロシティデータ）が、共通の目標値に接近するように修正される。
したがって、人間的なズレやノリといったものを失うことなく、ユニゾン演奏の再現ができる。
また、本発明では、少なくとも２つのトラックのイベントデータ同士が所定の時間差以内のものや、最も近いもの同士についてのみ修正が行なわれる。
したがって、意図しない変更を避けることができる。
【０００８】
【実施例】
以下、図面を参照して本発明の一実施例について説明する。
図１は本発明に係る自動演奏装置の一実施例の外観を示す斜視図である。この図において、１は本体パネル、２は鍵盤、３Ｒ、３Ｌの各々はスピーカ、４はスイッチ部である。図２はスイッチ部４の一部分の拡大図であり、この図において、５はＲｅｃ（録音）スイッチであり、これを押すことによって録音が開始される。６はスタート／ストップスイッチであり、録音中の時にこれを押すと録音が停止する。また、録音中でない時（停止時）にこれを押すと自動演奏再生（以下再生という）になる。また、再生中にこれを押すと再生が停止する。７はトラック選択スイッチであり、トラック１とトラック２を択一的に選択する。なお、この実施例の自動演奏装置は２つ以上のトラックへの記録再生可能であり、トラック選択スイッチ７は図示せぬ選択スイッチにより選択された２つのトラックを択一的に選択する。８〜１０の各々はＬＥＤ（発光ダイオード）であり、このうちＬＥＤ８は録音中に点灯し、ＬＥＤ９は再生中に点灯する。また、ＬＥＤ１０はトラック２が選択されている間点灯する。
【０００９】
１１は時間パラメータＡを設定するための時間パラメータ設定スイッチであり、これを押しながらテンキー１３より数値を入力することで、この数値に対応するキーデータが後述するＡレジスタにストアされる。１２はタッチパラメータを設定するためのタッチパラメータ設定スイッチであり、これを押しながらテンキー１３より数値を入力することで、この数値に対応するキーデータが後述するＣレジスタにストアされる。１４はトラック時間を設定するためのトラック時間設定スイッチであり、これを押しながらテンキー１３より数値を入力することで、この数値に対応するキーデータが後述するＴＲ１レジスタまたはＴＲ２レジスタにストアされる。この場合、トラック選択スイッチ７によってトラック１が選択された場合にはＴＲ１レジスタにキーデータがストアされ、トラック２が選択された場合にはＴＲ２レジスタにキーデータがストアされる。
【００１０】
１５はトラックタッチを設定するためのトラックタッチ設定スイッチであり、これを押しながらテンキー１３より数値を入力することで、この数値に対応するキーデータが後述するＶＲ１レジスタまたはＶＲ２レジスタにストアされる。この場合、トラック選択スイッチ７によってトラック１が選択された場合にはＶＲ１レジスタにキーデータがストアされ、トラック２が選択された場合にはＶＲ２レジスタにキーデータがストアされる。１６は量子化スイッチであり、これを押すとクオンタイズ処理が開始される。
【００１１】
ここで、この実施例のクオンタイズ機能の概要について説明する。
この実施例のクオンタイズ機能は、ノート情報に対してそのタイミングとベロシティを変更するものである。処理の大まかな流れとしては、（イ）時間の接近しているイベントの組の検出、（ロ）イベントの時間データの修正、（ハ）イベントのベロシティデータの修正の、３段階からなり、（イ）〜（ハ）を指定された時間範囲内の全てについて行なう。以下、（イ）〜（ハ）の概要を説明する。
（イ）イベントの組の検出
図３に示すように、トラック１の各イベントデータに対して発生時刻が最も近いトラック２のイベントデータを検索する。そして、これら２つのイベントデータの発生時刻の差が所定時間以内でなければトラック１のイベントデータの修正を行なわない。
また、トラック２の１つのイベントデータに対してトラック１の複数のイベントデータが対応する場合は、発生時刻が最も近いイベントデータのみ修正の対象となる。
【００１２】
（ロ）イベントの時間データの修正
イベントの時間データの修正に際し、各々のイベントデータのタイミングが何処に近づくかという位置を設定する。この位置は時間パラメータＡによって決定する。ここで、時間パラメータＡが”０”のときはトラック１のイベントのタイミングとなり、”０．５”のときは中間のタイミングとなる。また、”１”のときはトラック２のイベントのタイミングとなる。この時間パラメータＡによって設定された位置の時刻ＴＱは、トラック１のイベントの発生時刻をＴ１、トラック２のイベントの発生時刻をＴ２とすれば、
ＴＱ＝Ｔ１＋（Ｔ２−Ｔ１）×Ａ  …（１）
で表わされる。
【００１３】
トラック１、２のイベントデータがこの位置に接近する度合いを決定するのがＴＲ１、ＴＲ２というトラック時間である。修正後のトラック１のイベントの発生時刻ＴＱ１は、
ＴＱ１＝Ｔ１＋（ＴＱ−Ｔ１）×ＴＲ１  …（２）
で表わされる。
また、トラック２のイベントの発生時刻ＴＱ２は、
ＴＱ２＝Ｔ２＋（ＴＱ−Ｔ２）×ＴＲ２  …（３）
で表わされる。
図４にこの様子を示す。
【００１４】
（ハ）イベントのベロシティデータの修正
イベントのベロシティの修正に際し、各々のイベントデータのベロシティが何処に近づくかという位置を設定する。この位置はタッチパラメータＣによって決定する。タッチパラメータが“０”のときはトラック１のイベントのベロシティとなり、“０．５”のときは中間のベロシティとなる。また、“１”のときはトラック２のイベントのベロシティとなる。このタッチパラメータによって設定されたベロシティＶＱは、トラック１のイベントのベロシティをＶ１、トラック２のイベントのベロシティをＶ２とすれば、
ＶＱ＝Ｖ１＋（Ｖ２−Ｖ１）×Ｃ  …（４）
で表わされる。
【００１５】
トラック１、２のイベントデータがこの位置に接近する度合いを決定するのがＶＲ１、ＶＲ２というトラックタッチである。修正後のトラック１のイベントのベロシティＶＱ１は、
ＶＱ１＝Ｖ１＋（ＶＱ−Ｖ１）×ＶＲ１  …（５）
で表わされる。
また、トラック２のイベントのベロシティＶＱ２は、
ＶＱ２＝Ｖ２＋（ＶＱ−Ｖ２）×ＶＲ２  …（６）
で表わされる。
図５にこの様子を示す。
【００１６】
次に、図６はこの実施例の自動演奏装置の構成を示すブロック図である。この図において、１８はＣＰＵであり、装置各部の制御を行なう。１９はＲＯＭであり、ＣＰＵ１８を制御するためのプログラムが書き込まれている。２０はＲＡＭであり、ＣＰＵ１８のワークエリアとして使用される。このＲＡＭ２０には次に示すフラグおよびレジスタが設定される。レジスタには各種データがストアされる。
ＰＳＦ（プレイスタートフラグ）：再生時に”１”が立つ。
ＴＲＦ（トラックフラグ）：トラック２の選択時に”１”が立つ。
ＲｅｃＦ（レコーデイングフラグ）：録音時に”１”が立つ。
ＱＦ（クオンタイズフラグ）：クオンタイズ時に”１”が立つ。
ＯＮＦ（オンフラグ）：キーオン時に”１”が立つ。
ＯＦＦＦ（オフフラグ）：キーオフ時に”１”が立つ。
【００１７】
ＡＤレジスタ１、ＡＤレジスタ２、Ａレジスタ、Ｃレジスタ、ＴＲ１レジスタ、ＴＲ２レジスタ、ＶＲ１レジスタ、ＶＲ２レジスタ、ＮＮレジスタ、ＴＤレジスタ、ＴＤ１レジスタ、ＴＤ２レジスタ、ＴＤＡレジスタ、ＴＤＢレジスタ、ＴＤＣレジスタ、ＴＤＤレジスタ、ＴＤＥレジスタ、ＴＤＦレジスタ、ＴＤＱレジスタ、ＴＯＣレジスタ、ＴＯＤレジスタ、ＴＯＱレジスタ
【００１８】
２１はタッチ検出回路であり、鍵盤２の各鍵のタッチを検出する。２２は楽曲データＲＡＭであり、トラック１とトラック２の演奏データが書き込まれる。２３は音源、２４は増幅器とスピーカとから構成される発音回路である。
図７は楽曲データＲＡＭ２２の内容の一例を示す図である。この図において、“Ｔ”は楽曲先頭からキーオンまたはキーオフまでの時間、“ＯＮ”はキーオン、“ＯＦＦ”はキーオフ、“ＮＮ”はキーコード、“ＴＤ”はタッチデータである。ＴＤはキーオンが入った状態で一緒に入る。ＴＤが入った後にキーオフが入る。キーオンの場合は“Ｔ”、“ＯＮ”、“ＴＤ”からなり、オフの場合は“Ｔ”、“ＯＦＦ”からなる。これらの最後には“ＥＮＤ”が入る。
上記トラック選択スイッチ７、図示せぬ選択スイッチおよびＣＰＵ１８はトラック指定手段１００を構成する。また、上記ＣＰＵ１８は検索手段、選択手段および修正手段に対応する。
【００１９】
次に、上記構成による自動演奏装置の動作について図８〜図１７に示すフローチャートを参照しながら説明する。
図８は全体の処理を示すフローチャートであり、まず、ステップＳ１０でイニシャライズが行なわれ、次いでステップＳ１２でスイッチ処理が行なわれる。そして、ステップＳ１４で鍵盤処理が行なわれ、この後、ステップＳ１６で量子化処理を行ない、次いでステップＳ１８で再生処理を行なう。そして、最後にステップＳ２０でその他の処理を行なう。以下、スイッチ処理、鍵盤処理、量子化処理および再生処理の各々の詳細について説明する。
【００２０】
スイッチ処理
図９はスイッチ処理を示すフローチャートである。
まず、ステップＳ１００でスイッチ走査を行なう。そして、ステップＳ１０２で状態変化したか否かの判定を行なう。すなわち、スイッチ操作が行なわれたか否かの判定を行なう。この判定において、スイッチ操作が行なわれたと判断するとステップＳ１０４に進み、スイッチ操作が行なわれていないと判断すると処理を抜ける。スイッチ操作が行なわれたと判断してステップＳ１０４に進むと、どのスイッチが操作されたかを判定する。この判定において、▲１▼トラック選択スイッチ７が操作されたと判断するとステップＳ１０６に進み、ＴＲＦ（トラックフラグ）を反転させる。すなわち、ＴＲＦが”１”であれば”０”にし、ＴＲＦが”０”であれば”１”にする。
【００２１】
次いで、ステップＳ１０８でＴＲＦが”１”であるか否かの判定を行ない、”１”であると判断するとトラック２を選択するので、ステップＳ１１０でＬＥＤ１０を点灯させる。ＬＥＤ１０を点灯させた後に処理を抜ける。これに対してＴＲＦが”１”でないと判断するとトラック１を選択するので、ステップＳ１１２でＬＥＤ１０を消灯する。このようにトラック選択スイッチ７を押す毎にＬＥＤ１０の点灯、消灯を繰り返す。
上記ステップＳ１０４の判定において、▲２▼スタート／ストップスイッチ６が操作されたと判断すると、ステップＳ１１４でＲｅｃＦが”１”であるか否かの判定を行ない、”１”でないと判断すると、録音中ではないのでステップＳ１１６に進みＰＳＦを反転させる。ＰＳＦを反転させた後、ステップＳ１１８でＰＳＦが”１”であるか否かの判定を行なう。この判定においてＰＳＦが”１”であると判断すると、スタートを示すためにステップＳ１２０でＬＥＤ９を点灯させる。これに対してＰＳＦが”１”でないと判断すると、ストップを示すためにステップＳ１２２でＬＥＤ９を消灯する。ＬＥＤ９の点灯または消灯を行なった後、ステップＳ１２４でトラックを読み出すアドレスであるＡＤレジスタ１、ＡＤレジスタ２をそれぞれ初期化し、処理を抜ける。このようにストップ状態でスタート／ストップスイッチ６が押されると、ＰＳＦを”１”にしてＬＥＤ９を点灯し、スタート状態でスタート／ストップスイッチ６が押されるとＰＳＦを”０”に初期化してＬＥＤ９を点灯する。そして、トラックを読み出すアドレスであるＡＤレジスタ１、ＡＤレジスタ２を初期化する。
【００２２】
上記ステップＳ１１４でＲｅｃＦが”１”であると判断すると、録音中であることからステップＳ１２６でＲｅｃＦを”０”に初期化する。すなわち、録音中にあるときにスタート／ストップスイッチ６が押されると、録音を解除するためにＲｅｃＦを初期化する。そして、ステップＳ１２８でＴＲＦが”１”であるか否かの判定を行なう。この判定においてＴＲＦが”１”であると判断すると、トラック２の録音が行なわれていることから、ステップＳ１３０でＡＤレジスタ２に”ＥＮＤ”をストアする。これに対してＴＲＦが”１”でないと判断すると、トラック１の録音が行なわれていることから、ステップＳ１３２でＡＤレジスタ１に”ＥＮＤ”をストアする。ステップＳ１３０またはステップＳ１３２の処理後、録音終了を示すためにステップＳ１３４でＬＥＤ８を消灯する。ＬＥＤ８の消灯後、ステップＳ１２４に進む。このように録音中であれば、ＲｅｃＦを初期化した後、ＴＲＦが”１”であればＡＤレジスタ２に”ＥＮＤ”をストアし、ＴＲＦが”０”であればＡＤレジスタ１に”ＥＮＤ”をストアする。そして、ＬＥＤ８を消灯する。
【００２３】
上記ステップＳ１０４の判定において、▲３▼Ｒｅｃスイッチ５が操作されたと判断すると、ステップＳ１３６でＰＳＦが”１”であるか否かの判定を行なう。この判定において、”１”と判断すると処理を抜ける。これに対して”１”でないと判断すると、ステップＳ１３８でＲｅｃＦが”１”であるか否かの判定を行なう。この判定において、”１”と判断すると処理を抜ける。これに対して”１”でないと判断すると、ステップＳ１４０でＲｅｃＦを”１”にする。次いでステップＳ１４２でＬＥＤ８を点灯させる。そして、ステップＳ１４４でＴを初期化し、ステップＳ１２４に進む。このようにＰＳＦが”１”でなく、またＲｅｃＦが”１”でない場合、ＲｅｃＦを”１”にし、その後、ＬＥＤ８を点灯する。そしてＴを初期化する。
【００２４】
上記ステップＳ１０４の判定において、▲４▼量子化スイッチ１６が操作されたと判断すると、ステップＳ１４６でＱＦに”１”にし、処理を抜ける。
また、上記ステップＳ１０４の判定において、▲５▼パラメータスイッチ１１〜１５のうちのいずれかが操作されたと判断すると、ステップＳ１４８でＱＦが”１”であるか否かの判定を行なう。この判定においてＱＦが”１”でない、すなわち量子化スイッチ１６が操作されていないと判断すると、ステップＳ１５０でパラメータ入力を行なう。これに対してＱＦが”１”と判断すると、量子化スイッチ１６が操作されたと判断し、処理を抜ける。
【００２５】
パラメータ入力処理
図１０はパラメータ入力処理を示すフローチャートである。パラメータ入力は上述したようにクオンタイズ処理が行なわれていない時に行なわれる。
まず、ステップＳ２００でどのパラメータが入力されたかを判定し、時間パラメータＡが入力されたと判断すると、ステップＳ２０２でテンキー１３より入力された数値に対応するキーデータをＡレジスタにストアし、処理を抜ける。
また、ステップＳ２００でタッチパラメータが入力されたと判断すると、ステップＳ２０４でテンキー１３より入力された数値に対応するキーデータをＣレジスタにストアし、処理を抜ける。
【００２６】
また、ステップＳ２００でトラック時間が入力されたと判断すると、ステップＳ２０６でＴＲＦが“１”であるか否かの判定を行ない、ＴＲＦが“１”であると判断すると、トラック２が選択されているので、ステップＳ２０８でキーデータをＴＲ２レジスタにストアする。これに対してステップＳ２０６の判定においてＴＲＦが“１”でないと判断すると、トラック１が選択されているので、ステップＳ２１０でキーデータをＴＲ１レジスタにストアし、処理を抜ける。
また、ステップＳ２００でトラックタッチが入力されたと判断すると、ステップＳ２１２でＴＲＦが“１”であるか否かの判定を行ない、ＴＲＦが“１”であると判断すると、トラック２が選択されているので、ステップＳ２１４でキーデータをＶＲ２レジスタにストアする。これに対してステップＳ２１２の判定においてＴＲＦが“１”でないと判断すると、トラック１が選択されているので、ステップＳ２１６でキーデータをＶＲ１レジスタにストアし、処理を抜ける。
【００２７】
鍵盤処理
図１１は鍵盤処理を示すフローチャートである。
まず、ステップＳ３００で鍵盤走査を行ない、次いでステップＳ３０２で状態変化したか、または、そのままかを判定する。この判定において、鍵がオフからオンに状態が変化したと判断すると、ステップＳ３０４でノートナンバーをＮＮレジスタにストアする。次いで、ステップＳ３０６でＴＤレジスタにタッチデータをストアする。そして、ステップＳ３０８でＮＮレジスタの内容とＴＤレジスタの内容を音源２３に送出して発音を指示する。次に、ステップＳ３１０でＲｅｃＦが”１”であるか否かの判定を行ない、”１”でないと判断すると（すなわち録音中でないと判断すると）、処理を抜け、”１”であると判断すると、トラック１またはトラック２のいずれかに録音を行なうためにステップＳ３１２でＴＲＦが”１”か否かの判定を行なう。この判定において、ＴＲＦが”１”であると判断すると、ステップＳ３１４でトラック２のＡＤ２のエリアにＴをストアし、次いでステップＳ３１６でＡＤ２を１インクリメントする。
【００２８】
そして、ステップＳ３１８でトラック２のＡＤレジスタ２で示すエリアにＮＮレジスタの内容とＯＮＦ（オンフラグ）をストアする。次いで、ステップＳ３２０でＡＤレジスタ２を１インクリメントし、その後、ステップＳ３２２でトラック２のＡＤレジスタ２で示すエリアにＴＤレジスタの内容をストアする。次いで、ステップＳ３２４でＡＤレジスタ２を１インクリメントし、処理を抜ける。
上記ステップＳ３１２でＴＲＦが“１”でないと判断すると、ステップＳ３２６でトラック１のＡＤレジスタ１で示すエリアにＴをストアし、次いでステップＳ３２８でＡＤレジスタ１を１インクリメントする。次にステップＳ３３０でトラック１のＡＤレジスタ１で示すエリアにＮＮレジスタの内容とＯＮＦ（オンフラグ）をストアする。そして、ステップＳ３３２でＡＤレジスタ１を１インクリメントし、ステップＳ３３４でトラック１のＡＤレジスタ１で示すエリアにＴＤレジスタの内容をストアする。そして、ステップＳ３３６でＡＤレジスタ１を１インクリメントし、処理を抜ける。
【００２９】
上記ステップＳ３０２で鍵がオンからオフに状態が変化したと判断すると、ステップＳ３３８でノートナンバーをＮＮレジスタにストアする。次いでステップＳ３４０でＮＮレジスタの内容に対応する楽音と消音を指示する。次にステップＳ３４２でＲｅｃＦが”１”であるか否かの判定を行なう。すなわち録音中であるか否かを判定する。この判定においてＲｅｃＦが”１”でないと判断すると、メイン処理に戻り、ＲｅｃＦが”１”であると判断すると、トラック１またはトラック２のいずれか一方に録音を行なうためにステップＳ３４４でＴＲＦが”１”か否かの判定を行なう。この判定において、ＴＲＦが”１”であると判断すると、ステップＳ３４６でトラック２のＡＤレジスタ２で示すエリアにＴをストアする。次いで、ステップＳ３４８でＡＤレジスタ２を１インクリメントする。次いで、ステップＳ３５０でトラック２のＡＤレジスタ２で示すエリアにＮＮレジスタの内容とＯＦＦＦ（オフフラグ）をストアする。そして、ステップＳ３５２でＡＤレジスタ２を１インクリメントし、処理を抜ける。
【００３０】
上記ステップＳ３４４でＴＲＦが”１”でないと判断すると、ステップＳ３５４でトラック１のＡＤレジスタ１で示すエリアにＴをストアする。次いでステップＳ３５６でＡＤレジスタ１を１インクリメントする。次にステップＳ３５８でトラック１のＡＤレジスタ１で示すエリアにＮＮレジスタの内容と０ＦＦＦをストアする。そして、ステップＳ３６０でＡＤレジスタ１を１インクリメントし、処理を抜ける。
上記ステップＳ３００で状態に変化がないと判断すると、そのまま何もせず処理を抜ける。
上記Ｔ（時間）は録音がスタートしたと同時に”０”になり、時間に経過とともに１づつインクリメントされる。
【００３１】
タイマインタラプト処理
図１２はタイマインタラプト処理を示すフローチャートである。
まず、ステップＳ４００でＲｅｃＦが“１”であるか否かの判定を行ない、“１”であると判断すると、ステップＳ４０２でＴを１インクリメントする。そして、ＲｅｃＦが“１”でないと判断すると、そのままステップＳ４０４に進む。
ステップＳ４０４に進むと、ＰＳＦが“１”であるか否かの判定を行ない、“１”であると判断すると、ステップＳ４０６でＴＤ１を１デクリメントする。次いで、ステップＳ４０８でＴＤ２を１デクリメントし、処理を抜ける。上記ステップＳ４０４でＰＳＦが“１”でないと判断すると、そのまま処理を抜ける。
【００３２】
量子化処理
図１３は量子化処理を示すフローチャートである。
まず、ステップＳ５００でＱＦが”１”であるか否かの判定を行ない、”１”でなければ量子化スイッチ１６が押されていないものと判断して処理を抜ける。ＱＦが”１”であると判断すると、ステップＳ５０２でトラック１およびトラック２にデータが有るか否かの判定を行なう。この判定においてトラック１およびトラック２にデータが無いと判断すると処理ができないので、処理を抜ける。データが有ると判断すると、ステップＳ５０４でＡＤレジスタ１およびＡＤレジスタ２を初期化する。
【００３３】
ＡＤレジスタ１およびＡＤレジスタ２を初期化した後、ステップＳ５０６でＡＤレジスタ１のデータを読み出す。この場合、初期化直後では”０”のデータが読み出される。そして、ステップＳ５０８でノートオンデータか否かを判定する。ここではトラック１のノートオンデータを探す。ＡＤレジスタ１の内容がノートオンデータでなければ、ステップＳ５１０で”ＥＮＤ”であるか否かの判定を行ない、”ＥＮＤ”であると判断すると、ステップＳ５１１（図１４）でＱＦを初期化する。これに対して”ＥＮＤ”でないと判断すると、ステップＳ５１２でＡＤレジスタ１を１インクリメントしてステップＳ５０６に戻る。ステップＳ５０６〜ステップＳ５１２を繰り返してノートオンデータを捜し、ノートオンデータが見つかると、ステップＳ５１４でノートオンデータの前の時間データであるＴをＴＤＡレジスタにストアする。
【００３４】
次いで、ステップＳ５１６でＡＤレジスタ２の内容を読み出す。この場合、初期化直後では“０”のデータが読み出される。そして、ステップＳ５１８でノートオンデータか否かを判定する。ここではトラック２のノートオンデータを探す。ＡＤレジスタ２の内容がノートオンデータでなければ、ステップＳ５２０で“ＥＮＤ”であるか否かの判定を行ない、“ＥＮＤ”であればステップＳ５２２でＡＤレジスタ２を初期化した後、ステップＳ５２４でＡＤレジスタ１を１インクリメントしてステップＳ５０６に戻る。ステップＳ５２０で“ＥＮＤ”でなければステップＳ５２６でＡＤレジスタ２を１インクリメントしてステップＳ５１６に戻る。ノートオンデータが見つかると、ステップＳ５２８でノートオンデータの前の時間データであるＴをＴＤＢレジスタにストアする。
【００３５】
次いで、ステップＳ５３０でＴＤＢレジスタの内容がＴＤＡレジスタの内容を中心値とする前後の範囲内（ＴＤＡ−α＜ＴＤＢ＜ＴＤＡ＋α）に入っているか否かの判定を行なう。すなわち、図３に示すようにトラック１のノートオンデータに対してトラック２のノートオンデータが所定の範囲内にあるか否かを判定する。この判定においてＴＤＢレジスタの内容がＴＤＡレジスタの内容を中心値とする所定範囲内に入っていないと判断すると、ステップＳ５２６でＡＤレジスタ２を１インクリメントして次のデータを読み出す。例えば図３において符号５０で示すノートオンデータはこの所定範囲内に入っていないので、このノートオンデータを無視し、次のノートンデータを読み出す。なお、このノートオンデータは所謂”オブリガード”と呼ばれ、故意に付けたフレーズであるとみなす。
【００３６】
読み出したデータがノートオンデータであれば、このノートオンデータの前の時間データをＴＤＢレジスタにストアする。そして、上記同様にＴＤＢレジスタの内容がＴＤＡレジスタの内容を中心値とする前後の範囲内（ＴＤＡ−α＜ＴＤＢ＜ＴＤＡ＋α）に入っているか否かの判定を行なう。この判定において、ＴＤＢレジスタの内容がＴＤＡレジスタの内容を中心値とする所定範囲内に入っていると判断すると、ステップＳ５３２で時間パラメータＡによって設定される位置の時刻を求める演算、すなわち上記した（１）式によるＴＤＡ＋（ＴＤＢ−ＴＤＡ）×Ａを行ない、その結果をＴＤＱレジスタにストアする。
【００３７】
次いで、ステップＳ５３４でトラック１の時間データの修正を行なう。すなわち上記した（２）式によるＴＤＡ＋（ＴＤＱ−ＴＤＡ）×ＴＲ１を行ない、その結果をＴＤＣレジスタにストアする。また同様にステップＳ５３６でトラック２の時間データの修正を行なう。すなわち上記した（３）式によるＴＤＢ＋（ＴＤＱ−ＴＤＢ）×ＴＲ２を行ない、その結果をＴＤＤレジスタにストアする。次いで、ステップＳ５３８でＴＤＣレジスタの内容をＡＤレジスタ１の時間としてストアする。同様にステップＳ５４０でＴＤＤレジスタの内容をＡＤレジスタ２の時間データとしてストアする。
【００３８】
ここで、トラック１の内容が図７に示すようになっていた場合、ＡＤレジスタ１＋１のノートオンデータの前の時間データがＡＤレジスタ１の時間データに当り、この時間データがＴＤＡレジスタにストアされる。また、トラック２の内容が図７に示すようになっていた場合、ＡＤレジスタ２＋１のノートオンデータの前の時間データがＡＤレジスタ２の時間データに当り、この時間データがＴＤＢレジスタにストアされる。そして、ＴＤＡレジスタの内容を修正したＴＤＣレジスタの内容がＡＤレジスタ１にストアされる。また、ＴＤＢレジスタの内容を修正したＴＤＤレジスタの内容がＡＤレジスタ２にストアされる。なお、トラック１、２でＥＮＤまでノートオンデータが無い場合は、”オブリガード”として処理を行なわない。
【００３９】
次に、ノートオンデータの修正にしたがってノートオフデータの修正を行なう必要から、ステップＳ５４２でトラック１のノートオンデータに対応するノートオフデータの前の時間データをＴＤＥレジスタにストアする。同様にステップＳ５４４でトラック２のノートオンデータに対応するノートオフデータの前の時間データをＴＤＦレジスタにストアする。ここで、図７に示す場合はＡＤレジスタ１＋３の時間データがＴＤＥレジスタにストアされ、ＡＤレジスタ２＋３の時間データがＴＤＦレジスタにストアされる。そして、ステップＳ５４６でトラック１の時間データに｛ＴＤＥ−（ＴＤＣ−ＴＤＡ）｝をストアし、同様にステップＳ５４８でトラック２の時間データに｛ＴＤＦ−（ＴＤＤ−ＴＤＢ）｝をストアする。以上により時間データのタイミングの修正が終了する。
【００４０】
次に、図１５のステップＳ５５０でトラック１のノートオンデータの後にあるタッチデータをＴＯＣレジスタにストアする。同様にステップＳ５５２でトラック２のノートオンデータの後にあるタッチデータをＴＯＤレジスタにストアする。次いで、ステップＳ５５４でタッチパラメータＣによって設定されるベロシティを求める演算、すなわち上記した（４）式によるＴＯＣ＋（ＴＯＤ−ＴＯＣ）×Ｃを行ない、その結果をＴＯＱレジスタにストアする。
【００４１】
次いで、ステップＳ５５６でトラック１のベロシティの修正を行なう。すなわち上記した（５）式によるＴＯＣ＋（ＴＯＱ−ＴＯＣ）×ＶＲ１を行ない、その結果をＴＯＣレジスタにストアする。同様にステップＳ５５８でトラック２のベロシティの修正を行なう。すなわち上記した（６）式によるＴＯＤ＋（ＴＯＱ−ＴＯＤ）×ＶＲ２を行ない、その結果をＴＯＤレジスタにストアする。次いで、ステップＳ５６０でＴＯＣレジスタの内容をトラック１のタッチデータとしてストアする。同様にステップＳ５６２でＴＯＤレジスタの内容をトラック２のタッチデータとしてストアする。そして、ステップＳ５６４でＡＤレジスタ１を１インクリメントした後、ステップＳ５０６に戻る。以後、トラック１、２のＥＮＤまで同様の処理を繰り返す。
【００４２】
再生処理
図１６および図１７は再生処理を示すフローチャートである。
量子化処理が行なわれた後、この再生処理に移る。まず、ステップＳ６００でＰＳＦが”１”であるか否かの判定を行なう。この判定においてＰＳＦが”１”でない、すなわちストップ状態であると判断すると何もせず処理を抜ける。これに対してＰＳＦが”１”であると判断すると、再生処理であるので初期化をしなければならない。この初期化は最初だけで良いのでＰＳＦが”１”であることを検出したときに最初のデータを読み込む必要がある。その処理を行なうためにステップＳ６０２でＰＳＦが”０”から”１”に変化した否かを判定する。すなわち、ＰＳＦが立ち上がったか否かを判定する。この判定においてＰＳＦが立ち上がった時であると判断すると、ステップＳ６０４でＡＤレジスタ１に対応する時間データを読み出す。そして、この時間データをステップＳ６０６でＴＤ１にストアする。次いで、Ｓ６０８でＡＤレジスタ２に対応する時間データを読み出した後、この時間データをステップＳ６１０でＴＤ２にストアする。ステップＳ６０４〜ステップＳ６１０は最初だけで行なわれ、その次からはこれらのステップが省略される。
【００４３】
上記ステップＳ６０２でＰＳＦが”０”から”１”に変化せず、”１”の状態であると判断すると、ステップＳ６１２に進む。また、上記ステップＳ６１０の処理が終了した後、このステップＳ６１２に進む。ステップＳ６１２ではＴＤ１（トラック１の時間データ）が”０”であるか否か、すなわち次のイベント時間まで来ているか否かの判定を行なう。この判定においてＴＤ１が”０”でないと判断すると、すなわち次のイベント時間まで来ていないと判断すると、ＴＤ２（トラック２の時間データ）が”０”であるか否かを判定し、ＴＤ２が”０”でないと判断すると、処理を抜ける。すなわち、ＴＤ１、ＴＤ２が共に”０”でなければ処理を抜ける。ここで、ＴＤ１、ＴＤ２は図１２に示すようにタイマインタラプトがかかっているので、ＰＳＦが”１”である場合にその値が減算されるようになっている。
【００４４】
ＴＤ１が減算されて“０”になって次のイベント時間まで来ていると判断すると、ステップＳ６１４でＡＤレジスタ１を１インクリメントする。そして、ステップＳ６１６でＡＤレジスタ１で示すエリアのデータを読み出し、ステップＳ６１８でそのデータの種類を判定する。最初にノートオンデータが読み出されるので、ステップＳ６２０でＮＮレジスタの内容と音色Ａ（トラック１に対して割り付けられた音色であって、図示せぬスイッチにより変えることができる）を音源２３に送り、音を発生させる。そして、ステップＳ６１４に戻り、ＡＤレジスタ１を１インクリメントする。
【００４５】
そして、ステップＳ６１６でＡＤレジスタ１で示すエリアのデータを読み出す。この場合、タッチデータが読み出されるのでステップＳ６２２に進み、ＴＤの内容を音源２３に送ってオン指示する。これによりベロシティと音高と音色が出る。次にステップＳ６１４に戻り、ＡＤレジスタ１を１インクリメントし、次のデータを読み出す。この場合、時間データが読み出されるので、この時間データと一つ前の時間データとの差をステップＳ６２４でＴＤ１にストアする。この後、ステップＳ６２６に進み、ＴＤ２の内容が“０”であるか否かの判定を行ない、“０”でないと判断すると処理を抜ける。これに対して、ＴＤ２の内容が“０”であると判断すると、ステップＳ６２８でＡＤレジスタ２を１インクリメントする。
【００４６】
ＡＤレジスタ２を１インクリメントした後、ステップＳ６３０でＡＤレジスタ２で示すエリアのデータの読み出しを行ない、ステップＳ６３２でそのデータの種類を判定する。最初にノートオンデータが読み出されるので、ステップＳ６３４でＮＮレジスタの内容と音色Ｂ（トラック２に対して割り付けられた音色であって、図示せぬスイッチにより変えることができる）を音源２３に送り、音を発生させる。そして、ステップＳ６２８に戻り、ＡＤレジスタ２を１インクリメントし、ステップＳ６３０でＡＤレジスタ２で示すエリアのデータを読み出し、ステップＳ６３２でその種類を判定する。この場合、タッチデータが読み出されるのでステップＳ６３６でＴＤの内容を音源２３に送ってオン指示する。これにより、ベロシティと音高と音色が出る。そして、ステップＳ６２８に戻り、ＡＤレジスタ２を１インクリメントし、次のデータを読み出す。この場合、時間データが読み出される。この時間データと一つ前の時間データとの差をステップＳ６３８でＴＤ２にストアし、処理を抜ける。
【００４７】
次いで、再度再生処理が始まる。このときはＰＳＦが“１”になっているので、ステップＳ６１２に進む。そして、ＴＤ１が“０”であるか否かの判定を行なう。この場合、“０”であるのでステップＳ６１４でＡＤ１を１インクリメントし、ステップＳ６１６でＡＤ１で示すエリアのデータを読み出す。この場合、オフデータが読み出されるので、ステップＳ６４０でＮＮレジスタの内容に対応する音を消音指示する。この処理後、ステップＳ６１４に戻り、ＡＤ１を１インクリメントし、ステップＳ６１６でＡＤ１で示すエリアのデータを読み出す。この場合、時間データが読み出される。この時間データと一つ前の時間データとの差をステップＳ６２４でＴＤ１にストアし、ステップＳ６２６に進む。
【００４８】
ステップＳ６２６でＴＤ２が“０”であるか否かの判定を行なう。この場合、“０”であるのでステップＳ６２８でＡＤ２を１インクリメントし、ステップＳ６３０でＡＤ２で示すエリアのデータを読み出す。この場合、オフデータが読み出されるので、ステップＳ６４２でＮＮレジスタの内容に対応する音を消音指示する。この処理後、ステップＳ６２８に戻り、ＡＤ２を１インクリメントし、次いでステップＳ６３０でＡＤ２で示すエリアのデータを読み出す。この場合、時間データが読み出される。この時間データと一つ前の時間データとの差をステップＳ６３８でＴＤ２にストアし、処理を抜ける。
【００４９】
上記処理を”ＥＮＤ”が来るまで行なう。ステップＳ６１８の判定において、ＡＤ１で示すエリアのデータが”ＥＮＤ”であると判断すると、ステップＳ６４４で消音指示を行なう。そして、ステップＳ６４６でＳＴ１Ｆを”１”にした後、ステップＳ６４８でＳＴ２Ｆが”１”であるか否かの判定を行なう。この判定においてＳＴ２Ｆが”１”であると判断すると、ステップＳ６５０でＳＴ２Ｆを”０”にし、次いでステップＳ６５２でＰＳＦを”０”にする。
ステップＳ６４８の判定において、ＳＴ２Ｆが”１”でないと判断すると、ステップＳ６２６に進む。ステップＳ６３２の判定において、ＡＤ２で示すエリアのデータが”ＥＮＤ”であると判断すると、ステップＳ６５４で消音指示を行な、次いでステップＳ６５６でＳＴ２Ｆを”１”にした後、ステップＳ６５８でＳＴ１Ｆが”１”であるか否かの判定を行なう。この判定においてＳＴ１Ｆが”１”でないと判断すると、処理を抜け、”１”であると判断すると、ステップＳ６６０でＳＴ１Ｆを”０”にし、次いでステップＳ６６２でＰＳＦを”０”にする。
【００５０】
なお、上記実施例では、トラック１のイベントデータの発生時刻と所定の時間差以内のトラック２のイベントデータを選択するようにしたが、トラック１の１つのイベントデータの発生時刻にトラック２の複数のイベントデータの発生時刻が近い場合は、その中で発生時刻の最も近いものを選択するようにして良い。
【００５１】
【発明の効果】
本発明によれば、複数のトラックの中から２つのトラックを選択し、これらのトラックに記憶されているイベントデータの時間情報や付随する情報（例えばベロシティデータ）を共通の目標値に接近するように修正するようにしたので、人間的なズレやノリといったものを失うことなく、ユニゾン演奏の再現が可能になる。
また、本発明によれば、２つのトラックのイベントデータ同士が所定の時間差以内のものや、最も近いもの同士についてのみ修正を行なうようにしたので、意図しない変更を避けることが可能になる。
【図面の簡単な説明】
【図１】本発明に係る自動演奏装置の一実施例の外観図である。
【図２】同実施例の自動演奏装置の操作パネルの平面図である。
【図３】同実施例の自動演奏装置の特徴を示す図である。
【図４】同実施例の自動演奏装置の特徴を示す図である。
【図５】同実施例の自動演奏装置の特徴を示す図である。
【図６】同実施例の自動演奏装置のブロック図である。
【図７】同実施例の自動演奏装置のトラック上のデータを示す図である。
【図８】同実施例の自動演奏装置のメイン処理を示すフローチャートである。
【図９】同実施例の自動演奏装置のスイッチ処理を示すフローチャートである。
【図１０】同実施例の自動演奏装置のパラメータ入力処理を示すフローチャートである。
【図１１】同実施例の自動演奏装置の鍵盤処理を示すフローチャートである。
【図１２】同実施例の自動演奏装置のタイマインタラプト処理を示すフローチャートである。
【図１３】同実施例の自動演奏装置の量子化処理の一部を示すフローチャートである。
【図１４】同実施例の自動演奏装置の量子化処理の一部を示すフローチャートである。
【図１５】同実施例の自動演奏装置の量子化処理の一部を示すフローチャートである。
【図１６】同実施例の自動演奏装置の再生処理の一部を示すフローチャートである。
【図１７】同実施例の自動演奏装置の再生処理の一部を示すフローチャートである。
【符号の説明】
２  鍵盤
７  トラック選択スイッチ
１８  ＣＰＵ（検索手段、選択手段および修正手段）
１９  ＲＯＭ
２０  ＲＡＭ
２１  タッチ検出回路
２２  楽曲データＲＡＭ
２３  音源
２４  発音回路
１００  トラック指定手段
【図１】
0003551458.tif 000002
【図２】
0003551458.tif 000003
【図３】
0003551458.tif 000004
【図４】
0003551458.tif 000005
【図５】
0003551458.tif 000006
【図６】
0003551458.tif 000007
【図７】
0003551458.tif 000008
【図８】
0003551458.tif 000009
【図９】
0003551458.tif 000010
【図１０】
0003551458.tif 000011
【図１１】
0003551458.tif 000012
【図１２】
0003551458.tif 000013
【図１３】
0003551458.tif 000014
【図１４】
0003551458.tif 000015
【図１５】
0003551458.tif 000016
【図１６】
0003551458.tif 000017
【図１７】
0003551458.tif 000018