/src/Sequencer.cpp
#include <stdlib.h>
#include <stdio.h>
#include "Sequencer.h"

Sequencer::Sequencer() {
	this->slices = 0;
	this->beats_per_measure = 4;
	this->slices_per_beat = 4;
	this->realloc();
}

Sequencer::Sequencer(int beats_per_measure) {
	this->slices = 0;
	this->beats_per_measure = beats_per_measure;
	this->slices_per_beat = 4;
	this->realloc();
}

Sequencer::Sequencer(int beats_per_measure, int slices_per_beat) {
	this->slices = 0;
	this->beats_per_measure = beats_per_measure;
	this->slices_per_beat = slices_per_beat;
	this->realloc();
}

Sequencer::~Sequencer(void) {
	if (this->slices != 0)
		free(this->slices);
}

void Sequencer::realloc() {
	if (this->slices != 0)
		free(this->slices);
	this->slices = (unsigned int *) malloc(sizeof(unsigned int) * this->beats_per_measure * this->slices_per_beat);
	if (slices == 0) {
		perror("allocating slices");
		exit(1);
	}
	this->clearAll();
}

void Sequencer::set(int slice, unsigned int channel) {
	this->slices[slice] |= 1 << channel;
}

unsigned int Sequencer::get(int slice) {
	return this->slices[slice];
}

void Sequencer::clear(int slice, unsigned int channel) {
	this->slices[slice] &= ~(1 << channel);
}

void Sequencer::clearChannel(unsigned int channel) {
	for (int i = 0; i < this->beats_per_measure * this->slices_per_beat; i++)
		this->clear(i, channel);
}

void Sequencer::clearAll() {
	for (int i = 0; i < this->beats_per_measure * this->slices_per_beat; i++)
		this->slices[i] = 0;
}