some progress on gate length in percent (but the calculation is still wrong)

This commit is contained in:
Oleksiy
2025-03-06 18:40:55 +02:00
parent b2f335bf6a
commit fd240e0341
3 changed files with 38 additions and 27 deletions

View File

@ -32,18 +32,18 @@ struct channel {
byte CV2Target : 3; byte CV2Target : 3;
uint8_t swing : 3; uint8_t swing : 3;
uint8_t offset : 7; //mv: 128 uint8_t offset : 7; //mv: 128
uint8_t gate : 6; //mv: 64 uint8_t gate : 7;
bool isMute : 1; bool isMute : 1;
}; };
channel channels[7] = { //array of channel settings channel channels[7] = { //array of channel settings
{ 0, 7, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 7, 0, 0, 0, 0, 0, 0, 1, 0 },
{ 0, 7, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 7, 0, 0, 0, 0, 0, 0, 1, 0 },
{ 0, 7, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 7, 0, 0, 0, 0, 0, 0, 1, 0 },
{ 0, 7, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 7, 0, 0, 0, 0, 0, 0, 1, 0 },
{ 0, 7, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 7, 0, 0, 0, 0, 0, 0, 1, 0 },
{ 0, 7, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 7, 0, 0, 0, 0, 0, 0, 1, 0 },
{ 0, 7, 0, 0, 0, 0, 0, 0, 0, 0 } { 0, 7, 0, 0, 0, 0, 0, 0, 1, 0 }
}; };
bool seqA1[16] = {1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1}; //switch to struct seqs { uint32_t sequence; uint8_t length : 5 ; uint8_t currentStep : 5}. test with lengthOf bool seqA1[16] = {1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1}; //switch to struct seqs { uint32_t sequence; uint8_t length : 5 ; uint8_t currentStep : 5}. test with lengthOf
@ -89,6 +89,7 @@ unsigned long newExtPulseTime = 0;
bool needPulseReset[] = { true, true, true, true, true, true, true }; bool needPulseReset[] = { true, true, true, true, true, true, true };
int gatePulseCount[] = {0,0,0,0,0,0,0}; int gatePulseCount[] = {0,0,0,0,0,0,0};
int gateLengthTime[] = {120, 120, 120, 120, 120, 120, 120};
bool stepIsOdd = 1; bool stepIsOdd = 1;
byte displayTab = 0; byte displayTab = 0;
@ -122,8 +123,6 @@ int extTriggerCount;
U8G2_SSD1306_128X64_NONAME_2_HW_I2C u8g2(U8G2_R2, SCL, SDA, U8X8_PIN_NONE); U8G2_SSD1306_128X64_NONAME_2_HW_I2C u8g2(U8G2_R2, SCL, SDA, U8X8_PIN_NONE);
RotaryEncoder encoder(ENC_D1_PIN, ENC_D2_PIN, RotaryEncoder::LatchMode::TWO03); RotaryEncoder encoder(ENC_D1_PIN, ENC_D2_PIN, RotaryEncoder::LatchMode::TWO03);
String version; String version;
void setup() { void setup() {
@ -235,16 +234,13 @@ void clock() {
} }
// pull low all outputs after set pulse length // pull low all outputs after set pulse length
if (tickCount >= PULSE_LENGTH) { for (byte i = 0; i < 7; i++) {
for (byte i = 0; i < (extraChannel ? 7 : 6); i++) { if ((channels[i].mode != 4 && tickCount >= PULSE_LENGTH) ||
if (channels[i].mode != 4) { //everything but gate mode (channels[i].mode == 4 && tickCount >= gateLengthTime[i])) { //everything but gate mode
digitalWrite(outsPins[i], LOW); digitalWrite(outsPins[i], LOW);
}
}
if (!extraChannel) {
digitalWrite(clockOutPin, LOW);
} }
} }
} }
} }
@ -464,9 +460,16 @@ void calculateCycles() {
channelPulsesPerCycle[i] = (PPQN / abs(playingModes[i])) - 1; channelPulsesPerCycle[i] = (PPQN / abs(playingModes[i])) - 1;
} }
if (channels[i].mode == 4) {
calculateGate(i);
}
} }
} }
void calculateGate(int channel) {
gateLengthTime[channel] = (channelPulsesPerCycle[channel] * pulsePeriod / 100) * channels[channel].gate;
}
void calculateBPMTiming() { void calculateBPMTiming() {
int mod = 0; int mod = 0;
if (masterClockMode == 0) { //Internal clock if (masterClockMode == 0) { //Internal clock
@ -479,9 +482,15 @@ void calculateBPMTiming() {
if (calcbpm > MAXBPM) { calcbpm = MAXBPM; }; if (calcbpm > MAXBPM) { calcbpm = MAXBPM; };
pulsePeriod = 600000 / (calcbpm * PPQN); pulsePeriod = 600000 / (calcbpm * PPQN);
} else if (masterClockMode == 1 && extClockPPQN == 1) { //for ext 1/16 clock (hardcoded) } else if (masterClockMode == 1 && extClockPPQN == 1) { //for ext 1/16 clock
pulsePeriod = (newExtPulseTime - lastExtPulseTime) * 10 / 6; pulsePeriod = (newExtPulseTime - lastExtPulseTime) * 10 / 6;
} }
for (byte i = 0; i < (extraChannel ? 7 : 6); i++) {
if (channels[i].mode == 4) {
calculateGate(i);
}
}
} }
void resetClocks() { void resetClocks() {

View File

@ -68,6 +68,7 @@ void checkInputs() {
updateScreen(); updateScreen();
} else if (displayScreen == 2 && menuItem == 3) { } else if (displayScreen == 2 && menuItem == 3) {
extraChannel = !extraChannel; extraChannel = !extraChannel;
updateScreen();
} else if (displayScreen == 2 && menuItem == 4) { } else if (displayScreen == 2 && menuItem == 4) {
EEPROM.put(1023, memCode - 1); EEPROM.put(1023, memCode - 1);
reboot(); reboot();
@ -195,11 +196,12 @@ void checkInputs() {
&& displayTab != 0 && displayTab != 0
&& channels[displayTab - 1].mode == 4) { //Change GATE && channels[displayTab - 1].mode == 4) { //Change GATE
channels[displayTab - 1].gate = channels[displayTab - 1].gate + change; channels[displayTab - 1].gate = channels[displayTab - 1].gate + change;
if (channels[displayTab - 1].gate > 63) { if (channels[displayTab - 1].gate > 100 || channels[displayTab - 1].gate == 0) {
channels[displayTab - 1].gate = 0; channels[displayTab - 1].gate = 1;
} else if (channels[displayTab - 1].gate > 48) { } else if (channels[displayTab - 1].gate > 99) {
channels[displayTab - 1].gate = 48; channels[displayTab - 1].gate = 99;
} }
calculateGate(displayTab - 1);
saveState(); saveState();
} else if (insideTab && !shiftBtnPushed && !menuItemSelected) { } else if (insideTab && !shiftBtnPushed && !menuItemSelected) {
menuItem = menuItem + change; menuItem = menuItem + change;

View File

@ -208,7 +208,7 @@ void updateScreen() {
} else if (channels[displayTab - 1].mode == 3) { } else if (channels[displayTab - 1].mode == 3) {
valueStr = F("SWING"); valueStr = F("SWING");
} else if (channels[displayTab - 1].mode == 4) { } else if (channels[displayTab - 1].mode == 4) {
valueStr = F("PULSES"); //valueStr = F("PULSES");
} }
if ((!insideTab && shiftBtnPushed) || (insideTab && menuItem == 0)) { if ((!insideTab && shiftBtnPushed) || (insideTab && menuItem == 0)) {
@ -225,7 +225,7 @@ void updateScreen() {
} }
valueStr = valueStr + String(abs(subDivs[channels[displayTab - 1].subDiv])); valueStr = valueStr + String(abs(subDivs[channels[displayTab - 1].subDiv]));
} else if (channels[displayTab - 1].mode == 1) { } else if (channels[displayTab - 1].mode == 1) {
valueStr = String(channels[displayTab - 1].random) + "0%"; valueStr = String(channels[displayTab - 1].random) + (channels[displayTab - 1].random == 0 ? "%" : "0%");
} else if (channels[displayTab - 1].mode == 2) { } else if (channels[displayTab - 1].mode == 2) {
if (channels[displayTab - 1].seqPattern < 8) { if (channels[displayTab - 1].seqPattern < 8) {
valueStr = F("A"); valueStr = F("A");
@ -238,7 +238,7 @@ void updateScreen() {
byte swingVals[6] = {50, 58, 66, 75, 83, 92}; byte swingVals[6] = {50, 58, 66, 75, 83, 92};
valueStr = String(swingVals[channels[displayTab - 1].swing]) + "%"; valueStr = String(swingVals[channels[displayTab - 1].swing]) + "%";
} else if (channels[displayTab - 1].mode == 4) { } else if (channels[displayTab - 1].mode == 4) {
valueStr = String(channels[displayTab - 1].gate); valueStr = String(channels[displayTab - 1].gate) + "%";
} }
u8g2.setFont(stkL); u8g2.setFont(stkL);
if ((!insideTab && shiftBtnPushed) || (insideTab && menuItem == 0 && (menuItemSelected || shiftBtnPushed))) { if ((!insideTab && shiftBtnPushed) || (insideTab && menuItem == 0 && (menuItemSelected || shiftBtnPushed))) {
@ -348,7 +348,7 @@ void updateScreen() {
valueStr = F("REVERSE ENCODER"); valueStr = F("REVERSE ENCODER");
break; break;
case 3: case 3:
valueStr = F("7TH CHANNEL"); valueStr = (extraChannel ? F("7TH CHANNEL: ON") : F("7TH CHANNEL: OFF"));
break; break;
case 4: case 4:
valueStr = F("FACTORY RESET"); valueStr = F("FACTORY RESET");