home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
files
/
music
/
patchlib
/
patchsrc
/
convert.doc
< prev
next >
Wrap
Text File
|
1985-11-19
|
5KB
|
90 lines
Conversion for both the DX and CZ series have a few things in common. The
preprocessor variable TOTAL_SIZE should be changed to the total size (in
bytes) of a single voice in the synth. The preprocessor variable VOICE_SIZE
should be changed to the number of voice parameters that the program will be
setting when generating new voices (which will correspond to the number of
parameters given in the RANDOM_FILE parameter file).
Voices are always sent to and read from the voice edit area of the synth.
You will have to set up a new RANDOM_FILE with appropiate parameter contents.
I hope you know the function of all the voice parameters because it would take
another 10 pages to explain all of them in detail -- check your owner's manual.
For the DX100 you can examine how I set them against the listing in the back
of the owner's manual (sorry, I'm not going to type it in!). The CZ parameters
can be checked against the listing in CZ101.DOC .
The remaining comments have to deal principally with random voice generation
and are best dealt with separately for each series.
DX series Conversion
--------------------
Voice generation is extremely simple. Essentially, each data byte in the
voice corresponds to a voice parameter in the synth. So, to generate a voice,
we go through each data byte, generate a random parameter as dictated by the
RANDOM_FILE parameter file, stuff it into the data byte, and continue. When
all the data bytes are filled we are done. All this is done in the make_voice()
routine. This is a slight over-simplification, however. The scheme described
is adhered to only for the first VOICE_SIZE data bytes. The remaining bytes
are either voice name bytes (into which we put "RANDOM") or parameters which
have no effect on the DX100 (into which we put 0). In addition, certain of
the VOICE_SIZE bytes are modified as described in the make_voice() routine to
produce more pleasing effects in ways that are difficult to deal with in the
RANDOM_FILE parameters.
Note that whenever a voice name is obtained from the user for a new voice,
it is also copied into the appropiate data bytes in the voice (overwriting
"RANDOM" or whatever).
CZ series Conversion
--------------------
As stated previously, the program should already work for the CZ-1000 and 5000.
However, the 5000 (unlike the 1000) is not 100% identical in system exclusive
features. The important thing is that the tone data format *is* 100% identical.
However, there are certain other data that can be sent for the 5000 as well as
tone data (namely GLIDE NOTE, GLIDE TIME, MODULATION DEPTH, VOLUME LEVEL, and
GLIDE ON/OFF). Not having a CZ-5000 I don't know if it is important to set any
of these, but it would seem that since these are not an intrinsic part of the
tone data their setting(s) should be left to the user. Not to mention that
there is no way to *read* them back from the 5000.
If you are going to attempt conversion for some other CZ (e.g., CZ-1), good
luck! Well really, it is not impossible, just a lot harder than for a DX.
First, check the differences in system exclusive implementation. If you are
lucky, (like with the CZ-1000) the tone data format will be identical. If
there are no other things to be sent with a tone, then no conversion is needed.
If you are not so lucky, and there are differences in the system exclusive
implementation, keep a few things in mind:
1) Casio sends their data bytes with the nibbles reversed. Notice
that at the end of my make_voice() routine, all the just
generated data bytes get reversed.
2) If the data byte values to be sent don't seem to have any simple
relation to the parameter value (like VIBRATO DELAY TIME on
the CZ-101) you can use CONVERT.PRG to convert an ASCII hex
file you've created in an editor to binary (and back again
if you've made an error and want to examine a binary file).
3) If a name can be stored with a voice, look at the parts of the DX
code that deal with that (usually short sections surrounded
by #ifdef DX100, #endif dealing with 'v_name' in between).
4) Handshaking is done by handshake().
5) If the system exclusive implementation is *similar* (say just more
ADSR steps for example) you may be able to get away with not
re-writing the make_voice() routine from scratch, perhaps just
by extending the range of a loop variable.
6) Keep in mind when looking at make_voice() that many data values are
being put in a single byte or, worse, split across bytes. Don't
yell at me. Also, those incredible messy functions you see
are because for some reason Casio doesn't believe that if a
parameter value is 35 you should send 35, instead you send 86
(or whatever).
If you are willing to settle for just a voice librarian but not generator, the
conversion should be trivial and you can probably forget all my little helpful
suggestions above.