
package ibxm;

public class Module {
	public String song_title;
	public boolean linear_periods, fast_volume_slides, pal;
	public int global_volume, channel_gain;
	public int default_speed, default_tempo;
	public int restart_sequence_index;
	
	private int[] initial_panning, sequence;
	private Pattern[] patterns;
	private Instrument[] instruments;
	
	private Pattern default_pattern;
	private Instrument default_instrument;
	
	public Module() {
		song_title = IBXM.VERSION;
		set_num_channels( 1 );
		set_sequence_length( 1 );
		set_num_patterns( 0 );
		set_num_instruments( 0 );
		default_pattern = new Pattern();
		default_instrument = new Instrument();
	}
	
	public int get_num_channels() {
		return initial_panning.length;
	}
	
	public void set_num_channels( int num_channels ) {
		if( num_channels < 1 ) {
			num_channels = 1;
		}
		initial_panning = new int[ num_channels ];
	}
	
	public int get_initial_panning( int channel ) {
		int panning;
		panning = 128;
		if( channel >= 0 && channel < initial_panning.length ) {
			panning = initial_panning[ channel ];
		}
		return panning;
	}
	
	public void set_initial_panning( int channel, int panning ) {
		if( channel >= 0 && channel < initial_panning.length ) {
			initial_panning[ channel ] = panning;
		}
	}
	
	public int get_sequence_length() {
		return sequence.length;
	}
	
	public void set_sequence_length( int sequence_length ) {
		if( sequence_length < 0 ) {
			sequence_length = 0;
		}
		sequence = new int[ sequence_length ];
	}
	
	public void set_sequence( int sequence_index, int pattern_index ) {
		if( sequence_index >= 0 && sequence_index < sequence.length ) {
			sequence[ sequence_index ] = pattern_index;
		}
	}
	
	public int get_num_patterns() {
		return patterns.length;
	}
	
	public void set_num_patterns( int num_patterns ) {
		if( num_patterns < 0 ) {
			num_patterns = 0;
		}
		patterns = new Pattern[ num_patterns ];
	}

	public Pattern get_pattern_from_sequence( int sequence_index ) {
		Pattern pattern;
		pattern = default_pattern;
		if( sequence_index >= 0 && sequence_index < sequence.length ) {
			pattern = get_pattern( sequence[ sequence_index ] );
		}
		return pattern;
	}

	public Pattern get_pattern( int pattern_index ) {
		Pattern pattern;
		pattern = null;
		if( pattern_index >= 0 && pattern_index < patterns.length ) {
			pattern = patterns[ pattern_index ];
		}
		if( pattern == null ) {
			pattern = default_pattern;
		}
		return pattern;
	}

	public void set_pattern( int pattern_index, Pattern pattern ) {
		if( pattern_index >= 0 && pattern_index < patterns.length ) {
			patterns[ pattern_index ] = pattern;
		}
	}
	
	public int get_num_instruments() {
		return instruments.length;
	}
	
	public void set_num_instruments( int num_instruments ) {
		if( num_instruments < 0 ) {
			num_instruments = 0;
		}
		instruments = new Instrument[ num_instruments ];
	}
	
	public Instrument get_instrument( int instrument_index ) {
		Instrument instrument;
		instrument = null;
		if( instrument_index > 0 && instrument_index <= instruments.length ) {
			instrument = instruments[ instrument_index - 1 ];
		}
		if( instrument == null ) {
			instrument = default_instrument;
		}
		return instrument;
	}
	
	public void set_instrument( int instrument_index, Instrument instrument ) {
		if( instrument_index > 0 && instrument_index <= instruments.length ) {
			instruments[ instrument_index - 1 ] = instrument;
		}
	}
}
