Files
smnp-py/smnp/token/tokenizers/note.py
2019-07-12 17:00:44 +02:00

54 lines
2.3 KiB
Python

import re
from smnp.note.model import Note
from smnp.token.model import Token
from smnp.token.type import TokenType
def noteTokenizer(input, current, line):
consumedChars = 0
notePitch = None
octave = None
duration = None
dot = False
rawValue = ''
if input[current] == '@':
rawValue += input[current+consumedChars]
consumedChars += 1 # TODO: Check if next item does even exist
if input[current+consumedChars] in ('C', 'c', 'D', 'd', 'E', 'e', 'F', 'f', 'G', 'g', 'A', 'a', 'H', 'h', 'B', 'b'):
rawValue += input[current + consumedChars]
notePitch = input[current+consumedChars]
consumedChars += 1
if current+consumedChars < len(input) and input[current+consumedChars] in ('b', '#'):
rawValue += input[current + consumedChars]
notePitch += input[current+consumedChars]
consumedChars += 1
if current+consumedChars < len(input) and re.match(r'\d', input[current+consumedChars]):
rawValue += input[current + consumedChars]
octave = input[current+consumedChars]
consumedChars += 1
if current+consumedChars < len(input) and input[current+consumedChars] == ':':
rawValue += input[current + consumedChars]
duration = ''
consumedChars += 1
while current+consumedChars < len(input) and re.match(r'\d', input[current+consumedChars]):
rawValue += input[current + consumedChars]
duration += input[current+consumedChars]
consumedChars += 1
if len(duration) == 0:
return (0, None)
dot = (current+consumedChars) < len(input) and input[current+consumedChars] == 'd'
if dot:
rawValue += input[current + consumedChars]
consumedChars += 1
octave = int(octave) if octave is not None else None
duration = int(duration) if duration is not None else None
value = Note(notePitch, octave, duration, dot)
return (consumedChars, Token(TokenType.NOTE, value, (line, current), rawValue))
return (0, None)