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