mirror of
https://github.com/chocolate-doom/research.git
synced 2024-11-10 07:11:34 +00:00
Remove adlib.txt.
Subversion-branch: /research Subversion-revision: 1482
This commit is contained in:
parent
a6c335d5be
commit
a880926d22
1 changed files with 0 additions and 479 deletions
479
opl/adlib.txt
479
opl/adlib.txt
|
@ -1,479 +0,0 @@
|
||||||
|
|
||||||
Programming the AdLib/Sound Blaster
|
|
||||||
FM Music Chips
|
|
||||||
Version 2.0 (24 Feb 1992)
|
|
||||||
|
|
||||||
Copyright (c) 1991, 1992 by Jeffrey S. Lee
|
|
||||||
|
|
||||||
jlee@smylex.uucp
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Warranty and Copyright Policy
|
|
||||||
|
|
||||||
This document is provided on an "as-is" basis, and its author makes
|
|
||||||
no warranty or representation, express or implied, with respect to
|
|
||||||
its quality performance or fitness for a particular purpose. In no
|
|
||||||
event will the author of this document be liable for direct, indirect,
|
|
||||||
special, incidental, or consequential damages arising out of the use
|
|
||||||
or inability to use the information contained within. Use of this
|
|
||||||
document is at your own risk.
|
|
||||||
|
|
||||||
This file may be used and copied freely so long as the applicable
|
|
||||||
copyright notices are retained, and no modifications are made to the
|
|
||||||
text of the document. No money shall be charged for its distribution
|
|
||||||
beyond reasonable shipping, handling and duplication costs, nor shall
|
|
||||||
proprietary changes be made to this document so that it cannot be
|
|
||||||
distributed freely. This document may not be included in published
|
|
||||||
material or commercial packages without the written consent of its
|
|
||||||
author.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Overview
|
|
||||||
|
|
||||||
Two of the most popular sound cards for the IBM-PC, the AdLib and the
|
|
||||||
Sound Blaster, suffer from a real dearth of clear documentation for
|
|
||||||
programmers. AdLib Inc. and Creative Labs, Inc. both sell developers'
|
|
||||||
kits for their sound cards, but these are expensive, and (in the case
|
|
||||||
of the Sound Blaster developers' kit) can be extremely cryptic.
|
|
||||||
|
|
||||||
This document is intended to provide programmers with a FREE source
|
|
||||||
of information about the programming of these sound cards.
|
|
||||||
|
|
||||||
The information contained in this document is a combination of
|
|
||||||
information found in the Sound Blaster Software Developer's Kit, and
|
|
||||||
that learned by painful experience. Some of the information may not
|
|
||||||
be valid for AdLib cards; if this is so, I apologize in advance.
|
|
||||||
|
|
||||||
Please note that numbers will be given in hexadecimal, unless otherwise
|
|
||||||
indicated. If a number is written out longhand (sixteen instead of 16)
|
|
||||||
it is in decimal.
|
|
||||||
|
|
||||||
| Changes from Version 1 of the file will be indicated by the use of change
|
|
||||||
| bars in the left-hand margin.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Chapter One - Sound Card I/O
|
|
||||||
|
|
||||||
The sound card is programmed by sending data to its internal registers
|
|
||||||
via its two I/O ports:
|
|
||||||
|
|
||||||
0388 (hex) - Address/Status port (R/W)
|
|
||||||
0389 (hex) - Data port (W/O)
|
|
||||||
|
|
||||||
| The Sound Blaster Pro is capable of stereo FM music, which is accessed
|
|
||||||
| in exactly the same manner. Ports 0220 and 0221 (hex) are the address/
|
|
||||||
| data ports for the left speaker, and ports 0222 and 0223 (hex) are the
|
|
||||||
| ports for the right speaker. Ports 0388 and 0389 (hex) will cause both
|
|
||||||
| speakers to output sound.
|
|
||||||
|
|
||||||
The sound card possesses an array of two hundred forty-four registers;
|
|
||||||
to write to a particular register, send the register number (01-F5) to
|
|
||||||
the address port, and the desired value to the data port.
|
|
||||||
|
|
||||||
After writing to the register port, you must wait twelve cycles before
|
|
||||||
sending the data; after writing the data, eighty-four cycles must elapse
|
|
||||||
before any other sound card operation may be performed.
|
|
||||||
|
|
||||||
| The AdLib manual gives the wait times in microseconds: three point three
|
|
||||||
| (3.3) microseconds for the address, and twenty-three (23) microseconds
|
|
||||||
| for the data.
|
|
||||||
|
|
|
||||||
| The most accurate method of producing the delay is to read the register
|
|
||||||
| port six times after writing to the register port, and read the register
|
|
||||||
| port thirty-five times after writing to the data port.
|
|
||||||
|
|
||||||
The sound card registers are write-only.
|
|
||||||
|
|
||||||
The address port also functions as a sound card status byte. To
|
|
||||||
retrieve the sound card's status, simply read port 388. The status
|
|
||||||
byte has the following structure:
|
|
||||||
|
|
||||||
7 6 5 4 3 2 1 0
|
|
||||||
+------+------+------+------+------+------+------+------+
|
|
||||||
| both | tmr | tmr | unused |
|
|
||||||
| tmrs | 1 | 2 | |
|
|
||||||
+------+------+------+------+------+------+------+------+
|
|
||||||
|
|
||||||
Bit 7 - set if either timer has expired.
|
|
||||||
6 - set if timer 1 has expired.
|
|
||||||
5 - set if timer 2 has expired.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Chapter Two - The Registers
|
|
||||||
|
|
||||||
The following table shows the function of each register in the sound
|
|
||||||
card. Registers will be explained in detail after the table. Registers
|
|
||||||
not listed are unused.
|
|
||||||
|
|
||||||
Address Function
|
|
||||||
------- ----------------------------------------------------
|
|
||||||
01 Test LSI / Enable waveform control
|
|
||||||
02 Timer 1 data
|
|
||||||
03 Timer 2 data
|
|
||||||
04 Timer control flags
|
|
||||||
08 Speech synthesis mode / Keyboard split note select
|
|
||||||
20..35 Amp Mod / Vibrato / EG type / Key Scaling / Multiple
|
|
||||||
40..55 Key scaling level / Operator output level
|
|
||||||
60..75 Attack Rate / Decay Rate
|
|
||||||
80..95 Sustain Level / Release Rate
|
|
||||||
A0..A8 Frequency (low 8 bits)
|
|
||||||
B0..B8 Key On / Octave / Frequency (high 2 bits)
|
|
||||||
BD AM depth / Vibrato depth / Rhythm control
|
|
||||||
C0..C8 Feedback strength / Connection type
|
|
||||||
E0..F5 Wave Select
|
|
||||||
|
|
||||||
The groupings of twenty-two registers (20-35, 40-55, etc.) have an odd
|
|
||||||
order due to the use of two operators for each FM voice. The following
|
|
||||||
table shows the offsets within each group of registers for each operator.
|
|
||||||
|
|
||||||
|
|
||||||
Channel 1 2 3 4 5 6 7 8 9
|
|
||||||
Operator 1 00 01 02 08 09 0A 10 11 12
|
|
||||||
Operator 2 03 04 05 0B 0C 0D 13 14 15
|
|
||||||
|
|
||||||
Thus, the addresses of the attack/decay bytes for channel 3 are 62 for
|
|
||||||
the first operator, and 65 for the second. (The address of the second
|
|
||||||
operator is always the address of the first operator plus three).
|
|
||||||
|
|
||||||
To further illustrate the relationship, the addresses needed to control
|
|
||||||
channel 5 are:
|
|
||||||
|
|
||||||
29 - Operator 1 AM/VIB/EG/KSR/Multiplier
|
|
||||||
2C - Operator 2 AM/VIB/EG/KSR/Multiplier
|
|
||||||
49 - Operator 1 KSL/Output Level
|
|
||||||
4C - Operator 2 KSL/Output Level
|
|
||||||
69 - Operator 1 Attack/Decay
|
|
||||||
6C - Operator 2 Attack/Decay
|
|
||||||
89 - Operator 1 Sustain/Release
|
|
||||||
8C - Operator 2 Sustain/Release
|
|
||||||
A4 - Frequency (low 8 bits)
|
|
||||||
B4 - Key On/Octave/Frequency (high 2 bits)
|
|
||||||
C4 - Feedback/Connection Type
|
|
||||||
E9 - Operator 1 Waveform
|
|
||||||
EC - Operator 2 Waveform
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Explanations of Registers
|
|
||||||
|
|
||||||
Byte 01 - This byte is normally used to test the LSI device. All bits
|
|
||||||
should normally be zero. Bit 5, if enabled, allows the FM
|
|
||||||
chips to control the waveform of each operator.
|
|
||||||
|
|
||||||
7 6 5 4 3 2 1 0
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
| unused | WS | unused |
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
|
|
||||||
|
|
||||||
Byte 02 - Timer 1 Data. If Timer 1 is enabled, the value in this
|
|
||||||
register will be incremented until it overflows. Upon
|
|
||||||
overflow, the sound card will signal a TIMER interrupt
|
|
||||||
(INT 08) and set bits 7 and 6 in its status byte. The
|
|
||||||
value for this timer is incremented every eighty (80)
|
|
||||||
microseconds.
|
|
||||||
|
|
||||||
|
|
||||||
Byte 03 - Timer 2 Data. If Timer 2 is enabled, the value in this
|
|
||||||
register will be incremented until it overflows. Upon
|
|
||||||
overflow, the sound card will signal a TIMER interrupt
|
|
||||||
(INT 08) and set bits 7 and 5 in its status byte. The
|
|
||||||
value for this timer is incremented every three hundred
|
|
||||||
twenty (320) microseconds.
|
|
||||||
|
|
||||||
|
|
||||||
Byte 04 - Timer Control Byte
|
|
||||||
|
|
||||||
7 6 5 4 3 2 1 0
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
| IRQ | T1 | T2 | unused | T2 | T1 |
|
|
||||||
| RST | MSK | MSK | | CTL | CTL |
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
|
|
||||||
bit 7 - Resets the flags for timers 1 & 2. If set,
|
|
||||||
all other bits are ignored.
|
|
||||||
bit 6 - Masks Timer 1. If set, bit 0 is ignored.
|
|
||||||
bit 5 - Masks Timer 2. If set, bit 1 is ignored.
|
|
||||||
bit 1 - When clear, Timer 2 does not operate.
|
|
||||||
When set, the value from byte 03 is loaded into
|
|
||||||
Timer 2, and incrementation begins.
|
|
||||||
bit 0 - When clear, Timer 1 does not operate.
|
|
||||||
When set, the value from byte 02 is loaded into
|
|
||||||
Timer 1, and incrementation begins.
|
|
||||||
|
|
||||||
|
|
||||||
Byte 08 - CSM Mode / Keyboard Split.
|
|
||||||
|
|
||||||
7 6 5 4 3 2 1 0
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
| CSM | Key | unused |
|
|
||||||
| sel | Spl | |
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
|
|
||||||
bit 7 - When set, selects composite sine-wave speech synthesis
|
|
||||||
mode (all KEY-ON bits must be clear). When clear,
|
|
||||||
selects FM music mode.
|
|
||||||
|
|
||||||
bit 6 - Selects the keyboard split point (in conjunction with
|
|
||||||
the F-Number data). The documentation in the Sound
|
|
||||||
Blaster manual is utterly incomprehensible on this;
|
|
||||||
I can't reproduce it without violating their copyright.
|
|
||||||
|
|
||||||
|
|
||||||
Bytes 20-35 - Amplitude Modulation / Vibrato / Envelope Generator Type /
|
|
||||||
Keyboard Scaling Rate / Modulator Frequency Multiple
|
|
||||||
|
|
||||||
7 6 5 4 3 2 1 0
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
| Amp | Vib | EG | KSR | Modulator Frequency |
|
|
||||||
| Mod | | Typ | | Multiple |
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
|
|
||||||
bit 7 - Apply amplitude modulation when set; AM depth is
|
|
||||||
controlled by the AM-Depth flag in address BD.
|
|
||||||
bit 6 - Apply vibrato when set; vibrato depth is controlled
|
|
||||||
by the Vib-Depth flag in address BD.
|
|
||||||
bit 5 - When set, the sustain level of the voice is maintained
|
|
||||||
until released; when clear, the sound begins to decay
|
|
||||||
immediately after hitting the SUSTAIN phase.
|
|
||||||
bit 4 - Keyboard scaling rate. This is another incomprehensible
|
|
||||||
bit in the Sound Blaster manual. From experience, if
|
|
||||||
this bit is set, the sound's envelope is foreshortened as
|
|
||||||
it rises in pitch.
|
|
||||||
bits 3-0 - These bits indicate which harmonic the operator will
|
|
||||||
produce sound (or modulation) in relation to the voice's
|
|
||||||
specified frequency:
|
|
||||||
|
|
||||||
0 - one octave below
|
|
||||||
1 - at the voice's specified frequency
|
|
||||||
2 - one octave above
|
|
||||||
3 - an octave and a fifth above
|
|
||||||
4 - two octaves above
|
|
||||||
5 - two octaves and a major third above
|
|
||||||
6 - two octaves and a fifth above
|
|
||||||
7 - two octaves and a minor seventh above
|
|
||||||
8 - three octaves above
|
|
||||||
9 - three octaves and a major second above
|
|
||||||
A - three octaves and a major third above
|
|
||||||
B - " " " " " " "
|
|
||||||
C - three octaves and a fifth above
|
|
||||||
D - " " " " " "
|
|
||||||
E - three octaves and a major seventh above
|
|
||||||
F - " " " " " " "
|
|
||||||
|
|
||||||
|
|
||||||
Bytes 40-55 - Level Key Scaling / Total Level
|
|
||||||
|
|
||||||
7 6 5 4 3 2 1 0
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
| Scaling | Total Level |
|
|
||||||
| Level | 24 12 6 3 1.5 .75 | <-- dB
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
|
|
||||||
bits 7-6 - causes output levels to decrease as the frequency
|
|
||||||
rises:
|
|
||||||
|
|
||||||
00 - no change
|
|
||||||
10 - 1.5 dB/8ve
|
|
||||||
01 - 3 dB/8ve
|
|
||||||
11 - 6 dB/8ve
|
|
||||||
|
|
||||||
bits 5-0 - controls the total output level of the operator.
|
|
||||||
all bits CLEAR is loudest; all bits SET is the
|
|
||||||
softest. Don't ask me why.
|
|
||||||
|
|
||||||
|
|
||||||
Bytes 60-75 - Attack Rate / Decay Rate
|
|
||||||
|
|
||||||
7 6 5 4 3 2 1 0
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
| Attack | Decay |
|
|
||||||
| Rate | Rate |
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
|
|
||||||
bits 7-4 - Attack rate. 0 is the slowest, F is the fastest.
|
|
||||||
bits 3-0 - Decay rate. 0 is the slowest, F is the fastest.
|
|
||||||
|
|
||||||
|
|
||||||
Bytes 80-95 - Sustain Level / Release Rate
|
|
||||||
|
|
||||||
7 6 5 4 3 2 1 0
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
| Sustain Level | Release |
|
|
||||||
| 24 12 6 3 | Rate |
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
|
|
||||||
bits 7-4 - Sustain Level. 0 is the loudest, F is the softest.
|
|
||||||
bits 3-0 - Release Rate. 0 is the slowest, F is the fastest.
|
|
||||||
|
|
||||||
|
|
||||||
Bytes A0-B8 - Octave / F-Number / Key-On
|
|
||||||
|
|
||||||
7 6 5 4 3 2 1 0
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
| F-Number (least significant byte) | (A0-A8)
|
|
||||||
| |
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
|
|
||||||
7 6 5 4 3 2 1 0
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
| Unused | Key | Octave | F-Number | (B0-B8)
|
|
||||||
| | On | | most sig. |
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
|
|
||||||
bit 5 - Channel is voiced when set, silent when clear.
|
|
||||||
bits 4-2 - Octave (0-7). 0 is lowest, 7 is highest.
|
|
||||||
bits 1-0 - Most significant bits of F-number.
|
|
||||||
|
|
||||||
In octave 4, the F-number values for the chromatic scale and their
|
|
||||||
corresponding frequencies would be:
|
|
||||||
|
|
||||||
F Number Frequency Note
|
|
||||||
16B 277.2 C#
|
|
||||||
181 293.7 D
|
|
||||||
198 311.1 D#
|
|
||||||
1B0 329.6 E
|
|
||||||
1CA 349.2 F
|
|
||||||
1E5 370.0 F#
|
|
||||||
202 392.0 G
|
|
||||||
220 415.3 G#
|
|
||||||
241 440.0 A
|
|
||||||
263 466.2 A#
|
|
||||||
287 493.9 B
|
|
||||||
2AE 523.3 C
|
|
||||||
|
|
||||||
|
|
||||||
Bytes C0-C8 - Feedback / Algorithm
|
|
||||||
|
|
||||||
7 6 5 4 3 2 1 0
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
| unused | Feedback | Alg |
|
|
||||||
| | | |
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
|
|
||||||
bits 3-1 - Feedback strength. If all three bits are set to
|
|
||||||
zero, no feedback is present. With values 1-7,
|
|
||||||
operator 1 will send a portion of its output back
|
|
||||||
into itself. 1 is the least amount of feedback,
|
|
||||||
7 is the most.
|
|
||||||
bit 0 - If set to 0, operator 1 modulates operator 2. In this
|
|
||||||
case, operator 2 is the only one producing sound.
|
|
||||||
If set to 1, both operators produce sound directly.
|
|
||||||
Complex sounds are more easily created if the algorithm
|
|
||||||
is set to 0.
|
|
||||||
|
|
||||||
|
|
||||||
Byte BD - Amplitude Modulation Depth / Vibrato Depth / Rhythm
|
|
||||||
|
|
||||||
7 6 5 4 3 2 1 0
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
| AM | Vib | Rhy | BD | SD | TOM | Top | HH |
|
|
||||||
| Dep | Dep | Ena | | | | Cym | |
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
|
|
||||||
bit 7 - Set: AM depth is 4.8dB
|
|
||||||
Clear: AM depth is 1 dB
|
|
||||||
bit 6 - Set: Vibrato depth is 14 cent
|
|
||||||
Clear: Vibrato depth is 7 cent
|
|
||||||
bit 5 - Set: Rhythm enabled (6 melodic voices)
|
|
||||||
Clear: Rhythm disabled (9 melodic voices)
|
|
||||||
bit 4 - Bass drum on/off
|
|
||||||
bit 3 - Snare drum on/off
|
|
||||||
bit 2 - Tom tom on/off
|
|
||||||
bit 1 - Cymbal on/off
|
|
||||||
bit 0 - Hi Hat on/off
|
|
||||||
|
|
||||||
Note: KEY-ON registers for channels 06, 07, and 08 must be OFF
|
|
||||||
in order to use the rhythm section. Other parameters
|
|
||||||
such as attack/decay/sustain/release must also be set
|
|
||||||
appropriately.
|
|
||||||
|
|
||||||
|
|
||||||
Bytes E0-F5 - Waveform Select
|
|
||||||
|
|
||||||
7 6 5 4 3 2 1 0
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
| unused | Waveform |
|
|
||||||
| | Select |
|
|
||||||
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
||||||
|
|
||||||
bits 1-0 - When bit 5 of address 01 is set, the output waveform
|
|
||||||
will be distorted according to the waveform indicated
|
|
||||||
by these two bits. I'll try to diagram them here,
|
|
||||||
but this medium is fairly restrictive.
|
|
||||||
|
|
||||||
___ ___ ___ ___ _ _
|
|
||||||
/ \ / \ / \ / \ / | / |
|
|
||||||
/_____\_______ /_____\_____ /_____\/_____\ /__|___/__|___
|
|
||||||
\ /
|
|
||||||
\___/
|
|
||||||
|
|
||||||
00 01 10 11
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
| Detecting a Sound Card
|
|
||||||
|
|
|
||||||
| According to the AdLib manual, the 'official' method of checking for a
|
|
||||||
| sound card is as follows:
|
|
||||||
|
|
|
||||||
| 1) Reset both timers by writing 60h to register 4.
|
|
||||||
| 2) Enable the interrupts by writing 80h to register 4. NOTE: this
|
|
||||||
| must be a separate step from number 1.
|
|
||||||
| 3) Read the status register (port 388h). Store the result.
|
|
||||||
| 4) Write FFh to register 2 (Timer 1).
|
|
||||||
| 5) Start timer 1 by writing 21h to register 4.
|
|
||||||
| 6) Delay for at least 80 microseconds.
|
|
||||||
| 7) Read the status register (port 388h). Store the result.
|
|
||||||
| 8) Reset both timers and interrupts (see steps 1 and 2).
|
|
||||||
| 9) Test the stored results of steps 3 and 7 by ANDing them
|
|
||||||
| with E0h. The result of step 3 should be 00h, and the
|
|
||||||
| result of step 7 should be C0h. If both are correct, an
|
|
||||||
| AdLib-compatible board is installed in the computer.
|
|
||||||
|
|
|
||||||
|
|
|
||||||
| Making a Sound
|
|
||||||
|
|
|
||||||
| Many people have asked me, upon reading this document, what the proper
|
|
||||||
| register values should be to make a simple sound. Well, here they are.
|
|
||||||
|
|
|
||||||
| First, clear out all of the registers by setting all of them to zero.
|
|
||||||
| This is the quick-and-dirty method of resetting the sound card, but it
|
|
||||||
| works. Note that if you wish to use different waveforms, you must then
|
|
||||||
| turn on bit 5 of register 1. (This reset need be done only once, at the
|
|
||||||
| start of the program, and optionally when the program exits, just to
|
|
||||||
| make sure that your program doesn't leave any notes on when it exits.)
|
|
||||||
|
|
|
||||||
| Now, set the following registers to the indicated value:
|
|
||||||
|
|
|
||||||
| REGISTER VALUE DESCRIPTION
|
|
||||||
| 20 01 Set the modulator's multiple to 1
|
|
||||||
| 40 10 Set the modulator's level to about 40 dB
|
|
||||||
| 60 F0 Modulator attack: quick; decay: long
|
|
||||||
| 80 77 Modulator sustain: medium; release: medium
|
|
||||||
| A0 98 Set voice frequency's LSB (it'll be a D#)
|
|
||||||
| 23 01 Set the carrier's multiple to 1
|
|
||||||
| 43 00 Set the carrier to maximum volume (about 47 dB)
|
|
||||||
| 63 F0 Carrier attack: quick; decay: long
|
|
||||||
| 83 77 Carrier sustain: medium; release: medium
|
|
||||||
| B0 31 Turn the voice on; set the octave and freq MSB
|
|
||||||
|
|
|
||||||
| To turn the voice off, set register B0h to 11h (or, in fact, any value
|
|
||||||
| which leaves bit 5 clear). It's generally preferable, of course, to
|
|
||||||
| induce a delay before doing so.
|
|
||||||
|
|
|
||||||
|
|
|
||||||
| Acknowledgements
|
|
||||||
|
|
|
||||||
| Thanks are due to the following people:
|
|
||||||
|
|
|
||||||
| Ezra M. Dreisbach (ed10+@andrew.cmu.edu), for providing the information
|
|
||||||
| about the recommended port write delay from the AdLib manual, and the
|
|
||||||
| 'official' method of detecting an AdLib-compatible sound card.
|
|
||||||
|
|
|
||||||
| Nathan Isaac Laredo (gt7080a@prism.gatech.edu), for providing the
|
|
||||||
| port numbers for stereo sound on the Sound Blaster Pro.
|
|
Loading…
Reference in a new issue