Peavey PC 1600TM MIDI Controller


Version 2.00 Upgrade


John Fera -- 04/10/97

This upgrade includes the following features:



Roland-style checksums:

Fader and CV strings have always supported constant bytes, and variable data bytes designated by 'pr' within the string. Now you can also designate a byte (or bytes) as 'cs' for checksum (as well as 'gc' and 'dv', explained below). Whenever a 'cs' occurs in a string, the PC 1600 will compute a checksum byte as follows:

    1. Adds up all of the bytes from byte #5 (or higher, see below; with the F0 being byte #0) to the last byte before the 'cs'. (Byte #5 is usually the beginning of the Main data or "body" of the Roland message, starting after the Command ID.)
    2. Takes the 2's complement (flip all the bits, then add 1).
    3. Uses the least significant 7-bits of the result as the checksum byte. The 8th bit is always zero.

NOTE: Roland specifies in its System Exclusive specification that a unit's Model ID (byte #3, non-zero) and Command ID (byte #4, non-zero) could be extended beyond a single byte by using leading zeroes before the non-zero byte. In this case, the PC 1600's checksum calculation will start later in the string accordingly: at byte # (5 + number of leading zeroes).

To program a ‘cs’ byte in a fader or CV string, edit the byte value up to FC, at which point you will see ‘cs’ instead of ‘FC’ on the display. The ‘cs’ computation is unavailable in button and setup strings. In these cases the checksum must be calculated and inserted into the string as a constant by the programmer. There should be examples of the calculation in your Roland manual.


Global MIDI Out Channel and MIDI Device Number:

Many MIDI products use system exclusive command strings that have a MIDI channel or device number as one of the bytes. These numbers are used to differentiate the unit from an identical unit on the same MIDI stream. Being able to change these numbers allows you to use one set of PC 1600 presets for multiple units of the same product.

Instead of hard-coding these values into the strings, you can designate a 'gc' (global channel) byte or a 'dv' (device number) byte in the strings, then just go to UTILITY and change the ChOut (1st screen) and DevNum (7th screen) parameters.

Whenever the PC 1600 sees a 'gc' in a string, it will transmit the ChOut parameter minus 1 (0 - 15 [0Fh]). When it sees a 'dv', it will transmit the DevNum parameter (0-127 [7Fh]).

Additionally, the ‘gc’ designation can be placed after a channel status byte (80h through EFh). In this case, the ‘gc’ will channelize the status byte, as opposed to being sent as a separate byte. The status and ‘gc’ bytes will be connected by a hyphen to show that they are being combined into a single byte upon transmission. The following screen would program fader #1 to send Program Changes on the global out channel. The zero after the C will get replaced by ChOut - 1 (0 - F), therefore making it meaningless (a CF would make no difference to the fader function).

FDR01: String

C0-gc pr

To program one of these values in a string (fader, CV, button, or setup), edit the byte value up to FD or FE, at which point you will see ‘dv’ or ‘gc’ on the display, respectively (instead of ‘FD’ or ‘FE’).

NOTE: In button and setup strings, the first byte of the string cannot be a ‘dv’ or ‘gc.’ This allows the user to send the raw values FDh (undefined) and FEh (active sensing) over MIDI, if desired, by programming them as the first byte.


Bank Select MSB:

MIDI specifies the Bank Select message as a full 14-bit controller message (two 7-bit controllers combined into a 14-bit number). The MSB (Most Significant Byte) is controller #0, while the LSB (Least Significant Byte) is controller #32 (#20h). The bank number is computed as (MSB * 128) + LSB. Hence, to switch to bank #2 on channel 5, the MIDI message would look like this:

Hex: B4 00 00 20 02

Description: status cc #0 MSB cc #32 LSB

When the PC 1600 Bank parameter (on the preset’s Setup screen) is set to 0-127, the full Bank Select message is transmitted, with the Bank number in the LSB (as shown above). Some products use the MSB directly to change banks, ignoring the LSB. Because of this, the PC 1600’s Bank parameter can now be incremented further past 127. This new range is shown as 001m - 127m. When one of these values is used, the Bank will be sent as the MSB, and the LSB won’t be sent. For example, bank 002m on channel 1 would be transmitted as follows:

Hex: B0 00 02

Description: status cc #0 MSB

NOTE: There is no "000m" choice in the list. To switch an "MSB" unit to bank #0, use the 000 (LSB) selection, since that will send a zeroed MSB along with the zeroed LSB.


New Button "Send Fader" Function:

This feature allows you to send single messages (as opposed to "sweeps" of messages) from the faders. This is desirable in many cases, like sending very precise control changes into a sequencer.

When a fader’s button is programmed as "Send Fader," moving the fader will not cause a MIDI transmission. You will, however, see the data value on the top preset screen as you would normally, except that there will be an "M" in the lower right corner of the LCD telling you that the fader is temporarily muted. After you move the fader to the desired position, press the button to send the message (you will see the "M" disappear, signaling that the message was sent).

You can also use the data wheel to change the value before it is actually sent, if it is linked to the fader (either directly or with "last fader"). Pressing a "Send Fader" button will switch that fader to the "last fader moved" (even if the fader itself was not moved).

You can also get a normal "sweep" from the fader by holding the button while moving the fader (or data wheel). In this case, the "M" will not be on the LCD, signaling that the message is being transmitted.

BTN01: Function

Send Fader

NOTE: When using faders to send continuous controller messages, the replace and update modes will be unaffected by fader movements when the button is not pressed. In other words, the incoming controller won’t get filtered until the local controller is REALLY transmitted.


Fader Identification with Buttons:

Whenever one of the 16 programmable buttons is programmed as "Off / Fader ID" (which replaces the "No message" choice at the bottom of the list) it will identify its associated fader when on the top preset screen. For example, pressing button 16 would cause the PC 1600 to display "Fdr16 : <fader name>." This allows you to see what the fader is going to do (if it is named) before moving it, without having to look at the edit screens.


Fader/CV/Button/Encoder Identification with MIDI Mute:

While the left cursor (ç ) button is being held, the PC 1600 will not generate any MIDI messages (although it can still echo messages that it receives). This enables you to see the name of a message (and its range) when on the top preset screen by moving the appropriate device while holding ç . This allows identification of all the controls and their ranges, whereas the button ID feature (above) can only identify fader names.

Although this feature works at all times, when on the top preset screen the bottom line of the LCD will report "Local MIDI Disabled" when you press ç , and "Local MIDI Enabled" when you release ç . In addition, there will be an "M" displayed in the bottom right corner of the LCD when moving faders or CV pedals while ç is depressed, indicating "mute." (Button presses will not, however, generate the "M," since their function descriptions use the whole line of the LCD.)

NOTE: When using faders and/or CV pedals to send continuous controller messages, the replace and update modes will be unaffected by movements when the mute is in effect. In other words, the incoming controller won’t get filtered until the local controller is REALLY transmitted.

Preset Initialization:

The PC 1600 has a block of preset memory that gets divided up among all the presets (presets aren't all the same size). If several of the presets are very large (contain long strings and long names for the controls), the unit can run out of memory. If this happens, you can use this utility to regain some memory by initializing presets that you don't need (i.e. factory presets that you never use).

It is also useful if you want to create a new preset, but you want to start with a "clean slate" instead of using an existing preset as a starting point.

This function is on the 10th screen under UTILITY. Choose a preset (by editing the preset number on the bottom line, then press ENTER. You will then be asked, "ARE YOU SURE?" on the screen. Pressing ENTER again will initialize the preset and name it "--Initialized--."

UTIL: Init a Preset

00 <preset name>


Scene number displayed with preset link:

The SCENE screen now shows a preset number in the lower left corner. This is the preset that the scene is tied to. It will show "p:--" if the scene is empty. This helps when you need to know which scenes are active, like when you need to store a new one but don’t want to overwrite an active one.

The Setup Scene screen and "button-send-scene" screen (both described below) also have this feature.


[p:32] 02

Scene transmission with preset recall:

You can now associate a scene with each preset. Anytime the preset is recalled (locally with inc/dec or via MIDI), the scene will be sent. This can cut down on memory usage if some presets use the same scene for setting things up. Previously, each preset would need all of this information in its own Setup String, taking up memory with redundant strings. Scenes use a fixed amount of memory at all times, so utilizing them will not use up any dynamic preset memory.

The "Setup String" area of the edit screens has a new screen to choose the associated scene. (Of course, you may choose "Off" by decrementing past ‘00’ if you don’t want a scene sent).

SETUP: Scene

[p:32] 02

Scene transmission with button:

You can send any scene from one of the 16 buttons. This is useful when you know that you’re going to transmit particular scenes from a preset. It saves you from having to go to the SCENE page, choose the scene, and then send it with the ENTER button.

Choose "Send Scene" as the button function, and the next screen will allow you to pick the desired scene.

BTN01: Function

Send Scene

BTN01: Scene

[p:32] 02

Scene Initialization:

Pressing the SCENE button repeatedly will scroll through three scene functions instead of two: Send, Store, and the new INITIALIZE function. Pressing ENTER here will clear a scene so that no MIDI is transmitted if the scene is sent. After a scene has been initialized, its preset link number (in the lower left corner) will be "p:--."


[p:--] 02 [Enter]


MIDI Remote Button Emulation:

The PC 1600's 16 programmable buttons are useful to send any type of message to any MIDI device. Now you can access the button messages remotely by sending simple messages into the PC 1600. All you need is a MIDI keyboard, pedal board, or any other MIDI controller that sends Program Change commands or MIDI Note On/Note Off (e.g. "MIDI-fied" Taurus-type pedals). Use your note pedals to play chords instead of single notes (with pre-programmed velocity or the velocity from the pedals). Reserve keys on your keyboard for sending SysEx messages. Or use your Program Change pedal board to send more complex MIDI messages (like SysEx or multiple Program Changes). The possibilities are virtually unlimited.

There is a new screen to set this feature up (the 9th screen under UTILITY). Pick the emulation type (Off, Notes, PrgCh), the MIDI channel you are sending these messages on (1-16), and the starting value (0-127). The starting value is the base note number or base program number, depending on the emulation type. The base value will emulate button #1, while the next 15 values will emulate buttons #2-#15. The incoming message will not be echoed, even if the button is "Off." (NOTE: Middle C on a MIDI keyboard is note number 60 [3Ch].)

BUTN: Type Ch Start

REMT Off 01 000

In "Notes" mode, Note On messages will emulate a button press, while Note Off messages (including Note On with velocity = 0, of course) will emulate a button release. In "PrgCh" mode, Program Change messages will emulate a button press immediately followed by the release. (You probably won’t find much use for a prs/rls string when emulating in PrgCh mode -- use normal or toggled strings instead.)

When using "Notes" mode to play MIDI notes or chords, you can program the PC 1600 (per note!) to use a fixed velocity, or to use the velocity that came from MIDI (e.g. from velocity-sensitive note pedals or keyboards). If the button is programmed as a single note, set the velocity variable to "Rem" for Remote. If playing a chord (via the general "String" functions), edit the string and crank the velocity bytes up to FF, where you will see ‘rv’ (remote velocity) in the string instead of the FF. Whenever the PC 1600 sees an ‘rv’ in a button string, and the most recent status byte in the string was a Note On (9x, for attack velocity) or Note Off (8x, for release velocity), it will substitute the incoming velocity.

If a button is pressed locally (on the PC 1600 itself), or hit remotely with a Program Change, the ‘rv’ byte value will be determined by the position of the fader above the button, even if it did not follow a 9x or an 8x. The fader position number will always be ranged from 0-127 (or 1-127 if within a note stream). It will not be affected by the fader’s Min and Max parameters.

NOTE: Since the ‘rv’ velocity will use the fader position when the button is pressed on the PC 1600, it is useful to use ‘rv’ even when not using the remote feature. It gives you a method of inserting the fader position (0-127 only) into any button string. Use it for program number, note number, etc. If the fader is not being used for something else, however, it is probably better to program the message into the fader, then set the button to "Send Fader" (described above).


Note Stream Recording:

To make using the above feature easier, the PC 1600 can now record note streams into button strings. This allows you to play a chord into the PC 1600 to program a button, instead of punching all the numbers in manually. To do this, you must first enable the feature by telling the PC 1600 which MIDI channel you will be sending the note data over. This parameter is on the 7th screen under UTILITY (along with the MIDI Device Number):

[the symbol ( ) should be a note symbol]

MIDI:DevNum RecChn

000 01

After setting the channel, go to any button’s string editing screen (String, prs/rls, or toggle) and hit the left or right arrow button to put the underline cursor on the screen:

BTN01: String

90 3C 7F

The recording will be triggered by any Note On received on the specified channel. Any Note Off received on that channel will erase the string, allowing you to experiment until you find the right chord. Any other MIDI commands will not affect the recording. When you get it the way you want it, press the ENTER button while holding the chord. (If you’re using 2-handed chords, you can plug a footswitch into the PC 1600 and set it to emulate the ENTER button -- see the 6th screen under UTILITY.)

NOTE: Any Note Off will erase the whole chord, even though the other notes may still be sounding. If you play 3 notes, release 1 of them, then add another (still 3 sounding), then press ENTER, the last note will be the only one recorded. Therefore, whenever you are going to release any notes (because the chord is not yet "done") release all the notes and retrigger the whole chord.

You will not see the note stream on the screen until after you press the ENTER button. The string will start with a 9x (where the x is the note record channel - 1), followed by the first note number, then the first note velocity, etc. (Only one status byte -- we’re using running status here.) The velocity bytes can be changed to ‘rv’ (described above) so that the incoming MIDI velocity (or fader position) gets substituted, allowing "dynamic" remote button playing. The following screen shows a "dynamic" C major triad on channel 1 (starting with Middle C):

BTN01: String

90 3C rv 40 rv 43 rv

So, now that we know how to trigger chords remotely, how do we turn them off? There are two ways to do it. The easy and memory-efficient method is to use the MIDI All Notes Off command. This is a channelized command that tells a synth to release all of the notes that were triggered on that channel. The command is defined as continuous controller #123 (7Bh) with a data value of zero:

All Notes Off command for channel 1: B0 7B 00

for channel 2: B1 7B 00 ...

You can use prs/rls strings with the chord on the press, and the All Notes Off message (same channel, of course) on the release. This will act like a normal "gated" triggering system (like a keyboard). You could also insert the All Notes Off command in regular "press only" strings ahead of the chord, so pressing any button will release the previous chord before playing its own chord (also letting you release the button without releasing the chord). Just remember to program one of the buttons as an All Notes Off only, so you can silence the synth when needed.

You may find that the All Notes Off command doesn’t work correctly in your system. There are some synths out there that do not respond to the All Notes Off message, and even some that respond to it incorrectly. Some units will "kill" the notes abruptly instead of releasing them (as a Note Off would), and some others will apply the message to all notes in the unit, not just the ones that were generated on the same MIDI channel as the All Notes Off message itself. If your synth(s) respond correctly, great! If not, you’ll have to send matching Note Off commands after the Note On commands.

The PC 1600 won’t record Note Off streams, but there is a fairly easy way to handle this for the "gated" mode. After recording the chord into the press string, record the same chord into the release string, and then either change the 9x at the start of the string to an 8x (which will give you control over release velocity), or change all the velocity bytes to zero, which will convert the Note Ons to Offs.


MIDI Delay Parameters:

Sometimes a device can’t handle MIDI data as fast as the PC 1600 can generate it. This can happen when sending scenes, dumping presets, or any other operation that sends large amounts of data. There are two types of MIDI delay available to you. They both default to zero, and shouldn’t be set otherwise unless a problem is occurring with a receiving unit.

The first is a per-SysEx message delay, which is inserted after the PC 1600 sends an EOX byte (F7h). This puts delays in between SysEx messages. The delay can be set from 0 to 100 ms. Try raising this number in 5 ms. steps if a unit chokes on SysEx data from sending scenes. (By "choking" we mean that the unit got a MIDI receive error, got hung, or just didn’t do everything that it should have.) Don’t set this number higher than needed. The maximum value of 100 ms. will make a scene with 16 SysEx messages take almost 2 seconds to send.

The other type of delay is a per-byte delay, which is inserted after every byte that the PC 1600 sends. This delay can be set from 0 to 1000 us. (1 ms.), in 10 us. steps. If a computer or MIDI librarian is getting a buffer overflow when you’re backing up your PC 1600 data, try setting this delay between 100 and 500 as needed. (A value of 320 will essentially split the MIDI speed in half.) You’ll probably want to lower the delay when you’re done, and only raise it when needed.

There is a new screen to set these delays (the 8th screen under UTILITY).

MIDI: PerMsg PerByte

DELAY 000ms 0000us

NOTE: These delays only affect MIDI data that the PC 1600 generates internally. Data that is echoed from MIDI in to MIDI out is not delayed.