/*
* HalfNES by Andrew Hoffman
* Licensed under the GNU GPL Version 3. See LICENSE file
*/
package com.grapeshot.halfnes.audio;
/**
*
* @author Andrew
*/
public class SquareTimer extends Timer {
protected int[] values;
final private int periodadd;
private int divider = 0;
@Override
public final void clock() {
if (period + periodadd <= 0) {
return;
}
++divider;
// note: stay away from negative division to avoid rounding problems
int periods = (divider + period + periodadd) / (period + periodadd);
if (periods < 0) {
periods = 0; // can happen if period or periodadd were made smaller
}
position = (position + periods) % values.length;
divider -= (period + periodadd) * periods;
}
@Override
public final void clock(final int cycles) {
if (period < 8) {
return;
}
divider += cycles;
// note: stay away from negative division to avoid rounding problems
int periods = (divider + period + periodadd) / (period + periodadd);
if (periods < 0) {
periods = 0; // can happen if period or periodadd were made smaller
}
position = (position + periods) % values.length;
divider -= (period + periodadd) * periods;
}
public SquareTimer(final int ctrlen, final int periodadd) {
this.periodadd = periodadd;
values = new int[ctrlen];
period = 0;
position = 0;
setduty(ctrlen / 2);
}
public SquareTimer(final int ctrlen) {
this.periodadd = 0;
values = new int[ctrlen];
period = 0;
position = 0;
setduty(ctrlen / 2);
}
@Override
public final void reset() {
position = 0;
}
@Override
public final void setduty(final int duty) {
for (int i = 0; i < values.length; ++i) {
values[i] = (i < duty) ? 1 : 0;
}
}
@Override
public final void setduty(int[] dutyarray) {
values = dutyarray;
}
@Override
public final int getval() {
return values[position];
}
@Override
public final void setperiod(final int newperiod) {
period = newperiod;
}
}