home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
misc
/
volume6
/
glib
/
part04
/
d10pat.mnu
next >
Wrap
Text File
|
1989-05-14
|
10KB
|
505 lines
/* $Id: d10pat.mnu,v 1.6 89/05/06 17:13:14 lee Exp $
* GLIB - a Generic LIBrarian and editor for synths
*
* D10 Patch Librarian
*
* Code started 19 JAN 89 -- Michael R. Kesti mrk@gvgspd.GVG.TEK.COM
* modified by Greg Lee
* $Log: d10pat.mnu,v $
* Revision 1.6 89/05/06 17:13:14 lee
* rel. to comp.sources.misc
*
*/
#include "glib.h"
#include "vis.h"
#define D10PATSIZE 38
#define PATBASEADDR 0x070000
#define RESERVESIZE 20
char *visnum(), *visonoff();
/* This array contains arbitrary screen labels */
struct labelinfo Ldpat[] = {
#MENU
Reverb Type %
Reverb Time %
Reverb Level %
Patch Level %
Key Mode %
Split Point %
LOWER UPPER
----- -----
Tone Select %% %%
Key Shift % %
Fine Tune % %
Bender Range % %
Assign Mode % %
Reverb Switch % %
Tone Balance %
Press SPACE BAR to sound note % at volume % for duration % on channel % .
#END
-1,-1,NULL
};
struct paraminfo Pdpat[] = {
/*
NAME TYPE POS MAX OFFSET MASK SHIFT ADHOC
*/
#O reverbtype reverbtype %% 8 16
#O reverbtime reverbtime %% 7 17
#O reverblevel reverblevel %% 7 18
#O patchlevel patchlevel %% 100 20
#O keymode keymode %% 2 0
#O splitpoint split %% 61 1
#O ltonegroup tonegroup %% 3 2
#O ltonenum tonenum %% 63 3
#O utonegroup tonegroup %% 3 4
#O utonenum tonenum %% 63 5
#O lkeyshift keyshift %% 48 6
#O ukeyshift keyshift %% 48 7
#O lfinetune finetune %% 100 8
#O ufinetune finetune %% 100 9
#O lbendrange bendrange %% 24 10
#O ubendrange bendrange %% 24 11
#O lassignmode assignmode %% 3 12
#O uassignmode assignmode %% 3 13
#O lreverbsw onoff %% 1 14
#O ureverbsw onoff %% 1 15
#O tonebal tonebal %% 100 19
#O autopitch num %% 127 -60
#O autovol num %% 127 -63
#O autodur num %% 20 -5 *5
#O autochan num %% 16 -1 *5
NULL,NULL,-1,-1,-1,-1,visnum,0,0,0,0
};
/*
* dpatnum
*
* Convert a voice number (0 to 127) to the string displayed in the
* librarian (ie. 011 to 188).
*/
char *
dpatnum(n)
{
static char v[4];
if ( n < 0 || n > 188 )
return("???");
if(n < 64) {
v[0] = '0';
} else {
v[0] = '1';
n -= 64;
}
v[1] = n/8 + '1';
v[2] = n%8 + '1';
v[3] = '\0';
return(v);
}
/*
* dnumpat
*
* Convert a display-style voice number (011 to 188) to internal
* format (0 to 127).
*/
dnumpat(n)
int n;
{
int ld, md, rd;
/* crack out the digits as octal codes */
ld = (n / 100); /* left digit */
n %= 100;
md = (n / 10) - 1; /* middle digit */
rd = (n % 10) - 1; /* right digit */
if(ld < 0 || ld > 1 || md < 0 || md > 7 || rd < 0 || rd > 7) {
return(-1);
} else {
return((ld * 64) + (md * 8) + rd); /* combine as octal */
}
}
/*
* dpatdin
*
* Take library bank 'data' and stuff values in the P array, by using
* the setval function.
*/
dpatdin(data)
char *data;
{
/* The first RESERVESIZE bytes are reserved (arbitrarily) for the voice name */
#SETVAL
}
/*
* dpatdout
*
* Take (possibly changed) parameters values out of the P array and
* put them back into the library bank 'data'.
*/
dpatdout(data)
char *data;
{
#GETVAL
}
/*
* dpatsedit
*
* Send a single voice to the edit buffer of the D10. This will be whatever
* voice is currently selected.
*/
dpatsedit(data)
char *data;
{
int n;
int cksum;
sendmidi(0xf0);
sendmidi(0x41);
sendmidi(0x10);
sendmidi(0x16);
sendmidi(0x12); /* DT1 - Data set 1 command */
sendmidi(0x03); /* address msb */
cksum = 0x03;
sendmidi(0x04);
cksum += 0x04;
sendmidi(0x00); /* address lsb */
cksum += 0x00;
for(n = 0; n < D10PATSIZE; n++) {
sendmidi(data[n + RESERVESIZE] & 0x7f);
cksum += data[n + RESERVESIZE] & 0x7f;
}
sendmidi((-cksum) & 0x7f); /* checksum */
sendmidi(EOX);
}
/*
* dpatnof
*
* Return a pointer to the voice name buried in library bank data.
*/
char *
dpatnof(data)
char *data;
{
static char currbuff[17];
char *p;
int m;
p = currbuff;
for ( m = 0 ; m < 16 ; m++ )
*p++ = data[m + 41];
*p = '\0';
return(currbuff);
}
/*
* dpatsnof
*
* Set the voice name buried in data to name.
*/
dpatsnof(data,name)
char *data;
char *name;
{
char *p;
int m;
for ( p = name, m = 0 ; *p != '\0' && m < 16 ; p++, m++ )
data[m + 41] = *p;
for ( ; m < 16 ; m++ )
data[m + 41] = ' ';
}
/* dpatsone - send a single voice to the D10 */
dpatsone(iv, data)
int iv;
char *data;
{
int n;
int cksum;
long curadd;
int addbyte;
curadd = PATBASEADDR;
for(n = 0; n < iv; n++) {
curadd += D10PATSIZE;
if((curadd & 0x80) != 0) {
curadd &= 0x7fff7f;
curadd += 0x100;
}
if((curadd & 0x8000) != 0) {
curadd &= 0x7f7f7f;
curadd += 0x10000;
}
}
sendmidi(0xf0);
sendmidi(0x41);
sendmidi(0x10);
sendmidi(0x16);
sendmidi(0x12); /* DT1 - Data set 1 command */
addbyte = ((curadd >> 16) & 0x7f); /* address msb */
sendmidi(addbyte);
cksum = addbyte;
addbyte = ((curadd >> 8) & 0x7f);
sendmidi(addbyte);
cksum += addbyte;
addbyte = (curadd & 0x7f); /* address lsb */
sendmidi(addbyte);
cksum += addbyte;
for(n = 0; n < D10PATSIZE; n++) {
sendmidi(data[n + RESERVESIZE] & 0x7f);
cksum += data[n + RESERVESIZE] & 0x7f;
}
sendmidi((-cksum) & 0x7f); /* checksum */
sendmidi(EOX);
return(0);
}
/* dpatgbulk - Request and read a bulk dump from the D10 */
dpatgbulk(data)
char *data;
{
static char Buff[BUFSIZ];
int n, v, b2, ret = 1;
long begin, toolong;
long curadd;
int addbyte;
int cksum;
sprintf(Buff,"\nA: ");
windstr(Buff);
curadd = PATBASEADDR;
for(v = 0; v < Nvoices; v++) {
flushmidi();
if(v == 64) {
sprintf(Buff,"\nB: ");
windstr(Buff);
}
if((((v > 63) ? (v - 64) : v) % 10) != 0) {
sprintf(Buff, ".");
} else {
sprintf(Buff,"%d", (((v > 63) ? (v - 64) : v) / 10));
}
windstr(Buff);
/* request the voice */
sendmidi(0xf0);
sendmidi(0x41);
sendmidi(0x10);
sendmidi(0x16);
sendmidi(0x11); /* RQ1 - Data request 1 command */
addbyte = ((curadd >> 16) & 0x7f); /* address msb */
sendmidi(addbyte);
cksum = addbyte;
addbyte = ((curadd >> 8) & 0x7f);
sendmidi(addbyte);
cksum += addbyte;
addbyte = (curadd & 0x7f); /* address lsb */
sendmidi(addbyte);
cksum += addbyte;
sendmidi(0x00); /* length msb */
cksum += 0x00;
sendmidi(0x00);
cksum += 0x00;
sendmidi(D10PATSIZE); /* length lsb */
cksum += D10PATSIZE;
sendmidi((-cksum) & 0x7f); /* checksum */
sendmidi(EOX);
/* set up timeout */
begin = milliclock();
toolong = begin + (1000 * TIMEOUT);
/* read header */
for(n = 0; n < 8; ) {
if ( STATMIDI ) {
b2 = (getmidi() & 0xff);
/* burn active sensing and timing clock */
if((b2 != 0xfe) && (b2 != 0xf8))
n++;
} else {
if ( milliclock() > toolong ) {
Reason = "Timeout waiting for header";
goto getout;
}
}
}
/* read data */
for(n = 0; n < D10PATSIZE; ) {
if ( STATMIDI ) {
b2 = (getmidi() & 0xff);
/* burn active sensing and timing clock */
if((b2 != 0xfe) && (b2 != 0xf8)) {
VOICEBYTE(data,v,n + RESERVESIZE) = b2;
n++;
}
} else {
if ( milliclock() > toolong ) {
Reason = "Timeout reading data";
goto timeout;
}
}
}
timeout:
if ( n != D10PATSIZE ) {
Reason = "Timeout reading data!";
goto getout;
}
/* read checksum */
for(n = 0; n < 1; ) {
if ( STATMIDI ) {
b2 = (getmidi() & 0xff);
/* burn active sensing and timing clock */
if((b2 != 0xfe) && (b2 != 0xf8))
n++;
} else {
if ( milliclock() > toolong ) {
Reason = "Timeout reading checksum";
goto getout;
}
}
}
/* read EOX */
for(n = 0; n < 1; ) {
if ( STATMIDI ) {
b2 = (getmidi() & 0xff);
/* burn active sensing and timing clock */
if((b2 != 0xfe) && (b2 != 0xf8))
if ( b2 != EOX ) {
sprintf(Buff,"EOX not received (%X)\n", b2);
Reason = Buff;
goto getout;
}
n++;
} else {
if ( milliclock() > toolong ) {
Reason = "Timeout reading EOX";
goto getout;
}
}
}
curadd += D10PATSIZE;
if((curadd & 0x80) != 0) {
curadd &= 0x7fff7f;
curadd += 0x100;
}
if((curadd & 0x8000) != 0) {
curadd &= 0x7f7f7f;
curadd += 0x10000;
}
} /* go back for another voice */
Reason = "";
ret = 0; /* all's well */
getout:
return(ret);
}
/* dpatsbulk - send a bulk dump to the D10 */
dpatsbulk(data)
char *data;
{
static char Buff[BUFSIZ];
int v, n;
int cksum;
long curadd;
int addbyte, databyte;
int curoff;
curadd = PATBASEADDR;
curoff = 0;
sprintf(Buff,"\nA: ");
windstr(Buff);
for(v = 0; v <Nvoices ; v++) {
if(v == 64) {
sprintf(Buff,"\nB: ");
windstr(Buff);
}
if((((v > 63) ? (v - 64) : v) % 10) != 0) {
sprintf(Buff, ".");
} else {
sprintf(Buff,"%d", (((v > 63) ? (v - 64) : v) / 10));
}
windstr(Buff);
sendmidi(0xf0);
sendmidi(0x41);
sendmidi(0x10);
sendmidi(0x16);
sendmidi(0x12); /* DT1 - Data set 1 command */
addbyte = ((curadd >> 16) & 0x7f); /* address msb */
sendmidi(addbyte);
cksum = addbyte;
addbyte = ((curadd >> 8) & 0x7f);
sendmidi(addbyte);
cksum += addbyte;
addbyte = (curadd & 0x7f); /* address lsb */
sendmidi(addbyte);
cksum += addbyte;
for(n = 0; n < D10PATSIZE; n++) {
databyte = data[curoff + n + RESERVESIZE] & 0x7f;
sendmidi(databyte);
cksum += databyte;
}
sendmidi((-cksum) & 0x7f); /* checksum */
sendmidi(EOX);
curadd += D10PATSIZE;
if((curadd & 0x80) != 0) {
curadd &= 0x7fff7f;
curadd += 0x100;
}
if((curadd & 0x8000) != 0) {
curadd &= 0x7f7f7f;
curadd += 0x10000;
}
curoff += (D10PATSIZE + RESERVESIZE);
}
return(0);
}
/* end */