Beispiel #1
0
static UBYTE* IT_ConvertTrack(ITNOTE* tr,UWORD numrows)
{
	int t;
	UBYTE note,ins,volpan;

	UniReset();

	for(t=0;t<numrows;t++) {
		note=tr[t*of.numchn].note;
		ins=tr[t*of.numchn].ins;
		volpan=tr[t*of.numchn].volpan;

		if(note!=255) {
			if(note==253)
				UniWriteByte(UNI_KEYOFF);
			else if(note==254) {
				UniPTEffect(0xc,-1);	/* note cut command */
				volpan=255;
			} else
				UniNote(note);
		}

		if((ins)&&(ins<100))
			UniInstrument(ins-1);
		else if(ins==253)
			UniWriteByte(UNI_KEYOFF);
		else if(ins!=255) { /* crap */
			_mm_errno=MMERR_LOADING_PATTERN;
			return NULL;
		}

		/* process volume / panning column
		   volume / panning effects do NOT all share the same memory address
		   yet. */
		if(volpan<=64)
			UniVolEffect(VOL_VOLUME,volpan);
		else if(volpan<=74)	/* fine volume slide up (65-74) */
			UniVolEffect(VOL_VOLSLIDE,0x0f+((volpan-65)<<4));
		else if(volpan<=84)	/* fine volume slide down (75-84) */
			UniVolEffect(VOL_VOLSLIDE,0xf0+(volpan-75));
		else if(volpan<=94)	/* volume slide up (85-94) */
			UniVolEffect(VOL_VOLSLIDE,((volpan-85)<<4));
		else if(volpan<=104)/* volume slide down (95-104) */
			UniVolEffect(VOL_VOLSLIDE,(volpan-95));
		else if(volpan<=114)/* pitch slide down (105-114) */
			UniVolEffect(VOL_PITCHSLIDEDN,(volpan-105));
		else if(volpan<=124)/* pitch slide up (115-124) */
			UniVolEffect(VOL_PITCHSLIDEUP,(volpan-115));
		else if(volpan<=127) { /* crap */
			_mm_errno=MMERR_LOADING_PATTERN;
			return NULL;
		} else if(volpan<=192)
			UniVolEffect(VOL_PANNING,((volpan-128)==64)?255:((volpan-128)<<2));
		else if(volpan<=202)/* portamento to note */
			UniVolEffect(VOL_PORTAMENTO,portatable[volpan-193]);
		else if(volpan<=212)/* vibrato */
			UniVolEffect(VOL_VIBRATO,(volpan-203));
		else if((volpan!=239)&&(volpan!=255)) { /* crap */
			_mm_errno=MMERR_LOADING_PATTERN;
			return NULL;
		}

		S3MIT_ProcessCmd(tr[t*of.numchn].cmd,tr[t*of.numchn].inf,old_effect|2);

		UniNewline();
	}
	return UniDup();
}
Beispiel #2
0
/* handles S3M and IT effects */
void S3MIT_ProcessCmd(u8 cmd, u8 inf, /*unsigned int*/u8 flags)//MM_BOOL oldeffect)
{
	u8 hi, lo;
	lo = inf&0x0f;
	hi = inf>>4;

	/* process S3M / IT specific command structure */

	if (cmd!=255)
	{
		switch (cmd)
		{
			case 1: /* Axx set speed to xx */
				UniEffect(U231_ICODE_0x30_S3MEFFECTA,inf);
				break;
			case 2: /* Bxx position jump */
				if (inf<mmff.mm_midi_position_look_up_counter)
				{
					/* switch to curious mode if necessary, for example
					   sympex.it, deep joy.it */
					if (((s8)mm_position_look_up[inf]<0)&&(origpositions[inf]!=255))
					{	S3MIT_CreateOrders(1);}

					if (!((s8)mm_position_look_up[inf]<0))
					{	UniPTEffect(0xb,mm_position_look_up[inf]);}
				}
				break;
			case 3: /* Cxx patternbreak to row xx */
			//	if (oldeffect==1)
			//	if ((flags & S3MIT_OLDSTYLE) && !(flags & S3MIT_IT))
				if ( (S3MIT_OLDSTYLE) == (flags & (S3MIT_IT|S3MIT_OLDSTYLE)) )
				{	UniPTEffect(0xd,(inf>>4)*10+(inf&0xf));}
				else
				{	UniPTEffect(0xd,inf);}
				break;
			case 4: /* Dxy volumeslide */
				UniEffect(U231_ICODE_0x31_S3MEFFECTD,inf);
				break;
			case 5: /* Exy toneslide down */
				UniEffect(U231_ICODE_0x32_S3MEFFECTE,inf);
				break;
			case 6: /* Fxy toneslide up */
				UniEffect(U231_ICODE_0x33_S3MEFFECTF,inf);
				break;
			case 7: /* Gxx Tone portamento, speed xx */
				if (flags & S3MIT_OLDSTYLE)
				{	UniPTEffect(0x3,inf);}
				else
				{	UniEffect(U231_ICODE_0x04_ITEFFECTG,inf);}
				break;
			case 8: /* Hxy vibrato */
				if (flags & S3MIT_OLDSTYLE)
				{	UniPTEffect(0x04,inf);}
				else
				{	UniEffect(U231_ICODE_0x05_ITEFFECTH,inf);}
				break;
			case 9: /* Ixy tremor, ontime x, offtime y */
				if (flags & S3MIT_OLDSTYLE)
				{	UniEffect(U231_ICODE_0x34_S3MEFFECTI,inf);}
				else
				{	UniEffect(U231_ICODE_0x06_ITEFFECTI,inf);}
				break;
			case 0xa: /* Jxy arpeggio */
				UniPTEffect(0x00,inf);
				break;
			case 0xb: /* Kxy Dual command H00 & Dxy */
				if (flags & S3MIT_OLDSTYLE)
				{	UniPTEffect(0x04,0);}
				else
				{	UniEffect(U231_ICODE_0x05_ITEFFECTH,0);}
				UniEffect(U231_ICODE_0x31_S3MEFFECTD,inf);
				break;
			case 0xc: /* Lxy Dual command G00 & Dxy */
				if (flags & S3MIT_OLDSTYLE)
				{	UniPTEffect(0x03,0);}
				else
				{	UniEffect(U231_ICODE_0x04_ITEFFECTG,0);}
				UniEffect(U231_ICODE_0x31_S3MEFFECTD,inf);
				break;
			case 0xd: /* Mxx Set Channel Volume */
				UniEffect(U231_ICODE_0x07_ITEFFECTM,inf);
				break;
			case 0xe: /* Nxy Slide Channel Volume */
				UniEffect(U231_ICODE_0x08_ITEFFECTN,inf);
				break;
			case 0xf: /* Oxx set sampleoffset xx00h */
				UniPTEffect(0x09,inf);
				break;
			case 0x10: /* Pxy Slide Panning Commands */
				UniEffect(U231_ICODE_0x09_ITEFFECTP,inf);
				break;
			case 0x11: /* Qxy Retrig (+volumeslide) */
				UniWriteByte(U231_ICODE_0x35_S3MEFFECTQ);
				if (inf && !lo && !(flags & S3MIT_OLDSTYLE))
					UniWriteByte(1);
				else
					UniWriteByte(inf);
				break;
			case 0x12: /* Rxy tremolo speed x, depth y */
				UniEffect(U231_ICODE_0x36_S3MEFFECTR,inf);
				break;
			case 0x13: /* Sxx special commands */
				if (inf >= 0xf0)/* 0xf0 ... 0xff はmidi fliter 切り替えコマンド */
				{
					#if (1==USE_ITZ_ZXX_MIDI_RESONANT_FILTERS)
					/* do if filter enables only. */
					if (mmff.mm_midi_use_resonant_filters)/* filter 有効の場合のみ */
					{
						/* change resonant filter settings if necessary */
						if (((inf&0x0f) != mmff.mm_midi_active_macro))/* filter が実際に切り替わった場合のみ */
						{
							mmff.mm_midi_active_macro = (inf & 0x0f);/* 現在有効の midi fliter番号を保存。 */
							/* midi fliter 切り替え処理 */
							for (inf=0; inf<0x80; inf++)
							{
								filtersettings[inf].filter = mm_filter_macros[mmff.mm_midi_active_macro];
							}
						}
					}
					#endif /*(USE_ITZ_ZXX_MIDI_RESONANT_FILTERS)*/
				}
				else
				{
					/* Scream Tracker does not have samples larger than
					   64 Kb, thus doesn't need the SAx effect */
//					if ((flags & S3MIT_SCREAM) && ((inf & 0xf0) == 0xa0))
//						break;

					UniEffect(U231_ICODE_0x0f_ITEFFECTS0,inf);
				}
				break;
			case 0x14: /* Txx tempo */
				if (inf>=0x20)
					UniEffect(U231_ICODE_0x37_S3MEFFECTT,inf);
				else
				{
					if (!(flags & S3MIT_OLDSTYLE))
						/* IT Tempo slide */
					{	UniEffect(U231_ICODE_0x0a_ITEFFECTT,inf);}
				}
				break;
			case 0x15: /* Uxy Fine Vibrato speed x, depth y */
				if (flags & S3MIT_OLDSTYLE)
				{	UniEffect(U231_ICODE_0x38_S3MEFFECTU,inf);}
				else
				{	UniEffect(U231_ICODE_0x0b_ITEFFECTU,inf);}
				break;
			case 0x16: /* Vxx Set Global Volume */
				UniEffect(U231_ICODE_0x28_XMEFFECTG,inf);
				break;
			case 0x17: /* Wxy Global Volume Slide */
				UniEffect(U231_ICODE_0x0c_ITEFFECTW,inf);
				break;
			case 0x18: /* Xxx amiga command 8xx */
				if (flags & S3MIT_OLDSTYLE)
				{
					if (inf>128)
					{	UniEffect(U231_ICODE_0x0f_ITEFFECTS0,0x91); }/* surround */
					else
					{	UniPTEffect(0x8,(inf==128)?255:(inf<<1));}
				}
				else
				{	UniPTEffect(0x8,inf);}
				break;
			case 0x19: /* Yxy Panbrello  speed x, depth y */
				UniEffect(U231_ICODE_0x0d_ITEFFECTY,inf);
				break;
			case 0x1a: /* Zxx midi/resonant filters */
				#if (1==USE_ITZ_ZXX_MIDI_RESONANT_FILTERS)
				if (filtersettings[inf].filter)
				{
					UniWriteByte(U231_ICODE_0x0e_ITEFFECTZ);
					UniWriteByte(filtersettings[inf].filter);
					UniWriteByte(filtersettings[inf].inf);
				}
				#endif /*(USE_ITZ_ZXX_MIDI_RESONANT_FILTERS)*/
				break;
		}
Beispiel #3
0
/*	Pattern analysis routine.
	Effects not implemented (yet) : (in decimal)
	11 Arpeggio 4: Change note every 50Hz tick between N,H,N,L
	12 Arpeggio 5: Change note every 50Hz tick between H,H,N
                   N = normal note being played in this channel (1-36)
                   L = normal note number minus upper four bits of 'data'.
                   H = normal note number plus  lower four bits of 'data'.
    13 Decrease note number by 'data' once per tick.
    17 Increase note number by 'data' once per tick.
    21 Decrease note number by 'data' once per line.
    30 Increase note number by 'data' once per line.
*/
static UBYTE *OKT_ConvertTrack(UBYTE patrows)
{
	int t;
	UBYTE ins, note, eff, dat;

	UniReset();
	for (t = 0; t < patrows; t++) {
		note = okttrk[t].note;
		ins = okttrk[t].ins;
		eff = okttrk[t].eff;
		dat = okttrk[t].dat;

		if (note) {
			UniNote(note + 3*OCTAVE - 1);
			UniInstrument(ins);
		}

		if (eff)
			switch (eff) {
			  case 1:			/* Porta Up */
				UniPTEffect(0x1, dat);
				break;
			  case 2:			/* Portamento Down */
				UniPTEffect(0x2, dat);
				break;
			  case 10:			/* Arpeggio 3 supported */
				UniPTEffect(0x0, dat);
				break;
			  case 15:	/* Amiga filter toggle, ignored */
				break;
			  case 25:			/* Pattern Jump */
				UniPTEffect(0xb, dat);
				break;
			  case 27:			/* Release - similar to Keyoff */
				UniWriteByte(UNI_KEYOFF);
				break;
			  case 28:			/* Set Tempo */
				UniPTEffect(0xf, dat);
				break;
			  case 31:			/* volume Control */
				if (dat <= 0x40)
					UniPTEffect(0xc, dat);
				else if (dat <= 0x50)
					UniEffect(UNI_XMEFFECTA, (dat - 0x40));	/* fast fade out */
				else if (dat <= 0x60)
					UniEffect(UNI_XMEFFECTA, (dat - 0x50) << 4);	/* fast fade in */
				else if (dat <= 0x70)
					UniEffect(UNI_XMEFFECTEB, (dat - 0x60));	/* slow fade out */
				else if (dat <= 0x80)
					UniEffect(UNI_XMEFFECTEA, (dat - 0x70));	/* slow fade in */
				break;
#ifdef MIKMOD_DEBUG
			  default:
				fprintf(stderr, "\rUnimplemented effect (%02d,%02x)\n",
						eff, dat);
#endif
			}

		UniNewline();
	}
	return UniDup();
}
Beispiel #4
0
/* handles S3M and IT effects */
void S3MIT_ProcessCmd(UBYTE cmd,UBYTE inf,BOOL oldeffect)
{
	UBYTE hi,lo;

	lo=inf&0xf;
	hi=inf>>4;

	/* process S3M / IT specific command structure */

	if(cmd!=255) {
		switch(cmd) {
			case 1: /* Axx set speed to xx */
				UniEffect(UNI_S3MEFFECTA,inf);
				break;
			case 2: /* Bxx position jump */
				if (inf<poslookupcnt) {
					/* switch to curious mode if necessary, for example
					   sympex.it, deep joy.it */
					if(((SBYTE)poslookup[inf]<0)&&(origpositions[inf]!=255))
						S3MIT_CreateOrders(1);

					if(!((SBYTE)poslookup[inf]<0))
						UniPTEffect(0xb,poslookup[inf]);
				}
				break;
			case 3: /* Cxx patternbreak to row xx */
				if(oldeffect==1)
					UniPTEffect(0xd,(inf>>4)*10+(inf&0xf));
				else
					UniPTEffect(0xd,inf);
				break;
			case 4: /* Dxy volumeslide */
				UniEffect(UNI_S3MEFFECTD,inf);
				break;
			case 5: /* Exy toneslide down */
				UniEffect(UNI_S3MEFFECTE,inf);
				break;
			case 6: /* Fxy toneslide up */
				UniEffect(UNI_S3MEFFECTF,inf);
				break;
			case 7: /* Gxx Tone portamento, speed xx */
				UniEffect(UNI_ITEFFECTG,inf);
				break;
			case 8: /* Hxy vibrato */
				if(oldeffect&1)
					UniPTEffect(0x4,inf);
				else
					UniEffect(UNI_ITEFFECTH,inf);
				break;
			case 9: /* Ixy tremor, ontime x, offtime y */
				if(oldeffect&1)
					UniEffect(UNI_S3MEFFECTI,inf);
				else
					UniEffect(UNI_ITEFFECTI,inf);
				break;
			case 0xa: /* Jxy arpeggio */
				UniPTEffect(0x0,inf);
				break;
			case 0xb: /* Kxy Dual command H00 & Dxy */
				if(oldeffect&1)
					UniPTEffect(0x4,0);
				else
					UniEffect(UNI_ITEFFECTH,0);
				UniEffect(UNI_S3MEFFECTD,inf);
				break;
			case 0xc: /* Lxy Dual command G00 & Dxy */
				if(oldeffect&1)
					UniPTEffect(0x3,0);
				else
					UniEffect(UNI_ITEFFECTG,0);
				UniEffect(UNI_S3MEFFECTD,inf);
				break;
			case 0xd: /* Mxx Set Channel Volume */
				UniEffect(UNI_ITEFFECTM,inf);
				break;
			case 0xe: /* Nxy Slide Channel Volume */
				UniEffect(UNI_ITEFFECTN,inf);
				break;
			case 0xf: /* Oxx set sampleoffset xx00h */
				UniPTEffect(0x9,inf);
				break;
			case 0x10: /* Pxy Slide Panning Commands */
				UniEffect(UNI_ITEFFECTP,inf);
				break;
			case 0x11: /* Qxy Retrig (+volumeslide) */
				UniWriteByte(UNI_S3MEFFECTQ);
				if(inf && !lo && !(oldeffect&1))
					UniWriteByte(1);
				else
					UniWriteByte(inf);
				break;
			case 0x12: /* Rxy tremolo speed x, depth y */
				UniEffect(UNI_S3MEFFECTR,inf);
				break;
			case 0x13: /* Sxx special commands */
				if (inf>=0xf0) {
					/* change resonant filter settings if necessary */
					if((filters)&&((inf&0xf)!=activemacro)) {
						activemacro=inf&0xf;
						for(inf=0;inf<0x80;inf++)
							filtersettings[inf].filter=filtermacros[activemacro];
					}
				} else
					UniEffect(UNI_ITEFFECTS0,inf);
				break;
			case 0x14: /* Txx tempo */
				if(inf>=0x20)
					UniEffect(UNI_S3MEFFECTT,inf);
				else {
					if(!(oldeffect&1))
						/* IT Tempo slide */
						UniEffect(UNI_ITEFFECTT,inf);
				}
				break;
			case 0x15: /* Uxy Fine Vibrato speed x, depth y */
				if(oldeffect&1)
					UniEffect(UNI_S3MEFFECTU,inf);
				else
					UniEffect(UNI_ITEFFECTU,inf);
				break;
			case 0x16: /* Vxx Set Global Volume */
				UniEffect(UNI_XMEFFECTG,inf);
				break;
			case 0x17: /* Wxy Global Volume Slide */
				UniEffect(UNI_ITEFFECTW,inf);
				break;
			case 0x18: /* Xxx amiga command 8xx */
				if(oldeffect&1) {
					if(inf>128)
						UniEffect(UNI_ITEFFECTS0,0x91); /* surround */
					else
						UniPTEffect(0x8,(inf==128)?255:(inf<<1));
				} else
					UniPTEffect(0x8,inf);
				break;
			case 0x19: /* Yxy Panbrello  speed x, depth y */
				UniEffect(UNI_ITEFFECTY,inf);
				break;
			case 0x1a: /* Zxx midi/resonant filters */
				if(filtersettings[inf].filter) {
					UniWriteByte(UNI_ITEFFECTZ);
					UniWriteByte(filtersettings[inf].filter);
					UniWriteByte(filtersettings[inf].inf);
				}
				break;
		}
	}
Beispiel #5
0
static UBYTE* AMF_ConvertTrack(void)
{
	int row,fx4memory=0;

	/* convert track */
	UniReset();
	for (row=0;row<64;row++) {
		if (track[row].instr)  UniInstrument(track[row].instr-1);
		if (track[row].note>OCTAVE) UniNote(track[row].note-OCTAVE);

		/* AMF effects */
		while(track[row].fxcnt--) {
			SBYTE inf=track[row].parameter[track[row].fxcnt];

			switch(track[row].effect[track[row].fxcnt]) {
				case 1: /* Set speed */
					UniEffect(UNI_S3MEFFECTA,inf);
					break;
				case 2: /* Volume slide */
					if(inf) {
						UniWriteByte(UNI_S3MEFFECTD);
						if (inf>=0)
							UniWriteByte((inf&0xf)<<4);
						else
							UniWriteByte((-inf)&0xf);
					}
					break;
				/* effect 3, set channel volume, done in UnpackTrack */
				case 4: /* Porta up/down */
					if(inf) {
						if(inf>0) {
							UniEffect(UNI_S3MEFFECTE,inf);
							fx4memory=UNI_S3MEFFECTE;
						} else {
							UniEffect(UNI_S3MEFFECTF,-inf);
							fx4memory=UNI_S3MEFFECTF;
						}
					} else if(fx4memory)
						UniEffect(fx4memory,0);
					break;
				/* effect 5, "Porta abs", not supported */
				case 6: /* Porta to note */
					UniEffect(UNI_ITEFFECTG,inf);
					break;
				case 7: /* Tremor */
					UniEffect(UNI_S3MEFFECTI,inf);
					break;
				case 8: /* Arpeggio */
					UniPTEffect(0x0,inf);
					break;
				case 9: /* Vibrato */
					UniPTEffect(0x4,inf);
					break;
				case 0xa: /* Porta + Volume slide */
					UniPTEffect(0x3,0);
					if(inf) {
						UniWriteByte(UNI_S3MEFFECTD);
						if (inf>=0)
							UniWriteByte((inf&0xf)<<4);
						else
							UniWriteByte((-inf)&0xf);
					}
					break;
				case 0xb: /* Vibrato + Volume slide */
					UniPTEffect(0x4,0);
					if(inf) {
						UniWriteByte(UNI_S3MEFFECTD);
						if (inf>=0)
							UniWriteByte((inf&0xf)<<4);
						else
							UniWriteByte((-inf)&0xf);
					}
					break;
				case 0xc: /* Pattern break (in hex) */
					UniPTEffect(0xd,inf);
					break;
				case 0xd: /* Pattern jump */
					UniPTEffect(0xb,inf);
					break;
				/* effect 0xe, "Sync", not supported */
				case 0xf: /* Retrig */
					UniEffect(UNI_S3MEFFECTQ,inf&0xf);
					break;
				case 0x10: /* Sample offset */
					UniPTEffect(0x9,inf);
					break;
				case 0x11: /* Fine volume slide */
					if(inf) {
						UniWriteByte(UNI_S3MEFFECTD);
						if (inf>=0)
							UniWriteByte((inf&0xf)<<4|0xf);
						else
							UniWriteByte(0xf0|((-inf)&0xf));
					}
					break;
				case 0x12: /* Fine portamento */
					if(inf) {
						if(inf>0) {
							UniEffect(UNI_S3MEFFECTE,0xf0|(inf&0xf));
							fx4memory=UNI_S3MEFFECTE;
						} else {
							UniEffect(UNI_S3MEFFECTF,0xf0|((-inf)&0xf));
							fx4memory=UNI_S3MEFFECTF;
						}
					} else if(fx4memory)
						UniEffect(fx4memory,0);
					break;
				case 0x13: /* Delay note */
					UniPTEffect(0xe,0xd0|(inf&0xf));
					break;
				case 0x14: /* Note cut */
					UniPTEffect(0xc,0);
					track[row].volume=0;
					break;
				case 0x15: /* Set tempo */
					UniEffect(UNI_S3MEFFECTT,inf);
					break;
				case 0x16: /* Extra fine portamento */
					if(inf) {
						if(inf>0) {
							UniEffect(UNI_S3MEFFECTE,0xe0|((inf>>2)&0xf));
							fx4memory=UNI_S3MEFFECTE;
						} else {
							UniEffect(UNI_S3MEFFECTF,0xe0|(((-inf)>>2)&0xf));
							fx4memory=UNI_S3MEFFECTF;
						}
					} else if(fx4memory)
						UniEffect(fx4memory,0);
					break;
				case 0x17: /* Panning */
					if (inf>64)
						UniEffect(UNI_ITEFFECTS0,0x91); /* surround */
					else
						UniPTEffect(0x8,(inf==64)?255:(inf+64)<<1);
					of.flags |= UF_PANNING;
					break;
			}