Yamaha OPK and OPK2 chips (YM7116 and YM7129) - research

This is just a small temporary page I kluged together regarding some info on these chips. Sorry for the mess.
As soon as I find my old papers, I am going to fix things and add a lot more here. An email from Japan I did got regarding the use of OPK chip prodded me into action, and here's some of the most vital stuff to get these chips to work - programmed from your own controller.
I've made a custom module prototype that does also MIDI drums on the OPK, but it's not much fun.
Those few good instruments on the synths that use this chip are unfortunately obtained by a constant updating of registers in OPK and not by the chip itself - meaning - to get good sounds out of it, you have to do additional LFO and envelope generators in software. This is done even in the ever-so-simple PSS-26.

Besides 8 channels of 2-op FM, OPK has built in drum rompler extension along with it's WaveROM. While otherwise similar, OPU (YM3420) does not have drum extension, whereas OPJ (YM7137) has much smaller WaveROM and only four short drum samples.

There are 256 registers, lower half of which is only for FM, and upper half is for extensions. Drum rompler extension uses first 5 bytes of it.

Drum WaveROM contains 65536 samples. As far as I remember, it's compressed with some kind of 4-bit DPCM to 32kbytes. There was also some kind of fade-out envelope built into playback engine of drum channels. Here's it's entire waverom: take a listen.

$80 pcm chan0
$81 pcm chan1
$82 pcm chan2
$83 pcm chan3
$84 trigger:  0 | 0 | 0 | 0 | trig_ch3 | trig_ch2 |trig_ch1 | trig_ch0  , active low

Accessing sequence example to play drums:
addr=$83 data=$81   <-- writing to channel 3 value $81 (bassdrum)
addr=$84 data=$07   <-- trigger, use idle 00001111 and then zero the bit of the channel(s) to trigger
addr=$84 data=$0F   <-- release trigger
addr=$82 data=$11 <-- snare
addr=$84 data=$0B
addr=$84 data=$0F
addr=$81 data=$25 <-- hihat closed
addr=$84 data=$0D
addr=$84 data=$0F
addr=$81 data=$34 <-- hihat open
addr=$84 data=$0D
addr=$84 data=$0F
addr=$80 data=$C2 <-- tom
addr=$84 data=$0E
addr=$84 data=$0F
addr=$80 data=$53 <-- ride
addr=$84 data=$0E
addr=$84 data=$0F

Trigger is held activated for at least 188uS.

Upper bit actually is a "slow playback" bit, that trigger the sample 2x slower - used for bass drum and tom.
Playback samplerate is about 37.29kHz for the "normal" speed and 18.65kHz for "slow".
Using other addresses gives some glitches and there was one fun address that plays the entire rom. Will dig up more precise info later on.

Chip initialization sequence (after power on/reset) is done this way:

addr=$01 data=$FF
addr=$12 data=$01
addr=$42 data=$0B
addr=$13 data=$01
addr=$43 data=$0B
addr=$16 data=$01
addr=$46 data=$0B
addr=$17 data=$01
addr=$47 data=$0B
addr=$1A data=$01
addr=$4A data=$0B
addr=$1B data=$01
addr=$4B data=$0B
addr=$1E data=$01
addr=$4E data=$0B
addr=$1F data=$01
addr=$4F data=$0B
addr=$2A data=$2D
addr=$2B data=$2D
addr=$2E data=$2D
addr=$2F data=$2D

Here's entire Yamaha PSS-26 demo song OPK/OPK2 bus access log, that you can use to verify functionality of your design. BIN data file can be played back using your own custom routine. Just read the file in byte quartets, and then use first two bytes as a timing, and then the following ones as address and data. I attached a txt file with transcription for looking through it manualy.
Yamaha PSS-26 demo song in full length - all bus accesses: ZIP file with BIN and TXT

If you build something interesting out of it, give a credit where it's due. Have fun ;-)

Vestigial remnants of the forked page are below. Those are going to be there for a while, until I update them into something visual about OPK.

Yamaha OPJ based custom sound module Custom sound module with OPJ on the left. Terrible short drums and 2-op, but oh well..
  • Overall

Page currently under development. As usual.