diff options
Diffstat (limited to 'Demo/scripts')
-rwxr-xr-x | Demo/scripts/morse.py | 149 | ||||
-rw-r--r-- | Demo/scripts/toaiff.py | 107 |
2 files changed, 107 insertions, 149 deletions
diff --git a/Demo/scripts/morse.py b/Demo/scripts/morse.py deleted file mode 100755 index 3da49da..0000000 --- a/Demo/scripts/morse.py +++ /dev/null @@ -1,149 +0,0 @@ -# DAH should be three DOTs. -# Space between DOTs and DAHs should be one DOT. -# Space between two letters should be one DAH. -# Space between two words should be DOT DAH DAH. - -import sys, math, audiodev - -DOT = 30 -DAH = 3 * DOT -OCTAVE = 2 # 1 == 441 Hz, 2 == 882 Hz, ... - -morsetab = { - 'A': '.-', 'a': '.-', - 'B': '-...', 'b': '-...', - 'C': '-.-.', 'c': '-.-.', - 'D': '-..', 'd': '-..', - 'E': '.', 'e': '.', - 'F': '..-.', 'f': '..-.', - 'G': '--.', 'g': '--.', - 'H': '....', 'h': '....', - 'I': '..', 'i': '..', - 'J': '.---', 'j': '.---', - 'K': '-.-', 'k': '-.-', - 'L': '.-..', 'l': '.-..', - 'M': '--', 'm': '--', - 'N': '-.', 'n': '-.', - 'O': '---', 'o': '---', - 'P': '.--.', 'p': '.--.', - 'Q': '--.-', 'q': '--.-', - 'R': '.-.', 'r': '.-.', - 'S': '...', 's': '...', - 'T': '-', 't': '-', - 'U': '..-', 'u': '..-', - 'V': '...-', 'v': '...-', - 'W': '.--', 'w': '.--', - 'X': '-..-', 'x': '-..-', - 'Y': '-.--', 'y': '-.--', - 'Z': '--..', 'z': '--..', - '0': '-----', - '1': '.----', - '2': '..---', - '3': '...--', - '4': '....-', - '5': '.....', - '6': '-....', - '7': '--...', - '8': '---..', - '9': '----.', - ',': '--..--', - '.': '.-.-.-', - '?': '..--..', - ';': '-.-.-.', - ':': '---...', - "'": '.----.', - '-': '-....-', - '/': '-..-.', - '(': '-.--.-', - ')': '-.--.-', - '_': '..--.-', - ' ': ' ' -} - -# If we play at 44.1 kHz (which we do), then if we produce one sine -# wave in 100 samples, we get a tone of 441 Hz. If we produce two -# sine waves in these 100 samples, we get a tone of 882 Hz. 882 Hz -# appears to be a nice one for playing morse code. -def mkwave(octave): - global sinewave, nowave - sinewave = '' - for i in range(100): - val = int(math.sin(math.pi * float(i) * octave / 50.0) * 30000) - sinewave = sinewave + chr((val >> 8) & 255) + chr(val & 255) - nowave = '\0' * 200 - -mkwave(OCTAVE) - -def main(): - import getopt, string - try: - opts, args = getopt.getopt(sys.argv[1:], 'o:p:') - except getopt.error: - sys.stderr.write('Usage ' + sys.argv[0] + - ' [ -o outfile ] [ args ] ...\n') - sys.exit(1) - dev = None - for o, a in opts: - if o == '-o': - import aifc - dev = aifc.open(a, 'w') - dev.setframerate(44100) - dev.setsampwidth(2) - dev.setnchannels(1) - if o == '-p': - mkwave(string.atoi(a)) - if not dev: - import audiodev - dev = audiodev.AudioDev() - dev.setoutrate(44100) - dev.setsampwidth(2) - dev.setnchannels(1) - dev.close = dev.stop - dev.writeframesraw = dev.writeframes - if args: - line = string.join(args) - else: - line = sys.stdin.readline() - while line: - mline = morse(line) - play(mline, dev) - if hasattr(dev, 'wait'): - dev.wait() - if not args: - line = sys.stdin.readline() - else: - line = '' - dev.close() - -# Convert a string to morse code with \001 between the characters in -# the string. -def morse(line): - res = '' - for c in line: - try: - res = res + morsetab[c] + '\001' - except KeyError: - pass - return res - -# Play a line of morse code. -def play(line, dev): - for c in line: - if c == '.': - sine(dev, DOT) - elif c == '-': - sine(dev, DAH) - else: # space - pause(dev, DAH + DOT) - pause(dev, DOT) - -def sine(dev, length): - for i in range(length): - dev.writeframesraw(sinewave) - -def pause(dev, length): - for i in range(length): - dev.writeframesraw(nowave) - -if __name__ == '__main__' or sys.argv[0] == __name__: - main() diff --git a/Demo/scripts/toaiff.py b/Demo/scripts/toaiff.py new file mode 100644 index 0000000..438d225 --- /dev/null +++ b/Demo/scripts/toaiff.py @@ -0,0 +1,107 @@ +"""Convert "arbitrary" sound files to AIFF (Apple and SGI's audio format). + +Input may be compressed. +Uncompressed file type may be AIFF, WAV, VOC, 8SVX, NeXT/Sun, and others. +An exception is raised if the file is not of a recognized type. +Returned filename is either the input filename or a temporary filename; +in the latter case the caller must ensure that it is removed. +Other temporary files used are removed by the function. +""" + +import os +import tempfile +import pipes +import sndhdr + +__all__ = ["error", "toaiff"] + +table = {} + +t = pipes.Template() +t.append('sox -t au - -t aiff -r 8000 -', '--') +table['au'] = t + +# XXX The following is actually sub-optimal. +# XXX The HCOM sampling rate can be 22k, 22k/2, 22k/3 or 22k/4. +# XXX We must force the output sampling rate else the SGI won't play +# XXX files sampled at 5.5k or 7.333k; however this means that files +# XXX sampled at 11k are unnecessarily expanded. +# XXX Similar comments apply to some other file types. +t = pipes.Template() +t.append('sox -t hcom - -t aiff -r 22050 -', '--') +table['hcom'] = t + +t = pipes.Template() +t.append('sox -t voc - -t aiff -r 11025 -', '--') +table['voc'] = t + +t = pipes.Template() +t.append('sox -t wav - -t aiff -', '--') +table['wav'] = t + +t = pipes.Template() +t.append('sox -t 8svx - -t aiff -r 16000 -', '--') +table['8svx'] = t + +t = pipes.Template() +t.append('sox -t sndt - -t aiff -r 16000 -', '--') +table['sndt'] = t + +t = pipes.Template() +t.append('sox -t sndr - -t aiff -r 16000 -', '--') +table['sndr'] = t + +uncompress = pipes.Template() +uncompress.append('uncompress', '--') + + +class error(Exception): + pass + +def toaiff(filename): + temps = [] + ret = None + try: + ret = _toaiff(filename, temps) + finally: + for temp in temps[:]: + if temp != ret: + try: + os.unlink(temp) + except os.error: + pass + temps.remove(temp) + return ret + +def _toaiff(filename, temps): + if filename[-2:] == '.Z': + (fd, fname) = tempfile.mkstemp() + os.close(fd) + temps.append(fname) + sts = uncompress.copy(filename, fname) + if sts: + raise error, filename + ': uncompress failed' + else: + fname = filename + try: + ftype = sndhdr.whathdr(fname) + if ftype: + ftype = ftype[0] # All we're interested in + except IOError as msg: + if type(msg) == type(()) and len(msg) == 2 and \ + type(msg[0]) == type(0) and type(msg[1]) == type(''): + msg = msg[1] + if type(msg) != type(''): + msg = repr(msg) + raise error, filename + ': ' + msg + if ftype == 'aiff': + return fname + if ftype is None or not ftype in table: + raise error, '%s: unsupported audio file type %r' % (filename, ftype) + (fd, temp) = tempfile.mkstemp() + os.close(fd) + temps.append(temp) + sts = table[ftype].copy(fname, temp) + if sts: + raise error, filename + ': conversion to aiff failed' + return temp |