// Mote Prime - Article

Mote Prime

A personal website

Articles

Atheism

Competitions

Humour

Paranonsense

Politics

Science

Technology

Links

Atheism

Humour

Paranonsense

Reviews

Science

Technology

About

Mote Prime

Author

Other Sites

OfQuack Podcasts

H:MC18

Little Book of Clam

Ads

Stop the Saatchi Bill

free debate

10:23

Mote Prime > Technology

Casio CZ101 MIDI Guide

Originally a USENET article (from sometime in 1985, before the Great Renaming), detailing the MIDI messages available on the Casio CZ101 MIDI synthesiser.

For web publication, I have changed some of the formatting of this post, but not the content. Much of the formatting for tables relies on using monospaced fonts, so I have kept most of the post in this form.


CASIO CZ MIDI GUIDE condensed version

or: Everything you Never Wanted to Know about MIDI but are Going to Find Out Anyway

THIS IS AIMED SPECIFICALLY AT CZ101,CZ1000 and CZ5000 OWNERS.

NOTE: I beleive the data given to me by Casio to be a) correct, and b) public domain ( since they just give it to you if you are persistent enough).

Please forgive spelling, syntactic, or grammatical errors since I am trying to condense the manual as I go along...

Right, at long last, I have been able to get a reply out of CASIO UK about the MIDI standards of the CZ series of synthesizers. For those of you who know how to play your keyboard by remote control from a computer, this will be of some interest, since it covers transmission of programming information ( both to and from the CZ ), setting of the controllers you previously couldn't access like tone mix level, and other bits besides.

BASIC MIDI MESSAGES

First off, let's recap on the simple stuff. The MIDI is a digital interface to musical instruments, and relies on serial transmission of data. These data are usually talked of in terms of bytes, and I shall be using hexadecimal numbers in this posting.

There are basically two types of bytes sent over MIDI - control bytes and data bytes. Control bytes are distinguished by having values over 0x80 (80 hex, 128 decimal), and these have valious meanings:

1) NOTE ON

A note on message consists of sending a "NOTE ON" control byte, the note number you want to turn on, and the velocity at which you want to play the note. The note on control is 90 plus the channel number. So, for example, if you want to play note 32 (= hex 20) at speed 64 (= hex 40), on the midi instrument receiving on channel two, then you would send:

	        92              20              40
	NOTE ON, channel 2      Note #32        Velocity 64

If you wish to turn two or more notes on at the same time, the control byte need not be retransmitted. Eg to turn note 35 on as well, you could send

	        92      20      40      23      40
	NOTE ON, ch2    ---32 on--      ---35 on--

These codes can be transmitted both ways on all the CZ 101,1000,5000, but since they do not detect note velocity, it is always transmitted and recognized as 64 (= 40 hex).

2) NOTE OFF

Just send a note on message with velocity 0. Eg to turn note 35 off, send

	        92      23      00
	NOTE ON,Ch 2    --35 off--

3) CONTROL CHANGE

There are several controls that can be set from MIDI. Just send a "CONTROL CH" byte, which is B0 plus the channel number, the number of the control that you wish to change, then the value you wish to set it to. Eg for CZ101 portamento time, send

	        B0      05      10
	CONTROL, ch 0   --ctrl 5=16--

The controls are:

	CZ101/1000
	
	01      Vibrato on/off          Send 0 for off, 7F for ON
	05      Portamento time         Send number 00..63 (0..99)
	06      Master tune             Send number 00..7F
	41      Portamento on/off       Send 0 for OFF, 7F for ON
	
	CZ5000
	
	01      Modulation wheel        Send number 00..7F
	05      Portamento time         Send number 00..63
	06      Master tune             Send number 00..7F
	40      Sustain pedal           Send 0 for OFF, 7F for ON
	41      Portamento on/off       Send 0 for OFF, 7F for ON

4) PROGRAM CHANGE

This allows you to change between the preset sounds ( and your internal sounds and cartridges ). Just send C0 plus the channel number, then the program number. Eg to set CZ101 on channel 1 to Synth Bass:

	        C1              07
	PROGRAM ch 1            Program 7

Note that the preset tones are given numbers :

	CZ101/1000
	
	0..0F   Preset sounds 1..16
	20..2F  Internal sounds 1..16
	40..4F  Cartridge sounds 1..16
	
	CZ5000
	
	00..1F  Preset sounds A1,A2,A3....D6,D7,D8
	20..3F  Internal sounds A1,A2.....D6,D7,D8

5) PITCH BEND CHANGE

This is acheived by sending E0 plus the channel number, then two bytes denoting the new value of pitch bend. The first byte is the most significant, and the second the least significant. Note also that the lower 6 bits of the lower byte are not used, and that the central position of the wheel corres- ponds to the byte sequence 40 00.

	HIGHEST         7F 40
	HIGHER
	CENTER          40 00
	LOWER
	LOWEST          00 00

So, to bend the instrument on channel two UP by about half its maximum amount, send

	        E2              60      00
	BEND channel two        ---1/2 up--

6) AFTER TOUCH

Is not supported on the CZ101/1000/5000. Sorry!

7) MODE CHANGE

This is very similar to the CONTROL CHANGE message, and can be regarded as a special case.

	OMNI ON         send E0 + channel, 7D, 00
	OMNI OFF        send B0 + channel, 7C, 00
	POLY ON         send B0 + channel, 7F, 00
	POLY OFF        send B0 + channel, 7E, 00

OMNI mode plays any MIDI data received at the MIDI IN plug on the back of the machine, regardless of channel. POLY mode is equivalent to the SOLO button on the front panel. With the CZ101, for instance, POLY OFF ( =SOLO ) allows the synth to be used as four monophonic synthesizers under remote control.

	LOCAL ON        send B0 + channel, 7A, 7F
	LOCAL OFF       send B0 + channel, 7A, 00

Local mode means that the keyboard is "connected" to the sound producing part of the CZ within the machine itself. With LOCAL ON ( the default setting ), playing the keyboard both sends note messages out of the MIDI port, and also makes sounds at the same time. If you want to do wierd things like keyboard splitting, LOCAL OFF will allow you to see what the keyboard is doing without the CZ making any sound at all. You could then act on that information and send the keyboard a command depending on the keys that has nothing to do with them, eg program change or pitch bend. The possibilities are endless !

SEQUENCER MESSAGES

The CZ5000 has its own internal sequencer, which can be controlled by:

	F8      Clock byte: transmitted 24 times per quarter note ( crotchet )
	FA      Start: same as pressing the PLAY button
	        on the front panel
	FB      Continue: continue song where last stopped
	FC      Stop: stops song play at current position
	FD      Active sense: basically, a cry of "Is there anybody out
	        there?" If no reply is received within about 1/3 second,
	        it shuts the voice off.

SYSTEM EXCLUSIVE MESSAGES

At last, the really meaty stuff. :-)

These all have the basic form:

	        F0      machine ID      some bytes      F7
	SYS EX MESSG    YES, YOU        DO THIS         END OF SYS EX

Ok, so not very specific, bu that was deliberate to allow manufacturers to use all the lovely bells and whistles they put on their machine over the MIDI !

Since these are usually controlled by computer, I have set them out as a computer/synthesizer dialogue. Note that the computer MUST wait for replies before proceding, or all will fail !

Here we go, then

1) SET BEND RANGE

	Computer:       F0 44 00 00 70+channel 40 data F7

Eg to set bend range to 8 on channel 4, send

	F0 44 00 00 74 40 08 F7

2) KEY TRANSPOSE

	Computer:       F0 44 00 00 70+channel 41 data F7

Data is as follows:

	Key:    G  A  A# B  B# C  C# D  E  E# F  F#
	Data:   45 44 43 41 41 00 01 02 03 04 05 06

Eg to set key on channel 0 to C#, send

	F0 44 00 00 70 41 01 F7

3) TONE MIX

	Computer:       F0 44 00 00 70+channel 42 data F7

The data is 00 to turn tone mix off, or 41..49 for mix level 1..9

Eg to set tone mix on channel 0 to 7, send

	F0 44 00 00 70 42 47 F7

4) ASK ABOUT PROGRAMMER ( Send request 2 )

	Computer:       F0 44 00 00 70+channel 19 00
	CZ101/1000:     F0 44 00 00 70+channel 30
	Computer:       70+channel 31
	CZ101/1000:     data1 data2 F7
	Computer:       F7

data1 is the program selected ( see PROGRAM CHANGE )

data2 returns the vibrato/portamento on/off setting:

	data2   00      10      20      30
	Vibrato OFF     OFF     ON      ON
	Port'o  OFF     ON      OFF     ON

Eg an exchange such as

	Computer:       F0 44 00 00 70 19 00    "Want data on channel 0"
	CZ101:          F0 44 00 00 70 30       "Gotcha.. data ready"
	Computer:       70 31                   "Ok, give it to me"
	CZ101:          27 30 F7                "Internal 8, v on, p on"
	Computer:       F7

REMOTE PROGRAMMING

The send request 1 and receive request 1 messages.

These dump a lot of data across the MIDI, which is the same for both messages, except that the data go the other way. The exchanges are:

Send request

	Computer:       F0 44 00 00 70+channel 10 program
	CZ101/1000:     F0 44 00 00 70+channel 30
	Computer:       70+channel 31
	CZ101/1000:     tone data F7
	Computer:       F7

Receive request

	Computer:       F0 44 00 00 70+channel 20 program
	CZ101/1000:     F0 44 00 00 70+channel 30
	Computer:       tone data F7
	Cz101/1000:     F7

The program byte is the same as that set by the PROGRAM CHANGE function, with the addition that you can request the temporary sound area as well ( number is 60 ). This is the area that is used if you have altered a preset and not saved it into internal memory.

The tone data is a sequence of 256 bytes containing a LOT of info. Now Casio have done a lot of funny things with these, like splitting bytes in half and encoding things in weird ways so please bear with me.

To keep everything this side of infinite length, I shall adopt the same strategy as the manual, which is to write data in bytes, although they are transmitted in half- bytes. For example, me writing a byte as 5F requires you to transmit or receive as 0F 05 ( weird, huh ? ). This will obviously save a lot of space.

So, here goes again :-)

There are 25 distinct sections within

	Sec#    Length  Symbol          Contents
			(bytes)
	
	1       1       pflag           line select data, octave range
	2       1       pds             detune up or down
	3       2       pdl,pdh         detune range
	4       1       pvk             vibrato wave number
	5       3       pvdld,pvdlv     vibrato delay time
	6       3       pvsd,pvsv       vibrato rate
	7       3       pvdd,pvdv       vibrato depth
	8       2       mfw             dco1 waveform
	9       2       mamd,mamv       dca1 key follow
	10      2       mwmd,mwmv       dcw1 key follow
	11      1       pmal            end step number of dca1 envelope
	12      16      pma             dca1 envelope rate/level
	13      1       pmwl            end step number of dcw1 envelope
	14      16      pmw             dcw1 envelope rate/level
	15      1       pmpl            end step number of dco1 envelope
	16      16      pmp             dco1 envelope rate/level
	17      2       sfw             dco2 waveform
	18      2       samd,samv       dca2 key follow
	19      2       swmd,swmv       dcw2 key follow
	20      1       psal            end step number of dca2 envelope
	21      16      psa             dca2 rate/level
	22      1       pswl            end step number of dcw2 envelope
	23      16      psw             dcw2 rate/level
	24      1       pspl            end step number of dco2 envelope
	25      16      psp             dco2 rate/level

1) PFLAG

Looking at bits,

	    0000  00   00
	Not used OCTV  LS

OCTV controls octave range: 00=octave 0, 01=+1, 10=-1

LS is the line select: 00=1, 01=2, 10=1+1', 11=1+2'

So, for Octave +1, line select 1+1', PFLAG=00000110 = 06

2)PDS

For detune +, PDS is 0, for detune - it is 01

3)PDETL,PDETH

Two bytes controlling the depth of the detune. The first byte is the FINE data.

	FINE:   0..15   16..30  31..45  46..60
	Byte:   00..0F  11..1F  21..2F  31..3F

The second contains both the octave and note data:

	OCT:    0       1       2       3
	NOTE:   0..11   0..11   0..11   0..11
	Byte:   00..0B  0C..17  18..23  24..2F

4) PVK

This is the vibrato wave number, encoded as follows

	
	WAVE NUMBER:    1       2       3       4
	Byte:           08      04      20      02

5) PVDLD,PVDLV

This is the vibrato delay time, transmitted in three bytes.

	Delay   Bytes           Delay   Bytes           Delay   Bytes
	25      19 00 19        50      32 00 4B        75      4B 00 DF
	26      1A 00 1A        51      33 00 4F        76      4C 00 E7
	27      1B 00 1B        52      34 00 53        77      4D 00 EF
	28      1C 00 1C        53      35 00 57        78      4E 00 F7
	29      1D 00 1D        54      36 00 5B        79      4F 00 FF
	30      1E 00 1E        55      37 00 5F        80      50 01 0F
	31      1F 00 1F        56      38 00 63        81      51 01 1F
	32      20 00 21        57      39 00 67        82      52 01 2F
	33      21 00 23        58      3A 00 6B        83      53 01 3F
	34      22 00 25        59      3B 00 6F        84      54 01 4F
	35      23 00 27        60      3C 00 73        85      55 01 5F
	36      24 00 29        61      3D 00 77        86      56 01 6F
	37      25 00 2B        62      3E 00 7B        87      67 01 7F
	38      26 00 2D        63      3F 00 7F        88      58 01 8F
	39      27 00 2F        64      40 00 87        89      59 01 9F
	40      28 00 31        65      41 00 8F        90      5A 01 AF
	41      29 00 33        66      42 00 97        91      5B 01 BF
	42      2A 00 35        67      43 00 9F        92      5C 01 CF
	43      2B 00 37        68      44 00 A7        93      5D 01 DF
	44      2C 00 39        69      45 00 AF        94      5E 01 EF
	45      2D 00 3B        70      46 00 B7        95      5F 01 FF
	46      2E 00 3D        71      47 00 BF        96      60 02 1F
	47      2F 00 3F        72      48 00 C7        97      61 02 3F
	48      30 00 43        73      49 00 CF        98      62 02 5F
	49      31 00 47        74      4A 00 D7        99      63 02 7F

For delays in the range 0..31, just transmit 00..1F, 00, 00..1F eg for delay of 12, send 0C 00 0C. This is convenient since it saves me typing in another column of boring numbers ;-)

6) PVSD,PVSV

Again, here comes another table for conversions. The first column (0..24) is omitted since the only difficult thing needed is to add 01 00 20 to each entry ( The first few go 00 00 20, 01 00 40, 02 00 60, ... 06 00 E0, 07 01 00, ..)

	Rate    Bytes           Rate    Bytes           Rate    Bytes
	25      19 03 40        50      32 09 E0        75      4B 1C E0
	26      1A 03 60        51      33 0A 60        76      4C 1D E0
	27      1B 03 80        52      34 0A E0        77      4D 1E E0
	28      1C 03 A0        53      35 0B 60        78      4E 1F E0
	29      1D 03 C0        54      36 0B E0        79      4F 20 E0
	30      1E 03 E0        55      37 0C 60        80      50 23 E0
	31      1F 04 00        56      38 0C E0        81      51 25 E0
	32      20 04 60        57      39 0D 60        82      52 27 E0
	33      21 04 A0        58      3A 0D E0        83      53 29 E0
	34      22 04 E0        59      3B 0E 60        84      54 2B E0
	35      23 05 20        60      3C 0E E0        85      55 2D E0
	36      24 05 60        61      3D 0F 60        86      56 2F E0
	37      25 05 A0        62      3E 0F E0        87      57 31 E0
	38      26 05 E0        63      3F 10 60        88      58 33 E0
	39      27 06 20        64      40 11 E0        89      59 35 E0
	40      28 06 60        65      41 12 E0        90      5A 37 E0
	41      29 06 A0        66      42 13 E0        91      5B 39 E0
	42      2A 06 E0        67      43 14 E0        92      5C 3B E0
	43      2B 07 20        68      44 15 E0        93      5D 3D E0
	44      2C 07 60        69      45 16 E0        94      5E 3F E0
	45      2D 07 A0        70      46 17 E0        95      5F 41 E0
	46      2E 07 E0        71      47 18 E0        96      60 47 E0
	47      2F 08 20        72      48 19 E0        97      61 4B E0
	48      30 08 E0        73      49 1A E0        98      62 4F E0
	49      31 09 60        74      4A 1B E0        99      63 53 E0

7) PVDD,PVDV

These are again encoded as three bytes in a most obscure way. Below 32, the encoding is 00..1F, 00, 01..20 eg for depth 13, send 0D 00 0E.

	Depth   Bytes           Depth   Bytes           Depth   Bytes
	25      19 00 1A        50      32 00 4F        75      4B 00 E7
	26      1A 00 1B        51      33 00 53        76      4C 00 EF
	27      1B 00 1C        52      34 00 57        77      4D 00 F7
	28      1C 00 1D        53      35 00 5B        78      4E 00 FF
	29      1D 00 1E        54      36 00 5F        79      4F 01 07
	30      1E 00 1F        55      37 00 63        80      50 01 1F
	31      1F 00 20        56      38 00 67        81      51 01 2F
	32      20 00 23        57      39 00 6B        82      52 01 3F
	33      21 00 25        58      3A 00 6F        83      53 01 4F
	34      22 00 27        59      3B 00 73        84      54 01 5F
	35      23 00 29        60      3C 00 77        85      55 01 6F
	36      24 00 2B        61      3D 00 7B        86      56 01 7F
	37      25 00 2D        62      3E 00 7F        87      57 01 8F
	38      26 00 2F        63      3F 00 83        88      58 01 9F
	39      27 00 31        64      40 00 8F        89      59 01 AF
	40      28 00 33        65      41 00 97        90      5A 01 BF
	41      29 00 35        66      42 00 9F        91      5B 01 CF
	42      2A 00 37        67      43 00 A7        92      5C 01 DF
	43      2B 00 39        68      44 00 AF        93      5D 01 EF
	44      2C 00 3B        69      45 00 B7        94      5E 01 FF
	45      2D 00 3D        70      46 00 BF        95      5F 02 0F
	46      2E 00 3F        71      47 00 C7        96      60 02 3F
	47      2F 00 41        72      48 00 CF        97      61 02 5F
	48      30 00 47        73      49 00 D7        98      62 02 7F
	49      31 00 4B        74      4A 00 DF        99      63 03 00

8) MFW

These two bytes transmit the waveform for DCO1, and also the modulation ie ring, noise or none.

	
	                 First byte    Second byte
	                000 000 0  0   00 000 000
	
	First=1         000        0   00
	First=2         001        0   00
	First=3         010        0   00
	First=4         100        0   00
	First=5         101        0   00
	First=6         110        0   01
	First=7         110        0   10
	First=8         110        0   11
	Second=1            000 1  0   00
	Second=2            001 1  0   00
	Second=3            010 1  0   00
	Second=4            100 1  0   00
	Second=5            101 1  0   00
	Second=6            110 1  0   01
	Second=7            110 1  0   10
	Second=8            110 1  0   11
	NO MODULATION                     000
	RING MODULATION                   100
	NOISE MODULATION                  011

So, for instance, to set first = 4, second= 2, ring modulation, we have

	100 001 1 0 00 100 000 = 1000 0110 0010 0000 = 86 20

9) MAMD,MAMV

These two bytes set the DCA1 key follow:

	Key follow:     0   1   2   3   4   5   6   7   8   9
	1st byte:       00  01  02  03  04  05  06  07  08  09
	2nd byte:       00  08  11  1A  24  2F  3A  45  52  5F

10) MWMD, MWMV

These two bytes set the DCW1 key follow

	Key follow:     0   1   2   3   4   5   6   7   8   9
	1st byte:       00  01  02  03  04  05  06  07  08  09
	2nd byte:       00  1F  2C  39  46  53  60  6E  92  FF

11) PMAL

This sets the position of the end step on DCA1. Step 1..8 gives bytes 00..07.

12) PMA

This consists of 8 repetitions of Rate,Level.

Given that you wish to set rate r, the data you need to send is

	Byte= 119 * r / 99

Conversely, if byte=0, rate=0, if byte=7F, rate=99, otherwise

	r= ( 99 * byte / 119 ) + 1

Add 80 hex if the level will be coming down on this step.

The level goes up linearly, with 0 being 00, up to 99 is 7F, so that

	Byte= ( 127 * level ) / 99

and

	Level= ( 99 * byte / 127 ) + 1

except at byte=0 where level=0, and byte=127, where level=99

In all these conversions, fractional parts are ignored, so a result of byte=24.6987 would be taken as byte=24.

13) PMWL

End step number for DCW1. Same as PMAL

14) PMW

This sets the steps in DCW1, and consists of 8 repetitions of Rate,Level. The format is similar to PMA, so that you add 80 ( 128 dec ) to the rate if the level is coming down this step, and that you add 80 to the level if you wish to set a sustain point. The level data is handled the same as PMA, but for some strange reason the rate data is encoded differently.

So

	byte= ( 119 * level / 99 ) + 8

and

	level= ( 99 * (byte-8) / 119 ) + 1

except where byte=8, level=0, and where byte=77, level=99

15) PMPL

Another end step setting, this time for DCO1. Same as PMAL and PMWL

16) PMP

Another envelope setting, this time for the DCO1 rates and levels. Again uses a completely different encoding scheme.

	byte= ( 127 x rate / 99 )

and

	rate= ( 99 x byte / 127 ) + 1

except where byte=00, rate=0, where byte=7F, rate=99

For the level, level data 0..63 translate as bytes 00..3F, and level data 64..99 translate as bytes 44..67.

17) SFW

These two bytes set the waveform for DCO2. They use the same format as MFW does for DCO1, except that the modulation bits are ignored ( it is best to set these bits to zero , just in case ).

18) SAMD,SAMV

19) SWMD,SWMV

20) PSAL

21) PSA

22) PSWL

23) PSW

24) PSPL

25) PSP

All the above use the same formats as their counterparts for the first set of DCO,DCW,DCA, and perform exactly the same functions on the DCA2,DCW2,and DCO2.

This concludes what I hope has been an informative article ( if rather a long one :-) ).