以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。図1は、自動作曲装置100の実施形態のブロック図である。この自動作曲装置100は、モチーフ入力部101、コード進行選択部102、伴奏・コード進行データベース(以下、「データベース」を「DB」と称する)103、ルールDB104、メロディ生成部105、フレーズセットDB106、および出力部107を備える。
モチーフ入力部101は、いわゆるAメロ、Bメロ、Cメロ(サビメロ)などの、曲調を決定付ける特徴的なメロディ部分のいずれかを、入力モチーフ108としてユーザに入力させる。入力モチーフ108は、Aメロ部分のモチーフであるモチーフA、Bメロ部分のモチーフであるモチーフB、あるいはCメロ(サビメロ)部分のモチーフであるモチーフCのいずれかであり、例えば各メロディ部分の先頭の2小節の長さを有する。モチーフ入力部101は例えば、ユーザが鍵盤によりメロディを入力する鍵盤入力部101−1、ユーザがマイクから歌声によりメロディを入力する音声入力部101−2、ユーザがメロディを構成する音符のデータをキーボード等から入力する音符入力部101−3のいずれか一つ以上の手段を備える。また入力部101は、Aメロ、Bメロ、Cメロ(サビメロ)というモチーフの種別を入力する、独立した操作子等を有する。
コード進行選択部102は、伴奏・コード進行DB103に記憶されている複数のコード進行データごとに、ルールDB104を参照しながら、そのコード進行データがモチーフ入力部101から入力された入力モチーフ108にどの程度適合しているかを示す適合度を算出し、適合度が高かった例えば上位3個のコード進行データをそれぞれ指し示す#0、#1、#2のコード進行候補指示データ(図1中では「コード進行候補」と表示)109を出力する。
メロディ生成部105は、例えばユーザに、コード進行選択部102が出力した#0、#1、#2のコード進行候補指示データ109に対応する3つのコード進行候補のうちの1つを選択させる。あるいは、メロディ生成部105は、#0、#1、#2のコード進行候補指示データ109のいずれかに対応するコード進行候補を自動的に順番に選択するようにしてもよい。この結果、メロディ生成部105は、選択されたコード進行候補に対応する曲構造データを、伴奏・コード進行DB103から読み込む。メロディ生成部105は、この曲構造データによって示される小節のフレーズごとに、入力モチーフ108とフレーズセットDB106に登録されているフレーズセット、およびルールDB104を参照しながら、そのフレーズのメロディを自動生成する。メロディ生成部105は、楽曲全体の小節にわたってメロディの自動生成処理を実行し、自動生成されたメロディ110を出力する。
出力部107は、メロディ生成部105が自動生成したメロディデータ110に基づいてメロディの楽譜を表示する楽譜表示部107−1と、メロディデータ110および伴奏・コード進行DB103から取得した伴奏用MIDI(Musical Instrument Digital Interface)データとに基づいて、メロディおよび伴奏の再生を実行する楽音再生部107−2とを備える。
次に、図1の機能構成を有する自動作曲装置100の動作の概略について説明する。図2は、本実施形態において自動作曲される楽曲の構造例を示す図である。楽曲は通常、イントロ、Aメロ、Bメロ、間奏、Cメロ(サビメロ)、エンディングなどのフレーズから構成される。イントロは、メロディが開始する前の伴奏のみからなる前奏部分である。Aメロは、通常、イントロの次に出てくるフレーズをいい、曲の中で一般には落ち着いたメロディが奏でられる。Bメロは、Aメロの次にでてくるフレーズをいい、Aメロより少し盛り上がった曲調になることが多い。Cメロは、Bメロの次に出てくるフレーズの場合が多く、日本の曲だとCメロが曲で一番盛り上がるサビメロになる場合が多い。エンディングは、イントロの逆で、曲の終わりのフレーズをいう。間奏は、例えば1曲目と2曲目の間のメロディの存在しない楽器演奏のみのフレーズである。図2に示される楽曲の構造例では、イントロ、Aメロ、Bメロ、Aメロ、間奏、Aメロ、Bメロ、Cメロ、エンディングの順に楽曲が構成されている。
本実施形態では、ユーザは例えば、楽曲中で最初に現れるAメロの例えば先頭2小節のメロディを、モチーフ入力部101(図1参照)から、図2(a)のモチーフAとして(図1の入力モチーフ108の一例)として入力することができる。または、ユーザは例えば、楽曲中で最初に現れるBメロの例えば先頭2小節のメロディを、モチーフ入力部101(図1参照)から、図2(b)のモチーフB(図1の入力モチーフ108の他の一例)として入力モチーフ108として入力することができる。あるいは、ユーザは例えば、楽曲中で最初に現れるCメロ(サビメロ)の例えば先頭2小節のメロディを、モチーフ入力部101(図1参照)から、図2(c)のモチーフC(図1の入力モチーフ108のさらに他の一例)として入力することができる。
図3(a)は、上述のように入力される入力モチーフ108の音符例を示す図である。このように、入力モチーフ108としては、例えば2小節分のメロディが指定される。
このような入力に対して、コード進行選択部102(図1参照)が、伴奏・コード進行DB103に登録されているコード進行データの中から、例えば上位3位まで適合するコードとキー、スケールとからなるコード進行データを抽出する。コード進行データを構成するコードおよびキー、スケールは、図2(f)および(g)に示されるように、楽曲全体にわたって設定されている。
図3(b)は、上位3位までのコード進行データによって表されるコード進行(コードおよびキー、スケール)#0、#1、#2の例を示す図である。
図1のメロディ生成部105は、これらの情報に基づいて、入力モチーフ108が入力された図2(a)、(b)、または(c)のいずれかのフレーズ部分以外の図2(d)に示されるフレーズ部分に対応するメロディを自動生成し、入力モチーフ108のメロディとともにメロディ110として出力する。そして、図1の出力部107が、自動生成されたメロディ110に対応する楽譜表示または放音を行う。なお、伴奏については、伴奏・コード進行DB103において最終的に選択されたコード進行に対応して登録されている伴奏用MIDIデータが順次読み出されて、そのデータに基づいて図2(e)に示されるように楽曲全体にわたり伴奏が行われる。
図4は、図1のモチーフ入力部101において、ユーザ入力に基づいて生成される入力モチーフ108のデータ構成例を示す図である。図4(a)に示されるように、入力モチーフ108は、#0、#1、・・・という複数のノートデータによって構成され、最後に終端コードが記憶される。各ノートデータは、例えば図3(a)に例示される入力モチーフ108を構成する例えば2小節分の音符のそれぞれに対応し、モチーフとなるメロディ音の発音を指示するデータである。図4(b)に示されるように、1つのノートデータは、そのノートデータに対応する音符の発音タイミングを例えば入力モチーフ108の先頭からの経過時間として示す「時間」データと、音符の長さを示す「長さ」データと、音符の強さを示す「強さ」データと、音符の音高を示す「ピッチ」データとから構成される。これらのデータによって、図3(a)に例示されるような2小節分の入力モチーフ108中の1つの音符が表現される。
図5は、図1の伴奏・コード進行DB103のデータ構成例を示す図である。図5(a)に示されるように、コード進行DBには、1つのレコード(図5(a)の1行)がコード進行データ、伴奏用MIDIデータ、および曲構造データとからなる、#0、#1、・・・という複数レコードが記憶され、最後に終端コードが記憶される。
1レコード中のコード進行データは、楽曲の1曲分のコード進行を示している。図5(a)に示されるコード進行DBには例えば、50レコード=50曲分のコード進行データが記憶されている。1レコード中(=1曲分)のコード進行データは、図5(b)に示されるように、#0、#1、・・・という複数のコードデータから構成され、最後に終端コードが記憶される。コードデータには、あるタイミングにおけるキーおよびスケールを指定するデータ(図5(c))と、あるタイミングにおけるコードを指定するデータ(図5(d))とがある(図3(b)参照)。キーおよびスケールを指定するデータは、図5(c)に示されるように、そのキーおよびスケールが始まるタイミングを示す「時間」データと、「キー」データと、「スケール」データとから構成される。コードを指定するデータは、図5(d)に示されるように、そのコードが始まるタイミングを示す「時間」データと、コードの根音(ルート)を示す「ルート」データ、およびコードのタイプ(種類)を示す「タイプ」データとから構成される。コード進行データは例えば、MIDI規格のメタデータとして記憶される。
図5(a)に示される伴奏・コード進行DB103の1レコード中(=1曲分)の曲構造データは、図6に示されるデータ構成例を有する。この曲構造データは、1曲中の小節ごとに1レコード(図6の1行)を形成する。曲構造データ中の1レコードには、その小節に対応するフレーズの種別およびそのフレーズにメロディが存在するか否かを示す情報が記憶される。
図6に示される曲構造データにおいて、「Measure」項目には、各レコードのデータが楽曲中の何小節目であるかを示す値が登録される。以降、「Measure」項目の値がMであるレコードを第Mレコード、そのレコードが示す小節を第M+1小節とする。例えば「Measure」項目の値が0であるときそのレコードは第0レコード/第1小節、その値が1であるときそのレコードは第1レコード/第2小節である。
図6に示される曲構造データにおいて、「PartName[M]」項目および「iPartID[M]」項目(「M」は「Measure」項目の値)にはそれぞれ、第Mレコード/第M+1小節のフレーズの種別およびその種別に対応する識別値を示すデータが登録される。例えば、第0レコード(第1小節)の「PartName[M]」項目および「iPartID[M]」項目の値「Null」および「0」は、その小節が無音であることを示している。第1、2レコード(第2,3小節)の「PartName[M]」項目および「iPartID[M]」項目の値「Intro」および「1」は、その小節がイントロフレーズであることを示している。第3〜10、28〜34レコード(第4〜11、29〜35小節)の「PartName[M]」項目および「iPartID[M]」項目の値「A」および「11」は、その小節がAメロのフレーズであることを示している。第11〜18レコード(第12〜19小節)の「PartName[M]」項目および「iPartID[M]」項目の値「B」および「12」は、その小節がBメロのフレーズであることを示している。第19〜27レコード(第20〜28小節)の「PartName[M]」項目および「iPartID[M]」項目の値「C」および「13」は、その小節がCメロ(またはサビメロディ)のフレーズであることを示している。第35レコード(第36小節)の「PartName[M]」項目および「iPartID[M]」項目の値「Ending」および「3」は、その小節がエンディングのフレーズであることを示している。
また、図6に示される曲構造データにおいて、「ExistMelody[M]」項目(「M」は「Measure」項目の値)には、第Mレコード(第M+1小節)のフレーズにメロディが存在するか否かを示す値が登録される。メロディが存在するならば値「1」が、存在しないならば値「0」が登録される。例えば、M=0、1、2、または35(第0、1、2、35レコード(第1、2、3、36小節))である「PartName[M]」項目が「Null」、「Intro」、または「Ending」の各フレーズの「ExistMelody[M]」項目には値「0」が登録されて、メロディが存在しないことが示される。PartName[M]=「Null」の場合は無音で、PartName[M]=「Intro」、または「Ending」の場合は伴奏のみが存在する。
また、図6に示される曲構造データにおいて、「iPartTime[M]」項目(「M」は「Measure」項目の値)には、第Mレコードに対応する第M+1小節の小節開始時間データが登録される。図6中では空欄になっているが、各レコードに実際の時間値が格納される。
以上の図6に示される曲構造データは例えば、MIDI規格のメタデータとして記憶される。
図2で前述したように、ユーザは例えば、図6の曲構造データで最初に現れるAメロの例えば先頭2小節である第3、4レコード(第4、5小節)のメロディを、モチーフA(図2(a)参照)として、モチーフ入力部101(図1参照)から入力できる。または、ユーザは例えば、図6の曲構造データで最初に現れるBメロの例えば先頭2小節である第11、12レコード(第12、13小節)のメロディを、モチーフB(図2(b)参照)として、モチーフ入力部101から入力できる。あるいは、ユーザは例えば、図6の曲構造データで最初に現れるCメロ(サビメロ)の例えば先頭2小節である第19、20レコード(第20、21小節)のメロディを、モチーフC(図2(c)参照)として、モチーフ入力部101から入力できる。
コード進行選択部102は、伴奏・コード進行DB103に記憶されているコード進行データごと(以下「評価対象のコード進行データ」と記載する)に、その評価対象のコード進行データがモチーフ入力部101から入力された入力モチーフ108にどの程度適合しているかを示す適合度を算出する。
本実施形態では、入力モチーフ108に対する評価対象のコード進行データの適合度を、音楽理論におけるアヴェイラブルノートスケールの概念を使って算出する。アヴェイラブルノートスケールは、コード進行が与えられたときに、メロディに使うことが可能な音を音階として表したものである。アヴェイラブルノートスケールを構成するノートの種類(以下、「ノートタイプ」と呼ぶ)としては、例えば、コードトーン、アヴェイラブルノート、スケールノート、テンションノート、アヴォイドノートがある。コードトーンは、スケールの元となるコードの構成音であって、メロディとして1音は用いることが望ましいノートタイプである。アヴェイラブルノートは、メロディに一般的に使用可能なノートタイプである。スケールノートは、スケールの構成音であり、その音を長い音などで加えると、元々のコードサウンドとぶつかってしまうので、取り扱いに注意を要するノートタイプである。テンションノートは、コード音にかぶせられる、コードのテンションで用いられている音で、高次のテンションほどサウンドの緊張感が増したり色彩豊かなサウンドになるノートタイプである。アヴォイドノートは、コードと不協和な音で、使用を避けるか、短い音符で用いることが望ましいとされるノートタイプである。本実施形態では、入力モチーフ108を構成する各ノート(図3(a)の各音符)について、そのノートの発音タイミングに対応する評価対象のコード進行データ中のキーおよびスケールとコードの根音およびコードタイプとに基づいて、そのノートの当該コード進行上でのノートタイプが算出される。
上述した、入力モチーフ108を構成する各ノート(図3(a)の各音符)のノートタイプを取得するために、本実施形態では、標準ピッチクラスセットテーブルが使用される。図7は、標準ピッチクラスセットテーブルのデータ構成例を示す図である。標準ピッチクラスセットテーブルはコード進行選択部102内のメモリ領域(例えば後述する図4のROM1402内)に置かれる。標準ピッチクラステーブルは、図7(a)に例示されるコードトーンテーブル、図7(b)に例示されるテンションノートテーブル、および図7(c)に例示されるスケールノートテーブルから構成される。
図7(a)、(b)、または(c)のテーブルにおいて、その1行に対応する1組のピッチクラスセットは、コードまたはスケールの根音を第0音(第0ビット目)の音階構成音としたときの1オクターブ分の半音階を構成する第0音(第0ビット目)(図中の行の右端)から第11音(第11ビット目)(図中の行の左端)の音階構成音のそれぞれに対して、「0」または「1」の値が与えられる、合計12ビットのデータで構成される。1組のピッチクラスセットにおいて、値「1」が与えられた音階構成音はそれがピッチクラスセットの構成要素に含まれ、値「0」が与えられた音階構成音はそれがピッチクラスセットの構成要素に含まれないことを示す。
図7(a)のコードトーンテーブル内の各行に対応するピッチクラスセット(以下、「コードトーンピッチクラスセット」と呼ぶ)は、その右端に記載されているコードタイプについて、そのコード根音が第0音(第0ビット目)の音階構成音として与えられたときに、どの音階構成音がそのコードタイプのコード構成音であるかを記憶する。例えば、図7(a)に例示されるコードトーンテーブルの1行目において、コードトーンピッチクラスセット「000010010001」は、第0音(第0ビット目)、第4音(第4ビット目)、および第7音(第7ビット目)の各音階構成音がコードタイプ「MAJ」のコード構成音であることを表わしている。
図1のコード進行選択部102は、入力モチーフ108を構成するノートごと(以下、このノートを「現在ノート」と呼ぶ)に、その現在ノートのピッチが、その現在ノートの発音タイミングに対応する評価対象のコード進行データ中のコード根音に対して、どの音程(以下、これを「コード音程」と呼ぶ)を有するかを算出する。このとき、コード進行選択部102は、現在ノートのピッチを、その現在ノートの発音タイミングに対応する評価対象のコード進行データ中のコード根音を第0音の音階構成音としたときの、第0音から第11音までの1オクターブ内の音階構成音のいずれかに写像させる演算を行い、その写像位置の音(第0音から第11音のいずれか)を、上記コード音程として算出する。そして、コード進行選択部102は、上記発音タイミングにおける評価対象のコード進行データ中のコードタイプに対応する図7(a)に例示されるコードトーンテーブル上のコードトーンピッチクラスセットのコード構成音に、上記算出されたコード音程が含まれるか否かを判定する。
図7(b)のテンションノートテーブル内の各行に対応するピッチクラスセット(以下、「テンションノートピッチクラスセット」と呼ぶ)は、その右端に記載されているコードタイプについて、そのコード根音が第0音(第0ビット目)の音階構成音として与えられたときに、どの音階構成音がそのコードタイプに対するテンションであるかを記憶する。例えば、図7(b)に例示されるテンションノートテーブルの1行目において、テンションノートピッチクラスセット「001001000100」は、第2音(第2ビット目)、第6音(第6ビット目)、および第9音(第9ビット目)がコードタイプ「MAJ」(コード根音=C)に対するテンションであることを表わしている。
図1のコード進行選択部102は、現在ノートの発音タイミングにおける評価対象のコード進行データ中のコードタイプに対応する図7(b)に例示されるテンションノートテーブル上のテンションノートピッチクラスセットのテンションノートに、前述した現在ノートのピッチのコード根音に対するコード音程が含まれるか否かを判定する。
図7(c)のスケールノートテーブル内の各行に対応するピッチクラスセット(以下、「スケールノートピッチクラスセット」と呼ぶ)は、その右端に記載されているスケールについて、そのスケールの根音が第0音(第0ビット目)の音階構成音として与えられたときに、どの音階構成音がそのスケールに対応するスケール構成音であるかを記憶する。例えば、図7(c)に例示されるスケールノートテーブルの1行目において、スケールノートピッチクラスセット「101010110101」は、第0音(第0ビット目)、第2音(第2ビット目)、第4音(第4ビット目)、第5音(第5ビット目)、第7音(第7ビット目)、第9音(第9ビット目)、および第11音(第11ビット目)がスケール「ダイアトニック」のスケール構成音であることを表している。
図1のコード進行選択部102は、現在ノートのピッチが、その現在ノートの発音タイミングに対応する評価対象のコード進行データ中のキーに対して、どの音程(以下、これを「キー音程」と呼ぶ)を有するかを算出する。このとき、コード進行選択部102は、コード音程の算出の場合と同様に、現在ノートのピッチを、その現在ノートの発音タイミングに対応する評価対象のコード進行データ中のキーを第0音の音階構成音としたときの、第0音から第11音までの1オクターブ内の音階構成音のいずれかに写像させる演算を行い、その写像位置の音を、上記キー音程として算出する。そして、コード進行選択部102は、上記発音タイミングにおける評価対象のコード進行データ中のスケールに対応する図7(c)に例示されるスケールノートテーブル上のスケールノートピッチクラスセットのスケール構成音に、上記算出されたキー音程が含まれるか否かを判定する。
以上のようにして、コード進行選択部102は、入力モチーフ108の現在ノートの発音タイミングにおける評価対象のコード進行データ中のコードタイプに対応する図7(a)に例示されるコードトーンテーブル上のコードトーンピッチクラスセットのコード構成音にコード音程が含まれるか否かを判定する。また、コード進行選択部102は、上記コードタイプに対応する図7(b)に例示されるテンションノートテーブル上のテンションノートピッチクラスセットのテンションノートにコード音程が含まれるか否かを判定する。さらに、コード進行選択部102は、評価対象のコード進行データ中のスケールに対応する図7(c)に例示されるスケールノートテーブル上のスケールノートピッチクラスセットのスケール構成音にキー音程が含まれるか否かを判定する。そして、コード進行選択部102は、これらの判定に基づいて、現在ノートが、コードトーン、アヴェイラブルノート、スケールノート、テンションノート、またはアヴォイドノートのいずれに該当するか、すなわちノートタイプの情報を取得する。ノートタイプ取得処理の詳細については、図22の説明において詳述する。
図8(a)は、図3(a)に例示される入力モチーフ108の各ノートのピッチ(図8(a)中の灰色の部分)ごとに、図1の伴奏・コード進行DB103から読み出される図3(b)に例示される#0、#1、#2の3つの評価対象のコード進行データの例のそれぞれに対して、コード進行選択部102が取得するノートタイプの例を示す図である。図8(a)において、「C」はコードトーン、「A」はアヴェイラブルノート、「S」はスケールノート、「V」はアヴォイドノートの、ノートタイプをそれぞれ示す値である。また、図示していないが、「T」はテンションノートのノートタイプを示す値である。なお、この図では、表記の簡略化のために、各ノートタイプを示す値をアルファベット1文字で表しているが、実際のメモリに記憶される各ノートタイプの値としては例えば、コードトーンを示す定数値としてci_ChordTone(表記「C」と等価)、アヴェイラブルノートを示す定数値としてci_AvailableNote(表記「A」と等価)、スケールノートを示す定数値としてci_ScaleNote(表記「S」と等価)、テンションノートを示す定数値としてci_TensionNote(表記「T」と等価)、アヴォイドノートを示す定数値としてci_AvoidNote(表記「V」と等価)が用いられる(後述する図15A参照)。
次に、コード進行選択部102は、入力モチーフ108の各ノートのピッチごとに、隣接するピッチ間の半音単位の音程(以下、「隣接音程」と呼ぶ)を算出する。図8(b)の「隣接音程」は、入力モチーフ108各ノートのピッチ(図8(b)中の灰色の部分)間の音程の算出結果の例を示す図である。
コード進行選択部102は、評価対象のコード進行データに対して、上述のように算出したノートタイプと隣接音程が交互に格納された配列変数データ(以下、この配列変数データを「incon[i]」(「i」は配列番号)と記載する)を生成する。図8(c)は、図1の伴奏・コード進行DB103から読み出される図3(b)に例示される#0、#1、#2の3つの評価対象のコード進行データの例のそれぞれに対して算出された配列変数データincon[i]の例を示す図である。図8(c)のコード進行#0、#1、#2のそれぞれの配列変数データincon[i]において、偶数番目の配列番号i=0、2、4、6、8、10、12、14、16、18の各要素には、図8(a)のコード進行#0、#1、#2のそれぞれのノートタイプが先頭から順次コピーされる。また、コード進行#0、#1、#2のそれぞれの配列変数データincon[i]において、奇数番目の配列番号i=1、3、5、7、9、11、13、15、17の各要素にはともに、図8(b)の隣接音程が先頭から順次コピーされる。
次に、コード進行選択部102は、現在の評価対象のコード進行データに対して上述のように算出した入力モチーフ108の各ノートのノートタイプと隣接音程を格納した配列変数データincon[i](i=0、1、2、3、・・・)において、配列番号0から順に例えば4組ずつ、ノートタイプと隣接音程の組合せの規則(以下、この規則を「ノート接続ルール」と呼ぶ)を評価するノート接続性チェック処理を実行する。このノート接続性チェック処理において、コード進行選択部102は、図1のルールDB104に記憶されているノート接続ルールを参照する。
図9は、ルールDB104に記憶されるノート接続ルールのデータ構成例を示す図である。ノート接続ルールには、3音のルールと4音のルールがあり、説明の便宜上、それぞれに例えば、「コードトーン」、「刺繍音」、「経過音」、「倚音」、「逸音」などの名称を付けてある。また、各ノート接続ルールには、メロディを形成する上でどの程度適合しているかを評価するための評価点が付与されている。さらに、本実施形態では、ノート接続ルールを示す変数として、ci_NoteConnect[j][2k](0≦k≦3)およびci_NoteConnect[j][2k+1](0≦k≦2)という配列変数データを用いる。ここで、変数データ「j」は、ルールDB104におけるj番目(図9中ではj行目)のノート接続ルールのデータを指す。また、変数データ「k」は、0から3までの値をとる。そして、ci_NoteConnect[j][2k]=ci_NoteConnect[j][0]、ci_NoteConnect[j][2]、ci_NoteConnect[j][4]、ci_NoteConnect[j][6]
にはそれぞれ、j番目のノート接続ルールにおける1ノート目(ノートタイプ#0)、2ノート目(ノートタイプ#1)、3ノート目(ノートタイプ#2)、および4ノート目(ノートタイプ#3)の各ノートタイプが格納される。なお、4ノート目(ノートタイプ#3)が「ci_NullNoteType」となっているj=0からj=8までのノート接続ルールは、4ノート目のノートタイプは無いことを示しており、実質的に3音からなるノート接続ルールであることを示している。また、ci_NoteConnect[j][2k+1]=ci_NoteConnect[j][1]、ci_NoteConnect[j][3]、ci_NoteConnect[j][5]にはそれぞれ、j番目のノート接続ルールにおける1ノート目(#0)と2ノート目(#1)の隣接音程、2ノート目(#1)と3ノート目(#2)の隣接音程、および3ノート目(#2)と4ノート目(#3)の隣接音程が格納される。隣接音程の数値は、半音単位の音程を示し、プラス値は音程が上がることを示し、マイナス値は音程が下がることを示す。また、値「99」は、音程がどの値でもよいことを示し、値「0」は音程が変化しないことを示す。なお、4ノート目(ノートタイプ#3)が「ci_NullNoteType」となっているj=0からj=8までのノート接続ルールは、前述したように4ノート目のノートタイプは無い(値が「ci_NullNoteType」である)ため、3ノート目(#2)と4ノート目(#3)の隣接音程が格納されるci_NoteConnect[j][5]の値は「0」とされる。最後の、ci_NoteConnect[j][7]には、j番目のノート接続ルールの評価点が格納される。
以上のようなデータ構成を有するノート接続ルールとして、図9に例示されるようにj=0からj=17までの18ルールが、図1のルールDB104に予め登録されている。
コード進行選択部102は、上記構成を有するノート接続ルールを用いて、ノート接続性チェック処理を実行する。コード進行選択部102は、図10(a)に例示される2小節分の入力モチーフ108の先頭のノートから順に、図10(b)のi=0〜6に示されるように4ノートずつ、各ノートに対応して配列変数データincon[i]に格納されているノートタイプと隣接音程の組と、j=0からj=17までのノート接続ルールのよりj=0から順に選択した1組のノート接続ルールのノートタイプと隣接音程の組とが一致するか否かを比較する。
例えば、コード進行選択部102は、図10(b)のi=0では、i=0の右横の矢印で示されるように、入力モチーフ108の第1、2、3、4ノート目(図中では1音、2音、3音、4音目)のノートタイプおよび隣接音程の各組が、図9に例示されるj=0、1、2、3、・・・の各ノート接続ルールの4組のノートタイプおよび隣接音程の組と一致するか否かを比較する。
まず、図9に例示されるj=0のノート接続ルールでは、#0、#1、および#2のノートタイプがともにコードトーン(ci_ChordTone)となる。これに対して、例えば評価対象のコード進行データが図3(b)に例示される#0のコード進行である場合には、図3(a)に対応する図10(a)の入力モチーフ108に対応するノートタイプと隣接音程の配列変数データincon[i]は、図8の説明で前述したように、図10(c)のコード進行#0の右横に示されるデータとなる。従って、入力モチーフ108の第1、2、3、4ノート目のノートタイプは、コードトーン(C)、アヴェイラブルノート(A)、コードトーン(C)となって、j=0のノート接続ルールとは一致しない。この場合には、j=0のノート接続ルールの評価点は加算されない。
次に、図9に例示されるj=1のノート接続ルールでは、#0、#1、および#2のノートタイプが、コードトーン(ci_ChordTone)、アヴェイラブルノート(ci_AvailableNote)、コードトーン(ci_ChordTone)となる。これに対して、例えば評価対象のコード進行データが図3(c)に例示される#0のコード進行である場合には、図10(c)のコード進行#0の右横に示されるノートタイプと隣接音程の配列変数データincon[i]より得られる、入力モチーフ108の第1、2、3、4ノート目のノートタイプと一致する。しかし、j=1のノート接続ルールにおける第1音(#0)と第2音(#1)の隣接音程は「−1」、第2音(#1)と第3音(#2)の隣接音程は「1」であり、これは、図10(c)のコード進行#0の右横に示されるノートタイプと隣接音程の配列変数データincon[i]より得られる、入力モチーフ108の第1音と第2音間の隣接音程「−2」および第2音と第3音間の隣接音程「2」と一致しない。従って、j=1の場合もj=0の場合と同様に、ノート接続ルールの評価点は加算されない。
次に、図9に例示されるj=2のノート接続ルールでは、#0、#1、および#2のノートタイプが、コードトーン(ci_ChordTone)、アヴェイラブルノート(ci_AvailableNote)、コードトーン(ci_ChordTone)となる。これに対して、例えば評価対象のコード進行データが図3(c)に例示される#0のコード進行である場合には、図10(c)のコード進行#0の右横に示されるノートタイプと隣接音程の配列変数データincon[i]より得られる、入力モチーフ108の第1、2、3、4ノート目のノートタイプと一致する。また、j=1のノート接続ルールにおける第1音(#0)と第2音(#1)の隣接音程は「−2」、第2音(#1)と第3音(#2)の隣接音程は「2」であり、これは、図10(c)のコード進行#0の右横に示されるノートタイプと隣接音程の配列変数データincon[i]より得られる、入力モチーフ108の第1音と第2音間の隣接音程および第2音と第3音間の隣接音程と一致する。さらに、j=2のノート接続ルールの4ノート目(ノートタイプ#3)は、ノートタイプが無いことを示す値「ci_NullNoteType」であるため、入力モチーフ108の4ノート目は比較しなくてよい。以上より、評価対象のコード進行データが#0である場合の入力モチーフ108の第1、2、3音が、図9のj=2のノート接続ルールと適合することがわかり、j=2のノート接続ルールの評価点(ci_NoteConnect[2][7])=90点が、評価対象のコード進行データ#0に対応する総合評価点に加算される。図10(c)のコード進行#0に記載されている「<− No2:90 −>」の表示が、その加算処理に対応する。
以上のようにして、ノート接続ルールが見つかると、そのノート接続ルール以降のノート接続ルールについては、図10(b)のi=0の入力モチーフ108の第1、2、3、4ノートのノートタイプおよび隣接音程の組に対しての評価は実施されない。
図10(b)のi=0の入力モチーフ108の第1、2、3、4ノートのノートタイプおよび隣接音程の組に対する評価が終了すると、入力モチーフ108上の評価対象のノートが1つ進められ、図10(b)のi=1の状態になって、i=1の右横の矢印で示されるように、入力モチーフ108の第2、3、4、5ノート目のノートタイプおよび隣接音程の各組が、図9に例示されるj=0、1、2、3、・・・の各ノート接続ルールの4組のノートタイプおよび隣接音程の組と一致するか否かが比較される。この結果、図10(c)の評価対象のコード進行データ#0に対応する入力モチーフ108の第2、3、4、5ノート目のノートタイプおよび隣接音程の各組については、全てのノート接続ルールと一致せず、図10(b)のi=1の入力モチーフ108の第2、3、4、5ノートのノートタイプおよび隣接音程の組に対する評価点は0点となって、評価対象のコード進行データ#0に対応する総合評価点への加算は行われない。
図10(b)のi=1の入力モチーフ108の第2、3、4、5ノートのノートタイプおよび隣接音程の組に対する評価が終了すると、入力モチーフ108上の評価対象のノートがさらに1つ進められ、図10(b)のi=2の状態になって、i=2の右横の矢印で示されるように、入力モチーフ108の第3、4、5、6ノート目のノートタイプおよび隣接音程の各組が、図9に例示されるj=0、1、2、3、・・・の各ノート接続ルールの4組のノートタイプおよび隣接音程の組と一致するか否かが比較される。この結果、図10(c)の評価対象のコード進行データ#0に対応する入力モチーフ108の第3、4、5、6ノート目のノートタイプおよび隣接音程の各組については、図9のj=3のノート接続ルールが適合することがわかり、j=3のノート接続ルールの評価点(ci_NoteConnect[3][7])=80点が、評価対象のコード進行データ#0に対応する総合評価点に加算される。図10(c)のコード進行#0に記載されている「<− No3:80 −>」の表示が、その加算処理に対応する。この結果、総合評価点は、90点+80点=170点となる。
以降同様にして、図10(b)のi=7の入力モチーフ108の第8、9、10ノートのノートタイプおよび隣接音程の組に対する評価までが実行される。なお、本実施形態では評価は原則は4ノートずつ行われるが、最後のi=7の場合のみ、入力モチーフ108の3ノートに対して、図9のj=0からj=8までのノートタイプ#3が「ci_NullNoteTypeである」である3音のノート接続ルールが比較される。
以上のようにして、図10(c)の評価対象のコード進行データ#0に対応する入力モチーフ108の各ノートごとの評価処理が終了すると、その時点で評価対象のコード進行データ#0に対応して算出されている総合評価点が、その評価対象のコード進行データ#0の入力モチーフ108に対する適合度とされる。
例えば評価対象のコード進行データが図3(c)に例示される#1または#2の各コード進行である場合は、図3(a)に対応する図10(a)の入力モチーフ108に対応するノートタイプと隣接音程の配列変数データincon[i]は、図8の説明で前述したように、図10(c)のコード進行#1の右横に示されるデータまたは#2の右横に示されるデータとなる。これらの配列変数データincon[i]についても上述したコード進行#0の場合と同様の評価処理が実行される。例えば、コード進行#1の場合は、図10(c)に示されるように、図9のノート接続ルールと適合する部分がないため、その総合評価点は0点となり、これがコード進行#1の入力モチーフ108に対する適合度となる。また、コード進行#2の場合は、図10(c)に示されるように、入力モチーフ108の第5、6、7ノート目のノートタイプおよび隣接音程の各組について、図9のj=5のノート接続ルールが適合することがわかり、j=5のノート接続ルールの評価点(ci_NoteConnect[5][7])=95点が、評価対象のコード進行データ#2に対応する総合評価点に加算され、これがコード進行#2の入力モチーフ108に対する適合度となる。
図1のコード進行選択部102は、以上の適合度の算出処理を、伴奏・コード進行DB103に記憶されている複数のコード進行データに対して実行し、適合度が高かった例えば上位3個のコード進行データをそれぞれ指し示す#0、#1、#2のコード進行候補指示データ109を出力する。なお、以上の処理において、入力モチーフ108と伴奏・コード進行DB103中の各コード進行データとは、キーが必ずしも一致しているとは限らないため、各コード進行データを1オクターブを構成する12段階にキーシフトさせたデータが、入力モチーフ108と比較される。
次に、図1のメロディ生成部105の動作の概略について説明する。まず、図11は、図1のフレーズセットDB106のデータ構成例を示す図である。図11(a)に示されるように、フレーズセットDB106には、#0、#1、・・・という複数のフレーズセットデータのレコードが記憶され、最後に終端コードが記憶される。
1レコード分のフレーズセットデータは、図11(b)に示されるように、Aメロデータ、Bメロデータ、Cメロ(サビメロディ)データ、エンディング1データ、エンディング2データの、複数のフレーズデータから構成される。
図11(b)の各フレーズデータは、図11(c)に示されるように、#0、#1、・・・という複数のノートデータによって構成され、最後に終端コードが記憶される。各ノートデータは、各フレーズを構成する1小節分以上の音符のそれぞれに対応し、各フレーズのメロディ音の発音を指示するデータである。図11(d)に示されるように、1つのノートデータは、そのノートデータに対応する音符の発音タイミングを例えばフレーズの先頭からの経過時間として示す「時間」データと、音符の長さを示す「長さ」データと、音符の強さを示す「強さ」データと、音符の音高を示す「ピッチ」データとから構成される。これらのデータによって、フレーズを構成する各音符が表現される。
図1のメロディ生成部105は、コード進行選択部102が出力した#0、#1、#2のコード進行候補指示データ109に対応する3つのコード進行候補のうちの1つから、ユーザ指定によりまたは自動的に選択されたコード進行候補に対応する曲構造データ(図6参照)を、伴奏・コード進行DB103から読み込む。メロディ生成部105は、この曲構造データによって示される小節のフレーズごとに、入力モチーフ108とフレーズセットDB106に登録されているフレーズセット(図11参照)、およびルールDB104(図9参照)を参照しながら、そのフレーズのメロディを自動生成する。
この場合、メロディ生成部105は、曲構造データによって示される小節のフレーズが、入力モチーフ108が入力されたフレーズであるか否かを判定し、入力モチーフ108のフレーズである場合は、その入力モチーフ108のメロディをそのまま図1のメロディ110の一部として出力する。
メロディ生成部105は、曲構造データによって示される小節のフレーズが、入力モチーフ108のフレーズでもなく、サビメロディの先頭フレーズでもない場合は、該当するフレーズのメロディが未だ生成されていなければ、フレーズセットDB106から入力モチーフ108に対応するフレーズセットを抽出し、そのフレーズセット内の該当するフレーズのメロディをコピーし、生成済みであればその生成済みのフレーズからメロディをコピーする。そして、メロディ生成部105は、コピーしたメロディを変形する後述するメロディ変形処理と、さらにその変形したメロディを構成する各ノートのピッチを最適化する後述するメロディ最適化処理を実行して、曲構造データによって示される小節のフレーズのメロディを自動生成し、メロディ110の一部として出力する。既に生成済みのフレーズからメロディをコピーする処理の詳細については、図25の説明において後述する。
メロディ生成部105は、曲構造データによって示される小節のフレーズが、サビメロディの先頭フレーズである場合は、該当するサビメロディの先頭フレーズが生成済みでなければ、フレーズセットDB106から入力モチーフ108に対応するフレーズセットを抽出し、そのフレーズセット内の該当するサビメロディ(Cメロ)の先頭フレーズのメロディをコピーし、そのメロディを構成する各ノートのピッチを最適化するメロディ最適化処理を実行して、サビメロディの先頭フレーズのメロディを自動生成し、メロディ110の一部として出力する。一方、該当するサビメロディの先頭フレーズが生成済みならば、その生成済みのフレーズからメロディをコピーし、メロディ110の一部として出力する。
図12は、メロディ変形処理およびメロディ最適化処理の動作説明図である。予め生成されているメロディがあるときに、メロディ生成部105は、そのメロディをコピーして、例えば1201に示されるように、コピーしたメロディを構成する各ノートのピッチを、例えば2半音上にピッチシフトする処理を実行する。あるいは、メロディ生成部105は、例えば1202に示されるように、コピーしたメロディを構成する各ノートを、小節内で左右(再生順序)を反転させる処理を実行する。メロディ生成部105は、このようなメロディ変形処理を実行した小節のメロディに対して、さらに1203または1204として示されるメロディ最適化処理を実行して、最終的なメロディを自動生成する。
図13は、メロディ最適化処理の詳細動作説明図である。いま、変数iNoteCntには、メロディ変形処理を実行した小節のメロディを構成するノートの数が格納されており、配列データnote[0]−>iPit、note[1]−>iPit、note[2]−>iPit、・・・、note[iNoteCnt−2]−>iPit、note[iNoteCnt−1]−>iPitには、上記各ノートのピッチデータが格納されているとする。メロディ生成部105はまず、各ノートのピッチデータnote[i]−>iPit(0≦i≦iNoteCnt−1)をそれぞれ、ipitd[0]=0、ipitd[1]=1、ipitd[2]=−1、ipitd[3]=2、ipitd[4]=−2という5段階の値だけピッチシフトさせ、合計5iNoteCnt通りのピッチ列を生成する。そして、メロディ生成部105は、各ピッチ列ごとに、図7から図10を用いて前述したのと同様の処理によって、コード進行選択部102が抽出しているコード進行データの上記小節に対応する部分について、ノートタイプの取得と、隣接音程の計算を実行し、ノート接続性チェック処理を実行する。この結果、メロディ生成部105は、合計5iNoteCnt通りのピッチ列に対して算出した適合度のうち、もっとも適合度が高いピッチ列を、その小節の各ノートのピッチデータnote[i]−>iPit(0≦i≦iNoteCnt−1)として修正する。メロディ生成部105は、このようにして生成したピッチ列を含むその小節の各ノートのデータnote[i](0≦i≦iNoteCnt−1)をメロディ110として出力する。
上述した自動作曲装置100のさらに詳細な構成および動作について、以下に説明する。図14は、図1の自動作曲装置100のハードウェア構成例を示す図である。図14に例示される自動作曲装置100のハードウェア構成は、CPU(中央演算処理装置)1401、ROM(リードオンリーメモリ)1402、RAM(ランダムアクセスメモリ)1403、入力部1404、表示部1405、および音源部1406を備え、それらがシステムバス1408によって相互に接続された構成を有する。また、音源部1406の出力はサウンドシステム1407に入力する。
CPU1401は、RAM1403をワークメモリとして使用しながらROM1402に記憶された自動作曲制御プログラムを実行することにより、図1の101〜107の各機能部分に対応する制御動作を実行する。
ROM1402には、上記自動作曲制御プログラムのほか、図1の伴奏・コード進行DB103(図5、図6参照)、ルールDB104(図9参照)、フレーズセットDB106(図11参照)、および標準ピッチクラスセットテーブル(図7参照)が予め記憶される。
RAM1403は、モチーフ入力部101から入力された入力モチーフ108(図4参照)、コード進行選択部102が出力するコード進行候補データ109、メロディ生成部105が出力するメロディデータ110などを一時的に記憶する。このほか、RAM1403には、後述する各種変数データ等が一時的に記憶される。
入力部1404は、図1のモチーフ入力部101の一部の機能に対応し、例えば、鍵盤入力部101−1、音声入力部101−2、または音符入力部101−3に対応する。入力部1404が鍵盤入力部101−1を備える場合には、演奏鍵盤と、当該演奏鍵盤の押鍵状態を検知しシステムバス1408を介してCPU1401に通知するキーマトリクス回路を備える。入力部1404が音声入力部101−2を備える場合には、歌声入力用のマイクと、当該マイクから入力された音声信号をデジタル信号に変換した後、歌声のピッチ情報を抽出しシステムバス1408を介してCPU1401に通知するデジタル信号処理回路を備える。なお、ピッチ情報の抽出は、CPU1401が実行してもよい。入力部1404が音符入力部101−3を備える場合には、音符入力用のキーボードと、当該キーボードの音符入力状態を検知しシステムバス1408を介してCPU1401に通知するキーマトリクス回路を備える。CPU1401は、図1のモチーフ入力部101の一部の機能に対応し、図14の入力部1404から入力した上記各種情報に基づいて、入力モチーフ108を検出してRAM1403に記憶する。
表示部1405は、CPU1401による制御動作とともに、モチーフの入力を図1の出力部107が備える楽譜表示部107−1の機能を実現する。CPU1401は、自動作曲されたメロディデータ110に対応する楽譜データを生成し、その楽譜データの表示を表示部1405に指示する。表示部1405は、例えば液晶ディスプレイ装置である。
音源部1406は、CPU1401による制御動作とともに、図1の楽音再生部107−2の機能を実現する。CPU1401は、自動生成されたメロディデータ110と伴奏・コード進行DB103から読み出された伴奏用MIDIデータとに基づいて、メロディおよび伴奏を再生するための発音制御データを生成し、音源部1406に供給する。音源部1406は、この発音制御データに基づいて、メロディ音および伴奏音を生成し、サウンドシステム1407に出力する。サウンドシステム1407は、音源部1406から入力したメロディ音および伴奏音のデジタル楽音データをアナログ楽音信号に変換した後、そのアナログ楽音信号を内蔵のアンプで増幅して内蔵のスピーカから放音する。
図15Aおよび図15Bは、ROM1402またはRAM1403に記憶される各種変数データ、配列変数データ、および定数データのリストを示す図である。これらのデータは、後述する各種処理で使用される。
図16は、本実施形態における自動作曲処理の例を示すフローチャートである。この処理は、自動作曲装置100の電源が投入されることにより、CPU1401がROM1402に記憶されている自動作曲処理プログラムの実行を開始することによりスタートする。
CPU1401はまず、RAM1403および音源部1406に対して初期化を行う(ステップS1601)。その後、CPU1401は、ステップS1602からS1608までの一連の処理を繰返し実行する。
この繰返し処理において、CPU1401はまず、ユーザが特には図示しない電源スイッチを押下したことにより自動作曲処理の終了を指示したか否かを判定し(ステップS1602)、終了を指示していなければ(ステップS1602の判定がNO)、繰返し処理を継続し、終了を指示したならば(ステップS1602の判定がYES)、図16のフローチャートで例示される自動作曲処理を終了する。
ステップS1602の判定がNOの場合、CPU1401は、ユーザが入力部1404からモチーフ入力を指示したか否かを判定する(ステップS1603)。ユーザがモチーフ入力を指示した場合(ステップS1603の判定がYESの場合)、CPU1401は、入力部1404からのユーザによるモチーフ入力を受け付け、その結果入力部1404から入力された入力モチーフ108を、例えば図4のデータ形式でRAM1403に記憶する(ステップS1606)。その後、CPU1401は、ステップS1602の処理に戻る。
ユーザがモチーフ入力を指示していない場合(ステップS1603の判定がNOの場合)、CPU1401は、ユーザが特には図示しないスイッチにより自動作曲を指示したか否かを判定する(ステップS1604)。ユーザが自動作曲を指示した場合(ステップS1604の判定がYESの場合)、CPU1401は、コード進行選択処理(ステップS1607)、続いてメロディ生成処理(ステップS1608)を実行する。ステップS1607のコード進行選択処理は、図1のコード進行選択部102の機能を実現する。ステップS1608のメロディ生成処理は、図1のメロディ生成部105の機能を実現する。その後、CPU1401は、ステップS1602の処理に戻る。
ユーザが自動作曲を指示していない場合(ステップS1604の判定がNOの場合)、CPU1401は、ユーザが特には図示しないスイッチにより自動作曲されたメロディ110の再生を指示したか否かを判定する(ステップS1605)。ユーザがメロディ110の再生を指示した場合(ステップS1605の判定がYESの場合)、CPU1401は、再生処理(ステップS1609)を実行する。この処理は、図1の出力部107内の楽譜表示部107−1および楽音再生部107−2の動作として前述した通りである。
ユーザが自動作曲を指示していない場合(ステップS1604の判定がNOの場合)、CPU1401は、ステップS1602の処理に戻る。
図17は、図16のステップS1607のコード進行選択処理の詳細例を示すフローチャートである。
まず、CPU1401は、RAM1403上の変数データおよび配列変数データを初期化する(ステップS1701)。
次に、CPU1401は、伴奏・コード進行DB103に記憶されている複数のコード進行データに対する繰返し処理を制御するためのRAM1403上の変数nを「0」に初期化する。その後、CPU1401は、ステップS1714で変数nの値を+1ずつインクリメントさせながら、ステップS1703で変数nの値がROM1402に記憶されている定数データMAX_CHORD_PROGの値よりも小さいと判定される間、ステップS1704からS1713までの一連の処理を実行する。定数データMAX_CHORD_PROGの値は、伴奏・コード進行DB103に記憶されるコード進行データの数を示す定数データである。CPU1401は、図5に示される伴奏・コード進行DB103のレコード数の分だけ、ステップS1704からS1713までの一連の処理を繰り返し実行することにより、適合度の算出処理を、伴奏・コード進行DB103に記憶されている複数のコード進行データに対して実行し、入力モチーフ108との適合度が高かった例えば上位3個のコード進行データをそれぞれ指し示す#0、#1、#2のコード進行候補指示データ109を出力する。
ステップS1703からS1713の繰返し処理において、ステップSCPU1401はまず、変数nの値が定数データMAX_CHORD_PROGの値よりも小さいか否かを判定する(ステップS1703)。
ステップS1703の判定がYESならば、CPU1401は、変数データnが示すn番目のコード進行データ#n(図5(a)参照)を、伴奏・コード進行DB103からRAM1403内のコード進行データ領域に読み込む(ステップS1704)。このコード進行データ#nのデータ形式は、例えば図5の(b)、(c)、(d)で示されるフォーマットを有する。
次に、CPU1401は、伴奏・コード進行DB103からRAM1403内のコード進行データ#n用の配列変数データ要素iChordAttribute[n][0]に読み込まれた、コード進行データ#nの楽曲ジャンルを示す値が、予め特には図示しないスイッチによりユーザによって設定され、RAM1403内のる変数データiJunleSelectに記憶されている楽曲ジャンルを示す値と等しいか否かを判定する(ステップS1705)。ステップS1705の判定がNOならば、そのコード進行データ#nは、ユーザが望む楽曲ジャンルに合わないため、選択せずに、ステップS1714に進む。
ステップS1705の判定がYESならば、CPU1401は、伴奏・コード進行DB103からRAM1403内のコード進行データ#n用の配列変数データ要素iChordAttribute[n][1]に読み込まれた、コード進行データ#nのコンセプトを示す値が、予め特には図示しないスイッチによりユーザによって設定され、RAM1403内のる変数データiConnceptSelectに記憶されている楽曲のコンセプトを示す値と等しいか否かを判定する(ステップS1706)。ステップS1706の判定がNOならば、そのコード進行データ#nは、ユーザが望む楽曲コンセプトに合わないため、選択せずに、ステップS1714に進む。
ステップS1706の判定がYESならば、CPU1401は、コードデザインデータ作成処理を実行する(ステップS1707)。この処理において、CPU1401は、コード進行データ#nによって、時間経過に沿って順次指定されるコード進行の情報を、RAM1403上の配列変数データである後述するコードデザインデータcdesign[k]に格納する処理を実行する。
次に、CPU1401は、RAM1403上の変数データiKeyShiftに初期値「0」を格納する(ステップS1708)。この変数データiKeyShiftは、1オクターブの半音階中で、初期値「0」からROM1402に記憶されている定数データPITCH_CLASS_Nより1小さい数までの範囲で、コード進行データ#nに対する半音単位のキーシフト値を指定する。定数データPITCH_CLASS_Nの値は、通常は1オクターブ内の半音数12である。
次に、CPU1401は、変数データiKeyShiftの値が定数データPITCH_CLASS_Nの値よりも小さいか否かを判定する(ステップS1709)。
ステップS1709の判定がYESならば、変数データiKeyShiftが示すキーシフト値だけコード進行データ#nのキーをシフトさせた後、入力モチーフ108とコード進行#nに対する適合度チェック処理を実行する(ステップS1710)。この処理により、入力モチーフ108に対するコード進行#nの適合度がRAM1403上の変数データdoValueに得られる。
次に、CPU1401は、変数データdoValueの値が、RAM1403上の変数データdoMaxValueよりも大きいか否かを判定する(ステップS1711)。変数データdoMaxValueは、現時点で最も高い適合度の値を格納する変数で、ステップS1701で値「0」に初期化されている。
ステップS1711の判定がYESならば、CPU1401は、変数データdoMaxValueの値を変数データdoValueの値で置き換える。また、CPU1401は、RAM1403内の配列変数データiBestKeyShift[iBestUpdate]に、変数データiKeyShiftの現在値を格納する。また、CPU1401は、RAM1403内の配列変数データiBestChordProg[iBestUpdate]に、伴奏・コード進行DB103上のコード進行データを指し示す変数データnの現在値を格納する。その後、CPU1401は、RAM1403内の変数データiBestUpdateを+1インクリメントする(以上、ステップS1712)。変数データiBestUpdateは、ステップS1701で値「0」に初期化された後、現時点で適合度が最も高いコード進行データが見つかるごとにインクリメントされるデータであり、その値が大きいほど上位の適合度であることを示す。配列変数データiBestKeyShift[iBestUpdate]は、変数データiBestUpdateが示す順位におけるキーシフト値を保持する。配列変数データiBestChordProg[iBestUpdate]は、変数データiBestUpdateが示す順位における伴奏・コード進行DB103上のコード進行の番号を保持する。
ステップS1711の判定がNOならば、CPU1401は、上記ステップS1712の処理はスキップして、今回のコード進行データ#nは入力モチーフ108に対する自動作曲用のコード進行データとしては選択しない。
その後、CPU1401は、変数データiKeyShiftの値を+1インクリメントする(ステップS1713)。その後、CPU1401は、ステップS1709の処理に戻る。
CPU1401は、変数データiKeyShiftの値をインクリメントしながらステップS1709からS1713までの処理を繰り返し実行した後、1オクターブ分のキーシフト値の指定が終了してステップS1709の判定がNOになると、ステップS1714に処理を進める。ステップS1714で、CPU1401は、伴奏・コード進行DB103上のコード進行データの選択用の変数データnを+1インクリメントする。その後、CPU1401は、ステップS1703の処理に戻る。
CPU1401は、変数データnの値をインクリメントしながらステップS1703からS1714までの一連の処理を繰り返し実行した後、伴奏・コード進行DB103内の全てのコード進行データに対する処理を終了してステップS1703の判定がNOになると、図17のフローチャートの処理すなわち図16のステップS1607のコード進行選択処理を終了する。この結果、変数データiBestUpdateの現在値よりも1だけ小さい値「iBestUpdate−1」を要素番号とする配列変数データiBestKeyShift[iBestUpdate−1]およびiBestChordProg[iBestUpdate−1]に、入力モチーフ108に対して最も適合性が高いキーシフト値とコード進行データの番号が格納される。また、配列変数データiBestKeyShift[iBestUpdate−2]およびiBestChordProg[iBestUpdate−2]に、入力モチーフ108に対して2番目に適合性が高いキーシフト値とコード進行データの番号が格納される。さらに、配列変数データiBestKeyShift[iBestUpdate−3]およびiBestChordProg[iBestUpdate−3]に、入力モチーフ108に対して3番目に適合性が高いキーシフト値とコード進行データの番号が格納される。これらのデータセットが、上位から順に図1の#0、#1、および#2のコード進行候補指示データ109に対応する。
図18は、図17のステップS1707のコードデザインデータ作成処理の詳細例を示すフローチャートである。
まず、CPU1401は、コード進行情報の番号を示す変数データiCDesignCntを初期値「0」に設定する(ステップS1801)。
次に、CPU1401は、図17のステップS1704で伴奏・コード進行DB103からRAM1403に例えば図5(b)、(c)、(d)のデータ形式で読み込まれたコード進行データ#nの最初のメタイベント(図5(b)のコードデータ#0に対応)へのポインタを、RAM1403内のポインタ変数データmtに格納する(ステップS1802)。
次に、CPU1401は、ステップS1811でポインタ変数データmtに順次次のメタイベント(図5(b)のコードデータ#1、#2、・・・)へのポインタを格納しながら、ステップS1803で終端(図5(b)の「終端」)に達したと判定するまで、ステップS1803からS1811の一連の処理を、コード進行データ#nの各コードデータ(図5(b)参照)に対して、繰り返し実行する。
上記繰返し処理において、CPU1401はまず、ポインタ変数データmtが終端を指しているか否かを判定する(ステップS1803)。
ステップS1803の判定がNOならば、CPU1401は、ポインタ変数データmtが指すコードデータ(図5(b))中のコード根音(ルート)とコードタイプ(図5(d)参照)を抽出して、RAM1403内の変数データrootとtypeに格納することを試みる(ステップS1804)。そして、CPU1401は、ステップS1804での格納処理に成功したか否かを判定する(ステップS1805)。
ステップS1804での格納処理に成功した場合(ステップS1805の判定がYESの場合)、CPU1401は、ポインタ変数データmtが指す記憶エリアの時間情報mt−>iTime(図5(d)の「時間」データ)を、変数データiCDesignCntの現在値を要素番号とするコードデザインデータの時間項目cdesign[iCDesignCnt]−>iTimeに格納する。また、CPU1401は、ステップS1804で変数データrootに格納されたコード根音情報を、変数データiCDesignCntの現在値を要素番号とするコードデザインデータのコード根音項目cdesign[iCDesignCnt]−>iRootに格納する。また、CPU1401は、ステップS1804で変数データtypeに格納されたコードタイプ情報を、変数データiCDesignCntの現在値を要素番号とするコードデザインデータのコードタイプ項目cdesign[iCDesignCnt]−>iTypeに格納する。さらに、変数データiCDesignCntの現在値を要素番号とするコードデザインデータのキー項目cdesign[iCDesignCnt]−>iKeyとスケール項目cdesign[iCDesignCnt]−>iScaleには、無効値「−1」を格納する(以上、ステップS1806)。その後、CPU1401は、ステップS1810の処理に移行して、変数データiCDesignCntの値を+1インクリメントする。
ステップS1804での格納処理に成功しなかった場合(ステップS1805の判定がNOの場合)、CPU1401は、ポインタ変数データmtが指すコードデータ(図5(b))中のスケールとキー(図5(c)参照)を抽出して、RAM1403内の変数データscaleとkeyに格納することを試みる(ステップS1807)。そして、CPU1401は、ステップS1807での格納処理に成功したか否かを判定する(ステップS1808)。
ステップS1807での格納処理に成功した場合(ステップS1808の判定がYESの場合)、CPU1401は、ポインタ変数データmtが指す記憶エリアの時間情報mt−>iTime(図5(c)の「時間」データ)を、変数データiCDesignCntの現在値を要素番号とするコードデザインデータの時間項目cdesign[iCDesignCnt]−>iTimeに格納する。また、CPU1401は、ステップS1807で変数データkeyに格納されたキー情報を、変数データiCDesignCntの現在値を要素番号とするコードデザインデータのキー項目cdesign[iCDesignCnt]−>iKeyに格納する。また、CPU1401は、ステップS1807で変数データscaleに格納されたスケール情報を、変数データiCDesignCntの現在値を要素番号とするコードデザインデータのスケール項目cdesign[iCDesignCnt]−>iScaleに格納する。さらに、変数データiCDesignCntの現在値を要素番号とするコードデザインデータのコード根音項目cdesign[iCDesignCnt]−>iRootとコードタイプ項目cdesign[iCDesignCnt]−>iTypeには、無効値「−1」を格納する(以上、ステップS1809)。その後、CPU1401は、ステップS1810の処理に移行して、変数データiCDesignCntの値を+1インクリメントする。
CPU1401は、ステップS1810での変数データiCDesignCntの値のインクリメント処理の後、またはステップS1807での格納処理に成功しなかった場合(ステップS1808の判定がNOの場合)、ポインタ変数データmtに次のメタイベント(図5(b)のコードデータ#1、#2、・・・)へのポインタを格納し(ステップS1811)、ステップS1803の判定処理に戻る。
上記ステップS1803からS1811までの繰返し処理の結果、CPU1401は、現在のコード進行データ#nに対するコードデータを終端(図5(b)参照)まで読み込むと、ステップS1803の判定がYESとなって、図18のフローチャートで例示される処理すなわち図17のステップS1707のコードデザインデータ作成処理を終了する。この時点で、変数データiCDesignCntに現在のコード進行データ#nを構成するコード情報の数が得られ、コードデザインデータcdesign[0]からcdesign[iCDesignCnt−1]にそれぞれのコード情報が得られる。
図19は、図17のステップS1710の入力モチーフ108とコード進行#nに対する適合度チェック処理の詳細例を示すフローチャートである。
まず、CPU1401は、適合度を示す変数データdoValueに初期値「0」をセットする(ステップS1901)。
次に、CPU1401は、伴奏・コード進行DB103から、ステップS1704で読み込んだコード進行データ#nに対応する曲構造データ#n(図5(a)参照)を参照し、入力モチーフ108の入力時にユーザにより指定されたフレーズ種別と同じフレーズ種別が「PartName[M]」項目(図6参照)に指定されている先頭の小節のレコードに格納されている小節開始時間データiPartTime[M]を読み込み、RAM1403内の変数データsTimeに格納する(ステップS1902)。
次に、CPU1401は、入力モチーフ108を構成するノートの順番を指す変数データiNoteCntの値を初期値「0」に設定する(ステップS1903)。
次に、CPU1401は、図16のステップS1606でRAM1403に図4のデータ形式で入力された入力モチーフ108の最初のノートデータ(図4(a)のノートデータ#0に対応)へのポインタを、RAM1403内のポインタ変数データmeに格納する(ステップS1904)。
次に、CPU1401は、ステップS1909でポインタ変数データmeに順次入力モチーフ108の次のノート(図4(a)のノートデータ#1、#2、・・・)へのポインタを格納しながら、ステップS1905で終端(図4(b)の「終端」)に達したと判定するまで、ステップS1905からS1909の一連の処理を、入力モチーフ108の各ノートデータ(図4(a)参照)に対して、繰り返し実行する。
上記繰返し処理において、CPU1401はまず、ポインタ変数データmeが終端を指しているか否かを判定する(ステップS1905)。
ステップS1905の判定がNOならば、CPU1401は、ポインタ変数データmeが指すノートデータ(図4(b))中の「時間」データであるme−>iTimeを参照し、これにステップS1902で得ている入力モチーフ108の該当小節の小節開始時間sTimeを加算し、その結果を新たにme−>iTimeに上書きする(ステップS1906)。入力モチーフ108を構成する各ノートデータ中の「時間」データは、2小節からなる入力モチーフ108の先頭からの時間であるため、それを楽曲の先頭からの時間に変換するために、ステップS1902で曲構造データから得た入力モチーフ108の該当小節の小節開始時間sTimeが加算される。
次に、CPU1401は、ポインタ変数データmeの値を、変数データiNoteCntの現在値を要素値とする配列変数データであるノートポインタ配列データnote[iNoteCnt]に格納する(ステップS1907)。
その後、CPU1401は、変数データiNoteCntの値を+1インクリメントする(ステップS1908)。そして、CPU1401は、ポインタ変数データmeに入力モチーフ108中の次のノートデータ(図4(a)のノートデータ#1、#2、・・・)へのポインタを格納し(ステップS1909)、ステップS1905の判定処理に戻る。
上記ステップS1905からS1909までの繰返し処理の結果、CPU1401は、入力モチーフ108中のノートデータを終端(図4(a)参照)まで読み込むと、ステップS1905の判定がYESとなって、ステップS1910のチェック処理に進む。このチェック処理では、入力モチーフ108に対するコード進行#nの適合度を算出処理が実行され、この結果、適合度が変数データdoValueに得られる。その後、図19のフローチャートで例示される処理すなわち図17のステップS1710の入力モチーフ108とコード進行#nの適合度チェック処理を終了する。この時点で、変数データiNoteCntに入力モチーフ108を構成するノートの数(図3(a)の音符の数に対応)が得られ、ノートポインタ配列変数データnote[0]〜note[iNoteCnt−1]にそれぞれのノートデータへのポインタが得られる。
図20は、図19のステップS1910のチェック処理の詳細例を示すフローチャートである。
まず、CPU1401は、入力モチーフ108のノート数をカウントするRAM1403内の変数iに初期値「0」を格納する(ステップS2001)。その後、CPU1401は、ステップS2008で変数iの値を+1ずつインクリメントさせながら、ステップS2002で変数iの値が図19の処理で最終的に得られた入力モチーフ108のノート数を示す変数データiNoteCntの値よりも小さいと判定される間、ステップS2002からS2008までの一連の処理を実行する。
ステップS2002からS2008の繰返し処理において、ステップSCPU1401はまず、変数iの値が変数データiNoteCntの値よりも小さいか否かを判定する(ステップS2002)。
ステップS2002の判定がYESならば、CPU1401は、変数データiによって指示されるi番目の処理対象ノートに対応するノートポインタ配列変数データnote[i]から、ピッチ項目値note[i]−>iPit(図4(b)の「ピッチ」項目値を指す)を読み出し、それを変数データiの値を要素値とするRAM1403内のピッチ情報列配列変数データipit[i]に格納する(ステップS2003)。
次に、CPU1401は、入力モチーフ108の現在の処理対象ノートのタイミングに対応するコード情報の取得処理を実行する(ステップS2004)。この処理では、入力モチーフ108の現在の処理対象ノートの発音タイミングにおいて指定されるべきコードのコード根音、コードタイプ、スケール、およびキーが、変数データroot、type、scale、およびkeyに得られる。
続いて、CPU1401は、ノートタイプの取得処理を実行する(ステップS2005)。この処理では、図8の説明で前述した、RAM1403内のノートタイプと隣接音程の配列変数データincon[i×2](偶数番目の要素)に、入力モチーフ108の現在のi番目の処理対象ノートの、ピッチipit[i]の現在の評価対象のコード進行データ#nに対するノートタイプが得られる。
さらに、CPU1401は、変数iの値が0よりも大きいか否か、すなわち処理対象ノートが先頭以外のノートであるか否かを判定する(ステップS2006)。
そして、ステップS2006の判定がYESのときに、CPU1401は、変数データiによって指示されるi番目の処理対象ノートに対応するピッチ情報ipit[i]から、i−1番目の処理対象ノートに対応するピッチ情報ipit[i−1]を減算することにより、ノートタイプと隣接音程の配列変数データincon[i×2−1](奇数番目の要素)に、図8の説明で前述した隣接音程を得る(ステップS2007)。
ステップS2006の判定がNOのとき(先頭のノートのとき)には、CPU1401は、ステップS2007の処理はスキップする。
その後、CPU1401は、変数iの値を+1インクリメントし(ステップS2008)、入力モチーフ108中の次のノートの処理に移行して、ステップS2002の判定処理に戻る。
CPU1401は、変数データiの値をインクリメントしながらステップS2002からS2008までの一連の処理を繰り返し実行した後、入力モチーフ108を構成する全てのノートデータに対する処理を終了してステップS2002の判定がNOになると、ステップS2009のノート接続性チェック処理に進む。この時点で、配列変数データincon[i×2](0≦i≦iNoteCnt−1)およびincon[i×2−1](1≦i≦iNoteCnt−1)に、図8の説明等で前述したノートタイプと隣接音程の集合が得られる。そして、CPU1401は、このデータに基づいて、ステップS2009のノート接続性チェック処理により、評価対象のコード進行データ#nの入力モチーフ108に対する適合度を変数データdoValueに得る。その後、CPU1401は、図20のフローチャートで例示される処理すなわち図19のステップS1910のチェック処理を終了する。
図21は、図20のステップS2004の入力モチーフ108の現在のノートのタイミングnに対応するコード情報の取得処理の詳細例を示すフローチャートである。
まず、CPU1401は、コードデザインデータの情報数をカウントするRAM1403内の変数kに初期値「0」を格納する(ステップS2101)。その後、CPU1401は、ステップS2107で変数kの値を+1ずつインクリメントさせながら、ステップS2102で変数kの値が図18の処理で最終的に得られた現在の評価対象のコード進行データ#nを構成するコード情報の数を示す変数データiCDesignCntの値よりも小さいと判定される間、ステップS2102からS2107までの一連の処理を実行する。
ステップS2102からS2107の繰返し処理において、ステップSCPU1401はまず、変数kの値が変数データiCDesignCntの値よりも小さいか否かを判定する(ステップS2102)。
ステップS2102の判定がYESならば、CPU1401は、現在の処理対象のノートのノートポインタ配列データが指す時間項目値note[i]−>iTimeが、変数データkによって指示されるk番目のコードデザインデータの時間項目cdesign[k]−>iTimeの値よりも大きく、k+1番目のコードデザインデータの時間項目cdesign[k+1]−>iTimeの値よりも小さく、かつ、k番目のコードデザインデータのキー項目cdesign[k]−>iKeyとスケール項目cdesign[k]−>iScaleの各値が0以上で有意な値が設定されているか否か(図18のステップS1806、S1808参照)を判定する(ステップS2103)。
ステップS2103の判定がYESならば、入力モチーフ108の現在の処理対象のノートnote[i]の発音タイミングにおいてk番目のコードデザインデータcdesign[k]によるコード情報が指定されていると判定できる。そこで、CPU1401は、変数データkeyとscaleに、それぞれk番目のコードデザインデータのキー項目cdesign[k]−>iKeyとスケール項目cdesign[k]−>iScaleの各値を格納する(ステップS2104)。
ステップS2103の判定がNOならば、CPU1401は、ステップS2104の処理はスキップする。
続いて、CPU1401は、現在の処理対象のノートのノートポインタ配列データが指す時間項目値note[i]−>iTimeが、変数データkによって指示されるk番目のコードデザインデータの時間項目cdesign[k]−>iTimeの値よりも大きく、k+1番目のコードデザインデータの時間項目cdesign[k+1]−>iTimeの値よりも小さく、かつ、k番目のコードデザインデータのコード根音項目cdesign[k]−>iRootとコードタイプ項目cdesign[k]−>iTypeの各値が0以上で有意な値が設定されているか否か(図18のステップS1806、S1808参照)を判定する(ステップS2105)。
ステップS2105の判定がYESならば、入力モチーフ108の現在の処理対象のノートnote[i]の発音タイミングにおいてk番目のコードデザインデータcdesign[k]によるコード情報が指定されていると判定できる。そこで、CPU1401は、変数データrootとtypeに、それぞれk番目のコードデザインデータのコード根音項目cdesign[k]−>iRootとコードタイプ項目cdesign[k]−>iTypeの各値を格納する(ステップS2106)。
ステップS2105の判定がNOならば、CPU1401は、ステップS2106の処理はスキップする。
以上の処理の後、CPU1401は、CPU1401は、変数kの値を+1インクリメントし(ステップS2107)、次のコードデザインデータcdesign[k]の処理に移行して、ステップS2102の判定処理に戻る。
CPU1401は、変数データkの値をインクリメントしながらステップS2102からS2107までの一連の処理を繰り返し実行した後、全てのコードデザインデータに対する処理を終了してステップS2102の判定がNOになると、図21のフローチャートで例示される処理すなわち図20のステップS2004の処理を終了する。この結果、変数データrootとtypeおよび変数データscaleとkeyに、入力モチーフ108の現在の処理対象ノートの発音タイミングに対応するコード情報が得られる。
図22は、図20のステップS2005のノートタイプ取得処理の詳細例を示すフローチャートである。この処理は、図7を用いて前述したように、図20のステップS2003で設定されている入力モチーフ108の現在のノートnotes[i]に対応するピッチipit[i]と、図20のステップS2004で算出されている入力モチーフ108の現在のノートnotes[i]の発音タイミングに対応するコード進行を構成するキーkey、スケールscale、コード根音root、およびコードタイプtypeとに従って、入力モチーフ108の現在のノートnotes[i]のノートタイプを取得する処理である。
まず、CPU1401は、ROM1402に記憶されている標準ピッチクラスセットテーブル中の図7(a)に例示されるデータ構成を有するコードトーンテーブルから、図20のステップS2004で算出されたコードタイプtypeに対応するコードトーンピッチクラスセットを取得し、RAM1403上の変数データpcs1に格納する(ステップS2201)。以下、この変数データpcs1の値をコードトーンピッチクラスセットpcs1と呼ぶ。
次に、CPU1401は、ROM1402に記憶されている標準ピッチクラスセットテーブル中の図7(b)に例示されるデータ構成を有するテンションノートテーブルから、上記コードタイプtypeに対応するテンションノートピッチクラスセットを取得し、RAM1403上の変数データpcs2に格納する(ステップS2202)。以下、この変数データpcs2の値をテンションノートピッチクラスセットpcs2と呼ぶ。
次に、CPU1401は、ROM1402に記憶されている標準ピッチクラスセットテーブル中の図7(c)に例示されるデータ構成を有するスケールノートテーブルから、図20のステップS2004で得られているスケールscaleに対応するスケールノートピッチクラスセットを取得し、RAM1403上の変数データcs3に格納する(ステップS2203)。以下、この変数データpcs3の値をスケールノートピッチクラスセットpcs3と呼ぶ。
続いて、CPU1401は、入力モチーフ108の現在の処理対象のノートnotes[i]に対して図20のステップS2003で得られているピッチipit[i]を、コード根音rootを第0音の音階構成音としたときの第0音から第11音までの1オクターブ分の音階構成音のいずれかに写像させたときの、ピッチipit[i]のコード根音rootに対する音程を、次式により算出し、RAM1403上の変数データpc1に格納する(ステップS2204)。以下、変数データpc1の値を、入力モチーフピッチクラスpc1と呼ぶ。
pc1=(ipit[i]−root+12)mod12 ・・・(1)
なお、「mod12」は、その左側の括弧に対応する「値」を12で割ったときの余りである。
同様に、CPU1401は、入力モチーフ108の現在のノートnotes[i]に対して図20のステップS2004で得られているピッチipit[i]を、キーkeyを第0音の音階構成音としたときの第0音から第11音までの1オクターブ分の音階構成音のいずれかに写像させたときの、ピッチipit[i]のキーkeyに対する音程を、次式により算出し、RAM1403上の変数データpc2に格納する(ステップS2205)。以下、変数データpc2の値を、入力モチーフピッチクラスpc2と呼ぶ。
pc2=(ipit[i]−key+12)mod12 ・・・(2)
次に、CPU1401は、入力モチーフピッチクラスpc1がコードトーンピッチクラスセットpcs1に含まれるか否かを判定する(ステップS2206)。この判定演算処理は、2のpc1乗=2pc1 とpcs1(図7(a)参照)のビット毎の論理積をとりそれが2pc1 と等しいか否かを比較する演算処理として実現される。
CPU1401は、ステップS2206の判定がYESならば、ノートタイプをコードトーンと決定し、ノートタイプと隣接音程の配列のノートタイプ要素の位置incon[i×2]に、ROM1402からコードトーンを示す定数データci_ChordToneの値を読み出して格納する(ステップS2207)。その後、CPU1401は、図22のフローチャートで例示される処理すなわち図20のステップS2005のノートタイプ取得処理を終了する。
CPU1401は、ステップS2206の判定がNOならば、入力モチーフピッチクラスpc1がテンションノートピッチクラスセットpcs2に含まれ、かつ入力モチーフピッチクラスpc2がスケールノートピッチクラスセットpcs3に含まれるか否かを判定する(ステップS2208)。この判定演算処理は、2のpc1乗=2pc1 とpcs2(図7(b)参照)のビット毎の論理積をとりそれが2pc1 と等しく、かつ2のpc2乗=2pc2 とpcs3(図7(c)参照)のビット毎の論理積をとりそれが2pc2 と等しいか否かを比較する演算処理として実現される。
CPU1401は、ステップS2208の判定がYESならば、ノートタイプをアヴェイラブルノートと決定し、ノートタイプと隣接音程の配列のノートタイプ要素の位置incon[i×2]に、ROM1402からアヴェイラブルノートを示す定数データci_AvailableNoteの値を読み出して格納する(ステップS2209)。その後、CPU1401は、図22のフローチャートで例示される処理すなわち図20のステップS2005のノートタイプ取得処理を終了する。
CPU1401は、ステップS2208の判定がNOならば、入力モチーフピッチクラスpc2がスケールノートピッチクラスセットpcs3に含まれるか否かを判定する(ステップS2210)。この判定演算処理は、2のpc2乗=2pc2 とpcs3(図7(c)参照)のビット毎の論理積をとりそれが2pc2 と等しいか否かを比較する演算処理として実現される。
CPU1401は、ステップS2210の判定がYESならば、ノートタイプをスケールノートと決定し、ノートタイプと隣接音程の配列のノートタイプ要素の位置incon[i×2]に、ROM1402からスケールノートを示す定数データci_ScaleNoteの値を読み出して格納する(ステップS2211)。その後、CPU1401は、図22のフローチャートで例示される処理すなわち図20のステップS2005のノートタイプ取得処理を終了する。
CPU1401は、ステップS2210の判定がNOならば、入力モチーフピッチクラスpc1がテンションノートピッチクラスセットpcs2に含まれるか否かを判定する(ステップS2212)。この判定演算処理は、2のpc1乗=2pc1 とpcs2(図7(b)参照)のビット毎の論理積をとりそれが2pc1 と等しいか否かを比較する演算処理として実現される。
CPU1401は、ステップS2212の判定がYESならば、ノートタイプをテンションノートと決定し、ノートタイプと隣接音程の配列のノートタイプ要素の位置incon[i×2]に、ROM1402からテンションノートを示す定数データci_TensionNoteの値を読み出して格納する(ステップS2213)。その後、CPU1401は、図22のフローチャートで例示される処理すなわち図20のステップS2005のノートタイプ取得処理を終了する。
最後に、CPU1401は、ステップS2212の判定もNOならば、ノートタイプをアヴォイドノートと決定し、ノートタイプと隣接音程の配列のノートタイプ要素の位置incon[i×2]に、ROM1402からアヴォイドノートを示す定数データci_AvoidNoteの値を読み出して格納する(ステップS2214)。その後、CPU1401は、図22のフローチャートで例示される処理すなわち図20のステップS2005のノートタイプ取得処理を終了する。
以上説明した図22のフローチャートで例示される図20のステップS2005のノートタイプ取得処理により、入力モチーフ108の現在のノートnotes[i]のノートタイプが、ノートタイプと隣接音程の配列のノートタイプ要素の位置incon[i×2](図7(b)参照)に取得される。
図23は、図20のノート接続性チェック処理の詳細例を示すフローチャートである。この処理は、図10を用いて前述した処理を実現する。
まず、CPU1401は、RAM1403内の変数データiTotalValueに初期値「0」を格納する(ステップS2301)。このデータは、現在の評価対象のコード進行データ#n(図17のステップS1704参照)についての入力モチーフ108に対する適合度を算出するための総合評価点を保持する。
次に、CPU1401は、変数データiについて、ステップS2302で初期値「0」を格納した後、ステップS2321で+1ずつインクリメントしながら、ステップS2303の判定がYES、すなわち変数データiの値が変数データiNoteCntの値から2を減算した値よりも小さい値であると判定される間、ステップS2303からS2321までの一連の処理を繰返し実行する。この繰返し処理が、図10(b)の入力モチーフ108中のノートごとのi=0から7までの繰返し処理に対応する。
入力モチーフ108中のi番目のノートごとに実行されるステップS2304からS2320までの一連の処理において、CPU1401はまず、RAM1403内の変数データiValueに初期値「0」を格納する(ステップS2304)。続いて、CPU1401は、変数データjについて、ステップS2306で初期値「0」を格納した後、ステップS2318で+1ずつインクリメントしながら、ステップS2307の判定がYES、すなわち変数データjの値が終端値に達するまでの間、ステップS2307からS2319までの一連の処理を繰返し実行する。この繰返し処理が、i番目のノートごとに、変数データjの値で定まる図9の各ノート接続ルールをチェックする繰返し処理に対応する。
入力モチーフ108中のi番目のノートごとに、j番目のノート接続ルールをチェックするステップS2308からS2316までの一連の処理において、CPU1401はRAM1403内の変数データkについて、ステップS2308で初期値「0」を格納した後、ステップS2315で+1ずつインクリメントしながら、ステップS2309からステップS2315の一連の処理を繰返し実行する。この繰返し処理により、入力モチーフ108中のi番目のノートから4つの連続するノートに対応する4つのノートタイプincon[i×2]、incon[i×2+2]、incon[i×2+4]、incon[i×2+6]のそれぞれと、図9に例示されるj番目のノート接続ルール内の4つのノートタイプci_NoteConnect[j][0]、ci_NoteConnect[j][2]、ci_NoteConnect[j][4]、ci_NoteConnect[j][6]のそれぞれとの一致の有無が判定される。また、入力モチーフ108内のi番目のノートから4つの連続するノート間の3つの隣接音程incon[i×2+1]、incon[i×2+3]、incon[i×2+5]のそれぞれと、図9に例示されるj番目のノート接続ルール内の3つの隣接音程ci_NoteConnect[j][1]、ci_NoteConnect[j][3]、ci_NoteConnect[j][5]のそれぞれとの一致の有無が判定される。
入力モチーフ108中のi番目のノートから4つの連続するノートを図9のj番目のノート接続ルールと比較する処理として、変数データkの値が0から3までインクリメントされながらステップS2309からステップS2315までの一連の処理が4回繰り返し実行されるうちで、ステップS2310、S2312、またはS2314のいずれか1つでも条件が成立すると、現在のj番目のノート接続ルールは入力モチーフ108に対して不適合となって、ステップS2319に移行し、変数データjの値がインクリメントされ次のノート接続ルールの適合評価に処理が移行する。
具体的には、ステップS2310で、CPU1401は、入力モチーフ108のi+k番目のノートのノートタイプincon[i×2+k×2]と、j番目のノート接続ルールのk番目のノートタイプci_NoteConnect[j][k×2]とが不一致となったか否かを判定する。ステップS2310の判定がYESになると、CPU1401は、そのノート接続ルールの少なくとも1つのノートタイプが入力モチーフ108内の現在の処理対象(i番目)のノートから始まる4つのノートのノートタイプの少なくとも1つと一致しないため、ステップS2319に移行する。
ステップS2310の判定がNOならば、ステップS2311およびステップS2312が実行されるが、これらについては後述する。ステップS2311およびS2312の判定がともにNOとなった後、CPU1401は、変数データkの値が3より小さい場合に、ステップS2313の判定がYESとなって、ステップS2314で隣接音程に関する判定処理を実行する。ステップS2313の判定が行われるのは、k=3となる入力モチーフ108の4ノート目については、それ以降には隣接音程は存在しないため、変数データkの値が0から2までの範囲でのみ、隣接音程の判定処理を実行するためである。ステップS2314において、CPU1401は、入力モチーフ108のi+k番目のノートとi+k+1番目のノートの間の隣接音程incon[i×2+k×2+1]と、j番目のノート接続ルールのk番目のノートタイプとk+1番目のノートタイプの間の隣接音程ci_NoteConnect[j][k×2+1]とが不一致であり、かつ、ci_NoteConnect[j][k×2+1]の値が「99」と不一致であるか否かを判定する。隣接音程の値「99」は、その隣接音程がどの値でもよいことを示している。ステップS2314の判定がYESになると、CPU1401は、そのノート接続ルールの少なくとも1つの隣接音程が入力モチーフ108内の現在の処理対象(i番目)のノートから始まる4つのノートの隣接ノート間の隣接音程の少なくとも1つと一致しないため、ステップS2319に移行する。
上記一連の処理で、ステップS2310において、入力モチーフ108のi+k番目のノートのノートタイプincon[i×2+k×2]と、j番目のノート接続ルールのk番目のノートタイプci_NoteConnect[j][k×2]の一致が検出されてステップS2310の判定がNOとなった後、CPU1401は、j番目のノート接続ルールのk番目の次のk+1番目のノートタイプci_NoteConnect[j][k×2+2]がci_NullNoteTypeであるか否かを判定する(ステップS2311)。
ci_NullNoteTypeが設定されるのは、図9のj=0から8までのノート接続ルールにおけるk=3の場合のci_NoteConnect[j][6]に対してである。従って、ステップS2311の判定がYESとなるケースは、変数データjの値の範囲が0から8の間であって、変数データkの値が0、1、2の3音分についてノートタイプおよび隣接音程が一致して、k=2となっている場合である。前述したように、j=0〜8の範囲のノート接続ルールは3音のルールであるため、4音目はci_NullNoteTypeとなって評価をする必要がない。従って、ステップS2311の判定がYESとなる場合には、そのときのノート接続ルールは入力モチーフ108内のi番目のノートから始まる3つのノートと適合する。このため、ステップS2311の判定がYESならば、CPU1401は、ステップS2316に移行して、変数データiValueに、そのノート接続ルールの評価点ci_NoteConnect[j][7](図9参照)を累算する。
一方、ステップS2311の判定がNOとなる場合は、ステップS2312およびS2313を経てステップS2314の隣接音程の評価処理に進む。ここで、CPU1401は、ステップS2311の判定がNOとなった直後のステップS2312で、変数データiの値が入力モチーフ108のノート数を示す変数データiNoteCntの値から3を減算した値に等しく、かつ変数データkの値が2に等しいか否かを判定する。このケースでは、処理対象となる入力モチーフ108のノートは、i+k番目、すなわちiNoteCnt−3+2=iNoteCnt−1番目、つまり、入力モチーフ108中の最後のノートになる。この状態で、ステップS2311において、ci_NoteConnect[j][k×2+2]=ci_NoteConnect[j][6]の値がci_NullNoteTypeにならない場合は、図9のjの値が9以上のノート接続ルールが処理されている場合である。つまり、ノート接続ルールは、4音についてのものである。一方、この場合における入力モチーフ108中の処理対象のノートは、i=iNoteCnt−3から始まり最終ノートのi=iNoteCnt−1までの3音である。従って、このケースでは、入力モチーフ108中の処理対象のノートの数とノート接続ルール中の音の数が合わないため、そのノート接続ルールは入力モチーフ108に適合することはない。従って、ステップS2312の判定がYESとなる場合は、CPU1401は、そのノート接続ルールに関する適合評価を行わずに、ステップS2319に移行する。
上述したステップS2310、S2311、S2312、およびS2314のいずれの条件も成立せずに、ステップS2309からS2315までの一連の処理が4回繰り返されてステップS2309の判定がNOになると、入力モチーフ108中のi番目のノートから4つの連続するノートに関して、ノートタイプと隣接音程が全て現在のj番目のノート接続ルールのノートタイプおよび隣接音程と適合したことになる。この場合には、CPU1401は、ステップS2316に移行して、変数データiValueに、現在のj番目のノート接続ルールの評価点ci_NoteConnect[j][7](図9参照)を累算する。
なお、1つのノート接続ルールのみが入力モチーフ108に適合するとは限らず、例えば3音のノート接続ルールに適合しかつ4音のノート接続ルールにも適合する場合があり得る。
そこで、CPU1401は、ステップS2319で変数データjの値がインクリメントされながらステップS2307で全てのノート接続ルールに関する評価が完了するまで、ステップS2309の判定がNOまたはステップS2311の判定がYESとなってノート接続ルールが適合するごとに、ステップS2316において、新たに適合したノート接続ルールの評価点ci_NoteConnect[j][7]が変数データiValueに累算される。
その後、CPU1401は、変数データjの値を+1インクリメントして次のノート接続ルールの評価に移行し(ステップS2319)、ステップS2307の判定処理に戻る。
CPU1401は、全てのノート接続ルールに対する評価が完了してステップS2307の判定がYESになると、現在のコード進行データ#nに対応する変数データiTotalValueに、変数データiValueに累算されている評価点を累算する(ステップS2320)。
その後、CPU1401は、変数iの値を+1インクリメントし(ステップS2321)、ステップS2303の判定処理に戻って、入力モチーフ108中の次のノートに処理を移す(図10(b)参照)。
CPU1401は、入力モチーフ108中の全てのノートについて全てのノート接続ルールの適合評価の処理を終了すると、ステップS2303の判定がNOとなる。ここで、入力モチーフ108中の処理対象のノートの終了位置は、本来は入力モチーフ108中の最終ノートを含む4音手前のノートであり、それに対応する変数データiの値は「(iNoteCnt−1)−3=iNoteCnt−4」である。しかし、図10(b)のi=7として例示されるように、最後の処理は3音で行われるため、終了位置に対応する変数データiの値は、「iNoteCnt−3」となる。よって、ステップS2303の終了判定は、「i<iNoteCnt−2」がNOになる場合となる。
ステップS2303の判定がNOになると、CPU1401は、変数データiTotalValueの値を入力モチーフ108中の処理したノート数(iNoteCnt−2)で除算して正規化し、その除算結果をコード進行#nの入力モチーフ108に対する適合度として、変数データdoValueに格納する(ステップS2322)。その後、CPU1401は、図23のフローチャートすなわち図20のステップS2009のノート接続性チェック処理を終了する。
図24は、図16の自動作曲処理において、ステップS1607のコード進行選択処理の次に実行されるステップS1608のメロディ生成処理の詳細例を示すフローチャートである。
まず、CPU1401は、RAM1403の変数領域を初期化する(ステップS2401)。
次に、CPU1401は、図16のステップS1607のコード進行選択処理によって選択され例えばユーザによって指示されたコード進行候補に対応する曲構造データ(図6参照)を、伴奏・コード進行DB103から読み込む(ステップS2402)。
その後、CPU1401は、変数データiの値を初期値「0」に設定した後(ステップS2403)、ステップS2409でiの値をインクリメントしながら、ステップS2404で曲構造データの終端に達したと判定するまで、変数データiによって指示される曲構造データ上の小節のフレーズごとに、入力モチーフ108と、ROM1402に記憶されるフレーズセットDB106に登録されているフレーズセット(図11参照)、およびROM1402に記憶されるルールDB104(図9参照)を参照しながら、そのフレーズのメロディを自動生成する。変数データiは、その値がステップS2409で0から+1ずつインクリメントされることにより、図6に例示される曲構造データの「Measure」項目の値を順次指定して、曲構造データ上の各レコードを指定してゆく。
具体的には、まず、CPU1401は、曲構造データの終端に達したか否かを判定する(ステップS2404)。
ステップS2404の判定がNOならば、CPU1401は、変数データiによって指定される曲構造データの現在の小節が、入力モチーフ108が入力された小節と一致するか否かを判定する(ステップS2405)。
ステップS2405の判定がYESならば、CPU1401は、その入力モチーフ108をそのままメロディ110(図1参照)の一部として、例えばRAM1403上の出力メロディ領域に出力する。
ステップS2405の判定がNOならば、CPU1401は、現在の小節が、サビメロディの先頭小節であるか否かを判定する(ステップS2406)。
ステップS2406の判定がNOならば、CPU1401は、メロディ生成1処理を実行する(ステップS2407)。
一方、ステップS2406の判定がYESならば、CPU1401は、メロディ生成2処理を実行する(ステップS2408)。
ステップS2407またはS2408の処理の後、CPU1401は、変数データiを+1インクリメントする(ステップS2409)。その後、CPU1401は、ステップS2404の判定処理に戻る。
図25は、図24のステップS2407のメロディ生成1処理の詳細例を示すフローチャートである。
CPU1401は、現在の小節が含まれるフレーズの種別が、入力モチーフ108のフレーズの種別と同じであるか否かを判定する(ステップS2501)。現在の小節が含まれるフレーズの種別は、図6に例示される曲構造データ中で、変数データiの値に対応する「Measure」項目を有するレコード中の「PartName[M]」項目または「iPartID[M]」項目を参照することにより、判定することができる。入力モチーフ108のフレーズの種別は、ユーザが入力モチーフ108を入力するときに指定する。
ステップS2501の判定がYESならば、CPU1401は、入力モチーフ108のメロディを現在の小節のメロディとしてRAM1403の所定領域にコピーする。その後、CPU1401は、ステップS2507のメロディ変形処理に移行する。
ステップS2501の判定がNOならば、CPU1401は、現在の小節が含まれるフレーズの種別に対して、既にメロディが生成済みで、かつ小節の偶数/奇数が一致するか否かを判定する(ステップS2503)。
ステップS2503の判定がYESならば、CPU1401は、生成済みのメロディを現在の小節のメロディとしてRAM1403の所定領域にコピーする(ステップS2504)。その後、CPU1401は、ステップS2507のメロディ変形処理に移行する。
該当するフレーズのメロディが未だ生成されていなければ(ステップS2503の判定がNO)、CPU1401は、フレーズセットDB検索処理を実行する(ステップS2505)。フレーズセットDB検索処理において、CPU1401は、フレーズセットDB106から入力モチーフ108に対応するフレーズセットを抽出する。
CPU1401は、ステップS2505で検索されたフレーズセット中の、現在の小節が含まれるフレーズの種別と同じ種別のフレーズのメロディを、RAM1403の所定領域にコピーする(ステップS2506)。その後、CPU1401は、ステップS2507のメロディ変形処理に移行する。
ステップS2502、S2504、またはS2506の処理の後、CPU1401は、コピーしたメロディを変形するメロディ変形処理を実行する(ステップS2507)。
さらに、CPU1401は、ステップS2507で変形したメロディを構成する各ノートのピッチを最適化するメロディ最適化処理を実行する(ステップS2508)。この結果、CPU1401は、曲構造データによって示される小節のフレーズのメロディを自動生成し、RAM1403の出力メロディ領域に出力する。
図26は、図25のステップS2505のフレーズセットDB検索処理の詳細例を示すフローチャートである。
まず、CPU1401は、入力モチーフ108のピッチ列を取り出し、RAM1403内の配列変数データiMelodyB[0]〜iMelodyB[iLengthB−1]に格納する。ここで、変数データiLengthBには、入力モチーフ108のピッチ列の長さが格納される。
次に、CPU1401は、変数データkの値を初期値「0」に設定した後(ステップS2602)、ステップS2609でkの値をインクリメントしながら、ステップS2603でフレーズセットDB106の終端(図11(a)参照)に達したと判定するまで、変数データkによって指示されるフレーズセット(図11(a)参照)について、ステップS2603からS2609の一連の処理を繰り返し実行する。
この一連の処理において、まず、CPU1401は、変数データkが示すk番目のフレーズセット内の、入力モチーフ108に対応するフレーズのピッチ列を取り出して、RAM1403内の配列変数データiMelodyA[0]〜iMelodyA[iLengthA−1]に格納する(ステップS2604)。ここで、変数データiLengthAには、フレーズセットDB106内のフレーズのピッチ列の長さが格納される。
次に、CPU1401は、ステップS2601で設定した入力モチーフ108のピッチ列の配列変数データiMelodyB[0]〜iMelodyB[iLengthB−1]と、ステップS2604で設定したフレーズセットDB106内のk番目のフレーズセット内の該当フレーズのピッチ列の配列変数データiMelodyA[0]〜iMelodyA[iLengthA−1]との間で、DP(Dynamic Programming:動的計画法)マッチング処理を実行し、その結果算出される両者間の距離評価値をRAM1403上の変数データdoDistanceに格納する。
次に、CPU1401は、RAM1403上の変数データdoMinが示す最小距離評価値のほうが、ステップS2605のDPマッチング処理により新たに算出した距離評価値doDistanceよりも大きくなったか否かを判定する(ステップS2608)。
ステップS2608の判定がYESならば、CPU1401は、変数データdoDistanceに格納されている新たな距離評価値を、変数データ変数データdoMinに格納する(ステップS2607)。
また、CPU1401は、変数データkの値を、RAM1403上の変数データiBestMochiefに格納する(ステップS2608)。
ステップS2608の判定がYESならば、CPU1401は、ステップS2607およびS2608の処理はスキップする。
その後、CPU1401は、変数データkの値を+1インクリメントしてフレーズセットDB106内の次のフレーズセット(図11(a)参照)に対する処理に移行する。
CPU1401は、フレーズセットDB106内の全てのフレーズセットに対する入力モチーフ108とのDPマッチング処理を終了し、ステップS2603の判定がYESになると、変数データiBestMochiefが示す番号のフレーズセットDB106内のフレーズセットを、RAM1403上の所定の領域に出力する(ステップS2610)。その後、CPU1401は、図26に例示されるフローチャートの処理すなわち図25のステップS2505のフレーズセットDB検索処理を終了する。
図27は、図25のステップS2507のメロディ変形処理の詳細例を示すフローチャートである。この処理は、図12の説明で前述したピッチシフトまたは左右反転によるメロディ変形処理を実行する。
まず、CPU1401は、図25のコピー処理により得られたメロディのノート数をカウントするRAM1403内の変数iに初期値「0」を格納する(ステップS2701)。その後、CPU1401は、ステップS2709で変数iの値を+1ずつインクリメントさせながら、ステップS2702で変数iの値がメロディのノート数を示す変数データiNoteCntの値よりも小さいと判定される間、ステップS2702からS2709までの一連の処理を実行する。
ステップS2702からS2709の繰返し処理において、ステップSCPU1401はまず、変形タイプを取得する(ステップS2702)。変形タイプは、ピッチシフトまたは左右反転があり、ユーザが特には図示しないスイッチにより指定することができる。
変形タイプがピッチシフトである場合には、CPU1401は、配列変数データnote[i]のiPit項目に得られているピッチデータnote[i]−>iPitに、所定値を加算することにより、例えば図12の1201として説明したような例えば2半音上へのピッチシフトを実行する(ステップS2704)。
変形タイプが左右反転である場合には、CPU1401は、変数データiの値が変数データiNoteCntの値を2で割った値よりも小さいか否かを判定する(ステップS2705)。
ステップS2705の判定がYESの場合には、まず、CPU1401は、配列変数データnote[i]のiPit項目に得られているピッチデータnote[i]−>iPitを、RAM1403上の変数ipに退避させる(ステップS2706)。
次に、CPU1401は、(iNoteCnt−i−1)番目の配列要素のピッチ項目note[iNoteCnt−i−1]−>iPitの値を、i番目の配列要素のピッチ項目note[i]−>iPitに格納する(ステップS2707)。
そして、CPU1401は、変数データipに退避させていた元のピッチ項目値を、(iNoteCnt−i−1)番目の配列要素のピッチ項目note[iNoteCnt−i−1]−>iPitに格納する(ステップS2708)。
ステップS2705の判定がNOの場合には、CPU1401は、ステップS2706、S2707、S2708の処理をスキップする。
ステップS2704またはS2708の処理の後、あるいはステップS2705の判定がNOとなった後に、CPU1401は、ステップS2709で、変数データiの値を+1インクリメントし、次のノートに対する処理に移行してステップS2702の判定処理に戻る。
以上の処理により、図12の1202で説明した左右反転処理が実現される。
図28は、図25のステップS2508のメロディ最適化処理の詳細例を示すフローチャートである。この処理は、図13の説明で前述したピッチの最適化処理を実現する。
まず、CPU1401は、次式により、別ピッチ候補の全組合せ数を算出する(ステップS2801)。
IWnum=MAX_NOTE_CANDIDATE^iNoteCnt
ここで、演算子「^」は、べき乗演算を示す。また、ROM1402上の定数データMAX_NOTE_CANDIDATEは、図13に示される1つのノートに対する別ピッチ候補ipitd[0]〜ipitd[4]の候補数を示し、この例では5である。
次に、CPU1401は、別ピッチ候補のカウント用の変数データiCntを初期値「0」に設定した後(ステップS2802)、ステップS2818で変数データiCntを+1ずつインクリメントしながら、ステップS2803で変数データiCntの値がステップS2801で算出した別ピッチ候補の全組合せ数より小さい範囲で、入力されたメロディのピッチを変更しながら、そのメロディの妥当性を評価する。
CPU1401は、変数データiCntの値がインクリメントされるごとに、ステップS2805からS2817までの一連の処理を実行する。
まず、CPU1401は、図25のコピー処理により得られたメロディのノート数をカウントするRAM1403内の変数iに初期値「0」を格納する(ステップS2805)。その後、CPU1401は、ステップS2813で変数iの値を+1ずつインクリメントさせながら、ステップS2806で変数iの値がメロディのノート数を示す変数データiNoteCntの値よりも小さいと判定される間、ステップS2806からS2813までの一連の処理を繰り返し実行する。この繰返し処理によって、メロディの全てのノートに対して、ステップS2807、S2808、およびS2809によって、ピッチ修正が行われる。
まず、CPU1401は、次式を演算することによって、ピッチ修正値をRAM1403上の変数データipitdevに得る(ステップS2807)。
ipitdev=ipitd[(iCnt/MAX_NOTE_CANDIDATE^i)modMAX_NOTE_CANDIDATE]
ここで、「mod」は、剰余演算を示す。
次に、CPU1401は、入力したメロディのピッチ項目値note[i]−>iPitに、ステップS2807で算出された変数データipitdevの値を加算し、その結果をピッチ情報列を示す配列変数データipit[i]に格納する(ステップS809)。
次に、前述した図20のステップS2005〜S2007と同様にして、ピッチ情報列を示す配列変数データipit[i]に対して、ノートタイプ取得処理(ステップS2810)と、隣接音程の算出処理(ステップS2811およびS2812)を実行する。
CPU1401は、入力メロディを構成する全てのノートに対して、現在の変数データiCntの値に対応するピッチ修正が完了すると、ステップS2806の判定がNOなる。この結果、CPU1401は、ステップS2814において、ステップS2810〜S2812で算出されたメロディを構成するノートごとのノートタイプおよび隣接音程に対して、前述した図23の処理と同じノート接続性チェック処理を実行する(ステップS2814)。なお、このとき、入力されたメロディの小節に該当するコード進行データ中のコード情報が抽出されて使用される。
CPU1401は、ステップS2814のノート接続性チェック処理で変数データdoValueに新たに得られた適合度の値が、変数データiMaxValueに保持されている最良適合度の値よりも大きいか否かを判定する(ステップS2815)。
ステップS2815の判定がYESならば、CPU1401は、変数データiMaxValueの値を変数データdoValueの値で置き換え(ステップS2816)、変数データiMaxCntの値を変数データiCntの値で置き換える(ステップS2817)。
その後、CPU1401は、変数データiCntの値を+1インクリメントし(ステップS2818)、ステップS2803の判定処理に戻る。
以上の動作が、順次インクリメントされる変数データiCntの値に対して繰返し実行された結果、別ピッチ候補の全ての組合せに対してノート接続性をチェックする処理が完了すると、ステップS2803の判定がNOとなる。
この結果、CPU1401は、変数iに初期値「0」を格納した後(ステップS2819)、ステップS2823で変数iの値を+1ずつインクリメントさせながら、ステップS2820で変数iの値がメロディのノート数を示す変数データiNoteCntの値よりも小さいと判定される間、ステップS2820からS2823までの一連の処理を繰り返し実行する。この繰返し処理によって、メロディの全てのノートに対して、変数データiMaxCntに得られている最良値を用いて、ピッチの修正すなわち最適化が実行される。
具体的には、CPU1401は、ステップS2820の終了判定を行った後、次式を演算することによって、最適なピッチ修正値を、ピッチ情報列の配列変数データpit[i]に得る(ステップS2821)。
ipit[i]=note[i]−>iPit+ipitd[(iMaxCnt/(MAX_NOTE_CANDIDATE^i)modMAX_NOTE_CANDIDATE)]
そして、CPU1401は、ピッチ情報列の配列変数データpit[i]の値を、入力されたメロディのノートデータのピッチ項目値note[i]−>iPitに上書きコピーする(ステップS2822)。
最後に、CPU1401は、変数iの値をインクリメントし(ステップS2823)、その後ステップS2820の判定処理に戻る。
CPU1401は、入力されたメロディを構成する全てのノートデータに対する上記処理が完了すると、ステップS2820の判定がNOになって、図28のフローチャートで例示される処理すなわち図25のステップS2508のメロディ最適化処理を終了する。
図29は、図24のメロディ生成2処理(サビ先頭メロディ生成処理)の詳細例を示すフローチャートである。
まず、CPU1401は、サビ先頭メロディは生成済みか否かを判定する(ステップS2901)。
サビ先頭メロディはまだ生成されておらずステップS2901の判定がNOならば、CPU1401は、フレーズセットDB検索処理を実行する(ステップS2902)。この処理は、図25のステップS2505に対応する図26の処理と同じである。このフレーズセットDB検索処理により、CPU1401は、フレーズセットDB106から入力モチーフ108に対応するフレーズセットを抽出する。
次に、CPU1401は、ステップS2902で検索されたフレーズセット中の、サビ先頭(Cメロ)のフレーズのメロディを、RAM1403の所定領域にコピーする(ステップS2903)。
続いて、CPU1401は、ステップS2903で得たメロディに対して、図25のステップS2508と同様の図28で示されるメロディ最適化処理を実行する(ステップS2904)。
CPU1401は、ステップS2904で得られたピッチが最適化されたメロディデータを、メロディ110の一部として、RAM1403の出力メロディ領域に格納する。その後、CPU1401は、図29のフローチャートで例示される処理すなわち図24のメロディ生成2処理(サビ先頭メロディ生成処理)を終了する。
サビ先頭メロディは生成されておりステップS2901の判定がYESならば、CPU1401は、生成済みのサビ先頭メロディを現在の小節のメロディとして、RAM1403の出力メロディ領域にコピーする(ステップS2905)。その後、CPU1401は、図29のフローチャートで例示される処理すなわち図24のメロディ生成2処理(サビ先頭メロディ生成処理)を終了する。
以上説明した実施形態によれば、入力モチーフ108とコード進行データとの対応関係を適合度として数値化することが可能となり、その適合度に基づいて入力モチーフ108に適合するコード進行データを適切に選べるようになるため、自然な楽曲生成が可能になる。
以上の実施形態に関して、更に以下の付記を開示する。
(付記1)
複数のノートデータを含むモチーフを入力するモチーフ入力部と、
連続するノートタイプの接続関係を規定する複数種のノート接続ルールを参照しながら、複数種のコード進行データそれぞれの前記モチーフに対する適合度を算出し、当該適合度の算出されたコード進行データと前記モチーフとに基づいてメロディを生成するメロディ生成部と、
を備えることを特徴とする自動作曲装置。
(付記2)
前記自動作曲装置はさらに、前記算出された適合度に基づいて、複数種のコード進行データの中から、コード進行データを選択するコード進行選択部を有する、付記1に記載の自動作曲装置。
(付記3)
前記ノート接続ルールは、複数の連続するノートタイプの接続関係を規定するとともに、隣接する当該ノートタイプ間の音程を規定し、
前記コード進行選択部は、前記複数種のコード進行データそれぞれに基づいて、前記モチーフを構成する各ノートデータについて、当該ノートデータの発音タイミングに対応する当該コード進行データ上でのノートタイプと、隣接する当該ノート間の音程とを算出するとともに、当該ノートタイプおよび音程を、前記ノート接続ルールを構成するノートタイプおよび音程と比較することにより、当該コード進行データの前記モチーフに対する適合度を算出する、付記2に記載の自動作曲装置。
(付記4)
前記コード進行選択部は、前記複数のコード進行データそれぞれに対してキーシフトをしたコード進行データごとに、当該コード進行データの前記モチーフに対する適合度を算出し、当該算出された適合度に基づいてコード進行データおよびキーシフト量を選択する、付記2または3に記載の自動作曲装置。
(付記5)
前記コード進行選択部は、前記算出された適合度が最も高くなるコード進行データおよびキーシフト量を選択する、付記4に記載の自動作曲装置。
(付記6)
前記モチーフ入力部は、前記モチーフを、楽曲のメロディを構成する複数の種別のフレーズのいずれかに対応させて入力し、
前記メロディ生成部は、前記楽曲のメロディを構成する複数の種別のフレーズの組み合わせからなるフレーズセットを複数種記憶したフレーズデータベースと、前記複数のフレーズセットそれぞれについて、前記モチーフの種別と同じ種別のフレーズを当該モチーフと比較することにより、前記モチーフに類似するフレーズを有するフレーズセットを、前記フレーズデータベースから検索するフレーズセット検索部と、を有し、前記検索されたフレーズセットに含まれる各フレーズに基づいてメロディの生成を行う、付記1乃至5のいずれかに記載の自動作曲装置。
(付記7)
前記メロディ生成部は、前記検索されたフレーズセットに含まれるフレーズを変形させ変形部を含む、付記6に記載の自動作曲装置。
(付記8)
前記変形部は、前記フレーズを構成する各ノートデータに含まれるピッチを予め定められた値だけシフトする、付記7に記載の自動作曲装置。
(付記9)
前記変形部は、前記フレーズを構成するノートデータの並び順を変更する、付記7に記載の自動作曲装置。
(付記10)
前記自動作曲装置はさらに、前記複数種のコード進行データを記憶するコード進行データベースと、前記複数種のノート接続ルールを記憶するルールデータベースと、を有する付記1乃至9のいずれかに記載の自動作曲装置。
(付記11)
前記自動作曲装置はさらに、前記メロディ生成部により生成されたメロディに基づいた楽曲を再生する再生部、及び当該楽曲を表す楽譜を表示する楽譜表示部の少なくとも一方を有する付記1乃至10のいずれかに記載の自動作曲装置。
(付記12)
自動作曲装置が、
複数のノートデータを含むモチーフを入力し、
連続するノートタイプの接続関係を規定する複数種のノート接続ルールを参照しながら、複数種のコード進行データそれぞれの前記モチーフに対する適合度を算出し、
前記適合度の算出されたコード進行データと前記モチーフとに基づいてメロディを生成する、自動作曲方法。
(付記13)
複数のノートデータを含むモチーフを入力するステップと、
連続するノートタイプの接続関係を規定する複数種のノート接続ルールを参照しながら、複数種のコード進行データそれぞれの前記モチーフに対する適合度を算出するステップと、
前記適合度の算出されたコード進行データと前記モチーフとに基づいてメロディを生成するステップと、
をコンピュータに実行させるプログラム。