Advertisement
Guest User

pythonchik_2

a guest
Jun 20th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.94 KB | None | 0 0
  1. # from _overlapped import NULL
  2. import math, mido, numpy, scipy
  3. from mido import MidiFile
  4. import music21
  5. import time
  6. import operator
  7. import pylab as plt
  8. from matplotlib_venn import venn3
  9.  
  10. start = time.clock()
  11. input_files = {
  12. "in/Star Trek TNG kurz.mid": "F minor", "in/sleepsat.mid": "E- major", "in/silentnight.mid": "C major",
  13. "in/shephard.mid": "F major", "in/sesame.mid": "C minor",
  14. "in/scooby.mid": "C major", "in/Sara.mid": "C major", "in/santacom.mid": "C major", "in/rudolph.mid": "C major",
  15. "in/Rikasmies.mid": "C minor",
  16. "in/reichwaehr.mid": "C minor", "in/prima.mid": "C major", "in/policeacademy.mid": "C major",
  17. "in/pipi-langstrumpf.mid": "C major", "in/Petteri.mid": "C major",
  18. "in/superman.mid": "G major", "in/StheB.mid": "G major", "in/Sternenhimmel.mid": "G major",
  19. "in/starwars-imperial.mid": "D minor", "in/starwars.mid": "C minor",
  20. "in/99 Luftballons.mid": "D minor", "in/90210.mid": "F major", "in/Zorbas.mid": "D major",
  21. "in/ZieGindsKomtDeStoomboot.mid": "F major",
  22. "in/you R not alone.mid": "D minor",
  23. "in/X Files.mid": "E minor", "in/winnerabba.mid": "B major", "in/WalkOfLife.mid": "A major",
  24. "in/Uralinpihlaja.mid": "D minor", "in/tlc.mid": "C major",
  25. "in/Titanic.mid": "C major", "in/tannebaum.mid": "F major",
  26.  
  27. "in/oxygen.mid": "C minor", "in/ohcome.mid": "D minor", "in/Oh_come.mid": "G major",
  28. "in/offspring_getajob.mid": "A minor", "in/o_little.mid": "F major",
  29. "in/o_la_paloma.mid": "G major", "in/nur getrumt.mid": "C major",
  30. "in/Niemals in New York 2.mid": "C major", "in/nie wieder.mid": "C major", "in/murka.mid": "D minor",
  31. "in/Mit 66 Jahren.mid": "F major", "in/Mission_impossible.mid": "E- major",
  32. "in/mief.mid": "C major", "in/marmor-stein.mid": "C major",
  33. "in/major tom.mid": "F major", "in/Macarena.mid": "F major",
  34. "in/LivingRoom.mid": "D minor", "in/liquido.mid": "A minor",
  35.  
  36. "in/Lindenstrae2.mid": "C major", "in/kiss.mid": "A minor", "in/Insel m. 2 Bergen.mid": "C major",
  37. "in/indiana.mid": "C major", "in/howmuchisthefish.mid": "A minor", "in/HoheBerge.mid": "D major",
  38. "in/GWein.mid": "A minor",
  39.  
  40. "in/GuteZeiten.mid": "A minor", "in/Griechischer Wein2.mid": "A minor",
  41. "in/goodbad.mid": "A minor", "in/good.mid": "F major", "in/godfather.mid": "C minor",
  42. "in/god_rest.mid": "D minor", "in/gl_ck.mid": "C major", "in/FofS.mid": "G major",
  43.  
  44. "in/flintstones.mid": "A minor", "in/flieger.mid": "C major",
  45. "in/Eldanka.mid": "D minor", "in/Elamaa_juoksuhaudoissa.mid": "G minor",
  46. "in/einfallfuer2.mid": "A minor", "in/Ein_Fall_Fuer_Zwei.mid": "A minor",
  47. "in/east_end.mid": "B- major", "in/DschingesKhan.mid": "A minor",
  48. "in/deutschlandlied.mid": "G major", "in/denneboom.mid": "F major",
  49. # "in/davy.mid": "C major",
  50. "in/Cucaracha.mid": "C major",
  51. "in/cccp.mid": "A major", "in/boom.mid": "F major", "in/Bittersweetharmonie.mid": "A- major",
  52. "in/big big girl.mid": "C major", "in/Biene Maja.mid": "C major",
  53. "in/away.mid": "F major", "in/advkal8.mid": "C major", "in/advkal10.mid": "C major",
  54. "in/advkal12.mid": "A minor", "in/advkal15.mid": "C major",
  55. "in/advkal17.mid": "C major"
  56.  
  57. }
  58.  
  59. major_profile = [6.35, 2.23, 3.48, 2.33, 4.38, 4.09, 2.52, 5.19, 2.39, 3.66, 2.29, 2.88]
  60. minor_profile = [5.38, 2.60, 3.53, 2.54, 4.75, 3.98, 2.69, 3.34, 3.17, 6.33, 2.68, 3.52]
  61.  
  62. messages = ["note_off", "polytouch", "control_change", "program_change", "aftertouch",
  63. "pitchwheel", "sysex", "quarter_frame", "songpos", "song_select", "tune_request",
  64. "clock", "start", "continue", "stop", "active_sensing", "reset"]
  65.  
  66. correlate_krumh = {"10": "A", "11": "B-", "12": "B", "1": "C", "2": "D-", "3": "D", "4": "E-",
  67. "5": "E", "6": "F", "7": "G-", "8": "G", "9": "A-"}
  68. correlate_algo = {9: "A", 10: "A ♯ or B ♭", 11: "B", 0: "C", 1: "C ♯ or D ♭", 2: "D", 3: "D ♯ or E ♭",
  69. 4: "E", 5: "F", 6: "F ♯ or G ♭", 7: "G", 8: "G ♯ or A ♭"}
  70. correlate_algo_reverse = {}
  71.  
  72.  
  73. def get_key(midi_file):
  74. r_major = [0] * 12
  75. r_minor = [0] * 12
  76. frequency = [0] * 12
  77. y = [0] * 12
  78. for i in midi_file.tracks:
  79. for j in i[2:]:
  80. # print("This is j: ", j)
  81. if not j.is_meta and not messages.__contains__(j.type): # and j.velocity != 0 :
  82. # print("This is j: ", j)
  83. my_note = j.note
  84. frequency[my_note % 12] += 1
  85. x = major_profile
  86. for i in range(12):
  87. for j in range(12):
  88. y[j] = frequency[(j + i) % 12]
  89. help = helper(x, y)
  90. r_major[i] = help[0] / help[1]
  91. x = minor_profile
  92. for i in range(12):
  93. for j in range(12):
  94. y[j] = frequency[(j + i + 3) % 12]
  95. help = helper(x, y)
  96. r_minor[i] = help[0] / help[1]
  97. max_r = -100000
  98. fit_key = 0
  99. for i in range(12):
  100. if max_r < r_major[i]:
  101. max_r = r_major[i]
  102. fit_key = i + 1
  103. lad = "major"
  104. for i in range(12):
  105. if max_r < r_minor[i]:
  106. max_r = r_minor[i]
  107. fit_key = -i - 1
  108. lad = "minor"
  109. return (str)(correlate_krumh[(str)(abs(fit_key))] + " " + (str)(lad))
  110.  
  111.  
  112. def helper(x, y):
  113. meanX = mean(x)
  114. meanY = mean(y)
  115. numerator = 0
  116. denominator_one = 0
  117. denominator_two = 0
  118. for j in range(12):
  119. numerator += (x[j] - meanX) * (y[j] - meanY)
  120. denominator_one += (x[j] - meanX) * (x[j] - meanX)
  121. denominator_two += (y[j] - meanY) * (y[j] - meanY)
  122. denominator = math.sqrt(denominator_one * denominator_two)
  123. return numerator, denominator
  124.  
  125.  
  126. def mean(arr):
  127. size = len(arr)
  128. summ = 0
  129. for i in range(size):
  130. summ += arr[i]
  131. return summ / size
  132.  
  133.  
  134. notes_letters = [['C', 'A'],
  135. ['F', 'D', 'G', 'E'],
  136. ['B-', 'G', 'D', 'B'],
  137. ['E-', 'C', 'A', 'F+'],
  138. ['A-', 'F', 'E', 'C+'],
  139. ['D-', 'B-', 'B', 'G+'],
  140. ['G-', 'E-', 'F+', 'D+'],
  141. ['C-', 'A-', 'C+', 'A+']]
  142. signs_by_key = {
  143. 'C major': 0, 'A minor': 0,
  144. 'F major': 1, 'D minor': 1, 'G major': 1, 'E minor': 1,
  145. 'B- major': 2, 'G minor': 2, 'D major': 2, 'B minor': 2,
  146. 'E- major': 3, 'C minor': 3, 'A major': 3, 'F+ minor': 3,
  147. 'A- major': 4, 'F minor': 4, 'E major': 4, 'C+ minor': 4,
  148. 'D- major': 5, 'B- minor': 5, 'B major': 5, 'G+ minor': 5,
  149. 'G- major': 6, 'E- minor': 6, 'F+ major': 6, 'D+ minor': 6,
  150. }
  151.  
  152. notes_num = [[0, 9],
  153. [7, 5, 4, 2],
  154. [2, 10, 11, 7],
  155. [9, 3, 6, 0],
  156. [4, 8, 1, 5],
  157. [11, 1, 8, 10],
  158. [6, 6, 3, 3],
  159. [1, 11, 10, 8]]
  160.  
  161. signs = [6, 1, 8, 3, 10]
  162. sharps = [6, 1, 8, 3, 10, 5, 0]
  163. flats = [10, 3, 8, 1, 6, 11, 4]
  164.  
  165.  
  166. def is_a_sign(x):
  167. return signs.__contains__(x)
  168.  
  169.  
  170. def is_a_sharp(x):
  171. return sharps.__contains__(x)
  172.  
  173.  
  174. def is_a_flat(x):
  175. return flats.__contains__(x)
  176.  
  177.  
  178. major_intervals = [2, 2, 1, 2, 2, 2, 1]
  179. minor_intervals = [2, 1, 2, 2, 1, 2, 2]
  180.  
  181. paral = {"C major": "A minor", "D- major": "B- minor", "D major": "B minor", "E- major": "C minor",
  182. "E major": "C+ minor", "F major": "A minor", "F+ major": "D+ minor", "G- major": "E- minor",
  183. "G major": "E minor", "A- major": "F minor", "A major": "F+ minor", "B- major": "G minor",
  184. "B major": "G+ minor",
  185. }
  186.  
  187.  
  188. def algo2(file):
  189. frequency = {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 10: 0, 11: 0}
  190. note_count = 0
  191. last_note = 0
  192. for i in file.tracks:
  193. # print("track ", i)
  194. for j in i[2:len(i)]:
  195. if not j.is_meta and not messages.__contains__(j.type) and j.velocity != 0:
  196. # print("msg ", j)
  197. last_note = j.note
  198. note_count += 1
  199. frequency[last_note % 12] += 1
  200. # print("last_note ", last_note)
  201. # print("frequency", frequency)
  202. last_note = last_note % 12
  203.  
  204. the_signs = []
  205. the_sharps = []
  206. the_flats = []
  207. sign_count = 0
  208. meanX = mean(frequency)
  209. # print("mean freq", meanX)
  210. flag = False
  211. we_have_flats = False
  212. sorted_frequency = sorted(frequency.items(), key=operator.itemgetter(1))
  213. sorted_frequency.reverse()
  214. # print("sorted frequency", sorted_frequency)
  215. sorted_frequency = sorted_frequency[:8]
  216. # print("most common ", sorted_frequency)
  217.  
  218. maybe_a_sign = []
  219. for i in range(12):
  220. if frequency[i] > 1:
  221. # if sign_count >= 5:
  222. # flag = True
  223. # if is_a_sharp(i):
  224. # print(frequency[i], "sign_count >= 5, a sharp")
  225. # the_sharps.append(i)
  226. # sign_count += 1
  227. # sharp_count += 1
  228. # elif is_a_flat(i):
  229. # print(frequency[i], "sign_count >= 5, a flat")
  230. # the_flats.append(i)
  231. # sign_count += 1
  232. # flat_count += 1
  233. if is_a_sign(i):
  234. the_signs.append(i)
  235. sign_count += 1
  236. if the_signs.__contains__(signs[0]):
  237. we_have_sharps = True
  238. for x in the_signs:the_sharps.append(x)
  239. elif the_signs.__contains__(signs[len(signs) - 1]):
  240. we_have_flats = True
  241. for x in the_signs: the_flats.append(x)
  242. elif len(the_signs) == 0:
  243. pass
  244. # print("no signs")
  245. # else:
  246. # if the_signs.__contains__(signs[1] or
  247. # the_signs.__contains__(signs[len(signs) - 2])):
  248. # print('how can it be')
  249. # print("hz")
  250.  
  251. # print("note_count ", note_count)
  252. # print("the signs ", the_signs, "signs count ", sign_count)
  253. # print("the sharps ", the_sharps, "\nthe_flats ", the_flats)
  254.  
  255. potential_note_num = []
  256. for i in range(7):
  257. for j in range(0, 1):
  258. if sorted_frequency[i][1] != 0:
  259. potential_note_num.append(sorted_frequency[i][j])
  260. potential_notes_letters = []
  261. for i in range(len(potential_note_num)):
  262. # print("potential note num ",correlate[potential_note_num[i]])
  263. potential_notes_letters.append(correlate_algo[(potential_note_num[i])])
  264. # print("potential notes ", potential_note_num)
  265.  
  266. k = 0
  267. for n in potential_notes_letters:
  268. if len(n) > 2:
  269. if we_have_flats:
  270. potential_notes_letters[k] = n[7:]
  271. else:
  272. potential_notes_letters[k] = n[:3]
  273. k += 1
  274. # print("potential notes ", potential_notes_letters)
  275. # print("num of signs is ", sign_count, "so it should be one of these", notes_letters[sign_count],
  276. # "we have flats? ",
  277. # we_have_flats, ", so it is ", notes_letters[sign_count][:2])
  278. # print("let's try to determine if it is major or minor")
  279. major_begin = notes_num[sign_count][0]
  280. minor_begin = notes_num[sign_count][1]
  281. potential_note_num.sort()
  282. major = []
  283. minor = []
  284. for i in major_intervals:
  285. major_begin += i
  286. major.append(major_begin % 12)
  287. for i in minor_intervals:
  288. minor_begin += i
  289. minor.append(minor_begin % 12)
  290. # print(potential_note_num)
  291. major_count = 0
  292. minor_count = 0
  293. for i in range(7):
  294. if potential_note_num.__contains__(i) and major.__contains__(i):
  295. major_count += 1
  296. if potential_note_num.__contains__(i) and minor.__contains__(i):
  297. minor_count += 1
  298. if major_count >= minor_count:
  299. if sign_count == 0:
  300. # print('major no signs last note ', last_note, notes_letters[sign_count][0])
  301. if (correlate_algo[(last_note)]) == str(notes_letters[sign_count][0]):
  302. flag = True
  303. return str(notes_letters[sign_count][0]) + " major"
  304. elif we_have_flats:
  305. # print('major flats last note ', last_note, notes_letters[sign_count][0])
  306. if (correlate_algo[(last_note)]) == str(notes_letters[sign_count][0]):
  307. flag = True
  308. return str(notes_letters[sign_count][0]) + " major"
  309. else:
  310. # print('major sharps last note ', last_note, notes_letters[sign_count][2])
  311. if (correlate_algo[(last_note)]) == str(notes_letters[sign_count][2]):
  312. flag = True
  313. return str(notes_letters[sign_count][2]) + " major"
  314.  
  315. else:
  316. if sign_count == 0:
  317. # print('minor no signs last note ', last_note, notes_letters[sign_count][1])
  318. if (correlate_algo[(last_note)]) == str(notes_letters[sign_count][1]):
  319. flag = True
  320. return str(notes_letters[sign_count][1]) + " minor"
  321. elif we_have_flats:
  322. # print('minor flats last note ', last_note, notes_letters[sign_count][1])
  323. if str(correlate_algo[(last_note)]) == str(notes_letters[sign_count][1]):
  324. flag = True
  325. return str(notes_letters[sign_count][1]) + " minor"
  326. else:
  327. # print('minor sharps last note ', last_note, notes_letters[sign_count][3])
  328. if str(correlate_algo[(last_note)]) == str(notes_letters[sign_count][3]):
  329. flag = True
  330. return str(notes_letters[sign_count][3]) + " minor"
  331.  
  332.  
  333. def is_paral(one, two):
  334. return paral.get(str(one)) == str(two) or paral.get(str(two)) == str(one)
  335.  
  336.  
  337. def is_true(key):
  338. return input_files[x] == key
  339.  
  340. # return list(mydict_num.keys())[list(mydict_num.values()).index([0, 9])] == notes_num[input_files[x]]
  341.  
  342.  
  343. # " m21 par or true", "krumhansl par or true", " "," ",
  344. print("true key ", "music21 ", "Krumhansl ", " algo2 ",
  345.  
  346. "music21 = krum ", "", "music21 == algo", " ", " krum = algo ", )
  347. #
  348. # music21_true = False
  349. # krumhansl_true = False
  350. # algo_true = False
  351. # music21_krumhansl = False
  352. # music21_algo = False
  353. # krumhansl_algo = False
  354. # all_say_the_same = False
  355. # all_say_the_same_and_true = False
  356. # music21_is_parallel = False
  357. # krumhansl_is_parallel = False
  358. # num_of_files = len(input_files)
  359. # music21_number = 0
  360. # krumhansl_number = 0
  361. # music21_krumhansl_number = 0
  362. # music21_parallel_number = 0
  363. # krumhansl_parallel_number = 0
  364. # krum_algo2_number = 0
  365. # algo_num = 0
  366. # music21_algo_num = 0
  367. # all_number = 0
  368. # i = 0
  369. # for x in input_files:
  370. # key = music21.converter.parse(x).analyze('key')
  371. # mid = MidiFile(x)
  372. # krum_key = get_key(mid)
  373. # algo_key = algo2(mid)
  374. #
  375. # if input_files[x] == str(key.tonic.name + " " + key.mode):
  376. # music21_true = True
  377. # music21_number += 1
  378. # if input_files[x] == krum_key:
  379. # krumhansl_true = True
  380. # krumhansl_number += 1
  381. # if input_files[x] == str(algo_key):
  382. # algo_true = True
  383. # algo_num += 1
  384. #
  385. # if str(input_files[x]) == str(krum_key) == str(key.tonic.name + " " + key.mode) == str(algo_key):
  386. # # print("all the same! ")
  387. # all_number += 1
  388. # if input_files[x] == str(krum_key) == str(key.tonic.name + " " + key.mode):
  389. # music21_krumhansl = True
  390. # music21_krumhansl_number += 1
  391. # if input_files[x] == str(algo_key) == str(key.tonic.name + " " + key.mode):
  392. # music21_algo = True
  393. # music21_algo_num += 1
  394. # if input_files[x] == str(krum_key) == str(algo_key):
  395. # krumhansl_algo = True
  396. # krum_algo2_number += 1
  397. #
  398. # if str(key.tonic.name + " " + key.mode) == str(paral.get(input_files[x])) or music21_true \
  399. # or (str)(input_files[x]) == (str)(paral.get(key.tonic.name + " " + key.mode)):
  400. # music21_is_parallel = True
  401. # music21_parallel_number += 1
  402. # if str(krum_key) == (str)(paral.get(input_files[x])) or krumhansl_true \
  403. # or (str)(input_files[x]) == (str)(paral.get(krum_key)):
  404. # krumhansl_is_parallel = True
  405. # krumhansl_parallel_number += 1
  406. # # music21_is_parallel, krumhansl_is_parallel, " ",
  407. # print(i, input_files[x], " ", key.tonic.name, key.mode, " ", krum_key, " ", algo_key,
  408. # " ", music21_krumhansl, " ", music21_algo, " ", krumhansl_algo)
  409. # i += 1
  410. # music21_true = False
  411. # krumhansl_true = False
  412. # algo_true = False
  413. # music21_krumhansl = False
  414. # music21_algo = False
  415. # krumhansl_algo = False
  416. # music21_is_parallel = False
  417. # krumhansl_is_parallel = False
  418. # # music21_parallel_number * 100 // num_of_files, krumhansl_parallel_number * 100 // num_of_files,
  419. # print("Percent ", " ", (music21_number * 100 // num_of_files), " ",
  420. # (krumhansl_number * 100 // num_of_files), " ",
  421. # (algo_num * 100 // num_of_files), " ",
  422. # (music21_krumhansl_number * 100 // num_of_files), " ",
  423. # # algo_num * 100 // num_of_files," ",
  424. # music21_algo_num * 100 // num_of_files, " ",
  425. # krum_algo2_number * 100 // num_of_files)
  426. #
  427. # print("num of files considered: ", len(input_files))
  428. # my_subsets = [0] * 7
  429. # my_subsets[6] = all_number * 100 // num_of_files
  430. # my_subsets[2] = music21_krumhansl_number - my_subsets[6]
  431. # my_subsets[4] = music21_algo_num - my_subsets[6]
  432. # my_subsets[0] = music21_number - my_subsets[2] - my_subsets[4] - my_subsets[6]
  433. # my_subsets[1] = krumhansl_number - my_subsets[2] - my_subsets[5] - my_subsets[6]
  434. # my_subsets[3] = algo_num - my_subsets[4] - my_subsets[5] - my_subsets[6]
  435. # venn3(subsets=my_subsets, set_labels=('music21', 'Krumhansl', 'algorithm'))
  436. # plt.show()
  437.  
  438. k = 0
  439. n = 0
  440. i = 0
  441. for x in input_files:
  442. algo_key = algo2(MidiFile(x))
  443. print(input_files[x], algo_key, (is_paral(input_files[x], algo_key) or is_true(algo_key)))
  444. # print(input_files[i][1])
  445. # print(signs_by_key[input_files[i][1]], signs_by_key[algo_key])
  446. if is_paral(input_files[x], algo_key) or is_true(algo_key): k += 1
  447. if is_true(algo_key): n += 1
  448. i += 1
  449. print(k / len(input_files), n / len(input_files))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement