ESS AudioDrive (ES1868) - a surprisingly good ISA sound card

Discussion about old sound cards, MIDI devices and sound related accessories.

Re: ESS AudioDrive (ES1868) - a surprisingly good ISA sound card

Postby tanasen » 2018-10-23 @ 10:23

Bought this card for a very small price from ebay. It is the low profile version.


I like the FM sound a lot, but I have issues in games like Tomb Raider and Screamer 2 as this card seems to be incompatible. I use this card on my new socket 7 project and I'm really disappointed. Will check more games and if problems persist I might throw in another card.

edit: lol I found out that there was an IRQ conflict with a printer port so I changed the settings and everything works fine!
PC1:Pentium III 1000EB,Gigabyte GA-6VTXE,512MB SDRAM-133,Chaintech GeForce 2Ti 32MB , Creative Audio PCI CT4810, C-Media CMI8738
PC2:Pentium III 800,MSI MS-6178,256mb SDRAM,3DFX Voodoo 3 2000 PCI,Soundblaster Live! 5.1
User avatar
Posts: 75
Joined: 2017-3-22 @ 18:58

Re: ESS AudioDrive (ES1868) - a surprisingly good ISA sound card

Postby rainwarrior » 2019-2-23 @ 08:47

I'm very interested in this family of sound cards, especially the ESFM synthesizer.

I'm trying to find information about it, but its data sheets don't really describe anything about the extra FM features over OPL3 except for mentioning 20 voices instead of 18? I also can't seem to find any attempt to emulate it.

I intend to find these things out for myself (starting by disassembling ESFM.DRV) but if anyone knows anything useful about these chips I'd very much appreciate any knowledge that could get me closer to the goal of being able to emulate it!
User avatar
Posts: 9
Joined: 2018-7-13 @ 02:21
Location: Canada

Re: ESS AudioDrive (ES1868) - a surprisingly good ISA sound card

Postby » 2019-2-23 @ 13:39

I agree. I must admit that after the genuine OPL3 synth (or perfect clones), this is the next best thing.
But I would opt for the ES1869 over the ES1868 in newer builds as it also supports 48kHz record/playback.

As for the 20 channels, my understanding is that it is really only available in Windows or in games specifically designed for this series of chips. I'm not aware of any such games. I've only seen native support for the ES688 which uses an external synth, usually an OPL3.

In windows, is there a noticable difference in midi playback between the ESFM and an OPL3 chip ?
    Merlin: MS-4144, AMD5x86-160, 32MB, 16GB CF, ZIP100, ESS688, GUS, S3 VirgeGX 2MB, HardMPU
    Newton: K6XV3+/66, AMD K6-III+500, 256MB, 32GB SSD, AWE32, GUS 16MB, Voodoo3-3k
    Einstein: P8P400, P4-3GHz HT, 1.5GB, Quadro4 980XGL, Live!
User avatar
Posts: 425
Joined: 2017-12-13 @ 21:57
Location: Montreal

Re: ESS AudioDrive (ES1868) - a surprisingly good ISA sound card

Postby rainwarrior » 2019-2-23 @ 19:28

Yes, Windows MIDI playback is very different, and this is actually what I'm most interested in. It has its own driver, with different patches, and responds differently to control events.
User avatar
Posts: 9
Joined: 2018-7-13 @ 02:21
Location: Canada

Re: ESS AudioDrive (ES1868) - a surprisingly good ISA sound card

Postby badmojo » 2019-2-23 @ 20:58

I look forward to seeing what you discover. I've wondered at the Audiodrive support that some games offer - logically this would be preferable to choosing SB Pro but in the case of Warcraft II it sounds bloody awful in my experience, like being under water.

I've also found that using that option will work for me in pure DOS, but not in a Windows 9x dosbox, all very mysterious!
If it's broke, then fix it!
User avatar
Posts: 3168
Joined: 2011-10-11 @ 04:14
Location: Australia

Re: ESS AudioDrive (ES1868) - a surprisingly good ISA sound card

Postby Windows9566 » 2019-2-24 @ 05:42

I had a Pentium 100 430FX Socket 5 PC with 16 MB RAM, 256k L2 Cache, Cirrus Logic GD5430, ESS ES1868, and a seagate medalist 1.2gb HDD that ran Windows 95, too bad i sold it back in the day. I still have the medalist drive, i hooked it up to my main PC, hooked it up to a IDE/SATA to USB 2 adapter and my external hdd, then backed the contents up from the 1.5gb hdd to a .7z archive, it had a lot of my files on it so i had to keep the HDD and i backed up the files from the seagate medalist HDD just in case it died when i wanted to access the files in the future.
DOS PC - ASUS VX97, Pentium 133 P54C, 32 MB RAM, S3 Trio 64V+ 2MB, 20gb HDD and CF card, Gotek Floppy Emulator, Win95 OSR2.1
Win 98 PC - ASUS P2B, P3 500 MHz Katmai, 256 MB RAM, Geforce2 MX 400 64MB, 3dfx Voodoo 2 SLI, 40GB Hard Drive, Win98 SE
User avatar
Posts: 178
Joined: 2015-4-30 @ 14:55

Re: ESS AudioDrive (ES1868) - a surprisingly good ISA sound card

Postby rainwarrior » 2019-2-28 @ 09:37

Alright, I think I'm finished poring over the disassemblies for now. I'm still waiting for the hardware, but I think I've learned a lot about it from just inspecting the Windows FM drivers so far. I'll leave what I know at this point here, and will get back to it when I have my hands on the actual machine. Some of this is going to be about the hardware itself, and some of it will be just about the MIDI driver.

1. ESSFM.DRV 4.0.950 for ES1688 (source: my Windows 95 CD, CRC BCE1A309)
2. ESFM.DRV for ES1869 (source: here, CRC32 8F7EB956)

ESSFM.DRV was disappointing. It looked like a very minimal OPL3 and OPL2 compatible MIDI driver. The chip is in the flat melodic mode, so it has 9 or 18 2-op channels available.

Patches are in an embedded resource in the executable. Each patch is 28 bytes:
  • $00 - operator 0 opl3 $20
  • $01 - operator 0 opl3 $40
  • $02 - operator 0 opl3 $60
  • $03 - operator 0 opl3 $80
  • $04 - operator 0 opl3 $E0
  • $05 - operator 1 opl3 $20
  • $06 - operator 1 opl3 $40
  • $07 - operator 1 opl3 $60
  • $08 - operator 1 opl3 $80
  • $09 - operator 1 opl3 $E0
  • $0A-$13 - $00, presumably for an unused 4-op idea
  • $14 - $00, opl3 $A0 (replaced to be used for pitch)
  • $15 - $00, unused
  • $16 - $10, opl3 $B0 (replaced to be used for pitch)
  • $17 - $00, unused
  • $18 - voice opl3 $C0 (pan will be adjusted)
  • $19 - $00, unused
  • $1A - $02, unused
  • $1B - $00, unused

There is enough data for 256 patches. The first 128 are the regular instruments. The next 53 are percussion patches for channel 10 (starting at note 35). Each percussion note has a corresponding MIDI note pitch in a table in the first code segment at $0128 (2 byte entries: note pitch, then patch number, though the patch numbers just go from 0-53 anyway).

The driver responds to pitch bend, and a few controllers:
  • 7 Volume (coarse)
  • 8 Balance (coarse) - same as pan
  • 10 Pan (coarse) - hardpans with $30-50 in the centre
  • 123 All notes off (124-127 also trigger this)

Anyhow, that's a fairly complete description of what I found in ESSFM.DRV. When I was looking at some of the INF files with other ESS driver packages, I notice some of the later ones refer to this driver as something like "internal OPL2/OPL3 synthesis", rather than calling it "ESSFM" anymore, I think maybe because they'd called their newer enhanced version "ESFM" and wanted to reduce confusion about that.

ESFM.DRV was much more interesting. This is definitely not operating in OPL3 compatibility mode.

From the way it operates, it appears that the "20 voices" it mentions in its data sheet may all be 4-op voices? What I found indicates 18 voices, but 4-ops each (with some weirdness in the last 2 channels that might account for the other 2). So... if that's actually what this is, that's kind of incredible. It's not just an OPL3 with 2 more 2-op voices... I think it's more like some double OPL3 with 18 full 4-op voices!

In native mode the 4 registers seem to be reconfigured:
  • FM+0 - Read between other register writes for an appropriate delay, but otherwise should not be written to. (The data sheet claims that any write here will switch it into OPL3 emulation mode.)
  • FM+1 - Write data here.
  • FM+2 - Write low index here.
  • FM+3 - Write high index here.

Interfacing with this has a routine that does the following:
  • Write low index to FM+2
  • Read FM+0 2 times to delay
  • Write high index to FM+3
  • Read FM+0 6 times to delay
  • Write value to FM+1
  • Read FM+0 6 times to delay

So this interface is similar to OPL3 where you write an index to an internal register that you want to write, then send the data to it, with some delays in between, except the index is now a 16-bit value.

The voices and operators themselves, however, are arranged in a very flat, uniform manner. Registers $000-240 are divided into 8 registers per operator, 32 per voice.
  • Operator + 0 - OPL3 $20
  • Operator + 1 - OPL3 $40
  • Operator + 2 - OPL3 $50
  • Operator + 3 - OPL3 $80
  • Operator + 4 - OPL3 $A0
  • Operator + 5 - OPL3 $B0, but without the key-on bit.
  • Operator + 6 - OPL3 $C0
  • Operator + 7 - OPL3 $E0, but patches seem to use the upper bits?

So $00-$1F is 4 operators for voice 0. $20-3F is voice 1, etc.

For turning the voices on and off there is a dedicated set of registers. Write 1 to key on, 0 to key off. $240-24F each applies to voices 0-15.

Voice 16 and 17 seem to have two registers each for this. I don't really understand what this is for, they might be a special percussion device or something. So voice 16 gets $250 and $251, and voice 17 gets $252 and $253. At least, that's what this driver does. I'll need to investigate this more when I have the hardware. (My tentative guess is that the last two voices have their note-on split as 2-ops each, allowing them to be used as 4 2-op voices.)

This responds to more controllers than the other one:
  • 6 Data entry (coarse) - only used for pitch wheel sensitivity via registered parameter 0000 (see below)
  • 7 Volume (coarse) - a value of 0 will force all operator outputs attenuation to 63, otherwise it applies a per-operator attenuation described below.
  • 8 Balance (coarse) - same as pan
  • 10 Pan (coarse) - hardpans with $30-50 in the centre
  • 11 Expression (coarse) - affects the strength of some operators according to patch data
  • 64 Hold pedal
  • 98-99 Non-registered parameter - only used to cancel selection of registered parameter 0000
  • 100-101 Registered parameter - can be used to select the pitch wheel sensitivity parameter 0000
  • 120 All sound off
  • 121 All controllers off
  • 124,125 Omni mode off/on - seems to just stop all playing notes if not held by the hold pedal
  • 127 Poly operation - just does same as all sound off

Finally the patch data. This is also contained in a resource in the executable. This file starts with 256 2-byte pointer offsets (little-endian) to patches placed later in the resource. The first 128 correspond to the general MIDI instruments, and the next 128 correspond to each possible percussion note on channel 10. A pointer of $0000 indicates an empty instrument.

Patches themselves follow the pointer table at $0200. Each patch is 28 or 56 bytes. The 56 byte patches are a double patch, using 2 voices at once.
  • $00 - bit 0 = patch allowed on channel 16,17? bit 1-2 = patch type (see below). bits 4-7 can indicate a fixed pitch for each operator.
  • $01 - $00 unused
  • $02 - $00 unused
  • $03 - relative velocity for each operator
  • $04 - operator 0 OPL3 $20
  • $05 - operator 0 OPL3 $40 but output level may be adjusted based on $03
  • $06 - operator 0 OPL3 $60
  • $07 - operator 0 OPL3 $80
  • $08 - operator 0 OPL3 $A0 relative: bits 2-6 signed detune, bits 0-1 transpose low. fixed: direct value.
  • $09 - operator 0 OPL3 $B0 relative: bits 0-4 transpose high, signed. 5-7 signed octave transpose. fixed: direct value.
  • $0A - operator 0 OPL3 $C0 but the left/right bits are replaced by the channel's pan (if they aren't 0,0)
  • $0B - operator 0 OPL3 $E0 but seems to use the upper bits too? Not sure what for.
  • $0C-13 - operator 1
  • $14-1B - operator 2
  • $1C-23 - operator 3
  • $24-47 - second voice (optional)

So these are pretty interesting patches, and it indicates that each operator has its own pitch control rather than combining them in pairs like OPL3/OPL2 did. I'm not entirely sure where the FM algorithm selection bits are placed, since these are a bit reordered vs OPL3. There might even be extra algorithms available?

Patch byte $00 bits 1-2 indicate 3 kinds of patches: 0 = 1 voice, 1 = 2 voice but the second will be dropped if out of voices, and 2 = 2 voices but the second must always play. A value of 3 is invalid and will skip the note.

Patch byte $00 bit 0 seems to indicate whether or not the patch may use voice 16 or 17, but I don't understand how these two voices are supposed to work, or why they have 2 note-on registers each.

Patch byte $00 bits 4-7 each indicate that an operator might have a fixed pitch instead of a MIDI note relative pitch. Bit 4 for operator 0, bit 5 for operator 1, etc. If set these sill use the values in the patch directly, and will not be affected by the pitch wheel.

Patch byte $03 contains 4 2-bit values, each is a different mode for adjusting the output attenuation of the operator. Bits 0-1 for operator 0, bits 2-3 for operator 1, etc. This lets you choose individually which operators are controlled by note velocity (and it also applies to the same adjustments from the volume controller and expression controller). On a normal instrument you want attenuation for velocity on any output operator, but modulating operators you probably wouldn't unless you want the timbre to dull as the velocity drops. These four modes (0, 1 light, 2 medium, 3 strong but with a taper) all calculate a value to add to the logarithmic attenuation parameter.
  • 0 - 0
  • 1 - (127-v)/16
  • 2 - (127-v)/8
  • 3 - (v>=64)?((127-v)/4):(((63-v)/2)+16)
Note velocity, volume control, and expression each separately apply this forumula and get added to the base output attenuation, which clamps at 63. An exception is made for volume control of 0, which forces all operators' attenuation to 63.

Okay, I think that's everything I know from the drivers. There seem to be a lot of versions of both of these drivers, but hopefully other versions will be similar. The implication that it has 72 or maybe 80 operators instead of just 36 is pretty radical! Am excited to get to try out the real thing once it gets here.
Last edited by rainwarrior on 2019-2-28 @ 13:39, edited 3 times in total.
User avatar
Posts: 9
Joined: 2018-7-13 @ 02:21
Location: Canada

Re: ESS AudioDrive (ES1868) - a surprisingly good ISA sound card

Postby rainwarrior » 2019-2-28 @ 11:02

I found a 1996 ESS Technology patent for FM synthesis. Not sure if there's anything in here that would really help this reverse engineering, but just in case it's useful (and for reference in case I need it later).

US Patent 5,581,045
December 3, 1996
(424.53 KiB) Downloaded 15 times
User avatar
Posts: 9
Joined: 2018-7-13 @ 02:21
Location: Canada

Re: ESS AudioDrive (ES1868) - a surprisingly good ISA sound card

Postby appiah4 » 2019-2-28 @ 12:18

Fascinating. I hope someone puts this to good use :)
User avatar
Posts: 3471
Joined: 2017-2-19 @ 07:36

Re: ESS AudioDrive (ES1868) - a surprisingly good ISA sound card

Postby gerwin » 2019-3-15 @ 23:03

Good digging there rainwarrior!

Since this seems to be the ESS ISA general discussion here, I have some remarks and a question regarding an ES1688/968 based card. Picture is attached.
I would expect this card to work with the same ESSCFG as my other ES1688 card, but that gave only partial success. On a PnP enabled motherboard it indeed gets recognized by the usual ESSCFG, but on my 486 motherboard it says "Unable to find ES688, ES1688, or ES1788" every time.
Now I found out about the existence of a file called ES968.COM, and did some searching. There are DOS drivers around with ES968.COM included and although Device driver ES968.COM is seemingly not mandatory, the ESSCFG file that accompanies it does recognize my sound card. Like this ESSCFG on this FTP server which is labelled "2.8 for ES968 + ES1688". Works fine now: SBPro Digi, ESS Digi, FM Music, Midi Music (with DB) :)

MWMENU.txt on the same FTP server says this:
ES968.COM is a device drive to initialize the sound card.
ESSCFG.EXE is a utilities to configure the sound card parameter.
ESSVOL.EXE is a utilities to configure the volume of the sound card.
ES968.COM utilities is needed to initialized the sound card to
enable or disable the on-board secondary port IDE interface.

After this installation, please edit the config.sys and ensure
that the ES968.COM is loaded before the ATAPI CD-ROM MSDOS driver.
Ensure also that the parameter /c:e is used.

There are no configuration jumpers on this particular card. According to the CN3 header next to the wavetable header is a mixer expansion interface. This is also kinda strange since the ES968 mixer expansion is already soldered on. I suppose that is why these two jumpers are on CN3.

The remaining question is, are the ES968 mixer enhancements usable in DOS?
User avatar
Posts: 2683
Joined: 2004-5-07 @ 19:21
Location: NL

Re: ESS AudioDrive (ES1868) - a surprisingly good ISA sound card

Postby cde- » 2019-6-11 @ 10:44 wrote:But I would opt for the ES1869 over the ES1868 in newer builds as it also supports 48kHz record/playback.

So I'm trying to understand the importance of 48 KHz as opposed to cards that only support the classic 44.1 KHz. Is it really important for newer games? I currently have a ES1868F and I like it a lot, haven't run into any issues/incompatibilities, it is pretty much perfect.

By the way an interesting piece of historical information wrt 44.1 Khz vs 48 Khz, from ... -DVD-specs:

44KHz was a compromise to fit a 74 minute symphony or opera on an uncompressed 650MB CD.

When CD was developed, studios were mostly using analog paths with some digital processing. Pro digital audio standardized later on 48KHz sampling.

44KHz has a Nyquist cutoff of 22KHz but requires a more expensive analog low pass filter before A/D. This isn't much of a problem for CD Mastering labs but the little digital guy wanted more sampling headroom so that less sharp, less expensive low pass filters could be used.

So I suppose when playing a DVD a strong enough CPU will be needed to convert 48 KHz to 44.1 KHz if the card doesn't support 48 KHz.

Also relevant: ... is-better/
Posts: 33
Joined: 2019-5-14 @ 10:43


Return to Sound

Who is online

Users browsing this forum: BloodyCactus and 2 guests