コード進行のルールに則ってコード案をランダムに出力するプログラム
作曲の本を勉強していると突如として「さぁ自由に作ってみよう!」と高度な創造力を要求されることがあります。
創造力の乏しい自分にとっては「コード進行のルールに則ってコードを作ってみよう」という行為もなかなか難しいのです。(自由というのは扱いにくいです)
そこで、プログラムで楽をすることにしました
採用するコード進行のルールについて
作曲理論については何度もトライをして諦めて来ました。今はまずこちらの本で紹介されている「最もオーソドックスなルール」を採用することにしました。
- 主要コード(スリーコード)
- 代理コード
- 同じ役割の主要コードの直前には置かない
- トニック:Em,Am→F,G,Em,Am,Dm ※Cには行かない
- サブドミナント:Dm→G,C,Em,Am
一つずつ入力値に対して次のコードを排出する
特定のリストからランダムにリストの要素を排出するにはrandom.choiceを使う
import random
def code_maker (x): if x == "C": x2 = random.choice(["C","F","G","Em","Am","Dm"]) if x == "F" or x == "Dm": x2 = random.choice(["G","C","Em","Am"]) if x == "G": x2 = random.choice(["C","Em","Am"]) if x == "Em" or x == "Am": x2 = random.choice(["F","G","Em","Am","Dm"]) else: x2 = "入力エラー" return x2
code_maker(x="Am")
'G'
これを繰り返していくことは可能なものの、メモしていくのは面倒です。
ランダムな結果を繋げたものを排出したい
リストに要素を加えるappendを使った関数に書き変えます。
import random
最初は「C」から始める想定とする(外でも良い)
list_input = ["C"] list_output = ["C"]
def code_list_maker (x,output): if x == "C": x2 = random.choice(["C","F","G","Em","Am","Dm"]) output.append(x2) if x == "F" or x == "Dm": x2 = random.choice(["G","C","Em","Am"]) output.append(x2) if x == "G": x2 = random.choice(["C","Em","Am"]) output.append(x2) if x == "Em" or x == "Am": x2 = random.choice(["F","G","Em","Am","Dm"]) output.append(x2)
これを繰り返しできるようにする。
for i in range(0,6): code_list_maker(x=list_input[0],output=list_output) print(list_output)
['C', 'C', 'Am', 'Em', 'C', 'G', 'G']
ファイルへの書き込み
テキストファイルの書き込みはこちらを参考にしました
[https://note.nkmk.me/python-file-io-open-with/:title]
((何故かリンク表示が上手くいかない))
path_w = 'code_output.txt'
文字の羅列のまま書き込むと読みづらいので「/」を加えるようにした
with open(path_w, mode='w') as f: f.write("/".join(list_output))
できたのは
C/C/Am/Em/C/G/G
のコード
本当は、このようなランダムな文字列を複数作成して、規定の数まで行って「C」で終わるとか、同じ繰り返しをさせるだとか、もっと複雑なことをするべきなのでしょうけれど、そこまで考える余力がありませんでした。
元気な方、お願いします。