Source code for PartituraToROM
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import ReadWriteFiles
from MainLib import exception
Notes = {
"C":12,
"C#":13,
"Db":13,
"D":14,
"D#":15,
"Eb":15,
"E":16,
"E#":17,
"Fb":16,
"F":17,
"F#":18,
"Gb":18,
"G":19,
"G#":20,
"Ab":20,
"A":21,
"A#":22,
"Bb":22,
"B":23,
"B#":24
}
LineProgram=0
[docs]def readFile(folder):
"""
Llegeix el fitxer dins del directori
:param folder: Directori on hi ha el fitxer ROM
:return: El txt amb tot el text
"""
l = ReadWriteFiles.readlines(folder, ReadWriteFiles.ORIGINAL)
return [line.split() for line in l] if l != False else exit()
[docs]def getMidi(note):
"""
Calcula el valor midi a partir de la nota escrita
:param note: La string de la nota, que està en format C1,B3, Bb1, G#
:return: El int de la clau midi
"""
try:
p = int(note[-1])
midiNote = Notes[note[:-1]]
return midiNote + 12 *p
except Exception:
exception("Error convertint la nota " + note, LineProgram, ReadWriteFiles.ORIGINAL)
[docs]def convertMidis(lines):
"""
Convertiex els midis: A partir de la llista amb les línies de la partitura passa les notes a midi
:param lines: Les línies de la partitura dividides en notes
:return: Les línies de la partitura dividides en claus midi
"""
global LineProgram
try:
for line in lines:
for note in range(len(line) - 1):
if line[note] != "0":
line[note] = hex(getMidi(line[note]) + 128)[1:]
else:
line[note] = hex(0)[1:]
LineProgram+=1
except ValueError:
exception("Error al convertir de nota a midi", LineProgram, ReadWriteFiles.ORIGINAL)
LineProgram=0
return lines
[docs]def linesToROM(folder):
"""
Fa la conversió a partir del directori on hi ha la partitura a ROM
:param folder: El directori on hi ha els fitxer de Partitura i ROM
:return: Retorna el text de ROM
"""
global LineProgram
lines = readFile(folder)
convertMidis(lines)
ROM = []
ROM.append("NOP")
ROM.append("LDI r{0},{1}".format(22, hex(0)[1:]))
try:
for line in lines:
registre = 16
for note in range(len(line)-1):
ROM.append("LDI r{0},{1}".format(registre,line[note]))
registre+=1
ROM.append("LDI r{0},{1}".format(20,hex(int(line[-1]))))
ROM.append("OUT {0},r{1}".format(10, 20))
ROM.append("IN r{0},{1}".format(21, 2))
ROM.append("EOR r{0},r{1}".format(21, 22))
ROM.append("BRNE -3")
LineProgram+=1
ROM.append("RJMP -1")
except ValueError:
exception("Error convertint la octava(nombre) a int", LineProgram, ReadWriteFiles.ORIGINAL)
return "\n".join(ROM)
if (__name__ == "__main__"):
pass