説明

電子楽器

【目的】 スローアタックの音色や異なったリリースを持つ音色を正確に発生し、発音割当処理を正確に行う。
【構成】 鍵盤4と、複数の発音チャンネル毎に、複数のの楽音信号を出力する楽音合成回路11の複数の発音チャンネルが全て発音中であるか否かを検出し、複数の発音チャンネルが全て発音中であることが検出された場合に、離鍵中の発音チャンネルがあるかを検出し、離鍵中の発音チャンネルがある場合には、離鍵中の発音チャンネルの中で最もエンベロープレベルが小さい楽音信号の発音チャンネルをトランケートし、離鍵中の発音チャンネルがない場合には、離鍵中の発音チャンネルがある場合とは異なる処理で検出された発音チャンネルをトランケートし、そのトランケート結果および鍵盤4から出力される新たな鍵操作情報に基づいて、新たな楽音の発生を楽音合成回路11のトランケートされた発音チャンネルに割当てる。

【発明の詳細な説明】
【0001】
【産業上の利用分野】この発明は、発生される音量等が時間経過に従い変化する楽音を発生するとともに、発音割当処理が良好に行える電子楽器に関する。
【0002】
【従来の技術】従来の複数の楽音発生用チャンネル(発音チャンネル)を有する電子楽器には、メモリに記憶された波形データを演奏者による鍵盤等の操作に応じて読み出す音源と、その波形データの振幅を制御して波形データの音量を制御するエンベロープ信号を発生するエンベロープジェネレータ(EG)とが設けられているものがある。そして、この種の電子楽器には、EGからの出力等の様々な情報に基づいて、いずれかの発音チャンネルを強制的に空きチャンネルとし、その発音チャンネルに新たな押鍵音を割当るように制御するトランケート手段が設けられているものがあった。
【0003】
【発明が解決しようとする課題】ところで、楽音の中には、異なった早さのリリースを持つもの、あるいは、ストリングスやパイプオルガンなどのスローアタックの音色のものやキーオンディレイといってアタックを意識的に遅らせたものがある。しかしながら、上述した従来の電子楽器においては、EGから出力されている現在のエンベロープ信号のレベルだけに基づいてトランケート処理しているため、たとえば、以下に示すような不都合が生じていた。
【0004】図12に示すように、スローアタックの音色が割当られているチャンネルCの時刻t1におけるエンベロープ信号の現在のレベルLcは、楽音の立ち上がり部分であるにもかかわらず、チャンネルAおよびBの時刻t1におけるエンベロープ信号の現在のレベルLaおよびLbより小さいので、チャンネルCがトランケート処理されてしまう。したがって、まだ発音されていない楽音が消音され、不自然である。
【0005】そこで、最も古く押鍵されたチャンネルを検出してトランケート処理している従来の電子楽器もあるが、その場合には、図12に示すように、チャンネルAの時刻t1におけるエンベロープ信号の現在のレベルLaがチャンネルBの時刻t1におけるエンベロープ信号の現在のレベルLbより小さいにもかかわらず、リリースの遅いチャンネルBがトランケート処理されてしまう。したがって、実際に演奏者等が聴いている音においては、減衰が進んでいる音よりも、まだ聴こえている音のほうが先に消音されることになり、不自然である。この発明は、このような背景の下になされたもので、スローアタックの音色や異なったリリースを持つ音色を正確に発生でき、発音割当処理を正確に行うことができる電子楽器を提供することを目的とする。
【0006】
【課題を解決するための手段】この発明による電子楽器は、鍵操作情報を発生する鍵操作情報発生手段と、複数の楽音信号発生用の発音チャンネルを有し、各発音チャンネル毎に、複数の楽音信号をそれぞれ出力する楽音発生手段と、前記複数の発音チャンネルが全て発音中であるか否かを検出する第1の発音チャンネル検出手段と、該第1の発音チャンネル検出手段によって前記複数の発音チャンネルが全て発音中であることが検出された場合に、前記複数の発音チャンネルの中に離鍵中の発音チャンネルがあるか否かを検出する第2の発音チャンネル検出手段と、該第2の発音チャンネル検出手段によって複数の発音チャンネルの中に離鍵中の発音チャンネルがあることが検出された場合には、前記離鍵中の発音チャンネルの中で最もエンベロープレベルが小さい楽音信号の発音チャンネルを検出する第1のトランケートチャンネル検出処理を行って当該検出された発音チャンネルをトランケートし、前記第2の発音チャンネル検出手段によって複数の発音チャンネルの中に離鍵中の発音チャンネルがないことが検出された場合には、前記第1のトランケートチャンネル検出処理とは異なる第2のトランケートチャンネル検出処理を行って検出された発音チャンネルをトランケートするトランケート手段と、該トランケート手段のトランケート結果および前記鍵操作情報発生手段から出力される新たな鍵操作情報に基づいて、新たな楽音の発生を前記楽音発生手段のトランケートされた発音チャンネルに割当てる割当手段とを具備することを特徴としている。
【0007】
【作用】上記構成によれば、鍵操作情報発生手段が新たな鍵操作情報を発生すると、第1の発音チャンネル検出手段が複数の発音チャンネルが全て発音中であるか否かを検出する。そして、第2の発音チャンネル検出手段は、第1の発音チャンネル検出手段によって複数の発音チャンネルが全て発音中であることが検出された場合には、複数の発音チャンネルの中に離鍵中の発音チャンネルがあるか否かを検出する。
【0008】これにより、トランケート手段は、複数の発音チャンネルの中に離鍵中の発音チャンネルがあることが検出された場合には、離鍵中の発音チャンネルの中で最もエンベロープレベルが小さい楽音信号の発音チャンネルをトランケートし、複数の発音チャンネルの中に離鍵中の発音チャンネルがないことが検出された場合には、離鍵中の発音チャンネルがある場合とは異なる処理で検出された発音チャンネルをトランケートする。したがって、割当手段は、トランケート手段のトランケート結果および新たな鍵操作情報に基づいて、新たな楽音の発生を楽音発生手段のトランケートされた発音チャンネルに割当てるので、楽音発生手段は、割当てられた発音チャンネルから楽音信号を出力する。
【0009】
【実施例】以下、図面を参照して、この発明の一実施例について説明する。図1はこの発明の一実施例による電子楽器の構成を示すブロック図であり、この図において、1は装置各部を制御するCPU(中央処理装置)、2はCPU1にロードされる各種制御プログラムやこれらプログラムで用いられる各種データなどが記憶されたROM、3はワーキングバッファやMIDIデータが格納されるMIDIバッファなどが設けられたRAMである。
【0010】また、4は複数のキーからなる鍵盤であり、各鍵毎の押離鍵を検出するとともに、押鍵の速度および離鍵の速度を検出する機構を有し、押離鍵および押離鍵の速度に対応した信号を発生する。5は鍵盤インターフェイスであり、鍵盤4から供給される各種信号に基づき、音高や押鍵速度等に関する鍵情報を発生し、これらをCPU1が管理するデータが転送されるアドレス/データ・バス6を介してCPU1に転送する。
【0011】さらに、7は操作パネルであり、液晶ディスプレイ等の表示器と、テンキーと、表示器の表示画面の変更等を行うエンターキーと、表示器上のカーソルを移動させるカーソルキーなどとから構成されている。そして、操作パネル7は、アドレス/データ・バス6および操作パネルインターフェイス8を介してCPU1から供給されるデータを表示するとともに、各キーの状態に応じたデータを操作パネルインターフェイス8およびアドレス/データ・バス6を介してCPU1に転送する。
【0012】加えて、9はMIDIインターフェイスであり、CPU1がこのMIDIインターフェイス9およびMIDI規格に応じたデータが転送されるMIDI・バス10を介して他の電子楽器等とMIDIデータ等の交換を行う。また、11は楽音合成回路であり、CPU1よりMIDI・バス10を介して供給される各種MIDIデータに基づいて楽音合成を行う複数の発音チャンネルを有し、この発音チャンネルで形成される複数の楽音信号を出力するとともに、各発音チャンネルの楽音信号のエンベロープレベルを随時アドレス/データ・バス6を介してCPU1に供給する。12はサウンドシステムであり、楽音合成回路11から出力される複数の楽音信号に対してフィルタリングを施し、不要ノイズの除去、あるいは効果音処理などを施した後、増幅してスピーカ13に与え、楽音として発音させる。
【0013】なお、通常のMIDI規格のチャンネル数が0チャンネルから15チャンネルまでの計16個であるのに対して、この実施例におけるMIDI・バス10は、0チャンネルから39チャンネルまでの計40チャンネルの幅を有する拡張されたMIDI・バスである。したがって、これ以後、これらのチャンネル番号を区別するために、通常のMIDI規格に則ったMIDIチャンネルを外部MIDIチャンネルといい、この実施例におけるMIDIチャンネルを、単に、MIDIチャンネルということにする。
【0014】この実施例において、MIDIチャンネル数を電子楽器内部で40に拡張したのは、以下に示す理由による。すなわち、従来のMIDI規格のように、チャンネル数が16程度と少ないと、鍵盤4による演奏と、自動演奏、あるいは、自動リズム演奏などとを同時に行った場合、チャンネル番号が重なってしまうことがあり、その場合、鍵盤4を弾くことによりノートオンされた発音チャンネルの楽音が外部MIDIチャンネルを介して入力されたノートオフによって消音されてしまうことがあったからであり、上述したように、電子楽器内部でMIDIチャンネルを拡張することにより、以上説明した不都合はなくなる。
【0015】なお、図1においては、サウンドシステム12にもMIDI・バス10が接続されているが、これは、このサウンドシステム12においては、各MIDIチャンネルに対応した発音チャンネル毎に楽音のボリュームを制御することができるからであり、MIDI・バス10を介してサウンドシステム12の各発音チャンネルへメッセージを転送することにより、たとえば、ある発音チャンネルはこの程度のボリュームでというように、各発音チャンネル毎にボリュームを制御することができ、全体の発音チャンネルのボリュームを制御することができる。
【0016】このような構成において、CPU1の動作について図3〜図11のフローチャートに基づいて説明する。図1の電子楽器に電源が投入されると、CPU1は、まず、図3のメインルーチンのステップSA1の処理へ進み、装置各部のイニシャライズを行う。このイニシャライズは、各種レジスタのゼロリセットおよび周辺回路の初期設定となる各種変数の初期設定等である。そして、CPU1は、ステップSA2へ進む。
【0017】ステップSA2では、MIDI処理を行う。この実施例においては、電子楽器の各部をそれぞれモジュールとしてとらえ、これらの間でのデータ通信は、MIDIデータによって行い、各モジュールから出力されるMIDIデータは、一旦、RAM3のMIDIバッファに格納される。そして、CPU1は、このMIDI処理において、RAM3のMIDIバッファに格納されたMIDIデータを順次読み出してデータの種類に応じた所定の処理を行うとともに、読み出したMIDIデータをMIDI・バス10を介して楽音合成回路11に転送する。これにより、楽音合成回路11は、MIDIデータに応じて楽音信号を出力する。なお、このMIDI処理の詳細については、後述する。そして、このMIDI処理が終了すると、CPU1は、ステップSA3へ進む。
【0018】ステップSA3では、外部MIDI処理を行う。この処理は、MIDIインターフェイス9およびMIDI・バス10を介して外部から入力されたMIDIデータを40チャンネル分に拡張されたMIDIデータに変換してMIDI・バス10を介してRAM3のMIDIバッファに格納するものである。この実施例においては、チャンネル番号0〜15の計16個の外部MIDIチャンネルは、図2に示すように、そのチャンネル番号に9を加えたMIDIチャンネルのチャンネル番号9〜24に割り当てられている。したがって、たとえば、チャンネル番号0の外部MIDIチャンネルのノートオンは、チャンネル番号9のMIDIチャンネルのノートオンとしてRAM3のMIDIバッファに格納される。そして、この外部MIDI処理が終了すると、CPU1は、ステップSA4へ進む。
【0019】ステップSA4では、鍵盤4のいずれかのキーが押鍵された際に働く鍵処理を行う。鍵盤4から出力された鍵情報は、まず、鍵盤インターフェイス5およびアドレス/データ・バス6を介してCPU1に転送されるので、CPU1は、この鍵処理において、鍵をスキャンして転送された鍵情報からMIDIイベントを生成する。この実施例においては、鍵盤4の複数のキーを上鍵域と下鍵域とにスプリットしているので、CPU1は、図2に示すように、上鍵域のMIDIイベントをMIDIチャンネル0のオーケストラ1のノートオンやノートオフなどの情報とし、下鍵域のMIDIイベントをMIDIチャンネル1のオーケストラ2の情報としてRAM3のMIDIバッファに順次格納する。なお、この鍵処理の詳細については、後述する。そして、この鍵処理が終了すると、CPU1は、ステップSA5へ進む。
【0020】ステップSA5では、自動演奏処理や自動リズム演奏処理などの自動処理を行う。自動演奏処理は、演奏者によって操作パネル7を用いて設定された曲風(スタイル:ワルツ、ロック、タンゴなど)およびテンポと、鍵盤4を用いて指定された和音情報(コードのルートROOTとタイプTYPE)とに基づいて自動演奏イベントを生成する。そして、この自動演奏のイベントは、対応するMIDIチャンネルのイベントとしてRAM3のMIDIデータバッファに順次格納する。
【0021】また、自動リズム演奏処理は、上述した曲風とテンポとに基づいてリズムパターンの生成を行う。そして、このリズムパターンも、対応するMIDIチャンネルのイベントとしてRAM3のMIDIデータバッファに順次格納する。なお、この自動処理の詳細については、後述する。そして、この自動処理が終了すると、CPU1は、ステップSA6へ進む。
【0022】ステップSA6では、楽音合成回路11の各発音チャンネルの中でエンベロープレベルがある一定以下になった発音チャンネルを空きチャンネルとして検出する発音チャンネル処理を、チャンネル番号0〜31までの通常音のMIDIチャンネルに対応した発音チャンネルと、チャンネル番号32〜39までのリズム音のMIDIチャンネルに対応した発音チャンネルとについて別々に行う。なお、この発音チャンネル処理の詳細については、後述する。そして、この発音チャンネル処理が終了すると、CPU1は、ステップSA7へ進む。
【0023】ステップSA7では、演奏者による操作パネル7の操作に応じて曲風やテンポの設定、あるいは、MIDIチャンネル毎の音色の設定などを行う。なお、後述する各処理のフローチャートにおいて、代入文がなくて定数的に使用している変数は、このパネル処理においてすべて演奏者が設定するものとする。そして、このパネル処理が終了すると、CPU1は、ステップSA8へ進む。
【0024】ステップSA8では、この電子楽器が備えているシーケンサについてのMIDIチャンネル番号2〜8のシーケンサトラック1〜7(図2参照)に関する処理等、上述した各処理において特に説明しなかったその他の処理が実行され、こうした処理完了後に、上述したステップSA2に戻り、電源が切断されるまでステップSA2〜SA8の一連の処理が繰り返し実行される。このように、メインルーチンにおいては、CPU1が各種イベントに応じた楽音合成を指示するように動作し、この楽音合成は後述する各種処理によって実現される。
【0025】次に、CPU1のMIDI処理について図4R>4のフローチャートに基づいて説明する。CPU1の処理が図3のステップSA2へ進むと、図4に示すMIDI処理ルーチンが起動される。CPU1は、まず、ステップSB1の処理へ進み、RAM3のMIDIバッファを走査した後、ステップSB2へ進む。
【0026】ステップSB2では、MIDIイベントの有無を判断する。この判断結果が「NO」の場合、すなわち、MIDIイベントが検出されない場合には、何もせず、図3のメインルーチンへ戻り、ステップSA3へ進む。いっぽう、ステップSB2の判断結果が「YES」の場合、すなわち、MIDIイベントが検出された場合には、ステップSB3へ進む。
【0027】ステップSB3では、RAM3のMIDIバッファからMIDIチャンネル番号およびMIDIイベントを読み出し、それぞれレジスタMCHおよびEVに格納した後、ステップSB4へ進む。ステップSB4では、レジスタEVの内容がノートイベントに対応するものであるか否かを判断する。この実施例においては、ノートイベントもリズムのノートイベントも形式としては、MIDI規格のノートオンの形式である。しかし、通常楽音とリズム楽音とを別の発音チャンネルで生成するようにしており、リズム楽音には、図2に示すように、MIDIチャンネル番号32〜39が別途割当てられているので、ノートイベントとリズムのノートイベントとの判別は、MIDIチャンネル番号によって行う。ステップSB4の判断結果が「YES」の場合、すなわち、レジスタEVの内容がノートイベントに対応するものである場合には、ステップSB5へ進む。
【0028】ステップSB5では、ノートイベント処理を行う。なお、このノートイベント処理の詳細については、後述する。そして、このノートイベント処理が終了すると、CPU1は、図3のメインルーチンへ戻り、ステップSA3へ進む。いっぽう、ステップSB4の判断結果が「NO」の場合、すなわち、レジスタEVの内容がノートイベントでなく、リズムのノートイベント、あるいは、チャンネルイベントである場合には、ステップSB6へ進む。
【0029】ステップSB6では、レジスタEVの内容がリズムのノートイベントに対応するものであるか否かを判断する。この判断結果が「YES」の場合には、ステップSB7へ進む。ステップSB7では、リズムノートイベント処理を行う。なお、このリズムノートイベント処理の詳細については、後述する。そして、このリズムノートイベント処理が終了すると、CPU1は、図3のメインルーチンへ戻り、ステップSA3へ進む。
【0030】いっぽう、ステップSB4の判断結果が「NO」の場合、すなわち、レジスタEVの内容がリズムのノートイベントでなく、チャンネルイベントである場合には、ステップSB8へ進む。ステップSB8では、MIDIチャンネルの音色切り替えを要求するプログラムチェンジ情報やピッチベンド情報等のチャンネルイベントを処理するチャンネルイベント処理を行う。そして、このチャンネルイベント処理が終了すると、CPU1は、図3のメインルーチンへ戻り、ステップSA3へ進む。
【0031】次に、CPU1のノートイベント処理について図5のフローチャートに基づいて説明する。CPU1の処理が図4のステップSB5へ進むと、図5に示すノートイベント処理ルーチンが起動される。CPU1は、まず、ステップSC1の処理へ進み、レジスタEVの内容がノートオンイベントNONに対応するものであるか否かを判断する。この判断結果が「YES」の場合には、ステップSC2へ進む。
【0032】ステップSC2では、割当可能である発音チャンネルを検出するための空き発音チャンネルのサーチをした後、ステップSC3へ進む。ここで、空き発音チャンネルとは、発音まで待機している状態を意味している。ステップSC3では、ステップSC2の空き発音チャンネルのサーチ処理において検出された発音チャンネルの状態から現在空き発音チャンネルがあるか否かを判断する。この判断結果が「NO」の場合、すなわち、全ての発音チャンネルが何らかの形で発音中である場合には、ステップSC4へ進む。
【0033】ステップSC4では、発音中の発音チャンネルの中で最も減衰が進んでいる発音チャンネル、あるいは、最も古く押鍵された発音チャンネルを検出し、これを強制的に発音停止させて「空き発音チャンネル」とするトランケート処理を行う。なお、このトランケート処理の詳細については、後述する。そして、このトランケート処理が終了すると、CPU1は、ステップSC6へ進む。
【0034】いっぽう、ステップSC3の判断結果が「YES」の場合、すなわち、現在空き発音チャンネルがある場合には、ステップSC5へ進む。ステップSC5では、アサインされる発音チャンネルの番号が一時格納されるレジスタACHに、得られた空き発音チャンネルの番号を格納した後、ステップSC6へ進む。ステップSC6では、レジスタACHに格納された発音チャンネルの番号に対応した発音チャンネルの状態を発音持続状態として表すため、レジスタST〔ACH〕の値(ステート信号ST)を「1」とした後、ステップSC7へ進む。ここで、このレジスタST〔ACH〕と各発音チャンネルの状態との対応は、ST〔ACH〕=「0」は空き発音チャンネル、すなわち、チャンネル待機状態を表し、「1」は押鍵中の発音チャンネル、すなわち、ノートオンによる発音持続状態を表し、「2」は離鍵されているが発音中である発音チャンネル、すなわち、リリース波形発音状態を表している。
【0035】ステップSC7では、発音すべきノートコードNCをMIDIイベントから取り出して、各発音チャンネルで発音中のノートコードNCが格納されるレジスタSTNC〔ACH〕に格納する。1つのノートオンのMIDIメッセージには、MIDIチャンネル番号と、ノートコードNCと、ベロシティNV等の情報が納められている。そして、CPU1は、ステップSC8へ進む。
【0036】ステップSC8では、各発音チャンネルにアサインされているMIDIチャンネルの番号が格納されるレジスタAMC〔ACH〕に、レジスタMCHに格納されているMIDIチャンネル番号を格納した後、ステップSC9へ進む。ステップSC9では、レジスタACHに格納された発音チャンネルの番号に対応する楽音合成回路11の空き発音チャンネルに対してMIDIチャンネル番号MCH、ノートコードNC、ベロシティNV、ノートオン情報をMIDI・バス10を介して出力する。これらは、実際には、MIDI規格に則ったMIDIイベントの形で送出される。これにより、楽音合成回路11は、これらの情報に基づいた楽音信号を発生する。そして、CPU1は、ステップSC10へ進む。
【0037】ステップSC10では、各発音チャンネル毎に設けられ、ノートオンされる度に1インクリメントされるノートオンカウンタNONC〔ACH〕の値を0にリセットする。このノートオンカウンタNONC〔ACH〕の値が最大の発音チャンネルが最も古くから押鍵された発音チャンネルを示しているので、それぞれのノートオンカウンタNONC〔ACH〕の値を参照することにより、鍵盤4のどのキーが最も早く押鍵されたかを知ることができる。そして、CPU1は、ステップSC11へ進む。
【0038】ステップSC11では、発音中の発音チャンネルに対応する全てのノートオンカウンタNONC〔ACH〕の値を1ずつインクリメントする。もちろん、発音していない発音チャンネルに対応するノートオンカウンタNONC〔ACH〕の値をインクリメントしてはならない。なお、ここで、発音中の発音チャンネルに対応する全てのノートオンカウンタNONC〔ACH〕としたのは、ノートオンされた発音チャンネルに対応する全てのノートオンカウンタNONC〔ACH〕とすると、発音中であるが離鍵された発音チャンネル(具体的には、ST〔ACH〕=「2」)が、後述するトランケート処理において誤って処理されてしまうからである。そして、CPU1は、図4のMIDI処理ルーチンを経て図3のメインルーチンへ戻り、ステップSA3へ進む。
【0039】いっぽう、ステップSC1の判断結果が「NO」の場合、すなわち、レジスタEVの内容がノートオンイベントNONに対応するものでなく、ノートオフイベントNOFFに対応するものである場合には、ステップSC12へ進む。ステップSC12では、各発音チャンネルの情報をサーチする。ここで、同じMIDIチャンネルで同じノートコードNCを発音している発音チャンネルがあれば、後述するように、その発音チャンネルのノートオフ処理を行うが、同じノートコードNCでも、異なるMIDIチャンネルであれば、その発音チャンネルはノートオフしてはならない。そこで、このことを検出できるようにするため、ステップSC7および8において、各発音チャンネル毎に、ノートコードNCおよびMIDIチャンネル番号をレジスタSTNC〔ACH〕およびAMC〔ACH〕にそれぞれ格納しているのである。そして、CPU1は、ステップSC13へ進む。
【0040】ステップSC13では、対応する発音チャンネルがあるか否かを判断する。この判断結果が「NO」の場合、すなわち、対応する発音チャンネルの楽音がもう発音されていない場合、たとえば、押鍵が持続されて発音が完全に減衰してしまった状態や、トランケート処理により押鍵中にもかかわらず発音が強制終了させられた場合などには、なにもせず、図4のMIDI処理ルーチンを経て図3のメインルーチンへ戻り、ステップSA3へ進む。
【0041】いっぽう、ステップSC13の判断結果が「YES」の場合、すなわち、対応する発音チャンネルが現在発音中である場合には、ステップSC14へ進む。ステップSC14では、サーチされた発音チャンネル番号をレジスタCHへ格納した後、ステップSC15へ進む。ステップSC15では、上述した各発音チャンネル毎の状態が記憶されるレジスタST〔CH〕に離鍵されているが発音中である発音チャンネル、すなわち、リリース波形発音状態であることを表す「2」を格納した後、ステップSC16へ進む。ステップSC16では、レジスタCHに格納された発音チャンネルの番号に対応する楽音合成回路11の発音チャンネルに対してノートオフ情報を出力した後、図4のMIDI処理ルーチンを経て図3のメインルーチンへ戻り、ステップSA3へ進む。
【0042】次に、この発明の特徴であるCPU1のトランケート処理について図6のフローチャートに基づいて説明する。CPU1の処理が図5のステップSC4へ進むと、図6に示すトランケート処理ルーチンが起動される。CPU1は、まず、ステップSD1の処理へ進み、各発音チャンネルの状態をスキャンする、すなわち、レジスタST〔CH〕をスキャンした後、ステップSD2へ進む。
【0043】ステップSD2では、ノートオフ中の発音チャンネルがあるか否か、すなわち、レジスタST〔CH〕の値が「2」である発音チャンネルがあるか否かを判断する。この判断結果が「YES」の場合には、ステップSD3へ進む。ステップSD3では、ノートオフ中の発音チャンネルの中でエンベロープレベルENVが最も小さい発音チャンネル、すなわち、最も減衰が進んでいる発音チャンネルの番号をトランケート候補の発音チャンネルの番号が格納されるレジスタTCHに格納した後、ステップSD5へ進む。
【0044】いっぽう、ステップSD2の判断結果が「NO」の場合、すなわち、ノートオフ中の発音チャンネルがない場合には、ステップSD4へ進む。ステップSD4では、発音中の発音チャンネルの中で最も古く押鍵された発音チャンネル、すなわち、ノートオンカウンタNONC〔ACH〕の値が最大の発音チャンネルの番号をレジスタTCHに格納する。これにより、ストリングスやパイプオルガン等のスローアタックの楽音の音色でも、押鍵中であれば、トランケート処理されることがない。そして、CPU1は、ステップSD5へ進む。
【0045】ステップSD5では、レジスタTCHに格納された発音チャンネルの番号に対応する楽音合成回路11の発音チャンネルに対してダンプ要求信号を送出する。これにより、楽音合成回路11の発音チャンネルは、ダンプ要求信号に応じて所定の速度でエンベロープをダンプするが、完全にダンプされるまでにある程度時間がかかる。したがって、この発音チャンネルにすぐにノートオン情報が入力された場合には、不都合が生じる可能性があるが、楽音合成回路11は、このような状態の場合、該当する発音チャンネルのエンベロープが完全にダンプされるまでノートオン情報を遅延させておき、ダンプが終了した時点でノートオン情報に基づき、直ちに発音を立ち上げる機能を有しているので、問題はない。そして、CPU1は、ステップSD6へ進む。ステップSD6では、レジスタTCHの値をレジスタACHに格納した後、図5のノートイベント処理ルーチンへ戻り、ステップSC6へ進む。
【0046】次に、CPU1のリズムノートイベント処理について図7のフローチャートに基づいて説明する。CPU1の処理が図4のステップSB7へ進むと、図7に示すリズムノートイベント処理ルーチンが起動される。CPU1は、まず、ステップSE1の処理へ進み、レジスタEVの内容がリズムのノートオンイベントNONに対応するものであるか否かを判断する。この判断結果が「YES」の場合には、ステップSE2へ進む。
【0047】ステップSE2では、割当可能であるリズムチャンネルを検出するための空きリズムチャンネルのサーチをした後、ステップSE3へ進む。ここで、空きリズムチャンネルとは、リズム発音まで待機している状態を意味している。ステップSE3では、ステップSE2の空きリズムチャンネルのサーチ処理において検出されたリズムチャンネルの状態から現在空きリズムチャンネルがあるか否かを判断する。この判断結果が「NO」の場合、すなわち、全てのリズムチャンネルが何らかの形で発音中である場合には、ステップSE4へ進む。
【0048】ステップSE4では、リズム発音中のリズムチャンネルの中でエンベロープレベルが最も小さいリズムチャンネル、すなわち、最も減衰が進んでいるリズムチャンネルを検出し、これを強制的に発音停止させて「空きリズムチャンネル」とするリズムトランケート処理を行う。なお、このリズムトランケート処理の詳細については、後述する。そして、このリズムトランケート処理が終了すると、CPU1は、ステップSE6へ進む。
【0049】いっぽう、ステップSE3の判断結果が「YES」の場合、すなわち、現在空きリズムチャンネルがある場合には、ステップSE5へ進む。ステップSE5では、レジスタACHに得られた空きリズムチャンネルの番号を格納した後、ステップSE6へ進む。ステップSE6では、レジスタACHに格納されたリズムチャンネルの番号に対応したリズムチャンネルの状態をリズム発音持続状態として表すため、レジスタRST〔ACH〕の値を「1」とした後、ステップSE7へ進む。ここで、このレジスタRST〔ACH〕と各リズムチャンネルの状態との対応は、レジスタST〔ACH〕と各発音チャンネルの状態との対応と同様、RST〔ACH〕=「0」は空きリズムチャンネル、すなわち、リズムチャンネル待機状態を表し、「1」はリズムノートオンによるリズム発音持続状態を表し、「2」はリリース波形発音状態を表している。
【0050】ステップSE7では、リズム発音すべきリズムのノートコードNCをMIDIイベントから取り出して、各リズムチャンネルでリズム発音中のリズムのノートコードNCが格納されるレジスタRSTNC〔ACH〕に格納する。1つのリズムのノートオンのMIDIメッセージには、MIDIチャンネル番号と、リズムのノートコードNCと、ベロシティNV等の情報が納められている。そして、CPU1は、ステップSE8へ進む。
【0051】ステップSE8では、アサインされているMIDIチャンネルの番号が格納されるレジスタRAMC〔ACH〕に、レジスタMCHに格納されているMIDIチャンネル番号を格納した後、ステップSE9へ進む。ステップSE9では、レジスタACHに格納されたリズムチャンネルの番号に対応する楽音合成回路11の空きリズムチャンネルに対してMIDIチャンネル番号MCH、リズムのノートコードNC、ベロシティNV、ノートオン情報をMIDI・バス10を介して出力する。これらは、実際には、MIDI規格に則ったMIDIイベントの形で送出される。これにより、楽音合成回路11は、これらの情報に基づいたリズム楽音信号を発生する。そして、CPU1は、図4のMIDI処理ルーチンを経て図3のメインルーチンへ戻り、ステップSA3へ進む。
【0052】いっぽう、ステップSE1の判断結果が「NO」の場合、すなわち、レジスタEVの内容がリズムのノートオンイベントNONに対応するものでなく、リズムのノートオフイベントNOFFに対応するものである場合には、ステップSE10へ進む。ステップSE10では、各リズムチャンネルの情報をサーチする。ここで、同じMIDIチャンネルで同じリズムのノートコードNCを発音しているリズムチャンネルがあれば、後述するように、そのリズムチャンネルのリズムノートオフ処理を行うが、同じリズムのノートコードNCでも、異なるMIDIチャンネルであれば、そのリズムチャンネルはリズムノートオフしてはならない。そこで、このことを検出できるようにするため、ステップSE7および8において、各リズムチャンネル毎に、リズムのノートコードNCおよびMIDIチャンネル番号をレジスタRSTNC〔ACH〕およびRAMC〔ACH〕にそれぞれ格納しているのである。そして、CPU1は、ステップSE11へ進む。
【0053】ステップSE11では、対応するリズムチャンネルがあるか否かを判断する。この判断結果が「NO」の場合、すなわち、対応するリズムチャンネルの楽音がもうリズム発音されていない場合、たとえば、リズムトランケート処理によりリズム発音が強制終了させられた場合などには、なにもせず、図4のMIDI処理ルーチンを経て図3のメインルーチンへ戻り、ステップSA3へ進む。
【0054】いっぽう、ステップSE11の判断結果が「YES」の場合、すなわち、対応するリズムチャンネルが現在リズム発音中である場合には、ステップSE12へ進む。ステップSE12では、サーチされたリズムチャンネル番号をレジスタCHへ格納した後、ステップSE13へ進む。ステップSE13では、上述した各リズムチャンネル毎の状態が記憶されるレジスタRST〔CH〕にリリース波形発音状態であることを表す「2」を格納した後、ステップSE14へ進む。ステップSE14では、レジスタCHに格納されたリズムチャンネルの番号に対応する楽音合成回路11のリズムチャンネルに対してノートオフ情報を出力した後、図4のMIDI処理ルーチンを経て図3のメインルーチンへ戻り、ステップSA3へ進む。
【0055】次に、CPU1のリズムトランケート処理について図8のフローチャートに基づいて説明する。CPU1の処理が図7のステップSE4へ進むと、図8に示すリズムトランケート処理ルーチンが起動される。CPU1は、まず、ステップSF1の処理へ進み、リズムチャンネルの中で楽音合成回路11から供給されるエンベロープレベルENVが最も小さいリズムチャンネル、すなわち、最も減衰が進んでいるリズムチャンネルの番号をトランケート候補としてレジスタTCHに格納する。
【0056】ただし、打楽器音には、ハイハットやホイッスルなどのように、キーオンとキーオフとがあるイベント駆動型の音色と、ドラムなどのように、キーオンしかないトリガ駆動型の音色とがあるので、これらの音色のエンベロープレベルENVを一様に比較してしまうと、すでに述べたような不都合が生じてしまう。
【0057】そこで、イベント駆動型の音色とトリガ駆動型の音色とを区別するために、フラグEDを設け、イベント駆動型の音色である場合には、フラグEDを1にセットしておき、このステップSF1において、フラグEDが1にセットされている場合には、エンベロープレベルENVに、図12(a)に示すように、オフセットOFTを加えた後、トリガ駆動型の音色のエンベロープレベルENVと比較して評価することにする。これにより、イベント駆動型の音色がトランケートされにくくなり、キーオフが処理されるので、自然であり、イベント駆動型の打楽器音の音色を正確に発生させることができる。そして、CPU1は、ステップSF2へ進む。
【0058】ステップSF2では、レジスタTCHに格納されたリズムチャンネルの番号に対応する楽音合成回路11のリズムチャンネルに対してダンプ要求信号を送出する。これにより、楽音合成回路11のリズムチャンネルは、ダンプ要求信号に応じて所定の速度でエンベロープをダンプする。そして、CPU1は、ステップSF3へ進む。ステップSF3では、レジスタTCHの値をレジスタACHに格納した後、図7のリズムノートイベント処理ルーチンへ戻り、ステップEC6へ進む。
【0059】次に、CPU1の鍵処理について図9のフローチャートに基づいて説明する。CPU1の処理が図3R>3のステップSA4へ進むと、図9に示す鍵処理ルーチンが起動される。CPU1は、まず、ステップSG1の処理へ進み、鍵盤4をスキャンして鍵盤4の押離鍵状態を検出した後、ステップSG2へ進む。ステップSG2では、ステップSG1の鍵スキャン処理において検出された鍵盤4の押離鍵状態から鍵イベントの有無を判断する。この判断結果が「NO」の場合、すなわち、鍵イベントが検出されない場合には、何もせず、図3のメインルーチンへ戻り、ステップSA5へ進む。
【0060】いっぽう、ステップSG2の判断結果が「YES」の場合、すなわち、鍵イベントが検出された場合には、ステップSG3へ進む。ステップSG3では、あらかじめ設定されているモードMODEに応じて対応するMIDIチャンネルの情報として該当するイベントをRAM3のMIDIバッファにアドレス/データ・バス6を介して格納した後、ステップSG4へ進む。
【0061】ここで、モードMODEについて説明する。
■モードMODE=0:通常発音モード鍵盤4の全てのイベントをチャンネル番号0のMIDIチャンネルの情報としてRAM3のMIDIバッファにアドレス/データ・バス6を介して格納する。
■モードMODE=1:スプリットモード鍵盤4のある点(KSP:キースプリットポイント)より上の鍵域のイベントは、チャンネル番号0のMIDIチャンネルの情報とし、キースプリットポイントKSPより下の鍵域のイベントは、チャンネル番号1のMIDIチャンネルの情報としてRAM3のMIDIバッファにアドレス/データ・バス6を介して格納する。これにより、鍵域に応じて各MIDIチャンネルに割当てられた音色が発音される。なお、キースプリットポイントKSPは、固定でも、演奏者によって設定可能でもよい。
【0062】■モードMODE=2:自動伴奏モード鍵盤4のある点(ASP:自動伴奏スプリットポイント)より上の鍵域は、通常の押鍵域とし、そのイベントは、チャンネル番号0のMIDIチャンネルの情報としてRAM3のMIDIバッファにアドレス/データ・バス6を介して格納する。また、自動伴奏スプリットポイントASPより下の鍵域は、自動伴奏用の調検出領域として用い、その音は発音しない、すなわち、MIDIイベントとしてRAM3のMIDIバッファにアドレス/データ・バス6を介して格納せず、検出された情報は、コードの根音(ルート)ROOTとタイプTYPEの形で、たとえば、演奏者が「ドミソ」と押鍵していれば、後述するステップSG5の処理において、ルートROOTとして「ド」が、タイプTYPEとして「メジャー」がRAM3に格納され、後述する自動処理で利用される。なお、自動伴奏スプリットポイントASPは、キースプリットポイントKSPと同じにしてもよい。
【0063】ステップSG4では、モードMODEが「2」であるか否かを判断する。この判断結果が「NO」の場合には、何もせず、図3のメインルーチンへ戻り、ステップSA5へ進む。いっぽう、ステップSG4の判断結果が「YES」の場合、すなわち、モードMODEが「2」である場合には、ステップSG5へ進む。ステップSG5では、鍵盤4の下鍵域で押鍵されているキーのノートナンバの組み合わせからコードのルートROOTとタイプTYPEとを図示せぬテーブルを参照して決定し、RAM3に格納した後、図3のメインルーチンへ戻り、ステップSA5へ進む。
【0064】次に、CPU1の自動処理について図10のフローチャートに基づいて説明する。CPU1の処理が図3のステップSA5へ進むと、図10に示す自動処理ルーチンが起動される。CPU1は、まず、ステップSH1の処理へ進み、モードMODEが「2」であるか否かを判断する。この判断結果が「YES」の場合には、ステップSH2へ進む。
【0065】ステップSH2では、ROM2やRAM3等の自動伴奏データエリアにあらかじめ7thの形で記憶された自動伴奏データを、演奏者によって設定されたスタイルSTYLEおよびテンポTEMPO並びに上述した鍵処理によって検出されてRAM3に格納されたタイプTYPEおよびルートROOTに応じて読み出し、タイプTYPEに応じてメジャーやマイナー等に変更し、ルートROOTによってシフトする。以上説明した処理を、図2に示すチャンネル番号25〜31のMIDIチャンネル、すなわち、自動伴奏コードトラック1〜6および自動伴奏ベーストラックについて行い、それらのMIDIチャンネルの情報として各イベントをRAM3のMIDIデータバッファに順次格納した後、ステップSH3へ進む。いっぽう、ステップSH1の判断結果が「NO」の場合、すなわち、モードMODEが「2」でない場合にも、ステップSH3へ進む。
【0066】ステップSH3では、演奏者が自動リズム演奏を選択した場合に1にセットされる自動リズムフラグRHYTHMが1にセットされているか否かを判断する。この判断結果が「NO」の場合には、何もせず、図3R>3のメインルーチンへ戻り、ステップSA6へ進む。いっぽう、ステップSH3の判断結果が「YES」の場合、すなわち、自動リズムフラグRHYTHMが1にセットされている場合には、ステップSH4へ進む。ステップSH4では、ROM2やRAM3等の自動リズムデータエリアにあらかじめ記憶された自動リズムデータを演奏者によって設定されたスタイルSTYLEおよびテンポTEMPOに応じて読み出す処理を、図2に示すチャンネル番号32〜39のMIDIチャンネル、すなわち、自動伴奏リズムトラックについて行い、それらのMIDIチャンネルの情報として各イベントをRAM3のMIDIデータバッファに順次格納した後、図3のメインルーチンへ戻り、ステップSA6へ進む。
【0067】次に、CPU1の発音チャンネル処理について図11のフローチャートに基づいて説明する。CPU1の処理が図3のステップSA6へ進むと、図11に示す発音チャンネル処理ルーチンが起動される。CPU1は、まず、ステップSI1の処理へ進み、全発音チャンネルの状態を検索するため、レジスタCHの値を「0」に設定した後、ステップSI2へ進む。
【0068】ステップSI2では、各発音チャンネル毎のエンベロープレベルが記憶されるレジスタENV〔CH〕に楽音合成回路11から供給される各発音チャンネルのエンベロープレベルを格納した後、ステップSI3へ進む。ステップSI3では、各発音チャンネル毎の状態を表すレジスタST〔CH〕が「2」、すなわち、離鍵されているが発音状態であるか否かを判断する。この判断結果が「YES」の場合には、ステップSI4へ進み、いっぽう、ステップSI3の判断結果が「NO」の場合、すなわち、空き発音チャンネルである場合には、当該チャンネルが発音待機状態にあるから、後述するステップSI7へ進む。
【0069】ステップSI4では、レジスタENV〔CH〕に格納された、レジスタCHに設定された発音チャンネルの番号に対応した楽音合成回路11の発音チャンネルのエンベロープレベルが各音色毎にあらかじめ設定されたスレッショルドTH(たとえば、0にかなり近い値)より小さいか否かを判断する。この判断結果が「YES」の場合には、ステップSI5へ進み、いっぽう、ステップSI4の判断結果が「NO」の場合、すなわち、レジスタENV〔CH〕に格納されたエンベロープレベルがスレッショルドTH以上である場合には、後述するステップSI7へ進む。
【0070】ステップSI5では、発音チャンネルCHは減衰しきっているため、レジスタST〔CH〕の値を「0」に設定して発音待機状態であることを示した後、ステップSI6へ進む。ステップSI6では、各発音チャンネル毎に設けられ、ノートオンされる度に1インクリメントされるノートオンカウンタNONC〔CH〕の値を0にリセットした後、ステップSI7へ進む。
【0071】ステップSI7では、次の発音チャンネルを検索するために、レジスタCHの値を1インクリメントした後、ステップSI7へ進む。ステップSI8では、このインクリメントされたレジスタCHの値が32であるか否か、すなわち、通常音のMIDIチャンネルに対応した発音チャンネルすべてについて上述したステップSI3〜SI6の処理が終了したか否かを判断する。この判断結果が「NO」の場合には、ステップSI2へ戻り、上述した処理を通常音のMIDIチャンネルに対応した発音チャンネルすべてについて繰返す。
【0072】いっぽう、ステップSI8の判断結果が「YES」の場合には、ステップSI9へ進む。ステップSI9では、レジスタENV〔CH〕に各リズムチャンネルのエンベロープレベルを格納した後、ステップSI10へ進む。ステップSI10では、各リズムチャンネル毎の状態を表すレジスタRST〔CH〕が「0」でない、すなわち、空きリズムチャンネルでない否かを判断する。この判断を行うのは、トリガ駆動型の音色の場合、キーオフがないので、レジスタRST〔CH〕が「0」か「1」にしかならないからである。ステップSI10の判断結果が「YES」の場合には、ステップSI11へ進み、いっぽう、ステップSI10の判断結果が「NO」の場合、すなわち、空きリズムチャンネルである場合には、当該リズムチャンネルがリズム発音待機状態にあるから、後述するステップSI13へ進む。
【0073】ステップSI11では、レジスタENV〔CH〕に格納された、レジスタCHに設定されたリズムチャンネルの番号に対応する楽音合成回路11のリズムチャンネルのエンベロープレベルが各音色毎にあらかじめ設定されたスレッショルドTH(たとえば、0にかなり近い値)より小さく、かつ、フラグEDが0にリセットされている(トリガ駆動型の音色である)か否かを判断する。この判断結果が「YES」の場合には、ステップSI12へ進み、いっぽう、ステップSI11の判断結果が「NO」の場合、すなわち、レジスタENV〔CH〕に格納されたエンベロープレベルがスレッショルドTH以上であるか、または、フラグEDが1にセットされている(イベント駆動型の音色である)場合には、後述するステップSI13へ進む。
【0074】ステップSI12では、リズムチャンネルCHは減衰しきっているため、レジスタRST〔CH〕の値を「0」に設定してリズム発音待機状態であることを示した後、ステップSI13へ進む。ステップSI13では、次のリズムチャンネルを検索するために、レジスタCHの値を1インクリメントした後、ステップSI14へ進む。
【0075】ステップSI14では、このインクリメントされたレジスタCHの値が40であるか否か、すなわち、リズム音のMIDIチャンネルに対応したリズムチャンネルすべてについて上述したステップSI9〜SI13の処理が終了したか否かを判断する。この判断結果が「NO」の場合には、ステップSI9へ戻り、上述した処理をリズム音のMIDIチャンネルに対応したリズムチャンネルすべてについて繰返す。いっぽう、ステップSI14の判断結果が「YES」の場合、すなわち、レジスタCHの値が40である場合には、図3のメインルーチンへ戻り、ステップSA7へ進む。
【0076】なお、上述した一実施例においては、リズム音についてのみこの発明に関するトランケート処理を行うようにして、通常音の発音チャンネルとリズム音のリズムチャンネルとを完全に独立した発音チャンネルとした例を示したが、浮動的にアサインできるようにしてもよい。その際には、リズム音と同様に通常音にもこの発明に関するトランケート処理を行うようにして、ノートイベント処理とトランケート処理の大部分を共用することができる。また、上述した一実施例においては、通常鍵域のトランケート時に、ノートオウされた発音チャンネルがない場合には、最も古くキーオンされた発音チャンネルをトランケートする例を示したが、これに限定されず、たとえば、楽音合成回路11から各発音チャンネルのエンベロープのステートをCPU1に供給し、このステートが一番進んでいる発音チャンネルをトランケートしてもよく、また、CPU1が楽音合成回路11の各発音チャンネルのエンベロープのステートを演算によって推測し、この推測したステートが一番進んでいる発音チャンネルをトランケートするようにしてもよい。
【0077】
【発明の効果】以上説明したように、この発明によれば、スローアタックの音色や異なったリリースを持つ音色を正確に発生でき、発音割当処理を正確に行うことができるという効果がある。
【図面の簡単な説明】
【図1】 この発明の一実施例による電子楽器の構成を示すブロック図である。
【図2】 MIDIチャンネルのそれぞれの機能の一例を示す図である。
【図3】 この発明の一実施例におけるCPU1のメインルーチンの動作を示すフローチャートである。
【図4】 この発明の一実施例におけるCPU1のMIDI処理ルーチンの動作を示すフローチャートである。
【図5】 この発明の一実施例におけるCPU1のノートイベント処理ルーチンの動作を示すフローチャートである。
【図6】 この発明の一実施例におけるCPU1のトランケート処理ルーチンの動作を示すフローチャートである。
【図7】 この発明の一実施例におけるCPU1のリズムイベント処理ルーチンの動作を示すフローチャートである。
【図8】 この発明の一実施例におけるCPU1のリズムトランケート処理ルーチンの動作を示すフローチャートである。
【図9】 この発明の一実施例におけるCPU1の鍵処理ルーチンの動作を示すフローチャートである。
【図10】 この発明の一実施例におけるCPU1の自動処理ルーチンの動作を示すフローチャートである。
【図11】 この発明の一実施例におけるCPU1の発音チャンネル処理ルーチンの動作を示すフローチャートである。
【図12】 従来の技術の不都合点を説明するための図である。
【符号の説明】
1……CPU、2……ROM、3……RAM、4……鍵盤、5……鍵盤インターフェイス、6……アドレス/データ・バス、7……操作パネル、8……操作パネルインターフェイス、9……MIDIインターフェイス、10……MIDI・バス、11……楽音合成回路、12……サウンドシステム、13……スピーカ。

【特許請求の範囲】
【請求項1】 鍵操作情報を発生する鍵操作情報発生手段と、複数の楽音信号発生用の発音チャンネルを有し、各発音チャンネル毎に、複数の楽音信号をそれぞれ出力する楽音発生手段と、前記複数の発音チャンネルが全て発音中であるか否かを検出する第1の発音チャンネル検出手段と、該第1の発音チャンネル検出手段によって前記複数の発音チャンネルが全て発音中であることが検出された場合に、前記複数の発音チャンネルの中に離鍵中の発音チャンネルがあるか否かを検出する第2の発音チャンネル検出手段と、該第2の発音チャンネル検出手段によって複数の発音チャンネルの中に離鍵中の発音チャンネルがあることが検出された場合には、前記離鍵中の発音チャンネルの中で最もエンベロープレベルが小さい楽音信号の発音チャンネルを検出する第1のトランケートチャンネル検出処理を行って当該検出された発音チャンネルをトランケートし、前記第2の発音チャンネル検出手段によって複数の発音チャンネルの中に離鍵中の発音チャンネルがないことが検出された場合には、前記第1のトランケートチャンネル検出処理とは異なる第2のトランケートチャンネル検出処理を行って検出された発音チャンネルをトランケートするトランケート手段と、該トランケート手段のトランケート結果および前記鍵操作情報発生手段から出力される新たな鍵操作情報に基づいて、新たな楽音の発生を前記楽音発生手段のトランケートされた発音チャンネルに割当てる割当手段とを具備することを特徴とする電子楽器。

【図1】
image rotate


【図2】
image rotate


【図3】
image rotate


【図4】
image rotate


【図5】
image rotate


【図6】
image rotate


【図8】
image rotate


【図12】
image rotate


【図7】
image rotate


【図9】
image rotate


【図10】
image rotate


【図11】
image rotate