createWav.py

After python is installed, we need this script which uses standard libraries.


# createWav.py
import re,os,sys

ForNum = r'for (\w+) in range\((\w+)\):'
ForLen = r'for (\w+) in range\(len\((\w+)\)\):'
While = r'while\s+(.+):'
If = r'if\s+(.+):'
Fun = r'def (.+):'
Else = r'else:'
Elif = r'elif\s+(.+):'
Title = r'# (\w+)\.py (.+)'
    
res = {}
res['ForNum'] = None
res['ForLen'] = None
res['While'] = None
res['If'] = None
res['Fun'] = None
res['Else'] = None
res['Elif'] = None

def defineRes(s):
    res['ForNum'] = re.match(ForNum,s)
    if not res['ForNum']: res['ForLen'] = re.match(ForLen,s)
    else: return
    if not res['ForLen']: res['While'] = re.match(While,s)
    else: return
    if not res['While']: res['If'] = re.match(If,s)
    else: return
    if not res['If']: res['Fun'] = re.match(Fun,s)
    else: return
    if not res['Fun']: res['Else'] = re.match(Else,s)
    else: return
    if not res['Else']: res['Elif'] = re.match(Elif,s)
    
def createWav(rec,prefix):
    fin = open('%s.py' % prefix)
    T = fin.readlines()
    fin.close()
    T=[t.rstrip() for t in T]
    indent = []
    for t in T:
        indent.append(len(t)-len(t.lstrip()))
    S = [t.lstrip() for t in T]
    u = []
    for i in range(len(indent)-1):
        u.append(indent[i+1]-indent[i])
    u.append(0-indent[len(indent)-1])
    Array = r'(\w+ \w+\[\])\s*=\s*(\[.+\])'
    Time = r'time\((.+)\)'
    Print = r'print\((.+)\)'
    fw = []
    for i,s in enumerate(S):
        if i == 0:
            resultTitle = re.match(Title,s)
            r1 = resultTitle.group(1)
            r2 = resultTitle.group(2)
            out = '// %s.ck %s' % (r1,r2)
        elif s == '':
            out = ''
        elif s[:6] == 'print(':
            resultPR = re.match(Print,s)
            r1 = resultPR.group(1)
            out = '<<<%s>>>;' % r1
        elif s[0]=='#':
            out = '//%s' % s[1:]
        elif s.endswith(':'):
            defineRes(s)
            if res['ForNum']: 
                r1 = res['ForNum'].group(1)
                r2 = res['ForNum'].group(2)
                tup = r1,r1,r2,r1
                out = 'for (0 => int %s; %s<%s; %s++) {' % tup
            elif res['ForLen']:
                r1 = res['ForLen'].group(1)
                r2 = res['ForLen'].group(2)
                tup = r1,r1,r2,r1
                out ='for (0 => int %s; %s<%s.cap(); %s++) {' % tup
            elif res['While']:
                r1 = res['While'].group(1)
                out = 'while (%s) {' % r1
            elif res['If']:
                r1 = res['If'].group(1)
                out = 'if (%s) {' % r1
            elif res['Fun']:
                r1 = res['Fun'].group(1)
                out = 'fun %s {' % r1
            elif res['Else']:
                out = 'else {'
            elif res['Elif']:
                r1 = res['Elif'].group(1)
                out = 'else if (%s) {' % r1
            else:
                print('I do not know what you want:')
                sys.exit(-1)
        elif s[:5] == 'time(':
            resultT = re.match(Time,s)
            r1 = resultT.group(1)
            out = '%s => now;' % r1
        elif s.find('=')<0: out = '%s;' % s
        else:
            resultArr = re.match(Array,s)
            if resultArr:
                r1 = resultArr.group(1)
                r2 = resultArr.group(2)
                out = '%s @=> %s;' % (r2,r1)
            else:
                result = s.split('=')
                tup = result[1].strip(),result[0].strip() 
                out = '%s => %s;' % tup
        out = ' '*indent[i] + out
        fw.append(out+'\n')
        for ivar in range(u[i]//-4):
            out = ' '*(indent[i]-4*(ivar+1)) + '}\n'
            fw.append(out)

    if rec == 'stereo': fw.insert(2,'dac => WvOut2 w => blackhole;\n')
    else: fw.insert(2,'dac => WvOut w => blackhole;\n')
    fw.insert(3,'"%s.wav" => w.wavFilename;\n' % prefix)
    fw.insert(4,'\n')
    fout = open('%s.ck' % prefix,'w')
    fout.writelines(fw)
    fout.close()
    os.system('chuck %s.ck' % prefix)

if __name__ == '__main__':
    try: rec = sys.argv[2]
    except: rec = 'mono'
    prefix = sys.argv[1]
    createWav(rec,prefix)

No comments:

Post a Comment