• Please review our updated Terms and Rules here

IBM Music feature card

Erik

Site Administrator
Staff member
Joined
Apr 27, 2003
Messages
3,588
Location
San Jose, CA
The IBM Music Feature Card (IMFC) is a Yamaha FB-01 MIDI synth module with a software interface on a full-length 8-bit ISA board. It sold for ~$600 USD in 1987, and were targeted as a MIDI interface for music professionals. Sierra eventually decided to support it, and the IMFC has since then been defined as a sound-card by the vast majority of people who have heard about it.
Only certain games made by Sierra supports the IMFC, but quite a few of the example tunes are not optimized to really take full advantage of the card's abilities. Most tunes were originally composed for the Roland MT-32, and little effort has been made to port them to the IMFC.
Many users find the IMFC/FB-01 to sound cheesy, problably due to the nature of FM synthesisis with sinewaves at medium/high frequencies. However; if an external reverb box is applied to the output signal, it heavily improves the listening experience. Due to the nature of FM synthesisis with sinewaves at low frequencies, the FB-01 is famous for it's bass sound. The FB-01 is also famous for it's ability to produce metallic sounds.
Several cards can be placed within the same system for more voices, but an external mixer is then required to combine the sound outputs from all the cards.
[h="2"]Software Interface[/h]
The software interface consist of two unidirectional 9-bit databusses, misc status lines, and three programable timers combined into 2 Interrupt generators. All of those functions are controlled by regular I/O ports.
[h="3"]Communication[/h]
The two databusses are used to send and receive MIDI and control commands to/from the synth module. The MIDI commands controls the audio generated, while the control commands controls the operation mode of the synth module. The status lines are used for interrupt control. This includes the error line from the synth module, and various other lines used durning data transfer.
[h="3"]Timers[/h]
The timers are used to generate interrupts at a fixed interval. Two of the timers are combined into one generator, while the remaining timer is not combined with anything. Those timers work just the same way as the 8253 in the regular PC. The timing range for the generators are from 2uS to 2147418112.5uS (35.790301875 minutes) for the two combined timers, and from 4uS to 131070uS (0.13107 seconds) for the remaining generator.
[h="2"]Synth module[/h]
The synth module is a Yamaha FB-01 MIDI synthisizer. Like the core of the IBM [wiki]PGC[/wiki], it consist of a small dedicated computer runing a predefined program stored in a ROM chip. In this case it's driven by a 6MHz Z80 CPU with it's own ROM and RAM, connected to a parallel comunications center, a serial comunications center, and the Yamaha YM2164 (OPP) FM synth chip.
[h="3"]Presets[/h]
The synth module comes preset with 5 banks of voices. Each bank contains 48 individual voices, which makes a total of 240 preset voices. In addition, there are 2 banks of (a total of 96) custom programable voices. There are 4 preset MIDI configurations, and a total of 16 custom programble configurations. All custom voices/configurations are stored in RAM, thus ereased when power is turned off.
[h="3"]Communication[/h]
There are two comunication centers in the synth module. There is a parallel center for the two unidirectional 9-bit parallel databusses used by the software interface described above, and there is a serial comunications centre used to comunicate with external MIDI devices connected through the DIN breakout box. both comunication centers leads to a pair of FIFO buffers. In "thru" mode, the FIFOs are set to directly forward MIDI commands between the parallel and serial comunication centers, and in this mode no MIDI commands are interpreted by the synth module.
[h="3"]The OPP FM synth chip[/h]
The Yamaha YM2164 FM Operator Type-P (OPP) is an 8-channel synthesizer with 4 operators per channel. It's almost identical to the YM2151, but without the noise mode for op4 of channel 8. The OPP also has some enhancements over the YM2151, most notably 128 levels of stereo in comparasion to only 3. Every channel can be arranged in 8 differnt ways, and each operator is capable of producing a sinewave. The OPP got some other functions like a Low-Frequency-Osciolator (LFO) used to modulate either the pitch (vibrato) or amplitude (tremolo). The waveform of the LFO is changeable between 4 different waveforms (one of them being the only available noise generator), and it's frequency ranges from 0.009Hz to 59Hz. The chip also got other misc functions like envelope, detune, deharmonizing, timers, etc...
[h="2"]Programming[/h]
The software interface of the card is programmable. It's done by regular I/O, and each card has 16 I/O ports mapped into the I/O-map of the host system. The base address is determined by SW1 on the IMFC.
SW1 settings:
Card number SW1/1 SW1/2 Base address
N/A* Off Off 2A00*
N/A* On Off 2A10*
1 Off On 2A20
2 On On 2A30

(* Theoretcally most logical option; no data is present in the manual about this)
[h="3"]Registers[/h]
The 16 I/O ports on the card is the only way the host computer can comunicate with the card, through 10 8-bit registers.
I/O ports:
Offset Register
0 PIU0
1 PIU1
2 PIU2
3 PCR
4 CNTR0
5 CNTR1
6 CNTR2
7 TCWR
8 TCR
9-B TCR mirror
C TSR
D-F TSR mirror
[h="4"]Parallel Interface Unit (PIU)[/h]
The function of this unit is roughly described above. On reads and writes, bit 8 is used to indicate if the data sent is MIDI/non-MIDI data (0) or a special Music-Card message (1). On writes, bit 7 is used to indicate if it's a status command (1) or data following a previous sent status command (0).
PIU0 - Read only
+-+-+-+-+-+-+-+-+
|7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+
^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | |
+-+-+-+-+-+-+-+-> Bit 0-7 of data sent from the synth module to the host computer
Bit 7 of PIU2 should be read before reading from this register

PIU1 - Write only
+-+-+-+-+-+-+-+-+
|7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+
^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | |
+-+-+-+-+-+-+-+-> Bit 0-7 of data sent from the host computer to the synth module
Bit 4 of TCR should be written before writing to this register

PIU2 - Read only
+-+-+-+-+-+-+-+-+
|7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+
^ ^ ^ ^ ^
| | | | |
| | | | +-> Transmitter ready (TxRDY)
| | | +
-> TxRDY interrupt enabled status (WIE)
| | +
---> Receiver ready (RxRDY)
| +

-> RxRDY interrupt enabled status (RIE)
+


---> Bit 8 of data sent from the synth module to the host computer

PCR - Write only
+-+-+-+-+-+-+-+-+
|7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+
^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | |
v v v v v v v v
0 0 0 0 0 1 0 0 -> Disable interrupt on TxRDY
0 0 0 0 0 1 0 1 -> Enable interrupt on TxRDY
0 0 0 0 1 0 0 0 -> Disable interrupt on RxRDY
0 0 0 0 1 0 0 1 -> Enable interrupt on RxRDY
1 0 1 1 1 1 0 0 -> Initialize PUI
[h="4"]Programmable Interval Timer (PIT)[/h]
The IMFC contains an Intel 8253-compatible general purpose timing device to generate interrupts at a fixed rate. Counter 0 is used as timer A, while counter 1 (sourced by counter 2) is used as timer B. Both counter 0 and 1 should be set to mode 2, while counter 2 should be set to mode 3. See the Intel 8253 datasheet for more details.
CNTR0
+-+-+-+-+-+-+-+-+
|7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+
^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | |
+-+-+-+-+-+-+-+-> Frequency divisor for counter 0 (source: 500KHz)

CNTR1
+-+-+-+-+-+-+-+-+
|7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+
^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | |
+-+-+-+-+-+-+-+-> Frequency divisor for counter 1 (source: timer 2 output)

CNTR2
+-+-+-+-+-+-+-+-+
|7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+
^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | |
+-+-+-+-+-+-+-+-> Frequency divisor for counter 2 (source: 2MHz)

TCWR
+-+-+-+-+-+-+-+-+
|7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+
^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | |
+-+-+-+-+-+-+-+-> Timer control (see Intel 8253 datasheet for details)
[h="4"]Total control[/h]
The total control registers are used to manage the interrupt flags of the software interface.
TCR - Write only
+-+-+-+-+-+-+-+-+
|7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+
^ ^ ^ ^ ^ ^ ^
| | | | | | |
| | | | | | +-> Timer A Interrupt clear (/TAC, active low)
| | | | | +---> Timer B Interrupt clear (/TBC, active low)
| | | | +
-> Timer A Interrupt enable (TAE)
| | | +
---> Timer B Interrupt enable (TBE)
| | +

-> Bit 8 of data sent from the host computer to the synth module
| +


-> Global Interrupt enable (/TMSK)
+


---> Enable IRQ output (IBE)

TSR - Read only
+-+-+-+-+-+-+-+-+
|7|6|5|4|3|2|1|0|
+-+-+-+-+-+-+-+-+
^ ^ ^
| | |
| | +-> Timer A Interrupt status (TAS)
| +---> Timer B Interrupt status (TBS)
+


---> Global Interrupt status (TCS)
[wiki]Category:ISA cards[/wiki]
 
The IBM Music Feature Card (IMFC) is a Yamaha FB-01 MIDI synth module..

So are you quoting from an IBM tech ref? Or is it from a wiki?

I think I recently came across a Music Feature tech ref, but since it is ISA, it is not my cuppa Joe.

Somehow, $70 sticks in my head...
 
The IBM Music Feature Card (IMFC) is a Yamaha FB-01 MIDI synth module with a software interface on a full-length 8-bit ISA board.

The IBM Music Feature Card is *almost* a Yamaha FB-01 MIDI synth module.
They both use the same basic hardware, but the firmware in the IMFC is slightly different, leading to some slight differences in the default configuration of instruments, and the IMFC also supports some SysEx commands that the FB-01 does not (however, these can be translated to FB-01 compatible ones).
 
I don't know if anyone had tested this already, but i finally got time and checked the undocumented I/O port selections.

Turns out that SW1 when in OFF OFF positions actually decodes port 2A40h not 2A00h. So logically i tested the next ON OFF position and it is 2A50h.

Sorry for the necro, but this is relevant information i think.

I should add that this was tested on a old IBM MFC, the one with the EPROM instead of the new revision found with a mask ROM instead.
 
Back
Top