Skip to content

Instantly share code, notes, and snippets.

@stockedge
Last active January 31, 2017 12:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stockedge/3713792dc3ce66310b28bb07f4df6287 to your computer and use it in GitHub Desktop.
Save stockedge/3713792dc3ce66310b28bb07f4df6287 to your computer and use it in GitHub Desktop.
マルコフ連鎖で作曲
# -*- coding: utf-8 -*-
trans = {'A': {'A': 0.28385866546540767,
'B': 0.24039029254446773,
'C': 0.00022086254477386737,
'D': 0.020802627608255447,
'E': 0.011895962807622163,
'F': 0.10198601349666957,
'G': 0.15754715743344602,
'a': 0.011517653696276825,
'b': 0.0003476945011786625,
'c': 0.05216073545040652,
'd': 0.06721875013667236,
'e': 0.02704363456651899,
'f': 0.017187916850718788,
'g': 0.007822032897585382},
'B': {'A': 0.2771188892102979,
'B': 0.22058967671295754,
'C': 0.0002079861916293925,
'D': 0.007872396885466546,
'E': 0.017528215598008115,
'F': 0.00737753318814144,
'G': 0.10933858000415972,
'a': 0.00362900044705078,
'b': 0.001310073942677093,
'c': 0.17432828827364288,
'd': 0.12248235105678501,
'e': 0.031912731862767364,
'f': 0.011085424949258542,
'g': 0.015218851677157618},
'C': {'A': 0.020522388059701493,
'B': 0.008323765786452353,
'C': 0.330654420206659,
'D': 0.20020091848450058,
'E': 0.18828932261768083,
'F': 0.0371699196326062,
'G': 0.02468427095292767,
'a': 0.0008610792192881745,
'b': 0.00014351320321469576,
'c': 0.09629735935706085,
'd': 0.007032146957520092,
'e': 0.006458094144661309,
'f': 0.07936280137772675},
'D': {'A': 0.0628326536254925,
'B': 0.04909449091034769,
'C': 0.013548074929149098,
'D': 0.3528461325775904,
'E': 0.20859542406856985,
'F': 0.14082912836109768,
'G': 0.11463157530932468,
'a': 0.0012787723785166241,
'b': 6.048247736227276e-05,
'c': 0.011336144328471694,
'd': 0.02972281744660261,
'e': 0.004337457662265847,
'f': 0.006428423308218705,
'g': 0.004458422616990392},
'E': {'A': 0.06681146354123979,
'B': 0.0477829686091304,
'C': 0.016439909297052153,
'D': 0.19937573422943475,
'E': 0.30749528727153513,
'F': 0.18727973116957627,
'G': 0.12154741414638144,
'a': 0.0009357156517225364,
'b': 0.00012977078381553423,
'c': 0.023201650137966833,
'd': 0.013284430237958637,
'e': 0.010736824850422096,
'f': 0.002199273283610633,
'g': 0.0027798267901538126},
'F': {'A': 0.23432698979086133,
'B': 0.031178759044503915,
'C': 0.0012761423332342155,
'D': 0.12524159976211716,
'E': 0.18465036178015662,
'F': 0.16471528397264348,
'G': 0.2253320448012687,
'a': 0.0005513430468827436,
'b': 4.9558925562493803e-05,
'c': 0.005829368619288334,
'd': 0.021626276142333235,
'e': 0.0023602438299137676,
'f': 0.002211567053226286,
'g': 0.0006504608980077312},
'G': {'A': 0.22458874158395226,
'B': 0.1349448184910113,
'C': 0.0005032275976955647,
'D': 0.029537724717151385,
'E': 0.10087110432428681,
'F': 0.1224127160408135,
'G': 0.31503435829804954,
'a': 0.001075865898521552,
'b': 0.00043034635940862083,
'c': 0.021715138474352746,
'd': 0.027240230443534394,
'e': 0.009606441313250504,
'f': 0.001988616644686611,
'g': 0.010050669813285208},
'a': {'A': 0.020298824153478914,
'B': 0.008513836088763152,
'D': 9.725046414994254e-05,
'E': 0.00034479710016797806,
'F': 0.00031827424630890286,
'G': 0.0005835027848996552,
'a': 0.2788082397665989,
'b': 0.08956767748209707,
'c': 0.01909645477853417,
'd': 0.02394129608345858,
'e': 0.08393599151268677,
'f': 0.22152771638228275,
'g': 0.25296613915657323},
'b': {'A': 0.0024639959216619226,
'B': 0.013254598751008964,
'C': 0.00021241344152257954,
'D': 8.496537660903183e-05,
'E': 0.0002973788181316114,
'F': 0.0002973788181316114,
'G': 0.001486894090658057,
'a': 0.43051956327796426,
'b': 0.16440800373847658,
'c': 0.007307022388376737,
'd': 0.018310038659246356,
'e': 0.051234122095246186,
'f': 0.05344322188708101,
'g': 0.2566804027358851},
'c': {'A': 0.18731832969664505,
'B': 0.23348326466950775,
'C': 0.0002481350484848007,
'D': 0.0018669208409808817,
'E': 0.010480751809810394,
'F': 0.004517633343048674,
'G': 0.014253980007404665,
'a': 0.00997660440971429,
'b': 0.000708957281385145,
'c': 0.16858610286182424,
'd': 0.25081727019937455,
'e': 0.10188897728973509,
'f': 0.01134331650216232,
'g': 0.0045097560399221725},
'd': {'A': 0.050852683302823005,
'B': 0.19688553810579054,
'C': 0.00013007033432893341,
'D': 0.004386260718759033,
'E': 0.0021196647075826186,
'F': 0.009056749205125735,
'G': 0.016827247326332017,
'a': 0.008069178148183833,
'b': 0.001929376625879179,
'c': 0.15077078716639367,
'd': 0.24823682435687447,
'e': 0.20388524906060315,
'f': 0.06303112053184315,
'g': 0.04381925040948068},
'e': {'A': 0.04516940069619686,
'B': 0.021247285789738665,
'C': 5.250819282243891e-05,
'D': 0.00048183988707649827,
'E': 0.0015752457846731674,
'F': 0.0007351146995141448,
'G': 0.0036817509320204228,
'a': 0.03941203178907768,
'b': 0.0024617076282049304,
'c': 0.10173307923486297,
'd': 0.30124567965678173,
'e': 0.19861687242671247,
'f': 0.22248339042312337,
'g': 0.061104092859194645},
'f': {'A': 0.022028136557735355,
'B': 0.020554903228359962,
'C': 8.795422861942646e-06,
'D': 0.00029904437730604995,
'E': 0.0002330787058414801,
'F': 0.00083116746045358,
'G': 0.0009938827833995188,
'a': 0.0813532637615385,
'b': 0.007731176695647585,
'c': 0.009362727636537945,
'd': 0.15799218086907574,
'e': 0.3006495419783545,
'f': 0.1751564485841568,
'g': 0.2228056519387311},
'g': {'A': 0.006752134866170921,
'B': 0.027725677971711646,
'D': 0.00040821730400052955,
'E': 0.000314437653081489,
'F': 0.00034201990335179505,
'G': 0.006189456960656679,
'a': 0.14696926234029878,
'b': 0.02829938877733401,
'c': 0.009995807497958914,
'd': 0.07537677353869238,
'e': 0.21314459718881706,
'f': 0.24760034422648336,
'g': 0.23688188177144245}}
import random
def choice(pos):
r = random.random()
total = 0
for k, v in trans[pos].items():
if total <= r and r <= total + v:
return k
total += v
pos = 'c'
for i in range(4 * 8):
print(pos, end = '')
pos = choice(pos)
print()
# カノンコードにメロディを付けてみる
chords = {
'C': ['C', 'E', 'G'],
'D': ['D', 'F', 'A'],
'Em': ['E', 'G', 'B'],
'F': ['F', 'A', 'c'],
'G': ['G', 'B', 'd'],
'Am': ['A', 'c', 'e'],
'B': ['B', 'd', 'f'],
}
kanon_chords = [
'C', 'G', 'Am', 'Em', 'F', 'C', 'F', 'G'
]
pos = 'E'
for i in range(8):
chord = kanon_chords[i]
print([chord], end = '')
for j in range(2):
while True:
next_pos = choice(pos)
if next_pos in chords[chord]:
pos = next_pos
break
print(pos, end = '')
print()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment