This is a part of the Kinetiszer project.

Dependencies:   inc

Dependents:   kinetisizer

Committer:
Clemo
Date:
Tue Oct 28 20:09:12 2014 +0000
Revision:
1:8ae4ab73ca6a
Parent:
0:cb80470434eb
First publication (untested)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Clemo 0:cb80470434eb 1 #include "atmegatron.h"
Clemo 0:cb80470434eb 2 #include "lcd.h"
Clemo 0:cb80470434eb 3
Clemo 0:cb80470434eb 4 #define LOCKOUT 3000 //time between ctrl stop moving and locking it out
Clemo 0:cb80470434eb 5 #define HOLDLENGTH 2000 //time required to hold function button for hold functions (e.g. patch save)
Clemo 0:cb80470434eb 6
Clemo 0:cb80470434eb 7 //const uint16_t bg_select_store[16] = {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768}; //values used to light single led of led array
Clemo 0:cb80470434eb 8 //const uint16_t bg_fill_store[16] = {1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; //values used to fill leds between 0-x of led array
Clemo 0:cb80470434eb 9 const uint16_t envADR_store[16] = {0,8,23,48,88,151,245,381,574,845,1217,1722,2399,3297,4476,6013}; //times used for attack, decay and release of envelopes
Clemo 0:cb80470434eb 10 const uchar envS_store[16] = {0,17,34,51,68,85,102,119,136,153,170,187,204,221,238,255}; //levels used for sustain of envelope1 (unipolar for amplitude)
Clemo 0:cb80470434eb 11 const signed char fenvS_store[16] = {0,8,17,25,34,42,51,59,68,76,85,93,102,110,119,127}; //levels used for sustain of envelope2 (bipolar for filter)
Clemo 0:cb80470434eb 12 const uint16_t speed_store[16] = {32767,16383,8191,6143,5460,4095,3071,2730,2047,1535,1023,767,511,383,255,127}; //values used for speeds of LFO and arpeggiator
Clemo 0:cb80470434eb 13 const uint16_t porta_store[16] = {0,5,14,27,46,77,123,195,306,477,740,1145,1768,2728,4207,6484}; //values for portamento speeds
Clemo 0:cb80470434eb 14
Clemo 0:cb80470434eb 15 //lets and gets (not all letable or getable at pres)
Clemo 0:cb80470434eb 16 byte hard_func = 255; //current selected function. 255 to allow reset in Init_Hardware
Clemo 0:cb80470434eb 17 byte hard_val[16]; //current select value for each function.
Clemo 0:cb80470434eb 18 byte hard_ctrl[2][6]; //current value for each digital control [bank][control]
Clemo 0:cb80470434eb 19 boolean hard_shift[16]; //current value of shift for each function (red/green mode)
Clemo 0:cb80470434eb 20
Clemo 0:cb80470434eb 21 //long lastval; //last value of value rotary encoder
Clemo 0:cb80470434eb 22 byte maxval = 15; //maximum value that is selectable on the value dial (normally 15 apart from user wave mode)
Clemo 0:cb80470434eb 23 boolean testbutdown = false; //test button (value encoder button)
Clemo 0:cb80470434eb 24 byte hard_curctrlbank = 0; //current value of ctrl bank (red/green mode of controls)
Clemo 0:cb80470434eb 25 byte hard_curctrl = 1; //current control being read. Only 1 control is read in each pass. read order: 0,1,0,2,0,3,0,4 etc, so cutoff is smooth as poss
Clemo 0:cb80470434eb 26 byte hard_nextctrl = 1; //sets next control to be read after cutoff.
Clemo 0:cb80470434eb 27 byte lastfuncbut = 0; //last value of function button input
Clemo 0:cb80470434eb 28 byte lastvalbut = 0; //last value of value button input
Clemo 0:cb80470434eb 29 byte lastbank = 0; //last value of ctrl bank button input
Clemo 0:cb80470434eb 30 byte lastctrl[6]; //last value read of each ctrl
Clemo 0:cb80470434eb 31 boolean movingctrl[6]; //is a ctrl moving (i.e. is user turning it)
Clemo 0:cb80470434eb 32 unsigned long stopmovingtick[6]; //tick when ctrl will lock out (to stop jitter) assuming user has stopped moving it
Clemo 0:cb80470434eb 33 unsigned long butstarttick = 0; //tick when button was pressed
Clemo 0:cb80470434eb 34 boolean finishedhold = false; //used by function button for function that require 2 sec hold (e.g. patch save)
Clemo 0:cb80470434eb 35 boolean MIDIchannelmode = false;
Clemo 0:cb80470434eb 36
Clemo 0:cb80470434eb 37
Clemo 0:cb80470434eb 38 void Hardware_Adjust_Value(byte func, byte val);
Clemo 0:cb80470434eb 39 void Hardware_Adjust_Shift(byte func, boolean val);
Clemo 0:cb80470434eb 40 boolean IsFuncFill(byte func);
Clemo 0:cb80470434eb 41 boolean IsShiftHold(byte func);
Clemo 0:cb80470434eb 42 void Hardware_Let_CtrlBank(byte value);
Clemo 0:cb80470434eb 43 void Hardware_Refresh_FuncBG(void);
Clemo 0:cb80470434eb 44 void Hardware_Refresh_ValBG(void);
Clemo 0:cb80470434eb 45 int Hardware_Ctrl_Update(byte shift, byte index, int value);
Clemo 0:cb80470434eb 46
Clemo 0:cb80470434eb 47
Clemo 0:cb80470434eb 48 // Here you can remap the rotary encoders in case you don't like
Clemo 0:cb80470434eb 49 // the way they are set up.
Clemo 0:cb80470434eb 50 //#define LEFT_HANDED
Clemo 0:cb80470434eb 51 // 0 <-> 1
Clemo 0:cb80470434eb 52 // 2 <-> 7
Clemo 0:cb80470434eb 53 // 3 <-> 6
Clemo 0:cb80470434eb 54 // 4 <-> 5
Clemo 0:cb80470434eb 55 uint8_t encoder_to_ctrl[8] =
Clemo 0:cb80470434eb 56 {
Clemo 0:cb80470434eb 57 #if defined LEFT_HANDED
Clemo 0:cb80470434eb 58 0, // function encoder
Clemo 0:cb80470434eb 59 1, // value encoder
Clemo 0:cb80470434eb 60 2, // filter cut-off
Clemo 0:cb80470434eb 61 7, // filter resonance
Clemo 0:cb80470434eb 62 3, // filter envelope (red) / pitch envelope (green)
Clemo 0:cb80470434eb 63 4, // filter lfo (red) / pitch lfo (green)
Clemo 0:cb80470434eb 64 5, // amplitude lfo (red) / pulse width lfo (green)
Clemo 0:cb80470434eb 65 6 // distortion (red) / phase lfo (green)
Clemo 0:cb80470434eb 66 #else
Clemo 0:cb80470434eb 67 0, // function encoder
Clemo 0:cb80470434eb 68 1, // value encoder
Clemo 0:cb80470434eb 69 7, // filter cut-off
Clemo 0:cb80470434eb 70 2, // filter resonance
Clemo 0:cb80470434eb 71 6, // filter envelope (red) / pitch envelope (green)
Clemo 0:cb80470434eb 72 5, // filter lfo (red) / pitch lfo (green)
Clemo 0:cb80470434eb 73 4, // amplitude lfo (red) / pulse width lfo (green)
Clemo 0:cb80470434eb 74 3 // distortion (red) / phase lfo (green)
Clemo 0:cb80470434eb 75 #endif // LEFT_HANDED
Clemo 0:cb80470434eb 76 };
Clemo 0:cb80470434eb 77
Clemo 0:cb80470434eb 78 #define ENCODER_FUNCTION encoder_to_ctrl[0]
Clemo 0:cb80470434eb 79 #define ENCODER_VALUE encoder_to_ctrl[1]
Clemo 0:cb80470434eb 80
Clemo 0:cb80470434eb 81
Clemo 0:cb80470434eb 82 //Hardware setup, only run once
Clemo 0:cb80470434eb 83 void Init_Hardware(void)
Clemo 0:cb80470434eb 84 {
Clemo 0:cb80470434eb 85 byte i;
Clemo 0:cb80470434eb 86 byte newctrl;
Clemo 0:cb80470434eb 87 //int ctrlread;
Clemo 0:cb80470434eb 88
Clemo 0:cb80470434eb 89 memset(hard_shift,0,sizeof(hard_shift)); // Set everything to RED.
Clemo 0:cb80470434eb 90
Clemo 0:cb80470434eb 91 Hardware_Let_Function(0); //initialise function dial to 0
Clemo 0:cb80470434eb 92
Clemo 0:cb80470434eb 93 //Hardware_LED_SetState(3,HIGH); //initialise value encoder LED to red
Clemo 0:cb80470434eb 94 //Hardware_LED_SetState(2,LOW);
Clemo 0:cb80470434eb 95 Hardware_BicolorLED_SetState(2,2,1);
Clemo 0:cb80470434eb 96
Clemo 0:cb80470434eb 97 Hardware_Refresh_ValBG(); //refresh value dial LED array
Clemo 0:cb80470434eb 98
Clemo 0:cb80470434eb 99 Hardware_Let_CtrlBank(0); //initialise ctrl bank to 0 (red mode)
Clemo 0:cb80470434eb 100
Clemo 0:cb80470434eb 101 //READ FUNCTION ENCODER BUTTON to see if setting MIDI channel number
Clemo 0:cb80470434eb 102 newctrl = keyboard_get_pushbutton(ENCODER_FUNCTION,false);
Clemo 0:cb80470434eb 103 // If function button down, then MIDI channel mode.
Clemo 0:cb80470434eb 104 if (newctrl>0)
Clemo 0:cb80470434eb 105 {
Clemo 0:cb80470434eb 106 MIDIchannelmode = true;
Clemo 0:cb80470434eb 107 //initialise value encoder LED to yellow (woo)
Clemo 0:cb80470434eb 108 //Hardware_LED_SetState(3,HIGH);
Clemo 0:cb80470434eb 109 //Hardware_LED_SetState(2,HIGH);
Clemo 0:cb80470434eb 110 Hardware_BicolorLED_SetState(2,1,1);
Clemo 0:cb80470434eb 111 Hardware_Let_Value(FUNC_MEM,Memory_Channel_Read());
Clemo 0:cb80470434eb 112 }
Clemo 0:cb80470434eb 113
Clemo 0:cb80470434eb 114 for (i=0; i<=5; i++)
Clemo 0:cb80470434eb 115 {
Clemo 0:cb80470434eb 116 //ctrlread = analogRead(i); //initialise lastctrl array. use analogread, coz speed not important
Clemo 0:cb80470434eb 117 //newctrl = ctrlread >> 2; //all ctrls are stored as byte (0-255) not ints
Clemo 0:cb80470434eb 118 //lastctrl[i] = newctrl;
Clemo 0:cb80470434eb 119 lastctrl[i] = 128; // TODO: should get these values from EEPROM.
Clemo 0:cb80470434eb 120 }
Clemo 0:cb80470434eb 121
Clemo 0:cb80470434eb 122 hard_curctrl = 0;
Clemo 0:cb80470434eb 123 }
Clemo 0:cb80470434eb 124
Clemo 0:cb80470434eb 125
Clemo 0:cb80470434eb 126 //*************POLL HARDWARE***********************
Clemo 0:cb80470434eb 127 void Hardware_Poll(void)
Clemo 0:cb80470434eb 128 {
Clemo 0:cb80470434eb 129 int newval;
Clemo 0:cb80470434eb 130 int newfunc;
Clemo 0:cb80470434eb 131 int temp;
Clemo 0:cb80470434eb 132 //byte r;
Clemo 0:cb80470434eb 133 byte newbut, newfuncbut, i, newvalbut;
Clemo 0:cb80470434eb 134 //int newctrl;
Clemo 0:cb80470434eb 135 //byte diff;
Clemo 0:cb80470434eb 136 unsigned long butcurtick;
Clemo 0:cb80470434eb 137 //uint8_t low, high;
Clemo 0:cb80470434eb 138 uint8_t ctrl;
Clemo 0:cb80470434eb 139
Clemo 0:cb80470434eb 140 // READ FUNCTION ENCODER
Clemo 0:cb80470434eb 141 newfunc = keyboard_get_rotary_encoder_value(ENCODER_FUNCTION);
Clemo 0:cb80470434eb 142 if (newfunc!=0)
Clemo 0:cb80470434eb 143 {
Clemo 0:cb80470434eb 144 // Grab display focus if needed.
Clemo 0:cb80470434eb 145 if (display_page_set(PAGE_FUNCTION)==0)
Clemo 0:cb80470434eb 146 {
Clemo 0:cb80470434eb 147 newfunc += hard_func;
Clemo 0:cb80470434eb 148 if (newfunc>15) newfunc = 0;
Clemo 0:cb80470434eb 149 else if (newfunc<0) newfunc = 15;
Clemo 0:cb80470434eb 150 Hardware_Let_Function(newfunc);
Clemo 0:cb80470434eb 151 }
Clemo 0:cb80470434eb 152 keyboard_set_rotary_encoder_value(ENCODER_FUNCTION,0);
Clemo 0:cb80470434eb 153 }
Clemo 0:cb80470434eb 154
Clemo 0:cb80470434eb 155 /*newfunc = re3_value;
Clemo 0:cb80470434eb 156 if (newfunc>0)
Clemo 0:cb80470434eb 157 {
Clemo 0:cb80470434eb 158 if (hard_func==15)
Clemo 0:cb80470434eb 159 {
Clemo 0:cb80470434eb 160 // Increment function.
Clemo 0:cb80470434eb 161 Hardware_Let_Function(0);
Clemo 0:cb80470434eb 162 }
Clemo 0:cb80470434eb 163 else
Clemo 0:cb80470434eb 164 {
Clemo 0:cb80470434eb 165 Hardware_Let_Function(hard_func+1);
Clemo 0:cb80470434eb 166 }
Clemo 0:cb80470434eb 167 // Set encoder pulse number back to 0.
Clemo 0:cb80470434eb 168 re3_value = 0;
Clemo 0:cb80470434eb 169 }
Clemo 0:cb80470434eb 170 // Same as above but for anti-clockwise.
Clemo 0:cb80470434eb 171 else if (newfunc<0)
Clemo 0:cb80470434eb 172 {
Clemo 0:cb80470434eb 173 if (hard_func==0)
Clemo 0:cb80470434eb 174 {
Clemo 0:cb80470434eb 175 Hardware_Let_Function(15);
Clemo 0:cb80470434eb 176 }
Clemo 0:cb80470434eb 177 else
Clemo 0:cb80470434eb 178 {
Clemo 0:cb80470434eb 179 Hardware_Let_Function(hard_func-1);
Clemo 0:cb80470434eb 180 }
Clemo 0:cb80470434eb 181 // Set encoder pulse number back to 0.
Clemo 0:cb80470434eb 182 re3_value = 0;
Clemo 0:cb80470434eb 183 }*/
Clemo 0:cb80470434eb 184
Clemo 0:cb80470434eb 185 // READ VALUE ENCODER
Clemo 0:cb80470434eb 186 newval = keyboard_get_rotary_encoder_value(ENCODER_VALUE);
Clemo 0:cb80470434eb 187 if (newval!=0)
Clemo 0:cb80470434eb 188 {
Clemo 0:cb80470434eb 189 // Grab display focus if needed.
Clemo 0:cb80470434eb 190 if (display_page_set(PAGE_FUNCTION)==0)
Clemo 0:cb80470434eb 191 {
Clemo 0:cb80470434eb 192 // Has encoder moved at all?
Clemo 0:cb80470434eb 193 if (newval!=0)
Clemo 0:cb80470434eb 194 {
Clemo 0:cb80470434eb 195 if (testbutdown==true)
Clemo 0:cb80470434eb 196 {
Clemo 0:cb80470434eb 197 // If value encoder button is down, change test note pitch.
Clemo 0:cb80470434eb 198 //if (newval>lastval)
Clemo 0:cb80470434eb 199 if (newval>0)
Clemo 0:cb80470434eb 200 {
Clemo 0:cb80470434eb 201 MIDI_TestButtonInc();
Clemo 0:cb80470434eb 202 }
Clemo 0:cb80470434eb 203 //if (newval<lastval)
Clemo 0:cb80470434eb 204 if (newval<0)
Clemo 0:cb80470434eb 205 {
Clemo 0:cb80470434eb 206 MIDI_TestButtonDec();
Clemo 0:cb80470434eb 207 }
Clemo 0:cb80470434eb 208 //lastval = newval;
Clemo 0:cb80470434eb 209 }
Clemo 0:cb80470434eb 210 else
Clemo 0:cb80470434eb 211 {
Clemo 0:cb80470434eb 212 // Allow roll-over of all functions (forget about "fill" functions).
Clemo 0:cb80470434eb 213 newval += hard_val[hard_func];
Clemo 0:cb80470434eb 214 if (newval>maxval) newval = 0;
Clemo 0:cb80470434eb 215 else if (newval<0) newval = maxval;
Clemo 0:cb80470434eb 216 Hardware_Let_Value(hard_func,newval);
Clemo 0:cb80470434eb 217
Clemo 0:cb80470434eb 218 // Has encoder moved one click?
Clemo 0:cb80470434eb 219 /*if (newval>0)
Clemo 0:cb80470434eb 220 {
Clemo 0:cb80470434eb 221 // If not a fill function (fill functions are A,D,S,R & portamento) and value at max
Clemo 0:cb80470434eb 222 if (hard_val[hard_func]==maxval && IsFuncFill(hard_func)==false)
Clemo 0:cb80470434eb 223 {
Clemo 0:cb80470434eb 224 // Go back to 0.
Clemo 0:cb80470434eb 225 Hardware_Let_Value(hard_func,0);
Clemo 0:cb80470434eb 226 }
Clemo 0:cb80470434eb 227 // Otherwise increment value.
Clemo 0:cb80470434eb 228 else if (hard_val[hard_func]<maxval)
Clemo 0:cb80470434eb 229 {
Clemo 0:cb80470434eb 230 Hardware_Let_Value(hard_func,hard_val[hard_func]+1);
Clemo 0:cb80470434eb 231 }
Clemo 0:cb80470434eb 232 }
Clemo 0:cb80470434eb 233 else if (newval<0)
Clemo 0:cb80470434eb 234 {
Clemo 0:cb80470434eb 235 // Same as above but for anti-clockwise.
Clemo 0:cb80470434eb 236 if (hard_val[hard_func]==0 && IsFuncFill(hard_func)==false)
Clemo 0:cb80470434eb 237 {
Clemo 0:cb80470434eb 238 Hardware_Let_Value(hard_func,maxval);
Clemo 0:cb80470434eb 239 }
Clemo 0:cb80470434eb 240 else if (hard_val[hard_func]>0)
Clemo 0:cb80470434eb 241 {
Clemo 0:cb80470434eb 242 Hardware_Let_Value(hard_func,hard_val[hard_func]-1);
Clemo 0:cb80470434eb 243 }
Clemo 0:cb80470434eb 244 }*/
Clemo 0:cb80470434eb 245 }
Clemo 0:cb80470434eb 246 }
Clemo 0:cb80470434eb 247 }
Clemo 0:cb80470434eb 248 keyboard_set_rotary_encoder_value(ENCODER_VALUE,0);
Clemo 0:cb80470434eb 249 }
Clemo 0:cb80470434eb 250
Clemo 0:cb80470434eb 251 //READ CTRL BANK BUTTON (red/green mode)
Clemo 0:cb80470434eb 252 newbut = keyboard_get_pushbutton(BOARD_KEYBOARD_ISP,false);
Clemo 0:cb80470434eb 253 // Has a button just been pressed - do nothing on release
Clemo 0:cb80470434eb 254 if (lastbank!=newbut && newbut>0)
Clemo 0:cb80470434eb 255 {
Clemo 0:cb80470434eb 256 // Toggle ctrl bank.
Clemo 0:cb80470434eb 257 if (hard_curctrlbank==0)
Clemo 0:cb80470434eb 258 {
Clemo 0:cb80470434eb 259 Hardware_Let_CtrlBank(1);
Clemo 0:cb80470434eb 260 }
Clemo 0:cb80470434eb 261 else
Clemo 0:cb80470434eb 262 {
Clemo 0:cb80470434eb 263 Hardware_Let_CtrlBank(0);
Clemo 0:cb80470434eb 264 }
Clemo 0:cb80470434eb 265 // Set all ctrls to not moving, just in case last thing you did was move ctrl in other bank and not locked out.
Clemo 0:cb80470434eb 266 for (i=0; i<6; i++)
Clemo 0:cb80470434eb 267 {
Clemo 0:cb80470434eb 268 movingctrl[i] = false;
Clemo 0:cb80470434eb 269 stopmovingtick[i] = master_tick + LOCKOUT;
Clemo 0:cb80470434eb 270 }
Clemo 0:cb80470434eb 271 display_invalidate();
Clemo 0:cb80470434eb 272 }
Clemo 0:cb80470434eb 273 // Store last state of button.
Clemo 0:cb80470434eb 274 lastbank = newbut;
Clemo 0:cb80470434eb 275
Clemo 0:cb80470434eb 276 //READ FUNCTION ENCODER BUTTON
Clemo 0:cb80470434eb 277 newfuncbut = keyboard_get_pushbutton(ENCODER_FUNCTION,false);
Clemo 0:cb80470434eb 278 // Are we on a function that requires function button to be held (e.g. save patch)?
Clemo 0:cb80470434eb 279 if (IsShiftHold(hard_func)==true)
Clemo 0:cb80470434eb 280 {
Clemo 0:cb80470434eb 281 //********SAVE AND LOAD IS DONE HERE**********
Clemo 0:cb80470434eb 282 //button pressed down, go green and wait
Clemo 0:cb80470434eb 283 if (lastfuncbut==0 && newfuncbut>0)
Clemo 0:cb80470434eb 284 {
Clemo 0:cb80470434eb 285 butstarttick = master_tick;
Clemo 0:cb80470434eb 286 Hard_Let_Shift(hard_func, true);
Clemo 0:cb80470434eb 287 finishedhold = false;
Clemo 0:cb80470434eb 288 }
Clemo 0:cb80470434eb 289 //is button still held
Clemo 0:cb80470434eb 290 else if (lastfuncbut>0 && newfuncbut>0)
Clemo 0:cb80470434eb 291 {
Clemo 0:cb80470434eb 292 butcurtick = master_tick - butstarttick;
Clemo 0:cb80470434eb 293 // Has button been held down for longer than hold length?
Clemo 0:cb80470434eb 294 if (butcurtick>=HOLDLENGTH && finishedhold==false)
Clemo 0:cb80470434eb 295 {
Clemo 0:cb80470434eb 296 switch (hard_func)
Clemo 0:cb80470434eb 297 {
Clemo 0:cb80470434eb 298 case FUNC_WAVE:
Clemo 0:cb80470434eb 299 // then do userwave write
Clemo 0:cb80470434eb 300 Memory_UserWave_Write(hard_val[FUNC_WAVE]);
Clemo 0:cb80470434eb 301 break;
Clemo 0:cb80470434eb 302
Clemo 0:cb80470434eb 303 case FUNC_AENVA:
Clemo 0:cb80470434eb 304 // then write patch to sysex
Clemo 0:cb80470434eb 305 MIDI_SYSEX_write_patch();
Clemo 0:cb80470434eb 306 break;
Clemo 0:cb80470434eb 307
Clemo 0:cb80470434eb 308 case FUNC_AENVR:
Clemo 0:cb80470434eb 309 // then start sysex mem dump
Clemo 0:cb80470434eb 310 Memory_SYSEX_write_mem();
Clemo 0:cb80470434eb 311 break;
Clemo 0:cb80470434eb 312
Clemo 0:cb80470434eb 313 case FUNC_MEM:
Clemo 0:cb80470434eb 314 if (MIDIchannelmode==true)
Clemo 0:cb80470434eb 315 {
Clemo 0:cb80470434eb 316 MIDI_Set_Channel(hard_val[hard_func]);
Clemo 0:cb80470434eb 317 }
Clemo 0:cb80470434eb 318 else
Clemo 0:cb80470434eb 319 {
Clemo 0:cb80470434eb 320 lcd_cursor(1,0);
Clemo 0:cb80470434eb 321 lcd_puts("Saving...");
Clemo 0:cb80470434eb 322 SysTick_Delay(100);
Clemo 0:cb80470434eb 323 // then save patch
Clemo 0:cb80470434eb 324 Memory_Save(hard_val[hard_func]);
Clemo 0:cb80470434eb 325 }
Clemo 0:cb80470434eb 326 break;
Clemo 0:cb80470434eb 327 }
Clemo 0:cb80470434eb 328 // completed operation (to prevent refires)
Clemo 0:cb80470434eb 329 finishedhold = true;
Clemo 0:cb80470434eb 330 Hard_Let_Shift(hard_func, false);
Clemo 0:cb80470434eb 331 // make encoder flash
Clemo 0:cb80470434eb 332 Hardware_LED_StartFlash(0,7);
Clemo 0:cb80470434eb 333 }
Clemo 0:cb80470434eb 334 }
Clemo 0:cb80470434eb 335 // Has button been released...
Clemo 0:cb80470434eb 336 else if (newfuncbut==0 && Hard_Get_Shift(hard_func)==true)
Clemo 0:cb80470434eb 337 {
Clemo 0:cb80470434eb 338 butcurtick = master_tick - butstarttick;
Clemo 0:cb80470434eb 339 // and it's been held less time than hold length...
Clemo 0:cb80470434eb 340 if (butcurtick < HOLDLENGTH)
Clemo 0:cb80470434eb 341 {
Clemo 0:cb80470434eb 342 switch (hard_func)
Clemo 0:cb80470434eb 343 {
Clemo 0:cb80470434eb 344 case FUNC_WAVE:
Clemo 0:cb80470434eb 345 // ...then toggle user wave mode
Clemo 0:cb80470434eb 346 Memory_UserWave_Read(hard_val[FUNC_WAVE]);
Clemo 0:cb80470434eb 347 break;
Clemo 0:cb80470434eb 348
Clemo 0:cb80470434eb 349 case FUNC_MEM:
Clemo 0:cb80470434eb 350 lcd_cursor(1,0);
Clemo 0:cb80470434eb 351 // then load patch
Clemo 0:cb80470434eb 352 if (Memory_Load(hard_val[hard_func])==true)
Clemo 0:cb80470434eb 353 {
Clemo 0:cb80470434eb 354 lcd_puts("Loading...");
Clemo 0:cb80470434eb 355 }
Clemo 0:cb80470434eb 356 else
Clemo 0:cb80470434eb 357 {
Clemo 0:cb80470434eb 358 lcd_puts("Empty...");
Clemo 0:cb80470434eb 359 }
Clemo 0:cb80470434eb 360 SysTick_Delay(100);
Clemo 0:cb80470434eb 361 for (i=0; i<6; i++)
Clemo 0:cb80470434eb 362 {
Clemo 0:cb80470434eb 363 // stop knob jitter from overriding loaded patch
Clemo 0:cb80470434eb 364 movingctrl[i] = false;
Clemo 0:cb80470434eb 365 }
Clemo 0:cb80470434eb 366 break;
Clemo 0:cb80470434eb 367 }
Clemo 0:cb80470434eb 368 }
Clemo 0:cb80470434eb 369 // Set shift back to false, LED red (red mode).
Clemo 0:cb80470434eb 370 Hard_Let_Shift(hard_func, false);
Clemo 0:cb80470434eb 371 }
Clemo 0:cb80470434eb 372 }
Clemo 0:cb80470434eb 373 else
Clemo 0:cb80470434eb 374 {
Clemo 0:cb80470434eb 375 // Button pressed, but not hold function.
Clemo 0:cb80470434eb 376 if (lastfuncbut!=newfuncbut && newfuncbut>0)
Clemo 0:cb80470434eb 377 {
Clemo 0:cb80470434eb 378 // ...then toggle shift (red/green mode)
Clemo 0:cb80470434eb 379 Hard_Let_Shift(hard_func, !Hard_Get_Shift(hard_func));
Clemo 0:cb80470434eb 380 }
Clemo 0:cb80470434eb 381 }
Clemo 0:cb80470434eb 382 //store last button state
Clemo 0:cb80470434eb 383 lastfuncbut = newfuncbut;
Clemo 0:cb80470434eb 384
Clemo 0:cb80470434eb 385 //READ VALUE ENCODER BUTTON
Clemo 0:cb80470434eb 386 newvalbut = keyboard_get_pushbutton(ENCODER_VALUE,false);
Clemo 0:cb80470434eb 387 //has button been pressed down
Clemo 0:cb80470434eb 388 if (lastvalbut==0 && newvalbut>0)
Clemo 0:cb80470434eb 389 {
Clemo 0:cb80470434eb 390 //midi test note on
Clemo 0:cb80470434eb 391 MIDI_TestButtonDown();
Clemo 0:cb80470434eb 392 testbutdown = true;
Clemo 0:cb80470434eb 393 //reset encoder pulse, because different ranges for midi test note mode.
Clemo 0:cb80470434eb 394 keyboard_set_rotary_encoder_value(ENCODER_VALUE,0);
Clemo 0:cb80470434eb 395 //knob goes green -> cpv red
Clemo 0:cb80470434eb 396 //Hardware_BicolorLED_SetState(1,2,1);
Clemo 0:cb80470434eb 397 //Hardware_LED_SetState(2,HIGH);
Clemo 0:cb80470434eb 398 //Hardware_LED_SetState(3,LOW);
Clemo 0:cb80470434eb 399 }
Clemo 0:cb80470434eb 400 //has button been released
Clemo 0:cb80470434eb 401 if (newvalbut==0 && lastvalbut>0)
Clemo 0:cb80470434eb 402 {
Clemo 0:cb80470434eb 403 //midi test note off
Clemo 0:cb80470434eb 404 MIDI_TestButtonUp();
Clemo 0:cb80470434eb 405 testbutdown = false;
Clemo 0:cb80470434eb 406 //reset encoder pulse again, to stop possible value dial jump
Clemo 0:cb80470434eb 407 keyboard_set_rotary_encoder_value(ENCODER_VALUE,0);
Clemo 0:cb80470434eb 408 //knob back to red -> cpv back to off
Clemo 0:cb80470434eb 409 //Hardware_BicolorLED_SetState(1,2,0);
Clemo 0:cb80470434eb 410 }
Clemo 0:cb80470434eb 411 //store last button state
Clemo 0:cb80470434eb 412 lastvalbut = newvalbut;
Clemo 0:cb80470434eb 413
Clemo 0:cb80470434eb 414 // READ CTRL KNOBS
Clemo 0:cb80470434eb 415 ctrl = 0;
Clemo 0:cb80470434eb 416 // Skip Function & Value encoders.
Clemo 0:cb80470434eb 417 for (i=2; i<8; i++)
Clemo 0:cb80470434eb 418 {
Clemo 0:cb80470434eb 419 if (keyboard_get_pushbutton(encoder_to_ctrl[i],false)>0)
Clemo 0:cb80470434eb 420 {
Clemo 0:cb80470434eb 421 // Reset rotary encoder.
Clemo 0:cb80470434eb 422 Hardware_Ctrl_Update(hard_curctrlbank,ctrl,0);
Clemo 0:cb80470434eb 423 display_page_set(PAGE_CTRL);
Clemo 0:cb80470434eb 424 display_invalidate();
Clemo 0:cb80470434eb 425 }
Clemo 0:cb80470434eb 426 temp = keyboard_get_rotary_encoder_value(encoder_to_ctrl[i]);
Clemo 0:cb80470434eb 427 temp *= keyboard_get_rotary_encoder_accelerator(encoder_to_ctrl[i]);
Clemo 0:cb80470434eb 428 if (temp!=0)
Clemo 0:cb80470434eb 429 {
Clemo 0:cb80470434eb 430 temp += Hardware_Get_Ctrl(hard_curctrlbank,ctrl);
Clemo 0:cb80470434eb 431 // Grab display focus if needed.
Clemo 0:cb80470434eb 432 if (display_page_set(PAGE_CTRL)==0)
Clemo 0:cb80470434eb 433 {
Clemo 0:cb80470434eb 434 // No page change, we can update the control.
Clemo 0:cb80470434eb 435 Hardware_Ctrl_Update(hard_curctrlbank,ctrl,temp);
Clemo 0:cb80470434eb 436 }
Clemo 0:cb80470434eb 437 keyboard_set_rotary_encoder_value(encoder_to_ctrl[i],0);
Clemo 0:cb80470434eb 438 }
Clemo 0:cb80470434eb 439 // Next control.
Clemo 0:cb80470434eb 440 ctrl += 1;
Clemo 0:cb80470434eb 441 }
Clemo 0:cb80470434eb 442 //firstly has enough time passed to lock ctrl (to prevent jitter in DA readings effecting value)
Clemo 0:cb80470434eb 443 /*if (master_tick >= stopmovingtick[hard_curctrl])
Clemo 0:cb80470434eb 444 {
Clemo 0:cb80470434eb 445 movingctrl[hard_curctrl] = false;
Clemo 0:cb80470434eb 446 }
Clemo 0:cb80470434eb 447 //is reading from DA is ready
Clemo 0:cb80470434eb 448 if (bit_is_set(ADCSRA, ADSC)==false)
Clemo 0:cb80470434eb 449 {
Clemo 0:cb80470434eb 450 low = ADCL;
Clemo 0:cb80470434eb 451 high = ADCH;
Clemo 0:cb80470434eb 452 //new reading of ctrl
Clemo 0:cb80470434eb 453 newctrl = ((high << 8) | low) >> 2;
Clemo 0:cb80470434eb 454 //calculate difference between new reading and old
Clemo 0:cb80470434eb 455 if (newctrl > lastctrl[hard_curctrl])
Clemo 0:cb80470434eb 456 {
Clemo 0:cb80470434eb 457 diff = newctrl-lastctrl[hard_curctrl];
Clemo 0:cb80470434eb 458 }
Clemo 0:cb80470434eb 459 else
Clemo 0:cb80470434eb 460 {
Clemo 0:cb80470434eb 461 diff = lastctrl[hard_curctrl]-newctrl;
Clemo 0:cb80470434eb 462 }
Clemo 0:cb80470434eb 463 //if difference > x then ctrl is being moved. ctrl lockout sensitivity set here (default = 4)
Clemo 0:cb80470434eb 464 if (diff > 4)
Clemo 0:cb80470434eb 465 {
Clemo 0:cb80470434eb 466 movingctrl[hard_curctrl] = true;
Clemo 0:cb80470434eb 467 //ctrl is moving, so reset lockout time
Clemo 0:cb80470434eb 468 stopmovingtick[hard_curctrl] = master_tick + LOCKOUT;
Clemo 0:cb80470434eb 469 }
Clemo 0:cb80470434eb 470 if (movingctrl[hard_curctrl] == true)
Clemo 0:cb80470434eb 471 {
Clemo 0:cb80470434eb 472 Hardware_Let_Ctrl(hard_curctrlbank, hard_curctrl, newctrl); //pass new value to ctrl parameter
Clemo 0:cb80470434eb 473 lastctrl[hard_curctrl] = newctrl; //store last ctrl state
Clemo 0:cb80470434eb 474 }
Clemo 0:cb80470434eb 475
Clemo 0:cb80470434eb 476 //increment current ctrl to read. order is: 0,1,0,2,0,3,0,4.. so filter cutoff ctrl is smooth
Clemo 0:cb80470434eb 477 if (hard_curctrl==0)
Clemo 0:cb80470434eb 478 {
Clemo 0:cb80470434eb 479 hard_curctrl = hard_nextctrl;
Clemo 0:cb80470434eb 480 hard_nextctrl++;
Clemo 0:cb80470434eb 481 if (hard_nextctrl>5)
Clemo 0:cb80470434eb 482 {
Clemo 0:cb80470434eb 483 hard_nextctrl = 1;
Clemo 0:cb80470434eb 484 }
Clemo 0:cb80470434eb 485 }
Clemo 0:cb80470434eb 486 else
Clemo 0:cb80470434eb 487 {
Clemo 0:cb80470434eb 488 hard_curctrl = 0;
Clemo 0:cb80470434eb 489 }
Clemo 0:cb80470434eb 490 //start DA conversion of next ctrl going
Clemo 0:cb80470434eb 491 ADMUX = (1 << 6) | (hard_curctrl & 0x07);
Clemo 0:cb80470434eb 492 sbi(ADCSRA, ADSC);
Clemo 0:cb80470434eb 493 }*/
Clemo 0:cb80470434eb 494
Clemo 0:cb80470434eb 495 //update LEDs that may be flashing
Clemo 0:cb80470434eb 496 //Hardware_LED_RefreshFlash();
Clemo 0:cb80470434eb 497 }
Clemo 0:cb80470434eb 498
Clemo 0:cb80470434eb 499
Clemo 0:cb80470434eb 500 int Hardware_Ctrl_Update(byte shift, byte index, int value)
Clemo 0:cb80470434eb 501 {
Clemo 0:cb80470434eb 502 if (value<0)
Clemo 0:cb80470434eb 503 {
Clemo 0:cb80470434eb 504 //value = 255;
Clemo 0:cb80470434eb 505 value = 0;
Clemo 0:cb80470434eb 506 }
Clemo 0:cb80470434eb 507 else if (value>255)
Clemo 0:cb80470434eb 508 {
Clemo 0:cb80470434eb 509 //value = 0;
Clemo 0:cb80470434eb 510 value = 255;
Clemo 0:cb80470434eb 511 }
Clemo 0:cb80470434eb 512 Hardware_Let_Ctrl(shift,index,value);
Clemo 0:cb80470434eb 513 display_invalidate();
Clemo 0:cb80470434eb 514 return value;
Clemo 0:cb80470434eb 515 }
Clemo 0:cb80470434eb 516
Clemo 0:cb80470434eb 517
Clemo 0:cb80470434eb 518 void Hardware_Let_Ctrl(byte shift, byte index, byte value)
Clemo 0:cb80470434eb 519 {
Clemo 0:cb80470434eb 520 switch (index)
Clemo 0:cb80470434eb 521 {
Clemo 0:cb80470434eb 522 case CTRL_FILT: //Filter Cutoff frequency (same in red and green mode)
Clemo 0:cb80470434eb 523 hard_ctrl[0][index] = value;
Clemo 0:cb80470434eb 524 hard_ctrl[1][index] = value;
Clemo 0:cb80470434eb 525 Filt_Let_Fc(value);
Clemo 0:cb80470434eb 526 break;
Clemo 0:cb80470434eb 527
Clemo 0:cb80470434eb 528 case CTRL_Q: //Filter resonance (same in red and green mode)
Clemo 0:cb80470434eb 529 hard_ctrl[0][index] = value;
Clemo 0:cb80470434eb 530 hard_ctrl[1][index] = value;
Clemo 0:cb80470434eb 531 Filt_Let_Q(value);
Clemo 0:cb80470434eb 532 break;
Clemo 0:cb80470434eb 533
Clemo 0:cb80470434eb 534 case CTRL_ENV:
Clemo 0:cb80470434eb 535 hard_ctrl[shift][index] = value;
Clemo 0:cb80470434eb 536 if (shift==0)
Clemo 0:cb80470434eb 537 {
Clemo 0:cb80470434eb 538 Filt_Let_FenvAmt(value); //Filter envelope amount
Clemo 0:cb80470434eb 539 }
Clemo 0:cb80470434eb 540 else
Clemo 0:cb80470434eb 541 {
Clemo 0:cb80470434eb 542 Pitch_Let_FenvAmt(value); //Pitch envelope amount
Clemo 0:cb80470434eb 543 }
Clemo 0:cb80470434eb 544 break;
Clemo 0:cb80470434eb 545
Clemo 0:cb80470434eb 546 case CTRL_LFO:
Clemo 0:cb80470434eb 547 hard_ctrl[shift][index] = value;
Clemo 0:cb80470434eb 548 if (shift==0)
Clemo 0:cb80470434eb 549 {
Clemo 0:cb80470434eb 550 Filt_Let_LFOAmt(value); //Filter LFO amount
Clemo 0:cb80470434eb 551 }
Clemo 0:cb80470434eb 552 else
Clemo 0:cb80470434eb 553 {
Clemo 0:cb80470434eb 554 Pitch_Let_LFOAmt(value); //Pitch LFO amount
Clemo 0:cb80470434eb 555 }
Clemo 0:cb80470434eb 556 break;
Clemo 0:cb80470434eb 557
Clemo 0:cb80470434eb 558 case CTRL_AMP:
Clemo 0:cb80470434eb 559 hard_ctrl[shift][index] = value;
Clemo 0:cb80470434eb 560 if (shift==0)
Clemo 0:cb80470434eb 561 {
Clemo 0:cb80470434eb 562 Amplitude_Let_LFOAmt(value); //Amplitude LFO amount
Clemo 0:cb80470434eb 563 }
Clemo 0:cb80470434eb 564 else
Clemo 0:cb80470434eb 565 {
Clemo 0:cb80470434eb 566 PWM_Let_LFOAmt(value>>3); //Pulse width modulation amount
Clemo 0:cb80470434eb 567 }
Clemo 0:cb80470434eb 568 break;
Clemo 0:cb80470434eb 569
Clemo 0:cb80470434eb 570 case CTRL_FX:
Clemo 0:cb80470434eb 571 hard_ctrl[shift][index] = value;
Clemo 0:cb80470434eb 572 if (shift==0)
Clemo 0:cb80470434eb 573 {
Clemo 0:cb80470434eb 574 Distortion_Let_Amt(value>>5); //Distortion (takes values 0-7)
Clemo 0:cb80470434eb 575 }
Clemo 0:cb80470434eb 576 else
Clemo 0:cb80470434eb 577 {
Clemo 0:cb80470434eb 578 Flange_Let_LFOAmt(value>>3); //Phaser (takes values 0-31)
Clemo 0:cb80470434eb 579 }
Clemo 0:cb80470434eb 580 break;
Clemo 0:cb80470434eb 581 }
Clemo 0:cb80470434eb 582 }
Clemo 0:cb80470434eb 583
Clemo 0:cb80470434eb 584
Clemo 0:cb80470434eb 585 byte Hardware_Get_Ctrl(byte shift, byte index)
Clemo 0:cb80470434eb 586 {
Clemo 0:cb80470434eb 587 return hard_ctrl[shift][index];
Clemo 0:cb80470434eb 588 }
Clemo 0:cb80470434eb 589
Clemo 0:cb80470434eb 590
Clemo 0:cb80470434eb 591 byte Hardware_Get_Ctrl_Shift(void)
Clemo 0:cb80470434eb 592 {
Clemo 0:cb80470434eb 593 return hard_curctrlbank;
Clemo 0:cb80470434eb 594 }
Clemo 0:cb80470434eb 595
Clemo 0:cb80470434eb 596
Clemo 0:cb80470434eb 597 //**************FUNCTION KNOB*******************
Clemo 0:cb80470434eb 598 //set current function
Clemo 0:cb80470434eb 599 void Hardware_Let_Function(byte newfunc)
Clemo 0:cb80470434eb 600 {
Clemo 0:cb80470434eb 601 if (newfunc!=hard_func)
Clemo 0:cb80470434eb 602 {
Clemo 0:cb80470434eb 603 //if new value is different to current
Clemo 0:cb80470434eb 604 hard_func = newfunc;
Clemo 0:cb80470434eb 605 display_invalidate();
Clemo 0:cb80470434eb 606 //Hardware_Refresh_FuncBG(); //refresh function dial LED array
Clemo 0:cb80470434eb 607 //Hardware_Refresh_ValBG(); //refresh value dial LED array (to show val of new func)
Clemo 0:cb80470434eb 608 // Hardware_Refresh_ShiftLED(hard_func); //refresh shift (red/green) mode (to show shift mode of new func)
Clemo 0:cb80470434eb 609 if (hard_shift[FUNC_AENVS]==true && hard_func==FUNC_WAVE)
Clemo 0:cb80470434eb 610 {
Clemo 0:cb80470434eb 611 //set max value of value dial (normally 15)
Clemo 0:cb80470434eb 612 maxval = 5;
Clemo 0:cb80470434eb 613 }
Clemo 0:cb80470434eb 614 else
Clemo 0:cb80470434eb 615 {
Clemo 0:cb80470434eb 616 maxval = 15;
Clemo 0:cb80470434eb 617 }
Clemo 0:cb80470434eb 618 }
Clemo 0:cb80470434eb 619 }
Clemo 0:cb80470434eb 620
Clemo 0:cb80470434eb 621
Clemo 0:cb80470434eb 622 byte Hardware_Get_Function()
Clemo 0:cb80470434eb 623 {
Clemo 0:cb80470434eb 624 //get current function
Clemo 0:cb80470434eb 625 return hard_func;
Clemo 0:cb80470434eb 626 }
Clemo 0:cb80470434eb 627
Clemo 0:cb80470434eb 628
Clemo 0:cb80470434eb 629 void Hardware_Refresh_FuncBG(void)
Clemo 0:cb80470434eb 630 {
Clemo 0:cb80470434eb 631 //user_interface_print_function(hard_func,hard_shift[hard_func]);
Clemo 0:cb80470434eb 632 display_invalidate();
Clemo 0:cb80470434eb 633 }
Clemo 0:cb80470434eb 634
Clemo 0:cb80470434eb 635
Clemo 0:cb80470434eb 636 //*************VALUE KNOB***********************
Clemo 0:cb80470434eb 637 //set new value of function
Clemo 0:cb80470434eb 638 void Hardware_Let_Value(byte func, byte newval)
Clemo 0:cb80470434eb 639 {
Clemo 0:cb80470434eb 640 if (newval!=hard_val[func])
Clemo 0:cb80470434eb 641 { //is new value different to current value
Clemo 0:cb80470434eb 642 hard_val[func] = newval;
Clemo 0:cb80470434eb 643 Hardware_Adjust_Value(func, hard_val[func]); //the meat of how the new value effects the sound
Clemo 0:cb80470434eb 644 if (func==hard_func)
Clemo 0:cb80470434eb 645 {
Clemo 0:cb80470434eb 646 Hardware_Refresh_ValBG(); //refresh the value dial LED array
Clemo 0:cb80470434eb 647 }
Clemo 0:cb80470434eb 648 }
Clemo 0:cb80470434eb 649 }
Clemo 0:cb80470434eb 650
Clemo 0:cb80470434eb 651
Clemo 0:cb80470434eb 652 void Hardware_Adjust_Value(byte func, byte val)
Clemo 0:cb80470434eb 653 { //the meat of how a new value effects the sound
Clemo 0:cb80470434eb 654 switch (func) {
Clemo 0:cb80470434eb 655 case FUNC_WAVE:
Clemo 0:cb80470434eb 656 if (hard_shift[FUNC_AENVS]==false){ //if not user wave mode
Clemo 0:cb80470434eb 657 Wave_Let_Table(val); //select waveform
Clemo 0:cb80470434eb 658 }
Clemo 0:cb80470434eb 659 break;
Clemo 0:cb80470434eb 660 case FUNC_FILT:
Clemo 0:cb80470434eb 661 Filt_Let_Type(val); //set filter type
Clemo 0:cb80470434eb 662 break;
Clemo 0:cb80470434eb 663 case FUNC_FENVA:
Clemo 0:cb80470434eb 664 Fenv_Let_A(envADR_store[val]); //set filter/pitch envelope attack time (stored in PROGMEM)
Clemo 0:cb80470434eb 665 break;
Clemo 0:cb80470434eb 666 case FUNC_FENVDR:
Clemo 0:cb80470434eb 667 Fenv_Let_DR(envADR_store[val]); //set filter/pitch envelope decay time
Clemo 0:cb80470434eb 668 break;
Clemo 0:cb80470434eb 669 case FUNC_FENVS:
Clemo 0:cb80470434eb 670 Fenv_Let_S(fenvS_store[val]); //set filter/pitch envelope sustain level
Clemo 0:cb80470434eb 671 break;
Clemo 0:cb80470434eb 672 case FUNC_AENVA:
Clemo 0:cb80470434eb 673 Aenv_Let_A(envADR_store[val]); //set amplitude envelope attack time
Clemo 0:cb80470434eb 674 break;
Clemo 0:cb80470434eb 675 case FUNC_AENVD:
Clemo 0:cb80470434eb 676 Aenv_Let_D(envADR_store[val]); //set amplitude envelope decay time
Clemo 0:cb80470434eb 677 break;
Clemo 0:cb80470434eb 678 case FUNC_AENVS:
Clemo 0:cb80470434eb 679 Aenv_Let_S(envS_store[val]); //set amplitude envelope sustain level
Clemo 0:cb80470434eb 680 break;
Clemo 0:cb80470434eb 681 case FUNC_AENVR:
Clemo 0:cb80470434eb 682 Aenv_Let_R(envADR_store[val]); //set amplitude envelope release time
Clemo 0:cb80470434eb 683 break;
Clemo 0:cb80470434eb 684 case FUNC_LFOTYPE:
Clemo 0:cb80470434eb 685 LFO_Let_Type(val); //select lfo waveform
Clemo 0:cb80470434eb 686 break;
Clemo 0:cb80470434eb 687 case FUNC_LFOSPEED:
Clemo 0:cb80470434eb 688 LFO_Let_Speed(speed_store[val]);//select lfo speed (stored in PROGMEM)
Clemo 0:cb80470434eb 689 break;
Clemo 0:cb80470434eb 690 #ifdef __HAS_ARPEGGIATOR__
Clemo 0:cb80470434eb 691 case FUNC_ARPTYPE: //select arpeggiator pattern
Clemo 0:cb80470434eb 692 Arp_Let_Type(val);
Clemo 0:cb80470434eb 693 if (val==0)
Clemo 0:cb80470434eb 694 {
Clemo 0:cb80470434eb 695 // Make sure that both LEDs are on when the arpeggiator is switched off.
Clemo 0:cb80470434eb 696 if (Hardware_Get_Ctrl_Shift()==GREEN)
Clemo 0:cb80470434eb 697 {
Clemo 0:cb80470434eb 698 Hardware_BicolorLED_SetState(1,1,2);
Clemo 0:cb80470434eb 699 Hardware_BicolorLED_SetState(2,1,2);
Clemo 0:cb80470434eb 700 }
Clemo 0:cb80470434eb 701 else
Clemo 0:cb80470434eb 702 {
Clemo 0:cb80470434eb 703 Hardware_BicolorLED_SetState(1,2,1);
Clemo 0:cb80470434eb 704 Hardware_BicolorLED_SetState(2,2,1);
Clemo 0:cb80470434eb 705 }
Clemo 0:cb80470434eb 706 }
Clemo 0:cb80470434eb 707 break;
Clemo 0:cb80470434eb 708 case FUNC_ARPSPEED:
Clemo 0:cb80470434eb 709 Arp_Let_Speed(speed_store[val]); //set arpeggiator speed when free running
Clemo 0:cb80470434eb 710 MIDI_Let_ClockArpSpeed(speed_store[val]); //set arpeggiator speed when MIDI clock synced
Clemo 0:cb80470434eb 711 break;
Clemo 0:cb80470434eb 712 #endif // __HAS_ARPEGGIATOR__
Clemo 0:cb80470434eb 713 case FUNC_PORTA:
Clemo 0:cb80470434eb 714 Pitch_Let_Porta(porta_store[val]); //set portamento time
Clemo 0:cb80470434eb 715 break;
Clemo 0:cb80470434eb 716 case FUNC_BITCRUSH:
Clemo 0:cb80470434eb 717 BitCrush_Let_Type(val); //set wave crusher setting
Clemo 0:cb80470434eb 718 break;
Clemo 0:cb80470434eb 719 case FUNC_MEM: //this is a hold function, so do nothing (patch save)
Clemo 0:cb80470434eb 720 break;
Clemo 0:cb80470434eb 721 }
Clemo 0:cb80470434eb 722 }
Clemo 0:cb80470434eb 723
Clemo 0:cb80470434eb 724
Clemo 0:cb80470434eb 725 void Hardware_Refresh_ValBG(void)
Clemo 0:cb80470434eb 726 {
Clemo 0:cb80470434eb 727 //user_interface_print_value(0,13,hard_val[hard_func],true);
Clemo 0:cb80470434eb 728 display_invalidate();
Clemo 0:cb80470434eb 729 }
Clemo 0:cb80470434eb 730
Clemo 0:cb80470434eb 731
Clemo 0:cb80470434eb 732 byte Hardware_Get_Value(byte func)
Clemo 0:cb80470434eb 733 {
Clemo 0:cb80470434eb 734 return hard_val[func];
Clemo 0:cb80470434eb 735 }
Clemo 0:cb80470434eb 736
Clemo 0:cb80470434eb 737
Clemo 0:cb80470434eb 738 void Hard_Let_Shift(byte func, boolean newshift)
Clemo 0:cb80470434eb 739 {
Clemo 0:cb80470434eb 740 if (newshift!=hard_shift[func])
Clemo 0:cb80470434eb 741 {
Clemo 0:cb80470434eb 742 switch (func)
Clemo 0:cb80470434eb 743 {
Clemo 0:cb80470434eb 744 // Tie filter/pitch envelope shifts together (envelope invert mode).
Clemo 0:cb80470434eb 745 case FUNC_FENVA:
Clemo 0:cb80470434eb 746 case FUNC_FENVDR:
Clemo 0:cb80470434eb 747 case FUNC_FENVS:
Clemo 0:cb80470434eb 748 hard_shift[FUNC_FENVA] = newshift;
Clemo 0:cb80470434eb 749 hard_shift[FUNC_FENVDR] = newshift;
Clemo 0:cb80470434eb 750 hard_shift[FUNC_FENVS] = newshift;
Clemo 0:cb80470434eb 751 break;
Clemo 0:cb80470434eb 752
Clemo 0:cb80470434eb 753 // Tie LFO shifts together (LFO invert mode).
Clemo 0:cb80470434eb 754 case FUNC_LFOTYPE:
Clemo 0:cb80470434eb 755 case FUNC_LFOSPEED:
Clemo 0:cb80470434eb 756 hard_shift[FUNC_LFOTYPE] = newshift;
Clemo 0:cb80470434eb 757 hard_shift[FUNC_LFOSPEED] = newshift;
Clemo 0:cb80470434eb 758 break;
Clemo 0:cb80470434eb 759
Clemo 0:cb80470434eb 760 #ifdef __HAS_ARPEGGIATOR__
Clemo 0:cb80470434eb 761 // Tie arpeggiator shifts together (arpeggiator ping pong mode).
Clemo 0:cb80470434eb 762 case FUNC_ARPTYPE:
Clemo 0:cb80470434eb 763 case FUNC_ARPSPEED:
Clemo 0:cb80470434eb 764 hard_shift[FUNC_ARPTYPE] = newshift;
Clemo 0:cb80470434eb 765 hard_shift[FUNC_ARPSPEED] = newshift;
Clemo 0:cb80470434eb 766 break;
Clemo 0:cb80470434eb 767 #endif // __HAS_ARPEGGIATOR__
Clemo 0:cb80470434eb 768
Clemo 0:cb80470434eb 769 default:
Clemo 0:cb80470434eb 770 hard_shift[func] = newshift;
Clemo 0:cb80470434eb 771 }
Clemo 0:cb80470434eb 772 // Meat of how shift affects sound.
Clemo 0:cb80470434eb 773 Hardware_Adjust_Shift(func, newshift);
Clemo 0:cb80470434eb 774 if (func==hard_func)
Clemo 0:cb80470434eb 775 {
Clemo 0:cb80470434eb 776 // Hardware_Refresh_ShiftLED(func); //refresh function knob LED colour
Clemo 0:cb80470434eb 777 Hardware_Refresh_FuncBG();
Clemo 0:cb80470434eb 778 }
Clemo 0:cb80470434eb 779 // Update display.
Clemo 0:cb80470434eb 780 display_invalidate();
Clemo 0:cb80470434eb 781 }
Clemo 0:cb80470434eb 782 }
Clemo 0:cb80470434eb 783
Clemo 0:cb80470434eb 784
Clemo 0:cb80470434eb 785 boolean Hard_Get_Shift(byte func)
Clemo 0:cb80470434eb 786 {
Clemo 0:cb80470434eb 787 return hard_shift[func];
Clemo 0:cb80470434eb 788 }
Clemo 0:cb80470434eb 789
Clemo 0:cb80470434eb 790
Clemo 0:cb80470434eb 791 // Meat of how shift affects sound.
Clemo 0:cb80470434eb 792 void Hardware_Adjust_Shift(byte func, boolean val)
Clemo 0:cb80470434eb 793 {
Clemo 0:cb80470434eb 794 //byte i;
Clemo 0:cb80470434eb 795 switch (func)
Clemo 0:cb80470434eb 796 {
Clemo 0:cb80470434eb 797 case FUNC_WAVE:
Clemo 0:cb80470434eb 798 if (hard_shift[FUNC_AENVS]==false)
Clemo 0:cb80470434eb 799 {
Clemo 0:cb80470434eb 800 if (val==true)
Clemo 0:cb80470434eb 801 {
Clemo 0:cb80470434eb 802 Wave_Let_Bank(1); //set waveform bank
Clemo 0:cb80470434eb 803 }
Clemo 0:cb80470434eb 804 else
Clemo 0:cb80470434eb 805 {
Clemo 0:cb80470434eb 806 Wave_Let_Bank(0);
Clemo 0:cb80470434eb 807 }
Clemo 0:cb80470434eb 808 }
Clemo 0:cb80470434eb 809 break;
Clemo 0:cb80470434eb 810
Clemo 0:cb80470434eb 811 case FUNC_FILT:
Clemo 0:cb80470434eb 812 Filt_Let_GainAdj(val); //set filter normalise mode
Clemo 0:cb80470434eb 813 break;
Clemo 0:cb80470434eb 814
Clemo 0:cb80470434eb 815 case FUNC_FENVA:
Clemo 0:cb80470434eb 816 case FUNC_FENVDR:
Clemo 0:cb80470434eb 817 case FUNC_FENVS:
Clemo 0:cb80470434eb 818 Fenv_Let_Invert(!Fenv_Get_Invert()); //set filter/pitch envelope invert mode
Clemo 0:cb80470434eb 819 break;
Clemo 0:cb80470434eb 820
Clemo 0:cb80470434eb 821 case FUNC_AENVA: //hold function, so do nothing here (SEE Hardware_Poll)
Clemo 0:cb80470434eb 822 break;
Clemo 0:cb80470434eb 823
Clemo 0:cb80470434eb 824 case FUNC_AENVD:
Clemo 0:cb80470434eb 825 MIDI_Let_SYSEXRead(val); //set sysex read mode
Clemo 0:cb80470434eb 826 break;
Clemo 0:cb80470434eb 827
Clemo 0:cb80470434eb 828 case FUNC_AENVS:
Clemo 0:cb80470434eb 829 Wave_Let_UserMode(val); //set user wave mode
Clemo 0:cb80470434eb 830 if (val==true && hard_val[FUNC_WAVE]>5)
Clemo 0:cb80470434eb 831 {
Clemo 0:cb80470434eb 832 Hardware_Let_Value(FUNC_WAVE,5);
Clemo 0:cb80470434eb 833 }
Clemo 0:cb80470434eb 834 break;
Clemo 0:cb80470434eb 835
Clemo 0:cb80470434eb 836 case FUNC_AENVR: //hold function, so do nothing here (SEE Hardware_Poll)
Clemo 0:cb80470434eb 837 break;
Clemo 0:cb80470434eb 838
Clemo 0:cb80470434eb 839 case FUNC_LFOTYPE:
Clemo 0:cb80470434eb 840 case FUNC_LFOSPEED:
Clemo 0:cb80470434eb 841 LFO_Let_Invert(val); //set LFO invert mode
Clemo 0:cb80470434eb 842 break;
Clemo 0:cb80470434eb 843
Clemo 0:cb80470434eb 844 #ifdef __HAS_ARPEGGIATOR__
Clemo 0:cb80470434eb 845 case FUNC_ARPTYPE:
Clemo 0:cb80470434eb 846 case FUNC_ARPSPEED:
Clemo 0:cb80470434eb 847 Arp_Let_PingPong(val); //set arpeggiator ping pong mode
Clemo 0:cb80470434eb 848 break;
Clemo 0:cb80470434eb 849 #endif // __HAS_ARPEGGIATOR__
Clemo 0:cb80470434eb 850
Clemo 0:cb80470434eb 851 case FUNC_PORTA:
Clemo 0:cb80470434eb 852 Pitch_Let_PropPorta(val); //set proportional portamento mode
Clemo 0:cb80470434eb 853 break;
Clemo 0:cb80470434eb 854
Clemo 0:cb80470434eb 855 case FUNC_BITCRUSH:
Clemo 0:cb80470434eb 856 BitCrush_Let_PreFilt(val); //set wave crusher pre-filter mode
Clemo 0:cb80470434eb 857
Clemo 0:cb80470434eb 858 // CPV: no break???
Clemo 0:cb80470434eb 859
Clemo 0:cb80470434eb 860 case FUNC_MEM: //hold function, so do nothing here (SEE Hardware_Poll)
Clemo 0:cb80470434eb 861 break;
Clemo 0:cb80470434eb 862 }
Clemo 0:cb80470434eb 863 }
Clemo 0:cb80470434eb 864
Clemo 0:cb80470434eb 865
Clemo 0:cb80470434eb 866 //*************CTRL BANK BUTTON***********************
Clemo 0:cb80470434eb 867 //set ctrl bank (red/green mode)
Clemo 0:cb80470434eb 868 void Hardware_Let_CtrlBank(byte value)
Clemo 0:cb80470434eb 869 {
Clemo 0:cb80470434eb 870 hard_curctrlbank = value;
Clemo 0:cb80470434eb 871 //Hardware_Refresh_CtrlBankLED(); //refresh LED color
Clemo 0:cb80470434eb 872 Hardware_BicolorLED_SetState(1,hard_curctrlbank!=0?1:0,hard_curctrlbank==0?1:0);
Clemo 0:cb80470434eb 873 Hardware_BicolorLED_SetState(2,hard_curctrlbank!=0?1:0,hard_curctrlbank==0?1:0);
Clemo 0:cb80470434eb 874 /*if (hard_curctrlbank==0)
Clemo 0:cb80470434eb 875 {
Clemo 0:cb80470434eb 876 Hardware_BicolorLED_SetState(false,true);
Clemo 0:cb80470434eb 877 //Hardware_LED_SetState(2,false);
Clemo 0:cb80470434eb 878 //Hardware_LED_SetState(3,true);
Clemo 0:cb80470434eb 879 }
Clemo 0:cb80470434eb 880 else
Clemo 0:cb80470434eb 881 {
Clemo 0:cb80470434eb 882 Hardware_BicolorLED_SetState(true,false);
Clemo 0:cb80470434eb 883 //Hardware_LED_SetState(2,true);
Clemo 0:cb80470434eb 884 //Hardware_LED_SetState(3,false);
Clemo 0:cb80470434eb 885 }*/
Clemo 0:cb80470434eb 886 }
Clemo 0:cb80470434eb 887
Clemo 0:cb80470434eb 888
Clemo 0:cb80470434eb 889 void Hardware_LED_SetState(byte LEDnum, byte LEDstate)
Clemo 0:cb80470434eb 890 {
Clemo 0:cb80470434eb 891 if (LEDnum==BOARD_LED2_GREEN)
Clemo 0:cb80470434eb 892 {
Clemo 0:cb80470434eb 893 // Board_LED_Set(BOARD_LED2_GREEN,LEDstate==HIGH?BOARD_LED_ON:BOARD_LED_OFF);
Clemo 0:cb80470434eb 894 }
Clemo 0:cb80470434eb 895 else if (LEDnum==BOARD_LED2_RED)
Clemo 0:cb80470434eb 896 {
Clemo 0:cb80470434eb 897 // Board_LED_Set(BOARD_LED2_RED,LEDstate==HIGH?BOARD_LED_ON:BOARD_LED_OFF);
Clemo 0:cb80470434eb 898 }
Clemo 0:cb80470434eb 899 else if (LEDnum==BOARD_LED3)
Clemo 0:cb80470434eb 900 {
Clemo 0:cb80470434eb 901 // MIDI LED.
Clemo 0:cb80470434eb 902 Board_LED_Set(BOARD_LED3,LEDstate);
Clemo 0:cb80470434eb 903 }
Clemo 0:cb80470434eb 904 }
Clemo 0:cb80470434eb 905
Clemo 0:cb80470434eb 906
Clemo 0:cb80470434eb 907 void Hardware_BicolorLED_SetState(uint8_t led, uint8_t green, uint8_t red)
Clemo 0:cb80470434eb 908 {
Clemo 0:cb80470434eb 909 if (led==1)
Clemo 0:cb80470434eb 910 {
Clemo 0:cb80470434eb 911 if (green<2) Board_LED_Set(BOARD_LED1_GREEN,green==1?BOARD_LED_ON:BOARD_LED_OFF);
Clemo 0:cb80470434eb 912 if (red<2) Board_LED_Set(BOARD_LED1_RED,red==1?BOARD_LED_ON:BOARD_LED_OFF);
Clemo 0:cb80470434eb 913 }
Clemo 0:cb80470434eb 914 else if (led==2)
Clemo 0:cb80470434eb 915 {
Clemo 0:cb80470434eb 916 if (green<2) Board_LED_Set(BOARD_LED2_GREEN,green==1?BOARD_LED_ON:BOARD_LED_OFF);
Clemo 0:cb80470434eb 917 if (red<2) Board_LED_Set(BOARD_LED2_RED,red==1?BOARD_LED_ON:BOARD_LED_OFF);
Clemo 0:cb80470434eb 918 }
Clemo 0:cb80470434eb 919 }
Clemo 0:cb80470434eb 920
Clemo 0:cb80470434eb 921
Clemo 0:cb80470434eb 922 void Hardware_LED_StartFlash(byte LEDnum, byte FlashTimes)
Clemo 0:cb80470434eb 923 {
Clemo 0:cb80470434eb 924 //SysTick_LED_Flash(LEDnum==0?BOARD_LED1_GREEN:BOARD_LED1_RED,10);
Clemo 0:cb80470434eb 925 if (LEDnum==4)
Clemo 0:cb80470434eb 926 {
Clemo 0:cb80470434eb 927 SysTick_LED_Flash(BOARD_LED3,10);
Clemo 0:cb80470434eb 928 }
Clemo 0:cb80470434eb 929 }
Clemo 0:cb80470434eb 930
Clemo 0:cb80470434eb 931
Clemo 0:cb80470434eb 932 /*boolean IsFuncFill(byte func)
Clemo 0:cb80470434eb 933 {
Clemo 0:cb80470434eb 934 //returns true for functions where value dial fills up
Clemo 0:cb80470434eb 935 switch (func) {
Clemo 0:cb80470434eb 936 case FUNC_WAVE:
Clemo 0:cb80470434eb 937 case FUNC_FILT:
Clemo 0:cb80470434eb 938 case FUNC_LFOTYPE:
Clemo 0:cb80470434eb 939 case FUNC_LFOSPEED:
Clemo 0:cb80470434eb 940 case FUNC_ARPTYPE:
Clemo 0:cb80470434eb 941 case FUNC_ARPSPEED:
Clemo 0:cb80470434eb 942 case FUNC_BITCRUSH:
Clemo 0:cb80470434eb 943 case FUNC_MEM:
Clemo 0:cb80470434eb 944 return false;
Clemo 0:cb80470434eb 945 break;
Clemo 0:cb80470434eb 946 default:
Clemo 0:cb80470434eb 947 return true;
Clemo 0:cb80470434eb 948 }
Clemo 0:cb80470434eb 949 }*/
Clemo 0:cb80470434eb 950
Clemo 0:cb80470434eb 951
Clemo 0:cb80470434eb 952 boolean IsShiftHold(byte func)
Clemo 0:cb80470434eb 953 {
Clemo 0:cb80470434eb 954 //returns true for functions where encoder button should be held down
Clemo 0:cb80470434eb 955 switch (func) {
Clemo 0:cb80470434eb 956 case FUNC_WAVE:
Clemo 0:cb80470434eb 957 return hard_shift[FUNC_AENVS];
Clemo 0:cb80470434eb 958 //break;
Clemo 0:cb80470434eb 959 case FUNC_AENVA:
Clemo 0:cb80470434eb 960 case FUNC_AENVR:
Clemo 0:cb80470434eb 961 case FUNC_MEM:
Clemo 0:cb80470434eb 962 return true;
Clemo 0:cb80470434eb 963 //break;
Clemo 0:cb80470434eb 964 default:
Clemo 0:cb80470434eb 965 return false;
Clemo 0:cb80470434eb 966 }
Clemo 0:cb80470434eb 967 }
Clemo 0:cb80470434eb 968