以下、添付図面を参照して、本発明の実施の形態について説明する。図1は、本発明の実施の形態にかかる非接触制御装置のハードウェア構成を示すブロックダイヤグラムである。図1に示すように、本実施の形態にかかる非接触制御装置10は、パーソナルコンピュータなどにより実現でき、後述するシステム制御、再生制御、ピッチ抽出および表示を含む種々の処理を実行するCPU11と、処理過程で必要な変数、入力情報、出力データなどを一時的に記憶するRAM12と、CPU11にて実行される処理のプログラムや定数を記憶したROM13と、入力データや装置の機能開始/停止指示を行うための入力装置14と、処理結果、楽譜、スクロール表示およびインタフェースなどを表示する表示装置15と、CPU11が生成した発音情報を、外部音源に、音声情報として送出するMIDIインタフェース(I/F)16と、CPU11が生成した発音情報を音声として出力するオーディオI/F17と、ビデオカメラ19からの情報をディジタル化してディジタル画像データを得るビデオキャプチャI/F18とを備えている。上記プログラムはROM13に記憶されていることに限定されず、CD−ROMやDVD−ROMなど記憶媒体を読み出すことによりインストールされた後、ハードディスク装置に記憶され、或いは、外部からネットワークを介して非接触制御装置10にダウンロードされ、ハードディスク装置に記憶されていてもよい。
図2は、本実施の形態にかかるCPU11の機能を示すブロックダイヤグラムである。図2に示すように、CPU11は、ビデオキャプチャI/Fにて取得され、定期的に更新されるディジタル画像データを比較することで、後述する取り込み領域に変化があったことを検知する動作検知手段22、動作検知手段22により検知されたことを表示装置15の画面上に表示する検知表示手段23、取り込み領域に現れた変化に対する機器の動作を決定する動作解析手段24、ならびに、後述する楽曲データに基づいて、音のタイミングとその長さとから、現在時刻より発音すべきときや消音すべきときを判定し、判定結果に応じて、楽音の高さ情報および強さ情報をMIDI I/Fに送る再生制御手段25として機能する。再生制御手段は、楽曲データのほか、波形信号に対応するオーディオソースから所定の速度でデータを読み出し、オーディオI/F19に出力することもできる。
このように構成された非接触制御装置10における処理について以下に説明する。図3は、本実施の形態にかかる非接触制御装置10にて実行されるメインフローを示す。図3に示すように、たとえば電源が投入され、或いは、非接触制御装置10が起動されると、後述する各種変数が初期化され(ステップ301)、次いで、ビデオカメラ19により撮像され、ビデオキャプチャI/Fによりディジタル化されたデータおよび取り込み領域(以下、「検知領域」とも称する。)の画像が、表示装置15の画面上に表示される(ステップ302)。
次いで、CPU11は、ユーザからの入力を待ち(ステップ303)、ユーザ入力に基づく画像解析・動作検知を行う(ステップ304)。ユーザが終了指示をするまで、各コマンドが実行される(ステップ305、306)。本実施の形態において、ユーザによる入力は、ユーザがビデオカメラ19の前で動作し、ビデオカメラ19により撮像された画像が非接触制御装置10にディジタル画像データとして取り込まれることにより実現される。
図4は、本実施の形態にて利用される楽曲データおよび再生中の楽曲制御データエリアに収容される再生中データの構成を示す。楽曲データは、RAM12或いはROM13にあらかじめ収容されている。また、再生中データは、処理の過程において生成されRAM12に一時的に記憶される。
図4(a)に示すように、発音すべき楽音ごとに一群のデータを有する。これら一群のデータには、発音開始ティックITime、データタイプiType、ゲートタイムIGate、ノート番号Pitch、ベロシティVel、テンポ値iTempo、ノートポインタpNextとが含まれる。発音開始ティックは、発音を開始すべき時間を示す。また、データタイプが「0」であるときは、一群のデータがノートデータを表し、データタイプが「1」であるときは、一群のデータがテンポデータを表す。ゲートタイムはこの楽音を発音させるべき時間を表す。また、ノートポインタは次の楽音のノート番号Note[n]を示すポインタである。
図4(b)に示すように、楽音中データは、CPU11により楽音データから読み出され、一定の処理が施された上でRAM12に収容された、楽音ごとの一群のデータからなる。一群のデータには、発音開始ティックITime、消音時間IOffTime、ノート番号Pitchおよび楽曲データのポインタPNextが含まれる。消音時間は、(発音開始ティック+ゲートタイム)に相当する。
図5は、本実施の形態おいて利用されるオーディオデータおよび再生中のオーディオ制御データエリアに収容される再生中データの構成を示す。図5(a)に示すように、オーディオデータも、発音すべき波形のある時間における波形を示す一群のデータを含む。一群のデータには、発音開始時間ITime、ゲートタイムIGate、データ本体pDataおよびノートポインタpWavが含まれる。また、再生中データにおけるある時間における波形を示す一群のデータには、発音開始時間ITime、消音時間IOffTimeおよび楽曲データのポインタpWavが含まれる。
図6は、RAM12に設けられたキャプチャ画像バッファおよび検知領域データの内容を示す図である。キャプチャ画像バッファは、RAM12に設けられている。CPU11は、ビデオカメラ19によりキャプチャされ、かつ、ビデオキャプチャI/F18によりディジタル化された画像データされたに基づいて、以下に述べる形式のデータのデータを生成して、キャプチャ画像バッファに格納する。図6(a)に示すように、キャプチャ用画像バッファには、画素ごとに、当該画素を構成する一群のデータ、すなわち、画素のBlue値を示すColorB、画素のGreen値を示すColorGおよび画素のRed値を示すColorRを含む。ここで、本実施の形態において、キャプチャ画像は、図6(b)に示すように長方形であり、四隅の座標(0,0)、(sx,0)、(0,sy)、(sx,sy)により領域が特定される。
図6(c)は検知領域データを示す図である。検知領域データは、検知領域の座標データPosData、検知エリアのタイプType、コマンド内容Command、検知状態Stat、前回キャプチャ時の検知状態LastStat、および、前回キャプチャ時の画素の平均値LastColDataを含む。複数の検知領域があれば、上記一群のデータが検知領域の数だけ設けられる。
検知領域が長方形或いは矩形であれば、座標データは4組の座標から構成される。また、本実施の形態において、検知エリアのタイプは、当該検知エリアにて何らかが検知された場合に実行されるコマンドの種別を示す。たとえば、タイプ「0」は、通常コマンドを示し、タイプ「1」はテンポ状態エリアを示し、タイプ「2」は音量状態エリアを示し、また、タイプ「3」は進行状態エリアを示す。また、検知状態はフラグであり、「0」であれば検知していない(オフ)状態、「1」であれば検知している(オン)状態を示す。前回キャプチャ時の検知状態も同様である。つまり、本実施の形態においては、それぞれの検知領域に、テンポ状態、音量状態などを割り当てておき、その領域に一定の変化が現れたと判断された場合に、割り当てられた状態を変化させる処理が実行されるようになっている。
次に、図7および図8を参照して、本実施の形態にかかる画像解析・動作検知処理(図3のステップ304)をより詳細に説明する。まず、CPU11は、各種変数を初期化した(ステップ701)後、キャプチャ画像の画像データCapImg[][]を取得する。ここではすべての画素のデータが取得される。次いで、変数iが初期化された後、変数iと検知エリアの数であるNareaとが比較される(ステップ704)。「i<Narea」である場合(ステップ704でイエス(Yes))、画素データの輝度の合計値GraySumと検知エリアの画素数pxsとが初期化される(ステップ706)。次いで、検知エリアの画素検索が終了するまで、ステップ707〜ステップ709の処理が実行される。これらステップ707〜709においては、検知エリアごとに当該検知エリア中の画素の輝度が積算されている。ここで、GraySumが輝度の積算値(累算値)に相当する。ある検知エリアについて画素検索が終了すると(ステップ704でイエス(Yes))、テンポラリ値tmpColとして、輝度の積算値/検知エリアの画素数であるGraySum/pxsがセットされる(ステップ800)。この値は、検知エリアの輝度の平均値となる。次いで、CPU11は、当該テンポラリ値と、当該検知エリアの前回キャプチャ時の輝度の平均値LastColDataの差の絶対値を算出し、当該絶対値が、所定のオフセット値ColOffsetより大きいか否かを判断する(ステップ801)。CPU11は、ステップ801でイエス(Yes)と判断された場合には、当該検知エリアの検知状態Statに「1」をセットし(ステップ802)、その一方、ステップ801でノー(No)と判断された場合には、検知状態Statに「0」をセットする(ステップ803)。その後、検知されたエリアの色彩を変化させる描画処理が実行される(ステップ804)。次いで、CPU11は、テンポラリ値tmpColを当該検知エリアの前回キャプチャ時の輝度の平均値として格納し(ステップ805)、変数iをインクリメントして、次の検知領域の処理に進む。すべての検知エリアに関して処理が終了すると(ステップ704でノー(No))、後述するコマンド実行判定が行われる(ステップ807)。図9は、コマンド実行判定をより詳細に示すフローチャートである。
まず、変数が初期化され(ステップ901)、変数iが検知エリアの数Nareaと比較され(ステップ902)。ステップ902でイエス(Yes)と判断された場合には、CPU11は、その検知エリアのタイプTypeが「0」、つまり、「コマンド」であり、かつ、その検知状態Statが「1」であるかどうかを判断する(ステップ903)。ステップ903でイエス(Yes)と判断された場合、当該検知エリアのコマンドが「再生」であるか(ステップ904)、「一時停止」であるか(ステップ905)或いは「停止」であるか(ステップ906)が判断される。いずれのステップにおいてもノー(No)と判断された場合には、変数iがインクリメントされる。ステップ904でイエス(Yes)と判断され、かつ、再生中でなければ(ステップ908でノー(No))、再生ルーチンが起動される。また、ステップ905でイエス(Yes)と判断され、かつ、再生中であれば(ステップ910でイエス(Yes))、楽曲の再生が一時停止される(ステップ911)。また、ステップ906でイエス(Yes)と判断され、かつ、再生中であれば(ステップ912でイエス(Yes))、楽曲の再生が停止される(ステップ913)。
ステップ903でノー(No)と判断された場合にも、再生中であるかどうかが判断される(ステップ914)。再生中でない場合(ステップ914でノー(No))には、ステップ907に進む。これに対して、再生中であれば(ステップ914でイエス(Yes))、CPU11は、当該検知エリアのタイプを調べる(ステップ915)。たとえば、当該検知エリアのタイプが「1」または「2」であれば(ステップ915でイエス(Yes))、後述する状態変更判定処理が実行される(ステップ917)。すなわち、検知エリアが「テンポ状態」或いは「音量状態」であれば、テンポや音量の変更に関する処理が実行される。次いで、CPU11は、検知エリア中、「テンポ状態」或いは「音量状態」が割り当てられた最終位置のものに対応するように変数iを設定する(ステップ918)。また、当該検知エリアのタイプが「3」であれば(ステップ916でイエス(Yes))、当該検知エリアが「進行状態」であることがわかるため、再生速度コントロールが実行される(ステップ919)。その後、CPU11は、検知エリア中、「進行状態」が割り当てられた最終位置のものに対応するよう変数iを設定する(ステップ920)。
次に、ステップ909の再生ルーチンについて、図10を参照して詳細に説明する。まず、CPU11は、再生用の変数を初期化し(ステップ1001)、再生開始ノートをpNoteProgにセットするとともに、現在時刻をiBaseTimeにセットする(ステップ1002、1003)。ステップ1002では、最初の楽曲データを、再生用ノートポインタにセットしている。また、ステップ1003では再生開始時刻を保存している。
次いで、PNoteProgがヌル(NULL)で、かつ、再生中データ(図4(b)参照)のOnBuf[0]の楽音データのポインタpNoteがヌル(NULL)であれば処理を終了する。
それ以外の場合には(ステップ1004でノー(No))、CPU11は、経過時間をINowTimeにセットして、経過時刻でのティックをINowTimeに基づいて算出する(ステップ1006)。次いで、後述するノートオフ処理およびノートオン処理が実行される(ステップ1007、1008)。また、楽譜等を表示する必要があれば表示処理が実行される(ステップ1008)。その後、CPU11は、現在の処理時刻であるINowTimeを、前回の処理時刻ILastTimeとして記憶する(ステップ1010)。次いで、ポインタpNextを参照して、次の楽音についての処理に進む(ステップ1011)。
図11は、ノートオン処理(ステップ1005)をより詳細に示すフローチャートである。ノートオン処理においては、再生用ノートポインタPNoteProgがヌル(NULL)であれば(ステップ1101でイエス(Yes))処理が終了し、それ以外の場合には、PNoteProg中のデータタイプiTypeが「1」すなわち「テンポデータ」であるか否かが判断される(ステップ1102)。ステップ1102でイエス(Yes)と判断された場合には、現在のテンポを示すiTempoに、当該PNoteProgにかかるテンポデータiTempoを収容する(ステップ1103)。
ステップ1102でノー(No)と判断された場合には、現在の楽曲データについての再生時刻を越えているか否かが判断される(ステップ1104)。より具体的には、PNoteProgのITimeが、INowtickより大きいか否かが判断される。ステップ1104でイエス(Yes)と判断された場合には、CPU11は、MIDII/F16を介してノートオンを示す楽音データをMIDI信号として出力する(ステップ1106)。再生データであるOnBuf[i]がヌル(NULL)であれば(ステップ1107でノー(No))、変数iをインクリメントする。ステップ1107でノー(No)と判断された場合には、CPU11は、再生中データを作成する(ステップ1108)。より具体的には、ITimeとしてPNoteProgのITimeが与えられ、IOffTimeとして、PNoteProgのITimeと、IGateとの和が与えられる。また、PitchとしてPNoteProgのPitchが与えられる。また、次いで、処理対象となる楽音データpNoteProgが、pNextが示すものに設定される(ステップ1109)。
次に、図12は、ノートオフ処理(ステップ1004)をより詳細に示すフローチャートである。変数の初期化(ステップ1201)の後、再生中データOnBuf[i]がヌル(NULL)であれば処理を終了する(ステップ1202でノー(No))、それ以外の場合には、現在時刻が消音時間を超えていれば、つまり、IOffTime<INowTickであれば(ステップ1203でイエス(Yes))、CPU11は、MIDII/F16を介して、ノートオフを示す楽音データをMIDI信号として出力する(ステップ1204)。次いで、CPU11は、ノートオフにかかるOnBufのデータより時間的に後のデータを前に詰める処理を行う(ステップ1205)。その一方、ステップ1203でノー(No)と判断された場合には、変数iをインクリメントして(ステップ1206)、次のOnBuf[i]のデータについて処理を繰り返す。
たとえば、楽音データに基づく楽音再生の代わりに、オーディオデータを再生する場合にも類似する処理が実行される。図13および図14は、オーディオデータに関する図9のステップ909の再生ルーチンを示すフローチャートである。図13に示すように、CPU11は、変数を初期化した後(ステップ1301)、再生開始時間を保存するためにIBaseTimeに現在時刻をセットする(ステップ1302)。次いで、経過時間がINowTimeにセットされる(ステップ1303)。その後、消音処理(ステップ1304)が実行される。消音処理では変数iの初期化(ステップ1306)の後、再生中データOnWavが存在していなければ(ステップ1306でノー(No))、当該消音処理を終了させ、発音処理(図14)に進む。再生中データが存在しており、かつ、消音時間が経過していれば(ステップ1307でイエス(Yes))ば、CPU11は、発音中の楽音を消音するとともに、再生中データOnWavをバッファ中前に詰める処理を行う(ステップ1308、1309)。
図14に示すように、pWaveProgがヌル(NULL)であり、かつ、再生中データOnWav[0]もヌルであれば(ステップ1401でイエス(Yes))、データが存在しないため処理を終了する。その一方、ステップ1401でノー(No)であれば、発音時間になっていれば(ステップ1403でイエス(Yes))、発音処理をする(ステップ1404)。その後の処理(ステップ1405〜ステップ1409は、図11のステップ1106〜ステップ1110とほぼ同様である。
発音処理1402の後、たとえば、再生中の波形を表示する必要があれば、表示処理が実行される(ステップ1410)。次いで、現在時刻INowTimeが前回処理時刻ILastTimeとしてセットされる(ステップ1411)。
次に、ユーザの動きをキャプチャした画像データに基づいて、状態の表示を更新する表示更新処理について、図15および図16を参照して説明する。なお、この処理は、メインフロー1回ごとに実行されてもよいし、或いは、割り込み(たとえばタイマ割り込み)により実行されてもよい。この処理は、ユーザの動きに基づいて、画像中のどの検知エリアをさしているかを判断し、これに基づいて、再生中の楽曲のテンポや楽曲など状態の表示を更新するものである。
図15に示すように、楽曲が再生中であれば(ステップ1501でイエス(Yes))、CPU11は、一つの検知エリア(グリッド)あたりのテンポ値をvpiにセットする(ステップ1502)。ここに、ステップ1502において、MaxTempoはテンポ最大値(たとえば「128」)、iTempoCntは、テンポの設定に利用される検知エリア(グリッド)の個数である。次いで、CPU11は、現在のテンポ設定値におけるグリッドの位置、つまり、現在のテンポ設定値が何番目のグリッドであるかを判断し(ステップ1503)、グリッド検索用の変数iを初期化する(ステップ1504)。ステップ1503において、NowTempoは、現在のテンポ値を表す。
次いで、CPU11は、検索用変数iがテンポの設定に利用される検知エリアの個数iTempoCntに達するまで、当該変数iが現在のテンポ設定値のグリッドと等しければ(ステップ1506でイエス(Yes))、テンポの設定に利用される検知エリアの開始位置を示す開始インデックスiTempoStと変数iとの和に相当する位置のCapArea[i+iTempoSt]の検知状態Statに「1」を設定する(ステップ1507)。それ以外のグリッドについては、CPU11は、CapArea[i+iTempoSt]の検知状態Statに「0」を設定する(ステップ1508)。ここでは、現在設定されたテンポ値に相当するグリッドについて、検知状態「1」が設定され、他のグリッドについては検知状態「0」が設定される。
次いで、ボリュームについても同様の処理が実行される。より詳細には、図16に示すように、CPU11は、一つの検知エリア(グリッド)あたりの音量値をvpiにセットする(ステップ1601)。ここに、ステップ1601において、MaxVolは音量最大値(たとえば「128」)、iVolCntは、テンポの設定に利用される検知領域(グリッド)の個数である。次いで、CPU11は、現在の音量設定値におけるグリッドの位置を判断し(ステップ1602)、グリッド検索用の変数を初期化する(ステップ1603)。ステップ1602において、NowVolumeは、現在の音量値を表す。
CPU11は、検索用変数iが、音量の設定に利用される検知エリアの個数iVolCntに達するまで、検索用変数iがテンポの設定に利用される検知エリアの個数iTempoCntに達するまで、当該変数iが現在のテンポ設定値のグリッドと等しければ(ステップ1605でイエス(Yes))、音量の設定に利用される検知エリアの開始位置を示す開始インデックスiVolStと変数iとの和に相当する位置のCapArea[i+iVolSt]の検知状態Statに「1」を設定する(ステップ1606)。それ以外のグリッドについては、CPU11は、CapArea[i+iVolSt]の検知状態Statに「0」を設定する(ステップ1607)。ここでは、現在設定された音量値に相当するグリッドについて、検知状態「1」が設定され、他のグリッドについては検知状態「0」が設定される。
次に、図9のステップ917の状態変更処理について、より詳細に説明する。図17および図18は、状態変更処理を詳細に示すフローチャートである。楽曲が再生中であれば(ステップ1701でイエス(Yes))、CPU11は、一つの検知エリア(グリッド)あたりのテンポ値vpiにセットする(ステップ1702)。また、iPosに現在のテンポの設定値におけるグリッドの位置がセットされる(ステップ1703)。次いで、現在のテンポの設定値におけるグリッドに対応する検知エリアCapArea[iPos+iTempoSt]の検知状態Statが「1」であれば(ステップ1704でイエス(Yes))、CPU11は、テンポ値を変更せず(ステップ1713)、その後、テンポの設定に利用される他の検知エリアの検知状態を「0」にセットする(ステップ1714)。その一方、上記検知エリアCapArea[iPos+iTempoSt]の検知状態Statが「0」であれば、CPU11は、現在の設定値に最も近い値をセットする(ステップ1705)。
ステップ1705においては、「0≦iPos+i≦iTempoCnt」かつCapArea[iPos+iTempoSt+i]の検知状態Statが「1」であれば、iPosの値が「iPos+i」に更新される(ステップ1708、1709)。その一方、「0≦iPos-i≦iTempoCnt」かつCapArea[iPos+iTempoSt-i]の検知状態Statが「1」であれば、iPosの値が「iPos-i」にされる(ステップ1710、1711)。
なお、ステップ1714においては、テンポ設定に利用される先頭(iTempoSt)の検知エリアから、テンポ設定に利用される検知エリアの数だけ、ステップ1705で検知状態が「1」となった検知エリアCapArea[iPos+iTempoSt]を除き、その検知状態Statが「0」になる(ステップ1715〜1719)。
続いて、音量値についても同様の処理が実行される。CPU11は、一つの検知エリア(グリッド)あたりの音量値vpiにセットする(ステップ1801)。次いで、iPosに現在の音量の設定値におけるグリッドの位置がセットされる(ステップ1802)。次いで、現在の音量の設定値におけるグリッドに対応する検知エリアCapArea[iPos+iVolSt]の検知状態Statが「1」であれば(ステップ1803でイエス(Yes))、CPU11は、テンポ値を変更せず(ステップ1712)、その後、音量の設定に利用される他の検知エリアの検知状態を「0」にセットする(ステップ1812、1813)。その一方、上記検知エリアCapArea[iPos+iVolSt]の検知状態Statが「0」であれば、CPU11は、現在の設定値に最も近い値をセットする(ステップ1804)。
ステップ1804においては、「0≦iPos+i≦iVolCnt」かつCapArea[iPos+iVolSt+i]の検知状態Statが「1」であれば、iPosの値が「iPos+i」に更新される(ステップ1807、1808)。その一方、「0≦iPos-i≦iVolCnt」かつCapArea[iPos+iVolSt-i]の検知状態Statが「1」であれば、iPosの値が「iPos-i」にされる(ステップ1809、1810)。
なお、ステップ1813においては、音量設定に利用される先頭(iVolSt)の検知エリアから、音量設定に利用される検知エリアの数だけ、ステップ1705で検知状態が「1」となった検知エリアCapArea[iPos+iTempoSt]を除き、その検知状態Statが「0」になる(ステップ1814〜1818)。
図7および図8の処理、特にステップ1705およびステップ1804の処理により、再生される楽曲のテンポや音量が急激に変化することを防止できる。本実施の形態においては、現在の設定値にもっとも近い値をセットするように設定されているが、これに限定されるものではなく、変化した範囲において所定の値(たとえば、変化の中央値)に値がセットされるように構成されてもよい。
このような処理を実行することにより、本実施の形態においては、ユーザの以下の動作により、以下のような制御が実現可能となる。たとえば、図3の描画処理(ステップ302)により、図19に示すように、それぞれの機能が割り当てられた検知エリアを含む画像が、表示装置15の画面上に表示される。本実施の形態では、最上段に、左から「再生」、「一時停止」および「停止」ボタンとして機能する検知エリア、中段にテンポ設定のための検知エリア、最下段に音量設定のための検知エリアが設けられる。
ユーザが、表示装置15の画面上に表示された画像を参照して、所望の検知エリアを指などで指し示すと、ユーザが検知エリアを指し示している画像が、ビデオカメラ19により撮像される。無論、ユーザは検知エリアを指差せばよく、画面上に指を接触する必要はない。
ユーザが指し示した検知エリアは、画像解析・動作検知処理(図3のステップ304)で検知される。画像解析・動作検知処理(ステップ304および図7、8)では、画素の変化を捉えて、どの検知エリアが指し示されているかを判断し、それに応じてコマンド実行判定が実行される(図8のステップ807および図9)。ここで、機能に応じたコマンドが実行され、楽曲が再生され、或いは、再生中の一時停止や停止が可能となる。また、楽曲が再生中であれば、そのテンポや音量を変化させることも可能となる。
さらに、本実施の形態においては、図19に示す画像表示に加えて、或いは、選択により図19に示す画像の代わりに、画面上に放射型の検知エリアが表示され、これにより、楽曲再生の経過時間が表示でき、かつ、当該放射型のエリアをユーザが指し示すことにより、楽音再生速度を所望のように変更することができる。これにより、たとえば、再生中の楽音にスクラッチのような効果を付加することが可能である。本実施の形態では、放射状に配置された検知エリアの現在時刻表示を1秒間で一回転させている。時間はミリ秒(msec)で取得されるため、1000ミリ秒の剰余でグリッドが決定される。
図20は、本実施の形態にかかる経過時間の回転表示処理を示すフローチャートである。この処理は、たとえば、メインフロー(図3)において、各コマンドの実行処理(ステップ306)に引き続いて実行されれば良い。
CPU11は、再生中であれば(ステップ2001でイエス(Yes))、経過時間INowTimeを取得し(ステップ2002)、検知エリア(グリッド)の位置を算出する(ステップ2003)。ここでは、iPosに、経過時間INowTimeの1000の剰余(INowTime
mod 1000)を、「1000/iCircCnt(放射状の経過時間表示エリア、すなわち、検知エリアの個数)」で割ったものを設定する。
グリッド検索用の変数iが初期化された後(ステップ2004)、変数iが、検知エリアの数(検知エリアの開始インデックスiCircleSt+iCircCnt)に達するまで、以下の処理が実行される(ステップ2005およびステップ2009参照)。CPU11は、変数iがiPosと等しければ(ステップ2006でイエス(Yes))、CapArea[i]の検知状態Statを「1」にセットし(ステップ2007)、その一方、等しくなければ(ステップ2006でノー(No))、CapArea[i]の検知状態Statを「0」にセットする(ステップ2008)。
このような処理の後、CapArea[i]の検知状態にしたがって表示が更新される(ステップ2010)。図21は、表示装置15の画面上に表示された画像例を示す図である。図21に示すように、放射状に複数の検知エリアを兼用するグリッド群(符号2100参照)が設けられ、当該表示領域上、再生経過時間に相当するグリッドが他の色彩などで表示されている(符号2101参照)。ユーザが指にてこれらグリッドを指し示して、指を動かした場合に実行される再生速度コントロール処理(図9のステップ919)について、図22および図23を参照して説明する。おこでは、検知エリア(グリッド)での動作が検知された瞬間から、全てのグリッドで動作が検知されなくなる瞬間まで再生速度をコントロールする。実際の速度コントロールは、再生開始からの経過時間をグリッド上の検知位置に変更することで実現する。
CPU11は、再生中であれば(ステップ2201でイエス(Yes))、経過時間INowTimeを取得する(ステップ2202)。次いで、表示されている検知エリア(グリッド)の位置が算出される(ステップ2203)。ここでは、iPosに、経過時間INowTimeの1000の剰余(INowTime
mod 1000)を、「1000/iCircCnt(放射状の経過時間表示エリア、すなわち、検知エリアの個数)」で割ったものを設定する。
再生速度制御のためのフラグbCrtFlugが無効(FALSE)、つまり、速度コントロールが無効状態であれば(ステップ2204でノー(No))、ステップ2205に進み、有効状態であれば(ステップ2204でイエス(Yes))、ステップ2207に進む。
ステップ2205において、CPU11は、表示されている検知エリア(グリッド)について、CapArea[iPos]の検知状態Statが「1」であれば(ステップ2205でイエス(Yes))、再生制御フラグbCrtFlugを有効状態(TRUE)にセットし(ステップ2206)、ステップ2204に戻る。
ステップ2207では、CPU11は、検知判断用変数bHitを「FALSE」に初期化し(ステップ2207)、次いで、検知エリア(グリッド)のうち、現在表示されているものから最も近い検知エリアを検索する(ステップ2208)。まず、CPU11は、新たな時間TimeNewに経過時間INowTimeをセットするとともに、変数iを初期化する(ステップ2210)。次いで、変数iが検知エリア(グリッド)の個数の半分(iCirCnt/2)に達するまで以下の処理を実行する。
まず、CPU11は、新たに変数jとして、(iPos+i+iCircCnt)のiCircCntの剰余をセットし(ステップ2211)、CapArea[j]の検知状態Statが「1」であるかどうかを判断する(ステップ2212)。ステップ2212でイエス(Yes)と判断された場合には、CPU11は、検知判断用変数bHItを有効(TRUE)にセットし(ステップ2213)、かつ、新たな時間ITimeNewとして、(INowTime+i*(1000/CircCnt))をセットする(ステップ2214)。つまり、この場合には、時間を進ませる側で最も近い検知エリア(グリッド)が表示すべき領域となり、かつ、再生時間もそれに応じて進まされる。
その一方、ステップ2212でノー(No)と判断された場合には、新たな変数jとして、(iPos-i+iCircCnt)のiCircCntの剰余をセットし(ステップ2215)、CapArea[j]の検知状態Statが「1」であるかどうかを判断する(ステップ2216)。ステップ2216でイエス(Yes)と判断された場合には、CPU11は、検知判断用変数bHItを有効(TRUE)にセットし(ステップ2217)、かつ、新たな時間ITimeNewとして、(INowTime-i(1000/CircCnt))をセットする(ステップ2218)。つまり、この場合には、時間を遅らせる側で最も近い検知エリア(グリッド)が表示すべき領域となり、かつ、再生時間もそれに応じて遅らせられる。
このような処理の後、図23に示すように、ステップ2209〜ステップ2219の処理の結果、検知判断用変数bHitが無効(FALSE)でなければ、つまり、ユーザが指し示す検知エリアが変化しており(ステップ2301でイエス(Yes))、かつ、新たな時間TimeNewが経過時間INowTimeと異なる場合には(ステップ2302でノー(No))、CPU11は再生中尾データポインタを検知エリアに対応する時間にセットし(ステップ2303)、再生中データを更新する(ステップ2304)。ステップ2304においては、たとえば、発音中のデータの消音時間を変更する。つまり、OnBuf[i]のIOffTimeを、IOffTime-INowtime+ITimeNewに変更する。その後、CPU11は、経過時間INowTimeとして、新たな時間ITimeNewをセットする(ステップ2305)。その一方、ステップ2301にてノー(No)と判断された場合には、CPU11は、再生制御フラグbCrtlFlugを無効状態(FALSE)にセットする(ステップ2306)。
このような処理を実行する非接触制御装置において、ユーザが指などで放射状のグリッドを指し示して、その指の位置を変化させると、その画像が、ビデオカメラ19により撮像される。その指の位置の変化に応じて、放射状のグリッドの現在位置が、再生中の楽曲を進める側や遅らせる側に変化し、それに応じて、楽曲の進行も進められ或いは遅らされる。指を時計回りおよび反時計回りに交互に動かせば、スクラッチと同様の効果を得ることができる。
このように、本実施の形態によれば、再生時刻を任意の時刻に直感的な動作で変化させることが可能となる。
本発明は、以上の実施の形態に限定されることなく、特許請求の範囲に記載された発明の範囲内で、種々の変更が可能であり、それらも本発明の範囲内に包含されるものであることは言うまでもない。