home *** CD-ROM | disk | FTP | other *** search
-
- - THE OUTLAW TRIAD DEMO-SERIES -
-
- ───────────────────────────────■ PART VIII ■──────────────────────────────────
-
- Written by : Vulture/OT
- Code in : Pascal/Asm
- Topic : Samples
-
- ──────────────────────────────■ Introduction ■────────────────────────────────
-
- Welcome to the Outlaw Triad demo-series! In these series we will be talking
- about programming demo-effects in either pascal or assembler. Theory behind
- the effects shall be discussed while a full sourcecode is also provided.
- This time we will talk about something completely different, sound-coding!
- We will create a basic .RAW sound player using the soundblaster (sorry, no
- GUS). Sound will be played using DMA transfers, just like modplayers. Enjoy!
-
- ─────────────────────────────────■ Theory ■───────────────────────────────────
-
- Notes: In this example I will use the most basic soundcard and that's
- the soundblaster 2.0 (is 1.0 still alive?). Reason for this is that
- I'm the lucky owner of such a device :-) and have absolutely no money
- to buy a better card.
-
- Allright! Let's start by talking about some soundblaster basics such
- as port adresses and writing and reading from the card. Fundamental
- things like that cannot be done any other way like described below.
-
- The soundblaster can be programmed through 4 ports. These are:
-
- Reset 2x6h
- Read data 2xAh
- Write command/data output 2xCh
- Write buffer status input 2xCh
- Data available 2xEh
-
- The x is 1 for base address 210h, 2 for 220h ∙∙∙ and 6 for 260h.
-
- Now, before you can program the DSP, you will have to reset it. The reset
- takes around a 100 micro-seconds so if the reset takes longer than that,
- you can assume an error has occured and abort the program.
-
- - Write a 1 to the RESET port (2x6h)
- - Wait for 3 micro-seconds
- - Write a 0 to the RESET port (2x6h)
- - Read the byte from the DATA AVAILABLE (2xEh) port until bit 7 = 1
- - Poll for a ready byte (AAh) from the READ DATA port (2xAh)
-
- Ok, now the soundblaster can be programmed. Here's how to write a byte
- to the card:
-
- - Read the WRITE BUFFER STATUS port until bit 7 equals 0
- - Write value to the WRITE COMMAND/DATA port
-
- And how to read from it:
-
- - Read the DATA AVAILABLE port (2xEh) until bit 7 = 1
- - Read data from the READ DATA port (2xAh)
-
- There! It should be fairly easy to write some procedures which perform
- these tasks. Take a look at the source to see how it can be done.
-
- Ok, you understand the basics? Good! Now we are going to play a sample
- (raw sound data) through the soundblaster. We need to setup the DMA and
- soundblaster ports for output of raw data. The procedure for playing raw
- data using DMA transfers is as follows:
-
- 1. Load sound data into memory
- 2. Setup the DMA chip for the tranfer
- 3. Set the DSP TIME_CONSTANT to the sampling rate
- 4. Write DMA_TYPE_VALUE value to the DSP
- 5. Write DATA_LENGTH to the DSP (2 bytes, LSB first) where
- DATA_LENGTH = number of bytes to send + 1
-
- Let's take a look at this in detail.
-
- 1. Simple. Just get the required memory using the GETMEM procedure and
- load the data using a BLOCKREAD command.
-
- 2. We will be using DMA channel 1 for transfering the sound data to the
- soundblaster. Here's how to setup the DMA chip for the transfer:
-
- - Calculate 20 bit address of the memory buffer you are using
- like this: Segment * 16 + Offset
- - Send value 05h to port 0Ah (mask off channel 1)
- - Send value 00h to port 0Ch (clear the internal DMA flip/flop)
- - Send value 49h to port 0Bh (playback) or
- 45h to port 0Bh (recording)
- - Write LSB (bits 0 - 7) of the 20 bit memory address to port 02h
- - Write MSB (bits 8 - 15) of the 20 bit memory address to port 02h
- - Write Page (bits 16 -> 19) of the 20 bit memory address to port 83h
- - Send LSB of DATA_LENGTH to port 03h
- - Send MSB of DATA_LENGTH to port 03h
- - Send value 01h to port 0Ah (enable channel 1)
-
- I've used assembler to do most of this stuff but it isn't very hard to
- convert it to Pascal or whatever language you use.
-
- 3. Setting the frequency of the sample must be done by calculating a certain
- time constant with: 256 - 1000000 / frequency. After you've done this,
- you write the value to the soundblaster by writing value 40h to the card
- immidiately followed by the time constant.
- Note: for frequencies between 22 Khz - 44Khz, use the following formula:
- (MSB of) 65536 - (256000000 / frequency)
-
- 4. Various types of DMA transfers are provided. Here's a list which shows
- them.
-
- ┌───────────────┬────────────────────┬───────────────────────┐
- │DMA_TYPE_VALUE │ Description │ Frequency Range │
- ├───────────────┼────────────────────┼───────────────────────┤
- │ 14h │ 8 bit │ 4KHz -> 23 KHz │
- │ 74h │ 4 bit ADPCM │ 4KHz -> 12 KHz │
- │ 75h │ 4 bit ADPCM with │ 4KHz -> 12 KHz │
- │ │ reference byte │ │
- │ 76h │ 2.6 bit ADPCM │ 4KHz -> 13 KHz │
- │ 77h │ 2.6 bit ADPCM with │ 4KHz -> 13 KHz │
- │ │ reference byte │ │
- │ 16h │ 2 bit ADPCM │ 4KHz -> 11 KHz │
- │ 17h │ 2 bit ADPCM with │ 4KHz -> 11 KHz │
- │ │ reference byte │ │
- └───────────────┴────────────────────┴───────────────────────┘
-
- In this example we are transfering 8 bit samples so we simply write
- 14h to the soundblaster.
-
- 5. Just write the low byte of the data length followed by the high
- byte and you're done. Remember to increase the data length by 1.
-
- Well, that's all there is to it. Immediately after you've done these steps,
- output will start and the sample will be played. It isn't very hard to code
- just because you simply follow a set of basic rules. However, it's important
- to implement this stuff correctly because these routines are the basics of
- soundblaster programming.
-
- Ok, this is all for now. Happy coding!
-
- -Vulture/Outlaw Triad-
-
- ───────────────────────────────■ Distro Sites ■───────────────────────────────
-
- Call our distrobution sites! All our releases are available at:
-
- BlueNose World HQ +31 (0)345-619401
- The Force Distrosite +31 (0)36-5346967 More distros wanted!
- Bugs'R'Us Distrosite +31 (0)252-686092 (preferably outside
- ShockWave South African HQ +27 (011)888-6345 of the Netherlands)
- Society HQ United States HQ +1 (518)465-6721
-
- Also check the major FTP sites for Outlaw Triad productions.
-
- ──────────────────────────────────■ Contact ■─────────────────────────────────
-
- Want to contact Outlaw Triad for some reason? You can reach us at our
- distrosites in Holland. Or if you have e-mail access, mail us:
-
- Vulture (coder/pr) comma400@tem.nhl.nl
-
- Our internet homepage:
-
- http://www.tem.nhl.nl/~comma400/vulture.html
-
- These internet adresses should be valid at least till june 1997.
-
- ──────────────────────────────────────────────────────────────────────────────
-
- Quote: 43.3% of statistics are useless