Ejemplo n.º 1
0
static UBYTE *
DSM_ConvertTrack (DSMNOTE * tr)
{
  int t;
  UBYTE note, ins, vol, cmd, inf;

  UniReset ();
  for (t = 0; t < 64; t++)
    {
      note = tr[t].note;
      ins = tr[t].ins;
      vol = tr[t].vol;
      cmd = tr[t].cmd;
      inf = tr[t].inf;

      if (ins != 0 && ins != 255)
	UniInstrument (ins - 1);
      if (note != 255)
	UniNote (note - 1);	/* normal note */
      if (vol < 65)
	UniPTEffect (0xc, vol);

      if (cmd != 255)
	{
	  if (cmd == 0x8)
	    {
	      if (inf == DSM_SURROUND)
		UniEffect (UNI_ITEFFECTS0, 0x91);
	      else if (inf <= 0x80)
		{
		  inf = (inf < 0x80) ? inf << 1 : 255;
		  UniPTEffect (cmd, inf);
		}
	    }
	  else if (cmd == 0xb)
	    {
	      if (inf <= 0x7f)
		UniPTEffect (cmd, inf);
	    }
	  else
	    {
	      /* Convert pattern jump from Dec to Hex */
	      if (cmd == 0xd)
		inf = (((inf & 0xf0) >> 4) * 10) + (inf & 0xf);
	      UniPTEffect (cmd, inf);
	    }
	}
      UniNewline ();
    }
  return UniDup ();
}
Ejemplo n.º 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;
		}
Ejemplo n.º 3
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;
		}
	}
Ejemplo n.º 4
0
static void IMF_ProcessCmd(UBYTE eff,UBYTE inf)
{
	if((eff)&&(eff!=255))
		switch (eff) {
			case 0x01:	/* set tempo */
				UniEffect(UNI_S3MEFFECTA,inf);
				break;
			case 0x02:	/* set BPM */
				if(inf>=0x20) UniEffect(UNI_S3MEFFECTT,inf);
				break;
			case 0x03:	/* tone portamento */
				UniEffect(UNI_ITEFFECTG,inf);
				break;
			case 0x04:	/* porta + volslide */
				UniEffect(UNI_ITEFFECTG,inf);
				UniEffect(UNI_S3MEFFECTD,0);
				break;
			case 0x05:	/* vibrato */
				UniEffect(UNI_XMEFFECT4,inf);
				break;
			case 0x06:	/* vibrato + volslide */
				UniEffect(UNI_XMEFFECT6,inf);
				break;
			case 0x07:	/* fine vibrato */
				UniEffect(UNI_ITEFFECTU,inf);
				break;
			case 0x08:	/* tremolo */
				UniEffect(UNI_S3MEFFECTR,inf);
				break;
			case 0x09:	/* arpeggio */
				UniPTEffect(0x0,inf);
				break;
			case 0x0a:	/* panning */
				UniPTEffect(0x8,(inf>=128)?255:(inf<<1));
				break;
			case 0x0b:	/* pan slide */
				UniEffect(UNI_XMEFFECTP,inf);
				break;
			case 0x0c:	/* set channel volume */
				if(inf<=64) UniPTEffect(0xc,inf);
				break;
			case 0x0d:	/* volume slide */
				UniEffect(UNI_S3MEFFECTD,inf);
				break;
			case 0x0e:	/* fine volume slide */
				if(inf) {
					if(inf>>4)
						UniEffect(UNI_S3MEFFECTD,0x0f|inf);
					else
						UniEffect(UNI_S3MEFFECTD,0xf0|inf);
				} else
Ejemplo n.º 5
0
static BOOL S69_LoadPatterns(void)
{
	int track,row,channel;
	UBYTE note,inst,vol,effect,lastfx,lastval;
	S69NOTE *cur;
	int tracks=0;
	
	if(!AllocPatterns()) return 0;
	if(!AllocTracks()) return 0;

	for(track=0;track<of.numpat;track++) {
		/* set pattern break locations */
		of.pattrows[track]=mh->breaks[track]+1;

		/* load the 669 pattern */
		cur=s69pat;
		for(row=0;row<64;row++) {
			for(channel=0;channel<8;channel++,cur++) {
				cur->a = _mm_read_UBYTE(modreader);
				cur->b = _mm_read_UBYTE(modreader);
				cur->c = _mm_read_UBYTE(modreader);
			}
		}

		if(_mm_eof(modreader)) {
			_mm_errno = MMERR_LOADING_PATTERN;
			return 0;
		}

		/* translate the pattern */
		for(channel=0;channel<8;channel++) {
			UniReset();
			/* set pattern tempo */
			UniPTEffect(0xf,78);
			UniPTEffect(0xf,mh->tempos[track]);

			lastfx=0xff,lastval=0;

			for(row=0;row<=mh->breaks[track];row++) {
				int a,b,c;

				/* fetch the encoded note */
				a=s69pat[(row*8)+channel].a;
				b=s69pat[(row*8)+channel].b;
				c=s69pat[(row*8)+channel].c;

				/* decode it */
				note=a>>2;
				inst=((a&0x3)<<4)|((b&0xf0)>>4);
				vol=b&0xf;

				if (a<0xff) {
					if (a<0xfe) {
						UniInstrument(inst);
						UniNote(note+2*OCTAVE);
						lastfx=0xff; /* reset background effect memory */
					}
					UniPTEffect(0xc,vol<<2);
				}

				if ((c!=0xff)||(lastfx!=0xff)) {
					if(c==0xff)
						c=lastfx,effect=lastval;
					else
						effect=c&0xf;

					switch(c>>4) {
						case 0: /* porta up */
							UniPTEffect(0x1,effect);
							lastfx=c,lastval=effect;
							break;
						case 1: /* porta down */
							UniPTEffect(0x2,effect);
							lastfx=c,lastval=effect;
							break;
						case 2: /* porta to note */
							UniPTEffect(0x3,effect);
							lastfx=c,lastval=effect;
							break;
						case 3: /* frequency adjust */
							/* DMP converts this effect to S3M FF1. Why not ? */
							UniEffect(UNI_S3MEFFECTF,0xf0|effect);
							break;
						case 4: /* vibrato */
							UniPTEffect(0x4,effect);
							lastfx=c,lastval=effect;
							break;
						case 5: /* set speed */
							if (effect)
								UniPTEffect(0xf,effect);
							else 
							  if(mh->marker[0]!=0x69) {
#ifdef MIKMOD_DEBUG
								fprintf(stderr,"\r669: unsupported super fast tempo at pat=%d row=%d chan=%d\n",
								       track,row,channel);
#endif
							}
							break;
					}
				}
				UniNewline();
			}
			if(!(of.tracks[tracks++]=UniDup())) return 0;
		}
	}

	return 1;
}
Ejemplo n.º 6
0
uint8 *MikSTX::ConvertTrack(STXNOTE *tr)
{
	int32 t;

	UniReset();

	for (t = 0; t < 64; t++)
	{
		uint8 note, ins, vol, cmd, inf;

		note = tr[t].note;
		ins  = tr[t].ins;
		vol  = tr[t].vol;
		cmd  = tr[t].cmd;
		inf  = tr[t].inf;

		if ((ins) && (ins != 255))
			UniInstrument(ins - 1);

		if ((note) && (note != 255))
		{
			if (note == 254)
			{
				UniPTEffect(0xc, 0, of.flags);	// Note cut command
				vol = 255;
			}
			else
				UniNote(24 + ((note >> 4) * OCTAVE) + (note & 0xf));	// Normal note
		}

		if (vol < 255)
			UniPTEffect(0xc, vol, of.flags);

		if (cmd < 255)
		{
			switch (cmd)
			{
				// Axx: Set speed to xx
				case 1:
					UniPTEffect(0xf, inf >> 4, of.flags);
					break;

				// Bxx: Position jump
				case 2:
					UniPTEffect(0xb, inf, of.flags);
					break;

				// Cxx: Pattern break to row xx
				case 3:
					UniPTEffect(0xd, (((inf & 0xf0) >> 4) * 10) + (inf & 0xf), of.flags);
					break;

				// Dxy: Volume slide
				case 4:
					UniEffect(UNI_S3MEFFECTD, inf);
					break;

				// Exy: Tone slide down
				case 5:
					UniEffect(UNI_S3MEFFECTE, inf);
					break;

				// Fxy: Tone slide up
				case 6:
					UniEffect(UNI_S3MEFFECTF, inf);
					break;

				// Gxx: Tone portamento, speed xx
				case 7:
					UniPTEffect(0x3, inf, of.flags);
					break;

				// Hxy: Vibrato
				case 8:
					UniPTEffect(0x4, inf, of.flags);
					break;

				// Ixy: Tremor, ontime x, offtime y
				case 9:
					UniEffect(UNI_S3MEFFECTI, inf);
					break;

				// Protracker arpeggio
				case 0:
					if (!inf)
						break;

					// Fall through

				// Jxy: Arpeggio
				case 0xa:
					UniPTEffect(0x0, inf, of.flags);
					break;

				// Kxy: Dual command H00 & Dxy
				case 0xb:
					UniPTEffect(0x4, 0, of.flags);
					UniEffect(UNI_S3MEFFECTD, inf);
					break;

				// Lxy: Dual command G00 & Dxy
				case 0xc:
					UniPTEffect(0x3, 0, of.flags);
					UniEffect(UNI_S3MEFFECTD, inf);
					break;

				// Support all these above, since ST2 can LOAD these values
				// but can actually only play up to J - and J is only
				// half-way implemented in ST2
				//
				// Xxx: Amiga panning command 8xx
				case 0x18:
					UniPTEffect(0x8, inf, of.flags);
					of.flags |= UF_PANNING;
					break;
			}
		}

		UniNewLine();
	}

	return (UniDup());
}
Ejemplo n.º 7
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();
}
Ejemplo n.º 8
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;
			}
Ejemplo n.º 9
0
static UBYTE* STX_ConvertTrack(STXNOTE* tr)
{
	int t;

	UniReset();
	for(t=0;t<64;t++) {
		UBYTE note,ins,vol,cmd,inf;

		note=tr[t].note;
		ins=tr[t].ins;
		vol=tr[t].vol;
		cmd=tr[t].cmd;
		inf=tr[t].inf;

		if((ins)&&(ins!=255)) UniInstrument(ins-1);
		if((note)&&(note!=255)) {
			if(note==254) {
				UniPTEffect(0xc,0);	/* note cut command */
				vol=255;
			} else UniNote(24+((note>>4)*OCTAVE)+(note&0xf)); /* normal note */
		}

		if(vol<255) UniPTEffect(0xc,vol);

		if(cmd<255) switch(cmd) {
			case 1:	/* Axx set speed to xx */
				UniPTEffect(0xf,inf>>4);
				break;
			case 2:	/* Bxx position jump */
				UniPTEffect(0xb,inf);
				break;
			case 3:	/* Cxx patternbreak to row xx */
				UniPTEffect(0xd,(((inf&0xf0)>>4)*10)+(inf&0xf));
				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 */
				UniPTEffect(0x3,inf);
				break;
			case 8:	/* Hxy vibrato */
				UniPTEffect(0x4,inf);
				break;
			case 9:	/* Ixy tremor, ontime x, offtime y */
				UniEffect(UNI_S3MEFFECTI,inf);
			break;
			case 0:		/* protracker arpeggio */
				if(!inf) break;
				/* fall through */
			case 0xa:	/* Jxy arpeggio */
				UniPTEffect(0x0,inf);
				break;
			case 0xb:	/* Kxy Dual command H00 & Dxy */
				UniPTEffect(0x4,0);
				UniEffect(UNI_S3MEFFECTD,inf);
				break;
			case 0xc:	/* Lxy Dual command G00 & Dxy */
				UniPTEffect(0x3,0);
				UniEffect(UNI_S3MEFFECTD,inf);
				break;
			/* Support all these above, since ST2 can LOAD these values but can
			   actually only play up to J - and J is only half-way implemented
			   in ST2 */
			case 0x18:	/* Xxx amiga panning command 8xx */
				UniPTEffect(0x8,inf);
				of.flags |= UF_PANNING;
				break;
		}
		UniNewline();
	}
	return UniDup();
}