From 0dec473ffc869c946f1057e55ecde878c22f6bca Mon Sep 17 00:00:00 2001 From: Marian Sigler Date: Sat, 8 Jun 2013 23:10:19 +0200 Subject: more tolerant parsing of defaults --- music/tonleiter | 2 +- rtttl.py | 36 +++++++++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/music/tonleiter b/music/tonleiter index dcf64b3..e6199ab 100644 --- a/music/tonleiter +++ b/music/tonleiter @@ -1 +1 @@ -tonleiter:d=4,o=4,b=120:c,d,e,f,g,a,h,c5 +tonleiter::c,d,e,f,g,a,h,c5 diff --git a/rtttl.py b/rtttl.py index 6d1dfe5..959671e 100644 --- a/rtttl.py +++ b/rtttl.py @@ -1,6 +1,8 @@ #!/usr/bin/python """ play a rtttl file by sending the tone lengths to the arduino + +protocol information taken from http://merwin.bespin.org/t4a/specs/nokia_rtttl.txt """ from __future__ import division import re @@ -13,7 +15,6 @@ BAUDRATE = 9600 PAUSE = .001 _rtttl_re = re.compile('^\s*([0-9]+)?([a-hp]#?)(\.?)([0-9]?)\s*$') -_rtttl_prefix_re = re.compile('d=([0-9]+),\s?o=([1-5]),\s?b=([0-9]+)') freqs = { 'c': 261.626, @@ -32,14 +33,28 @@ freqs = { 'p': 0, } -def parse(s): - name, prefix, music = s.split(':') - pm = _rtttl_prefix_re.match(prefix) - d, o, b = pm.groups() +def parse_defaults(s): + defaults = { + 'd': 4, # duration + 'o': 6, # octave + 'b': 63, # beats per minute + } + + if s == '': + return defaults - defaultlength = int(d) - defaultoctave = int(o) - timefactor = int(b)/60 + for option in s.split(','): + k,v = option.split('=') + defaults[k] = v + + return defaults + +def parse(s): + name, defs, music = s.split(':') + defaults = parse_defaults(defs) + defaultlength = int(defaults['d']) + defaultoctave = int(defaults['o']) + timefactor = int(defaults['b'])/60 # for m in _rtttl_re.finditer(music): for tone in music.split(","): @@ -70,7 +85,8 @@ def parse(s): yield (length, tone) def send(sounds, device): - with serial.Serial(device, BAUDRATE) as ser: + ser = serial.Serial(device, BAUDRATE) + try: for length, freq in sounds: sys.stderr.write('len: %.3f, ton: %9.3f, send: %d' % (length, freq, freq2t(freq))) ser.write(struct.pack('>H', freq2t(freq))) @@ -78,7 +94,9 @@ def send(sounds, device): sys.stderr.write('\n') ser.write('\0\0') time.sleep(PAUSE) + finally: ser.write('\0\0') + ser.close() def freq2t(freq): -- cgit v1.2.3-1-g7c22