
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;
	}
}
