fixed sequence lengthe (was playing one step more than set)

This commit is contained in:
Oleksiy
2025-03-12 14:24:59 +02:00
parent faa8def092
commit 709c21aaf8
2 changed files with 11 additions and 41 deletions

View File

@ -85,22 +85,7 @@ sequence sequences[] {
{0b000000000000000000000000000000000, 15},
{0b000000000000000000000000000000000, 15}
};
/*bool seqA1[16] = {1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1};
bool seqA2[16] = {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0};
bool seqA3[16] = {1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0};
bool seqA4[16] = {0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1};
bool seqA5[16] = {0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1};
bool seqA6[16] = {0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0};
bool seqA7[16] = {1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0};
bool seqA8[16] = {1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1};
bool seqB1[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
bool seqB2[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
bool seqB3[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
bool seqB4[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
bool seqB5[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
bool seqB6[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
bool seqB7[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
bool seqB8[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};*/
byte currentStep[7] = {0};
int8_t stepNumSelected = 0;
byte patternToEdit;
@ -216,7 +201,7 @@ void sendMIDIStop() {
void receiveMIDI( uint8_t msg, uint8_t status ) {
if (masterClockMode == 2) {
if (msg == 0xF8) { //Clock
if (msg == 0xF8) { //Clock tick
MIDIClockReceived = true;
} else if (msg == 0xFC) { //stop
isPlaying = false;
@ -279,19 +264,14 @@ void clock() {
// pull low all outputs after set pulse length
for (byte i = 0; i < 7; i++) {
if (channels[i].mode != 4 && tickCount >= PULSE_LENGTH) { //everything but gate mode
if (channels[i].mode != 4 && tickCount >= PULSE_LENGTH) { //everything but gate mode
digitalWrite(outsPins[i], LOW);
}
if (channels[i].mode == 4 && gateCountDown[i] > pulsePeriod && tickCount >= pulsePeriod) { //tickCount == 0?
gateCountDown[i] = gateCountDown[i] - pulsePeriod; // !!! Most likely something is wrong here that causing the drift
}
if (channels[i].mode == 4 && tickCount >= gateCountDown[i]) { //gate mode
} else if (channels[i].mode == 4 && tickCount >= gateCountDown[i]) { //gate mode gateLengthTime[i] < pulsePeriod
digitalWrite(outsPins[i], LOW);
gateCountDown[i] = gateLengthTime[i];
} else if (channels[i].mode == 4 && gateCountDown[i] > pulsePeriod && tickCount == 0) {
gateCountDown[i] = gateCountDown[i] - pulsePeriod;
}
}
}
@ -393,7 +373,7 @@ void sendTriggers() { //rename to onPulse or something
} else {
sixteenthPulseCount = 0;
for (byte i; i < 7; i++) {
if (channels[i].mode == 2 && currentStep[i] <= sequences[channels[i].seqPattern].length) {
if (channels[i].mode == 2 && currentStep[i] < sequences[channels[i].seqPattern].length) {
currentStep[i] ++;
} else {
currentStep[i] = 0;
@ -482,15 +462,12 @@ void calculateCycles() {
void calculateGate(uint8_t channel) {
//if (subDivs[channels[channel].subDiv] > 0) {
uint16_t gateLengthOld = gateLengthTime[channel];
//gateLengthTime[channel] = ((channelPulsesPerCycle[channel] + 1) * (pulsePeriod + 1) / 100) * channels[channel].gate; // this seemed to work, but at some point started drifting
gateLengthTime[channel] = ((channelPulsesPerCycle[channel] + 1) * (pulsePeriod - 1) / 100) * channels[channel].gate;
if (gateLengthOld != gateLengthTime[channel]) {
gateCountDown[channel] = gateLengthTime[channel];
}
gateLengthTime[channel] = ((channelPulsesPerCycle[channel] + 1) * (pulsePeriod + 1) / 100) * channels[channel].gate;
gateCountDown[channel] = gateLengthTime[channel];
//}
}
void calculateBPMTiming() {
int mod = 0;
if (masterClockMode == 0) { //Internal clock
@ -506,12 +483,6 @@ void calculateBPMTiming() {
} else if (masterClockMode == 1 && extClockPPQN == 1) { //for ext 1/16 clock
pulsePeriod = (newExtPulseTime - lastExtPulseTime) * 10 / 6;
}
for (byte i = 0; i < (extraChannel ? 7 : 6); i++) {
if (channels[i].mode == 4) {
calculateGate(i);
}
}
}
void resetClocks() {