広告/統計/アニメ/映画 等に関するブログ

広告/統計/アニメ/映画 等に関するブログ

コード進行のルールに則ってコード案をランダムに出力するプログラム

作曲の本を勉強していると突如として「さぁ自由に作ってみよう!」と高度な創造力を要求されることがあります。

創造力の乏しい自分にとっては「コード進行のルールに則ってコードを作ってみよう」という行為もなかなか難しいのです。(自由というのは扱いにくいです)

そこで、プログラムで楽をすることにしました

採用するコード進行のルールについて

作曲理論については何度もトライをして諦めて来ました。今はまずこちらの本で紹介されている「最もオーソドックスなルール」を採用することにしました。

  • 主要コード(スリーコード)
  • 代理コード
    • 同じ役割の主要コードの直前には置かない
    • トニック:Em,Am→F,G,Em,Am,Dm ※Cには行かない
    • サブドミナント:Dm→G,C,Em,Am

一つずつ入力値に対して次のコードを排出する

特定のリストからランダムにリストの要素を排出するにはrandom.choiceを使う

note.nkmk.me

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)

これを繰り返しできるようにする。

qiita.com

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」で終わるとか、同じ繰り返しをさせるだとか、もっと複雑なことをするべきなのでしょうけれど、そこまで考える余力がありませんでした。

元気な方、お願いします。