- Udate DUMB to revision e34d68685d2e5e8b45f62acdaf8157872624620c

2011-01-13 23:11 UTC - kode54
    - Implemented ASYLUM instrument base semitone offset
    - Fixed ASYLUM effect number translation
    - Version is now 0.9.9.28
    
    2011-01-13 21:28 UTC - kode54
    - Quick fix for PT2 invert loop effect
    - Version is now 0.9.9.27
    
    2011-01-13 20:37 UTC - kode54
    - Implemented PT2 invert loop effect
    - Version is now 0.9.9.26



SVN r4078 (trunk)
This commit is contained in:
Randy Heit 2013-02-07 23:34:03 +00:00
parent 8807330649
commit e978c7b059
4 changed files with 52 additions and 5 deletions

View file

@ -643,6 +643,10 @@ struct IT_CHANNEL
unsigned char xm_lastX1; unsigned char xm_lastX1;
unsigned char xm_lastX2; unsigned char xm_lastX2;
unsigned char inv_loop_delay;
unsigned char inv_loop_speed;
int inv_loop_offset;
IT_PLAYING *playing; IT_PLAYING *playing;
#ifdef BIT_ARRAY_BULLSHIT #ifdef BIT_ARRAY_BULLSHIT
@ -802,6 +806,7 @@ extern DUH_SIGTYPE_DESC _dumb_sigtype_it;
#define XM_E_NOTE_CUT 0xC #define XM_E_NOTE_CUT 0xC
#define XM_E_NOTE_DELAY 0xD #define XM_E_NOTE_DELAY 0xD
#define XM_E_PATTERN_DELAY 0xE #define XM_E_PATTERN_DELAY 0xE
#define XM_E_SET_MIDI_MACRO 0xF
#define XM_X_EXTRAFINE_PORTA_UP 1 #define XM_X_EXTRAFINE_PORTA_UP 1
#define XM_X_EXTRAFINE_PORTA_DOWN 2 #define XM_X_EXTRAFINE_PORTA_DOWN 2

View file

@ -274,6 +274,10 @@ static void dup_channel(IT_CHANNEL *dst, IT_CHANNEL *src)
dst->xm_lastX1 = src->xm_lastX1; dst->xm_lastX1 = src->xm_lastX1;
dst->xm_lastX2 = src->xm_lastX2; dst->xm_lastX2 = src->xm_lastX2;
dst->inv_loop_delay = src->inv_loop_delay;
dst->inv_loop_speed = src->inv_loop_speed;
dst->inv_loop_offset = src->inv_loop_offset;
dst->playing = dup_playing(src->playing, dst, src); dst->playing = dup_playing(src->playing, dst, src);
@ -1045,6 +1049,33 @@ static void update_smooth_effects(DUMB_IT_SIGRENDERER *sigrenderer)
} }
static const unsigned char pt_tab_invloop[16] =
{
0x00, 0x05, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0D,
0x0F, 0x13, 0x16, 0x1A, 0x20, 0x2B, 0x40, 0x80
};
static void update_invert_loop(IT_CHANNEL *channel, IT_SAMPLE *sample)
{
channel->inv_loop_delay += pt_tab_invloop[channel->inv_loop_speed];
if (channel->inv_loop_delay >= 0x80)
{
channel->inv_loop_delay = 0;
if (sample && ((sample->flags & (IT_SAMPLE_EXISTS | IT_SAMPLE_LOOP)) == (IT_SAMPLE_EXISTS | IT_SAMPLE_LOOP)) && !(sample->flags & (IT_SAMPLE_STEREO | IT_SAMPLE_16BIT)))
{
if (sample->loop_end - sample->loop_start >= 4)
{
channel->inv_loop_offset++;
if (channel->inv_loop_offset >= (sample->loop_end - sample->loop_start)) channel->inv_loop_offset = 0;
((char *)sample->data)[sample->loop_start + channel->inv_loop_offset] ^= 0xFF;
}
}
}
}
static void update_effects(DUMB_IT_SIGRENDERER *sigrenderer) static void update_effects(DUMB_IT_SIGRENDERER *sigrenderer)
{ {
@ -1140,6 +1171,8 @@ static void update_effects(DUMB_IT_SIGRENDERER *sigrenderer)
update_retrig(sigrenderer, channel); update_retrig(sigrenderer, channel);
if (channel->inv_loop_speed) update_invert_loop(channel, playing ? playing->sample : NULL);
if (playing) { if (playing) {
playing->slide += channel->portamento; playing->slide += channel->portamento;
@ -2538,7 +2571,10 @@ Yxy This uses a table 4 times larger (hence 4 times slower) than
} }
break; break;
case IT_S_SET_MIDI_MACRO: case IT_S_SET_MIDI_MACRO:
channel->SFmacro = effectvalue & 15; if ((sigdata->flags & (IT_WAS_AN_XM | IT_WAS_A_MOD)) == (IT_WAS_AN_XM | IT_WAS_A_MOD)) {
channel->inv_loop_speed = effectvalue & 15;
update_invert_loop(channel, channel->playing ? channel->playing->sample : NULL);
} else channel->SFmacro = effectvalue & 15;
break; break;
} }
} }
@ -2937,6 +2973,7 @@ static void process_xm_note_data(DUMB_IT_SIGRENDERER *sigrenderer, IT_ENTRY *ent
if (entry->mask & IT_ENTRY_INSTRUMENT) { if (entry->mask & IT_ENTRY_INSTRUMENT) {
int oldsample = channel->sample; int oldsample = channel->sample;
int oldvolume = channel->volume; int oldvolume = channel->volume;
channel->inv_loop_offset = 0;
channel->instrument = entry->instrument; channel->instrument = entry->instrument;
instrument_to_sample(sigdata, channel); instrument_to_sample(sigdata, channel);
if (channel->playing && if (channel->playing &&
@ -4907,6 +4944,9 @@ static DUMB_IT_SIGRENDERER *init_sigrenderer(DUMB_IT_SIGDATA *sigdata, int n_cha
channel->xm_lastEB = 0; channel->xm_lastEB = 0;
channel->xm_lastX1 = 0; channel->xm_lastX1 = 0;
channel->xm_lastX2 = 0; channel->xm_lastX2 = 0;
channel->inv_loop_delay = 0;
channel->inv_loop_speed = 0;
channel->inv_loop_offset = 0;
channel->playing = NULL; channel->playing = NULL;
#ifdef BIT_ARRAY_BULLSHIT #ifdef BIT_ARRAY_BULLSHIT
channel->played_patjump = NULL; channel->played_patjump = NULL;

View file

@ -71,7 +71,7 @@ static int it_asy_read_pattern( IT_PATTERN *pattern, DUMBFILE *f, unsigned char
entry->mask |= IT_ENTRY_INSTRUMENT; entry->mask |= IT_ENTRY_INSTRUMENT;
} }
_dumb_it_xm_convert_effect( buffer[ pos + 2 ] & 0x0F, buffer[ pos + 3 ], entry, 1 ); _dumb_it_xm_convert_effect( buffer[ pos + 2 ], buffer[ pos + 3 ], entry, 1 );
if ( entry->mask ) ++entry; if ( entry->mask ) ++entry;
} }
@ -90,7 +90,7 @@ static int it_asy_read_pattern( IT_PATTERN *pattern, DUMBFILE *f, unsigned char
static int it_asy_read_sample_header( IT_SAMPLE *sample, DUMBFILE *f ) static int it_asy_read_sample_header( IT_SAMPLE *sample, DUMBFILE *f )
{ {
int finetune; int finetune, key_offset;
/** /**
21 22 Chars Sample 1 name. If the name is not a full 21 22 Chars Sample 1 name. If the name is not a full
@ -111,7 +111,7 @@ assumed not to be an instrument name, and is probably a message.
sample->default_volume = dumbfile_getc( f ); // Should we be setting global_volume to this instead? sample->default_volume = dumbfile_getc( f ); // Should we be setting global_volume to this instead?
sample->global_volume = 64; sample->global_volume = 64;
if ( sample->default_volume > 64 ) sample->default_volume = 64; if ( sample->default_volume > 64 ) sample->default_volume = 64;
dumbfile_skip( f, 1 ); /* XXX unknown */ key_offset = ( signed char ) dumbfile_getc( f ); /* base key offset */
sample->length = dumbfile_igetl( f ); sample->length = dumbfile_igetl( f );
sample->loop_start = dumbfile_igetl( f ); sample->loop_start = dumbfile_igetl( f );
sample->loop_end = sample->loop_start + dumbfile_igetl( f ); sample->loop_end = sample->loop_start + dumbfile_igetl( f );
@ -124,7 +124,8 @@ assumed not to be an instrument name, and is probably a message.
sample->flags = IT_SAMPLE_EXISTS; sample->flags = IT_SAMPLE_EXISTS;
sample->default_pan = 0; sample->default_pan = 0;
sample->C5_speed = (int)( AMIGA_CLOCK / 214.0 );//( int32 )( 16726.0 * pow( DUMB_PITCH_BASE, finetune * 32 ) ); sample->C5_speed = (int)( AMIGA_CLOCK / 214.0 * pow( DUMB_SEMITONE_BASE, key_offset ) );//( long )( 16726.0 * pow( DUMB_PITCH_BASE,
finetune * 32 ) );
sample->finetune = finetune * 32; sample->finetune = finetune * 32;
// the above line might be wrong // the above line might be wrong

View file

@ -188,6 +188,7 @@ if (log) printf(" - %2d %02X", effect, value);
case EBASE+XM_E_SET_PANNING: effect = SBASE+IT_S_SET_PAN; break; case EBASE+XM_E_SET_PANNING: effect = SBASE+IT_S_SET_PAN; break;
case EBASE+XM_E_FINE_VOLSLIDE_UP: effect = IT_XM_FINE_VOLSLIDE_UP; break; case EBASE+XM_E_FINE_VOLSLIDE_UP: effect = IT_XM_FINE_VOLSLIDE_UP; break;
case EBASE+XM_E_FINE_VOLSLIDE_DOWN: effect = IT_XM_FINE_VOLSLIDE_DOWN; break; case EBASE+XM_E_FINE_VOLSLIDE_DOWN: effect = IT_XM_FINE_VOLSLIDE_DOWN; break;
case EBASE+XM_E_SET_MIDI_MACRO: effect = SBASE+IT_S_SET_MIDI_MACRO; break;
case EBASE + XM_E_FINE_PORTA_UP: case EBASE + XM_E_FINE_PORTA_UP:
effect = IT_PORTAMENTO_UP; effect = IT_PORTAMENTO_UP;