以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。図1は、本発明による電子管楽器を制御するシステムの実施形態を示す図である。
本実施形態のシステムは、ローパスフィルタ(図中「LPF」)101と、アンプ(図中「Amp」)102、104、ゼロクロス検出部103、絶対値算出部105、CPU(セントラルプロセッシングユニット)106、キーマトリクス107、モードスイッチ(図中「モードSW」)108、音源109、D/A(デジタル/アナログ)変換器110、アンプ111、およびスピーカ(図中「SP」)112を備える。また、CPU106は、符号・割込回路113、A/D(アナログ/デジタル)変換器114、タイマ115、メモリ116、及びブレスセンサ117を備える。
連続的に変化する演奏者のブレス(呼気)の状態は、ブレスセンサ117により検出され、このブレスセンサ117が出力する信号はLPF101に入力する。LPF101は、この信号の倍音成分をカットする。LPF101の出力は、Amp102によって増幅される。図2は、本実施形態における信号波形例を示す図である。図2(a)はブレスセンサ117の出力(図1のA点)の信号波形の例を示す図、図2(b)はAmp102の出力(図1のB点)の信号波形の例を示す図である。図2(a)および(b)を比較してわかるように、ピーク検出をし易いように、ブレスセンサ117の出力中の倍音成分がカットされ、滑らかな波形に変換されている。
ゼロクロス検出部103は、Amp102の出力信号(B点、図2(b))から、その振幅値が値0を交差するタイミングを検出する。この検出出力は、そのまま(C点)あるいはAmp104にて増幅された後(E点)に、CPU106内の符号・割込回路113に入力する。符号・割込回路113は、入力したアナログ信号波形に基づいて2値のデジタル信号を生成する。図2(c)は、上記C点またはE点の信号波形が符号・割込回路113によって2値のデジタル信号波形に変換された例を示す図である。このデジタル信号波形は、ゼロクロス検出部103にてゼロクロスが検出された結果、LPF101(Amp102)の出力信号の振幅値が正の値となる区間で論理値1、負の値となる区間で論理値0を有する2値のデジタル信号となっている。
絶対値算出部105は、Amp102の出力信号(B点、図2(b))の絶対値を算出する。この算出出力(D点)は、CPU106内のA/D変換器114に入力する。A/D変換器114は、CPU106内のタイマ115を仕様して例えば50μ秒(μs)ごとに割込みをかけ、入力したアナログ信号波形をデジタル信号波形にA/D変換する。図2(d)は、上記D点の信号波形の例を示す図である。この信号波形は、LPF101(Amp102)の出力信号の振幅値が負の値となる区間が正側に折り返された波形を有する。
タイマ115は、上述のA/D変換器114のサンプリングを制御するほか、後述する各種所定の時間をカウントするなどの役割を有する。
メモリ116は、各種制御データを記憶する。
CPU106には、電子管楽器の演奏操作キーを読み取るためのキーマトリクス107と、音色変更のモードをオン(on)、オフ(off)指定するためのモードSW108が接続される。また、CPU106には、MIDI(Musical Instrument Digital Interface)信号によって制御される音源109が外付けされる。音源109は、CPU106からのノートオン/ノートオフおよび音色指定に基づく楽音の発音指示に応答して、対応する楽音信号を生成し、D/A変換器110に出力する。D/A変換器110は、音源109が出力したデジタル楽音信号をアナログ楽音信号に変換する。このアナログ楽音信号は、アンプ111で増幅された後、スピーカ112から放音される。
本実施形態では、CPU106が、絶対値算出部105からA/D変換器114を介して入力したデジタル信号波形から、演奏者のブレス入力タイミングを抽出する。そのためにCPU106はまず、上記デジタル信号波形から所定のスレッショルド(閾値)以上の値を有するピーク(以下「Peak」と記載する)を検出する。
図3は、Peak検出処理の説明図(その1)である。本実施形態では、処理の簡略化のために、図3に例示される上記デジタル信号波形の正側波形のみが処理され、負側波形は無視される。そのために、CPU106は、図1のA/D変換器114から入力するデジタル信号波形(図2(d)参照)のうち、図1の符号・割込回路113から出力されるゼロクロス2値信号(図2(c))の値が1となる区間の信号のみを処理し、その他の区間の信号値は全てゼロとして処理する。なお、負側波形のみ、あるいは両方の波形が処理されてもよい。
このようなデジタル信号波形からのPeak検出として、図3の破線で示される予測カーブ302が用いられる。そして、サンプリング周波数50μsのタイマ115による割込みタイミング(サンプリングタイミング)n(nは0以上の整数)ごとに、A/D変換器114が出力する現在の波高値anと、そのサンプリングタイミングnにおける上記予測カーブ302上の予測値bnとが比較される。そして、下記のアルゴリズムによる処理が実行される。
まず、ケース1として、サンプリングタイミングnにおいて、現在の波高値an≧予測値bnとなると、メモリ116に保持されるPeak検出_flagがon(オン)にされ、予測カーブ302の開始点が現在の波高値anに更新されて、次のサンプリングタイミングn+1における予測値bn+1が計算される。これは、負側の波形の波高値から値ゼロを過ぎて正側の波形になりその波高値が増加してゆく場合である。例えば、図3の波高値a1と予測値b1、a2とb2、a3とb3、a4とb4の各場合のときである。このとき、下記(1)式の予測カーブ302が使用されて、次のサンプリングタイミングのための予測値bnが算出される。
bn=an×(1−1/256)−1 (1)
図3の例では例えば、次のようにb2〜b5が算出される。
b2=a1×(1−1/256)−1
b3=a2×(1−1/256)−1
b4=a3×(1−1/256)−1
b5=a4×(1−1/256)−1
一方、ケース2として、サンプリングタイミングnにおいて、Peak検出_flagがonの状態で、現在の波高値an<予測値bnとなったときであって、さらに現在の波高値anの1サンプル(50μs)前の波高値an−1が所定のスレッショルドS以上となると、その波高値an−1がPeakとして認識される。例えば、図3の波高値a5と予測値b5の場合であり、このときに波高値a4がPeakとして認識される。
図4は、ケース2におけるPeak検出処理の説明図(その2)である。Peak検出_flagがonの状態で、現在の波高値an<予測値bnとなったときの波高値an−1=α1、α1′、α2′、α2、α2′′、α3′、α3、α3′′、α4′、およびα4等のうち、スレッショルドSを越えるα1、α2、α3、およびα4等がPeakとして検出され、スレッショルドS以下のα1′、α2′、α2′′、α3′、α3′′、およびα4′等は、Peakとしては検出されない。CPU106は、このようにして検出されたPeak値(図3の例ではa4)を、メモリ116に記憶する。以下の説明では便宜上、図4のようにして認識された各Peak値を、α1、α2、α3、・・・と記載する。
ケース2において、上記処理の後、メモリ116上のPeak検出_flagがoff(オフ)にされる。そして、予測カーブ302の開始点が現在のサンプリングタイミングnでの予測値bnとされて、下記(2)式の予測カーブ302が使用されて、次のサンプリングタイミングのための予測値bnが算出される。
bn=bn×(1−1/256)−1 (2)
図3の例では例えば、次のようにb6(図示せず)が算出される。
b6=b5×(1−1/256)−1
ケース3として、サンプリングタイミングnにおいて、Peak検出_flagがoffの状態で、現在の波高値an<予測値bnのときには、予測カーブ302の開始点は変更されずに(図3の場合b5)、前述の(2)式に従って予測値bnのみが更新されてゆく。これは、正側の波形の波高値がPeakを過ぎて減少してゆく場合である。
その後、波形のサンプリングが進んで、負側の波形の波高値から値ゼロを過ぎて再び正側の波形になりその波高値が増加を始めると、図3のa1とb1の関係ように、再びケース1の状態になる。
図5から図9は、図1のモードSW108がonにされた後のブレスセンサ117の出力に基づいてCPU106が上述のPeak検出処理によって検出するPeakのカウントパターンの説明図である。これらの図において、Peak検出処理によって検出されたPeakは、α1〜α7などとして示されている。説明上、所定時間範囲tを8分割し、わかり易さのためにt/4を4分音符
t/8を8分音符♪で表記している。図10は、所定時間範囲tと、音符と、テンポと、A/D変換器114におけるサンプリングのタイミングとの関係を示す説明図である。CPU106では、タイマ115により、50μsごとに割込みがかかり、この割込みに基づいてA/D変換器114でサンプリングが行われる。これを基準として、音符を決定するテンポ(図中Tempo)の分解能は、例えば1ミリ秒(ms)とされる。ここで、所定時間範囲tは、例えば1小節の時間範囲であり、例えば2秒であり、図10中の大きな「×」印が小節の区切りを示す。また、小さな「×」印は、拍(四拍子の場合)の区切りを示す。この場合、4分音符の音符長は0.5秒となる(8分音符では0.25秒である)。ここで、CPU106は、メモリ116に記憶されているPeakの各検出タイミングを、小さな「×」印で示される拍の区切りとして認識する。言い換えれば、演奏者は、拍を意識してブレス入力を行うことになる。このとき、Peakの検出タイミング±10msの範囲(図10の1001参照)で、拍を認識してどの音符がブレス入力されたかを判定する。
CPU106は、以上の動作に基づいて、所定時間範囲tにおけるPeakのカウントパターンを判定する。そして、カウントパターンに応じて、演奏者が値0〜9のうちのどれを指定したかを判定する。
CPU106は、図5(a)に示されるように、カウントパターンが、4個の連続する4分音符であると判定した場合には、値0が指定されたと判定する。
CPU106は、図5(b)に示されるように、カウントパターンが、連続する3個の4分音符とそれに続く2個の連続する8分音符であると判定した場合には、値1が指定されたと判定する。
CPU106は、図6(c)に示されるように、カウントパターンが、連続する2個の4分音符とそれに続く2個の連続する8分音符とさらにそれに続く1個の4分音符であると判定した場合には、値2が指定されたと判定する。
CPU106は、図6(d)に示されるように、カウントパターンが、連続する2個の4分音符とそれに続く4個の連続する8分音符であると判定した場合には、値3が指定されたと判定する。
CPU106は、図7(e)に示されるように、カウントパターンが、1個の4分音符とそれに続く2個の連続する8分音符とさらにそれに続く2個の連続する4分音符であると判定した場合には、値4が指定されたと判定する。
CPU106は、図7(f)に示されるように、カウントパターンが、1個の4分音符とそれに続く2個の連続する8分音符とさらにそれに続く1個の4分音符とさらにそれに続く2個の連続する8分音符であると判定した場合には、値5が指定されたと判定する。
CPU106は、図8(g)に示されるように、カウントパターンが、1個の4分音符とそれに続く4個の連続する8分音符とさらにそれに続く1個の4分音符であると判定した場合には、値6が指定されたと判定する。
CPU106は、図8(h)に示されるように、カウントパターンが、1個の4分音符とそれに続く6個の連続する8分音符であると判定した場合には、値7が指定されたと判定する。
CPU106は、図9(i)に示されるように、カウントパターンが、連続する2個の8分音符とそれに続く3個の連続する8分音符であると判定した場合には、値8が指定されたと判定する。
CPU106は、図9(j)に示されるように、カウントパターンが、連続する2個の8分音符とそれに続く2個の連続する4分音符とさらにそれに続く2個の連続する8分音符であると判定した場合には、値9が指定されたと判定する。
次に、図11および図12は、音色変更コマンドのためのPeakのカウントパターンの説明図である。CPU106は、図11の「Command A」として示されるように、ある所定時間範囲tにおけるカウントパターンが、連続する6個の8分音符とそれに続く1個の4分音符であると判定した場合には、「Command A」が指定されたと判定する。「Command A」は、それに続いて音色の上位桁を指定するためのコマンド指定である。従って、図11に示されるように、CPU106は、上記「Command A」が指定された所定時間範囲tに続く次の所定時間範囲t+1において、図5から図9で前述した値0から9のいずれかのカウントパターンを判定することにより、上位桁の値を特定する。
CPU106は、図12の「Command B」として示されるように、ある所定時間範囲tにおけるカウントパターンが、連続する8個の8分音符であると判定した場合には、「Command B」が指定されたと判定する。「Command B」は、それに続いて音色の下位桁を指定するためのコマンド指定である。従って、図12に示されるように、CPU106は、上記「Command B」が指定された所定時間範囲tに続く次の所定時間範囲t+1において、図5から図9で前述した値0から9のいずれかのカウントパターンを判定することにより、下位桁の値を特定する。
CPU106は、上述のようにして、演奏者のブレス117センサの出力(図1)に基づいて「Command A」のブレスパターンの指定とそれに続く値0から9のいずれかの値の指定および「Command B」のブレスパターンの指定とそれに続く値0から9のいずれかの値の指定を判定すると、上位および下位の2桁からなる音色番号に対応する音色への変更を、図1の音源109に指示する。このようにして、演奏者は、モードSW108をonした後のブレスセンサの出力117によって、音色番号00から99までの100通りの音色変更を、電子管楽器のキーマトリクス107(図1)から両手を離すことなく行うことが可能となる。
図13は、システムの動作とガイド音との関係を示す説明図である。本実施形態では、ブレスセンサの出力117に際して、演奏者に所定の時間範囲tにおいて小節および拍の入力タイミングをわかり易くガイドするために、ガイド音が発生させられる。また、各種パターンが認識されたことを示す音も発生させられる。図13は、上述の指定方法に基づく演奏者による音色変更のためのブレスセンサの出力117(図1)に際して、図1のシステムが、どのように動作し、どのようなガイド音を鳴らしながら動作を進行させるかを説明する図である。
まず、所定時間範囲tは、サイクリックに繰り返され、0.5秒ごとにTempo音が刻まれる。すなわち、CPU106は、大きな「×」印のタイミング、すなわち例えば2秒に1回の所定時間範囲tの区切りのタイミングでは、大きな音量によるTempo音(ガイド音)の発音を音源109(図1)に指示する。さらに、CPU106は、小さな「×」印のタイミング、すなわち例えば0.5秒に1回のタイミングでは、小さな音量によるTempo音(ガイド音)の発音を音源109に指示する。
次に、CPU106は、図11または図12に従うブレスパターンを認識すると、認識したことを示すために、下記の発音を音源109に指示する。
図13中の●印:「Command A」を認識した音。
図13中の○印:「Command B」を認識した音。
図13中の■印:「Command A」に続く音色変更上位桁の値0〜9を認識した音。
図13中の□印:「Command B」に続く音色変更下位桁の値0〜9を認識した音。
以上の一連の音の発音に続いて、CPU106は、上位および下位の2桁からなる音色番号に対応する音色への変更を図1の音源109に指示し、この指示に基づいて音源109が音色を変更する。
図14は、音色変更処理のためのレジスタ群(その1)を示す図である。これらのレジスタは、図1のメモリ116上の変数として記憶され、CPU106が後述する図17、図18、および図19のフローチャートで示される音色変更処理を実行する際に使用される。
図14において、レジスタTimer_50μsは、図1のタイマ115からの割込みに基づいて、50μs単位で値0から19までのカウントを行うカウンタレジスタである。CPU106は、このレジスタの値が20になったらその値をゼロクリアし、1msごとに後述するレジスタTimer_1msの値を+1インクリメントさせる。
図14において、レジスタTimer_1msは、1ms単位で値0から1999までのカウントを行う、Tempoを刻むカウンタレジスタである。CPU106は、このレジスタの値が2000になったらその値をゼロクリアし、250msごとに後述するレジスタTimer_250msの値を+1インクリメントさせる。
図14において、レジスタTimer_250msは、250ms単位で値0から7までのカウントを行う、8分音符単位を刻むカウンタである。CPU106は、このレジスタの値が8(2000ms)になったらその値をゼロクリアする。
図14において、レジスタTimer_quaver[Timer_250ms]は、レジスタTimer_250msが示すタイミングごとに、そのタイミングに対する±10msのクオンタイズ範囲を示すためのレジスタである。レジスタTimer_250msが示すタイミングにおいて、レジスタTimer_quaver[Timer_250ms]が示す範囲内にレジスタTimer_1msのカウンタ値でカウントされるPeakが存在すれば、そのレジスタTimer_250msが示すタイミングにPeakが存在することを示すフラグonが設定される。具体的には、レジスタTimer_quaver[0]〜Timer_quaver[7]は、それぞれ下記の範囲を有する。
図14において、レジスタTimer_quaver[0]は、0000〜0010msもしくは1990〜2000msの範囲を出力する。レジスタTimer_250msの値が0のときにこの範囲内にPeakが存在すれば、第1番目の8分音符のタイミングにPeakがあることを示すフラグが所定時間範囲t内の第1番目の区間0に対応して設定される。
図14において、レジスタTimer_quaver[1]は、240〜260msの範囲を出力する。レジスタTimer_250msの値が1のときにこの範囲内にPeakが存在すれば、第2番目の8分音符のタイミングにPeakがあることを示すフラグが所定時間範囲t内の第2番目の区間1に対応して設定される。
図14において、レジスタTimer_quaver[2]は、490〜510msの範囲を出力する。レジスタTimer_250msの値が2のときにこの範囲内にPeakが存在すれば、第3番目の8分音符のタイミングにPeakがあることを示すフラグが所定時間範囲t内の第3番目の区間2に対応して設定される。
図14において、レジスタTimer_quaver[3]は、740〜760msの範囲を出力する。レジスタTimer_250msの値が3のときにこの範囲内にPeakが存在すれば、第3番目の8分音符のタイミングにPeakがあることを示すフラグが所定時間範囲t内の第3番目の区間2に対応して設定される。
図14において、レジスタTimer_quaver[4]は、990〜1010msの範囲を出力する。レジスタTimer_250msの値が4のときにこの範囲内にPeakが存在すれば、第4番目の8分音符のタイミングにPeakがあることを示すフラグが所定時間範囲t内の第4番目の区間3に対応して設定される。
図14において、レジスタTimer_quaver[5]は、1240〜1260msの範囲を出力する。レジスタTimer_250msの値が5のときにこの範囲内にPeakが存在すれば、第5番目の8分音符のタイミングにPeakがあることを示すフラグが所定時間範囲t内の第5番目の区間4に対応して設定される。
図14において、レジスタTimer_quaver[5]は、1240〜1260msの範囲を出力する。レジスタTimer_250msの値が5のときにこの範囲内にPeakが存在すれば、第5番目の8分音符のタイミングにPeakがあることを示すフラグが所定時間範囲t内の第5番目の区間4に対応して設定される。
図14において、レジスタTimer_quaver[6]は、1490〜1510msの範囲を出力する。レジスタTimer_250msの値が6のときにこの範囲内にPeakが存在すれば、第6番目の8分音符のタイミングにPeakがあることを示すフラグが所定時間範囲t内の第6番目の区間5に対応して設定される。
図14において、レジスタTimer_quaver[7]は、1740〜1760msの範囲を出力する。レジスタTimer_250msの値が7のときにこの範囲内にPeakが存在すれば、第7番目の8分音符のタイミングにPeakがあることを示すフラグが所定時間範囲t内の第7番目の区間6に対応して設定される。
次に、図14において、レジスタBress_on_off[Timer_250ms]には、レジスタTimer_250msが示す区間ごとに、上記レジスタTimer_quaver[Timer_250ms]の範囲にPeakが存在すればon、存在しなければoffの値が設定される。
図15は、カウントパターン一致検証用テーブルを示す図であり、図1のメモリ116に記憶される。このテーブルは、1小節を8分音符単位で分割した区間0から7のそれぞれにPeakが存在する(on)または存在しない(off)という組合せ(カウントパターン)ごとに、どのタイプ(図中Type)の情報が指定されたかを示す。CPU106は、図14のレジスタBress_on_off[0]〜Bress_on_off[7]の8個の値を確定させると、この値の組のパターンが図15のカウントパターン一致検証用テーブルのどのTypeに該当するかを判定し、該当するTypeを出力する。CPU106は、Type0〜Type9を判定した場合には、値0〜値9を出力する。CPU106は、TypeEを判定した場合には、「Command A」を出力する。CPU106は、TypeFを判定した場合には、「Command B」を出力する。
図16は、音色変更処理のためのレジスタ群(その2)を示す図である。これらのレジスタは、図14のレジスタ群と同様に、図1のメモリ116上の変数として記憶され、CPU106が後述する図17、図18、および図19のフローチャートで示される音色変更処理を実行する際に使用される。
レジスタSは、図4で説明した予め定められたスレッショルドSを記憶する。なお、この値は、動的に変更されてもよい。
レジスタCommandは、カウントパターンの識別の結果、「Command A」が識別されたか(図11参照)、「Command B」が識別されたかを記憶する。レジスタCommand=Aならば、次に入力されるデータは音色上位桁の値であり(図11参照)、レジスタCommand=Bならば、次に入力されるデータは音色下位桁の値である(図12参照)。
レジスタanは、図3の説明で前述した、図1のA/D変換器114が出力する波高値を記憶する。レジスタbnは、図3の説明で前述した、(1)式または(2)式に基づいて算出される予測値を記憶する。
レジスタPeak検出_flagは、図3の説明で前述したフラグであり、Peak検出状態のときにon、それ以外のときにoffに設定される。
レジスタ音色上位桁は、図11の説明で前述した音色番号の上位桁を記憶する。レジスタ音色上位桁は、図11の説明で前述した音色番号の下位桁を記憶する。
図17は、本実施形態による電子管楽器システムのメイン処理の例を示すフローチャートである。このメイン処理は、図1のCPU106が、内部の特には図示しないROM(リードオンリーメモリ)に記憶されたメイン処理プログラムを実行する動作であり、演奏者が特には図示しない電源ボタンをオンすることにより、その実行が開始される。
図17において、まずCPU106は、各種処理を実行する(ステップS1701)。ここでは、電子管楽器として一般的に実行される処理が実行され、例えば、キーマトリクス107から指定された演奏キーを取り込む処理、ノートオンまたはノートオフを検出して音源109に発音または消音を指示する処理等が実行される。
次に、CPU106は、演奏者が図1のモードSW108をoffからonに切り替えたか否かを判定する(ステップS1702)。ステップS1702の判定がNOならば、CPU106は、演奏者が図1のモードSW108をonからoffに切り替えたか否かを判定する(ステップS1703)。ステップS1703の判定もNOならば、CPU106は、ステップS1701の処理に戻る。
ステップS1702の判定がYESならば、CPU106は、ステップS1704からS1711までの一連の処理を実行する。
CPU106はまず、レジスタTimer_50μs、レジスタTimer_1ms、およびレジスタTimer_250ms(図14参照)のカウント値を、いずれも値0(ゼロ)にリセットする(ステップS1704)。
次に、CPU106は、レジスタBress_on_off[0]〜Bress_on_off[7](図14参照)の各値をoffにリセットする(ステップS1705)。
次に、CPU106は、レジスタCommand(図17参照)の値を「A」に設定する(ステップS1706)。
次に、CPU106は、レジスタ音色上位桁およびレジスタ音色上位桁(図17参照)に、ともに値0を格納する(ステップS1707)。
次に、CPU106は、レジスタS(図17参照)に、所定のスレッショルドの値(A/D値)を設定する(ステップS1708)。
次に、CPU106は、レジスタPeak検出_flag(図17参照)の値を、offに設定する(ステップS1709)。
さらに、CPU106は、レジスタbn(図17参照)の値を、0に初期設定する(ステップS1710)。
最後に、CPU106は、図1のタイマ115に対して、50μsごとの割込み通知の開始を指示する(ステップS1711)。その後、CPU106は、ステップS1701の処理に戻る。
一方、ステップS1703の判定がYESになったならば、CPU106は、図1のタイマ115に対して、ステップS1711で開始を指示した50μsごとの割込み通知の停止を指示する(ステップS1712)。その後、CPU106は、ステップS1701の処理に戻る。
図18は、図17のステップS1711によって開始が指示されたタイマ115による50μsごとの割込み通知によって実行される50μsごと割込処理の例を示すフローチャートである。この割込み処理は、図17のフローチャートで示されるメイン処理に対する割込みにより、図1のCPU106が、内部の特には図示しないROMに記憶された50μs割込み処理プログラムを実行する動作である。
CPU106はまず、図1のA/D変換器114の出力をレジスタanに格納する(ステップS1801)。
次に、CPU106は、レジスタanの値がレジスタbnの値以上であるか否かを判定する(ステップS1802)。
ステップS1802の判定がYESならば、CPU106は、ステップS1803からS1807までの一連の処理を実行する。この場合は、図3の説明で前述したケース1に相当する。
まず、CPU106は、図3の説明で前述したケース1の予測カーブ302のための(1)式に基づいて、次のサンプリングタイミングのための予測値を算出し、その算出値をレジスタbnに格納する(ステップS1803)。
次に、CPU106は、ステップS1803で算出されたレジスタbnの値が0よりも小さいか否かを判定し(ステップS1804)、その判定がYESの場合には、レジスタbnに値0を格納する(ステップS1805)。これは、前述したように、本実施形態では、負側の波形は処理しないためである。
その後、CPU106は、ステップS1801で設定したレジスタanの波高値が、値0でないか否かを判定し(ステップS1806)、この判定がYES(0でない)ならば、レジスタPeak検出_flagにonを設定する。ケース1の場合にPeak検出_flagがonにされることは、図3の説明で前述した。
その後、CPU106は、後述するステップS1816の処理に移行する。
一方、ステップS1802の判定がNOならば、CPU106は、ステップS1808からS1815までの一連の処理を実行する。この場合は、図3の説明で前述したケース2またはケース3に相当する。
まず、CPU106は、レジスタPeak検出_flagにonが設定されているか否かを判定する(ステップS1808)。ステップS1808の判定が、YESならば前述したケース2に対応し、NOならば前述したケース3に対応する。
ステップS1808の判定がYESならば、CPU106は、レジスタanの値がレジスタSに設定されているスレッショルド以上であるか否かを判定する(ステップS1809)。
ステップS1809の判定がNOならば、CPU106は、Peak検出は行わずにステップS1812に移行する(図4参照)。
ステップS1809の判定がYESならば、CPU106は、レジスタTimer_1msの値が、現在のレジスタTimer_250msの値に対応するレジスタTimer_quaver[Timer_250ms]が示す値範囲内にあるか否かを判定する(図14参照)(ステップS1810)。ステップS1810の判定がNOならば、CPU106は、演奏者のブレス入力117(図1)のタイミングが拍のタイミングに合わないため、Peak検出は行わずにステップS1812に移行する(図10の1001参照)。
ステップS1809の判定がYESならば、CPU106は、現在のレジスタTimer_250msの値が示す区間に対応するレジスタBress_on_off[Timer_250ms]の値をonに設定する(ステップS1811)。
その後、CPU106は、図3の説明で前述したケース2の予測カーブ302のための(2)式に基づいて、次のサンプリングタイミングのための予測値を算出し、その算出値をレジスタbnに格納する(ステップS1812)。
次に、CPU106は、ステップS1812で算出されたレジスタbnの値が0よりも小さいか否かを判定し(ステップS1813)、その判定がYESの場合には、レジスタbnに値0を格納する(ステップS1814)。これは、前述したように、本実施形態では、負側の波形は処理しないためである。
その後、CPU106は、レジスタPeak検出_flagにoffを設定する。ケース2の場合にPeak検出_flagがoffにされることは、図3の説明で前述した。
その後、CPU106は、後述するステップS1816の処理に移行する。
一方、ステップS1808の判定がYESならば、図3の説明で前述したケース3に相当するため、CPU106は、ステップS1809からS1811までのPeak検出のための処理をスキップし、前述したステップS1812からS1815までの、レジスタbnの更新処理とレジスタPeak検出_flagをoffにする処理のみを実行する。
ステップS1806、S1807またはステップS1815の処理の後、CPU106は、レジスタTimer_50μsの値を+1インクリメントする(ステップS1816)。
CPU106は、ステップS1816でインクリメントしたレジスタTimer_50μsの値がTempo分解能(図10参照)の1msに対応する値20以上となったか否かを判定する(ステップS1817)。
ステップS1817の判定がNOならば、CPU106は、図18のフローチャートで例示される50μsごと割込処理から図17のフローチャートで例示されるメイン処理にリターンする。
ステップS1817の判定がYESで所定時間範囲tでのPeak検出が終了したならば、CPU106は、図19のフローチャートで示される1msごと処理を実行する。
まず、CPU106は、レジスタTimer_50μsの値を0にリセットする(ステップS1901)。
次に、CPU106は、レジスタTimer_1msの値を+1インクリメントする(ステップS1902)。
次に、CPU106は、ステップS1902でインクリメントされたレジスタTimer_1msの値が、所定時間範囲t(図10または図13等参照)の末尾に対応する値2000以上となったか否かを判定する(ステップS1903)。
ステップS1903の判定がNOならば、CPU106は、レジスタTimer_1msの値を500で割った余りが0であるか否か、すなわち、500ms(0.5sec(秒))ごとの区切りの拍タイミングになったか否かを判定する(ステップS1904)。ステップS1904の判定がYESならば、図13の説明で前述したように、小さな「×」印の拍タイミングになったため、CPU106は、小さな音量によるTempo音(ガイド音)の発音を音源109に指示する(ステップS1905)。
その後、CPU106は、レジスタTimer_1msの値を250で割った余りが0であるか否か、すなわち、250msごとの区切りの拍タイミングになったか否かを判定する(ステップS1906)。ステップS1906の判定がYESならば、CPU106は、レジスタTimer_250msの値を+1インクリメントする(ステップS1907)。
その後、CPU106は、図18および図19のフローチャートで例示される50μsごと割込処理から図17のフローチャートで例示されるメイン処理にリターンする。
レジスタTimer_1msの値が所定時間範囲tの末尾に対応する値2000に到達しステップS1903の判定がYESになると、まずCPU106は、レジスタTimer_1msの値を0にリセットする(ステップS1908)。
次に、図13の説明で前述したように、大きな「×」印の小節区切りのタイミングになったため、CPU106は、大きな音量によるTempo音(ガイド音)の発音を音源109に指示する(ステップS1909)。
次に、CPU106は、レジスタTimer_250msの値を0にリセットする(ステップS1910)。
次に、図15の説明で前述したように、所定時間範囲tの終了で確定しているレジスタBress_on_off[0]〜Bress_on_off[7]の8個の値の組のパターンが、図15のカウントパターン一致検証用テーブルの、Type0〜9、TypeE、またはTypeFのいずれかと一致するか否かを判定する(ステップS1911)。
ステップS1911の判定がYESならば、CPU106は、上記パターンが図15のTypeEと一致したか否かを判定し(ステップS1912)、この判定がYESならば、図13の説明で前述したように、CPU106は、図13中の●印に対応する「Command A」を認識した音の発音を、図1の音源109に指示する(ステップS1913)。また、CPU106は、レジスタCommandにAを設定する(ステップS1914)。
ステップS1907の判定がYESならば、上記パターンが図15のTypeFと一致したか否かを判定し(ステップS1915)、この判定がYESならば、図13の説明で前述したように、CPU106は、図13中の○印に対応する「Command B」を認識した音の発音を、図1の音源109に指示する(ステップS1916)。また、CPU106は、レジスタCommandにBを設定する(ステップS1917)。
ステップS1915の判定がYESならば、レジスタCommandの値がAであるか否かを判定する(ステップS1918)。
ステップS1918の判定がYESならば、図13の説明で前述したように、CPU106は、図13中の■印に対応する「Command A」に続く音色変更上位桁の値0〜9を認識した音の発音を、図1の音源109に指示する(ステップS1919)。また、CPU106は、レジスタ音色上位桁に、ステップS1911で判定されたType0〜9のいずれかに対応する「値」を設定する(ステップS1920)。
ステップS1918の判定がNOならば、図13の説明で前述したように、CPU106は、図13中の□印に対応する「Command B」に続く音色変更下位桁の値0〜9を認識した音の発音を、図1の音源109に指示する(ステップS1921)。また、CPU106は、レジスタ音色下位桁に、ステップS1911で判定されたType0〜9のいずれかに対応する「値」を設定する(ステップS1922)。
ステップS1922までで音色番号の上位桁および下位桁が確定したため、CPU106は、レジスタ音色上位桁とレジスタ音色上位桁の各値で定まる音色番号への音色の変更を、図1の音源109に指示する(ステップS1923)。
ステップS1914、S1917、S1920、またはS1923の処理の後、CPU106は、レジスタBress_on_off[0]〜Bress_on_off[7](図14参照)の各値をoffにリセットする(ステップS1924)。
その後、CPU106は、図18および図19のフローチャートで例示される50μsごと割込処理から図17のフローチャートで例示されるメイン処理にリターンする。
以上のようにして、本実施形態では、簡単な操作と簡単な回路構成で、音色の切換えなどの状態を切り替えることができる電子管楽器を提供することが可能となる。
なお、本実施形態では、音色の切換えを例に記載したが、音色のみならず、例えばピッチベンドレンジなどリアルタイム性を有する楽音パラメータのファンクション切換えなどに適用することが可能である。
また、本実施形態は電子管楽器に適用した例について説明したが、両手を常に使用するようなタイプの電子楽器であれば、電子管楽器以外に適用することも可能である。
Peak検出の例としては、図3および図4で説明した方式を例として説明したが、Peak検出の手法としては様々な方式を採用可能である。
本実施形態では、固定時間長のTempoによりブレス入力を行うように構成されたが、ブレスそのものによってTempoを切り替えるなどの応用に対しても展開できる。
以上の実施形態に関して、更に以下の付記を開示する。
(付記1)
演奏操作を検出するセンサと、
前記センサによる演奏操作の検出に応答して、音源に対して発音を指示する発音指示手段と、
予め定められた時間内における前記センサにより検出された演奏操作の回数及びタイミングに基づいて、前記演奏操作のパターンを識別する識別手段と、
前記識別手段により識別された演奏操作のパターンに対応して、発音すべき楽音のパラメータを制御する制御手段と、
を備えた電子楽器。
(付記2)
前記電子楽器はさらに、予め定められた特定モードに設定するモード設定手段を有し、
前記モード設定手段により前記特定のモードに設定されているときのみ、前記識別手段及び制御手段の動作を有効にする、付記1に記載の電子楽器。
(付記3)
前記電子楽器は、前記モード設定手段により特定のモードが設定されているときに、前記予め定められたタイミングで第1のガイド音を発生するとともに、前記予め定められた時間間隔で第2のガイド音を発生するガイド音生成手段を有する、付記2に記載の電子楽器。
(付記4)
前記識別手段は、夫々異なる演奏操作の回数及びタイミングから成る複数種の演奏操作パターンを記憶したメモリを有し、前記メモリに記憶された複数の演奏操作パターンのいずれかと前記センサにより検出された演奏操作の回数及びタイミングに基づく演奏操作パターンとが一致するか否か判別することにより、前記演奏操作のパターンを識別する、付記1乃至3のいずれかに記載の電子楽器。
(付記5)
前記識別手段は、前記メモリに記憶された複数の演奏操作パターンのいずれかと前記センサにより検出された演奏操作の回数及びタイミングに基づく演奏操作パターンとが一致したときに、当該一致した演奏パターンに対応する識別音を発生する識別音発生手段を有する付記4に記載の電子楽器。
(付記6)
前記センサは、演奏操作として演奏者のブレス入力の有無を検知する、付記1乃至5のいずれかに記載の電子楽器。
(付記7)
前記制御手段は、前記楽音のパラメータとして、当該楽音の音色を制御する、付記1乃至6のいずれかに記載の電子楽器。
(付記8)
演奏操作を検出するセンサを有する電子楽器に用いるパラメータ制御方法であって、前記電子楽器が、
前記センサによる演奏操作の検出に応答して、音源に対して発音を指示し、
予め定められた時間内における前記センサにより検出された演奏操作の回数及びタイミングに基づいて、前記演奏操作のパターンを識別し、
前記識別された演奏操作のパターンに対応して、発音すべき楽音のパラメータを制御する、パラメータ制御方法。
(付記9)
演奏操作を検出するセンサを有する電子楽器として用いるコンピュータに、
前記センサによる演奏操作の検出に応答して、音源に対して発音を指示するステップと、
予め定められた時間内における前記センサにより検出された演奏操作の回数及びタイミングに基づいて、前記演奏操作のパターンを識別するステップと、
前記識別された演奏操作のパターンに対応して、発音すべき楽音のパラメータを制御するステップと、
を実行させるプログラム。