[comp.sources.misc] v06i111: glib part 10 of 15

allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (05/15/89)

Posting-number: Volume 6, Issue 111
Submitted-by: lee@uhccux.uhcc.Hawaii.Edu (Greg Lee )
Archive-name: glib/part10

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 10 (of 15)."
# Contents:  dx7s.mnu yama_com.c
# Wrapped by lee@uhccux on Sun May  7 00:40:17 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'dx7s.mnu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'dx7s.mnu'\"
else
echo shar: Extracting \"'dx7s.mnu'\" \(21591 characters\)
sed "s/^X//" >'dx7s.mnu' <<'END_OF_FILE'
X/* $Id: dx7s.mnu,v 1.6 89/05/06 17:13:23 lee Exp $
X * GLIB - a Generic LIBrarian and editor for synths
X *
X * DX-7s routines
X *
X * Scott Snyder - ssnyder@citromeo.bitnet, ssnyder@romeo.caltech.edu
X * $Log:	dx7s.mnu,v $
X * Revision 1.6  89/05/06  17:13:23  lee
X * rel. to comp.sources.misc
X * 
X */
X
X#define ARYLEN(a) (sizeof((a))/sizeof((a)[0]))
X
X#define BITS(x, start, len) (((x) >> (start)) & ((1<<(len))-1))
X
X#define OVERLAY1
X
X#define VCED_SIZE 155
X#define ADVCED_SIZE 49
X
X#define VMEM_SIZE 128
X#define ADVMEM_SIZE 35
X#define NVOICES 32
X
X#include "glib.h"
X#include <ctype.h>
X
Xchar *visnum(), *visonoff(), *vism3num(), *viswave(), *vismono();
Xchar *visfreq(), *visdx1a(), *visr2num();
X
Xchar *visxq(), *visxx(), *vism7num(), *visx7note(), *visx7crv();
Xchar *visx7a(), *visx7wave(), *visx7brkpt();
X
Xchar *visxq1(), *visxq2(), *visxq3();
Xchar *visxq4(), *visxq5(), *visxq6();
Xchar *visxx1(), *visxx2(), *visxx3();
Xchar *visxx4(), *visxx5(), *visxx6();
X
Xchar *vissport(),  *visspbmode(), *visspegrng(), *visssngl();
Xchar *vissmono(),  *vissedmde(), *vissmpm(),  *vissmam();
Xchar *vissmeg(), *vissm4(),   *visssclm(),   *visx7crv();
X
Xchar *vissf1(), *vissf2(), *vissf3();
Xchar *vissf4(), *vissf5(), *vissf6();
X
X#define RESERVESIZE VMEM_SIZE
X
X/* This array contains arbitrary screen labels */
Xstruct labelinfo Ldx7S[] = {
X#MENU
X                      N: set name; q: quit; K: incr; J: decr; >: max; <: min  k
X                  space: play autonote Pitch  %   Vol  %   Dur  %   Chan  %  h l
X                                                                              j
X    Atk  Sust1 Sust2  Rls          Scal Out De  Rat  Sens  Brk  Depth  Curve
XOP Rt Lv Rt Lv Rt Lv Rt Lv  Freq   Mode Lvl tun Scl Key AM Pt   L  R   L    R
X-- -- -- -- -- -- -- -- -- ------- ---- --- --- --- --- -- ---- -- -- ---- ----
X 1 %  %  %  %  %  %  %  %  %    %  %     %   %   %   %   % %    %  %  %    %
X 2 %  %  %  %  %  %  %  %  %    %  %     %   %   %   %   % %    %  %  %    %
X 3 %  %  %  %  %  %  %  %  %    %  %     %   %   %   %   % %    %  %  %    %
X 4 %  %  %  %  %  %  %  %  %    %  %     %   %   %   %   % %    %  %  %    %
X 5 %  %  %  %  %  %  %  %  %    %  %     %   %   %   %   % %    %  %  %    %
X 6 %  %  %  %  %  %  %  %  %    %  %     %   %   %   %   % %    %  %  %    %
XPE %  %  %  %  %  %  %  %
X                                      Osc. Sync     %      Rnd Pitch      @
XAlgorithm   %  LFO trigger   %        Feedback      %      Port. mode     @
X============== LFO Speed     %        Middle C      %      Port. step     @
X               LFO Delay     %        PEG Range     %      Port. time     @
X               LFO AM Depth  %        PEG by vel    %
X               LFO PM Depth  %        PEG Rate Scl  %                     @
X               LFO Wave      %        PB Range      %      PM range       @
X               LFO Sync      %        PB Step       %      AM range       @
X               LFO PM Sense  %        PB Mode       %      EG bias        @
X               Unison detune %        Poly/Mono     %                     @
X               FC1 is CS1    %        Unison mode   %
X#END
X-1,-1,NULL
X};
X
X/* This array defines all the editable parameters. */
Xstruct paraminfo Pdx7S[] = {
X"autopitch",	NULL, -1, -1,  %%, visnum, 0, 127, 60, 0,
X"autovol",	NULL, -1, -1,  %%, visnum, 0, 127, 63, 0,
X"autodur",	NULL, -1, -1,  %%, visnum, 1,  20,  5, 0,
X"autochan",	NULL, -1, -1,  %%, visnum, 1,  16,  1, 0,
X
X"op1atkrt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op1atklv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op1sust1rt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op1sust1lv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op1sust2rt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op1sust2lv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op1rlsrt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op1rlslv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op1freq",	NULL, -1, -1,   %%, visxq1,  0, 4067, 0, 0,
X"op1fx",	NULL, -1, -1,   %%, vissf1, 0,    1, 0, 0,
X#O op1scalmode	ssclm	%%	1	0	0x20	5
X"op1outlevel",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op1detune",	NULL, -1, -1,   %%, vism7num,   0,   14, 0, 0,
X"op1ratscl",	NULL, -1, -1,   %%, visnum,     0,    7, 0, 0,
X"op1tchsens",	NULL, -1, -1,   %%, visnum,     0,    7, 0, 0,
X#O op1amsens	num		%%	7	3	0x38	3
X"op1brkpt",	NULL, -1, -1,   %%, visx7brkpt,0,   99, 0, 0,
X"op1ldepth",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op1rdepth",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op1lcurve",	NULL, -1, -1,   %%, visx7crv,  0,    3, 0, 0,
X"op1rcurve",	NULL, -1, -1,   %%, visx7crv,  0,    3, 0, 0,
X"op1modsens",	NULL, -1, -1,-1,-1, visnum,     0,    3, 0, 0,
X
X"op2atkrt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op2atklv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op2sust1rt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op2sust1lv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op2sust2rt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op2sust2lv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op2rlsrt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op2rlslv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op2freq",	NULL, -1, -1,   %%, visxq2,  0, 4067, 0, 0,
X"op2fx",	NULL, -1, -1,   %%, vissf2, 0,    1, 0, 0,
X#O op2scalmode	ssclm	%%	1	0	0x10	4
X"op2outlevel",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op2detune",	NULL, -1, -1,   %%, vism7num,   0,   14, 0, 0,
X"op2ratscl",	NULL, -1, -1,   %%, visnum,     0,    7, 0, 0,
X"op2tchsens",	NULL, -1, -1,   %%, visnum,     0,    7, 0, 0,
X#O op2amsens	num		%%	7	3	0x07
X"op2brkpt",	NULL, -1, -1,   %%, visx7brkpt,0,   99, 0, 0,
X"op2ldepth",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op2rdepth",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op2lcurve",	NULL, -1, -1,   %%, visx7crv,  0,    3, 0, 0,
X"op2rcurve",	NULL, -1, -1,   %%, visx7crv,  0,    3, 0, 0,
X"op2modsens",	NULL, -1, -1,-1,-1, visnum,     0,    3, 0, 0,
X
X"op3atkrt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op3atklv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op3sust1rt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op3sust1lv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op3sust2rt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op3sust2lv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op3rlsrt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op3rlslv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op3freq",	NULL, -1, -1,   %%, visxq3,  0, 4067, 0, 0,
X"op3fx",	NULL, -1, -1,   %%, vissf3, 0,    1, 0, 0,
X#O op3scalmode	ssclm	%%	1	0	0x08	3
X"op3outlevel",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op3detune",	NULL, -1, -1,   %%, vism7num,   0,   14, 0, 0,
X"op3ratscl",	NULL, -1, -1,   %%, visnum,     0,    7, 0, 0,
X"op3tchsens",	NULL, -1, -1,   %%, visnum,     0,    7, 0, 0,
X#O op3amsens	num		%%	7	2	0x38	3
X"op3brkpt",	NULL, -1, -1,   %%, visx7brkpt,0,   99, 0, 0,
X"op3ldepth",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op3rdepth",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op3lcurve",	NULL, -1, -1,   %%, visx7crv,  0,    3, 0, 0,
X"op3rcurve",	NULL, -1, -1,   %%, visx7crv,  0,    3, 0, 0,
X"op3modsens",	NULL, -1, -1,-1,-1, visnum,     0,    3, 0, 0,
X
X"op4atkrt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op4atklv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op4sust1rt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op4sust1lv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op4sust2rt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op4sust2lv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op4rlsrt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op4rlslv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op4freq",	NULL, -1, -1,   %%, visxq4,  0, 4067, 0, 0,
X"op4fx",	NULL, -1, -1,   %%, vissf4, 0,    1, 0, 0,
X#O op4scalmode	ssclm	%%	1	0	0x04	2
X"op4outlevel",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op4detune",	NULL, -1, -1,   %%, vism7num,   0,   14, 0, 0,
X"op4ratscl",	NULL, -1, -1,   %%, visnum,     0,    7, 0, 0,
X"op4tchsens",	NULL, -1, -1,   %%, visnum,     0,    7, 0, 0,
X#O op4amsens	num		%%	7	2	0x07
X"op4brkpt",	NULL, -1, -1,   %%, visx7brkpt,0,   99, 0, 0,
X"op4ldepth",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op4rdepth",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op4lcurve",	NULL, -1, -1,   %%, visx7crv,  0,    3, 0, 0,
X"op4rcurve",	NULL, -1, -1,   %%, visx7crv,  0,    3, 0, 0,
X"op4modsens",	NULL, -1, -1,-1,-1, visnum,     0,    3, 0, 0,
X
X"op5atkrt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op5atklv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op5sust1rt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op5sust1lv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op5sust2rt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op5sust2lv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op5rlsrt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op5rlslv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op5freq",	NULL, -1, -1,   %%, visxq5,  0, 4067, 0, 0,
X"op5fx",	NULL, -1, -1,   %%, vissf5, 0,    1, 0, 0,
X#O op5scalmode	ssclm	%%	1	0	0x02	1
X"op5outlevel",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op5detune",	NULL, -1, -1,   %%, vism7num,   0,   14, 0, 0,
X"op5ratscl",	NULL, -1, -1,   %%, visnum,     0,    7, 0, 0,
X"op5tchsens",	NULL, -1, -1,   %%, visnum,     0,    7, 0, 0,
X#O op5amsens	num		%%	7	1	0x38	3
X"op5brkpt",	NULL, -1, -1,   %%, visx7brkpt,0,   99, 0, 0,
X"op5ldepth",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op5rdepth",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op5lcurve",	NULL, -1, -1,   %%, visx7crv,  0,    3, 0, 0,
X"op5rcurve",	NULL, -1, -1,   %%, visx7crv,  0,    3, 0, 0,
X"op5modsens",	NULL, -1, -1,-1,-1, visnum,     0,    3, 0, 0,
X
X"op6atkrt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op6atklv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op6sust1rt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op6sust1lv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op6sust2rt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op6sust2lv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op6rlsrt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op6rlslv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op6freq",	NULL, -1, -1,   %%, visxq6,  0, 4067, 0, 0,
X"op6fx",	NULL, -1, -1,   %%, vissf6, 0,    1, 0, 0,
X#O op6scalmode	ssclm	%%	1	0	0x01
X"op6outlevel",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op6detune",	NULL, -1, -1,   %%, vism7num,   0,   14, 0, 0,
X"op6ratscl",	NULL, -1, -1,   %%, visnum,     0,    7, 0, 0,
X"op6tchsens",	NULL, -1, -1,   %%, visnum,     0,    7, 0, 0,
X#O op6amsens	num		%%	7	1	0x07
X"op6brkpt",	NULL, -1, -1,   %%, visx7brkpt,0,   99, 0, 0,
X"op6ldepth",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op6rdepth",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"op6lcurve",	NULL, -1, -1,   %%, visx7crv,  0,    3, 0, 0,
X"op6rcurve",	NULL, -1, -1,   %%, visx7crv,  0,    3, 0, 0,
X"op6modsens",	NULL, -1, -1,-1,-1, visnum,     0,    3, 0, 0,
X
X"pegatkrt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"pegatklv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"pegsust1rt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"pegsust1lv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"pegsust2rt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"pegsust2lv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"pegrlsrt",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"pegrlslv",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X
X"oscsync",	NULL, -1, -1,   %%, visonoff,   0,    1, 0, 0,
X"algorithm",	NULL, -1, -1,   %%, visx7a,    0,   31, 0, 0,
X#O lfotrig	ssngl	%%	1	4	0x04	2
X"feedback",	NULL, -1, -1,   %%, visnum,     0,    7, 0, 0,
X"lfospeed",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X"transpose",	NULL, -1, -1,   %%, visx7note, 0,   48, 0, 0,
X"lfodelay",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X#O pegrange	spegrng	%%	3	4	0x03
X"lfoamdepth",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X#O pegvel	onoff		%%	1	4	0x08	3
X"lfopmdepth",	NULL, -1, -1,   %%, visnum,     0,   99, 0, 0,
X#O pegratscl	num		%%	7	24	0x07
X"lfowave",	NULL, -1, -1,   %%, visx7wave, 0,    5, 0, 0,
X#O pbrange	num		%%	12	5	0x3C	2
X"lfosync",	NULL, -1, -1,   %%, visonoff,   0,    1, 0, 0,
X#O pbstep	num		%%	12	6	0x0F
X"lfopmsens",	NULL, -1, -1,   %%, visnum,     0,    7, 0, 0,
X#O pbmode	spbmode	%%	3	6	0x30	4
X#O unidetune	num		%%	7	34	0x07
X#O polymono	smono	%%	1	5	0x01
X#O fc1_cs1	onoff		%%	1	34	0x08	3
X#O unison	onoff		%%	1	5	0x02	1
X
X#O rndpitch	num		@@	7	4	0x70	4
X#O portmode	sport	@@	1	7	0x01
X#O portstep	num		@@	12	7	0x1E	1
X#O porttime	num		@@	99	8
X
X/*
X * note: for proper operation of this hack, the 'edit mode' parm must be
X *  displayed before any of the dummy parms when the screen is first being
X *  drawn. making it alphabetically less will accomplish this.
X */
X
X"_aeditmode",	NULL, -1, -1,   @@, vissedmde, 0,  5, 0, 0,
X"_dummy_pm",	NULL, -1, -1,   @@, vissmpm,  0, 99, 0, 0,
X"_dummy_am",	NULL, -1, -1,   @@, vissmam,  0, 99, 0, 0,
X"_dummy_eg",	NULL, -1, -1,   @@, vissmeg,  0, 99, 0, 0,
X"_dummy4",	NULL, -1, -1,   @@, vissm4,   0, 99, 0, 1,
X
X#O mw_pm	num		--	99	9
X#O mw_am	num		--	99	10
X#O mw_eg	num		--	99	11
X#O mw_vol	num		--	99	-1
X
X#O fc1_pm	num		--	99	12
X#O fc1_am	num		--	99	13
X#O fc1_eg	num		--	99	14
X#O fc1_vol	num		--	99	15
X
X#O fc2_pm	num		--	99	26
X#O fc2_am	num		--	99	27
X#O fc2_eg	num		--	99	28
X#O fc2_vol	num		--	99	29
X
X#O midi_pm	num		--	99	30
X#O midi_am	num		--	99	31
X#O midi_eg	num		--	99	32
X#O midi_vol	num		--	99	33
X
X#O bc_pm	num		--	99	16
X#O bc_am	num		--	99	17
X#O bc_eg	num		--	99	18
X#O bc_pitchb	num		--	100	19
X
X#O at_pm	num		--	99	20
X#O at_am	num		--	99	21
X#O at_eg	num		--	99	22
X#O at_pitchb	num		--	100	23
X
XNULL,	NULL, -1, -1, -1, -1, visnum, 0, 0, 0, 0
X};
X
Xchar *vissmono(v)
Xint v;
X{
X  showparam(parmindex("portmode"), 0);
X  return vismono(v);
X}
X
Xchar *visssngl(v)
Xint v;
X{
X  if (v == 0)
X    return "Single";
X  else
X    return "Multi";
X}
X
Xchar *visspegrng(v)
Xint v;
X{
X  switch (v) {
X    case 0: return "8oct";
X    case 1: return "2oct";
X    case 2: return "1oct";
X    case 3: return "1/2oct";
X    default: return "???";
X  }
X}
X
Xchar *visspbmode(v)
Xint v;
X{
X  switch (v) {
X    case 0: return "Norm";
X    case 1: return "Low";
X    case 2: return "High";
X    case 3: return "Key On";
X    default: return "???";
X  }
X}
X
Xchar *vissport(v)
Xint v;
X{
X  if (getval("polymono") == 0)
X    if (v == 0)
X      return "Retain";
X    else
X      return "Follow";
X  else
X    if (v == 0)
X      return "Fingrd";
X    else
X      return "Fulltm";
X}
X
Xchar *edmdes[] = {
X  "Modulation Wheel",
X  "Aftertouch",
X  "Breath Control",
X  "Foot Control 1",
X  "Foot Control 2",
X  "MIDI Control",
X};
X
Xchar *edmde_prefixes[] = {"mw", "at", "bc", "fc1", "fc2", "midi",};
X
Xchar *mk_mode_parm(v, suffix)
Xunsigned v;
Xchar *suffix;
X{
X  static char buf[20];
X
X  if (v < ARYLEN(edmde_prefixes)) {
X    (void)sprintf(buf, "%s_%s", edmde_prefixes[v], suffix);
X    return buf;
X  }
X  else return "???";
X}
X
Xchar *vissedmde(v, eras)
Xunsigned v, eras;
X{
X  int j;
X  static char buf[30];
X
X  if (eras) {
X    showparam(parmindex("_dummy_pm"), 1);
X    showparam(parmindex("_dummy_am"), 1);
X    showparam(parmindex("_dummy_eg"), 1);
X    showparam(parmindex("_dummy4"), 1);
X  }
X  else {
X    setval("_dummy_pm", getval(mk_mode_parm(v, "pm")));
X    setval("_dummy_am", getval(mk_mode_parm(v, "am")));
X    setval("_dummy_eg", getval(mk_mode_parm(v, "eg")));
X
X    showparam(parmindex("_dummy_pm"), 0);
X    showparam(parmindex("_dummy_am"), 0);
X    showparam(parmindex("_dummy_eg"), 0);
X
X    j = parmindex("_dummy4");
X    if (v == 0)	/* MW */
X      disableparm(j);
X    else {
X      enableparm(j);
X      if (v == 1 || v == 2) {  /* BC, AT */
X        P[j].p_max = 100;
X        setval("_dummy4", getval(mk_mode_parm(v, "pitchb")));
X      }
X      else {
X        P[j].p_max = 99;
X        setval("_dummy4", getval(mk_mode_parm(v, "vol")));
X      }
X      showparam(j, 0);
X    }
X  }
X
X  (void)sprintf(buf, "~15l%s", v < ARYLEN(edmdes) ? edmdes[v] : "???");
X  return buf;
X}
X
Xchar *vissmpm(v)
Xint v;
X{
X  setval(mk_mode_parm((unsigned)getval("_aeditmode"), "pm"), v);
X  return visnum(v);
X}
X
Xchar *vissmam(v)
Xint v;
X{
X  setval(mk_mode_parm((unsigned)getval("_aeditmode"), "am"), v);
X  return visnum(v);
X}
X
Xchar *vissmeg(v)
Xint v;
X{
X  setval(mk_mode_parm((unsigned)getval("_aeditmode"), "eg"), v);
X  return visnum(v);
X}
X
Xchar *vissm4(v)
Xint v;
X{
X  int mode = getval("_aeditmode");
X  static char buf[40];
X
X  if (mode == 1 || mode == 2) { /* BC, AT */
X    setval(mk_mode_parm((unsigned)mode, "pitchb"), v);
X    (void)sprintf(buf, "~15lPitch Bias~5 %s", visnum(v-50));
X    return buf;
X  }
X  else {
X    setval(mk_mode_parm((unsigned)mode, "vol"), v);
X    (void)sprintf(buf, "~15lVolume Range~3 %s", visnum(v));
X    return buf;
X  }
X}
X
Xchar *visssclm(v)
Xint v;
X{
X  if (v == 0)
X    return "Norm";
X  else
X    return "Frac";
X}
X
Xchar *vissf1(v) { return visxx(v, 1, 1); }
Xchar *vissf2(v) { return visxx(v, 2, 1); }
Xchar *vissf3(v) { return visxx(v, 3, 1); }
Xchar *vissf4(v) { return visxx(v, 4, 1); }
Xchar *vissf5(v) { return visxx(v, 5, 1); }
Xchar *vissf6(v) { return visxx(v, 6, 1); }
X
Xdx7Sdin(data)
Xchar *data;
X{
X  int op;
X
X#SETVAL
X
X  dx7din(data);
X
X  for (op=1; op <= 6; op++)
X    setopval(op, "modsens", 0);
X}
X
Xdx7Sdout(data)
Xchar *data;
X{
X#GETVAL
X  dx7dout(data);
X}
X
Xdx7Sadvmemtoadvced(in, out)
Xchar *in, *out;
X{
X  int op;
X
X  for (op=1; op <= 6; op++)
X    out[6-op] = BITS(in[0], (6-op), 1);		/* scaling mode */
X  out[ 6] = BITS(in[1], 0, 3);			/* op6 am sens */
X  out[ 7] = BITS(in[1], 3, 3);			/* op5 am sens */
X  out[ 8] = BITS(in[2], 0, 3);			/* op4 am sens */
X  out[ 9] = BITS(in[2], 3, 3);			/* op3 am sens */
X  out[10] = BITS(in[3], 0, 3);			/* op2 am sens */
X  out[11] = BITS(in[3], 3, 3);			/* op1 am sens */
X
X  out[12] = BITS(in[4], 0, 2);			/* pegrange		*/
X  out[13] = BITS(in[4], 2, 1);			/* lfotrig		*/
X  out[14] = BITS(in[4], 3, 1);			/* pegvel		*/
X  out[15] = BITS(in[5], 0, 2);			/* polymono/unison	*/
X  out[16] = BITS(in[5], 2, 4);			/* pbrange		*/
X  out[17] = BITS(in[6], 0, 4);			/* pbstep		*/
X  out[18] = BITS(in[6], 4, 2);			/* pbmode		*/
X  out[19] = BITS(in[4], 4, 3);			/* rndpitch		*/
X  out[20] = BITS(in[7], 0, 1);			/* portmode		*/
X  out[21] = BITS(in[7], 1, 4);			/* portstep		*/
X  out[22] = in[8];				/* porttime		*/
X
X  out[23] = in[9];				/* mw_pm		*/
X  out[24] = in[10];				/* mw_am		*/
X  out[25] = in[11];				/* mw_eg		*/
X
X  out[26] = in[12];				/* fc1_pm		*/
X  out[27] = in[13];				/* fc1_am		*/
X  out[28] = in[14];				/* fc1_eg		*/
X  out[29] = in[15];				/* fc1_vol		*/
X
X  out[30] = in[16];				/* bc_pm		*/
X  out[31] = in[17];				/* bc_am		*/
X  out[32] = in[18];				/* bc_eg		*/
X  out[33] = in[19];				/* bc_pitchb		*/
X
X  out[34] = in[20];				/* at_pm		*/
X  out[35] = in[21];				/* at_am		*/
X  out[36] = in[22];				/* at_eg		*/
X  out[37] = in[23];				/* at_pitchb		*/
X
X  out[38] = BITS(in[24], 0, 3);			/* pegratscl		*/
X
X  out[39] = in[26];				/* fc2_pm		*/
X  out[40] = in[27];				/* fc2_am		*/
X  out[41] = in[28];				/* fc2_eg		*/
X  out[42] = in[29];				/* fc2_vol		*/
X
X  out[43] = in[30];				/* midi_pm		*/
X  out[44] = in[31];				/* midi_am		*/
X  out[45] = in[32];				/* midi_eg		*/
X  out[46] = in[33];				/* midi_vol		*/
X
X  out[47] = BITS(in[34], 0, 3);			/* unidetune		*/
X  out[48] = BITS(in[34], 3, 1);			/* fc1_cs1		*/
X}  
X
Xdx7Ssadvced(data)
Xchar *data;
X{
X  return dx7send_bulk(5, ADVCED_SIZE, data);
X}
X
Xdx7Ssedit(data)
Xchar *data;
X{
X  char edmem[ADVCED_SIZE];
X
X  dx7Sadvmemtoadvced(data+128, edmem);
X  return dx7sedit(data) || dx7Ssadvced(edmem);
X}
X
Xstatic int alloc_bufs(vmem, advmem)
Xchar **vmem, **advmem;
X{
X  if ((*vmem = (char *)malloc(NVOICES * VMEM_SIZE)) != NULL) {
X    if ((*advmem = (char *)malloc(NVOICES * ADVMEM_SIZE)) != NULL)
X      return 0;
X    free(*vmem);
X  }
X
X  Reason = "Couldn't allocate enough buffer space";
X  return 1;
X}
X
Xstatic split_data(data, vmem, advmem)
Xchar *data, *vmem, *advmem;
X{
X  int i;
X
X  for (i=0; i<NVOICES; i++) {
X    memcpy(vmem, data, VMEM_SIZE);
X    memcpy(advmem, data+VMEM_SIZE, ADVMEM_SIZE);
X    data += VMEM_SIZE + ADVMEM_SIZE;
X    vmem += VMEM_SIZE;
X    advmem += ADVMEM_SIZE;
X  }
X}
X
Xstatic combine_data(data, vmem, advmem)
Xchar *data, *vmem, *advmem;
X{
X  int i;
X
X  for (i=0; i<NVOICES; i++) {
X    memcpy(data, vmem, VMEM_SIZE);
X    memcpy(data+VMEM_SIZE, advmem, ADVMEM_SIZE);
X    data += VMEM_SIZE + ADVMEM_SIZE;
X    vmem += VMEM_SIZE;
X    advmem += ADVMEM_SIZE;
X  }
X}
X
Xdx7Ssbulk(data)
Xchar *data;
X{
X  char *vmem, *advmem;
X  int retstat;
X
X  if (alloc_bufs(&vmem, &advmem)) return 1;
X  split_data(data, vmem, advmem);
X
X  retstat = dx7sbulk(vmem) || dx7send_bulk(6, NVOICES * ADVMEM_SIZE, advmem);
X
X  free(vmem);
X  free(advmem);
X
X  return retstat;
X}
X
Xdx7Sgbulk(data)
Xchar *data;
X{
X  char *vmem, *advmem;
X  int retstat;
X
X  if (alloc_bufs(&vmem, &advmem)) return 1;
X
X  retstat = dx7gbulk(vmem) || dx7get_bulk(6, NVOICES * ADVMEM_SIZE, advmem);
X
X  if (!retstat) combine_data(data, vmem, advmem);
X
X  free(vmem);
X  free(advmem);
X
X  return retstat;
X}
X
Xstatic char deflt_advmem[] = {
X 0, 0, 0, 0, 3, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 
X 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
X
X/* read a DX7 file as a DX7S file */
X
Xdx7Sread_dx7(f, data)
XFILE *f;
Xchar *data;
X{
X  int v;
X
X  message("Reading DX7 bank");
X
X  for (v=0; v<NVOICES; v++) {
X    (void)fread(data, VMEM_SIZE, 1, f);
X    memcpy(data+VMEM_SIZE, deflt_advmem, ADVMEM_SIZE);
X    data += VMEM_SIZE + ADVMEM_SIZE;
X  }
X}
X
X/* read a DX7s file as a DX7 file */
X
Xdx7read_dx7S(f, data)
XFILE *f;
Xchar *data;
X{
X  int v;
X
X  message("Reading DX7s bank");
X
X#ifndef SEEK_CUR
X#define SEEK_CUR 1
X#endif
X  for (v=0; v<NVOICES; v++) {
X    (void)fread(data, VMEM_SIZE, 1, f);
X    fseek(f, (long)ADVMEM_SIZE, SEEK_CUR);
X    data += VMEM_SIZE;
X  }
X}
END_OF_FILE
if test 21591 -ne `wc -c <'dx7s.mnu'`; then
    echo shar: \"'dx7s.mnu'\" unpacked with wrong size!
fi
# end of 'dx7s.mnu'
fi
if test -f 'yama_com.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'yama_com.c'\"
else
echo shar: Extracting \"'yama_com.c'\" \(24461 characters\)
sed "s/^X//" >'yama_com.c' <<'END_OF_FILE'
X/* $Id: yama_com.c,v 1.6 89/05/06 17:13:47 lee Exp $
X * GLIB - a Generic LIBrarian and editor for synths
X *
X * Yamaha Common Routines
X * Tim Thompson
X * modifications: Greg Lee
X * $Log:	yama_com.c,v $
X * Revision 1.6  89/05/06  17:13:47  lee
X * rel. to comp.sources.misc
X * 
X */
X
X#define OVERLAY1
X
X#include "glib.h"
X#include <ctype.h>
X
X#define DX100VSIZE 128
X#define DX100NSIZE 17
X
Xchar *visnum(), *visonoff(), *vism3num(), *viswave(), *vismono();
Xchar *visfreq(), *visdx1a();
Xextern int Tx81;
X
Xint *txindex = NULL;
Xint txleng = 0;
X
X
Xextern int Dopmap[];
X
Xint Tx81 = 0;	/* 1 means we're talking to the TX81Z */
Xint Dopmap[] = { 3,1,2,0 };
X
Xint txfreq[] = {
X50, 56, 62, 69, 75, 81, 87, 93,
X     100, 106, 112, 118, 124, 131, 137, 143,
X71, 80, 88, 97, 106, 115, 123, 132,
X     141, 149, 158, 167, 176, 184, 193, 202,
X78, 88, 98, 107, 117, 127, 137, 147,
X     156, 166, 176, 186, 196, 205, 215, 225,
X87, 98, 108, 119, 130, 141, 151, 162,
X     173, 183, 194, 205, 216, 226, 237, 248,
X100, 106, 112, 119, 125, 131, 137, 143,
X     149, 156, 162, 168, 174, 180, 187, 193,
X141, 150, 159, 167, 176, 185, 194, 203,
X     211, 220, 229, 238, 247, 255, 264, 273,
X157, 167, 177, 186, 196, 206, 216, 226,
X     235, 245, 255, 265, 275, 284, 294, 304,
X173, 184, 195, 205, 216, 227, 238, 249,
X     259, 270, 281, 292, 303, 313, 324, 335,
X200, 206, 212, 218, 225, 231, 237, 243,
X     249, 256, 262, 268, 274, 280, 287, 293,
X282, 291, 300, 308, 317, 326, 335, 344,
X     352, 361, 370, 379, 388, 396, 405, 414,
X300, 306, 312, 318, 325, 331, 337, 343,
X     349, 356, 362, 368, 374, 380, 387, 393,
X314, 324, 334, 343, 353, 363, 373, 383,
X     392, 402, 412, 422, 432, 441, 451, 461,
X346, 357, 368, 378, 389, 400, 411, 422,
X     432, 443, 454, 465, 476, 486, 497, 508,
X400, 406, 412, 418, 425, 431, 437, 443,
X     449, 456, 462, 468, 474, 480, 487, 493,
X424, 433, 441, 450, 459, 468, 476, 485,
X     494, 503, 511, 520, 529, 537, 546, 555,
X471, 481, 491, 500, 510, 520, 530, 539,
X     549, 559, 569, 579, 588, 598, 608, 618,
X500, 506, 512, 519, 525, 531, 537, 543,
X     550, 556, 562, 568, 574, 581, 587, 593,
X519, 530, 540, 551, 562, 573, 584, 594,
X     605, 616, 627, 638, 648, 659, 670, 681,
X565, 574, 582, 591, 600, 609, 617, 626,
X     635, 644, 652, 661, 670, 678, 687, 696,
X600, 606, 612, 619, 625, 631, 637, 643,
X     650, 656, 662, 668, 674, 681, 687, 693,
X628, 638, 647, 657, 667, 677, 687, 696,
X     706, 716, 726, 736, 745, 755, 765, 775,
X692, 703, 713, 724, 735, 746, 757, 767,
X     778, 789, 800, 811, 821, 832, 843, 854,
X700, 706, 712, 719, 725, 731, 737, 743,
X     750, 756, 762, 768, 774, 781, 787, 793,
X707, 716, 724, 733, 742, 750, 759, 768,
X     776, 785, 794, 802, 811, 820, 828, 837,
X785, 795, 804, 814, 824, 834, 844, 853,
X     863, 873, 883, 893, 902, 912, 922, 932,
X800, 806, 812, 819, 825, 831, 837, 843,
X     850, 856, 862, 868, 874, 881, 887, 893,
X848, 857, 865, 874, 883, 891, 900, 909,
X     917, 926, 935, 943, 952, 961, 969, 978,
X865, 876, 886, 897, 908, 919, 930, 940,
X     951, 962, 973, 984, 994, 1005, 1016, 1027,
X900, 906, 912, 919, 925, 931, 937, 943,
X     950, 956, 962, 968, 974, 981, 987, 993,
X942, 952, 961, 971, 981, 991, 1001, 1010,
X     1020, 1030, 1040, 1050, 1059, 1069, 1079, 1089,
X989, 998, 1006, 1015, 1024, 1032, 1041, 1050,
X     1058, 1067, 1076, 1084, 1093, 1102, 1110, 1119,
X1000, 1006, 1012, 1019, 1025, 1031, 1037, 1043,
X     1050, 1056, 1062, 1068, 1074, 1081, 1087, 1093,
X1038, 1049, 1060, 1070, 1081, 1092, 1103, 1113,
X     1124, 1135, 1146, 1157, 1167, 1178, 1189, 1200,
X1099, 1109, 1119, 1128, 1138, 1148, 1158, 1167,
X     1177, 1187, 1197, 1207, 1216, 1226, 1236, 1246,
X1100, 1106, 1112, 1119, 1125, 1131, 1137, 1143,
X     1150, 1156, 1162, 1168, 1174, 1181, 1187, 1193,
X1130, 1139, 1147, 1156, 1165, 1173, 1182, 1191,
X     1199, 1208, 1217, 1225, 1234, 1243, 1251, 1260,
X1200, 1206, 1212, 1219, 1225, 1231, 1237, 1243,
X     1250, 1256, 1262, 1268, 1274, 1281, 1287, 1293,
X1211, 1222, 1233, 1243, 1254, 1265, 1276, 1286,
X     1297, 1308, 1319, 1330, 1340, 1351, 1362, 1373,
X1256, 1266, 1276, 1285, 1295, 1305, 1315, 1324,
X     1334, 1344, 1354, 1364, 1373, 1383, 1393, 1403,
X1272, 1281, 1289, 1298, 1306, 1315, 1323, 1332,
X     1341, 1349, 1358, 1366, 1375, 1384, 1392, 1401,
X1300, 1306, 1312, 1319, 1325, 1331, 1337, 1343,
X     1350, 1356, 1362, 1368, 1374, 1381, 1387, 1393,
X1384, 1395, 1406, 1416, 1427, 1438, 1449, 1459,
X     1470, 1481, 1492, 1503, 1513, 1524, 1535, 1546,
X1400, 1406, 1412, 1419, 1425, 1431, 1437, 1443,
X     1450, 1456, 1462, 1468, 1474, 1481, 1487, 1493,
X1410, 1419, 1428, 1436, 1445, 1454, 1463, 1471,
X     1480, 1489, 1498, 1507, 1515, 1524, 1533, 1542,
X1413, 1423, 1433, 1442, 1452, 1462, 1472, 1481,
X     1491, 1501, 1511, 1521, 1530, 1540, 1550, 1560,
X1500, 1506, 1512, 1519, 1525, 1531, 1537, 1543,
X     1550, 1556, 1562, 1568, 1574, 1581, 1587, 1593,
X1555, 1563, 1572, 1581, 1589, 1598, 1606, 1615,
X     1623, 1632, 1640, 1649, 1657, 1666, 1674, 1683,
X1557, 1568, 1579, 1589, 1600, 1611, 1622, 1632,
X     1643, 1654, 1665, 1676, 1686, 1697, 1708, 1719,
X1570, 1580, 1590, 1599, 1609, 1619, 1629, 1638,
X     1648, 1658, 1668, 1678, 1687, 1697, 1707, 1717,
X1696, 1704, 1713, 1722, 1730, 1739, 1747, 1756,
X     1764, 1773, 1781, 1790, 1798, 1807, 1815, 1824,
X1727, 1737, 1747, 1756, 1766, 1776, 1786, 1795,
X     1805, 1815, 1825, 1835, 1844, 1854, 1864, 1874,
X1730, 1741, 1752, 1762, 1773, 1784, 1795, 1805,
X     1816, 1827, 1838, 1849, 1859, 1870, 1881, 1892,
X1837, 1845, 1854, 1863, 1871, 1880, 1888, 1897,
X     1905, 1914, 1922, 1931, 1939, 1948, 1956, 1965,
X1884, 1894, 1904, 1913, 1923, 1933, 1943, 1952,
X     1962, 1972, 1982, 1992, 2001, 2011, 2021, 2031,
X1903, 1914, 1925, 1935, 1946, 1957, 1968, 1978,
X     1989, 2000, 2011, 2022, 2032, 2043, 2054, 2065,
X1978, 1986, 1995, 2004, 2012, 2021, 2029, 2038,
X     2046, 2055, 2063, 2072, 2080, 2089, 2097, 2106,
X2041, 2051, 2061, 2070, 2080, 2090, 2100, 2110,
X     2119, 2129, 2139, 2149, 2159, 2168, 2178, 2188,
X2076, 2087, 2098, 2108, 2119, 2130, 2141, 2152,
X     2162, 2173, 2184, 2195, 2206, 2216, 2227, 2238,
X2120, 2128, 2137, 2145, 2154, 2162, 2171, 2179,
X     2188, 2196, 2205, 2213, 2222, 2230, 2238, 2247,
X2198, 2208, 2218, 2227, 2237, 2247, 2257, 2267,
X     2276, 2286, 2296, 2306, 2316, 2325, 2335, 2345,
X2249, 2260, 2271, 2281, 2292, 2303, 2314, 2325,
X     2335, 2346, 2357, 2368, 2379, 2389, 2400, 2411,
X2355, 2365, 2375, 2384, 2394, 2404, 2414, 2424,
X     2433, 2443, 2453, 2463, 2473, 2482, 2492, 2502,
X2422, 2433, 2444, 2454, 2465, 2476, 2487, 2498,
X     2508, 2519, 2530, 2541, 2552, 2562, 2573, 2584,
X2595, 2606, 2617, 2627, 2638, 2649, 2660, 2671,
X     2681, 2692, 2703, 2714, 2725, 2735, 2746, 2757
X};
X
X/*
X * dxtxdin
X *
X * Take info from 'data' and stuff values in the P array, by using
X * the setval (and setopval) functions.  'data' is the Yamaha VMEM format.
X * This function works for both the dx100 and tx81z.
X */
X
Xdxtxdin(data)
Xchar *data;
X{
X	int dop, adop, n, crs, fin, v;
X
X	setdxtx();
X	if ( Tx81 )
X		txinit();
X	for ( n=1; n<=4; n++ ) {
X		dop = Dopmap[n-1]*10;
X		adop = Dopmap[n-1]*2;
X		setopval(n,"attack",data[0+dop]);
X		setopval(n,"decay1",data[1+dop]);
X		setopval(n,"level1",data[4+dop]);
X		setopval(n,"decay2",data[2+dop]);
X		setopval(n,"release",data[3+dop]);
X		setopval(n,"keyscale",data[5+dop]);
X		setopval(n,"ampmod",(data[6+dop]>>6)&01);
X		setopval(n,"egbias",(data[6+dop]>>3)&07);
X		setopval(n,"velocity",data[6+dop]&07);
X		setopval(n,"outlevel",data[7+dop]);
X
X		if ( Tx81 ) {
X			crs = data[8+dop];
X			fin = (data[74+adop]) & 017;
X			v = freqin(crs,fin);
X			setopval(n,"freq",v);
X		}
X		else
X			setopval(n,"freq",data[8+dop]);
X
X		setopval(n,"keyrate",data[9+dop]>>3);
X		setopval(n,"detune",data[9+dop]&07);
X
X		if ( Tx81 ) {
X			setopval(n,"egsft",(data[73+adop]>>4)&03);
X			setopval(n,"fix",(data[73+adop]>>3)&01);
X			setopval(n,"wave",(data[74+adop]>>4)&07);
X		}
X	}
X	setval("lfosync",(data[40]>>6)&01);
X	setval("feedback",(data[40]>>3)&07);
X	setval("algorithm",data[40]&07);
X	setval("lfospeed",data[41]);
X	setval("lfodelay",data[42]);
X	setval("pmoddepth",data[43]);
X	setval("amoddepth",data[44]);
X	setval("pmodsens",(data[45]>>4)&07);
X	setval("amodsens",(data[45]>>2)&03);
X	setval("lfowave",data[45]&03);
X	setval("transpose",data[46]);
X	setval("pitchbend",data[47]);
X	setval("portatime",data[49]);
X	setval("modprange",data[51]);
X	setval("modarange",data[52]);
X	setval("breathprange",data[53]);
X	setval("breatharange",data[54]);
X	setval("breathpbias",data[55]);
X	setval("breathegbias",data[56]);
X	setval("playmode",(data[48]>>3)&01);
X	setval("susfoot",(data[48]>>2)&01);
X	setval("portfoot",(data[48]>>1)&01);
X	setval("portmode",data[48]&01);
X	setval("autochan",Channel);
X	if ( Tx81 ) {
X		setval("reverbrate",data[81]&07);
X		setval("fcpitch",data[82]);
X		setval("fcamp",data[83]);
X	}
X}
X
X/*
X * dxtxdout
X *
X * Take (possibly changed) parameters values out of the P array and
X * put them back into 'data'.  'data' is in the Yamaha VMEM format.
X * This works for both the dx100 and tx81z.
X */
X
Xdxtxdout(data)
Xchar *data;
X{
X	int dop, n, crs, fin;
X
X	for ( n=1; n<=4; n++ ) {
X		dop = Dopmap[n-1]*10;
X		data[0+dop] = getopval(n,"attack");
X		data[1+dop] = getopval(n,"decay1");
X		data[4+dop] = getopval(n,"level1");
X		data[2+dop] = getopval(n,"decay2");
X		data[3+dop] = getopval(n,"release");
X		data[5+dop] = getopval(n,"keyscale");
X		data[6+dop] = getopval(n,"ampmod")<<6
X				| getopval(n,"egbias")<<3
X				| getopval(n,"velocity");
X		data[7+dop] = getopval(n,"outlevel");
X		data[9+dop] = getopval(n,"keyrate")<<3 | getopval(n,"detune");
X
X		if ( ! Tx81 ) {
X			data[8+dop] = getopval(n,"freq");
X		}
X		else {
X			freqout(getopval(n,"freq"),&crs,&fin);
X			data[8+dop] = crs;
X
X			dop = Dopmap[n-1]*2;
X			data[73+dop] = getopval(n,"egsft")<<4
X					| getopval(n,"fix")<<3
X					/* | getopval(n,"fixrg") */;
X			data[74+dop] = getopval(n,"wave")<<4 | fin;
X		}
X	}
X	data[40] = getval("lfosync")<<6
X		| getval("feedback")<<3
X		| getval("algorithm");
X	data[41] = getval("lfospeed");
X	data[42] = getval("lfodelay");
X	data[43] = getval("pmoddepth");
X	data[44] = getval("amoddepth");
X	data[45] = getval("pmodsens")<<4 | getval("amodsens")<<2
X		| getval("lfowave");
X	data[46] = getval("transpose");
X	data[47] = getval("pitchbend");
X	data[49] = getval("portatime");
X	data[51] = getval("modprange");
X	data[52] = getval("modarange");
X	data[53] = getval("breathprange");
X	data[54] = getval("breatharange");
X	data[55] = getval("breathpbias");
X	data[56] = getval("breathegbias");
X	data[48] = (unsigned) ( getval("playmode")<<3
X		| getval("susfoot")<<2
X		| getval("portfoot")<<1
X		| getval("portmode"));
X
X	if ( Tx81 ) {
X		data[81] = getval("reverbrate");
X		data[82] = getval("fcpitch");
X		data[83] = getval("fcamp");
X	}
X
X	Channel = getval("autochan");
X}
X
Xsetdxtx()
X{
X	if ( strcmp(Synthname,"DX-100")==0 )
X		Tx81 = 0;
X	else
X		Tx81 = 1;
X}
X
Xsetopval(n,str,v)
Xchar *str;
X{
X	char buff[32];
X	sprintf(buff,"op%d%s",n,str);
X	setval(buff,v);
X}
X
Xgetopval(n,str)
Xchar *str;
X{
X	char buff[32];
X	sprintf(buff,"op%d%s",n,str);
X	return(getval(buff));
X}
X
X/*
X * The routines below are used (in the P array) for printing the
X * values of various parameters (e.g. the vism3num routine prints
X * the value-3, which is appropriate for the 'detune' parameter.
X */
X
Xchar Numbuff[8];
X
Xchar *visnum();
X
Xchar *
Xvism3num(v)
X{
X	sprintf(Numbuff,"%d",v-3);
X	return(Numbuff);
X}
X
Xchar *visonoff();
X
Xchar *
Xvismono(v)
X{
X	if ( v==0 )
X		return("poly");
X	else
X		return("mono");
X}
X
X/*
X            4    2  4    2         4                             4
X            |    |  |    |         |               4             |
X        2---3    ---3    3  4   2  3   1  4     ___|___    1  2  3
X        |           |    |  |   |  |   |  |     |  |  |    |__|__|
X        1           1    1---   1---   2  3     1  2  3
X                                       |__|     |__|__|
X                                                             1  2  3  4
X                                                             |__|__|__|
X */
X
Xchar *Algostr[] = {
X	"1     ~d2---3~u~l|~u~l4~d~d~d~l~l~l~l~l|~l~d1",
X	"2     ~d---3~l~l~l~l~u|  |~l~l~l~l~u2  4~l~d~d~d|~l~d1",
X	"3     ~d3  4~l~l~l~l~u|~l~u2~l~d~d~d|  |~d~l~l~l~l1---",
X	"4     ~d2  3~l~u|~u~l4~l~d~d~d~l~l~l|  |~l~l~l~l~d1---",
X	"5     ~d~u1  4~d~l~l~l~l|  |~d~l~l~l~l2  3~d~l~l~l~l----",
X	"6     ~d|  |  |~u~l~l~l~l~l~l~l___|___~u~l~l~l~l4~l~d~d~d~l~l~l1  2  3~d~l~l~l~l~l~l~l|__|__|",
X	"7     ~d1  2  3~u~l|~u~l4~l~d~d~d~l~l~l~l~l~l|__|__|",
X	"8     ~d1  2  3  4~d~l~l~l~l~l~l~l~l~l~l|__|__|__|"
X};
X
Xchar *
Xvisdx1a(v)
X{
X	if ( v >= 0 && v <= 7 )
X		return(Algostr[v]);
X	else
X		return("????");
X}
X
Xchar *
Xviswave(v)
X{
X	switch(v){
X	case 0: return("saw up");
X	case 1: return("square");
X	case 2: return("triangle");
X	case 3: return("s/hold");
X	default: return("???");
X	}
X}
X
Xchar *Freqstr[] = {	/* values from 0 to 63 */
X	"0.50 ", "0.71 ", "0.78 ", "0.87 ", "1.00 ",
X	"1.41 ", "1.57 ", "1.73 ", "2.00 ", "2.82 ",
X	"3.00 ", "3.14 ", "3.46 ", "4.00 ", "4.24 ",
X	"4.71 ", "5.00 ", "5.19 ", "5.65 ", "6.00 ",
X	"6.28 ", "6.92 ", "7.00 ", "7.07 ", "7.85 ",
X	"8.00 ", "8.48 ", "8.65 ", "9.00 ", "9.42 ",
X	"9.89 ", "10.00", "10.38", "10.99", "11.00",
X	"11.30", "12.00", "12.11", "12.56", "12.72",
X	"13.00", "13.84", "14.00", "14.10", "14.13",
X	"15.00", "15.55", "15.57", "15.70", "16.96",
X	"17.27", "17.30", "18.37", "18.84", "19.03",
X	"19.78", "20.41", "20.76", "21.20", "21.98",
X	"22.49", "23.55", "24.22", "25.95"
X};
X
Xchar *
Xvisfreq(v)
X{
X	if ( v >=0 && v <= 63 )
X		return ( Freqstr[v] );
X	else
X		return("????");
X}
X
X/*
X * dx1sedit
X *
X * Send a single voice to the edit buffer of the DX.
X */
Xdx1sedit(data)
Xchar *data;
X{
X	setdxtx();
X	if ( Tx81 )
X		sendaced(data);
X	sendvced(data);
X}
X
Xsendvced(data)
Xchar *data;
X{
X	char vdata[DX100VSIZE];
X	int n, cksum, c;
X
X	clrdata(vdata,DX100VSIZE);
X	vmtovced(data,vdata);
X	sendmidi(0xf0);
X	sendmidi(0x43);
X	sendmidi(Channel-1);	/* channel # */
X	sendmidi(0x03);		/* format type */
X	sendmidi(0x00);		/* byte count */
X	sendmidi(0x5d);		/* byte count */
X	cksum = 0;
X	for ( n=0; n<93; n++ ) {
X		sendmidi(c = (int)(vdata[n]));
X		cksum += c;
X	}
X	sendmidi((-cksum) & 0x7f);
X	sendmidi(EOX);
X}
X
Xsendaced(data)
Xchar *data;
X{
X	char *p, vdata[DX100VSIZE];
X	int n, cksum, c;
X
X	clrdata(vdata,DX100VSIZE);
X	vmtoaced(data,vdata);
X	sendmidi(0xf0);
X	sendmidi(0x43);
X	sendmidi(Channel-1);	/* channel # */
X	sendmidi(0x7e);		/* format type */
X	sendmidi(0x00);		/* byte count */
X	sendmidi(0x21);		/* byte count */
X	p = "LM  8976AE";
X	cksum = 0;
X	while ( (c=(int)(*p++)) != '\0' ) {
X		sendmidi(c);
X		cksum += c;
X	}
X	for ( n=0; n<23; n++ ) {
X		sendmidi(c=(int)(vdata[n]));
X		cksum += c;
X	}
X	sendmidi((-cksum) & 0x7f);
X	sendmidi(EOX);
X}
X
X/*
X * vmtovced
X *
X * convert a vmem format voice to vced format.
X */
X
Xvmtovced(data,vdata)
Xchar *data;
Xchar *vdata;
X{
X	int vop, dop, n;
X
X	for ( n=0; n<4; n++ ) {
X		/* vop = Dopmap[n]*13; */
X		vop = Dopmap[n]*13;
X		dop = Dopmap[n]*10;
X		vdata[vop+0] = data[dop+0];	/* attack rate */
X		vdata[vop+1] = data[dop+1];	/* decay 1 rate */
X		vdata[vop+2] = data[dop+2];	/* decay 2 rate */
X		vdata[vop+3] = data[dop+3];	/* release rate */
X		vdata[vop+4] = data[dop+4];	/* decal 1 level */
X		vdata[vop+5] = data[dop+5];	/* keyboard scaling level */
X		vdata[vop+6] = (data[dop+9]>>3);/* keyboard scaling rate */
X		vdata[vop+7] = (data[dop+6]>>3)&7;	/* eg bias sens. */
X		vdata[vop+8] = (data[dop+6]>>6)&1;	/* amp. mod. enable */
X		vdata[vop+9] = (data[dop+6]&7);	/* key velocity */
X		vdata[vop+10] = data[dop+7];	/* output level */
X		vdata[vop+11] = data[dop+8];	/* osc. frequency */
X		vdata[vop+12] = (data[dop+9]&7);	/* detune */
X	}
X	vdata[52] = (data[40]&7);	/* algorithm */
X	vdata[53] = (data[40]>>3)&7;	/* feedback level */
X	vdata[54] = data[41];		/* lfo speed */
X	vdata[55] = data[42];		/* lfo delay */
X	vdata[56] = data[43];		/* pitch modulation depth */
X	vdata[57] = data[44];		/* amplitude modulation depth */
X	vdata[58] = (data[40]>>6)&1;	/* lfo sync */
X	vdata[59] = data[45]&3;		/* lfo wave */
X	vdata[60] = (data[45]>>4)&7;		/* pitch modulation sens. */
X	vdata[61] = (data[45]>>2)&3;		/* amp. modulation sens. */
X	vdata[62] = data[46];		/* transpose */
X	vdata[63] = (data[48]>>3)&1;	/* play mode (poly/mono) */
X	vdata[64] = data[47];		/* pitch bend range */
X	vdata[65] = (data[48]&1);	/* portamento mode */
X	vdata[66] = data[49];		/* portamento time */
X	vdata[67] = data[50];		/* foot volume range */
X	vdata[68] = (data[48]>>2)&1;	/* sustain foot switch */
X	vdata[69] = (data[48]>>1)&1;	/* portamento foot switch */
X	vdata[70] = (data[48]>>4)&1;	/* chorus switch */
X	vdata[71] = data[51];		/* mod. wheel pitch mod. range */
X	vdata[72] = data[52];		/* mod. wheel ampli. mod. range */
X	vdata[73] = data[53];		/* breath pitch mod. range */
X	vdata[74] = data[54];		/* breath ampli. mod. range */
X	vdata[75] = data[55];		/* breath control pitch bias range */
X	vdata[76] = data[56];		/* breath control EG bias range */
X	for ( n=77; n<93; n++ )		/* voice name AND pitch EG rates */
X		vdata[n] = data[n-20];
X}
X
X/*
X * vmtoaced
X *
X * Convert a vmem format voice to aced format (TX81Z).
X */
X
Xvmtoaced(data,adata)
Xchar *data;
Xchar *adata;
X{
X	int vop, aop, n;
X
X	for ( n=0; n<4; n++ ) {
X	    vop = 73 + Dopmap[n]*2;
X	    aop = Dopmap[n]*5;
X	    adata[0+aop] = (data[vop]>>3) & 01;    /* fixed freq (0,1) */
X	    adata[1+aop] = data[vop] & 07;	   /* fixed freq range (0-7) */
X	    adata[2+aop] = data[vop+1] & 017;	   /* freq range fine (0-15) */
X	    adata[3+aop] = (data[vop+1]>>4) & 07;  /* op. waveform (0-7) */
X	    adata[4+aop] = (data[vop]>>3) & 03;   /* EG shift (0-3) */
X	}
X	adata[20] = data[81] & 07;	/* reverb rate */
X	adata[21] = data[82];	/* Foot controller pitch */
X	adata[22] = data[83];	/* Foot controller amp. */
X}
X
X#ifdef OLD
X/*
X * Send a single parameter value.
X */
Xsendparam(param,val)
X{
X	sendmidi(0xf0);
X	sendmidi(0x43);
X	sendmidi(0x10);	/* Channel? */
X	sendmidi(0x12);
X	sendmidi(param);
X	sendmidi(val);
X	sendmidi(EOX);
X}
X
X/*
X * remotely press a key on the DX
X */
Xpresskey(key,val)
X{
X	sendmidi(0xf0);
X	sendmidi(0x43);
X	sendmidi(0x10);	/* Channel? */
X	sendmidi(0x08);
X	sendmidi(key);
X	sendmidi(val);
X	sendmidi(EOX);
X}
X
X/*
X * tovmem
X *
X * convert a vced format voice to vmem format.
X */
X
Xtovmem(vdata,data)
Xchar *vdata;	/* vced format data */
Xchar *data;	/* vmem format */
X{
X	int vop, dop, n;
X
X	for ( n=0; n<4; n++ ) {
X		vop = Dopmap[n]*13;
X		dop = Dopmap[n]*10;
X		data[dop+0] = vdata[vop+0];	/* attack rate */
X		data[dop+1] = vdata[vop+1];	/* decay 1 rate */
X		data[dop+2] = vdata[vop+2];	/* decay 2 rate */
X		data[dop+3] = vdata[vop+3];	/* release rate */
X		data[dop+4] = vdata[vop+4];	/* decal 1 level */
X		data[dop+5] = vdata[vop+5];	/* keyboard scaling level */
X				/* amp. mod. enab/eg bias sens/key velocity */
X		data[dop+6]=(vdata[vop+8]<<6) | (vdata[vop+7]<<3) | vdata[vop+9];
X		data[dop+7] = vdata[vop+10];	/* output level */
X		data[dop+8] = vdata[vop+11];	/* osc. frequency */
X				/* key scaling rate/detune */
X		data[dop+9] = (vdata[vop+6]<<3) | vdata[vop+12];
X	}
X		/* lfo sync/feedback level/algorithm */
X	data[40] = (vdata[58]<<6) | (vdata[53]<<3) | vdata[52];
X	data[41] = vdata[54];		/* lfo speed */
X	data[42] = vdata[55];		/* lfo delay */
X	data[43] = vdata[56];		/* pitch modulation depth */
X	data[44] = vdata[57];		/* amplitude modulation depth */
X		/* pitch mod. sens/amp. mod. sens/lfo wave */
X	data[45] = (vdata[60]<<4) | (vdata[61]<<2) | vdata[59];
X	data[46] = vdata[62];		/* transpose */
X
X		/* chorus/playmode/sustain/portamento-foot/portamento-mode */
X	data[48] = (vdata[70]<<4)|(vdata[63]<<3)|(vdata[68]<<2)|(vdata[69]<<1)
X		| vdata[65];
X
X	data[47] = vdata[64];		/* pitch bend range */
X	data[49] = vdata[66];		/* portamento time */
X	data[50] = vdata[67];		/* foot volume range */
X	data[51] = vdata[71];		/* mod. wheel pitch mod. range */
X	data[52] = vdata[72];		/* mod. wheel ampli. mod. range */
X	data[53] = vdata[73];		/* breath pitch mod. range */
X	data[54] = vdata[74];		/* breath ampli. mod. range */
X	data[55] = vdata[75];		/* breath control pitch bias range */
X	data[56] = vdata[76];		/* breath control EG bias range */
X	for ( n=77; n<93; n++ )		/* voice name AND pitch EG rates */
X		data[n-20] = vdata[n];
X}
X#endif
X
X/* dx1nof - return a pointer to the voice name buried in data */
Xchar *
Xdx1nof(data)
Xchar *data;
X{
X	static char currbuff[DX100NSIZE+1];
X	char *p;
X	int m;
X
X	p = currbuff;
X	for ( m=0; m<10; m++ )
X		*p++ = data[57+m];
X	*p = '\0';
X	return(currbuff);
X}
X
X/* dx1snof - set the voice name buried in data to name */
Xdx1snof(data,name)
Xchar *data;
Xchar *name;
X{
X	char *p;
X	int m;
X
X	for ( p=name,m=0; *p!='\0' && m<10; p++,m++ )
X		data[57+m] = *p;
X	for ( ; m<10; m++ )
X		data[57+m] = ' ';
X}
X
X/* dx1sbulk - send a bulk dump to the DX-100 */
Xdx1sbulk(data)
Xchar *data;
X{
X	int c, v, n, cksum;
X
X	sendmidi(0xf0);
X	sendmidi(0x43);
X	sendmidi(Channel-1);	/* Channel # */
X	sendmidi(0x04);
X	sendmidi(0x20);
X	sendmidi(0x00);
X	cksum = 0;
X	/* send 32 voices worth of data */
X	for ( v=0; v<32; v++ ) {
X		for ( n=0; n<DX100VSIZE; n++ ) {
X			/* The DX100 can only handle 24 voices (but needs */
X			/* to have 32 voices worth of data sent, anyway) */
X			if ( v >= 24 && ( ! Tx81 ) )
X				c = 0;
X			else
X				c = VOICEBYTE(data,v,n);
X			sendmidi(c & 0xff);
X			cksum += c;
X		}
X	}
X	sendmidi((-cksum) & 0x7f);
X	sendmidi(0xf7);
X	return(0);
X}
X
X/* dx1gbulk - Request and read a bulk dump from the DX-100 */
Xdx1gbulk(data)
Xchar *data;
X{
X	int c, n, v, b1, b2, cksum, ret = 1;
X	long begin, toolong;
X
X	setdxtx();
X	flushmidi();
X
X	sendmidi(0xf0);
X	sendmidi(0x43);
X	sendmidi(0x20 | (Channel-1) );	/* Channel # */
X	sendmidi(4);			/* 4 == 32 voice bulk dump */
X	sendmidi(EOX);			/* EOX */
X
X	begin = milliclock();
X	toolong = begin + 1000 * TIMEOUT;
X
X	if (synthinfileflag) getmidi(); /* the 0xf0 byte */
X
X	/* wait for the x43 byte starting the dump */
X	while ( milliclock() < toolong ) {
X		if ( STATMIDI && (c=(getmidi() & 0xff)) == 0x43 )
X			break;
X	}
X	if ( c != 0x43 ) {
X		Reason = "Timeout waiting for 0x43";
X		goto getout;
X	}
X	getmidi();	/* channel # */
X	getmidi();	/* format # */
X	getmidi();	/* byte count high byte */
X	getmidi();	/* byte count low byte */
X
X	cksum = 0;
X	/* 32 voices are dumped */
X	for ( v=0; v<32; v++ ) {
X		for ( n=0; n<DX100VSIZE; n++ ) {
X			/* twiddle your thumbs, but not forever */
X			while ( ! STATMIDI ) {
X				if ( milliclock() > toolong )
X					goto timeout;	/* the end of an era */
X			}
X			c = (getmidi() & 0xff);
X			/* Ignore non-data bytes ? */
X			if ( c & 0x80 )
X				continue;
X			/* compute checksum */
X			cksum += c;
X			/* Only 24 voices are used on the DX100 */
X			if ( v < 24 || Tx81 )
X				VOICEBYTE(data,v,n) = c;
X		}
X	}
Xtimeout:
X	if ( v < 32 ) {
X		Reason = "Timeout while reading!";
X		goto getout;
X	}
X	b1 = (getmidi() & 0xff);	/* Checksum */
X	b2 = (getmidi() & 0xff);	/* EOX */
X	cksum = (-cksum) & 0x7f;	/* convert to what we must match */
X	if ( b2 != EOX )
X		Reason = "EOX not received";
X	else if ( b1 != cksum ) {
X		static char ckbuff[80];
X		sprintf(ckbuff,"Checksum doesn't match (got %d expected %d)",b1,cksum);
X		/* Reason = "Checksum doesn't match"; */
X		Reason = ckbuff;
X	}
X	else {
X		Reason = "";
X		ret = 0;	/* all's well */
X	}
Xgetout:
X	return(ret);
X}
X
X#ifdef OLDSTUFF
Xdxchecksum(data)
Xchar *data;
X{
X	int v, n, s=0;
X
X	for ( v=0; v<DX100NVOICES; v++ ) {
X		for ( n=0; n<DX100VSIZE; n++ ) {
X			s += (int)(VOICEBYTE(data,v,n));
X			while ( s > 128 )
X				s -= 128;
X		}
X	}
X	return(128-s);
X}
X#endif
X
Xfreqin(crs,fin)
X{
X	int n, f;
X
X	txinit();
X	f = txfreq[crs*16+fin];
X	for ( n=0; n<txleng; n++ ) {
X		if ( txfreq[txindex[n]] == f )
X			return(n);
X	}
X	return(0);
X}
X
Xfreqout(v,acrs,afin)
Xint *acrs;
Xint *afin;
X{
X	int i;
X
X	i = txindex[v];
X	*acrs = i/16;
X	*afin = i%16;
X}
X
Xtxinit()
X{
X	int n, k;
X	char *parm;
X
X	if ( txindex != NULL )
X		return;
X	/* create an array of indexes into txfreq, giving a sorted */
X	/* list of unique frequencies. */
X	txindex = (int *) alloc(sizeof(int) * 64 * 16);
X	for ( n=0; n<64; n++ ) {
X		for ( k=0; k<16; k++ ) {
X			int freq = txfreq[n*16+k];
X			register int i, f;
X			register int *p, *endp;
X
X			/* insertion sort, starting from top of already */
X			/* sorted list, since the values we're inserting */
X			/* are almost sorted already. */
X			for ( i=txleng-1; i>=0; i-- ) {
X				if ( (f=txfreq[txindex[i]]) < freq )
X					break;
X				if ( f == freq )
X					goto dontadd;
X			}
X			i++;
X			/* shift everything up one */
X			p = &txindex[txleng];
X			endp = &txindex[i];
X			for ( ; p>endp; p-- )
X				*p = *(p-1);
X			txindex[i] = 16*n+k;
X			txleng++;
X		    dontadd: ;
X		}
X	}
X	/* set the maximum value for the frequency parameters */
X	parm = "op#freq";
X	for ( n=1; n<=4; n++ ) {
X		parm[2] = '0' + n;
X		if ( (k=parmindex(parm)) >= 0 )
X			P[k].p_max = txleng-1;
X	}
X}
END_OF_FILE
if test 24461 -ne `wc -c <'yama_com.c'`; then
    echo shar: \"'yama_com.c'\" unpacked with wrong size!
fi
# end of 'yama_com.c'
fi
echo shar: End of archive 10 \(of 15\).
cp /dev/null ark10isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 15 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0