/*
 *	Return string name of 'pitch' and octave number
 */
static char *
itop(pitch)
int pitch;
{
	static char *p[]={"C","C#","D","D#","E","F","F#","G","G#","A","A#","B"};
	static char r[5];

	/* 0 is C-2, 1 is C#-2, 11 is B-2, 12 is C-1 etc */
	sprintf(r, "%2s%d", p[pitch%12], pitch/12 - 2);
	return(r);
}

static char *lfoWave[] = { "tri ", "saw-", "saw+", "squa", "sine", "samp", };
static char *on[] = { "on ","off" };
static char *curve[] = {"-lin", "-exp", "+exp", "+lin"};
static char mode[] = {'R', 'F'};

#define p printf

static dx7PrintOperator(op)
dx7operator *op;
{
p("\
%c %2d %2d %2d  %2d %2d %2d %2d  %2d %2d %2d %2d %4s %4s %4s %2d %2d  %1d  %2d  %1d  %1d",
        mode[op->osc_mode], op->freq_coarse, op->freq_fine, op->detune - 7,
#define el(x) op->x[0],op->x[1],op->x[2],op->x[3]
	el(eg_rate), el(eg_level),
#undef el
	itop(op->kls_break), curve[op->kls_lcurve], curve[op->kls_rcurve],
	op->kls_ldepth, op->kls_rdepth,
	op->k_rate_scale,
	op->out_level, op->vel_sens, op->mod_sens
	);
}

dx7PrintVoice(v)
struct dx7voice *v;
{
       int i;

p("Voice Name: %s\n",v->name);
p("|========================================================================|\n");
p("| algo  feed |---------------L F O---------------|  mod sensitivity      |\n");
p("| rithm back |wave  speed delay  pmd   amd  sync | pitch amplitude       |\n");
p("|  %3d   %3d  %s   %3d   %3d   %3d   %3d   %3d   %3d  ",
    v->algorithm+1,v->feedback,lfoWave[v->lfoWave],v->lfoSpeed,v->lfoDelay,
    v->lfoPmd,v->lfoAmd,v->lfoSync,v->modSensitivityPitch);
);

	for (i=6; i>=1; i--) {
		struct dx7operator *op = &v->op[6-i];
p("\
%d  %c %2d %2d %2d  %2d %2d %2d %2d  %2d %2d %2d %2d %4s %4s %4s %2d %2d  %1d  %2d  %1d  %1d",
	        i, mode[op->osc_mode], op->freq_coarse, op->freq_fine,
#define el(x) op->x[0],op->x[1],op->x[2],op->x[3]
		op->detune-7, el(eg_rate), el(eg_level),
#undef el
		itop(op->kls_break), curve[op->kls_lcurve], curve[op->kls_rcurve],
		op->kls_ldepth, op->kls_rdepth, op->k_rate_scale,
		op->out_level, op->vel_sens, op->mod_sens
		);
p("op|m|co|fi|de| 1| 2| 3| 4| 1| 2| 3| 4| BP |  L | R  |  L | R  |K|OP|V|A|\n");
p("  | F R E Q  |  R A T E  | L E V E L |    |  CURVE  |  DEPTH  |R|  |
p("  |oscillator|          E G          | keyboard level scaling |S|
	}

p("|========================================================================|\n");
p("| -----pitch EG----  transpose                                           |\n");
p("| rate  %2d %2d %2d %2d %3s                                                
  |\n",
  v->pitchRate[0],v->pitchRate[1],v->pitchRate[2],v->pitchRate[3],itop(v->transpose+24));
p("| level %2d %2d %2d %2d                                                      |\n",
  v->pitchLevel[0],v->pitchLevel[1],v->pitchLevel[2],v->pitchLevel[3]);
p("|========================================================================|\n");
}
