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