Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: Bonjour OSCReceiver TextLCD mbed mbed-rpc BurstSPI DebouncedInterrupt FastIO MIDI OSC OSCtoCV ClockControl
Revision 14:977f3c5a4b4e, committed 2014-10-16
- Comitter:
- casiotone401
- Date:
- Thu Oct 16 14:14:25 2014 +0000
- Parent:
- 13:3f42e451a8d3
- Child:
- 15:3e4bc47d6a39
- Commit message:
- improved performance & minor change
Changed in this revision
--- a/Bonjour.lib Sun Mar 09 04:52:52 2014 +0000 +++ b/Bonjour.lib Thu Oct 16 14:14:25 2014 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/casiotone401/code/Bonjour/#105191e07767 +http://mbed.org/users/casiotone401/code/Bonjour/#275256b5d807
--- a/OSCReceiver.lib Sun Mar 09 04:52:52 2014 +0000 +++ b/OSCReceiver.lib Thu Oct 16 14:14:25 2014 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/casiotone401/code/OSCReceiver/#3d6dc580b565 +http://mbed.org/users/casiotone401/code/OSCReceiver/#6dab18e1eb37
--- a/main.cpp Sun Mar 09 04:52:52 2014 +0000
+++ b/main.cpp Thu Oct 16 14:14:25 2014 +0000
@@ -35,24 +35,32 @@
//-------------------------------------------------------------
// Define
-#define MODE_LIN 0 // Linear LinearCV Mode
-#define MODE_QChr 1 // Chromatic Quantize Mode
-#define MODE_QMaj 2 // Major
-#define MODE_QDor 3 // Dorian
-#define MODE_Q5th 4 // 5th
-#define MODE_QWht 5 // Wholetone
-#define MODE_SEQ 6 // Sequencer & Shift Register
-#define MODE_Calb 7 // Calibration (for VCO Tuning)
+#define MODE_Calb 0 // Calibration (for VCO Tuning)
+#define MODE_LIN 1 // Linear LinearCV
+#define MODE_SEQ 2 // Mode Shift
+
+#define MODE_NUM 3 // Modes
-#define MODE_NUM 8 // Modes
+#define Lin 0 // Linear LinearCV
+#define Chr 1 // Chromatic
+#define Maj 2 // Major
+#define M7 3 // Major7
+#define Min7 4 // Minor7
+#define Dor 5 // Dorian
+#define Min 6 // Minor
+#define S5th 7 // 5th
+#define Wht 8 // Wholetone
#define QUAN_RES1 115 // Quantize voltage Steps
#define QUAN_RES2 67
-#define QUAN_RES3 67
-#define QUAN_RES4 17
-#define QUAN_RES5 57
+#define QUAN_RES3 39
+#define QUAN_RES4 48
+#define QUAN_RES5 67
+#define QUAN_RES6 67
+#define QUAN_RES7 17
+#define QUAN_RES8 57
-#define SPI_RATE 40000000 // 40Mbps SPI Clock
+#define SPI_RATE 20000000 // 20Mbps SPI Clock
#define SCALING_N 38400.0
#define INPUT_PORT 12345 // Input Port Number
@@ -110,14 +118,18 @@
inline void NetPoll(void);
void InitOSCCV(void);
inline void UpdateCV(int, int, const unsigned int*);
-int UpdateGate(int, int, int, int, bool);
-inline void SetCV(void);
-void SeqCV(int);
+inline void CalibCV(void);
+inline void SetSCV(void);
+inline void SeqCV(int);
+inline void Seq(void);
+inline int UpdateGate(int, int, int, int, bool);
+inline void UpdateSync(int, int, bool);
void CheckModeSW(void);
inline void CVMeter(int, const unsigned int*);
void LCD();
void WriteCustomChar(unsigned char, unsigned char*);
int SetupEthNetIf(void);
+inline size_t strlength(const char *);
inline void onUDPSocketEvent(UDPSocketEvent);
//-------------------------------------------------------------
@@ -126,89 +138,133 @@
// Chromatic Scale
const float calibMap1[QUAN_RES1] = {
-0.00559238, 0.01324014, 0.02088790, 0.02853566, 0.03618342,
-0.04383118, 0.05147894, 0.05912671, 0.06677447, 0.07442223,
-0.08206999, 0.08971775, 0.09736551, 0.10501327, 0.11266103,
-0.12030879, 0.12775089, 0.13486665, 0.14198242, 0.14909819,
-0.15621395, 0.16332972, 0.17044549, 0.17756125, 0.18467702,
-0.19179279, 0.19890857, 0.20602433, 0.21314010, 0.22025587,
-0.22737163, 0.23448740, 0.24160317, 0.24871893, 0.25587305,
-0.26303557, 0.27019811, 0.27736065, 0.28452319, 0.29168573,
-0.29884824, 0.30601078, 0.31317332, 0.32033587, 0.32749838,
-0.33466092, 0.34182346, 0.34898600, 0.35614854, 0.36331105,
-0.37047359, 0.37764084, 0.38481620, 0.39199156, 0.39916691,
-0.40634227, 0.41351759, 0.42069295, 0.42786831, 0.43504366,
-0.44221902, 0.44939438, 0.45656973, 0.46374506, 0.47092041,
-0.47809577, 0.48527113, 0.49244648, 0.49962184, 0.50685716,
-0.51409578, 0.52133441, 0.52857304, 0.53581166, 0.54305035,
-0.55028898, 0.55752760, 0.56476623, 0.57200485, 0.57924354,
-0.58648217, 0.59372079, 0.60095942, 0.60819805, 0.61543667,
-0.62267536, 0.62996829, 0.63728690, 0.64460552, 0.65192413,
-0.65924275, 0.66656137, 0.67387998, 0.68119860, 0.68851727,
-0.69583589, 0.70315450, 0.71047312, 0.71779174, 0.72511035,
-0.73242897, 0.73974758, 0.74706620, 0.75810421, 0.77163076,
-0.78515732, 0.79868382, 0.81221038, 0.82573694, 0.83926344,
-0.85279000, 0.86631656, 0.88188213, 0.90110368, 0.92032516
+0.00331362, 0.01097947, 0.01864531, 0.02631116, 0.03397701,
+0.04164285, 0.04930869, 0.05697454, 0.06464039, 0.07230624,
+0.07997208, 0.08763793, 0.09530377, 0.10296962, 0.11063547,
+0.11830132, 0.12590303, 0.13306051, 0.14021800, 0.14737549,
+0.15453300, 0.16169049, 0.16884798, 0.17600547, 0.18316296,
+0.19032045, 0.19747795, 0.20463544, 0.21179293, 0.21895042,
+0.22610791, 0.23326540, 0.24042290, 0.24758039, 0.25476459,
+0.26196238, 0.26916021, 0.27635801, 0.28355584, 0.29075363,
+0.29795146, 0.30514926, 0.31234708, 0.31954488, 0.32674271,
+0.33394051, 0.34113833, 0.34833613, 0.35553396, 0.36273175,
+0.36992958, 0.37713069, 0.38433966, 0.39154866, 0.39875764,
+0.40596664, 0.41317561, 0.42038459, 0.42759359, 0.43480256,
+0.44201156, 0.44922054, 0.45642951, 0.46363851, 0.47084749,
+0.47805649, 0.48526546, 0.49247447, 0.49968344, 0.50694764,
+0.51421440, 0.52148110, 0.52874786, 0.53601462, 0.54328132,
+0.55054808, 0.55781484, 0.56508154, 0.57234830, 0.57961506,
+0.58688176, 0.59414852, 0.60141528, 0.60868198, 0.61594874,
+0.62321550, 0.63052768, 0.63785475, 0.64518178, 0.65250880,
+0.65983582, 0.66716284, 0.67448992, 0.68181694, 0.68914396,
+0.69647098, 0.70379800, 0.71112502, 0.71845210, 0.72577912,
+0.73310614, 0.74043316, 0.74776018, 0.75861782, 0.77102989,
+0.78344196, 0.79585397, 0.80826604, 0.82067811, 0.83309019,
+0.84550226, 0.85791427, 0.87032634, 0.90296346, 0.94781560
+};
+
+// Major Scale
+const float calibMap2[QUAN_RES2] = {
+0.01097947, 0.02631116, 0.03397701, 0.04930869, 0.06464039,
+0.07997208, 0.08763793, 0.10296962, 0.11830132, 0.12590303,
+0.14021800, 0.15453300, 0.16884798, 0.17600547, 0.19032045,
+0.20463544, 0.21179293, 0.22610791, 0.24042290, 0.25476459,
+0.26196238, 0.27635801, 0.29075363, 0.29795146, 0.31234708,
+0.32674271, 0.34113833, 0.34833613, 0.36273175, 0.37713069,
+0.38433966, 0.39875764, 0.41317561, 0.42759359, 0.43480256,
+0.44922054, 0.46363851, 0.47084749, 0.48526546, 0.49968344,
+0.51421440, 0.52148110, 0.53601462, 0.55054808, 0.55781484,
+0.57234830, 0.58688176, 0.60141528, 0.60868198, 0.62321550,
+0.63785475, 0.64518178, 0.65983582, 0.67448992, 0.68914396,
+0.69647098, 0.71112502, 0.72577912, 0.73310614, 0.74776018,
+0.77102989, 0.79585397, 0.80826604, 0.83309019, 0.85791427,
+0.87032634, 0.94781560
+};
+
+// M7(9)
+const float calibMap3[QUAN_RES3] = {
+0.02631116, 0.04930869, 0.07997208, 0.08763793, 0.11830132,
+0.14021800, 0.16884798, 0.17600547, 0.20463544, 0.22610791,
+0.25476459, 0.26196238, 0.29075363, 0.31234708, 0.34113833,
+0.34833613, 0.37713069, 0.39875764, 0.42759359, 0.43480256,
+0.44922054, 0.46363851, 0.48526546, 0.51421440, 0.52148110,
+0.55054808, 0.57234830, 0.60141528, 0.60868198, 0.62321550,
+0.63785475, 0.65983582, 0.68914396, 0.69647098, 0.72577912,
+0.74776018, 0.79585397, 0.85791427, 0.94781560
};
-// Major Scale
-const float calibMap2[QUAN_RES2] = {
-0.01324014, 0.02853566, 0.03618342, 0.05147894, 0.06677447,
-0.08206999, 0.08971775, 0.10501327, 0.12030879, 0.12775089,
-0.14198242, 0.15621395, 0.17044549, 0.17756125, 0.19179279,
-0.20602433, 0.21314010, 0.22737163, 0.24160317, 0.25587305,
-0.26303557, 0.27736065, 0.29168573, 0.29884824, 0.31317332,
-0.32749838, 0.34182346, 0.34898600, 0.36331105, 0.37764084,
-0.38481620, 0.39916691, 0.41351759, 0.42786831, 0.43504366,
-0.44939438, 0.46374506, 0.47092041, 0.48527113, 0.49962184,
-0.51409578, 0.52133441, 0.53581166, 0.55028898, 0.55752760,
-0.57200485, 0.58648217, 0.60095942, 0.60819805, 0.62267536,
-0.63728690, 0.64460552, 0.65924275, 0.67387998, 0.68851727,
-0.69583589, 0.71047312, 0.72511035, 0.73242897, 0.74706620,
-0.77163076, 0.79868382, 0.81221038, 0.83926344, 0.86631656,
-0.88188213, 0.92032516
+// m7(9)
+const float calibMap4[QUAN_RES4] = {
+0.01097947, 0.01864531, 0.03397701, 0.04930869, 0.07230624,
+0.08763793, 0.11063547, 0.14021800, 0.16169049, 0.17600547,
+0.19747795, 0.22610791, 0.24042290, 0.24758039, 0.26196238,
+0.29075363, 0.31234708, 0.33394051, 0.34833613, 0.36273175,
+0.36992958, 0.38433966, 0.39875764, 0.41317561, 0.42038459,
+0.43480256, 0.45642951, 0.48526546, 0.50694764, 0.52148110,
+0.53601462, 0.55781484, 0.57234830, 0.59414852, 0.62321550,
+0.63052768, 0.64518178, 0.65983582, 0.68181694, 0.69647098,
+0.71845210, 0.74776018, 0.77102989, 0.78344196, 0.80826604,
+0.83309019, 0.84550226, 0.94781560
+};
+
+// Dorian Scale
+const float calibMap5[QUAN_RES5] = {
+0.01097947, 0.02631116, 0.04164285, 0.04930869, 0.06464039,
+0.07997208, 0.08763793, 0.10296962, 0.11830132, 0.13306051,
+0.14021800, 0.15453300, 0.16884798, 0.17600547, 0.19032045,
+0.20463544, 0.21895042, 0.22610791, 0.24042290, 0.25476459,
+0.26196238, 0.27635801, 0.29075363, 0.30514926, 0.31234708,
+0.32674271, 0.34113833, 0.34833613, 0.36273175, 0.37713069,
+0.39154866, 0.39875764, 0.41317561, 0.42759359, 0.43480256,
+0.44922054, 0.46363851, 0.47805649, 0.48526546, 0.49968344,
+0.51421440, 0.52148110, 0.53601462, 0.55054808, 0.56508154,
+0.57234830, 0.58688176, 0.60141528, 0.60868198, 0.62321550,
+0.63785475, 0.65250880, 0.65983582, 0.67448992, 0.68914396,
+0.69647098, 0.71112502, 0.72577912, 0.74043316, 0.74776018,
+0.77102989, 0.79585397, 0.80826604, 0.83309019, 0.85791427,
+0.90296346, 0.94781560
};
-// Dorian Scale
-const float calibMap3[QUAN_RES3] = {
-0.01324014, 0.02853566, 0.04383118, 0.05147894, 0.06677447,
-0.08206999, 0.08971775, 0.10501327, 0.12030879, 0.13486665,
-0.14198242, 0.15621395, 0.17044549, 0.17756125, 0.19179279,
-0.20602433, 0.22025587, 0.22737163, 0.24160317, 0.25587305,
-0.26303557, 0.27736065, 0.29168573, 0.30601078, 0.31317332,
-0.32749838, 0.34182346, 0.34898600, 0.36331105, 0.37764084,
-0.39199156, 0.39916691, 0.41351759, 0.42786831, 0.43504366,
-0.44939438, 0.46374506, 0.47809577, 0.48527113, 0.49962184,
-0.51409578, 0.52133441, 0.53581166, 0.55028898, 0.56476623,
-0.57200485, 0.58648217, 0.60095942, 0.60819805, 0.62267536,
-0.63728690, 0.65192413, 0.65924275, 0.67387998, 0.68851727,
-0.69583589, 0.71047312, 0.72511035, 0.73974758, 0.74706620,
-0.77163076, 0.79868382, 0.81221038, 0.83926344, 0.86631656,
-0.90110368, 0.92032516
+// Minor Scale
+const float calibMap6[QUAN_RES6] = {
+0.01097947, 0.01864531, 0.03397701, 0.04930869, 0.05697454,
+0.07230624, 0.08763793, 0.10296962, 0.11063547, 0.12590303,
+0.14021800, 0.14737549, 0.16169049, 0.17600547, 0.19032045,
+0.19747795, 0.21179293, 0.22610791, 0.23326540, 0.24758039,
+0.26196238, 0.27635801, 0.28355584, 0.29795146, 0.31234708,
+0.31954488, 0.33394051, 0.34833613, 0.36273175, 0.36992958,
+0.38433966, 0.39875764, 0.40596664, 0.42038459, 0.43480256,
+0.44922054, 0.45642951, 0.47084749, 0.48526546, 0.49247447,
+0.50694764, 0.52148110, 0.53601462, 0.54328132, 0.55781484,
+0.57234830, 0.57961506, 0.59414852, 0.60868198, 0.62321550,
+0.63052768, 0.64518178, 0.65983582, 0.66716284, 0.68181694,
+0.69647098, 0.71112502, 0.71845210, 0.73310614, 0.74776018,
+0.75861782, 0.78344196, 0.80826604, 0.83309019, 0.84550226,
+0.87032634, 0.94781560
};
-// 5th
-const float calibMap4[QUAN_RES4] = {
-0.01324014, 0.06677447, 0.12030879, 0.17044549, 0.22025587,
-0.27019811, 0.32033587, 0.37047359, 0.42069295, 0.47092041,
-0.52133441, 0.57200485, 0.62267536, 0.67387998, 0.72511035,
-0.79868382, 0.90110368
+// 5th
+const float calibMap7[QUAN_RES7] = {
+0.01097947, 0.06464039, 0.11830132, 0.16884798, 0.21895042,
+0.26916021, 0.31954488, 0.36992958, 0.42038459, 0.47084749,
+0.52148110, 0.57234830, 0.62321550, 0.67448992, 0.72577912,
+0.79585397, 0.90296346
};
-// Whole tone
-const float calibMap5[QUAN_RES5] = {
-0.01324014, 0.02853566, 0.04383118, 0.05912671, 0.07442223,
-0.08971775, 0.10501327, 0.12030879, 0.13486665, 0.14909819,
-0.16332972, 0.17756125, 0.19179279, 0.20602433, 0.22025587,
-0.23448740, 0.24871893, 0.26303557, 0.27736065, 0.29168573,
-0.30601078, 0.32033587, 0.33466092, 0.34898600, 0.36331105,
-0.37764084, 0.39199156, 0.40634227, 0.42069295, 0.43504366,
-0.44939438, 0.46374506, 0.47809577, 0.49244648, 0.50685716,
-0.52133441, 0.53581166, 0.55028898, 0.56476623, 0.57924354,
-0.59372079, 0.60819805, 0.62267536, 0.63728690, 0.65192413,
-0.66656137, 0.68119860, 0.69583589, 0.71047312, 0.72511035,
-0.73974758, 0.75810421, 0.78515732, 0.81221038, 0.83926344,
-0.86631656, 0.90110368
+// Whole tone
+const float calibMap8[QUAN_RES8] = {
+0.01097947, 0.02631116, 0.04164285, 0.05697454, 0.07230624,
+0.08763793, 0.10296962, 0.11830132, 0.13306051, 0.14737549,
+0.16169049, 0.17600547, 0.19032045, 0.20463544, 0.21895042,
+0.23326540, 0.24758039, 0.26196238, 0.27635801, 0.29075363,
+0.30514926, 0.31954488, 0.33394051, 0.34833613, 0.36273175,
+0.37713069, 0.39154866, 0.40596664, 0.42038459, 0.43480256,
+0.44922054, 0.46363851, 0.47805649, 0.49247447, 0.50694764,
+0.52148110, 0.53601462, 0.55054808, 0.56508154, 0.57961506,
+0.59414852, 0.60868198, 0.62321550, 0.63785475, 0.65250880,
+0.66716284, 0.68181694, 0.69647098, 0.71112502, 0.72577912,
+0.74043316, 0.75861782, 0.78344196, 0.80826604, 0.83309019,
+0.85791427, 0.90296346
};
//-------------------------------------------------------------
@@ -227,15 +283,14 @@
// Global Variables
float gOSC_cv[8];
-float gSeq_cv1[8];
-float gSeq_cv2[8];
+float gSeq_cv1[8], gSeq_cv2[8];
float gGlide;
-volatile int gMode;
+int gMode;
// Variables for Control
-volatile float gCtrl[2];
-volatile bool gCtrlSW[4] = {false};
+float gCtrl[6];
+bool gCtrlSW[6] = {false};
//-------------------------------------------------------------
// mbed Functions
@@ -266,7 +321,29 @@
int main()
{
float pot, _pot;
- int bpm, _bpm;
+
+//Clock Up 110Mhz -------------------------------------------------------------
+ LPC_SC->PLL0CON = 0x00; /* PLL0 Disable */
+ LPC_SC->PLL0FEED = 0xAA;
+ LPC_SC->PLL0FEED = 0x55;
+
+ LPC_SC->CCLKCFG = 0x00000003; /* Select Clock Divisor = 4 */
+ LPC_SC->PLL0CFG = 0x00020037; /* configure PLL0 */
+ LPC_SC->PLL0FEED = 0xAA; /* divide by 3 then multiply by 50 */
+ LPC_SC->PLL0FEED = 0x55; /* PLL0 frequency = 400,000,000 */
+
+ LPC_SC->PLL0CON = 0x01; /* PLL0 Enable */
+ LPC_SC->PLL0FEED = 0xAA;
+ LPC_SC->PLL0FEED = 0x55;
+ while (!(LPC_SC->PLL0STAT & (1<<26)));/* Wait for PLOCK0 */
+
+ LPC_SC->PLL0CON = 0x03; /* PLL0 Enable & Connect */
+ LPC_SC->PLL0FEED = 0xAA;
+ LPC_SC->PLL0FEED = 0x55;
+ while (!(LPC_SC->PLL0STAT & ((1<<25) | (1<<24))));/* Wait for PLLC0_STAT & PLLE0_STAT */
+
+ SystemCoreClockUpdate();
+//-----------------------------------------------------------------------------
if(SetupEthNetIf() == -1)
{
@@ -290,9 +367,8 @@
InitOSCCV();
- pot = _pot = 0;
- gGlide = gMode = 0;
- bpm = _bpm = 120;
+ _pot = pot = gMode = 0;
+ gGlide = gCtrl[3] = gAIN.read();
LCD();
gLCD.locate( 0, 1 );
@@ -301,63 +377,41 @@
// loop
while(1)
{
- gGlide = pot = gAIN.read(); // Glide Value
+ pot = gAIN.read(); // Glide Value
- if(abs(pot - _pot) > 0.01f)
+ if(pot == 0)
{
+ if(abs(gCtrl[3] - _pot) > 0.01f)
+ {
+ _pot = gGlide = gCtrl[3];
+
+ gLCD.locate( 0, 1 );
+ gLCD.printf("12345678 G>>%3.2f", gGlide);
+ }
+
+ } else if (abs(pot - _pot) > 0.01f) {
+
+ gGlide = _pot = gAIN.read();
+
gLCD.locate( 0, 1 );
gLCD.printf("12345678 G>>%3.2f", gGlide);
-
- _pot = gAIN.read();
}
switch(gMode)
- {
- case MODE_SEQ:
-
- bpm = (gCtrl[0] * 300 + 10); // Set BPM (gCtrl[0])
-
- if(abs(bpm - _bpm) > 1)
- {
- UpdateGate(bpm, NRESET, GATEALL, 3, 0); // Reset (if bpm change)
- _bpm = bpm;
-
- } else if (gCtrlSW[0]) { // Stop (gCtrlSW[0])
-
- bpm = 0;
- }
+ {
+ case MODE_LIN:
- if(!gCtrlSW[2] && !gCtrlSW[3]) // Sequencer Mode1
- {
- SeqCV((UpdateGate(bpm, N16TH, GATE1, 3, 0))); // Shift Timming 16th note
- UpdateGate(bpm, N8TH, GATE2, 3, 0);
- UpdateGate(bpm, NDOT8, GATE3, 3, 0);
- UpdateGate(bpm, TRIP4, GATE4, 3, 0);
-
- break;
-
- } else if (gCtrlSW[2] && !gCtrlSW[3]) { // Sequencer Mode2 (if gCtrlSW[2] ON)
+ SetSCV();
+ break;
- SeqCV((UpdateGate(bpm, N16TH, GATE1, 3, 0))); // Do shift ch 1~5
- SeqCV((UpdateGate(bpm, N4TH, GATE2, 3, 0))); // Do shift ch 6
- SeqCV((UpdateGate(bpm, NDOT4, GATE3, 3, 0))); // Do shift ch 7
- SeqCV((UpdateGate(bpm, TRIP8, GATE4, 3, 0))); // Do shift ch 8
-
- break;
-
- } else if (gCtrlSW[3]) { // Sequencer Mode3 (if gCtrlSW[3] ON)
- // (ch6,7,8, short loop)
- SeqCV((UpdateGate(bpm, N16TH, GATE1, 3, 0))); // Do shift ch 1~5
- SeqCV((UpdateGate(bpm, N8TH, GATE2, 3, 0))); // Do shift ch 6
- SeqCV((UpdateGate(bpm, NDOT8, GATE3, 3, 0))); // Do shift ch 7
- SeqCV((UpdateGate(bpm, TRIP4, GATE4, 3, 0))); // Do shift ch 8
-
- break;
- }
+ case MODE_SEQ:
+
+ Seq();
+ break;
default:
-
- SetCV();
+
+ CalibCV();
break;
}
}
@@ -449,9 +503,437 @@
}
//-------------------------------------------------------------
+// Calibrate Mode
+
+inline void CalibCV()
+{
+ static int ch;
+ unsigned int cv;
+
+ switch(gMode)
+ {
+ case MODE_Calb:
+
+ cv = (unsigned int)((calibMap1[68] + 0.0007) * SCALING_N); // A880.0Hz
+
+ gGATES[0] = gGATES[1] = gGATES[2] = gGATES[3] = 1;
+ gLEDS[0] = gLEDS[1] = gLEDS[2] = gLEDS[3] = 1;
+
+ UpdateCV(WRITE_UPDATE_N, ch, &cv);
+ break;
+ }
+
+ CVMeter(ch, &cv);
+
+ ch++;
+ ch &= 0x07;
+}
+
+//-------------------------------------------------------------
+// Calculate CV
+
+inline void SetSCV()
+{
+ static int ch, quan, mode, mcount;
+ static float glidecv[8];
+ unsigned int cv;
+ static float qcv;
+
+ mode = (gCtrl[1] * 8);
+
+ switch(mode)
+ {
+ case Lin:
+
+ glidecv[ch] = glidecv[ch] * gGlide + gOSC_cv[ch] * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[ch];
+
+ UpdateCV(WRITE_UPDATE_N, ch, &cv);
+ break;
+
+ case Chr:
+
+ quan = (40616 / QUAN_RES1);
+ qcv = calibMap1[(unsigned int)(gOSC_cv[ch] / quan)];
+
+ glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[ch];
+
+ UpdateCV(WRITE_UPDATE_N, ch, &cv);
+ break;
+
+ case Maj:
+
+ quan = (40616 / QUAN_RES2);
+ qcv = calibMap2[(unsigned int)(gOSC_cv[ch] / quan)];
+
+ glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[ch];
+
+ UpdateCV(WRITE_UPDATE_N, ch, &cv);
+ break;
+
+ case M7:
+
+ quan = (40616 / QUAN_RES3);
+ qcv = calibMap3[(unsigned int)(gOSC_cv[ch] / quan)];
+
+ glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[ch];
+
+ UpdateCV(WRITE_UPDATE_N, ch, &cv);
+ break;
+
+ case Min7:
+
+ quan = (40616 / QUAN_RES4);
+ qcv = calibMap4[(unsigned int)(gOSC_cv[ch] / quan)];
+
+ glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[ch];
+
+ UpdateCV(WRITE_UPDATE_N, ch, &cv);
+ break;
+
+ case Dor:
+
+ quan = (40616 / QUAN_RES5);
+ qcv = calibMap5[(unsigned int)(gOSC_cv[ch] / quan)];
+
+ glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[ch];
+
+ UpdateCV(WRITE_UPDATE_N, ch, &cv);
+ break;
+
+ case Min:
+
+ quan = (40616 / QUAN_RES6);
+ qcv = calibMap6[(unsigned int)(gOSC_cv[ch] / quan)];
+
+ glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[ch];
+
+ UpdateCV(WRITE_UPDATE_N, ch, &cv);
+ break;
+
+ case S5th:
+
+ quan = (40616 / QUAN_RES7);
+ qcv = calibMap7[(unsigned int)(gOSC_cv[ch] / quan)];
+
+ glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[ch];
+
+ UpdateCV(WRITE_UPDATE_N, ch, &cv);
+ break;
+
+ case Wht:
+
+ quan = (40616 / QUAN_RES8);
+ qcv = calibMap8[(unsigned int)(gOSC_cv[ch] / quan)];
+
+ glidecv[ch] = glidecv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[ch];
+
+ UpdateCV(WRITE_UPDATE_N, ch, &cv);
+ break;
+ }
+
+ if(mcount % 16 == 0)
+ {
+ CVMeter(ch, &cv);
+ }
+
+ ch++;
+
+ if(ch &= 0x07)
+ {
+ mcount ++;
+ mcount &= 0x3F;
+ }
+
+}
+
+//-------------------------------------------------------------
+// Sequence & Shift Out CV
+
+inline void SeqCV(int shift)
+{
+ int i, j;
+ static int ch, quan, mode;
+ static float glidecv[8], shiftcv[8];
+ unsigned int cv;
+ static float qcv;
+
+ mode = (gCtrl[1] * 8); // Sequencer Quantize Mode (gCtrl[1])
+
+ switch(mode)
+ {
+ case Lin:
+
+ if(ch < 8)
+ {
+ glidecv[0] = glidecv[0] * gGlide + gSeq_cv1[ch] * (1.0f - gGlide);
+
+ } else {
+
+ glidecv[0] = glidecv[0] * gGlide + gSeq_cv2[ch-8] * (1.0f - gGlide);
+ }
+
+ cv = (unsigned int)glidecv[0];
+
+ UpdateCV(WRITE_UPDATE_N, 0, &cv);
+ break;
+
+ case Chr:
+
+ quan = 40616 / QUAN_RES1;
+
+ if(ch < 8)
+ {
+ qcv = calibMap1[(unsigned int)(gSeq_cv1[ch] / quan)];
+
+ } else {
+
+ qcv = calibMap1[(unsigned int)(gSeq_cv2[ch-8] / quan)];
+ }
+
+ glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[0];
+
+ UpdateCV(WRITE_UPDATE_N, 0, &cv);
+ break;
+
+ case Maj:
+
+ quan = 40616 / QUAN_RES2;
+
+ if(ch < 8)
+ {
+ qcv = calibMap2[(unsigned int)(gSeq_cv1[ch] / quan)];
+
+ } else {
+
+ qcv = calibMap2[(unsigned int)(gSeq_cv2[ch-8] / quan)];
+ }
+
+ glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[0];
+
+ UpdateCV(WRITE_UPDATE_N, 0, &cv);
+ break;
+
+ case M7:
+
+ quan = 40616 / QUAN_RES3;
+
+ if(ch < 8)
+ {
+ qcv = calibMap3[(unsigned int)(gSeq_cv1[ch] / quan)];
+
+ } else {
+
+ qcv = calibMap3[(unsigned int)(gSeq_cv2[ch-8] / quan)];
+ }
+
+ glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[0];
+
+ UpdateCV(WRITE_UPDATE_N, 0, &cv);
+ break;
+
+ case Min7:
+
+ quan = 40616 / QUAN_RES4;
+
+ if(ch < 8)
+ {
+ qcv = calibMap4[(unsigned int)(gSeq_cv1[ch] / quan)];
+
+ } else {
+
+ qcv = calibMap4[(unsigned int)(gSeq_cv2[ch-8] / quan)];
+ }
+
+ glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[0];
+
+ UpdateCV(WRITE_UPDATE_N, 0, &cv);
+ break;
+
+ case Dor:
+
+ quan = 40616 / QUAN_RES5;
+
+ if(ch < 8)
+ {
+ qcv = calibMap5[(unsigned int)(gSeq_cv1[ch] / quan)];
+
+ } else {
+
+ qcv = calibMap5[(unsigned int)(gSeq_cv2[ch-8] / quan)];
+ }
+
+ glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[0];
+
+ UpdateCV(WRITE_UPDATE_N, 0, &cv);
+ break;
+
+ case Min:
+
+ quan = 40616 / QUAN_RES6;
+
+ if(ch < 8)
+ {
+ qcv = calibMap6[(unsigned int)(gSeq_cv1[ch] / quan)];
+
+ } else {
+
+ qcv = calibMap6[(unsigned int)(gSeq_cv2[ch-8] / quan)];
+ }
+
+ glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[0];
+
+ UpdateCV(WRITE_UPDATE_N, 0, &cv);
+ break;
+
+ case S5th:
+
+ quan = 40616 / QUAN_RES7;
+
+ if(ch < 8)
+ {
+ qcv = calibMap7[(unsigned int)(gSeq_cv1[ch] / quan)];
+
+ } else {
+
+ qcv = calibMap7[(unsigned int)(gSeq_cv2[ch-8] / quan)];
+ }
+
+ glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[0];
+
+ UpdateCV(WRITE_UPDATE_N, 0, &cv);
+ break;
+
+ case Wht:
+
+ quan = 40616 / QUAN_RES8;
+
+ if(ch < 8)
+ {
+ qcv = calibMap8[(unsigned int)(gSeq_cv1[ch] / quan)];
+
+ } else {
+
+ qcv = calibMap8[(unsigned int)(gSeq_cv2[ch-8] / quan)];
+ }
+
+ glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[0];
+
+ UpdateCV(WRITE_UPDATE_N, 0, &cv);
+ break;
+ }
+
+ for(i = 1; i < 8; ++i)
+ {
+ glidecv[i] = glidecv[i] * gGlide + shiftcv[i] * (1.0f - gGlide);
+ cv = (unsigned int)glidecv[i];
+
+ UpdateCV(WRITE_UPDATE_N, i, &cv);
+ }
+
+ if(shift == 1) // GATE1
+ {
+ for(j = 1; j < 8; ++j) // Shift ch2~8
+ {
+ shiftcv[j] = glidecv[j-1];
+ }
+
+ ch++;
+ ch &= 0x0F;
+ }
+
+
+ if(ch < 8)
+ {
+ CVMeter(ch, &cv);
+
+ } else {
+
+ CVMeter((ch-8), &cv);
+ }
+
+}
+
+//-------------------------------------------------------------
+// Sequencer Mode
+
+inline void Seq()
+{
+ static int bpm, _bpm;
+
+ bpm = (gCtrl[0] * 300 + 10); // Set BPM (gCtrl[0])
+
+ if(abs(bpm - _bpm) > 1)
+ {
+ UpdateGate(bpm, NRESET, GATEALL, 3, false); // Reset (if bpm change)
+ _bpm = bpm;
+
+ } else if (gCtrlSW[0]) { // Stop (gCtrlSW[0])
+
+ bpm = 0;
+ }
+
+ if(!gCtrlSW[2] && !gCtrlSW[3]) // Sequencer Mode1
+ {
+ SeqCV((UpdateGate(bpm, N16TH, GATE1, 3, false))); // Shift Timming 16th note
+ UpdateGate(bpm, N8TH, GATE2, 3, 0);
+ UpdateGate(bpm, NDOT8, GATE3, 3, 0);
+ UpdateGate(bpm, TRIP4, GATE4, 3, 0);
+ }
+
+}
+
+//-------------------------------------------------------------
+// Check SW
+
+void CheckModeSW()
+{
+ wait(0.05);
+
+ if(gMode < MODE_NUM - 1)
+ {
+ gMode++;
+
+ } else {
+
+ gMode = 0;
+ }
+
+ gCLOCKOUT = gGATES[0] = gGATES[1] = gGATES[2] = gGATES[3] = 0;
+ gLEDS[0] = gLEDS[1] = gLEDS[2] = gLEDS[3] = 0;
+
+ if(gMode == MODE_SEQ)
+ {
+ gTimer.start(); // Sequencer Timer Start
+
+ } else {
+
+ gTimer.stop(); // Sequencer Timer Stop
+ }
+
+ LCD();
+}
+
+//-------------------------------------------------------------
// GateOutSequence beat(Note values) length(Gate time) invert(invert Gate)
-int UpdateGate(int bpm, int beat, int ch, int length, bool invert)
+inline int UpdateGate(int bpm, int beat, int ch, int length, bool invert)
{
int i;
static int gatetime[4], oldgatetime[4];
@@ -460,9 +942,9 @@
int time = gTimer.read_us();
bar = (60.0f / bpm) * 4000000;
- sync24 = (bar / 4) / 24; // sync24 not tested
+ sync24 = (bar / 4) / 24; // sync24 not tested
- switch(beat) // Calculate Note values
+ switch(beat) // Calculate Note values
{
case NDOT2:
@@ -489,31 +971,6 @@
gatetime[ch] = (bar / 64) * 3;
break;
- case TRIP2:
-
- gatetime[ch] = bar / 3;
- break;
-
- case TRIP4:
-
- gatetime[ch] = (bar / 2) / 3;
- break;
-
- case TRIP8:
-
- gatetime[ch] = (bar / 4) / 3;
- break;
-
- case TRIP16:
-
- gatetime[ch] = (bar / 8) / 3;
- break;
-
- case TRIP32:
-
- gatetime[ch] = (bar / 16) / 3;
- break;
-
case NRESET:
for(i = 0; i < GATEALL; ++i) // Reset
@@ -575,426 +1032,51 @@
}
//-------------------------------------------------------------
-// Calculate CV
-
-inline void SetCV()
-{
- static int ch, quan;
- static float glidecv[8], oldcv[8];
- unsigned int cv[8];
- float qcv;
+// SyncOut Sequence beat(Note values) invert(invert Gate)
- switch(gMode)
- {
- case MODE_LIN:
-
- glidecv[ch] = oldcv[ch] * gGlide + gOSC_cv[ch] * (1.0f - gGlide);
- oldcv[ch] = glidecv[ch];
- cv[ch] = (unsigned int)glidecv[ch];
-
- UpdateCV(WRITE_UPDATE_N, ch, &cv[ch]);
- break;
-
- case MODE_QChr:
-
- quan = 40616 / QUAN_RES1;
- qcv = calibMap1[(unsigned int)(gOSC_cv[ch] / quan)];
-
- glidecv[ch] = oldcv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
- oldcv[ch] = glidecv[ch];
- cv[ch] = (unsigned int)glidecv[ch];
-
- UpdateCV(WRITE_UPDATE_N, ch, &cv[ch]);
- break;
-
- case MODE_QMaj:
-
- quan = 40616 / QUAN_RES2;
- qcv = calibMap2[(unsigned int)(gOSC_cv[ch] / quan)];
-
- glidecv[ch] = oldcv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
- oldcv[ch] = glidecv[ch];
- cv[ch] = (unsigned int)glidecv[ch];
-
- UpdateCV(WRITE_UPDATE_N, ch, &cv[ch]);
- break;
-
- case MODE_QDor:
-
- quan = 40616 / QUAN_RES3;
- qcv = calibMap3[(unsigned int)(gOSC_cv[ch] / quan)];
-
- glidecv[ch] = oldcv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
- oldcv[ch] = glidecv[ch];
- cv[ch] = (unsigned int)glidecv[ch];
-
- UpdateCV(WRITE_UPDATE_N, ch, &cv[ch]);
- break;
-
- case MODE_Q5th:
-
- quan = 40616 / QUAN_RES4;
- qcv = calibMap4[(unsigned int)(gOSC_cv[ch] / quan)];
-
- glidecv[ch] = oldcv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
- oldcv[ch] = glidecv[ch];
- cv[ch] = (unsigned int)glidecv[ch];
-
- UpdateCV(WRITE_UPDATE_N, ch, &cv[ch]);
- break;
-
- case MODE_QWht:
-
- quan = 40616 / QUAN_RES5;
- qcv = calibMap5[(unsigned int)(gOSC_cv[ch] / quan)];
-
- glidecv[ch] = oldcv[ch] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
- oldcv[ch] = glidecv[ch];
- cv[ch] = (unsigned int)glidecv[ch];
-
- UpdateCV(WRITE_UPDATE_N, ch, &cv[ch]);
- break;
-
- case MODE_Calb:
-
- cv[ch] = 19212; // A880.0Hz
-
- gGATES[0] = gGATES[1] = gGATES[2] = gGATES[3] = 1;
- gLEDS[0] = gLEDS[1] = gLEDS[2] = gLEDS[3] = 1;
-
- UpdateCV(WRITE_UPDATE_N, ch, &cv[ch]);
- break;
- }
-
- CVMeter(ch, &cv[ch]);
-
- ch++;
- ch &= 0x07;
-}
-
-//-------------------------------------------------------------
-// Sequence & Shift Out CV
-
-void SeqCV(int shift)
+inline void UpdateSync(int bpm, int beat, bool invert)
{
- int i, j, k;
- static int ch, quan, SeqMode;
- static int cnt1, cnt2, cnt3;
- static int cntloop1, cntloop2, cntloop3;
- static float glidecv[8], shiftcv[8];
- static float buffercv[9], loopcv[3];
- unsigned int cv[8];
- float qcv;
-
- SeqMode = gCtrl[1] * (MODE_NUM - 3); // Sequencer Quantize Mode (gCtrl[1])
+ static int bar, synctime, oldsynctime;
+
+ int time = gTimer.read_us();
- switch(SeqMode)
- {
- case MODE_LIN:
-
- if(ch < 8)
- {
- glidecv[0] = glidecv[0] * gGlide + gSeq_cv1[ch] * (1.0f - gGlide);
-
- } else {
-
- glidecv[0] = glidecv[0] * gGlide + gSeq_cv2[ch-8] * (1.0f - gGlide);
- }
-
- cv[0] = (unsigned int)glidecv[0];
-
- UpdateCV(WRITE_UPDATE_N, 0, &cv[0]);
- break;
-
- case MODE_QChr:
-
- quan = 40616 / QUAN_RES1;
-
- if(ch < 8)
- {
- qcv = calibMap1[(unsigned int)(gSeq_cv1[ch] / quan)];
-
- } else {
-
- qcv = calibMap1[(unsigned int)(gSeq_cv2[ch-8] / quan)];
- }
-
- glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
- cv[0] = (unsigned int)glidecv[0];
-
- UpdateCV(WRITE_UPDATE_N, 0, &cv[0]);
- break;
-
- case MODE_QMaj:
-
- quan = 40616 / QUAN_RES2;
-
- if(ch < 8)
- {
- qcv = calibMap2[(unsigned int)(gSeq_cv1[ch] / quan)];
-
- } else {
-
- qcv = calibMap2[(unsigned int)(gSeq_cv2[ch-8] / quan)];
- }
-
- glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
- cv[0] = (unsigned int)glidecv[0];
-
- UpdateCV(WRITE_UPDATE_N, 0, &cv[0]);
- break;
-
- case MODE_QDor:
-
- quan = 40616 / QUAN_RES3;
-
- if(ch < 8)
- {
- qcv = calibMap3[(unsigned int)(gSeq_cv1[ch] / quan)];
-
- } else {
-
- qcv = calibMap3[(unsigned int)(gSeq_cv2[ch-8] / quan)];
- }
-
- glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
- cv[0] = (unsigned int)glidecv[0];
-
- UpdateCV(WRITE_UPDATE_N, 0, &cv[0]);
- break;
-
- case MODE_Q5th:
-
- quan = 40616 / QUAN_RES4;
-
- if(ch < 8)
- {
- qcv = calibMap4[(unsigned int)(gSeq_cv1[ch] / quan)];
-
- } else {
-
- qcv = calibMap4[(unsigned int)(gSeq_cv2[ch-8] / quan)];
- }
-
- glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
- cv[0] = (unsigned int)glidecv[0];
-
- UpdateCV(WRITE_UPDATE_N, 0, &cv[0]);
- break;
-
- case MODE_QWht:
-
- quan = 40616 / QUAN_RES5;
-
- if(ch < 8)
- {
- qcv = calibMap5[(unsigned int)(gSeq_cv1[ch] / quan)];
-
- } else {
-
- qcv = calibMap5[(unsigned int)(gSeq_cv2[ch-8] / quan)];
- }
-
- glidecv[0] = glidecv[0] * gGlide + (qcv * SCALING_N) * (1.0f - gGlide);
- cv[0] = (unsigned int)glidecv[0];
-
- UpdateCV(WRITE_UPDATE_N, 0, &cv[0]);
- break;
- }
-
- if(!gCtrlSW[2] && !gCtrlSW[3]) // Sequencer Mode1
- {
- for(i = 1; i < 8; ++i)
- {
- glidecv[i] = glidecv[i] * gGlide + shiftcv[i] * (1.0f - gGlide);
- cv[i] = (unsigned int)glidecv[i];
-
- UpdateCV(WRITE_UPDATE_N, i, &cv[i]);
- }
-
- if(shift == 1) // GATE1
- {
- for(j = 1; j < 8; ++j) // Shift ch2~8
- {
- shiftcv[j] = glidecv[j-1];
- }
-
- ch++;
- ch &= 0x0F;
- }
-
- cnt1 = cnt2 = cnt3 = 0;
-
- } else if (gCtrlSW[2] && !gCtrlSW[3]) { // Sequencer Mode2
-
- for(i = 1; i < 8; ++i)
- {
- glidecv[i] = glidecv[i] * gGlide + shiftcv[i] * (1.0f - gGlide);
- cv[i] = (unsigned int)glidecv[i];
-
- UpdateCV(WRITE_UPDATE_N, i, &cv[i]);
- }
-
- if(shift == 1) // GATE1
- {
- for(j = 1; j < 5; ++j)
- {
- shiftcv[j] = glidecv[j-1]; // Shift ch2~5
- }
-
- ch++;
- ch &= 0x0F;
-
- } else if (shift == 2) { // GATE2
-
- shiftcv[5] = glidecv[1]; // Shift ch6
-
- } else if (shift == 3) { // GATE3
-
- shiftcv[6] = glidecv[2]; // Shift ch7
-
- } else if (shift == 4) { // GATE4
-
- shiftcv[7] = glidecv[3]; // Shift ch8
- }
-
- cnt1 = cnt2 = cnt3 = 0;
-
- } else if (gCtrlSW[3]) { // Sequencer Mode3
-
- for(i = 1; i < 5; ++i)
- {
- glidecv[i] = glidecv[i] * gGlide + shiftcv[i] * (1.0f - gGlide);
- cv[i] = (unsigned int)glidecv[i];
-
- UpdateCV(WRITE_UPDATE_N, i, &cv[i]);
- }
-
- for(j = 5; j < 8; ++j)
- {
- glidecv[j] = glidecv[j] * gGlide + loopcv[j - 5] * (1.0f - gGlide);
- cv[j] = (unsigned int)glidecv[j];
-
- UpdateCV(WRITE_UPDATE_N, j, &cv[j]);
- }
-
- if(shift == 1) // GATE1
- {
- for(k = 1; k < 8; ++k)
- {
- shiftcv[k] = glidecv[k-1]; // Shift ch2~5
- }
-
- ch++;
- ch &= 0x0F;
-
- } else if (shift == 2) { // GATE2
-
- if(cnt1 < 4)
- {
- loopcv[0] = buffercv[cnt1] = shiftcv[4];
-
- cnt1++;
-
- } else if (cnt1 >= 4) {
-
- loopcv[0] = buffercv[cntloop1];
-
- cntloop1++;
- cntloop1 &= 0x03;
- }
-
- } else if (shift == 3) { // GATE3
-
- if(cnt2 < 3)
- {
- loopcv[1] = buffercv[(cnt2 + 4)] = shiftcv[5];
-
- cnt2++;
-
- } else if (cnt2 >= 3) {
-
- loopcv[1] = buffercv[(cntloop2 + 4)];
-
- cntloop2++;
- cntloop2 &= 0x03;
- }
-
- } else if (shift == 4) { // GATE4
-
- if(cnt3 < 2)
- {
- loopcv[2] = buffercv[(cnt3 + 7)] = shiftcv[6];
-
- cnt3++;
-
- } else if (cnt3 >= 2) {
-
- loopcv[2] = buffercv[(cntloop3 + 7)];
-
- cntloop3++;
- cntloop3 &= 0x01;
- }
- }
-
- if(gCtrlSW[1]) // Update loop buffer (if gCtrlSW[1] ON)
- {
- cnt1 = cnt2 = cnt3 = 0;
- }
- }
-
- if(ch < 8)
- {
- CVMeter(ch, &cv[0]);
-
- } else {
-
- CVMeter((ch-8), &cv[0]);
- }
-}
+ bar = (60.0f / bpm) * 4000000;
-//-------------------------------------------------------------
-// Check SW
-
-void CheckModeSW()
-{
- wait(0.05);
+ synctime = bar / beat;
- if(gMode < MODE_NUM - 1)
- {
- gMode++;
-
- } else {
-
- gMode = 0;
+ if(beat == NRESET)
+ {
+ bar = synctime = oldsynctime = gCLOCKOUT = 0;
}
- gCLOCKOUT = gGATES[0] = gGATES[1] = gGATES[2] = gGATES[3] = 0;
- gLEDS[0] = gLEDS[1] = gLEDS[2] = gLEDS[3] = 0;
-
- if(gMode == MODE_SEQ)
+ if((time > oldsynctime + synctime) && !invert)
{
- gTimer.start(); // Sequencer Timer Start
+ oldsynctime = time;
+ gCLOCKOUT = 1;
+
+ } else if ((time > synctime - (synctime / 2)) && !invert) {
+
+ gCLOCKOUT = 0;
- } else {
-
- gTimer.stop(); // Sequencer Timer Stop
+ } else if((time > oldsynctime + synctime) && invert) {
+
+ oldsynctime = time;
+ gCLOCKOUT = 0;
+
+ } else if ((time > synctime - (synctime / 2)) && invert) {
+
+ gCLOCKOUT = 1;
}
- LCD();
}
//-------------------------------------------------------------
// CV meter
inline void CVMeter(int ch, const unsigned int *level)
-{
- int cvmeter;
-
- cvmeter = *level / (SCALING_N / 7.9f);
-
+{
gLCD.locate ( ch, 0 );
- gLCD.putc(cvmeter); // put custom char
+ gLCD.putc(*level * 0.000205729); // put custom char
}
//-------------------------------------------------------------
@@ -1004,44 +1086,19 @@
{
switch(gMode)
{
+ case MODE_Calb:
+ gLCD.locate( 9, 0 );
+ gLCD.printf("Calibr ");
+ break;
+
case MODE_LIN:
gLCD.locate( 9, 0 );
gLCD.printf("OSC-CV ");
break;
-
- case MODE_QChr:
- gLCD.locate( 9, 0 );
- gLCD.printf("QUAN_C ");
- break;
-
- case MODE_QMaj:
- gLCD.locate( 9, 0 );
- gLCD.printf("QUAN_M ");
- break;
-
- case MODE_QDor:
- gLCD.locate( 9, 0 );
- gLCD.printf("QUAN_D ");
- break;
-
- case MODE_Q5th:
- gLCD.locate( 9, 0 );
- gLCD.printf("QUAN_5 ");
- break;
-
- case MODE_QWht:
- gLCD.locate( 9, 0 );
- gLCD.printf("QUAN_W ");
- break;
-
+
case MODE_SEQ:
gLCD.locate( 9, 0 );
- gLCD.printf("ASRSEQ ");
- break;
-
- case MODE_Calb:
- gLCD.locate( 9, 0 );
- gLCD.printf("Calibr ");
+ gLCD.printf("SHIFTCV");
break;
}
}
@@ -1096,6 +1153,24 @@
}
//-------------------------------------------------------------
+// Fast strlen function http://www.strchr.com/optimized_strlen_function
+
+size_t strlength(const char *s)
+{
+ size_t len = 0;
+
+ for(;;)
+ {
+ unsigned x = *(unsigned*)s;
+ if((x & 0xFF) == 0) return len;
+ if((x & 0xFF00) == 0) return len + 1;
+ if((x & 0xFF0000) == 0) return len + 2;
+ if((x & 0xFF000000) == 0) return len + 3;
+ s += 4, len += 4;
+ }
+}
+
+//-------------------------------------------------------------
// Handller receive UDP Packet
inline void onUDPSocketEvent(UDPSocketEvent e)
@@ -1103,10 +1178,9 @@
union OSCarg msg[10];
char buf[768] = {0};
int num, len;
- volatile int recvlen;
- volatile unsigned int absv;
- volatile int messagepos = 0;
- volatile bool bundleflag = false;
+ int recvlen;
+ int messagepos = 0;
+ bool bundleflag = false;
Host host;
@@ -1152,37 +1226,35 @@
num = -1;
}
- absv = msg[2].f + 0; //convert -0 to 0
-
// address pattern SYNC & GATE (Type Tag int, float)
if(!strncmp(msg[0].address+(len-1)-4, "sync", 4))
{
- if(absv >= 1 || msg[2].i >= 1) gCLOCKOUT = 1;
- else gCLOCKOUT = 0;
+ if(msg[2].i != 0) gCLOCKOUT = 1;
+ else gCLOCKOUT = 0;
continue;
} else if (!strncmp(msg[0].address+(len-1)-4, "gate", 4) && (num != -1)) {
- if(num > 4) continue;
- if(absv >= 1 || msg[2].i >= 1) gLEDS[num] = gGATES[num] = 1;
- else gLEDS[num] = gGATES[num] = 0;
+ if(num > 3) continue;
+ if(msg[2].i != 0) gLEDS[num] = gGATES[num] = 1;
+ else gLEDS[num] = gGATES[num] = 0;
continue;
// (touchOSC Control push, toggle)
} else if (!strncmp(msg[0].address+(len-1)-4, "push", 4) && (num != -1)) {
if(num > 4) continue;
- if(absv >= 1 || msg[2].i >= 1) gLEDS[num] = gGATES[num] = 1;
- else gLEDS[num] = gGATES[num] = 0;
+ if(msg[2].i != 0) gLEDS[num] = gGATES[num] = 1;
+ else gLEDS[num] = gGATES[num] = 0;
continue;
} else if (!strncmp(msg[0].address+(len-1)-6, "toggle", 6) && (num != -1)) {
if(num > 4) continue;
- if(absv >= 1 || msg[2].i >= 1) gLEDS[num] = gGATES[num] = 1;
- else gLEDS[num] = gGATES[num] = 0;
+ if(msg[2].i != 0) gLEDS[num] = gGATES[num] = 1;
+ else gLEDS[num] = gGATES[num] = 0;
continue;
} else if (!strncmp(msg[0].address,"/1/multipush",12) && (num != -1)) {
if(num > 4) continue;
- if(absv >= 1 || msg[2].i >= 1) gLEDS[num] = gGATES[num] = 1;
- else gLEDS[num] = gGATES[num] = 0;
+ if(msg[2].i != 0) gLEDS[num] = gGATES[num] = 1;
+ else gLEDS[num] = gGATES[num] = 0;
continue;
// address pattern CV (Type Tag float)
} else if(!strncmp(msg[0].address+(len-1)-2, "cv", 2) && (num != -1)) {
@@ -1228,13 +1300,13 @@
continue;
// address pattern for control
} else if (!strncmp(msg[0].address+(len-1)-6, "ctrlsw", 6) && (num != -1)) {
- if(num > 4) continue;
- if(absv >= 1 || msg[2].i >= 1) gCtrlSW[num] = true;
- else gCtrlSW[num] = false;
+ if(num > 5) continue;
+ if(msg[2].i != 0) gCtrlSW[num] = true;
+ else gCtrlSW[num] = false;
continue;
} else if (!strncmp(msg[0].address+(len-1)-4, "ctrl", 4) && (num != -1)) {
- if(num > 3) continue;
+ if(num > 5) continue;
if(msg[1].typeTag[1] == 'f') gCtrl[num] = msg[2].f;
continue;
}
--- a/mbed-rpc.lib Sun Mar 09 04:52:52 2014 +0000 +++ b/mbed-rpc.lib Thu Oct 16 14:14:25 2014 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/teams/mbed-official/code/mbed-rpc/#4490a0d9cb2a +http://mbed.org/teams/mbed-official/code/mbed-rpc/#2a26fd6a2b36
--- a/mbed.bld Sun Mar 09 04:52:52 2014 +0000 +++ b/mbed.bld Thu Oct 16 14:14:25 2014 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/mbed_official/code/mbed/builds/8e73be2a2ac1 \ No newline at end of file +http://mbed.org/users/mbed_official/code/mbed/builds/552587b429a1 \ No newline at end of file