(57)【特許請求の範囲】
【請求項１】
コード進行情報を取得する情報取得手段と、
前記情報取得手段が取得した前記コード進行情報を構成する各コード毎に、該コードを構成する構成音の音高の組み合わせを複数、仮定する仮定手段と、
前記仮定手段が仮定した前記音高の組み合わせ毎に、所定の評価を行う評価手段と、
前記評価手段の評価結果に従って、前記仮定手段が仮定した前記複数の音高の組み合わせのなかから一つを選択する選択手段と、
を具備する自動編曲装置において、
前記評価手段は、前記仮定手段が仮定した前記音高の組み合わせ毎に、各音高と所定の基準音高との音程の累算値を算出して評価結果とする、
ことを特徴とする自動編曲装置。
【請求項２】
コード進行情報を取得する情報取得手段と、
前記情報取得手段が取得した前記コード進行情報を構成する各コード毎に、該コードを構成する構成音の音高の組み合わせを複数、仮定する仮定手段と、
前記仮定手段が仮定した前記音高の組み合わせ毎に、所定の評価を行う評価手段と、
前記評価手段の評価結果に従って、前記仮定手段が仮定した前記複数の音高の組み合わせのなかから一つを選択する選択手段と、
を具備する自動編曲装置において、
前記評価手段は、前記仮定手段が仮定した前記音高の組み合わせ毎に、その中心となる音高と所定の基準音高との音程を算出して評価結果とする、
ことを特徴とする自動編曲装置。
【請求項３】
コンピュータに、
コード進行情報を取得する機能と、
前記取得する機能により取得した前記コード進行情報を構成する各コード毎に、該コードを構成する構成音の音高の組み合わせを複数、仮定する機能と、
前記仮定する機能により仮定した前記音高の組み合わせ毎に、所定の評価を行う機能と、
前記評価する機能による評価結果に従って、前記仮定する機能により仮定した前記複数の音高の組み合わせのなかから一つを選択する機能と、
を実現させるためのプログラムであって、
前記評価する機能は、前記仮定する機能により仮定した前記音高の組み合わせ毎に、各音高と所定の基準音高との音程の累算値を算出して評価結果とする、
ことを特徴とするプログラム。
【請求項４】
コンピュータに、
コード進行情報を取得する機能と、
前記取得する機能により取得した前記コード進行情報を構成する各コード毎に、該コードを構成する構成音の音高の組み合わせを複数、仮定する機能と、
前記仮定する機能により仮定した前記音高の組み合わせ毎に、所定の評価を行う機能と、
前記評価する機能による評価結果に従って、前記仮定する機能により仮定した前記複数の音高の組み合わせのなかから一つを選択する機能と、
を実現させるためのプログラムであって、
前記評価する機能は、前記仮定する機能により仮定した前記音高の組み合わせ毎に、その中心となる音高と所定の基準音高との音程を算出して評価結果とする、
ことを特徴とするプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コード進行を構成する各コードの内容を変更する編曲を自動的に行うための技術に関する。
【０００２】
【従来の技術】
現在では、音楽のより幅広い楽しみ方を提供するものとして、自動編曲装置が製品化されている。その編曲装置は、予めデータの形で表された演奏の内容を自動的に変更するものである。電子楽器などの楽音発生装置に搭載された場合には、自動演奏（ここでは自動伴奏を含む）や、ユーザが操作すべき演奏操作子を誘導するナビゲートなどに用いられている。
【０００３】
【発明が解決しようとする課題】
従来の自動編曲装置は、基本となる演奏（伴奏を含む）の内容を表すデータに対し、ユーザが指定した音高、或いはコードなどに応じて、そのデータで表される楽音の音高を変換することで編曲を行っていた。このため、編曲の対象となったデータやユーザの指定内容、及び音高の変換方法といったそれらの間の組み合わせによって、編曲した後の演奏の内容が不自然になったり、或いはその演奏を行い難くなるといった結果を招くという問題点があった。
【０００４】
本発明の課題は、音楽的な不自然さを回避させつつ、演奏が行い易い形で編曲を自動的に行う自動編曲装置を提供することにある。
【０００５】
【課題を解決するための手段】
本発明の第１の態様の自動編曲装置は、コード進行情報を取得する情報取得手段と、情報取得手段が取得したコード進行情報を構成する各コード毎に、該コードを構成する構成音の音高の組み合わせを複数、仮定する仮定手段と、仮定手段が仮定した音高の組み合わせ毎に、所定の評価を行う評価手段と、評価手段の評価結果に従って、仮定手段が仮定した複数の音高の組み合わせのなかから一つを選択する選択手段と、を具備し、評価手段は、仮定手段が仮定した音高の組み合わせ毎に、各音高と所定の基準音高との音程の累算値を算出して評価結果とすることを特徴とする。
【０００６】
本発明の第２の態様の自動編曲装置は、コード進行情報を取得する情報取得手段と、情報取得手段が取得したコード進行情報を構成する各コード毎に、該コードを構成する構成音の音高の組み合わせを複数、仮定する仮定手段と、仮定手段が仮定した音高の組み合わせ毎に、所定の評価を行う評価手段と、評価手段の評価結果に従って、仮定手段が仮定した複数の音高の組み合わせのなかから一つを選択する選択手段と、を具備し、評価手段は、仮定手段が仮定した音高の組み合わせ毎に、その中心となる音高と所定の基準音高との音程を算出して評価結果とすることを特徴とする。
【０００８】
本発明の第１の態様のプログラムは、コンピュータに、コード進行情報を取得する機能と、その取得する機能により取得したコード進行情報を構成する各コード毎に、該コードを構成する構成音の音高の組み合わせを複数、仮定する機能と、仮定する機能により仮定した音高の組み合わせ毎に、所定の評価を行う機能と、評価する機能による評価結果に従って、仮定する機能により仮定した複数の音高の組み合わせのなかから一つを選択する機能と、を実現させ、評価する機能は、仮定する機能により仮定した音高の組み合わせ毎に、各音高と所定の基準音高との音程の累算値を算出して評価結果とすることを特徴とする。
【０００９】
本発明の第２の態様のプログラムは、コンピュータに、コード進行情報を取得する機能と、その取得する機能により取得したコード進行情報を構成する各コード毎に、該コードを構成する構成音の音高の組み合わせを複数、仮定する機能と、仮定する機能により仮定した音高の組み合わせ毎に、所定の評価を行う機能と、評価する機能による評価結果に従って、仮定する機能により仮定した複数の音高の組み合わせのなかから一つを選択する機能と、を実現させ、評価する機能は、仮定する機能により仮定した音高の組み合わせ毎に、その中心となる音高と所定の基準音高との音程を算出して評価結果とすることを特徴とする。
【００１１】
本発明では、コード進行情報を構成する各コード毎に、そのコードを構成する構成音の音高の組み合わせを複数、仮定し、その仮定した音高の組み合わせの評価を行い、その評価に従って、仮定した音高の組み合わせのなかから一つを選択する。そのように、複数、仮定した音高の組み合わせのなかから最も適切な組み合わせを選択することにより、音楽的に自然で、且つ演奏が行い易い形での編曲が自動的に行われることとなる。
【００１２】
【発明の実施の形態】
以下、本発明の実施の形態について、図面を参照しながら詳細に説明する。
図１は、本実施の形態による自動編曲装置の回路構成図である。
図１に示すように、その自動編曲装置は、装置全体の制御を実行するＣＰＵ１０１と、そのＣＰＵ１０１が実行するプログラムや各種制御用データなどを格納したＲＯＭ１０２と、そのＣＰＵ１０１がワーク用に使用するＲＡＭ１０３と、各種データを入力するための入力装置１０４と、編曲結果をユーザが確認するためのモニター１０５と、それらを相互に接続するバス１０６と、を備えて構成されている。それにより、その自動編曲装置は、入力装置１０４から演奏内容を表すデータを入力して編曲を行い、その編曲によって得られたデータをモニター１０５に出力する装置として実現されている。そのデータとしては、コード進行を表すコード進行データを想定している。
【００１３】
上記入力装置１０４としては、キーボードやフロッピーディスク装置、ＣＤ−ＲＯＭ装置、或いは外部装置との通信を行うインターフェースなどが対応する。モニター１０５としては、表示装置、或いは音源装置、などが対応する。フロッピーディスク装置、ＣＤ−ＲＯＭ装置、或いは外部装置との通信を行うインターフェースなどであっても良い。当然のことながら、入力装置１０４、及びモニター１０５に、それぞれ複数の装置が対応していても良く、それらが同じものであっても良い。
【００１４】
図２は、上記回路構成の自動編曲装置の機能的構成を説明する図である。この図２、更には図３、及び図４に示す説明図を参照しつつ、その自動編曲装置に搭載された機能について説明する。
図２中のコード進行データ２１１は、図１の入力装置１０４により入力されたものである。本実施の形態では、図４（ａ）に示すように、入力装置１０４から入力されたコード進行データ２１１は２次元の配列変数ｃｐとして扱っている。その配列変数ｃｐにおいて、１番目の括弧（図４（ａ）中で“ｉ”を持つ括弧）はコード進行上に表れるコード（図４（ａ）中では“０〜ｎ番目のコード”がそれぞれ対応）を指定するためのものであり、２番目の括弧（図４（ａ）中で“ｊ”を持つ括弧）はコードの内容を表すデータの種類を指定するためのである。そのデータの種類は、“ＲＯＯＴ”、“ＴＹＰＥ”、及び“ＬＥＮ”のシンボルで表すデータである。“ＲＯＯＴ”はルート（根音）の音高を示すデータ（以降、ルートデータと呼ぶ）、“ＴＹＰＥ”はコードの種類を示すデータ（以降、タイプデータと呼ぶ）、“ＬＥＮ”はコードが発音されている時間（発音持続時間）を示すデータ、をそれぞれ表している。以降、それらのデータをまとめてコードデータと呼ぶことにする。
【００１５】
伴奏音決定手段２０１は、配列変数ｃｐ（コード進行データ２０１）の１番目の括弧内の引数によって指定されるコード毎に、そのコードとして発音させるべき構成音の音高の組み合わせを決定するための処理を行う。その処理は、以下のようにして行われる。
【００１６】
伴奏音決定手段２０１は、配列変数ｃｐから、処理対象とするコードのデータ（図４（ａ）中で“ＲＯＯＴ”、“ＴＹＰＥ”、及び“ＬＥＮ”のシンボルで表すそれぞれのデータ）を取り出し、コード音選択手段２０２に送る。その選択手段２０２は、伴奏音決定手段２０１からデータを受け取ると、コードトーンデータベース（以降、コードトーンＤＢと略記する）２０４を参照して、そのデータで表されるコードの構成音である音高の組み合わせの候補を複数、選択する。選択した音高の組み合わせは伴奏音決定手段２０１に送る。
【００１７】
上記コードトーンＤＢ２０４は、コード種毎に、その構成音の音程の関係を表すデータを格納したものである。本実施の形態では、図３に示すように、配列変数ｃｈｏｔｏｎｅとして扱っている。それの次元を２次元とすることで、省略なし、５度省略（ルートから５度の構成音を省略）、及びルート省略（構成音としてルートを省略）の計３種類の省略形別、コード種別に、構成音の音程の関係を表すデータを保持させている。１番目の括弧は省略形を指定するためのものであり、２番目の括弧はコード種を指定するためのものである。その図３において、“ｍａｊ”はメジャー、“ｍｉｎ”はマイナー、“７ｔｈ”はセブンス、“ｍ７”はマイナーセブンスをそれぞれ表し、“０”と“１”で表された１２桁の数字中の“１”は、右端をルート“Ｃ”と想定した場合のコード構成音の音高を示している。その数字を１２桁としたのは、１オクターブは１２半音であるためである。
【００１８】
コード音選択手段２０２は、構成音の組み合わせとして、上述したようなコードトーンＤＢ（配列変数ｃｈｏｔｏｎｅ）２０４を参照して、伴奏音決定手段２０１から受け取ったコードデータで表される構成音の音高の組み合わせ（基本形）の他に、それを転回させて得られる組み合わせ（転回形）を候補として選択する。そのような組み合わせを候補として選択した場合、少なくとも、元のコードの響きは維持させることができる。このため、コード進行データ（配列変数ｃｐ）２１１で表される元の演奏を音楽的に不自然な形で編曲するのを回避することができる。
【００１９】
その配列変数ｃｈｏｔｏｎｅには、コードの構成音の音程の関係を示すデータとして、図３に示すように、省略なし以外のものも保持させている。それにより、より幅広い範囲の編曲をユーザの要求に合わせて行えるようになっている。
【００２０】
音程の組み合わせを受け取った伴奏音決定手段２０１は、それを評価手段２０３に送って、各組み合わせ毎にその評価を行わせる。評価手段２０３の評価結果に従って、コード音選択手段２０２が候補として選択した音高の組み合わせのなかから一つを選択する。伴奏用演奏データ２１２は、伴奏音決定手段２０１が上述したようにして音程の組み合わせを選択していくことで生成されたデータである。
【００２１】
上記評価手段２０３は、音程の組み合わせに対する評価は、基本的に、直前のコードにおける音程の組み合わせからの距離を求めることで行っている。言い換えれば、コードの進行に伴う手指の移動距離を求めることで行っている。そのような評価を行うことで、編曲した演奏内容の演奏をユーザが行う場合に、より簡単に演奏が行える音程の組み合わせを伴奏音決定手段２０１に選択させるようにしている。
【００２２】
ところで、１半音の音程がある２音を楽器で発音させるための演奏操作は行い難いのが普通である。例えば鍵盤では、隣り合う２本の指で隣り合っている白鍵と黒鍵を押鍵しなければならない。このことから、その条件を満たしている音程の組み合わせは選択肢から排除させている。また、隣り合うコードが完全５度で進行する平行（連続）５度は、下声が調の主音または属音として響くべき強制的な安定性を持つことが知られている。そのような条件を満たしている構成音の組み合わせには、それを評価に反映させるようにしている。それにより、音楽的な不具合が生じるのをより回避できるようにさせている。
【００２３】
上記コードトーンＤＢ（配列変数ｃｈｏｔｏｎｅ）２０４は、図１のＲＯＭ１０２に格納されている。コード進行データ（配列変数ｃｐ）２１１はＲＡＭ１０３に格納され、伴奏音用演奏データはＲＡＭ１０３に格納されて、モニター１０５に出力されるか、或いは特には図示しない出力装置を介して外部に出力される。その出力装置とは、例えばフロッピーディスク装置、ＣＤ−ＲＯＭ装置、或いは外部装置との通信を行うインターフェースなどである。伴奏音決定手段２０１、コード音選択手段２０２、及び評価手段２０３は、共に、図１のＣＰＵ１０１が、ＲＡＭ１０３をワーク用に使用しながら、ＲＯＭ１０２に格納されたプログラムを実行することで実現される。
【００２４】
次に、図５〜図１２に示す各種フローチャートを参照して、上記ＣＰＵ１０１の動作について詳細に説明する。
図５は、全体処理のフローチャートである。電源がオンされた後にＣＰＵ１０１が実行する全体的な処理の流れを表したものである。入力装置１０４としては、ここでは便宜的に、キーボードなどのユーザが操作してデータを入力するものを想定している。始めに図５を参照して、その全体処理について詳細に説明する。なお、その全体処理は、ＣＰＵ１０１が、ＲＡＭ１０３をワーク用に使用しながら、ＲＯＭ１０２から読み出したプログラムを実行することにより実現される。
【００２５】
先ず、ステップ５０１では、初期化処理を行う。その処理の実行により装置を予め定められた状態に設定した後はステップ５０２に移行して、入力装置１０４のスキャンを行う。その後はステップ５０３に移行する。
本実施の形態では、特に詳細な説明は省略するが、ユーザはモードを設定して、装置に所望の動作を行わせるようになっている。その動作は、ステップ５０３以降の処理を実行することにより実現される。
【００２６】
先ず、ステップ５０３では、コード進行データ２１１用の入力が行われたか否か判定する。ユーザがその入力用のモードを設定させた状態で入力装置１０４を操作したような場合、判定はＹＥＳとなってステップ５０４に移行し、その操作内容に応じてコード進行データ２１１用の入力を行った後、上記ステップ５０２に戻る。そうでない場合には、判定はＮＯとなってステップ５０５に移行する。そのステップ５０４の処理を実行することにより、図４（ａ）に示すような配列変数ｃｐの形でコード進行データ２１１がＲＡＭ１０３に格納される。
【００２７】
ステップ５０５では、編曲用の設定が行われたか否か判定する。その設定用のモードをユーザが設定させた状態でユーザが入力装置１０４を操作したような場合、判定はＹＥＳとなってステップ５０６に移行し、図４（ｂ）に示すようなオプション変数のうちの何れかに値を代入する形で設定を行った後、上記ステップ５０２に戻る。そうでない場合には、判定はＮＯとなってステップ５０７に移行する。
【００２８】
なお、図４（ｂ）において、変数ＬｏｗｅｒＬｉｍｉｔ、及びＵｐｐｅｒＬｉｍｉｔは、コードの構成音の音域を指定するためのものであり、変数Ｏｍｉｔはコードの省略形（図３参照）を選択するためのものである。変数ＨｏｍｅＰｉｔは音高の組み合わせを選択する際に考慮すべき中心となる音高（中心ポジション）を指定するためのものである。変数Ａ、Ｂ、及びＣは、それぞれ、音高の組み合わせを評価する際に用いられる重みを保持させておく変数である。変数Ａには音高の組み合わせに移動距離を考慮する度合いを示す重みが代入され、以下、同様に、変数Ｂには中心ポジション、変数Ｃには平行５度をそれぞれ考慮する度合いを示す重みが代入される。
【００２９】
ステップ５０７では、編曲の指示が行われたか否か判定する。ユーザが入力装置１０４を操作して編曲の指示を行った場合、判定はＹＥＳとなり、ステップ５０６で配列変数ｃｐを編曲の対象とした編曲処理を実行した後、上記ステップ５０２に戻る。そうでない場合には、判定はＮＯとなってステップ５０９に移行する。
【００３０】
ステップ５０９では、編曲を行うことで生成された伴奏音用演奏データ２１２のモニター１０５への出力の指示が行われたか否か判定する。その指示をユーザが入力装置１０４を操作して行った場合、判定はＹＥＳとなってステップ５１０に移行し、モニター１０５を介して、その演奏データ２１２を画像、或いは音声（自動演奏）の形で出力させた後、上記ステップ５０２に戻る。そうでない場合には、判定はＮＯとなり、他のステップの処理を実行することなく、そのステップ５０２に戻る。
【００３１】
全体処理では、上述したような処理が上述したような流れで実行される。それにより、ユーザの入力装置１０４への操作に応じて自動編曲装置は動作するようになっている。
図６は、上記ステップ５０８として実行される編曲処理のフローチャートである。次に図６を参照して、その編曲処理について詳細に説明する。
【００３２】
その編集処理の実行には、図４（ｃ）に示すような変数が使われる。その図４（ｃ）において、配列変数ｖ１は現在、処理対象としているコード用の一候補として組み合わされた構成音の音高（を示す値）を保持しておくためのものであり、配列変数ｖ２は直前（一つ前）のコード用に組み合わせが選択（確定）された構成音の音高を保持しておくためのものであり、配列変数ｖｂｅｓｔは、現在処理対象としているコード用の組み合わせ候補のうちで評価が最も高い音高の組み合わせをデータとして保持しておくためのものであり、最終的に選択されている音高の組み合わせが図２の伴奏音用演奏データ２１２に対応する。変数Ｒｏｔａｔｅｎは、コード転回数をカウントするために用意したものである。以降、音高（を示す値）の組み合わせについては、ピッチセットとも呼ぶことにする。
【００３３】
先ず、ステップ６０１では、配列変数ｃｐにコードデータが保持されているコード、つまりコード進行のなかで処理対象とするコードを管理するための変数ｃｐｔｒに、その先頭に位置しているコードを表す値の０を代入する。続くステップ６０２では、その変数ｃｐｔｒの値で指定されるコードのデータが配列変数ｃｐに保持されているか否か判定する。そのデータが配列変数ｃｐに保持されていない場合、即ちコード進行のなかの最後端のコードを処理して編曲が終了したような場合、判定はＹＥＳとなり、ここで一連の処理を終了する。そうでない場合には、判定はＮＯとなってステップ６０３に移行する。
【００３４】
ステップ６０３では、ピッチセットの評価値の保持用に用意した変数ｖｍｉｎに、デフォルト値として定めた３００００を代入する。次に実行するステップ６０４では、変数Ｒｏｔａｔｅｎに０を代入する。その後はステップ６０５に移行する。なお、評価値はその値が小さいほど、評価が高いことを示している。
【００３５】
ステップ６０５では、変数Ｒｏｔａｔｅｎの値が予め定めた転回数の上限値以上か否か判定する。その値が転回数の上限値以上であった場合、判定はＹＥＳとなってステップ６１６に移行する。そうでない場合には、判定はＮＯとなってステップ６０６に移行し、配列変数ｖ１を初期化、ここではその各要素に−１をそれぞれ代入した後、ステップ６０７に移行する。
【００３６】
ステップ６０７では、変数ｃｐｔｒの値が０か否か判定する。配列変数ｃｐに保持されたコード進行データ２１１が表すコード進行上で先頭に位置するコードを処理対象としていた場合、判定はＹＥＳとなり、ステップ６０８で配列変数ｖ２を同様に初期化し、更にステップ６０９で配列変数ｖ１の各要素に構成音の音高（を示す値）を代入するコード音選択処理を実行した後、ステップ６０９に移行する。そうでない場合には、判定はＮＯとなり、次にそのステップ６０９のコード音選択処理を実行する。
【００３７】
ステップ６１０では、コード音選択処理を実行した結果、音高の組み合わせ（ピッチセット）候補を選択できたか否か判定する。そのコード音選択処理では、引数でもある変数ｏｋに、適切な音高の組み合わせ（ピッチセット）候補を選択できなければ０を、それを選択できれば１を代入するようになっている。選択したピッチセットを構成する音高を示す値は配列変数ｖ１の各要素にそれぞれ代入している。このことから、変数ｏｋの値が１であった場合、判定はＹＥＳとなってステップ６１１に移行して、選択したピッチセットの評価を行う評価処理を実行した後、ステップ６１２に移行する。そうでない場合には、判定はＮＯとなって後述するステップ６１５に移行する。
【００３８】
その評価処理では、算出した評価値を引数でもある変数ｖに代入するようになっている。ステップ６１２では、その変数ｖの値が変数ｖｍｉｎの値より小さいか否か判定する。今回、選択したピッチセットの評価がそれまでで最も高かったような場合、つまり評価値が小さかったとき、判定はＹＥＳとなってステップ６１３に移行する。そうでない場合には、判定はＮＯとなってステップ６１５に移行する。
【００３９】
ステップ６１３では、変数ｖｍｉｎに変数ｖの値を代入する。続くステップ６１４では、配列変数ｖｂｅｓｔの変数ｃｐｔｒの値で指定される要素に、配列変数ｖ１の各要素の値をパックして代入する。その次に実行するステップ６１５では、変数Ｒｏｔａｔｅｎの値をインクリメントする。そのインクリメントを行った後に上記ステップ６０５に戻り、それ以降の処理を同様に実行する。それにより、転回数を１ずつカウントアップしながら、随時、評価が最も高いピッチセットをそれまでのものと置き換えていく形でピッチセットの選択、保存を行うようになっている。
【００４０】
一方、上記ステップ６０５でＹＥＳと判定、即ち処理対象とするコードのピッチセットの選択が終了（確定）した場合に移行するステップ６１６では、配列変数ｖｂｅｓｔの変数ｃｐｔｒの値で指定される要素にパックして代入させている、そのピッチパックの内容を示す値（データ）をデパックして、配列変数ｖ２の各要素にそれぞれ代入する。それにより、配列変数ｖ２に今回、選択（確定）したピッチセットを表すデータ（構成音の音高を示す値のセット）を保持させると、ステップ６１７に移行して、変数ｃｐｔｒの値をインクリメントする。その後は上記ステップ６０２に戻り、処理対象を次のコードに変えて、それ以降の処理を同様に実行する。それにより、コード進行データ２１１が表すコード進行上の先頭に位置するコードからその後方に順次、処理対象とするコードを移動させながらピッチセットを選択（確定）していくようになっている。
【００４１】
ここで、図７〜図９に示す各種フローチャートを参照して、上記コード音選択処理内で実行されるサブルーチン処理について詳細に説明する。
図７は、そのコード音選択処理内でステップ６０９として実行されるコード音選択処理のフローチャートである。図７を参照して、その選択処理について詳細に説明する。
【００４２】
その選択処理では、上述したように、コードのピッチセット候補を選択して、それを構成する音高を示す値をそれぞれ配列変数ｖ１の要素に代入するようになっている。そのピッチセットが適切なものでなければ変数ｏｋには０を代入する。
先ず、ステップ７０１では、変数ｃｐｔｒの値で指定される現在の処理対象のコードの構成音数を特定するためのコード構成音数処理を実行する。その後は、ステップ７０２で変数ｐに変数ＬｏｗｅｒＬｉｍｉｔの値、ステップ７０３で変数ｃｎｔに０、ステップ７０４で変数ｏｋに１をそれぞれ代入した後、ステップ７０５に移行する。その変数ｐはピッチセットの音高を特定するために、変数ｃｎｔは処理した構成音（音高）数をカウントするためにそれぞれ用意した変数である。コード構成音数処理の実行結果である構成音数は引数でもある変数ｃｔｎに代入される。
【００４３】
ステップ７０５以降では、配列変数ｖ１の各要素に、変数ｃｐｔｒの値で指定されるコードの構成音の音高に対して変数Ｒｏｔａｔｅｎの値で指定される数の転回を行って得られるピッチセットの各音高を示す値を代入し、そのピッチセットが適切なものでなければ変数ｏｋの値を０に書き換えるための処理が行われる。そのための処理は、変数ｐ、及びｃｎｔの値を順次、インクリメントしながら行われる。
【００４４】
先ず、ステップ７０５では、配列変数ｖ１の各要素全てにピッチセットの音高を示す値の代入が終了したか否か判定する。その音高は低い方から順に決定するようになっている。構成音数は変数ｃｔｎに、転回数は変数Ｒｏｔａｔｅｎにそれぞれ代入されている。このことから、変数ｃｎｔの値から変数Ｒｏｔａｔｅｎの値を減算した値（＝ｃｎｔ−Ｒｏｔａｔｅｎ）が変数ｃｔｎの値以上となった場合、判定はＹＥＳとなってステップ７１４に移行する。そうでない場合には、判定はＮＯとなってステップ７０６に移行する。
【００４５】
ステップ７０６では、変数ｐの値が変数ＵｐｐｅｒＬｉｍｉｔの値より大きいか否か判定する。その変数ｐの値はピッチセットの音高を選択（特定）するために順次、半音単位でインクリメントしている。このことから、変数ＬｏｗｅｒＬｉｍｉｔの値と変数ＵｐｐｅｒＬｉｍｉｔの値で指定される音域内でピッチセットの音高を全て選択（特定）できなかった場合、判定はＹＥＳとなり、ステップ７０７で変数ｏｋに０を代入した後、一連の処理を終了する。そうでない場合には、判定はＮＯとなってステップ７０８に移行し、変数ｐの値が示す音高がピッチセット（コード構成音）の音高に該当するか否か判定するコードトーン処理を実行した後、ステップ７０９に移行する。
【００４６】
このようにして、本実施の形態では、ユーザが指定した音域内でピッチセットの音高を選択するようにしている。それにより、音域に対するユーザの要求をピッチセットの音高の選択に反映させて、そのユーザにとってより望ましい形で編曲を行えるようにさせている。
【００４７】
上記コードトーン処理では、引数でもある変数ｃｔｏｎｅに、変数ｐの値が示す音高がピッチセットの音高に該当していれば、つまりコード構成音であれば、１、そうでなければ０を代入するようになっている。ステップ７０９では、その変数ｃｔｏｎｅの値が１か否か判定する。その変数ｃｔｏｎｅに１が代入されていた場合、判定はＹＥＳとなってステップ７１０に移行する。そうでない場合には、判定はＮＯとなって後述のステップ７１３に移行する。
【００４８】
ステップ７１０では、変数ｃｎｔの値が変数Ｒｏｔａｔｅｎの値以上か否か判定する。その変数ｃｎｔの値は、上記ステップ７０９の判定がＹＥＳとならなければインクリメントしないようになっている。このことから、変数Ｒｏｔａｔｅｎの値で指定される数以上、ステップ７０９の判定がＹＥＳとなった場合、判定はＹＥＳとなってステップ７１１に移行する。そうでない場合には、判定はＮＯとなってステップ７１２に移行する。
【００４９】
ステップ７１１では、変数ｃｎｔの値から変数Ｒｏｔａｔｅｎの値を引いた値（＝ｃｎｔ−Ｒｏｔａｔｅｎ）で指定される配列変数ｖ１の要素に、変数ｐの値を代入する。続くステップ７１２では変数ｃｎｔの値をインクリメントする。その後は、ステップ７１３に移行して、変数ｐの値をインクリメントしてから上記ステップ７０５に戻る。それにより、配列変数ｖ１の各要素に、それぞれ一つずつ、順次ピッチセットを構成する音高を示す値を、転回数に応じた順序で代入するようになっている。
【００５０】
上記ステップ７０５でＹＥＳと判定した場合に移行するステップ７１４では、変数ｍに、配列変数ｖ１の要素ｖ１［２］の値から要素ｖ１［１］の値を減算した値（半音数）を代入する。続くステップ７１５では、変数ｍの値が１か否か判定する。ピッチセットとして選択した高音側の２音間の音程が１半音となっていた場合、判定はＹＥＳとなり、ステップ７１６で変数ｏｋに０を代入した後、一連の処理を終了する。そうでない場合には、判定はＮＯとなり、ここで一連の処理を終了する。
【００５１】
図６に示す編曲処理では、変数ｏｋの値が０であれば、選択したピッチセット候補に対する評価を行うことなく、次のピッチセット候補の選択を行うようになっている。そのようにして、音高間（特に４和音の高音側の２音間）の音程が１半音となっているピッチセットは無視している。
【００５２】
次に、上記ステップ７０１として実行されるコード構成音数処理について、図８に示すそのフローチャートを参照して詳細に説明する。その構成音数処理では、図３に示す配列変数ｃｈｏｔｏｎｅを参照して、コードの構成音数をカウントするようになっている。
【００５３】
先ず、ステップ８０１では変数ｉに０を代入する。続くステップ８０２では、変数ｃｔｎに０を代入する。その代入を行った後に移行するステップ８０３では、変数ｉの値が１２以上か否か判定する。配列変数ｃｈｏｔｏｎｅの要素には有効ビット（桁）数が１２ビットのデータが保持されている。変数ｉは、その１２ビットのデータのなかで着目するビットを管理するために用いている。このことから、コードの構成音数のカウントが終了した場合、判定はＹＥＳとなり、ここで一連の処理を終了する。そうでない場合には、判定はＮＯとなってステップ８０４に移行する。
【００５４】
ステップ８０４では、“０００００００００００１”を変数ｉの値分、左にシフトする操作を行い、それによって得られたものを変数ａに代入する。次に実行するステップ８０５では、変数Ｏｍｉｔの値、及び配列変数ｃｐの要素に保持されている、変数ｃｐｔｒの値で指定されるコードのタイプデータ（図中では「ｃｐ［ｃｐｔｒ］［ｔｙｐｅ］」と表記）により指定される配列変数ｃｈｏｔｏｎｅの要素の値を変数ｂに代入する。その後はステップ８０６に移行する。
【００５５】
ステップ８０６では、変数ａの値と変数ｂの値をビット単位で論理積をとり、その論理積の論理和が１か否か判定する。変数ｂの値（２進数表現である）に、“０００００００００００１”を変数ｉの値分、左にシフトした位置に“１”が存在している場合、判定はＹＥＳとなり、ステップ８０７で変数ｃｔｎの値をインクリメントし、更にステップ８０８で変数ｉの値をインクリメントした後、上記ステップ８０３に戻る。そうでない場合には、判定はＮＯとなってそのステップ８０８に移行する。
【００５６】
このように、コード構成音数処理では、配列変数ｃｈｏｔｏｎｅの要素に保持されたデータ中に存在する“１”の個数をカウントすることにより、変数ｃｐｔｒの値、及び変数Ｏｍｉｔの値により指定されるコードの構成音数を特定するようになっている。
【００５７】
図９は、図７に示すコード音選択処理内でステップ７０８として実行されるコードトーン処理のフローチャートである。次に図９を参照して、そのコードトーン処理について詳細に説明する。そのコードトーン処理は、上述したように、変数ｐの値が示す音高がピッチセットの音高に該当するか否か判定して、その判定結果を示す値を引数でもある変数ｃｔｏｎｅに代入する処理である。
【００５８】
先ず、ステップ９０１では、１２に変数ｐの値を加算して得られる値から、配列変数ｃｐの要素に保持されている、変数ｃｐｔｒの値で指定されるコードのルートデータ（図中では「ｃｐ［ｃｐｔｒ］［ＲＯＯＴ］」と表記）の値を減算し、その減算結果を変数ａに代入する。次に実行するステップ９０２では、変数ｂに、変数ａの値を１２で割った余りを代入する。その後はステップ９０３に移行する。なお、ステップ９０１で１２を変数ｐの値に加算するのは、変数ａの値が負となるのを回避するためである。変数ｂに、変数ａの値を１２で割った余りを代入するのは、配列変数ｃｈｏｔｏｎｅには、図３に示すように、コードを構成する構成音間の音程の関係を１２半音の範囲内で表すデータを保持させているためである。
【００５９】
ステップ９０３では、“０００００００００００１”を変数ｂの値分、左にシフトする操作を行い、それによって得られたものを変数ｃに代入する。続くステップ９０４では、変数Ｏｍｉｔの値、及び配列変数ｃｐの要素に保持されている、変数ｃｐｔｒの値で指定されるコードのタイプデータ（図中では「ｃｐ［ｃｐｔｒ］［ｔｙｐｅ］」と表記）により指定される配列変数ｃｈｏｔｏｎｅの要素の値を変数ｄに代入する。その後はステップ９０５に移行する。
【００６０】
ステップ９０５では、変数ｃの値と変数ｄの値をビット単位で論理積をとり、その論理積の論理和が１か否か判定する。変数ｄの値（２進数表現である）における、“０００００００００００１”を変数ｂの値分、左にシフトした位置に“１”が存在している場合、判定はＹＥＳとなり、変数ｐの値が示す音高がピッチセットの音高に該当しているとして、ステップ９０６で変数ｃｔｏｎｅに１を代入した後、一連の処理を終了する。そうでない場合には、判定はＮＯとなり、ステップ９０７で変数ｃｔｏｎｅに０を代入した後、一連の処理を終了する。
【００６１】
例えば変数Ｏｍｉｔに省略なし（図３参照）を示す値が代入されているのであれば、変数ｃｔｏｎｅには、変数ｐに変数ｃｐｔｒの値で指定されるコードの構成音の音高を示す値が代入されている場合に、必ず１が代入される。このように、図７のコード音選択処理では、変数Ｒｏｔａｔｅｎの値が０であれば、そのコードの構成音の音高を基本形のままピッチセットの音高として選択することになる。しかし、例えば変数Ｒｏｔａｔｅｎの値が１となると、そのコードの最低音であるルートは無視して、その代わりに１オクターブ高い音高を示す値が変数ｐに代入されたときに、その値が示す音高をピッチセットの音高として選択することになる。そのようにして、変数ｃｐｔｒの値で指定されるコードに対し、変数Ｒｏｔａｔｅｎの値で指定された転回数の転回を行って得られる音高の組み合わせをピッチセットとして選択するようになっている。
【００６２】
図６の編曲処理内で実行されるサブルーチン処理の説明に戻る。
図１０は、その編曲処理内でステップ６１１として実行される評価処理のフローチャートである。次に図１０を参照して、その評価処理について詳細に説明する。その評価処理は、上記コード音選択処理を実行することで選択したピッチセットの評価を行う処理である。
【００６３】
先ず、ステップ１００１では、直前のコード用に選択したピッチセットからの移動距離に注目して今回、選択したピッチセットの評価を行う移動距離評価処理を実行する。続くステップ１００２では、ユーザが指定した中心ポジション（変数ＨｏｍｅＰｉｔの値）に注目して今回、選択したピッチセットの評価を行う中心ポジション評価処理を実行する。その後はステップ１００３に移行する。
【００６４】
上記各評価処理の実行結果である評価値は、それぞれ、変数ｄ１、ｄ２に代入される。ステップ１００３では、それら変数ｄ１、ｄ２の値を用いて最終的な評価値を算出し、算出した評価値を変数ｖに代入する。その後に一連の処理を終了する。
【００６５】
本実施の形態では、変数ｄ１の値に変数Ａの値を掛けた値に、変数ｄ２の値に変数Ｂの値を掛けた値を加算し、その加算値を変数ｖに代入している。そのようにして、変数ｖに代入する値の算出にユーザが値を設定できる変数Ａ、Ｂの値を用いることにより、そのユーザが重要視する点を評価値（変数ｖの値）に反映させている。
【００６６】
以降は、上述の評価処理内で実行されるサブルーチン処理について、図１１、及び図１２を参照して詳細に説明する。
図１１は、上記ステップ１００１として実行される移動距離評価処理のフローチャートである。始めに図１１を参照して、その移動距離評価処理について詳細に説明する。
【００６７】
先ず、ステップ１１０１では変数ｉに０を代入する。続くステップ１１０２では、変数ｄ１に０を代入する。その後はステップ１１０３に移行する。
本実施の形態では、移動距離（２つのピッチセット間の距離）は、対応する音高間の音程の累算値として算出するようになっている。変数ｉはピッチセットのなかで注目する音程を管理するために用意した変数である。ステップ１１０３〜１１０６では、その変数ｉの値をインクリメントしながら、音程の累算値を算出していくための処理が行われる。
【００６８】
先ずステップ１１０３では、その累算値の算出が終了したか否か判定する。例えばコードの構成音数の上限と想定している値が変数ｉに代入されているような場合、判定はＹＥＳとなってステップ１１０７に移行する。そうでない場合には、判定はＮＯとなってステップ１１０４に移行する。
【００６９】
ステップ１１０４では、変数ｉの値で指定される配列変数ｖ１の要素ｖ１［ｉ］、及び配列変数ｖ２の要素ｖ２［ｉ］の各値が共に０以上か否か判定する。何れも０より小さいような場合、判定はＮＯとなってステップ１１０６に移行する。そうでない場合には、判定はＹＥＳとなってステップ１１０５に移行する。
【００７０】
ステップ１１０５では、配列変数ｖ１の要素ｖ１［ｉ］の値から配列変数ｖ２の要素ｖ２［ｉ］の値を減算した値の絶対値（半音単位）を変数ｄ１の値に加算し、その加算値を変数ｄ１に代入する。続くステップ１１０６では、変数ｉの値をインクリメントする。そのインクリメントを行った後は上記ステップ１１０３に戻る。
【００７１】
このように、本実施の形態では、直前のコード用として確定したピッチセットを構成する音高と、今回、選択したピッチセットを構成する音高とを対応付けし、その音程の絶対値を累算している。言い換えれば、次のコードを鳴らすための指全体の移動距離に注目した評価を行っている。それにより、手の移動量が比較的に小さくても、各指を比較的に大きく動かさなければならないピッチセットは低く評価するようにしている。なお、当然のことながら、ピッチセットの音高の中心などに注目してそれらの間の移動距離を算出するようにしても良い。
【００７２】
上記ステップ１１０３の判定がＹＥＳとなって移行するステップ１１０７以降では、今回のピッチセットが平行５度となる条件を満たしているか否かに注目して、変数ｄ１の値の更新を行うための処理が行われる。
先ず、ステップ１１０７では、変数ａに、配列変数ｖ１の要素ｖ１［２］（今回選択したピッチセットの低音側から３番目の音高）の値から配列変数ｖ１の要素ｖ１［０］（今回選択したピッチセットの最低音高）の値を引いた値の絶対値を代入する。続くステップ１１０８では、変数ｂに、配列変数ｖ２の要素ｖ２［２］（直前のコード用として確定したピッチセットの低音側から３番目の音高）の値から配列変数ｖ２の要素ｖ２［０］（直前のコード用として確定したピッチセットの最低音高）の値を引いた値の絶対値を代入する。その次に実行するステップ１１０９では、変数ｃに、配列変数ｖ１の要素ｖ１［０］の値から配列変数ｖ２の要素ｖ２［０］の値を引いた値を代入する。その代入後はステップ１１１０に移行する。
【００７３】
ステップ１１１０では、変数ａ、ｂの値が共に７で、且つ変数ｃの値が０でないか否か判定する。配列変数ｖ１、及びｖ２に、それぞれ、ルートの音高が異なり、且つ音高の間に完全５度（７半音）の音程が存在するピッチセットが保持されているような場合、判定はＹＥＳとなってステップ１１１１に移行し、変数ｄ１の値を、それまでの値に変数Ｃ（図４（ｂ）参照）の値を加算した値に更新（評価値を大きくすることにより評価を低くしている）した後、一連の処理を終了する。そうでない場合には、判定はＮＯとなり、変数ｄ１の値を更新することなく、一連の処理を終了する。
【００７４】
本実施の形態では、上述のように、今回のピッチセットが完全５度のままコード進行させるものであっても、ルートの音高が一致していれば変数ｄ１の値を更新しないようにしている。それにより、同じピッチセットのコードが連続しているような状況を禁止させないようにしつつ、音楽的な不具合が生じるのを回避させるようになっている。変数ｄ１の値の更新に変数Ｃの値を用いることにより、平行５度を禁止する度合いをユーザが指定できるようにさせている。これらのことは、平行８度などといった他の条件を対象に行うようにしても良い。
【００７５】
図１２は、図１０に示す評価処理内でステップ１００２として実行される中心ポジション評価処理のフローチャートである。次に図１２を参照して、その中心ポジション評価処理について詳細に説明する。この評価処理は、ユーザが指定した中心ポジション（変数ＨｏｍｅＰｉｔの値）からの移動距離に注目して今回、選択したピッチセットの評価を行うものである。
【００７６】
先ず、ステップ１２０１では変数ｉに０を代入する。続くステップ１２０２では、変数ｄ２に０を代入する。その後はステップ１２０３に移行する。
本実施の形態では、移動距離（今回のピッチセットと中心ポジション間の距離）は、ピッチセットを構成する各音高と中心ポジション（ユーザが指定した音高）間の音程の累算値として算出するようになっている。変数ｉはピッチセットのなかで注目する音高を管理するために用意した変数である。ステップ１２０３〜１２０６では、その変数ｉの値をインクリメントしながら、音程の累算値を算出していくための処理が行われる。
【００７７】
先ずステップ１２０３では、その累算値の算出が終了したか否か判定する。例えばコードの構成音数の上限と想定している値が変数ｉに代入されているような場合、判定はＹＥＳとなり、ここで一連の処理を終了する。そうでない場合には、判定はＮＯとなってステップ１２０４に移行する。
【００７８】
ステップ１２０４では、変数ｉの値で指定される配列変数ｖ１の要素ｖ１［ｉ］の値が０以上か否か判定する。０より小さいような場合、判定はＮＯとなってステップ１２０６に移行する。そうでない場合には、判定はＹＥＳとなってステップ１２０５に移行する。
【００７９】
ステップ１２０５では、配列変数ｖ１の要素ｖ１［ｉ］の値から変数ＨｏｍｅＰｉｔの値を減算した値の絶対値（半音単位）を変数ｄ２の値に加算し、その加算値を変数ｄ２に代入する。続くステップ１２０６では、変数ｉの値をインクリメントする。そのインクリメントを行った後は上記ステップ１２０３に戻る。
【００８０】
このようにして、本実施の形態では、今回、選択したピッチセットを構成する各音高と変数ＨｏｍｅＰｉｔの値で示される中心ポジションとの音程の絶対値を累算していくことにより、それらの間の移動距離を評価値として算出している。しかし、その算出は、例えば中心ポジションとピッチセットで中心となる音高との音程を求めるといったように、別の方法で行うようにしても良い。
【００８１】
なお、本実施の形態では、ピッチセットを構成する音高を選択する範囲である音域を絶対的な基準でユーザに指定させているが、その音域は、例えば直前のコード用に選択したピッチセットの中心となる音高を基準とした相対的なものとしても良い。それらを共に指定できるようにしても良い。それらは、音高を選択できる範囲を限定するのではなく、その範囲か否かを評価に反映させるために用いるようにしても良い。これらのことから明らかなように、本発明は様々な変形を行えるものである。コード進行上の各コードをリズムパターン上の音と対応付けし、コードの発音時間をリズムパターン上の音の発音時間とすることにより、シンプルな形の伴奏ラインを生成できるようにしても良い。
【００８２】
本実施の形態は、単独で用いられる自動編曲装置に本発明を適用したものである。しかし、本発明を適用できるのはそのような自動編曲装置に限定されるわけではない。その自動編曲装置は、電子楽器やシーケンサなどの楽音発生装置に搭載される、或いは外部装置と接続して用いられるものであっても良い。外部装置と接続して用いられるものであれば、１つのコードの内容を表すコードデータ（図４（ａ）参照）、或いはＭＩＤＩデータなどをリアルタイムで処理する形で編曲を行えるようにしても良い。このことから明らかなように、データの形式や編曲を実際に行う形態も本実施の形態に限定されるものではない。
【００８３】
上述したような自動編曲装置、或いはその変形例の動作を実現させるようなプログラムは、ＲＯＭ、ＣＤ−ＲＯＭ、フロッピーディスク、或いは光磁気ディスク等の記録媒体に記録させて配布しても良い。或いは、公衆網等で用いられる伝送媒体を介して、そのプログラムの一部、若しくは全部を配信するようにしても良い。そのようにした場合には、ユーザはプログラムを取得して自動編曲装置、或いはコンピュータなどのデータ処理装置にロードすることにより、それをロードした装置に本発明を適用させることができる。このことから、プログラムは、それを配信する装置がアクセスできるものであっても良い。
【００８４】
【発明の効果】
以上、説明したように本発明は、コード進行情報で表されるコード毎に、そのコードを構成する構成音の音高の組み合わせを複数、仮定し、その仮定した音高の組み合わせの評価を行い、その評価に従って、仮定した音高の組み合わせのなかから一つを選択する。そのように、複数、仮定した音高の組み合わせのなかから最も適切な組み合わせを選択するため、音楽的に自然で、且つ演奏が行い易い形での編曲を自動的に行うことができる。
【００８５】
組み合わせられる音高の音域をユーザに指定させるようにした場合には、そのユーザの希望を反映した編曲が行われることになる。このため、ユーザは、更に演奏が行い易い形での編曲を自動的に行わせることができる。
【図面の簡単な説明】
【図１】本実施の形態による自動編曲装置の回路構成図である。
【図２】本実施の形態による自動編曲装置の機能的構成を説明する図である。
【図３】コードトーンデータベースのデータ構成を説明する図である。
【図４】本実施の形態による自動編曲装置で扱われる変数を説明する図である。
【図５】全体処理のフローチャートである。
【図６】編曲処理のフローチャートである。
【図７】コード音選択処理のフローチャートである。
【図８】コード構成音数処理のフローチャートである。
【図９】コードトーン処理のフローチャートである。
【図１０】評価処理のフローチャートである。
【図１１】移動距離評価処理のフローチャートである。
【図１２】中心ポジション評価処理のフローチャートである。
【符号の説明】
１０１    ＣＰＵ
１０２    ＲＯＭ
１０３    ＲＡＭ
１０４    入力装置
１０５    モニター
１０６    バス
２０１    伴奏音決定手段
２０２    コード音選択手段
２０３    評価手段
２０４    コードトーンデータベース
２１１    コード進行データ
２１２    伴奏音演奏データ
【図１】
0004385532.tif 000002
【図２】
0004385532.tif 000003
【図３】
0004385532.tif 000004
【図４】
0004385532.tif 000005
【図５】
0004385532.tif 000006
【図６】
0004385532.tif 000007
【図７】
0004385532.tif 000008
【図８】
0004385532.tif 000009
【図９】
0004385532.tif 000010
【図１０】
0004385532.tif 000011
【図１１】
0004385532.tif 000012
【図１２】
0004385532.tif 000013