Added 4ppqn ext and new subdivs (24, 32, 64, 128)
This commit is contained in:
@ -8087,6 +8087,7 @@
|
||||
(gr_line (start 97.62 161.03) (end 96.82 161.03) (layer "Edge.Cuts") (width 0.05) (tstamp 601bde20-61eb-49ab-8f7f-530cb12abd4f))
|
||||
(gr_circle (center 64.71 82.29) (end 67.74 82.29) (layer "Edge.Cuts") (width 0.05) (fill none) (tstamp 657cd3f1-2e41-44b3-8034-6d394ba3318f))
|
||||
(gr_circle (center 94.61 129) (end 95.66 129) (layer "Edge.Cuts") (width 0.05) (fill none) (tstamp 6a0981d5-08d6-40c8-b4a2-41753fd8531c))
|
||||
(gr_circle (center 94.61 151.52) (end 95.96 151.52) (layer "Edge.Cuts") (width 0.05) (fill none) (tstamp 6acce12f-b607-4db1-b1d6-0a2789449d91))
|
||||
(gr_circle (center 64.71 48.59) (end 61.66 48.59) (layer "Edge.Cuts") (width 0.05) (fill none) (tstamp a079e287-f038-487b-8f6a-bfcda0331a0f))
|
||||
(gr_circle (center 64.7 72.08) (end 65.75 72.08) (layer "Edge.Cuts") (width 0.05) (fill none) (tstamp a99f1583-1858-47bc-a23e-4b0348d21d69))
|
||||
(gr_circle (center 74.71 90.09) (end 75.76 90.09) (layer "Edge.Cuts") (width 0.05) (fill none) (tstamp aff8863a-e54c-4813-859d-7d5b33e05755))
|
||||
|
||||
@ -39,7 +39,7 @@ bool rotateScreen = false;
|
||||
#define ANALOGUE_INPUT_1_PIN A2
|
||||
#define ANALOGUE_INPUT_2_PIN A1
|
||||
|
||||
const byte clockOutPin = 0;
|
||||
const byte clockOutPin = 13;
|
||||
const int outsPins[6] = {6, 11, 7, 10, 8, 9};
|
||||
bool rotateScreen = true;
|
||||
*/
|
||||
@ -49,7 +49,7 @@ int CV1Calibration = 512;
|
||||
int CV2Calibration = 512;
|
||||
bool showDone = false;
|
||||
|
||||
const int subDivs[17] = { -24, -12, -8, -6, -4, -3, -2, 1, 2, 3, 4, 5, 6, 7, 8, 16, 32 }; //positive - divide, negative - multiply, 0 - off
|
||||
const int subDivs[20] = { -24, -12, -8, -6, -4, -3, -2, 1, 2, 3, 4, 5, 6, 7, 8, 16, 24, 32, 64, 128 }; //positive - divide, negative - multiply, 0 - off
|
||||
|
||||
byte bpm = 130;
|
||||
byte bpmModulationChannel = 200; //0 - CV1, 1 - CV2, 255 - OFF
|
||||
@ -114,6 +114,7 @@ unsigned int tickCount = 0;
|
||||
unsigned int pulseCount = 0;
|
||||
|
||||
byte masterClockMode = 0; // 0 - internal, 1 - external 24ppqn, 2 - MIDI
|
||||
byte extClockPPQN = 0; // 0 - 24, 1 - 4 (1/16)
|
||||
unsigned long lastExtPulseTime;
|
||||
unsigned long newExtPulseTime;
|
||||
|
||||
@ -141,6 +142,9 @@ unsigned long shiftPressedTime;
|
||||
unsigned long shiftReleasedTime;
|
||||
bool encBtnPushed;
|
||||
|
||||
int extResetCountdown;
|
||||
int extTriggerCount;
|
||||
|
||||
//unsigned long lastInteractionTime; // used for display timeout
|
||||
|
||||
U8G2_SSD1306_128X64_NONAME_2_HW_I2C u8g2(U8G2_R2, SCL, SDA, U8X8_PIN_NONE);
|
||||
@ -163,22 +167,26 @@ const uint8_t velvetscreen[437] U8G2_FONT_SECTION("velvetscreen") =
|
||||
"\7p\10\255\364V\266\323\2q\7\255\364\216\257\5r\10\253d\242\32*\2t\6\255t\376#w\11"
|
||||
"\255\364V\245FN\13x\6\233dR\7\0\0\0\4\377\377\0";
|
||||
|
||||
const uint8_t fabryka[450] U8G2_FONT_SECTION("fabryka") =
|
||||
"\17\0\4\4\4\5\2\1\6\17\30\1\0\30\0\0\0\1K\0\0\1\245%'\17\37\313\330R#&"
|
||||
"\32!F\14\211I\310\24!\65\204(MF\21)Cd\304\10\62b\14\215\60Vb\334\20\0/\15"
|
||||
"\376\36\357\244$\351\77\35;\26\0\60$\216\37\17*\65,\210\35\264\335\61T\42\14\11\61#\306\210"
|
||||
" \23\242\220\235\63h\303c$\330\250B\3\0\61\27\216\37\27\311\202\346\216\221\30Ed\324\230Q\202"
|
||||
"\306\316\377\263\26\35\62\33\216\37\17*\65,\210\35\64\70v\246\344\316h\203\252$\321\261s\373\340\1"
|
||||
"\3\63\35\216\37\17*\65,\210\35\64\70v(IZZKv\266\6\15\36#\301F\25\32\0\64\37"
|
||||
"\216\37\227\240\331\20\32Bj\310\260\21\304F\214\33\61n\304\70\203\366\360\301\203\20m\347\3\65\32\216"
|
||||
"\37\7\213.\306\316'\205\326\60!E\226\354\334\32<F\202\215*\64\0\66\33\216\37\17*\65,\210"
|
||||
"\35\64;/\316\60iA\354\240=<F\202\215*\64\0\67\25\216\37C\213\7m\347S\222\364\351\264"
|
||||
"C\307\16\35;)\0\70 \216\37\17*\65,\210\35\264\341\61\22\204\310\250B\245\206\20\11b\7\355"
|
||||
"\360\30\11\66\252\320\0\71\33\216\37\17*\65,\210\35\264\207\307H\64asb\354|\61\214\4\33U"
|
||||
"h\0A\30\216\37\223\71Tj\10\21\31\66d\330\210\201\366\360\301\7\3\355\17\7B&\216\37\203\242"
|
||||
"\65L\206\221\30\67b\334\210q#\306\215\30\67b\30\11&\234\14#\61\356\240\275{ \242\5\23\0"
|
||||
"x\32\336\36\303\300c$\10\221!B\12\235I\222\346P\21!C\210\4\261\203\3\0\0\0\4\377\377"
|
||||
"\0";
|
||||
const uint8_t fabryka[605] U8G2_FONT_SECTION("fabryka") =
|
||||
"\25\0\4\4\5\5\2\1\6\20\30\1\0\30\0\0\0\1K\0\0\2@%'\17>\226\261\245FL"
|
||||
"\64B\214\30\22\223\220)Bj\10Q\232\214\42R\206\310\210\21d\304\30\32a\254\304\270!\0/\15"
|
||||
"\356=\336II\322\177:v,\0\60$\16\77\36TjX\20;h\273c\250D\30\22bF\214\21"
|
||||
"A&D!;g\320\206\307H\260Q\205\6\0\61\27\16\77.\222\5\315\35#\61\212\310\250\61\243\4"
|
||||
"\215\235\377g-:\62\33\16\77\36TjX\20;hp\354L\311\235\321\6UI\242c\347\366\301\3"
|
||||
"\6\63\35\16\77\36TjX\20;hp\354P\222\264\264\226\354l\15\32<F\202\215*\64\0\64\37"
|
||||
"\16\77.A\263!\64\204\324\220a#\210\215\30\67b\334\210q\6\355\341\203\7!\332\316\7\65\32\16"
|
||||
"\77\16\26]\214\235O\12\255aB\212,\331\271\65x\214\4\33Uh\0\66\33\16\77\36TjX\20"
|
||||
";hv^\234a\322\202\330A{x\214\4\33Uh\0\67\25\16\77\206\26\17\332\316\247$\351\323i"
|
||||
"\207\216\35:vR\0\70 \16\77\36TjX\20;h\303c$\10\221Q\205J\15!\22\304\16\332"
|
||||
"\341\61\22lT\241\1\71\33\16\77\36TjX\20;h\17\217\221h\302\346\304\330\371b\30\11\66\252"
|
||||
"\320\0A\30\16\77&s\250\324\20\42\62l\310\260\21\3\355\341\203\17\6\332\37\16B&\16\77\6E"
|
||||
"k\230\14#\61n\304\270\21\343F\214\33\61n\304\60\22L\70\31Fb\334A{\367@D\13&\0"
|
||||
"D\34\16\77\6Ek\230\14\33\62n\304\270\21\3\355\377\356\334\210a$\230\254Q\4\0E\22\15\37"
|
||||
"\206\17\230\316\247\211\62\32:\77}\360 \1I\7\3\337\204\77`M*\17_\6\261%\317\241K\245"
|
||||
"jM\12\61\42L\210\21ab\12#\42\204\30\21!\304H\21\63c\314\214\61\24\310\244\375r\0T"
|
||||
"\15\15\37\206\17R\15\235\377\377+\0X/\20_\206\241\7I\14\34B\214\314\260AT\21!\67d"
|
||||
" J\243f\11\223\65j\22\341\220qDH\21\42\64l\14\61\42\3G\20<:\0x\32\256=\206"
|
||||
"\201\307H\20\42C\204\24:\223$\315\241\42B\206\20\11b\7\7\0\0\0\4\377\377\0";
|
||||
|
||||
|
||||
void setup() {
|
||||
@ -214,6 +222,8 @@ void loop() {
|
||||
checkInputs();
|
||||
if (masterClockMode == 2) {
|
||||
receiveMIDI();
|
||||
} else if (masterClockMode == 1 && extClockPPQN == 1) {
|
||||
calculateBPMTiming();
|
||||
}
|
||||
}
|
||||
|
||||
@ -264,6 +274,12 @@ void clock() {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (masterClockMode == 1 && extClockPPQN == 1) {
|
||||
if (tickCount >= pulsePeriod && pulseCount < (PPQN - 1)) { // ((6 * (extTriggerCount + 1)) - 1)) { //this formula puts it out of sync, so there's PPQN-1 for now
|
||||
tickCount = 0;
|
||||
pulseCount++;
|
||||
}
|
||||
}
|
||||
|
||||
if (masterClockMode == 2 && MIDIClockRecived) { // MIDI should happen here (needs testing)
|
||||
tickCount = 0; //to make things happen in the main clock function
|
||||
@ -289,7 +305,7 @@ void externalClock() {
|
||||
lastExtPulseTime = newExtPulseTime;
|
||||
newExtPulseTime = millis();
|
||||
|
||||
if (masterClockMode == 1) { // EXT-24
|
||||
if (masterClockMode == 1 && extClockPPQN == 0) { // EXT-24
|
||||
//reset cycles if there was no pulses for a while
|
||||
if ((newExtPulseTime - lastExtPulseTime) > 125) { //125ms is 20bpm
|
||||
for (byte i = 0; i < 6; i++) {
|
||||
@ -306,7 +322,33 @@ void externalClock() {
|
||||
} else {
|
||||
pulseCount = 0;
|
||||
}
|
||||
}
|
||||
} else if (masterClockMode == 1 && extClockPPQN == 1) { //EXT 1/16
|
||||
if (!isPlaying) {
|
||||
isPlaying = true;
|
||||
}
|
||||
if ((newExtPulseTime - lastExtPulseTime) > 750) {
|
||||
resetClocks();
|
||||
extResetCountdown = 0;
|
||||
extTriggerCount = 0;
|
||||
}
|
||||
|
||||
if (extTriggerCount == 0) { //happens on beat
|
||||
pulseCount = 0;
|
||||
tickCount = 0;
|
||||
}
|
||||
if (extTriggerCount < 3) {
|
||||
extTriggerCount++;
|
||||
} else {
|
||||
extTriggerCount = 0;
|
||||
}
|
||||
|
||||
if (extResetCountdown < 4) { //reset on the second beat (5th pulse), so that BPM is already calculated correctly
|
||||
extResetCountdown++;
|
||||
} else if (extResetCountdown == 4) {
|
||||
resetClocks();
|
||||
extResetCountdown++; //to get out of the loop
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sendTriggers() {
|
||||
@ -474,10 +516,7 @@ void calculateBPMTiming() {
|
||||
}
|
||||
pulsePeriod = 60000 / ((bpm + mod) * PPQN);
|
||||
|
||||
} else if (masterClockMode == 2) { //for external beat clock
|
||||
pulsePeriod = (newExtPulseTime - lastExtPulseTime) / PPQN;
|
||||
|
||||
} else if (masterClockMode == 3) { //for ext 1/16 clock (hardcoded)
|
||||
} else if (masterClockMode == 1 && extClockPPQN == 1) { //for ext 1/16 clock (hardcoded)
|
||||
pulsePeriod = (newExtPulseTime - lastExtPulseTime) / 6;
|
||||
}
|
||||
}
|
||||
|
||||
@ -175,7 +175,11 @@ void checkInputs() {
|
||||
masterClockMode = 2;
|
||||
}
|
||||
saveState();
|
||||
} else if (insideTab && (menuItemSelected || shiftBtnPushed) && displayTab == 0 && menuItem == 2) { //Modulation channel
|
||||
} else if (insideTab
|
||||
&& (menuItemSelected || shiftBtnPushed)
|
||||
&& displayTab == 0
|
||||
&& menuItem == 2
|
||||
&& masterClockMode == 0) { //Modulation channel
|
||||
bpmModulationChannel = bpmModulationChannel + change;
|
||||
if (bpmModulationChannel == 0 || bpmModulationChannel == 1) {
|
||||
bpmModulationRange = 1;
|
||||
@ -186,7 +190,22 @@ void checkInputs() {
|
||||
bpmModulationChannel = 1;
|
||||
}
|
||||
saveState();
|
||||
} else if (insideTab && (menuItemSelected || shiftBtnPushed) && displayTab == 0 && menuItem == 3) { //Modulation range
|
||||
} else if (insideTab
|
||||
&& (menuItemSelected || shiftBtnPushed)
|
||||
&& displayTab == 0
|
||||
&& menuItem == 2
|
||||
&& masterClockMode == 1) { //PPQN
|
||||
extClockPPQN = extClockPPQN + change;
|
||||
if (extClockPPQN > 100) {
|
||||
extClockPPQN = 0;
|
||||
} else if (extClockPPQN > 1) {
|
||||
extClockPPQN = 1;
|
||||
}
|
||||
saveState();
|
||||
} else if (insideTab
|
||||
&& (menuItemSelected || shiftBtnPushed)
|
||||
&& displayTab == 0
|
||||
&& menuItem == 3) { //Modulation range
|
||||
bpmModulationRange = bpmModulationRange + change;
|
||||
if (bpmModulationRange == 0) {
|
||||
bpmModulationRange = 1;
|
||||
@ -196,7 +215,10 @@ void checkInputs() {
|
||||
bpmModulationRange = 5;
|
||||
}
|
||||
saveState();
|
||||
} else if (insideTab && (menuItemSelected || shiftBtnPushed) && displayTab != 0 && menuItem == 1) { //Channel Mode
|
||||
} else if (insideTab
|
||||
&& (menuItemSelected || shiftBtnPushed)
|
||||
&& displayTab != 0
|
||||
&& menuItem == 1) { //Channel Mode
|
||||
channels[displayTab - 1].mode = channels[displayTab - 1].mode + change;
|
||||
if (channels[displayTab - 1].mode > 100) {
|
||||
channels[displayTab - 1].mode = 0;
|
||||
@ -206,7 +228,10 @@ void checkInputs() {
|
||||
channels[displayTab - 1].CV1Target = 0;
|
||||
channels[displayTab - 1].CV2Target = 0;
|
||||
saveState();
|
||||
} else if (insideTab && (menuItemSelected || shiftBtnPushed) && displayTab != 0 && menuItem == 2 && channels[displayTab - 1].mode == 0) { //Offset
|
||||
} else if (insideTab
|
||||
&& (menuItemSelected || shiftBtnPushed)
|
||||
&& displayTab != 0 && menuItem == 2
|
||||
&& channels[displayTab - 1].mode == 0) { //Offset
|
||||
channels[displayTab - 1].offset = channels[displayTab - 1].offset + change;
|
||||
if (channels[displayTab - 1].offset > 1000) {
|
||||
channels[displayTab - 1].offset = 0;
|
||||
@ -214,7 +239,11 @@ void checkInputs() {
|
||||
channels[displayTab - 1].offset = channelPulsesPerCycle[displayTab-1];
|
||||
}
|
||||
saveState();
|
||||
} else if (insideTab && (menuItemSelected || shiftBtnPushed) && displayTab != 0 && menuItem == 2 && channels[displayTab - 1].mode == 1) { //SUBDIV for RANDOM
|
||||
} else if (insideTab
|
||||
&& (menuItemSelected || shiftBtnPushed)
|
||||
&& displayTab != 0
|
||||
&& menuItem == 2
|
||||
&& channels[displayTab - 1].mode == 1) { //SUBDIV for RANDOM
|
||||
channels[displayTab - 1].subDiv = channels[displayTab - 1].subDiv - change;
|
||||
if (channels[displayTab - 1].subDiv > 200) {
|
||||
channels[displayTab - 1].subDiv = 0;
|
||||
@ -225,7 +254,11 @@ void checkInputs() {
|
||||
calculateCycles();
|
||||
}
|
||||
saveState();
|
||||
} else if (insideTab && (menuItemSelected || shiftBtnPushed) && displayTab != 0 && menuItem == 3 && channels[displayTab - 1].mode == 0) { //CV for CLK
|
||||
} else if (insideTab
|
||||
&& (menuItemSelected || shiftBtnPushed)
|
||||
&& displayTab != 0
|
||||
&& menuItem == 3
|
||||
&& channels[displayTab - 1].mode == 0) { //CV for CLK
|
||||
if (channels[displayTab - 1].CV1Target == 1 && channels[displayTab - 1].CV2Target == 0) {
|
||||
channelCV = 1;
|
||||
} else if (channels[displayTab - 1].CV1Target == 0 && channels[displayTab - 1].CV2Target == 1) {
|
||||
|
||||
@ -24,7 +24,7 @@ void updateScreen() {
|
||||
} else if (masterClockMode == 0 && bpmModulationRange != 0) {
|
||||
lastMenuItem = 3;
|
||||
} else if (masterClockMode == 1) {
|
||||
lastMenuItem = 1;
|
||||
lastMenuItem = 2;
|
||||
} else if (masterClockMode == 2) {
|
||||
lastMenuItem = 1;
|
||||
}
|
||||
@ -34,6 +34,8 @@ void updateScreen() {
|
||||
valueStr = "MODE:";
|
||||
} else if (i == 2 && masterClockMode == 0) {
|
||||
valueStr = "MOD:";
|
||||
} else if (i == 2 && masterClockMode == 1) {
|
||||
valueStr = "PPQN:";
|
||||
} else if (i == 3 && masterClockMode == 0) {
|
||||
valueStr = "RANGE:";
|
||||
}
|
||||
@ -62,6 +64,10 @@ void updateScreen() {
|
||||
valueStr = "CV2";
|
||||
} else if (i == 2 && masterClockMode == 0 && bpmModulationRange == 0) {
|
||||
valueStr = "OFF";
|
||||
} else if (i == 2 && masterClockMode == 1 && extClockPPQN == 0) {
|
||||
valueStr = "24";
|
||||
} else if (i == 2 && masterClockMode == 1 && extClockPPQN == 1) {
|
||||
valueStr = "4";
|
||||
} else if (i == 3 && bpmModulationRange != 0) {
|
||||
valueStr = String(bpmModulationRange * 10);
|
||||
}
|
||||
@ -82,7 +88,7 @@ void updateScreen() {
|
||||
if (masterClockMode == 0) {
|
||||
bpmStr = String(bpm);
|
||||
} else if (masterClockMode == 1) {
|
||||
bpmStr = "24";
|
||||
bpmStr = "EXT";
|
||||
} else if (masterClockMode == 2) {
|
||||
bpmStr = "MIDI";
|
||||
}
|
||||
@ -109,11 +115,11 @@ void updateScreen() {
|
||||
}
|
||||
}
|
||||
|
||||
if (masterClockMode == 1) {
|
||||
if (masterClockMode != 0) { //EXT and MIDI
|
||||
u8g2.setFont(fabryka);
|
||||
u8g2.drawButtonUTF8(leftOffset, 28, U8G2_BTN_BW0|U8G2_BTN_HCENTER, width, 0, 0, bpmChar );
|
||||
u8g2.setFont(velvetscreen);
|
||||
u8g2.drawButtonUTF8(leftOffset, 40, U8G2_BTN_BW0|U8G2_BTN_HCENTER, width, 0, 2, "PPQN" );
|
||||
//u8g2.setFont(velvetscreen);
|
||||
//u8g2.drawButtonUTF8(leftOffset, 40, U8G2_BTN_BW0|U8G2_BTN_HCENTER, width, 0, 2, "PPQN" );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user