2012-08-01 23:35:35 +00:00
|
|
|
|
|
|
|
package ibxm;
|
|
|
|
|
|
|
|
public class Pattern {
|
|
|
|
public int num_rows;
|
|
|
|
|
|
|
|
private int data_offset, note_index;
|
|
|
|
private byte[] pattern_data;
|
|
|
|
|
|
|
|
public Pattern() {
|
|
|
|
num_rows = 1;
|
|
|
|
set_pattern_data( new byte[ 0 ] );
|
|
|
|
}
|
|
|
|
|
|
|
|
public void set_pattern_data( byte[] data ) {
|
|
|
|
if( data != null ) {
|
|
|
|
pattern_data = data;
|
|
|
|
}
|
|
|
|
data_offset = 0;
|
|
|
|
note_index = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void get_note( int[] note, int index ) {
|
|
|
|
if( index < note_index ) {
|
|
|
|
note_index = 0;
|
|
|
|
data_offset = 0;
|
|
|
|
}
|
|
|
|
while( note_index <= index ) {
|
|
|
|
data_offset = next_note( data_offset, note );
|
|
|
|
note_index += 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public int next_note( int data_offset, int[] note ) {
|
|
|
|
int bitmask, field;
|
|
|
|
if( data_offset < 0 ) {
|
|
|
|
data_offset = pattern_data.length;
|
|
|
|
}
|
|
|
|
bitmask = 0x80;
|
|
|
|
if( data_offset < pattern_data.length ) {
|
|
|
|
bitmask = pattern_data[ data_offset ] & 0xFF;
|
|
|
|
}
|
|
|
|
if( ( bitmask & 0x80 ) == 0x80 ) {
|
|
|
|
data_offset += 1;
|
|
|
|
} else {
|
|
|
|
bitmask = 0x1F;
|
|
|
|
}
|
|
|
|
for( field = 0; field < 5; field++ ) {
|
|
|
|
note[ field ] = 0;
|
|
|
|
if( ( bitmask & 0x01 ) == 0x01 ) {
|
|
|
|
if( data_offset < pattern_data.length ) {
|
|
|
|
note[ field ] = pattern_data[ data_offset ] & 0xFF;
|
|
|
|
data_offset += 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
bitmask = bitmask >> 1;
|
|
|
|
}
|
|
|
|
return data_offset;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|