Beispiel #1
0
void hmn_play_extras(struct context_data *ctx, struct channel_data *xc, int chn)
{
	struct player_data *p = &ctx->p;
	struct module_data *m = &ctx->m;
	struct hmn_channel_extras *ce = xc->extra;
	struct xmp_instrument *xxi;
	int pos, waveform, volume;

	if (p->frame == 0 && TEST(NEW_NOTE|NEW_INS)) {
		ce->datapos = 0;
	}

	xxi = &m->mod.xxi[xc->ins];
	pos = ce->datapos;
	waveform = HMN_INSTRUMENT_EXTRAS(m->mod.xxi[xc->ins])->data[pos];
	volume = HMN_INSTRUMENT_EXTRAS(m->mod.xxi[xc->ins])->progvolume[pos] & 0x7f;

	if (waveform < xxi->nsm && xxi->sub[waveform].sid != xc->smp) {
		xc->smp = xxi->sub[waveform].sid;
		virt_setsmp(ctx, chn, xc->smp);
	}

	pos++;
	if (pos > HMN_INSTRUMENT_EXTRAS(m->mod.xxi[xc->ins])->dataloopend)
		pos = HMN_INSTRUMENT_EXTRAS(m->mod.xxi[xc->ins])->dataloopstart;

	ce->datapos = pos;
	ce->volume = volume;
}
Beispiel #2
0
void med_synth(struct context_data *ctx, int chn, struct channel_data *xc, int rst)
{
    struct module_data *m = &ctx->m;
    int b, jws = 0, jvs = 0, loop = 0, jump = 0;
    int temp;

    if (m->med_vol_table == NULL || m->med_wav_table == NULL)
	return;

    if (m->med_vol_table[xc->ins] == NULL || m->med_wav_table[xc->ins] == NULL)
	return;

    if (rst) {
	xc->med.arp = xc->med.aidx = 0;
	xc->med.period = xc->period;
	xc->med.vp = xc->med.vc = xc->med.vw = 0;
	xc->med.wp = xc->med.wc = xc->med.ww = 0;
	xc->med.vs = MED_EXTRA(m->mod.xxi[xc->ins])->vts;
	xc->med.ws = MED_EXTRA(m->mod.xxi[xc->ins])->wts;
    }

    if (xc->med.vs > 0 && xc->med.vc-- == 0) {
	xc->med.vc = xc->med.vs - 1;

	if (xc->med.vw > 0) {
	    xc->med.vw--;
	    goto skip_vol;
	}

	jump = loop = jws = 0;
	switch (b = VT) {
	    while (jump--) {
	    case 0xff:		/* END */
	    case 0xfb:		/* HLT */
		xc->med.vp--;
		break;
	    case 0xfe:		/* JMP */
		if (loop)	/* avoid infinite loop */
		    break;
		temp = VT;
		xc->med.vp = temp;
		loop = jump = 1;
		break;
	    case 0xfa:		/* JWS */
		jws = VT;
		break;
	    case 0xf5:		/* EN2 */
	    case 0xf4:		/* EN1 */
		VT_SKIP;	/* Not implemented */
		break;
	    case 0xf3:		/* CHU */
		xc->med.vv = VT;
		break;
	    case 0xf2:		/* CHD */
		xc->med.vv = -VT;
		break;
	    case 0xf1:		/* WAI */
		xc->med.vw = VT;
		break;
	    case 0xf0:		/* SPD */
		xc->med.vs = VT;
		break;
	    default:
		if (b >= 0x00 && b <= 0x40)
		    xc->volume = b;
	    }
	}

	xc->volume += xc->med.vv;
	CLAMP(xc->volume, 0, 64);

skip_vol:

	if (xc->med.ww > 0) {
	    xc->med.ww--;
	    goto skip_wav;
	}

	jump = loop = jvs = 0;
	switch (b = WT) {
	    struct xmp_instrument *xxi;

	    while (jump--) {
	    case 0xff:		/* END */
	    case 0xfb:		/* HLT */
		xc->med.wp--;
		break;
	    case 0xfe:		/* JMP */
		if (loop)	/* avoid infinite loop */
		    break;
		temp = WT;
		if (temp == 0xff) {	/* handle JMP END case */
		    xc->med.wp--;	/* see lepeltheme ins 0x02 */
		    break;
		}
		xc->med.wp = temp;
		loop = jump = 1;
		break;
	    case 0xfd:		/* ARE */
		break;
	    case 0xfc:		/* ARP */
		xc->med.arp = xc->med.aidx = xc->med.wp++;
		while (WT != 0xfd);
		break;
	    case 0xfa:		/* JVS */
		jws = WT;
		break;
	    case 0xf7:		/* VWF */
		xc->med.vwf = WT;
		break;
	    case 0xf6:		/* RES */
		xc->period = xc->med.period;
		break;
	    case 0xf5:		/* VBS */
		xc->med.vib_speed = WT;
		break;
	    case 0xf4:		/* VBD */
		xc->med.vib_depth = WT;
		break;
	    case 0xf3:		/* CHU */
		xc->med.wv = -WT;
		break;
	    case 0xf2:		/* CHD */
		xc->med.wv = WT;
		break;
	    case 0xf1:		/* WAI */
		xc->med.ww = WT;
		break;
	    case 0xf0:		/* SPD */
		xc->med.ws = WT;
		break;
	    default:
		xxi = & m->mod.xxi[xc->ins];
		if (b < xxi->nsm && xxi->sub[b].sid != xc->smp) {
		    xc->smp = xxi->sub[b].sid;
		    virt_setsmp(ctx, chn, xc->smp);
		}
	    }
	}
skip_wav:
	;
	/* xc->period += xc->med.wv; */
    }

    if (jws) {
	xc->med.wp = jws;
	jws = 0;
    }

    if (jvs) {
	xc->med.vp = jvs;
	jvs = 0;
    }
}
Beispiel #3
0
void med_play_extras(struct context_data *ctx, struct channel_data *xc, int chn,
		     int new_note)
{
	struct module_data *m = &ctx->m;
	struct med_module_extras *me;
	struct med_channel_extras *ce;
	int b, jws = 0, jvs = 0, loop;
	int temp;

	if (!HAS_MED_MODULE_EXTRAS(*m))
		return;

	me = (struct med_module_extras *)m->extra;
	ce = (struct med_channel_extras *)xc->extra;

	if (me->vol_table[xc->ins] == NULL || me->wav_table[xc->ins] == NULL)
		return;

	if (new_note) {
		ce->arp = ce->aidx = 0;
		ce->period = xc->period;
		ce->vp = ce->vc = ce->vw = 0;
		ce->wp = ce->wc = ce->ww = 0;
		ce->vv = 0;
		ce->vs = MED_INSTRUMENT_EXTRAS(m->mod.xxi[xc->ins])->vts;
		ce->ws = MED_INSTRUMENT_EXTRAS(m->mod.xxi[xc->ins])->wts;
	}

	if (ce->vs > 0 && ce->vc-- == 0) {
		ce->vc = ce->vs - 1;

		if (ce->vw > 0) {
			ce->vw--;
			goto skip_vol;
		}

		loop = jws = 0;

	    next_vt:
		switch (b = VT) {
		case 0xff:	/* END */
		case 0xfb:	/* HLT */
			ce->vp--;
			break;
		case 0xfe:	/* JMP */
			if (loop)	/* avoid infinite loop */
				break;
			temp = VT;
			ce->vp = temp;
			loop = 1;
			goto next_vt;
			break;
		case 0xfa:	/* JWS */
			jws = VT;
			break;
		case 0xf5:	/* EN2 */
		case 0xf4:	/* EN1 */
			VT_SKIP;	/* Not implemented */
			break;
		case 0xf3:	/* CHU */
			ce->vv = VT;
			break;
		case 0xf2:	/* CHD */
			ce->vv = -VT;
			break;
		case 0xf1:	/* WAI */
			ce->vw = VT;
			break;
		case 0xf0:	/* SPD */
			ce->vs = VT;
			break;
		default:
			if (b >= 0x00 && b <= 0x40)
				ce->volume = b;
		}

		ce->volume += ce->vv;
		CLAMP(ce->volume, 0, 64);

	    skip_vol:

		if (ce->ww > 0) {
			ce->ww--;
			goto skip_wav;
		}

		loop = jvs = 0;

	    next_wt:
		switch (b = WT) {
			struct xmp_instrument *xxi;

		case 0xff:	/* END */
		case 0xfb:	/* HLT */
			ce->wp--;
			break;
		case 0xfe:	/* JMP */
			if (loop)	/* avoid infinite loop */
				break;
			temp = WT;
			if (temp == 0xff) {	/* handle JMP END case */
				ce->wp--;	/* see lepeltheme ins 0x02 */
				break;
			}
			ce->wp = temp;
			loop = 1;
			goto next_wt;
		case 0xfd:	/* ARE */
			break;
		case 0xfc:	/* ARP */
			ce->arp = ce->aidx = ce->wp++;
			while (WT != 0xfd) ;
			break;
		case 0xfa:	/* JVS */
			jws = WT;
			break;
		case 0xf7:	/* VWF */
			ce->vwf = WT;
			break;
		case 0xf6:	/* RES */
			xc->period = ce->period;
			break;
		case 0xf5:	/* VBS */
			ce->vib_speed = WT;
			break;
		case 0xf4:	/* VBD */
			ce->vib_depth = WT;
			break;
		case 0xf3:	/* CHU */
			ce->wv = -WT;
			break;
		case 0xf2:	/* CHD */
			ce->wv = WT;
			break;
		case 0xf1:	/* WAI */
			ce->ww = WT;
			break;
		case 0xf0:	/* SPD */
			ce->ws = WT;
			break;
		default:
			xxi = &m->mod.xxi[xc->ins];
			if (b < xxi->nsm && xxi->sub[b].sid != xc->smp) {
				xc->smp = xxi->sub[b].sid;
				virt_setsmp(ctx, chn, xc->smp);
			}
		}
	    skip_wav:
		;
		/* xc->period += ce->wv; */
	}

	if (jws) {
		ce->wp = jws;
		jws = 0;
	}

	if (jvs) {
		ce->vp = jvs;
		jvs = 0;
	}
}