OSCtoCV Library
OSCtoCV_GateSequencer.cpp@0:cd43a974c54c, 2016-01-17 (annotated)
- Committer:
- casiotone401
- Date:
- Sun Jan 17 09:30:32 2016 +0000
- Revision:
- 0:cd43a974c54c
- Child:
- 1:981b62bb5c87
added random, lfo mode
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
casiotone401 | 0:cd43a974c54c | 1 | /* |
casiotone401 | 0:cd43a974c54c | 2 | OSCtoCV_GateSequencer.cpp |
casiotone401 | 0:cd43a974c54c | 3 | */ |
casiotone401 | 0:cd43a974c54c | 4 | |
casiotone401 | 0:cd43a974c54c | 5 | #include "mbed.h" |
casiotone401 | 0:cd43a974c54c | 6 | #include "OSCtoCV_GateSequencer.h" |
casiotone401 | 0:cd43a974c54c | 7 | #include "OSCtoCV.h" |
casiotone401 | 0:cd43a974c54c | 8 | |
casiotone401 | 0:cd43a974c54c | 9 | //------------------------------------------------------------- |
casiotone401 | 0:cd43a974c54c | 10 | // Gate Sequencer beat(Note values) length(Gate time) invert(invert Gate) |
casiotone401 | 0:cd43a974c54c | 11 | |
casiotone401 | 0:cd43a974c54c | 12 | int GateSeq(int bpm, int beat, int ch, int length, bool invert, bool gatesoff, bool syncoff) |
casiotone401 | 0:cd43a974c54c | 13 | { |
casiotone401 | 0:cd43a974c54c | 14 | int i; |
casiotone401 | 0:cd43a974c54c | 15 | static int gatetime[GATE_TOTAL], oldgatetime[GATE_TOTAL]; |
casiotone401 | 0:cd43a974c54c | 16 | static int _bpm, bar, sync24, oldsynctime; |
casiotone401 | 0:cd43a974c54c | 17 | |
casiotone401 | 0:cd43a974c54c | 18 | int time = gTimer.read_us(); |
casiotone401 | 0:cd43a974c54c | 19 | |
casiotone401 | 0:cd43a974c54c | 20 | if (_bpm != bpm) |
casiotone401 | 0:cd43a974c54c | 21 | { |
casiotone401 | 0:cd43a974c54c | 22 | if (!bpm) |
casiotone401 | 0:cd43a974c54c | 23 | { |
casiotone401 | 0:cd43a974c54c | 24 | beat = NRESET; |
casiotone401 | 0:cd43a974c54c | 25 | |
casiotone401 | 0:cd43a974c54c | 26 | } else { |
casiotone401 | 0:cd43a974c54c | 27 | |
casiotone401 | 0:cd43a974c54c | 28 | bar = (60.0f / bpm) * 4000000; |
casiotone401 | 0:cd43a974c54c | 29 | //sync24 = (bar / 4) / 24; // sync24 not tested |
casiotone401 | 0:cd43a974c54c | 30 | |
casiotone401 | 0:cd43a974c54c | 31 | _bpm = bpm; |
casiotone401 | 0:cd43a974c54c | 32 | } |
casiotone401 | 0:cd43a974c54c | 33 | } |
casiotone401 | 0:cd43a974c54c | 34 | |
casiotone401 | 0:cd43a974c54c | 35 | switch (beat) // Calculate Note values |
casiotone401 | 0:cd43a974c54c | 36 | { |
casiotone401 | 0:cd43a974c54c | 37 | case NDOT2: |
casiotone401 | 0:cd43a974c54c | 38 | |
casiotone401 | 0:cd43a974c54c | 39 | gatetime[ch] = (bar / 4) * 3; |
casiotone401 | 0:cd43a974c54c | 40 | break; |
casiotone401 | 0:cd43a974c54c | 41 | |
casiotone401 | 0:cd43a974c54c | 42 | case NDOT4: |
casiotone401 | 0:cd43a974c54c | 43 | |
casiotone401 | 0:cd43a974c54c | 44 | gatetime[ch] = (bar / 8) * 3; |
casiotone401 | 0:cd43a974c54c | 45 | break; |
casiotone401 | 0:cd43a974c54c | 46 | |
casiotone401 | 0:cd43a974c54c | 47 | case NDOT8: |
casiotone401 | 0:cd43a974c54c | 48 | |
casiotone401 | 0:cd43a974c54c | 49 | gatetime[ch] = (bar / 16) * 3; |
casiotone401 | 0:cd43a974c54c | 50 | break; |
casiotone401 | 0:cd43a974c54c | 51 | |
casiotone401 | 0:cd43a974c54c | 52 | case NDOT16: |
casiotone401 | 0:cd43a974c54c | 53 | |
casiotone401 | 0:cd43a974c54c | 54 | gatetime[ch] = (bar / 32) * 3; |
casiotone401 | 0:cd43a974c54c | 55 | break; |
casiotone401 | 0:cd43a974c54c | 56 | |
casiotone401 | 0:cd43a974c54c | 57 | case NDOT32: |
casiotone401 | 0:cd43a974c54c | 58 | |
casiotone401 | 0:cd43a974c54c | 59 | gatetime[ch] = (bar / 64) * 3; |
casiotone401 | 0:cd43a974c54c | 60 | break; |
casiotone401 | 0:cd43a974c54c | 61 | |
casiotone401 | 0:cd43a974c54c | 62 | case NRESET: |
casiotone401 | 0:cd43a974c54c | 63 | |
casiotone401 | 0:cd43a974c54c | 64 | gTimer.reset(); |
casiotone401 | 0:cd43a974c54c | 65 | |
casiotone401 | 0:cd43a974c54c | 66 | for (i = 0; i < GATE_TOTAL; ++i) // Reset |
casiotone401 | 0:cd43a974c54c | 67 | { |
casiotone401 | 0:cd43a974c54c | 68 | oldsynctime = oldgatetime[i] = gatetime[i] = NRESET; |
casiotone401 | 0:cd43a974c54c | 69 | } |
casiotone401 | 0:cd43a974c54c | 70 | |
casiotone401 | 0:cd43a974c54c | 71 | return 0; |
casiotone401 | 0:cd43a974c54c | 72 | |
casiotone401 | 0:cd43a974c54c | 73 | default: |
casiotone401 | 0:cd43a974c54c | 74 | |
casiotone401 | 0:cd43a974c54c | 75 | gatetime[ch] = bar / beat; |
casiotone401 | 0:cd43a974c54c | 76 | sync24 = bar / 16; |
casiotone401 | 0:cd43a974c54c | 77 | break; |
casiotone401 | 0:cd43a974c54c | 78 | } |
casiotone401 | 0:cd43a974c54c | 79 | |
casiotone401 | 0:cd43a974c54c | 80 | if (time > oldsynctime + sync24) // sync24 not tested |
casiotone401 | 0:cd43a974c54c | 81 | { |
casiotone401 | 0:cd43a974c54c | 82 | if (!syncoff) |
casiotone401 | 0:cd43a974c54c | 83 | { |
casiotone401 | 0:cd43a974c54c | 84 | oldsynctime = time; |
casiotone401 | 0:cd43a974c54c | 85 | gCLOCKOUT = true; |
casiotone401 | 0:cd43a974c54c | 86 | |
casiotone401 | 0:cd43a974c54c | 87 | midi.sendRealTime(Clock); // MIDI Clock |
casiotone401 | 0:cd43a974c54c | 88 | } |
casiotone401 | 0:cd43a974c54c | 89 | |
casiotone401 | 0:cd43a974c54c | 90 | } else if (time > oldsynctime - (sync24 - 2)) { |
casiotone401 | 0:cd43a974c54c | 91 | |
casiotone401 | 0:cd43a974c54c | 92 | if (!syncoff) |
casiotone401 | 0:cd43a974c54c | 93 | { |
casiotone401 | 0:cd43a974c54c | 94 | gCLOCKOUT = false; |
casiotone401 | 0:cd43a974c54c | 95 | } |
casiotone401 | 0:cd43a974c54c | 96 | } |
casiotone401 | 0:cd43a974c54c | 97 | |
casiotone401 | 0:cd43a974c54c | 98 | if (ch == GATE_TOTAL) |
casiotone401 | 0:cd43a974c54c | 99 | { |
casiotone401 | 0:cd43a974c54c | 100 | return -1; |
casiotone401 | 0:cd43a974c54c | 101 | |
casiotone401 | 0:cd43a974c54c | 102 | } else if (time > oldgatetime[ch] + gatetime[ch] && !invert) { |
casiotone401 | 0:cd43a974c54c | 103 | |
casiotone401 | 0:cd43a974c54c | 104 | oldgatetime[ch] = time; |
casiotone401 | 0:cd43a974c54c | 105 | |
casiotone401 | 0:cd43a974c54c | 106 | if (!gatesoff) |
casiotone401 | 0:cd43a974c54c | 107 | { |
casiotone401 | 0:cd43a974c54c | 108 | gGATES[ch] = true; |
casiotone401 | 0:cd43a974c54c | 109 | |
casiotone401 | 0:cd43a974c54c | 110 | } else if (ch == SUBGATE) { |
casiotone401 | 0:cd43a974c54c | 111 | |
casiotone401 | 0:cd43a974c54c | 112 | gSUBGATE = true; |
casiotone401 | 0:cd43a974c54c | 113 | } |
casiotone401 | 0:cd43a974c54c | 114 | |
casiotone401 | 0:cd43a974c54c | 115 | return 1; |
casiotone401 | 0:cd43a974c54c | 116 | |
casiotone401 | 0:cd43a974c54c | 117 | } else if (time > oldgatetime[ch] + gatetime[ch] && invert) { |
casiotone401 | 0:cd43a974c54c | 118 | |
casiotone401 | 0:cd43a974c54c | 119 | oldgatetime[ch] = time; |
casiotone401 | 0:cd43a974c54c | 120 | |
casiotone401 | 0:cd43a974c54c | 121 | if (!gatesoff) |
casiotone401 | 0:cd43a974c54c | 122 | { |
casiotone401 | 0:cd43a974c54c | 123 | gGATES[ch] = false; |
casiotone401 | 0:cd43a974c54c | 124 | |
casiotone401 | 0:cd43a974c54c | 125 | } else if (ch == SUBGATE) { |
casiotone401 | 0:cd43a974c54c | 126 | |
casiotone401 | 0:cd43a974c54c | 127 | gSUBGATE = false; |
casiotone401 | 0:cd43a974c54c | 128 | } |
casiotone401 | 0:cd43a974c54c | 129 | |
casiotone401 | 0:cd43a974c54c | 130 | return 0; |
casiotone401 | 0:cd43a974c54c | 131 | |
casiotone401 | 0:cd43a974c54c | 132 | } else if (time > oldgatetime[ch] + (gatetime[ch] - gatetime[ch] / length) && !invert) { |
casiotone401 | 0:cd43a974c54c | 133 | |
casiotone401 | 0:cd43a974c54c | 134 | if (!gatesoff) |
casiotone401 | 0:cd43a974c54c | 135 | { |
casiotone401 | 0:cd43a974c54c | 136 | gGATES[ch] = false; |
casiotone401 | 0:cd43a974c54c | 137 | |
casiotone401 | 0:cd43a974c54c | 138 | } else if (ch == SUBGATE) { |
casiotone401 | 0:cd43a974c54c | 139 | |
casiotone401 | 0:cd43a974c54c | 140 | gSUBGATE = false; |
casiotone401 | 0:cd43a974c54c | 141 | } |
casiotone401 | 0:cd43a974c54c | 142 | |
casiotone401 | 0:cd43a974c54c | 143 | return 0; |
casiotone401 | 0:cd43a974c54c | 144 | |
casiotone401 | 0:cd43a974c54c | 145 | } else if (time > oldgatetime[ch] + (gatetime[ch] - gatetime[ch] / length) && invert) { |
casiotone401 | 0:cd43a974c54c | 146 | |
casiotone401 | 0:cd43a974c54c | 147 | if (!gatesoff) |
casiotone401 | 0:cd43a974c54c | 148 | { |
casiotone401 | 0:cd43a974c54c | 149 | gGATES[ch] = true; |
casiotone401 | 0:cd43a974c54c | 150 | |
casiotone401 | 0:cd43a974c54c | 151 | } else if (ch == SUBGATE) { |
casiotone401 | 0:cd43a974c54c | 152 | |
casiotone401 | 0:cd43a974c54c | 153 | gSUBGATE = true; |
casiotone401 | 0:cd43a974c54c | 154 | } |
casiotone401 | 0:cd43a974c54c | 155 | |
casiotone401 | 0:cd43a974c54c | 156 | return 1; |
casiotone401 | 0:cd43a974c54c | 157 | |
casiotone401 | 0:cd43a974c54c | 158 | } else { |
casiotone401 | 0:cd43a974c54c | 159 | |
casiotone401 | 0:cd43a974c54c | 160 | return -1; |
casiotone401 | 0:cd43a974c54c | 161 | } |
casiotone401 | 0:cd43a974c54c | 162 | } |