home *** CD-ROM | disk | FTP | other *** search
/ Audio 4.94 - Over 11,000 Files / audio-11000.iso / msdos / tools / acmpaper / acmpaper.txt next >
Encoding:
Text File  |  1994-03-16  |  24.0 KB  |  531 lines

  1.  
  2.      SOFTWARE-BASED DIGITAL AUDIO ON PCs
  3.           by David T. Chappell
  4.  
  5. Copyright (C) 1991  ACM.  All Rights Reserved
  6.  
  7. This article originally appeared in the Proceedings of the 1991 ACM 
  8. Computer Science Conference, March 1991.  Copying is by permission of 
  9. the Association for Computing Machinery.
  10.  
  11.  
  12. ABSTRACT
  13.  
  14.     Digital audio techniques were investigated with special 
  15. concentration on computer applications.  Experimentation showed that 
  16. the Intel 8253 programmable interval timer, found on all IBM PCs and 
  17. compatibles, can output digitized sound.  The relationship between 
  18. pulse amplitude modulation and pulse width modulation signals was 
  19. found to be significant to this process.    Feeding digitized sound 
  20. data to the chip results in an inherent transfer from pulse amplitude 
  21. modulation to pulse width modulation encoding.  The relationship in 
  22. signal modulation allows IBM PCs to play digitized sound without the 
  23. use of extra hardware.
  24.  
  25. Biography:
  26.     David T. Chappell is a senior in the computer science curriculum 
  27. at North Carolina State University.  In addition, he participates in 
  28. the co-op program and works for IBM.  His interests are in the areas 
  29. of advanced input/output, technological research, and scientific 
  30. applications.  David plans to attend graduate school in computer 
  31. science or a related field.
  32.  
  33.  
  34. INTRODUCTION
  35.     In the past few years, the computer industry has been slowly 
  36. gaining interest in computer-generated speech and sound.  In this 
  37. area, the Apple Macintosh and Commodore Amiga provide built-in sound 
  38. control hardware so that their machines can play digitized recordings 
  39. with little effort from the programmer.  IBM, however, has chosen not 
  40. to include advanced sound capabilities in its line of personal 
  41. computers.  The market has shown that relatively few people will buy 
  42. speech or sound add-ons from either IBM or third parties.  Until such 
  43. hardware is standardized, sound software will encounter great 
  44. difficulty in gaining acceptance.  It is in this regard, however, that 
  45. mathematics, engineering, and software can come to the rescue:  it is 
  46. possible for a PC to play good quality sound without additional 
  47. hardware.
  48.  
  49.  
  50. BACKGROUND
  51.     Sound is transmitted through the air as a longitudinal wave.  The 
  52. source of the sound compresses the air in one area and this air 
  53. compresses the air next to it while it moves back to its original 
  54. position.  As each air molecule is displaced from and returns to its 
  55. normal position, the wave travels through the air.  The movement that 
  56. results from these repeated compressions and rarefactions is called 
  57. the propagation of the wave [1].
  58.     It is often convenient to use graphs to visually represent sound.  
  59. Most pictures show a graph of the wave amplitude vs. time, where the 
  60. amplitude represents the displacement of molecules from their original 
  61. positions.  [See figure 1.]  Regular waves, such as sine waves, need 
  62. not be depicted in such a manner but can be represented by just a 
  63. frequency (or wavelength), amplitude (volume), and duration.  For 
  64. example, the SOUND statement in Microsoft BASIC has the parameters of 
  65. frequency and duration.  (Volume is not needed because the PC has only 
  66. one volume.)  The irregular waves that make up most of the sound we 
  67. hear are more complicated and need to be represented by giving 
  68. specific details on the amplitude at each point in time.
  69.     Digitized sounds consist of the numerical values for the 
  70. amplitude at regular time intervals.  [See figure 2.]  Along with the 
  71. amplitude data, the number of samples taken per second must be 
  72. recorded.  By reproducing the amplitude changes at the original rate, 
  73. the sound can then be played back.  Much research has gone into 
  74. digitized sound, and it is now possible to produce digitized 
  75. recordings which, to the human ear, are identical to their analog 
  76. counterparts.
  77.     Once recorded, digital signals can be stored in a variety of 
  78. formats.  Pulse amplitude modulation (PAM) is the standard method of 
  79. representing analog data.  [See figure 3.]  In this method, each piece 
  80. of data represents the amplitude at one instant in time.  Pulse width 
  81. modulation (PWM) treats each piece of information as the duration of a 
  82. pulse which starts at a regular frequency.  [See figure 4.]  In pulse 
  83. code modulation (PCM),  each bit records whether the amplitude is high 
  84. or low at each point in time.  [See figure 5.]  PCM is the most common 
  85. method in digital audio recording and is used by audio compact discs 
  86. to achieve high-quality sound.  Pulse position modulation (PPM) 
  87. records the position of a brief pulse by giving the time duration 
  88. before the pulse occurs [1].  [See figure 6.]
  89.     Several brands of personal computers include dedicated sound 
  90. chips.  The Macintosh, Amiga, Atari ST, and other computers can easily 
  91. produce high-quality sound by using dedicated hardware.  On these 
  92. computers, many programs are enhanced by the addition of sound and 
  93. speech.  Likewise, IBM and a multitude of other companies have 
  94. produced boards that allow PCs to record and playback digitized sound.  
  95. A lack of standards, however, limits the use of these PC boards, and 
  96. few programs use them.
  97.     Over the years, several attempts have been made to play digitized 
  98. sound on PCs without special hardware.  A number of these have 
  99. appeared in the public domain, but few are coherent.  Commercial 
  100. software has had greater success, but most of these programs produce 
  101. rough speech.  With the recent rise of interest in audio and video, a 
  102. few developers have even produced good, intelligible speech and 
  103. sounds.  The work presented here rivals that of the best public domain 
  104. and commercial successes.
  105.  
  106.  
  107. MATERIALS AND METHODS
  108.     The Intel 8253 programmable interval timer, found on all IBM PCs 
  109. and compatibles, is a flexible counter chip.  It has three 16-bit 
  110. channels.  Each channel produces an output signal based on an input 
  111. signal and a programmed 16-bit number.  The chip's six modes can 
  112. produce varying types of output.  Table 1 summarizes the six modes.  
  113. Refer to Rosch [2] or Sargent and Shoemaker [3] for more details.
  114.  
  115.  
  116.  
  117.  
  118. Table 1:  Intel 8253 Operating Modes
  119.  
  120.             0 - interrupt on terminal count
  121.             1 - programmable one-shot
  122.             2 - rate generator
  123.             3 - square-wave generator
  124.             4 - software-triggered strobe
  125.             5 - hardware-triggered strobe
  126.  
  127.     On IBM PCs, the 8253's first channel increments the time-of-day 
  128. clock, the second channel refreshes the DRAMs, and the third channel 
  129. sends sound to the speaker.  The timer/counter of AT class machines is 
  130. based on the Intel 8254-2 chip and is functionally equivalent to the 
  131. 8253.  The PS/2 line has an 8253 that is used the same way, except 
  132. that a separate chip refreshes memory, and the second channel of the 
  133. 8253 is used for diagnostics or is unassigned [2].
  134.     The 8253 can only give two possible output states:  0 and 1.  
  135. Possibly because of this limitation, the chip's use for sound 
  136. production in PCs has typically been limited to being a square-wave 
  137. generator (mode 2).  When functioning as a square-wave generator, the 
  138. chip's output is equal to its input frequency (1.193 MHz on PCs) 
  139. divided by a 16-bit number that is input to the chip by the 
  140. programmer.  The output is a square wave whose high and low periods 
  141. are equal.  The range of the chip falls between 18.2 hertz and 1.193 
  142. megahertz [4].  Mode 2 is used by channel 0 for the time-of-day clock 
  143. and by channel 2 to produce the beeps and whistles found in many DOS 
  144. programs.
  145.     Despite the two-state output limitation, the 8253 can also play 
  146. digitized sound.  When put in mode 0, the output defaults to high.  
  147. When a 16-bit number is then programmed into the chip, the output goes 
  148. low for the duration of the specified number of input pulses, after 
  149. which the output returns high.  The net result is that the output wave 
  150. is in the form of PWM.  [See figure 7.]
  151.     To program PWM sound output on the 8253, several steps must be 
  152. taken.  First, the programmable peripheral interface (PPI) chip must 
  153. be initialized to the desired mode.  Then the 8253 must be initialized 
  154. and data sent to it.  Table 2 summarizes chip ports.
  155.  
  156. Table 2:  Chip I/O Port Addresses
  157.  
  158.             Port                Dec    Hex
  159.             PPI chip            97    61
  160.             8253 Channel 0        64    40
  161.             8253 Channel 1        65    41
  162.             8253 Channel 2        66    42
  163.             8253 Control Word    67    43
  164.  
  165.     To allow the 8253 to control the speaker, the PPI must be set 
  166. correctly.  The two lowest bits of port 97 must be turned on.  The 
  167. other bits of this port should remain untouched since they are used 
  168. for other purposes [4].
  169.     Port 67 is the control word register which initializes the 8253.  
  170. Each counter is initialized by sending this port one control byte.  
  171. Table 3 shows the meanings of the bits in the control word.
  172.  
  173. Table 3:  Meaning of 8253 Control Word Register
  174.  
  175.         bit 0    = 0, count in binary
  176.                 = 1, count in Binary Coded Decimal
  177.         bits 1-3    = mode number (0 to 5 in binary)
  178.         bits 4,5    = 00, latch current count for reading
  179.                 = 01, read/load low byte
  180.                 = 10, read/load high byte
  181.                 = 11, read/load low byte, then high byte
  182.         bits 6,7    = counter number (0 to 2 in binary)    
  183.  
  184.     (Bit 0 is least significant; 7 is most significant)
  185.  
  186. When reading both bytes of the 16-bit value, a latch command prevents 
  187. the count from changing between reading the high byte and the low 
  188. byte.  Latching is not needed when reading only a single byte.  For 
  189. example to set the chip to generate musical tones in mode 3 the 
  190. control word is 182 (B6 hex).  For digital audio via mode 0, use 176 
  191. (B0 hex).
  192.     Ports 64, 65, and 66 are used to read and write to timers 0, 1, 
  193. and 2 respectively.  Data sent to these ports becomes the 16-bit 
  194. number used to affect output.  If only one byte is sent, the other 
  195. byte retains its previous value.
  196.     Listing 1 shows the general algorithm for 8-bit digital audio 
  197. output with the 8253.  8-bit quality is achieved by leaving the high 
  198. byte constant and sending data only to the low byte.
  199.  
  200.  
  201. Listing 1:  Algorithm for Digital Audio
  202.  
  203.             Load Digital Audio Data;
  204.             value = InPort(61h);    -- Initialize PPI
  205.             OutPort(61h, value OR 3);
  206.             OutPort(43h,B0h);        -- Initialize 8253
  207.             OutPort(41h,00h);
  208.             OutPort(41h,00h);
  209.             OutPort(43h,90h);
  210.             loop until end of data    -- Play sound
  211.                 OutPort(41h,Data);
  212.                 Wait Until Data Passes;
  213.             OutPort(43h,B6h);        -- Restore 8253
  214.  
  215.     Listing 2 gives an example program written for Turbo C.  In the 
  216. sample program, the user must specify whether the input data is 
  217. signed.  Some forms of digital audio storage, including PCM, 
  218. inherently use unsigned variables.  Other forms, including PWM and 
  219. PAM, can be stored as signed variables, and notably the Amiga 
  220. microcomputer stores digitized sound data on a scale from -128 to 127.  
  221. Since the playback method using the 8253 must use unsigned data, a 
  222. scaling factor of 128 must be added to all signed data [5].
  223.  
  224.  
  225. Listing 2:  Turbo C Code for Digital Audio
  226.  
  227. #include <conio.h>
  228. #include <dos.h>
  229. #include <io.h>
  230. #include <stdio.h>
  231. #include <stdlib.h>
  232.  
  233. /*    SOUND.C
  234.  
  235.     Author:   David Chappell
  236.     Version:  1.46d
  237.     Date:     24 June 1990
  238.     Method:   8253 PWM method
  239. */
  240.  
  241. FILE *soundfile;    /* input data file */
  242. unsigned long size;    /* size of input file */
  243. int wait,      /* time to wait between sending samples out */
  244. unsigned char  offset,  /* change signed samples to unsigned */
  245.                 vol1, vol2;  /* adjusts range of data */
  246.  
  247. void error(char message[])
  248. /* Purpose:  handles errors */
  249.     {
  250.     fprintf(stderr,"\nERROR:  %s\n",message);
  251.     exit(-1);
  252.     }
  253.  
  254. void playfile(void)
  255. /* Purpose:  loads file and plays digitized sound */
  256.     {
  257.     int pause;
  258.     unsigned int count, temp;
  259.     unsigned char min, max, data;
  260.     char *inputbuffer;
  261.  
  262.     if ((inputbuffer=(char*) calloc(size,sizeof(char))) == NULL)
  263.         error("Not enough memory to load file");
  264.     fread(inputbuffer, size, 1, soundfile);
  265.     /* scale data */
  266.     min=255;  max=0;
  267.      for (count = 0; count < size; count++) {
  268.         data = *(inputbuffer + count)+offset;
  269.         if (data<min)
  270.             min=data;
  271.         if (data>max)
  272.             max=data;
  273.         }
  274.     vol1 = 64;
  275.     vol2 = max-min+1;      /* scale from 0 to 64 */
  276.     offset -= min;         /* move lowest point to zero */
  277.     disable();        /* disable interrupts */
  278.     for (count = 0; count < size; count++) {
  279.         data = *(inputbuffer + count) + offset;
  280.         temp = data * vol1 / vol2;
  281.         data = temp + 1;
  282.         output(66,data);
  283.         for (pause = 0; pause < wait; pause++);
  284.         }
  285.     enable();            /* enable interrupts */
  286.     }
  287.  
  288. void startspeaker(void)
  289. /* Purpose:  intitialize speaker for output */
  290.     {
  291.     outp(97,inp(97) | 3);    /* set PPI */
  292.     outp(67,176);        /* send initial data to timer */
  293.     outp(66,00);
  294.     outp(66,00);
  295.     outp(67,144);        /* prepare timer chip to receive data */
  296.     }
  297.  
  298. void openfile(void)
  299. /* Purpose:  gets information from user and opens input file */
  300.     {
  301.     char choice;        /* key hit by user */
  302.     
  303.     clrscr();            /* clear screen */
  304.     puts("What file do you want to hear?");
  305.     if ((soundfile = fopen(gets(NULL),"rb")) == NULL)
  306.        error("Unable to open sound file");
  307.     fseek(soundfile,0,SEEK_SET);
  308.     size = filelength(fileno(soundfile));
  309.     printf("\nFile size = %lu bytes\n\n",size);
  310.     printf("What delay time do you want in FOR counter? ");
  311.     scanf("%d",&wait);
  312.     printf("Is the data signed? ");
  313.     choice=getche();
  314.     if ((choice=='Y') || (choice=='y'))
  315.        offset=128;
  316.     }
  317.  
  318. void stopsound(void)
  319. /* Purpose:  resets speaker to stop sound */
  320.     {
  321.     outp(67,182);        /* restore timer to mode 3 */
  322.     fclose(soundfile);
  323.     }
  324.  
  325. void main(void)
  326.    {
  327.    openfile();
  328.    startspeaker();
  329.    playfile();
  330.    stopsound();
  331.    }
  332.  
  333. RESULTS
  334.     The method described thus far has several limitations when put 
  335. into practice on PCs.  The 16-bit quality of the chip reduces to 7 
  336. bits at most sample rates.  Also, a background tone is produced along 
  337. with the desired sound because of the use of PWM.  Both of these 
  338. difficulties arise from timing problems.
  339.     The method described thus far has the capability of yielding 
  340. high-quality 16-bit sound.  The code given, however, can only produce 
  341. approximately 7-bit sound.  Although the 8253 has the ability to play 
  342. 16-bit data, the timing limitations of the PC restrict the length of 
  343. each pulse.  In order to produce sound at the rate of about 8-13 kHz, 
  344. only about six or seven bits of data are processed before the next 
  345. piece of data must begin output.  At a slower sample rate of about 4-7 
  346. kHz, seven to eight bits of accuracy can be achieved.  A higher input 
  347. frequency would resolve this difficulty; however, the frequency can 
  348. not be changed in PCs but could be modified in other applications of 
  349. the 8253.
  350.     The maximum data size (volume) possible can be calculated 
  351. mathematically.  The 8253 input rate divided by the output sample rate 
  352. yields the number of time periods that pass before the next sample 
  353. begins play:
  354.  
  355.     Maximum value = 1.193 MHz / sample rate
  356. For example, the maximum volume for an 8 kHz sample is 147.  The 1.193 
  357. MHz input frequency that feeds the 8253 limits the chips sound 
  358. capabilities.
  359.     As an annoying side-effect, the provided algorithm creates a 
  360. background tone.  Due to the nature of PWM, at the beginning of each 
  361. piece of data, the output changes state as it goes from high to low.  
  362. [See figure 7.]  This periodic oscillation produces a pitch equal to 
  363. the frequency at which the sound is played.  For example, an 8 kHz 
  364. sample will produce a background tone of 8 kHz.  The resulting tone 
  365. overlays the digitized sound output.  The human ear can not detect 
  366. pitches beyond 22 kHz, but most people can not hear a pitch of 18 kHz 
  367. or greater frequency.  Thus, any sample of this frequency will not 
  368. produce an audible background tone.  If a given sample is not of high 
  369. enough frequency, this problem can be alleviated by playing each piece 
  370. of data multiple times in rapid succession so that the background tone 
  371. is of such a high frequency that it is inaudible.  For example, by 
  372. playing each datum of a 9.5 kHz sample twice, the resulting pitch will 
  373. be 19 kHz.  The first problem, however, becomes dramatic when a 
  374. moderate-speed sample is sent repeatedly:  in order to maintain the 
  375. original sampling rate, the 8253 has time to process fewer and fewer 
  376. bits for each datum [5].
  377.  
  378.  
  379. DISCUSSION
  380.     Several other methods were attempted before the above method was 
  381. discovered.  Although all of these other methods yield sound of 
  382. varying quality, most do not produce recognizable results, and none 
  383. match the PWM method.  With some work, any of the following techniques 
  384. might be able to give better output.
  385.     One idea is to look at each piece of data, compare it to the 
  386. midpoint, and set the speaker bit appropriately.  For example, the 
  387. midpoint for 8-bit data is alternately 0 or 128 (depending on whether 
  388. a sign bit is used), so any values above 128 (or 0) could be set as 1 
  389. and all other values set as 0.  Modifying bit 3 of I/O port 97 (61 
  390. hex) changes the state of the speaker's position.  This idea could 
  391. never yield very good results, however, as it gives only 1-bit 
  392. accuracy.
  393.     A heretofore ineffective method is based on PCM encoding.  Each 
  394. individual bit of input directly determines the state of the speaker.  
  395. Manipulating bit 3 of port 97 yields the two states.
  396.     Another possibility is to use mode 3 of the 8253 to play a pitch 
  397. which is either directly or inversely proportional to the data.  
  398. Although this method yields audible sound, the results are not as good 
  399. as those of the main PWM method.
  400.     A final idea is to use the 8253 based on pulse position 
  401. modulation.  Mode 4 of the 8253 should produce PPM output, but trials 
  402. so far have given negative results.
  403.  
  404.     The given algorithm can be further improved by allowing the 
  405. program to automatically determine the speed of the computer.  In the 
  406. current method, a delay time must be entered manually.  By 
  407. incrementing a counter while watching the system clock, a ratio of 
  408. instructions to time can be calculated.  Under PC-DOS and OS/2, the 
  409. 18.2 Hz frequency of the system clock limits the accuracy of this 
  410. idea, however, unless channel 0 of the 8253 is used to change the 
  411. system timer.
  412.     A better timing method would be to use an algorithm that does not 
  413. rely on loops for timing delays.  Under PC-DOS, interrupts can be 
  414. modified so that data is played after each clock tick.  By increasing 
  415. the frequency of clock ticks and changing the timer interrupt, the 
  416. computer can output each piece of data at a regular interval.  Other 
  417. operating systems, however, do not allow such interrupt modification.
  418.  
  419.     The development of this digital audio playback method has several 
  420. implications and possibilities.  A variety of applications, from games 
  421. to word processors, can use voice and sound.  On multi-tasking 
  422. operating systems, sounds can easily be played in the background.  
  423. Other computers could use the same ideas for audio output.  When 
  424. combined with extra hardware, this method can form a complete audio 
  425. I/O system.  When a PC acts as a terminal, this procedure will allow 
  426. mainframes and minicomputers to play digitized sound.
  427.     Speech interaction is currently put to several uses.  For 
  428. example, IBM's SpeechViewer helps deaf children and adults improve 
  429. pronunciation.  In addition, several programs use spoken words to help 
  430. people learn to read and write.  For blind users, IBM's ScreenReader 
  431. program can vocally relate the text that appears on the monitor.  
  432. There are numerous instances of disabled users benefitting from 
  433. talking computers.
  434.     In addition, many musicians use computers to produce and mix 
  435. sounds.  Computers can now produce rich tones that rival musical 
  436. instruments.
  437.     By reducing the need for extra hardware, digitized sound can 
  438. easily be added to other programs.  As an obvious example, games can 
  439. use sound for both special effects and general entertainment.  Useful 
  440. applications, from word processors to spreadsheets, can speak to help 
  441. visually impaired users.  Inexperienced users would find a computer to 
  442. be much friendlier if it could speak to them.  A user interface that 
  443. includes speech can help bring computers to the level of interaction 
  444. that humans use with each other.  Thus, nearly all types of software 
  445. can benefit from the addition of speech and sound capabilities [5].
  446.     When running under PC-DOS, only one program can be run at a time.  
  447. The only way to allow the computer to play recorded sounds while 
  448. continuing other work is to modify interrupts, as mentioned above.  
  449. Under multi-tasking operating systems, such as OS/2 and Unix, the 8253 
  450. could be continually fed data in a background task while the main 
  451. program continues.  Playing sound in the background gives more 
  452. flexibility.  For example, a communications package could verbally 
  453. report an error while continuing to receive data, or a graphical demo 
  454. could play music in the background while displaying picture on the 
  455. monitor.
  456.     The data storage method used here is compatible with many others.  
  457. A huge number of digitized samples are available from Macintosh, 
  458. Amiga, and Atari ST computers.  Several PC expansion boards also use 
  459. the same storage method.  Data recorded on any of this hardware can be 
  460. played back on an ordinary PC.  Whether the original sample is in the 
  461. form of PAM, PCM, or PWM, it can play through the PC speaker.  
  462. Furthermore, by purchasing an available expansion board or building 
  463. one, sound recording is possible on PCs.
  464.     As the use of speech technology grows, speech can be added to 
  465. larger machines.  According to IBM's long-range plan, all host 
  466. computers will eventually be accessed via a PS/2 running OS/2.  
  467. Although mainframes and minicomputers do not typically have sound 
  468. capabilities, they could be use the PS/2's speaker for speech output.  
  469. Thus, by using PCs as terminals, the full range of computers can 
  470. handle digital audio.
  471.     The algorithm presented here can be used in settings other than 
  472. in a PC.  The same method could be used in any computer with an 8253 
  473. chip, and a hardware expansion using the 8253 can be added to other 
  474. computers.  More importantly, any hardware configuration capable of 
  475. producing output similar to PWM can, when connected to a speaker, 
  476. produce digitized sound.  Similarly, any system able to produce pulses 
  477. similar to any digital recording method can output digitized sound.  
  478. As a result, hardware with only two output states can play sound, and 
  479. a digital-to-analog converter, such as found in the Amiga, is not 
  480. required.
  481.  
  482.  
  483. CONCLUSION
  484.     Over the past several decades, engineers have searched for ways 
  485. to make computers both talk and play high-quality music.  One solution 
  486. to both problems, digitization of sound using pulse modulation, 
  487. requires little processing time and is thus appropriate for 
  488. microcomputers.  Although previous usage of digitized sound has been 
  489. limited to computers with specialized hardware, it is possible for a 
  490. standard PC to play good quality sounds without extra hardware.  As 
  491. the computer world strides deeper into multimedia and other sound-
  492. based applications despite a lack of hardware standards for sound 
  493. output on PCs, this method may prove to be invaluable in bringing 
  494. sound to the masses.  With minimal effort, any program can add a new 
  495. dimension with speech, music, and sound effects.
  496.  
  497.  
  498. REFERENCES
  499.  
  500.  
  501. [1] Pohlmann, Ken C.  Principles of Digital Audio.  H. W. Sams, 
  502. Indianapolis (1985).
  503.  
  504. [3] Rosch, Winn L.  The Winn Rosch Hardware Bible.  Simon & Schuster, 
  505. New York (1988).
  506.  
  507. [5] Sargent, Murray, III and Richard L. Shoemaker.  The IBM Personal 
  508. Computer from the Inside Out.  Addison-Wesley (1984).
  509.  
  510. [2] Norton, Peter.  The Peter Norton Programmer's Guide to the IBM PC.  
  511. 1st ed.  Microsoft, Redmond, WA (1985).
  512.  
  513. [6] Chappell, David T.  "Achieving Inexpensive Digital Audio on PCs 
  514. for Educational Purposes".  Proceedings of the Southeastern Small 
  515. College Computing Conference.  (1990).
  516.  
  517.  
  518.  
  519. Permission to copy without fee all or part of this material is granted 
  520. provided that the copies are not made or distributed for direct 
  521. commercial advantage, the ACM copyright notice and the title of the 
  522. publication and its date appear, and notice is given that copying is 
  523. by permission of the Association for Computing Machinery.  To copy 
  524. otherwise, or to republish, requires a fee and/or specific permission.
  525.  
  526. 1
  527.  
  528. 17
  529.  
  530.  
  531.