(57)【要約】【課題】簡単な手段によって高速で波長変換を行うことが可能な波形生成装置を提供する。【解決手段】ピッチ変換部３は、補間手段と、合計値算出手段と、量子化手段とを備えている。補間手段は、ＰＤＭ信号を構成する各１ビット信号の間にゼロ値を補間する。合計値算出手段は、ゼロ値補間後のデータ列をブロック単位で読み出し、各ブロックごとにＰＤＭ信号のビット値とピッチ変換倍数との乗算値を合計した合計値を算出する。量子化手段は、各ブロックにおける合計値に基づいて量子化を行い、各ブロックに１または０の値を割り当てて出力する。【選択図】図１
2008216916.tif 000002
【特許請求の範囲】
【請求項１】
波形データが記憶されている波形メモリと、前記波形データに基づいて生成される波形のピッチをＮ／Ｍ倍に変換するためのピッチ変換部とを有する波形生成装置において、
前記ピッチ変換部は、
前記波形データから得られるＰＤＭ（Pulse  Density Modulation；パルス密度変調）信号を構成する各１ビット信号の間に、Ｎ−１個のゼロ値を補間する補間手段と、
前記補間手段で補間された後のデータ列を、Ｍ個のビットを含むブロックを１単位として順次読み出し、各ブロックごとに、ＮおよびＭの値で定まるビット位置のビット値とＮの値との乗算値を合計した合計値Ｘを算出する合計値算出手段と、
当該ブロックにおける合計値Ｘと１つ前のブロックでの量子化で得られた余り値とを加算した合計値Ｙに対して、Ｍの値を閾値として量子化を行うことにより、各ブロックに１または０の値を割り当てて当該値を出力するとともに、当該量子化で得られた余り値を次のブロックの合計値Ｘに加算する量子化手段と、
を備えたことを特徴とする波形生成装置。
【請求項２】
請求項１に記載の波形生成装置において、
前記量子化手段をΔΣ変調器から構成したことを特徴とする波形生成装置。
【請求項３】
請求項１または請求項２に記載の波形生成装置と、
前記波形生成装置で生成された音の波形に対して、所定の信号処理を行う信号処理部と、
前記信号処理部で処理された信号に基づいて音を出力する出力部と、
を備えたことを特徴とする音源用シンセサイザ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、波形メモリに記憶されている波形データを読み出して所定の波形を生成する波形生成装置、およびそれを用いた音源用シンセサイザに関するものである。
【背景技術】
【０００２】
一般に、音源用シンセサイザは、楽器の音をサンプリングして得られる波形データを記憶した波形メモリを備え、この波形メモリから読み出した波形データに対して所定の処理を行い、楽音を出力するように構成されている。波形データはデジタル値で表現されるが、波をデジタル表現する変調方式として代表的なものにＰＣＭ（Pulse Code Modulation）方式がある。ＰＣＭ方式では、それぞれの時刻における波の高さが数値で表現される。このようなデジタル値で表現された波は、数学的手法によって波長の変換が可能である。波長変換は、楽音の音程を上げたり下げたりする場合に必要となる処理である。
【０００３】
図１０は、ＰＣＭ方式により変調された波形を示す図であり、Ｗ１は波形メモリに記憶されているＰＣＭ波形、Ｗ２はＷ１を波長変換した場合のＰＣＭ波形である。Ｗ１の波長λに対して、Ｗ２の波長はλ×ｎ（ｎ倍）に変換されている。なお、ここでは便宜上、ＰＣＭ波形Ｗ１，Ｗ２を連続波として描いてあるが、実際のＰＣＭ波形Ｗ１，Ｗ２はもちろん連続波ではなく、所定時間間隔でサンプリングされた離散的な信号となる。
【０００４】
このような波長変換を行うための代表的な手法として、もとの波形のサンプリング時間間隔を１／ｎにしてサンプル値を読み出す方法がある。この場合、サンプリングのタイミングによっては、サンプル値が波形メモリに存在しないことがあるので、サンプル総数が少なくなって波形の誤差が大きくなる。このため、補間処理によって仮想的なサンプル値を生成する必要がある。後掲の特許文献１には、このような補間処理の機能を備えた楽音生成装置が記載されている。
【０００５】
補間の手法として最も単純なものは、波形上の２点の波の高さと時間間隔から幾何学的に２点間の補間点を求める２点直線補間である。しかし、この方法は単純な波形の場合には有効であるが、波形が複雑になると補間の精度が低下するという欠点がある。そこで、複雑な波形の場合には、もう少し高度な補間処理を行う必要がある。このための手法の１つに、Shannonのサンプリング定理を応用して、ローパスフィルタのインパルス応答による畳み込み演算を行うことにより補間を行う方法がある。しかしながら、畳み込み演算を行うには複雑な回路を必要とし、回路が大規模になってコストが増加するという問題がある。
【０００６】
一方、波長変換の他の手法として、後掲の非特許文献１に示されているような一般調和解析を用いたピッチ変換方法がある。一般調和解析は、観測窓内で原波形から残差成分が最小となる正弦波を抽出し、残差成分に対して同様の処理を繰り返す解析方法であって、正確な周波数成分の抽出が可能であるという利点を有している。しかしながら、この方法では計算量が多くなり処理に時間がかかるという問題がある。
【０００７】
【特許文献１】特開２００３−２３３３７８号公報
【非特許文献１】「一般調和解析を用いた高速１ｂｉｔ音響信号の時間軸圧伸・ピッチ変換」（林雅尚・山崎芳男・及川靖広、日本音響学会講演論文集、６０３−６０４頁、１９９６年９月）
【発明の開示】
【発明が解決しようとする課題】
【０００８】
以上のように、従来の波長変換方法では、回路が複雑になったり処理に時間を要するという問題があった。そこで、本発明は、簡単な手段によって高速で波長変換を行うことが可能な波形生成装置を提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明に係る波形生成装置は、波形データが記憶されている波形メモリと、その波形データに基づいて生成される波形のピッチをＮ／Ｍ倍に変換するためのピッチ変換部とを有する波形生成装置であって、ピッチ変換部は、補間手段と、合計値算出手段と、量子化手段とを備えている。補間手段は、波形データから得られるＰＤＭ（Pulse Density Modulation；パルス密度変調）信号を構成する各１ビット信号の間に、Ｎ−１個のゼロ値を補間する。合計値算出手段は、補間手段で補間された後のデータ列を、Ｍ個のビットを含むブロックを１単位として順次読み出し、各ブロックごとに、ＮおよびＭの値で定まるビット位置のビット値とＮの値との乗算値を合計した合計値Ｘを算出する。量子化手段は、当該ブロックにおける合計値Ｘと１つ前のブロックでの量子化で得られた余り値とを加算した合計値Ｙに対して、Ｍの値を閾値として量子化を行うことにより、各ブロックに１または０の値を割り当てて当該値を出力するとともに、当該量子化で得られた余り値を次のブロックの合計値Ｘに加算する。
【００１０】
このような本発明においては、ＰＤＭ信号を構成する１ビット信号のピッチを補間処理によってずらし、補間後のデータ列をブロック単位で読み出してブロックごとに量子化を行うことにより、１ビット信号のままでピッチを変換することができる。このため、畳み込み演算や一般調和解析などの複雑な演算処理が不要となり、簡単な手段によってピッチ変換処理を高速に行うことができる。また、ＮおよびＭの値を任意に設定することで、所望のピッチを有する波形を容易に得ることが可能となる。
【００１１】
本発明の好ましい実施形態では、量子化手段としてΔΣ変調器が用いられる。これによると、専用の演算回路を設計しなくても、既存のΔΣ変調器の機能を利用して、量子化や余り値の加算処理を容易に実現することができる。
【００１２】
本発明に係る音源用シンセサイザは、上述した波形生成装置と、この波形生成装置で生成された音の波形に対して、所定の信号処理を行う信号処理部と、この信号処理部で処理された信号に基づいて音を出力する出力部とを備える。取り扱う音としては、楽音に限らず、人の声や擬似音など、あらゆる音を対象とすることができる。
【発明の効果】
【００１３】
本発明によれば、ＰＤＭ信号の波形に対して、複雑な処理を必要とせずに高速で波長変換を行うことができる効果がある。
【発明を実施するための最良の形態】
【００１４】
図１は、本発明の実施形態による音源用シンセサイザの全体構成を示すブロック図である。１は、楽音の波形データを記憶した波形メモリであって、例えば、図３（ａ）に示すようなＰＣＭ信号の波形データが記憶されている。ここでも、便宜上ＰＣＭ波形を連続波で描いてあるが、実際のＰＣＭ波形はサンプリングされた離散的な信号となる。なお、波形メモリ１に記憶される波形データは、ＰＣＭ信号に限らず後述するＰＤＭ信号であってもよい。
【００１５】
２は、信号変換を行うＰＣＭ／ＰＤＭ変換部であって、波形メモリ１から読み出された図３（ａ）のＰＣＭ信号を図３（ｂ）のような２値のＰＤＭ信号に変換する。この変換は、公知のデルタ・シグマ（ΔΣ）変調により行われる。なお、波形メモリ１に記憶されている波形データがＰＤＭ信号である場合は、このＰＣＭ／ＰＤＭ変換部２は不要となる。
【００１６】
３は、本発明の要部であるピッチ変換部であって、ＰＣＭ／ＰＤＭ変換部２から出力されるＰＤＭ信号を構成する１ビット信号に対してピッチ変換を行う。図２は、ピッチ変換部３の構成を表した図である。実際には、ピッチ変換部３の各機能はソフトウェアにより実現されるが、ここでは便宜上ハードウェアで表してある。３ａは重み付け部であって、ＰＤＭ信号のピッチをＮ／Ｍ倍に変換する場合に、ユーザにより指定されたＮの値の設定を行う。３ｂはゼロ値補間部であって、ＰＤＭ信号の各１ビット信号間に、１ビット信号としてＮ−１個の０値を補間する。３ｃは合計値算出部であって、ゼロ値補間後のデータ列を、Ｍ個のビットを含むブロックを１単位として順次読み出し、各ブロックごとに、ＮとＭの値で定まるビット位置のビット値とＮの値との乗算値を合計した合計値を算出する。３ｄは量子化部であって、後述する量子化処理により各ブロックに１または０の値を割り当てて出力する。
【００１７】
上述した波形メモリ１、ＰＣＭ／ＰＤＭ変換部２およびピッチ変換部３によって、波形生成装置１００が構成される。また、ピッチ変換部３におけるゼロ値補間部３ｂ、合計値算出部３ｃ、量子化部３ｄは、それぞれ本発明における補間手段、合計値算出手段、量子化手段の一実施形態を構成している。
【００１８】
４は、波形生成装置１００で生成された波形に対して所定の信号処理を行う信号処理部である。信号処理部４では、ピッチ変換部３でピッチ変換されたＰＤＭ信号をローパスフィルタに通すことによりＰＣＭ信号に変換する。また、信号処理部４には、ＰＣＭ信号に対しカットオフ周波数を時間的に変化させて音色を制御する時変フィルタ部や、時変フィルタ部の出力に対してゲインを時間的に変化させて減衰処理を行う時変増幅部、複数の音を合成するためのミキシング処理を行うミキサなどが設けられる。
【００１９】
５は、信号処理部４で処理された信号に基づいて音を出力する出力部であって、例えば信号処理部４から出力されるＰＣＭ信号が楽音信号の場合は、図示しないスピーカから楽音を出力する。
【００２０】
ピッチ変換部３における量子化部３ｄは、デルタ・シグマ（ΔΣ）変換を行う公知のΔΣ変調器により構成することができる。図４は、ΔΣ変調器５０の一例を示すブロック図である。５１は入力値と出力フィードバック値との差分を演算する演算器、５２は演算器５１の出力と遅延回路５３の出力とを加算する演算器である。遅延回路５３は、入力される信号を１サンプリング期間だけ保持し、次のサンプリングで、保持した信号を出力する。演算器５２と遅延回路５３は積分器５６を構成する。５４は積分器５６の出力に対してＭを閾値として量子化を行う量子化回路であって、入力値がＭ以上であれば「１」を出力し、入力値がＭ未満であれば「０」を出力する。５５はフィードバックゲインがτに設定されている乗算器である。
【００２１】
図５は、本発明によるピッチ変換の原理を示した図である。図５を参照して、まず本発明の原理を説明する。
【００２２】
図５の（ａ）は、波形メモリ１に記憶されている元のＰＣＭ信号の波形（波長λ１）と、これに対応するＰＤＭ信号の波形を示している。（ｂ）は、ピッチ変換した後のＰＣＭ信号（波長λ２）と、これに対応するＰＤＭ信号の波形を示している。なお、図ではＰＤＭ信号の波形は簡略化して描かれている。（ｃ）は、（ａ）のＰＣＭ信号の破線で囲んだ部分の拡大図であり、Ｑ１〜Ｑ６は、各サンプリング時点でのサンプル値を表している。点線は、サンプリング区間をＭ分割（例えばＭ＝５）した場合の各時点における仮想サンプル値であって、実データではない。（ｄ）は、（ｃ）のＰＣＭ信号に対応するＰＤＭ信号のビット値を示しており、実線が１、破線が０を表している。便宜上、各ビット値はサンプル値Ｑ１〜Ｑ６と同じタイミングで図示してある。網掛で示した数字は、各サンプリング区間におけるビット値であり、実線と破線で示されるビット値と一致している。
【００２３】
図５（ａ）の波形から図５（ｂ）の波形を得るには、まず、ＰＤＭ信号を構成する各１ビット信号の間にゼロ値を補間する。今、波形のピッチをＮ／Ｍ倍（λ２＝λ１×Ｎ／Ｍ）に変換する場合は、元のＰＤＭ信号の１ビット信号間に、Ｎ−１個の「０」を補間する。例えば、Ｎ＝９とすると、（ｆ）で示したように、１ビット信号間に８個の「０」が挿入される。この結果、（ｄ）における実線と破線のビット値が、（ｆ）のようにずれてゆく。但し、各ビット間の間隔は一定（Ｎ＝９）である。
【００２４】
次に、図５（ｆ）において、各サンプリング区間のデータ列（補間ゼロ値を含むＭ個のデータ）を１ブロックとして、ブロック単位で順次データ列を読み出す。そして、各ブロックに含まれる実線と破線のビット値（１または０）とＮの値を用いて後述する演算を行い、その演算結果に基づき各ブロックに１または０を割り当てる。網掛で示した数字が、この割り当てられたビット値を表している。ピッチを伸長する場合は、同じサンプリング時点でのＰＣＭ信号の波の高さが小さくなるので、これに応じてＰＤＭ信号のビット値も元のＰＤＭ信号のビット値から変化する。この変化後のビット値から構成されるＰＤＭ信号に対応したＰＣＭ信号は図５（ｅ）のようになり、これは（ｂ）に示したＰＣＭ信号の破線で囲んだ部分に該当する。したがって、（ｆ）で得られた網掛のデータ列からなるＰＤＭ信号をローパスフィルタに通してＰＣＭ信号に戻すことによって、波長がＮ／Ｍ倍に変換された（ｂ）のＰＣＭ信号を得ることができる。
【００２５】
図６は、ゼロ値補間の様子を詳細に示した図である。ここでは、Ｍ＝８、Ｎ＝９として、ピッチをＮ／Ｍ＝９／８倍に伸長する場合の例を挙げている。（ａ）はもとのＰＤＭ信号を構成するビット信号のデータ列、（ｂ）は（ａ）のデータ列の各ビット信号間にＮ−２＝７個の「０」を補間したデータ列、（ｃ）は（ａ）のデータ列の各ビット信号間にＮ−１＝８個の「０」を補間したデータ列を示している。（ｂ）は参考例として挙げたもので、本発明ではこのデータ列は用いない。また、（ｃ）のデータ列に補間された「０」は、ＰＤＭ信号のビット信号（網掛部分）を所定ビットずらすためだけに挿入されたものであり、後述する演算処理には用いられない。図５でも述べたように、補間後の（ｃ）のデータ列は、サンプリング区間に相当するＭ個（＝８個）のビットを含むブロックを１ブロックとして、ブロック単位で読み出される。
【００２６】
次に、上述した原理に基づく本発明のピッチ変換方法の詳細について、具体例に即して説明する。図７は、図１のピッチ変換部３におけるピッチ変換の手順を示したフローチャートである。図８はピッチを伸ばす場合のデータ演算の例を示した図、図９はピッチを縮める場合のデータ演算の例を示した図である。
【００２７】
最初に、ピッチを伸ばす場合につき、図８（Ａ）を例に挙げてピッチ変換手順を説明する。図８（Ａ）において、（ａ）は第１ブロック、（ｂ）は第２ブロック、（ｃ）は第３ブロック、（ｄ）は第４ブロックを表している。
【００２８】
図７のステップＳ１では、変数の初期化を行う。変数としては、ピッチ変換部３に入力される入力値ｉｎ、ピッチ変換部３から出力される出力値ｏｕｔ、図８の各ブロック内におけるビット位置を指定するカーソル値ｐｏｓ、および各ブロックごとに算出される後述の合計値ｓｕｍがある。初期化により、これらの変数は全て０となる。
【００２９】
ステップＳ２では、カーソル値ｐｏｓがＭ以上か否かが判定される。図８（Ａ）は、ピッチを９／８倍にする場合であり、ＮとＭの値はそれぞれＮ＝９、Ｍ＝８に設定される。最初はｐｏｓ＝０であるから、ｐｏｓ＜Ｍであり（ステップＳ２：ＮＯ）、ステップＳ９へ移行して第１ブロック（ａ）のデータを入力値ｉｎに読み込む。続いて、ステップＳ１０でカーソル値ｐｏｓにＮ（＝９）を加算する。これにより、第１ブロック（ａ）におけるｐｏｓは０＋９＝９となる。次に、ステップＳ１１で、読み込んだ第１ブロック（ａ）の先頭（ｐｏｓ＝０）のビット値「１」とＮ（＝９）を乗算し、これを合計値ｓｕｍ（＝０）に加算して、合計値ｓｕｍを更新する。これにより、第１ブロック（ａ）におけるｓｕｍは、０＋１×９＝９となる。その後、ステップＳ７で後続のデータの有無をみて、データがあれば（ステップＳ７：ＹＥＳ）ステップＳ２へ戻り、データがなければ（ステップＳ７：ＮＯ）処理を終了する。
【００３０】
今の場合は、後続データがあるのでステップＳ２へ戻り、再びｐｏｓがＭ（＝８）以上か否かが判定される。上述したように、この時点ではｐｏｓ＝９となっているので、ｐｏｓ≧Ｍとなり（ステップＳ２：ＹＥＳ）、ステップＳ３へ移行する。ステップＳ３では、ｐｏｓ（＝９）からＭ（＝８）を減算して、ｐｏｓの値を更新する。これにより、ｐｏｓ＝１となる。続いて、ステップＳ４へ進み、合計値ｓｕｍがＭ（＝８）以上か否かが判定される。上述したように、この時点ではｓｕｍ＝９となっているので、ｓｕｍ≧Ｍとなり（ステップＳ４：ＹＥＳ）、ステップＳ５へ移行する。ステップＳ５では、出力値ｏｕｔに「１」を書き込むとともに、ｓｕｍ（＝９）からＭ（＝８）を減算して、合計値を更新する。これにより、ｓｕｍ＝１となる。この値は本発明における余り値に相当している。余り値は、次のブロックへ繰り越されて加算される。また、ステップＳ４、Ｓ５、Ｓ８の処理は、本発明における量子化に相当している。続くステップＳ６では、出力値ｏｕｔ（＝１）を出力する。その後、ステップＳ７で後続のデータの有無をみて、データがあるので（ステップＳ７：ＹＥＳ）、ステップＳ２へ戻る。
【００３１】
ステップＳ２で、再びｐｏｓがＭ（＝８）以上か否かが判定されるが、この時点ではｐｏｓ＝１となっているので、ｐｏｓ＜Ｍであり（ステップＳ２：ＮＯ）、ステップＳ９へ移行して第２ブロック（ｂ）のデータを入力値ｉｎに読み込む。続いて、ステップＳ１０でカーソル値ｐｏｓ（＝１）にＮ（＝９）を加算する。これにより、第２ブロック（ｂ）におけるｐｏｓは１＋９＝１０となる。次に、ステップＳ１１で、読み込んだ第２ブロック（ｂ）の先頭から２ビット目（ｐｏｓ＝１）のビット値「０」とＮ（＝９）を乗算し、これを合計値ｓｕｍ（＝１）に加算して、合計値ｓｕｍを更新する。これにより、第２ブロック（ｂ）におけるｓｕｍは、１＋０×９＝１となる。その後、ステップＳ７で後続のデータの有無をみて、データがあるので（ステップＳ７：ＹＥＳ）、ステップＳ２へ戻る。
【００３２】
ステップＳ２で、再びｐｏｓがＭ（＝８）以上か否かが判定されるが、この時点ではｐｏｓ＝１０となっているので、ｐｏｓ≧Ｍとなり（ステップＳ２：ＹＥＳ）、ステップＳ３へ移行する。ステップＳ３では、ｐｏｓ（＝１０）からＭ（＝８）を減算して、ｐｏｓの値を更新する。これにより、ｐｏｓ＝２となる。続いて、ステップＳ４へ進み、合計値ｓｕｍがＭ（＝８）以上か否かが判定される。この時点ではｓｕｍ＝１となっているので、ｓｕｍ＜Ｍとなり（ステップＳ４：ＮＯ）、ステップＳ８へ移行する。ステップＳ８では、出力値ｏｕｔに「０」を書き込み、続くステップＳ６で、出力値ｏｕｔ（＝０）を出力する。その後、ステップＳ７で後続のデータの有無をみて、データがあるので（ステップＳ７：ＹＥＳ）、ステップＳ２へ戻る。
【００３３】
ステップＳ２で、再びｐｏｓがＭ（＝８）以上か否かが判定されるが、この時点ではｐｏｓ＝２となっているので、ｐｏｓ＜Ｍであり（ステップＳ２：ＮＯ）、ステップＳ９へ移行して第３ブロック（ｃ）のデータを入力値ｉｎに読み込む。続いて、ステップＳ１０でカーソル値ｐｏｓ（＝２）にＮ（＝９）を加算する。これにより、第３ブロック（ｃ）におけるｐｏｓは２＋９＝１１となる。次に、ステップＳ１１で、読み込んだ第３ブロック（ｃ）の先頭から３ビット目（ｐｏｓ＝２）のビット値「１」とＮ（＝９）を乗算し、これを合計値ｓｕｍ（＝１）に加算して、合計値ｓｕｍを更新する。これにより、第３ブロック（ｃ）におけるｓｕｍは、１＋１×９＝１０となる。その後、ステップＳ７で後続のデータの有無をみて、データがあるので（ステップＳ７：ＹＥＳ）、ステップＳ２へ戻る。
【００３４】
ステップＳ２で、再びｐｏｓがＭ（＝８）以上か否かが判定されるが、この時点ではｐｏｓ＝１１となっているので、ｐｏｓ≧Ｍとなり（ステップＳ２：ＹＥＳ）、ステップＳ３へ移行する。ステップＳ３では、ｐｏｓ（＝１１）からＭ（＝８）を減算して、ｐｏｓの値を更新する。これにより、ｐｏｓ＝３となる。続いて、ステップＳ４へ進み、合計値ｓｕｍがＭ（＝８）以上か否かが判定される。この時点ではｓｕｍ＝１０となっているので、ｓｕｍ≧Ｍとなり（ステップＳ４：ＹＥＳ）、ステップＳ５へ移行する。ステップＳ５では、出力値ｏｕｔに「１」を書き込むとともに、ｓｕｍ（＝１０）からＭ（＝８）を減算して、合計値を更新する。これにより、ｓｕｍ＝２となる。その後、ステップＳ７で後続のデータの有無をみて、データがあるので（ステップＳ７：ＹＥＳ）、ステップＳ２へ戻る。
【００３５】
ステップＳ２で、再びｐｏｓがＭ（＝８）以上か否かが判定されるが、この時点ではｐｏｓ＝３となっているので、ｐｏｓ＜Ｍであり（ステップＳ２：ＮＯ）、ステップＳ９へ移行して第４ブロック（ｄ）のデータを入力値ｉｎに読み込む。続いて、ステップＳ１０でカーソル値ｐｏｓ（＝３）にＮ（＝９）を加算する。これにより、第４ブロック（ｄ）におけるｐｏｓは３＋９＝１２となる。次に、ステップＳ１１で、読み込んだ第４ブロック（ｄ）の先頭から４ビット目（ｐｏｓ＝３）のビット値「０」とＮ（＝９）を乗算し、これを合計値ｓｕｍ（＝２）に加算して、合計値ｓｕｍを更新する。これにより、第４ブロック（ｄ）におけるｓｕｍは、２＋０×９＝２となる。その後、ステップＳ７で後続のデータの有無をみて、データがあれば（ステップＳ７：ＹＥＳ）ステップＳ２へ戻り、データがなければ（ステップＳ７：ＮＯ）処理を終了する。
【００３６】
以上述べたような要領で、後続する第５ブロック以降の各ブロックについても同様の処理を行う。この結果、ピッチ変換部３からは、ＰＤＭ信号を構成する「１０１０・・・」のビット信号が出力される。そして、このＰＤＭ信号をローパスフィルタに通すことにより、ピッチ（波長）が９／８倍に変換されたＰＣＭ信号が得られる。
【００３７】
次に、図８（Ｂ）の例について説明する。図８（Ｂ）においても、（ａ）〜（ｄ）は第１ブロック〜第４ブロックを表している。
【００３８】
最初、図７のステップＳ１で変数の初期化を行う。次のステップＳ２では、カーソル値ｐｏｓがＭ以上か否かが判定される。図８（Ｂ）はピッチを１７／８倍にする場合であり、ＮとＭの値はそれぞれＮ＝１７、Ｍ＝８に設定される。最初はｐｏｓ＝０であるから、ｐｏｓ＜Ｍであり（ステップＳ２：ＮＯ）、ステップＳ９へ移行して第１ブロック（ａ）のデータを入力値ｉｎに読み込む。続いて、ステップＳ１０でカーソル値ｐｏｓにＮ（＝１７）を加算する。これにより、第１ブロック（ａ）におけるｐｏｓは０＋１７＝１７となる。次に、ステップＳ１１で、読み込んだ第１ブロック（ａ）の先頭（ｐｏｓ＝０）のビット値「１」とＮ（＝１７）を乗算し、これを合計値ｓｕｍ（＝０）に加算して、合計値ｓｕｍを更新する。これにより、第１ブロック（ａ）におけるｓｕｍは、０＋１×１７＝１７となる。その後、ステップＳ７で後続のデータの有無をみて、データがあるので（ステップＳ７：ＹＥＳ）、ステップＳ２へ戻る。
【００３９】
ステップＳ２では、再びｐｏｓがＭ（＝８）以上か否かが判定され、この時点ではｐｏｓ＝１７となっているので、ｐｏｓ≧Ｍとなり（ステップＳ２：ＹＥＳ）、ステップＳ３へ移行する。ステップＳ３では、ｐｏｓ（＝１７）からＭ（＝８）を減算して、ｐｏｓの値を更新する。これにより、ｐｏｓ＝９となる。続いて、ステップＳ４へ進み、合計値ｓｕｍがＭ（＝８）以上か否かが判定される。この時点ではｓｕｍ＝１７となっているので、ｓｕｍ≧Ｍとなり（ステップＳ４：ＹＥＳ）、ステップＳ５へ移行する。ステップＳ５では、出力値ｏｕｔに「１」を書き込むとともに、ｓｕｍ（＝１７）からＭ（＝８）を減算して、合計値を更新する。これにより、ｓｕｍ＝９となる。その後、ステップＳ７で後続のデータの有無をみて、データがあるので（ステップＳ７：ＹＥＳ）、ステップＳ２へ戻る。
【００４０】
ステップＳ２で、再びｐｏｓがＭ（＝８）以上か否かが判定されるが、この時点ではｐｏｓ＝９となっているので、ｐｏｓ≧Ｍであり（ステップＳ２：ＹＥＳ）、ステップＳ３へ移行する。ステップＳ３では、ｐｏｓ（＝９）からＭ（＝８）を減算して、ｐｏｓの値を更新する。これにより、ｐｏｓ＝１となる。続いて、ステップＳ４へ進み、合計値ｓｕｍがＭ（＝８）以上か否かが判定される。この時点ではｓｕｍ＝９となっているので、ｓｕｍ≧Ｍとなり（ステップＳ４：ＹＥＳ）、ステップＳ５へ移行する。ステップＳ５では、出力値ｏｕｔに「１」を書き込む（図７のフローチャートでは、ｐｏｓ≧Ｍ（＝８）になれば、その後ｐｏｓ＜Ｍ（＝８）になるまでｏｕｔの出力を続けることになる）。また、ｓｕｍ（＝９）からＭ（＝８）を減算して、合計値を更新する。これにより、ｓｕｍ＝１となる。その後、ステップＳ７で後続のデータの有無をみて、データがあるので（ステップＳ７：ＹＥＳ）、ステップＳ２へ戻る。
【００４１】
ステップＳ２で、再びｐｏｓがＭ（＝８）以上か否かが判定されるが、この時点ではｐｏｓ＝１となっているので、ｐｏｓ＜Ｍであり（ステップＳ２：ＮＯ）、ステップＳ９へ移行して第３ブロック（ｃ）のデータを入力値ｉｎに読み込む。続いて、ステップＳ１０でカーソル値ｐｏｓ（＝１）にＮ（＝１７）を加算する。これにより、第３ブロック（ｃ）におけるｐｏｓは１＋１７＝１８となる。次に、ステップＳ１１で、読み込んだ第３ブロック（ｃ）の先頭から２ビット目（ｐｏｓ＝１）のビット値「０」とＮ（＝１７）を乗算し、これを合計値ｓｕｍ（＝１）に加算して、合計値ｓｕｍを更新する。これにより、第３ブロック（ｃ）におけるｓｕｍは、１＋０×１７＝１となる。その後、ステップＳ７で後続のデータの有無をみて、データがあるので（ステップＳ７：ＹＥＳ）、ステップＳ２へ戻る。
【００４２】
以上述べたような要領で、以降の各ブロックについても同様の処理を行う。この結果、ピッチ変換部３からは、ＰＤＭ信号を構成する「１１００・・・」のビット信号が出力される。そして、このＰＤＭ信号をローパスフィルタに通すことにより、ピッチ（波長）が１７／８倍に変換されたＰＣＭ信号が得られる。
【００４３】
次に、ピッチを縮める場合につき、図９（Ａ）を例に挙げてピッチ変換手順を説明する。図９（Ａ）においても、（ａ）〜（ｄ）は第１ブロック〜第４ブロックを表している。
【００４４】
最初、図７のステップＳ１で変数の初期化を行う。次のステップＳ２では、カーソル値ｐｏｓがＭ以上か否かが判定される。図９（Ａ）はピッチを７／８倍にする場合であり、ＮとＭの値はそれぞれＮ＝７、Ｍ＝８に設定される。最初はｐｏｓ＝０であるから、ｐｏｓ＜Ｍであり（ステップＳ２：ＮＯ）、ステップＳ９へ移行して第１ブロック（ａ）のデータを入力値ｉｎに読み込む。続いて、ステップＳ１０でカーソル値ｐｏｓにＮ（＝７）を加算する。これにより、ｐｏｓは０＋７＝７となる。次に、ステップＳ１１で、読み込んだ第１ブロック（ａ）の先頭（ｐｏｓ＝０）のビット値「１」とＮ（＝７）を乗算し、これを合計値ｓｕｍ（＝０）に加算して、合計値ｓｕｍを更新する。これにより、ｓｕｍは０＋１×７＝７となる。その後、ステップＳ７で後続のデータの有無をみて、データがあるので（ステップＳ７：ＹＥＳ）、ステップＳ２へ戻る。
【００４５】
ステップＳ２では、再びｐｏｓがＭ（＝８）以上か否かが判定され、この時点ではｐｏｓ＝７なので、ｐｏｓ＜Ｍとなり（ステップＳ２：ＮＯ）、ステップＳ９へ移行して再び第１ブロック（ａ）のデータを入力値ｉｎに読み込む（図７のフローチャートでは、ｐｏｓ≧Ｍ（＝８）になるまでは、データの読み込みを続けることになる）。そして、ステップＳ１０でカーソル値ｐｏｓにＮ（＝７）を加算する。これにより、第１ブロック（ａ）におけるｐｏｓは７＋７＝１４となる。次に、ステップＳ１１で、読み込んだ第１ブロック（ａ）の先頭から８ビット目（ｐｏｓ＝７）のビット値「０」とＮ（＝７）を乗算し、これを合計値ｓｕｍ（＝７）に加算して、合計値ｓｕｍを更新する。これにより、第１ブロック（ａ）におけるｓｕｍは７＋０＝７となる。その後、ステップＳ７で後続のデータの有無をみて、データがあるので（ステップＳ７：ＹＥＳ）、ステップＳ２へ戻る。
【００４６】
ステップＳ２で、再びｐｏｓがＭ（＝８）以上か否かが判定されるが、この時点ではｐｏｓ＝１４となっているので、ｐｏｓ≧Ｍであり（ステップＳ２：ＹＥＳ）、ステップＳ３へ移行する。ステップＳ３では、ｐｏｓ（＝１４）からＭ（＝８）を減算して、ｐｏｓの値を更新する。これにより、ｐｏｓ＝６となる。続いて、ステップＳ４へ進み、合計値ｓｕｍがＭ（＝８）以上か否かが判定される。この時点ではｓｕｍ＝７となっているので、ｓｕｍ＜Ｍとなり（ステップＳ４：ＹＥＳ）、ステップＳ８へ移行する。ステップＳ８では、出力値ｏｕｔに「０」を書き込み、続くステップＳ６で、出力値ｏｕｔ（＝０）を出力する。その後、ステップＳ７で後続のデータの有無をみて、データがあるので（ステップＳ７：ＹＥＳ）、ステップＳ２へ戻る。
【００４７】
ステップＳ２で、再びｐｏｓがＭ（＝８）以上か否かが判定されるが、この時点ではｐｏｓ＝６となっているので、ｐｏｓ＜Ｍであり（ステップＳ２：ＮＯ）、ステップＳ９へ移行して第２ブロック（ｂ）のデータを入力値ｉｎに読み込む。続いて、ステップＳ１０でカーソル値ｐｏｓ（＝６）にＮ（＝７）を加算する。これにより、第２ブロック（ｂ）におけるｐｏｓは６＋７＝１３となる。次に、ステップＳ１１で、読み込んだ第２ブロック（ｂ）の先頭から７ビット目（ｐｏｓ＝６）のビット値「１」とＮ（＝７）を乗算し、これを合計値ｓｕｍ（＝７）に加算して、合計値ｓｕｍを更新する。これにより、第２ブロック（ｂ）におけるｓｕｍは、７＋１×７＝１４となる。その後、ステップＳ７で後続のデータの有無をみて、データがあるので（ステップＳ７：ＹＥＳ）、ステップＳ２へ戻る。
【００４８】
ステップＳ２で、再びｐｏｓがＭ（＝８）以上か否かが判定されるが、この時点ではｐｏｓ＝１３となっているので、ｐｏｓ≧Ｍとなり（ステップＳ２：ＹＥＳ）、ステップＳ３へ移行する。ステップＳ３では、ｐｏｓ（＝１３）からＭ（＝８）を減算して、ｐｏｓの値を更新する。これにより、ｐｏｓ＝５となる。続いて、ステップＳ４へ進み、合計値ｓｕｍがＭ（＝８）以上か否かが判定される。この時点ではｓｕｍ＝１４となっているので、ｓｕｍ≧Ｍとなり（ステップＳ４：ＹＥＳ）、ステップＳ５へ移行する。ステップＳ５では、出力値ｏｕｔに「１」を書き込むとともに、ｓｕｍ（＝１４）からＭ（＝８）を減算して、合計値を更新する。これにより、ｓｕｍ＝６となる。その後、ステップＳ７で後続のデータの有無をみて、データがあるので（ステップＳ７：ＹＥＳ）、ステップＳ２へ戻る。
【００４９】
ステップＳ２で、再びｐｏｓがＭ（＝８）以上か否かが判定されるが、この時点ではｐｏｓ＝５となっているので、ｐｏｓ＜Ｍであり（ステップＳ２：ＮＯ）、ステップＳ９へ移行して第３ブロック（ｃ）のデータを入力値ｉｎに読み込む。続いて、ステップＳ１０でカーソル値ｐｏｓ（＝５）にＮ（＝７）を加算する。これにより、第３ブロック（ｃ）におけるｐｏｓは５＋７＝１２となる。次に、ステップＳ１１で、読み込んだ第３ブロック（ｃ）の先頭から６ビット目（ｐｏｓ＝５）のビット値「０」とＮ（＝７）を乗算し、これを合計値ｓｕｍ（＝６）に加算して、合計値ｓｕｍを更新する。これにより、第３ブロック（ｃ）におけるｓｕｍは、６＋０×７＝６となる。その後、ステップＳ７で後続のデータの有無をみて、データがあるので（ステップＳ７：ＹＥＳ）、ステップＳ２へ戻る。
【００５０】
ステップＳ２で、再びｐｏｓがＭ（＝８）以上か否かが判定されるが、この時点ではｐｏｓ＝４となっているので、ｐｏｓ＜Ｍであり（ステップＳ２：ＮＯ）、ステップＳ９へ移行して第４ブロック（ｄ）のデータを入力値ｉｎに読み込む。続いて、ステップＳ１０でカーソル値ｐｏｓ（＝４）にＮ（＝７）を加算する。これにより、第４ブロック（ｄ）におけるｐｏｓは４＋７＝１１となる。次に、ステップＳ１１で、読み込んだ第４ブロック（ｄ）の先頭から５ビット目（ｐｏｓ＝４）のビット値「１」とＮ（＝７）を乗算し、これを合計値ｓｕｍ（＝６）に加算して、合計値ｓｕｍを更新する。これにより、第４ブロック（ｄ）におけるｓｕｍは、６＋１×７＝１３となる。その後、ステップＳ７で後続のデータの有無をみて、データがあれば（ステップＳ７：ＹＥＳ）ステップＳ２へ戻り、データがなければ（ステップＳ７：ＮＯ）処理を終了する。
【００５１】
以上述べたような要領で、後続する第５ブロック以降の各ブロックについても同様の処理を行う。この結果、ピッチ変換部３からは、ＰＤＭ信号を構成する「０１０１・・・」のビット信号が出力される。そして、このＰＤＭ信号をローパスフィルタに通すことにより、ピッチ（波長）が７／８倍に変換されたＰＣＭ信号が得られる。
【００５２】
同様にして、ピッチを３／８倍にする図９（Ｂ）の場合も、上述した図９（Ａ）と同じ要領にしたがって、ピッチ変換を行うことができる（詳細は省略）。
【００５３】
以上のように、上述した実施形態においては、ＰＤＭ信号を構成する１ビット信号のピッチを補間処理によってずらし、補間後のデータ列をブロック単位で読み出してブロックごとに量子化を行うことにより、１ビット信号のままでピッチを変換することができる。このため、畳み込み演算や一般調和解析などの複雑な演算処理が不要となり、簡単な手段によってピッチ変換処理を高速に行うことができる。また、ＮおよびＭの値を任意に設定することで、所望のピッチを有する波形を容易に得ることが可能となる。
【００５４】
また、上述した実施形態においては、量子化手段としてΔΣ変調器５０を用いているので、専用の演算回路を設計しなくても、既存のΔΣ変調器の機能を利用して、量子化や余り値の加算処理を容易に実現することができる。
【００５５】
本発明は、アナログの楽音信号を出力する場合に限らず、デジタルの楽音信号を出力する場合にも適用が可能である。
【００５６】
また、上記実施形態においては、波形メモリ１に記憶されている楽音信号としてＰＣＭ信号を例に挙げたが、本発明は、ＰＣＭ信号以外の楽音信号を用いる場合においても適用することができる。
【００５７】
さらに、本発明は楽音に限らず、人の声（ボイス）や擬似音なども含むあらゆる音を生成する場合に適用することができ、さらには、音以外の波形を生成する場合にも適用することができる。
【図面の簡単な説明】
【００５８】
【図１】本発明の実施形態による音源用シンセサイザの全体構成を示すブロック図である。
【図２】ピッチ変換部の構成を表した図である。
【図３】ＰＣＭ信号とＰＤＭ信号を示す図である。
【図４】ΔΣ変調器の一例を示すブロック図である。
【図５】本発明によるピッチ変換の原理を示した図である。
【図６】ゼロ値補間の様子を詳細に示した図である。
【図７】ピッチ変換の手順を示したフローチャートである。
【図８】ピッチを伸ばす場合のデータ演算の例を示した図である。
【図９】ピッチを縮める場合のデータ演算の例を示した図である。
【図１０】波長変換を説明する図である。
【符号の説明】
【００５９】
１    波形メモリ
２    ＰＣＭ／ＰＤＭ変換部
３    ピッチ変換部
３ｂ  ゼロ値補間部
３ｃ  合計値算出部
３ｄ  量子化部
４    信号処理部
５    出力部
５０  ΔΣ変調器
１００  波形生成装置
【図１】
2008216916.tif 000003
【図２】
2008216916.tif 000004
【図３】
2008216916.tif 000005
【図４】
2008216916.tif 000006
【図５】
2008216916.tif 000007
【図６】
2008216916.tif 000008
【図７】
2008216916.tif 000009
【図８】
2008216916.tif 000010
【図９】
2008216916.tif 000011
【図１０】
2008216916.tif 000012