home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Stars of Shareware: Programmierung
/
SOURCE.mdf
/
programm
/
msdos
/
basic
/
pow_10
/
manual.exe
(
.txt
)
< prev
next >
Encoding:
Amiga
Atari
Commodore
DOS
FM Towns/JPY
Macintosh
Macintosh JP
Macintosh to JP
NeXTSTEP
RISC OS/Acorn
Shift JIS
UTF-8
Wrap
David's Readme Compiler Executable
|
1994-01-19
|
114.3 KB
|
1,788 lines
>V r"
H9D0}
G H I O P Q v
YYG;>
LLVW3
0RY_^
<Ar ,@
_^_^]
YYF;v
;Dz~
'2(2(((
(2(?(!(U
H I K M P Q0.
DF_^]
YY9|,uK
;D@ui
;DDu2
H9D0~
9D<| u
Y;D2v
H9D0u
YY_^]
YY_^]
Y;D2wK
t0Nt-
!r.RP
!r$RP
u/SQR
[C[J[O[
Zx[V[Z[^[
\D\d\
[[XP3
Turbo C++ - Copyright 1990 Borland Intl.
Null pointer assignment
Divide error
Abnormal program termination
%-50.50s
Print this section
Ready printer and press a key (ESC to cancel)
---- Printing ----
PgUp/Dn:
=print
Line %d of %d
Readme error: no attached data.
Topics
MMMODE
; < = > ? @ A B C D T U V W X Y Z [ \ ]
G O w u R S s t
EAEIIOOUUYIOU
Insert paper in printer then press
a key (<ESC> cancels print)
Printer error
The printer on LPT%d: is
confused
out of paper
off line
Correct then press a key
or hit <ESC> to cancel print
Insert Paper
<ESC>
key pressed:
Please confirm cancel/quit
Accept this data?
Insufficient disk space
There is not enough space on the target
disk to receive the file(s): please replace
the disk with another formatted disk, then
press any key to retry, or <ESC> to cancel
!!!!!
@@@@@@@@@@@@@@@
@@@@@@@
@@@@@@
@@@@
(E(E(E
(null)
Data file generated by RCOM.
POW! Toolbox for PB3 - Online Manual
Introduction
Disclaimer
About the POW! Toolbox
Installation and Setup
Quick Reference
About .POW Files
Direct Vs. DMA Routines
POW! Reference
(1) SBARRAYLOAD
(2) SBARRAYPLAY
(3) SBARRAYRECORD
(4) SBARRAYSAVE
(5) SBBEEP
(6) SBCHECKDMA
(7) SBCMFCANCEL
(8) SBCMFCHECK
(9) SBCMFDETECT
(10) SBCMFPAUSE
(11) SBCMFPLAY
(12) SBCMFRESUME
(13) SBCMFSETSPEED
(14) SBCMFTRANSPOSE
(15) SBCPUSPEED
(16) SBDELAY
(17) SBDETECT
(18) SBFMCLEAR
(19) SBFMDETECT
(20) SBFMNOTE
(21) SBFMPARMS
(22) SBFMPLAY
(23) SBFMPORTOUT
(24) SBFMRHYTHM
(25) SBFMSETPORTS
(26) SBFMSOUND
(27) SBGETPOW$
(28) SBMIDIREAD
(29) SBMIDIWRITE
(30) SBPASYSTEM
(31) SBPLAYDMA
(32) SBPLAYFILE
(33) SBPLAYPOW
(34) SBPLAYSTRING
(35) SBPOWNAME$
(36) SBPRESETMIXER
(37) SBPSETMIXER
(38) SBRESET
(39) SBSAMPLE$
(40) SBSAMPLEBYTE
(41) SBSAY
(42) SBSETBASE
(43) SBSETDMA
(44) SBSETINT
(45) SBSPEECH
File Format Info
VOC File Format
CMF File Format
POW File Format
License Info
Registration Form
POW! Bibliography
The Soundblaster Toolbox for PowerBASIC 3.0
Version 1.0
(C) Copyright 1994 by Tim Gerchmez
All Rights Reserved
Soundblaster is a trademark of Creative Labs
Adlib/Ad Lib is a trademark of Ad Lib, Inc.
The Creative Voice (.VOC) file format is
(C) Copyright Creative Labs.
The RIFF WAVE (.WAV) file format is (C) Copyright
Microsoft Corp.
The POW! Digital Library (.POW) file format is (C)
Copyright Tim Gerchmez.
All other software and/or hardware mentioned is
copyrighted and/or trademarked by its respective
companies.
This manual is compiled with Dave's Readme Compiler
(RCOM.EXE), a freeware text menuing utility which
is (C) Copyright 1991 by Dave Harris.
POW! Toolbox Disclaimer of Liability
------------------------------------
This software is provided as-is. There are no
warranties made, either expressed or implied. You
accept all responsibility for the consequences of
the use or misuse of the routines in this software
package.
THE AUTHOR OF THIS SOFTWARE DISCLAIMS ALL WARRANTIES
RELATED TO THIS SOFTWARE, WHETHER EXPRESSED OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
NEITHER THE AUTHOR OF THIS SOFTWARE (TIM GERCHMEZ) NOR
ANYONE ELSE WHO HAS BEEN INVOLVED IN THE CREATION,
PRODUCTION OR DELIVERY OF THIS SOFTWARE SHALL BE LIABLE
FOR ANY INDIRECT, CONSEQUENTIAL, OR INCIDENTAL DAMAGES
ARISING FROM THE USE OR INABILITY TO USE THIS SOFTWARE,
EVEN IF THEY HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES OR CLAIMS. IN NO EVENT SHALL THE AUTHOR OF THIS
SOFTWARE'S LIABILITY FOR ANY DAMAGES EVER EXCEED THE PRICE
PAID FOR THE LICENSE TO USE THE SOFTWARE, REGARDLESS OF THE
FORM OF CLAIM. THE PERSON(S) USING THE SOFTWARE BEARS ALL
RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE.
Some states do not allow the exclusion of the limit of
liability for consequential or incidental damages, so the
above limitation may not apply to you. This agreement
shall be governed by the laws of the State of Washington
and shall inure to the benefit of the author of POW! and
any successors, administrators, heirs and assigns. Any
action or proceeding brought by either party against the
other arising out of or related to this agreement shall be
brought only in a STATE or FEDERAL COURT of competent
jurisdiction located in King County, Washington. The
parties hereby consent to in personam jurisdiction of
said courts.
Use of the POW! Library and/or related routines in any
way constitutes implied agreement with the above conditions
and disclaimer.
What is the POW! Toolbox?
-------------------------
POW! is a complete
Soundblaster programming library
PowerBASIC 3.0. It is written in
100% 80x86 assembly
language
for blazing speed, power and small code size
(only about 12K will be added to your programs using
any or all of the routines in this library). POW!
supports the 8-bit
Soundblaster card
and all other
closely compatible sound cards, and it also supports
Adlib card and compatibles
Good Soundblaster programming libraries are difficult
to find, and especially scarce in the BASIC programming
arena. To my knowledge, there's only one other
Soundblaster library available for PowerBASIC at
this time.
POW! was designed to fill a need
, one
that is very evident from reading the online E-mail
programming echos. Programmers have been looking for
a Soundblaster library for BASIC that's fast, powerful,
and not dependent on external drivers.
POW! fulfills
those needs
, and more. Unlike most other Soundblaster
libraries,
POW! gives you a choice
- it has both built-
in internal Soundblaster digitized I/O and FM Music
routines, and ALSO
supports the more popular drivers
like SBFMDRV.COM for .CMF files and SBTALKER for speech
synthesis. With POW! you can create files that are
completely stand-alone, or files that require a driver
be present or loaded before running a program - it's
entirely your choice
, and will depend on what you want
to do with the SB card. One of POW!'s more innovative
features lets you play FM-synthesized music which is
COMPLETELY independent of files - you create a string
in the PB IDE similar in syntax to the PLAY statement
in BASIC - but the music plays on the Soundblaster
rather than over the PC Speaker.
POW! also supports several
file formats
, including
.VOC, .WAV and its own proprietary format, .POW. A
.POW file lets you store up to 32 digitized samples in
one file, and play back any of the 32 with a simple
command. POW!
includes several utilities
like MAKEPOW,
which lets you create a .POW file from .VOC and .WAV
files, and MAKERAW, which converts .VOC and .WAV files
to raw sample information. At this time, POW! supports
only 8-bit and low-speed (<22222 Hz.) samples, although
support for additional sample formats may be added in a
future version.
In addition to playing back digitized samples, FM music,
sound effects and synthesized speech, POW! also allows you
RECORD digital samples
in a PowerBASIC program and then
manipulate the recorded sample data. You can record a sample
and then play it back immediately, or save it to a file for
later playback. You can even
sample a single byte
from a
microphone hooked up to the Soundblaster card, and use the
sampled value to signal your program! With POW!, the
possibilities are limitless
. You'll find that with POW!'s
flexibility and your imagination, you'll be creating programs
that go beyond what you thought possible with BASIC and a
Soundblaster card. Your programs will
really stand out in
a crowd
and make people take notice!
Although POW! is a very flexible and powerful programming
library, you'll find that you need to acquire some knowledge
about the Soundblaster and how it works before you'll be able
to use all the routines effectively. Unfortunately, a complete
tutorial on the Soundblaster is beyond the scope of POW!'s
documentation, and would easily fill a large book. You will
pick up much information as you experiment with POW! routines,
but it's recommended that you also find a book and some public
domain text files on the Soundblaster that you can refer to as
you use some of the demos included with POW! Many of POW!'s
routines are easy to use, however, and by studying the included
demonstration PowerBASIC programs you'll learn how to add your
own music and digitized samples to your BASIC programs.
Bugs: In the first release of a library as technically complex
as POW!, it's possible that a few bugs may exist, or
maybe even more than a few. I depend on YOU for info.
regarding bugs in the routines, as I have a fairly
limited system setup and testing facilities. Bug fixes
are always free to registered users of POW!, and bug
fixes of the Shareware version will be released as soon
as is feasible. Unlike certain other major software
companies, it's the policy of this author to admit that
bugs in software do happen, and that at least a small
number of minor bugs will be unavoidable. Different
hardware setups may also experience problems, especially
with sound cards other than the genuine Soundblaster.
If you find a bug in POW!, I would really appreciate it
if you'd contact me at the address below so I can fix
it and release an updated version:
Tim Gerchmez
12648 S.E. 81st Pl.
Renton, WA 98056-9121
Thanks a million for your help!
Installing POW!
---------------
To install POW!, you should first create a subdirectory underneath
your main PowerBASIC 3.0 directory. You could call this \POW, or
anything you like. Copy all the files included in the POW! archive
or distribution disk to this directory. After you do this, copy
the following files to the directories you have specified in the
PowerBASIC IDE:
POW.PBL
(main POW! library) -
Copy to Link/Library directory
POW.INC
(Include file) -
Copy to Include directory
As long as PowerBASIC can find the correct files at compile time,
that's about all you need to worry about. When you run the
included demo files, you should do so from the main \POW directory
you created, as some of these demos access other files that were
included with POW!.
Adding POW! commands to your programs is very simple
. All you need
to do is include the following statements at the top of any BASIC
program that uses POW! routines:
$STRING 32
$LINK "POW.PBL"
$INCLUDE "POW.INC"
The $STRING 32 is not absolutely required, but is recommended for
most of the routines that utilize strings to hold Soundblaster
sample data (there are several in the POW! toolbox). 32K is not
a lot when it comes to digital samples (which can get very big),
but it will be sufficient for most of your needs.
The actual assembly language routines in POW! will not be included
in your program unless you use them (PB3.0+). The entire POW!
toolbox uses only one code segment, and adds about 12K to your
BASIC programs, no matter how often or how many routines you use
(of course, the code that calls the routines adds size to a BASIC
program too).
Please note: You
may compile and link
to standalone .EXE files
with the shareware version of POW! - this is
not restricted in any
. You may try POW! routines in your programs for a period of
60 days
, after which time you should register POW! or discontinue
using the routines. You
may not distribute
programs compiled with
the shareware version of POW!, as it is for evaluation purposes only.
Once you've registered POW!, you'll be able to do anything you want
with the programs you write that use POW! routines, including sell
them without further royalties or fees of any kind. Please see the
section in this manual regarding registration.
Version 1.0 Note:
The DMA (background) digital routines in this
version of POW! will not run in the IDE, and must
be run in a program as a standalone .EXE file.
I apologize for any inconvenience this may cause
you, but it was found that there was too much
potential for serious system conflicts and data
damage when the DMA routines were used within the
IDE environment. Although these problems can be
avoided through careful programming practices, I
cannot be responsible for the possibility of lawsuits
caused by lost data and damaged disks. Hopefully
I'll find a solution to this problem, and this
inconvenience will disappear by the next version
of POW!
The best way to go about learning POW! is to first load and run the
included
demonstration programs
. Each of these programs demonstrates
one or more routines included in the POW! toolbox. When you've looked
at all the demos, you might want to read through the main reference
to the routines in this manual, and print out any of the routines that
you feel you might use. Remember, just
$LINK "POW.PBL"
and
$INCLUDE
"POW.INC"
, and all the POW! routines will be immediately accessible
to your programs, just like the regular PowerBASIC statements are.
If you don't have a microphone for your Soundblaster card, this
might be the time to find an inexpensive one, so you can experiment
with POW!'s sampling capabilities. If you're interested in transposing
music for the
SBFMPLAY
statement, you might also be interested in
picking up several "easy-play" music books available for electronic
keyboards, which have the note names and chords written out for
easy identification. If you can read music, you should have no
problem transposing music for SBFMPLAY, once you learn the syntax
of the command.
POW! Toolbox Quick Reference
----------------------------
(1A) Digitized I/O routines (internal) -
String/File record/playback functions:
--------------------------------------
-----------------------------------------------
SBPLAYFILE
: Plays back a file containing raw sample data
(foreground/direct)
SBPLAYSTRING
: Plays back a string containing raw sample data
(foreground/direct)
SBPLAYDMA
: Plays back digitized information contained in a
string (background/DMA)
-----------------------------------------------
SBSAMPLE$
: Records a sample from the SB's Line/Mic Inputs
into a string (foreground/direct)
SBSAMPLEBYTE
: Records a single byte from the SB's Line/Mic
Inputs (foreground/direct)
-----------------------------------------------
SBPLAYPOW
: Plays back a sample from a special .POW file
format (background/DMA)
SBGETPOW$
: Retrieves a sample from a .POW library file
into a string
SBPOWNAME$
: Retrieves the name of a .POW file sample
-----------------------------------------------
(1B) Digitized I/O routines (internal) -
Array record/playback functions:
--------------------------------
----------------------------------------------
SBARRAYRECORD
: Records a sample from the SB's Line/Mic Inputs
into an integer array (background/DMA)
SBARRAYPLAY
: Plays a sample in an array (background/DMA)
SBARRAYSAVE
: Saves a sample contained in an array to disk
SBARRAYLOAD
: Loads a sample from disk into an array
-----------------------------------------------
(1C) Digitized I/O - related routines (internal):
--------------------------------------------
------------------------------------------------------
SBRESET
: Resets the SB card, preparing for digitized I/O
SBCHECKDMA
: Indicates whether a sample is currently being played
back or recorded in the background
SBSETBASE
: Sets the base port for the SB card (0220h Default)
SBSETDMA
: Sets the DMA to use with the SB card (1 Default)
SBSETINT
: Sets the interrupt to use with the SB card (7 Default)
------------------------------------------------------
(2) FM Music (Adlib-Compatible) and related routines (internal):
------------------------------------------------------------
----------------------------------------
SBFMNOTE
: Plays a note on the Soundblaster
SBFMSOUND
: Plays a sound on the Soundblaster
SBFMRHYTHM
: Plays a rhythm sound on the Soundblaster
SBFMPLAY
: Plays music contained in a string
----------------------------------------
SBFMCLEAR
: Clears the Soundblaster's FM Music Registers
SBFMPARMS
: Sets parameters for the FM Music Channels
SBFMPORTOUT
: Outputs directly to the FM Music Registers
SBFMSETPORTS
: Sets the FM Music Register addresses
SBFMDETECT
: Detects whether an FM Music-Capable (Adlib/SB)
card is present
-----------------------------------------
(3) .CMF FM Music Playback (driver):
--------------------------------
---------------------------------------------
SBCMFDETECT
: Checks if the SBFMDRV.COM driver is loaded
SBCMFPLAY
: Plays a .CMF file in the background (SBFMDRV.COM)
SBCMFTRANSPOSE
: Transpose the pitch of a .CMF file (SBFMDRV.COM)
SBCMFSETSPEED
: Changes speed of default CMF file playback (SBFMDRV.COM)
SBCMFCHECK
: Checks whether a .CMF file is still playing (SBFMDRV.COM)
SBCMFPAUSE
: Pauses playback of a .CMF file (SBFMDRV.COM)
SBCMFRESUME
: Resumes playback of a .CMF file (SBFMDRV.COM)
SBCMFCANCEL
: Cancels playback of a .CMF file (SBFMDRV.COM)
---------------------------------------------
(4) MIDI Routines (internal):
-------------------------
------------------------------------------------------
SBMIDIREAD
: Reads a byte from the MIDI port, or returns -1 if none
SBMIDIWRITE
: Writes a byte to the Soundblaster MIDI port
------------------------------------------------------
(5) Speech Synthesis Routines (driver):
-----------------------------------
----------------------------------------------------------
SBSAY
: Speaks a string through the SB Speech driver (SBTALKER)
SBSPEECH
: Checks to see if the SB Speech driver is loaded (SBTALKER)
----------------------------------------------------------
(6) General SB-Related Routines (internal):
---------------------------------------
---------------------------------------------------------
SBBEEP
: Sounds a beep through the Soundblaster's FM
Music Channel
SBCPUSPEED
: Returns CPU Speed in MHz (used by SB routines)
SBDELAY
: Delay specified number of milliseconds (used by SB
routines)
SBDETECT
: Detects whether a Soundblaster card is present
SBPASYSTEM
: Turns the SB card into a temporary "P.A. System"
---------------------------------------------------------
SBPRESETMIXER
: Resets the Soundblaster Pro card's mixer chip
(SOUNDBLASTER PRO ONLY)
SBPSETMIXER
: Sets the Soundblaster Pro's mixer chip settings
(SOUNDBLASTER PRO ONLY)
---------------------------------------------------------
The POW! toolbox has its own proprietary file format, called .POW. A
.POW file is a sort of .PBL for .VOC and .WAV files. You can store up
to 32 .VOC and/or .WAV files in a single .POW file, of different lengths,
recording speeds and compression types. Future versions of POW! may allow
for 64 or more samples in a .POW file, if demand warrants. You can play
back a sample in a .POW file with the command SBPLAYPOW - you simply
provide the filename and sample number. You can also retrieve a .POW
sample into a string with the SBGETPOW$ command. SBPLAYPOW plays samples
in the background - your program continues while the sample plays!
Included with the POW! package for PB3 is a special MAKEPOW utility that
lets you add .VOC and .WAV files to a .POW library. See MAKEPOW.EXE for
more information.
Note:
Since .POW files play in the background, they
can only be used within a standalone .EXE file, and not in the PB IDE
environment.
Two different methods of digital recording and playback are used
in POW! - the
direct method
, and the
DMA method
. Both of these are
discussed further in the documentation for the SBPLAYSTRING command.
In essence, the direct method records and plays back samples in the
foreground
, and does not allow compression, while the DMA method plays
them in the
background
, and allows compressed sound data as well as
uncompressed. SBPLAYSTRING and SBPLAYFILE use the direct method of
digital playback, while SBPLAYDMA and SBPLAYPOW (among others) use the
DMA method. SBSAMPLE$ uses the direct method in reverse, to record a
sample from the Soundblaster's input jacks, while SBARRAYRECORD uses the
DMA method in reverse (analog to digital rather than digital to analog).
Please read the documentation for SBPLAYSTRING to gain a better
understanding of both the direct and the DMA methods of sound
recording and playback.
If some of this seems confusing at this point, it will clear up as you
browse through the documentation for each command. It may take a bit of
experimentation, though, to decide which commands are appropriate in which
situations.
As of this release of POW!, the DMA background digital routines will only
run within a standalone .EXE file, and will not function in the PB IDE
environment. I apologize for any inconvenience this may cause, but was
implemented to protect your data from possible corruption. I was unable
to safely find a way to implement DMA background recording and playback
while developing within the IDE. This was not only a problem with POW!,
but was encountered when testing an interface to the Creative Labs .VOC
driver CT-VOICE.DRV as well. After many attempts at finding a solution
to this problem, I finally had to limit the DMA routines to standalone
.EXE files only.
================================================================================
sub sbarrayload(f$,ln%,sr%,ary%())
Loads a .VOC file into an array, which can then be played back
with SBARRAYPLAY. The .VOC should contain a data block as its
first block, and should be uncompressed. The SBARRAYSAVE command
saves an array as a .VOC file in this format, and a file saved with
this command can be loaded with SBARRAYLOAD. If compression is
detected in the specified .VOC file by this routine, the routine
will abort and the .VOC will not be loaded. See SBARRAYSAVE for
more information on the SBARRAY commands.
To play back a compressed .VOC file, you must first add it to a
.POW library with the MAKEPOW utility, or read a block from a .VOC
file directly and play it back with SBPLAYDMA. See SBPLAYPOW for
more information about .POW digital library files.
f$: Set to the filename to load the array from. This file should be
a .VOC file in the format specified above.
ln%: Returns the length of the .VOC file sample in ln%. You can
then use ln% as a parameter in SBARRAYPLAY to play back the
array sample in the background. If an error occurs and the
.VOC is not loaded, ln% will return 0.
sr%: Returns the sample rate of the .VOC file in sr%. You can then
use this value as a parameter in the SBARRAYPLAY command to play
back the sample contained in the array.
ary%(): Set to the first element of an integer array that you have
previously DIMmed to a large enough value to hold the entire
.VOC file sample. It's best to DIM the array to hold 32767
bytes (DIM 1:16384) if you're not sure of the size of the .VOC
file to be loaded.
Example: dim ary%(1:16384) '32K byte array
sbarrayload "sample.voc",ln%,sr%,ary%(1)
if ln%=0 then print "Error loading .VOC":stop
sbarrayplay ln%,sr%,ary%(1)
================================================================================
sub sbarrayplay(ln%,sr%,ary%())
NOTE: This routine will only function within a standalone .EXE
file, and will have no effect when run from a program within
the PowerBASIC IDE.
Plays back an array recorded with SBARRAYRECORD or loaded from
disk with SBARRAYLOAD. The sample plays in the background. You
can check when the sample is done playing with SBCHECKDMA (see the
SBCHECKDMA command).
ln%: Set to the length of the sample to be played back. This
should be the same length you used for SBARRAYRECORD or
retrieved from a file with SBARRAYLOAD.
sr%: Set to the sample rate for playback. This should be the
same rate used with SBARRAYRECORD or retrieved from a file
with SBARRAYLOAD.
ary%(): Set to the first element of an integer array holding
the sample data to be played back.
Example: sbarrayplay 32767,8000,ary%(1) 'Play back a 32K array
'at 8000 Hz.
================================================================================
sub sbarrayrecord(ln%,sr%,ary%())
NOTE: This routine will only function within a standalone .EXE
file, and will have no effect when run from a program within
the PowerBASIC IDE.
Records a sample from the Soundblaster's Microphone or Line
Inputs into an integer array in the background. This sample
can then be manipulated with the other SBARRAY commands.
Recording is done using ADC DMA techniques to record in the
background, while your program continues.
ln%: Set to length in bytes of sample to be taken (up
to 32767). You should DIM an integer array big
enough to hold the amount of data specified. Each
integer in the array can hold 2 bytes, so the formula
to use would be ln%\2. You can use SBCHECKDMA to detect
when the recording is done (see SBCHECKDMA).
sr%: Set to the sample rate in Hz. of the sample to be taken.
A typical sample rate would be 8000 Hz.
ary%(): Pass the first element of an integer array that you
DIMensioned to a large enough value to hold the
sample this routine will return. Caution: if you
don't DIM the array to a large enough value, memory
will be overwritten and corrupted.
Example: DIM ary%(1:16384) '32767 byte sample (16384*2)
sbarrayrecord 32767,8000,ary%(1) 'Record the sample -
about 4 sec. at 8000 Hz.
================================================================================
sub sbarraysave(f$,ln%,sr%,ary%())
Saves a sample contained in an array recorded with
SBARRAYRECORD as a 1-block .VOC file that can be loaded
with SBARRAYLOAD or added to a .POW library with MAKEPOW.
f$: Set to the filename to save the array to - should end with
the .VOC extension if you want to indicate it as a .VOC file.
This file will be saved in standard .VOC format as a single data
block with no compression. It can be converted to a .RAW file
with MAKERAW, loaded with SBARRAYLOAD, or added to a .POW library
with the MAKEPOW utility. If the specified file already exists,
IT WILL BE OVERWRITTEN, so be sure to check for it with the DIR$
command before using this routine if you think it might already
exist.
ln%: Set to the length of the sample to save. This should be the
same length value you used with SBARRAYRECORD. Each element of
an integer array is 2 bytes in length.
sr%: Set to the sample rate you recorded the sample at with
SBARRAYRECORD.
ary%(): Set to the first element of an integer array you used with
SBARRAYRECORD.
Example: DIM ary%(1:16384) '32767 byte sample (16384*2)
sbarrayrecord 32767,8000,ary%(1) 'Record the sample -
about 4 sec. at 8000 Hz.
sbarraysave "sample.voc",32767,8000,ary%(1) 'Save the sample
================================================================================
sub sbbeep
Plays a BEEP through the soundblaster. This is one of the "highest
level" routines in the POW! Toolbox, requiring no parameters at all.
Similar to the BEEP statement, but plays through the SB's speakers
rather than the PC speaker. You don't even have to detect if an SB
card is present, as SBBEEP does this for you, and plays a normal BEEP
through the PC speaker if not!
Example: sbbeep [or] call sbbeep
================================================================================
function sbcheckdma
NOTE: This routine will only function within a standalone .EXE
file, and will have no effect when run from a program within
the PowerBASIC IDE.
Works in conjunction with the DMA-related (background)
digital sound commands in POW! to tell you whether the
current sample is done recording or playing.
sbcheckdma: Returns 0 if sample is still recording/playing,
or -1 if sample is done recording/ playing or
no DMA command was ever called.
Example: print sbcheckdma
================================================================================
sub sbcmfcancel
Cancels (stops) playback of a .CMF file originally started with
SBCMFPLAY. You can then use SBCMFPLAY again to restart the song
from the beginning, if desired.
Example: call sbcmfcancel
================================================================================
function sbcmfcheck
Checks whether a .CMF file is still playing (SBFMDRV.COM),
and returns nonzero if yes, or zero if not. Use with
SBCMFPLAY to determine status of playing file.
Example: print sbcmfcheck
================================================================================
function sbcmfdetect
Detects whether the FM Music Driver (SBFMDRV.COM) for the
Soundblaster card is installed. Returns 0 if not, or IRQ
number (&h80-&hbf) if it is. You should use this before
calling any of the other SBCMF commands to determine whether
the driver was loaded.
Example: print sbcmfdetect
================================================================================
sub sbcmfpause
Pauses a currently playing .CMF song (that you started with
SBCMFPLAY). You can use SBCMFRESUME to continue playback.
Example: call sbcmfpause
================================================================================
sub sbcmfplay(f$,ary%(1))
Plays a .CMF file in the background, using the SBFMDRV.COM driver.
You should pass this routine a 64K integer array to hold the CMF
music data, and the CMF files you select should be less than 64K
in size. You do not have to check for the SBFMDRV.COM being installed
if you don't want to ; this routine does it automatically, and will
terminate if the driver is not installed. If a song is already playing
when this function is called, it will be ended and a new song started.
f$: Set to path\filename of .CMF file to play
ary%(1): Set to the first element of a 64K integer array
(see example below). Array can be shorter than 64K
if you're sure that the size of the CMF file is less
(you can open for binary access and use the LOF function
to determine the length of a file). If you forget to
DIMension the array, or DIM it to too small a size, memory
will be corrupted when the .CMF file loads.
Example: 'SBFMDRV.COM should already be loaded (can be loaded high using
'the DOS 5+ LH or LOADHIGH command.
DIM cmfary%(1:32767) '64K integer array to hold .CMF data
call sbcmfplay "test.cmf",cmfary%(1) 'Play the file
You can use SBCMFCHECK to determine whether the piece is still playing
or has finished (see SBCMFCHECK for details).
================================================================================
sub sbcmfresume
Resumes playback of a song after pausing it with the
SBCMFPAUSE command.
Example: call sbcmfresume
================================================================================
sub sbcmfsetspeed(s%)
Changes the SBFMDRV.COM driver clock rate. This rate is specified
in each .CMF file, and determines the speed the .CMF file will be
played back. Using a positive value for this function will increase
the default value read from a file and passed to the CMF driver by the
specified amount, and using a negative value will decrease the default.
This function can either be used with a CURRENTLY PLAYING .CMF file (to
slow it down or speed it up), or can be used before a file is played to
change the speed at which the next file will be played back. Using a
value of 0 will set the SBFMDRV.COM speed back to the default rates.
Example:
sbcmfsetspeed -8 'Slow down all .CMF files by 8 Cycles
sbcmfplay "test.cmf",ary%(1) 'Plays back .CMF file slower than
'normal
do:loop until sbcmfcheck=0 'Wait til song is over
sbcmfsetspeed 0 'Returns playback speed to default
================================================================================
sub sbcmftranspose(nm%)
Transposes the pitch of a piece of music up or down by
a particular number of half-tone steps. Use this command
either before playing a .CMF file or during playback to
change the base pitch of the music.
nm%: Set to number of half-tone steps to transpose. A
positive value will transpose up, while a negative
value will transpose down. Using a value of zero
will turn transposing off and set the tone of the
music back to the original.
Example: sbcmftranspose -4 'Transpose 4 steps down
================================================================================
function sbcpuspeed
Calculates and returns approximate CPU speed in MHz
using a timing loop. Called by the digital playback
routines to determine non machine-dependent playback
speeds.
sbcpuspeed: Returns approx. CPU speed in mHz
Example: print sbcpuspeed
================================================================================
sub sbdelay(ms%)
Pauses the specified number of milliseconds.
ms%: Set to milliseconds (thousandths of a second) to pause.
(0-32767). Max is about 32 seconds.
Example: sbdelay 1000 'Delay one second exactly (hardware-independent).
================================================================================
function sbdetect
Detects whether a Soundblaster or compatible card is installed,
and returns -1 if yes or 0 if no. You should use this routine
before calling any Digital (sampling) I/O functions in this library.
Use SBFMDETECT instead before calling FM Music-related routines, as
the Adlib card will return a not-installed status with this routine
(it's not upward compatible with the Soundblaster). Note: This
routine also RESETS the SB card, and can be used in lieu of SBRESET
if desired.
Example: d% = sbdetect
================================================================================
sub sbfmclear
Clears and initializes the soundblaster's FM music registers.
Use this to (1) stop a sound, (2) before playing sounds to clear
previous values. Returns all internal POW! FM Music settings
to default values. To reset the soundblaster hardware, use
SBRESET instead (this command just clears the FM Music Adlib-
compatible registers).
Example: call sbfmclear
================================================================================
function sbfmdetect
Detects if an Adlib/FM Music-Capable card is installed, and returns
-1 if yes or 0 if no. This routine will return -1 for the Soundblaster,
as it's fully compatible with the Adlib card. Call this before calling any
of the other FM-Music related routines to determine if an appropriate sound
card is installed. Use SBDETECT instead to check for the Soundblaster card
specifically (for digital I/O and related functions).
Example: print sbfmdetect
================================================================================
sub sbfmnote (ch%,fr%,oc%,ad%,sr%,wv%,dly%)
Play a note on the soundblaster using the specified FM music
channel and the specified values (see below). This is the
one of the "lower level" FM Music commands in the POW!
toolbox, and it gives you a lot of control over parameters. For
a higher-level command that requires less parameters, see SBFMSOUND.
ch%: Set to Soundblaster Melody Channel (voice) (1-9).
fr%: Set to frequency (pitch) (0-1023). The approximate
frequency values for a scale are:
C: 345 C#: 366 D: 388 D#: 409 E: 431
F: 458 F#: 486 G: 515 G#: 545 A: 579
A#: 614 B: 650 C: 688
oc%: Set to octave (0-7) (Controls pitch)
ad%: Set to Attack/Decay (AD) value:
Attack: Bits 4-7 (0=slowest) (0-15)
Decay : Bits 0-3 (0=slowest) (0-15)
Formula: ad% = 16 * attack + decay
attack = ad% \ 16
decay = ad% and 15
sr%: Set to Sustain/Release (SR) value:
Sustain: Bits 4-7 (0=loudest) (0-15)
Release: Bits 0-3 (0=slowest) (0-15)
Formula: sr% = 16 * sustain + release
sustain = sr% \ 16
release = sr% and 15
wv%: Set to waveform (controls sharpness of tone).
0-3, where 0="softest" and 3="sharpest."
dly%: Set to delay value (in milliseconds) (0-32767, or about
32 seconds max). For a delay of zero, routine will play
note and immediately return without "turning note off" -
this is appropriate for certain AD and SR values (see
example below). If a delay is specified, the routine will
play the note ("key on"), delay the specified time, then
turn the note off ("key off").
Example: sbfmnote 1,345,5,240,4,1,0 'Play a note on the Soundblaster
================================================================================
sub sbfmparms(ch%,am%,vb%,sus%,hm%)
Sets extra parameters for a particular SB FM music channel
that will be used with the other SBFM commands (except SBFMPLAY).
This allows you to "fine-tune" the sound of each channel.
These parameters will remain in effect until you do an SBFMCLEAR
or change the soundblaster's registers directly.
Note: SBBEEP uses channel 1, and can be a way to quickly test
new parameter values. Simply call SBFMPARMS followed by an
SBBEEP statement to hear the changes. SBFMCLEAR resets all
values set by SBFMPARMS.
ch%: Set to Soundblaster channel (1-9) to set parameters for
am%: Set to 1 for Amplitude Modulation (tremolo), or 0 for none.
The default value is 0.
vb%: Set to 1 for Vibrato, or 0 for none. The default value
is 0.
sus%: Set to 1 for Note Sustain, or 0 for none. The default
is 0 (no sustain, note decays on SR phase).
hm%: Set to 0-15 to control which harmonic the specified channel
is modulated with. This controls the overall pitch and
tinniness of the output for the specified channel. The
default for this setting is zero.
Example: call sbfmparms(1,0,1,0,0) 'Set vibrato for channel 1
sbbeep 'Hear the vibrato
================================================================================
sub sbfmplay(m$)
Plays music on the Soundblaster - a mini music interpreter, similar
to PB's PLAY command, but works with the soundblaster rather than the
PC speaker, uses different parameters, and is much more flexible. All
SBFMPLAY commands are 2 characters in length (no exceptions), and these
commands are detailed below. The string you send is checked for an even
number of characters (as each command is two bytes), and SBFMPLAY terminates
if the string is not an even length. See the example sound programs
included with POW! for examples of SBFMPLAY syntax. When building strings
for SBFMPLAY, it is suggested that you do it in layers - add the notes, rests
and octave notations first, then add the chords and other commands later.
m$: Set to a string of characters indicating musical notes and commands
for SBFMPLAY:
a ,a-,a+,b ,b-,b+,c ,c-,c+,d ,d-,d+,e ,e-,e+,f ,f-,f+,g ,g-,g+
A ,A-,A+,B ,B-,B+,C ,C-,C+,D ,D-,D+,E ,E-,E+,F ,F-,F+,G ,G-,G+
Musical notes in SBFMPLAY are indicated by the note letter (the regular
scale CDEFGAB), followed by a space (regular note), a minus (flat), or
a plus (sharp). You can substitute the "b" character for the minus and
the "#" for the plus, if desired. Each note indicated is ALWAYS two
characters long. Using LOWERCASE letters for notes will produce a delay
between each note, while using UPPERCASE letters will play a note and
proceed immediately to the next note (useful for polyphonic music). The
note letters are the only place SBFMPLAY is case-sensitive. The following
are valid strings of notes:
"a a#b b#c c#d d#" <- Notice each note is EXACTLY two characters. Regular
notes (not flat or sharp) can be followed by ANY
character, whereas flats are followed by "-" or
"b", and sharps are followed by "+" or "#".
"C DbE F#G A#B c d e f#g-a+b-c+" <- the first part will be played without
delays between notes. This string is
read C, D flat, E, F sharp, G, A sharp,
B, C, D, E, F sharp, G flat, A sharp,
B flat, C sharp.
See the "O" (Octave) command for further control of note pitch.
------------------------------------------------------------------------------------
h0,h1,h2,h3,h4,h5,h6,h7,h8,h9,ha,hb,hc,
hd,he,hf,hg,hh,hi,hj,hk,hl,hm,hn,ho (upper or lowercase):
The "h" command plays a CHORD. All standard 3-voice major and minor
sharp and flat chords are supported in SBFMPLAY. 7th chords and others
are not currently supported. Voices 4-6 of the Soundblaster are used
for chords, so if you use them, v1-3 and v7-9 are free for the melody
(rhythm uses v7-9 - see the "X" command). The following "h" (the H may
be capitalized) commands correspond to the following chords:
h0: C h4: G h8: Dm hc: Am hg: F#/Gb hk: D#m/Ebm
h1: D h5: A h9: Em hd: Bm hh: G#/Ab hl: F#m/Gbm
h2: E h6: B ha: Fm he: C#/Db hi: A#/Bb hm: G#m/Abm
h3: F h7: Cm hb: Gm hf: D#/Eb hj: C#m/Dbm hn: A#m/Bbm
ho: silence chord
All chord commands are two characters, as are all note commands.
To cause chords to sustain, rather than play once, use the "N" command.
------------------------------------------------------------------------------------
i0,i1,i2,i3 (upper or lowercase):
"I" sets vIbrato (rapid variation of frequency) and tremolo (rapid
variation of volume) on and off. Use I1 to turn vibrato on for the
current channel (last specified with the V command), I2 to turn
tremolo on, or I3 to turn BOTH vibrato and tremolo on. I0 will
turn off vibrato and/or tremolo for the current channel.
------------------------------------------------------------------------------------
n0,n1,n2,n3,n4,n5,n6,n7,n8,n9 (upper or lowercase):
The "N" command controls the eNvelope of the notes in the SBFMPLAY
string. A sound's envelope consists of its attack, decay, sustain
and release (ADSR) phases, which have to do with the changes in
volume of a note during its lifetime. The attack rate is how
quickly the sound rises from zero to full volume. The decay rate
is how fast the note falls off from the attack peak to the sustain
level. The sustain level is the volume the note sustains at until
it's released. The release rate is how quickly the note falls off
from the sustain level to zero volume when released. If all this
is confusing to you, it doesn't matter - the "N" command in SBFMPLAY
lets you choose from some predefined sound envelopes. N0 - N5 are
NOTE envelopes (affecting the A-G note commands), while N6 - N9 are
CHORD envelopes (affecting the H0-Ho commands). The following "N"
commands are predefined:
n0: Note (default) - fast attack, medium release (string sound)
n1: Note - medium attack, slow release (softer sound)
n2: Note - fast attack, fast release (plink sound)
n3: Note - Medium all (ADSR) (medium sound)
n4: Note - Slow attack, slow release ("backward" or "wah wah" sound)
n5: Note - Slow attack, very slow release (soft sustain)
n6: Chord (default) - fast attack, medium release (string sound)
n7: Chord - slow attack, medium release
n8: Chord - slow attack, slow release
n9: Chord - slow attack, no release (sustain chords)
You can use "S" (Sustain notes) in combination with the "N" commands to
fine-tune the envelope of notes. You can also both N values below 5 and
N values above 5 to set both voice and chord envelopes. For example,
"n2n8" is a perfectly valid combination.
------------------------------------------------------------------------------------
o0,o1,o2,o3,o4,o5,o6,o7 (upper or lowercase):
The "O" command changes octaves. For example, you would insert
"o4" in the command string at the right place to change to octave 4.
All subsequent notes will play in that octave until changed with
another "O" command. The octave setting defaults to o5.
-------------------------------------------------------------------------------------
p0,p1,p2,p3,p4,p5,p6,p7,p8,p9 (upper or lowercase):
"P" controls the overall pace of the music (or tempo). The number you
provide is multiplied by 10 and used as a "millisecond base" for delays
in conjunction with the "W" command (described later). The "P" command
controls the actual wait time of the "W" (wait) command. P1, for example,
would provide a millisecond delay base of 0,10,20,30,40,50,60,70,80,90
corresponding to W0 through W9. Contrary to what you might imagine, the
larger the number given, the SLOWER the actual pace will be. The lower
the number, the FASTER the pace.
-------------------------------------------------------------------------------------
q1,q2,q3,q4,q5,q6,q7,q8,q9 (upper or lowercase):
The "Q" command stands for "quiet," and will silence a voice. This is
useful when used with the "S" (sustain) command, to shut off a voice at
will. You provide the number of the channel to silence along with the Q.
For example, "q3" would silence voice (channel) 3.
-------------------------------------------------------------------------------------
r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r. (upper or lowercase):
The "R" command stands for "Rest." Placing an R in the music string with
a number value will pause for the same amount of time as a corresponding
note would according to the current setting of the "W" command. R0 will
pause no time at all, and R. (r followed by a dot) will pause the same
amount of time as the notes (a normal full rest). The actual wait time
of each rest can be controlled by the "P" command the same way the "W"
command is. You may have to play around to get a feel for the timing of
the "R" command.
-------------------------------------------------------------------------------------
s0,s1 (upper or lowercase):
The "S" command controls note sustain. When set to one, all voices will
be sustained after they are played. When set to 0, the voice will play
for a second and then be silenced (like a guitar string). Simply insert
the Sx command at the desired place in the command string. Sustain applies
to "regular" notes only - to set chord sustain, use the "N" command (N9) to
set an envelope for chords that supports a sustain effect. Use the "N" and
the "S" commands together to control the ENVELOPE of the notes played (see
the "N" command for an explanation). For those who've already read that
section, the "S" command sets the SUSTAIN of notes to high and the RELEASE
value to 0 (no release) if turned on, or 4 (medium release) if turned off.
Using "S" does not affect the attack/decay portion of the note envelope.
-------------------------------------------------------------------------------------
t0,t1,t2,t3 (upper or lowercase):
The "T" command controls the TONE of the music playing. The higher the
number the "sharper" and more string-instrument like the sound will be.
Number parameters can range from 0 (very soft) to 3 (very sharp).
--------------------------------------------------------------------------------------
u0,u1,u2 (upper or lowercase):
The "U" command stands for User, and determines how the user can cancel
the SBFMPLAY command. U0 sets SBFMPLAY to cancel when the user presses
any key (this is the default), U1 sets SBFMPLAY so the user can cancel
the command only with the ESC key, and U2 sets SBFMPLAY so the user cannot
cancel it until the string is done playing. Once again, SBFMPLAY defaults
to allowing the user to cancel by pressing any key on the keyboard (SBFMPLAY
will not cancel in the middle of a rest or other delay, only between notes).
--------------------------------------------------------------------------------------
v1,v2,v3,v4,v5,v6,v7,v8,v9 (upper or lowercase):
"V" controls which voice (channel) of the soundblaster will be used to play
all notes following the command (until the next V command). Provide a
channel number between 1 and 9. For example, "v1C v2E v3G " will play 3
notes, each note on a different soundblaster channel (note the required space
after the final "G" note).
---------------------------------------------------------------------------------------
w0,w1,w2,w3,w4,w5,w6,w7,w8,w9 (upper or lowercase):
"W" stands for Wait, and controls how long SBFMPLAY will wait after
starting to play a note. If you set the wait value to zero, it will
immediately continue on to the next note (same as if you used a
capital letter to represent the next note). The actual time the "W"
command waits is determined by the "P" (pace) command. Use "W" to
set the overall time between notes, while using "R" to add arbitrary
rests between notes. The "W" wait value defaults to 5 if never set
in the SBFMPLAY string.
----------------------------------------------------------------------------------------
x0,x1,x2,x3,x4,x5,x6,x7,x8,x9 (upper or lowercase):
The "X" command plays a drumbeat or rhythm - think of the letter X
as a pair of crossed drumsticks to help you remember this command.
Each command (X0 through X9) plays a different rhythm sound. Please
listen to these sounds to determine which ones are correct for the
songs you are playing.
Example: SBFMPLAY "x3r4x3r4x3r4x3r4" 'Plays 4 drum beats with rests
'between them
================================================================================
sub sbfmportout(rg%,dat%)
Lets you write directly to the Soundblaster's FM registers,
should you be so inclined. A good book on the Soundblaster
(or the SB Developer's kit) is recommended, as an explanation
of Soundblaster registers is beyond the scope of POW!'s documentation.
This command is for the FM music registers only (normally &h388 and &h389);
it does not work for digitized sound playback. You do not have to include
delays, etc. after writing the ports using this command, as they are built
into the SBFMPORTOUT command.
rg%: Set to register to write to (01h-F5h)
dat%: Set to data to write to register (0-255)
Example: sbfmportout &h60,0 'Set channel 1 Attack/Decay to 0
================================================================================
sub sbfmrhythm(drum%,ad%,sr%,fr%,oc%)
Play a rhythm sound on the soundblaster. FM Melody channels 7-9
are not available when using this command. You'll have to experiment
to find the appropriate parameters for the different types of drum
sounds.
drum%: Set to drum sound desired:
Bit 0 = Hi Hat (add 1)
Bit 1 = Snare (add 2)
Bit 2 = Tom tom (add 4)
Bit 3 = Cymbal (add 8)
Bit 4 = Bass (add 16)
ad%: Set to Attack/Decay (AD) value:
Attack: Bits 4-7 (0=slowest) (0-15)
Decay : Bits 0-3 (0=slowest) (0-15)
Formula: ad% = 16 * attack + decay
attack = ad% \ 16
decay = ad% and 15
sr%: Set to Sustain/Release (SR) value:
Sustain: Bits 4-7 (0=loudest) (0-15)
Release: Bits 0-3 (0=slowest) (0-15)
Formula: sr% = 16 * sustain + release
sustain = sr% \ 16
release = sr% and 15
fr%: Set to frequency (0-1023)
oc%: Set to octave (0-7)
Example: sbfmrhythm 8,240,4,1000,7 'Play a note on the snare drum
================================================================================
sub sbfmsetports(addr%,dat%)
Sets the soundblaster's Address/Status port and
Data port locations. These are the ports for Adlib
compatible FM Music output. It's highly unlikely you'll
need to use this function, as the defaults (&h388
and &h389) are standard Soundblaster/Adlib ports, but
it's included for future compatibility, and in case
an unusual hardware setup presents a problem. See
SBSETBASE for a related function to set the SB base
I/O address for digitized sound output.
addr%: Set to SB Address/Status port (normally &h388)
dat%: Set to SB Data port (normally &h389)
Example: sbfmsetports &h388,&h389 'Set to default values
================================================================================
sub sbfmsound(ch%,fr%,oc%)
Play a note on the Soundblaster using the specified FM sound
channel and the specified values. This is a mid-level function
that gives you less control over SB FM sound parameters than SBFMNOTE
does, but makes it easier to play a note. Routine returns immediately
(no delay between notes). Waveform and ADSR values are preset for
each channel:
Ch 1: Soft sound, fast attack, slow release
Ch 2: Medium sound, fast attack, slow release
Ch 3: Sharp sound, fast attack, slow release
Ch 4: Soft sound, medium attack, medium release
Ch 5: Medium sound, medium attack, medium release
Ch 6: Sharp sound, medium attack, medium release
Ch 7: Soft sound, slow attack, slow release
Ch 8: Medium sound, slow attack, slow release
Ch 9: Sharp sound, slow attack, slow release
ch%: Set to SB sound channel (1-9)
fr%: Set to frequency (pitch value) (0-1023). The
approximate frequency values for a scale are:
C: 345 C#: 366 D: 388 D#: 409 E: 431
F: 458 F#: 486 G: 515 G#: 545 A: 579
A#: 614 B: 650 C: 688
oc%: Set to octave (0-7) (Controls pitch)
Example: sbfmsound 1,409,5 'Play a "D#" on channel 1 in octave 5
================================================================================
function sbgetpow$(f$,sn%,sr%,cm%)
Retrieves a sample from a .POW library into a string, which you can
then play back using SBPLAYDMA or save to a file for later use.
See the SBPLAYPOW command for further details regarding .POW files.
f$: Set to the filename of the .POW file
sn%: Set to the sample number (1-32) to retrieve
sr%: Returns the sample rate of the .POW sample, which you
can use with SBPLAYDMA to play back at the correct rate.
cm%: Retrieves the compression type byte, which you can use with
SBPLAYDMA to play the sample back correctly.
sbgetpow$: Returns the actual sample data as a string, or a
null string if an error is encountered. Make sure
you set the string segment size with $STRING to a large
enough value to hold all the sample data ($STRING 32
recommended), or only part of the sample will be read in.
Example: s$=sbgetpow$("test.pow",3,sr%,cm%) 'Retrieves TEST.POW sample 3
================================================================================
function sbmidiread
Reads a single byte from the Soundblaster MIDI port, and returns
the resulting value, or -1 if the Soundblaster times out and does
not return a MIDI value. It's up to you to interpret and use the
value returned by this function.
Example: mb% = sbmidiread
if mb%=-1 then print "No MIDI data.":end
print "MIDI byte:";mb%
================================================================================
sub sbmidiwrite(b%)
Writes a byte directly to the Soundblaster's MIDI port.
b%: Set to byte value (0-255) to write
Example: sbmidiwrite 128 'Write 128 to MIDI port
================================================================================
sub sbpasystem
An interesting routine that allows you to use your Soundblaster
card and computer as a "P.A. System" - included for curiosity's
sake only. To terminate SBPASYSTEM, simply press any key on the
keyboard. Samples from the Microphone or Line In jacks and plays
back over the Soundblaster's speakers. You will probably hear a
fair amount of background noise while this routine is active,
depending on your system.
Example: call sbpasystem
================================================================================
sub sbplaydma(s$,sr%,cm%)
NOTE: This routine will only function within a standalone .EXE
file, and will have no effect when run from a program within
the PowerBASIC IDE.
Plays back digitized data contained in a string in the background,
using DAC DMA techniques. See SBPLAYSTRING for more information on
the differences between this command and SBPLAYSTRING. You can use this
command to play back data sampled with SBSAMPLE$, or read out
of a file. You can also use SBCHECKDMA to check and see if a particular
sample played with this command is still playing or has finished (see
SBCHECKDMA).
s$: Set to digital data to play back. Data may be in compressed format
(4-bit, 2.6-bit or 2-bit compression), which you specify with the cm%
parameter.
sr%: Set to sample rate for playback, in Hertz.
cm%: Set to compression type: 0=None, 1=4-bit, 2=2.6-bit, 3=2-bit.
The string you pass in s$ should, of course, conform to the
compression type that you indicate with this parameter.
Example: sbplaydma s$,8000,0 '8000 Hz., no compression
================================================================================
sub sbplayfile (f$,dly%)
Plays an uncompressed digitized (raw) sound file through the Soundblaster
in the foreground (processing will not continue until the file is done
playing). A utility is included with POW! to convert .VOC and .WAV files
to .RAW files that can be played with this routine (MAKERAW.EXE). Note
that you can use SBPLAYPOW instead of this routine to play a sample from
a .POW library (see SBPLAYPOW). Such a sample will play in the background,
rather than in the foreground as with this routine, and will play back at
exactly the original sample rate recorded. One advantage of this routine,
however, is that you can play back a digital sample of nearly ANY length.
Also, this routine may be more compatible with different hardware setups,
as it doesn't matter what the user has their SB DMA and interrupt settings
at (they're not used). It's up to you to choose which of the routines to
use in your programs.
NOTE: Use the $STRING metastatement to allocate the maximum size
string segment possible, as the shorter the string, the less of the
file can be read in at once, and the more delays you may hear in the
playback of the file. $STRING 32 is recommended.
f$: Set to the path\filename of the file to play. You should not
attempt to play back .VOC and .WAV files directly with this
routine (convert them to raw sample data with MAKERAW first).
Although it can be done, it will introduce a lot of extra noise
into the samples because of the extra information included in .VOC
and .WAV files (header, block types, etc).
dly%: Set to a delay value, which will vary depending on the
speed the sound file was originally recorded at. Experiment
with this value to find the optimal delay setting for the file(s)
you are playing. The higher the value given, the slower the file
will be played back (the longer the delay). If you need to play the
files back at exactly the original rate, or don't have a good ear for
exact playback speed, use SBPLAYPOW along with the MAKEPOW utility
instead to convert .VOC and .WAV files to .POW libraries, which will
play back at exactly the original speed recorded, without any input
from you other than filename and sample number. See the SBPLAYPOW
command for more information.
Example: sbplayfile "test.raw",60 'Play back a .RAW file with delay of 60.
================================================================================
sub sbplaypow(f$,sn%)
NOTE: This routine will only function within a standalone .EXE
file, and will have no effect when run from a program within
the PowerBASIC IDE.
Plays a digitized sample from a .POW file, which is a proprietary
POW! Library format for storing digital samples. Included with POW!
is MAKEPOW, a utility that allows you to convert and store .VOC and
.WAV files in the .POW file format. A .POW file can hold up to 32
digital samples (V1.0), each with a particular length, compression
type and sample rate. To play back a sample in a .POW file, use
this command with the name of the file and the number of the sample
you want to play back. .POW samples play back in the background,
so control returns to you immediately while your program continues.
You can use the SBCHECKDMA flag to check if a sample is still playing
after starting playback (see SBCHECKDMA).
f$: Set to the filename of the .POW library (.POW extension required)
sn%: Set to the sample number (1-32) to play back. Setting a sample
number of zero will cancel playback of any sample currently playing.
Attempting to play a nonexistent sample will simply have no effect,
and control will return to your program immediately.
Example: sbplaypow "sounds.pow",3 'Play back sample #3 in sounds.pow
================================================================================
sub sbplaystring(s$,rte%)
Plays back a sample recorded into a string with SBSAMPLE$, and
can also play any raw sample data contained in a string. Similar
to SBPLAYFILE, but plays from a string instead of from a file.
You can also play back a string of digitized data with the SBPLAYDMA
command. To choose which routine to use when playing back a sample
in a string (or a file), you should understand a little of how the
Soundblaster works. There are two methods of playing back digitized
samples with the SB: the direct method, and the DMA method. The direct
method is just what it implies - each byte of the sample data is sent
to the Soundblaster, one at a time, tying up the processor while the
sample is playing. This command (SBPLAYSTRING) uses the direct method.
The DMA method of sample output uses a special chip in your computer to
send the sample data to the SB card without CPU intervention. This means
that you can play a sample in the background, while your program continues.
SBPLAYDMA uses the DMA method of Soundblaster digital access. The DMA
method also offers hardware decompression of compressed digitized data.
Although the DMA method would at first seem to always be preferable, it's
not always so. The direct method is much simpler to implement, and much
less hardware-dependent than the DMA method is. Thus, it will have a
greater chance of running on any machine it's used on. The DMA method uses
both the DMA chip (which is set with a jumper on the sound card) and traps
an interrupt (normally INT 5 or INT 7), and is thus a lot more complicated
and stands a greater chance of not working on a particular machine,
especially if you haven't used SBSETINT, SBSETDMA and SBSETBASE to set all
these addresses. The direct method needs only the right base port (which
is normally 0220h and not generally changed). It's completely up to you to
weigh the advantages and disadvantages of the direct method of digital
transfer (used by SBPLAYFILE and SBPLAYSTRING) or the DMA (background)
method (used by SBPLAYPOW and SBPLAYDMA).
s$: Set to string containing digitized sample data retrieved with
SBSAMPLE$, or from a file containing raw sample data.
rte%: Set to playback rate (see SBSAMPLE$ and SBPLAYFILE for examples
of how the rate value applies to playback speed.
Example: s$=sbsample$(8000,40) 'Record a sample
sbplaystring s$,40 'Play back sample s$ at rate 40
================================================================================
function sbpowname$(f$,sn%)
Retrieves the name of the specified .POW sample from a .POW library
and returns it as an 8-character string. Each sample in a .POW library
has an 8-character name derived from the original .VOC or .WAV file added
to the library.
f$: Set to the filename of the .POW library (.POW extension required)
sn%: Set to the sample number to retrieve the name of
sbpowname$: Returns the 8-character name of the specified sample (space-
padded)
Example: print sbpowname$("test.pow",1) 'Prints name of sample 1 in
'TEST.POW.
================================================================================
sub sbpresetmixer <SB-PRO ONLY>
Resets the onboard mixer to power-up state on the Soundblaster
Pro card. Probably won't do any harm using the mixer commands with
a regular Soundblaster, but the user should be polled in your program
as to the type of SB card he/she has. See SBPSETMIXER to set the values
of the SB Pro's onboard mixer chip.
Example: call sbpresetmixer
================================================================================
sub sbpsetmixer(ms%,mv%,vfm%,vcd%,vln%,vvc%,vmc%) <SB-PRO ONLY>
Sets values for the Soundblaster Pro's mixer chip. Calling this
routine with a regular Soundblaster probably won't do any harm, but
the user should be polled in your program as to the type of SB card he
or she has. See SBPRESETMIXER to reset the mixer chip to power-up values.
ms%: Set to 0 for mono or 1 for stereo output. This also selects
filtered output automatically.
mv%: Set to master volume setting (0-15) for left and right channels.
The formula to use is 16 * left channel + right channel.
vfm%: Set to volume for FM music (0-15) for left and right channels.
The formula to use is 16 * left channel + right channel.
vcd%: Set to volume for CD output for left and right channels.
The formula to use is 16 * left channel + right channel.
vln%: Set to volume for line in, left and right channels.
The formula to use is 16 * left channel + right channel.
vvc%: Set to volume for digitized sound for left and right channels.
The formula to use is 16 * left channel + right channel.
vmc%: Set to volume for microphone input (0-7).
Example: sbpsetmixer 1,255,255,255,255,255,255 'Stereo, max volume all.
================================================================================
sub sbreset
Resets the Soundblaster card, preparing it for digitized output.
This is similar to the SBFMCLEAR command (which applies to FM music),
but SBRESET should be called before using SBPLAYFILE, SBPLAYSTRING,
SBPLAYPOW, SBPLAYDMA or SBSAMPLE$ for the first time. You should
call it once before outputting digitized sound with any of the above
mentioned commands, and again if you start using a new command at some
point in your program.
Example: call sbreset
================================================================================
function sbsample$(ln%,rte%)
Reads a digital sample from the Soundblaster's Line In or Microphone
Input and stores it in a string. The sample can then be played back with
SBPLAYSTRING, or stored in a file and played back later with SBPLAYFILE.
ln%: Set to length of sample to take. This value should never exceed
the string segment size set with $STRING (see example below). The sample
will be read until the entire sample length you passed in ln% is taken.
rte%: Set to a RATE value, similar to the dly% parameter in SBPLAYFILE.
The higher the value of rte% you provide, the more recording time you'll
get from a given value passed in ln%, but the poorer the sound quality.
I have gotten good results with rte% values from 10 to 50. Lower than
10 will give you very little recording time with few additional benefits,
and the accuracy as related to SBPLAYFILE playback decreases as well (if
you use the same value for rte% in sbsample$ and dly% in sbplayfile).
Values over 50 usually result in poor sound quality.
Example: $string 8 'must be 8 or greater for this example
call sbreset 'Reset the SB
print "Press a key to start recording a sample";
while inkey$="":wend
s$ = sbsample$(8000,40) 'Take an 8000-byte sample at rate 40
open "sample.raw" for output as #1 'Prepare to save the sample
print #1,s$; 'Write sample to file
close #1
print "Press a key to play the sample back"
sleep
sbplayfile "sample.raw",40 'Play back the digital sample.
================================================================================
function sbsamplebyte
Allows you to sample a byte directly from the Soundblaster's Microphone
or Line Input, allowing you to signal your program via voice or sound
input. It also allows experimentation with voice recognition and other
similar ideas. You should never use this routine while playing back a
sample with SBPLAYPOW or SBPLAYDMA, as it will cause interference with
the sound output from this routine and could conceivably cause a system
crash as well.
sbsamplebyte: Returns the value of the byte most recently sampled from the
SB's Line In or Mic In. This will be 128 for no input, and
a varying other value depending on the amplitude and the
waveform of the input signal. 128 seems to be the median
value, with values dropping below and climbing above this
number as the waveform of the input signal changes.
Example: call sbreset ;Always recommended before using sbsamplebyte
do
print sbsamplebyte
loop
================================================================================
sub sbsay(s$)
NOTE: This routine will only function within a standalone .EXE
file, and will have no effect when run from a program within
the PowerBASIC IDE.
Speaks a string as synthesized speech if the SB speech
driver is loaded (check for it with SBSPEECH before calling).
String should be a maximum of 255 characters in length.
Note: Calling the sound driver while in the PB IDE (PB.EXE)
may cause your computer to crash or reboot. This routine
should be called only from a standalone .EXE file. I've also
noticed that entering and leaving the PB IDE after loading the
speech driver, and then using this command, can cause a system
crash as well.
Example: sbsay "Hello there!"
================================================================================
sub sbsetbase(io%)
Sets the base address for the Soundblaster card
(normally &h220). This controls output of digitized
sounds (SBPLAYFILE/SBPLAYPOW commands). To set
the Adlib FM-Music ports, use SBFMSETPORTS instead.
Note: You can often get this address from the BLASTER environment
variable. If you use S$=ENVIRON$("BLASTER"), a string will be
returned in S$ of the form "A220 I7 D1 T3". The A220 indicates
the base address (220 hex), the I7 the interrupt number (7), the D1
the DMA number (1). The T indicates the type of sound card. You can
parse this string out and use SBSETBASE and SBSETINT to set the SB's
base and interrupt addresses for the POW! Toolbox.
io%: Set to base I/O port address for the Soundblaster card.
Example: sbsetbase &h220
================================================================================
sub sbsetdma(d%)
Sets the DMA to be used with the Soundblaster card (defaults to DMA 1).
This should be set on a jumper on the user's Soundblaster card, and is part
of the BLASTER environment variable.
d%: Set to DMA number to use (0, 1 or 3).
Example: sbsetdma 1 'Sets DMA 1
================================================================================
sub sbsetint(i%)
Sets the default interrupt for the Soundblaster card, which
can be inputted by the user or taken from the BLASTER environment
variable. If never set, the SB interrupt in POW! defaults to INT 7.
Example: sbsetint 5 'Set IRQ 5 for Soundblaster
================================================================================
function sbspeech
NOTE: This routine will only function within a standalone .EXE
file, and will have no effect when run from a program within
the PowerBASIC IDE.
Returns -1 if the SB's speech driver is installed,
or 0 if not. Use before calling SBSAY to add synthesized
speech to your programs.
Example: print spspeech
Creative Voice File (.VOC) File Format
--------------------------------------
HEADER: (bytes &h00-&h19)
=======
byte # Description
------ -----------
&h00-&h12 'Creative Voice File'
&h13 &h1A (eof to abort printing of file)
&h14-&h15 &h1A &h00 word offset in file of first data block
&h16-&h17 Version number (VOC-HDR puts &h0a &h01)
&h18-&h19 2's Comp of Ver. # + &h1234 (VOC-HDR puts &h29 &h11)
DATA: (bytes &h1a+) A series of data blocks terminated by &h00
=====
Data Block: TYPE(1-byte), SIZE(3-bytes), INFO(0+ bytes)
-----------
TYPE Description Size (3-byte int) info
---- ----------- ----------------- ----
00 End Block 1 byte, zero only none (EOF marker)
01 Sound data 2+length of data *
02 Subsq. data length of data none
03 Silence 3 **
04 Marker 2 marker #
05 Message length of data 0 byte terminator
06 Repeat 2 # of repetitions
07 End repeat 0 none
08+ ???? ??? ???
*Sound info format: **Silence info format:
----------------- --------------------
00 Sample rate 00-01 Length of silence
01 Compression type 02 Duration
02+ Data 03 Sample rate
Sample rate -- SR byte = 256-(1000000\sample_rate) ***
Length of silence -- (# of .1 seconds encrypted)
Compression type -- 8-bits = 0
4-bits = 1
2.6-bits = 2
2-bits = 3
Multi DAC = 3+(# of channels)
Silence encoding finds quiet places in file, and creates a separate
block that is of type Silence.
*** If the file is stored for a sample rate over 22222 then
no compression is allowed and the speed is stored as a word
given by SR WORD= 65536-(256000000\sample_rate)
.CMF File Format
----------------
Bytes &h00-&h03: 'CTMF'
Bytes &h04-&h05: Sub/Main digits of CMF version
Bytes &h06-&h07: Offset of instrument data (from start of file)
Bytes &h08-&h09: Offset of music data (from start of file)
Bytes &h0a-&h0b: Timer ticks per quarter note
Bytes &h0c-&h0d: Interrupts per second
Bytes &h0e-&h0f: Offset of title text (from start of file)
Bytes &h10-&h11: Offset of author's name text (from start of file)
Bytes &h12-&h13: Offset of comment text (from start of file)
Bytes &h14-&h23: 16 bytes, either 1 or 0 (MIDI channel used/not used)
Bytes &h24-&h25: Number of instruments
Bytes &h26-&h27: Basic tempo of music
Bytes &h28- : Data indicated by previous bytes
Instruments: Each instrument data item consists of 16 bytes.
Music block: Conforms to standard MIDI specifications
.POW File Format Info
---------------------
Header:
(1) 'PBPOWF' (6 bytes)
(2) 0 byte (1 byte) The value 0 may change in future versions and
if so will be an indicator of .POW file format
version, and also indicate max number of samples
that can be stored in the .POW library.
(3) 32 * DWORD (128 bytes consisting of the offsets of each sample
within the file. A value of 0 for any DWORD offset indicates
no sample for that particular entry. Samples correspond to the
format given below.)
Sample Format:
(1) Name of Sample: 8 bytes, space-padded at the right
(2) Compression type: 1 byte, same as .VOC
(3) Sample Rate: 1 byte, same as .VOC
(4) Size of Sample: 1 word (2 bytes) - size = 0 to 32738 max (based
on max PB string segment size)
(5) Sample data.. length as indicated in (4)
POW! Toolbox Trial License
--------------------------
The POW! Toolbox is
copyrighted, commercial software
being distributed under the shareware (try before you buy)
marketing concept. It is
not free software
, nor is it in
the public domain.
You are licensed to try POW! routines in your programs for
a period of
60 days (two months)
. You
may not distribute
programs that include POW! routines, either for pay or for
free,
without first registering POW!
. If at the end of 60
days you decide not to register POW!, you should delete all
copies of the program, including all executable files that
contain POW! routines, and discontinue use.
Registered users of POW! will receive the following
benefits:
* The
latest version of POW! on floppy disk
(specify
format, or 3 1/2", 1.44MB HD will be sent). This
includes all files that came with the shareware
version, as well as the source code (see below).
* Complete
assembly language source code
to POW! routines
for ease of making modifications to the software. This
is a major benefit, and one that is not offered with many
all assembly-language toolboxes.
License to use POW! routines
in programs intended for
distribution and/or sale,
without payment of further
fees or royalties
. This is guaranteed in writing along
with your registered copy.
* Prompt notification of and
access to major updates
POW! for a negligible upgrade fee (currently $10.00 incl.
P&H, subject to future change). Minor updates and bug
fixes are always free with a postpaid disk mailer and
floppy disk.
More demonstration programs
, with tips and techniques on
using POW! routines.
* A collection of
.VOC, .WAV and .CMF files
for use with
POW! or for any other use you wish.
Technical support by mail
and via the PowerBASIC BBS and
any other online services frequented by the author (see
the Bibliography section for an online reference)
You may also receive
other benefits
in addition to those
stated above (which are guaranteed upon registration.
Note that this is not a warrantee of any kind, but a
guarantee of benefits upon payment of the registration fee.
Commercial users of POW! must register and pay for their
copies of the program
within 10 days
of first use or their
license is withdrawn. Site-license arrangements may be made
by contacting the author at the address given below. Site-
licensing contracts are negotiated on an individual basis.
To register POW!, please send a check or money order for
$29.95, plus $5.00 shipping and handling ($34.95 total)
, to:
Tim Gerchmez
12648 S.E. 81st Pl.
Renton, WA 98056-9121
Use the form included in this package (REGISTER.FRM). If
you don't, please don't forget to specify your FULL NAME,
ADDRESS, TELEPHONE NUMBER, and DISK FORMAT desired.
Foreign registrants must pay with a check or cashier's check
DRAWN ON A U.S. BANK, or with U.S. dollars in cash. Foreign
users are guaranteed the
same registration benefits
as domestic
users, including full technical support by mail.
Questions or comments may also be directed to the author
at the above address.
Comments and/or questions from
unregistered users are welcomed.
DISTRIBUTORS
are hereby licensed to distribute POW!
freely, provided that all files included in the
shareware package are kept together and unaltered
(additional files may be added if necessary). It's
recommended that you contact the author at the
address given above, so that program updates and
bug fixes can be sent to you. For additional
details, see the file VENDOR.DOC included with
this package.
BBS SYSOPS
may distribute POW! freely, provided that
all files included in the archive package are kept
together and unaltered (additional files may be added).
It's recommended that you contact the author at the
address given above, so that program updates and bug
fixes can be sent or uploaded to you. The POW! package
may be un-archived and re-archived using a different
archiving technique (suggested filenames are POW!.ZIP
or POW!.ARJ), and posted freely on any kind of BBS
system.
POW! for PowerBASIC 3.0 Registration Form
-----------------------------------------
___
I would like to register POW! for
PowerBASIC 3.0. Enclosed is my check or
money order for $34.95 ($29.95 + $5 S/H).
Please send me the latest version on disk
in the format specified below. I understand
that I will receive complete source code for
POW! and free technical support by mail.
Foreign Users: Check/M.O. drawn on a U.S. bank
or U.S. dollars in cash only please.
___ I do not want to register the POW! library,
because of the reasons detailed below. Please
make the improvements/bug fixes I have specified
and I will reconsider registering.
Name: ____________________________ Date: _________
Address: ____________________________________________
____________________________________________
City: _____________________ State: _____________
Zip: ________-_____ Phone: (_____) ____-________
Disk Format: ___ 3 1/2" 1.44MB ___ 5 1/4" 1.2MB
___ Other format not listed: ___________
_______________________________________
Area for _______________________________________
Suggestions, _______________________________________
Comments, _______________________________________
Bug Fixes, _______________________________________
Other... _______________________________________
_______________________________________
Mail to:
Tim Gerchmez
12648 S.E. 81st Pl.
Renton, WA 98056-9121
Thanks for your registration!
POW! Toolbox Bibliography
-------------------------
The following books and other documents were helpful in the
research, design and creation of the POW! Toolbox. Thanks
go to the authors and publishers of all of these excellent
books and text files.
* MS-DOS Functions - Programmer's Quick Reference Series
------------------------------------------------------
(C) Copyright 1988 by Ray Duncan, Microsoft Press
ISBN 1-55615-128-4
A useful technical reference to MS-DOS interrupt calls.
* PowerBASIC 3.0 Programmer's Guide and Reference Guide
-----------------------------------------------------
(C) Copyright 1990, 1992 by Robert S. Zale
Portions (C) Copyright 1987, 1989 Borland International
The PowerBASIC Programmer's Guide and Reference Guide are
of course indispensable references when writing anything for
PowerBASIC. The PB online help is also excellent, and served
as a great resource.
* Programming the 8086/8088
-------------------------
(C) Copyright 1983, Sybex Inc.
Written by James W. Coffron
ISBN 0-89588-120-9
A reference for 8086/8088 opcodes and operands, and
a programming guide for these chips.
* Using Assembly Language, 3rd Edition
------------------------------------
(C) Copyright 1992 by Que Corporation
Written by Allen L. Wyatt, Sr.
An excellent and very complete reference guide to programming
the 8086/80286/80386 chips. Much useful information on just
about all aspects of ASM programming.
* Borland Turbo Assembler User's Guide
------------------------------------
(C) Copyright 1988- Borland, International
Borland's excellent documentation for TASM was a great
help in writing POW!. It supplies many useful examples,
and goes into great detail about TASM programming. I'd
recommend TASM as an assembler based on the quality of
the documentation alone.
* Writing and Marketing Shareware
-------------------------------
(C) Copyright 1992, Steven C. Hudgik
ISBN 0-8306-2552-6 (p)
The definitive work on Shareware, and the best guide I've
found to (as the title suggests), writing and marketing
Shareware. All Shareware authors should have a copy of
this book in their library.
* Programming the Adlib/Soundblaster FM Music Chips, v2.0
-------------------------------------------------------
(C) Copyright 1991, 1992 Jeffrey S. Lee
A text file in public circulation detailing the
technical aspects of programming the Adlib and
Soundblaster cards.
* The Sound Blaster Book
----------------------
(C) Copyright 1992, Abacus - A Data Becker Book.
Written by Axel Stolz.
The best book I've found on the Soundblaster card.
This book was a great resource, and supplied many
programming examples and file format details.
* The Soundblaster Freedom Project
--------------------------------
Jeff Bird, jeff@wench.jcu.edu.au
A series of Public Domain text files and 'C' programs
containing much useful information on programming the
Soundblaster card.
* Ralf Brown's Interrupt List
---------------------------
(C) Copyright 1989, 1990, 1991, 1992, 1993 Ralf Brown
This is not a book but a freeware reference guide
available on BBS's. It's an absolutely thorough and
indispensable technical reference to PC interrupt calls.
Without it, POW!'s speech driver functions would not have
been possible. Special thanks to Ralf Brown for providing
such a useful resource for PC programmers.
* Online Resource:
---------------
Masterpiece BBS
Kent, Wa
Running Major BBS software
(206) 281-3676
(206) 639-0899
Masterpiece BBS, with 24 CD-ROMs online, was a great
resource and help when writing POW!. One of the best
BBS's in the Puget Sound area, and possibly in the nation.
Many incoming phone lines and services offered. Give them
a call! You can leave me (the author of POW!) E-mail under
the handle "Futureboy."
I would also like to thank Creative Labs for designing the
Soundblaster card, and making available to users and programmers
the many drivers for its different functions.