Initial revision
diff --git a/Lib/irix5/DEVICE.py b/Lib/irix5/DEVICE.py
new file mode 100755
index 0000000..00eddfc
--- /dev/null
+++ b/Lib/irix5/DEVICE.py
@@ -0,0 +1,423 @@
+#/**************************************************************************
+# *									  *
+# * 		 Copyright (C) 1984, Silicon Graphics, Inc.		  *
+# *									  *
+# *  These coded instructions, statements, and computer programs  contain  *
+# *  unpublished  proprietary  information of Silicon Graphics, Inc., and  *
+# *  are protected by Federal copyright law.  They  may  not be disclosed  *
+# *  to  third  parties  or copied or duplicated in any form, in whole or  *
+# *  in part, without the prior written consent of Silicon Graphics, Inc.  *
+# *									  *
+# **************************************************************************/
+#/* file with device definitions (see /usr/include/device.h) */
+
+NULLDEV =  0
+BUTOFFSET = 1
+VALOFFSET = 256
+TIMOFFSET = 515
+XKBDOFFSET = 143
+INOFFSET = 1024
+OUTOFFSET = 1033
+BUTCOUNT = 190
+VALCOUNT = 27
+TIMCOUNT = 4
+XKBDCOUNT = 28
+INCOUNT =  8
+OUTCOUNT = 8
+#
+#
+#
+#
+BUT0 =   1	
+BUT1 =   2	
+BUT2 =   3	
+BUT3 =   4	
+BUT4 =   5	
+BUT5 =   6	
+BUT6 =   7	
+BUT7 =   8	
+BUT8 =   9	
+BUT9 =  10	
+BUT10 =  11	
+BUT11 =  12	
+BUT12 =  13	
+BUT13 =  14	
+BUT14 =  15	
+BUT15 =  16	
+BUT16 =  17	
+BUT17 =  18	
+BUT18 =  19	
+BUT19 =  20	
+BUT20 =  21	
+BUT21 =  22	
+BUT22 =  23	
+BUT23 =  24	
+BUT24 =  25	
+BUT25 =  26	
+BUT26 =  27	
+BUT27 =  28	
+BUT28 =  29	
+BUT29 =  30	
+BUT30 =  31	
+BUT31 =  32	
+BUT32 =  33	
+BUT33 =  34	
+BUT34 =  35	
+BUT35 =  36	
+BUT36 =  37	
+BUT37 =  38	
+BUT38 =  39	
+BUT39 =  40	
+BUT40 =  41	
+BUT41 =  42	
+BUT42 =  43	
+BUT43 =  44	
+BUT44 =  45	
+BUT45 =  46	
+BUT46 =  47	
+BUT47 =  48	
+BUT48 =  49	
+BUT49 =  50	
+BUT50 =  51	
+BUT51 =  52	
+BUT52 =  53	
+BUT53 =  54	
+BUT54 =  55	
+BUT55 =  56	
+BUT56 =  57	
+BUT57 =  58	
+BUT58 =  59	
+BUT59 =  60	
+BUT60 =  61	
+BUT61 =  62	
+BUT62 =  63	
+BUT63 =  64	
+BUT64 =  65	
+BUT65 =  66	
+BUT66 =  67	
+BUT67 =  68	
+BUT68 =  69	
+BUT69 =  70	
+BUT70 =  71	
+BUT71 =  72	
+BUT72 =  73	
+BUT73 =  74	
+BUT74 =  75	
+BUT75 =  76	
+BUT76 =  77	
+BUT77 =  78	
+BUT78 =  79	
+BUT79 =  80	
+BUT80 =  81	
+BUT81 =  82	
+BUT82 =  83	
+MAXKBDBUT = 83 
+BUT100 =  101	
+BUT101 =  102	
+BUT102 =  103	
+BUT110 =  111	
+BUT111 =  112	
+BUT112 =  113	
+BUT113 =  114	
+BUT114 =  115	
+BUT115 =  116	
+BUT116 =  117	
+BUT117 =  118	
+BUT118 =  119	
+BUT119 =  120	
+BUT120 =  121	
+BUT121 =  122	
+BUT122 =  123	
+BUT123 =  124	
+BUT124 =  125	
+BUT125 =  126	
+BUT126 =  127	
+BUT127 =  128	
+BUT128 =  129	
+BUT129 =  130	
+BUT130 =  131	
+BUT131 =  132	
+BUT132 =  133	
+BUT133 =  134	
+BUT134 =  135	
+BUT135 =  136	
+BUT136 =  137	
+BUT137 =  138	
+BUT138 =  139	
+BUT139 =  140	
+BUT140 =  141	
+BUT141 =  142	
+BUT142 =  143	
+BUT143 =  144	
+BUT144 =  145	
+BUT145 =  146	
+BUT146 =  147	
+BUT147 =  148	
+BUT148 =  149	
+BUT149 =  150	
+BUT150 =  151	
+BUT151 =  152	
+BUT152 =  153	
+BUT153 =  154	
+BUT154 =  155	
+BUT155 =  156 	
+BUT156 =  157	
+BUT157 =  158	
+BUT158 =  159	
+BUT159 =  160	
+BUT160 =  161	
+BUT161 =  162	
+BUT162 =  163	
+BUT163 =  164	
+BUT164 =  165	
+BUT165 =  166	
+BUT166 =  167	
+BUT167 =  168	
+BUT168 =  169	
+BUT181 =  182	
+BUT182 =  183	
+BUT183 =  184	
+BUT184 =  185	
+BUT185 =  186	
+BUT186 =  187	
+BUT187 =  188	
+BUT188 =  189	
+BUT189 =  190	
+MOUSE1 =  101	
+MOUSE2 =  102	
+MOUSE3 =  103	
+LEFTMOUSE = 103 
+MIDDLEMOUSE = 102 
+RIGHTMOUSE = 101 
+LPENBUT =  104	
+BPAD0 =  105	
+BPAD1 =  106	
+BPAD2 =  107	
+BPAD3 =  108	
+LPENVALID = 109 
+SWBASE =  111	
+SW0 =  111	
+SW1 =  112	
+SW2 =  113	
+SW3 =  114	
+SW4 =  115	
+SW5 =  116	
+SW6 =  117	
+SW7 =  118	
+SW8 =  119	
+SW9 =  120	
+SW10 =  121	
+SW11 =  122	
+SW12 =  123	
+SW13 =  124	
+SW14 =  125	
+SW15 =  126	
+SW16 =  127	
+SW17 =  128	
+SW18 =  129	
+SW19 =  130	
+SW20 =  131	
+SW21 =  132	
+SW22 =  133	
+SW23 =  134	
+SW24 =  135	
+SW25 =  136	
+SW26 =  137	
+SW27 =  138	
+SW28 =  139	
+SW29 =  140	
+SW30 =  141	
+SW31 =  142	
+SBBASE =  182	
+SBPICK =  182	
+SBBUT1 =  183	
+SBBUT2 =  184	
+SBBUT3 =  185	
+SBBUT4 =  186	
+SBBUT5 =  187	
+SBBUT6 =  188	
+SBBUT7 =  189	
+SBBUT8 =  190	
+AKEY =  11	
+BKEY =  36	
+CKEY =  28	
+DKEY =  18	
+EKEY =  17	
+FKEY =  19	
+GKEY =  26	
+HKEY =  27	
+IKEY =  40	
+JKEY =  34	
+KKEY =  35	
+LKEY =  42	
+MKEY =  44	
+NKEY =  37	
+OKEY =  41	
+PKEY =  48	
+QKEY =  10	
+RKEY =  24	
+SKEY =  12	
+TKEY =  25	
+UKEY =  33	
+VKEY =  29	
+WKEY =  16	
+XKEY =  21	
+YKEY =  32	
+ZKEY =  20	
+ZEROKEY =  46	
+ONEKEY =  8	
+TWOKEY =  14	
+THREEKEY = 15 
+FOURKEY =  22	
+FIVEKEY =  23	
+SIXKEY =  30	
+SEVENKEY = 31 
+EIGHTKEY = 38 
+NINEKEY =  39	
+BREAKKEY = 1 
+SETUPKEY = 2 
+CTRLKEY =  3	
+LEFTCTRLKEY = CTRLKEY 
+CAPSLOCKKEY = 4 
+RIGHTSHIFTKEY = 5 
+LEFTSHIFTKEY = 6 
+NOSCRLKEY = 13 
+ESCKEY =  7	
+TABKEY =  9	
+RETKEY =  51	
+SPACEKEY = 83 
+LINEFEEDKEY = 60 
+BACKSPACEKEY = 61 
+DELKEY =  62	
+SEMICOLONKEY = 43 
+PERIODKEY = 52 
+COMMAKEY = 45 
+QUOTEKEY = 50 
+ACCENTGRAVEKEY = 55 
+MINUSKEY = 47 
+VIRGULEKEY = 53 
+BACKSLASHKEY = 57 
+EQUALKEY = 54 
+LEFTBRACKETKEY = 49 
+RIGHTBRACKETKEY = 56 
+LEFTARROWKEY = 73 
+DOWNARROWKEY = 74 
+RIGHTARROWKEY = 80 
+UPARROWKEY = 81 
+PAD0 =  59	
+PAD1 =  58	
+PAD2 =  64	
+PAD3 =  65	
+PAD4 =  63	
+PAD5 =  69	
+PAD6 =  70	
+PAD7 =  67	
+PAD8 =  68	
+PAD9 =  75	
+PADPF1 =  72	
+PADPF2 =  71	
+PADPF3 =  79	
+PADPF4 =  78	
+PADPERIOD = 66 
+PADMINUS = 76 
+PADCOMMA = 77 
+PADENTER = 82 
+LEFTALTKEY  = 143
+RIGHTALTKEY  = 144
+RIGHTCTRLKEY  = 145
+F1KEY  =  146
+F2KEY  =  147
+F3KEY  =  148
+F4KEY  =  149
+F5KEY  =  150
+F6KEY  =  151
+F7KEY  =  152
+F8KEY  =  153
+F9KEY  =  154
+F10KEY =  155
+F11KEY =  156
+F12KEY =  157
+PRINTSCREENKEY = 158
+SCROLLLOCKKEY = 159
+PAUSEKEY = 160
+INSERTKEY = 161
+HOMEKEY  = 162
+PAGEUPKEY  = 163
+ENDKEY =  164
+PAGEDOWNKEY = 165
+NUMLOCKKEY = 166
+PADVIRGULEKEY  = 167
+PADASTERKEY  = 168
+PADPLUSKEY  = 169
+SGIRESERVED = 256 
+DIAL0 =  257	
+DIAL1 =  258	
+DIAL2 =  259	
+DIAL3 =  260	
+DIAL4 =  261	
+DIAL5 =  262	
+DIAL6 =  263	
+DIAL7 =  264	
+DIAL8 =  265	
+MOUSEX =  266	
+MOUSEY =  267	
+LPENX =  268	
+LPENY =  269	
+BPADX =  270	
+BPADY =  271	
+CURSORX =  272	
+CURSORY =  273	
+GHOSTX =  274	
+GHOSTY =  275	
+SBTX =  276	
+SBTY  =  277	
+SBTZ =  278	
+SBRX =   279	
+SBRY =  280	
+SBRZ  =  281	
+SBPERIOD = 282 
+TIMER0 =  515	
+TIMER1 =  516	
+TIMER2 =  517	
+TIMER3 =  518	
+KEYBD =  513	
+RAWKEYBD = 514 
+VALMARK =  523	
+GERROR =  524	
+REDRAW =  528	
+WMSEND =  529	
+WMREPLY =  530	
+WMGFCLOSE = 531 
+WMTXCLOSE = 532 
+MODECHANGE = 533 
+INPUTCHANGE = 534 
+QFULL =  535	
+PIECECHANGE = 536 
+WINCLOSE = 537 
+QREADERROR = 538 
+WINFREEZE = 539 
+WINTHAW =  540	
+REDRAWICONIC = 541 
+WINQUIT =  542	
+DEPTHCHANGE = 543 
+KEYBDFNAMES = 544 
+KEYBDFSTRINGS = 545 
+WINSHUT =  546	
+INPUT0 =  1024	
+INPUT1 =  1025
+INPUT2 =  1026
+INPUT3 =  1027
+INPUT4 =  1028
+INPUT5 =  1029
+INPUT6 =  1030
+INPUT7 =  1032
+OUTPUT0 =  1033	
+OUTPUT1 =  1034
+OUTPUT2 =  1035
+OUTPUT3 =  1036
+OUTPUT4 =  1037
+OUTPUT5 =  1038
+OUTPUT6 =  1039
+OUTPUT7 =  1040
+MAXSGIDEVICE = 20000
+MENUBUTTON = RIGHTMOUSE 
diff --git a/Lib/irix5/GL.py b/Lib/irix5/GL.py
new file mode 100755
index 0000000..35487a7
--- /dev/null
+++ b/Lib/irix5/GL.py
@@ -0,0 +1,365 @@
+# Constants defined in <gl.h>
+
+#**************************************************************************
+#*									  *
+#* 		 Copyright (C) 1984, Silicon Graphics, Inc.		  *
+#*									  *
+#*  These coded instructions, statements, and computer programs  contain  *
+#*  unpublished  proprietary  information of Silicon Graphics, Inc., and  *
+#*  are protected by Federal copyright law.  They  may  not be disclosed  *
+#*  to  third  parties  or copied or duplicated in any form, in whole or  *
+#*  in part, without the prior written consent of Silicon Graphics, Inc.  *
+#*									  *
+#**************************************************************************
+
+# Graphics Libary constants
+
+# Booleans
+TRUE = 1
+FALSE = 0
+
+# maximum X and Y screen coordinates 
+XMAXSCREEN = 1279
+YMAXSCREEN = 1023
+XMAXMEDIUM = 1023		# max for medium res monitor 
+YMAXMEDIUM = 767
+XMAX170 = 645		# max for RS-170 
+YMAX170 = 484
+XMAXPAL = 779		# max for PAL 
+YMAXPAL = 574
+
+# various hardware/software limits 
+ATTRIBSTACKDEPTH = 10
+VPSTACKDEPTH = 8
+MATRIXSTACKDEPTH = 32
+NAMESTACKDEPTH = 1025
+STARTTAG = -2
+ENDTAG = -3
+CPOSX_INVALID = -(2*XMAXSCREEN)
+
+# names for colors in color map loaded by greset 
+BLACK = 0
+RED = 1
+GREEN = 2
+YELLOW = 3
+BLUE = 4
+MAGENTA = 5
+CYAN = 6
+WHITE = 7
+
+# popup colors 
+PUP_CLEAR = 0
+PUP_COLOR = 1
+PUP_BLACK = 2
+PUP_WHITE = 3
+
+# defines for drawmode 
+NORMALDRAW = 0
+PUPDRAW = 1
+OVERDRAW = 2
+UNDERDRAW = 3
+CURSORDRAW = 4
+
+# defines for defpattern 
+PATTERN_16 = 16
+PATTERN_32 = 32
+PATTERN_64 = 64
+
+PATTERN_16_SIZE = 16
+PATTERN_32_SIZE = 64
+PATTERN_64_SIZE = 256
+
+# defines for readsource 
+SRC_AUTO = 0
+SRC_FRONT = 1
+SRC_BACK = 2
+SRC_ZBUFFER = 3
+SRC_PUP = 4
+SRC_OVER = 5
+SRC_UNDER = 6
+SRC_FRAMEGRABBER = 7
+
+# defines for blendfunction 
+BF_ZERO = 0
+BF_ONE = 1
+BF_DC = 2
+BF_SC = 2
+BF_MDC = 3
+BF_MSC = 3
+BF_SA = 4
+BF_MSA = 5
+BF_DA = 6
+BF_MDA = 7
+
+# defines for zfunction 
+ZF_NEVER = 0
+ZF_LESS = 1
+ZF_EQUAL = 2
+ZF_LEQUAL = 3
+ZF_GREATER = 4
+ZF_NOTEQUAL = 5
+ZF_GEQUAL = 6
+ZF_ALWAYS = 7
+
+# defines for zsource 
+ZSRC_DEPTH = 0
+ZSRC_COLOR = 1
+
+# defines for pntsmooth 
+SMP_OFF = 0
+SMP_ON = 1
+
+# defines for linesmooth 
+SML_OFF = 0
+SML_ON = 1
+
+# defines for setpup 
+PUP_NONE = 0
+PUP_GREY = 1
+
+# defines for glcompat 
+GLC_OLDPOLYGON = 0
+GLC_ZRANGEMAP = 1
+
+# defines for curstype 
+C16X1 = 0
+C16X2 = 1
+C32X1 = 2
+C32X2 = 3
+CCROSS = 4
+
+# defines for shademodel 
+FLAT = 0
+GOURAUD = 1
+
+# defines for logicop 
+### LO_ZERO = 0x0
+### LO_AND = 0x1
+### LO_ANDR = 0x2
+### LO_SRC = 0x3
+### LO_ANDI = 0x4
+### LO_DST = 0x5
+### LO_XOR = 0x6
+### LO_OR = 0x7
+### LO_NOR = 0x8
+### LO_XNOR = 0x9
+### LO_NDST = 0xa
+### LO_ORR = 0xb
+### LO_NSRC = 0xc
+### LO_ORI = 0xd
+### LO_NAND = 0xe
+### LO_ONE = 0xf
+
+
+#
+# START defines for getgdesc 
+#
+
+GD_XPMAX = 0
+GD_YPMAX = 1
+GD_XMMAX = 2
+GD_YMMAX = 3
+GD_ZMIN = 4
+GD_ZMAX = 5
+GD_BITS_NORM_SNG_RED = 6
+GD_BITS_NORM_SNG_GREEN = 7
+GD_BITS_NORM_SNG_BLUE = 8
+GD_BITS_NORM_DBL_RED = 9
+GD_BITS_NORM_DBL_GREEN = 10
+GD_BITS_NORM_DBL_BLUE = 11
+GD_BITS_NORM_SNG_CMODE = 12
+GD_BITS_NORM_DBL_CMODE = 13
+GD_BITS_NORM_SNG_MMAP = 14
+GD_BITS_NORM_DBL_MMAP = 15
+GD_BITS_NORM_ZBUFFER = 16
+GD_BITS_OVER_SNG_CMODE = 17
+GD_BITS_UNDR_SNG_CMODE = 18
+GD_BITS_PUP_SNG_CMODE = 19
+GD_BITS_NORM_SNG_ALPHA = 21 
+GD_BITS_NORM_DBL_ALPHA = 22
+GD_BITS_CURSOR = 23
+GD_OVERUNDER_SHARED = 24
+GD_BLEND = 25
+GD_CIFRACT = 26
+GD_CROSSHAIR_CINDEX = 27
+GD_DITHER = 28
+GD_LINESMOOTH_CMODE = 30
+GD_LINESMOOTH_RGB = 31
+GD_LOGICOP = 33
+GD_NSCRNS = 35
+GD_NURBS_ORDER = 36
+GD_NBLINKS = 37
+GD_NVERTEX_POLY = 39
+GD_PATSIZE_64 = 40
+GD_PNTSMOOTH_CMODE = 41
+GD_PNTSMOOTH_RGB = 42
+GD_PUP_TO_OVERUNDER = 43
+GD_READSOURCE = 44
+GD_READSOURCE_ZBUFFER = 48
+GD_STEREO = 50
+GD_SUBPIXEL_LINE = 51
+GD_SUBPIXEL_PNT = 52
+GD_SUBPIXEL_POLY = 53
+GD_TRIMCURVE_ORDER = 54
+GD_WSYS = 55
+GD_ZDRAW_GEOM = 57
+GD_ZDRAW_PIXELS = 58
+GD_SCRNTYPE = 61
+GD_TEXTPORT = 62
+GD_NMMAPS = 63
+GD_FRAMEGRABBER = 64
+GD_TIMERHZ = 66
+GD_DBBOX = 67
+GD_AFUNCTION = 68
+GD_ALPHA_OVERUNDER = 69
+GD_BITS_ACBUF = 70
+GD_BITS_ACBUF_HW = 71
+GD_BITS_STENCIL = 72
+GD_CLIPPLANES = 73
+GD_FOGVERTEX = 74
+GD_LIGHTING_TWOSIDE = 76
+GD_POLYMODE = 77
+GD_POLYSMOOTH = 78
+GD_SCRBOX = 79
+GD_TEXTURE = 80
+
+# return value for inquiries when there is no limit
+GD_NOLIMIT = 2
+
+# return values for GD_WSYS
+GD_WSYS_NONE = 0
+GD_WSYS_4S = 1
+
+# return values for GD_SCRNTYPE
+GD_SCRNTYPE_WM = 0
+GD_SCRNTYPE_NOWM = 1
+
+# 
+# END defines for getgdesc 
+#
+
+
+# 
+# START NURBS interface definitions 
+#
+
+# NURBS Rendering Properties 
+N_PIXEL_TOLERANCE = 1
+N_CULLING = 2
+N_DISPLAY = 3
+N_ERRORCHECKING = 4
+N_SUBDIVISIONS = 5
+N_S_STEPS = 6
+N_T_STEPS = 7
+N_TILES = 8
+
+N_SHADED = 1.0 	
+
+# ---------------------------------------------------------------------------
+# FLAGS FOR NURBS SURFACES AND CURVES 			
+# 
+# Bit: 9876 5432 1 0 
+#     |tttt|nnnn|f|r| :    r - 1 bit = 1 if rational coordinate exists
+# 	               :    f - 1 bit = 1 if rational coordinate is before rest 
+# 	               :              = 0 if rational coordinate is after rest 
+# 	 	       : nnnn - 4 bits for number of coordinates
+# 		       : tttt - 4 bits for type of data (color, position, etc.)
+# 
+# NURBS data type
+# N_T_ST	 	0	 parametric space data
+# N_T_XYZ		1	 model space data
+# 
+# rational or non-rational data and position in memory 
+# N_NONRATIONAL	0	 non-rational data
+# N_RATAFTER		1	 rational data with rat coord after rest
+# N_RATBEFORE		3	 rational data with rat coord before rest
+# 
+# N_MKFLAG(a,b,c) ((a<<6) | (b<<2) | c)
+# 	
+# ---------------------------------------------------------------------------
+# 
+N_ST = 0x8	# N_MKFLAG( N_T_ST, 2, N_NONRATIONAL ) 
+N_STW = 0xd	# N_MKFLAG( N_T_ST, 3, N_RATAFTER ) 
+N_WST = 0xf	# N_MKFLAG( N_T_ST, 3, N_RATBEFORE ) 
+N_XYZ = 0x4c	# N_MKFLAG( N_T_XYZ, 3, N_NONRATIONAL ) 
+N_XYZW = 0x51	# N_MKFLAG( N_T_XYZ, 4, N_RATAFTER ) 
+N_WXYZ = 0x53	# N_MKFLAG( N_T_XYZ, 4, N_RATBEFORE ) 
+
+# 
+# END NURBS interface definitions 
+# 
+
+
+# 
+# START lighting model defines 
+# 
+
+LMNULL = 0.0
+
+# MATRIX modes	
+MSINGLE = 0
+MPROJECTION = 1
+MVIEWING = 2
+
+# LIGHT constants 
+MAXLIGHTS = 8
+MAXRESTRICTIONS = 4
+
+# MATERIAL properties 
+DEFMATERIAL = 0
+EMISSION = 1
+AMBIENT = 2
+DIFFUSE = 3
+SPECULAR = 4
+SHININESS = 5
+COLORINDEXES = 6
+ALPHA = 7
+
+# LIGHT properties 
+DEFLIGHT = 100
+LCOLOR = 101
+POSITION = 102
+
+# LIGHTINGMODEL properties 
+DEFLMODEL = 200
+LOCALVIEWER = 201
+ATTENUATION = 202
+
+# TARGET constants 
+MATERIAL = 1000
+LIGHT0 = 1100
+LIGHT1 = 1101
+LIGHT2 = 1102
+LIGHT3 = 1103
+LIGHT4 = 1104
+LIGHT5 = 1105
+LIGHT6 = 1106
+LIGHT7 = 1107
+LMODEL = 1200
+
+# lmcolor modes 
+LMC_COLOR = 0
+LMC_EMISSION = 1
+LMC_AMBIENT = 2
+LMC_DIFFUSE = 3
+LMC_SPECULAR = 4
+LMC_AD = 5
+LMC_NULL = 6
+
+# 
+# END lighting model defines 
+# 
+
+
+# 
+# START distributed graphics library defines 
+# 
+
+DGLSINK = 0	# sink connection	
+DGLLOCAL = 1	# local connection	
+DGLTSOCKET = 2	# tcp socket connection
+DGL4DDN = 3	# 4DDN (DECnet)	
+
+# 
+# END distributed graphics library defines 
+# 
diff --git a/Lib/irix5/auds.py b/Lib/irix5/auds.py
new file mode 100755
index 0000000..549c0a7
--- /dev/null
+++ b/Lib/irix5/auds.py
@@ -0,0 +1,106 @@
+import audio
+
+RATE = 8192
+
+# Initialize the audio stuff
+audio.setrate(3)
+audio.setoutgain(100)	# for speaker
+
+play = audio.write
+
+def samp(n):
+	savegain = audio.getoutgain()
+	try:
+		audio.setoutgain(0)
+		x = raw_input('Hit Enter to sample ' + `n` + ' seconds: ')
+		return audio.read(n*RATE)
+	finally:
+		audio.setoutgain(savegain)
+
+def echo(s, delay, gain):
+	return s[:delay] + audio.add(s[delay:], audio.amplify(s, gain, gain))
+
+def save(s, file):
+	f = open(file, 'w')
+	f.write(s)
+
+def load(file):
+	return loadfp(open(file, 'r'))
+
+def loadfp(fp):
+	s = ''
+	while 1:
+		buf = fp.read(16*1024)
+		if not buf: break
+		s = s + buf
+	return s
+
+def unbias(s):
+	if not s: return s
+	a = audio.chr2num(s)
+	sum = 0
+	for i in a: sum = sum + i
+	bias = (sum + len(a)/2) / len(a)
+	print 'Bias value:', bias
+	if bias:
+		for i in range(len(a)):
+			a[i] = a[i] - bias
+		s = audio.num2chr(a)
+	return s
+
+# Stretch by a/b.
+# Think of this as converting the sampling rate from a samples/sec
+# to b samples/sec.  Or, if the input is a bytes long, the output
+# will be b bytes long.
+#
+def stretch(s, a, b):
+	y = audio.chr2num(s)
+	m = len(y)
+	out = []
+	n = m * b / a
+	# i, j will walk through y and out (step 1)
+	# ib, ja are i*b, j*a and are kept as close together as possible
+	i, ib = 0, 0
+	j, ja = 0, 0
+	for j in range(n):
+		ja = ja+a
+		while ib < ja:
+			i = i+1
+			ib = ib+b
+		if i >= m:
+			break
+		if ib = ja:
+			out.append(y[i])
+		else:
+			out.append((y[i]*(ja-(ib-b)) + y[i-1]*(ib-ja)) / b)
+	return audio.num2chr(out)
+
+def sinus(freq): # return a 1-second sine wave
+	from math import sin, pi
+	factor = 2.0*pi*float(freq)/float(RATE)
+	list = range(RATE)
+	for i in list:
+		list[i] = int(sin(float(i) * factor) * 127.0)
+	return audio.num2chr(list)
+
+def softclip(s):
+	if '\177' not in s and '\200' not in s:
+		return s
+	num = audio.chr2num(s)
+	extremes = (-128, 127)
+	for i in range(1, len(num)-1):
+		if num[i] in extremes:
+			num[i] = (num[i-1] + num[i+1]) / 2
+	return audio.num2chr(num)
+
+def demo():
+	gday = load('gday')[1000:6000]
+	save(gday, 'gday0')
+	gg = [gday]
+	for i in range(1, 10):
+		for g in gg: play(g)
+		g = stretch(gday, 10, 10-i)
+		save(g, 'gday' + `i`)
+		gg.append(g)
+	while 1:
+		for g in gg: play(g)
diff --git a/Lib/irix5/panel.py b/Lib/irix5/panel.py
new file mode 100755
index 0000000..eb11508
--- /dev/null
+++ b/Lib/irix5/panel.py
@@ -0,0 +1,281 @@
+# Module 'panel'
+#
+# Support for the Panel library.
+# Uses built-in module 'pnl'.
+# Applciations should use 'panel.function' instead of 'pnl.function';
+# most 'pnl' functions are transparently exported by 'panel',
+# but dopanel() is overridden and you have to use this version
+# if you want to use callbacks.
+
+
+import pnl
+
+
+debug = 0
+
+
+# Test if an object is a list.
+#
+def is_list(x):
+	return type(x) = type([])
+
+
+# Reverse a list.
+#
+def reverse(list):
+	res = []
+	for item in list:
+		res.insert(0, item)
+	return res
+
+
+# Get an attribute of a list, which may itself be another list.
+# Don't use 'prop' for name.
+#
+def getattrlist(list, name):
+	for item in list:
+		if item and is_list(item) and item[0] = name:
+			return item[1:]
+	return []
+
+
+# Get a property of a list, which may itself be another list.
+#
+def getproplist(list, name):
+	for item in list:
+		if item and is_list(item) and item[0] = 'prop':
+			if len(item) > 1 and item[1] = name:
+				return item[2:]
+	return []
+
+
+# Test if an actuator description contains the property 'end-of-group'
+#
+def is_endgroup(list):
+	x = getproplist(list, 'end-of-group')
+	return (x and x[0] = '#t')
+
+
+# Neatly display an actuator definition given as S-expression
+# the prefix string is printed before each line.
+#
+def show_actuator(prefix, a):
+	for item in a:
+		if not is_list(item):
+			print prefix, item
+		elif item and item[0] = 'al':
+			print prefix, 'Subactuator list:'
+			for a in item[1:]:
+				show_actuator(prefix + '    ', a)
+		elif len(item) = 2:
+			print prefix, item[0], '=>', item[1]
+		elif len(item) = 3 and item[0] = 'prop':
+			print prefix, 'Prop', item[1], '=>',
+			print item[2]
+		else:
+			print prefix, '?', item
+
+
+# Neatly display a panel.
+#
+def show_panel(prefix, p):
+	for item in p:
+		if not is_list(item):
+			print prefix, item
+		elif item and item[0] = 'al':
+			print prefix, 'Actuator list:'
+			for a in item[1:]:
+				show_actuator(prefix + '    ', a)
+		elif len(item) = 2:
+			print prefix, item[0], '=>', item[1]
+		elif len(item) = 3 and item[0] = 'prop':
+			print prefix, 'Prop', item[1], '=>',
+			print item[2]
+		else:
+			print prefix, '?', item
+
+
+# Exception raised by build_actuator or build_panel.
+#
+panel_error = 'panel error'
+
+
+# Dummy callback used to initialize the callbacks.
+#
+def dummy_callback(arg):
+	pass
+
+
+# Assign attributes to members of the target.
+# Attribute names in exclist are ignored.
+# The member name is the attribute name prefixed with the prefix.
+#
+def assign_members(target, attrlist, exclist, prefix):
+	for item in attrlist:
+		if is_list(item) and len(item) = 2 and item[0] not in exclist:
+			name, value = item[0], item[1]
+			ok = 1
+			if value[0] in '-0123456789':
+				value = eval(value)
+			elif value[0] = '"':
+				value = value[1:-1]
+			elif value = 'move-then-resize':
+				# Strange default set by Panel Editor...
+				ok = 0
+			else:
+				print 'unknown value', value, 'for', name
+				ok = 0
+			if ok:
+				lhs = 'target.' + prefix + name
+				stmt = lhs + '=' + `value`
+				if debug: print 'exec', stmt
+				try:
+					exec(stmt + '\n')
+				except KeyboardInterrupt: # Don't catch this!
+					raise KeyboardInterrupt
+				except:
+					print 'assign failed:', stmt
+
+
+# Build a real actuator from an actuator descriptior.
+# Return a pair (actuator, name).
+#
+def build_actuator(descr):
+	namelist = getattrlist(descr, 'name')
+	if namelist:
+		# Assume it is a string
+		actuatorname = namelist[0][1:-1]
+	else:
+		actuatorname = ''
+	type = descr[0]
+	if type[:4] = 'pnl_': type = type[4:]
+	act = pnl.mkact(type)
+	act.downfunc = act.activefunc = act.upfunc = dummy_callback
+	#
+	assign_members(act, descr[1:], ('al', 'data', 'name'), '')
+	#
+	# Treat actuator-specific data
+	#
+	datalist = getattrlist(descr, 'data')
+	prefix = ''
+	if type[-4:] = 'puck':
+		prefix = 'puck_'
+	elif type = 'mouse':
+		prefix = 'mouse_'
+	assign_members(act, datalist, (), prefix)
+	#
+	return act, actuatorname
+
+
+# Build all sub-actuators and add them to the super-actuator.
+# The super-actuator must already have been added to the panel.
+# Sub-actuators with defined names are added as members to the panel
+# so they can be referenced as p.name.
+#
+# Note: I have no idea how panel.endgroup() works when applied
+# to a sub-actuator.
+#
+def build_subactuators(panel, super_act, al):
+	#
+	# This is nearly the same loop as below in build_panel(),
+	# except a call is made to addsubact() instead of addact().
+	#
+	for a in al:
+		act, name = build_actuator(a)
+		act.addsubact(super_act)
+		if name:
+			stmt = 'panel.' + name + ' = act'
+			if debug: print 'exec', stmt
+			exec(stmt + '\n')
+		if is_endgroup(a):
+			panel.endgroup()
+		sub_al = getattrlist(a, 'al')
+		if sub_al:
+			build_subactuators(panel, act, sub_al)
+	#
+	# Fix the actuator to which whe just added subactuators.
+	# This can't hurt (I hope) and is needed for the scroll actuator.
+	#
+	super_act.fixact()
+
+
+# Build a real panel from a panel definition.
+# Return a panel object p, where for each named actuator a, p.name is a
+# reference to a.
+#
+def build_panel(descr):
+	#
+	# Sanity check
+	#
+	if (not descr) or descr[0] <> 'panel':
+		raise panel_error, 'panel description must start with "panel"'
+	#
+	if debug: show_panel('', descr)
+	#
+	# Create an empty panel
+	#
+	panel = pnl.mkpanel()
+	#
+	# Assign panel attributes
+	#
+	assign_members(panel, descr[1:], ('al'), '')
+	#
+	# Look for actuator list
+	#
+	al = getattrlist(descr, 'al')
+	#
+	# The order in which actuators are created is important
+	# because of the endgroup() operator.
+	# Unfortunately the Panel Editor outputs the actuator list
+	# in reverse order, so we reverse it here.
+	#
+	al = reverse(al)
+	#
+	for a in al:
+		act, name = build_actuator(a)
+		act.addact(panel)
+		if name:
+			stmt = 'panel.' + name + ' = act'
+			exec(stmt + '\n')
+		if is_endgroup(a):
+			panel.endgroup()
+		sub_al = getattrlist(a, 'al')
+		if sub_al:
+			build_subactuators(panel, act, sub_al)
+	#
+	return panel
+
+
+# Wrapper around pnl.dopanel() which calls call-back functions.
+#
+def my_dopanel():
+	# Extract only the first 4 elements to allow for future expansion
+	a, down, active, up = pnl.dopanel()[:4]
+	if down:
+		down.downfunc(down)
+	if active:
+		active.activefunc(active)
+	if up:
+		up.upfunc(up)
+	return a
+
+
+# Create one or more panels from a description file (S-expressions)
+# generated by the Panel Editor.
+# 
+def defpanellist(file):
+	import parser
+	descrlist = parser.parse_file(open(file, 'r'))
+	panellist = []
+	for descr in descrlist:
+		panellist.append(build_panel(descr))
+	return panellist
+
+
+# Import everything from built-in method pnl, so the user can always
+# use panel.foo() instead of pnl.foo().
+# This gives *no* performance penalty once this module is imported.
+#
+from pnl import *			# for export
+
+dopanel = my_dopanel			# override pnl.dopanel
diff --git a/Lib/irix5/panelparser.py b/Lib/irix5/panelparser.py
new file mode 100755
index 0000000..9c9ee02
--- /dev/null
+++ b/Lib/irix5/panelparser.py
@@ -0,0 +1,128 @@
+# Module 'parser'
+#
+# Parse S-expressions output by the Panel Editor
+# (which is written in Scheme so it can't help writing S-expressions).
+#
+# See notes at end of file.
+
+
+whitespace = ' \t\n'
+operators = '()\''
+separators = operators + whitespace + ';' + '"'
+
+
+# Tokenize a string.
+# Return a list of tokens (strings).
+#
+def tokenize_string(s):
+	tokens = []
+	while s:
+		c = s[:1]
+		if c in whitespace:
+			s = s[1:]
+		elif c = ';':
+			s = ''
+		elif c = '"':
+			n = len(s)
+			i = 1
+			while i < n:
+				c = s[i]
+				i = i+1
+				if c = '"': break
+				if c = '\\': i = i+1
+			tokens.append(s[:i])
+			s = s[i:]
+		elif c in operators:
+			tokens.append(c)
+			s = s[1:]
+		else:
+			n = len(s)
+			i = 1
+			while i < n:
+				if s[i] in separators: break
+				i = i+1
+			tokens.append(s[:i])
+			s = s[i:]
+	return tokens
+
+
+# Tokenize a whole file (given as file object, not as file name).
+# Return a list of tokens (strings).
+#
+def tokenize_file(fp):
+	tokens = []
+	while 1:
+		line = fp.readline()
+		if not line: break
+		tokens = tokens + tokenize_string(line)
+	return tokens
+
+
+# Exception raised by parse_exr.
+#
+syntax_error = 'syntax error'
+
+
+# Parse an S-expression.
+# Input is a list of tokens as returned by tokenize_*().
+# Return a pair (expr, tokens)
+# where expr is a list representing the s-expression,
+# and tokens contains the remaining tokens.
+# May raise syntax_error.
+#
+def parse_expr(tokens):
+	if (not tokens) or tokens[0] <> '(':
+		raise syntax_error, 'expected "("'
+	tokens = tokens[1:]
+	expr = []
+	while 1:
+		if not tokens:
+			raise syntax_error, 'missing ")"'
+		if tokens[0] = ')':
+			return expr, tokens[1:]
+		elif tokens[0] = '(':
+			subexpr, tokens = parse_expr(tokens)
+			expr.append(subexpr)
+		else:
+			expr.append(tokens[0])
+			tokens = tokens[1:]
+
+
+# Parse a file (given as file object, not as file name).
+# Return a list of parsed S-expressions found at the top level.
+#
+def parse_file(fp):
+	tokens = tokenize_file(fp)
+	exprlist = []
+	while tokens:
+		expr, tokens = parse_expr(tokens)
+		exprlist.append(expr)
+	return exprlist
+
+
+# EXAMPLE:
+#
+# The input
+#	'(hip (hop hur-ray))'
+#
+# passed to tokenize_string() returns the token list
+#	['(', 'hip', '(', 'hop', 'hur-ray', ')', ')']
+#
+# When this is passed to parse_expr() it returns the expression
+#	['hip', ['hop', 'hur-ray']]
+# plus an empty token list (because there are no tokens left.
+#
+# When a file containing the example is passed to parse_file() it returns
+# a list whose only element is the output of parse_expr() above:
+#	[['hip', ['hop', 'hur-ray']]]
+
+
+# TOKENIZING:
+#
+# Comments start with semicolon (;) and continue till the end of the line.
+#
+# Tokens are separated by whitespace, except the following characters
+# always form a separate token (outside strings):
+#	( ) '
+# Strings are enclosed in double quotes (") and backslash (\) is used
+# as escape character in strings.